+
    78jV                     r   R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	 ]	! R4      t
]	! R4      t^0t^xtRt]P                  ! R4      t]P                  ! R4      tR	tR
 tR tR tRtR tR tR tRHR ltR tR tRtRRRR/3RRRR/3RRRR/3RR RR	/3.t]	! R!4      tR" t R# t!]	! R$4      t"]	! R%4      t#]	! R&4      t$R' t%R( t&R) t'R*RHR+R,/t(R- t)R. t*R/ t+R0 t,R1 t-R2 t.R3 t// t0RR4/t1R5 t2^Zt3R6 t4R7 t5R8 t6R9 t7R:RR+R,R;R,/t8^t9R<t:R=t;R> t<R? t=R@ t>RA t?RBRCRD.R+R,/t@RE tARF tB]CRG8X  d
   ]B! 4        R# R# )Iu2  Glasses feed renderer.

Captures each agent's tmux pane + status and writes pre-formatted view files
that the glasses app (and its browser preview) poll. ALL glasses formatting
lives here — edit this file and restart this process and the glasses pick it
up on the next poll (~2s). No app rebuild, no serve.py restart, no re-scan.

Run (lab box):
    nohup python3 glasses_renderer.py > /tmp/glasses_renderer.log 2>&1 &

Writes atomically into the deployed app's feed/ dir, which is served (static)
at omidlab.net/browse/para/.agents/reports/glasses_app/feed/.
N)datetime)Pathz3/data/cameron/para/.agents/reports/glasses_app/feedz!/data/cameron/agents_stuff/agentsg       @z)\x1b\[[0-9;?]*[a-zA-Z]|\x1b\][^\x07]*\x07z[^\x20-\x7E]agentsc                    \         P                  ! RRR\        RR.RRR7      p . pV P                  P	                  4       P                  R4       F2  pR	V9   g   K  VP                  R	^4      w  r4VP                  W434       K4  	  V# )
z@[(index, name), ...] for every window in SESSION, in tmux order.tmuxzlist-windows-tz-Fz#{window_index}	#{window_name}Tcapture_outputtext
	)
subprocessrunSESSIONstdoutstripsplitappend)routlineidxnames        =/data/cameron/agents_stuff/agents/glasses/glasses_renderer.pysession_windowsr   '   s{    	w6WX$	A C &&t,4<

4+ICJJ{# - J    c                 v   \         V ,          R ,          pVP                  4       '       g   R# \        P                  RVP	                  4       P                  4       P                  R4      ^ ,          4      P                  R4      P                  4       pVP                  4       ;'       g    R.^ ,          R,          # )z	status.md r   #:N   N)
AGENTS_DIRexistsNONASCIIsub	read_textr   r   lstrip)r   ffirsts   &  r   status_wordr(   5   s    TK'A88::LLQ[[]00288>qABII#NTTVEKKM!!bT1%c**r   c                     \        V 4      \        8:  d   V .# \        ^ \        V 4      \        4       Uu. uF  qW\        ,            NK  	  up# u upi )    )lenWIDTHrange)r   is   & r   wrapr/   =   sC    
4yEv',QD	5'AB'A!u9'ABBBs   Au   ●c                   \        V 4       UUu. uF2  w  rVP                  4       P                  \        4      '       g   K0  VNK4  	  pppV'       g   R# VR,          p\	        V4      pV^,
          ^ 8  da   V^,
          V9   gH   W^,
          ,          P                  4       '       d%   W^,
          ,          P                  R4      '       d   V^,          pKn  \        ^ V^,
          4      # u uppi )u   Index in `raw` of the start of the latest assistant response burst
(the line just before its first ● bullet — usually the user's message),
so the view can open there and scroll down through the reply.N )	enumerater%   
startswithBULLETsetr   max)rawr.   lbulletsbsets   &    r   last_response_startr<   F   s     's^M^TQqxxz/D/DV/Lqq^GMAw<D
a%1*1q5T/U1A1A1C1Csq5zG\G\]`GaGa	Qq!a%= Ns   -C)C)c           
         V f   R.R 3# \         P                  ! RRRV RRR\         2.RRR	7      pVP                  ^ 8w  d   R
.R 3# \        P                  RVP                  4      P                  R4      p\        V4      p. . rTV FY  pVP                  \        V4      4       VP                  \        \        P                  RVP                  4       4      4      4       K[  	  V'       d0   VR,          P                  4       '       g   VP!                  4        K7  Ve   V\        V4      8  d	   WS,          MR pT;'       g    R.V3# )Nz(no tmux window)r   zcapture-paner   z-pz-S-Tr   z(capture failed)r   r   z(empty)r2   )r   r   
SCROLLBACK
returncodeANSIr#   r   r   r<   r   r+   extendr/   r"   rstripr   pop)targetr   r8   	start_rawlinesraw_to_wrappedr9   starts   &       r   mirrorrJ   U   s   ~"#T))	vtTQzl;KL$	A 	||q"#T))
((2qxx
 
&
&t
,C#C(I>c%j)T(,,r188:678  b	))		)2)>9sSaObCbN%hlE  i[5((r   c                     V P                  V P                  R ,           4      pVP                  \        P                  ! V4      4       \
        P                  ! W 4       R# )z.tmpN)with_suffixsuffix
write_textjsondumpsosreplace)pathdatatmps   && r   write_atomicrV   j   s<    


4;;/
0CNN4::d#$JJsr   c                 J    R RRV /pV'       d   WR&   Ve   W$R&   Ve   W4R&   V# )moder
   rG   onPressrI   tts )rG   on_pressrI   rZ   vs   &&&& r   	text_viewr^   r   s8    	%(A)'

%Hr   c                     R RRV RV/# )rX   listtitleitemsr[   )ra   rb   s   &&r   	list_viewrc   }   s    FGUGU;;r   c                    a R V  2oV3R lp\        RV 2RRRRRS R2///RR	RV! R	4      /RR
RV! R
4      /RRRV! R4      /RRRRS R2RR//.4      # )z/api/agents/c                    < R S R2RRV /RR/# )post/sendbodyr
   thenbackr[   )tbases   &r   <lambda>send_view.<locals>.<lambda>   s    VvU^Vfa[&&Qr   z-> labelzspeak (voice)dorecordtorg   zstatus?zwhats blocking you?zlooks good, continuezSTOP (interrupt)rf   z
/interruptri   rj   rc   )r   keymsgrl   s   && @r   	send_viewrv      s    $ D
QCs3%[	/4(TdV5>4J)KL	)T3y>2	's3H/IJ	($4J0KL	$dVvZ5H&RX,YZ#  r   zTIncoming note from audio, append this to bottom of notes app page and then respond: Chatzvoice -> agentsgo	chat_feed	Dashboardztoday at a glance	dashboardSpotifyznow playingmodule_spotifyAgentszfleet statusz5/data/cameron/agents_stuff/agents/glasses/chat_log.mdc            
     Z    \         P                  4       '       d   \         P                  4       MRp V P	                  R4       Uu. uF'  p\
        P                  RVP                  4       4      NK)  	  ppV Uu. uFS  q3P                  4       P                  4       P                  R4      '       g   K7  V\        R4      R P                  4       NKU  	  ppV'       d   R\        V4      RVR,          /MRp. pV F6  pTP                  VP                  4       '       d   \        V4      MR.4       K8  	  V'       d0   VR,          P                  4       '       g   VP                  4        K7  VRR pV'       g   . ROp\        VRRR	R
RRR//VR7      #   \         d    Rp  ELmi ; iu upi u upi )zDRender the chat log (agents' concise replies + your commands), tail.r   r   zvoice:Nidr
   rq   rr   z/api/glasses/chat/sendafterstayautosendT)rZ   r2   i)rw   (----------------------------------------ztap to speak. by default itzCHECKS an agent and reportszback (no interrupting).zsay "tell X to ..." to actuallyzsend a command.)CHAT_LOGr!   r$   	Exceptionr   r"   r#   rC   r   lowerr4   r+   rB   r/   rD   r^   )r
   xr8   r9   repliesrZ   rG   s          r   	chat_viewr      sU   '/'8'8x!!#b 26D1A
B1AA8<<AHHJ'1AC
B25`#Q9J9U9UV^9_(qX &&(#G`7>4Wvwr{
3DCE		T!Wt4 
b	))		#$KEI UX.FQWYcei'jkqtuu!  
B`s(   F F -F#84F(1 F(F F c           	      ,    \        V R RV 2R RRR.4      # )r   u   not built yet — ztell the glasses agent whatzto show here and it'llzappear live.)r^   )ro   descs   &&r   placeholderr      s/    eR#5dV!<b35M~_ ` `r   z/data/cameron/lifez8/data/cameron/agents_stuff/agents/glasses/now_state.jsonz5/data/cameron/agents_stuff/agents/glasses/events.jsonc                     \         P                  ! \        P                  4       4      p \        P
                  ! V R,          4      p\        P                  ! VP                  4      V,
          P                  4       p\        VR,          4      \        VR,          ^<,          4      rCV P                  RR4      V'       d
   V RVR 23# V R23#   \         d    Ru # i ; i)	zC(task, elapsed_str) from the state serve.py writes on tap-to-speak.
started_at  taskr   :02dmNN)rO   loads	NOW_STATEr$   r   fromisoformatnowtzinfototal_secondsintgetr   )sstartedsecshr   s        r   	_now_taskr      s    JJy**,-((<9W^^,w6EEG44< #td{r&9":1uuVR QaS!C>DDqcGDD s   CC C CCc                     ^ ;rRp\         R,          P                  4       P                  R4       F  p\        P                  ! RV4      pV'       g   K$  V^,          pVP                  ^4      P                  4       R8X  d   V ^,          p K\  Ve   Kb  \        P                  R\        P                  ! RRVP                  ^4      4      4      P                  4       pK  	  WV3#   \         d    Ru # i ; i)	z<(done, total, next_undone) from life_manager's checklist.md.Nchecklist.mdr   z\s*-\s*\[( |x|X)\]\s*(.+)r   r   z[*_`]|\([^)]*\)NNN)LIFEr$   r   rematchgroupr   r"   r#   r   r   )donetotalnxtr9   r   s        r   _todo_summaryr      s     '224::4@A5q9AQJEwwqz!S(	ll2rvv.@"aggaj'QRXXZ A C   s   BC$ AC$ $C43C4c                     \         R,          \        P                  ! R4      R,           ,          P                  4       p \        P
                  ! RV 4      p\        P
                  ! RV 4      pV'       d+   \        VP                  ^4      P                  RR4      4      MRV'       d,   \        VP                  ^4      P                  RR4      4      3# R3#   \         d    R	u # i ; i)
z,(calories_in, target) from today's food log.food%Y-%m-%d.mdz![Rr]unning total:\**\s*~?([\d,]+)z[Tt]arget:\**\s*~?([\d,]+),r   Nr   )
r   timestrftimer$   r   searchr   r   rR   r   )rk   cintgts      r   _food_summaryr      s    F]dmmJ7%?@KKMii<a@ii5q969CIIaL((b12t69CIIaL((b12E 	E?CE 	E s$   A2C 52C (*C C C&%C&r]   tsg        c                 F   \         P                   ! 4       p \        R,          '       d'   V \        R,          ,
          ^<8  d   \        R,          # Rp R\        P                  9  d!   \        P                  P	                  ^ R4       ^ RIHp V! 4       pVP                  R4      pVP                  R4      e   \        VR,          4      MRVP                  R4      V'       d   \        VR	,          4      MR3p\        P                  WR
7       V#   \         d    Rp L'i ; i)u3   (recovery%, hours_asleep, kcal_out) — cached 60s.r   r]   N/data/cameron/life/scriptsget_latest_summarykilojoules_todayrecovery_scorehours_asleep#~j@)r]   r   r   )r   _whoop_brief_cachesysrS   insert	whoop_libr   r   roundr   update)r   r]   r   r   kjs        r   _whoop_briefr      s    
))+C$C*<T*B$BR$G!#&&A
'sxx7HHOOA;<0 UU%&+,551A+B+NU1%&'TXUU>""$U2:$0
 *H  s   BD #D D D c                 "    \         P                  ! \        P                  4       4      p \        P
                  ! R4      p\        R V  4       R R7       F$  pVR,          P                  ^4      V8  g   K"  Vu # 	  R#   \         d     R# i ; i)zLNext upcoming event from events.json ([{time:'HH:MM',title}]); None if none.z%H:%Mc              3   V   "   T F  qP                  R 4      '       g   K  Vx  K!  	  R# 5i)r   Nr   ).0es   & r   	<genexpr>_next_event.<locals>.<genexpr>  s     9Cq55=Cs   )
)c                 2    V R ,          P                  ^4      # )r   )zfillr   s   &r   rm   _next_event.<locals>.<lambda>  s    6YZI[r   rt   r   N)	rO   r   EVENTS_FILEr$   r   r   sortedr   r   )evsnowhmr   s      r   _next_eventr     sv    jj..01g&9C9?[\Ayq!U* ]  s   A0A? 7A? ;A? ?BBc                     \         P                  ! R 4      P                  4       p \         P                  ! R4      p\        4       pV'       d    RVR,           RVP	                  RR4       2MRp\        4       w  rEpVe+   RT R	T R
T;'       g    RR,           2P                  4       MRp\        4       w  r\        4       w  rpVe   T V	'       d   R	V	 2MR,           MRpRV R2V'       d   R
V R2MR,           pV
e   RV
 R2MRV'       d   R
VR R2MR,           p\        V  RV 2RVRRR//RVRRR//RVRRR//RVRRR//.4      # )z%-I:%M%pz	%a %b %-dzNEXT r   r1   ra   r   zNEXT --zTODO /  :N   NzTODO --z--zCAL  z inz outzBODY z% recovzBODY --.1fr    - ro   rp   rx   dash_cal
dash_todos	dash_foodmodule_whoop)
r   r   r   r   r   r   rC   r   r   rc   )clockdateevnext_lbldrk   r   todo_lblr   r   rechrscoutcal_incal_lblbody_lbls                   r   dashboard_viewr     sq   MM*%++-E==%D	B<>r&zl!BFF72$6#78IHIA#?@}qc1#RC 01299;R[HHC!^NCd8;sAcU)3TFfXS!r$t_"EG(+%uG$Y^aRPSTWyXY?gijHwc$(	(D4"45	(D4"67	'4$!45	(D4"89	+  r   c                     \        V4      P                  4       P                  R 4       Uu. uF'  p\        P	                  RVP                  4       4      NK)  	  pp. pV F6  pTP                  VP                  4       '       d   \        V4      MR.4       K8  	  V'       d0   VR,          P                  4       '       g   VP                  4        K7  \        V R.T;'       g    V.,           4      # u upi   \         d    . p Li ; i)r   r   r2   r   )r   r$   r   r"   r#   rC   r   rB   r   r/   rD   r^   )ra   rS   emptyr   r8   rG   r9   s   &&&    r   _file_text_viewr   #  s    59$Z5I5I5K5Q5QRV5WX5Wx||B
+5WX E		T!Wt4 
b	))		eX&%*:*:E7;<< Y s"   *C4 -C/C4 /C4 4DDc                  2    \        R \        R,          R4      # )zToday's Todosr   zno checklist yet)r   r   r[   r   r   dash_todos_viewr   0  s    ?D>,ACUVVr   c                  v    \        R \        R,          \        P                  ! R4      R,           ,          R4      # )zFood Logr   r   r   zno food logged today)r   r   r   r   r[   r   r   dash_food_viewr   4  s.    :tf}j8QTY8Y'Z13 3r   c                  V    \        \        P                  ! \        P	                  4       4      R  R7      p V '       g   \        . RO4      # \        RR.V  Uu. uF)  qP                  RR4       RVP                  RR4       2NK+  	  up,           4      #   \
         d    . p  Lli ; iu upi )	c                 D    V P                  R R4      P                  ^4      # )r   r   )r   r   r   s   &r   rm   dash_cal_view.<locals>.<lambda>;  s    fVXHYH_H_`aHbr   r   Calendarr   r   r   ra   r   )r   r   zno events today.r   ztell life_manager your planszand they'll show up here.)r   rO   r   r   r$   r   r^   r   )r   r   s     r   dash_cal_viewr   9  s    TZZ 5 5 78>bc  W X 	Xj(+cf.gcf^_%%r2B1C2aeeGTVFWEX/Ycf.gghh  
 /hs   4B /B&
B#"B#spotify_menuc                  L    \        R RRRRRRR//RRRRR	RR//RR
RRR//.4      # )r|   ro   zStart / Pauserp   rf   z/api/glasses/spotify/playpauseri   rj   z	Next Songz/api/glasses/spotify/nextzSearch for a new songspotify_searchTrs   r[   r   r   spotify_menu_viewr  I  sX    Y	/4&2RTZ\b)cd	+tf.I6SY%Z[	)42BD1IJ!  r   c                    \         P                  ! RRV \         P                  R7      p\         P                  ! RRV4      pVP                  4       ;'       g    T # )zIDrop remaster/version/feat suffixes so LRCLIB's clean titles still match.z\s*[-(].*?\b(remaster(ed)?|version|deluxe|edit|mono|stereo|featuring|feat|live|acoustic|radio|anniversary|expanded|bonus|remix|single|album)\b.*$r   )flagsz\s*\([^)]*\)\s*$)r   r#   Ir   )r   ns   & r   _clean_titler  T  sM    
 UVXZ^fhfjfj	lA
"B*A779r   c                     ^ RI pVP                  RRV RV/RR/^
R7      pVP                  4        Uu. uF  qDP                  R4      '       g   K  VNK  	  up# u upi )	r*   Nzhttps://lrclib.net/api/search
track_nameartist_namez
User-Agentzpara-glasses/1.0)paramsheaderstimeoutsyncedLyrics)requestsr   rO   )r  artistr  r   as   &&   r   _lrclib_syncedr  \  s^    4):}fM*,>? 	 	MA vvx9x!55#8AAx999s   AAc                    . pT ;'       g    R P                  R4       F  p\        P                  ! RV4      pV'       g   K$  VP                  4       w  rErg\	        V4      ^<,          \	        V4      ,           R,          \        V4      ^8:  d   \	        V4      ^
,          M
\	        V4      ,           pVP                  4       '       g   K  VP                  WP                  4       34       K  	  V# )r   r   z\[(\d+):(\d+)[.:](\d+)\]\s*(.*)  )r   r   r   groupsr   r+   r   r   )	lrcr   r   r   mmssfrr
   mss	   &        r   
_parse_lrcr  d  s    
C!!$'HH7>1 xxzBBb'B,R(D0CGqLCGbLVYZ\V]^Bzz||

B

-. ( Jr   c                 <  a V R ,          V R,          V P                  R4      3p\        P                  V4      pV'       dE   V^ ,          '       g-   \        P                  ! 4       V^,          ,
          \        8  d
   V^ ,          # . pV R,          ;'       g    RP	                  R4      ^ ,          p \        V R ,          V4      pV'       g+   \        V R ,          4      pW`R ,          8w  d   \        Wd4      pV'       dF   V P                  R4      ;'       g    ^ R,          o\        VV3R lR7      p\        VR	,          4      p\        \        4      ^28  d   \        P                  4        T\        P                  ! 4       3\        T&   T#   \         d    . p LWi ; i)
r   r  albumr   r   duration_msr  c                 Z   < \        V P                  R 4      ;'       g    ^ S,
          4      # )duration)absr   )r  durs   &r   rm   _lyrics.<locals>.<lambda>  s     S!%%
2C2H2HqC1O-Pr   r   r  )r   _lyrics_cacher   LYRICS_NEG_TTLr   r  r  minr  r   r+   clear)	trackrt   cachedresr  syncedcleanbestr!  s	   &       @r   _lyricsr-  p  sD    =%/599W+=
>Cs#F6!99vay!8N Jay
CHo##**3/2F
  fv6 v/Ef%'699]+00qD8Cv#PQDT.12C =Btyy{+M#J  s   1AF >F -F FFr'  blocked_untilz/tmp/glasses_spotify_viewedz/tmp/glasses_spotify_forcec                       \         P                   ! 4       \        P                  P                  \        4      ,
          ^8  #   \
         d     R# i ; i)r   F)r   rQ   rS   getmtimeSP_VIEW_MARKERr   r[   r   r   _spotify_viewed_recentlyr2    s>    		bgg..~>>"DD s   ?A AAc                       \         P                  P                  \        4      \        R ,          8  #   \
         d     R# i ; i)r   F)rQ   rS   r0  SP_FORCE_MARKER	_sp_cacher   r[   r   r   _force_refresh_pendingr6    s7    ww09T?BB s   03 AAc                     \         P                   ! 4       p V \        R ,          8  d   R# \        4       '       g   \        R,          # \        4       '       g   \        R,          '       d   V \        R,          ,
          \        8  d   \        R,          pV'       dm   VP                  R4      '       dV   VP                  R4      eC   \        V4      pVR;;,          \        V \        R,          ,
          R,          4      ,          uu&   V# V \        R&    \        \        \        4      P                  4      \        P                  9  dA   \        P                  P                  ^ \        \        \        4      P                  4      4      MR ^ RIpVP!                  4       \        R&   \        R,          #   \"         d   p\%        TRR4      pTe\   \%        TRR4      R	8X  dJ    \        TP&                  P                  R
R4      4      pM  \"         d    Rp Mi ; iY,           \        R &    Rp?\        R,          # Rp?ii ; i)r.  Nr'  r   
is_playingprogress_msr  responsestatus_codei  zRetry-After300i,  )r   r5  r2  r6  SP_TTLr   dictr   strr   __file__parentr   rS   r   spotify_libget_current_trackr   getattrr  )r   trrB  r   respras         r   _spotify_trackrH    s   
))+C
Y''#%%!!!##	$C)D/<QTZ<Zw"&&&&266-+@+LbB}cIdO&;t%C!DD	IdO2:=d8n>S>S:T\_\d\d:d3tH~4456jn(::<	' W  2q*d+mT Bc I))-?@ ),Io&W2s=   BF3 3I >#H;"%HH;HH;HH;;I c                  Z   \         P                   ! 4       p V \        R ,          8  di   \        \        R ,          V ,
          4      pVR8  d   RVR,          ^,            R2MR\        ^V^<,          4       R2p\	        RRRRV R2R	.\
        4      # \        4       pV'       g   \	        . RO\
        4      # VR
,          R,           VR,          ,           R\         R.p\        V4      pV'       d   ^ p\        V4       F  w  pw  rWR,          8:  d   TpK   M	  \        \        ^ V^,
          4      \        \        V4      V^,           4      4       F>  pTP                  Wv8X  d   RMRWW,          ^,          R\        ^,
           ,           4       K@  	  MV. RO,          p\	        V\
        4      # )r.  r   ~r   z minr|   zSpotify rate-limited.zauto-resumes in .z(over-polled earlier; fixed)r   r   r  Nr9  z> r   r   )r|   r   znothing playingr   ztap = speak a song to playz2tap = back)r   z(no synced lyrics found)r   ztap = change song)r   r5  r   r7   r^   SPOTIFY_PRESSrH  r,   r-  r3   r-   r%  r+   r   )
r   r   whenrE  rG   lyrr   r.   r  _s
             r   spotify_viewrP    s   
))+C
Y''9_-34*.$,44<!#$A&aAtrz@R?SSW<X)X/F,TF!46TVWdf 	f		B GHUW 	Wj5 2h</%8(CE
"+C
#C.JAw&&	 )
 s1cAgCHcAg(>?ALL!($q	*5198MMN @ 	JJUM**r   rG   WHOOPu
   loading…c                    a \         P                   ! 4       p \        R ,          '       d'   V \        R ,          ,
          ^<8  d   \        R,          #  R\        P                  9  d!   \        P                  P	                  ^ R4      MR ^ RIHp V! 4       oR)V3R llpV! R4      '       d   \        V! R4      R,          4      MRpRR*V! R	4      e   R
\        V! R	4      4       R2MRV! R4      e    R\        V! R4      4       RV! R4      R R2MRV! R4      e   RV! R4      R R2MRV'       d   RV R2MRR\        V! R4      ;'       g    ^ 4       R\        V! R4      ;'       g    ^ 4       R2R \        V! R!4      ;'       g    ^ 4       R"\        V! R#4      ;'       g    ^ 4       R$2R*R%.
\        R&   V \        R &   \        R,          #   \         d(   pRR&R'\        T4      R(,          .\        R&    Rp?LCRp?ii ; i)+r   rG   r   Nr   c                 &   < SP                  W4      # Nr   )kr   r   s   &&r   rm   whoop_lines.<locals>.<lambda>  s    aeeAkr   r   r   rQ  r   zRecovery   %zRecovery   --sleep_performance_percentagezSleep      z%   r   r   r   zSleep      --strain_todayzStrain     z / 21zStrain     --zCalories   z kcalzCalories   --zHRV hrv_rmssd_millizms  RHR resting_heart_ratebpmzREM rem_minuteszm  Deep deep_minutesr   z$steps: n/a    workout: needs re-authr   zunavailable::N<   NrT  r   )
r   _whoopr   rS   r   r   r   r   r   r?  )r   r   r&   kcalr   r   s        @r   whoop_linesrb    s   
))+Cd||fTl*R/gE<X`c`h`h<h78nr0 )789K7L7LuQ)*U23RV;<=M;N;Zk%"2 345Q7`o/0< %"@ ABC4.HYZ]G^^_`BQ:;N:K:Wk!N+C06]l)-k$u%?5,-2234HU1EYCZC_C_^_=`<aade5=)..Q/0q?P?U?UTU9V8WWXY2
w F4L'?  E"BAsDwEs7   CG 1G G )G G #G G?G::G?c                     \         P                  R R R7        \        \         R,          \        R\         U UUu. uF   w  rpRV P                  ^4       RV 2RV/NK"  	  uppp 4      4       \         EF  w  rpVP                  RR4      pVR	8X  d   \        \         R
,          \        4       4       \        \         R,          \        4       4       \        \         R,          \        4       4       \        \         R,          \        4       4       \        \         R,          \        \        4       4      4       K  VR8X  d.   \        \         V R2,          \        \        4       4      4       K  VR8X  dE   \        \         V R2,          \        4       4       \        \         R,          \        4       4       EKE  VR8X  d#   \        \         R,          \        4       4       EKn  VP!                  R4      '       g   EK  \        \         V R2,          \#        W4      4       EK  	  . p/ p\%        4        F  w  rgVP                  V^ 4      ^,           WW&   WW,          ^8X  d   TMV WW,           2p\'        V4      p	VP)                  RVR,          P                  ^4       V	 2RRRV 2//4       \+        \,         RV 24      w  r\        \         RV R2,          \        V
RRV 2/4      4       \        \         RV R2,          \/        Wx4      4       K  	  \        \         R,          \        RV4      4       \0        P2                  ! \4        4       EK9  u uppp i )T)parentsexist_okz	home.jsonzPARA HUBro   r1   rp   rx   r   r{   zdashboard.jsonzdash_todos.jsonzdash_food.jsonzdash_cal.jsonzmodule_whoop.jsonr   z.jsonr}   zspotify_menu.jsonry   zchat_feed.jsonmodule_:N   Nagent_r   send_zagents.jsonr~   )FEEDmkdirrV   rc   MODULESljustr   r   r   r   r   r^   rb  rP  r  r   r4   r   r   r(   r   rJ   r   rv   r   sleepPERIOD)lblr   rp   feedroster_itemsseenr   r   rt   stm_linesrO  s               r   mainrv    s   JJtdJ+
TK'\cd\c=3VX'ciil^1TF#;T2F\cd*f 	g$WMCr66$#D{"T$44n6FGT$557HIT$44n6FGTO3]_ET$77;=9QR'TtfEN2Ikm4LM))TtfEN2LNCT$779J9LM$T$44ikB++TtfEN2K4JK! %$ (*IC$*Q.DJ*/$$
|/DCT"BSX^^B-?,@*EtdV\]`\aTbMc de7)1SE 23JG&U 33YwQVWZV[}H]5^_%uE 22Id4HI + 	TM)9X|+LM

6= es   &M__main__r   )D__doc__rO   rQ   r   r   r   r   r   pathlibr   rj  r    r,   r?   ro  compilerA   r"   r   r   r(   r/   r5   r<   rJ   rV   r^   rc   rv   
NOTES_WRAPrl  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#  rL  r  r$  r  r  r  r-  r5  r=  r1  r4  r2  r6  rH  rP  r`  rb  rv  __name__r[   r   r   <module>r}     s    	 	  
   AB56
 	
		zz>?::o& +C 
)*<	 d
{ 34%k':;&678~h/0	 GHv.`  !KL	JK	 &	 -tS9 *
(
=W3
i ~& :	F dD#<		
..8+: G\*D#	6:"J zF r   