+
    kHàj	É  ã                  óV  a € 0 t $ R t^ RIH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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HtHtHtHtHt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/H0t0H1t1H2t2 ^ R
I3H4t4H5t5 ^ RI6H7t7H8t8 ^ RI9H:t: ]Pv                  ! ]<4      t=Rt>Rt?Rt@RtARtBRtCRtD^tE^2tFRtGRtHRtIRtJRtK]L! 0 R‚m4      tMRtNRtORtPRtQRtRRtSRtTRƒtUR„tVR ]8P®                  R!]8P°                  R"]8P²                  R#]8P´                  R$]8P¶                  R%]8P¸                  R&]8Pº                  /t^]_PÁ                  R'4      ta]PÄ                  ! R(]PÆ                  4      R) 3]PÄ                  ! R*4      R+3]PÄ                  ! R,4      R- 3]PÄ                  ! R.4      R+3]PÄ                  ! R/4      R+3]PÄ                  ! R0]PÈ                  4      R3]PÄ                  ! R1]PÈ                  4      R233teR3]fR4&   R5 R6 ltg]D3R7 R8 llthR9 R: lti ! R; R<]PÔ                  4      tk] ! R= R>4      4       tl ! R? R@4      tmRAR…RBR†RCR‡/tnRD RE ltoRF RG ltp ! RH RI4      tqRJ RK ltrRL RM ltsRN RO lttRˆtuRP]fRQ&   RR RS ltvR‰RT RU lltwRV RW ltxRŠRY RZ lltyR[ R\ ltzR] R^ lt{R!]UR_R`3R#]VRaRb3R"]VRcRd3/t|R!ReR#RfR"RgR$Rh/t}R#]/R"]2/t~]L! 0 R‹m4      tRiRj]€3RŒR�3t� ! Rk Rl]-4      t‚Rm Rn ltƒRo Rp lt„Rq Rr lt…Rs Rt lt†Ru Rv lt‡Rw Rx ltˆRyRRzRR{RX/R| R} llt‰RŽtŠR~ R lt‹R€ R� ltŒR# )�uÃ  LINE Messaging API adapter: aiohttp webhook (signature-verified) â†’ BasePlatformAdapter.

* Reply token preferred (free, single-use, ~60s TTL), metered Push as fallback.
* Slow-LLM postback button past ``slow_response_threshold`` (45s; 0 disables): the reply
  token is burned on a Template Buttons bubble; the tap yields a fresh free token that
  delivers the cached answer (PENDING â†’ READY â†’ DELIVERED, ERROR on cancel). Mid-turn
  progress/status sends (``_interim_send`` metadata / busy-ack prefixes) bypass the cache;
  a stale or vanished mapping falls through to a live wire send (#106446).
* Three allowlists (users Uâ€¦, groups Câ€¦, rooms Râ€¦); ``LINE_ALLOW_ALL_USERS`` is dev-only.
* Media via public HTTPS only: local files served under ``/line/media/<token>/<name>``
  (allowed-roots guard); ``LINE_PUBLIC_URL`` overrides host:port behind tunnels/wildcards.
* â‰¤5 message objects per call; text chunked at 4500 chars (bubble hard limit 5000).
)ÚannotationsN)Ú	dataclass)ÚPath)ÚAnyÚCallableÚDictÚListÚOptionalÚSetÚTuple)Úquote)Út)Úget_scoped_secretÚseed_extra_from_envÚ
send_error)Úgateway_trust_envÚBasePlatformAdapterÚ
SendResultÚcache_audio_from_bytes_asyncÚcache_document_from_bytes_asyncÚcache_image_from_bytes_asyncÚcache_video_from_bytes_async)ÚMessageDeduplicatorÚcancel_task)ÚMessageEventÚMessageType)ÚPlatformz(https://api.line.me/v2/bot/message/replyz'https://api.line.me/v2/bot/message/pushz-https://api.line.me/v2/bot/chat/loading/startz<https://api-data.line.me/v2/bot/message/{message_id}/contentzhttps://api.line.me/v2/bot/infoiˆ  i”  i   iÆ!  z/line/webhookz/line/mediaÚ g     €F@z$platform.line.pending.still_thinkingz"platform.line.pending.button_labelzplatform.line.pending.deliveredz!platform.line.pending.interruptedzplatform.line.pending.expiredi  ÚtextÚimageÚvideoÚaudioÚfileÚlocationÚstickerÚŠ89504e470d0a1a0a0000000d49484452000000010000000108060000001f15c4890000000d49444154789c63000100000005000100377a7ff20000000049454e44ae426082z```[a-zA-Z0-9_+-]*\n?(.*?)```c                óB   € V P                  ^4      P                  R4      # )é   Ú
)ÚgroupÚrstrip©Úms   &ÚC/home/ubuntu/.hermes/hermes-agent/plugins/platforms/line/adapter.pyÚ<lambda>r.   ^   s   € ÈÏÉÐPQË
×HYÑHYÐZ^ÔH_ó    z	`([^`]+)`z\1z"\[([^\]]+)\]\((https?://[^\s)]+)\)c                óN   € V P                  ^4       RV P                  ^4       R2# )r'   z (Ú))r)   r+   s   &r-   r.   r.   `   s)   € ÀQÇWÁWÈQÃZÀLÐPRÐST×SZÑSZÐ[\ÓS]ÐR^Ð^_ÑB`r/   z\*\*(.+?)\*\*z#(?<!\*)\*(?!\s)(.+?)(?<!\s)\*(?!\*)z
^#{1,6}\s+z^[\s]*[-*+]\s+u   â€¢ z"tuple[tuple[re.Pattern, Any], ...]Ú_MD_STRIP_RULESc               ó    € V ^8„  d   QhRRRR/# )é   r   ÚstrÚreturn© )Úformats   "r-   Ú__annotate__r9   g   s   € ÷ ñ ¨ð °ñ r/   c                óZ   € V '       g   V # \          F  w  rVP                  W 4      p K  	  V # )uG  Strip Markdown LINE can't render; ``[label](url)`` â†’ ``label (url)`` keeps URLs
tappable (LINE auto-links bare URLs only). Code-block content is kept.

Source: PR #18153 (leepoweii) â€” adapted to keep code-block content visible (LINE users frequently want
command snippets to land as plain text, not be eaten by the fence).
)r2   Úsub)r   ÚpatternÚrepls   &  r-   Ústrip_markdown_preserving_urlsr>   g   s+   € ÷ Øˆß(‰ˆØ�{‰{˜4Ó&Šñ )à€Kr/   c               ó$   € V ^8„  d   QhRRRRRR/# )r4   r   r5   Ú	max_charsÚintr6   z	list[str]r7   )r8   s   "r-   r9   r9   u   s!   € ÷ ñ ˜ð ¨ð È)ñ r/   c                óz  a€ V '       d   \        V 4      S8:  d   V '       d   V .# . # . pT pV'       d¢   \        V4      \        8  dŽ   \        V4      S8”  d~   R Uu. uF  qCP                  V^ S4      NK  	  pp\        V3R lV 4       VR,          4      pV^ 8:  d   SpVP	                  VRV P                  4       4       W6R P                  4       pK©  V'       d(   \        V4      \        8  d   VP	                  V4       V# V'       d,   VR,          RS^,
           P                  4       R,           VR&   V# u upi )uS   Split into â‰¤5 LINE bubbles at paragraph/line/word breaks; overflow is ellipsised.c              3  óX   <"  € T F  q\        SR ,          4      8¼  g   K  Vx € K!  	  R# 5i)g      à?N)rA   )Ú.0Úcr@   s   & €r-   Ú	<genexpr>Ú!split_for_line.<locals>.<genexpr>~   s!   øé € ÐA™t˜!¬C°	¸CµÓ,@Ñ'@—A’A›tùs   ƒ* 
*Nõ   â€¦)z

r(   Ú éÿÿÿÿ)ÚlenÚLINE_MAX_MESSAGES_PER_CALLÚrfindÚnextÚappendr*   Úlstrip)r   r@   ÚchunksÚ	remainingÚsepÚcutsÚcuts   &f     r-   Úsplit_for_linerV   u   s  ø€ ç”3�t“9 	Ô)ß�ˆvÐ% 2Ð%Ø€FØ€Iß
œ˜F›Ô&@Ô@ÄSÈÃ^ÐV_ÔE_á>QÓRÑ>Q°s—‘  Q¨	Ö2Ñ>QˆÐRÜÔA™tÓAÀ4ÈÅ8ÓLˆØ�!Œ8ØˆCØ�‰�i  �o×,Ñ,Ó.Ô/Ø˜d�O×*Ñ*Ó,Š	ß”S˜“[Ô#=Ô=Ø�‰�iÔ ð €M÷ 
Ø˜B•Z  )¨a¥-Ð0×7Ñ7Ó9¸EÕAˆˆr‰
Ø€Mùò Ss   ÁD8c               ó(   € V ^8„  d   QhRRRRRRRR/# )r4   ÚbodyÚbytesÚ	signaturer5   Úchannel_secretr6   Úboolr7   )r8   s   "r-   r9   r9   Š   s.   € ÷ 
Fñ 
F ð 
F°#ð 
FÀsð 
FÈtñ 
Fr/   c                óŠ  € V'       d   V'       d   V f   R#  \         P                  ! VP                  R4      V \        P                  4      P                  4       p\        P                  ! V4      P                  R4      p\         P                  ! TP                  4       TP                  4       4      #   \         d     R# i ; i)zRVerify ``X-Line-Signature``: base64(HMAC-SHA256(secret, raw body)), constant-time.Fúutf-8)ÚhmacÚnewÚencodeÚhashlibÚsha256ÚdigestÚbase64Ú	b64encodeÚdecodeÚ	ExceptionÚcompare_digest)rX   rZ   r[   rd   Úexpecteds   &&&  r-   Úverify_line_signaturerk   Š   s‘   € çŸN¨dªlÙðÜ—’˜.×/Ñ/°Ó8¸$ÄÇÁÓO×VÑVÓXˆÜ×#Ò# FÓ+×2Ñ2°7Ó;ˆô ×Ò˜xŸ™Ó0°)×2BÑ2BÓ2DÓEÐEøô ô Úðús   ˜A(B3 Â3CÃCc                  ó*   € ] tR t^—tRtRtRtRtRtRt	R# )ÚStatezSlow-LLM postback cache states.ÚpendingÚreadyÚ	deliveredÚerrorr7   N)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚPENDINGÚREADYÚ	DELIVEREDÚERRORÚ__static_attributes__r7   r/   r-   rm   rm   —   s   † Ù)à€GØ€EØ€IØ„Er/   rm   c                  ó0   € ] tR t^ t$ R]R&   RtR]R&   RtR# )Ú_CacheEntryrm   ÚstateNr   Úpayloadr7   )rr   rs   rt   ru   Ú__annotations__r   r{   r7   r/   r-   r}   r}       s   ‡ àƒLØ€GˆS×r/   r}   c                  ór   € ] tR t^¦tRtR R ltR R ltR R ltRR	 R
 lltR R lt	R R lt
R R ltRtR# )ÚRequestCacheuƒ   In-memory cache for slow-LLM postback retrieval (PENDING â†’ READY|ERROR â†’ DELIVERED).

We keep the same model here. See #18153.
c               ó   € V ^8„  d   QhRR/# ©r4   r6   ÚNoner7   )r8   s   "r-   r9   ÚRequestCache.__annotate__¬   s   € ÷ 3ñ 3˜$ñ 3r/   c                	ó   € / V n         R # ©N©Ú_entries©Úselfs   &r-   Ú__init__ÚRequestCache.__init__¬   s	   € Ø02ˆŽr/   c               ó    € V ^8„  d   QhRRRR/# )r4   Úchat_idr5   r6   r7   )r8   s   "r-   r9   r†   ¯   s   € ÷ ñ ¨ð °ñ r/   c                	ó�   € \        \        P                  ! 4       4      p\        \        P
                  R 7      V P                  V&   V# ))r~   )r5   ÚuuidÚuuid4r}   rm   rw   rŠ   )rŒ   r�   Úrids   && r-   Úregister_pendingÚRequestCache.register_pending¯   s.   € Ü”$—*’*“,ÓˆÜ(¬u¯}©}Ô=ˆ�‰�cÑØˆ
r/   c               ó    € V ^8„  d   QhRRRR/# )r4   Ú
request_idr5   r6   zOptional[_CacheEntry]r7   )r8   s   "r-   r9   r†   ´   s   € ÷ -ñ -˜cð -Ð&;ñ -r/   c                	ó8   € V P                   P                  V4      # rˆ   )rŠ   Úget©rŒ   r˜   s   &&r-   rš   ÚRequestCache.get´   s   € Ø�}‰}× Ñ  Ó,Ð,r/   Nc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r4   r˜   r5   Úallowedz
set[State]r~   rm   r   r   r6   r…   r7   )r8   s   "r-   r9   r†   ·   s8   € ÷ Sñ S cð S°Jð SÀuð SÐWZð SÐfjñ Sr/   c                	óÈ   € V P                   P                  V4      pVeC   VP                  V9   d0   W5n        V\        P                  J d   VP
                  MTVn        R # R # R # rˆ   )rŠ   rš   r~   rm   ry   r   )rŒ   r˜   rž   r~   r   Úentrys   &&&&& r-   Ú_transitionÚRequestCache._transition·   sL   € Ø—‘×!Ñ! *Ó-ˆØÒ §¡°Ô!7ØŒKØ-2´e·o±oÓ-E˜EŸMšMÈ7ˆEŽMñ "8Ñr/   c               ó$   € V ^8„  d   QhRRRRRR/# )r4   r˜   r5   r   r   r6   r…   r7   )r8   s   "r-   r9   r†   ½   ó&   € ÷ Lñ L Cð L°#ð L¸$ñ Lr/   c                	óh   € V P                  V\        P                  0\        P                  V4       R # rˆ   )r¡   rm   rw   rx   )rŒ   r˜   r   s   &&&r-   Ú	set_readyÚRequestCache.set_ready½   ó    € Ø×Ñ˜¤e§m¡m _´e·k±kÀ7ÖKr/   c               ó$   € V ^8„  d   QhRRRRRR/# )r4   r˜   r5   Úmessager6   r…   r7   )r8   s   "r-   r9   r†   À   r¤   r/   c                	óh   € V P                  V\        P                  0\        P                  V4       R # rˆ   )r¡   rm   rw   rz   )rŒ   r˜   rª   s   &&&r-   Ú	set_errorÚRequestCache.set_errorÀ   r¨   r/   c               ó    € V ^8„  d   QhRRRR/# )r4   r˜   r5   r6   r…   r7   )r8   s   "r-   r9   r†   Ã   s   € ÷ Rñ R¨ð R°ñ Rr/   c                	ó„   € V P                  V\        P                  \        P                  0\        P                  4       R # rˆ   )r¡   rm   rx   rz   ry   r›   s   &&r-   Úmark_deliveredÚRequestCache.mark_deliveredÃ   s%   € Ø×Ñ˜¤e§k¡k´5·;±;Ð%?ÄÇÁÖQr/   r‰   rˆ   )rr   rs   rt   ru   rv   r�   r•   rš   r¡   r¦   r¬   r°   r{   r7   r/   r-   r‚   r‚   ¦   s4   † ñõ
3õõ
-÷SõLõL÷Rñ Rr/   r‚   r)   ÚroomÚuserc               ó    € V ^8„  d   QhRRRR/# )r4   Úsourceúdict[str, Any]r6   útuple[str, str]r7   )r8   s   "r-   r9   r9   Ë   s   € ÷ Nñ N˜.ð N¨_ñ Nr/   c                ó°   € \         P                  T ;'       g    / P                  RR4      4      pVf   R# V P                  V^ ,          R4      V^,          3# )z}Return ``(chat_id, chat_type)`` from a LINE event ``source`` block (user/group/room).

Source: PR #21023 (perng), unchanged.
Útyper   )r   Údm)Ú_SOURCE_KINDSrš   )rµ   Úkinds   & r-   Ú_resolve_chatr½   Ë   sN   € ô
 ×Ñ˜fŸl˜l¨×/Ñ/°¸Ó;Ó<€DØšˆ:ÐM¨F¯J©J°t¸AµwÀÓ,CÀTÈ!ÅWÐ+MÐMr/   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R/# )
r4   rµ   r¶   Ú	allow_allr\   Úuser_idsúset[str]Ú	group_idsÚroom_idsr6   r7   )r8   s   "r-   r9   r9   Ô   sD   € ÷ 	bñ 	bØð	bØ*.ð	bØ:Bð	bØOWð	bØckð	bØptñ	br/   c               óz   € V'       d   R# \        V 4      w  rV\        V4      ;'       d    VRVRVRV/V,          9   # )z4Three-list gate: users, groups, rooms.

See #18153.
Trº   r)   r²   )r½   r\   )rµ   r¿   rÀ   rÂ   rÃ   ÚsidÚ	chat_types   &$$$$  r-   Ú_allowed_for_sourcerÇ   Ô   s@   € ÷ ÙÜ" 6Ó*�N€CÜ�‹9×aÐa˜  x°¸)ÀVÈXÐ VÐW`Õ aÑaÐar/   c                  ó�   € ] tR t^àtRtRR/R R llt]R R l4       tR R	 ltR
 R lt	R R lt
RR R lltR R ltR R ltRtR# )Ú_LineClientzTThin aiohttp wrapper around the LINE Messaging API (no ``line-bot-sdk`` dependency).Útimeoutg      .@c               ó$   € V ^8„  d   QhRRRRRR/# )r4   Úchannel_access_tokenr5   rÊ   Úfloatr6   r…   r7   )r8   s   "r-   r9   Ú_LineClient.__annotate__ã   s&   € ÷ pñ p¨Sð p¸eð pÈtñ pr/   c               	ó:   € Wn         W n        R RV 2RR/V n        R# )ÚAuthorizationúBearer úContent-Typezapplication/jsonN)Ú_tokenÚ_timeoutÚ_headers)rŒ   rÌ   rÊ   s   &&$r-   r�   Ú_LineClient.__init__ã   s&   € Ø*ŒØŒØ(¨GÐ4HÐ3IÐ*JÈNÐ\nÐoˆŽr/   c               ó   € V ^8„  d   QhRR/# )r4   rÊ   rÍ   r7   )r8   s   "r-   r9   rÎ   é   s   € ÷ rñ r˜%ñ rr/   c                	ó`   € ^ RI pVP                  VP                  V R7      \        4       R7      # )é    N)Útotal)rÊ   Ú	trust_env)ÚaiohttpÚClientSessionÚClientTimeoutr   )rÊ   rÜ   s   & r-   Ú_sessionÚ_LineClient._sessionè   s-   € ãØ×$Ñ$¨W×-BÑ-BÈÐ-BÓ-QÔ]nÓ]pÐ$ÓqÐqr/   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r4   Úurlr5   Úlabelr   r¶   r6   r…   r7   )r8   s   "r-   r9   rÎ   í   s/   € ÷ Tñ T¨ð T°Cð TÀ.ð TÐUYñ Tr/   c              ƒ  	ó$  "  € V P                  V P                  4      ;_uu_4       GR j  x€L
 pVP                  WP                  VR7      ;_uu_4       GR j  x€L
 pVP                  R8¼  d>   VP                  4       G R j  x€L
 p\        RV RVP                   RVR,           24      hR R R 4      GR j  x€L
  R R R 4      GR j  x€L
  R #  L¢ Lv LO L  + GR j  x€L 
 '       g   i     L3; i L*  + GR j  x€L 
 '       g   i     R # ; i5i)N©ÚheadersÚjsoné�  zLINE rI   ú: :NéÈ   N)rß   rÔ   ÚpostrÕ   Ústatusr   ÚRuntimeError)rŒ   râ   rã   r   ÚsessionÚresprX   s   &&&&   r-   Ú_post_messagesÚ_LineClient._post_messagesí   s²   é € Ø—=‘= §¡×/×/Ô/°7Ø—|‘| C·±ÀW�|×M×MÔMÐQUØ—;‘; #Ô%Ø!%§¡£×,�DÜ&¨¨u¨g°Q°t·{±{°mÀ2ÀdÈ4ÅjÀ\Ð'RÓSÐS÷ N×M÷ 0×/Ó/ÙMá,÷ N×M×MÒMú÷ 0×/×/Ó/üsª   ‚(DªC«D®*C3ÁCÁC3Á%C	ÂCÂ)C	Â+C3Â6CÂ7C3Â;DÃC1ÃDÃC3ÃC	ÃC3ÃC.ÃCÃ
C.Ã'C.Ã)C3Ã1DÃ3D	Ã9C<Ã:
D	ÄD	Ä	Dc               ó$   € V ^8„  d   QhRRRRRR/# )r4   Úreply_tokenr5   Úmessagesúlist[dict[str, Any]]r6   r…   r7   )r8   s   "r-   r9   rÎ   ô   s'   € ÷ nñ n sð nÐ6Jð nÈtñ nr/   c              ƒ  	óX   "  € V P                  \        R RVRV/4      G Rj  x€L
  R#  L5i)ÚreplyÚ
replyTokenrô   N)rð   ÚLINE_REPLY_URL)rŒ   ró   rô   s   &&&r-   r÷   Ú_LineClient.replyô   s(   é € Ø×!Ñ!¤.°'¸LÈ+ÐWaÐckÐ;lÓm×mÔmùó   ‚*¡(¢*c               ó$   € V ^8„  d   QhRRRRRR/# )r4   r�   r5   rô   rõ   r6   r…   r7   )r8   s   "r-   r9   rÎ   ÷   s'   € ÷ `ñ ` #ð `Ð1Eð `È$ñ `r/   c              ƒ  	óX   "  € V P                  \        R RVRV/4      G Rj  x€L
  R#  L5i)ÚpushÚtorô   N)rð   ÚLINE_PUSH_URL)rŒ   r�   rô   s   &&&r-   rþ   Ú_LineClient.push÷   s'   é € Ø×!Ñ!¤-°¸$ÀÈÐU]Ð9^Ó_×_Ô_ùrû   c               ó$   € V ^8„  d   QhRRRRRR/# )r4   r�   r5   ÚsecondsrA   r6   r…   r7   )r8   s   "r-   r9   rÎ   ú   s&   € ÷ 
Cñ 
C Sð 
C°3ð 
CÀñ 
Cr/   c           
   ƒ  ó  "  € V'       d   VP                  R4      '       g   R# ^ RIp\        ^\        ^<V^,          ^,          ;'       g    ^4      4      p V P	                  R4      ;_uu_4       GRj  x€L
 pVP                  \        V P                  RVRV/R7      G Rj  x€L
  RRR4      GRj  x€L
  R#  LD L L
  + GRj  x€L 
 '       g   i     R# ; i  \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i5i)z@Loading indicator (DM only). LINE rejects this for groups/rooms.ÚUNg      @ÚchatIdÚloadingSecondsrå   z!LINE loading indicator failed: %s)Ú
startswithrÜ   ÚmaxÚminrß   rë   ÚLINE_LOADING_URLrÕ   rh   ÚloggerÚdebug)rŒ   r�   r  rÜ   Úclampedrî   Úexcs   &&&    r-   ÚloadingÚ_LineClient.loadingú   sÑ   é € ç˜g×0Ñ0°×5Ò5ÙÛÜ�aœ˜R '¨Q¥,°!Õ!3×!8Ð!8°qÓ9Ó:ˆð	CØ—}‘} S×)×)Ô)¨WØ—l‘lÔ#3¸T¿]¹]ÐRZÐ\cÐeuÐw~ÐQ�ló  A÷  Að  A÷ *×)Ó)ñ A÷ *×)×)Ó)ûäô 	CÜ�L‰LÐ<¸c×BÒBûð	Cüs¦   ‚D¢(DÁDÁC Á4B9Á5C Á8*B?Â"B;Â#B?Â'C Â2B=Â3C Â7DÂ9C Â;B?Â=C Â?C	ÃCÃ
C	ÃC	ÃC ÃDÃC ÃDÃ'DÃ=DÄDÄDc               ó    € V ^8„  d   QhRRRR/# )r4   Ú
message_idr5   r6   rY   r7   )r8   s   "r-   r9   rÎ     s   € ÷ )ñ )¨cð )°eñ )r/   c           
   ƒ  	óV  "  € V P                  R 4      ;_uu_4       GRj  x€L
 p\        P                  VR7      pVP                  VRRV P                   2/R7      ;_uu_4       GRj  x€L
 pVP
                  R8¼  d   \        RVP
                   24      hVP                  4       G Rj  x€L
 uuRRR4      GRj  x€L
  uuRRR4      GRj  x€L
  #  L² Lk L, L L  + 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)g      >@N)r  rÐ   rÑ   ©ræ   rè   zLINE content )rß   ÚLINE_CONTENT_URL_FMTr8   rš   rÓ   rì   rí   Úread)rŒ   r  rî   râ   rï   s   &&   r-   Úfetch_contentÚ_LineClient.fetch_content  sÎ   é € Ø—=‘= ×&×&Ô&¨'Ü&×-Ñ-¸Ð-ÓDˆCØ—{‘{ 3°ÀGÈDÏKÉKÈ=ÐBYÐ0Z�{×[×[Ô[Ð_cØ—;‘; #Ô%Ü&¨°t·{±{°mÐ'DÓEÐEØ!ŸY™Y›[×(÷ \×[Ñ[÷ '×&Ô&á[ñ )ñ \ñ 'ç[×[×[Ð[ú÷ '×&×&×&×&Ô&üs½   ‚D) C¡D)¤ADÁ)CÁ*DÁ-=C	Â*CÂ+C	Â.DÂ;C
Â<DÃ D)ÃCÃD)ÃDÃC	ÃDÃD)ÃC6Ã#C&Ã$
C6Ã/C6Ã1DÃ9D)ÄDÄD)ÄD&	ÄDÄ
D&	ÄD&	Ä 	D)c               ó   € V ^8„  d   QhRR/# )r4   r6   úOptional[str]r7   )r8   s   "r-   r9   rÎ     s   € ÷ ñ  }ñ r/   c           
   ƒ  óH  "  € ^ RI p V P                  R4      ;_uu_4       GRj  x€L
 pVP                  \        V P                  R7      ;_uu_4       GRj  x€L
 pVP
                  R8¼  d   RM&VP                  4       G Rj  x€L
 P                  R4      uuRRR4      GRj  x€L
  uuRRR4      GRj  x€L
  #  L” Ld L; L L  + 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  \         d     R# i ; i5i)z?Fetch this channel's own userId so we can filter self-messages.Ng      $@r  rè   ÚuserId)rÜ   rß   rš   ÚLINE_BOT_INFO_URLrÕ   rì   rç   rh   )rŒ   rÜ   rî   rï   s   &   r-   Úget_bot_user_idÚ_LineClient.get_bot_user_id  sÀ   é € ãð	Ø—}‘} T×*×*Ô*¨gØ"Ÿ;™;Ô'8À$Ç-Á-˜;×P×PÔPÐTXØ#'§;¡;°#Ô#5™4À$Ç)Á)Ã+×<M×;RÑ;RÐS[Ó;\÷ Q×PÑP÷ +×*Ô*ÙPÙ<Mñ Qñ +ßP×P×PÐPú÷ +×*×*×*×*Ô*ûô ô 	Úð	üs÷   ‚D"ˆD ¥B:¦D ©.C3ÁB<ÁC3Á'C	ÂB>ÂC	ÂC3Â"C 
Â#C3Â'D Â4CÂ5D Â9D"Â:D Â<C3Â>C	Ã C3ÃD ÃCÃ
CÃ
CÃCÃC3Ã D Ã+C.Ã,D Ã1D"Ã3D	Ã9C<Ã:
D	ÄD	ÄD ÄD"ÄD ÄDÄD"ÄDÄD")rÕ   rÔ   rÓ   N)é<   )rr   rs   rt   ru   rv   r�   Ústaticmethodrß   rð   r÷   rþ   r  r  r  r{   r7   r/   r-   rÉ   rÉ   à   sP   † Ù^ðpÀd÷ pð
 ôró ðrõTõnõ`÷
Cõ)÷ñ r/   rÉ   c               ó    € V ^8„  d   QhRRRR/# )r4   r   r5   r6   r¶   r7   )r8   s   "r-   r9   r9     s   € ÷ ñ ˜ð  ñ r/   c                óf   € RRR\        V 4      \        8:  d   V /# V R\        ^,
           R,           /# )z;Build a LINE text message object, capped to per-bubble max.r¹   r   NrH   )rK   ÚLINE_PER_BUBBLE_CHARS)r   s   &r-   Ú_text_messager&    s;   € à�F˜F¬C°«IÔ9NÔ,N DÐ~Ð~ÐTXÐYtÔ[pÐstÕ[tÐTuÐx}ÕT}Ð~Ð~r/   c               ó    € V ^8„  d   QhRRRR/# )r4   Úcontentr5   r6   rõ   r7   )r8   s   "r-   r9   r9     s   € ÷ Kñ K˜Cð KÐ$8ñ Kr/   c                óx   € \        \        V 4      4      pV Uu. uF  p\        V4      NK  	  upR\         # u upi )uG   Markdown-strip, chunk and cap ``content`` into â‰¤5 LINE text messages.N)rV   r>   r&  rL   )r(  rQ   rE   s   &  r-   Ú_text_messagesr*    s8   € äÔ:¸7ÓCÓD€FÙ&,Ó-¡f ŒM˜!Ö¡fÑ-Ð.IÔ/IÐJÐJùÒ-s   ™7c               ó(   € V ^8„  d   QhRRRRRRRR/# )r4   r   r5   Úbutton_labelr˜   r6   r¶   r7   )r8   s   "r-   r9   r9   $  s/   € ÷ yñ y¨ð y¸3ð yÈCð yÐTbñ yr/   c                ó€  € \        V 4      ^ 8:  d   T MV R,          R,           p\        V 4      R8:  d   T MV R,          R,           pRRRVR,          ;'       g    \        \        4      R,          R	\        P                  ! R
RRV/4      RVR,          ;'       g    \        \        4      R,          /pRRRVRRRRVRV.//# )u­   Slow-LLM postback bubble. Template Buttons stay tappable from history (Quick
Reply chips vanish on the next message). LINE limits: text â‰¤160, altText â‰¤400.

See #18153.
:Né�   Nz...rè   :Ni�  Nr¹   Úpostbackrã   :Né   NÚdataÚactionÚshow_responser˜   ÚdisplayText:Ni,  NÚtemplateÚaltTextÚbuttonsr   Úactions)rK   r   ÚDEFAULT_BUTTON_LABEL_KEYrç   Údumps)r   r,  r˜   Ú	truncatedÚaltr2  s   &&&   r-   Úbuild_postback_button_messager=  $  sÁ   € ô ˜D›	 SÔ(‘¨d°4­j¸5Õ.@€IÜ�d“)˜sÔ"‰$¨¨T­
°UÕ(:€Cà�
Ø�˜cÕ"×FÐF¤aÔ(@Ó&AÀ#Õ&FØ”—
’
˜H o°|ÀZÐPÓQØ�| DÕ)×NÐN¬QÔ/GÓ-HÈÕ-Nð	P€Fð
 �J 	¨3°
¸VÀYÐPVÐXaÐclÐouÐnvÐ<wÐxÐxr/   ztuple[str, ...]Ú_SYSTEM_BYPASS_PREFIXESc               ó    € V ^8„  d   QhRRRR/# )r4   r(  r5   r6   r\   r7   )r8   s   "r-   r9   r9   ;  s   € ÷ Yñ Y˜sð Y tñ Yr/   c                ó®   a € \        S 4      ;'       dC    \        ;QJ d#    V 3R  l\         4       F  '       g   K   R# 	  R# ! V 3R  l\         4       4      # )c              3  óF   <"  € T F  pSP                  V4      x € K  	  R # 5irˆ   )r  )rD   Úpr(  s   & €r-   rF   Ú$_is_system_bypass.<locals>.<genexpr><  s!   øé € Ð XÑ@W¸1 ×!3Ñ!3°A×!6Ð!6Ó@Wùó   ƒ!TF)r\   Úanyr>  )r(  s   fr-   Ú_is_system_bypassrF  ;  s:   ø€ Ü�‹=×XÐXŸS›SÔ XÕ@WÓ XŸSœSÐXšSÐX˜SÔ XÕ@WÓ XÓXÐXr/   c               ó$   € V ^8„  d   QhRRRRRR/# )r4   r(  r5   ÚmetadataúOptional[dict[str, Any]]r6   r\   r7   )r8   s   "r-   r9   r9   ?  s#   € ÷ 
&ñ 
&˜cð 
&Ð-Eð 
&ÐQUñ 
&r/   c                ó^   € T;'       g    / P                  R4      '       d   R# \        V 4      # )a_  True for mid-turn progress/status sends that must not become the cached answer.

Purpose-first: the gateway stamps every mid-turn send with ``_interim_send`` metadata
(``gateway.run._interim_metadata``), which survives to the adapter and is stripped
before the wire. The text prefixes remain a fallback for callers that pass no
metadata. See #106446.
Ú_interim_sendT)rš   rF  )r(  rH  s   &&r-   Ú_is_interim_sendrL  ?  s)   € ð 	�ˆ�B×Ñ˜O×,Ò,ÙÜ˜WÓ%Ð%r/   c               ó    € V ^8„  d   QhRRRR/# )r4   Úvaluer5   r6   rÁ   r7   )r8   s   "r-   r9   r9   L  s   € ÷ Fñ F�Cð F˜Hñ Fr/   c                ó¬   € T ;'       g    R P                  R4       Uu0 uF*  qP                  4       '       g   K  VP                  4       kK,  	  up# u upi )r   Ú,)ÚsplitÚstrip)rN  Úxs   & r-   Ú_csv_setrT  L  s;   € Ø %§ ¨×2Ñ2°3Ô7ÓEÑ7˜!¿7¹7¿9ŒIˆA�G‰GŽIÑ7ÑEÐEùÒEs
   žAºAFc               ó$   € V ^8„  d   QhRRRRRR/# )r4   Únamer5   Údefaultr\   r6   r7   )r8   s   "r-   r9   r9   P  s&   € ÷ Uñ U�cð U Dð U°Tñ Ur/   c                óf   € \        V 4      pVf   V# VP                  4       P                  4       R9   # )N>   Ú1ÚonÚyesÚtrue)Ú_get_scoped_secretrR  Úlower)rV  rW  Úvs   && r-   Ú_truthy_envr`  P  s.   € ä˜4Ó €AØ’iˆ7ÐT Q§W¡W£Y§_¡_Ó%6Ð:TÑ%TÐTr/   c               ó   € V ^8„  d   QhRR/# )r4   r6   r·   r7   )r8   s   "r-   r9   r9   V  s   € ÷ 
tñ 
t˜Oñ 
tr/   c                óh   a€ \        V R/ 4      ;'       g    / oR V3R llpV! RR4      V! RR4      3# )zVReturn ``(channel_access_token, channel_secret)`` from scoped secrets, then ``extra``.Úextrac               ó$   € V ^8„  d   QhRRRRRR/# )r4   Úenvr5   Úkeyr6   r7   )r8   s   "r-   r9   Ú"_credentials.<locals>.__annotate__Z  s!   € ÷ ?ñ ?�#ð ?˜Cð ? Cñ ?r/   c                óœ   <€ \        V 4      ;'       g    SP                  V4      p\        V\        4      '       d   VP	                  4       # R # ©r   )r]  rš   Ú
isinstancer5   rR  )re  rf  rN  rc  s   && €r-   r  Ú_credentials.<locals>.readZ  s<   ø€ ô # 3Ó'×9Ð9¨5¯9©9°S«>ˆÜ *¨5´#× 6Ò 6ˆu�{‰{‹}Ð>¸BÐ>r/   ÚLINE_CHANNEL_ACCESS_TOKENrÌ   ÚLINE_CHANNEL_SECRETr[   )Úgetattr)Úconfigr  rc  s   & @r-   Ú_credentialsrp  V  sB   ø€ ä�F˜G RÓ(×.Ð.¨B€E÷?ð ?ñ Ð+Ð-CÓDÁdÐK`ÐbrÓFsÐsÐsr/   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r4   ÚcastzCallable[[Any], Any]rN  r   rW  r6   r7   )r8   s   "r-   r9   r9   c  s)   € ÷ ñ Ð&ð ¨sð ¸Sð ÀSñ r/   c                óF   €  V ! V4      #   \         \        3 d    Tu # i ; irˆ   )Ú	TypeErrorÚ
ValueError)rr  rN  rW  s   &&&r-   Ú_coercerv  c  s*   € ðÙ�E‹{ÐøÜ”zÐ"ô ØŠðús   ‚
 Š Ÿ zimage exceeds 10 MB LINE limitz\LINE_PUBLIC_URL must be set to send images (LINE only accepts publicly reachable HTTPS URLs)zaudio exceeds 200 MB LINE limitz)LINE_PUBLIC_URL must be set to send audiozvideo exceeds 200 MB LINE limitz)LINE_PUBLIC_URL must be set to send videoz.jpgz.m4az.mp4ú.binÚ	LINE_PORTÚportc                  óÌ  a € ] tR tRt$ RtRtR]R&   V 3R ltRR/R	 R
 lltRR/R R llt	R R lt
R R ltR R ltR R ltR R ltR R ltRR/R R lltRFR R lltR  R! ltR" R# ltRGR$ R% lltR& R' ltR( R) ltR* V 3R+ lltR, V 3R- lltR.R/R/ R0 lltR1 R2 ltR3 R4 ltR5 R6 ltR7 R8 ltR9 R: ltRFR; R< lltRHR= R> llt RFR? R@ llt!RARRBR/RC RD llt"REt#V ;t$# )IÚLineAdapteriz  u_   LINE Messaging API gateway adapter (no message editing â†’ REQUIRES_EDIT_FINALIZE stays False).Tr\   Úserves_profile_prefixc                	óf  <a	€ \         S
V `  V\        R 4      R7       \        VR/ 4      ;'       g    / o	R)R V	3R lllpR V	3R llp\	        V4      w  V n        V n        V! RR	\        4      ;'       g    \        V n        \        \        V! R
R\        4      \        4      V n        S	P                  R\        4      V n        V! RR4      ;'       g    RP!                  R4      V n        \%        R\'        S	P                  RR4      4      4      V n        V! RR4      V n        V! RR4      V n        V! RR4      V n        V! RR\0        4      p\        \2        V\0        4      V n        RR\6        3RR\8        3RR \:        3R!R"\<        3R#R$\>        33 F"  w  rgp\A        WV! Wv\C        V4      4      4       K$  	  R%V n"        R%;V n#        ;V n$        V n%        / V n&        \O        4       V n(        \S        R&\3        R'4      R(7      V n*        R%V n+        / V n,        \[        4       V n.        \^        V n0        / V n1        R%# )*Úline)ro  Úplatformrc  r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r4   re  r5   rf  rW  r   r6   r7   )r8   s   "r-   r9   Ú*LineAdapter.__init__.<locals>.__annotate__ƒ  s.   € ÷ 	Fñ 	F˜ð 	F #ð 	F°ð 	F¸Sñ 	Fr/   c                óL   <€ \        V 4      ;'       g    SP                  W4      # rˆ   )r]  rš   )re  rf  rW  rc  s   &&&€r-   Úenv_orÚ$LineAdapter.__init__.<locals>.env_orƒ  s   ø€ Ü% cÓ*×EÐE¨e¯i©i¸Ó.EÐEr/   c               ó$   € V ^8„  d   QhRRRRRR/# )r4   re  r5   rf  r6   rÁ   r7   )r8   s   "r-   r9   r�  †  s&   € ÷ 	Sñ 	S˜3ð 	S Sð 	S¨Xñ 	Sr/   c                ón   <€ \        \        V R 4      4      \        SP                  V. 4      4      ,          # ri  )rT  r]  Úsetrš   )re  rf  rc  s   &&€r-   Ú	allowlistÚ'LineAdapter.__init__.<locals>.allowlist†  s+   ø€ äÔ.¨s°BÓ7Ó8¼3¸u¿y¹yÈÈbÓ?QÓ;RÕRÐRr/   Ú	LINE_HOSTÚhostrx  ry  Úwebhook_pathÚLINE_PUBLIC_URLÚ
public_urlÚ/ÚLINE_ALLOW_ALL_USERSÚallow_all_usersFÚLINE_ALLOWED_USERSÚallowed_usersÚLINE_ALLOWED_GROUPSÚallowed_groupsÚLINE_ALLOWED_ROOMSÚallowed_roomsÚLINE_SLOW_RESPONSE_THRESHOLDÚslow_response_thresholdÚpending_textÚLINE_PENDING_TEXTr,  ÚLINE_BUTTON_LABELÚdelivered_textÚLINE_DELIVERED_TEXTÚinterrupted_textÚLINE_INTERRUPTED_TEXTÚexpired_textÚLINE_EXPIRED_TEXTNéè  Úinf)Úmax_sizeÚttl_secondsri  )2Úsuperr�   r   rn  rp  rÌ   r[   ÚDEFAULT_HOSTÚwebhook_hostrv  rA   ÚDEFAULT_WEBHOOK_PORTÚwebhook_portrš   ÚDEFAULT_WEBHOOK_PATHrŒ  r*   Úpublic_base_urlr`  r\   r¿   r“  r•  r—  ÚDEFAULT_SLOW_RESPONSE_THRESHOLDrÍ   r™  ÚDEFAULT_PENDING_REPLY_TEXT_KEYr9  ÚDEFAULT_DELIVERED_TEXT_KEYÚDEFAULT_INTERRUPTED_TEXT_KEYÚDEFAULT_EXPIRED_TEXT_KEYÚsetattrr   Ú_clientÚ_appÚ_runnerÚ_siteÚ_reply_tokensr‚   Ú_cacher   Ú_dedupÚ_bot_user_idÚ_media_tokensr‡  Ú_media_temp_pathsÚMEDIA_TOKEN_TTL_SECONDSÚ
_media_ttlÚ_pending_buttons)rŒ   ro  Úkwargsrƒ  rˆ  Ú	thresholdÚattrre  Údefault_keyrc  Ú	__class__s   &&,      @€r-   r�   ÚLineAdapter.__init__  s  ù€ Ü‰Ñ ´¸&Ó1AÐÔBÜ˜ ¨Ó,×2Ð2°ˆ÷	Fò 	F÷	Sð 	Sô :FÀfÓ9MÑ6ˆÔ! 4Ô#6á" ;°¼ÓE×UÐUÌˆÔÜ#¤C©°¸VÔEYÓ)ZÔ\pÓqˆÔØ!ŸI™I nÔ6JÓKˆÔá &Ð'8¸,Ó G× MÐ MÈ2×UÑUÐVYÓZˆÔÜ$Ð%;¼TÀ%Ç)Á)ÐL]Ð_dÓBeÓ=fÓgˆŒÙ&Ð';¸_ÓMˆÔÙ'Ð(=Ð?OÓPˆÔÙ&Ð';¸_ÓMˆÔáÐ9Ð;TÔVuÓvˆ	Ü'.¬u°iÔA`Ó'aˆÔ$àÐ0Ô2PÐQØÐ0Ô2JÐKØÐ4Ô6PÐQØÐ!8Ô:VÐWØÐ0Ô2JÐKó'MÑ"ˆD�{ô �D¡ s´!°K³.Ó AÖBñ'Mð /3ˆŒØ04Ð4ˆŒ	Ð4�D”L 4¤:Ø;=ˆÔÜ"“nˆŒä)°4ÄUÈ5Ã\ÔRˆŒØ+/ˆÔØ;=ˆÔÜ+.«5ˆÔÜ1ˆŒØ02ˆÖr/   Ú	retryableFc               ó(   € V ^8„  d   QhRRRRRRRR/# )r4   Úcoder5   ÚdetailrÇ  r\   r6   r7   )r8   s   "r-   r9   ÚLineAdapter.__annotate__¬  s(   € ÷ ñ ˜#ð  sð ¸$ð È4ñ r/   c               	ó,   € V P                  WVR 7       R# )©rÇ  F)Ú_set_fatal_error)rŒ   rÉ  rÊ  rÇ  s   &&&$r-   Ú_failÚLineAdapter._fail¬  s   € Ø×Ñ˜d°iÐÔ@Ùr/   Úis_reconnectc               ó    € V ^8„  d   QhRRRR/# )r4   rÑ  r\   r6   r7   )r8   s   "r-   r9   rË  °  s   € ÷ -ñ -¨Tð -¸dñ -r/   c          
   ƒ  	ó´  "  € V P                   '       d   V P                  '       g   V P                  R R4      # \        P                  ! V P                   P                  4       4      P                  4       R,          pV P                  RVR4      '       g   R# \        V P                   4      V n	         V P                  P                  4       G Rj  x€L
 V n         ^ RIHp TP%                  \&        R7      T n        T P(                  P*                  P-                  T P.                  T P0                  4       T P(                  P*                  P3                  T P.                   R2T P4                  4       T P(                  P*                  P3                  \6         R2T P8                  4       T P;                  T P(                  4       ^ RIHp  T! Y P(                  T P@                  T PB                  T P.                  \D        PF                  R8X  d   RMRR7      G Rj  x€L
 T n$        T PM                  4        T PH                  ed   \        PO                  RT P@                  ;'       g    RT PB                  T P.                  T PP                  '       d   RT PP                   R2MR4       R#  ELØ  \         d)   p\        P                  RT4       RT n         Rp?ELÿRp?ii ; i  \"         d    T P                  R	R
4      u # i ; i Lè  \J         dF   pT P                  RRT P@                  ;'       g    R RT PB                   RT 2RR7      u Rp?# Rp?ii ; i5i)Úconfig_missingz=LINE_CHANNEL_ACCESS_TOKEN and LINE_CHANNEL_SECRET must be set:Né   Nr~  zLINE channelFNz LINE: get_bot_user_id failed: %s©ÚwebÚmissing_depuO   aiohttp is required for the LINE adapter â€” install with `pip install aiohttp`)Úclient_max_sizez/healthz/{token}/{filename})Úbind_listenerÚdarwin)Úreuse_addressÚbind_failedzCould not bind LINE webhook on zall IPv4+IPv6 interfacesÚ:ré   TrÍ  z$LINE: webhook listening on %s:%s%s%sz* (all interfaces, IPv4+IPv6)z
 (public: r1   r   ))rÌ   r[   rÏ  rb   rc   ra   Ú	hexdigestÚ_acquire_platform_lockrÉ   r´  r  r»  rh   r  r  rÜ   r×  ÚImportErrorÚApplicationÚWEBHOOK_BODY_MAX_BYTESrµ  ÚrouterÚadd_postrŒ  Ú_handle_webhookÚadd_getÚ_handle_healthÚDEFAULT_MEDIA_PATH_PREFIXÚ_handle_mediaÚ_wire_plugin_handlersÚ gateway.platforms.shared_ingressrÚ  r©  r«  Úsysr  r¶  ÚOSErrorÚ_mark_connectedÚinfor­  )rŒ   rÑ  Útok_hashr  r×  rÚ  s   &$    r-   ÚconnectÚLineAdapter.connect°  sÈ  é € Ø×(×(Ð(°×0C×0CÐ0CØ—:‘:Ð.Ð0oÓpÐpä—>’> $×";Ñ";×"BÑ"BÓ"DÓE×OÑOÓQÐRUÕVˆØ×*Ñ*¨6°8¸^×LÒLÙÜ" 4×#<Ñ#<Ó=ˆŒð	%Ø&*§l¡l×&BÑ&BÓ&D× DˆDÔð	@Ý#ð —O‘OÔ4J�OÓKˆŒ	Ø�	‰	×Ñ×!Ñ! $×"3Ñ"3°T×5IÑ5IÔJØ�	‰	×Ñ× Ñ  D×$5Ñ$5Ð#6°gÐ!>À×@SÑ@SÔTØ�	‰	×Ñ× Ñ Ô$=Ð#>Ð>UÐ!VÐX\×XjÑXjÔkà×"Ñ" 4§9¡9Ô-ÝBð	 ñ "/Ø—i‘i ×!2Ñ!2°D×4EÑ4EÀt×GXÑGXÜ'*§|¡|°xÔ'?™eÀTô"K÷ KˆDŒLð 	×ÑÔØ�<‰<Ò#Ü�K‰KØ6Ø×!Ñ!×DÐDÐ%DØ×!Ñ!Ø×!Ñ!Ø8<×8L×8LÐ8L�*˜T×1Ñ1Ð2°!Ñ4ÐRTôVñ òI !EøÜô 	%Ü�L‰LÐ;¸SÔAØ $ˆD×Òûð	%ûô
 ô 	@Ø—:‘:˜mÐ-~ÓÒð	@úñKøô ô 	 Ø—:‘:ØØ1°$×2CÑ2C×2aÐ2aÐGaÐ1bÐbcØ×$Ñ$Ð% R¨ uð.àð	 ó  õ  ûð	 üs¼   ‚$M§A-MÂMÂ2J* ÃJ'Ã	J* ÃK  Ã C*MÇAL ÈLÈ	L È$A MÉ%)MÊMÊ'J* Ê*KÊ5KËMËKËMË L Ë=MË?L Ì MÌL ÌMÌ:MÍ
MÍMÍMÍMc               ó   € V ^8„  d   QhRR/# r„   r7   )r8   s   "r-   r9   rË  ß  s   € ÷ *ñ * $ñ *r/   c              ƒ  	ó�  "  € V P                  4        R Fe  w  r\        W4      pVf   K  \        P                  ! \        4      ;_uu_ 4        \        W24      ! 4       G Rj  x€L
  RRR4       \        WR4       Kg  	  RV n        \        V P                  4       F  p\        V4       K  	  V P                  P                  4        V P                  P                  4        \        P                  ! \        4      ;_uu_ 4        V P                  4        RRR4       R#  L»  + '       g   i     LÁ; i  + '       g   i     R# ; i5i)r·  N))r·  Ústop)r¶  Úcleanup)Ú_mark_disconnectedrn  Ú
contextlibÚsuppressrh   r³  rµ  Úlistr½  Ú_unlink_quietlyÚclearr¼  Ú_release_platform_lock)rŒ   rÃ  ÚmethodÚobjÚpaths   &    r-   Ú
disconnectÚLineAdapter.disconnectß  sæ   é € Ø×ÑÔ!ÛG‰LˆDÜ˜$Ó%ˆCØŒÜ×(Ò(¬×3Õ3Ü! #Ô.Ó0×0Ð0÷ 4ä˜ DÖ)ñ Hð ˆŒ	Ü˜×/Ñ/Ö0ˆDÜ˜DÖ!ñ 1à×Ñ×$Ñ$Ô&Ø×Ñ× Ñ Ô"Ü× Ò ¤×+Õ+Ø×'Ñ'Ô)÷ ,Ñ+ñ 1÷ 4×3ú÷ ,×+Ð+üsM   ‚$E«"EÁDÁ!D
Á"DÁ&BEÄD2Ä
EÄDÄD/Ä*EÄ2E	Ä=	Ec               ó   € V ^8„  d   QhRR/# ©r4   r6   r   r7   )r8   s   "r-   r9   rË  ï  s   € ÷ Gñ G¨sñ Gr/   c              ƒ  	ó@   "  € ^ RI Hp VP                  RRRR/4      # 5i)rÙ   rÖ  rì   Úokr  r~  )rÜ   r×  Újson_response)rŒ   Úrequestr×  s   && r-   rè  ÚLineAdapter._handle_healthï  s"   é € ÝØ× Ñ  (¨D°*¸fÐ!EÓFÐFùs   ‚c               ó   € V ^8„  d   QhRR/# r  r7   )r8   s   "r-   r9   rË  ó  s   € ÷ 3ñ 3°ñ 3r/   c              ƒ  	óT  "  € ^ RI Hp  VP                  4       G Rj  x€L
 p\        T4      \        8”  d   TP                  RRR7      # \        Y1P                  P                  R	R
4      T P                  4      '       g   TP                  RRR7      #  \        P                  ! TP                  R4      4      pTP                  R. 4      ;'       g    .  F  p T P%                  T4      G Rj  x€L
  K  	  TP                  ^ÈRR7      #  Lê  \         d4   p\        P                  RT4       TP                  RRR7      u Rp?# Rp?ii ; i  \         \        P"                  3 d    TP                  RRR7      u # i ; i L’  \         d    \        P'                  R4        KÐ  i ; i5i)rÙ   rÖ  NzLINE: read failed: %srè   zbad request©rì   r   i�  zpayload too largezX-Line-Signaturer   i‘  zinvalid signaturer^   zbad jsonÚeventszLINE: dispatch_event failedr  )rÜ   r×  r  rh   r  r  ÚResponserK   rã  rk   ræ   rš   r[   rç   Úloadsrg   ÚUnicodeDecodeErrorÚJSONDecodeErrorÚ_dispatch_eventÚ	exception)rŒ   r	  r×  rX   r  r   Úevents   &&     r-   ræ  ÚLineAdapter._handle_webhookó  sr  é € Ýð	@Ø Ÿ™›×'ˆDô ˆt‹9Ô-Ô-Ø—<‘< sÐ1D�<ÓEÐEÜ$ T¯?©?×+>Ñ+>Ð?QÐSUÓ+VÐX\×XkÑXk×lÒlØ—<‘< sÐ1D�<ÓEÐEð	=Ü—j’j §¡¨WÓ!5Ó6ˆGð —[‘[ ¨2Ó.×4Ð4°"Ò4ˆEð@Ø×*Ñ*¨5Ó1×1Ò1ñ 5ð
 �|‰| 3¨Tˆ|Ó2Ð2ñ# (øÜô 	@Ü�L‰LÐ0°#Ô6Ø—<‘< s°�<Ó?Õ?ûð	@ûô #¤D×$8Ñ$8Ð9ô 	=Ø—<‘< s°�<Ó<Ò<ð	=úñ 2øÜô @Ü× Ñ Ð!>×?ð@üs¤   ‚F(ŠD
 �DžD
 ¢A0F(Â%E Â8F(ÃF(ÃFÃ,E?Ã-FÃ1F(ÄD
 Ä
EÄ(EÄ=EÄ>F(ÅEÅF(Å.E<Å9F(Å;E<Å<F(Å?FÆ F%Æ!F(Æ$F%Æ%F(c               ó    € V ^8„  d   QhRRRR/# ©r4   r  r¶   r6   r…   r7   )r8   s   "r-   r9   rË  	  s   € ÷ Eñ E¨>ð E¸dñ Er/   c              ƒ  	ó6  "  € VP                  R 4      pVP                  R4      ;'       g    / pVP                  RR4      ;'       g    RpV'       d:   V P                  P                  V4      '       d   \        P	                  RV4       R# V P
                  '       d$   VP                  RR4      V P
                  8X  d   R# \        W0P                  V P                  V P                  V P                  R7      '       g   \        P                  RV4       R# VR	8X  d   V P                  V4      G Rj  x€L
  R# VR
8X  d   V P                  V4      G Rj  x€L
  R# V\        9   d   \        P                  RW#4       R# \        P	                  RV4       R#  Lc LC5i)r¹   rµ   ÚwebhookEventIdr   z)LINE: ignoring duplicate webhook event %sNr  )r¿   rÀ   rÂ   rÃ   z&LINE: rejecting unauthorized source %srª   r/  z LINE: lifecycle event %s from %szLINE: ignoring event type %r)rš   rº  Úis_duplicater  r  r»  rÇ   r¿   r“  r•  r—  rð  Ú_handle_message_eventÚ_handle_postback_eventÚ_LIFECYCLE_EVENTS)rŒ   r  Ú
event_typerµ   Úwebhook_event_ids   &&   r-   r  ÚLineAdapter._dispatch_event	  s<  é € Ø—Y‘Y˜vÓ&ˆ
Ø—‘˜8Ó$×*Ð*¨ˆØ Ÿ9™9Ð%5°rÓ:×@Ð@¸bÐß §¡× 8Ñ 8Ð9I× JÒ JÜ�L‰LÐDÐFVÔWÙØ××Ð §¡¨H°bÓ!9¸T×=NÑ=NÔ!NÙÜ" 6·^±^Èd×N`ÑN`Ø-1×-@Ñ-@È4×K]ÑK]÷_ó _ä�K‰KÐ@À&ÔIÙØ˜Ô"Ø×,Ñ,¨UÓ3×3Ò3Ø˜:Ô%Ø×-Ñ-¨eÓ4×4Ò4ØÔ,Ô,Ü�K‰KÐ:¸JÖOä�L‰LÐ7¸ÖDñ 4á4ùs>   ‚AFÁ
FÁ FÁ4)FÂBFÄ1FÄ2!FÅFÅAFÆFc               ó    € V ^8„  d   QhRRRR/# r  r7   )r8   s   "r-   r9   rË    s   € ÷  gñ  g°ð  gÀDñ  gr/   c              ƒ  	ó&  "  € VP                  R 4      ;'       g    / pVP                  RR4      VP                  RR4      rCVP                  RR4      pVP                  R4      ;'       g    / p\        V4      w  rxVP                  RR4      ;'       g    Tp	V'       d8   V'       d0   V\        P                  ! 4       \        ,           3V P                  V&   . p
. pVR8X  d   VP                  RR4      ;'       g    RpMæV\
        9   dZ   T P                  YCVP                  R4      ;'       g    VP                  R	4      R
7      G Rj  x€L
 w  rÞV'       d   V.V.rºRV R2pM‚VR8X  d7   VP                  R4      '       d   RRP                  VR,          4       R2MRpMEVR8X  d9   RVP                  RR4       RVP                  RR4       R2P                  4       pMRV R2pVR8X  dB   V P                  '       d0   \        P                  ! V P                  P                  V4      4       V P                  WxW™VVR7      pV P                  \        V\         P                  V\"        P$                  4      VWW«R7      4      G Rj  x€L
  R#  ELE L	5i)rª   r¹   r   Úidrø   rµ   r  r   ÚfileNameÚ	file_name)ÚfilenameNÚ[Ú]r$   Úkeywordsz
[sticker: z, z	[sticker]r#   z[location: ÚtitlerI   Úaddressz[unsupported message type: rº   )r�   rÆ   Úuser_idÚ	user_nameÚ	chat_namer  )r   Úmessage_typerµ   Úraw_messager  Ú
media_urlsÚmedia_types)rš   r½   ÚtimeÚLINE_REPLY_TOKEN_TTL_SECONDSr¸  Ú_INBOUND_MEDIA_EXTÚ_download_mediaÚjoinrR  r´  ÚasyncioÚcreate_taskr  Úbuild_sourceÚhandle_messager   Ú_LINE_MESSAGE_TYPESr   ÚTEXT)rŒ   r  ÚmsgÚmsg_typer  ró   rµ   r�   rÆ   r-  r2  r3  r   Ú
local_pathÚ
media_typeÚ
source_objs   &&              r-   r  Ú!LineAdapter._handle_message_event  sU  é € Ø�i‰i˜	Ó"×(Ð( bˆØ"Ÿw™w v¨rÓ2°C·G±G¸DÀ"Ó4E�*Ø—i‘i ¨bÓ1ˆØ—‘˜8Ó$×*Ð*¨ˆÜ*¨6Ó2ÑˆØ—*‘*˜X rÓ*×5Ð5¨gˆß—{Ø+6¼¿	º	»ÔFbÕ8bÐ*cˆD×Ñ˜wÑ'Ø "ˆ
Ø!#ˆØ�vÔØ—7‘7˜6 2Ó&×,Ð,¨"‰DØÔ+Ô+Ø+/×+?Ñ+?Ø¨s¯w©w°zÓ/B×/ZÐ/ZÀcÇgÁgÈkÓFZð ,@ó ,\÷ &\Ñ"ˆJçØ+5¨,¸¸˜KØ�x�j �?‰DØ˜Ô"ØADÇÁÈ×ATÒAT�Z §	¡	¨#¨j­/Ó :Ð;¸1Ñ=ÐZe‰DØ˜Ô#Ø  §¡¨°"Ó!5Ð 6°a¸¿¹À	È2Ó8NÐ7OÈqÐQ×WÑWÓY‰Dà0°°
¸!Ð<ˆDØ˜Ô §§ Ü×Ò §¡× 4Ñ 4°WÓ =Ô>Ø×&Ñ&Ø¸'Ð`gØ!ð 'ó #ˆ
ð ×!Ñ!¤,ØÔ$7×$;Ñ$;¸HÄk×FVÑFVÓ$WÐ`jØÀô#fó g÷ 	gò 	gò!&\ñ 	gùsQ   ‚BJÂ
JÂJÂ'AJÃ:2JÄ-JÅJÅ7JÆ A<JÇ=BJÊJÊJÊJc               ó    € V ^8„  d   QhRRRR/# r  r7   )r8   s   "r-   r9   rË  A  s   € ÷ 05ñ 05°.ð 05ÀTñ 05r/   c              ƒ  óÄ  "  € VP                  RR4      p\        VP                  R4      ;'       g    / 4      w  r4 \        P                  ! VP                  R4      ;'       g    / P                  RR4      ;'       g    R4      pTP                  R4      R8X  d   TP                  R	R4      MRpT'       d   T P                  P                  T4      MRpT P                  '       d	   T'       g   R# Tf�   T'       d=   T P                  P                  T4      T8X  d   T P                  P                  TR4       \        T P                  4      .p T P                  P                  Y(4      G Rj  x€L
  R# TP                   p
T
\"        P$                  J d*   \'        \)        TP*                  ;'       g    R4      4      pM~T
\"        P,                  J d5   \        \)        TP*                  ;'       g    T P.                  4      4      .pM6\        T
\"        P0                  J d   T P2                  MT P4                  4      .p T P                  P                  Y(4      G Rj  x€L
  T
\"        P$                  \"        P,                  39   d:   T P                  P=                  T4       T P                  P                  TR4       R# R#   \        \        P
                  3 d     R# i ; i ELt  \         d"   p	\        P                  R
T	4        Rp	?	R# Rp	?	ii ; i L¸  \         d¾   p	T
\"        P$                  Jd1   T
\"        P,                  J d   \        P7                  RT	4        Rp	?	R# \        P7                  RT	4        T P                  P9                  Y84      G Rj  x€L 
   Rp	?	ELF  \         d&   p\        P;                  RT4        Rp? Rp	?	R# Rp?ii ; iRp	?	ii ; i5i)uº   User tapped the slow-LLM postback button â€” deliver the cached payload. READY replies (push
fallback) and ERROR replies settle the entry; DELIVERED / PENDING just re-issue their notice.rø   r   rµ   r/  r1  Nr2  r3  r˜   z.LINE: postback expired-notice reply failed: %sz%LINE: postback ERROR reply failed: %sz6LINE: postback reply failed (%s); falling back to pushz'LINE: postback push fallback failed: %s)rš   r½   rç   r  rt  r  r¹  r´  rÀ  Úpopr&  r¡  r÷   rh   r  r  r~   rm   rx   r*  r5   r   rz   rŸ  ry   r�  rš  Úwarningrþ   rq   r°   )rŒ   r  ró   r�   Ú_Úparsedr˜   r    rô   r  r~   Úexc2s   &&          r-   r  Ú"LineAdapter._handle_postback_eventA  sè  é € ð —i‘i ¨bÓ1ˆÜ" 5§9¡9¨XÓ#6×#<Ð#<¸"Ó=‰
ˆð	Ü—Z’Z §¡¨:Ó!6×!<Ð!<¸"× AÑ AÀ&È"Ó M× SÐ SÐQSÓTˆFð 6<·Z±ZÀÓ5IÈ_Ô5\�V—Z‘Z ¨bÔ1Ðbdˆ
ß/9�—‘—‘ 
Ô+¸tˆØ�|�|ˆ|§;ÙØŠ=÷
 ˜d×3Ñ3×7Ñ7¸Ó@ÀJÔNØ×%Ñ%×)Ñ)¨'°4Ô8Ü% d×&7Ñ&7Ó8Ð9ˆHðTØ—l‘l×(Ñ(¨Ó?×?Ð?ñ Ø—‘ˆØ”E—K‘KÓÜ%¤c¨%¯-©-×*=Ð*=¸2Ó&>Ó?‰HØ”e—k‘kÓ!Ü%¤c¨%¯-©-×*PÐ*P¸4×;PÑ;PÓ&QÓRÐS‰Hä%¸UÄeÇoÁoÓ=U d×&9Ò&9Ð[_×[lÑ[lÓmÐnˆHð	Ø—,‘,×$Ñ$ [Ó;×;Ð;ð ”U—[‘[¤%§+¡+Ð.Ô.Ø�K‰K×&Ñ& zÔ2Ø×!Ñ!×%Ñ% g¨tÖ4ñ /øôO œ4×/Ñ/Ð0ô 	Úð	úò @øÜô TÜ—‘ÐMÈs×SÐSÙûðTúñ <øÜô 
	ØœEŸK™KÓ'ØœEŸK™KÓ'Ü—N‘NÐ#JÈCÔPÝÜ�N‰NÐSÐUXÔYðØ—l‘l×'Ñ'¨Ó:×:×:øÜô Ü—‘ÐFÈÔMß‘ûðþð
	üs  ‚9O ¼'J? Á$J? Á>J? Â1O Â7.O Ã&O Ã.O Ã<AO ÅK$ Å-K!Å.K$ Å2>O Æ1<O Ç.AO È<L ÉLÉL ÉA O Ê?KËO ËKËO Ë!K$ Ë$LË/LÌO ÌLÌO ÌL ÌOÌ >OÍO Í$OÍ;N%ÎNÎN%ÎO Î%OÎ0OÏOÏ
O ÏOÏOÏOÏO r'  Nc               ó(   € V ^8„  d   QhRRRRRRRR/# )r4   r  r5   r@  r'  r  r6   ztuple[Optional[str], str]r7   )r8   s   "r-   r9   rË  s  s,   € ÷ ñ ØðØ),ðØ;HðØTmñr/   c             ƒ  	ó  "  € V P                   '       d	   V'       g   R
#  V P                   P                  V4      G R j  x€L
 p\
        P                  TR4      p TR8X  d   \        YFR7      G R j  x€L
 R3# T\        9   dK   \        T,          ! YFR7      G R j  x€L
 \        P                  ! T T 24      ^ ,          ;'       g    T R23# T;'       g    RT 2p\        P                  ! T4      ^ ,          ;'       g    Rp\        YG4      G R j  x€L
 T3#  LØ  \         d$   p\        P	                  RY!T4       R
u R p?# R p?ii ; i LÙ L² L=  \         d#   p\        P	                  R	Y%4       R
u R p?# R p?ii ; i5i)Nz+LINE: failed to fetch %s content for %s: %srw  r   )Úextz
image/jpegz/mp4Ú	line_fileúapplication/octet-streamz$LINE: failed to cache %s payload: %s)Nr   )r´  r  rh   r  rH  r6  rš   r   Ú_INBOUND_AV_CACHERSÚ	mimetypesÚ
guess_typer   )	rŒ   r  r@  r'  r1  r  rO  Údocument_nameÚmimes	   &&&$     r-   r7  ÚLineAdapter._download_medias  sx  é € à�|�|ˆ|§:ØˆOð	ØŸ™×3Ñ3°JÓ?×?ˆDô !×$Ñ$ X¨vÓ6ˆð
	Ø˜7Ô"Ü9¸$ÔH×HÈ,ÐVÐVØÔ.Ô.Ü0°Ö:¸4ÔI×IÌ9×K_ÒK_ÐckÐblÐmpÐlqÐ`rÓKsÐtuÕKv÷  LLð  LLð  ~Fð  }Gð  GKð  {Lð  Lð  LØ$×9Ð9¨)°C°5Ð(9ˆMÜ×'Ò'¨Ó6°qÕ9×WÐWÐ=WˆDÜ8¸ÓM×MÈtÐSÐSñ @øÜô 	Ü�N‰NÐHÈ(Ð`cÔdØ�Oûð	úñ IáIñ NøÜô 	Ü�N‰NÐAÀ8ÔQØ�Oûð	üsÙ   ‚F �F  D ¾D¿D ÁF ÁE Á0E
Á1E Á6F Á7"E ÂEÂ*E ÃE ÃF ÃE Ã)E Ã?E ÄEÄE ÄF ÄD ÄEÄ$EÄ<EÄ=F ÅEÅF Å
E ÅE ÅE ÅE=ÅE8Å2E=Å3F Å8E=Å=F c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r4   r�   r5   r(  Úreply_tor  rH  rI  r6   r   r7   )r8   s   "r-   r9   rË  ‰  s;   € ÷ Pñ PØðPØ%(ðPØ4AðPØTlðPà	ñPr/   c              ƒ  	óì  "  € V P                   '       g   \        R RR7      # V P                  P                  V4      pV'       d“   \	        W$4      '       g‚   V P
                  P                  V4      pVeG   VP                  \        P                  J d)   V P
                  P                  WR4       \        RVR7      # V P                  P                  VR4       V P                  WR R7      G Rj  x€L
 #  L5i)FúLINE adapter not connected©Úsuccessrq   NT©r]  r  )Ú
force_push)r´  r   rÀ  rš   rL  r¹  r~   rm   rw   r¦   rG  Ú_send_text_chunks)rŒ   r�   r(  rY  rH  Úpending_ridr    s   &&&&&  r-   ÚsendÚLineAdapter.send‰  sÀ   é € ð �|�|ˆ|Ü eÐ3OÔPÐPð ×+Ñ+×/Ñ/°Ó8ˆßÔ/°×BÒBØ—K‘K—O‘O KÓ0ˆEØÒ  U§[¡[´E·M±MÓ%AØ—‘×%Ñ% kÔ;Ü!¨$¸;ÔGÐGð ×!Ñ!×%Ñ% g¨tÔ4ð ×+Ñ+¨GÈÐ+ÓO×OÐOÑOùs   ‚AC4ÁB(C4Ã-C2Ã.C4c               ó(   € V ^8„  d   QhRRRRRRRR/# )r4   r�   r5   r(  r_  r\   r6   r   r7   )r8   s   "r-   r9   rË  ¢  s0   € ÷ mñ m¨sð m¸Sð mÐQUð mÐZdñ mr/   c             ƒ  	óZ   "  € V P                  V\        V4      VR R7      G Rj  x€L
 #  L5i)T)r_  r   N)Ú_send_messagesr*  )rŒ   r�   r(  r_  s   &&&$r-   r`  ÚLineAdapter._send_text_chunks¢  s,   é € Ø×(Ñ(¨´.ÀÓ2IÐV`ÐgkÐ(Ól×lÐlÑlùs   ‚"+¤)¥+c               ó    € V ^8„  d   QhRRRR/# )r4   r�   r5   r6   ztuple[str, bool]r7   )r8   s   "r-   r9   rË  ¥  s   € ÷ Tñ T¨Cð TÐ4Dñ Tr/   c                ó¢   € V P                   P                  VR4      ;'       g    Rw  r#V'       d   \        P                  ! 4       V8  d   VR3# R# )uS   Consume a stashed reply token if present and unexpired â†’ ``(token, used_reply)``.NT©r   g        )r   F)r¸  rG  r4  )rŒ   r�   ÚtokenÚ
expires_ats   &&  r-   Ú_consume_reply_tokenÚ LineAdapter._consume_reply_token¥  sC   € à ×.Ñ.×2Ñ2°7¸DÓA×NÐNÀYÑˆß %¬$¯)ª)«+¸
Ô*B��tˆ}ÐSÈÐSr/   c               ó    € V ^8„  d   QhRRRR/# ©r4   r�   r5   r6   r…   r7   )r8   s   "r-   r9   rË  ª  s   € ÷ 0ñ 0¨ð 0Àñ 0r/   c              ƒ  ó”   "  € V P                   '       d0   V'       d&   V P                   P                  V4      G Rj  x€L
  R# R# R#  L
5i)z5Trigger LINE's loading-animation indicator (DM only).N)r´  r  )rŒ   r�   rH  s   &&&r-   Úsend_typingÚLineAdapter.send_typingª  s2   é € à�<�<ˆ<ŸGØ—,‘,×&Ñ& wÓ/×/Ò/ñ $‰<Ù/ùs   ‚A�A»A¼Ac               ó    € V ^8„  d   QhRRRR/# )r4   r�   r5   r6   r¶   r7   )r8   s   "r-   r9   rË  ¯  s   € ÷ :ñ :¨3ð :°>ñ :r/   c              ƒ  ó|   "  € RRRRRR/P                  T;'       g    RR,          R4      pR	T;'       g    RR
V/# 5i)zLBest-effort chat info inferred from the ID prefix (U=user, C=group, R=room).r  rº   ÚCr)   ÚRÚchannelr   :Nr'   NrV  r¹   )rš   )rŒ   r�   rÆ   s   && r-   Úget_chat_infoÚLineAdapter.get_chat_info¯  sF   é € à˜$  W¨c°9Ð=×AÑAÀ7Ç=À=ÈbÐRTÕBUÐW[Ó\ˆ	Ø˜Ÿ˜ 2 v¨yÐ9Ð9ùs   ‚3<¶<c               ó    € V ^8„  d   QhRRRR/# )r4   r(  r5   r6   r7   )r8   s   "r-   r9   rË  ´  s   € ÷ 7ñ 7 cð 7¨cñ 7r/   c                ó   € \        V4      # )z:Strip Markdown that LINE can't render. URLs are preserved.)r>   )rŒ   r(  s   &&r-   Úformat_messageÚLineAdapter.format_message´  s   € ä-¨gÓ6Ð6r/   c               ó    € V ^8„  d   QhRRRR/# rp  r7   )r8   s   "r-   r9   rË  ¸  s   € ÷ )ñ )¨#ð )À4ñ )r/   c              �  óŽ  <a a"  € S P                   ^ 8:  g   S P                  '       d	   S'       g   \        SS `  ! S.VO5/ VB G Rj  x€L
  R# R VV 3R llp\        P
                  ! V! 4       4      p \        SS `  ! S.VO5/ VB G Rj  x€L
  \        V4      G Rj  x€L
  R#  L] L L
  \        T4      G Rj  x€L 
  i ; i5i)zOWrap the base typing heartbeat; fire the slow-LLM postback button at threshold.Nc               ó   € V ^8„  d   QhRR/# r„   r7   )r8   s   "r-   r9   Ú.LineAdapter._keep_typing.<locals>.__annotate__¾  s   € ÷ 	9ñ 	9 dñ 	9r/   c               “  óÆ  <"  € \         P                  ! SP                  4      G R j  x€L
  SSP                  9  g   SSP                  9   d   R # SP
                  P                  S4      p V SP                  S&   SP                  S4      w  rV'       g   SP                  P                  SR 4       R # \        SP                  SP                  V 4      p SP                  P                  W.4      G R j  x€L
  \        P                  RSV 4       R #  Lê L  \          d>   p\        P#                  RT4       SP                  P                  SR 4        R p?R # R p?ii ; i5i)Nz8LINE: sent slow-LLM postback button for chat %s (rid=%s)z%LINE: postback button send failed: %s)r9  Úsleepr™  r¸  rÀ  r¹  r•   rm  rG  r=  rš  r,  r´  r÷   r  rð  rh   rH  )r”   rk  Úusedr?  r  r�   rŒ   s        €€r-   Ú_fire_postbackÚ0LineAdapter._keep_typing.<locals>._fire_postback¾  s  øé € Ü—-’- × <Ñ <Ó=×=Ð=ð ˜d×0Ñ0Ô0°G¸t×?TÑ?TÔ4TÙØ—+‘+×.Ñ.¨wÓ7ˆCØ-0ˆD×!Ñ! 'Ñ*Ø×3Ñ3°GÓ<‰KˆEßØ×%Ñ%×)Ñ)¨'°4Ô8ÙÜ/°×0AÑ0AÀ4×CTÑCTÐVYÓZˆCð9Ø—l‘l×(Ñ(¨°Ó6×6Ð6Ü—‘ÐVÐX_ÐadÖeñ >ñ 7øäô 9Ü—‘ÐFÈÔLØ×%Ñ%×)Ñ)¨'°4×8Ò8ûð9üsL   ƒ$E!§D¨B,E!ÃD Ã4DÃ5D ÄE!ÄD ÄEÄ!2EÅE!ÅEÅE!)r™  r´  r§  Ú_keep_typingr9  r:  r   )rŒ   r�   ÚargsrÁ  r†  Ú	post_taskrÅ  s   ff*,  €r-   rˆ  ÚLineAdapter._keep_typing¸  sª   úé € à×'Ñ'¨1Ô,°D·L·L°LÏÜ‘'Ò& wÐ@°Ò@¸Ñ@×@Ð@Ù÷	9ñ 	9ô( ×'Ò'©Ó(8Ó9ˆ	ð	)Ü‘'Ò& wÐ@°Ò@¸Ñ@×@Ð@ä˜iÓ(×(Ò(ñ7 Añ2 Aá(ø”+˜iÓ(×(Ò(üsc   …#C©C±CÁB&Á	+CÁ5B, ÂB(ÂB, ÂCÂB*Â CÂ(B, Â*CÂ,CÂ;B>Â<CÃCc               ó$   € V ^8„  d   QhRRRRRR/# )r4   Úsession_keyr5   r�   r6   r…   r7   )r8   s   "r-   r9   rË  Ø  s"   € ÷ >ñ >¸Cð >È#ð >ÐRVñ >r/   c              ƒ  óØ   <"  € \         SV `  W4      G Rj  x€L
  V P                  P                  VR4      pV'       d(   V P                  P                  W0P                  4       R# R#  LQ5i)z?Resolve any orphan PENDING postback so the button doesn't loop.N)r§  Úinterrupt_session_activityrÀ  rG  r¹  r¬   rŸ  )rŒ   r�  r�   r”   rÅ  s   &&& €r-   r�  Ú&LineAdapter.interrupt_session_activityØ  sW   øé € ä‰gÑ0°ÓF×FÐFØ×#Ñ#×'Ñ'¨°Ó6ˆßØ�K‰K×!Ñ! #×'<Ñ'<Ö=ñ ñ 	Gùs   ƒA*–A(—'A*¿*A*r÷  c               ó$   € V ^8„  d   QhRRRRRR/# )r4   Ú	file_pathr5   r÷  r\   r6   r7   )r8   s   "r-   r9   rË  ß  s!   € ÷ ñ ¨ð ¸$ð È3ñ r/   c               ó>  € \         P                   ! 4       p\        V P                  P                  4       4       Fd  w  pw  rVW68”  g   K  V P                  P	                  VR4       WPP
                  9   g   K>  V P
                  P                  V4       \        V4       Kf  	  \        \        V4      P                  4       4      p\        P                  ! ^ 4      pWsV P                  ,           3V P                  V&   V'       d   V P
                  P                  V4       V# )zXRegister a local file for HTTPS serving (evicting expired tokens); return the URL token.N)r4  rû  r¼  ÚitemsrG  r½  Údiscardrü  r5   r   ÚresolveÚsecretsÚtoken_urlsafer¿  Úadd)rŒ   r’  r÷  Únowrk  r  ÚexpÚresolveds   &&$     r-   Ú_register_mediaÚLineAdapter._register_mediaß  s×   € ä�iŠi‹kˆÜ"& t×'9Ñ'9×'?Ñ'?Ó'AÖ"BÑˆE‘;�DØŽyØ×"Ñ"×&Ñ& u¨dÔ3Ø×1Ñ1Ö1Ø×*Ñ*×2Ñ2°4Ô8Ü# DÖ)ñ #Cô ”t˜I“×.Ñ.Ó0Ó1ˆÜ×%Ò% bÓ)ˆØ%-°T·_±_Õ/DÐ$Eˆ×Ñ˜5Ñ!ßØ×"Ñ"×&Ñ& xÔ0Øˆr/   c               ó$   € V ^8„  d   QhRRRRRR/# )r4   rk  r5   r'  r6   r7   )r8   s   "r-   r9   rË  ï  s&   € ÷ 
[ñ 
[ ð 
[¨sð 
[°sñ 
[r/   c           
     	óN  € V P                   '       d   V P                   pMl\        V R R4      '       d   V P                  pMLV P                  4       '       d   RMV P                  pV P
                  R8X  d   RV 2MRV RV P
                   2pV \         RV R\        VRR7       2# )	Ú_shared_ingress_baseNz	127.0.0.1i»  úhttps://rÞ  r�  r   )Úsafe)r­  rn  r¡  Ú_missing_public_urlr©  r«  ré  Ú	_urlquote)rŒ   rk  r'  Úbaser‹  s   &&&  r-   Ú
_media_urlÚLineAdapter._media_urlï  sª   € Ø××ÐØ×'Ñ'‰DÜ�TÐ1°4×8Ò8Ø×,Ñ,‰Dð #'×":Ñ":×"<Ò"<‘;À$×BSÑBSˆDØ(,×(9Ñ(9¸SÔ(@�X˜d˜VÑ$ÈÐQUÐPVÐVWÐX\×XiÑXiÐWjÐFkˆDØ�Ô1Ð2°!°E°7¸!¼IÀhÐUWÔ<XÐ;YÐZÐZr/   c               ó    € V ^8„  d   QhRRRR/# )r4   r  r   r6   r5   r7   )r8   s   "r-   r9   rË  û  s   € ÷ Uñ U ð U¨ñ Ur/   c                	ó†   € V P                  V P                  \        VP                  4       4      4      VP                  4      # rˆ   )r§  r�  r5   r–  rV  )rŒ   r  s   &&r-   Ú_serve_fileÚLineAdapter._serve_fileû  s-   € Ø�‰˜t×3Ñ3´C¸¿¹»Ó4GÓHÈ$Ï)É)ÓTÐTr/   c               ó   € V ^8„  d   QhRR/# ©r4   r6   r\   r7   )r8   s   "r-   r9   rË  þ  s   € ÷ Qñ Q Tñ Qr/   c                ó¢   € V P                   '       g   \        V RR4      '       d   R# V P                  RJ ;'       g    V P                  \        9   # )zVTrue when no LINE_PUBLIC_URL is set and the bind host is wildcard/dual-stack ``None``.r¡  NF)r­  rn  r©  Ú_WILDCARD_HOSTSr‹   s   &r-   r¤  ÚLineAdapter._missing_public_urlþ  sD   € à××Ð¤7¨4Ð1GÈ×#NÒ#NÙØ× Ñ  DÐ(×PÐP¨D×,=Ñ,=ÄÑ,PÐPr/   c               ó$   € V ^8„  d   QhRRRRRR/# )r4   r¼   r5   r’  r6   z+tuple[Optional[Path], Optional[SendResult]]r7   )r8   s   "r-   r9   rË    s"   € ÷ ñ  cð °cð Ð>iñ r/   c                ó^  € \         V,          w  r4p\        V4      pVP                  4       '       g   R\        RV RV 2R7      3# VP	                  4       P
                  V8„  V3V P                  '       * R3V P                  4       V33 F  w  rxV'       g   K  R\        RVR7      3u # 	  VR3# )uQ   Shared preflight for send_image_file/send_voice/send_video â†’ ``(path, error)``.NFz file not found: r\  r[  )Ú_OUTBOUND_MEDIAr   Úis_filer   ÚstatÚst_sizer´  r¤  )	rŒ   r¼   r’  Ú	max_bytesÚ
size_errorÚ	url_errorr  Úfailedrq   s	   &&&      r-   Ú_check_media_fileÚLineAdapter._check_media_file  s²   € ä+:¸4Õ+@Ñ(ˆ	˜yÜ�I‹ˆØ�|‰|�~Š~Øœ¨E¸D¸6ÐARÐS\ÐR]Ð9^Ô_Ð_Ð_à�Y‰Y‹[× Ñ  9Ñ,¨jÐ9Ø—‘ÔÐ;Ð<Ø×%Ñ%Ó'¨Ð3ó5‰MˆF÷ ‰vØœZ°¸UÔCÐCÒCñ5ð �TˆzÐr/   c               ó   € V ^8„  d   QhRR/# r  r7   )r8   s   "r-   r9   rË    s   € ÷ Nñ N¨cñ Nr/   c              ƒ  ó  a
"  € ^ RI Hp VP                  R,          pV P                  P	                  V4      ;'       g    Rw  rEV'       g   VP                  RRR7      # \        P                  ! 4       V8”  d0   V P                  P                  VR4       VP                  RRR7      # \        V4      pVP                  4       '       g   VP                  RRR7      #  ^ R	I
Hp \        V! 4       4      P                  4       pVP                  4       o
\         ;QJ dc    V
3R l\        \"        P$                  ! 4       4      P                  4       \        R4      P                  4       V3 4       F  '       g   K   RMX	  RMT! V
3R l\        \"        P$                  ! 4       4      P                  4       \        R4      P                  4       V3 4       4      '       g*   \&        P)                  RS
4       VP                  RRR7      # \*        P,                  ! \/        V4      4      ^ ,          ;'       g    Rp	VP1                  VRV	/R7      #   \         d7    \        P                  ! 4       P                  R
4      P                  4       p EL†i ; i5i)uå  Serve a registered local file for LINE's media URLs. Defence-in-depth: the resolved
path is rechecked against allowed roots (tempdir, ``/tmp``â†’``/private/tmp`` on macOS, HERMES_HOME).

Defence-in-depth: even though ``_register_media`` is only called from trusted internal code, we
recheck the resolved path against an allowed-roots set before serving. Sources allowed:
``tempfile.gettempdir()``, ``/tmp`` (which resolves to ``/private/tmp`` on macOS), and
``HERMES_HOME``. PR #8398.
rÖ  rk  i”  z	not foundr  Niš  Úgone)Úget_hermes_homez.hermesc              3  óF   <"  € T F  pSP                  V4      x € K  	  R # 5irˆ   )Úis_relative_to)rD   Úrrœ  s   & €r-   rF   Ú,LineAdapter._handle_media.<locals>.<genexpr>,  s*   øé € ð  Eñ  8D°!�8×*Ñ*¨1×-Ð-ó  8DùrD  z/tmpTFz1LINE: refusing to serve outside allowed roots: %si“  Ú	forbiddenrQ  rÒ   r  rj  )rÜ   r×  Ú
match_infor¼  rš   r  r4  rG  r   rµ  Úhermes_constantsrÁ  r–  rh   ÚhomeÚjoinpathrE  ÚtempfileÚ
gettempdirr  rH  rS  rT  r5   ÚFileResponse)rŒ   r	  r×  rk  r’  rl  r  rÁ  Úhermes_homeÚcontent_typerœ  s   &&        @r-   rê  ÚLineAdapter._handle_media  s  øé € õ 	 Ø×"Ñ" 7Õ+ˆØ $× 2Ñ 2× 6Ñ 6°uÓ =× JÐ JÀÑˆ	ßØ—<‘< s°�<Ó=Ð=Ü�9Š9‹;˜Ô#Ø×Ñ×"Ñ" 5¨$Ô/Ø—<‘< s°�<Ó8Ð8Ü�I‹ˆØ�|‰|�~Š~Ø—<‘< s°�<Ó=Ð=ð	DÝ8Ü™Ó0Ó1×9Ñ9Ó;ˆKð —<‘<“>ˆß‹sô  E¼¼X×=PÒ=PÓ=RÓ8S×8[Ñ8[Ó8]Ô_cÐdjÓ_k×_sÑ_sÓ_uð  xCñ  8Dó  E�s�sŠsô  E¼¼X×=PÒ=PÓ=RÓ8S×8[Ñ8[Ó8]Ô_cÐdjÓ_k×_sÑ_sÓ_uð  xCñ  8Dó  E÷  Eò  EÜ�N‰NÐNÐPXÔYØ—<‘< s°�<Ó=Ð=Ü ×+Ò+¬C°«IÓ6°qÕ9×WÐWÐ=WˆØ×Ñ ¨~¸|Ð.LÐÓMÐMøô ô 	DÜŸ)š)›+×.Ñ.¨yÓ9×AÑAÓC‹Kð	DüsE   ƒCJÃ$I ÄJÄAJÅ7A!JÇAJÈ/JÉ=JÊJÊJÊJc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r4   r�   r5   Ú
image_pathÚcaptionr  rH  rI  r6   r   r7   )r8   s   "r-   r9   rË  2  s;   € ÷ 
hñ 
hØð
hØ(+ð
hØ6Cð
hØVnð
hà	ñ
hr/   c              ƒ  	óP  "  € V P                  R V4      w  rVV'       d   V# V P                  V4      pVP                  4       P                  R4      '       g   \	        RRV 2R7      # RR RVRV/.pT P                  YV'       d   \        V4      .M. ,           4      G Rj  x€L
 #  L5i)	r   r¢  FzLINE image URL must be HTTPS: r\  r¹   ÚoriginalContentUrlÚpreviewImageUrlN)r¼  r«  r^  r  r   rf  r&  )	rŒ   r�   rÒ  rÓ  rH  r  Úerrrâ   Úmsgss	   &&&&&    r-   Úsend_image_fileÚLineAdapter.send_image_file2  s£   é € ð ×*Ñ*¨7°JÓ?‰	ˆßØˆJØ×Ñ˜tÓ$ˆØ�y‰y‹{×%Ñ% j×1Ò1Ü eÐ5SÐTWÐSXÐ3YÔZÐZØ'-¨wÐ8LÈcÐSdÐfiÐ&jÐ%kˆØ×(Ñ(¨×V]¼=ÈÓ;QÑ:RÐceÕ2fÓg×gÐgÑgùs   ‚AB&ÁAB&ÂB$Â B&c               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )r4   r�   r5   Ú
audio_pathÚduration_msrA   rH  rI  rÁ  r   r6   r   r7   )r8   s   "r-   r9   rË  >  s>   € ÷ 9ñ 9Øð9Ø(+ð9Ø:=ð9ØPhð9àð9ð 
ñ9r/   c              ‹  	ó¾   "  € V P                  R V4      w  rgV'       d   V# RR RV P                  V4      R\        V4      /pV P                  W.4      G Rj  x€L
 #  L5i)r!   r¹   rÕ  ÚdurationN)r¼  r«  rA   rf  )	rŒ   r�   rÜ  rÝ  rH  rÁ  r  r×  r?  s	   &&&&&,   r-   Ú
send_voiceÚLineAdapter.send_voice>  sa   é € ð ×*Ñ*¨7°JÓ?‰	ˆßØˆJØ�wÐ 4°d×6FÑ6FÀtÓ6LÈjÔZ]Ð^iÓZjÐkˆØ×(Ñ(¨°%Ó8×8Ð8Ñ8ùs   ‚AAÁAÁAc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r4   r�   r5   Ú
video_pathÚpreview_pathr  rH  rI  r6   r   r7   )r8   s   "r-   r9   rË  H  s4   € ÷ 9ñ 9Øð9Ø(+ð9Ø;Hð9à*ð9à6@ñ9r/   c              ƒ  	óp  "  € V P                  R V4      w  rVV'       d   V# V'       d;   \        V4      P                  4       '       d   V P                  \        V4      4      pM{\        P
                  ! RRR7      p VP                  \        4       VP                  4        VP                  4        V P                  V P                  VP                  RR7      R4      pRR RV P                  V4      R	V/p	V P                  W.4      G R
j  x€L
 #   \         d    \        TP                  4       h i ; i L)5i)r    z.pngF)ÚsuffixÚdeleteT)r÷  zpreview.pngr¹   rÕ  rÖ  N)r¼  r   rµ  r«  rË  ÚNamedTemporaryFileÚwriteÚ_FALLBACK_PNG_PREVIEWÚflushÚcloser§  r�  rV  rh   rü  rf  )
rŒ   r�   rã  rä  rH  r  r×  Úpreview_urlÚtmpr?  s
   &&&&&     r-   Ú
send_videoÚLineAdapter.send_videoH  s	  é € ð ×*Ñ*¨7°JÓ?‰	ˆßØˆJ÷ œD Ó.×6Ñ6×8Ò8Ø×*Ñ*¬4°Ó+=Ó>‰Kä×-Ò-°VÀEÔJˆCðØ—	‘	Ô/Ô0Ø—	‘	”Ø—	‘	”Ø"Ÿo™o¨d×.BÑ.BÀ3Ç8Á8ÐUYÐ.BÓ.ZÐ\iÓj�ð �wÐ 4°d×6FÑ6FÀtÓ6LÐN_ÐalÐmˆØ×(Ñ(¨°%Ó8×8Ð8øô	 ô Ü §¡Ô)Øðúñ 9ùs0   ‚&D6©AD6Á<A"D Ã,D6Ä
D4ÄD6Ä"D1Ä1D6r_  r   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r4   r�   r5   rô   rõ   r_  r\   r   r6   r   r7   )r8   s   "r-   r9   rË  _  s4   € ÷ 9ñ 9Øð9Ø&:ð9ØKOð9Ø_cð9à	ñ9r/   c             ƒ  ó”  "  € V P                   '       g   \        RRR7      # V'       g   \        RRR7      # \        p\        ^ \	        V4      V4       Uu. uF  qbWfV,            NK  	  ppV P                  V4      w  r‰^ p
V	'       dK   V'       gC    V P                   P                  W‡^ ,          4      G Rj  x€L
  V'       d   \        RVR7      # ^p
\        V
\	        V4      4       F.  p V P                   P                  WV,          4      G Rj  x€L
  K0  	  \        RRR7      # u upi  Lt  \         d!   p\        P                  RT4        Rp?L�Rp?ii ; i LJ  \         d_   pT^ 8”  d   \        P                  RT4       MT'       d   \        P                  R	T4       \        R\        T4      R7      u Rp?u # Rp?ii ; i5i)
z»Send built message objects, batched at 5/call: reply token first, then push. ``text``
selects the text contract: reply success reports the token as message_id; push failure logs at error.Fr[  r\  TNr^  z5LINE: reply token rejected (%s); falling back to pushz)LINE: push for follow-up batch failed: %szLINE: push send failed: %s)r´  r   rL   ÚrangerK   rm  r÷   rh   r  rð  rþ   rH  rq   r5   )rŒ   r�   rô   r_  r   ÚnÚiÚbatchesrk  Ú
used_replyÚstartr  s   &&&$$       r-   rf  ÚLineAdapter._send_messages_  s{  é € ð
 �|�|ˆ|Ü eÐ3OÔPÐPßÜ d°tÔ<Ð<Ü&ˆÜ.3°A´s¸8³}ÀaÔ.HÓIÑ.H¨˜A !�eÓ$Ñ.HˆÐIØ ×5Ñ5°gÓ>ÑˆØˆßŸjðZØ—l‘l×(Ñ(¨¸µ
Ó;×;Ð;ßÜ%¨d¸uÔEÐEØ�ô �uœc '›lÖ+ˆAðAØ—l‘l×'Ñ'¨¸µÓ<×<Ò<ñ ,ô  $°4Ô8Ð8ùò) Jñ
 <øô ô ZÜ—‘ÐSÐUX×YÑYûðZúñ =øÜô AØ�q”5Ü—N‘NÐ#NÐPSÕTßÜ—L‘LÐ!=¸sÔCÜ!¨%´s¸3³xÔ@×@ûðAüs¬   ‚'Gª+GÁD%Á(&GÂ%D, Â5D*Â6D, ÃD, ÃGÃD, ÃGÃ*%EÄEÄEÄGÄ*D, Ä,EÄ7EÅGÅEÅGÅEÅGÅ'%G Æ+G Æ8GÆ9GÇ GÇG)rµ  r»  r¹  r´  rº  r½  r¼  r¿  rÀ  r¸  r¶  r·  r¿   r•  r—  r“  rÌ   r[   r­  r™  r©  rŒ  r«  )NNrˆ   )r£  N)%rr   rs   rt   ru   rv   r|  r€   r�   rÏ  rò  r  rè  ræ  r  r  r  r7  rb  r`  rm  rr  ry  r}  rˆ  r�  r�  r§  r«  r¤  r¼  rê  rÙ  rà  rï  rf  r{   Ú__classcell__)rÅ  s   @r-   r{  r{  z  sê   ø‡ Ùià"&Ð˜4Ó&õ+3ðZÀ÷ ð-°E÷ -õ^*õ Gõ3õ,Eõ, gõD05ðdØKO÷÷,Põ2mõT÷
0õ
:õ
7÷)ð )÷@>ð >ðÀ÷ õ 
[õUõQõõN÷@
h÷9÷9ð.9ØRWð9Øfk÷9õ 9r/   r{  c               ó    € V ^8„  d   QhRRRR/# )r4   r  r5   r6   r…   r7   )r8   s   "r-   r9   r9   €  s   € ÷ ñ ˜#ð  $ñ r/   c                ó°   € \         P                  ! \        4      ;_uu_ 4        \        P                  ! V 4       R R R 4       R #   + '       g   i     R # ; irˆ   )rù  rú  rî  ÚosÚunlink)r  s   &r-   rü  rü  €  s-   € Ü	×	Ò	œW×	%Õ	%Ü
�	Š	�$Œ÷ 
&×	%×	%Ò	%ús   £AÁA	c               ó   € V ^8„  d   QhRR/# r®  r7   )r8   s   "r-   r9   r9   …  s   € ÷ wñ w $ñ wr/   c                 ój   € \         ;QJ d    R  R 4       F  '       d   K   R# 	  R# ! R  R 4       4      # )c              3  óz   "  € T F1  p\        \        V4      ;'       g    R 4      P                  4       x € K3  	  R# 5i)r   N)r5   r]  rR  )rD   Úks   & r-   rF   Ú+_env_credentials_present.<locals>.<genexpr>†  s1   é € ÐvÑAu¸AŒsÔ% aÓ(×.Ð.¨BÓ/×5Ñ5×7Ð7ÓAuùs   ‚;ž;FT)rl  rm  )Úallr7   r/   r-   Ú_env_credentials_presentr  …  s-   € ß‹3ÑvÑAuÓv�3Œ3ÐvŠ3Ðvˆ3ÑvÑAuÓvÓvÐvr/   c               ó   € V ^8„  d   QhRR/# r®  r7   )r8   s   "r-   r9   r9   ‰  s   € ÷ ñ ˜Dñ r/   c                 óX   € \        4       '       g   R#  ^ RIp R#   \         d     R# i ; i)z8Plugin gate: require credentials AND aiohttp at runtime.FNT)r  rÜ   rá  )rÜ   s    r-   Úcheck_requirementsr  ‰  s+   € ä#×%Ò%ÙðÛÙøÜô Úðús   ” š)¨)c               ó   € V ^8„  d   QhRR/# r®  r7   )r8   s   "r-   r9   r9   ”  s   € ÷ %ñ %˜tñ %r/   c                ó*   € \        \        V 4      4      # rˆ   )r  rp  ©ro  s   &r-   Úvalidate_configr  ”  s   € ÜŒ|˜FÓ#Ó$Ð$r/   c               ó   € V ^8„  d   QhRR/# r®  r7   )r8   s   "r-   r9   r9   ˜  s   € ÷ #ñ #˜Dñ #r/   c                ó   € \        V 4      # )zESurface in ``hermes status`` even before the adapter is instantiated.)r  r  s   &r-   Úis_connectedr  ˜  s   € ä˜6Ó"Ð"r/   c               ó   € V ^8„  d   QhRR/# )r4   r6   rI  r7   )r8   s   "r-   r9   r9   �  s   € ÷ Nñ NÐ1ñ Nr/   c                 óH   € \        4       '       g   R# \        \        RR7      # )zi``env_enablement_fn``: seed ``PlatformConfig.extra`` from env-only setups so ``hermes status`` sees them.NÚLINE_HOME_CHANNEL)Úhome_env)r  Ú_seed_extra_from_envÚ_ENV_SEED_KEYSr7   r/   r-   Ú_env_enablementr  �  s   € ä#×%Ò%ÙÜ¤Ð9LÔMÐMr/   Ú	thread_idÚmedia_filesÚforce_documentc               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )r4   r�   r5   rª   r  r  r  zOptional[list[str]]r  r\   r6   r¶   r7   )r8   s   "r-   r9   r9   ¥  s>   € ÷ $ñ $Øð$Ø$'ð$àð$à2Eð$à^bð$ð ñ$r/   c             ƒ  óô  "  € \        V 4      ^ ,          pV'       d	   V'       g   \        R4      # \        T;'       g    R4      ;'       g    \        R4      .pV'       dA   VP	                  \        \        R\        \        V4      4      R7      4      4       VR\         p \        V4      P                  W4      G Rj  x€L
  RRRR/#  L
  \         d   p\        \        T4      4      u Rp?# Rp?ii ; i5i)	u»   Out-of-process Push delivery for cron jobs detached from the gateway (no inbound event â†’ no
reply token). ``thread_id`` is ignored (no threads); ``media_files`` need the webhook server.z.LINE standalone send: missing token or chat_idr   z4platform.line.standalone.attachments_not_deliverable)ÚcountNr]  Tr  )rp  r   r*  r&  rO   r   r5   rK   rL   rÉ   rþ   rh   )	Úpconfigr�   rª   r  r  r  rk  rô   r  s	   &&&$$$   r-   Ú_standalone_sendr  ¥  sÔ   é € ô ˜Ó! !Õ$€EßŸÜÐJÓKÐKÜ˜gŸm˜m¨Ó,×CÐC´¸rÓ1BÐ0C€HßØ�‰œÜÐDÌCÔPSÐT_ÓP`ÓLaÔbódô 	eàÐ7Ô7Ð8ˆð$Ü˜%Ó ×%Ñ% gÓ8×8Ð8Ø˜4 ¨tÐ4Ð4ñ 	9øäô $Üœ#˜c›(Ó#Õ#ûð$üs^   ‚"C8¥C8¾C8ÁC8Á!A C8Â"C Â?C
Ã 	C Ã	C8Ã
C ÃC5ÃC0Ã*C5Ã+C8Ã0C5Ã5C8c               ó   € V ^8„  d   QhRR/# r„   r7   )r8   s   "r-   r9   r9   Á  s   € ÷ |ñ |˜4ñ |r/   c                 ó  € ^ RI Hp Hp ^ RIHpHpHp ^ RIHp V! R4       V! RRR4      '       d   R# V! R	4       \         F8  w  rgpV ! V4      '       d   R
MRp	V! V V	 2VR7      p
V
'       g   K0  V! Wj4       K:  	  V! R4       R# )zX``hermes setup line`` wizard (writes ``~/.hermes/.env``); CLI helpers are lazy-imported.)Úget_env_valueÚsave_env_value)Úprint_headerÚ
print_infoÚprompt)Údeclines_reconfigurezLINE Messaging APIÚLINEzReconfigure LINE?rl  NzbCreate a Messaging API channel at https://developers.line.biz/console/ then copy the values below.z [keep current]r   )ÚpasswordziDone. Set the webhook URL in the LINE console to <your-public-url>/line/webhook and enable 'Use webhook'.)
Úhermes_cli.configr!  r"  Úhermes_cli.cli_outputr#  r$  r%  Úhermes_cli.setup_platformsr&  Ú_SETUP_PROMPTS)r!  r"  r#  r$  r%  r&  ÚvarÚquestionÚsecretræ  rN  s              r-   Úinteractive_setupr0  Á  s‚   € ç?ßFÑFÝ?ÙÐ%Ô&Ù˜FÐ$7Ð9T×UÒUÙÙÐsÔtß!/Ñˆ�vÙ&3°C×&8Ò&8Ñ"¸bˆÙ˜(˜ F 8Ð,°vÔ>ˆß‰5Ù˜3Ö&ñ	 "0ñ
 ÐzÖ{r/   c               ó   € V ^8„  d   QhRR/# r„   r7   )r8   s   "r-   r9   r9   Ò  s   € ÷ ;ñ ;�Tñ ;r/   c                ó�   € V P                  R RR \        RR\        \        RR.R\        \
        R\        R	R
\        RRRRR7       R# )r~  r'  c                ó   € \        V 4      # rˆ   )r{  )Úcfgs   &r-   r.   Úregister.<locals>.<lambda>Ô  s	   € ¼{È3Ô?Or/   z8Use Hermes from LINE via the LINE Messaging API webhook.zDhttps://hermes-agent.nousresearch.com/docs/user-guide/messaging/linerl  rm  zpip install aiohttpr  r’  r�  u   ðŸ’šFTuè  You are chatting via LINE Messaging API. LINE does NOT render Markdown â€” text bubbles show ** and # literally. Bare URLs are auto-linked, but \[label\](url) syntax is not. Each text bubble is capped at 5000 characters and at most 5 bubbles are sent per reply, so keep responses concise. Image/audio/video sending requires LINE_PUBLIC_URL configured to a publicly reachable HTTPS host. Slow responses surface a 'Get answer' button the user taps to fetch the reply via a fresh free token.)rV  rã   Úadapter_factoryÚcheck_fnÚdashboard_descriptionÚdocs_urlr  r  Úrequired_envÚinstall_hintÚsetup_fnÚenv_enablement_fnÚcron_deliver_env_varÚstandalone_sender_fnÚallowed_users_envÚallow_all_envÚmax_message_lengthÚemojiÚpii_safeÚallow_update_commandÚplatform_hintN)Úregister_platformr  r  r  r0  r  r  ÚLINE_SAFE_BUBBLE_CHARS)Úctxs   &r-   ÚregisterrJ  Ò  sW   € Ø×ÑØ˜6Ñ3OÔZlØXØWÜ'´lØ1Ð3HÐIÐXmÜ"´oÐ\oÜ-ÐAUØ,Ü1Ø˜u¸4ð9ð ö ;r/   >   r   ú::ú0.0.0.0i    i  €)ÚgroupIdr)   )ÚroomIdr²   )r  rº   )u   âš¡u   â�³u   â�©u   ðŸ’¾rˆ   )F>   r8  ÚleaveÚfollowÚunfollow)rŠ  r‹  N)r�  rŽ  N))rl  zChannel access tokenT)rm  zChannel secretT)r�  zDPublic HTTPS base URL (optional, e.g. https://my-tunnel.example.com)F)r’  z.Allowed user IDs (comma-separated; blank=skip)F)�Ú__conditional_annotations__rv   Ú
__future__r   r9  re   rù  Úenumrb   r_   rç   ÚloggingrS  rý  Úrer—  rí  rË  r4  r’   Údataclassesr   Úpathlibr   Útypingr   r   r   r   r	   r
   r   Úurllib.parser   r¥  Ú
agent.i18nr   Úgateway.platforms._sharedr   r]  r   r  r   Úgateway.platforms.baser   r   r   r   r   r   r   Úgateway.platforms.helpersr   r   Úgateway.platforms.eventr   r   Úgateway.configr   Ú	getLoggerrr   r  rù   r   r  r  r  r%  rH  rL   r5  rã  rª  r¬  ré  r¨  Ú	frozensetr°  r®  r¯  r9  r°  r±  r²  r¾  ÚLINE_IMAGE_MAX_BYTESÚLINE_AV_MAX_BYTESr>  ÚPHOTOÚVIDEOÚVOICEÚDOCUMENTÚLOCATIONÚSTICKERr=  rY   Úfromhexrê  ÚcompileÚDOTALLÚ	MULTILINEr2   r€   r>   rV   rk   ÚEnumrm   r}   r‚   r»   r½   rÇ   rÉ   r&  r*  r=  r>  rF  rL  rT  r`  rp  rv  r´  r6  rR  r  rA   r  r{  rü  r  r  r  r  r  r  r,  r0  rJ  )rR  s   @r-   Ú<module>rp     sÐ  øðôõ #ã Û Û Û Û Û Û Û Û Û 	Û 	Û Û 
Û Û Û Ý !Ý ß B× BÑ BÝ +å ÷ñ ÷÷ ñ ÷
 Gß =Ý #à	×	Ò	˜8Ó	$€à;€Ø9€ØBÐ ØUÐ Ø5Ð ØÐ ØÐ ØÐ Ø!Ð Ø"Ð ØÐ Ø&Ð Ø)Ð ð €ÙÒ1Ó2€Ø"&Ð ð "HÐ Ø?Ð Ø>Ð ØBÐ Ø:Ð ØÐ Ø'Ð Ø%Ð ð ˆK×Ñ˜g {×'8Ñ'8¸'À;×CTÑCTÐV]Ð_j×_pÑ_pØ
ˆK× Ñ  *¨k×.BÑ.BÀIÈ{×ObÑObðdÐ ð Ÿ™ðóÐ ð ‡Z‚ZÐ0°"·)±)Ó<Ñ>_Ð`Ø‡Z‚Z�Ó˜uÐ%Ø‡Z‚ZÐ5Ó6Ñ8`ÐaØ‡Z‚ZÐ Ó! 5Ð)Ø‡Z‚ZÐ6Ó7¸Ð?Ø‡Z‚Z�˜rŸ|™|Ó,¨bÐ1Ø‡Z‚ZÐ! 2§<¡<Ó0°&Ð9ð7;€Ð3ó ;õð 0F÷ õ*
FôˆD�I‰Iô ð ÷ð ó ð÷
Rñ RðD Ð.°Ð8JÈFÐTdÐe€õNõ	b÷6ñ 6õrõ
Kõyð( ,IÐ ˜Ó HõY÷
&õF÷Uõ
tõð ØÐ>Øfðhð ÐÐ!BÐDoÐpØÐÐ!BÐDoÐpð€ð ˜v w°¸ÀÈÐQWÐXÐ ØÐ <¸gÐGcÐdÐ ÙÒEÓFÐ Ø ¨Ð,Ð.IÐKrÐs€ôC9Ð%ô C9õLõ
wõõ%õ#õ
Nð$à#ð$àHLð$àej÷$ð*U€õ|÷";r/   