+
    jHàj�9  ã                  óÜ   € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
HtHt ^ RIHtHtHt ^ RIHt ]P,                  ! ]4      t0 RmtR R ltR	 R
 lt ! R R]4      tR R ltR# )uV  
Transport-agnostic WhatsApp behavior shared by the Baileys bridge adapter and the
Cloud API adapter: allow-list / DM / group gating, mention detection, quoted-reply-
to-bot detection, broadcast filtering, WhatsApp markdown conversion, chunk budgeting.

Mixin contract â€” the host adapter sets these on ``self`` before calling any mixin
method: ``config`` (PlatformConfig), ``name``, ``_dm_policy`` / ``_group_policy``
("open" | "allowlist" | "disabled" | "pairing"), ``_allow_from`` / ``_group_allow_from`` (set[str]),
``_mention_patterns`` (list[re.Pattern]), ``_reply_prefix`` (Optional[str]).
)ÚannotationsN)ÚPath)ÚAnyÚDictÚOptional)Údecode_json_list_literalÚextra_or_secretÚget_scoped_secret)ÚOwnAccessPolicyMixinc               ó(   € V ^8„  d   QhRRRRRRRR/# )é   ÚpatternÚstrÚtextÚtagÚreturnztuple[str, list[str]]© )Úformats   "ÚF/home/ubuntu/.hermes/hermes-agent/gateway/platforms/whatsapp_common.pyÚ__annotate__r   !   s)   € ÷ .ñ .�Cð .˜sð .¨ð .Ð1Fñ .ó    c                óP   aa€ . oR VV3R llp\         P                  ! WV4      S3# )zHReplace every ``pattern`` match with a ``\x00<tag><n>\x00`` placeholder.c               ó    € V ^8„  d   QhRRRR/# ©r   Úmzre.Matchr   r   r   )r   s   "r   r   Ú_stash.<locals>.__annotate__%   s   € ÷ 0ñ 0�ð 0˜Sñ 0r   c                ót   <€ SP                  V P                  ^ 4      4       RS \        S4      ^,
           R2# )é    Ú )ÚappendÚgroupÚlen)r   Úsavedr   s   &€€r   ÚkeepÚ_stash.<locals>.keep%   s3   ø€ Ø�‰�Q—W‘W˜Q“ZÔ Ø�c�Uœ3˜u›:¨�>Ð*¨$Ð/Ð/r   )ÚreÚsub)r   r   r   r#   r"   s   &&f @r   Ú_stashr'   !   s*   ù€ à€E÷0ñ 0ô �6Š6�' Ó&¨Ð-Ð-r   c               ó    € V ^8„  d   QhRRRR/# r   r   )r   s   "r   r   r   ,   s   € ÷ ñ �xð  Cñ r   c                óò   € V P                  ^4      P                  4       p\        V4      ^8”  dD   VP                  R4      '       d-   VP	                  R4      '       d   V^R P                  4       pKS  RV R2# )u{   ``# Header`` â†’ ``*Header*``, stripping already-bolded ``*...*`` so ``# **Title**``
doesn't render with literal asterisks.Ú*éÿÿÿÿ)r    Ústripr!   Ú
startswithÚendswith)r   Úinners   & r   Ú_header_to_boldr0   ,   se   € ð �G‰G�A‹J×ÑÓ€EÜ
ˆe‹*�qŒ.˜U×-Ñ-¨c×2Ò2°u·~±~Àc×7JÒ7JØ�a˜�×!Ñ!Ó#ŠØˆuˆg�Qˆ<Ðr   c                  óº  € ] tR t^5t$ RtRtR]R&   RtRtRt	R]R	&   ]
P                  ! R
4      t]
P                  ! R4      t]R R l4       tR R ltR R ltR R ltR R lt]R R l4       t]R R l4       tR R ltR R lt]R R l4       t]R  R! l4       t]R" R# l4       tR$ R% ltR& tR' R( ltR) R* ltR+ R, lt R- R. lt!R/ R0 lt"R1 R2 lt#R3 R4 lt$R5t%R6# )7ÚWhatsAppBehaviorMixinu¡   Shared behavior for all WhatsApp adapters (Baileys + Cloud API); owns no state
of its own â€” see the module docstring for the host adapter's attribute contract.i   ÚintÚMAX_MESSAGE_LENGTHÚWHATSAPPTu8   â˜¤ *Hermes Agent*
â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€
r   ÚDEFAULT_REPLY_PREFIXz[\u200b\u2060\u2063\ufeff]z3[\u00a0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]c               ó    € V ^8„  d   QhRRRR/# ©r   Úcontentr   r   r   )r   s   "r   r   Ú"WhatsAppBehaviorMixin.__annotate__D   s   € ÷ fñ f¨cð f°cñ fr   c                ó‚   € V'       g   V# V P                   P                  RV P                  P                  RV4      4      # )u™   Strip zero-width format chars (WORD JOINER etc.) and normalize odd unicode
spaces â€” WhatsApp renders them as mojibake prefixes. Emoji joiners are kept.Ú Ú )Ú_OUTBOUND_ODD_SPACE_REr&   Ú_OUTBOUND_INVISIBLE_CHARS_RE)Úclsr9   s   &&r   Ú_sanitize_outbound_textÚ-WhatsAppBehaviorMixin._sanitize_outbound_textC   s:   € ÷ ØˆNØ×)Ñ)×-Ñ-¨c°3×3SÑ3S×3WÑ3WÐXZÐ\cÓ3dÓeÐer   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r:   K   s   € ÷ 	)ñ 	)¨ñ 	)r   c                óì   € \        RRR7      ;'       g    RR8w  d   R# V P                  e   V P                  P                  RR4      # \        R4      pVe   VP                  RR4      # V P                  # )zNPrefix for outgoing replies in self-chat mode (Cloud API overrides to ``""``).ÚWHATSAPP_MODEz	self-chat©Údefaultr=   z\nÚ
ÚWHATSAPP_REPLY_PREFIX)Ú_get_wsecretÚ_reply_prefixÚreplacer6   )ÚselfÚ
env_prefixs   & r   Ú_effective_reply_prefixÚ-WhatsAppBehaviorMixin._effective_reply_prefixK   sr   € ä˜°+Ô>×MÐMÀ+ÐR]Ô]ÙØ×ÑÒ)Ø×%Ñ%×-Ñ-¨e°TÓ:Ð:Ü!Ð"9Ó:ˆ
ØÒ!Ø×%Ñ% e¨TÓ2Ð2Ø×(Ñ(Ð(r   c               ó   € V ^8„  d   QhRR/# )r   r   r3   r   )r   s   "r   r   r:   V   s   € ÷ Xñ X sñ Xr   c                ój   € \        RV P                  \        V P                  4       4      ,
          4      # )zQReserve room for the reply prefix; floor keeps space for pagination/fence repair.i   )Úmaxr4   r!   rO   ©rM   s   &r   Ú_outgoing_chunk_limitÚ+WhatsAppBehaviorMixin._outgoing_chunk_limitV   s(   € ä�4˜×0Ñ0´3°t×7SÑ7SÓ7UÓ3VÕVÓWÐWr   c               ó   € V ^8„  d   QhRR/# )r   r   Úboolr   )r   s   "r   r   r:   Z   s   € ÷  ñ  ¨4ñ  r   c                	óò   € V P                   P                  P                  R 4      pVf   \        RRR7      ;'       g    Rp\	        V\
        4      '       d   VP                  4       \        9   # \        V4      # )Úrequire_mentionÚWHATSAPP_REQUIRE_MENTIONÚfalserF   )	ÚconfigÚextraÚgetrJ   Ú
isinstancer   ÚlowerÚ_TRUTHYrX   )rM   Ú
configureds   & r   Ú_whatsapp_require_mentionÚ/WhatsAppBehaviorMixin._whatsapp_require_mentionZ   se   € Ø—[‘[×&Ñ&×*Ñ*Ð+<Ó=ˆ
ØÒÜ%Ð&@È'ÔR×]Ð]ÐV]ˆJÜ�j¤#×&Ò&Ø×#Ñ#Ó%¬Ñ0Ð0Ü�JÓÐr   c               ó   € V ^8„  d   QhRR/# ©r   r   úset[str]r   )r   s   "r   r   r:   b   s   € ÷ iñ i¨xñ ir   c                ób   € V P                  \        V P                  P                  RR4      4      # )zF``extra.free_response_chats`` (blank = unset) else the scoped env CSV.Úfree_response_chatsÚWHATSAPP_FREE_RESPONSE_CHATS)Ú_coerce_allow_listÚ_extra_or_wsecretr]   r^   rT   s   &r   Ú_whatsapp_free_response_chatsÚ3WhatsAppBehaviorMixin._whatsapp_free_response_chatsb   s/   € à×&Ñ&Ü˜dŸk™k×/Ñ/Ð1FÐHfÓgóið 	ir   c               ó   € V ^8„  d   QhRR/# rg   r   )r   s   "r   r   r:   h   s   € ÷ Jñ J 8ñ Jr   c                ó6  € V f   \        4       # \        V 4      p \        V \        4      '       d   T M\	        V 4      P                  R4      pV Uu0 uF=  p\	        V4      P                  4       '       g   K$  \	        V4      P                  4       kK?  	  up# u upi )z\Parse allow_from / group_allow_from from config (list or JSON-list string) or env var (CSV).Ú,)ÚsetÚ_decode_json_list_literalr`   Úlistr   Úsplitr,   )ÚrawÚpartsÚparts   &  r   rl   Ú(WhatsAppBehaviorMixin._coerce_allow_listg   sm   € ð Š;Ü“5ˆLÜ'¨Ó,ˆÜ! #¤t×,Ò,‘´#°c³(·.±.ÀÓ2EˆÙ.3ÓI©e d´s¸4³y·±×7HÔ!”�D“	—‘Ö!©eÑIÐIùÒIs   Á!BÁ6Bc               ó    € V ^8„  d   QhRRRR/# )r   r^   údict[str, Any]r   ztuple[Optional[str], Any]r   )r   s   "r   r   r:   q   s   € ÷ 
ñ 
 ð 
ÐUnñ 
r   c                óŠ   € V F  pW@9   g   K  RV P                  V4      3u # 	  V F  pV! V4      pV'       g   K  WV3u # 	  R# )z­``(source, raw)`` by key *presence*: a config key wins (an explicit empty list stays authoritative),
then the first truthy env carrier; ``(None, None)`` when neither is set.r]   )NN)r_   )r^   Úconfig_keysÚenv_keysÚread_envÚkeyÚenvrw   s   &&&&   r   Ú_select_allowlistÚ'WhatsAppBehaviorMixin._select_allowlistp   sO   € ó ˆCØŽ|Ø §¡¨3£Ð/Ò/ñ ó ˆCÙ˜3“-ˆCß‰sØ�x’ñ ð Ðr   c               ó    € V ^8„  d   QhRRRR/# )r   r^   r|   r   r   r   )r   s   "r   r   r:   }   s   € ÷ ñ ¨.ð ÐQTñ r   c                ó<   € V P                  VRW#4      w  V n        pV# )ztRaw DM allowlist; records the winning source in ``_dm_allowlist_source`` so live DM checks keep
the same precedence.)Ú
allow_fromÚ	allowFrom)rƒ   Ú_dm_allowlist_source)rM   r^   r   r€   rw   s   &&&& r   Ú_select_dm_allowlistÚ*WhatsAppBehaviorMixin._select_dm_allowlist}   s'   € ð *.×)?Ñ)?ÀÐGbÐdlÓ)wÑ&ˆÔ! 3Øˆ
r   c               ó   € V ^8„  d   QhRR/# rg   r   )r   s   "r   r   r:   ƒ   s   € ÷ +ñ + Xñ +r   c                óè   € \        V RR4      p\        V\        4      '       d2   VR8w  d+   \        V4      pVe   V P	                  V4      # \        4       # \        V P                  ;'       g    R4      # )ul  Allowlist currently enforced for DM intake / strict DM auth. Env-seeded adapters re-read
the same key so pairing approve/revoke takes effect without restart; a removed key (sole-entry
revoke) means empty, not the construction snapshot. Config-seeded adapters keep the in-memory
set (pairing revoke purges it in place) â€” a stale env value must not broaden access.r‰   Nr]   r   )Úgetattrr`   r   rJ   rl   rs   Ú_allow_from)rM   ÚsourceÚlives   &  r   Ú_live_dm_allow_fromÚ)WhatsAppBehaviorMixin._live_dm_allow_fromƒ   si   € ô
 ˜Ð5°tÓ<ˆÜ�fœc×"Ò" v°Ô'9ô   Ó'ˆDØ48Ò4D�4×*Ñ*¨4Ó0ÐOÌ#Ë%ÐOÜ�4×#Ñ#×)Ð) rÓ*Ð*r   c               ó    € V ^8„  d   QhRRRR/# )r   ÚvaluezOptional[str]r   r   r   )r   s   "r   r   r:   ’   s   € ÷ <ñ < mð <¸ñ <r   c                	ót   € V '       g   R # \         P                  ! RR \        V 4      P                  4       4      # )r=   z	:\d+(?=@))r%   r&   r   r,   )r•   s   &r   Ú_normalize_whatsapp_idÚ,WhatsAppBehaviorMixin._normalize_whatsapp_id‘   s(   € çÙä�vŠv�l B¬¨E«
×(8Ñ(8Ó(:Ó;Ð;r   c               ó    € V ^8„  d   QhRRRR/# )r   Úchat_idr   r   rX   r   )r   s   "r   r   r:   ™   s   € ÷ Xñ X Cð X¨Dñ Xr   c                óŽ   € T ;'       g    RP                  4       P                  4       pVR8H  ;'       g    VP                  R4      # )u—   Status updates (Stories) and Channel/Newsletter broadcasts â€” never reply
(answering a Story spams the status feed; Channel posts aren't addressable).r=   zstatus@broadcast)z
@broadcastz@newsletter)r,   ra   r.   )rš   Úcids   & r   Ú_is_broadcast_chatÚ(WhatsAppBehaviorMixin._is_broadcast_chat˜   s?   € ð �}ˆ}˜"×#Ñ#Ó%×+Ñ+Ó-ˆØÐ(Ñ(×WÐW¨C¯L©LÐ9VÓ,WÐWr   c               ó    € V ^8„  d   QhRRRR/# )r   Ú	candidater   r   rX   r   )r   s   "r   r   r:   ¡   s   € ÷ 
ñ 
¨sð 
À4ñ 
r   c                óÜ   aaa€ V'       g   R# W9   d   R# ^ RI HoHo S! V 4      oS'       g   R# \        ;QJ d!    VVV3R lV 4       F  '       g   K   R# 	  R# ! VVV3R lV 4       4      # )a  Match a WhatsApp identifier against an allowlist across phone/LID forms. Inbound senders
arrive as ``<id>@lid`` while allowlists hold phone numbers (or vice versa), so resolve both
sides through the bridge's lid-mapping files via ``gateway.whatsapp_identity``.FT)Úexpand_whatsapp_aliasesÚnormalize_whatsapp_identifierc              3  ó‚   <"  € T F4  pVR 8H  ;'       g#    S! V4      S9   ;'       g    S! V4      S,          x € K6  	  R# 5i)r*   Nr   )Ú.0ÚentryÚcandidate_aliasesr¢   r£   s   & €€€r   Ú	<genexpr>ÚDWhatsAppBehaviorMixin._matches_whatsapp_allowlist.<locals>.<genexpr>­   sZ   øé € ð 
ñ $�ð �S‰L÷ Bð BÙ,¨UÓ3Ð7HÑH÷Bð Bá& uÓ-Ð0AÕAôBó $ùs   ƒ?”?§?)Úgateway.whatsapp_identityr¢   r£   Úany)r    r‡   r§   r¢   r£   s   &&@@@r   Ú_matches_whatsapp_allowlistÚ1WhatsAppBehaviorMixin._matches_whatsapp_allowlist    sg   ú€ ÷
 ÙØÔ"ÙßdÙ3°IÓ>Ðß Ùß‹sö 
ñ $ó	
�sŒsð 	
Šsð 	
ˆsö 
ñ $ó	
ó 
ð 	
r   c               ó    € V ^8„  d   QhRRRR/# )r   Útargetr   r   rX   r   )r   s   "r   r   r:   ´   s   € ÷ Añ A¨cð A°dñ Ar   c                	ó$   € V P                  W!4      # ©N)r¬   )rM   Úentriesr¯   s   &&&r   Ú_entry_matchesÚ$WhatsAppBehaviorMixin._entry_matches´   s   € Ø×/Ñ/°Ó@Ð@r   c                	óä  € V P                   P                  P                  R 4      pVfE   \        RRR7      ;'       g    RP	                  4       pV'       d    \
        P                  ! V4      pVf   . # \        V\        4      '       d   V.p\        V\        4      '       g7   \        P                  RV P                  \!        V4      P"                  4       . # . pV Ff  p\        V\        4      '       d   VP	                  4       '       g   K1   VP%                  \&        P(                  ! V\&        P*                  4      4       Kh  	  V'       d+   \        P/                  RV P                  \1        V4      4       V#   \         d¥    TP                  4        Uu. uF*  q3P	                  4       '       g   K  TP	                  4       NK,  	  Mu upi ppT;'       gM    TP                  R4       Uu. uF*  q3P	                  4       '       g   K  TP	                  4       NK,  	  Mu upi upp EL»i ; i  \&        P,                   d.   p\        P                  RT P                  YV4        Rp?EK�  Rp?ii ; i)	Úmention_patternsNÚWHATSAPP_MENTION_PATTERNSr=   rF   rr   z?[%s] whatsapp mention_patterns must be a list or string; got %sz,[%s] Invalid WhatsApp mention pattern %r: %sz*[%s] Loaded %d WhatsApp mention pattern(s))r]   r^   r_   rJ   r,   ÚjsonÚloadsÚ	ExceptionÚ
splitlinesrv   r`   r   ru   ÚloggerÚwarningÚnameÚtypeÚ__name__r   r%   ÚcompileÚ
IGNORECASEÚerrorÚinfor!   )rM   Úpatternsrw   ÚpÚcompiledr   Úexcs   &      r   Ú_compile_mention_patternsÚ/WhatsAppBehaviorMixin._compile_mention_patterns·   sÐ  € Ø—;‘;×$Ñ$×(Ñ(Ð);Ó<ˆØÒÜÐ ;ÀRÔH×NÐNÈB×UÑUÓWˆCßð\Ü#Ÿzšz¨#›�Hð
 ÒØˆIÜ�h¤×$Ò$Ø �zˆHÜ˜(¤D×)Ò)Ü�N‰NÐ\Ð^b×^gÑ^gÔimÐnvÓiw÷  jAñ  jAô  BØˆIØˆÛˆGÜ˜g¤s×+Ò+°7·=±=·?²?ÙðhØ—‘¤§
¢
¨7´B·M±MÓ BÖCñ	  ÷ Ü�K‰KÐDÀdÇiÁiÔQTÐU]ÓQ^Ô_Øˆøô+ !ô \à36·>±>Ô3CÓQÑ3C¨aÇwÁwÇy¤	 §¡¦	Ò3CùÒQ�HÐQØ'×[Ð[¸s¿y¹yÈ¼~Ó+[¹~¸!×QXÑQX×QZ¬I¨A¯G©G®Iº~ùÔ+[“Hð\ûô" —8‘8ô hÜ—‘ÐMÈtÏyÉyÐZa×gÓgûðhúsT   ÁE; Ä4H-Å;H*ÆG	Æ4G	ÇH*ÇH*Ç-HÈ	HÈ	H*È)H*È-I/É!I*É*I/c               ó    € V ^8„  d   QhRRRR/# )r   Údatar|   r   rh   r   )r   s   "r   r   r:   Õ   s   € ÷ dñ d¨.ð d¸Xñ dr   c                	ó–   € VP                  R 4      ;'       g    .  Uu0 uF  q P                  V4      ;p'       g   K  VkK!  	  up# u upi )ÚbotIds)r_   r—   )rM   rÌ   ÚcÚnids   &&  r   Ú_bot_ids_from_messageÚ+WhatsAppBehaviorMixin._bot_ids_from_messageÕ   sF   € Ø"Ÿh™h xÓ0×6Ð6°BÐ6ÓcÑ6˜×C^ÑC^Ð_`ÓCaÐ<a¸CÓ<a—�Ñ6ÑcÐcùÒcs
   žA½Ac               ó    € V ^8„  d   QhRRRR/# ©r   rÌ   r|   r   rX   r   )r   s   "r   r   r:   Ø   s   € ÷ cñ c¨^ð cÀñ cr   c                	óŽ   € V P                  VP                  R 4      4      p\        V4      ;'       d    W P                  V4      9   # )ÚquotedParticipant)r—   r_   rX   rÑ   )rM   rÌ   Úquoted_participants   && r   Ú_message_is_reply_to_botÚ.WhatsAppBehaviorMixin._message_is_reply_to_botØ   sA   € Ø!×8Ñ8¸¿¹ÐBUÓ9VÓWÐÜÐ&Ó'×bÐbÐ,>×B\ÑB\Ð]aÓBbÑ,bÐbr   c               ó    € V ^8„  d   QhRRRR/# rÔ   r   )r   s   "r   r   r:   Ü   s   € ÷ 
ñ 
¨.ð 
¸Tñ 
r   c                	óà  a€ V P                  V4      pV'       g   R # VP                  R4      ;'       g    .  Uu0 uF  q0P                  V4      ;p'       g   K  VkK!  	  ppWR,          '       d   R# \        VP                  R4      ;'       g    R4      P	                  4       o\
        ;QJ d&    V3R lR V 4        4       F  '       g   K   R# 	  R # ! V3R lR V 4        4       4      # u upi )FÚmentionedIdsTÚbodyr=   c              3  ób   <"  € T F$  pT;'       d    R V 2S9   ;'       g    VS9   x € K&  	  R# 5i©Ú@Nr   )r¥   ÚbareÚ
lower_bodys   & €r   r¨   Ú>WhatsAppBehaviorMixin._message_mentions_bot.<locals>.<genexpr>ä   s;   øé € ð 
áO�ð ×EÐE˜˜$˜�j JÑ.×DÐD°$¸*Ñ2DÔEÛOùs   ƒ/‘/¡/c              3  ón   "  € T F+  qP                  R ^4      ^ ,          P                  4       x € K-  	  R# 5irß   )rv   ra   )r¥   Úbot_ids   & r   r¨   rã   æ   s*   é € ÐOÁw¸VŸ™ c¨1Ó-¨aÕ0×6Ñ6×8Ð8Ãwùs   ‚35)rÑ   r_   r—   r   ra   r«   )rM   rÌ   Úbot_idsrÏ   rÐ   Ú	mentionedrâ   s   &&    @r   Ú_message_mentions_botÚ+WhatsAppBehaviorMixin._message_mentions_botÜ   sÔ   ø€ Ø×,Ñ,¨TÓ2ˆßÙØ#'§8¡8¨NÓ#;×#AÐ#A¸rÐ#AÓnÑ#A˜Q×NiÑNiÐjkÓNlÐGlÀsÓGl—S�SÑ#Aˆ	ÐnØ×ÔÙÜ˜Ÿ™ &Ó)×/Ð/¨RÓ0×6Ñ6Ó8ˆ
ß‹sô 
áOÁwÔOó
�sŒsð 	
Šsð 	
ˆsô 
áOÁwÔOó
ó 
ð 	
ùò	 os   ºC+ÁC+c               ó    € V ^8„  d   QhRRRR/# rÔ   r   )r   s   "r   r   r:   é   s   € ÷ Uñ U°nð UÈñ Ur   c                	ó  a€ \        VP                  R 4      ;'       g    R4      o\        ;QJ d3    V3R lV P                  ;'       g    R 4       F  '       g   K   R# 	  R# ! V3R lV P                  ;'       g    R 4       4      # )rÝ   r=   c              3  óD   <"  € T F  qP                  S4      x € K  	  R # 5ir±   )Úsearch)r¥   r   rÝ   s   & €r   r¨   ÚJWhatsAppBehaviorMixin._message_matches_mention_patterns.<locals>.<genexpr>ë   s   øé € ÐTÑ7S¨G—>‘> $×'Ð'Ó7Sùs   ƒ TFr   )r   r_   r«   Ú_mention_patterns)rM   rÌ   rÝ   s   &&@r   Ú!_message_matches_mention_patternsÚ7WhatsAppBehaviorMixin._message_matches_mention_patternsé   sk   ø€ Ü�4—8‘8˜FÓ#×)Ð) rÓ*ˆß‹sÔT°t×7MÑ7M×7SÐ7SÐQSÐ7SÓT�sŒsÐTŠsÐTˆsÔT°t×7MÑ7M×7SÐ7SÐQSÐ7SÓTÓTÐTr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r   rÌ   r|   r   r   )r   s   "r   r   r:   í   s!   € ÷ 'ñ '¨Cð '°~ð 'È#ñ 'r   c                	ó$  € V'       g   V# TpV P                  V4       FV  pVP                  R ^4      ^ ,          pV'       g   K&  \        P                  ! R \        P                  ! V4       R2RV4      pKX  	  VP                  4       ;'       g    T# )rà   z\b[,:\-]*\s*r=   )rÑ   rv   r%   r&   Úescaper,   )rM   r   rÌ   Úcleanedrå   Úbare_ids   &&&   r   Ú_clean_bot_mention_textÚ-WhatsAppBehaviorMixin._clean_bot_mention_textí   sy   € ßØˆKØˆØ×0Ñ0°Ö6ˆFØ—l‘l 3¨Ó*¨1Õ-ˆGß‰wÜŸ&š& A¤b§i¢i°Ó&8Ð%9¸Ð!FÈÈGÓT’ñ 7ð �}‰}‹×&Ð& $Ð&r   c               ó    € V ^8„  d   QhRRRR/# rÔ   r   )r   s   "r   r   r:   ÷   s   € ÷ 
ñ 
¨Nð 
¸tñ 
r   c                	óæ  € \        VP                  R 4      ;'       g    R4      pV P                  V4      '       d   R# VP                  RR4      '       gM   T P                  \        VP                  R4      ;'       g    VP                  R4      ;'       g    R4      4      # V P	                  V4      '       g   R# W P                  4       9   g   V P                  4       '       g   R# \        VP                  R4      ;'       g    R4      P                  4       P                  R4      ;'       gD    V P                  V4      ;'       g+    V P                  V4      ;'       g    V P                  V4      # )	ÚchatIdr=   FÚisGroupÚsenderIdÚfromTrÝ   Ú/)r   r_   r�   Ú_is_dm_intake_allowedÚ_is_group_allowedrn   rd   r,   r-   rØ   rè   rð   )rM   rÌ   rš   s   && r   Ú_should_process_messageÚ-WhatsAppBehaviorMixin._should_process_message÷   s,  € Ü�d—h‘h˜xÓ(×.Ð.¨BÓ/ˆà×"Ñ" 7×+Ò+ÙØ�x‰x˜	 5×)Ò)à×-Ñ-¬c°$·(±(¸:Ó2F×2`Ð2`È$Ï(É(ÐSYÓJZ×2`Ð2`Ð^`Ó.aÓbÐbØ×%Ñ% g×.Ò.Ùà×8Ñ8Ó:Ô:À$×B`ÑB`×BbÒBbÙä�—‘˜Ó ×&Ð& BÓ'×-Ñ-Ó/×:Ñ:¸3Ó?÷ <ð <Ø×,Ñ,¨TÓ2÷<ð <à×)Ñ)¨$Ó/÷<ð <ð ×5Ñ5°dÓ;ð		
r   c               ó    € V ^8„  d   QhRRRR/# r8   r   )r   s   "r   r   r:     s   € ÷ ñ  cð ¨cñ r   c                ó6  € V'       g   V# \        RV P                  V4      R4      w  r#\        RVR4      w  r$\        P                  ! RRV4      p\        P                  ! RRV4      p\        P                  ! R	RV4      p\        P                  ! R
RV4      p\        P                  ! R\        V\        P
                  R7      p\        P                  ! RRV4      pRV3RV33 F1  w  rV\        V4       F  w  rxVP                  RV V R2V4      pK  	  K3  	  V# )z„Convert markdown to WhatsApp syntax (*bold*, _italic_, ~strike~); fenced and
inline code are protected via placeholder substitution.z```[\s\S]*?```ÚFENCEz	`[^`\n]+`ÚCODEz.(?<!\*)\*(?!\s|\*)([^*\n]*?\S[^*\n]*?)\*(?!\*)z_\1_z\*\*(.+?)\*\*z*\1*z	__(.+?)__z	~~(.+?)~~z~\1~z^#{1,6}\s+(.+)$)Úflagsz\[([^\]]+)\]\(([^)]+)\)z\1 (\2)r   )r'   rA   r%   r&   r0   Ú	MULTILINEÚ	enumeraterL   )	rM   r9   ÚresultÚfencesÚcodesr   r"   ÚiÚoriginals	   &&       r   Úformat_messageÚ$WhatsAppBehaviorMixin.format_message  s  € ÷ ØˆNÜÐ 1°4×3OÑ3OÐPWÓ3XÐZaÓb‰ˆÜ˜|¨V°VÓ<‰ˆô —’ÐIÈ7ÐTZÓ[ˆÜ—’Ð(¨'°6Ó:ˆÜ—’˜ g¨vÓ6ˆÜ—’˜ g¨vÓ6ˆÜ—’Ð*¬O¸VÌ2Ï<É<ÔXˆÜ—’Ð2°JÀÓGˆØ# VÐ,¨v°u¨oÓ>‰JˆCÜ(¨Ö/‘�ØŸ™¨$¨s¨e°A°3°dÐ(;¸XÓF’ó  0ñ ?ð ˆr   )r‰   N)&rÀ   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r4   Ú__annotations__ÚALLOW_ALL_ENV_PREFIXÚsupports_code_blocksr6   r%   rÁ   r?   r>   ÚclassmethodrA   rO   rU   rd   rn   Ústaticmethodrl   rƒ   rŠ   r’   r—   r�   r¬   r³   rÉ   rÑ   rØ   rè   rð   r÷   r  r  Ú__static_attributes__r   r   r   r2   r2   5   s  ‡ ñZð #Ð˜Ó"Ø%ÐØÐà \Ð˜#Ó\à#%§:¢:Ð.KÓ#LÐ ØŸZšZÐ(^Ó_Ðàôfó ðfõ	)õXõ õið
 ôJó ðJð ô
ó ð
õõ+ð ô<ó ð<ð ôXó ðXð ô
ó ð
õ&Aòõ<dõcõ
õUõ'õ
÷*ñ r   r2   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r   !  s   € ÷ ñ  Tñ r   c                 óø  € ^ RI p ^ RIHp \        \        4      P                  4       P                  ^,          R,          R,          pV! 4       R,          R,          p VR,          P                  4        VR,          P                  4        V#   \         d     Mi ; iTP                  4       '       d   T#  TP                  P                  RRR7       T P                  Y#RR	7       T#   \         d    Tu # i ; i)
z‰Bridge directory for CLI and adapter. A read-only install tree (e.g. Docker
/opt/hermes) is mirrored to HERMES_HOME so npm install works.N)Úget_hermes_homeÚscriptszwhatsapp-bridgez.write_testT)ÚparentsÚexist_okF)Údirs_exist_ok)ÚshutilÚhermes_constantsr  r   Ú__file__Úresolver   ÚtouchÚunlinkÚOSErrorÚexistsÚparentÚmkdirÚcopytreerº   )r#  r  Úinstall_bridgeÚhermes_home_bridges       r   Úresolve_whatsapp_bridge_dirr0  !  sã   € ó Ý0Üœ(“^×+Ñ+Ó-×5Ñ5°aÕ8¸9ÕDÐGXÕX€NÙ(Ó*¨YÕ6Ð9JÕJÐðØ	˜-Õ	'×.Ñ.Ô0Ø	˜-Õ	'×/Ñ/Ô1ØÐøÜô Ùðúà× Ñ ×"Ò"Ø!Ð!ðØ×!Ñ!×'Ñ'°¸tÐ'ÔDØ�‰˜È%ˆÔPØ!Ð!øÜô ØÒðús$   Á/B ÂBÂBÂ71C) Ã)C9Ã8C9>   Ú1ÚonÚyesÚtrue)r  Ú
__future__r   r¸   ÚloggingÚosr%   Úpathlibr   Útypingr   r   r   Úgateway.platforms._sharedr   rt   r   rm   r	   rJ   Ú%gateway.platforms.access_policy_mixinr
   Ú	getLoggerrÀ   r¼   rb   r'   r0   r2   r0  r   r   r   Ú<module>r=     sj   ðñ	õ #ã Û Û 	Û 	Ý ß &Ñ &÷ñ õ Gð 
×	Ò	˜8Ó	$€â
$€õ.õôiÐ0ô i÷Xr   