+
    kHàj(# ã                   óF  € R t ^ RIt^ RI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IHt ^ RIHtHtHt ^ RIHtHtHtHt ^ RIHtHt ^ RIHt ^ R	IH t H!t!H"t" ]PF                  ! 4       R
8H  t$ReR R llt%]PL                  ! ]'4      t(Rt)]*! RRRR]PV                  R7      t,R R lt-R R lt.R R lt/R R lt0R R lt1R R lt2R R lt3R  R! lt4R" R# lt5R$ R% lt6R& R' lt7RfR( R) llt8R*R+/R, R- llt9^ RI:t:]:Pv                  Py                  ^ ]=! ]! ]>4      P                  4       P€                  ^,          4      4       ^ R.IAHBtBHCtC ^ R/IDHEtE ^ R0IFHGtGHHtH ^ R1IIHJtJHKtKHLtLHMtMHNtN ^ R2IOHPtP ^ R3IQHRtRHStS ^ R4ITHUtU R5 R6 ltVR7 R8 ltWR9 R: ltXR; R< ltYR= tZR> R? lt[Rgt\0 Rhmt]Rit^R@]SP¾                  RA]SP¾                  RB]SPÀ                  /taRC]SPÄ                  3RD]SPÆ                  3RE]SPÈ                  3RF]SPÊ                  33tf]SPÄ                  Rj]SPÈ                  Rk]SPÊ                  Rl]SPÆ                  Rm]SPÎ                  Rn/thRC]SPÄ                  RD]SPÆ                  RF]SPÈ                  RJ]SPÎ                  /tiRCRGRDRIRKRIRFRHRERHRJRLRBRM/tjRN tk ! RO RP]E]J4      tl/ ]*PÛ                  RoRC4      C]*PÛ                  RpRD4      C]*PÛ                  RqRF4      CtnRQ RR ltoRS RT ltpRURRVRRWR+RXRRYR/RZ ltqR[ R\ ltrRrtsR] R^ lttR_ R` ltuRatv]Pî                  ! Rb]Pð                  4      tyRc Rd ltzR# )sz¶WhatsApp platform adapter (Baileys bridge): a Node.js bridge process runs the WhatsApp Web
client; messages are polled over a local HTTP API and responses are posted back through it.N)Úsuppress©Úwraps©ÚPath)ÚDictÚOptionalÚAny)Úapply_yaml_bridgeÚextra_or_secretÚget_scoped_secretÚ
send_error)ÚStandaloneSendPolicyÚregex_stripped_parser)Úwindows_detach_popen_kwargs)Úfind_node_executableÚget_hermes_dirÚwith_hermes_node_pathÚWindowsc                ó<   € V ^8„  d   QhR\         R\         R\         /# )é   ÚnameÚdefaultÚreturn©Ústr)Úformats   "ÚG/home/ubuntu/.hermes/hermes-agent/plugins/platforms/whatsapp/adapter.pyÚ__annotate__r      s!   € ÷ ,ñ ,”ð ,œcð ,¬3ñ ,ó    c                ó   € \        W4      # )ztWHATSAPP_* env via the profile secret scope (multiplexed profiles see their own .env, not the process-global value).)r   )r   r   s   &&r   Ú_wenvr!      s   € ä˜TÓ+Ð+r   z[owner reply] Túutf-8Úreplace)Úcapture_outputÚtextÚencodingÚerrorsÚstdinc                ó0   € V ^8„  d   QhR\         R\        /# ©r   Úportr   ©ÚintÚlist)r   s   "r   r   r   '   s   € ÷ 	ñ 	¤ð 	¬ñ 	r   c                óh  € . p\        \        4      ;_uu_ 4        \        \        P                  ! RRRV  2R.3R^/\
        BRR/B P                  P                  4       P                  4       4      pV'       d   VuuRRR4       #  RRR4       \        \        4      ;_uu_ 4        VP                  R	 \        P                  ! R
\        P                  ! RRRV  2.3R^/\
        BRR/B P                  4       4       4       RRR4       V#   + '       g   i     LŽ; i  + '       g   i     T# ; i)up   PIDs *listening* on ``port`` (POSIX), never clients â€” a bare ``lsof -i :PORT`` once killed the user's browser.Úlsofz-tiztcp:z-sTCP:LISTENÚtimeoutÚcheckFNc              3   óV   "  € T F  p\        VP                  ^4      4      x € K!  	  R# 5i)é   N)r-   Úgroup)Ú.0Úms   & r   Ú	<genexpr>Ú)_listener_pids_on_port.<locals>.<genexpr>/   s)   é € ð  jñ  .i¨”C˜Ÿ™ ›
—O�Oó  .iùs   ‚')z	pid=(\d+)Ússz-ltnHpz	sport = :)r   ÚFileNotFoundErrorÚ
_safe_intsÚ
subprocessÚrunÚ	_RUN_TEXTÚstdoutÚstripÚ
splitlinesÚextendÚreÚfinditer)r+   Úpidss   & r   Ú_listener_pids_on_portrG   '   s@  € à€DÜ	Ô#×	$Õ	$Üœ*Ÿ.š.¨&°%¸4À¸v¸ÈÐ)WÑ}ÐabÐ}ÔfoÑ}Ðw|Ò}÷  Eñ  E÷  Kñ  Kó  M÷  Xñ  Xó  Zó  [ˆßØ÷ 
%Ò	$à÷ 
%ô 
Ô#×	$Õ	$Ø�‰ñ  j¬R¯[ª[¸ÄzÇ~Â~ÐW[Ð]eÐirÐswÐrxÐgyÐVzñ  Hað  EFð  Haô  JSñ  Hað  [`ò  Ha÷  Hhñ  Hhô  .ió  jô  	j÷ 
%à€K÷ 
%×	$ú÷ 
%Ö	$à€Kús   šA!DÂ&AD ÄD	Ä D1	c                ó$   € V ^8„  d   QhR\         /# ©r   r   )r.   )r   s   "r   r   r   3   s   € ÷ ñ œ$ñ r   c                 óv   € . pV  F  p VP                  \        V4      4       K   	  V#   \         d     K2  i ; i©N)Úappendr-   Ú
ValueError)ÚtokensÚoutÚtoks   &  r   r<   r<   3   sA   € Ø€CÛˆð	Ø�J‰J”s˜3“xÖ ñ ð
 €Jøô ô 	Úð	ús   ‰)©8·8c                ó$   € V ^8„  d   QhR\         /# rI   r   )r   s   "r   r   r   =   s   € ÷ ^ñ ^œ4ñ ^r   c                óæ   € \        \        P                  P                  \        P                  P	                  \        T ;'       g    / P                  R\        RR4      4      4      4      4      4      # )z×Absolute session dir: --session, bridge.pid and every /health ``session`` comparison (gateway and standalone
sends) share this one string, or a gateway restarted from another cwd would see its own bridge as foreign.Úsession_pathzplatforms/whatsapp/sessionzwhatsapp/session)r   ÚosÚpathÚabspathÚ
expanduserr   Úgetr   )Úextras   &r   Ú_session_dirrZ   =   s_   € ô ”—‘—‘¤§¡× 2Ñ 2´3¸¿¸À×7HÑ7HØœÐ'CÐEWÓXó8Zó 4[ó !\ó ]ó ^ð ^r   c                ó0   € V ^8„  d   QhR\         R\        /# r*   r,   )r   s   "r   r   r   D   s   € ÷ oñ o¤ð o¬ñ or   c                óÐ   a € ^ RI Hp \        P                  ! . RO3R^RV! 4       /\        BRR/B pR VP
                  P                  4        4       p\        V 3R lV 4       4      # )	z:PIDs in LISTENING state on ``port`` via netstat (Windows).©Úwindows_hide_flagsr1   Úcreationflagsr2   Fc              3   ó@   "  € T F  qP                  4       x € K  	  R # 5irK   )Úsplit)r6   Úlines   & r   r8   Ú)_windows_listener_pids.<locals>.<genexpr>H   s   é € Ð@Ñ%?˜T�J‰J�LˆLÓ%?ùs   ‚c              3   óÀ   <"  € T FS  p\        V4      ^8¼  g   K  V^,          R8X  g   K%  V^,          P                  RS 24      '       g   KH  V^,          x € KU  	  R# 5i)é   Ú	LISTENINGÚ:N)ÚlenÚendswith)r6   Úpr+   s   & €r   r8   rc   I   sP   øé € Ðn¡D˜q¬C°«F°a©K”d¸A¸a½DÀKÑ<O”dÐTUÐVWÕTX×TaÑTaÐdeÐfjÐekÐbl×Tm”d�a˜—d’d£Dùs   ƒAšAªAÁA)Únetstatz-anoz-pÚTCP)Úhermes_cli._subprocess_compatr^   r=   r>   r?   r@   rB   r<   )r+   r^   ÚresultÚrowss   f   r   Ú_windows_listener_pidsrp   D   sj   ø€ å@Ü�^Š^Ò<ñ  GÀað  GÑWiÓWkð  GÔoxñ  Gð  AFò  G€FÙ@ V§]¡]×%=Ñ%=Ô%?Ó@€DÜÔn¡DÓnÓnÐnr   c                ó0   € V ^8„  d   QhR\         R\        /# r*   r,   )r   s   "r   r   r   L   s   € ÷ Yñ Yœcð Y¤dñ Yr   c                óF   € \         '       d   \        V 4      # \        V 4      # )zTListening PIDs on ``port`` for this platform: netstat on Windows, lsof/ss elsewhere.)Ú_IS_WINDOWSrp   rG   )r+   s   &r   Ú_port_listener_pidsrt   L   s   € ç+6«;Ô! $Ó'ÐXÔ<RÐSWÓ<XÐXr   c                ó0   € V ^8„  d   QhR\         R\        /# ©r   Úpidr   ©r-   Úbool)r   s   "r   r   r   Q   s   € ÷ ñ ¤Sð ¬Tñ r   c                óZ  €  ^ RI pVP                  V 4      pRVP                  4       ;'       g    RP                  4       9   ;'       gR    RRP	                  VP                  4       ;'       g    . 4      P                  4       P                  R^4      ^ ,          9   #   \         d     R# i ; i)u  Fail-closed: the live process must be a ``node`` executable (a scan-time PID can be a stranger by kill time).

``_kill_port_process`` discovers PIDs from a netstat/lsof scan of a TCP port â€” a bare number naming a
*stranger* process (#89614 class: an unverified scan-time PID force-killed later can be anything,
including a critical system process). Before any kill, require the live process to actually look like
our Baileys bridge: a ``node`` executable. Any ambiguity (process gone, unreadable cmdline) refuses the
kill.
NÚnodeÚ Ú F)ÚpsutilÚProcessr   ÚlowerÚjoinÚcmdlinera   Ú	Exception)rw   r~   Úprocs   &  r   Ú_pid_looks_like_node_bridger…   Q   s�   € ðÛØ�~‰~˜cÓ"ˆØ˜$Ÿ)™)›+×+Ð+¨×2Ñ2Ó4Ñ4×yÐy¸À#Ç(Á(È4Ï<É<Ë>×K_ÐK_Ð]_ÓB`×BfÑBfÓBh×BnÑBnÐorÐtuÓBvÐwxÕByÑ8yÐyøÜô Úðús"   ‚,B ¯B Á	#B Á--B ÂB*Â)B*c                ó(   € V ^8„  d   QhR\         RR/# )r   r+   r   N)r-   )r   s   "r   r   r   b   s   € ÷ 1ñ 1œSð 1 Tñ 1r   c                óÄ  € \        \        4      ;_uu_ 4        \        V 4       Fò  pV^ 8:  g   \        V4      '       g   \        P                  RW4       K3  \        '       do   ^ RIHp \        \        P                  4      ;_uu_ 4        \        P                  ! RR\        V4      R.R\        P                  ^V! 4       RR7       R	R	R	4       K­  \        \        4      ;_uu_ 4        \        P                   ! V\"        P$                  4       R	R	R	4       Kô  	  R	R	R	4       R	#   + '       g   i     EK  ; i  + '       g   i     EK'  ; i  + '       g   i     R	# ; i)
zrKill any node bridge *listening* on the given TCP port (never a client); SIGTERM on POSIX, taskkill /F on Windows.za[whatsapp] Not killing PID %s on port %d: process is not a node bridge (or identity unverifiable)r]   Útaskkillú/PIDú/FTF)r$   r(   r1   r_   r2   N)r   rƒ   rt   r…   ÚloggerÚwarningrs   rm   r^   r=   ÚSubprocessErrorr>   r   ÚDEVNULLÚOSErrorrT   ÚkillÚsignalÚSIGTERM)r+   rw   r^   s   &  r   Ú_kill_port_processr“   b   s  € ä	”)×	Õ	Ü& tÖ,ˆCà�aŒxÔ:¸3×?Ò?Ü—‘ð   Cð  EHô  OÙß‹{ÝLäœj×8Ñ8×9Õ9Ü—N’N J°¼¸C»À$Ð#GÐX\Ôdn×dvÑdvð  ABñ  Rdó  Rfð  nsõ  t÷ :Ñ9ô œg×&Õ&Ü—G’G˜C¤§¡Ô0÷ 'Ñ&ñ -÷ 
Ñ	÷ :×9Ñ9ú÷ '×&Ñ&ú÷ 
×	Ð	úsB   ˜A
EÁ#'EÂ
=D$Ã!EÃ(&D9ÄEÄ$D6Ä/
EÄ9EÅ
EÅE	c                ó0   € V ^8„  d   QhR\         R\        /# rv   rx   )r   s   "r   r   r   t   s   € ÷ @ñ @œSð @´Tñ @r   c                ót   € ^ RI Hp VP                  V 4      '       g   R# Vf   R# VP                  V 4      V8H  # )uÑ  ``pid`` alive AND still our bridge: kernel start time (definitive); fail closed without it.

Legacy pidfiles record only the PID. The old fallback accepted a ``node`` + session-path cmdline
substring as kill evidence â€” but a log tail, editor, or grep that merely *mentions* the session
path matches that same substring (#116883), so a legacy pidfile could signal a stranger. Without
a start-time fingerprint the caller must reap via the bridge-port scan instead.
)ÚstatusF)Úgatewayr–   Ú_pid_existsÚget_process_start_time)rw   Úexpected_startr–   s   && r   Ú_bridge_pid_is_oursr›   t   s:   € õ Ø×Ñ˜c×"Ò"ÙØÒÙØ×(Ñ(¨Ó-°Ñ?Ð?r   c                ó(   € V ^8„  d   QhR\         RR/# )r   rU   r   Nr   )r   s   "r   r   r   „   s   € ÷ ñ œ$ð  4ñ r   c                 óŽ   € \        \        4      ;_uu_ 4        V P                  4        R R R 4       R #   + '       g   i     R # ; irK   )r   r�   Úunlink)rU   s   &r   Ú_unlink_quietlyrŸ   „   s%   € Ü	”'×	Õ	Ø�‰Œ÷ 
×	×	Ò	ús	   ˜3³A	c                ó0   € V ^8„  d   QhR\         R\        /# )r   rS   r   )r   Útuple)r   s   "r   r   r   ‰   s   € ÷ .ñ .¤tð .´ñ .r   c                ó  € V R,          pVP                  4       '       g   R#  VP                  RR7      P                  R4       Uu. uF  q"P                  4       NK  	  pp\	        V^ ,          4      p\        V4      ^8”  d"   V^,          '       d   \	        V^,          4      MRp\        V4      ^8”  d"   V^,          '       d   \	        V^,          4      MRpYET3# u upi   \        \        \        \        3 d    Ru # i ; i)z÷``(pid, kernel_start_time, port)`` from ``bridge.pid``; all ``None`` when absent or unparseable.
Line 1 = pid, optional line 2 = kernel start time, optional line 3 = the ``--port`` it was spawned
with (legacy files: pid only, or pid + start time).ú
bridge.pidNú	utf-8-sig©r&   Ú
©NNN)
ÚexistsÚ	read_textra   rA   r-   rh   rM   r�   Ú	TypeErrorÚ
IndexError)rS   Úpid_fileÚlnÚlinesrw   Úrecorded_startÚrecorded_ports   &      r   Ú_read_bridge_pidfiler±   ‰   sÜ   € ð ˜lÕ*€HØ�?‰?×ÒØÐð Ø&.×&8Ñ&8À+Ð&8Ó&N×&TÑ&TÐUYÔ&ZÓ[Ñ&Z —‘–Ñ&ZˆÐ[Ü�%˜•(‹mˆÜ*-¨e«*°q¬.¸UÀ1¿X¼Xœ˜U 1�XœÈ4ˆÜ),¨U«°a¬¸EÀ!¿H¼Hœ˜E !�HœÈ$ˆð  Ð-Ð-ùò \øô œ¤¬JÐ7ô  ØÒð ús/   £#C! ÁCÁ2C! Â2C! ÃC! ÃC! Ã!DÄ Dc                ó(   € V ^8„  d   QhR\         RR/# )r   rS   r   Nr   )r   s   "r   r   r   š   s   € ÷ ñ ´ð ¸ñ r   c                ó   € ^ RI Hp V R,          pVP                  4       '       g   R# \        V 4      w  r4pVf   \	        V4       R# \        W44      '       d]   \        \        4      ;_uu_ 4        \        P                  ! V\        P                  4       \        P                  RV4       RRR4       M,V! V4      '       d   Vf   RMRp\        P                  RW64       \	        V4       R#   + '       g   i     L; i)zVKill an orphaned bridge recorded in ``bridge.pid``, after :func:`_bridge_pid_is_ours`.)r˜   r£   Nz2[whatsapp] Killed stale bridge PID %d from pidfilez`legacy pidfile lacks a start-time fingerprint and cmdline substring evidence can name a strangerz?it is no longer the bridge (recycled onto an unrelated process)zP[whatsapp] Not killing pidfile PID %d: %s; skipping to avoid killing a stranger.)Úgateway.statusr˜   r¨   r±   rŸ   r›   r   r�   rT   r�   r‘   r’   r‹   ÚinforŒ   )rS   r˜   r¬   rw   r¯   Ú_Úreasons   &      r   Ú_kill_stale_bridge_by_pidfiler¸   š   sÄ   € å*Ø˜lÕ*€HØ�?‰?×ÒÙÜ1°,Ó?Ñ€C˜Ø
‚{Ü˜Ô!ÙÜ˜3×/Ò/Ü”g×ÕÜ�GŠG�CœŸ™Ô(Ü�K‰KÐLÈcÔR÷ Ðñ 
�S×	Ò	à#Ò+ñ uØ1rð 	ä�‰ð ?Ø@Cô	Mä�HÖ÷ ×ús   Á/<C-Ã-C=	c                óV   € V ^8„  d   QhR\         R\        R\        \        ,          RR/# )r   rS   rw   r+   r   N)r   r-   r   )r   s   "r   r   r   °   s3   € ÷ Iñ I¬ð I´3ð I¼hÄs½mð IÐW[ñ Ir   c                ó
  € \        \        4      ;_uu_ 4        ^ RIHp V! V4      pVf   \	        V4      MV RV 2Vf   RMRV 2,           pV R,          P                  VRR7       RRR4       R#   + '       g   i     R# ; i)zÀWrite the bridge PID plus its kernel start time (line 2) for identity-checked cleanup, and the
port it listens on (line 3) so a secondary adopts only the endpoint that process actually serves.)r™   Nr¦   r|   r£   r"   r¥   )r   r�   r´   r™   r   Ú
write_text)rS   rw   r+   r™   Ústartr%   s   &&&   r   Ú_write_bridge_pidfiler½   °   sr   € ô 
”'×	Õ	Ý9Ù& sÓ+ˆØ š=Œs�3Œx°°°R¸°wÐ.?ÈÊÁ2Ð]_Ð`dÐ_eÐ[fÕ.gˆØ	˜Õ	$×0Ñ0°ÀÐ0ÔH÷	 
×	×	Ò	ús   ˜AA1Á1B	ÚforceFc                ó(   € V ^8„  d   QhR\         RR/# ©r   r¾   r   N©ry   )r   s   "r   r   r   º   s   € ÷ "ñ "¬dð "¸tñ "r   c               ó’  € V'       d   RMRp\         '       dÂ    \        P                  ! RR\        V P                  4      R.V'       d   R.M. ,           \        P
                  RRRR	^
R
R7      pTP                  ^ 8w  dY   \        TP                  ;'       g    TP                  ;'       g    RP                  4       ;'       g    RT P                   24      hR# ^ RIp\        VP                  4      ;_uu_ 4        VP!                  V P                  4      pVP#                  RR7       F9  p\        VP                  4      ;_uu_ 4        \        Wb4      ! 4        RRR4       K;  	  \        WR4      ! 4        RRR4       R#   \         d    \        Y4      ! 4       u # i ; i  + '       g   i     K‰  ; i  + '       g   i     R# ; i)zITerminate the bridge process using process-tree semantics where possible.r�   Ú	terminaterˆ   r‰   z/TrŠ   Tr"   r#   F)r(   r$   r%   r&   r'   r1   r2   r|   ztaskkill failed for PID N)Ú	recursive)rs   r=   r>   r   rw   rŽ   r;   ÚgetattrÚ
returncoder�   Ústderrr@   rA   r~   r   ÚNoSuchProcessr   Úchildren)r„   r¾   Úactionrn   r~   ÚparentÚchilds   &$     r   Ú_terminate_bridge_processrÍ   º   s^  € ç‰V +€Fßƒ{ð	+Ü—^’^Ø˜V¤S¨¯©£]°DÐ9Çu¸d¹VÐRTÕUÜ ×(Ñ(¸ÀDÐSZÐclÐvxØôˆFð ×Ñ Ô!Ü˜6Ÿ=™=×?Ð?¨F¯M©M×?Ð?¸R×FÑFÓH×qÐqÐNfÐgk×goÑgoÐfpÐLqÓrÐrÙÛÜ	�&×&Ñ&×	'Õ	'Ø—‘ §¡Ó)ˆØ—_‘_¨t�_Ö4ˆEÜ˜&×.Ñ.×/Õ/Ü˜Ô&Ô(÷ 0Ñ/ñ 5ô 	�ÔÔ!÷ 
(Ñ	'øô !ô 	+Ü˜4Ô(Ó*Ò*ð	+ú÷ 0×/Ð/ú÷ 
(×	'Ð	'ús7   šAF  Ã;AF5Å	F!ÅF5Æ FÆFÆ!F2Æ,	F5Æ5G	)ÚPlatformÚPlatformConfig)ÚWhatsAppBehaviorMixin)Únormalize_whatsapp_mention_jidÚto_whatsapp_jid)ÚBasePlatformAdapterÚ
SendResultÚSUPPORTED_DOCUMENT_TYPESÚcache_image_from_urlÚcache_audio_from_url)Úcancel_task)ÚMessageEventÚMessageType)Úenv_intc                ó$   € V ^8„  d   QhR\         /# rI   )r¡   )r   s   "r   r   r   ß   s   € ÷ iñ i”Uñ ir   c                 óN   € ^ RI Hp HpHpHp V! 4       V ! 4       V! 4       V! 4       3# )zh``(image, audio, video, document)`` cache dirs, resolved per call so a profile override's cache matches.©Úget_audio_cache_dirÚget_document_cache_dirÚget_image_cache_dirÚget_video_cache_dir)Úgateway.platforms.baserß   rà   rá   râ   rÞ   s       r   Ú_cache_dirsrä   ß   s&   € ç|Ó|ÙÓ Ñ"5Ó"7Ñ9LÓ9NÑPfÓPhÐhÐhr   c                ó0   € V ^8„  d   QhR\         R\        /# )r   Úurlr   ©r   ry   )r   s   "r   r   r   å   s   € ÷ 
ñ 
¤ð 
¬ñ 
r   c                ót  €  \        V 4      P                  4       p\	        4        Fc  p\        \        \        4      ;_uu_ 4        TP                  \        T4      P                  4       4      '       d    RRR4        R#  RRR4       Ke  	  R#   \        \        3 d     R# i ; i  + '       g   i     K’  ; i)u{   Absolute bridge path resolves (symlinks included) inside a Hermes cache dir â€” a rogue bridge could hand back /etc/passwd.FNT)r   Úresolver�   rM   rä   r   Úis_relative_to)ræ   ÚresolvedÚroots   &  r   Ú_is_allowed_bridge_pathrí   å   s’   € ðÜ˜“9×$Ñ$Ó&ˆô –ˆÜ”gœz×*Õ*Ø×&Ñ&¤t¨D£z×'9Ñ'9Ó';×<Ò<Ø÷ +Ò*Ø<÷ +Ñ*ñ ñ øô ”ZÐ ô Úðú÷ +×*Ð*ús   ‚B Á0B&ÂB#Â"B#Â&B7c                ó0   € V ^8„  d   QhR\         R\        /# ©r   rU   r   )r   r   )r   s   "r   r   r   ò   s   € ÷ ñ œTð ¤cñ r   c                ó˜   € ^ RI p VP                  V P                  4       4      P                  4       R,          #   \         d     R# i ; i)ztFirst 16 hex chars of SHA-256 of *path* ("" if unreadable); bridge.js reports its own as ``/health`` ``scriptHash``.N:Né   Nr|   )ÚhashlibÚsha256Ú
read_bytesÚ	hexdigestr�   )rU   rò   s   & r   Ú_file_content_hashrö   ò   s@   € ãðØ�~‰~˜dŸo™oÓ/Ó0×:Ñ:Ó<¸SÕAÐAøÜô Úðús   †3: ºA	ÁA	c                ó$   € V ^8„  d   QhR\         /# rI   rÁ   )r   s   "r   r   r   û   s   € ÷ ñ ¤Tñ r   c                 óÜ   € \        R4      p V '       g   ^ RIHp V! 4       #  \        P                  ! V R.3R^R\        4       /\        BRR/B P                  ^ 8H  #   \         d     R# i ; i)zm
Check if WhatsApp dependencies are available.

WhatsApp requires a Node.js bridge for most implementations.
r{   ©Úlazy_installs_allowedz	--versionr1   Úenvr2   F)	r   Úpmrú   r=   r>   r   r?   rÆ   rƒ   )Ú_noderú   s     r   Úcheck_whatsapp_requirementsrþ   û   s€   € ô ! Ó(€EßÝ,ñ %Ó&Ð&ðÜ�~Š~˜u kÐ2Ñu¸AÐuÔCXÓCZÐuÔ^gÑuÐotÒu÷  Añ  Að  EFñ  Fð  	FøÜô Úðús   ¢9A ÁA+Á*A+c                  ó¦   € ^ RI p \        V R4      '       g;   \        V RR4      ;'       g    \        \        V RR4      4      p\	        RV R24      hV # )é    NÚClientSessionÚ__file__Ú__path__zaiohttp at z is an incomplete install© )ÚaiohttpÚhasattrrÅ   r.   ÚImportError)r  Úwheres     r   Ú_import_aiohttpr	    sQ   € ÛÜ�7˜O×,Ò,Ü˜ ¨TÓ2×\Ð\´d¼7À7ÈJÐXZÓ;[Ó6\ˆÜ˜K¨ wÐ.GÐHÓIÐIØ€Nr   c                ó\   € V ^8„  d   QhR\         \        \        \        3,          ,          /# rI   )r   r¡   r   ry   )r   s   "r   r   r     s!   € ÷ !>ñ !>œ¤¤s¬D yÕ!1Õ2ñ !>r   c                 ó>  €  \        4        R#   \         d3   p \        T \        4      '       g   \	        T 4      R3u Rp ? #  Rp ? MRp ? ii ; i^ RIHp ^ RIHp ^ RI	H
p ^ RIHp ^ RIHp T! 4       pT! 4       ;'       d    T! T4      ;'       g    T! T4      RJp T! R4       MM  \        \         \"        3 d5   p \	        T 4      ;'       g    \%        T 4      P&                  T3u Rp ? # Rp ? ii ; i \        4        R#   \         d   p T  R	2R3u Rp ? # Rp ? ii ; i)
a;  None once aiohttp imports (PM installs the ``sms`` extra, which is exactly aiohttp, when it is missing), else
(why not, retryable).

Every bridge call imports aiohttp; a sealed env without it used to fail each /health poll silently and loop
forever on "did not start in 15s" while the bridge was healthy (#126358).
NF)Ú!running_from_selected_environment)Úrestart_needed)Úensure_importrù   )Ú	repo_rootÚsmsz after installing the sms extra)r	  r  Ú
isinstanceÚModuleNotFoundErrorr   Úpm.environmentsr  Úpm.environments_adoptr  Ú	pm.extrasr  Ú
pm.installrú   Úpm.pathsr  ÚRuntimeErrorr�   rM   ÚtypeÚ__name__)Úexcr  r  r  rú   r  rì   Úinstallables           r   Úensure_aiohttpr    s   € ð#ÜÔÙøÜô #Ü˜#Ô2×3Ò3Ü�s“8˜U�?Õ"ô 4ûð#úõ BÝ4Ý'Ý0Ý"ñ ‹;€DÙ'Ó)×{Ð{Ñ/PÐQUÓ/V×/zÐ/zÑZhÐimÓZnÐvzÐZz€Kð;Ù�eÕøÜœ'¤:Ð.ô ;ô �3‹x×-Ð-œ4 ›9×-Ñ-¨{Ð:Õ:ûð;úð>ÜÔÙøÜô >Ø�Ð5Ð6¸Ð=Õ=ûð>úsU   ‚
 ŽA™"A»AÁAÂB& Â&C0Â<)C+Ã%C0Ã+C0Ã4
D  Ä DÄDÄDÄDÚlocationÚlive_locationÚstickerÚimageÚvideoÚpttÚaudioú
image/jpegú	audio/oggú	video/mp4ÚdocumentÚgifúapplication/octet-streamz
image/webpc                ó0   a € \        S 4      V 3R l4       pV# )zbAdapter-method decorator: return ``SendResult(error=...)`` when ``_bridge_unavailable()`` says so.c              Ÿ   ó–   <"  € V P                  4       G R j  x€L
 pV'       d   \        RVR7      # S! V .VO5/ VB G R j  x€L
 #  L- L5i)NF©ÚsuccessÚerror)Ú_bridge_unavailablerÔ   )ÚselfÚargsÚkwargsÚunavailableÚmethods   &*, €r   Ú_guardedÚ_needs_bridge.<locals>._guardedT  sI   øé € à ×4Ñ4Ó6×6ˆß?JŒz %¨{Ô;ÐsÑV\Ð]aÐVsÐdhÒVsÐlrÑVs×PsÐsñ 7ÙPsùs&   ƒA	—A˜A	¤A	Á AÁA	ÁA	r   )r5  r6  s   f r   Ú_needs_bridger8  R  s"   ø€ ä
ˆ6ƒ]ôtó ðtð €Or   c            	       ó¬  a a€ ] tR tRt oRtRtRtRtV3R lV 3R lltV3R lR lt	V3R	 lR
 lt
V3R lR ltV3R lR ltV3R lR ltV3R lR ltV3R lR ltR_V3R lR lltV3R lR ltV3R lR ltV3R lR ltRR/V3R lR  lltV3R! lR" ltV3R# lR$ ltV3R% lR& ltV3R' lR( ltV3R) lR* ltV3R+ lR, lt]R`V3R- lR. ll4       t]R/R/V3R0 lR1 ll4       t]R`V3R2 lR3 ll4       t]R4^/V3R5 lR6 ll4       tRaV3R7 lV 3R8 lllt ]R9RR:RR;RR<R/V3R= lR> ll4       t!RbV3R? lV 3R@ lllt"R`V3RA lRB llt#R`V3RC lRD llt$R`V3RE lRF llt%RbV3RG lRH llt&RaV3RI lRJ llt'V3RK lRL lt(V3RM lRN lt)V3RO lRP lt*V3RQ lRR lt+RSt,]-V3RT lRU l4       t.V3RV lRW lt/V3RX lRY lt0V3RZ lR[ lt1V3R\ lR] lt2R^t3Vt4V ;t5# )cÚWhatsAppAdapteri[  a  Transport over a local Node.js (Baileys) HTTP bridge; behavior lives in ``WhatsAppBehaviorMixin``. config.extra: bridge_script /
bridge_port (3000) / session_path, dm_policy / group_policy (open|allowlist|disabled|pairing), allow_from / group_allow_from, send_read_receipts.NTc                ó    <€ V ^8„  d   QhRS[ /# )r   Úconfig)rÏ   )r   Ú__classdict__s   "€r   r   ÚWhatsAppAdapter.__annotate__c  s   ø€ ÷ ',ñ ',™~ñ ',r   c                ó�  <€ \         S
V `  V\        P                  4       \        P
                  f   ^ RIHp V! 4       \        n        TP                  p^ RI	H
p V! 4       V n        R V n        R V n        RV n        ^RIHp  V! V P                  VP#                  R4      4      V n        VP#                  R\-        V P
                  R	,          4      4      V n        \1        V4      V n        VP#                  R
4      V n        \-        \7        VRRR4      4      P9                  4       P;                  4       V n        V P?                  V PA                  VR\B        4      4      V n"        \-        \7        VRRR4      4      P9                  4       P;                  4       V n#        V PI                  VRR\B        4      w  rxV P?                  V4      V n%        VP#                  RR4      p	\M        V	\N        4      '       d   T	M3\-        T	;'       g    R4      P9                  4       P;                  4       R9   V n(        V PS                  4       V n*        \V        PX                  ! 4       V n-        R ;V n.        ;V n/        ;V n0        V n1        RV n2        V Pg                  4        R #   \&         d)   p\(        P+                  RT4       RT n         R p?ELR p?ii ; i)N)Úresolve_whatsapp_bridge_dir©Úget_hermes_homeF©Ústandalone_bridge_portÚbridge_portz[whatsapp] %s; using port 3000i¸  Úbridge_scriptz	bridge.jsÚreply_prefixÚ	dm_policyÚWHATSAPP_DM_POLICYÚpairingÚgroup_policyÚWHATSAPP_GROUP_POLICYÚsend_read_receiptsr|   )ÚWHATSAPP_ALLOWED_USERS)Úgroup_allow_fromÚgroupAllowFrom)ÚWHATSAPP_GROUP_ALLOW_FROMÚWHATSAPP_GROUP_ALLOWED_USERS>   Ú1ÚonÚyesÚtrue)4ÚsuperÚ__init__rÎ   ÚWHATSAPPr:  Ú_DEFAULT_BRIDGE_DIRÚ!gateway.platforms.whatsapp_commonr@  rY   Úhermes_constantsrB  Ú_profile_homeÚ_bridge_processÚ_foreign_bridge_sessionÚ_bridge_probe_timed_outÚbridge_ownershiprD  rX   Ú_bridge_portrM   r‹   rŒ   r   Ú_bridge_scriptrZ   Ú_session_pathÚ_reply_prefixÚ_extra_or_secretrA   r€   Ú
_dm_policyÚ_coerce_allow_listÚ_select_dm_allowlistr!   Ú_allow_fromÚ_group_policyÚ_select_allowlistÚ_group_allow_fromr  ry   Ú_send_read_receiptsÚ_compile_mention_patternsÚ_mention_patternsÚasyncioÚQueueÚ_message_queueÚ_bridge_log_fhÚ_bridge_logÚ
_poll_taskÚ_http_sessionÚ_shutting_downÚ_configure_text_batch_delays)r1  r<  r@  rY   rB  rD  r  r¶   Ú
raw_groupsÚrrÚ	__class__s   &&        €r   rX  ÚWhatsAppAdapter.__init__c  sK  ø€ Ü‰Ñ˜¤×!2Ñ!2Ô3Ü×.Ñ.Ò6ÝUÙ2MÓ2OŒOÔ/Ø—‘ˆÝ4Ù,Ó.ˆÔØ;?ˆÔØ6:ˆÔ$Ø',ˆÔ$Ý<ð	%ñ &<¸D×<NÑ<NÐPU×PYÑPYÐZgÓPhÓ%iˆDÔð $)§9¡9¨_¼cÀ$×BZÑBZÐ]hÕBhÓ>iÓ#jˆÔÜ)¨%Ó0ˆÔØ,1¯I©I°nÓ,EˆÔÜÔ.¨u°kÐCWÐYbÓcÓd×jÑjÓl×rÑrÓtˆŒØ×2Ñ2°4×3LÑ3LÈUÐToÔqvÓ3wÓxˆÔÜ Ô!1°%¸ÐI`ÐbkÓ!lÓm×sÑsÓu×{Ñ{Ó}ˆÔð ×.Ñ.ØÐ9Ð;xÔzóA‰ˆà!%×!8Ñ!8¸Ó!DˆÔØ�Y‰YÐ+¨UÓ3ˆÜ)3°B¼×)=Ò)=¡2Ä3ÀrÇxÀxÈRÃ=×CVÑCVÓCX×C^ÑC^ÓC`Ðd~ÑC~ˆÔ Ø!%×!?Ñ!?Ó!AˆÔÜ-4¯]ª]«_ˆÔØX\Ð\ˆÔÐ\˜dÔ.Ð\°´À4ÔCUà#ˆÔð 	×)Ñ)Ö+øô/ ô 	%Ü�N‰NÐ;¸SÔAØ $ˆD×Òûð	%ús   Â'J ÊKÊK Ë Kc                ó&   <€ V ^8„  d   QhRS[ RS[ /# rï   r   )r   r=  s   "€r   r   r>  Œ  s   ø€ ÷ >ñ >¡ð >©ñ >r   c                ó&   € R V P                    RV 2# )zhttp://127.0.0.1:Ú/)rb  )r1  rU   s   &&r   Ú_bridge_urlÚWhatsAppAdapter._bridge_urlŒ  s   € Ø" 4×#4Ñ#4Ð"5°Q°t°fÐ=Ð=r   c                ó,   <€ V ^8„  d   QhRS[ RS[ RS[/# )r   r5  rU   r1   )r   Úfloat)r   r=  s   "€r   r   r>  �  s'   ø€ ÷ Cñ C¡#ð C©Sð C¹5ñ Cr   c           	     óŠ   € ^ RI p\        V P                  V4      ! V P                  V4      3/ VBRVP	                  VR7      /B # )zX``session.<method>`` context manager for a bridge endpoint (caller must ``async with``).Nr1   ©Útotal)r  rÅ   rw  r�  ÚClientTimeout)r1  r5  rU   r1   r3  r  s   &&&&, r   Ú_bridge_reqÚWhatsAppAdapter._bridge_req�  sV   € ãÜ�t×)Ñ)¨6Ô2°4×3CÑ3CÀDÓ3Iñ  CÈVñ  CÐ]d×]rÑ]rð  zAÐ]ró  ^Bò  Cð  	Cr   c                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# rI   )r¡   ry   r	   )r   r=  s   "€r   r   r>  ”  s   ø€ ÷ "ñ "©E±$¹°)Õ,<ñ "r   c           
   ƒ  ó   "  € ^ RI pVP                  4       ;_uu_4       GRj  x€L
 q"P                  V P                  R4      VP	                  ^R7      R7      ;_uu_4       GRj  x€L
 pVP
                  ^È8w  d'   RuuRRR4      GRj  x€L
  uuRRR4      GRj  x€L
  #  RVP                  4       G Rj  x€L
 3uuRRR4      GRj  x€L
  uuRRR4      GRj  x€L
  #  L¼ L| LZ LJ L1 L! L  \         d    h \         d,    Ru uuRRR4      GRj  x€L 
  uuRRR4      GRj  x€L 
  # i ; i  + GRj  x€L 
 '       g   i     M; iRRR4      GRj  x€L 
  R#   + GRj  x€L 
 '       g   i     R# ; i5i)u�   GET /health with a fresh session â†’ ``(http_200, json)``; unparseable 200 body â†’ ``(True, None)``; connection errors and timeouts propagate.NÚhealthr†  ©r1   T)FN)TN)	r  r  rX   r�  rˆ  r–   ÚjsonÚTimeoutErrorrƒ   )r1  r  ÚsessionÚresps   &   r   Ú_probe_bridge_healthÚ$WhatsAppAdapter._probe_bridge_health”  s=  é € ãØ×(Ñ(×*×*Ô*¨g·{±{À4×CSÑCSÐT\ÓC]Ðgn×g|Ñg|ð  DEÐg|ó  hF°{÷  8G÷  8Gô  8Gð  KOØ�{‰{˜cÔ!Ø"÷ 8G÷  8Gñ  8G×*×*Ò*ð"Ø 4§9¡9£;×.Ð.÷	 8G÷  8Gñ  8G×*×*Ô*ó  8GÑ*ñ /ñ	 8GÑ*øô
  ô ØÜô "Ø!Ñ!÷ 8G÷  8Gò  8G×*×*Ó*ð"ú÷ 8G÷  8G÷  8Gð  8Gú×*×*×*×*×*Ô*üs4  ‚!E>£C ¤E>§>E!Á%C"Á&E!Á)D2	Á<E!Â	C$
Â
E!ÂE>ÂC&ÂE>Â"C.Â6C(Â7C.Â;E!ÃC*
Ã	E!ÃE>ÃC,ÃE>Ã"E!Ã$E!Ã&E>Ã(C.Ã*E!Ã,E>Ã.D/ÄD/ÄD2	ÄE!ÄD
ÄE!ÄE>Ä'D*Ä(E>Ä.D/Ä/D2	Ä2EÄ8D;Ä9
EÅEÅE!ÅE>ÅEÅE>Å!E;	Å'E*Å(
E;	Å3E;	Å5	E>c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   Ú
bridge_dirr   ©r   ry   )r   r=  s   "€r   r   r>  ¡  s   ø€ ÷ %ñ %©dð %±tñ %r   c           
     ó  € VR,          R,          p\        VR,          4      p VR,          P                  4       '       d9   VP                  RR7      P                  4       V8X  d   \	        V4      '       d   R# \        RT P                   R24       R	p ^ R
Ip\        R4      p\        4       pTff   TP                  R4      P                  pTP                  R4      pTe   TP                  f   TP                  RR4      h\!        TP                  4      p\"        P$                  ! TRR.3R\!        T4      R\'        RR4      RT/\(        BRR/B p	T	P*                  ^ 8X  dW   \        RT P                   R24       \-        \
        4      ;_uu_ 4        T'       d   TP/                  TRR7       R
R
R
4       R# \        RT P                   RT	P0                   24       T	P0                  '       d"   RT	P0                  P                  4       R R
  R2MR	pT P5                  RRT R2RR7       R#   \
         d     ELÂi ; i  + '       g   i     R# ; i  \2         d,   p
\        RT P                   RT
 24       RT
 R2p R
p
?
LqR
p
?
ii ; i)!zenpm install when node_modules is missing OR package.json hash != stamp file. False = fatal error set.Únode_modulesz.hermes-pkg-hashzpackage.jsonr¤   r¥   TÚ[z,] Installing WhatsApp bridge dependencies...r|   NÚnpmz+ensured but no selected binary was recordedÚinstallz--silentÚcwdr1   ÚWHATSAPP_NPM_INSTALL_TIMEOUTi,  rû   r2   Fz] Dependencies installedr"   z] npm install failed: ú (Ú)z"] Failed to install dependencies: Úwhatsapp_npm_install_failedz"WhatsApp bridge npm install failedz7. Run `hermes whatsapp`, then restart `hermes gateway`.©Ú	retryableiþÿÿ)rö   r¨   r©   rA   ry   r�   Úprintr   rü   r   r   Úensurerû   Úinstalled_packageÚbinaryÚInstallErrorr   r=   r>   rÛ   r?   rÆ   r   r»   rÇ   rƒ   Ú_set_fatal_error)r1  r–  Ú
_dep_stampÚ	_pkg_hashÚdetailrü   Ú_npm_binrû   Ú	installedÚinstall_resultÚes   &&         r   Ú_ensure_bridge_depsÚ#WhatsAppAdapter._ensure_bridge_deps¡  sŸ  € à .Õ0Ð3EÕEˆ
Ü& z°NÕ'BÓCˆ	ð	Ø˜^Õ+×3Ñ3×5Ò5¸*×:NÑ:NÐXcÐ:NÓ:d×:jÑ:jÓ:lÐpyÔ:yô  Cð  DM÷  Nò  NÙô 	��$—)‘)�ÐHÐIÔJØˆð	Ûä+¨EÓ2ˆHÜ'Ó)ˆCØÒØ—i‘i Ó&×*Ñ*�Ø×0Ñ0°Ó7�	ØÒ$¨	×(8Ñ(8Ò(@ØŸ/™/¨%Ð1^Ó_Ð_Ü˜y×/Ñ/Ó0�Ü'Ÿ^š^¨X°yÀ*Ð,Mñ OÔSVÐWaÓSbð OÔlsð  uSð  UXó  mYð OØ03ðOÜ7@ñOØHMòOˆNà×(Ñ(¨AÔ-Ü˜˜$Ÿ)™)˜Ð$<Ð=Ô>Üœg×&Õ&ß Ø"×-Ñ-¨iÀ'Ð-ÔJ÷ 'ñ Ü�A�d—i‘i�[Ð 6°~×7LÑ7LÐ6MÐNÔOØES×EZ×EZÐEZ�r˜.×/Ñ/×5Ñ5Ó7¸¸Ð>Ð?¸qÑAÐ`bˆFð 	×ÑÐ;Ð?aÐbhÐaið jVð >VØafð 	ô 	háøô= ô 	Úð	ú÷& 'Ö&ñ ûô ô 	Ü�A�d—i‘i�[Ð BÀ1À#ÐFÔGØ˜!˜˜A�Y�Fûð	úsP   ¤AH- ÂC>I ÆH?Æ/I Æ9AI È-H<È;H<È?I	É
I ÉI ÉJ	É!JÊJ	c                ó   <€ V ^8„  d   QhRR/# ©r   r   Nr  )r   r=  s   "€r   r   r>  È  s   ø€ ÷ Eñ E°Dñ Er   c                ó–   € ^ RI pWn        VP                  4       V n        \        P
                  ! V P                  4       4      V n        R# )r   N)r  r^  r  rw  rq  Úcreate_taskÚ_poll_messagesrv  )r1  Úmanaged_processr  s   && r   Ú_attach_to_bridgeÚ!WhatsAppAdapter._attach_to_bridgeÈ  s7   € ÛØ.ÔØ$×2Ñ2Ó4ˆÔÜ!×-Ò-¨d×.AÑ.AÓ.CÓDˆŽr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   Úbridge_pathr   r—  )r   r=  s   "€r   r   r>  Î  s   ø€ ÷ !ñ !±tð !Áñ !r   c              ƒ  óv  "  € RV n         RV n         V P                  4       G Rj  x€L
 w  r#V'       d   Vf   R# VP                  R4      pV'       d#   V\	        V P
                  4      8w  d	   W@n         R# VP                  RR4      pVR8w  d   \        RV P                   RV R	24       R# VP                  R
R4      \        V4      rvV'       d‰   V'       d�   Wg8X  d{   \        VP                  RR4      4      V P                  8X  dQ   \        RV P                   RV R24       V P                  4        V P                  R4       V P                  R4       R# Wg8w  d   RT;'       g    R RV 2MRp\        RV P                   RV R	24       R#  ELk  \         d    RT n         R# \         d     R# i ; i5i)zlAdopt a connected bridge serving the on-disk bridge.js + same read-receipt config; else say why it restarts.NFr‘  r–   ÚunknownÚ	connectedrš  z*] Bridge found but not connected (status: z), restartingÚ
scriptHashr|   ÚsendReadReceiptsz!] Using existing bridge (status: r   Tzrunning=Úunversionedz, disk=z!send_read_receipts config changedz] Running bridge is stale ()r_  r`  r“  rX   r   rd  r¤  r   rö   ry   rn  Ú_mark_connectedr¹  Ú_wire_plugin_handlersr�  rƒ   )	r1  r¼  ÚokÚdataÚreported_sessionÚbridge_statusÚrunning_hashÚ	disk_hashÚstale_reasons	   &&       r   Ú_reuse_running_bridgeÚ%WhatsAppAdapter._reuse_running_bridgeÎ  s³  é € à'+ˆÔ$Ø',ˆÔ$ð	Ø!×6Ñ6Ó8×8‰HˆBß˜šÙð
  $Ÿx™x¨	Ó2ÐßÐ$4¼¸D×<NÑ<NÓ8OÔ$OØ/?Ô,ÙØ ŸH™H X¨yÓ9ˆMØ Ô+Ü˜˜$Ÿ)™)˜Ð$NÈ}ÈoÐ]jÐkÔlÙØ&*§h¡h¨|¸RÓ&@ÔBTÐU`ÓBa˜)ß§	¨lÔ.GÌDÐQU×QYÑQYÐZlÐnsÓQtÓLuÐy}÷  zRñ  zRô  MRÜ˜˜$Ÿ)™)˜Ð$EÀmÀ_ÐTUÐVÔWØ×$Ñ$Ô&Ø×&Ñ& tÔ,Ø×*Ñ*¨4Ô0ÙØ[gÔ[t˜X l×&CÐ&C°mÐ%DÀGÈIÈ;ÑWð  {^ˆLÜ�A�d—i‘i�[Ð ;¸L¸>ÈÐWÔXñ
 ò9 9øô0 ô 	0Ø+/ˆDÕ(ñ ô ô 	ØÙð	üs‹   ‚F9’F ¥F¦F ¸F9ºF Á F Á3F9Á55F Â*F9Â,+F ÃA>F ÅF9ÅF Å(&F ÆF9ÆF ÆF6Æ%F9Æ(F6Æ1F6Æ2F9Æ5F6Æ6F9c                ó    <€ V ^8„  d   QhRS[ /# rI   ©Údict)r   r=  s   "€r   r   r>  ñ  s   ø€ ÷  ñ  ™Tñ  r   c                ó  € \        4       p\        R4      pV'       d   W!R&   M0V P                  e   V P                  VR&   MVP                  RR4       V P                  '       d   RMRVR&   R\        RR4      3.\
         Uu. uF  q3\        V4      3NK  	  up,            F%  w  rEV'       d   WQV&   K  VP                  VR4       K'  	  V P                  VR&   V P                  VR	&   R
V P                  3RV P                  33 F=  w  rgV'       d   RP                  \        V4      4      W&   K+  VP                  VR4       K?  	  \        4       w  r‰r«VP                  \        V4      \        V	4      \        V4      R7       V# u upi )ziSubprocess env: the adapter's EFFECTIVE profile policy + profile-resolved WHATSAPP_* values + cache dirs.ÚWHATSAPP_REPLY_PREFIXNrV  ÚfalseÚWHATSAPP_SEND_READ_RECEIPTSÚWHATSAPP_MODEú	self-chatrI  rL  rN  rR  Ú,)ÚHERMES_IMAGE_CACHE_DIRÚHERMES_AUDIO_CACHE_DIRÚHERMES_DOCUMENT_CACHE_DIR)r   r!   re  Úpoprn  Ú_BRIDGE_PASSTHROUGH_ENVrg  rk  rj  rm  r�   Úsortedrä   Úupdater   )r1  Ú
bridge_envrG  ÚkÚ_keyÚ_vÚenv_keyÚidsÚimg_dirÚ	audio_dirÚ
_video_dirÚdoc_dirs   &           r   Ú_bridge_envÚWhatsAppAdapter._bridge_envñ  s®  € ô
 +Ó,ˆ
ÜÐ4Ó5ˆßØ2>Ð.Ò/Ø×ÑÒ+Ø26×2DÑ2DˆJÐ.Ò/à�N‰NÐ2°DÔ9Ø>B×>V×>VÐ>V±FÐ\cˆ
Ð0Ñ1Ø)¬5°À+Ó+NÐOÐPõ  lCó  TDñ  lCÐfgÔX]Ð^_ÓX`ÓTañ  lCñ  TD÷  Dð  D‰HˆDßØ#%˜4Ó à—‘˜t TÖ*ñ	 Dð ,0¯?©?ˆ
Ð'Ñ(Ø.2×.@Ñ.@ˆ
Ð*Ñ+Ø6¸×8HÑ8HÐIÐLjÐlp÷  mCñ  mCð  LDó  E‰LˆGßØ&)§h¡h¬v°c«{Ó&;�
Ó#à—‘˜w¨Ö-ñ	 Eô 3>³-Ñ/ˆ˜JØ×Ñ´°W³ÔVYÐZcÓVdô  ADð  ELó  AMÐô  	NØÐùò% TDs   ÂFc                ó,   <€ V ^8„  d   QhRS[ RS[ RS[/# )r   r¬  Úcoder   rç   )r   r=  s   "€r   r   r>    s#   ø€ ÷ ñ ¡3ð ©cð ÑQUñ r   c                óì   € \        R V P                   RV 24       \        R V P                   RV P                   24       V P                  4        V P	                  W! RV P                   R2RR7       R# )rš  ú] z] Check log: z (see r   Tr¢  F)r¤  r   ru  Ú_close_bridge_logr©  )r1  r¬  rì  s   &&&r   Ú_bridge_diedÚWhatsAppAdapter._bridge_died  sr   € Ü��$—)‘)�˜B˜v˜hÐ'Ô(Ü��$—)‘)�˜M¨$×*:Ñ*:Ð);Ð<Ô=Ø×ÑÔ à×Ñ˜d h¨f°T×5EÑ5EÐ4FÀaÐ$HÐTXÐÔYÙr   c                óP   <€ V ^8„  d   QhRS[ RS[S[S[,          S[S[3,          /# )r   Údied_msgr   )r   r¡   r   ry   rÐ  )r   r=  s   "€r   r   r>    s-   ø€ ÷ &ñ &±#ð &¹%ÁÉÅÑPTÑVZÐ@ZÕ:[ñ &r   c              ƒ  ó  "  € Rp/ p\        ^4       FÚ  p\        P                  ! ^4      G Rj  x€L
  V P                  P	                  4       e:   V P                  VP                  V P                  P                  R7      4      W#3u #  V P                  4       G Rj  x€L
 w  rVV'       dB   RpVe:   TpVP                  R4      R8X  d    \        RV P                   R24       RW#3u # KØ  KÚ  KÜ  	  RW#3#  LÅ LY  \         d     Kô  i ; i5i)	u{   Poll /health up to 15Ã—1s â†’ ``(connected, http_ready, data)``; connected False = process died (reported), None = timeout.FN)rì  Tr–   r¿  rš  z"] Bridge ready (status: connected))Úrangerq  Úsleepr^  Úpollrð  r   rÆ   r“  rX   r¤  r   rƒ   )r1  ró  Ú
http_readyrÆ  ÚattemptrÅ  Úds   &&     r   Ú_poll_bridge_healthÚ#WhatsAppAdapter._poll_bridge_health  s  é € àˆ
ØˆÜ˜R–yˆGÜ—-’- Ó"×"Ð"Ø×#Ñ#×(Ñ(Ó*Ò6Ø×(Ñ(¨¯©¸d×>RÑ>R×>]Ñ>]¨Ó)^Ó_ÐakÐqÒqð
Ø"×7Ñ7Ó9×9‘�ßØ!%�JØ’}Ø ˜ØŸ8™8 HÓ-°Ô<Ü! A d§i¡i [Ð0RÐ"SÔTØ#'¨Ð#9Ò9ñ =ñ %ñ ñ !ð �ZÐ%Ð%ñ #ñ :øô ô ÚðüsG   ‚,D
®C4¯AD
Â	C8ÂC6ÂAC8Ã%D
Ã6C8Ã8DÄD
ÄDÄD
c                ó    <€ V ^8„  d   QhRS[ /# rI   rÁ   )r   r=  s   "€r   r   r>  0  s   ø€ ÷ ñ ©ñ r   c              ƒ  óð  "  € V P                  R4      G Rj  x€L
 w  rpVRJ d   R# V'       g   V P                  RR4      # VP                  R4      R8w  dš   \        RV P                   R	24       V P                  R
4      G Rj  x€L
 w  p pVRJ d   R# VfX   \        RV P                   R24       \        RV P                   RV P
                   24       \        RV P                   R24       R#  LÚ Lo5i)up   Phase 1: HTTP up (â‰¤15s). Phase 2: ``status: connected`` (â‰¤15s more; warns but proceeds if still connecting).z&Bridge process died (exit code {code})NFz'Bridge HTTP server did not start in 15sÚwhatsapp_bridge_timeoutr–   r¿  rš  z7] Bridge HTTP ready, waiting for WhatsApp connection...z%Bridge process died during connectionu&   ] âš  WhatsApp not connected after 30sz]   Bridge log: z0]   If session expired, re-pair: hermes whatsappT)rû  rð  rX   r¤  r   ru  )r1  r¿  rø  rÆ  r¶   s   &    r   Ú_wait_for_bridgeÚ WhatsAppAdapter._wait_for_bridge0  sï   é € à,0×,DÑ,DÐEmÓ,n×&nÑ#ˆ	˜tØ˜ÓÙßØ×$Ñ$Ð%NÐPiÓjÐjØ�8‰8�HÓ Ô,Ü�A�d—i‘i�[Ð WÐXÔYØ$(×$<Ñ$<Ð=dÓ$e×e‰OˆI�q˜!Ø˜EÓ!ÙØÒ Ü˜˜$Ÿ)™)˜Ð$JÐKÔLÜ˜˜$Ÿ)™)˜Ð$4°T×5EÑ5EÐ4FÐGÔHÜ˜˜$Ÿ)™)˜Ð$TÐUÔVÙñ 'oñ fùs(   ‚C6—C2˜C6¯AC6ÂC4ÂA.C6Ã4C6c                ó    <€ V ^8„  d   QhRS[ /# rI   rÁ   )r   r=  s   "€r   r   r>  B  s   ø€ ÷ ñ ™Dñ r   c                ó`  € \        V P                  4      pV P                  R,          p\        RV P                  3RR3VP
                  RV P                  V3RRV R23VP
                  R	V P                  V3R
R33pV F=  w  rErgV! 4       '       d   K  \        P                  ! V!   V P                  WgRR7        R# 	  \        4       ;peA   Vw  ršRV	 R2p\        P                  RV P                  V4       V P                  RWzR7       R# \        P                  RV P                  V4       R# )z”Node + bridge script + creds.json + aiohttp present, else a named fatal error (an unpaired bridge only prints QR codes; retries would pay 30s each).z
creds.jsonz2[%s] Node.js not found. WhatsApp requires Node.js.Úwhatsapp_node_missinguI   Node.js is not installed â€” install Node.js and re-run `hermes gateway`.z [%s] Bridge script not found: %sÚwhatsapp_bridge_missingz"WhatsApp bridge script missing at Ú.z£[%s] WhatsApp is enabled but not paired (no creds.json at %s). Pair from the dashboard or run `hermes whatsapp`; remove WHATSAPP_ENABLED from your .env to disable.Úwhatsapp_not_paireduU   WhatsApp enabled but not paired â€” pair from the dashboard or run `hermes whatsapp`.Fr¢  zaiohttp is unavailable (z¨); the WhatsApp bridge client needs it. Run `hermes pm install --extra sms` (it ships aiohttp; `hermes pm repair` for a damaged install), then restart `hermes gateway`.ú[%s] %sÚwhatsapp_aiohttp_missingz[%s] Bridge found at %sT)r   rc  rd  rþ   r   r¨   r‹   rŒ   r©  r  rµ   )r1  r¼  Ú
creds_pathÚchecksrÅ  Ú	warn_argsrì  ÚmessageÚmissingÚwhyr£  s   &          r   Ú
_preflightÚWhatsAppAdapter._preflightB  sK  € ä˜4×.Ñ.Ó/ˆØ×'Ñ'¨,Õ6ˆ
ä(Ð+_Ðae×ajÑajÐ*kØ$Ð&qðsà×ÑÐ"DÀdÇiÁiÐQ\Ð!]Ø&Ð*LÈ[ÈMÐYZÐ([ð]à×Ñð "iØjn×jsÑjsÐuð!Aà"Ð${ð}ð
ˆó -3Ñ(ˆB˜4Ù—4”4Ü—’ 	Ò*Ø×%Ñ% d¸uÐ%ÔEÚñ	 -3ô
 &Ó'Ð'ˆGÒ4Ø$‰NˆCØ1°#°ð 78ð 8ˆGô �N‰N˜9 d§i¡i°Ô9Ø×!Ñ!Ð"<¸gÐ!Ô[ÙÜ�‰Ð-¨t¯y©y¸+ÔFÙr   Úis_reconnectFc                ó&   <€ V ^8„  d   QhRS[ RS[ /# )r   r  r   rÁ   )r   r=  s   "€r   r   r>  _  s   ø€ ÷ e)ñ e)©Tð e)¹dñ e)r   c             ƒ  ó  "  € \        R4      f/   ^ RIp \        P                  ! VP                  R4      G Rj  x€L
  \        \        V RR4      4      pRpV'       de   ^RI
HpHp  V! V P                  V P                  P                  P!                  R	4      4      V n        V! V P$                  V P"                  4      R
8H  p\        P                  ! V P*                  4      G Rj  x€L
 '       g   R# \-        V P.                  4      pRp	 V P1                  R\        V P$                  4      R4      '       g   R# Rp	 V P;                  VP<                  4      '       g@    V P>                  '       g+   V	'       d   V PA                  4        V PC                  4        R# R# V P$                  PE                  RRR7       V'       d	   V'       d_   V PG                  V4      G Rj  x€L
 '       d@    V P>                  '       g+   V	'       d   V PA                  4        V PC                  4        R# R# V PH                  '       d~   V PH                  pV P                  RRV P"                   RV RV P"                   R2RR7        V P>                  '       g+   V	'       d   V PA                  4        V PC                  4        R# R# V'       d	   V'       d   \K        V P$                  4       V'       gÛ   V PL                  '       d´   \        PN                  ! ^4      G Rj  x€L
   \        \Q        V P"                  4      4      pV'       do   V P                  RRV P"                   RV P"                   R2RR7        V P>                  '       g+   V	'       d   V PA                  4        V PC                  4        R# R# \S        V P"                  4       V'       d	   V'       d   \        PN                  ! ^4      G Rj  x€L
  V P$                  P<                  R,          V n*        \W        V PT                  RRR7      ;V n,        p\        R4      pVf   \[        R4      h\\        P^                  ! V\        V4      R\        V P"                  4      R \        V P$                  4      R!\a        R"R#4      .3R$\\        Pb                  R%VR&VR'V Pe                  4       /\g        4       B V n4        \k        V P$                  V Ph                  Pl                  V P"                  4       V Po                  4       G Rj  x€L
 '       g@    V P>                  '       g+   V	'       d   V PA                  4        V PC                  4        R# R# V Pq                  V Ph                  4       V Ps                  4        \u        R(V P8                   R)V P"                   24       V Pw                  R4        V P>                  '       g+   V	'       d   V PA                  4        V PC                  4        R# R#  ELÇ  TP
                   d)   pT P                  R\        T4      RR7        Rp?R# Rp?ii ; i  \&        \(        3 d#   pT P                  RT R2RR7        Rp?R# Rp?ii ; i EL�  \2         d-   p
\4        P7                  RT P8                  T
4        Rp
?
ELpRp
?
ii ; i ELÖ EL¨  \2         d    Rp EL—i ; i ELç EL¹  \2         dk   p
\4        Py                  R*T P8                  T
RR+7        Rp
?
T P>                  '       g+   T	'       d   T PA                  4        T PC                  4        R# R# Rp
?
ii ; i  T P>                  '       g*   T	'       d   T PA                  4        T PC                  4        i i ; i5i),z@Start (or adopt) the Node.js bridge and wait for it to be ready.r{   Nr  Fr¢  Ú_runtime_status_platform_keyr|   )Úsecondary_bridge_portÚcheck_secondary_ownershiprE  ÚoursÚwhatsapp_bridge_conflictzc. Set platforms.whatsapp.extra.bridge_port to a distinct free port; or stop the process holding it.zwhatsapp-sessionzWhatsApp sessionTz3[%s] Could not acquire session lock (non-fatal): %s)ÚparentsÚexist_okÚwhatsapp_bridge_foreign_sessionzPort zA is already served by a WhatsApp bridge for a different session (zƒ). Give this profile its own port via platforms.whatsapp.extra.bridge_port (one distinct bridge_port per profile); nothing on port z was stopped.Úwhatsapp_bridge_unresponsivez~ is held by a process that did not answer /health in time, so Hermes cannot tell whose WhatsApp bridge it is; nothing on port zl was stopped. Stop that process, or give this profile its own port via platforms.whatsapp.extra.bridge_port.z
bridge.logÚar"   r¥   z7Node.js is no longer available; run `hermes pm install`z--portz	--sessionz--moderÕ  rÖ  r(   r@   rÇ   rû   rš  z] Bridge started on port z[%s] Failed to start bridge: %s)Úexc_info)=r   rü   rq  Ú	to_threadr¥  r¨  r©  r   ry   rÅ   ra  r  r  r]  r<  rY   rX   rb  rd  r�   rM   r  r   rc  Ú_acquire_platform_lockrƒ   r‹   rŒ   r   r±  rË   Ú_runningÚ_release_platform_lockrï  ÚmkdirrÌ  r_  r¸   r`  rö  rt   r“   ru  Úopenrt  r  r=   ÚPopenr!   rŽ   ré  r   r^  r½   rw   r   r¹  rÃ  r¤  rÄ  r/  )r1  r  rü   r  Ú	secondaryÚprior_bridge_is_oursr  r  r¼  Úlock_acquiredr°  ÚforeignÚheldÚbridge_log_fhr{   s   &$             r   ÚconnectÚWhatsAppAdapter.connect_  s�  é € ä Ó'Ò/ÛðÜ×'Ò'¨¯	©	°6Ó:×:Ð:ô œ Ð'EÀrÓJÓKˆ	Ø$ÐßßZðÙ$9¸$×:LÑ:LÈdÏkÉk×N_ÑN_×NcÑNcÐdqÓNrÓ$s�Ô!Ù'@À×ASÑASÐUY×UfÑUfÓ'gÐkqÑ'qÐ$ô ×&Ò& t§¡Ó7×7Ö7ÙÜ˜4×.Ñ.Ó/ˆØˆð	`Ø×.Ñ.Ð/AÄ3Àt×GYÑGYÓCZÐ\n×oÒoÙØ ˆMðD	)Ø×+Ñ+¨K×,>Ñ,>×?Ò?Øð~ —=—=�=ß Ø×/Ñ/Ô1Ø×&Ñ&Ö(ñ !ð} ×Ñ×$Ñ$¨T¸DÐ$ÔA÷ ×!5À×A[ÑA[Ð\gÓAh×;hÖ;hØðt —=—=�=ß Ø×/Ñ/Ô1Ø×&Ñ&Ö(ñ !ðs ×+×+Ð+ð ×6Ñ6�Ø×%Ñ%Ø5Ø˜D×-Ñ-Ð.ð /Ø�yð !OØOS×O`ÑO`ÐNaÐanðpð $ð &ô ð ð\ —=—=�=ß Ø×/Ñ/Ô1Ø×&Ñ&Ö(ñ !÷[ × 4Ü-¨d×.@Ñ.@ÔAßØ×/×/Ð/ô "Ÿ-š-¨Ó*×*Ð*ð$Ü#Ô$7¸×8IÑ8IÓ$JÓK˜÷ Ø×-Ñ-Ø:Ø# D×$5Ñ$5Ð#6ð 7_Ø_c×_pÑ_pÐ^qð rDðDð '+ð .ô ð  %ð2 —=—=�=ß Ø×/Ñ/Ô1Ø×&Ñ&Ö(ñ !ô1 # 4×#4Ñ#4Ô5ß× 4Ü—m’m AÓ&×&Ð&à#×1Ñ1×8Ñ8¸<ÕGˆDÔÜ26°t×7GÑ7GÈÐW^Ô2_Ð_ˆDÔ -Ü'¨Ó/ˆDØŠ|Ü"Ð#\Ó]Ð]Ü#-×#3Ò#3Ø”s˜;Ó'¨´3°t×7HÑ7HÓ3IÈ;ÔX[Ð\`×\nÑ\nÓXoØœ5 °+Ó>ð@ñ$@äGQ×GYÑGYð$@àboð$@ð yFð$@ð LP÷  L\ñ  L\ó  L^ð$@ô b}ó  bñ$@ˆDÔ ô " $×"4Ñ"4°d×6JÑ6J×6NÑ6NÐPT×PaÑPaÔbØ×.Ñ.Ó0×0Ö0Øð —=—=�=ß Ø×/Ñ/Ô1Ø×&Ñ&Ö(ñ !ð ×"Ñ" 4×#7Ñ#7Ô8Ø× Ñ Ô"Ü�A�d—i‘i�[Ð 9¸$×:KÑ:KÐ9LÐMÔNØ×&Ñ& tÔ,Øð
 —=—=�=ß Ø×/Ñ/Ô1Ø×&Ñ&Ö(ñ !òy ;øØ—?‘?ô Ø×%Ñ%Ð&=¼sÀ3»xÐSXÐ%ÔYÝûðûô œZÐ(ô Ø×%Ñ%Ø.Ø�eð 6ð 6ØAFð &ô Hõ ûðúò 8øô ô 	`Ü�N‰NÐPÐRV×R[ÑR[Ð]^×_Ò_ûð	`úò <iò( +øô %ô $Ø#›ð$úò 'ò 1øô ô 	Ü�L‰LÐ:¸D¿I¹IÀqÐSWˆLÔXÛà—=—=�=ß Ø×/Ñ/Ô1Ø×&Ñ&Ö(ñ !ûð		ûð —=—=�=ß Ø×/Ñ/Ô1Ø×&Ñ&Õ(ð !üsö  ‚^
•$X ¹X ºX ¾(^
Á'AX? Ã#^
Ã%Y5Ã&	^
Ã0^
Ä
,Y8 Ä6^
Ä8Y8 Ä;![ Å^
Å7$^
Æ$[ Ç [ Ç[ ÇZ2Ç	[ Ç(^
È$^
È&[ È8>[ É7^
Ê$^
Ê5[ Ê=[ Ë[ Ë"[ Ë4[ ÌZ5Ì[ ÌZ8 Ì1[ Ì9/[ Í)^
Î$^
Î'[ Ï[ Ï[ Ï%[Ï&D0[ Ô[Ô	[ Ô"^
Ô<$^
Õ A![ ×^
×$^
Ø X ØX<ØX7Ø1^
Ø7X<Ø<^
Ø?Y2ÙY-Ù'^
Ù-Y2Ù2^
Ù8Z/Ú!Z*Ú$^
Ú*Z/Ú/^
Ú2[ Ú5[ Ú8[	Û[ Û[	Û	[ Û[ Û]Û#]Ü ]
 Ü^
Ü$^
Ý]Ý]
 Ý
^Ý%"^Þ^
c                ó   <€ V ^8„  d   QhRR/# r´  r  )r   r=  s   "€r   r   r>  Æ  s   ø€ ÷ 'ñ ' 4ñ 'r   c                óÖ   € V P                   '       dD   \        \        4      ;_uu_ 4        V P                   P                  4        R R R 4       R V n         R # R #   + '       g   i     L; irK   )rt  r   rƒ   Úclose©r1  s   &r   rï  Ú!WhatsAppAdapter._close_bridge_logÆ  sD   € Ø××ÐÜœ)×$Õ$Ø×#Ñ#×)Ñ)Ô+÷ %à"&ˆDÖñ ß$×$ús   ªAÁA(	c                ó0   <€ V ^8„  d   QhRS[ S[,          /# rI   ©r   r   )r   r=  s   "€r   r   r>  Ì  s   ø€ ÷ 3ñ 3±(¹3µ-ñ 3r   c              ƒ  ó>  "  € V P                   e   V P                   P                  4       MR pVf   R # \        \        V RR 4      RR4      p\        V RR4      '       g	   V'       d+   VR9   d$   \        P	                  RV P
                  V4       R # RV R2pV P                  '       g^   \        P                  RV P
                  V4       V P                  R	VR
R7       V P                  4        V P                  4       G R j  x€L
  V P                  ;'       g    T#  L5i)NÚgateway_runnerÚ_stop_requested_by_signalFrx  z-[%s] Bridge exited during shutdown (code %d).z2WhatsApp bridge process exited unexpectedly (code z).r  Úwhatsapp_bridge_exitedTr¢  >   r   éñÿÿÿéþÿÿÿ)r^  r÷  rÅ   r‹   rµ   r   Úhas_fatal_errorr/  r©  rï  Ú_notify_fatal_errorÚfatal_error_message)r1  rÆ   Úrunner_stopr  s   &   r   Ú_check_managed_bridge_exitÚ*WhatsAppAdapter._check_managed_bridge_exitÌ  sû   é € Ø48×4HÑ4HÒ4T�T×)Ñ)×.Ñ.Ô0ÐZ^ˆ
ØÒÙô œg dÐ,<¸dÓCÐE`ÐbgÓhˆÜ�DÐ*¨E×2Ò2·kÀzÐUaÔGaÜ�K‰KÐGÈÏÉÐT^Ô_ÙØFÀzÀlÐRTÐUˆØ×#×#Ð#Ü�L‰L˜ D§I¡I¨wÔ7Ø×!Ñ!Ð":¸GÈtÐ!ÔTØ×"Ñ"Ô$Ø×*Ñ*Ó,×,Ð,Ø×'Ñ'×2Ð2¨7Ð2ñ -ùs&   ‚A#DÁ&ADÂ(ADÄ DÄDÄDc                ó$   <€ V ^8„  d   QhRS[ RR/# rÀ   rÁ   )r   r=  s   "€r   r   r>  ã  s   ø€ ÷ Nñ N©$ð N°4ñ Nr   c               ó°   €  \        V P                  VR 7       R#   \        \        3 d*    \	        T P                  T'       d   RMR4      ! 4         R# i ; i)©r¾   r�   rÃ   N)rÍ   r^  ÚProcessLookupErrorÚPermissionErrorrÅ   )r1  r¾   s   &$r   Ú_terminate_bridgeÚ!WhatsAppAdapter._terminate_bridgeã  sE   € ð	NÜ% d×&:Ñ&:À%×HøÜ"¤OÐ4ô 	NÜ�D×(Ñ(·E©&¸{ÔK×Mð	Nús   ‚ ›6AÁAc                ó   <€ V ^8„  d   QhRR/# r´  r  )r   r=  s   "€r   r   r>  é  s   ø€ ÷ -ñ - $ñ -r   c              ƒ  óÀ  "  € RV n         V P                  '       g   \        RV P                   R24       M_ V P	                  RR7       \
        P                  ! ^4      G Rj  x€L
  V P                  P                  4       f   V P	                  RR7       V P                  '       g   \        V RR	4      '       g   \        V P                  R
,          4       \        V P                  4      G Rj  x€L
  V P                  '       d?   V P                  P                  '       g#   V P                  P!                  4       G Rj  x€L
  R;V n        ;V n        V n        V P#                  4        V P%                  4        V P'                  4        \        RV P                   R24       R#  ELA  \         d'   p\        RT P                   RT 24        Rp?EL=Rp?ii ; i Lë L�5i)z=Stop the WhatsApp bridge and clean up any orphaned processes.Trš  z.] Disconnecting (external bridge left running)FrD  Nz] Error stopping bridge: r  r|   r£   z] Disconnected)rx  r^  r¤  r   rG  rq  rö  r÷  rƒ   rÅ   rŸ   rd  rØ   rv  rw  Úclosedr1  r#  Ú_mark_disconnectedrï  )r1  r°  s   & r   Ú
disconnectÚWhatsAppAdapter.disconnecté  s„  é € à"ˆÔØ×#×#Ð#Ü�A�d—i‘i�[Ð NÐOÕPðCØ×&Ñ&¨UÐ&Ô3Ü—m’m AÓ&×&Ð&Ø×'Ñ'×,Ñ,Ó.Ò6Ø×*Ñ*°Ð*Ô6ð ××Ð¤w¨tÐ5SÐUW×'XÒ'XÜ˜D×.Ñ.°Õ=Ô>Ü˜$Ÿ/™/Ó*×*Ð*Ø××Ð d×&8Ñ&8×&?×&?Ð&?Ø×$Ñ$×*Ñ*Ó,×,Ð,ØFJÐJˆŒÐJ˜$Ô,¨tÔ/CØ×#Ñ#Ô%Ø×ÑÔ!Ø×ÑÔ Ü��$—)‘)�˜NÐ+Ö,ò 'øô ô CÜ˜˜$Ÿ)™)˜Ð$=¸a¸SÐA×BÒBûðCúñ 	+á,ùsr   ‚4G·+F& Á"F#Á#2F& ÂGÂ'AGÃ.GÃ/GÄGÄ!GÄ>GÄ?A$GÆ#F& Æ&GÆ1GÇGÇGÇGÇGc                ó0   <€ V ^8„  d   QhRS[ S[,          /# rI   r5  )r   r=  s   "€r   r   r>    s   ø€ ÷ Eñ E©8±C­=ñ Er   c              ƒ  óž   "  € V P                   '       d   V P                  '       g   R # V P                  4       G Rj  x€L
 ;'       g    R#  L5i)zNot connectedN)r"  rw  r@  r2  s   &r   r0  Ú#WhatsAppAdapter._bridge_unavailable  sN   é € Ø&*§m§m m¸4×;M×;MÐ;Mˆð  	EÐZ^×ZyÑZyÓZ{×T{÷  UDð  UDð  @Dð  	EÑT{ùs   ‚$A§A¼A½
AÁAc                óH   <€ V ^8„  d   QhRS[ RS[S[ S[3,          RS[RS[/# )r   rU   Úpayloadr1   r   )r   rÐ  r	   r„  rÔ   )r   r=  s   "€r   r   r>    s3   ø€ ÷ 	;ñ 	;©sð 	;¹TÁ#ÁsÀ(½^ð 	;ÑY^ð 	;Ñcmñ 	;r   c             ƒ  ó  "  €  V P                  RWVR7      ;_uu_4       GRj  x€L
 pVP                  ^È8X  dH   VP                  4       G Rj  x€L
 p\        RVP	                  R4      VR7      uuRRR4      GRj  x€L
  # \        RVP                  4       G Rj  x€L
 R7      uuRRR4      GRj  x€L
  #  L‘ Lj L> L! L  + GRj  x€L 
 '       g   i     R# ; i  \         d!   p\        R\        T4      R7      u Rp?# Rp?ii ; i5i)	uU   POST to the bridge; 200 â†’ SendResult(messageId, raw_response), else the error text.Úpost©r�  NTÚ	messageId)r.  Ú
message_idÚraw_responseFr-  )r‰  r–   r�  rÔ   rX   r%   rƒ   r   )r1  rU   rS  r1   r’  rÆ  r°  s   &&&$   r   Ú_post_bridge_messageÚ$WhatsAppAdapter._post_bridge_message  sÅ   é € ð	;Ø×'Ñ'¨°ÀGÐ'×L×LÔLÐPTØ—;‘; #Ô%Ø!%§¡£×,�DÜ%¨d¸t¿x¹xÈÓ?TÐcgÔh÷ M×LÒLô "¨%¸T¿Y¹Y»[×7HÔI÷	 M×LÔLá,ñ Mñ 8I÷	 M×L×LÓLûô
 ô 	;Ü e´3°q³6Ô:Õ:ûð	;üsÓ   ‚D„ C ¤B6¥C ¨%C ÁB8Á C Á.C Á;B:Á<C Â DÂC ÂB<ÂC Â#C Â0B>Â1C Â5DÂ6C Â8C Â:C Â<C Â>C Ã C	ÃC	Ã
C	ÃC	ÃC ÃDÃC ÃDÃ(DÃ=DÃ>DÄDÄDc                ón   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[S[ S[3,          ,          RS[/# )r   Úchat_idÚcontentÚreply_toÚmetadatar   ©r   r   rÐ  r	   rÔ   )r   r=  s   "€r   r   r>    sL   ø€ ÷ ;ñ ;¡#ð ;±ð ;¹xÉ½}ð ;Ñ_gÑhlÑmpÑruÐmuÕhvÕ_wð ;ñ  DNñ ;r   c           	   ƒ  ó   "  € V'       d   VP                  4       '       g   \        RRR7      # \        V4      p V P                  V P	                  V4      V P                  4       4      p. pRp\        V4       FÃ  w  r‰RVRV	/p
V'       d   V^ 8X  d   W:R&   V P                  RV
^R7      G Rj  x€L
 pVP                  '       g   \        R	VP                  R
7      u # VP                  pV'       d   VP                  \        V4      4       \        V4      ^8”  g   K¥  \        P                  ! R4      G Rj  x€L
  KÅ  	  \        RV\!        VRR 4      RV/R7      #  L® L'  \"         d!   p\        R	\        T4      R
7      u Rp?# Rp?ii ; i5i)zNFormat markdown for WhatsApp, chunk preserving code blocks, send sequentially.TN©r.  rX  ÚchatIdr  ÚreplyToÚsendrŽ  Fr-  g333333Ó?Úmessage_ids)r.  rX  Úcontinuation_message_idsrY  éÿÿÿÿ)rA   rÔ   rÒ   Útruncate_messageÚformat_messageÚ_outgoing_chunk_limitÚ	enumeraterZ  r.  r/  rX  rL   r   rh   rq  rö  r¡   rƒ   )r1  r]  r^  r_  r`  ÚchunksÚsent_message_idsÚlast_message_idÚidxÚchunkrS  rn   r°  s   &&&&&        r   rf  ÚWhatsAppAdapter.send  sa  é € ÷ ˜gŸm™mŸošoÜ d°tÔ<Ð<Ü! 'Ó*ˆð	;Ø×*Ñ*¨4×+>Ñ+>¸wÓ+GÈ×IcÑIcÓIeÓfˆFØ*,ÐØ"ˆOÜ'¨Ö/‘
�Ø+3°W¸iÈÐ*O�ß  q¤Ø)1˜IÑ&Ø#×8Ñ8¸ÀÐRTÐ8ÓU×U�Ø—~—~�~Ü%¨e¸6¿<¹<ÔHÒHØ"(×"3Ñ"3�ß"Ø$×+Ñ+¬C°Ó,@ÔAÜ�v“; –?Ü!Ÿ-š-¨Ó,×,Ò,ñ 0ô  d°ÔafÐgwÐx{Ðy{Ðg|Óa}Ø,9Ð;KÐ+LôNð Nñ Vñ -øô ô 	;Ü e´3°q³6Ô:Õ:ûð	;üs|   ‚F¡FºA3E  Â-EÂ.E  ÃE  ÃFÃE  Ã1'E  ÄE  Ä6EÄ7$E  ÅFÅE  ÅE  Å FÅ+FÆ FÆFÆFÆFÚfinalizec          
      ó8   <€ V ^8„  d   QhRS[ RS[ RS[ RS[RS[/# )r   r]  rX  r^  rt  r   )r   ry   rÔ   )r   r=  s   "€r   r   r>  +  s2   ø€ ÷ ;ñ ;©#ð ;¹3ð ;Éð ;Ñ[_ð ;Ñlvñ ;r   c             ƒ  ó¾  "  €  V P                  R R^R\        V4      RVRV/R7      ;_uu_4       GRj  x€L
 pVP                  ^È8X  d   \        RVR7      M"\        R	VP	                  4       G Rj  x€L
 R
7      uuRRR4      GRj  x€L
  #  LW L L	  + GRj  x€L 
 '       g   i     R# ; i  \
         d!   p\        R	\        T4      R
7      u Rp?# Rp?ii ; i5i)rU  Úeditrd  rW  r  rV  NTrc  Fr-  )r‰  rÒ   r–   rÔ   r%   rƒ   r   )r1  r]  rX  r^  rt  r’  r°  s   &&&&$  r   Úedit_messageÚWhatsAppAdapter.edit_message*  sñ   é € ð	;Ø×'Ñ'¨°¸À(ÌOÐ\cÓLdÐfqÐs}ð  @Ið  KRð  BSÐ'÷  T÷  Tô  Tð  X\ØJNÏ+É+ÐY\ÔJ\”z¨$¸:ÕFÔblÐuzð  IM÷  IRñ  IRó  IT÷  CTô  cU÷ T÷  Tô  Tñ CT÷ T÷  T÷  Tó  Tûäô 	;Ü e´3°q³6Ô:Õ:ûð	;üs�   ‚C„0B/ ´BµB/ ¸8BÁ0BÁ1BÁ9B/ ÂBÂB/ ÂCÂB/ ÂBÂB/ ÂB,	ÂBÂ
B,	Â$B,	Â&B/ Â*CÂ,B/ Â/CÂ:CÃCÃCÃCÃCc                ó^   <€ V ^8„  d   QhRS[ RS[ RS[ RS[S[ ,          RS[S[ ,          RS[/# )r   r]  Ú	file_pathÚ
media_typeÚcaptionÚ	file_namer   ©r   r   rÔ   )r   r=  s   "€r   r   r>  3  sW   ø€ ÷ ñ ±3ð Á3ð ÑTWð ÑbjÑknÕboð ñ  DLñ  MPõ  DQð ñ  ]gñ r   c              ƒ  ó²  "  € \         P                  P                  V4      '       g   \        R RV 2R7      # \	        V4      pRVRVRV/pTP                  RV3RV33 UU	u/ uF  w  r‰V	'       g   K  W‰bK  	  up	p4       V P                  RV^xR	7      G R
j  x€L
 p
V
P                  '       dž   V
P                  '       dŒ   ^ RI	H
p \        P                  ! V4      ^ ,          ;'       g1    \        P                  \        P                  V4      R4      ^,          pTP!                  YjP                  Y,;'       g    R3.4      G R
j  x€L
  V
# u up	pi  L» L5i)FzFile not found: r-  rd  ÚfilePathÚ	mediaTyper}  ÚfileNameú
send-mediarŽ  N©Úrich_sent_storer*  )r|   r|   )rT   rU   r¨   rÔ   rÒ   rÞ  rZ  r.  rX  r—   r†  Ú	mimetypesÚ
guess_typeÚ_MEDIA_INFOrX   Ú_MEDIA_TYPE_BY_BRIDGE_KINDÚrecord_media_async)r1  r]  r{  r|  r}  r~  ÚjidrS  rà  Úvrn   r†  Úmimes   &&&&&&       r   Ú_send_media_to_bridgeÚ%WhatsAppAdapter._send_media_to_bridge2  s;  é € ä�w‰w�~‰~˜i×(Ò(Ü eÐ5EÀiÀ[Ð3QÔRÐRÜ˜gÓ&ˆØ#+¨S°*¸iÈÐV`Ð"aˆØ�‰¨9°gÐ*>ÀÈYÐ@WÑ)XÔ^Ñ)X¡ Ô\]œ˜šÑ)XÒ^Ô_Ø×0Ñ0°¸wÐPSÐ0ÓT×TˆØ�>�>ˆ>˜f×/×/Ð/õ 0Ü×'Ò'¨	Ó2°1Õ5÷  Bð  B¼¿¹ÔIc×IgÑIgÐhrÓIsÐu}Ó9~ð  @Aõ  :BˆDØ!×4Ñ4°S×:KÑ:KÈy×Z|ÐZ|Ðb|ÐN}ÐM~Ó×ÐØˆùó _ÙTñ @ùsO   ‚AEÁ!E
Á2E
Á8EÂEÂEÂ.EÃ )EÃ*AEÄ:EÅEÅEÅEÚselectable_countc          
      óH   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[RS[/# )r   r]  ÚquestionÚoptionsr‘  r   )r   r.   r-   rÔ   )r   r=  s   "€r   r   r>  C  s=   ø€ ÷ Qñ Q¡sð Q±cð QÁDÉÅIð QÑdgð QÑpzñ Qr   c          	   ƒ  ó’   "  € R\        V4      RTR\        T;'       g    . 4      RV/pV P                  RV^R7      G Rj  x€L
 #  L5i)zVNative WhatsApp poll (low-level transport primitive; approval UX stays gateway-owned).rd  r“  r”  ÚselectableCountz	send-pollrŽ  N)rÒ   r.   rZ  )r1  r]  r“  r”  r‘  rS  s   &&&&$ r   Ú	send_pollÚWhatsAppAdapter.send_pollB  s_   é € ð $,¬_¸WÓ-EÀzÐS[Ð]fÔhlÐmt×mzÐmzÐxzÓh{ð  ~Oð  Qað  #bˆØ×.Ñ.¨{¸GÈRÐ.ÓP×PÐPÑPùó   ‚>AÁ AÁAc                óz   <€ V ^8„  d   QhRS[ RS[ RS[S[,          RS[ RS[ RS[S[S[ S[3,          ,          RS[/# )r   r]  r“  ÚchoicesÚ
clarify_idÚsession_keyr`  r   )r   r   r.   rÐ  r	   rÔ   )r   r=  s   "€r   r   r>  H  s]   ø€ ÷ 	bñ 	b©#ð 	b¹ð 	bÁxÑPTÅ~ð 	bÑcfð 	bÑuxð 	bÙ%-©d±3¹°8­nÕ%=ð	bÙISñ	br   c           	   ƒ  ó(  <"  € T;'       g    .  Uu. uF=  p\        V4      P                  4       '       g   K$  \        V4      P                  4       NK?  	  pp^\        V4      u;8:  d   ^8:  d�   M M}T P                  T\        T;'       g    R4      P                  4       V^R7      G Rj  x€L
 p	V	P                  '       d   V	# \
        P                  RV P                  V	P                  4       \        S
V `)  WW4WVR7      G Rj  x€L
 # u upi  Lb L5i)zwMultiple-choice clarify as a native poll (the pick arrives as message text for the normal intercept); else text prompt.r|   )r‘  NzB[%s] Native WhatsApp clarify poll failed; falling back to text: %s)r]  r“  r›  rœ  r�  r`  )r   rA   rh   r—  r.  r‹   rŒ   r   r/  rW  Úsend_clarify)r1  r]  r“  r›  rœ  r�  r`  ÚchoiceÚclean_choicesrn   r|  s   &&&&&&&   €r   rŸ  ÚWhatsAppAdapter.send_clarifyH  së   øé € ð =D¿M¸MÀr¸MÓb¹M°ÌcÐRXËk×N_ÑN_×NaÔ,œ˜V›×*Ñ*Ö,¹MˆÐbØ”�MÓ"Ö( b×(ØŸ>™>¨'´3°x·~°~À2Ó3F×3LÑ3LÓ3NÐP]Ðpq˜>Ór×rˆFØ�~�~ˆ~Ø�Ü�N‰NÐ_Ðae×ajÑajÐlr×lxÑlxÔyÜ‘WÑ)°'ÐV]ð  CNÐ)ó  b÷  bð  	bùò cárñ bùs@   ƒD’!D	¸D	Á6DÂDÂ+DÂ,DÃADÄDÄ
DÄDr   Úaddressr_  r`  c                ó    <€ V ^8„  d   QhRS[ RS[RS[RS[S[ ,          RS[S[ ,          RS[S[ ,          RS[S[S[ S[3,          ,          RS[/# )	r   r]  ÚlatitudeÚ	longituder   r£  r_  r`  r   )r   r„  r   rÐ  r	   rÔ   )r   r=  s   "€r   r   r>  T  s€   ø€ ÷ Uñ U©3ð U¹%ð UÉEð UÑ\dÑehÕ\ið Uñ  |Dñ  EHõ  |Ið UÙ&.©s¥mðUÙFNÉtÑTWÑY\ÐT\Í~ÕF^ðUÙjtñUr   c             ƒ  ó`  "  €  R \        V4      R\        V4      R\        V4      /pTP                  RT3RT33 U
Uu/ uF  w  r«T'       g   K  Y«bK  	  upp
4       T P                  RT^R	7      G Rj  x€L
 #   \         d!   p	\        R\	        T	4      R7      u Rp	?	# Rp	?	ii ; iu upp
i  L85i)
rd  r¥  r¦  Fr-  Nr   r£  zsend-locationrŽ  )rÒ   r„  rƒ   rÔ   r   rÞ  rZ  )r1  r]  r¥  r¦  r   r£  r_  r`  rS  r°  rà  r�  s   &&&&$$$$    r   Úsend_locationÚWhatsAppAdapter.send_locationS  sµ   é € ð	;Ø'/´ÀÓ1IÈ:ÔW\Ð]eÓWfÐhsÔuzð  |Eó  vFð  'GˆGð 	�‰¨6°4¨.¸9ÀgÐ:NÑ)OÔUÑ)O¡ ÔSTœ˜šÑ)OÒUÔVØ×.Ñ.¨ÀÐQSÐ.ÓT×TÐTøô ô 	;Ü e´3°q³6Ô:Õ:ûð	;üãUÙTùsP   ‚B.„#A8 §B.½B&
ÁB&
ÁB.Á3B,Á4B.Á8B#ÂBÂB#ÂB.ÂB#Â#
B.c                ó„   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[ ,          RS[S[S[ S[3,          ,          RS[/# )r   r]  Ú	image_urlr}  r_  r`  r   ra  )r   r=  s   "€r   r   r>  ]  sY   ø€ ÷ ]ñ ]©ð ]¹ð ]ÁhÉsÅmð ]ÑfnÑorÕfsð ]Ù#+©D±±c°­NÕ#;ð]ÙGQñ]r   c              ƒ  óÈ   <"  €  \        V4      G Rj  x€L
 pV P                  WRV4      G Rj  x€L
 #  L L  \         d    \        ST `  YY4T4      G Rj  x€L 
 u # i ; i5i)z^Download image URL to cache, send natively via bridge (``metadata`` honors the base contract).Nr!  )rÖ   r�  rƒ   rW  Ú
send_image)r1  r]  r«  r}  r_  r`  Ú
local_pathr|  s   &&&&&& €r   r­  ÚWhatsAppAdapter.send_image]  se   øé € ð	]Ü3°IÓ>×>ˆJØ×3Ñ3°GÈÐRYÓZ×ZÐZñ ?ÙZøÜô 	]Ü™Ñ+¨GÀÐS[Ó\×\Ð\Ò\ð	]üsI   ƒA"…7 “3”7 ®5¯7 ²A"³7 µ7 ·AÁAÁAÁA"ÁAÁA"c          
      óX   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[ ,          RS[/# )r   r]  Ú
image_pathr}  r_  r   r  )r   r=  s   "€r   r   r>  f  sH   ø€ ÷ Wñ W©Sð W¹cð WÉHÑUXÍMð WÑltÑuxÕlyð Wñ  PZñ Wr   c              ‹  óD   "  € V P                  WR V4      G Rj  x€L
 #  L5i)r!  N©r�  )r1  r]  r±  r}  r_  r3  s   &&&&&,r   Úsend_image_fileÚWhatsAppAdapter.send_image_filef  ó    é € Ø×/Ñ/°ÀWÈgÓV×VÐVÑVùó   ‚ ™š c          
      óX   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[ ,          RS[/# )r   r]  Ú
video_pathr}  r_  r   r  )r   r=  s   "€r   r   r>  i  óH   ø€ ÷ Wñ W©ð W¹ð WÁxÑPSÅ}ð WÑgoÑpsÕgtð Wñ  KUñ Wr   c              ‹  óD   "  € V P                  WR V4      G Rj  x€L
 #  L5i)r"  Nr³  )r1  r]  r¹  r}  r_  r3  s   &&&&&,r   Ú
send_videoÚWhatsAppAdapter.send_videoi  r¶  r·  c          
      óX   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[ ,          RS[/# )r   r]  Ú
audio_pathr}  r_  r   r  )r   r=  s   "€r   r   r>  l  rº  r   c              ‹  óD   "  € V P                  WR V4      G Rj  x€L
 #  L5i)r$  Nr³  )r1  r]  r¿  r}  r_  r3  s   &&&&&,r   Ú
send_voiceÚWhatsAppAdapter.send_voicel  r¶  r·  c                ón   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[ ,          RS[S[ ,          RS[/# )r   r]  r{  r}  r~  r_  r   r  )r   r=  s   "€r   r   r>  o  sQ   ø€ ÷ Cñ C©3ð C¹3ð CÉÑRUÍð CÑjrÑsvÕjwð CÙ&.©s¥mðCÙISñCr   c           	   ‹  ó’   "  € T P                  YR Y4;'       g     \        P                  P                  V4      4      G Rj  x€L
 #  L5i)r(  N)r�  rT   rU   Úbasename)r1  r]  r{  r}  r~  r_  r3  s   &&&&&&,r   Úsend_documentÚWhatsAppAdapter.send_documento  sX   é € à×/Ñ/°ÀJÐPW÷  ZBð  ZBÔfh×fmÑfm×fvÑfvð  xAó  gBó  C÷  Cð  	Cñ  Cùr™  c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   r]  r   Nr   )r   r=  s   "€r   r   r>  s  s   ø€ ÷ ñ ©ð Àñ r   c           
   ƒ  óÖ  "  € V P                  4       G R j  x€L
 '       d   R # \        \        4      ;_uu_ 4        ^ R IpV P                  P                  V P                  R4      R\        V4      /VP                  ^R7      R7      ;_uu_4       GR j  x€L
   R R R 4      GR j  x€L
  R R R 4       R #  Lœ L! L  + GR j  x€L 
 '       g   i     L); i  + '       g   i     R # ; i5i)NÚtypingrd  r†  ©r�  r1   )	r0  r   rƒ   r  rw  rU  r�  rÒ   rˆ  )r1  r]  r`  r  s   &&& r   Úsend_typingÚWhatsAppAdapter.send_typings  sÒ   é € Ø×)Ñ)Ó+×+Ö+ÙÜ”i× Õ Ûà×)Ñ)×.Ñ.¨t×/?Ñ/?ÀÓ/IÐQYÔ[jÐkrÓ[sÐPtð  F÷  Tñ  Tð  [\ð  Tó  ]Ð.÷  ^÷  ^õ  ^Ø÷ ^÷  ^÷ !Ñ ñ ,÷
 ^÷  ^÷  ^ô  ^ú÷ !× Ð üsz   ‚C)–B3—	C)¡C)ºACÂB5ÂCÂB9	ÂCÂ$B7Â%CÂ)C)Â5CÂ7CÂ9CÂ?CÃ 
CÃCÃCÃC&	Ã 	C)c                ó<   <€ V ^8„  d   QhRS[ RS[S[ S[3,          /# )r   r]  r   )r   rÐ  r	   )r   r=  s   "€r   r   r>  |  s#   ø€ ÷ /ñ /©3ð /±4¹¹S¸µ>ñ /r   c              ƒ  óÈ  "  € V P                   '       d   V P                  '       g   R RRR/# V P                  4       G Rj  x€L
 '       g¾    V P                  RR\	        V4       2^
4      ;_uu_4       GRj  x€L
 pVP
                  ^È8X  dl   VP                  4       G Rj  x€L
 pR VP                  R V4      RVP                  R4      '       d   RMRR	VP                  R	. 4      /uuRRR4      GRj  x€L
  # RRR4      GRj  x€L
  R VRR/#  LÍ L˜ Lq L! L  + GRj  x€L 
 '       g   i     L); i  \         d!   p\        P                  R
Y4        Rp?LRRp?ii ; i5i)r   ÚUnknownr  ÚdmNrX   zchat/ÚisGroupr5   Úparticipantsz+Could not get WhatsApp chat info for %s: %s)r"  rw  r@  r‰  rÒ   r–   r�  rX   rƒ   r‹   Údebug)r1  r]  r’  rÆ  r°  s   &&   r   Úget_chat_infoÚWhatsAppAdapter.get_chat_info|  sE  é € Ø�}�}ˆ} D×$6×$6Ð$6Ø˜I v¨tÐ4Ð4Ø×4Ñ4Ó6×6Ö6ðXØ×+Ñ+¨E°U¼?È7Ó;SÐ:TÐ3UÐWY×Z×ZÔZÐ^bØ—{‘{ cÔ)Ø%)§Y¡Y£[×0˜Ø &¨¯©°¸Ó(AÀ6ÐVZ×V^ÑV^Ð_h×ViÒViÉ7Ðosð  vDð  FJ÷  FNñ  FNð  O]ð  _aó  Fbð   c÷ [×Z×Z×ZÒZð ˜ ¨Ð.Ð.ñ 7áZá0÷ [×Z×ZÔZûô ô XÜ—‘ÐJÈG×WÑWûðXüsÐ   ‚$E"§E"Á DÁ	E"Á+D4 Á7DÁ8D4 Á;%DÂ DÂ!-DÃDÃ%D4 Ã2DÃ3D4 Ã7E"Ã8D4 ÄDÄD4 ÄE"ÄD4 ÄDÄD4 ÄD4 ÄD1	ÄD!Ä
D1	Ä*D1	Ä,D4 Ä0E"Ä1D4 Ä4EÄ?EÅE"ÅEÅE"c                ó    <€ V ^8„  d   QhRS[ /# rI   rÁ   )r   r=  s   "€r   r   r>  ‰  s   ø€ ÷ !ñ !©4ñ !r   c              ƒ  óš   "  € V P                  4       G R j  x€L
 pV'       d   \        RV P                   RV 24       \        V4      #  L25i)Nrš  rî  )r@  r¤  r   ry   )r1  Úbridge_exits   & r   Ú_report_bridge_exitÚ#WhatsAppAdapter._report_bridge_exit‰  sB   é € Ø ×;Ñ;Ó=×=ˆßÜ�A�d—i‘i�[  ; -Ð0Ô1Ü�KÓ Ð ñ >ùs   ‚A–A	—A£'Ac                ó   <€ V ^8„  d   QhRR/# r´  r  )r   r=  s   "€r   r   r>  �  s   ø€ ÷ #ñ # dñ #r   c              ƒ  ó<  "  € V P                   '       EdL   V P                  '       d   V P                  4       G R j  x€L
 '       d   R #  V P                  RR^4      ;_uu_4       GR j  x€L
 pVP                  ^È8X  d³   VP                  4       G R j  x€L
  F–  pV P                  V4      G R j  x€L
 pV'       g   K&  \        P                  ! V P                  V4      4       VP                  \        P                  8X  d   V P                  V4       K}  V P                  V4      G R j  x€L
  K˜  	  R R R 4      GR j  x€L
  \        P&                  ! ^4      G R j  x€L
  EK^  R #  EL( Lý LÖ L¼ LD L2  + GR j  x€L 
 '       g   i     LI; i  \        P                   d     R # \          dj   pT P                  4       G R j  x€L 
 '       d    R p?R # \#        RT P$                   RT 24       \        P&                  ! ^4      G R j  x€L 
   R p?LÒR p?ii ; i LÀ5i)NrX   Úmessagesrš  z] Poll error: )r"  rw  rÚ  r‰  r–   r�  Ú_build_message_eventrq  r¶  Ú_send_read_receiptÚmessage_typerÚ   ÚTEXTÚ_enqueue_text_eventÚhandle_messageÚCancelledErrorrƒ   r¤  r   rö  )r1  r’  Úmsg_dataÚeventr°  s   &    r   r·  ÚWhatsAppAdapter._poll_messages�  s„  é € Ø�m�m‰mØ×%×%Ð%¨t×/GÑ/GÓ/I×)IÖ)IÙð'Ø×+Ñ+¨E°:¸r×B×BÔBÀdØ—{‘{ cÔ)Ø.2¯i©i«k×(9Ò(9˜HØ*.×*CÑ*CÀHÓ*M×$M˜Eß$™uä '× 3Ò 3°D×4KÑ4KÈHÓ4UÔ VØ#(×#5Ñ#5¼×9IÑ9IÔ#IØ$(×$<Ñ$<¸UÖ$Cà*.×*=Ñ*=¸eÓ*D×$DÒ$Dñ ):÷ C×Bô$ —-’- Ó"×"Ó"ñ- Ú)Iñ Cá(9Ù$Mñ %E÷ C×B×BÒBûô ×)Ñ)ô ÚÜô 'Ø×1Ñ1Ó3×3×3ÝÜ˜˜$Ÿ)™)˜ N°1°#Ð6Ô7Ü—m’m AÓ&×&Ö&ûð	'úñ
 #ùs"  ‚H–H¨H»E#¼	HÁHÁ	F Á(E&Á)F Á,%E0ÂE(ÂE0Â-E*
Â.	E0Â<A+E0Ä'E,
Ä(E0Ä0F Ä;E.Ä<F Å HÅHÅ
HÅ&F Å(E0Å*E0Å,E0Å.F Å0F		Å6E9Å7
F		ÆF		ÆF ÆHÆ	F ÆHÆ!HÆ$HÆ-HÆ.HÇGÇ
HÇHÇ4HÈH
ÈHÈHÈHÈHc                ó:   <€ V ^8„  d   QhRS[ S[S[3,          RR/# )r   rÆ  r   N)rÐ  r   r	   )r   r=  s   "€r   r   r>  ¨  s'   ø€ ÷ 	Tñ 	T©T±#±s°(­^ð 	TÀñ 	Tr   c              ƒ  óH  "  € VP                  R 4      pV P                  '       d)   V P                  '       d   \        V\        4      '       g   R#  V P                  RR^RV/R7      ;_uu_4       GRj  x€L
 pVP                  ^È8w  d,   \        P                  RV P                  VP                  4       RRR4      GRj  x€L
  R#  LR L  + GRj  x€L 
 '       g   i     R# ; i  \         d-   p\        P                  RT P                  T4        Rp?R# Rp?ii ; i5i)ÚreadReceiptKeyNrU  ÚreadÚkeyrV  z.[%s] WhatsApp read receipt failed with HTTP %sz%[%s] WhatsApp read receipt failed: %s)rX   rn  rw  r  rÐ  r‰  r–   r‹   rŒ   r   rƒ   )r1  rÆ  rí  r’  r  s   &&   r   rà  Ú"WhatsAppAdapter._send_read_receipt¨  sÑ   é € Ø�h‰hÐ'Ó(ˆØ×'×'Ð'¨t×/A×/AÐ/AÌÐTWÔY]×I^ÒI^Ùð	TØ×'Ñ'¨°¸ÀÈÀÐ'×M×MÔMÐQUØ—;‘; #Ô%Ü—N‘NÐ#SÐUY×U^ÑU^Ð`d×`kÑ`kÔl÷ N×M×M×M×M×Mûô ô 	TÜ�N‰NÐBÀDÇIÁIÈs×SÒSûð	TüsŽ   ‚5D"¸D"Á#C( Á4CÁ5C( Á8=CÂ5C( Ã C	ÃC( ÃD"ÃC( Ã	C( ÃC%	ÃCÃ
C%	ÃC%	ÃC( Ã#D"Ã%C( Ã(DÃ3!DÄD"ÄDÄD"ip  c                ó<   <€ V ^8„  d   QhRS[ S[S[3,          RS[/# ©r   rÆ  r   )rÐ  r   r	   rÚ   )r   r=  s   "€r   r   r>  ¶  s'   ø€ ÷ mñ m¡t©C±¨H¥~ð m¹+ñ mr   c                ó  a€ \        V P                  R R4      ;'       g    R4      oS\        9   d   \        S,          # V P                  R4      '       g   \        P                  # \        V3R l\         4       \        P                  4      # )r‚  r|   ÚhasMediac              3   ó>   <"  € T F  w  rVS9   g   K  Vx € K  	  R # 5irK   r  )r6   ÚneedleÚkindr|  s   &  €r   r8   Ú;WhatsAppAdapter._classify_bridge_message.<locals>.<genexpr>¼  s   øé € ÐU©n™l˜fÀÈ*Ñ@T—T’T«nùs   ƒ“
)r   rX   Ú_NATIVE_MEDIA_TYPESrÚ   râ  ÚnextÚ_MEDIA_NEEDLESÚDOCUMENT)rÆ  r|  s   &@r   Ú_classify_bridge_messageÚ(WhatsAppAdapter._classify_bridge_messageµ  si   ø€ ä˜Ÿ™ +¨rÓ2×8Ð8°bÓ9ˆ
ØÔ,Ô,Ü& zÕ2Ð2Ø�x‰x˜
×#Ò#Ü×#Ñ#Ð#ÜÔU­nÓUÔWb×WkÑWkÓlÐlr   c                óX   <€ V ^8„  d   QhRS[ S[S[3,          RS[RS[S[S[3,          /# )r   rÆ  Úmsg_typer   )rÐ  r   r	   rÚ   r¡   r.   )r   r=  s   "€r   r   r>  ¾  s<   ø€ ÷ Bñ B±±S¹#°Xµð BÉ+ð BÑZ_Ñ`dÑfjÐ`jÕZkñ Br   c           
   ƒ  ó.  "  € . p\         P                  VR4      w  rE\        VP                  R4      ;'       g    R4      P                  4       pVP                  R. 4       EF»  pT;'       gP    V\        P
                  8X  d9   \        P                  ! \        V4      P                  P                  4       R4      MTpVP                  R4      '       d£   V\        P                  \        P                  \        P                  09   do   V\        P                  8X  d	   \        R3M\        R3w  rš V	! WzR7      G Rj  x€L
 p\!        R	V P"                   R
V RV 2RR7       VP'                  Wx34       EK  Ve�   \(        P*                  P-                  V4      '       dj   \/        V4      '       d6   VP'                  Wx34       \!        R	V P"                   RV RV 2RR7       EK…  \!        R	V P"                   RV RV 2RR7       EK¨  VP'                  VR34       EK¾  	  V UUu. uF  w  rÍVNK	  	  uppV UUu. uF  w  rÞVNK	  	  upp3#  EL  \$         d,   p\!        R	T P"                   RT RT 2RR7        Rp?ELRp?ii ; iu uppi u uppi 5i)u|   ``mediaUrls`` â†’ ``(cached_urls, media_types)``: remote image/audio cached locally; absolute paths only inside a cache dir.Nr|   rŽ  Ú	mediaUrlsr*  ú.jpgú.ogg)Úextrš  z] Cached user z: T©Úflushz] Failed to cache z] Using bridge-cached z] Rejected bridge z path outside cache dir: r¾  )Nr|   )zhttp://zhttps://)r‰  rX   r   rA   rÚ   rú  rÕ   r   Úsuffixr€   Ú
startswithÚPHOTOÚVOICEÚAUDIOrÖ   r×   r¤  r   rƒ   rL   rT   rU   Úisabsrí   )r1  rÆ  rþ  ÚacceptedÚlabelÚdefault_mimeÚbridge_mimeræ   rŽ  Úcacherr  r°  Úur¶   r7   s   &&&            r   Ú_collect_bridge_mediaÚ%WhatsAppAdapter._collect_bridge_media¾  s`  é € à "ˆÜ)Ÿo™o¨h¸
ÓCÑˆÜ˜$Ÿ(™( 6Ó*×0Ð0¨bÓ1×7Ñ7Ó9ˆØ—8‘8˜K¨×,ˆCØ÷  mð  mð  zBô  FQ÷  FZñ  FZô  zZÔ#;×#?Ò#?ÄÀSÃ	×@PÑ@P×@VÑ@VÓ@XÐZtÔ#uð  `lˆDØ�~‰~Ð5×6Ò6¸8Ì×HYÑHYÔ[f×[lÑ[lÔny×nÑnð  HAô  <AØ@HÌK×L]ÑL]Ô@]Ô3°VÑ<Ôdxð  {Að  dB‘�ðUÙ & sÔ 4×4�CÜ˜A˜dŸi™i˜[¨°u°g¸RÀ¸uÐEÈTÕRð —‘  ×,ØÒ"¤r§w¡w§}¡}°S×'9Ò'9Ü*¨3×/Ò/Ø—O‘O S KÔ0Ü˜A˜dŸi™i˜[Ð(>¸u¸gÀRÈÀuÐMÐUY×ZÐZä˜A˜dŸi™i˜[Ð(:¸5¸'ÐAZÐ[^ÐZ_Ð`Ðhl×mÐmà—‘  iÐ 0×1ñ# -ñ$ 'Ô'™h‘d�a“™hÒ'¹Ô)A¹±°«!¹Ò)AÐAÐAò 5øä ô UÜ˜A˜dŸi™i˜[Ð(:¸5¸'ÀÀAÀ3ÐGÈt×TÓTûðUüó (ùÓ)Aùsh   ‚A+JÁ.CJÄ1IÄ=IÄ>$IÅ"=JÆ BJÈ&J	È3JÈ;JÉJÉIÉJÉ JÉ;JÊJÊJc          	      óR   <€ V ^8„  d   QhRS[ RS[RS[S[S[ S[,          3,          /# )r   Úcached_urlsÚbodyr   )r.   r   r¡   ry   )r   r=  s   "€r   r   r>  ×  s2   ø€ ÷ ñ ±ð ¹Sð ÁUÉ3ÑPTÑUYÕPZÈ?ÕE[ñ r   c                óà  € R.\        V4      ,          p\        V4       EF  w  rE\        V4      pVP                  P	                  4       \
        9  d   K6   VP                  4       P                  pV\        8”  d+   \        RV P                   RV RV R\         R2	RR7       K†  VP                  R	R
R7      pVP                  P                  R^4      p	R\        V	4      ^8¼  d
   V	^,          MVP                   RV 2p
V'       d   V
 RV 2MT
pRW4&   \        RV P                   RV 2RR7       EK  	  W#3#   \         d*   p\        RT P                   RT 2RR7        Rp?EKI  Rp?ii ; i)u´   Prepend text-readable document contents (â‰¤100KB) so the agent reads them inline; returns
``(body, media_text_inlined)`` with one flag per ``cached_urls`` entry (True = injected).Frš  z] Skipping text injection for rŸ  z	 bytes > r   Tr  r¤   r#   )r&   r'   r¶   z[Content of z]:
z

z] Injected text content from: z ] Failed to read document text: N)rh   rm  r   r  r€   Ú_TEXT_INJECT_EXTSÚstatÚst_sizeÚ_MAX_TEXT_INJECT_BYTESr¤  r   r©   ra   rƒ   )r1  r  r  ÚinlinedÚiÚdoc_pathrj   Ú	file_sizer^  ÚpartsÚ	injectionr°  s   &&&         r   Ú_inject_document_textÚ%WhatsAppAdapter._inject_document_text×  sn  € ð �'œC Ó,Õ,ˆÜ$ [×1‰KˆAÜ�X“ˆAØ�x‰x�~‰~ÓÔ'8Ô8ÙðVØŸF™F›H×,Ñ,�	ØÔ5Ô5Ü˜A˜dŸi™i˜[Ð(FÀxÀjÐPRÐS\ÐR]Ð]fÔg}Ðf~Ð~ð  Að  IMõ  NÙØŸ+™+¨{À9˜+ÓM�ØŸ™Ÿ™ S¨!Ó,�Ø*´s¸5³zÀQ´¨5°®8ÈAÏFÉFÐ*SÐSWÐX_ÐW`Ða�	ß37˜)˜ D¨¨Ñ/¸Y�Ø!�‘
Ü˜˜$Ÿ)™)˜Ð$BÀ8À*ÐMÐUY×ZÐZñ 2ð" ˆ}Ðøô ô VÜ˜˜$Ÿ)™)˜Ð$DÀQÀCÐHÐPT×UÔUûðVús&   ÁAD9Â%A!D9Ä*D9Ä9E-ÅE(Å(E-c          	      óh   <€ V ^8„  d   QhRS[ S[S[3,          RS[RS[S[S[S[3,          ,          /# )r   rÆ  Úraw_reply_idr   )rÐ  r   r	   r.   r¡   )r   r=  s   "€r   r   r>  î  s:   ø€ ÷ ñ ¡$¡s©C x¥.ð Áð ÉÉUÑSVÑX[ÐS[Í_ÕH]ñ r   c                ó   € \        VP                  R4      ;'       g    R4      P                  4       p. pVP                  R4      ;'       g    .  F•  p\        V\         4      '       d7   \        P
                  P                  V4      '       d   \        V4      '       g    \        RV P                   RV 2RR7       Kn  VP                  V\        P                  VR4      34       K—  	  V'       g6   Ve2   ^ R	IHp VP                  VP                  R
R4      \        V4      4      pV F"  w  rW\        RV P                   RV 2RR7       K$  	  V# )uø  ``(path, mime)`` for the quoted message's attachment, folded into this event's own media so the
vision/audio pipeline sees it like a direct send. ``contextInfo.quotedMessage`` carries only a
thumbnail stub, so the bridge resolves INBOUND quotes from its download cache (``quotedMediaUrls``,
guarded like direct media: a rogue bridge could hand back /etc/passwd); quotes of OUR media (cron
chart, generated image â€” any path we chose) resolve from the outbound index written by
``_send_media_to_bridge``.ÚquotedMediaTyper|   ÚquotedMediaUrlsrš  z0] Rejected quoted-media path outside cache dir: Tr  r*  r…  rd  z] Attached quoted-reply media: )r   rX   rA   r  rT   rU   r  rí   r¤  r   rL   Ú_QUOTED_MIME_BY_BRIDGE_KINDr—   r†  Úlookup_media)r1  rÆ  r%  Úquoted_typer  rU   r†  r¶   s   &&&     r   Ú_quoted_mediaÚWhatsAppAdapter._quoted_mediaî  s  € ô ˜$Ÿ(™(Ð#4Ó5×;Ð;¸Ó<×BÑBÓDˆØ*,ˆØ—H‘HÐ.Ó/×5Ð5°2Ò5ˆDÜ˜t¤S×)Ò)¬b¯g©g¯m©m¸D×.AÒ.AÔF]Ð^b×FcÒFcÜ˜˜$Ÿ)™)˜Ð$TÐUYÐTZÐ[ÐcgÕhÙØ�O‰O˜TÔ#>×#BÑ#BÀ;ÐPjÓ#kÐlÖmñ	 6÷
 ˜LÒ4Ý/Ø&×3Ñ3°D·H±H¸XÀrÓ4JÌCÐP\ÓL]Ó^ˆHÛ‰GˆDÜ�A�d—i‘i�[Ð ?À¸vÐFÈd×Sñ  àˆr   c                óL   <€ V ^8„  d   QhRS[ S[S[3,          RS[S[,          /# rð  )rÐ  r   r	   r   rÙ   )r   r=  s   "€r   r   r>    s(   ø€ ÷ .ñ .©t±C¹°H­~ð .Á(É<ÕBXñ .r   c              ƒ  ó`  "  €  V P                  V4      '       g   R# V P                  V4      pT P                  VP                  RR4      VP                  R4      VP                  RR4      '       d   RMRVP                  R	4      VP                  R
4      VP                  R4      R7      pV P	                  W4      G Rj  x€L
 w  rEVP                  RR4      pVP                  R4      '       d   V P                  Wa4      pV\        P                  8X  d7   V'       d/   \        V4      P                  4       P                  4       R8X  d   Rp\        VP                  R4      4      pV'       d   VP                  R4      MRpV'       d=   V P                  W4       F'  w  ršVP                  V	4       VP                  V
4       K)  	  . pV\        P                  8X  d   V'       d   V P                  WF4      w  rkVP                  R4      pR\        VP                  R4      ;'       g    R4      P                  4       3R\!        V\"        4      '       d   TMR33 UUu/ uF  w  rÞV'       g   K  WÞbK  	  pppVP                  R4      '       d+   RVR&   VP%                  \&        4      '       g   \&         V 2p\)        YbY1VP                  R4      YEY¿Ve   \        V4      MR\        VP                  R4      ;'       g    R4      P                  4       ;'       g    RV'       d+   V P+                  VP                  R4      4      ;'       g    RMRV'       d   V P-                  V4      R7      # RR7      #  EL²u uppi   \.         d'   p\1        RT P2                   RT 24        Rp?R# Rp?ii ; i5i)zKBuild a MessageEvent from bridge message data, downloading images to cache.Nrd  r|   ÚchatNamerÒ  Fr5   rÑ  ÚsenderIdÚ
senderNamerW  )r]  Ú	chat_nameÚ	chat_typeÚuser_idÚ	user_namerX  r  z[ptt received]ÚhasQuotedMessageÚquotedMessageIdÚnativeMetadataÚwhatsapp_native_typeÚ
nativeTypeÚwhatsapp_nativeÚ	fromOwnerTÚwhatsapp_from_ownerÚ
quotedTextÚquotedParticipant)r%   rá  ÚsourceÚraw_messagerX  Ú
media_urlsÚmedia_typesÚmedia_text_inlinedr`  Úreply_to_message_idÚreply_to_textÚreply_to_author_idÚreply_to_is_own_messagerš  z] Error building event: )Ú_should_process_messagerû  Úbuild_sourcerX   r  Ú_clean_bot_mention_textrÚ   r	  r   rA   r€   ry   r,  rL   rú  r"  r  rÐ  r  Ú_OWNER_REPLY_PREFIXrÙ   Ú_normalize_whatsapp_idÚ_message_is_reply_to_botrƒ   r¤  r   )r1  rÆ  rþ  rA  r  rD  r  Úquotedr%  rU   rŽ  rE  Únative_metadatarà  r�  r`  r°  s   &&               r   rß  Ú$WhatsAppAdapter._build_message_event  sY  é € ð,	Ø×/Ñ/°×5Ò5ÙØ×4Ñ4°TÓ:ˆHØ×&Ñ&¨t¯x©x¸À"Ó/EÐQU×QYÑQYÐZdÓQeð  }A÷  }Eñ  }Eð  FOð  QV÷  }Wò  }WÑqxð  ]aØ/3¯x©x¸
Ó/CÈtÏxÉxÐXdÓOeØ26·(±(¸;Ó2Gð 'ó IˆFð .2×-GÑ-GÈÓ-W×'WÑ$ˆKØ—8‘8˜F BÓ'ˆDØ�x‰x˜	×"Ò"Ø×3Ñ3°DÓ?�Øœ;×,Ñ,Ô,·ÄÀTÃÇÁÓAR×AXÑAXÓAZÐ^nÔAnØ�ä˜$Ÿ(™(Ð#5Ó6Ó7ˆFß:@˜4Ÿ8™8Ð$5Ô6ÀdˆLßØ"&×"4Ñ"4°TÖ"H‘J�DØ×&Ñ& tÔ,Ø×&Ñ& tÖ,ñ #Ið .0ÐØœ;×/Ñ/Ô/·KØ+/×+EÑ+EÀkÓ+XÑ(�Ø"Ÿh™hÐ'7Ó8ˆOà'¬¨T¯X©X°lÓ-C×-IÐ-IÀrÓ)J×)PÑ)PÓ)RÐSØ"´zÀ/ÔSW×7XÒ7X¡OÐ^bÐcñ:ô (ñ :±°ô ô )-¨ªñ :ˆHñ (ð �x‰x˜×$Ò$Ø26�Ð.Ñ/Ø—‘Ô':×;Ò;Ü1Ð2°4°&Ð9�DÜØ¸Ð^b×^fÑ^fÐgrÓ^sØ&ÐTfØ9EÒ9Q¤C¨Ô$5ÐW[Ü! $§(¡(¨<Ó"8×">Ð">¸BÓ?×EÑEÓG×OÐOÈ4ßkq D×$?Ñ$?ÀÇÁÐI\Ó@]Ó$^×$fÐ$fÐbføÐw{ßOU¨×(EÑ(EÀdÓ(Kôð ð \aôð ò7 (Xùó"(øô$ ô 	Ü�A�d—i‘i�[Ð 8¸¸Ð<Ô=Ýûð	üs·   ‚N.„M: ›N.�AM: Á2AM: Â?M1Ã AM: ÄA*M: ÆAM: Ç#AM: È%5M: ÉM4É+M4É19M: Ê+AM: Ë;M: Ì	M: Ì!&M: ÍM: ÍM: Í)N.Í*M: Í0N.Í1M: Í4M: Í:N+ÎN&Î N.Î&N+Î+N.)rj  ru  rt  rb  r`  r^  rc  rg  r_  rm  rk  rw  rp  rs  rv  r]  re  rn  rd  rx  )r9  )NNrK   r§   )6r  Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rZ  Úsplits_long_messagesÚserial_receive_looprX  r�  r‰  r“  r±  r¹  rÌ  ré  rð  rû  r   r  r-  rï  r@  rG  rM  r0  rZ  r8  rf  rx  r�  r—  rŸ  r¨  r­  r´  r¼  rÁ  rÆ  rÌ  rÕ  rÚ  r·  rà  Ú_SPLIT_THRESHOLDÚstaticmethodrû  r  r"  r,  rß  Ú__static_attributes__Ú__classdictcell__Ú__classcell__)r|  r=  s   @@r   r:  r:  [  sw  ù‡ € ñYð ÐØÐØÐ÷',ó ',÷R>ð >÷Cð C÷
"ð "÷%ð %÷NEð E÷!ð !÷F ð  ÷Dò ÷&ð &÷*ð ÷$ð ð:e)°E÷ e)ò e)÷N'ð '÷3ð 3÷.Nð N÷-ð -÷0Eð E÷	;ð 	;ð ÷;ñ ;ó ð;ð4 ð;Ðbg÷ ;ñ ;ó ð;ð ÷ñ ó ðð ðQÐjk÷ Qñ Qó ðQ÷
	bõ 	bð ðUÐlpð Uð  LPð UØ6:ðUØae÷Uñ Uó ðU÷]õ ]÷Wò W÷Wò W÷Wò W÷Cò C÷ò ÷/ð /÷!ð !÷#ð #÷2	Tð 	Tð Ðà÷mó ðm÷Bð B÷2ð ÷.ð ÷*.÷ .ð .r   r:  c                óH   € V ^8„  d   QhR\         R\        R\        R\         /# )r   r{  Úis_voiceÚforce_documentr   rç   )r   s   "r   r   r   =  s/   € ÷ Qñ Q¤#ð Q´ð QÄtð QÔPSñ Qr   c                óº   € V'       d   R# V'       d   R# \         P                  \        P                  P	                  V 4      ^,          P                  4       R4      # )uu   Local file â†’ bridge ``mediaType`` (image|video|audio|document); ``force_document`` = the [[as_document]] directive.r(  r$  )Ú_WA_EXT_MEDIA_TYPErX   rT   rU   Úsplitextr€   )r{  r_  r`  s   &&&r   Ú_bridge_media_typerd  =  sd   € ç'ˆ:ð  Q¿¨Wð  QÔFX×F\ÑF\Ô]_×]dÑ]d×]mÑ]mÐnwÓ]xÐyzÕ]{÷  ^Bñ  ^Bó  ^Dð  FPó  GQð  Qr   c                ój   € V ^8„  d   QhR\         \        ,          R,          R\         \        ,          /# )r   ÚmentionsNr   )r.   r   )r   s   "r   r   r   B  s+   € ÷ jñ j¬4´­9°tÕ+;ð jÄÄSÅ	ñ jr   c                óh   a€ \        \        P                  V3R lT ;'       g    R 4       4      4      # )z6Valid participant JIDs, deduplicated, order preserved.c              3   óR   <"  € T F  p\        V4      ;o'       g   K  Sx € K  	  R # 5irK   )rÑ   )r6   r7   rŒ  s   & €r   r8   Ú/_normalize_outbound_mentions.<locals>.<genexpr>D  s$   øé € Ðh©> aÔEcÐdeÓEfÐ>f¸cÓ>fŸcšc«>ùs   ƒ'�
'r  )r.   rÐ  Úfromkeys)rf  rŒ  s   &@r   Ú_normalize_outbound_mentionsrk  B  s%   ø€ ä”—‘Ôh¨8¯>¨>°r¨>ÓhÓhÓiÐir   Ú	thread_idÚmedia_filesr`  r}  rf  c             ƒ  ód	  aaaa "  €  ^ RI o ^ RIHp ^RIHp	 T	! T! 4       \        T R/ 4      ;'       g    / P                  R4      4      o\        \        \        T R/ 4      ;'       g    / 4      4      p
\        T4      pT;'       g    . pT'       d   \        T4      ^8X  d   TMRp\        T4      oT3R lpRpSP                  4       ;_uu_4       GRj  x€L
 o S P                  RS R	2SP                  ^R
7      R7      ;_uu_4       GRj  x€L
 pTP                   ^È8w  dA   \        RS RTP                    R24      uuRRR4      GRj  x€L
  uuRRR4      GRj  x€L
  # TP#                  4       G Rj  x€L
 pRRR4      GRj  x€L
  XP                  R4      pT'       d,   TT
8w  d%   \        RS RT R24      uuRRR4      GRj  x€L
  # S'       dG   TP                  R4      ;'       g    / P                  R4      '       g   RR/uuRRR4      GRj  x€L
  # R,TTT 3R llpT;'       g    RP%                  4       '       dG   T'       g?   T! RTRT/4      pT! RT^R4      G Rj  x€L
 w  ppT'       d   TuuRRR4      GRj  x€L
  # T EF/  w  pp\&        P(                  P+                  T4      '       gJ   T'       d     T! RTRT/4      pT! RT^4      G Rj  x€L
  \        RT 24      u uuRRR4      GRj  x€L
  # \3        TTT4      pRTRTRT/pTP5                  R TR!8X  d    \&        P(                  P7                  T4      MR3R"T33 UUu/ uF  w  ppT'       g   K  TTbK  	  upp4       T! T4      pT! R#T^xR$4      G Rj  x€L
 w  ppT'       d   Tu uuRRR4      GRj  x€L
  # T;'       g    TpEK2  	  RRR4      GRj  x€L
  R%R&R'R(R)TR*T/#   \         d    \        R4      u # i ; i EL$ ELï EL´ EL¥ EL� EL‚  + GRj  x€L 
 '       g   i     ELš; i EL_ EL ELÅ ELª ELW  \,         d    \.        P1                  R4        ELxi ; i EL`u uppi  LÚ L¼ Lœ  + GRj  x€L 
 '       g   i     L³; i  \,         d   p\        R+T 24      u Rp?# Rp?ii ; i5i)-z‹Out-of-process delivery via the bridge HTTP API (standalone_sender_fn: cron apart from the gateway); ``caption`` rides on the media bubble.Nz/aiohttp not installed. Run: pip install aiohttprA  rC  rY   rE  c                 ó&   <€ S'       d   SV R &   . oV # )rf  r  )rS  Úpending_mentionss   &€r   Ú_mention_first_payloadÚ0_standalone_send.<locals>._mention_first_payload[  s   ø€ çØ&6�˜
Ñ#Ø#%Ð ØˆNr   úhttp://localhost:z/healthr†  rŽ  zWhatsApp bridge on port z answered /health with HTTP z; nothing was sent.r‘  z# serves another profile's session (zT); nothing was sent. Give each profile its own platforms.whatsapp.extra.bridge_port.ÚcapabilitiesÚoutboundMentionsr/  zZWhatsApp bridge does not support native mentions; restart it from the same Hermes version.c              “  ó  <"  € RS RV  2pSP                  WASP                  VR7      R7      ;_uu_4       GRj  x€L
 pVP                  ^È8X  d<   VP                  4       G Rj  x€L
 P	                  R4      R3uuRRR4      GRj  x€L
  # RVf   / M3\        RT RVP                   R	VP                  4       G Rj  x€L
  24      3uuRRR4      GRj  x€L
  #  Lž Lw LW L# L  + GRj  x€L 
 '       g   i     R# ; i5i)
zY``(messageId, None)`` on 200, else ``(None, error_dict)`` (body read only when labelled).rs  r€  r†  rË  NrW  z	WhatsApp z error (z): )rU  rˆ  r–   r�  rX   r   r%   )	rU   rS  r‡  Úerror_labelræ   r’  r  rE  r‘  s	   &&&&  €€€r   Ú_postÚ_standalone_send.<locals>._posty  s  øé € à)¨+¨°a¸°vÐ>�Ø"Ÿ<™<¨À7×CXÑCXÐ_dÐCXÓCe˜<×f×fÔfÐjnØ—{‘{ cÔ)Ø&*§i¡i£k× 1×6Ñ6°{ÓCÀTÐI÷ g×fÒfð   {Ò':¡Ä
ÈYÐWbÐVcÐckÐlp×lwÑlwÐkxÐx{ð  CG÷  CLñ  CLó  CN÷  }Nð  |Oð  LPó  AQð  Q÷ g×fÔfá 1ñ gñ }N÷ g×f×fÓfüsŒ   ƒ8D»C¼D¿%C$Á$CÁ%C$Á9DÂCÂDÂ0C$Â<C Â=
C$ÃDÃC"ÃDÃC$ÃDÃ C$Ã"DÃ$C>	Ã*C-Ã+
C>	Ã6C>	Ã8	Dr|   rd  r  rf  Úbridgez7WhatsApp caption-fallback send failed for missing mediazWhatsApp media file not found: r�  r‚  rƒ  r(  r}  r„  Úmediar.  TÚplatformÚwhatsappr]  rX  zWhatsApp send failed: rK   )r  r  r   r\  rB  ra  rD  rÅ   rX   r   rZ   rÒ   rh   rk  r  rˆ  r–   r�  rA   rT   rU   r¨   rƒ   r‹   rŒ   rd  rÞ  rÅ  )!Úpconfigr]  r  rl  rm  r`  r}  rf  rB  rD  Úown_sessionÚnormalized_chat_idr{  Úmedia_captionrq  rp  r’  r�  rÇ  rx  rS  ÚerrÚ
media_pathr_  r|  rà  r�  Úmidr°  r  rE  rp  r‘  s!   &&&$$$$$                     @@@@r   Ú_standalone_sendr…  G  s¥  ûé € ðMÛðM8Ý4Ý<Ù,ÙÓ¤¨°¸"Ó =× CÐ CÀ×HÑHÈÓWó
ˆô œ,¤w¨w¸ÀÓ'D×'JÐ'JÈÓKÓLˆÜ,¨WÓ5ÐØ×!Ð!˜rˆç$+´°E³
¸a´™ÀdˆÜ7¸ÓAÐõ	ð ˆØ×(Ñ(×*×*Ô*¨gð —{‘{Ø# K =°Ð8Ø×-Ñ-°AÐ-Ó6ð #÷ ÷ ô ð Ø—;‘; #Ô%Ü%Ø2°;°-Ð?[Ð\`×\gÑ\gÐ[hÐh{Ð|ó~÷÷ ñ ÷ +×*Ò*ð  $Ÿy™y›{×*�÷÷ ð  &Ÿz™z¨)Ó4ÐßÐ$4¸Ô$CÜ!Ø.¨{¨mÐ;^Ð_oÐ^pð qhð hói÷ +×*Ò*÷   ØŸ
™
 >Ó2×8Ð8°b×=Ñ=Ð>P×QÒQØ#ðCðE÷% +×*Ò*÷,Qñ Qð —�˜2×$Ñ$×&Ò&¯}Ù0°(Ð<NÐPYÐ[bÐ1cÓd�Ù-2°6¸7ÀBÈÓ-Q×'QÑ$� ßØ÷E +×*Ò*ôH ).Ñ$�
˜HÜ—w‘w—~‘~ j×1Ò1ç$ðfÙ&<¸hÐHZÐ\eÐgtÐ=uÓ&v˜GÙ"'¨°¸Ó"<×<Ð<ô &Ð(GÈ
À|Ð&TÓUÑU÷[ +×*Ò*ô\ 0°
¸HÀnÓU�
Ø+3Ð5GÈÐU_ÐalÐnxÐ*y�Ø—‘°:Ð_iÐmwÔ_w¼r¿w¹w×?OÑ?OÐPZÔ?[ð  ~Bð  3Cð  FOð  Q^ð  E_ñ  2`ô   fñ  2`©¨¨Aô  de¤  1¢ñ  2`ò   fô  gÙ0°Ó9�Ù!& |°W¸cÀ7Ó!K×K‘��SßØ‘J÷i +×*Ò*ðj #&×"8Ð"8¨“ñ# ).÷I +×*ðl ˜4 ¨Z¸ÐDVÐXdÐfuÐvÐvøô[ ô MÜÐKÓLÒLðMúò. +õò +ò +÷÷ ÷ ô úõ +ò@ (RòA +òT =øÜ(ô fÜ"ŸN™NÐ+d×eðfúòW +ùó`  fáK÷e +×*×*Ô*ûôn ô 8ÜÐ2°1°#Ð6Ó7Õ7ûð8üs«  †R0ˆO �'R
 µAR
 Â
R
 ÂAR
 ÃO:ÃR
 Ã4Q.ÄO=ÄQ.Ä-P	Ä?Q.ÅP 
ÅQ.ÅR
 ÅPÅR
 Å#R0Å$P	Å7PÅ8P	Å<Q.ÆP	ÆQ.Æ%Q.Æ=R
 Ç
P)ÇR
 ÇR0ÇQ.ÇQ.Ç0Q.ÈQ.ÈR
 ÈP,ÈR
 ÈR0ÈQ.È1Q.ÉQ.ÉQ.É*P/É+Q.É:Q.É;R
 ÊP2Ê	R
 ÊR0Ê5Q.ËP8ËP5
ËP8Ë#Q.Ë2R
 Ë?QÌ R
 ÌR0ÌAQ.ÍQ"Í(Q"Í/Q.ÎQ(
ÎQ.ÎQ.Î R
 Î-Q*Î.R
 Î2R0Î3Q.Î<Q.ÏR
 ÏQ,ÏR
 ÏR0ÏO7Ï4R0Ï6O7Ï7R0Ï:R
 Ï=Q.Ð Q.ÐR
 ÐP	Ð	Q.ÐP&ÐPÐ
P&ÐP&Ð 	Q.Ð)R
 Ð,R
 Ð/Q.Ð2R
 Ð5P8Ð8 Q	ÑQ.ÑQ	ÑQ.ÑR
 Ñ"Q.Ñ*R
 Ñ,R
 Ñ.R	Ñ4Q7Ñ5
R	Ò R	ÒR
 Ò
R-ÒR(Ò"R-Ò#R0Ò(R-Ò-R0c                ó   € V ^8„  d   QhRR/# r´  r  )r   s   "r   r   r   ž  s   € ÷ ,ñ ,˜4ñ ,r   c                 ó,  € ^ RI Hp HpHp ^ RIHpHpHpHpH	p V! R4       V! R4       V! R4       V ! R4      ;'       g    RP                  4       R9   d   V! R	4       V! R
R4      '       g   R# V! RR4      '       g   V! RR4       V! R4       R# V! RR4       V! R4       V! R4      pV'       d"   V! RVP                  RR4      4       V! R4       V! R4      P                  4       p	V	'       d   V! RV	4       R# V! R4      '       d   V! R4       R# R# )zBGuide the user through WhatsApp setup (CLI helpers lazy-imported).)Úget_env_valueÚremove_env_valueÚsave_env_value)ÚpromptÚprompt_yes_noÚprint_headerÚ
print_infoÚprint_successÚWhatsAppz;WhatsApp uses a local Node.js bridge (WhatsApp Web client).zBStart the bridge separately; the gateway connects to it over HTTP.ÚWHATSAPP_ENABLEDr|   rV  zWhatsApp: already enabledzReconfigure WhatsApp?FNzEnable WhatsApp?TrÓ  zWhatsApp left disabledzWhatsApp enabledz@Allowed user IDs (comma-separated, leave empty for no allowlist)rN  r}   zWhatsApp allowlist configuredz4Home chat ID for cron delivery (leave empty to skip)ÚWHATSAPP_HOME_CHANNELzHome channel cleared.>   rS  rU  rV  )Úhermes_cli.configrˆ  r‰  rŠ  Úhermes_cli.cli_outputr‹  rŒ  r�  rŽ  r�  r€   r#   rA   )
rˆ  r‰  rŠ  r‹  rŒ  r�  rŽ  r�  Úallowed_usersÚhome_channels
             r   Úinteractive_setupr—  ž  s  € çQÑQßdÕdÙ�ÔÙÐLÔMÙÐSÔTÙÐ(Ó)×/Ð/¨R×6Ñ6Ó8Ð<PÔPÙÐ.Ô/ÙÐ4°e×<Ò<ÙÙÐ+¨T×2Ò2ÙÐ)¨7Ô3ÙÐ+Ô,ÙÙÐ% vÔ.ÙÐ$Ô%ÙÐ]Ó^€MßÙÐ/°×1FÑ1FÀsÈBÓ1OÔPÙÐ5Ô6ÙÐPÓQ×WÑWÓY€LßÙÐ.°Ö=Ù	Ð1×	2Ò	2ÙÐ*Ö+ñ 
3r   c                óJ   € V ^8„  d   QhR\         R\         R\         R,          /# )r   Úyaml_cfgÚwhatsapp_cfgr   NrÏ  )r   s   "r   r   r   Ã  s%   € ÷ :ñ :¤ð :´Tð :¼dÀT½kñ :r   c                ó"   € \        V\        4      # )uÌ   ``apply_yaml_config_fn`` (#24849): config.yaml whatsapp: keys â†’ WHATSAPP_* env (env wins; skipped under
a multiplexed secondary profile's scope, #80099) + ``PlatformConfig.extra`` (extra-first readers).)Ú_apply_yaml_bridgeÚ_YAML_BRIDGE)r™  rš  s   &&r   Ú_apply_yaml_configrž  Ã  s   € ô ˜l¬LÓ9Ð9r   c                ó$   € V ^8„  d   QhR\         /# rI   rÁ   )r   s   "r   r   r   Ê  s   € ÷ iñ iœTñ ir   c                óê   € V e1   \        V RR4      '       d   \        V R/ 4      '       g	   / '       d   R# ^ RIHp VP                  R4      ;'       g    RP	                  4       P                  4       R9   # )	zjConnected == WHATSAPP_ENABLED opt-in (or an enabled PlatformConfig with extras); auth lives in the bridge.NÚenabledFrY   Tr‘  r|   >   rS  rU  rV  )rÅ   Úhermes_cli.gatewayr—   rˆ  rA   r€   )r<  Úgateway_mods   & r   Ú_is_connectedr¤  Ê  sa   € àÒœg f¨i¸×?Ò?ÄWÈVÐU\Ð^`×EaÒEa×egÙå,Ø×%Ñ%Ð&8Ó9×?Ð?¸R×FÑFÓH×NÑNÓPÐThÑhÐhr   u²  You are on WhatsApp. Standard markdown auto-converts to WhatsApp syntax (*bold*, _italic_, ~strike~, monospace) â€” write markdown freely, bullets included. No tables â€” use bullets or labeled lines. You can send files natively: write MEDIA:/absolute/path/to/file in your response. Images (.jpg, .png, .webp) send as photos, videos (.mp4, .mov) play inline, other files arrive as documents; image URLs via ![alt](url) send as photos.zB^\s*[\w-]+@(?:g\.us|s\.whatsapp\.net|lid|broadcast|newsletter)\s*$c                ó   € V ^8„  d   QhRR/# r´  r  )r   s   "r   r   r   â  s   € ÷ ñ �Tñ r   c                 ót  € ^RI Hp V P                  ! R'/ R\        \        4      bR\        RRRRRRR7      bRRbR	RbR
\        bR\        bRRbRRbRR(bRR'bR\        bRR.bRRbR\        bR\        bRRbR\        bRRbRRbR RbR!\        bR"R#bR$VP                  bR%VP                  bVP                  B  R&# ))r4   )Úgateway_envÚtarget_ref_syntax_fnÚstandalone_sendr�  T)r  r{  ÚcaptionableÚforward_force_documentrf  Útext_directr   r}  r  Úadapter_factoryÚcheck_fnÚdashboard_descriptionzBUse Hermes through the bundled WhatsApp bridge with QR-based auth.Údocs_urlz"https://github.com/tulir/whatsmeowÚdashboard_env_varsr‘  Údashboard_required_envÚis_connectedÚrequired_envÚinstall_hintuF   WhatsApp requires a Node.js bridge â€” see the WhatsApp messaging docsÚsetup_fnÚapply_yaml_config_fnÚcron_deliver_env_varr’  Ústandalone_sender_fnÚmax_message_lengthi   Úemojiu   ðŸ’¬Úallow_update_commandÚplatform_hintÚdisplay_tierÚmediumÚenv_overridesÚenv_enable_credentialsNr  )r‘  rÕ  rI  rN  )r|   r§  Úregister_platformr   Ú_SEND_JID_REr   r:  rþ   r¤  r—  rž  r…  Ú_PLATFORM_HINTÚENV_OVERRIDESÚENV_ENABLE_CREDENTIALSÚAUTHZ)Úctxr§  s   & r   ÚregisterrÉ  â  sB  € ÝØ×Òò Ü2´<Ô@ðô -°:ÀTÐW[ØDHÐSWÐeiõkðñ
 ðñ
  *ðõ
 <Kðõ
 Vqðñ cðñ 6ðñ
ðñ  "ðõ #ðð 3EÑ1Eðñ ^ðõ #ðõ :Lðñ czðõ .ðñ CGðñ OUðñ lpðõ  %ð!ñ$ ð%ð& "×/Ò/ð'ð(  +×AÒAÀ[×EVÑEVô)r   )r|   rK   )rN  ÚWHATSAPP_ALLOW_FROMrI  rL  rR  rQ  ÚWHATSAPP_REQUIRE_MENTIONÚWHATSAPP_MENTION_PATTERNSÚWHATSAPP_FREE_RESPONSE_CHATSÚWHATSAPP_DEBUGÚWHATSAPP_FORWARD_OWNER_MESSAGESÚWHATSAPP_MAX_MESSAGE_LENGTHÚWHATSAPP_CHUNK_DELAY_MSÚWHATSAPP_SEND_TIMEOUT_MS>   ú.jsú.mdú.pyú.tsú.cssú.csvú.logú.txtú.xmlú.ymlú.htmlú.jsonú.yamli � )r!  r%  )r$  r&  )r$  z
audio/mpeg)r"  r'  )r(  r|   )r  z.jpegz.pngz.webpz.gif)z.mp4z.movz.aviz.mkvz.webmz.3gp)r  z.opusz.mp3z.wavz.m4az.flac))Úrequire_mentionrË  r€   )rH  rI  r€   )rK  rL  r€   )Úmention_patternsrÌ  r�  )Úfree_response_chatsrÍ  Úcsv)Ú
allow_fromrN  rã  )rO  rR  rã  ){rV  rq  Úloggingr‡  rT   r|  rD   r‘   r=   Ú
contextlibr   Ú	functoolsr   Úpathlibr   rÊ  r   r   r	   Úgateway.platforms._sharedr
   rœ  r   rf  r   r   Úgateway.platforms.send_targetsr   r   rm   r   r\  r   r   r   Úsystemrs   r!   Ú	getLoggerr  r‹   rM  rÐ  rŽ   r?   rG   r<   rZ   rp   rt   r…   r“   r›   rŸ   r±   r¸   r½   rÍ   ÚsysrU   Úinsertr   r  ré   r  Úgateway.configrÎ   rÏ   r[  rÐ   Úgateway.whatsapp_identityrÑ   rÒ   rã   rÓ   rÔ   rÕ   rÖ   r×   Úgateway.platforms.helpersrØ   Úgateway.platforms.eventrÙ   rÚ   ÚutilsrÛ   rä   rí   rö   rþ   r	  r  rÜ  r  r  ÚLOCATIONÚSTICKERr÷  r  ÚVIDEOr	  r
  rù  rú  r‰  rŠ  r)  r8  r:  rj  rb  rd  rk  r…  r—  r�  rž  r¤  rÄ  ÚcompileÚ
IGNORECASErÃ  rÉ  r  r   r   Ú<module>rù     sq  ðñ_ó Û Û Û 	Û Û 	Û Û Ý Ý Ý ß &Ñ &÷ó ÷ WÝ Eß ZÑ Zà�oŠoÓ 9Ñ,€÷,ð 
×	Ò	˜8Ó	$€ð 'Ð á ¨4¸'È)Ð[e×[mÑ[mÔn€	õ	õõ^õoõYõ
õ"1õ$@õ õ
.õ"÷,Ið"°U÷ "ó. Ø ‡�‡��‘3‘t˜H“~×-Ñ-Ó/×7Ñ7¸Õ:Ó;Ô <ç 3Ý Cß U÷õ õ 2ß =Ý õiõ
õõò$õ!>ðJÐ ò |Ð Ø#Ð Ø! ;×#7Ñ#7¸È+×J^ÑJ^Ð`iÐkv×k~Ñk~ÐÐ à˜K×-Ñ-Ð.°¸+×:KÑ:KÐ0LÈuÐVa×VgÑVgÐNhÐkrÐt÷  uFñ  uFð  kGð  H€ð ×ÑÐ.°×0AÑ0AÐCYÐ[f×[lÑ[lð  oFØ×ÑÐ-¨{×/CÑ/CÐEUð€ð & {×'8Ñ'8¸'À;×CTÑCTÐV]Ð_j×_pÑ_pÐr|ð  J÷  Sñ  Sð  TÐ àˆ\˜7 K°¸ÀWÈkÐ[`ÐbmØÐ*¨I°|ðÐ òôVÐ+Ð-@ô VðvØ
‡m�mÐ>ÀÓHðà
‡m�mÐEÀwÓOðð ‡m�mÐFÈÓPðÐ õQõ
jð
T8À4ð T8ÐUYð T8Ðjoð T8Ø#'ðT8Ø26ôT8õn,ð:€õ:õiðZð ð �zŠzÐ_Ðac×anÑanÓo€÷r   