+
    kHàjêÁ ã                  óÞ  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RI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HtHtHt ^ RIHtHt ^ RIHt ^ RIHt ^ RIHt ^ R	IH t H!t!H"t"H#t# ^ R
I$H%t% ^ RI&H't' ^ RI(H)t*H+t,H-t.H/t/  ^ RI0H1t1H2t2H3t3H4t4H5t5H6t6H7t7H8t8 ^ R(I<H=t=H>t> ^ R)I?H@t@HAtAHBtBHCtCHDtDHEtEHFtF ^ R*I?HGtG ^ R+IHHItIHJtJHKtK ^ R,ILHMtM ^ R-INHOtOHPtPHQtQHRtR ]	P¦                  ! ]T4      tU^tVR.R//R0 R1 lltWR2 R3 ltX]P²                  ! R4]P´                  4      t[R5 R6 lt\R7 R8 lt]]P²                  ! R94      t^R: R; lt_R< R= lt`]a! 0 R¢m4      tbR> R? ltcR@ RA ltd ! RB RC]4      te]! RDRE7       ! RF RG4      4       tf] ! RH RI4      4       tg] ! RJ RK4      4       th]h;titjRLtk]k^,          tl]ltmRM RN ltnRO RP ltoRQ RR ltp^ RSIqHrts ^tt]P²                  ! RT4      tuRUtv]a! 0 R£m4      tw]a! 0 R¤m4      tx]y;QJ d    . RV RW 4       F  NK  	  5M! RV RW 4       4      R¥,           tz]zR¦,           t{RX RY lt|R§RZ R[ llt}R\ R] lt~R^ R_ ltR` Ra lt€Rb Rc lt�Rd Re lt‚Rf Rg ltƒR¨Rh Ri llt„R©Rj Rk llt…Rl Rm lt†Rn Ro lt‡Rp Rq ltˆRr Rs lt‰Rt Ru ltŠRv Rw lt‹Rx Ry ltŒRz R{ lt�R| R} ltŽ]P²                  ! R~4      t�Rt�R€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Ž lt˜R� R� lt™ ! R‘ R’]A4      tšR“RR”RR•R//R– lt›R— R˜ ltœR™ Rš lt�RªtžR› Rœ ltŸR� Rž lt RŸ R  lt¡R#   ]9 dM    ]:;t1;t2;t6t8];! RR¡RRRRRRRR/4      t3];! RR¡RRRRRR/4      t4];! RR¡RR R!R"R#R$/4      t5];! R%R¡R&^ R'^/4      t7 ELÏi ; i)«uP  Matrix gateway adapter (any homeserver, via mautrix; optional E2EE with ``mautrix[encryption]``).

Env vars (config.yaml ``matrix:`` keys alias several â€” env wins):
  MATRIX_HOMESERVER, MATRIX_ACCESS_TOKEN (preferred) | MATRIX_USER_ID + MATRIX_PASSWORD;
  MATRIX_E2EE_MODE off|optional|required (legacy MATRIX_ENCRYPTION=true => required);
  MATRIX_DEVICE_ID (stable E2EE device), MATRIX_RECOVERY_KEY (cross-signing after key rotation),
  MATRIX_RECOVERY_KEY_OUTPUT_FILE (one-time 0600 write of a bootstrapped key), MATRIX_PROXY;
  MATRIX_ALLOWED_USERS, MATRIX_ALLOWED_ROOMS (whitelist; DMs exempt), MATRIX_IGNORE_USER_PATTERNS
  (regexes for bridge ghosts), MATRIX_HOME_ROOM (cron delivery), MATRIX_REACTIONS (default true);
  MATRIX_REQUIRE_MENTION (default true), MATRIX_THREAD_REQUIRE_MENTION, MATRIX_FREE_RESPONSE_ROOMS,
  MATRIX_PROCESS_NOTICES, MATRIX_ALLOW_ROOM_MENTIONS, MATRIX_ALLOW_PUBLIC_ROOMS (all default false);
  MATRIX_AUTO_THREAD (default true), MATRIX_DM_AUTO_THREAD, MATRIX_DM_MENTION_THREADS,
  MATRIX_SESSION_SCOPE auto|room|thread; MATRIX_MAX_MESSAGE_LENGTH (UTF-8 bytes, default/max 15000),
  MATRIX_MAX_MEDIA_BYTES, MATRIX_ROOM_IDENTITY_TTL_SECONDS; MATRIX_APPROVAL_REQUIRE_SENDER (default
  true), MATRIX_APPROVAL_TIMEOUT_SECONDS (default 300).

Note: any room with <=2 joined members is auto-classified as a DM (see
``_resolve_room_identity``), regardless of ``m.direct`` account data or an explicit room name â€”
clients auto-name DMs like "Alice & Bot", so name alone can't be trusted. A DM-classified room
therefore bypasses MATRIX_ALLOWED_ROOMS, MATRIX_FREE_RESPONSE_ROOMS, and MATRIX_REQUIRE_MENTION,
and follows MATRIX_DM_AUTO_THREAD / MATRIX_DM_MENTION_THREADS instead of MATRIX_AUTO_THREAD /
MATRIX_SESSION_SCOPE. To make a deliberately-created 2-person room behave like a regular room,
add a third member so it has >2 joined members.
)ÚannotationsN)Úsuppress)ÚurljoinÚurlsplitÚ
urlunsplit)Ú	dataclassÚfield)Úescape)Ú
HTMLParser)ÚPath)ÚAnyÚDictÚOptionalÚSet©Út)Ú
get_secret)Úapply_yaml_bridgeÚextra_or_secretÚget_scoped_secretÚ
send_error©Ú
ContentURIÚEventIDÚ	EventTypeÚPresenceStateÚRoomCreatePresetÚRoomIDÚ
TrustStateÚUserIDÚ_EventTypeStubÚROOM_MESSAGEzm.room.messageÚREACTIONz
m.reactionÚROOM_ENCRYPTEDúm.room.encryptedÚ	ROOM_NAMEúm.room.nameÚ_PresenceStateStubÚONLINEÚonlineÚOFFLINEÚofflineÚUNAVAILABLEÚunavailableÚ_RoomCreatePresetStubÚPRIVATEÚprivate_chatÚPUBLICÚpublic_chatÚTRUSTED_PRIVATEÚtrusted_private_chatÚ_TrustStateStubÚ
UNVERIFIEDÚVERIFIED)ÚPlatformÚPlatformConfig)Úgateway_trust_envÚBasePlatformAdapterÚExecApprovalPromptÚ
SendResultÚresolve_proxy_urlÚproxy_kwargs_for_aiohttpÚssrf_redirect_guard)Útranscode_to_ogg_opus)ÚMessageEventÚMessageTypeÚProcessingOutcome)ÚThreadParticipationTracker)ÚParkedVoicesÚ	VoiceGateÚhas_voice_markerÚis_voice_eventÚtextFc               ó$   € V ^8„  d   QhRRRRRR/# )é   ÚcmdÚlistÚtimeoutÚintrJ   Úbool© )Úformats   "ÚE/home/ubuntu/.hermes/hermes-agent/plugins/platforms/matrix/adapter.pyÚ__annotate__rU   Y   s&   € ÷ wñ w˜ð w¨3ð w°dñ wó    c          	     óT   € \         P                  ! V RW!\         P                  RR7      # )z5Run ffmpeg/ffprobe with captured output and no stdin.TF)Úcapture_outputrJ   rO   ÚstdinÚcheck)Ú
subprocessÚrunÚDEVNULL)rM   rO   rJ   s   &$$rT   Ú_run_media_toolr^   Y   s!   € ä�>Š>˜#¨d¸ÔV`×VhÑVhÐpuÔvÐvrV   c               ó    € V ^8„  d   QhRRRR/# )rL   Úpathr   Úreturnúdict[str, Any]rR   )rS   s   "rT   rU   rU   ^   s   € ÷ #ñ #¨$ð #°>ñ #rV   c                óÊ  € / p\         P                  ! R4      pV'       d…    \        VRRRRRR\        V 4      .^
RR	7      pVP                  ^ 8X  dT   \        VP                  ;'       g    R
P                  4       ;'       g    ^ 4      pV^ 8”  d   \        VR,          4      VR&   \         P                  ! R4      pV'       EdL    \        VRRR\        V 4      RRRRRRR.^R7      pVP                  ^ 8X  Ed   VP                  '       Ed   \        P                  ! R4      pVP                  VP                  4       \        P                  R8w  d   VP!                  4        V'       d¤   \#        V4      \$        r‡. p	\'        V4       F~  p
W§,          V,          p\)        R Wk\)        V^,           V
^,           V,          V,          4        4       4      pV	P+                  \-        R\        VR,          R,          4      4      4       K€  	  W‘R&   V# V#   \         d    \        P                  RT RR7        EL’i ; i  \         d    \        P                  RT RR7        T# i ; i) z\Best-effort duration + MSC1767 waveform for voice bubbles; must work without ffprobe/ffmpeg.Úffprobez-vÚerrorz-show_entrieszformat=durationz-ofz"default=noprint_wrappers=1:nokey=1T)rO   rJ   Ú éè  Údurationz-Matrix: failed to probe voice duration for %s©Úexc_infoÚffmpegz-iz-acÚ1z-arÚ8000z-fÚs16leÚ-©rO   ÚhÚlittlec              3  ó8   "  € T F  p\        V4      x € K  	  R # 5i©N)Úabs)Ú.0Úvs   & rT   Ú	<genexpr>Ú2_matrix_voice_metadata_for_file.<locals>.<genexpr>|   s   é € Ð"lÑ3k¨a¤3 q§6 6Ó3kùs   ‚i   iÿ  Úwaveformz-Matrix: failed to build voice waveform for %s)ÚshutilÚwhichr^   ÚstrÚ
returncodeÚfloatÚstdoutÚstriprP   Ú	ExceptionÚloggerÚdebugÚarrayÚ	frombytesÚsysÚ	byteorderÚbyteswapÚlenÚ_MATRIX_VOICE_WAVEFORM_BINSÚrangeÚmaxÚappendÚmin)r`   Úmetadatard   Úresultrh   rk   ÚsamplesÚcountÚbinsrz   ÚidxÚstartÚpeaks   &            rT   Ú_matrix_voice_metadata_for_filer˜   ^   s   € à!€HÜ�lŠl˜9Ó%€Gßð		_Ü$Ø˜$ ¨Ð:KÈUØ5´s¸4³yðBØKMÐTXôZˆFð × Ñ  AÔ%Ü  &§-¡-×"5Ð"5°2×!<Ñ!<Ó!>×!CÐ!CÀ!ÓD�Ø˜a”<Ü+.¨x¸$­Ó+?�H˜ZÑ(ô �\Š\˜(Ó#€Fß€vð	_Ü$Ø˜˜w¨¬c°$«i¸ÀÀUÈFÐTXÐZaÐcfÐgÐqsôuˆFà× Ñ  AÕ%¨&¯-¯-©-ÜŸ+š+ cÓ*�Ø×!Ñ! &§-¡-Ô0Ü—=‘= HÔ,Ø×$Ñ$Ô&ßÜ"% g£,Ô0K˜4Ø!�HÜ$ Tž{˜Ø #¥¨tÕ 3˜Ü"Ñ"l°7ÄÀUÈQÅYÐQTÐWXÕQXÐ\aÕPaÐeiÕPiÓAjÑ3kÓ"lÓl˜Ø Ÿ™¬¨D´#°d¸UµlÀTÕ6IÓ2JÓ(KÖLñ  +ð ,4˜ZÑ(ð €Oˆ8€Oøô- ô 	_Ü�L‰LÐHÈ$ÐY]ˆL×^ð	_ûô( ô 	_Ü�L‰LÐHÈ$ÐY]ˆLÕ^Ø€Oð	_ús?   ¢AH Á*H Â#H ÃAH; ÄAH; Å*B#H; È#H8È7H8È;#I"É!I"z'^!([A-Za-z][A-Za-z0-9_-]*)(?=$|\s)(.*)$c               ó    € V ^8„  d   QhRRRR/# )rL   Únamer}   ra   ú
str | NonerR   )rS   s   "rT   rU   rU   †   s   € ÷ ñ  sð ¨zñ rV   c           	     óú  € V '       g   R# \        \        P                  V P                  4       V P                  4       P	                  RR4      34      4      p ^ RIHp V F  pV! V4      '       g   K  Vu # 	   ^ RI
Hp V! 4       ;'       g    / pV F  pR	V 2V9   g   K  Vu # 	  R#   \         d    \        P                  RT RR7        LVi ; i  \         d    \        P                  R
T RR7        R# i ; i)uF  Resolve a ``!command`` token (Matrix clients reserve ``/``) to a dispatchable token.
Only known gateway/skill commands resolve, so ordinary exclamations stay chat text. Returns
whichever candidate resolved â€” raw lowercased first, then ``_``â†’``-`` â€” never a forced
canonical form: aliases pass through for the dispatcher.NÚ_ro   )Úis_gateway_known_commandz.Matrix: is_gateway_known_command failed for %rTri   )Úget_skill_commandsÚ/z(Matrix: get_skill_commands failed for %r)rN   ÚdictÚfromkeysÚlowerÚreplaceÚhermes_cli.commandsrž   r‚   rƒ   r„   Úagent.skill_commandsrŸ   )rš   Ú
candidatesrž   Ú	candidaterŸ   Úskill_commandss   &     rT   Ú_resolve_matrix_bang_commandrª   †   së   € ÷
 ÙÜ”d—m‘m T§Z¡Z£\°4·:±:³<×3GÑ3GÈÈSÓ3QÐ$RÓSÓT€Jð\Ý@Û#ˆIÙ'¨	×2Ô2Ø Ò ñ $ð
VÝ;Ù+Ó-×3Ð3°ˆÛ#ˆIØ�9�+ˆ .Ö0Ø Ò ñ $ñ
 øô ô \Ü�‰ÐEÀtÐVZˆÖ[ð\ûô ô VÜ�‰Ð?ÀÐPTˆÕUÙðVúsB   ÁB* Á3B* Á7B* Á:C ÂC Â"C Â&C Â*#CÃCÃ#C:Ã9C:c               ó    € V ^8„  d   QhRRRR/# ©rL   rJ   r}   ra   rR   )rS   s   "rT   rU   rU       s   € ÷ 0ñ 0¨ð 0°ñ 0rV   c                ó  € V '       d   V P                  R4      '       g   V # \        P                  V 4      pV'       d   \        VP	                  ^4      4      MRpVf   V # RT VP	                  ^4      ;'       g    R 2# )zGConvert Matrix ``!command`` aliases to normal Hermes ``/command`` text.Ú!Nr    rf   )Ú
startswithÚ_MATRIX_BANG_COMMAND_REÚmatchrª   Úgroup)rJ   r±   Úresolveds   &  rT   Ú_normalize_matrix_bang_commandr´       sl   € ç�t—‘ s×+Ò+ØˆÜ#×)Ñ)¨$Ó/€Eß?DÔ+¨E¯K©K¸«NÔ;È$€HØÒØˆØˆxˆj˜Ÿ™ Q›×-Ð-¨2Ð.Ð/Ð/rV   z^>\s*<(@[^>]+)>\s*(.*)$c               ó    € V ^8„  d   QhRRRR/# )rL   Úbodyr}   ra   z#tuple[Optional[str], Optional[str]]rR   )rS   s   "rT   rU   rU   ¯   s   € ÷ "ñ " #ð "Ð*Mñ "rV   c                óÀ  € V '       d   V P                  R4      '       g   R# . pRpV P                  R4       Fy  pVP                  R4      '       g    MaVR,          pVf@   \        P                  V4      pV'       d#   VP	                  ^4      pVP	                  ^4      pVP                  V4       K{  	  RP                  V4      P                  4       ;'       g    RpWb3# )zbReturn (quoted_text, author_mxid) from the inline reply fallback; author from the first-line pill.ú> NÚ
ºrL   NN©NN)r¯   ÚsplitÚ_MATRIX_REPLY_FALLBACK_PILL_REr±   r²   rŽ   Újoinr�   )r¶   Úquoted_linesÚ	author_idÚlineÚcontentÚ
pill_matchÚquoted_texts   &      rT   Ú_extract_reply_fallbackrÅ   ¯   sÂ   € ç�t—‘ t×,Ò,ØÐØ €LØ#€IØ—
‘
˜4Ö ˆØ�‰˜t×$Ò$ÙØ�r•(ˆØÒÜ7×=Ñ=¸dÓCˆJßØ&×,Ñ,¨QÓ/�	Ø$×*Ñ*¨1Ó-�Ø×Ñ˜GÖ$ñ !ð —)‘)˜LÓ)×/Ñ/Ó1×9Ð9°T€KØÐ!Ð!rV   c               ó    € V ^8„  d   QhRRRR/# ©rL   r¶   r}   ra   rR   )rS   s   "rT   rU   rU   Ã   s   € ÷ 5ñ 5 ð 5¨ñ 5rV   c                ó:  € V '       d   V P                  R4      '       g   V # . pRpV P                  R4       FG  pV'       g,   VP                  R4      '       g   VR8X  d   K+  RpVR8X  d   K6  VP                  V4       KI  	  V'       d   RP                  V4      # T # )zKStrip the inline ``> quote\n\nreply`` fallback prefix; unchanged if absent.r¸   Fr¹   Ú>Trf   )r¯   r¼   rŽ   r¾   )r¶   ÚstrippedÚpast_fallbackrÁ   s   &   rT   Ú_strip_reply_fallbackrÌ   Ã   sƒ   € ç�t—‘ t×,Ò,ØˆØ€HØ€MØ—
‘
˜4Ö ˆßØ�‰˜t×$Ò$¨°¬ÙØ ˆMØ�rŒzÙØ�‰˜Öñ !÷ #+ˆ4�9‰9�XÓÐ4°Ð4rV   c               ó    € V ^8„  d   QhRRRR/# )rL   ÚexcÚBaseExceptionra   rQ   rR   )rS   s   "rT   rU   rU   Ü   s   € ÷ <ñ <¨ð <¸4ñ <rV   c                óî   € \        V RR4      p\        V\        4      '       d*   VP                  4       P	                  4       \
        9   d   R# \        V RR4      p\        V\        4      ;'       d    VR9   # )aW  Return True only for genuine auth failures that must stop the sync loop.

A transient homeserver outage surfaces as a 5xx whose body may be an HTML
error page (Umbrel's app-proxy returns one). Naive substring checks like
``"403" in str(exc)`` false-positive on digits embedded in that HTML (an SVG
path coordinate such as ``1403.2`` contains ``403``) or in the ``since`` token
echoed by a timeout message, which stopped the sync loop permanently on a
passing blip. mautrix raises ``MatrixRequestError`` with ``errcode`` and
``http_status`` for every non-2xx, so classify on those alone; anything
without a structured auth signal (timeouts, dropped connections, 5xx) is
retried. Deliberately not ``.status``/``.status_code``/``.code``: those
belong to unrelated exception shapes (aiohttp responses, OS errno) and can
misclassify on a coincidental integer.
ÚerrcodeNTÚhttp_status)i‘  i“  )ÚgetattrÚ
isinstancer}   r�   r£   Ú_MATRIX_PERMANENT_ERRCODESrP   )rÎ   rÑ   Ústatuss   &  rT   Ú_is_permanent_matrix_auth_errorr×   Ü   sa   € ô �c˜9 dÓ+€GÜ�'œ3×Ò G§M¡M£O×$9Ñ$9Ó$;Ô?YÔ$YÙÜ�S˜-¨Ó.€FÜ�fœcÓ"×;Ð; v°Ñ';Ð;rV   c               ó    € V ^8„  d   QhRRRR/# )rL   r¶   r}   ra   útuple[str, str]rR   )rS   s   "rT   rU   rU   ò   s   € ÷ Vñ V ð V¨ñ VrV   c                óÌ  € V '       d   V P                  R4      '       g   RV 3# V P                  R4      p^ pV\        V4      8  d6   W,          P                  R4      '       g   W,          R8X  d   V^,          pKE  V\        V4      8  d   W,          R8X  d
   V^,          pRP                  VRV 4      pV\        V4      8¼  d   VR3# VR,           RP                  WR 4      3# )u»  Split ``> quote\n\nreply`` into ``(quote_block, reply_text)``; ``("", body)`` when absent.

The two halves always concatenate back to *body* verbatim (``quote + reply == body``), so
callers can transform one half and rebuild the body without disturbing the other. The blank
separator line belongs to the quote block. Used to keep the ``> <@user:srv>`` reply pill â€”
the only mention text in a reply-to-the-bot â€” out of whole-body rewrites.
r¸   rf   r¹   rÉ   N)r¯   r¼   rŠ   r¾   )r¶   Úlinesr•   Úheads   &   rT   Ú_split_reply_fallbackrÝ   ò   sÃ   € ÷ �t—‘ t×,Ò,Ø�4ˆxˆØ�J‰J�tÓ€EØ
€CØ
”�E“
Ô
 ¥
× 5Ñ 5°d× ;Ò ;¸u½zÈSÔ?PØˆq�ŠØ
ŒS�‹ZÔ˜E�J¨"Ô,Øˆq�ˆØ�9‰9�U˜4˜C�[Ó!€DØ¤ E£
Ô*ˆD�"ˆ:ÐU°¸µ¸d¿i¹iÈÈdÈÓ>TÐ0UÐUrV   c                  ó¸   a € ] tR tRtRt0 RmtRR0tR V 3R ll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tR R ltR R ltR R ltRtV ;t# )Ú_MatrixHtmlSanitizeri  z9Allowlist sanitizer for Matrix-compatible formatted HTML.ÚbrÚhrc               ó   € V ^8„  d   QhRR/# ©rL   ra   ÚNonerR   )rS   s   "rT   rU   Ú!_MatrixHtmlSanitizer.__annotate__  s   € ÷ ñ ˜$ñ rV   c                	óD   <€ \         SV `  R R7       . V n        ^ V n        R# )F)Úconvert_charrefsN)ÚsuperÚ__init__Ú_partsÚ_skip_depth)ÚselfÚ	__class__s   &€rT   ré   Ú_MatrixHtmlSanitizer.__init__  s"   ø€ Ü‰Ñ¨%ÐÔ0Ø!#ˆŒØˆÖrV   c               ó    € V ^8„  d   QhRRRR/# )rL   Úvaluer}   ra   rR   )rS   s   "rT   rU   rå     s   € ÷ ñ ˜ð  ñ rV   c                	ó  € \         P                  ! R RT ;'       g    R4      P                  4       p\         P                  ! RV4      pV'       d    VP	                  ^4      P                  4       MRpV'       d
   VR9  d   R# V# )z[\x00-\x1f\x7f]+rf   z^([A-Za-z][A-Za-z0-9+.-]*):>   ÚhttpÚhttpsÚmailtoÚmatrix)ÚreÚsubr�   r±   r²   r£   )rð   rÊ   r±   Úschemes   &   rT   Ú	_safe_urlÚ_MatrixHtmlSanitizer._safe_url  sb   € ä—6’6Ð-¨r°5·;°;¸BÓ?×EÑEÓGˆÜ—’Ð7¸ÓBˆß+0�—‘˜Q“×%Ñ%Ô'°bˆß�fÐ$IÔIÙØˆrV   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   Útagr}   Úattrsúlist[tuple[str, str | None]]ra   rR   )rS   s   "rT   rU   rå     s"   € ÷ ñ ˜sð Ð+Gð ÈCñ rV   c           	     	óÞ  € . pV FÕ  w  rE\        T;'       g    R 4      P                  4       pVf   R M
\        V4      pVR8X  dE   VR8X  d>   V P                  V4      pV'       d#   VP                  R\	        VRR7       R24       K‚  K„  VR8X  g   K�  VR8X  g   K–  \
        P                  ! R	V4      '       g   Kµ  VP                  R
\	        VRR7       R24       K×  	  R P                  V4      # )rf   ÚaÚhrefz href="T©ÚquoteÚ"ÚcodeÚclasszlanguage-[A-Za-z0-9_+.-]{1,64}z class=")r}   r£   rù   rŽ   Ú_html_escaperö   Ú	fullmatchr¾   )	rì   rü   rý   ÚsafeÚkeyrð   ÚattrÚ	raw_valuer  s	   &&&      rT   Ú_safe_attrsÚ _MatrixHtmlSanitizer._safe_attrs  sÆ   € ØˆÛ‰JˆCÜ�s—y�y˜b“>×'Ñ'Ó)ˆDØ#šm™´°U³ˆIØ�cŒz˜d fœnØ—~‘~ iÓ0�ßØ—K‘K '¬,°tÀ4Ô*HÐ)IÈÐ KÖLñ à˜– 4¨7¦?´r·|²|ÐDeÐgp×7qÔ7qØ—‘˜h¤|°IÀTÔ'JÐ&KÈ1ÐMÖNñ  ð �w‰w�t‹}ÐrV   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   rü   r}   rý   rþ   ra   rä   rR   )rS   s   "rT   rU   rå   )  s(   € ÷ sñ s 3ð sÐ/Kð sÐPTñ srV   c                	óB  € VP                  4       pVR9   d   V ;P                  ^,          un        R# V P                  '       g[   WP                  9   dI   V P                  P	                  WP
                  9   d   RV R2MRV V P                  W4       R24       R# R# R# )ÚscriptÚ<rÉ   N>   Ústyler  )r£   rë   Ú_ALLOWED_TAGSrê   rŽ   Ú
_VOID_TAGSr  )rì   rü   rý   s   &&&rT   Úhandle_starttagÚ$_MatrixHtmlSanitizer.handle_starttag)  sˆ   € Ø�i‰i‹kˆØÐ%Ô%Ø×Ò Õ!×Ø×!×!Ð! c×-?Ñ-?Ô&?Ø�K‰K×Ñ¨S·O±OÔ-C  3 % q™zÈ1ÈSÈEÐRV×RbÑRbÐcfÓRnÐQoÐopÐIqÖrñ '@Ñ!rV   c               ó    € V ^8„  d   QhRRRR/# )rL   rü   r}   ra   rä   rR   )rS   s   "rT   rU   rå   0  s   € ÷ (ñ ( ð (¨ñ (rV   c                	ó4  € VP                  4       pVR9   d.   V P                  '       d   V ;P                  ^,          un        R# V P                  '       g!   WP                  9  g   WP                  9   d   R# V P                  P                  RV R24       R# )r  Nú</rÉ   >   r  r  )r£   rë   r  r  rê   rŽ   )rì   rü   s   &&rT   Úhandle_endtagÚ"_MatrixHtmlSanitizer.handle_endtag0  sr   € Ø�i‰i‹kˆØÐ%Ô%¨$×*:×*:Ð*:Ø×Ò Õ!ÕÙØ××Ð˜s×*<Ñ*<Ô<ÀÇÁÔ@VÙØ�‰×Ñ˜R ˜u A˜;Ö'rV   c               ó    € V ^8„  d   QhRRRR/# )rL   rJ   r}   ra   rä   rR   )rS   s   "rT   rU   rå   9  s   € ÷ %ñ %˜#ð % $ñ %rV   c                	ód   € V P                   '       g   V P                  P                  V4       R # R # rt   )rë   rê   rŽ   )rì   rJ   s   &&rT   Ú_emitÚ_MatrixHtmlSanitizer._emit9  s%   € Ø××ÐØ�K‰K×Ñ˜tÖ$ñ  rV   c               ó    € V ^8„  d   QhRRRR/# )rL   Údatar}   ra   rä   rR   )rS   s   "rT   rU   rå   =  s   € ÷ 'ñ ' ð '¨ñ 'rV   c                	ó:   € V P                  \        V4      4       R # rt   )r  r  )rì   r"  s   &&rT   Úhandle_dataÚ _MatrixHtmlSanitizer.handle_data=  s   € Ø�
‰
”< Ó%Ö&rV   c               ó    € V ^8„  d   QhRRRR/# ©rL   rš   r}   ra   rä   rR   )rS   s   "rT   rU   rå   @  s   € ÷  ñ   Sð  ¨Tñ  rV   c                	ó0   € V P                  R V R24       R# )Ú&Ú;N©r  ©rì   rš   s   &&rT   Úhandle_entityrefÚ%_MatrixHtmlSanitizer.handle_entityref@  s   € Ø�
‰
�Q�t�f˜A�;ÖrV   c               ó    € V ^8„  d   QhRRRR/# r'  rR   )rS   s   "rT   rU   rå   C  s   € ÷ !ñ ! 3ð !¨4ñ !rV   c                	ó0   € V P                  R V R24       R# )z&#r*  Nr+  r,  s   &&rT   Úhandle_charrefÚ#_MatrixHtmlSanitizer.handle_charrefC  s   € Ø�
‰
�R˜�v˜Q�<Ö rV   c               ó   € V ^8„  d   QhRR/# ©rL   ra   r}   rR   )rS   s   "rT   rU   rå   F  s   € ÷ $ñ $˜#ñ $rV   c                	ó8   € R P                  V P                  4      # ©rf   )r¾   rê   ©rì   s   &rT   Úget_htmlÚ_MatrixHtmlSanitizer.get_htmlF  s   € Ø�w‰w�t—{‘{Ó#Ð#rV   )rê   rë   >   r   ÚbÚiÚpÚsrà   ÚemÚh1Úh2Úh3Úh4Úh5Úh6rá   ÚliÚolÚtdÚthÚtrÚulÚdelÚprer  ÚtableÚtbodyÚtheadÚstrikeÚstrongÚ
blockquote)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r  r  ré   Ústaticmethodrù   r  r  r  r  r$  r-  r1  r8  Ú__static_attributes__Ú__classcell__©rí   s   @rT   rß   rß     se   ø† ÙCò`€Mð ˜�€J÷ð ð
 ôó ðõõsõ(õ%õ'õ õ!÷$ó $rV   rß   T)Úfrozenc                  óŽ   € ] tR tRt$ RtR]R&   R]R&   R]R&   R]R&   R]R	&   R
]R&   R]R&   R]R&   R]R&   R]R&   RtR]R&   RtR# )ÚMatrixRoomIdentityiJ  z=Resolved Matrix room identity for routing and prompt context.r}   Úroom_idr›   Ú	room_nameÚ
room_topicÚcanonical_aliasÚserver_namez
int | NoneÚjoined_member_countrQ   Úis_direct_account_dataÚdisplay_nameÚhas_explicit_nameÚ	chat_typeFÚconflictrR   N)rS  rT  rU  rV  rW  Ú__annotations__ri  rY  rR   rV   rT   r^  r^  J  sI   ‡ áGØƒLØÓØÓØÓØÓØ#Ó#Ø Ó ØÓØÓØƒNØ€Hˆd×rV   r^  c                  ó‚   € ] tR tRt$ RtR]R&   R]R&   R]R&   RtR]R	&   R
tR]R&   R
tR]R&   ]	! ]
RR7      tR]R&   RtR
# )Ú_MatrixApprovalPromptiZ  z,Pending reaction-based exec approval prompt.r}   Úsession_keyÚchat_idÚ
message_idFrQ   r³   Nr›   Úrequester_user_idúfloat | NoneÚ
expires_at)Údefault_factoryÚinitúdict[str, str]Úbot_reaction_eventsrR   )rS  rT  rU  rV  rW  rj  r³   rp  rr  r   r¡   rv  rY  rR   rV   rT   rl  rl  Z  sF   ‡ á6ØÓØƒLØƒOØ€HˆdÓØ$(Ð�zÓ(Ø#€J�Ó#Ù*/ÀÈ5Ô*QÐ˜×QrV   rl  c                  ó”   € ] tR tRt$ RtR]R&   R]R&   R]R&   R]R&   R	]R
&   RtR]R&   RtR]R&   RtR]R&   ]	! ]
R7      tR]R&   RtR# )Ú_MatrixPickerPromptif  zdPending reaction-based picker; ``choices`` maps emoji -> selection, ``on_selected`` is the callback.r}   rn  ro  rm  r¡   Úchoicesr   Úon_selectedNr›   rp  rq  rr  FrQ   r³   )rs  ru  rv  rR   )rS  rT  rU  rV  rW  rj  rp  rr  r³   r   r¡   rv  rY  rR   rV   rT   rx  rx  f  sO   ‡ ánØƒLØƒOØÓØƒMØÓØ$(Ð�zÓ(Ø#€J�Ó#Ø€HˆdÓÙ*/ÀÔ*EÐ˜×ErV   rx  iÈ¯  c               ó    € V ^8„  d   QhRRRR/# )rL   rJ   r}   ra   rP   rR   )rS   s   "rT   rU   rU   �  s   € ÷ %ñ %�Cð %˜Cñ %rV   c                ó6   € \        V P                  R 4      4      # )úutf-8)rŠ   Úencode©rJ   s   &rT   Ú	_utf8_lenr€  �  s   € Üˆt�{‰{˜7Ó#Ó$Ð$rV   c               ó    € V ^8„  d   QhRRRR/# )rL   rÂ   rb   ra   rP   rR   )rS   s   "rT   rU   rU   …  s   € ÷ Uñ U˜Nð U¨sñ UrV   c                óF   € \        \        P                  ! V RRR7      4      # )z\Size of event content as the homeserver counts it (canonical JSON is UTF-8, not \u-escaped).F)Úensure_asciiÚ
separators)Ú,Ú:)r€  ÚjsonÚdumps)rÂ   s   &rT   Ú_content_bytesr‰  …  s   € ä”T—Z’Z °eÈ
ÔSÓTÐTrV   c               ó   € V ^8„  d   QhRR/# )rL   ra   rP   rR   )rS   s   "rT   rU   rU   Š  s   € ÷ Cñ C¨3ñ CrV   c                óà  € \        \        V RR4      RRR4      pVe    \        V4      P                  4       '       g^   \	        \
        4      ;_uu_ 4        ^ RIHp VP                  R4      pV'       d   VP                  '       d   VP                  pRRR4        \        V4      p\        R\        T\         4      4      #   + '       g   i     L6; i  \        \        3 d
    \        u # i ; i)zAResolve outbound chunk size from config, env, or plugin registry.ÚextraNÚmax_message_lengthÚMATRIX_MAX_MESSAGE_LENGTH)Úplatform_registryrõ   iô  )Ú_extra_or_secretrÓ   r}   r�   r   r‚   Úgateway.platform_registryr�  Úgetr�  rP   Ú	TypeErrorÚ
ValueErrorÚDEFAULT_MAX_MESSAGE_LENGTHr�   r�   Ú!MATRIX_MAX_MESSAGE_LENGTH_CEILING)ÚconfigÚrawr�  Úentryrð   s   &    rT   Ú_resolve_max_message_lengthrš  Š  s¸   € ä
œ7 6¨7°DÓ9Ð;OÐQlÐnrÓ
s€CØ
‚{œ#˜c›(Ÿ.™.×*Ò*Ü”i× Õ ÝCØ%×)Ñ)¨(Ó3ˆEß˜×1×1Ð1Ø×.Ñ.�÷	 !ð
*Ü�C“ˆô ˆs”C˜Ô@ÓAÓBÐB÷ !× ûô ”zÐ"ô *Ü)Ò)ð*ús$   Á1C ÂC ÂC Ã C	ÃC-Ã,C-)Úget_hermes_dirz6(?<![\w/])(@[0-9A-Za-z._=/-]+:[0-9A-Za-z.-]+(?::\d+)?)z^Install with: pip install 'mautrix[encryption]' asyncpg aiosqlite  (requires libolm C library)c              #  ó*   "  € T F	  q R 2x € K  	  R# 5i)u   ï¸�âƒ£NrR   )rv   Úds   & rT   rx   rx   «  s   é € Ð&OÁ;¸a¨¨LÕ'9Ã;ùs   ‚Ú	123456789c               ó    € V ^8„  d   QhRRRR/# ©rL   rJ   r}   ra   rQ   rR   )rS   s   "rT   rU   rU   ®  s   € ÷ Wñ W¨Cð W°Dñ WrV   c                ó$   € \        V R\        4      # )uW   True when an m.image body is just the uploaded filename (no caption) â€” not user text.úimage/)Ú_looks_like_transport_filenameÚ_MATRIX_IMAGE_FILENAME_EXTSr  s   &rT   Ú!_looks_like_matrix_image_filenamer¥  ®  s   € ä)¨$°Ô:UÓVÐVrV   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   rJ   r}   ÚextsÚ	frozensetÚreject_spacesrQ   ra   rR   )rS   s   "rT   rU   rU   ³  s0   € ÷ [ñ [¨ð [À9ð [Ð]að [Ðnrñ [rV   c                óB  € \        T ;'       g    R4      P                  4       pV'       d   RV9   g   VP                  R4      '       d   R# V'       d=   \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   R# \	        V4      P
                  V8w  d   R# \	        V4      P                  P                  4       pV'       g   R# \        P                  ! V4      w  rg\        T;'       d    VP                  V4      4      ;'       g    WR9   # )zXBare single-token filename with a known media extension or a matching guessed MIME type.rf   r¹   r    Fc              3  ó@   "  € T F  qP                  4       x € K  	  R # 5irt   )Úisspace)rv   Úchs   & rT   rx   Ú1_looks_like_transport_filename.<locals>.<genexpr>¹  s   é € Ð>±I¨bŸZ™ZŸ\˜\³Iùs   ‚T)r}   r�   ÚendswithÚanyr   rš   Úsuffixr£   Ú	mimetypesÚ
guess_typerQ   r¯   )rJ   Úmime_prefixesr§  r©  r¨   r±  Úguessed_typer�   s   &&&&    rT   r£  r£  ³  sÊ   € ä�D—J�J˜B“×%Ñ%Ó'€Iß˜ 	Ô)¨Y×-?Ñ-?À×-DÒ-DÙçŸ›Ñ>±IÓ>ŸŸšÑ>±IÓ>×>Ò>ÙÜˆIƒ×Ñ˜yÔ(ÙÜ�)‹_×#Ñ#×)Ñ)Ó+€FßÙÜ×*Ò*¨9Ó5�O€LÜ�×GÐG ×!8Ñ!8¸Ó!GÓH×ZÐZÈFÉNÐZrV   c               ó    € V ^8„  d   QhRRRR/# r   rR   )rS   s   "rT   rU   rU   Ä  s   € ÷ iñ i¨Cð i°Dñ irV   c                ó&   € \        V R\        R4      # )zTTrue when an m.audio/m.file/m.video body is just the uploaded filename (no caption).T)zaudio/zvideo/)r£  Ú_MATRIX_MEDIA_FILENAME_EXTSr  s   &rT   Ú!_looks_like_matrix_media_filenamer¹  Ä  s   € ä)¨$Ð0DÔFaÐcgÓhÐhrV   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   Úmsgtyper}   r¶   ra   rQ   rR   )rS   s   "rT   rU   rU   É  s&   € ÷ cñ c Sð c°ð c¸ñ crV   c                óV   € V R8X  d   \        V4      # V R9   ;'       d    \        V4      # )zKTrue when a media event body is only the uploaded filename for its msgtype.úm.image)úm.audioúm.fileúm.video)r¥  r¹  )r»  r¶   s   &&rT   Ú_is_bare_media_filenamerÁ  É  s0   € à�)ÔÜ0°Ó6Ð6ØÐ6Ñ6×bÐbÔ;\Ð]aÓ;bÐbrV   c               ó    € V ^8„  d   QhRRRR/# )rL   Úeventr   ra   r   rR   )rS   s   "rT   rU   rU   Ð  s   € ÷ 6ñ 6¨3ð 6°5ñ 6rV   c                óÂ   €  \        \        V RR4      ;'       g    \        V RR4      ;'       g    ^ 4      pTR8”  d
   TR,          # T#   \        \        3 d     R# i ; i)zGReturn a Matrix event timestamp in seconds, accepting ms or sec values.Ú	timestampNÚserver_timestampç        l    d(	 g     @�@)r   rÓ   r“  r”  )rÃ  Útss   & rT   Ú_matrix_event_timestamp_secondsrÉ  Ð  sg   € ðÜ”7˜5 +¨tÓ4×eÐe¼ÀÐGYÐ[_Ó8`×eÐeÐdeÓfˆð ˜~Ô-ˆ2��;Ð5°2Ð5øô ”zÐ"ô Úðús   ‚A	 ›A	 °A	 Á	AÁAc               ó   € V ^8„  d   QhRR/# )rL   Ú	proxy_urlr›   rR   )rS   s   "rT   rU   rU   Ú  s   € ÷ 2ñ 2 jñ 2rV   c                ó¾  € ^ RI pV '       g   VP                  \        4       R7      # V P                  R4      ^ ,          P	                  4       P                  R4      '       d+    ^ RIHp VP                  VP                  V RR7      R7      # VP                  V R
7      #   \         d4    \        P                  R	T 4       TP                  \        4       R7      u # i ; i)a  ClientSession whose proxy applies to *all* requests: mautrix's ``HTTPAPI._send()`` never
forwards per-request ``proxy=``, so it must be session-level (``proxy=`` for HTTP(S),
``ProxyConnector`` for SOCKS); with no proxy, ``trust_env`` honours HTTP(S)_PROXY.N)Ú	trust_envz://Úsocks)ÚProxyConnectorT)Úrdns)Ú	connectoruV   aiohttp_socks not installed â€” SOCKS proxy %s ignored. Run: pip install aiohttp-socks)Úproxy)ÚaiohttpÚClientSessionr:   r¼   r£   r¯   Úaiohttp_socksrÏ  Úfrom_urlÚImportErrorrƒ   Úwarning)rË  rÓ  rÏ  s   &  rT   Ú_create_matrix_sessionrÙ  Ú  sÌ   € ó ßØ×$Ñ$Ô/@Ó/BÐ$ÓCÐCØ‡��uÓ˜aÕ ×&Ñ&Ó(×3Ñ3°G×<Ò<ð	HÝ4Ø×(Ñ(°>×3JÑ3JÈ9Ð[_Ð3JÓ3`Ð(ÓaÐað
 × Ñ  yÐ Ó1Ð1øô	 ô 	HÜ�N‰NØhÐjsôuà×(Ñ(Ô3DÓ3FÐ(ÓGÒGð	Hús   Á#(B Â;CÃCc               ó   € V ^8„  d   QhRR/# ©rL   ra   rQ   rR   )rS   s   "rT   rU   rU   ì  s   € ÷ ñ ˜$ñ rV   c                 ó`   €  ^ RI Hp  ^ RIHp ^ RIp^ RIpR#   \        \        3 d     R# i ; i)uP  True if all four E2EE deps import: olm, PgCryptoStore (also drives sqlite), asyncpg, aiosqlite.
Without all four, encrypted rooms fail at connect with ``No module named 'asyncpg'``.

Verifies python-olm (via mautrix.crypto.OlmMachine), the SQLite crypto store backend
(mautrix.crypto.store.asyncpg.PgCryptoStore â€” yes, the PgCryptoStore class also drives the sqlite
backend in mautrix 0.21), and the database drivers actually used at connect time (``asyncpg`` for the
underlying upgrade_table machinery, ``aiosqlite`` for the ``sqlite:///`` URL we pass to
``Database.create``). See #31116.
©Ú
OlmMachine©ÚPgCryptoStoreNTF)Úmautrix.cryptorÞ  Úmautrix.crypto.store.asyncpgrà  ÚasyncpgÚ	aiosqliter×  ÚAttributeError)rÞ  rà  rã  rä  s       rT   Ú_check_e2ee_depsræ  ì  s-   € ðÝ-Ý>ÛÛÙøÜœÐ(ô Úðús   ‚ ˜-¬-c               ó    € V ^8„  d   QhRRRR/# )rL   rð   r   ra   r}   rR   )rS   s   "rT   rU   rU      s   € ÷ ñ  ð ¨ñ rV   c                óŒ   € \        T ;'       g    R 4      P                  4       P                  4       pVR9   d   R# VR9   d   R# R# )rf   ÚrequiredÚoptionalÚoff)ré  ÚrequireÚtruerl   ÚyesÚon)rê  ÚpreferÚ	preferred)r}   r�   r£   )rð   r˜  s   & rT   Ú_normalize_e2ee_moderò     s?   € Ü
ˆe�kˆk�rÓ
×
 Ñ
 Ó
"×
(Ñ
(Ó
*€CØ
Ð?Ô?ÙØ
Ð1Ô1ÙÙrV   c               ó    € V ^8„  d   QhRRRR/# )rL   rŒ  úOptional[dict[str, Any]]ra   r}   rR   )rS   s   "rT   rU   rU   	  s   € ÷ 3ñ 3Ð6ð 3À#ñ 3rV   c                óØ   € T ;'       g    / p V P                  R4      ;'       g    \        RR4      pV'       d   \        V4      # V P                  R\        R4      4      pV'       d   R# R# )zAResolve E2EE mode with MATRIX_ENCRYPTION backwards compatibility.Ú	e2ee_modeÚMATRIX_E2EE_MODErf   Ú
encryptionÚMATRIX_ENCRYPTIONré  rë  )r’  Ú_get_scoped_secretrò  Ú_env_truthy)rŒ  ÚexplicitÚlegacy_enableds   &  rT   Ú_resolve_e2ee_moderþ  	  s^   € à�KˆK�R€EØ�y‰y˜Ó%×SÐSÔ);Ð<NÐPRÓ)S€HßÜ# HÓ-Ð-Ø—Y‘Y˜|¬[Ð9LÓ-MÓN€Nß'ˆ:Ð2¨UÐ2rV   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   rš   r}   Údefaultra   rQ   rR   )rS   s   "rT   rU   rU     s&   € ÷ Rñ R�cð R Cð R°ñ RrV   c                óL   € \        \        W4      4      P                  4       R9   # )zEReturn True when the env var is one of true/1/yes (case-insensitive).©rí  rl   rî  )r}   rú  r£   )rš   r   s   &&rT   rû  rû    s"   € äÔ! $Ó0Ó1×7Ñ7Ó9Ð=QÑQÐQrV   c               ó   € V ^8„  d   QhRR/# )rL   rš   r}   rR   )rS   s   "rT   rU   rU     s   € ÷ ñ �cñ rV   c                ó`   €  V! \        V \        V4      4      4      #   \         d    Tu # i ; i)zAParse a numeric env var, falling back to *default* on ValueError.)rú  r}   r”  )rš   r   Úcasts   &&&rT   Ú_env_numberr    s2   € ðÙÔ& t¬S°«\Ó:Ó;Ð;øÜô ØŠðús   ‚ �-¬-c               ó    € V ^8„  d   QhRRRR/# )rL   r˜  r   ra   úset[str]rR   )rS   s   "rT   rU   rU      s   € ÷ Añ A�#ð A˜(ñ ArV   c                ót  € \        V \        4      '       dK   V  Uu0 uF=  p\        V4      P                  4       '       g   K$  \        V4      P                  4       kK?  	  up# \        V 4      P	                  R4       Uu0 uF*  qP                  4       '       g   K  VP                  4       kK,  	  up# u upi u upi )zINormalize a comma-separated string or list into a set of stripped tokens.r…  )rÔ   rN   r}   r�   r¼   )r˜  Úrs   & rT   Ú_csv_setr     sv   € ä�#”t×ÒÙ(+Ó>© 1¬s°1«v¯|©|¯~””�A“—‘–©Ñ>Ð>Ü" 3›xŸ~™~¨cÔ2Ó@Ñ2˜!·g±g·iŒIˆA�G‰GŽIÑ2Ñ@Ð@ùò ?ùÚ@s   ›!B0ÁB0Á=B5ÂB5c               ó    € V ^8„  d   QhRRRR/# )rL   Ú
relates_tor¡   ra   úOptional[str]rR   )rS   s   "rT   rU   rU   '  s   € ÷ \ñ \˜Tð \ mñ \rV   c                óT   € V P                  R4      R8X  d   V P                  R4      # R# )z:The m.thread root event_id an event belongs to, else None.Úrel_typeúm.threadÚevent_idN)r’  )r  s   &rT   Ú_thread_rootr  '  s'   € à)3¯©¸
Ó)CÀzÔ)Qˆ:�>‰>˜*Ó%Ð[ÐW[Ð[rV   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   r
  r}   Úenv_namera   r  rR   )rS   s   "rT   rU   rU   ,  s&   € ÷ ]ñ ] ð ]¨sð ]°xñ ]rV   c           
     óF   € \        \        V P                  WRRR7      4      # )uI   Resolve a room/user list: scoped env var â†’ config.extra[key] â†’ empty.rf   F)Úblank_is_unset)r  r�  rŒ  )r—  r
  r  s   &&&rT   Ú_extra_csv_setr  ,  s   € äÔ$ V§\¡\°3À"ÐUZÔ[Ó\Ð\rV   c               ó   € V ^8„  d   QhRR/# )rL   ra   úOptional[Path]rR   )rS   s   "rT   rU   rU   1  s   € ÷ Cñ C >ñ CrV   c                 ó|   € \        RR4      P                  4       p V '       d   \        V 4      P                  4       # R# )z®MATRIX_RECOVERY_KEY_OUTPUT_FILE via the profile-scoped reader: a bare os.getenv under
multiplex resolves the default profile's path, writing/finding the wrong profile's file.ÚMATRIX_RECOVERY_KEY_OUTPUT_FILErf   N)rú  r�   r   Ú
expanduser)Úoutput_files    rT   Ú_recovery_key_output_pathr  1  s5   € ô %Ð%FÈÓK×QÑQÓS€Kß-8Œ4�Ó×'Ñ'Ó)ÐB¸dÐBrV   c               ó    € V ^8„  d   QhRRRR/# )rL   Úrecovery_keyr}   ra   r  rR   )rS   s   "rT   rU   rU   8  s   € ÷ ñ ¸ð Àñ rV   c                ót  € \        4       pVf   R# VP                  P                  RRR7       \        P                  ! V\        P
                  \        P                  ,          \        P                  ,          R4      p \        P                  ! VRRR7      ;_uu_ 4       pVP                  V 4       VP                  R4       RRR4       V#   + '       g   i     T# ; i  \         dL    \        \        4      ;_uu_ 4        \        P                  ! T4       RRR4       h   + '       g   i     h ; ii ; i)	z\Write a generated recovery key to MATRIX_RECOVERY_KEY_OUTPUT_FILE (0600, never overwritten).NT©ÚparentsÚexist_oki€  Úwr}  )Úencodingr¹   )r  ÚparentÚmkdirÚosÚopenÚO_WRONLYÚO_CREATÚO_EXCLÚfdopenÚwriter‚   r   ÚOSErrorÚclose)r!  r`   ÚfdÚfhs   &   rT   Ú&_write_matrix_recovery_key_output_filer5  8  sØ   € ä$Ó&€DØ‚|ÙØ‡K�K×Ñ˜d¨TÐÔ2Ü	�Š�”r—{‘{¤R§Z¡ZÕ/´"·)±)Õ;¸UÓ	C€BðÜ�YŠY�r˜3¨×1Õ1°RØ�H‰H�\Ô"Ø�H‰H�TŒN÷ 2ð €K÷ 2Ö1ð €Kûô	 ô Ü”g×ÕÜ�HŠH�RŒL÷ à÷ ÖàúðúsB   Á?!C! Â #CÃC! ÃC	ÃC! ÃC! Ã!"D7ÄD#Ä	D7Ä#D3Ä.	D7c               ó   € V ^8„  d   QhRR/# )rL   ra   ztuple[Optional[Path], str]rR   )rS   s   "rT   rU   rU   J  s   € ÷ ñ Ð0Jñ rV   c                 óÔ   € \        4       p V f   R# V P                  4       '       d   R#  V P                  P                  RRR7       V R3#   \         d   pRRT 23u Rp?# Rp?ii ; i)zHReturn a usable one-time recovery-key output path, or a redacted reason.NTr#  z
unusable: rf   )NÚnot_configured)NÚexists)r  r9  r(  r)  r‚   )r`   rÎ   s     rT   Ú&_get_matrix_recovery_key_output_targetr:  J  sq   € ä$Ó&€DØ‚|Ø%Ð%Ø‡{�{‡}‚}ØÐð(Ø�‰×Ñ $°ÐÔ6ð �ˆ8€Oøô ô (Ø�z # Ð'Ð'Õ'ûð(ús   ªA ÁA'ÁA"ÁA'Á"A'c               ó$   € V ^8„  d   QhRRRRRR/# )rL   Úmxidr}   r!  ra   rä   rR   )rS   s   "rT   rU   rU   X  s!   € ÷ ñ °ð À3ð È4ñ rV   c                ó.  €  \        V4      pT'       d   \        P                  RY4       R# \        P                  RT 4       R#   \         d    \        P                  RT 4        R# \         d"   p\        P                  RY4        Rp?R# Rp?ii ; i)zBHandle a freshly generated Matrix recovery key without logging it.z¼Matrix: bootstrapped cross-signing for %s. Recovery key output file already exists; refusing to overwrite. Store the generated key securely and set MATRIX_RECOVERY_KEY for future restarts.NzµMatrix: bootstrapped cross-signing for %s, but failed to write MATRIX_RECOVERY_KEY_OUTPUT_FILE: %s. Store the generated key securely and set MATRIX_RECOVERY_KEY for future restarts.z­Matrix: bootstrapped cross-signing for %s. A new recovery key was written to %s with mode 0600. Move it to your secret store and set MATRIX_RECOVERY_KEY for future restarts.zùMatrix: bootstrapped cross-signing for %s. A new recovery key was generated but will not be logged. Set MATRIX_RECOVERY_KEY_OUTPUT_FILE to write it once with mode 0600, or configure MATRIX_RECOVERY_KEY from your Matrix client before future restarts.)r5  ÚFileExistsErrorrƒ   rØ  r‚   )r<  r!  Úoutput_pathrÎ   s   &&  rT   Ú%_handle_generated_matrix_recovery_keyr@  X  s”   € ðÜ<¸\ÓJˆ÷ Ü�‰ðTàö	ô
 	�‰ð_ð ö		øô% ô Ü�‰ðHàIMô	Oò 	Üô Ü�‰ðHàIMô	Tõ 	ûðús#   ‚A Á!BÁ)BÁ2BÁ3BÂBc               ó   € V ^8„  d   QhRR/# r4  rR   )rS   s   "rT   rU   rU   u  s   € ÷ Añ A˜cñ ArV   c                 ó6   € \        RR4      P                  4       # )z¬MATRIX_RECOVERY_KEY via the profile-scoped reader: a bare os.getenv under multiplex resolves
the default profile's key and verification fails with "Key MAC does not match".ÚMATRIX_RECOVERY_KEYrf   )rú  r�   rR   rV   rT   Ú_scoped_recovery_keyrD  u  s   € ô Ð3°RÓ8×>Ñ>Ó@Ð@rV   z,HERMESTEX(?:DISPLAY|INLINE)(\d+)HERMESTEXENDzHERMESTEXDISPLAY%dHERMESTEXENDzHERMESTEXINLINE%dHERMESTEXENDc               ó    € V ^8„  d   QhRRRR/# )rL   rJ   r}   ra   z!tuple[str, list[tuple[str, str]]]rR   )rS   s   "rT   rU   rU   ˆ  s   € ÷ ñ ˜3ð Ð#Dñ rV   c                ó¶   a€ V '       d   RV 9  d   V . 3# . oR V3R llpR V3R llp\         P                  ! RW4      p \         P                  ! RW 4      p V S3# )a  Replace ``$$...$$``/``$...$`` with sentinel tokens.

Returns the tokenized text plus an ordered ``(tag, tex)`` store, where tag
is ``div`` for display math and ``span`` for inline math. Dollars that do
not form a pair (prices, literals) are left untouched.
Ú$c               ó    € V ^8„  d   QhRRRR/# ©rL   r±   zre.Match[str]ra   r}   rR   )rS   s   "rT   rU   Ú&_latex_to_tokens.<locals>.__annotate__“  s   € ÷ 5ñ 5˜Mð 5¨cñ 5rV   c                óž   <€ SP                  R V P                  ^4      P                  4       34       \        \	        S4      ^,
          ,          # )Údiv)rŽ   r²   r�   Ú_TEX_DISPLAY_TOKENrŠ   ©r±   Ústores   &€rT   Ú_sub_displayÚ&_latex_to_tokens.<locals>._sub_display“  s8   ø€ Ø�‰�e˜UŸ[™[¨›^×1Ñ1Ó3Ð4Ô5Ü!¤S¨£Z°!¥^Õ4Ð4rV   c               ó    € V ^8„  d   QhRRRR/# rI  rR   )rS   s   "rT   rU   rJ  —  s   € ÷ 4ñ 4˜=ð 4¨Sñ 4rV   c                óž   <€ SP                  R V P                  ^4      P                  4       34       \        \	        S4      ^,
          ,          # )Úspan)rŽ   r²   r�   Ú_TEX_INLINE_TOKENrŠ   rN  s   &€rT   Ú_sub_inlineÚ%_latex_to_tokens.<locals>._sub_inline—  s8   ø€ Ø�‰�f˜eŸk™k¨!›n×2Ñ2Ó4Ð5Ô6Ü ¤C¨£J°¥NÕ3Ð3rV   z\$\$([^\n$]+?)\$\$z (?<![\\$\w])\$([^\n$]+?)\$(?!\w)©rö   r÷   )rJ   rP  rV  rO  s   &  @rT   Ú_latex_to_tokensrY  ˆ  s^   ø€ ÷ �3˜d”?Ø�RˆxˆØ#%€E÷5ð 5÷4ð 4ô �6Š6Ð'¨Ó<€DÜ�6Š6Ð5°{ÓI€DØ�ˆ;ÐrV   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   Úhtmlr}   rO  úlist[tuple[str, str]]ra   rR   )rS   s   "rT   rU   rU      s"   € ÷ ,ñ ,˜cð ,Ð*?ð ,ÀCñ ,rV   c                ó@   a€ R V3R llp\         P                  W 4      # )zHExpand sentinel tokens into ``data-mx-maths`` markup (TeX HTML-escaped).c               ó    € V ^8„  d   QhRRRR/# rI  rR   )rS   s   "rT   rU   Ú)_tokens_to_mx_maths.<locals>.__annotate__£  s   € ÷ Eñ E�}ð E¨ñ ErV   c           	     óÈ   <€ \        V P                  ^4      4      pV\        S4      8¼  d   V P                  ^ 4      # SV,          w  r#\        VRR7      pRV RV RV RV R2	# )é   Tr  r  z data-mx-maths="ú">r  rÉ   )rP   r²   rŠ   r  )r±   r•   rü   ÚtexÚescapedrO  s   &    €rT   Ú_expandÚ$_tokens_to_mx_maths.<locals>._expand£  sj   ø€ Ü�%—+‘+˜a“.Ó!ˆØ”#�e“*Ôð —;‘;˜q“>Ð!Ø˜•:‰ˆÜ˜s¨$Ô/ˆØ�3�%Ð'¨ y°°7°)¸2¸c¸UÀ!ÐDÐDrV   )Ú_TEX_TOKEN_REr÷   )r[  rO  re  s   &f rT   Ú_tokens_to_mx_mathsrh     s"   ø€ ÷Eð Eô ×Ñ˜WÓ+Ð+rV   c               ó    € V ^8„  d   QhRRRR/# )rL   r[  r}   ra   rR   )rS   s   "rT   rU   rU   ¯  s   € ÷ (ñ ( ð (¨ñ (rV   c                óÚ   € \        4       p TP                  T ;'       g    R 4       VP                  4        VP                  4       #   \         d    \        T ;'       g    R 4      u # i ; ir6  )rß   Úfeedr2  r8  r‚   r  )r[  Ú	sanitizers   & rT   Ú_sanitize_matrix_htmlrm  ¯  sZ   € Ü$Ó&€Ið(Ø�‰�t—z�z˜rÔ"Ø�‰ÔØ×!Ñ!Ó#Ð#øÜô (Ü˜DŸJ˜J BÓ'Ò'ð(ús   ŒA  &A ÁA*Á A*Á)A*c               ó    € V ^8„  d   QhRRRR/# ©rL   Úurlr}   ra   rR   )rS   s   "rT   rU   rU   ¹  s   € ÷ ñ ˜Sð  Sñ rV   c                óf  €  \        \        V 4      4      pVP                  '       gL   VP                  '       g:   \        V 4      P	                  R^4      ^ ,          P	                  R^4      ^ ,          # \        VP                  VP                  VP                  RR34      #   \         d     R# i ; i)zAStrip query/fragment from URLs before logging signed media links.Ú?Ú#rf   z<url>)r   r}   rø   Únetlocr¼   r   r`   r‚   )rp  Úpartss   & rT   Ú_redact_url_for_logrv  ¹  s†   € ðÜœ˜S›Ó"ˆØ�|�|ˆ| E§L§L LÜ�s“8—>‘> # qÓ)¨!Õ,×2Ñ2°3¸Ó:¸1Õ=Ð=Ü˜5Ÿ<™<¨¯©°u·z±zÀ2ÀrÐJÓKÐKøÜô Úðús   ‚7B! º8B! Á3-B! Â!B0Â/B0c               ó    € V ^8„  d   QhRRRR/# r¬   rR   )rS   s   "rT   rU   rU   Ä  s   € ÷ ñ ¨ð °ñ rV   c                ó¦   € \         P                  ! RRT ;'       g    R4      p\         P                  ! RRV4      p\         P                  ! RRV4      # )z@Remove unsafe raw HTML before Markdown conversion can escape it.z0(?is)<\s*(script|style)\b[^>]*>.*?<\s*/\s*\1\s*>rf   z5(?is)\s+on[a-z0-9_-]+\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)zš(?is)\s+(href|src)\s*=\s*("[^"]*(?:javascript|data|vbscript):[^"]*"|'[^']*(?:javascript|data|vbscript):[^']*'|[^\s>]*(?:javascript|data|vbscript):[^\s>]*)rX  )rJ   r‘   s   & rT   Ú_pre_sanitize_matrix_markdownry  Ä  sM   € ä�VŠVÐGÈÈTÏZÈZÐUWÓX€FÜ�VŠVÐPÐRTÐV\Ó]€FÜ�6Š6ð 	jØ
ˆFóð rV   c               ó   € V ^8„  d   QhRR/# rÛ  rR   )rS   s   "rT   rU   rU   Í  s   € ÷ ñ ˜Tñ rV   c                 óD   €  ^ RI Hp  V ! R4      #   \         d     R# i ; i)up  PASSIVE registry ``check_fn`` â€” must never install; ``ensure_matrix_deps`` is the installer.

Registry ``check_fn`` â€” called from status displays and config loading, so it must never install
anything. The ACTIVE lazy-installer (``check_matrix_requirements``) is registered as ``ensure_deps_fn``
and runs from ``create_adapter()`` when this returns False (#79812).
)Ú	availablerõ   F)Úpmr|  r‚   )Úis_availables    rT   Úmatrix_deps_presentr  Í  s'   € ðÝ0Ù˜HÓ%Ð%øÜô Úðús   ‚ �žc               ó   € V ^8„  d   QhRR/# rÛ  rR   )rS   s   "rT   rU   rU   Û  s   € ÷  ñ   4ñ  rV   c                 ó>  € \        RR4      P                  4       p \        RR4      P                  4       p\        RR4      P                  4       pV '       g    V'       g   \        P                  R4       R# V'       g   \        P	                  R4       R# \        4       # )z]Credentials + deps answer for setup/status callers (credentials must NOT gate the installer).ÚMATRIX_ACCESS_TOKENrf   ÚMATRIX_PASSWORDÚMATRIX_HOMESERVERz;Matrix: neither MATRIX_ACCESS_TOKEN nor MATRIX_PASSWORD setFz!Matrix: MATRIX_HOMESERVER not set)rú  r�   rƒ   r„   rØ  Úensure_matrix_deps)ÚtokenÚpasswordÚ
homeservers      rT   Úcheck_matrix_requirementsr‰  Û  su   € äÐ4°bÓ9×?Ñ?ÓA€EÜ!Ð"3°RÓ8×>Ñ>Ó@€HÜ#Ð$7¸Ó<×BÑBÓD€JßŸÜ�‰ÐRÔSÙßÜ�‰Ð:Ô;ÙÜÓÐrV   c               ó   € V ^8„  d   QhRR/# rÛ  rR   )rS   s   "rT   rU   rU   é  s   € ÷ .ñ .˜Dñ .rV   c                 ó’  € ^ RI Hp  R pV P                  R4      '       d9   V P                  RV\	        4       4      '       g   \
        P                  R4       R# \        4       pVR8X  d-   \        4       '       g   \
        P                  R\        4       R# VR8X  d+   \        4       '       g   \
        P                  R	\        4       R
# )uÀ  ACTIVE deps-only installer (registry ``ensure_deps_fn``); rebinds the type globals. Installs the
whole ``platform.matrix`` group when ANY declared package is missing â€” short-circuiting on
``import mautrix`` left asyncpg/aiosqlite uninstalled forever.

Lazy-installs the full ``platform.matrix`` feature group via
``pm.extras.ensure_and_bind`` whenever any of the declared
packages (mautrix, Markdown, aiosqlite, asyncpg, aiohttp-socks) is
missing â€” not just mautrix itself.  Previously this short-circuited on
``import mautrix``, which left the other four packages uninstalled
forever and broke E2EE connect with ``No module named 'asyncpg'``
(#31116).  Rebinds module-level type globals on success.
)Úextrasc                 óN   € ^ RI Hp HpHpHpHpHpHpHp RV RVRVRVRVRVRVR	V/# )
é    r   r   r   r   r   r   r   r   r   )	Úmautrix.typesr   r   r   r   r   r   r   r   r   s           rT   Ú_importÚ#ensure_matrix_deps.<locals>._importø  sI   € ÷	i÷ 	ió 	ið ˜*Ø�wØ˜Ø˜]ØÐ 0Ø�fØ˜*Ø�fð	
ð 		
rV   rõ   zhMatrix: required packages not installed or need a restart. Run `hermes pm install`, then restart Hermes.Fré  z‘Matrix: E2EE is required but dependencies are missing. %s. Without this, encrypted rooms will not work. Set MATRIX_E2EE_MODE=off to disable E2EE.rê  z6Matrix: E2EE optional but dependencies are missing. %sT)r}  rŒ  ÚmissingÚensure_and_bindÚglobalsrƒ   rØ  rþ  ræ  re   Ú_E2EE_INSTALL_HINT)rŒ  r�  rö  s      rT   r…  r…  é  s¢   € õ ò
ð  ‡~�~�h×Ò¨×(>Ñ(>¸xÈÔRYÓR[×(\Ò(\Ü�‰ð<ô	
ñ Ü"Ó$€IØ�JÔÔ'7×'9Ò'9Ü�‰ðMäô	 ñ Ø�JÔÔ'7×'9Ò'9Ü�‰ÐOÔQcÔdÙrV   c                  ó:  a € ] tR tRtRtRtRtRtRt]	t
]	^d,
          t]R 4       tR R lt]R R	 l4       tR
 V 3R lltR R lt]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l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t]ERR% R& ll4       tR' R( ltR) R* lt R+ R, lt!R- R. lt"R/ R0 lt#R1R2/R3 R4 llt$R5 R6 lt%ER R7 R8 llt&R9 R: lt'R; R< lt(R= R> lt)R? R@ lt*RA RB lt+ERRC RD llt,RE RF lt-RGR2/RH RI llt.ER!RJ V 3RK lllt/RL RM lt0ER!RN RO llt1ER"RP RQ llt2ER#RR RS llt3ER#RT RU llt4ER!RV RW llt5RXt6]RY RZ l4       t7R[ R\ lt8R]R^R_R`RaRbRcRd/t9R]ReR_RfRaRgRcRh/t:R]RiR_RjRaRk/t;Rl Rm lt<ERRn Ro llt=Rp Rq lt>ERRr Rs llt?Rt Ru lt@ER$Rv Rw lltARx Ry ltBRz R{ ltCR| R} ltDER%R~ R lltER€ R� ltFR‚R2/Rƒ R„ lltGR… R† ltHR‡ Rˆ ltIR‰ RŠ ltJ]R‹ RŒ l4       tKR� RŽ ltLR� R� ltMR‘ R’ ltNR“ R” ltOER&R• R– lltPR— R˜ ltQERR™ Rš lltRR› Rœ ltSER'R� Rž lltT]RŸ R  l4       tUR¡ R¢ ltVR£ R¤ ltWR¥ R¦ ltXR§R2R¨R©/Rª R« lltYR¬ R­ ltZR® R¯ lt[R° R± lt\ER(R² R³ llt]ER(R´ Rµ llt^R¶ R· lt_R¸ R¹ lt`Rº R» ltaERR¼ R½ lltbR¾ R¿ ltcRÀ RÁ ltdRÂ RÃ lteRÄR2/RÅ RÆ lltfRÇ RÈ ltgERRÉ RÊ llthRË RÌ ltiRÍ RÎ ltjRÏ RÐ ltkRÑ RÒ ltlRÓ RÔ ltmRÕ RÖ ltnR× RØ ltoRÙ RÚ ltpRÛRÜ/RÝ RÞ lltqER(Rß Rà lltrER)Rá Râ lltsRã Rä ltt]u! ER*4      tvER+Rå Ræ lltw]Rç Rè l4       txRé Rê ltyRë Rì ltzERRí Rî llt{RïR2/Rð Rñ llt|Rò Ró lt}RôR2RõR2/Rö R÷ llt~Rø Rù ltRú Rû lt€ER,Rü Rý llt�RþR$RÿR$/ER  ER llt‚ER ER ltƒER ER lt„ER ER lt…ER ER	 lt†ER ER
 ER llt‡ER ER ltˆER ER lt‰ER ER ltŠER ER lt‹ER ER ltŒER ER lt�ER ER ltŽ]ER ER l4       t�]ER ER l4       t�ERt‘V ;t’# (-  ÚMatrixAdapteri  z,Gateway adapter for Matrix (any homeserver).Tr®   c                ó   € \         # )zOUTF-8 bytes, the unit of the homeserver's event cap (a CJK character is three).)r€  r7  s   &rT   Úmessage_len_fnÚMatrixAdapter.message_len_fn$  s
   € ô ÐrV   c               ó   € V ^8„  d   QhRR/# ©rL   ra   r   rR   )rS   s   "rT   rU   ÚMatrixAdapter.__annotate__)  s   € ÷ ñ  Dñ rV   c                ó<   € \        RR4      V n        V P                  # )zžPin the crypto-store dir to the active profile (connect() runs inside the profile
scope); cached so later out-of-scope reads report the store actually in use.úplatforms/matrix/storeúmatrix/store)Ú_get_hermes_dirÚ
_store_dirr7  s   &rT   Ú_resolve_store_dirÚ MatrixAdapter._resolve_store_dir)  s   € ô *Ð*BÀNÓSˆŒØ�‰ÐrV   c               ó   € V ^8„  d   QhRR/# rœ  rR   )rS   s   "rT   rU   r�  0  s   € ÷ lñ l ñ lrV   c                	óP   € V P                   ;'       g    \        R R4      R,          # )rŸ  r   z	crypto.db)r¢  r¡  r7  s   &rT   Ú_crypto_db_pathÚMatrixAdapter._crypto_db_path/  s"   € à—‘×\Ð\¤?Ð3KÈ^Ó#\Ð`kÕkÐkrV   c               ó   € V ^8„  d   QhRR/# )rL   r—  r9   rR   )rS   s   "rT   rU   r�  3  s   € ÷ Vrñ Vr˜~ñ VrrV   c                	óÂ  <€ \         SV `  V\        P                  4       \	        V4      V n        V P
                  V n        \        ^dV P
                  ^d,
          4      V n        VP                  P                  RR4      ;'       g    \        RR4      P                  4       P                  R4      V n        VP                  ;'       g    \        RR4      P                  4       V n        VP                  P                  RR4      ;'       g    \        RR4      P                  4       V n        VP                  P                  RR4      ;'       g    \        R	R4      P                  4       V n        \'        VP                  4      V n        V P(                  R
8g  V n        VP                  P                  RR4      ;'       g    \        RR4      P                  4       T n        RV n        RV n        RV n        RV n        RV n        / V n        RV n        RV n        V P?                  4        RV n         / V n!        / V n"        / V n#        \I        RR\J        4      V n&        RV n'        \Q        4       V n)        ^ RI*H+p V! RR7      V n,        \Q        4       V n-        \Q        4       V n.        \_        R4      V n0        \c        4       V n2        V Pg                  V4      V n4        V Pk                  V4      V n6        \o        VRR4      V n8        \o        VRR4      V n9        \u        RR4      V n;        V Py                  VRRR4      V n=        \u        R R4      V n>        V Py                  VR!R"R4      V n?        \�        \ƒ        VP                  R#R$R%4      4      P                  4       P…                  4       pVRE9   d   TMR%V nC        V Py                  VR&R'R4      V nD        \�        \ƒ        VP                  R(R)R4      4      P…                  4       RF9  V nE        / V nF        R*V nG        \Q        4       V nH        \“        R+R,7      V nJ        V P”                  '       d!   \–        P™                  R-V P”                  4       \I        R.RG\š        4      V nN        \K        \ž        P                   ! R/R04      4      V nQ        \K        \ž        P                   ! R1R24      4      V nR        R3R4R5R6R7R8R9R8R7R8R9R8R:R;R<R;/V nS        / V nT        / V nU        \u        R=R4      V nV        \I        R>R?\š        4      V nW        / V nX        / V nY        \o        VR@RA4      V nZ        \Q        V Pr                  4      V n[        . V n\        \»        \ƒ        VP                  RBRCR4      4       F3  p V P¸                  P½                  \¾        PÀ                  ! V4      4       K5  	  R#   \¾        PÂ                   d"   p\–        PÅ                  RDYE4        Rp?Kj  Rp?ii ; i)Héd   rˆ  rf   r„  r    r‚  Úuser_idÚMATRIX_USER_IDr‡  rƒ  rë  Ú	device_idÚMATRIX_DEVICE_IDFNrÇ  Ú MATRIX_ROOM_IDENTITY_TTL_SECONDSg      N@é   )Údequerg   )Úmaxlenrõ   Úfree_response_roomsÚMATRIX_FREE_RESPONSE_ROOMSÚallowed_roomsÚMATRIX_ALLOWED_ROOMSÚMATRIX_ALLOW_ROOM_MENTIONSÚfalseÚauto_threadÚMATRIX_AUTO_THREADrí  ÚMATRIX_DM_AUTO_THREADÚdm_mention_threadsÚMATRIX_DM_MENTION_THREADSÚsession_scopeÚMATRIX_SESSION_SCOPEÚautoÚprocess_noticesÚMATRIX_PROCESS_NOTICESÚ	reactionsÚMATRIX_REACTIONSg      @ÚMATRIX_PROXY)Úplatform_env_varu   Matrix: proxy configured â€” %sÚMATRIX_MAX_MEDIA_BYTESÚ&HERMES_MATRIX_TEXT_BATCH_DELAY_SECONDSz0.6Ú,HERMES_MATRIX_TEXT_BATCH_SPLIT_DELAY_SECONDSz2.0õ   âœ…Úonceõ   ðŸŒ€Úsessionõ   â™¾ï¸�Úalwaysu   â™¾õ   â�ŒÚdenyu   â�ŽÚMATRIX_APPROVAL_REQUIRE_SENDERÚMATRIX_APPROVAL_TIMEOUT_SECONDSi,  Úallowed_usersÚMATRIX_ALLOWED_USERSÚignore_user_patternsÚMATRIX_IGNORE_USER_PATTERNSzAMatrix: ignoring invalid MATRIX_IGNORE_USER_PATTERNS entry %r: %s>   rÁ  ÚroomÚthread>   Ú0Únor¹  i  @)crè   ré   r8   ÚMATRIXrš  r�  ÚMAX_MESSAGE_LENGTHr�   Ú_SPLIT_THRESHOLDrŒ  r’  rú  r�   ÚrstripÚ_homeserverr†  Ú_access_tokenÚ_user_idÚ	_passwordrþ  Ú
_e2ee_modeÚ_encryptionÚ
_device_idÚ_device_id_unverifiedÚ_clientÚ
_crypto_dbr¢  Ú
_sync_taskÚ_invite_join_tasksÚ_closingÚ_startup_tsÚ_reset_clock_skew_detectorÚ_last_sync_tsÚ	_dm_roomsÚ_room_identitiesÚ_room_identity_cached_atr  r   Ú_room_identity_ttl_secondsÚ_room_identity_cache_maxÚsetÚ_joined_roomsÚcollectionsr²  Ú_processed_eventsÚ_processed_events_setÚ_warned_encrypted_drop_roomsrE   Ú_threadsrF   Ú_parked_voicesÚ_parse_require_mentionÚ_require_mentionÚ_parse_thread_require_mentionÚ_thread_require_mentionr  Ú_free_roomsÚ_allowed_roomsrû  Ú_allow_room_mentionsÚ_extra_truthyÚ_auto_threadÚ_dm_auto_threadÚ_dm_mention_threadsr}   r�  r£   Ú_matrix_session_scopeÚ_process_noticesÚ_reactions_enabledÚ_pending_reactionsÚ!_reaction_redaction_delay_secondsÚ_reaction_redaction_tasksr>   Ú
_proxy_urlrƒ   ÚinforP   Ú_max_media_bytesr*  ÚgetenvÚ_text_batch_delay_secondsÚ_text_batch_split_delay_secondsÚ_approval_reaction_mapÚ_approval_prompts_by_eventÚ_approval_prompt_by_sessionÚ_approval_require_senderÚ_approval_timeout_secondsÚ_model_picker_prompts_by_eventÚ_choice_picker_prompts_by_eventÚ_allowed_user_idsÚ_allowed_room_idsÚ_ignored_user_patternsr  rŽ   rö   Úcompilere   rØ  )rì   r—  r²  Úraw_session_scopeÚpatternrÎ   rí   s   &&    €rT   ré   ÚMatrixAdapter.__init__3  s!  ø€ Ü‰Ñ˜¤§¡Ô1Ü"=¸fÓ"EˆÔØ"&×"9Ñ"9ˆÔä # C¨×)@Ñ)@À3Õ)FÓ GˆÔð
 "(§¡×!1Ñ!1°,ÀÓ!C×!zÐ!zÔGYÐZmÐoqÓGr×GxÑGxÓGz÷  !Cñ  !Cð  DGó  !HˆÔØ"(§,¡,×"gÐ"gÔ2DÐEZÐ\^Ó2_×2eÑ2eÓ2gˆÔØ#Ÿ\™\×-Ñ-¨i¸Ó<×pÐpÔ@RÐScÐegÓ@h×@nÑ@nÓ@pˆŒØ$Ÿl™l×.Ñ.¨z¸2Ó>×sÐsÔBTÐUfÐhjÓBk×BqÑBqÓBsˆŒÜ1°&·,±,Ó?ˆŒØ!%§¡°EÑ!9ˆÔØ%Ÿ|™|×/Ñ/°¸RÓ@×vÐvÔDVÐWiÐkmÓDn×DtÑDtÓDvˆŒØ+0ˆÔ"Ø ˆŒØ#ˆŒØ*.ˆŒØ26ˆŒØ;=ˆÔØˆŒØ"%ˆÔØ×'Ñ'Ô)Ø$'ˆÔØ*,ˆŒØ?AˆÔØ:<ˆÔ%Ü*5Ð6XÐZ^Ô`eÓ*fˆÔ'Ø(+ˆÔ%Ü'*£uˆÔÝ%Ù(-°TÔ(:ˆÔÜ*-«%ˆÔ"ä69³eˆÔ)Ü2°8Ó<ˆŒÜ*›nˆÔØ&*×&AÑ&AÀ&Ó&IˆÔØ-1×-OÑ-OÐPVÓ-WˆÔ$Ü%3°FÐ<QÐSoÓ%pˆÔä(6°v¸ÐPfÓ(gˆÔÜ*5Ð6RÐT[Ó*\ˆÔ!ð #'×"4Ñ"4°V¸]ÐL`ÐbhÓ"iˆÔÜ%0Ð1HÈ'Ó%RˆÔØ)-×);Ñ);¸FÐDXÐZuÐw~Ó)ˆÔ ÜÔ 0°·±¸ÐPfÐhnÓ oÓp×vÑvÓx×~Ñ~ó  AÐØ:KÐOiÔ:iÑ%6ÐouˆÔ"Ø&*×&8Ñ&8¸ÐARÐTlÐnuÓ&vˆÔÜ(+Ô,<¸V¿\¹\È;ÐXjÐlrÓ,sÓ(t×(zÑ(zÓ(|ð  EYñ  )YˆÔØ>@ˆÔð 25ˆÔ.Ü<?»EˆÔ&Ü&7ÈÔ&XˆŒØ�?�?ˆ?Ü�K‰KÐ9¸4¿?¹?ÔKÜ +Ð,DÐFWÔY\Ó ]ˆÔä).¬r¯yªyÐ9aÐchÓ/iÓ)jˆÔ&Ü/4´R·Y²YÐ?mÐotÓ5uÓ/vˆÔ,à�6˜6 9¨h¸À%ÈÐSaÐckØ�h  v¨u°fð'>ˆÔ#ð MOˆÔ'Ø;=ˆÔ(Ü.9Ð:ZÐ\bÓ.cˆÔ%Ü)4Ð5VÐX[Ô]`Ó)aˆÔ&ØNPˆÔ+ØOQˆÔ,ô ,:¸&À/ÐSiÓ+jˆÔÜ+.¨t×/BÑ/BÓ+CˆÔØ=?ˆÔ#ÜÔ 0°·±Ð?UÐWtÐvxÓ yÖzˆGðrØ×+Ñ+×2Ñ2´2·:²:¸gÓ3FÖGó {øô —8‘8ô rÜ—‘ÐbÐdk×qÒqûðrús   Õ3/V(Ö(WÖ=W×Wc               ó   € V ^8„  d   QhRR/# rÛ  rR   )rS   s   "rT   rU   r�  ‹  s   € ÷ 
ñ 
¨tñ 
rV   c                ó^  € V'       g   R# WP                   9   d   R# \        V P                  4      V P                  P                  8X  d-   V P                   P	                  V P                  ^ ,          4       V P                  P                  V4       V P                   P                  V4       R# )zIReturn True if this event was already processed. Tracks the ID otherwise.FT)rú  rŠ   rù  r³  ÚdiscardrŽ   Úadd)rì   r  s   &&rT   Ú_is_duplicate_eventÚ!MatrixAdapter._is_duplicate_event‹  s€   € çÙØ×1Ñ1Ô1ÙÜˆt×%Ñ%Ó&¨$×*@Ñ*@×*GÑ*GÔGØ×&Ñ&×.Ñ.¨t×/EÑ/EÀaÕ/HÔIØ×Ñ×%Ñ% hÔ/Ø×"Ñ"×&Ñ& xÔ0ÙrV   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   r
  r}   r  r   ra   rQ   rR   )rS   s   "rT   rU   r�  ˜  s.   € ÷ oñ o 3ð o°#ð oÀð oÈñ orV   c                ó˜   € \        V P                  WV4      p\        V\        4      '       d   V# \	        V4      P                  4       R9   # )uc   Scoped env var â†’ ``config.extra[key]`` (YAML, per profile) â†’ ``default``; true/1/yes semantics.r  ©r�  rŒ  rÔ   rQ   r}   r£   )r—  r
  r  r   Ú
configureds   &&&& rT   r  ÚMatrixAdapter._extra_truthy—  s@   € ô & f§l¡l°CÀ7ÓKˆ
Ü'¨
´D×9Ò9ˆzÐn¼sÀ:»×?TÑ?TÓ?VÐZnÑ?nÐnrV   c               ó    € V ^8„  d   QhRRRR/# )rL   r
  r}   ra   úOptional[bool]rR   )rS   s   "rT   rU   r�  ž  s   € ÷ 	 ñ 	  cð 	 ¨nñ 	 rV   c                óÜ   € V P                   P                  V4      pVf   R# \        V\        4      '       d   V# \        V\        4      '       d   VP                  4       R9  # \        V4      # )zOParse a YAML bool / "true"/"off"-style string from config.extra; None if unset.N>   rÛ  rÜ  rë  r¹  )rŒ  r’  rÔ   rQ   r}   r£   )r—  r
  r,  s   && rT   Ú_configured_boolÚMatrixAdapter._configured_bool�  sa   € ð —\‘\×%Ñ% cÓ*ˆ
ØÒÙÜ�j¤$×'Ò'ØÐÜ�j¤#×&Ò&Ø×#Ñ#Ó%Ð-HÑHÐHÜ�JÓÐrV   c               ó   € V ^8„  d   QhRR/# rÛ  rR   )rS   s   "rT   rU   r�  ª  s   € ÷ zñ z¨$ñ zrV   c                óš   € \        V P                  RRR4      p\        V\        4      '       d   V# \	        V4      P                  4       R9  # )uQ   MATRIX_REQUIRE_MENTION (scoped) â†’ ``require_mention`` in config.extra â†’ true.Úrequire_mentionÚMATRIX_REQUIRE_MENTIONT>   rÛ  rÜ  rë  r¹  r+  ©r—  r,  s   & rT   rþ  Ú$MatrixAdapter._parse_require_mention©  sE   € ô & f§l¡lÐ4EÐG_ÐaeÓfˆ
Ü'¨
´D×9Ò9ˆzÐy¼sÀ:»×?TÑ?TÓ?VÐ^yÑ?yÐyrV   c               ó   € V ^8„  d   QhRR/# rÛ  rR   )rS   s   "rT   rU   r�  °  s   € ÷ zñ z°ñ zrV   c                óš   € \        V P                  RRR4      p\        V\        4      '       d   V# \	        V4      P                  4       R9  # )u`   MATRIX_THREAD_REQUIRE_MENTION (scoped) â†’ ``thread_require_mention`` in config.extra â†’ false.Úthread_require_mentionÚMATRIX_THREAD_REQUIRE_MENTIONF>   rÛ  rÜ  rë  r¹  r+  r7  s   & rT   r   Ú+MatrixAdapter._parse_thread_require_mention¯  sE   € ô & f§l¡lÐ4LÐNmÐotÓuˆ
Ü'¨
´D×9Ò9ˆzÐy¼sÀ:»×?TÑ?TÓ?VÐ^yÑ?yÐyrV   c               ó    € V ^8„  d   QhRRRR/# )rL   Údevice_keys_objr   ra   r  rR   )rS   s   "rT   rU   r�  ¶  s   € ÷ ñ °ð ¸ñ rV   c                	ó¼   € \        V R / 4      ;'       g    / P                  4        F2  w  r\        V4      P                  R4      '       g   K'  \        V4      u # 	  R# )Úkeyszed25519:N)rÓ   Úitemsr}   r¯   )r?  ÚkidÚkvals   &  rT   Ú_extract_server_ed25519Ú%MatrixAdapter._extract_server_ed25519µ  sM   € ä! /°6¸2Ó>×DÐDÀ"×KÑKÖM‰IˆCÜ�3‹x×"Ñ" :×.Ô.Ü˜4“yÒ ñ Nñ rV   c               ó   € V ^8„  d   QhRR/# )rL   Úclientr   rR   )rS   s   "rT   rU   r�  ½  s   € ÷ ;ñ ;¨Sñ ;rV   c              ƒ  ó<  "  € V P                  V P                  V P                  ./4      G Rj  x€L
 p\        VR/ 4      ;'       g    / P	                  \        V P                  4      4      ;'       g    / pVP	                  \        V P                  4      4      #  Lk5i)z<query_keys for our own device; the DeviceKeys entry or None.NÚdevice_keys)Ú
query_keysr<  r®  rÓ   r’  r}   )rH  ÚrespÚour_user_devicess   &  rT   Ú_query_own_device_keysÚ$MatrixAdapter._query_own_device_keys¼  s‚   é € ð ×&Ñ&¨¯©°f×6FÑ6FÐ5GÐ'HÓI×IˆÜ# D¨-¸Ó<×BÐBÀ×GÑGÌÈFÏKÉKÓHXÓY×_Ð_Ð]_ÐØ×#Ñ#¤C¨×(8Ñ(8Ó$9Ó:Ð:ñ Jùs   ‚,B®B¯BÁ+BÁ3(Bc               ó$   € V ^8„  d   QhRRRRRR/# )rL   rH  r   Úlocal_ed25519r}   ra   rQ   rR   )rS   s   "rT   rU   r�  Ã  s"   € ÷ ñ ¸ð ÈCð ÐTXñ rV   c              ƒ  óž  "  € VP                   '       d   V P                  '       d   \        P                  R4       R#  V P	                  V4      G Rj  x€L
 pV'       d9   V P                  V4      V8w  d#   \        P                  RVP                   4       R# R#  LF  \         d$   p\        P                  RTRR7        Rp?R# Rp?ii ; i5i)zJRe-query the server after share_keys() and verify our ed25519 key matches.uO   Matrix: skipping post-upload key verification â€” device_id not yet establishedTNz‚Matrix: device %s has immutable identity keys that don't match this installation. Generate a new access token with a fresh device.Fz/Matrix: post-upload key verification failed: %sri   )r®  rè  rƒ   rØ  rN  rE  re   r‚   )rì   rH  rQ  ÚdevrÎ   s   &&&  rT   Ú_reverify_keys_after_uploadÚ)MatrixAdapter._reverify_keys_after_uploadÃ  s¬   é € à××Ð 4×#=×#=Ð#=Ü�N‰NÐlÔmÙð		Ø×3Ñ3°FÓ;×;ˆCß�t×3Ñ3°CÓ8¸MÔIÜ—‘ðUØV\×VfÑVfôhñ ñ ñ <øô ô 	Ü�L‰LÐJÈCÐZ^ˆLÔ_Ýûð	üsK   ‚$C§C¿B ÁBÁB Á 6B ÂCÂB ÂC
Â'CÂ?CÃC
Ã
Cc               ó$   € V ^8„  d   QhRRRRRR/# )rL   Úcrypto_storer   r®  r}   ra   rQ   rR   )rS   s   "rT   rU   r�  Ô  s#   € ÷ ñ Èð ÐX[ð Ð`dñ rV   c              ƒ  ó6  "  € V'       g   R#  VP                  4       G Rj  x€L
 pT'       d   Y28X  d   R# \        P                  RY24       TP	                  4       G Rj  x€L
  R#  LD  \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i L75i)zÚReset the Olm account when the token's device changed; True if reset. The store is keyed
by user ID, so a new device would inherit the old Olm account whose identity keys can never
be published under the new device ID.FNz+Matrix: could not read stored device ID: %suŒ   Matrix: access token belongs to a new device (%s -> %s) â€” resetting local Olm account so fresh identity keys are generated for this deviceT)Úget_device_idr‚   rƒ   rØ  Údelete)rì   rW  r®  Ústored_device_idrÎ   s   &&&  rT   Ú%_reset_crypto_store_if_device_changedÚ3MatrixAdapter._reset_crypto_store_if_device_changedÔ  sŒ   é € ÷ Ùð	Ø%1×%?Ñ%?Ó%A×AÐ÷  Ð#3Ô#@ÙÜ�‰ðCØDTô	að ×!Ñ!Ó#×#Ð#Ùñ  BøÜô 	Ü�N‰NÐHÈ#ÔNÝûð	úñ 	$ùsN   ‚BŽA( ¡A&¢A( ¦B®1BÁBÁ BÁ&A( Á(BÁ3BÂ	BÂBÂBc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	rL   rW  r   Ú	crypto_dbÚacct_idr}   Ú
pickle_keyra   rQ   rR   )rS   s   "rT   rU   r�  ç  s4   € ÷ $ñ $Ø #ð$Ø03ð$Ø>Að$ØORð$ØW[ñ$rV   c              ƒ  ó‚  "  € \        \        4      ;_uu_ 4        VP                  4       G Rj  x€L
   RRR4       R#  L  + '       g   i     M; i^ RIHp T R2T3 FÄ  pYd8X  d   K   T! Y6TR7      P                  4       G Rj  x€L 
 pM  \         d    Rp Mi ; iTf   KG   T P                  Y#Yd4      G Rj  x€L 
  M0  \         d#   p\        P                  RT4        Rp? R# Rp?ii ; iTP                  T4      G Rj  x€L 
  \        P                  R4        R# 	  \        P                  R	4       R# 5i)
a7  Re-pickle the Olm account under the current pickle key when it changed. The key embeds the
device ID; an account created before MATRIX_DEVICE_ID was set lives under ``<acct>:default``
and later fails with BAD_ACCOUNT_KEY (silently disabling optional E2EE). False only when an
account exists but no key opens it.NTrß  z:default©Ú
account_idra  ÚdbuŸ   Matrix: pickle key migration failed while re-pickling sessions (%s) â€” leaving the account under the legacy key so the migration is retried on the next start.FzŠMatrix: re-pickled crypto store account and sessions under the current pickle key (device ID was configured after the account was created)z¬Matrix: crypto store account exists but cannot be unpickled with the current or any legacy pickle key. If MATRIX_DEVICE_ID was changed manually, restore its previous value.)
r   r‚   Úget_accountrâ  rà  Ú_repickle_crypto_sessionsrƒ   re   Úput_accountr  )	rì   rW  r_  r`  ra  rà  Ú
legacy_keyÚaccountrÎ   s	   &&&&&    rT   Ú_migrate_legacy_crypto_pickleÚ+MatrixAdapter._migrate_legacy_crypto_pickleç  s*  é € ô ”i× Õ Ø×*Ñ*Ó,×,Ð,Ø÷ !Ñ Ù,÷ !× úõ 	?Ø%˜Y hÐ/°Ó9ˆJØÔ'ÙðÙ -¸Ð\eÔ f× rÑ rÓ t×tÐt‘øÜô Ø’ðúàŠÙðØ×4Ñ4°YÈÓ`×`Ò`øÜô Ü—‘ðfØgjôlö ûð	úð
 ×*Ñ*¨7Ó3×3Ñ3Ü�K‰KðKôLò ñ- :ô. 	�‰ðgô	hñ ùs›   ‚D?šA ®>¯A ´
D?¾A Á A	Á D?Á,BÂB
ÂBÂD?ÂBÂD?ÂBÂ	D?Â(CÂ=C Â>CÃD?ÃC1ÃC,Ã%D?Ã,C1Ã1D?ÄDÄ	6D?c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	rL   r_  r   r`  r}   ri  ra  ra   rä   rR   )rS   s   "rT   rU   r�    s9   € ÷ Lñ L¸ð LÀsð LÐX[ð LÐilð LÐquñ LrV   c           	   ƒ  ó²  "  € ^ RI pRVP                  RVP                  RVP                  /pVP	                  4        F}  w  rxVP                  RV R2V4      G Rj  x€L
 p	V	 FT  p
V
R,          f   K  \        V
R,          4      p\        \        4      ;_uu_ 4        VP                  W´4        RRR4       KV  	  K  	  R#  Ld  + '       g   i     M; i TP                  Y³4      pM7  \         d*   p\        P                  RYzR	,          T4        Rp?Kµ  Rp?ii ; iTP                  R
T R2TP                  T4      Y*R	,          4      G Rj  x€L 
  Kõ  5i)uZ   Re-pickle olm/megolm sessions too â€” they share the key; account-only breaks key sharing.NÚcrypto_olm_sessionÚcrypto_megolm_inbound_sessionÚcrypto_megolm_outbound_sessionz SELECT session_id, session FROM z WHERE account_id=$1rÎ  z}Matrix: %s row %s cannot be unpickled with the current or legacy key; leaving it in place, its sessions are unrecoverable: %sÚ
session_idzUPDATE z5 SET session=$1 WHERE account_id=$2 AND session_id=$3)ÚolmÚSessionÚInboundGroupSessionÚOutboundGroupSessionrB  ÚfetchÚbytesr   r‚   Úfrom_picklerƒ   rØ  ÚexecuteÚpickle)rì   r_  r`  ri  ra  Úolm_libÚtablesrM  Úsession_clsÚrowsÚrowÚpickledrÎ  rÎ   s   &&&&&         rT   rg  Ú'MatrixAdapter._repickle_crypto_sessions  s?  é € ãà  '§/¡/Ð3RÐT[×ToÑToØ,¨g×.JÑ.JðLˆð #)§,¡,¦.ÑˆEØ"Ÿ™Ð+KÈEÈ7ÐRfÐ)gÐipÓq×qˆDÛ�Ø�y•>Ò)ÙÜ  I¥Ó/�Üœi×(Õ(Ø×+Ñ+¨GÔ@Ø÷ )Ñ(ó	 ó #1Ùq÷
 )×(úðØ)×5Ñ5°gÓJ‘GøÜ ô ä—N‘NðJØKPÐVbÕRcÐehôjõ ûðúð  ×'Ñ'Ø˜e˜WÐ$YÐZØ—N‘N :Ó.°¸\Õ9JóL÷ Ló Lùs`   ‚AEÁC Á?EÂC	Â.EÃCÃEÃC(Ã'EÃ(DÃ3DÄEÄDÄ3EÅEÅEc               ó$   € V ^8„  d   QhRRRRRR/# )rL   rH  r   rs  ra   rQ   rR   )rS   s   "rT   rU   r�  (  s!   € ÷ &ñ &¸#ð &ÀCð &ÈDñ &rV   c              ƒ  óÚ  a aaa"  € SP                   '       d   S P                  '       d   \        P                  R4       R#  S P	                  S4      G Rj  x€L
 pSP                  P                  P                  R4      oR TTTT 3R	 llpT'       g7   \        P                  R
4       RSP                  n
        T! R4      G Rj  x€L
 # S P                  T4      S8X  d   R# SP                  P                  '       d7   \        P                  RSP                   \        S P                  4      4       R# \        P                  RSP                   4       \        \
        4      ;_uu_ 4        SP                  P!                  \#        SP                  R4      '       d!   SP                  P$                  P&                  MRRSP                    24      G Rj  x€L
  \        P)                  RSP                   4       RRR4       T! RSP                   4      G Rj  x€L
 #  ELÆ  \
         d$   p\        P                  RTRR7        Rp?R# Rp?ii ; i EL‹ L~  + '       g   i     Ld; i LP5i)uW   True if our device keys are on the server (or were re-uploaded); False â‡’ refuse E2EE.uJ   Matrix: skipping device key verification â€” device_id not yet establishedTNuA   Matrix: cannot verify device keys on server: %s â€” refusing E2EEri   FÚed25519c               ó    € V ^8„  d   QhRRRR/# )rL   Ú	error_fmtr}   ra   rQ   rR   )rS   s   "rT   rU   ÚAMatrixAdapter._verify_device_keys_on_server.<locals>.__annotate__4  s   € ÷ 	Qñ 	Q sð 	Q¸Dñ 	QrV   c              —  óä   <"  €  SP                  4       G R j  x€L
  SP	                  SS4      G R j  x€L
 #  L  \         d(   p\        P                  ! T .TOTN5RR/   R p?R# R p?ii ; i L;5i)Nrj   TF)Ú
share_keysr‚   rƒ   re   rT  )r‡  Ú
error_argsrÎ   rH  rQ  rs  rì   s   &* €€€€rT   Ú	_reuploadÚ>MatrixAdapter._verify_device_keys_on_server.<locals>._reupload4  sl   øé € ðØ—n‘nÓ&×&Ð&ð ×9Ñ9¸&À-ÓP×PÐPñ	 'øÜô Ü—’˜YÐH¨ÐH°SÒHÀ4ÒHÝûðúñ QùsA   ƒA0…9 ˜7™9 �A0²A.³A0·9 ¹A+ÁA&Á A0Á&A+Á+A0u8   Matrix: device keys missing from server â€” re-uploadingz+Matrix: failed to re-upload device keys: %sup   Matrix: server has different identity keys for device %s â€” local crypto state is stale. Delete %s and restart.uD   Matrix: server has stale keys for device %s â€” attempting re-uploadÚMethodÚDELETEz/_matrix/client/v3/devices/z+Matrix: deleted stale device %s from serverzfMatrix: cannot upload device keys for %s: %s. Try generating a new access token to get a fresh device.)r®  rè  rƒ   rØ  rN  r‚   re   rj  Úidentity_keysr’  ÚsharedrE  r}   r§  r   ÚapiÚrequestÚhasattrrŽ  r�  r  )rì   rH  rs  Úour_keysrÎ   rŒ  rQ  s   fff   @rT   Ú_verify_device_keys_on_serverÚ+MatrixAdapter._verify_device_keys_on_server(  sç  ûé € à××Ð 4×#=×#=Ð#=Ü�N‰NÐgÔhÙð	Ø!×8Ñ8¸Ó@×@ˆHð Ÿ™×1Ñ1×5Ñ5°iÓ@ˆ÷	Qó 	Q÷ Ü�N‰NÐUÔVØ!&ˆC�K‰KÔÙ"Ð#PÓQ×QÐQØ×'Ñ'¨Ó1°]ÔBÙØ�;‰;××ÐÜ�L‰Lð0Ø17×1AÑ1AÄ3Àt×G[ÑG[ÓC\ô^ñ Ü�‰Ð]Ð_e×_oÑ_oÔpÜ”i× Õ Ø—*‘*×$Ñ$Ü,3°F·J±JÀ×,IÒ,I�—
‘
×!Ñ!×(Ò(ÈxØ-¨f×.>Ñ.>Ð-?Ð@óB÷ Bð Bô �K‰KÐEÀv×GWÑGWÔX÷	 !ñ
 ØtØ×Ñó÷ ð 	ò= AøÜô 	Ü�L‰LÐ\Ð^aÐlpˆLÔqÝûð	úò RñB÷ !× úñ
ùs–   †$I+«I+ÁH  ÁHÁH  Á8I+Â1I+ÃIÃ7I+Ã?A-I+Å,A)IÇIÇ$IÇ:I+ÈI)ÈI+ÈH  È IÈ+I	ÉI+É	IÉI+ÉIÉI&	É!	I+Nc               ó$   € V ^8„  d   QhRRRRRR/# )rL   r’  r   r_  ra   rQ   rR   )rS   s   "rT   rU   r�  Q  s!   € ÷ ñ  #ð °#ð Àñ rV   c              ƒ  ó’   "  € Ve   VP                  4       G Rj  x€L
  V P                  P                  4       G Rj  x€L
  R#  L( L5i)zQClose what connect() opened so far; always False so callers can ``return await``.NF)ÚstoprÎ  r2  )r’  r_  s   &&rT   Ú_abort_connectÚMatrixAdapter._abort_connectP  s>   é € ð Ò Ø—.‘.Ó"×"Ð"Ø�k‰k×ÑÓ!×!Ð!Ùñ #Ù!ùs   ‚AšA›!A¼A½AÁAc               ó$   € V ^8„  d   QhRRRRRR/# )rL   rH  r   r’  ra   rQ   rR   )rS   s   "rT   rU   r�  X  s!   € ÷ >ñ >°#ð >¸Cð >ÀDñ >rV   c              ƒ  óD  "  € V P                   '       Ed[   V P                   Vn         VP                  4       G Rj  x€L
 p\        VRR4      ;'       g    V P                  p\        \        VRR4      ;'       g    R4      pV'       d+   \        V4      V n        \        V P                  4      Vn        V'       dQ   V P                  '       d?   WPP                  8w  d/   \        P                  RV P                  WPP                  4       TpMV P                  ;'       g    TpV'       d   Wan        VP                  '       g¼    VP                  VP                  . /4      G Rj  x€L
 p\        VR/ 4      ;'       g    / P                  \        VP                  4      4      ;'       g    / p\        V4      ^8X  d   \        \!        V4      4      Vn        M(V'       g!   \        P#                  RVP                  4       VP                  '       g(   \        P#                  R	VP                  4       R
V n        \        P)                  RV P                  ;'       g    RV'       d   RV R2MR4       R
# V P,                  '       d¦   V P                  '       d”    TP/                  V P                  V P,                  RV P                  ;'       g    RR7      G Rj  x€L
 pV'       d$   \1        VR4      '       d   VP                  Vn        \        P)                  RV P                  4       R
# \        P                  R4       V P+                  V4      G Rj  x€L
 #  EL ELö  \$         d"   p	\        P#                  RT	4        Rp	?	EL†Rp	?	ii ; i  \$         d=   p	\        P                  RT	R
R7       T P+                  T4      G Rj  x€L 
 u Rp	?	# Rp	?	ii ; i Lþ  \$         d;   p	\        P                  RT	4       T P+                  T4      G Rj  x€L 
 u Rp	?	# Rp	?	ii ; i LÍ5i)zRAuthenticate via access token (whoami) or password login; resolve user/device IDs.Nr¬  rf   r®  zéMatrix: MATRIX_DEVICE_ID=%s does not match the device this access token belongs to (%s). A token can only upload keys for its own device, so the configured value is being ignored. Unset MATRIX_DEVICE_ID, or use a token issued for %s.rJ  uD   Matrix: no devices found for %s â€” key verification will be skippedz$Matrix: device list query failed: %szžMatrix: device_id could not be resolved for %s. Set MATRIX_DEVICE_ID for full key verification. E2EE will proceed without server-side device key confirmation.Tz#Matrix: using access token for %s%sz(unknown user)z	 (device Ú)uM   Matrix: whoami failed â€” check MATRIX_ACCESS_TOKEN and MATRIX_HOMESERVER: %sri   zHermes Agent)Ú
identifierr‡  Údevice_namer®  zMatrix: logged in as %su   Matrix: login failed â€” %szDMatrix: need MATRIX_ACCESS_TOKEN or MATRIX_USER_ID + MATRIX_PASSWORD)râ  r†  ÚwhoamirÓ   rã  r}   r   r<  rç  rƒ   re   r®  rK  r’  rŠ   ÚnextÚiterrØ  r‚   rè  r  r›  rä  Úloginr”  )
rì   rH  r’  rL  Úresolved_user_idÚresolved_device_idÚeffective_device_idÚdev_respÚall_devicesrÎ   s
   &&&       rT   Ú_connect_authenticateÚ#MatrixAdapter._connect_authenticateX  sM  é € à××ÑØ×*Ñ*ˆCŒIð+6Ø#Ÿ]™]›_×,�Ü#*¨4°¸BÓ#?×#PÐ#PÀ4Ç=Á=Ð Ü%(¬°°{ÀBÓ)G×)MÐ)MÈ2Ó%NÐ"ß#Ü$'Ð(8Ó$9�D”MÜ"(¨¯©Ó"7�F”K÷ &¨$¯/¯/¨/Ð>P×TcÑTcÔ>cÜ—L‘Lð)ð +/¯/©/Ð;MÏÉô	`ð
 +=Ñ'à*.¯/©/×*OÐ*OÐ=OÐ'ß&Ø':Ô$Ø×'×'Ð'ð	TØ)/×):Ñ):¸F¿K¹KÈÐ;LÓ)M×#M˜Ü'.¨x¸ÈÓ'K×'QÐ'QÈr×&VÑ&VÔWZÐ[a×[fÑ[fÓWgÓ&h×&nÐ&nÐln˜Ü˜{Ó+¨qÔ0Ü/3´D¸Ó4EÓ/F˜FÕ,ß!,Ü"ŸN™NØ fÐhn×hsÑhsôuð ×'×'Ð'Ü—N‘NðkàŸ™ô%ð 26�DÔ.Ü—‘Ø9¸4¿=¹=×;\Ð;\ÐL\ß:M�iÐ 3Ð4°AÑ6ÐSUôWñ* ð �^�^ˆ^ §§ ð	6Ø#Ÿ\™\Ø#Ÿ}™}°t·~±~ÐSaØ"Ÿo™o×5Ð5°ð *ó 7÷ 7�÷ œG D¨+×6Ò6Ø'+§~¡~�FÔ$Ü—‘Ð5°t·}±}ÔEñ ô �L‰LÐ_Ô`Ø×,Ñ,¨SÓ1×1Ð1òq -ò* $Nøô %ô TÜŸ™Ð'MÈs×SÒSûðTûô ô 6Ü—‘ØcÐehÐswð ô yà!×0Ñ0°Ó5×5Ð5Õ5ûð6úñ7øô ô 6Ü—‘Ð:¸CÔ@Ø!×0Ñ0°Ó5×5Ð5Õ5ûð6úñ
 2ùsU  ‚%P ¨N
 »M¼N
 Á%N
 Á:N
 Â	1N
 Â;N
 ÃAN
 Ä
N
 Ä)N
 Å M Å"MÅ#M Å;+M Æ',M ÇN
 ÇM Ç M Ç<N
 ÈA	N
 É	N
 É"N
 É.P ÊP Ê4O Ë
O ËOËO Ë"AO Ì%+P ÍPÍP ÍN
 ÍM ÍNÍ&NÍ<N
 ÎNÎN
 Î
OÎ,OÏOÏOÏOÏP ÏOÏP ÏO ÏPÏ!*PÐPÐPÐPÐP ÐPÐP c               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   rH  r   r’  Ústate_storera   rQ   rR   )rS   s   "rT   rU   r�  ˜  s/   € ÷ Dñ D°ð D¸#ð DÈCð DÐTXñ DrV   c              ƒ  ó¨  "  € \        4       '       gg   V P                  R8X  d#   \        P                  R\        4       RV n        M3\        P                  R\        4       V P                  V4      G Rj  x€L
 # V P
                  '       g   R# Rp ^ RIH	p ^ R	I
Hp ^ R
IHp V P                  P                  RRR7       RpV P                  R,          P!                  4       '       d7   \        P#                  R4       V P                  R,          P%                  4        VP'                  RV P(                   2VP*                  R7      pVP-                  4       G Rj  x€L
  W€n        V P0                  ;'       g    Rp	T	 RVP2                  ;'       g    V P4                  ;'       g    R 2p
V! WšVR7      pVP7                  4       G Rj  x€L
  RpVP2                  '       dG   V P9                  W±P2                  4      G Rj  x€L
 pVP;                  VP2                  4      G Rj  x€L
  V'       g6   V P=                  W¸Wš4      G Rj  x€L
 '       g   \        P                  R4       ^ RIH p V! W0PB                  V4      pV! WV4      p\D        PF                  Vn$        \D        PF                  Vn%        VPM                  4       G Rj  x€L
  V PO                  W4      G Rj  x€L
 '       g   V P                  W(4      G Rj  x€L
 #  VPQ                  4       G Rj  x€L
  V PW                  Wñ4      G Rj  x€L
  Wñn,        \        P#                  R\U        V P(                  4      VP2                  '       d   RVP2                   2MR4       R#  EL EL- ELÃ EL� ELo ELP LÓ L¼ LŸ Lˆ  \R         dp   pR\U        T4      9   d@   \        P                  RTP2                  4       T P                  Y(4      G Rj  x€L 
 u Rp?# \        P                  RT4        Rp?LûRp?ii ; i Lî  \R         d'   pT P[                  TTT4      G Rj  x€L 
 u Rp?# Rp?ii ; i5i)zMSet up the Olm machine + crypto store. Returns False when connect must abort.rê  zaMatrix: E2EE optional but dependencies are missing. Continuing without encrypted-room support. %sFuw   Matrix: E2EE is required but dependencies are missing. %s. Refusing to connect â€” encrypted rooms would silently fail.NTÚimportrÝ  rß  )ÚDatabaser#  Úcreatezcrypto_store.picklez@Matrix: removing legacy crypto_store.pickle (migrated to SQLite)z
sqlite:///)Úupgrade_tableÚhermesr†  r   rc  uF   Matrix: crypto pickle migration failed â€” E2EE may not work correctly)Ú_CryptoStateStorezalready existszÈMatrix: device %s has stale one-time keys on the server signed with a previous identity key. Delete the device from the homeserver and restart, or generate a new access token to get a fresh device ID.z/Matrix: share_keys() warning during startup: %sz"Matrix: E2EE enabled (store: %s%s)z, device_id=rf   ).ræ  rå  rƒ   rØ  r•  ræ  re   r›  rá  rÞ  râ  rà  Úmautrix.util.async_dbr±  r¢  r)  r9  r  Úunlinkr²  r§  r³  r–   rê  rã  r®  rç  r+  r\  Úput_device_idrk  Ú'plugins.platforms.matrix.adapter_cryptorµ  r÷  r   r6   Úshare_keys_min_trustÚsend_keys_min_trustÚloadr–  rŠ  r‚   r}   Ú"_verify_or_bootstrap_cross_signingÚcryptoÚ_e2ee_setup_failed)rì   rH  r’  r®  ÚphaserÞ  rà  r±  r_  Ú_acct_idÚ_pickle_keyrW  Ú_store_was_resetrµ  Úcrypto_staters  rÎ   s   &&&&             rT   Ú_connect_setup_e2eeÚ!MatrixAdapter._connect_setup_e2ee˜  s   é € ä×!Ò!Ø�‰ *Ô,Ü—‘ð1Ü2DôFð $)�Õ ä—‘ð;Ü<NôPð "×0Ñ0°Ó5×5Ð5Ø××ÐÙØˆð3	BÝ1ÝBÝ6Ø�O‰O×!Ñ!¨$¸Ð!Ô>ØˆEØ—‘Ð"7Õ7×?Ñ?×AÒAÜ—‘Ð^Ô_Ø—‘Ð#8Õ8×@Ñ@ÔBØ Ÿ™Ø˜T×1Ñ1Ð2Ð3À=×C^ÑC^ð (ó `ˆIà—/‘/Ó#×#Ð#Ø'ŒOØ—}‘}×0Ð0¨ˆHð &˜J a¨×(8Ñ(8×(XÐ(X¸D¿O¹O×(XÐ(XÈyÐ'YÐZˆKÙ(°HÐYbÔcˆLØ×#Ñ#Ó%×%Ð%Ø$ÐØ××ÐØ)-×)SÑ)SÐT`×brÑbrÓ)s×#sÐ Ø"×0Ñ0°×1AÑ1AÓB×BÐBç#°$×2TÑ2TØ ¨Xó3D÷ -Dö -Dä—‘ÐgÔhÝQÙ,¨[×:LÑ:LÈfÓUˆLÙ˜V°<Ó@ˆCÜ'1×'<Ñ'<ˆCÔ$Ü&0×&;Ñ&;ˆCÔ#Ø—(‘(“*×ÐØ×;Ñ;¸FÓH×HÖHØ!×0Ñ0°Ó@×@Ð@ð	WØ—n‘nÓ&×&Ð&ð ×9Ñ9¸#ÓF×FÐFØŒMÜ�K‰KØ4´c¸$×:NÑ:NÓ6OØ5;×5E×5EÐ5E�,˜v×/Ñ/Ð0Ñ1È2ôOñ
 òq 6ò $ò &ò $tÚBò-Dñ ÙHÙ@á&øÜô WØ#¤s¨3£xÔ/Ü—L‘LðSàTZ×TdÑTdôfð "&×!4Ñ!4°SÓ!D×DÐDÕDÜ—‘ÐPÐRU×VÑVûðWúñ Gøô
 ô 	BØ×0Ñ0°¸¸SÓA×AÐAÕAûð	Büs‹  ‚A2QÁ4NÁ5QÂQÂAP Ã(A3P ÅNÅP Å9P ÆP Æ&"P ÇNÇ	P Ç!P Ç?NÈ "P È"NÈ#P È/P ÉNÉ	P ÉA4P ËNËP ËNË	P Ë'P Ë;NË<P Ë?QÌN ÌNÌN ÌP Ì-PÌ.AP ÎQÎP ÎP ÎP ÎP ÎP ÎP ÎP ÎP ÎN ÎPÎ*APÏ.O1Ï/PÏ3PÏ4P Ï8QÏ9PÐP ÐPÐP ÐQÐ)Q
Ð?QÑ Q
ÑQÑQÑ
QÑQc               ó(   € V ^8„  d   QhRRRRRRRR/# )	rL   Úwhatr}   rÎ   r‚   r’  r   ra   rQ   rR   )rS   s   "rT   rU   r�  Þ  s(   € ÷ 	.ñ 	.¨Sð 	.°yð 	.Àsð 	.Ètñ 	.rV   c              ƒ  óà   "  € V P                   R8X  d%   \        P                  RW\        4       RV n        R# \        P                  RW\        4       V P                  V4      G Rj  x€L
 #  L5i)zWOptional mode: log + disable E2EE and return True; required mode: close + return False.rê  z\Matrix: failed to %s optional E2EE client; continuing without encrypted-room support: %s. %sFTz(Matrix: failed to %s E2EE client: %s. %sN)rå  rƒ   rØ  r•  ræ  re   r›  )rì   rÈ  rÎ   r’  s   &&&&rT   r¿  Ú MatrixAdapter._e2ee_setup_failedÞ  s_   é € à�?‰?˜jÔ(Ü�N‰Nð"Ø#'Ô.@ôBð  %ˆDÔÙÜ�‰Ð?ÀÔL^Ô_Ø×(Ñ(¨Ó-×-Ð-Ñ-ùs   ‚A%A.Á'A,Á(A.c               ó$   € V ^8„  d   QhRRRRRR/# )rL   rs  r   rH  ra   rä   rR   )rS   s   "rT   rU   r�  é  s'   € ÷ &Eñ &E¸Cð &EÈð &EÐQUñ &ErV   c              ƒ  ó  "  € \        4       pV'       d2    VP                  V4      G Rj  x€L
  \        P                  R4       R#  VP                  4       G Rj  x€L
 pVf�   \        4       w  rgV'       dB   RRRR/P                  VR	4      p\        P
                  ! R
V,           .VR9  d   V.M. O5!   R#  VP                  4       G Rj  x€L
 p	\        \        VP                  4      V	4       R# R#  LÉ  \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i LÊ  \         d#   pRp\        P                  RT4        Rp?LðRp?ii ; i LŠ  \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i5i)zQVerify cross-signing via MATRIX_RECOVERY_KEY, or bootstrap a new key (non-fatal).Nz/Matrix: cross-signing verified via recovery keyz,Matrix: recovery key verification failed: %sz+Matrix: cross-signing key lookup failed: %sr8  z is not configured. Configure MATRIX_RECOVERY_KEY from your Matrix client or set MATRIX_RECOVERY_KEY_OUTPUT_FILE to write a new recovery key once with mode 0600.r9  z+already exists and will not be overwritten.zis not usable: %szsMatrix: cross-signing keys are missing, but automatic bootstrap is skipped because MATRIX_RECOVERY_KEY_OUTPUT_FILE uh   Matrix: cross-signing bootstrap failed (non-fatal â€” Element will show 'not verified by its owner'): %s)r8  r9  )rD  Úverify_with_recovery_keyrƒ   r  r‚   rØ  Ú!get_own_cross_signing_public_keysr:  r’  Úgenerate_recovery_keyr@  r}   r<  )
rì   rs  rH  r!  rÎ   Ú	own_xsignr�   Úoutput_errorÚreasonÚnew_recovery_keys
   &&&       rT   r½  Ú0MatrixAdapter._verify_or_bootstrap_cross_signingé  s  é € ô
 ,Ó-ˆßðTØ×2Ñ2°<Ó@×@Ð@Ü—‘ÐMÖNðSØ"%×"GÑ"GÓ"I×I�	ð Ò Ü"HÓ"J‘�ßà(ð +<ð !Ð"Oð	÷
 ‘c˜,Ð(;Ó<ð ô —N’Nð;Ø=CõDðgð -9Ð@\Ô,\˜<™.Ðbdögð
EØ14×1JÑ1JÓ1L×+LÐ(Ü=¼cÀ&Ç+Á+Ó>NÐP`Öañ! !ñ Aøäô TÜ—‘ÐMÈs×SÒSûðTúñ JøÜô SØ �	Ü—‘ÐLÈc×RÑRûðSúñ$ ,Møä$ô EÜŸ™ð?Ø@C÷Eò EûðEüs·   ‚F–C6 ªC4«C6 ÁFÁD' ÁD%ÁD' ÁAFÂ9E ÃEÃ#E Ã0FÃ4C6 Ã6D"ÄDÄFÄD"Ä"FÄ%D' Ä'EÄ2EÅ
FÅEÅFÅE ÅFÅ$F Å:FÆ FÆFc               ó    € V ^8„  d   QhRRRR/# )rL   rH  r   ra   rä   rR   )rS   s   "rT   rU   r�    s   € ÷ 
Bñ 
B°#ð 
B¸$ñ 
BrV   c              ƒ  ó˜  "  €  VP                  RRR7      G Rj  x€L
 p\        V\        4      '       d8   V P                  P	                  4        V P                  WRR7      G Rj  x€L
  R# \        P                  R\        V4      P                  4       R#  L| L3  \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i5i)zUFull initial sync: seed joined rooms, DM cache, and dispatch queued to-device events.i'  T)rO   Ú
full_stateN)Úinitialz0Matrix: initial sync returned unexpected type %szMatrix: initial sync error: %s)ÚsyncrÔ   r¡   r÷  ÚclearÚ_absorb_syncrƒ   rØ  ÚtyperS  r‚   )rì   rH  Ú	sync_datarÎ   s   &&  rT   Ú_connect_initial_syncÚ#MatrixAdapter._connect_initial_sync  s¥   é € ð	BØ$Ÿk™k°%ÀD˜kÓI×IˆIÜ˜)¤T×*Ò*Ø×"Ñ"×(Ñ(Ô*Ø×'Ñ'¨À4Ð'ÓH×HÒHä—‘ÐQÔSWÐXaÓSb×SkÑSkÖlñ Jñ Iøô ô 	BÜ�N‰NÐ;¸S×AÒAûð	Büs]   ‚C
„B šB›A
B Á%BÁ&B Á*C
Á,)B ÂC
ÂB ÂB ÂCÂ&CÂ<C
ÃCÃC
Úis_reconnectFc               ó    € V ^8„  d   QhRRRR/# )rL   rà  rQ   ra   rR   )rS   s   "rT   rU   r�    s   € ÷ -ñ -¨Tð -¸dñ -rV   c             ƒ  	óî  "  € R V n         V P                  e    V P                  4       G Rj  x€L
  ^ RIHp ^ RIH	p ^ RI
HpHp V P                  '       g   \        P                  R4       R # V P                  4       P!                  RRR7       \#        V P$                  4      pT! V P                  V P&                  ;'       g    R	VR
7      pV! 4       p	V! 4       p
T! V P(                  '       d   \+        V P(                  4      M
\+        R	4      V P,                  ;'       g    RW‰V
R7      pW°n        V P/                  W¸4      G Rj  x€L
 '       g   R # V P0                  '       d#   V P3                  W¸V	4      G Rj  x€L
 '       g   R # ^ RIHp ^ RIHp VP;                  V4       VP=                  \>        P@                  V PB                  RR7       VP=                  \>        PD                  V PF                  RR7       VP=                  VPH                  V PJ                  RR7       \L        PL                  ! 4       V n'        V PQ                  4        R V n)        V PU                  V4      G Rj  x€L
  V P0                  '       d7   \W        VRR4      '       d$    VPX                  P[                  4       G Rj  x€L
  \\        P^                  ! V Pa                  4       4      V n1        V Pe                  4        V Pg                  V P                  4       R#  ELß  \         d"   p\        P                  RT4        Rp?ELRp?ii ; i ELø ELÇ LÚ L”  \         d!   p\        P                  RT4        Rp?L¸Rp?ii ; i5i)FNz0Matrix: error disconnecting before reconnect: %s)ÚHTTPAPI)ÚClient)ÚMemoryStateStoreÚMemorySyncStorez%Matrix: homeserver URL not configuredTr#  rf   )Úbase_urlr†  Úclient_session)r<  r®  r’  r®  Ú
sync_store)ÚInternalEventType)ÚMembershipEventDispatcher)Ú	wait_syncr¾  z$Matrix: initial key share failed: %s)4rè  ré  Ú
disconnectr‚   rƒ   rØ  Úmautrix.apirã  Úmautrix.clienträ  Úmautrix.client.state_storerå  ræ  rá  re   r£  r)  rÙ  r  râ  rã  r   rç  r«  ræ  rÅ  rê  Úmautrix.client.dispatcherrë  Úadd_dispatcherÚadd_event_handlerr   r!   Ú_on_room_messager"   Ú_on_reactionÚINVITEÚ
_on_inviteÚtimerî  rï  rí  rÞ  rÓ   r¾  rŠ  ÚasyncioÚcreate_taskÚ
_sync_looprë  Ú_mark_connectedÚ_wire_plugin_handlers)rì   rà  rÎ   rã  rä  rå  ræ  rè  r’  r®  ré  rH  ÚIntEvtrë  s   &$            rT   ÚconnectÚMatrixAdapter.connect  s­  é € Ø%*ˆÔ"Ø�<‰<Ò#ðXØ—o‘oÓ'×'Ð'õ 	(Ý)ßPØ××ÐÜ�L‰LÐ@ÔAÙà×ÑÓ!×'Ñ'°¸tÐ'ÔDÜ/°·±Ó@ˆÙ˜t×/Ñ/°t×7IÑ7I×7OÐ7OÈRÐ`nÔoˆÙ&Ó(ˆÙ$Ó&ˆ
ÙØ*.¯-¯-¨-”˜Ÿ™Ô&¼VÀB»ZÐSW×SbÑSb×SjÐSjÐfjØ¸ôEˆð ŒØ×/Ñ/°Ó<×<Ö<ÙØ××Ð¨$×*BÑ*BÀ6ÐP[Ó*\×$\Ö$\ÙÝ>ÝGØ×ÑÐ7Ô8Ø× Ñ ¤×!7Ñ!7¸×9NÑ9NÐZ^Ð Ô_Ø× Ñ ¤×!3Ñ!3°T×5FÑ5FÐRVÐ ÔWØ× Ñ  §¡°·±È4Ð ÔPÜŸ9š9›;ˆÔØ×'Ñ'Ô)ØˆŒØ×(Ñ(¨Ó0×0Ð0Ø××Ð¤¨°¸$× ?Ò ?ðLØ—m‘m×.Ñ.Ó0×0Ð0ô "×-Ò-¨d¯o©oÓ.?Ó@ˆŒØ×ÑÔØ×"Ñ" 4§<¡<Ô0ÙòS (øÜô XÜ—‘ÐQÐSV×WÒWûðXúò$ =â$\ñ 	1ñ 1øÜô LÜ—‘ÐEÀs×KÑKûðLüsÜ   ‚M5™L ¬L­L ±%M5ÁA,M5Ã*M5Ã/1M5Ä!$M5ÅL=Å	M5ÅM5Å$M5Å9M Å:	M5ÆC$M5É(MÉ)M5É?M5ÊM Ê0MÊ1M Ê5AM5ÌL ÌL:ÌL5Ì/M5Ì5L:Ì:M5Í M5ÍM5ÍM ÍM2ÍM-Í(M5Í-M2Í2M5c               ó   € V ^8„  d   QhRR/# rã   rR   )rS   s   "rT   rU   r�  L  s   € ÷ ,ñ , $ñ ,rV   c              ƒ  	ó¶  "  € R V n         V P                  '       dP   V P                  P                  4       '       g0   V P                  P                  4         V P                  G Rj  x€L
  V P                  P                  4       V P                  3 Fg  p\        V4      pV F+  pVP                  4       '       d   K  VP                  4        K-  	  V'       g   KI  \        P                  ! VRR / G Rj  x€L
  Ki  	  V P                  P                  4        V P                  P                  4        \        V RR4      '       d$    V P                  P                  4       G Rj  x€L
  V P$                  '       d^   \'        \        4      ;_uu_ 4        V P$                  P(                  P*                  P-                  4       G Rj  x€L
  RRR4       RV n        \         P/                  R4       R#  EL†  \        P
                  \        3 d     EL¢i ; i EL L²  \         d!   p\         P#                  RT4        Rp?LÖRp?ii ; i L‚  + '       g   i     Lˆ; i5i)TNÚreturn_exceptionsrê  z3Matrix: could not close crypto DB on disconnect: %szMatrix: disconnected)rí  rë  ÚdoneÚcancelrù  ÚCancelledErrorr‚   rì  Úvaluesr  rN   ÚgatherrÚ  rÓ   rê  rš  rƒ   r„   ré  r   r’  rÎ  r2  r  )rì   ÚtasksÚpendingÚtaskrÎ   s   &    rT   rí  ÚMatrixAdapter.disconnectL  s¶  é € ØˆŒØ�?�?ˆ? 4§?¡?×#7Ñ#7×#9Ò#9Ø�O‰O×"Ñ"Ô$ðØ—o‘o×%Ð%ð ×-Ñ-×4Ñ4Ó6¸×8VÑ8VÓWˆEÜ˜5“kˆGÛ�Ø—y‘y—{”{Ø—K‘K–Mñ  ÷ ‰wÜ—n’n gÐFÀÑF×FÒFñ Xð 	×Ñ×%Ñ%Ô'Ø×&Ñ&×,Ñ,Ô.Ü�4˜ t×,Ò,ðYØ—o‘o×*Ñ*Ó,×,Ð,ð �<�<ˆ<Üœ)×$Õ$Ø—l‘l×&Ñ&×.Ñ.×4Ñ4Ó6×6Ð6÷ %àˆDŒLÜ�‰Ð*Ö+ò+ &øÜ×*Ñ*¬IÐ6ô Úðúò Gñ
 -øÜô YÜ—‘ÐRÐTW×XÑXûðYúñ 7÷ %×$üsÆ   ‚9I¼IÁG/ Á&G,Á'G/ Á+AIÂ<IÃIÃ3HÃ4AIÅH Å!HÅ"H Å&IÅ8IÆ2IÇIÇIÇ&IÇ,G/ Ç/HÈ
IÈHÈIÈH ÈIÈ!H<È7IÈ<IÉIÉIÉI	ÉIc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rL   rn  r}   rÂ   Úreply_tor  r�   rô  ra   r=   rR   )rS   s   "rT   rU   r�  h  s;   € ÷ Bñ BØðBØ%(ðBØ4AðBà*ðBà6@ñBrV   c           	   ƒ  	óÄ  "  € V'       g   \        R R7      # RpV P                  V P                  V4      V P                  V P                  R7       FW  pV P                  V4      pV P                  WsVR7        V P                  W4      G Rj  x€L
 p\        P                  RWQ4       KY  	  \        R VR7      #  L+  \         Ed   pT P                  '       d   \        T P                  RR4      '       g4   \        P                  RY4       \        R\        T4      R	7      u Rp?u #  T P                  P                   P#                  4       G Rj  x€L 
  T P                  Y4      G Rj  x€L 
 p\        P                  R
YQ4        Rp?EK=    \         d>   p	\        P                  RY4       \        R\        T	4      R	7      u Rp	?	u Rp?u # Rp	?	ii ; iRp?ii ; i5i)T)ÚsuccessN)Úlen_fn©r  r�   zMatrix: sent event %s to %sr¾  z Matrix: failed to send to %s: %sF©r  re   z-Matrix: sent event %s to %s (after key share)z,Matrix: failed to send to %s after retry: %s©r  ro  )r=   Útruncate_messageÚformat_messager�  r™  Ú_build_text_message_contentÚ_apply_relation_metadataÚ_send_room_messagerƒ   r  r‚   ræ  rÓ   ré  re   r}   r¾  rŠ  )
rì   rn  rÂ   r  r�   Úlast_event_idÚchunkÚmsg_contentrÎ   Ú	retry_excs
   &&&&&     rT   ÚsendÚMatrixAdapter.sendh  s„  é € ÷ Ü dÔ+Ð+ØˆØ×*Ñ*Ø×#Ñ# GÓ,¨d×.EÑ.EÈd×NaÑNað +ö cˆEà×:Ñ:¸5ÓAˆKØ×)Ñ)¨+ÐS[Ð)Ô\ðKØ&*×&=Ñ&=¸gÓ&S× S�Ü—‘Ð9¸=ÖRñcô$  $°=ÔAÐAñ !Tøäõ 
KØ×(×(Ð(¬W°T·\±\À8ÈT×-RÒ-RÜ—L‘LÐ!CÀWÔRÜ%¨e¼3¸s»8ÔD×DðKØŸ,™,×-Ñ-×8Ñ8Ó:×:Ñ:Ø*.×*AÑ*AÀ'Ó*W×$WÐ$W�MÜ—K‘KÐ OÐQ^×hÓhøÜ ô KÜ—L‘LÐ!OÐQXÔdÜ%¨e¼3¸y»>ÔJ×JÔJûðKþð
Küs�   ‚A5G Á8B:ÂB8ÂB:Â'G Â8B:Â:GÃAGÄ GÄ!G Ä)'FÅEÅFÅ*E-Å+FÆG ÆGÆ+GÇGÇGÇGÇ	G ÇGÇGÇGÇG c               ó$   € V ^8„  d   QhRRRRRR/# )rL   rn  r}   r  rb   ra   rR   )rS   s   "rT   rU   r�  ‚  s"   € ÷ ñ °ð À.ð ÐUXñ rV   c              ƒ  óÈ   "  € \         P                  ! V P                  P                  \	        V4      \
        P                  V4      ^-R7      G Rj  x€L
 p\        V4      #  L5i)zGSend one m.room.message event (45s cap) and return its event ID as str.rp   N)rù  Úwait_forré  Úsend_message_eventr   r   r!   r}   )rì   rn  r  r  s   &&& rT   r  Ú MatrixAdapter._send_room_message‚  sP   é € ä ×)Ò)Ø�L‰L×+Ñ+¬F°7«O¼Y×=SÑ=SÐU`ÓaÐkmôo÷ oˆä�8‹}Ðñoùs   ‚AA"ÁA ÁA"c               ó$   € V ^8„  d   QhRRRRRR/# )rL   Úparent_chat_idr}   rš   ra   r  rR   )rS   s   "rT   rU   r�  ˆ  s!   € ÷ ñ ¸#ð ÀSð È]ñ rV   c              ƒ  ó|  "  € V P                   f   R# T P                  Y;'       g    RP                  4       ;'       g    \        R4      4      G Rj  x€L
 pVP                  '       d   VP
                  MRpV'       g   R# V P                  P                  \        V4      4      G Rj  x€L
  \        V4      #  Le L5i)u   Post a seed message and return its ``event_id`` as the handoff ``thread_id``. Matrix has
no create-thread API: a thread is the events whose ``m.relates_to``/``rel_type: m.thread``
point at a root event (Slack-style), and ``_apply_relation_metadata`` already threads later
sends off a supplied ``thread_id``. ``None`` when disconnected or the seed send failed.

In-thread replies keep the ROOM's chat_type (``dm``/``group``) in the session key â€” the
handoff watcher and the cron seeder mirror that shape rather than the shared ``thread`` slot.Nrf   z$platform.matrix.handoff.default_name)	ré  r  r�   r   r  ro  rü  Ú
mark_asyncr}   )rì   r&  rš   r‘   Úroots   &&&  rT   Úcreate_handoff_threadÚ#MatrixAdapter.create_handoff_threadˆ  sŽ   é € ð �<‰<ÒÙØ—y‘y ·*°*¸"×1CÑ1CÓ1E×1rÐ1rÌÐKqÓIrÓs×sˆØ$*§N§N Nˆv× Ò ¸ˆßÙØ�m‰m×&Ñ&¤s¨4£yÓ1×1Ð1Ü�4‹yÐñ tñ 	2ùs9   ‚$B<§B<¿B<ÁB8ÁB<Á)B<Á?)B<Â(B:Â)B<Â:B<c               ó    € V ^8„  d   QhRRRR/# )rL   rn  r}   ra   rb   rR   )rS   s   "rT   rU   r�  ™  s   € ÷ hñ h¨3ð h°>ñ hrV   c              ƒ  	óˆ   "  € V P                  V4      G R j  x€L
 pRVP                  RVP                  R8X  d   R/# R/#  L(5i)Nrš   rÜ  Údmr²   )Ú_resolve_room_identityrf  rh  )rì   rn  Úidentitys   && rT   Úget_chat_infoÚMatrixAdapter.get_chat_info™  sI   é € Ø×4Ñ4°WÓ=×=ˆØ˜×-Ñ-¨v¸x×?QÑ?QÐUYÔ?Y°tÐgÐgÐ_fÐgÐgñ >ùs   ‚A—A ˜)Ac               ó   € V ^8„  d   QhRR/# )rL   ra   rb   rR   )rS   s   "rT   rU   r�  �  s   € ÷ Añ A ñ ArV   c                	óž  € \         P                   ! 4       p\        V P                  4      pV P                  ;'       g"    \	        V P
                  R R4      ;'       g    RpV P                  ;'       g"    \	        V P
                  RR4      ;'       g    RpRRRV P                  RRTR\        V P                  4      R	V'       d   R
MRRTR\        V4      R\        T;'       g    R4      P                  4       '       d   R
MR/RRV P
                  RJR\        V P                  4      RV P                  '       d   \        RWP                  ,
          4      MR/RRV P                  R\        V P                   4      R\#        4       R\        V P$                  4      R\        \'        4       P                  4       4      /RR\        V P(                  4      R\        V P*                  4      R\        V P,                  4      RV P.                  R\        V P0                  4      R V P2                  R!V P4                  R"\7        R#4      /R$R%V P8                  //# )&r<  rf   r®  Úplatformrõ   rˆ  ÚauthÚaccess_token_presentÚpassword_presentÚtoken_previewz***r¬  Údevice_id_presentÚdevice_id_previewrÙ  Ú	connectedNÚjoined_room_countÚlast_sync_age_secondsrÇ  Úe2eeÚmodeÚenabledÚdeps_availableÚcrypto_store_pathÚrecovery_key_configuredÚpolicyÚallowed_user_countÚallowed_room_countÚignored_user_pattern_countr5  Úfree_response_room_countÚallow_room_mentionsrÂ  Úallow_public_roomsÚMATRIX_ALLOW_PUBLIC_ROOMSÚmediaÚmax_media_bytes)rø  rQ   râ  rã  rÓ   ré  rç  rá  rä  r}   r�   rŠ   r÷  rð  r�   rå  ræ  ræ  r§  rD  r  r  r  rÿ  r  r  r
  rû  r  )rì   ÚnowÚtoken_presentr¬  r®  s   &    rT   Úget_diagnosticsÚMatrixAdapter.get_diagnostics�  s  € Ü�iŠi‹kˆÜ˜T×/Ñ/Ó0ˆØ—-‘-×JÐJ¤7¨4¯<©<¸ÀÓ#D×JÐJÈˆØ—O‘O×SÐS¤w¨t¯|©|¸[È"Ó'M×SÐSÐQSˆ	à˜ ,°×0@Ñ0@ØØ&¨Ð7IÌ4ÐPT×P^ÑP^ÓK_Ø¯-¡¸RÀÈGØ#¤T¨)£_Ð6IÔTWÐXa×XgÐXgÐegÓTh×TnÑTn×TpÒTpÉ5Ðvxðzð Ø˜TŸ\™\°Ð5Ð7JÌCÐPT×PbÑPbÓLcØ'Èt×Oa×OaÐOa¬¨S°#×8JÑ8JÕ2JÔ)KÐgkðmð Ø˜Ÿ™¨´D¸×9IÑ9IÓ4JÐL\Ô^nÓ^pØ#¤S¨×)=Ñ)=Ó%>Ø)¬4Ô0DÓ0F×0LÑ0LÓ0NÓ+OðQð Ø$¤c¨$×*@Ñ*@Ó&AÐCWÔY\Ð]a×]sÑ]sÓYtØ,¬c°$×2MÑ2MÓ.NØ! 4×#8Ñ#8Ð:TÔVYÐZ^×ZjÑZjÓVkØ% t×'@Ñ'@ÐBSÐUY×UjÑUjØ$¤kÐ2MÓ&NðPð Ð'¨×)>Ñ)>Ð?ð'Að 	ArV   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   rn  r}   rO   rP   ra   rä   rR   )rS   s   "rT   rU   r�  ·  s&   € ÷ Pñ P¨ð P°sð P¸tñ PrV   c              ƒ  	óþ   "  € V P                   '       dQ   \        \        4      ;_uu_ 4        V P                   P                  \	        V4      VR 7      G Rj  x€L
  RRR4       R# R#  L  + '       g   i     R# ; i5i)rp   N)ré  r   r‚   Ú
set_typingr   )rì   rn  rO   s   &&&rT   Ú_set_typingÚMatrixAdapter._set_typing·  sU   é € Ø�<�<ˆ<Üœ)×$Õ$Ø—l‘l×-Ñ-¬f°W«oÀwÐ-ÓO×OÐO÷ %Ñ$ñ áO÷ %×$Ð$üs.   ‚*A=¬*A)ÁA'ÁA)ÁA=Á'A)Á)A:	Á4	A=c               ó$   € V ^8„  d   QhRRRRRR/# )rL   rn  r}   r�   rô  ra   rä   rR   )rS   s   "rT   rU   r�  ¼  s#   € ÷ /ñ /¨ð /Ð8Pð /Ð\`ñ /rV   c              ƒ  	óF   "  € V P                  VR 4      G Rj  x€L
  R#  L5i)é0u  N©rV  )rì   rn  r�   s   &&&rT   Úsend_typingÚMatrixAdapter.send_typing¼  s   é € Ø×Ñ˜w¨Ó.×.Ô.ùó   ‚!˜™!c               ó    € V ^8„  d   QhRRRR/# )rL   rn  r}   ra   rä   rR   )rS   s   "rT   rU   r�  ¿  s   € ÷ +ñ +¨ð +°ñ +rV   c              ƒ  	óF   "  € V P                  V^ 4      G Rj  x€L
  R#  L5i)rŽ  Nr[  )rì   rn  s   &&rT   Ústop_typingÚMatrixAdapter.stop_typing¿  s   é € Ø×Ñ˜w¨Ó*×*Ô*ùr^  Úfinalizec          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	rL   rn  r}   ro  rÂ   rc  rQ   ra   r=   rR   )rS   s   "rT   rU   r�  Â  s8   € ÷ Dñ D¨#ð D¸3ð DÈð DÐ[_ð DÐlvñ DrV   c             ƒ  	óv  "  € V P                  V4      pV P                  V4      pR RRRV 2RV/pRV9   d   VR,          VR&   RV9   d   RVR&   RVR,           2VR&   R	R
RV/VR&   \        V4      \        8”  d¤   VP	                  RR4       VP	                  RR4       RVR&   \        V4      \        8”  d   VP	                  RR4       \        \        V4      ,
          pVP                  R4      R\        ^ V^,          4       P                  RR4      p	RV	 R2VR&   V P                  W4      G Rj  x€L
 #  L5i)r»  úm.textr¶   z* zm.new_contentú
m.mentionsÚformatted_bodyúorg.matrix.custom.htmlrS   r  ú	m.replacer  úm.relates_toNrf   r}  Úignoreu   â€¦)	r  r  r‰  Ú_MAX_CONTENT_BYTESÚpopr~  r�   ÚdecodeÚ_send_content_event)
rì   rn  ro  rÂ   rc  Ú	formattedÚnew_contentr  rÙ  Úfallbacks
   &&&&$     rT   Úedit_messageÚMatrixAdapter.edit_messageÂ  sT  é € Ø×'Ñ'¨Ó0ˆ	Ø×6Ñ6°yÓAˆØ'0°(¸FÀbÈÈÐDTÐVeÐgrÐ&sˆØ˜;Ô&Ø(3°LÕ(AˆK˜Ñ%Ø˜{Ô*Ø$<ˆK˜Ñ!Ø.0°Ð=MÕ1NÐ0OÐ,PˆKÐ(Ñ)Ø'1°;À
ÈJÐ&Wˆ�NÑ#Ü˜+Ó&Ô);Ô;ð �O‰O˜H dÔ+Ø�O‰OÐ,¨dÔ3Ø"$ˆK˜ÑÜ˜kÓ*Ô-?Ô?ð —‘ ¨dÔ3Ü%¬°{Ó(CÕCˆDà ×'Ñ'¨Ó0Ð1D´3°q¸$À!½)Ó3DÐE×LÑLÈWÐV^Ó_ˆHØ$& x j°Ð"4ˆK˜ÑØ×-Ñ-¨gÓC×CÐCÑCùs   ‚D0D9Ä2D7Ä3D9c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rL   rn  r}   Ú	image_urlÚcaptionr  r  r�   rô  ra   r=   rR   )rS   s   "rT   rU   r�  Ü  sD   € ÷ mñ mØðmØ'*ðmØ5BðmØUbðmà*ðmà6@ñmrV   c           
   ƒ  	óÒ  <"  € ^ RI Hp V! V4      '       g0   \        P                  R4       \        SV `  WW4VR7      G Rj  x€L
 #  V P                  V4      G Rj  x€L
 w  rxp	T P                  YY˜RY4T4      G Rj  x€L
 #  L> L&  \         dS   p
\        P                  R\        T4      T
4       \        R4      pT P                  YY4TR7      G Rj  x€L 
 u Rp
?
# Rp
?
ii ; i Lh5i)	rŽ  ©Úis_safe_urlz2Matrix: blocked unsafe image URL (SSRF protection)©r�   Nz'Matrix: failed to download image %s: %sz+platform.matrix.media.image_download_failed©rx  r  r�   r½  )Útools.url_safetyr{  rƒ   rØ  rè   Ú
send_imageÚ!_download_external_media_with_capr‚   rv  r   Úemit_media_warningÚ_upload_and_send)rì   rn  rw  rx  r  r�   r{  r"  ÚctÚfnamerÎ   rs  rí   s   &&&&&&      €rT   r  ÚMatrixAdapter.send_imageÜ  sß   øé € õ 	1Ù˜9×%Ò%Ü�N‰NÐOÔPÜ™Ñ+¨GÀÐ\dÐ+Óe×eÐeð	{Ø$(×$JÑ$JÈ9Ó$U×U‰OˆD�eð
 ×*Ñ*¨7¸%ÀYÐPWÐckÓl×lÐlñ fáUøÜô 	{Ü�N‰NÐDÔFYÐZcÓFdÐfiÔjÜÐFÓGˆHØ×0Ñ0°ÈGÐqyÐ0Óz×zÐzÕzûð	{úñ mùsl   ƒ?C'ÁBÁC'ÁB ÁBÁB Á$C'Á<C%Á=C'ÂB ÂC"ÂACÃCÃCÃC"ÃC'ÃC"Ã"C'c               ó    € V ^8„  d   QhRRRR/# )rL   rp  r}   ra   ztuple[bytes, str, str]rR   )rS   s   "rT   rU   r�  ë  s   € ÷ <+ñ <+¸3ð <+ÐCYñ <+rV   c              ƒ  ó6  a "  € ^ RI Hp V! V4      '       g   \        R4      hR V 3R llpVP                  R^4      R,          P	                  R4      ^ ,          ;'       g    Rp ^ RIp\        S P                  4      w  rgVP                  ! R/ VB ;_uu_4       GRj  x€L
 pTp	\        ^4       EFD  p
VP                  ! V	3R	VP                  ^R
7      RR/VB ;_uu_4       GRj  x€L
 pVP                  R9   df   VP                  P                  R4      pV'       g   \        R4      h\        Wœ4      p	V! V	4      '       g   \        R4      h RRR4      GRj  x€L
  K²  VP                  4        T! Y»P                   P#                  R4      \%        VRR4      ;'       g    VP                  P                  RR4      4      G Rj  x€L
 w  rÞWÞV3uuRRR4      GRj  x€L
  u uuRRR4      GRj  x€L
  # 	  \        R4      h ELf EL  L® LE L0 L  + GRj  x€L 
 '       g   i     EK}  ; i  + GRj  x€L 
 '       g   i     R# ; i  \&         Ed=    ^ RI Hp S P                  '       d   RS P                  /M/ pR\*        ./TR&   T! R/ TB ;_uu_4       GRj  x€L 
 pTP-                  RTR^R7      ;_uu_4       GRj  x€L 
 pTP                  4        T! Y»P/                  4       TP                  P                  RR4      4      G Rj  x€L 
 w  rÞYÞT3uuRRR4      GRj  x€L 
  uuRRR4      GRj  x€L 
  u #   + 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i ; i5i)zFDownload external media while enforcing redirect safety and size caps.rz  zblocked unsafe media URLc               ó   € V ^8„  d   QhRR/# )rL   ra   ztuple[bytes, str]rR   )rS   s   "rT   rU   ÚEMatrixAdapter._download_external_media_with_cap.<locals>.__annotate__ñ  s   € ÷ 	1ñ 	1Ð>Oñ 	1rV   c              “  óô  <"  €  \        V P                  P                  R4      ;'       g    V P                  P                  R4      4      pVe.   VSP                  8”  d   \        RV RSP                   R24      h. p^ pV  Rj  x€L
  pV\        V4      ,          pVSP                  8”  d   \        RSP                   R24      hVP                  \        V4      4       Kb    \         d    Rp L¨i ; i LpDq\        T;'       g    R4      P                  R	^4      ^ ,          P                  4       P                  4       pTP                  R
4      '       g   \        R4      hRP                  T4      T3# 5i)zJEnforce Content-Length + streamed size caps, then require an image/* type.zContent-Lengthzcontent-lengthNzmedia exceeds Matrix limit (ú > ú bytes)zmedia exceeds Matrix limit (> rf   r*  r¢  zexternal media is not an imagerV   )rP   Úheadersr’  r‚   r  r”  rŠ   rŽ   rx  r}   r¼   r�   r£   r¯   r¾   )rL  ÚchunksÚcontent_typeÚsizeru  Útotalr  rì   s   &&&    €rT   Ú_read_cappedÚEMatrixAdapter._download_external_media_with_cap.<locals>._read_cappedñ  s\  øé € ðÜ˜4Ÿ<™<×+Ñ+Ð,<Ó=×cÐcÀÇÁ×AQÑAQÐRbÓAcÓd�ð Ò D¨4×+@Ñ+@Ô$@Ü Ð#?À¸vÀSÈ×I^ÑI^ÐH_Ð_fÐ!gÓhÐhØ!#ˆEØˆEÙ%÷ +ð +�eØœ˜U›Õ#�Ø˜4×0Ñ0Ô0Ü$Ð'EÀd×F[ÑF[ÐE\Ð\cÐ%dÓeÐeØ—‘œU 5›\Ö*øô ô Ø’ðúñ+˜vô
 ˜|×1Ð1¨rÓ2×8Ñ8¸¸aÓ@ÀÕC×IÑIÓK×QÑQÓSˆLØ×*Ñ*¨8×4Ò4Ü Ð!AÓBÐBØ—8‘8˜E“? LÐ0Ð0ùs[   ƒE8…AC% Á7E8ÂC:ÂC8ÂC:ÂAE8Ã%C5Ã2E8Ã4C5Ã5E8Ã8C:Ã:E8Ä	AE8ÅE8r    rr  z	image.pngNrO   )r‘  Úallow_redirectsFÚLocationzredirect missing Locationzblocked unsafe redirect URLi   r�  zcontent-typeúapplication/octet-streamztoo many redirects)Úcreate_ssrf_safe_async_clientrÒ  ÚresponseÚevent_hooksÚGETT)Úfollow_redirectsrO   éÿÿÿÿrR   >   é-  é.  é/  é3  é4  )r~  r{  r”  Úrsplitr¼   rÓ  r?   r  rÔ  rŒ   r’  ÚClientTimeoutrÖ   r�  r   Úraise_for_statusrÂ   Úiter_chunkedrÓ   r×  r—  r@   ÚstreamÚaiter_bytes)rì   rp  r{  r’  r„  Ú_aiohttpÚ_sess_kwÚ_req_kwrò   Ú	fetch_urlr�   rL  Úlocationr"  rƒ  r—  Ú	_httpx_kws   f&               rT   r€  Ú/MatrixAdapter._download_external_media_with_capë  s  øé € å0Ù˜3×ÒÜÐ7Ó8Ð8÷	1ð 	1ð& —
‘
˜3 Ó" 2Õ&×,Ñ,¨SÓ1°!Õ4×CÐC¸ˆð"	+Û&Ü 8¸¿¹Ó IÑˆHØ×-Ò-Ñ9°×9×9Ò9¸TØ�	Ü˜rŸ�AØ#ŸxšxØ!ñ oØ+3×+AÑ+AÈÐ+AÓ+Kð oØ]bð oØfm÷ o÷  oò  oØrvØŸ;™;Ð*CÔCØ'+§|¡|×'7Ñ'7¸
Ó'C˜Hß#+Ü&0Ð1LÓ&MÐ Mô )0°	Ó(D˜IÙ#.¨y×#9Ò#9Ü&0Ð1NÓ&OÐ OØ$÷ o÷  oñ  oð ×-Ñ-Ô/Ù)5Ø §,¡,×";Ñ";¸EÓ"BÜ# D¨.¸$Ó?÷ \ð \Ø#Ÿ|™|×/Ñ/°Ð@ZÓ[ó*]÷ $]™˜ð  $¨˜÷# o÷  oó  o÷ :×9Ò9á"ô& !Ð!5Ó6Ð6ò+ :ô oñ$]ñ oñ :÷ o÷  o÷  oò  oú÷ :×9×9Ñ9ûô, õ 		+ÝFØ<@¿O¿O¸O˜w¨¯©Ñ8ÐQSˆIØ(2Ô5HÐ4IÐ'JˆI�mÑ$Ù4ÑA°y×A×AÓAÀTØŸ;™; u¨cÀDÐRT˜;×U×UÕUÐY]Ø×)Ñ)Ô+Ù%1Ø×.Ñ.Ó0°$·,±,×2BÑ2BÀ>ÐSmÓ2nó&p÷  pð  p‘H�Dà U˜?÷	 V×UÒU÷ B×AÕAßU×U×UÐUú÷ B×A×A×A×AÖAúð			+üsÐ  ƒANÁ"NÁ&9I ÂHÂ I Â#AH1Ã(HÃ)H1Ã,4HÄ!0HÅH1ÅH
ÅH1Å#?HÆ#$HÇHÇ	HÇH1ÇHÇH1Ç%I Ç2HÇ3I Ç7NÇ8H1ÈI ÈH1ÈH1ÈHÈH1ÈI ÈH.ÈHÈ
H.È%H.È'
H1È1I	È7H:È8
I	ÉI	ÉI É	NÉI É#NÉ20NÊ"J%
Ê#NÊ'"M7Ë	KË
M7ËAMÌLÌ
MÌM7Ì+L.Ì,M7Ì1NÌ>MÌ?NÍNÍM ÍMÍ
M ÍM ÍM7Í#NÍ.M1Í/NÍ4NÍ7NÍ=N Í>
NÎ	NÎNÎNÎNÎNc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rL   rn  r}   Ú
image_pathrx  r  r  r�   rô  ra   r=   rR   )rS   s   "rT   rU   r�  )  óD   € ÷ qñ qØðqØ(+ðqØ6CðqØVcðqà*ðqà6@ñqrV   c           	   ƒ  	óH   "  € V P                  WR W4VR7      G Rj  x€L
 #  L5i)r½  r|  N©Ú_send_local_file)rì   rn  r°  rx  r  r�   s   &&&&&&rT   Úsend_image_fileÚMatrixAdapter.send_image_file)  ó(   é € ð ×*Ñ*¨7À	È7ÐgoÐ*Óp×pÐpÑpùó   ‚"› œ"c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )rL   rn  r}   Úimagesr\  r�   rô  Úhuman_delayr   ra   r=   rR   )rS   s   "rT   rU   r�  .  s;   € ÷ gñ gØðgØ$9ðgØE]ðgàðgà%/ñgrV   c              ƒ  	ó¼  "  € V'       g   \        R RR7      # ^ RIHp \        V4      pR p\	        V^R7       Fÿ  w  pw  ršV^ 8”  d&   V^8”  d   \
        P                  ! V4      G Rj  x€L
  V
'       d   V^8”  d   V
 RV RV R2MT
;'       g    RpV	P                  R	4      '       d*   V P                  W! V	R
,          4      W³R7      G Rj  x€L
 pMV P                  WW³R7      G Rj  x€L
 pVP                  '       g"   \        P                  RW†VP                  4       T;'       g    VP                  pEK  	  \        Yw'       d   RR7      # RR7      #  Lî L‹ Lq5i)Fzno images to sendr  )Úunquote)r–   Nz (r    rŸ  zfile://:é   NN)rn  r°  rx  r�   )rn  rw  rx  r�   z&Matrix: failed to send image %d/%d: %szall images failed to send)r=   Úurllib.parser½  rŠ   Ú	enumeraterù  Úsleepr¯   rµ  r  r  rƒ   rØ  re   )rì   rn  rº  r�   r»  Ú_unquoter‘  Ú	deliveredr•   rw  Úalt_textrx  r‘   s   &&&&&        rT   Úsend_multiple_imagesÚ"MatrixAdapter.send_multiple_images.  sA  é € ÷ Ü eÐ3FÔGÐGÝ4Ü�F“ˆØˆ	Ü*3°FÀ!×*DÑ&ˆCÑ&�)Ø˜QŒ 3¨¤7Ü—m’m KÓ0×0Ð0ß7?ÀEÈAÄI˜˜
 " S E¨¨5¨'°Ñ3ÐT\×TdÐTdÐ`dˆGØ×#Ñ# I×.Ò.Ø#×3Ñ3Ø#°¸À2½Ó0GÐQXð  4ó  m÷ m‘ð  $Ÿ™°wÐ]d˜Óx×x�Ø—>—>�>Ü—‘ÐGÈÐU[×UaÑUaÔbØ!×3Ð3 V§^¡^‹Iñ +Eô  )¾9°4ÔfÐfÐJeÔfÐfñ 1ñmñ yùsT   ‚A%EÁ'EÁ(EÁ4EÂEÂ)#EÃEÃEÃ(EÃ)EÃ?)EÄ).EÅEÅEc               ó4   € V ^8„  d   QhRRRRRRRRRRRR	R
R/# )rL   rn  r}   Ú	file_pathrx  r  Ú	file_namer  r�   rô  ra   r=   rR   )rS   s   "rT   rU   r�  D  sM   € ÷ qñ qØðqØ'*ðqØ5BðqØVcðqàðqà2JðqàV`ñqrV   c           	   ƒ  	óF   "  € V P                  WR W5WF4      G Rj  x€L
 #  L5i)r¿  Nr³  )rì   rn  rÈ  rx  rÉ  r  r�   s   &&&&&&&rT   Úsend_documentÚMatrixAdapter.send_documentD  s%   é € ð ×*Ñ*¨7¸xÈÐ\eÓp×pÐpÑpùs   ‚!š›!c               ó4   € V ^8„  d   QhRRRRRRRRRRR	R
RR/# )rL   rn  r}   Ú
audio_pathrx  r  r  r�   rô  Úis_voicer/  ra   r=   rR   )rS   s   "rT   rU   r�  I  sD   € ÷ .ñ .Øð.Ø(+ð.Ø6Cð.ØVcð.à*ð.à=Kð.àWañ.rV   c              ƒ  ó  "  € VRJ d   V P                  WRW4VRR7      G Rj  x€L
 # Rp\        V4      P                  4       P                  R
4      '       g'   \        P
                  ! \        VR^R7      G Rj  x€L
 p T P                  Y;'       g    TRY4V'       d%   \        V4      P                  R4      P                  MRVRR	7      G Rj  x€L
 V'       d8   \        \        4      ;_uu_ 4        \        P                  ! V4       RRR4       # #  Lï L› LG  + '       g   i     # ; i  T'       dK   \        \        4      ;_uu_ 4        \        P                  ! T4       RRR4       i   + '       g   i     i ; ii ; i5i)u.  Upload audio. The base media dispatch calls this with ``is_voice``: True for a voice-tagged
attachment â†’ MSC3245 voice bubble; False for an audio-ext MEDIA attachment â†’ plain ``m.audio``
in the original format. Voice bubbles need Ogg/Opus but callers pass any format (e.g. TTS
output), so transcode there â€” best-effort: without ffmpeg the original is sent. Callers that
don't pass the flag (``play_audio``) keep the voice-bubble behavior this method was written
for (#116776: the dispatch always passes ``is_voice``, and rejecting it dropped the file).Fr¾  )r�   rÏ  Nú.oggÚ48k)ÚbitraterO   T)rÉ  r�   rÏ  )rÑ  ú.ogaú.opus)r´  r}   r£   r¯  rù  Ú	to_threadrA   r   Úwith_suffixrš   r   r1  r*  r·  )rì   rn  rÎ  rx  r  r�   rÏ  Úconverted_paths   &&&&&&& rT   Ú
send_voiceÚMatrixAdapter.send_voiceI  s=  é € ð �uÓØ×.Ñ.Ø Y°ÈHÐ_dð /ó f÷ fð fà(,ˆÜ�:‹×$Ñ$Ó&×/Ñ/Ð0I×JÒJä#*×#4Ò#4Ô5JÈJÐ`eÐoqÔ#r×rˆNð		.Ø×.Ñ.Ø×5Ð5¨:°yÀ'çHVœ4 
Ó+×7Ñ7¸Ó?×DÒDÐ\`Ø!¨Dð	 /ó 2÷ 2÷ Üœg×&Õ&Ü—I’I˜nÔ-÷ 'Ð&ð ñfñ
 sñ2÷ '×&û÷ Üœg×&Õ&Ü—I’I˜nÔ-÷ '×&×&Ð&úð üs‚   ‚ F¢D£AFÁ8DÁ9FÁ>D+ Â<D+ ÃDÃD+ ÃFÃ1DÄFÄFÄD+ ÄD(Ä#FÄ+ E?ÅE+	Å"	E?Å+E;Å6	E?Å?Fc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rL   rn  r}   Ú
video_pathrx  r  r  r�   rô  ra   r=   rR   )rS   s   "rT   rU   r�  d  r±  rV   c           	   ƒ  	óH   "  € V P                  WR W4VR7      G Rj  x€L
 #  L5i)rÀ  r|  Nr³  )rì   rn  rÜ  rx  r  r�   s   &&&&&&rT   Ú
send_videoÚMatrixAdapter.send_videod  r·  r¸  iÐ  c               ó   € V ^8„  d   QhRR/# r4  rR   )rS   s   "rT   rU   r�  n  s   € ÷ Cñ C˜Cñ CrV   c                	ó    € R \        R4       R2# )u	   âš ï¸� **zgateway.exec_approval.headerz**
r   r7  s   &rT   Ú
_EA_HEADERÚMatrixAdapter._EA_HEADERm  s   € àœ1Ð;Ó<Ð=¸TÐBÐBrV   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rL   rn  r}   rJ   r�   úOptional[dict]Úregistryr¡   Úlabelra   r=   rR   )rS   s   "rT   rU   r�  q  s<   € ÷ ñ ØðØ"%ðØ1?ðØX\ðàðà!ñrV   c           	   ƒ  ó¦  "  € V P                  WVR7      G Rj  x€L
 pVP                  '       d   VP                  '       g   V# T! VP                  \        T;'       g    / P	                  R4      ;'       g    R4      ;'       g    R\
        P                  ! 4       \        V P                  ^ 4      ,           4      p	W•VP                  &   V FJ  p
 V P                  WP                  V
4      G Rj  x€L
 pV'       d   \        V4      V	P                  V
&   KJ  KL  	  V#  EL L/  \         d#   p\        P                  RYzT4        Rp?K}  Rp?ii ; i5i)z Send *text*, register ``make_prompt(message_id, requester, expires_at)`` under
the resulting event, then seed the bot's reaction controls (recording their IDs).r|  Nrp  rf   z(Matrix: failed to add %s reaction %s: %s)r  r  ro  r}   r’  rø  Ú	monotonicr�   r  Ú_send_reactionrv  r‚   rƒ   r„   )rì   rn  rJ   r�   Úmake_promptræ  Úemojisrç  r‘   ÚpromptÚemojiÚreaction_event_idrÎ   s   &&&&&&&&     rT   Ú_send_reaction_promptÚ#MatrixAdapter._send_reaction_promptq  s&  é € ð
 —y‘y ¸�yÓB×BˆØ�~�~ˆ~ V×%6×%6Ð%6ØˆMÙØ×Ñœs H§N N°×#7Ñ#7Ð8KÓ#L×#RÐ#RÐPRÓS×[Ð[ÐW[Ü�NŠNÓœs 4×#AÑ#AÀ1ÓEÕEóGˆð '-�×"Ñ"Ñ#ÛˆEð\Ø*.×*=Ñ*=¸g×GXÑGXÐZ_Ó*`×$`Ð!ß$Ü8;Ð<MÓ8N�F×.Ñ.¨uÓ5ñ %ñ ð ˆò Cñ %aøô ô \Ü—‘ÐGÈÐWZ×[Ò[ûð\üso   ‚E™DšE°EÁEÁEÁ8EÂA	EÃD!Ã/DÃ0D!Ã<D!Ä	EÄD!Ä!EÄ,E	ÅEÅ	EÅErÌ  rË  rÎ  rÍ  rÐ  rÏ  rÒ  rÑ  z$platform.matrix.approval.legend_oncez'platform.matrix.approval.legend_sessionz&platform.matrix.approval.legend_alwaysz$platform.matrix.approval.legend_denyz(platform.matrix.approval.typed_hint_oncez+platform.matrix.approval.typed_hint_sessionz*platform.matrix.approval.typed_hint_alwaysc               ó    € V ^8„  d   QhRRRR/# )rL   rí  r<   ra   r=   rR   )rS   s   "rT   rU   r�  Ž  s   € ÷ kñ kÐ7Ið kÈjñ krV   c           	   ƒ  ót  a aa"  € S P                   '       g   \        RRR7      # VP                  pRpVP                  '       g   RV9   d   RM
RV9   d   RMRpVP                   R\        S P                  V,          4       R\        R4       R	2R	P                  V 3R
 lV 4       4      ,           p\        ;QJ d    . V 3R lV 4       F  NK  	  5M! V 3R lV 4       4      pVP                  VP                  uooVV V3R lpS P                  SWAP                  VS P                  VR4      G Rj  x€L
 #  L5i)zHReaction-driven approval: the bot seeds one reaction per offered choice.FúNot connectedr  rÌ  rÐ  rÎ  z

z%platform.matrix.approval.legend_intror¹   c              3  ó\   <"  € T F!  p\        SP                  V,          4      x € K#  	  R # 5irt   )r   Ú_EA_LEGEND_KEYS©rv   Úcrì   s   & €rT   rx   Ú;MatrixAdapter._send_exec_approval_prompt.<locals>.<genexpr>™  s(   øé € ÐIvÑnuÐijÌ!ÈD×L`ÑL`ÐabÕLc×JdÐJdÓnuùs   ƒ),c              3  óJ   <"  € T F  pSP                   V,          x € K  	  R # 5irt   )Ú_EA_REACTIONSr÷  s   & €rT   rx   rù  š  s   øé € ÐA¹°A˜$×,Ñ,¨Q×/Ò/»ùs   ƒ #c                ó¾   <€ SP                   P                  S4      pV'       d   SP                  P                  VR 4       V SP                   S&   \	        SSWVR7      # )N)rm  rn  ro  rp  rr  )r  r’  r  rn  rl  )ro  Ú	requesterrr  Ú	old_eventrn  rì   rm  s   &&& €€€rT   Ú_makeÚ7MatrixAdapter._send_exec_approval_prompt.<locals>._make�  sY   ø€ Ø×8Ñ8×<Ñ<¸[ÓIˆIßØ×/Ñ/×3Ñ3°I¸tÔDØ<FˆD×,Ñ,¨[Ñ9Ü(Ø'°ÀZØ%ô'ð 'rV   ÚapprovalN)ré  r=   ry  Úsmart_deniedrJ   r   Ú_EA_TYPED_HINT_KEYSr¾   Útuplerm  rn  rð  r�   r  )	rì   rí  ry  ÚtierrJ   rÄ  rÿ  rn  rm  s	   f&     @@rT   Ú_send_exec_approval_promptÚ(MatrixAdapter._send_exec_approval_promptŽ  s  úé € à�|�|ˆ|Ü e°?ÔCÐCØ—.‘.ˆØˆØ×"×"Ð"Ø'¨7Ô2‘8ÀiÐSZÔFZ¹Ð`fˆDà�{‰{ˆm˜4Ü�×)Ñ)¨$Õ/Ó0Ð1°ÜÐ8Ó9Ð:¸"ð>à@DÇ	Á	ÔIvÑnuÓIvÓ@võwð 	÷ ”EÔA¹ÓA—E‘EÔA¹ÓAÓAˆ	Ø%×1Ñ1°6·>±>Ðˆ�W÷	'ð ×/Ñ/Ø�TŸ?™?¨E°4×3RÑ3RÐT]Ð_iók÷ kð 	kñ kùs   …?D8ÁC,D8Ä1D6Ä2D8c               ó4   € V ^8„  d   QhRRRRRRRRRRRR	R
R/# )rL   rn  r}   Ú	providersrN   Úcurrent_modelÚcurrent_providerrm  r�   rô  ra   r=   rR   )rS   s   "rT   rU   r�  ¨  sD   € ÷ ñ ØðØ'+ðØ<?ðØSVðØehðà%=ðàISñrV   c              ƒ  	óP  "  € V P                   '       g   \        R RR7      # T;'       g    .  UU	u. uF�  qˆP                  R4      ;'       g    .  Fn  p	\        V	4      \        VP                  R4      ;'       g    R4      \        VP                  R4      ;'       g    VP                  R4      ;'       g    R4      3NKp  	  K‘  	  up	pR\	        \
        4       p
V
'       g&   V P                  V\        R4      VR	7      G Rj  x€L
 #  ^ R
IH	p V! V4      p^ RIHp T;'       g    .  Uu/ uF(  p\        VP                  R4      ;'       g    R4      VbK*  	  ppT;'       g    .  Uu. uF'  qˆP                  R4      '       g   K  RVR,           2NK)  	  pp\        R4      p\        R4      \        RT;'       g    TR7      \        RT;'       g    TR7      .VORN\        R4      Np/ p\        \
        V
4       FV  w  pw  p	ppV	V3VV&   V! VP                  V4      V	4      pTP                  V RV	 RV 2V'       d   RV 2MR,           4       KX  	  V P                  VVVWVWpP                   R4      G Rj  x€L
 # u up	pi  EL�  \         d    Tp EL€i ; iu upi u upi  L+5i)Frô  r  ÚmodelsÚslugrf   rš   Nz platform.matrix.picker.no_modelsr|  )Ú	get_label)Úpicker_row_suffixÚ	plan_lineu   âš ï¸� zplatform.shared.unknownzplatform.matrix.picker.titlez$platform.matrix.picker.current_model)Úmodelzplatform.matrix.picker.provider)Úproviderz"platform.matrix.picker.react_modelz `u   ` â€” u    Â· úmodel picker)ré  r=   r’  r}   rŠ   Ú_MATRIX_MODEL_PICKER_REACTIONSr  r   Úhermes_cli.providersr  r‚   Úhermes_cli.model_picker_usager  ÚziprŽ   Ú_send_pickerr  )rì   rn  r	  r
  r  rm  Úon_model_selectedr�   r<  Úmodel_idÚflat_choicesr  Úprovider_labelr  Úrows_by_slugÚ
plan_linesÚunknownrÛ   ry  rî  Úprovider_slugÚprovider_namer±  s   &&&&&&&&               rT   Úsend_model_pickerÚMatrixAdapter.send_model_picker¨  sª  é € ð �|�|ˆ|Ü e°?ÔCÐCð —_�_ "�_ôNá$�·e±e¸H³o×6KÐ6KÈÒ6K¨ô �‹]œC §¡ f£× 3Ð 3°Ó4´c¸!¿%¹%À»-×:^Ð:^È1Ï5É5ÐQWË=×:^Ð:^Ð\^Ó6_Ó`Ù6Kñ aÙ$òNàNrÌsÔSqÓOrðtˆ÷ ØŸ™ØœÐ=Ó>Èð #ó S÷ Sð Sð	.Ý6Ù&Ð'7Ó8ˆNõ 	DØ=F¿_¸_È"¸_ÓM¹_¸œ˜AŸE™E &›M×/Ð/¨RÓ0°!Ò3¹_ˆÐMØ:C¿/¸/Àr¸/Ó`¹/°QÏUÉUÐS^×M_Ô0˜  +¥Ð/Ó0¹/ˆ
Ð`ÜÐ-Ó.ˆäÐ,Ó-¬qÐ1WÐ_l×_wÐ_wÐpwÔ/xÜÐ/¸.×:SÐ:SÈGÔTð5àWað5àceð5ô Ð2Ó3ð5ˆð /1ˆÜ?BÔCaÐcoÖ?pÑ;ˆEÑ;�H˜m¨]Ø&¨Ð6ˆG�E‰NÙ& |×'7Ñ'7¸Ó'FÈÓQˆFØ�L‰L˜E˜7 " X J¨f°]°OÐD×[aÈ$ÈvÈhÉÐgiÕjÖkñ @qð ×&Ñ&Ø�U˜G [ÀX×OrÑOrØó÷ ð 	ùó1NòSøô
 ô 	.Ø-‹Nð	.üò NùÚ`ñùs    ‚(J&«J&±I=Á,I=Á:"I=ÂI=Â6I=Ã<J&ÄJÄJ&ÄJ ÄJ&Ä%J&Ä*!JÅJÅ
J&Å#J&Å(JÆJÆ;J&ÇB'J&É8J$É9J&ÊJÊJ&ÊJÊJ&c               ó4   € V ^8„  d   QhRRRRRRRRRRR	RR
R/# )rL   rn  r}   rÛ   rN   ry  r¡   rm  ræ  rç  ra   r=   rR   )rS   s   "rT   rU   r�  É  sD   € ÷ 	&ñ 	&Øð	&Ø#'ð	&Ø26ð	&ØEHð	&Økoð	&àð	&à!ñ	&rV   c	           	   ƒ  ó€   aaaa"  € V P                  SRP                  V4      VVVVV3R lVSV4      G Rj  x€L
 #  L5i)zXSend picker *lines*, register a _MatrixPickerPrompt under the event, seed its reactions.r¹   c           
     ó&   <€ \        SV SSSWR 7      # ))rn  ro  rm  ry  rz  rp  rr  )rx  )ro  rý  rr  rn  ry  rz  rm  s   &&&€€€€rT   Ú<lambda>Ú,MatrixAdapter._send_picker.<locals>.<lambda>Ï  s   ø€ Ô6IØ¨JÀKÐY`Ø'¸9õ7]rV   N)rð  r¾   )	rì   rn  rÛ   ry  rm  rz  r�   ræ  rç  s	   &f&fff&&&rT   r  ÚMatrixAdapter._send_pickerÉ  sD   ûé € ð ×/Ñ/Ø�T—Y‘Y˜uÓ% x÷]ð �g˜uó&÷ &ð 	&ñ &ùs   †1>·<¸>c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rL   rn  r}   Útitlery  rN   rm  r�   rô  ra   r=   rR   )rS   s   "rT   rU   r�  Ô  sD   € ÷ Cñ CØðCØ#&ðCØ15ðCØDGðCà*ðCà6@ñCrV   c           
   ƒ  ó6  "  € V P                   '       g   \        RRR7      # / pVR.p\        \        V4       F‹  w  rš\	        V
P                  R4      ;'       g    R4      p\	        V
P                  R4      ;'       g    T4      pV
P                  R4      '       d   \        RVR	7      pW·V	&   VP                  V	 R
V 24       K�  	  V'       g   \        RRR7      # VR\        R4      .,          pV P                  WWtWVV P                  R4      G Rj  x€L
 #  L5i)zVReaction-based choice picker (/reasoning, /fast); choice = {value, label, is_current}.Frô  r  rf   rð   rç  Ú
is_currentz%platform.matrix.picker.current_suffix)rç  Ú z
No choicesz#platform.matrix.picker.react_choiceúchoice pickerN)
ré  r=   r  Ú_MATRIX_CHOICE_PICKER_REACTIONSr}   r’  r   rŽ   r  r  )rì   rn  r,  ry  rm  Úon_choice_selectedr�   Úemoji_choicesrÛ   rî  Úchoicerð   rç  s   &&&&&&&      rT   Úsend_choice_pickerÚ MatrixAdapter.send_choice_pickerÔ  s  é € ð �|�|ˆ|Ü e°?ÔCÐCØ(*ˆØ˜�ˆÜ Ô!@À'ÖJ‰MˆEÜ˜Ÿ
™
 7Ó+×1Ð1¨rÓ2ˆEÜ˜Ÿ
™
 7Ó+×4Ð4¨uÓ5ˆEØ�z‰z˜,×'Ò'ÜÐAÈÔO�Ø#(˜%Ñ Ø�L‰L˜E˜7 ! E 7Ð+Ö,ñ K÷ Ü e°<Ô@Ð@Ø�"”aÐ=Ó>Ð?Õ?ˆØ×&Ñ&Ø˜MÐ8JØ×0Ñ0°/óC÷ Cð 	Cñ Cùs%   ‚A;DÁ>DÂ2DÃADÄDÄDc               ó    € V ^8„  d   QhRRRR/# )rL   rÂ   r}   ra   rR   )rS   s   "rT   rU   r�  ê  s   € ÷ Cñ C cð C¨cñ CrV   c                ó2   € \         P                  ! RRV4      # )zMMarkdown passes through; strip image markdown (media is uploaded separately).z!\[([^\]]*)\]\(([^)]+)\)z\2rX  )rì   rÂ   s   &&rT   r  ÚMatrixAdapter.format_messageê  s   € ä�vŠvÐ1°5¸'ÓBÐBrV   c               óD   € V ^8„  d   QhRRRRRRRRRRRR	R
R	RRRRRRRR/# )rL   r_  r}   r"  rx  Úfilenamer�  r»  rx  r  r  r�   rô  rÏ  rQ   Úvoice_metadatara   r=   rR   )rS   s   "rT   rU   r�  î  sz   € ÷ $Dñ $DØð$DØ"'ð$DØ36ð$DØFIð$DØTWð$Dàð$Dà1>ð$DàQið$Dð ð$Dð 1Ið$Dð U_ñ$DrV   c              ƒ  	ó4  "  € \        V4      V P                  8”  d   V P                  \        V4      4      # TpR pV P                  V4      G R j  x€L
 '       d    ^ RIHp V! V4      w  r¼ V P                  P                  W´V\        V4      R7      G R j  x€L
 pRTRT;'       g    TR	R
TR\        T4      //pTe$   / TP                  4       CR\        T4      /CTR&   M\        T4      TR&   T	'       d`   / TR&   R Uu/ uF'  pT
;'       g    / P                  T4      ;pf   K$  TTbK)  	  ppRT9   d   TR,          TR	,          R&   T'       d   TTR&   T P                  TYxR7       T P!                  TT4      G R j  x€L
 #  EL4  \         d7   p\        P                  RT4       \        R\        T4      R7      u R p?# R p?ii ; i EL4  \         d7   p\        P                  RT4       \        R\        T4      R7      u R p?# R p?ii ; iu upi  L—5i)N)Úencrypt_attachmentz(Matrix: attachment encryption failed: %sFr  )Ú	mime_typer;  r�  zMatrix: upload failed: %sr»  r¶   r  Úmimetyper�  rp  Úfilezorg.matrix.msc3245.voicerh   zorg.matrix.msc1767.audior  )rh   rz   )rŠ   r  Ú_media_too_largeÚ_room_needs_encrypted_uploadÚmautrix.crypto.attachmentsr>  r‚   rƒ   re   r=   r}   ré  Úupload_mediaÚ	serializer’  r  rp  )rì   r_  r"  r;  r�  r»  rx  r  r�   rÏ  r<  Úupload_dataÚencrypted_filer>  rÎ   Úmxc_urlr  Úkrw   Úaudio_metadatas   &&&&&&&&&&&         rT   r‚  ÚMatrixAdapter._upload_and_sendî  s  é € ô ˆt‹9�t×,Ñ,Ô,Ø×(Ñ(¬¨T«Ó3Ð3ØˆØˆØ×2Ñ2°7Ó;×;Ö;ðAÝIÙ.@ÀÓ.FÑ+�ð	=Ø ŸL™L×5Ñ5Ø¸hÌSÐQ\ÓM]ð 6ó _÷ _ˆGð �w ¨×(;Ð(;°8¸VÀjÐR^Ð`fÔhkÐlpÓhqÐErð'tˆàÒ%Ø"U ^×%=Ñ%=Ó%?Ð"UÀÌÈGËÑ"UˆK˜Òä!$ W£ˆK˜ÑßØ68ˆKÐ2Ñ3á6ólÙ6˜À×AUÐAUÐSU×@ZÑ@ZÐ[\Ó@]Ð;]¸1”��1’Ñ6ð ð là˜^Ô+Ø2@ÀÕ2L�˜FÕ# JÑ/ßØ:H�Ð6Ñ7Ø×%Ñ% k¸HÐ%ÔXØ×-Ñ-¨g°{ÓC×CÐCò9 <øô ô AÜ—‘ÐGÈÔMÜ!¨%´s¸3³xÔ@Õ@ûðAúò_øäô 	=Ü�L‰LÐ4°cÔ:Ü e´3°s³8Ô<Õ<ûð	=üòlñ Dùsµ   ‚AHÁFÁ	HÁF Á,*G ÂG
ÂG ÂHÂ'AHÃ7	HÄ HÄHÄ&HÄ-#HÅ-HÅ>HÅ?HÆGÆ+GÆ<GÆ=HÇGÇHÇ
G ÇHÇ+H	ÈHÈHÈ	HÈ	Hc               ó    € V ^8„  d   QhRRRR/# ©rL   r_  r}   ra   rQ   rR   )rS   s   "rT   rU   r�    s   € ÷ 
ñ 
¸#ð 
À$ñ 
rV   c              ƒ  ó.  "  € V P                   '       d   \        V P                  RR4      '       g   R# \        V P                  RR4      pV'       g   R#  \        VP	                  \        V4      4      G Rj  x€L
 4      #  L  \         d     R# i ; i5i)zLE2EE on, Olm machine loaded, and the state store says the room is encrypted.r¾  NFr®  )ræ  rÓ   ré  rQ   Úis_encryptedr   r‚   )rì   r_  r®  s   && rT   rC  Ú*MatrixAdapter._room_needs_encrypted_upload  st   é € à× × Ð ¤W¨T¯\©\¸8ÀT×%JÒ%JÙÜ˜dŸl™l¨M¸4Ó@ˆßÙð	Ü˜k×6Ñ6´v¸g³ÓG×GÓHÐHÑGøÜô 	Úð	üs<   ‚ABÁ"B Á8BÁ9B Â BÂB ÂBÂBÂBÂBc               ó    € V ^8„  d   QhRRRR/# )rL   r�  rP   ra   r=   rR   )rS   s   "rT   rU   r�     s   € ÷ nñ n Sð n¨Zñ nrV   c                	ó>   € \        R RV RV P                   R2R7      # )Fz!Media file exceeds Matrix limit (r‹  rŒ  r  )r=   r  )rì   r�  s   &&rT   rB  ÚMatrixAdapter._media_too_large   s.   € ÜØÐ#DÀTÀFÈ#Èd×NcÑNcÐMdÐdkÐ!lônð 	nrV   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   r_  r}   r  rb   ra   r=   rR   )rS   s   "rT   rU   r�  $  s"   € ÷ =ñ =°ð =À>ð =ÐV`ñ =rV   c              ƒ  ó  "  €  V P                   P                  \        V4      \        P                  V4      G Rj  x€L
 p\        R\        V4      R7      #  L  \         d!   p\        R\        T4      R7      u Rp?# Rp?ii ; i5i)zISend a prebuilt m.room.message payload, mapping exceptions to SendResult.NTr  Fr  )ré  r#  r   r   r!   r=   r}   r‚   )rì   r_  r  r  rÎ   s   &&&  rT   rp  Ú!MatrixAdapter._send_content_event$  sg   é € ð	=Ø!Ÿ\™\×<Ñ<¼VÀG»_Ìi×NdÑNdÐfqÓr×rˆHÜ d´s¸8³}ÔEÐEñ søäô 	=Ü e´3°s³8Ô<Õ<ûð	=üsD   ‚B„7A »A¼A ÁBÁA ÁBÁ#A>Á8BÁ9BÁ>BÂBc               ó<   € V ^8„  d   QhRRRRRRRRRRRRR	R
RRRR/	# )rL   r_  r}   rÈ  r»  rx  r  r  rÉ  r�   rô  rÏ  rQ   ra   r=   rR   )rS   s   "rT   rU   r�  ,  sc   € ÷ Cñ CØðCØ'*ðCØ58ðCØCPðCàðCà3@ðCàSkðCð ðCð $.ñCrV   c	              ƒ  	óÌ  "  € \        V4      P                  4       p	V	P                  4       '       gI   \        P	                  R V P
                  V4       \        R4      p
V P                  WWEVR7      G Rj  x€L
 #  V	P                  4       P                  pW°P                  8”  d   V P                  V4      # T;'       g    V	P
                  pV'       d$   \        P                  ! \        V	4      G Rj  x€L
 MRpT P!                  YP#                  4       T\$        P&                  ! V4      ^ ,          ;'       g    RVWEWxV4
      G Rj  x€L
 #  LÕ  \         d    ^ p LÇi ; i Lm L5i)z1[%s] upload fallback: media file not found for %sz'platform.shared.media.attachment_failedr}  Nr–  )r   r  r9  rƒ   rØ  rš   r   r�  ÚstatÚst_sizer1  r  rB  rù  rÖ  r˜   r‚  Ú
read_bytesr²  r³  )rì   r_  rÈ  r»  rx  r  rÉ  r�   rÏ  r<  rJ   Ú	file_sizer„  r<  s   &&&&&&&&&     rT   r´  ÚMatrixAdapter._send_local_file,  s@  é € ô �‹O×&Ñ&Ó(ˆØ�x‰x�zŠzä�N‰NÐNÐPT×PYÑPYÐ[dÔeÜÐ>Ó?ˆDØ×0Ñ0°ÈÐmuÐ0Óv×vÐvð	ØŸ™›×(Ñ(ˆIð ×,Ñ,Ô,Ø×(Ñ(¨Ó3Ð3Ø×#Ð#˜QŸV™Vˆ÷ Yaœw×0Ò0Ô1PÐRSÓT×TÐTÐfjˆØ×*Ñ*Ø—\‘\“^ U¬I×,@Ò,@ÀÓ,GÈÕ,J×,hÐ,hÐNhÐjqØ˜x°>óC÷ Cð 	Cñ wøô ô 	ØŠIð	úñ UñCùsg   ‚A3E$Á5EÁ6E$Á;E Â)E$Â?E$ÃE$Ã2E Ã3AE$Ä8E$ÅE"ÅE$ÅEÅE$ÅEÅE$Å"E$c               ó   € V ^8„  d   QhRR/# rã   rR   )rS   s   "rT   rU   r�  D  s   € ÷ 'ñ ' $ñ 'rV   c              ƒ  	ó  "  € V P                   pVP                  P                  4       G R j  x€L
 pV P                  '       gŽ    \        P
                  ! VP                  VRR7      RR7      G R j  x€L
 p\        V\        4      '       dD   V P                  W4      G R j  x€L
 ;'       g    Tp\        P                  ! ^ 4      G R j  x€L
  K�  KŸ  R #  L¥ Lc L6 L  \        P                   d     R # \         d‡   pT P                  '       d    R p?R # \        T4      '       d   \        P                  RT4        R p?R # \        P!                  RT4       \        P                  ! ^4      G R j  x€L 
   R p?EKL  R p?ii ; i5i)NrZ  )ÚsincerO   ç     €F@rp   z/Matrix: permanent auth error, stopping sync: %su)   Matrix: sync error: %s â€” retrying in 5s)ré  ré  Úget_next_batchrí  rù  r"  rÙ  rÔ   r¡   rÛ  rÁ  r  r‚   r×   rƒ   re   rØ  )rì   rH  Ú
next_batchrÝ  rÎ   s   &    rT   rû  ÚMatrixAdapter._sync_loopD  s  é € Ø—‘ˆØ!×,Ñ,×;Ñ;Ó=×=ˆ
Ø—-—-�-ð'ô #*×"2Ò"2°6·;±;ÀZÐY^°;Ó3_ÐimÔ"n×n�	Ü˜i¬×.Ò.Ø'+×'8Ñ'8¸Ó'K×!K×!YÐ!YÈz�JÜ!Ÿ-š-¨Ó*×*Ò*ñ /ñ  ñ >ñ
 oá!KÙ*øÜ×)Ñ)ô ÚÜô 'Ø—=—=�=Ýä2°3×7Ò7Ü—L‘LÐ!RÐTWÔXÝÜ—‘ÐJÈCÔPÜ—m’m AÓ&×&×&Ð&ûð'üs«   ‚*F¬C­FÁ,C Á0CÁ1.C ÂCÂ 
C Â+C ÃCÃC ÃFÃC ÃC ÃC ÃFÃ/FÃ2FÃ;FÃ<E=ÄFÄ'E=Ä;FÅ/E=Å0E3Å1E=Å6FÅ=FÆFrØ  c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rL   rH  r   rÝ  rb   rØ  rQ   ra   r  rR   )rS   s   "rT   rU   r�  [  s*   € ÷ ñ ¨ð ¸ð ÐUYð Ðfsñ rV   c             ƒ  ó  "  € \         P                   ! 4       V n        VP                  R/ 4      P                  R/ 4      pV'       g	   V'       d:   V P                  P	                  VP                  4       4       V P                  4        V P                  WA4       VP                  R4      pV'       d$   VP                  P                  V4      G Rj  x€L
  V'       dB   \        P                  R\        V P                  4      4       V P                  4       G Rj  x€L
   V P                  V4      G Rj  x€L
  V P#                  V4       V#  Lz L3 L  \         d,   p\        P!                  RT'       d   RMRT4        Rp?LJRp?ii ; i5i)	zîApply one sync response: joined rooms, next_batch, event dispatch, pending invites. Returns next_batch.
The initial (full-state) sync also seeds the DM cache and dispatches so the OlmMachine sees
to-device key shares queued while offline.Úroomsr¾   rd  Nz.Matrix: initial sync complete, joined %d roomszMatrix: %s: %sz!initial sync event dispatch errorzsync event dispatch error)rø  rð  r’  r÷  ÚupdaterA  Ú_invalidate_room_identitiesÚ_warn_encrypted_dropsré  Úput_next_batchrƒ   r  rŠ   Ú_refresh_dm_cacheÚ_dispatch_syncr‚   rØ  Ú_schedule_pending_invite_joins)rì   rH  rÝ  rØ  Ú
rooms_joinÚnbrÎ   s   &&&$   rT   rÛ  ÚMatrixAdapter._absorb_sync[  s9  é € ô "ŸYšY›[ˆÔØ—]‘] 7¨BÓ/×3Ñ3°F¸BÓ?ˆ
ßŸØ×Ñ×%Ñ% j§o¡oÓ&7Ô8Ø×,Ñ,Ô.Ø×"Ñ" :Ô6Ø�]‰]˜<Ó(ˆßØ×#Ñ#×2Ñ2°2Ó6×6Ð6ßÜ�K‰KÐHÌ#Èd×N`ÑN`ÓJaÔbØ×(Ñ(Ó*×*Ð*ð	CØ×%Ñ% iÓ0×0Ð0ð 	×+Ñ+¨IÔ6Øˆ	ñ 7ñ +á0øÜô 	CÜ�N‰NÐ+×T[Ñ-PÐa|ð  B÷  Cñ  Cûð	Cüsm   ‚AF
ÁBF
ÃEÃF
Ã<F
ÄEÄF
ÄE Ä3EÄ4E Ä8F
ÅF
ÅE ÅFÅ!FÅ=F
ÆFÆF
c               ó$   € V ^8„  d   QhRRRRRR/# )rL   rp  rb   rH  r   ra   rä   rR   )rS   s   "rT   rU   r�  r  s"   € ÷ $ñ $°ð $Èð $ÐPTñ $rV   c                óò  € \        VRR4      e   R# VP                  4        FÑ  w  r4W0P                  9   d   K  VP                  R/ 4      P                  R. 4      p\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       g   Ku  V P                  P                  V4       V P                  R8X  d   \         R	2pMR
V P                   R2p\        P                  RW64       KÓ  	  R# )u  Fail loud when encrypted room events arrive but no decryptor is attached (#131778).

With E2EE off, or after the optional mode degraded (missing deps / failed setup) and
kept the connection, ``m.room.encrypted`` timeline events dispatch to an empty
ROOM_ENCRYPTED handler set â€” mautrix drops them without a trace, so an encrypted room
looks connected but deaf: syncs succeed, no errors, no warnings. One warning per room
per process; with a decryptor attached, mautrix's own machinery already reports
decryption failures.r¾  NÚtimelineÚeventsc              3  óz   "  € T F1  p\        V\        4      ;'       d    VP                  R 4      R8H  x € K3  	  R# 5i)rÜ  r$   N)rÔ   r¡   r’  )rv   Úevs   & rT   rx   Ú6MatrixAdapter._warn_encrypted_drops.<locals>.<genexpr>�  s3   é € ÐbÑ[aÐUW”:˜b¤$Ó'×PÐP¨B¯F©F°6«NÐ>PÑ,PÔPÓ[aùs   ‚;ž;TFrë  z2, then set MATRIX_E2EE_MODE=optional (or required)zE2EE mode is z_ but the decryptor was not set up at connect; see the earlier Matrix E2EE warning for the causeu”   Matrix: dropping encrypted messages in %s â€” this process has no E2EE decryptor. %s. Without it, messages in encrypted rooms never reach the agent.)
rÓ   rB  rû  r’  r°  r&  rå  r•  rƒ   rØ  )rì   rp  rH  r_  Ú	room_datarv  Úcauses   &&&    rT   rk  Ú#MatrixAdapter._warn_encrypted_dropsr  sØ   € ô �6˜8 TÓ*Ò6ÙØ",×"2Ñ"2Ö"4ÑˆGØ×;Ñ;Ô;ÙØ—]‘] :¨rÓ2×6Ñ6°xÀÓDˆFß‹sÑbÑ[aÓb�s�sŠsÑbÑ[aÓb×bÔbØ×1Ñ1×5Ñ5°gÔ>Ø—?‘? eÔ+Ü1Ð2Ð2dÐe‘Eà,¨T¯_©_Ð,=ð >Qð Q�Eä—‘ðUàö$ó #5rV   c               ó    € V ^8„  d   QhRRRR/# ©rL   rÝ  rb   ra   rä   rR   )rS   s   "rT   rU   r�  �  s   € ÷ dñ d¨nð dÀñ drV   c              ƒ  ó’  "  € V P                   pV'       d   \        VR4      '       g   R# VP                  V4      p\        P                  ! V4      '       d   VG Rj  x€L
 pV'       dX   \
        P                  ! VRR/ G Rj  x€L
 pV F1  p\        V\        4      '       g   K  \        P                  RV4       K3  	  R# R#  Le LA5i)z=Dispatch a sync response through the mautrix event machinery.Úhandle_syncNr  Tz5Matrix: event handler failed during sync dispatch: %s)ré  r”  r€  ÚinspectÚisawaitablerù  r  rÔ   r‚   rƒ   rØ  )rì   rÝ  rH  r	  Úresultsr‘   s   &&    rT   rn  ÚMatrixAdapter._dispatch_sync�  s˜   é € à—‘ˆßœW V¨]×;Ò;ÙØ×"Ñ" 9Ó-ˆÜ×Ò˜u×%Ò%Ø—KˆEßä#ŸNšN¨EÐJÀTÑJ×JˆGÛ!�Ü˜f¤i×0Ô0Ü—N‘NÐ#ZÐ\bÖcó "ñ ñ  ñ Kùs6   ‚ACÁCÁCÁCÁ*CÂCÂCÂ%CÃCc               ó    € V ^8„  d   QhRRRR/# ©rL   Úsenderr}   ra   rQ   rR   )rS   s   "rT   rU   r�  œ  s   € ÷ 8ñ 8 cð 8¨dñ 8rV   c                óÆ   € V P                   ;'       g    RP                  4       P                  4       pV'       * ;'       g"    VP                  4       P                  4       V8H  # )u#  True if *sender* is the bot itself (case-insensitive: homeservers vary localpart case). With
no resolved user_id we can't prove a sender is NOT us, so return True â€” dropping our own
events beats an echo loop ("hall of mirrors").

Matrix user IDs are byte-compared after trimming whitespace and lowercasing â€” some homeservers
normalize the localpart case differently at different API surfaces, and the reply-loop tail of the
"hall of mirrors" bug (#15763) has been observed with the bot's own account bypassing a
case-sensitive equality check.
rf   )rã  r�   r£   )rì   r‡  Úowns   && rT   Ú_is_self_senderÚMatrixAdapter._is_self_senderœ  sK   € ð �}‰}×"Ð" ×)Ñ)Ó+×1Ñ1Ó3ˆØŒw×7Ð7˜&Ÿ,™,›.×.Ñ.Ó0°CÑ7Ð7rV   c               ó    € V ^8„  d   QhRRRR/# r†  rR   )rS   s   "rT   rU   r�  ª  s   € ÷ :ñ :¨Cð :°Dñ :rV   c                óÀ   € T ;'       g    RP                  4       P                  R4      P                  R4      ^ ,          pV'       * ;'       g    VP                  R4      # )uF  True for appservice/bridge/system identities (``@_telegram_123:server``) or malformed IDs.
Never offer these a pairing code: an approved bridge would relay every outbound message
back as an "authorized user message" (echo loop).

We treat these as system identities for pairing purposes: they should never be offered a pairing
code, because an operator approving the code would hand the bridge itself permanent authorization â€”
and every outbound message relayed by the bridge would then loop back into the agent as an
"authorized user message", which is the root of issue #15763.
rf   Ú@r†  r�   )r�   ÚlstripÚ	partitionr¯   )r‡  Ú	localparts   & rT   Ú_is_system_or_bridge_senderÚ)MatrixAdapter._is_system_or_bridge_sender©  sN   € ð —\�\˜r×(Ñ(Ó*×1Ñ1°#Ó6×@Ñ@ÀÓEÀaÕHˆ	ØŒ}×9Ð9 	× 4Ñ 4°SÓ 9Ð9rV   c               ó    € V ^8„  d   QhRRRR/# rN  rR   )rS   s   "rT   rU   r�  ·  s   € ÷ ñ ¸3ð À4ñ rV   c              ƒ  óè   "  € V P                   '       d   WP                   9   d   R#  V P                  V4      G Rj  x€L
 #  L  \         d"   p\        P	                  RY4        Rp?R# Rp?ii ; i5i)zXMATRIX_ALLOWED_ROOMS gate; DMs are exempt so personal chats survive a project allowlist.TNzEMatrix: could not resolve room identity for allowlist check in %s: %sF)r  Ú_is_dm_roomr‚   rƒ   r„   )rì   r_  rÎ   s   && rT   Ú_is_allowed_matrix_room_eventÚ+MatrixAdapter._is_allowed_matrix_room_event·  s]   é € à×%×%Ð%¨×4JÑ4JÔ)JÙð	Ø×)Ñ)¨'Ó2×2Ð2Ñ2øÜô 	Ü�L‰LÐ`ÐbiÔoÝûð	üs>   ‚%A2¨A ¼A½A Á A2ÁA ÁA/ÁA*Á$A2Á*A/Á/A2c               ó   € V ^8„  d   QhRR/# rã   rR   )rS   s   "rT   rU   r�  Á  s   € ÷ 	.ñ 	.¨Dñ 	.rV   c                ó0   € ^ V n         RV n        RV n        R# )z_State for _note_late_grace_drop: consecutive-drop count, their skew, and the once-only warning.rÇ  FN)Ú_late_grace_dropsÚ_late_grace_skewÚ_clock_skew_warnedr7  s   &rT   rï  Ú(MatrixAdapter._reset_clock_skew_detectorÁ  s   € ð '(ˆÔØ'*ˆÔØ(-ˆÖrV   c               ó    € V ^8„  d   QhRRRR/# )rL   Úevent_tsr   ra   rä   rR   )rS   s   "rT   rU   r�  Ì  s   € ÷ +ñ +¨eð +¸ñ +rV   c                óü  € V P                   '       g,   \        P                  ! 4       V P                  ,
          ^8:  d   R# V P                  V,
          p^Tu;8  d
   R8  g    R#  R# V P                  '       d;   \	        W P
                  ,
          4      ^<8  d   V ;P                  ^,          un        MW n        ^V n        V P                  ^8¼  d+   \        P                  RV P                  V4       RV n         R# R# )ul  Clock-skew heuristic for grace-check drops well after startup. A host clock set ahead of
real time makes every live event look "older than startup" and the bot silently never
replies. Warn once when drops keep happening >30s after startup with a *consistent* skew â€”
unlike backfill from a freshly invited room, whose event ages vary widely and reset the counter.Ni€Q u1  Matrix: dropped %d consecutive live events as 'too old' more than 30s after startup (skew â‰ˆ %.0fs). The host system clock is likely set ahead of real time, which causes the startup grace filter to silently discard every incoming message. Run `timedatectl set-ntp true` (or sync NTP) and restart the bot.T)r�  rø  rî  r›  ru   rœ  rƒ   rØ  )rì   r   Úskews   && rT   Ú_note_late_grace_dropÚ#MatrixAdapter._note_late_grace_dropÌ  sÓ   € ð
 ×"×"Ð"¤d§i¢i£k°D×4DÑ4DÕ&DÈÔ&JÙØ×Ñ (Õ*ˆØ�DÖ ˜5Õ Ùð !ÙØ×!×!Ð!¤c¨$×1FÑ1FÕ*FÓ&GÈ"Ô&LØ×"Ò" aÕ'Ö"à$(Ô!Ø%&ˆDÔ"Ø×!Ñ! QÔ&Ü�N‰NðPð RV×QgÑQgÐimô	oð
 '+ˆDÖ#ñ 'rV   c               ó    € V ^8„  d   QhRRRR/# ©rL   rÃ  r   ra   rä   rR   )rS   s   "rT   rU   r�  ã  s   € ÷ /mñ /m¨Cð /m°Dñ /mrV   c           	   ƒ  	ó¨  a	"  € \        \        VR R4      4      p\        \        VRR4      4      o	\        P                  R\        VRR4      S	V4       V P	                  S	4      '       d   R# V P                  S	4      '       d   \        P                  RS	V4       R# \        ;QJ d)    V	3R lV P                   4       F  '       g   K   R	M	  R
M! V	3R lV P                   4       4      '       d   \        P                  RS	V4       R# V P                  V4      G Rj  x€L
 '       g   \        P                  RV4       R# \        \        VRR4      4      pV P                  V4      '       d   R# \        V4      pV'       d/   W@P                  \        ,
          8  d   V P                  V4       R# \        VRR4      pVf   R# \        V\         4      '       d   YUP#                  RR4      rvMM\%        VR4      '       d   VP'                  4       M/ p\%        VR4      '       d   \        VP(                  4      MRpVP#                  R/ 4      pVP#                  R4      R8X  d   R# VR8X  d   V P*                  '       g   R# VR9   d    V P-                  VS	W4WhV4      G Rj  x€L
  R# VR9   d   V P/                  VS	W4Wh4      G Rj  x€L
  R# R#  EL® L0 L5i)r_  rf   r‡  u1   Matrix: callback fired â€” event %s from %s in %sr  rr  Nz.Matrix: ignoring system/bridge sender %s in %sc              3  óX   <"  € T F  qP                  S;'       g    R 4      x € K!  	  R# 5i)rf   N)Úsearch)rv   r!  r‡  s   & €rT   rx   Ú1MatrixAdapter._on_room_message.<locals>.<genexpr>ó  s#   øé € ÐWÑ;V°�~‰~˜fŸl˜l¨×+Ð+Ó;Vùs   ƒ*›*TFzAMatrix: ignoring sender %s in %s due to configured ignore patternz2Matrix: ignoring message from unauthorized room %srÂ   r»  rF  rk  r  rj  úm.notice)r½  r¾  rÀ  r¿  )rf  r«  )r}   rÓ   rƒ   r„   rŠ  r’  r°  r  r—  r  r'  rÉ  rî  Ú_STARTUP_GRACE_SECONDSr£  rÔ   r¡   r’  r”  rF  r»  r
  Ú_handle_media_messageÚ_handle_text_message)
rì   rÃ  r_  r  r   rÂ   Úsource_contentr»  r  r‡  s
   &&       @rT   rô  ÚMatrixAdapter._on_room_messageã  sQ  øé € Ü”g˜e Y°Ó3Ó4ˆÜ”W˜U H¨bÓ1Ó2ˆä�‰Ø?ÄÈÐPZÐ\_ÓA`ÐbhÐjqô	sà×Ñ ×'Ò'Ùð ×+Ñ+¨F×3Ò3Ü�L‰LÐIÈ6ÐSZÔ[Ùß‹3ÔW¸4×;VÒ;VÓW�3�3Š3ÔW¸4×;VÒ;VÓW×WÒWÜ�L‰LÐ\Ð^dÐfmÔnÙØ×7Ñ7¸Ó@×@Ö@Ü�K‰KÐLÈgÔVÙÜ”w˜u j°"Ó5Ó6ˆØ×#Ñ# H×-Ò-Ùä2°5Ó9ˆß˜×#3Ñ#3Ô6LÕ#LÔLØ×&Ñ& xÔ0ÙÜ˜% ¨DÓ1ˆØŠ?ÙÜ�gœt×$Ò$Ø&-¯{©{¸9ÀbÓ/I™Gä4;¸GÀ[×4QÒ4Q˜W×.Ñ.Ô0ÐWYˆNÜ.5°g¸y×.IÒ.I”c˜'Ÿ/™/Ô*ÈrˆGØ#×'Ñ'¨¸Ó;ˆ
Ø�>‰>˜*Ó%¨Ô4Ùà�jÔ ¨×)>×)>Ð)>ÙØÐAÔAØ×,Ñ,¨W°f¸hÐR`ÐnuÓv×vÒvØÐ.Ô.Ø×+Ñ+¨G°V¸XÐQ_Ól×lÒlñ /ò7 Añ4 wálùs[   ƒA?KÂ#KÂ'KÃ'KÃ0-KÄKÄ	KÄ(EKÉ<!KÊKÊ$KËKË	KËKËKc               ó<   € V ^8„  d   QhRRRRRRRRRRRRR	R
RRRR/	# )rL   r_  r}   r‡  r  r¶   r¯  r¡   r  Úmention_claimedrQ   Ú
voice_gatezOptional[VoiceGate]ra   úOptional[tuple]rR   )rS   s   "rT   rU   r�    so   € ÷ CGñ CGØðCGØ$'ðCGØ36ðCGØ>AðCGØSWðCGàðCGà+/ðCGð (ðCGð 4CñCGrV   c	              ƒ  óŠ  "  € V P                  V4      G Rj  x€L
 p	V P                  V4      G Rj  x€L
 p
V
'       d   RMRp\        V4      pT;'       g    V P                  WE4      pV
'       Eg'   V P                  '       d)   WP                  9  d   \
        P                  RW14       R# WP                  9   p\        T;'       d    WÀP                  9   4      pV P                  '       dj   V'       gb   V'       gZ   V'       gQ   VP                  R4      '       g:   Ve   V P                  P                  WWƒWV4       \
        P                  RW14       R# MBV P                  '       d1   V'       d)   V'       g!   V'       g   \
        P                  RW<4       R# V'       db   V P                  '       dP   VP                  R4      '       d(   \!        V4      w  ppVV P#                  V4      ,           pMV P#                  V4      pV'       gx   V
'       d,   V P$                  ;'       d    T;'       g    V P&                  pM:V P(                  R	8H  ;'       g$    V P(                  R
8g  ;'       d    V P*                  pV'       d   TpVe   V P                  P-                  WV4       V P/                  W4      G Rj  x€L
 pT P1                  YP2                  Y²TYÉP4                  V	P6                  V'       d   TMRVR7
      pV'       d$   V P                  P9                  V4      G Rj  x€L
  V P;                  W4       WJW¼VV3#  EL" EL LŒ L#5i)aK  Shared mention/thread/DM gating. Returns (body, is_dm, chat_type, thread_id,
display_name, source) or None when the message should be dropped. ``mention_claimed``
marks a parked voice claimed by the sender's follow-up bare @mention; ``voice_gate`` is
the in-flight mark of a parkable voice, released once the park decision is made.Nr.  r²   uP   Matrix: ignoring message %s in %s â€” room not in MATRIX_ALLOWED_ROOMS whitelistr    u_   Matrix: ignoring message %s in %s â€” no @mention (set MATRIX_REQUIRE_MENTION=false to disable)uV   Matrix: ignoring message %s in thread %s â€” no @mention (thread_require_mention=true)úm.in_reply_torÚ  rÙ  )
rn  Ú	chat_namerh  r¬  Ú	user_nameÚ	thread_idÚ
chat_topicÚguild_idr&  ro  )r/  r–  r  Ú_content_mentions_botr  rƒ   r„   r  rQ   rü  rÿ  r¯   rý  Úparkr  r’  rÝ   Ú_strip_mentionr  r  r	  r  ÚreleaseÚ_get_display_nameÚbuild_sourcerf  ra  rc  r(  Ú_background_read_receipt)rì   r_  r‡  r  r¶   r¯  r  r²  r³  r0  Úis_dmrh  r¹  Úis_mentionedÚis_free_roomÚin_bot_threadÚquote_blockÚ
reply_textÚ	syntheticrf  Úsources   &&&&&&&&&            rT   Ú_resolve_message_contextÚ&MatrixAdapter._resolve_message_context  sµ  é € ð ×4Ñ4°WÓ=×=ˆØ×&Ñ& wÓ/×/ˆß!‘D wˆ	Ü  Ó,ˆ	Ø&×ZÐZ¨$×*DÑ*DÀTÓ*Zˆßˆuà×"×"Ð" w×6IÑ6IÔ'IÜ—‘ØfÐhpô{áØ"×&6Ñ&6Ñ6ˆLÜ  ×!IÐ!I¨y¿M¹MÑ/IÓJˆMØ×$×$Ð$¯\Ç-ß#¨D¯O©O¸C×,@Ò,@Ø!Ò-Ø×+Ñ+×0Ñ0°À*ÐXfÔsÜ—L‘LðHØIQô\ñ  øð ×-×-Ð-·-Ï×]iÜ—‘ØlØô)ñ ß˜D×1×1Ð1ð �~‰~˜o×.Ò.Ü*?ÀÓ*EÑ'�˜ZØ" T×%8Ñ%8¸Ó%DÕD‘à×*Ñ*¨4Ó0�÷ ßØ!×5Ñ5×FÐF¸,×_Ð_È4×K_ÑK_‘	à ×6Ñ6¸(ÑB÷ Pð PØ×.Ñ.°&Ñ8×NÐN¸T×=NÑ=Nð çØ$�	ØÒ!Ø×Ñ×'Ñ'¨¸ÔDØ!×3Ñ3°GÓD×DˆØ×"Ñ"Ø×'<Ñ'<È	Ø"¨i×DWÑDWØ×)Ñ)ÇY¹'ÐTXÐemð #ó oˆ÷ Ø—-‘-×*Ñ*¨9Ó5×5Ð5Ø×%Ñ% gÔ8Ø˜I°,ÀÐFÐFòw >Ú/ñd Eñ 6ùsÛ   ‚M—L9˜M°L<±M½MÁMÁ0MÂAMÃ$MÃ+MÃ3MÃ;MÄMÄAMÅ&MÅ.MÅ6MÅ>MÆMÆ0MÇ?MÈMÈMÈ"	MÈ,#MÉMÉ'MÉ<6MÊ2L?Ê3AMË?MÌMÌMÌ<MÌ?MÍMc               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   r_  r}   r¶   r  r¡   ra   zFtuple[str, Optional[str], Optional[str], Optional[str], Optional[str]]rR   )rS   s   "rT   rU   r�  Y  s2   € ÷ Wñ WØðWØ"%ðWØ37ðWà	OñWrV   c              ƒ  ó&  "  € VP                  R4      ;'       g    / P                  R4      pR;p;rgV'       dQ   VP                  R4      '       d:   \        V4      w  rV\        V4      pV'       d   V P	                  W4      G Rj  x€L
 pW$WVV3#  L	5i)zûReturn (body, reply_to, reply_to_text, reply_to_author_id, reply_to_author_name). Captures
the inline reply fallback (``> <@user:srv> text\n\nreply``) BEFORE stripping it, so the
prompt layer can render "[Replying to: ...]" like Signal/Slack/Telegram.r¶  r  Nr¸   )r’  r¯   rÅ   rÌ   rÀ  )rì   r_  r¶   r  r  Úreply_to_textÚreply_to_author_idÚreply_to_author_names   &&&&    rT   Ú_extract_reply_contextÚ$MatrixAdapter._extract_reply_contextY  s‰   é € ð —N‘N ?Ó3×9Ð9°r×>Ñ>¸zÓJˆØDHÐHˆÐHÐ*ß˜Ÿ™¨×-Ò-Ü0GÈÓ0MÑ-ˆMÜ(¨Ó.ˆDç!Ø-1×-CÑ-CÀGÓ-`×'`Ð$Ø˜}ÐBVÐVÐVñ (aùs   ‚ABÁ4BÂBÂ
Bc               ó8   € V ^8„  d   QhRRRRRRRRRRRRR	R
RR/# )rL   r_  r}   r‡  r  r¶   r¯  r¡   r  Úctxr´  ra   zOptional[MessageEvent]rR   )rS   s   "rT   rU   r�  i  sL   € ÷ =ñ =Øð=Ø$'ð=Ø36ð=Ø>Að=ØSWð=Øeið=àð=à1Gñ=rV   c              ‹  óÄ  "  € Vf   V P                  WW4WV4      G Rj  x€L
 pVf   R# Vw  rIr«rÍV P                  WV4      G Rj  x€L
 w  rNpppVP                  RR4      pVfG   \        V4      pVP	                  R4      '       d   \
        P                  M\
        P                  VR&   M\        VV4      '       d   Rp\        RRVRVRVR	VR
VRVRVRVRVRV/
VB #  L¾ Lš5i)aL  Gate + normalise an inbound event into a MessageEvent (None => drop). Text body may
still change (reply-fallback strip); ``extra`` carries media fields / message_type.
``ctx`` is a pre-resolved ``_resolve_message_context`` result (media path gates before
downloading); resolving it twice would double the read receipt / thread mark.NÚmedia_msgtyper    Úmessage_typerf   rJ   rÊ  Úraw_messagero  Úreply_to_message_idrÏ  rÐ  rÑ  r¬  r¸  rR   )
rË  rÒ  rn  r´   r¯   rC   ÚCOMMANDÚTEXTrÁ  rB   )rì   r_  r‡  r  r¶   r¯  r  rÕ  rŒ  Ú_is_dmÚ
_chat_typeÚ
_thread_idrf  rÊ  r  rÏ  rÐ  rÑ  r×  s   &&&&&&&&,          rT   Ú_build_inbound_eventÚ"MatrixAdapter._build_inbound_eventi  s-  é € ð Š;Ø×5Ñ5°gÀxÐWeÓr×rˆCØŠ;ÙØEHÑBˆ�j¨là×-Ñ-¨g¸ZÓH×Hñ 	Pˆ˜Ð'9Ð;OàŸ	™	 /°4Ó8ˆØÒ ä1°$Ó7ˆDØ;?¿?¹?È3×;OÒ;O¤K×$7Ò$7ÔU`×UeÑUeˆE�.Ò!Ü$ ]°D×9Ò9ØˆDÜñ =Øð=Ø$ð=Ø2@ð=ØMUð=à (ð=à8Eð=àZlð=ð "6ð=ð
 ð=ð
 '3ð=ð
 7<ñ=ð 	=ñ sñ
 Iùs"   ‚C �Cž%C ÁCÁBC ÃC c               ó4   € V ^8„  d   QhRRRRRRRRRRR	RR
R/# )rL   r_  r}   r‡  r  r   r   r¯  r¡   r  ra   rä   rR   )rS   s   "rT   rU   r�  …  sD   € ÷ 1ñ 1Øð1Ø$'ð1Ø36ð1ØBGð1ØY]ð1àð1à!ñ1rV   c              ƒ  	ób  "  € VP                  R R4      ;'       g    RpV'       g   R# V P                  P                  W4      '       dÕ   V P                  V4      P	                  4       '       g°   V P                  Wu4      '       d™   V P                  P                  4       pV P                  P                  W4      G Rj  x€L
  V P                  P                  WVR7      p	V	'       d7   V	w  r«pV P                  WW¤W¼RRR7      G Rj  x€L
  V P                  W4       R# V P                  WV\        V4      WV4      G Rj  x€L
 pVf   R# VP                  \        P                  8X  d%   V P                   ^ 8”  d   V P#                  V4       R# V P%                  V4      G Rj  x€L
  R#  Lè L¢ Ll L5i)r¶   rf   N)Úbeforer¾  T)r²  )r’  rý  r
  r¾  r�   r¼  ÚmarkÚsettleÚclaimr­  rÂ  rà  r´   rØ  rC   rÜ  r  Ú_enqueue_text_eventÚhandle_message)rì   r_  r‡  r  r   r¯  r  r¶   ÚlimitÚparkedÚvoice_idÚvoice_contentÚvoice_relatesÚ	msg_events   &&&&&&&       rT   r®  Ú"MatrixAdapter._handle_text_message…  s†  é € ð ×!Ñ! &¨"Ó-×3Ð3°ˆßÙð ×Ñ×'Ñ'¨×8Ò8Ø×+Ñ+¨DÓ1×7Ñ7×9Ò9¸d×>XÑ>XÐY]×>nÒ>nØ×'Ñ'×,Ñ,Ó.ˆEØ×%Ñ%×,Ñ,¨WÓ=×=Ð=Ø×(Ñ(×.Ñ.¨wÀuÐ.ÓMˆFßØ9?Ñ6�¨Ø×0Ñ0Ø X¸ÐW`Ø$(ð 1ó *÷ *ð *ð ×-Ñ-¨gÔ@ÙØ×3Ñ3Ø˜XÔ'EÀdÓ'KÈ^ói÷ iˆ	àÒÙØ×!Ñ!¤[×%5Ñ%5Ô5¸$×:XÑ:XÐ[\Ô:\Ø×$Ñ$ YÖ/à×%Ñ% iÓ0×0Ò0ñ! >ñ*ñ
iñ 1ùsV   ‚$F/§AF/Á/AF/Â>F'Â?AF/ÄF)Ä7F/Ä>F+Ä?A!F/Æ F-Æ!F/Æ)F/Æ+F/Æ-F/c               ó<   € V ^8„  d   QhRRRRRRRRRRR	RR
RRRRR/	# )rL   r_  r}   r‡  r  r   r   r¯  r¡   r  r»  r²  rQ   ra   rä   rR   )rS   s   "rT   rU   r�  ¢  sT   € ÷ ;1ñ ;1Øð;1Ø$'ð;1Ø36ð;1ØBGð;1ØY]ð;1àð;1à#&ð;1à9=ð;1àJNñ;1rV   c	              ƒ  	ó4  "  € VP                  R R4      ;'       g    Rp	VP                  RR4      p
V
'       d9   \        V
4      P                  R4      '       g   \        P	                  RV4       R# VP                  R/ 4      p\        V\        4      '       g   / pVP                  RR4      p \        VP                  R4      ;'       g    ^ 4      pV'       d4   WÐP                  8”  d$   \        P	                  R	W=V P                  4       R# VP                  R
/ 4      pV
'       gs   \        V\        4      '       d]   VP                  RR4      ;'       g    Rp
V
'       d9   \        V
4      P                  R4      '       g   \        P	                  RV4       R# \        T;'       d*    \        V\        4      ;'       d    VP                  R4      4      pV P                  W|V4      w  pppV P                  WWVV4      '       d   V P                  P                  W4      MRp V P!                  WW9WVVVR7      G Rj  x€L
 pVe   V P                  P#                  WV4       Tf   R# RpT
'       d*    T P%                  Y£T'       d   TMRTTTT	4      G Rj  x€L
 pT
'       d   T'       g   T P)                  T
4      MRpT'       d   T.MT'       d   T.MRpT P+                  YY9YVTTTT'       d   T.MRTR7      G Rj  x€L
 pTe   T P-                  T4      G Rj  x€L
  R# R#   \        \        3 d    ^ p ELei ; i EL   Te   T P                  P#                  YT4       i i ; i LÏ  \&         d!   p\        P	                  RT4        Rp?LóRp?ii ; i L˜ L}5i)r¶   rf   rp  úmxc://z4[Matrix] Rejecting inbound media %s with non-MXC URLNr  r@  r�  z=[Matrix] Rejecting oversized inbound media %s (%d > %d bytes)rA  z>[Matrix] Rejecting inbound encrypted media %s with non-MXC URL)r²  r³  z"[Matrix] Failed to cache media: %s)rÕ  rØ  Ú
media_urlsÚmedia_typesr×  )r’  r}   r¯   rƒ   rØ  rÔ   r¡   rP   r“  r”  r  rQ   Ú_classify_inbound_mediaÚ_voice_may_parkrý  ÚbeginrË  r¿  Ú_download_and_cache_mediar‚   Ú_mxc_to_httprà  ré  )rì   r_  r‡  r  r   r¯  r  r»  r²  r¶   rp  Úcontent_infoÚevent_mimetypeÚevent_size_intÚfile_contentÚis_encrypted_mediaÚmsg_typeÚ
media_typeÚis_voice_messageÚgaterÕ  Úcached_pathÚeÚhttp_urlrô  rï  s   &&&&&&&&&                 rT   r­  Ú#MatrixAdapter._handle_media_message¢  sX  é € ð ×!Ñ! &¨"Ó-×3Ð3°ˆØ× Ñ  ¨Ó+ˆß”s˜3“x×*Ñ*¨8×4Ò4Ü�N‰NÐQÐS[Ô\ÙØ%×)Ñ)¨&°"Ó5ˆÜ˜,¬×-Ò-ØˆLØ%×)Ñ)¨*°bÓ9ˆð	Ü  ×!1Ñ!1°&Ó!9×!>Ð!>¸QÓ?ˆN÷ ˜n×/DÑ/DÔDÜ�N‰NØOÐQYØ×%Ñ%ô'ñ Ø%×)Ñ)¨&°"Ó5ˆß”z ,´×5Ò5Ø×"Ñ" 5¨"Ó-×3Ð3°ˆCßœ3˜s›8×.Ñ.¨x×8Ò8Ü—‘Ð_ÐaiÔjÙÜ! ,×"mÐ"m´:¸lÌDÓ3Q×"mÐ"mÐVb×VfÑVfÐglÓVmÓnÐØ15×1MÑ1MÈgÐguÓ1vÑ.ˆ�*Ð.ð >B×=QÑ=QØ˜>°÷>Hò >Hˆt×"Ñ"×(Ñ(¨Ô9ØMQð 	ð	CØ×5Ñ5Ø °Ð]lØð 6ó !÷ !ˆCð ÒØ×#Ñ#×+Ñ+¨G¸TÔBØŠ;ÙàˆßðHØ$(×$BÑ$BØ×3E¡<È4ÐQYÐ[eØ$ dó%,÷ ,�÷ .1×9K�4×$Ñ$ SÔ)ÐQSˆß&1�k‘]Çh¸¹
ÐTXˆ
Ø×3Ñ3Ø˜X¨^ÈSÐ_gØ!¿z°
©|ÈtÐcjð 4ó l÷ lˆ	ð Ò Ø×%Ñ% iÓ0×0Ò0ñ !øôY œ:Ð&ô 	Ø‹Nð	úò*!øð ÒØ×#Ñ#×+Ñ+¨G¸TÕBð  úñ,øô ô HÜ—‘ÐCÀQ×GÑGûðHúñ
lñ 1ùsø   ‚6N¹A4NÂ.L! ÃL! ÃNÃANÄ'.NÅ
NÅ!ANÆ'NÆ?A"NÈ"L> È;L;È<L> É /NÉ1#M& ÊM$ÊM& ÊNÊ!NÊ)NË
NË,NË;NË<NÌNÌNÌ!L8Ì4NÌ7L8Ì8NÌ;L> Ì>#M!Í!NÍ$M& Í&NÍ1NÎNÎNÎNÎNc               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   r»  r}   rü  r¯  r¡   ra   ztuple[MessageType, str, bool]rR   )rS   s   "rT   rU   r�  à  s2   € ÷ 
Yñ 
YØð
YØ*-ð
YØ?Cð
YØHeñ
YrV   c                óZ  € V R8X  d   \         P                  T;'       g    RR3# V R8X  dA   \        V4      pV'       d   \         P                  M\         P                  T;'       g    RV3# V R8X  d   \         P
                  T;'       g    RR3# \         P                  T;'       g    RR3# )	zIMap a Matrix media msgtype to (MessageType, mime type, is_voice_message).r½  ú	image/pngFr¾  z	audio/oggrÀ  z	video/mp4r–  )rC   ÚPHOTOrH   ÚVOICEÚAUDIOÚVIDEOÚDOCUMENT)r»  rü  r¯  rÏ  s   &&& rT   rö  Ú%MatrixAdapter._classify_inbound_mediaß  s    € ð �iÔÜ×$Ñ$ n×&CÐ&C¸ÀUÐJÐJØ�iÔÜ'¨Ó7ˆHß)1”K×%Ò%´{×7HÑ7HÈ>×KhÐKhÐ]hÐjrÐrÐrØ�iÔÜ×$Ñ$ n×&CÐ&C¸ÀUÐJÐJÜ×#Ñ# ^×%QÐ%QÐ7QÐSXÐXÐXrV   c               ó8   € V ^8„  d   QhRRRRRRRRRRR	R
RRRR/# )rL   rp  r}   r  rH  rå  r   rC   r  r  rQ   r¶   ra   r  rR   )rS   s   "rT   rU   r�  ì  sV   € ÷ Kñ KØðKØ"%ðKØ7EðKØQ\ðKØjmðKàðKà&)ðKà.;ñKrV   c              ƒ  ó  "  € V P                   P                  \        V4      4      G Rj  x€L
 pVf   R# VeÄ   ^ RIHp	 VP                  R4      VP                  R4      rº\        V
\        4      '       d   V
P                  R4      MRp\        V\        4      '       d   VP                  R4      MTpVP                  R4      pV'       d   V'       d	   V'       g   \        P                  RV4       R# V	! W‹WÍ4      p^ R	I
HpHpHp V\        P                  8X  dE   R
RRRRRRR/pV! VVP                  VR4      R7      G Rj  x€L
 p\        P!                  RV4       V# V\        P"                  \        P$                  09   dF   \'        T;'       g    V'       d   RMR4      P(                  ;'       g    RpV! VVR7      G Rj  x€L
 # T;'       g    V\        P*                  8X  d   RMRpV! VV4      G Rj  x€L
 #  ELÓ L½ L= L5i)zRDownload (and decrypt, when *encrypted_file* is given) media into the local cache.N)Údecrypt_attachmentÚhashesr
  Úsha256rJ  ÚivzA[Matrix] Encrypted media event missing decryption metadata for %s)Úcache_audio_from_bytes_asyncÚcache_document_from_bytes_asyncÚcache_image_from_bytes_asyncz
image/jpegú.jpgr
  ú.pngz	image/gifú.gifz
image/webpú.webp)Úextz [Matrix] Cached user image at %sz	voice.oggz	audio.oggrÑ  z	video.mp4Údocument)ré  Údownload_mediar   rD  r  r’  rÔ   r¡   rƒ   rØ  Úgateway.platforms.baser  r  r  rC   r  r  r  r  r   r±  r  )rì   rp  r  rH  r   r  r  r¶   Ú
file_bytesr  Úhashes_valueÚ	key_valueÚ
hash_valueÚiv_valuer  r  r  Úext_mapr  r  r;  s   &&&&&&&&             rT   rù  Ú'MatrixAdapter._download_and_cache_mediaì  s·  é € ð  Ÿ<™<×6Ñ6´zÀ#³ÓG×Gˆ
ØÒÙØÒ%ÝEØ&4×&8Ñ&8¸Ó&BÀN×DVÑDVÐW\ÓD]˜)Ü7AÀ,ÔPT×7UÒ7U˜×)Ñ)¨(Ô3Ð[_ˆJÜ.8¸ÄD×.IÒ.I˜	Ÿ™ cÔ*ÈyˆIØ%×)Ñ)¨$Ó/ˆHß§*·Ü—‘ÐbÐdlÔmÙÙ+¨JÀ:ÓXˆJ÷	
ñ 	
ð
 ”{×(Ñ(Ô(Ø# V¨[¸&À+ÈvÐWcÐelÐmˆGÙ <¸ZÈWÏ[É[ÐYcÐekÓMlÔ m×mˆKÜ�K‰KÐ:¸KÔHØÐØœ×)Ñ)¬;×+<Ñ+<Ð=Ô=Ü�t×QÐQ×/?¡À[ÓR×YÑY×cÐcÐ]cˆCÙ5°jÀcÔJ×JÐJØ×YÐY¨8´{×7HÑ7HÔ+H™KÈjˆÙ4°ZÀÓJ×JÐJò7 Hñ( nñ
 KáJùsr   ‚(HªG=«BHÃHÃHÃA'HÅH ÅAHÆHÆHÆ4HÇHÇHÇ&HÇ8HÇ9HÈ HÈHÈHc               ó    € V ^8„  d   QhRRRR/# r¦  rR   )rS   s   "rT   rU   r�  	  s   € ÷ dñ d cð d¨dñ drV   c           	   ƒ  ó’  "  € \        \        VRR4      4      p\        \        \        VRR4      RR4      4      p\        \        VRR4      4      pV P                  V\        V4      4      '       g   \        P                  RW$4       R# \        P                  R	W#4       T P                  Y#;'       d    \        V4      VR
7       R# 5i)z=Auto-join rooms when invited, recording DM rooms in m.direct.r_  rf   rÂ   NÚ	is_directFr‡  ú8Matrix: rejecting invite to %s from unauthorized user %su0   Matrix: invited to %s â€” joining (is_direct=%s)©r+  Úinviter)r}   rÓ   rQ   Ú_is_authorized_userrƒ   rØ  r  Ú_schedule_invite_join)rì   rÃ  r_  r+  r.  s   &&   rT   r÷  ÚMatrixAdapter._on_invite	  s    é € ä”g˜e Y°Ó3Ó4ˆÜœ¤¨°	¸4Ó!@À+ÈuÓUÓVˆ	Ü”g˜e X¨rÓ2Ó3ˆà×'Ñ'¨´°W³×>Ò>Ü�N‰NÐUÐW^ÔhÙÜ�‰ÐFÈÔ[à×"Ñ" 7×6QÐ6QÄDÈÃMÐ[bÐ"Öcùs   ‚B0CÂ3Cc               ó    € V ^8„  d   QhRRRR/# rN  rR   )rS   s   "rT   rU   r�  	  s   € ÷ ñ ¨cð °dñ rV   c              ƒ  	ó  "  € V'       d   WP                   9   d   \        V4      #  V P                  P                  \	        V4      4      G R j  x€L
  V P                   P                  V4       V P                  V4       \        P                  RV4       V P                  4       G R j  x€L
  R#  L` L  \         dÀ   p\        P                  RY4       \        T4      P                  4       pRT9   g   RT9   dx   \        \        4      ;_uu_ 4        T P                  P                  \	        T4      4      G R j  x€L 
  \        P                  RT4       R R R 4       M  + '       g   i     M; i R p?R# R p?ii ; i5i)NzMatrix: joined %sTzMatrix: error joining %s: %sz
no serverszroom not foundz"Matrix: declined dead invite to %sF)r÷  rQ   ré  Ú	join_roomr   r&  rj  rƒ   r  rm  r‚   rØ  r}   r£   r   Ú
leave_room)rì   r_  rÎ   Úmsgs   &&  rT   Ú_join_room_by_idÚMatrixAdapter._join_room_by_id	  s  é € ß˜'×%7Ñ%7Ô7Ü˜“=Ð ð	Ø—,‘,×(Ñ(¬°«Ó9×9Ð9Ø×Ñ×"Ñ" 7Ô+Ø×,Ñ,¨WÔ5Ü�K‰KÐ+¨WÔ5Ø×(Ñ(Ó*×*Ð*Ùñ :ñ +øäô 		Ü�N‰NÐ9¸7ÔHô �c“(—.‘.Ó"ˆCØ Ô#Ð)9¸SÔ)@Üœi×(Õ(ØŸ,™,×1Ñ1´&¸³/ÓB×BÑBÜ—K‘KÐ DÀgÔN÷ )×(×(Ð(úõ ûð		üsx   ‚$F §'B3 ÁB/ÁAB3 Â(B1Â)B3 Â-F Â/B3 Â1B3 Â3E=Â>AE8Ä(EÄ:D=
Ä;EÅ	E8ÅE/Å*E8Å2F Å8E=Å=F r+  r.  rf   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   r_  r}   r+  rQ   r.  ra   rä   rR   )rS   s   "rT   rU   r�  /	  s0   € ÷ Oñ O¨Sð OÀð OÐWZð OÐdhñ OrV   c               ó  a aaa€ S P                   P                  S4      pS'       d0   SS P                  9   g   V'       d   VP                  4       '       g   R# R VVVV 3R llp\        P
                  ! V! 4       4      S P                   S&   R# )zCSchedule an invite join without blocking sync or gateway readiness.Nc               ó   € V ^8„  d   QhRR/# rã   rR   )rS   s   "rT   rU   Ú9MatrixAdapter._schedule_invite_join.<locals>.__annotate__5	  s   € ÷ 	;ñ 	; Dñ 	;rV   c               “  ó¤  <"  €  \         P                  ! SP                  S4      R R7      G Rj  x€L
 p V '       d+   S'       d#   S'       d   SP                  SS4      G Rj  x€L
  SP                  P                  SR4       R#  LT L$  \         d    \
        P                  RS4        LEi ; i  SP                  P                  SR4       i ; i5i)rb  rp   Nz#Matrix: timed out joining invite %s)	rù  r"  r7  Ú_record_dm_roomÚTimeoutErrorrƒ   rØ  rì  rn  )Újoinedr.  r+  r_  rì   s    €€€€rT   Ú_join_inviteÚ9MatrixAdapter._schedule_invite_join.<locals>._join_invite5	  s¢   øé € ð;Ü&×/Ò/°×0EÑ0EÀgÓ0NÐX\Ô]×]�ßŸi¯GØ×.Ñ.¨w¸Ó@×@Ð@ð ×'Ñ'×+Ñ+¨G°TÖ:ñ ^á@øÜô OÜ—‘ÐDÀgÖNðOûð ×'Ñ'×+Ñ+¨G°TÕ:üsg   ƒC…*B ¯B°B ¼B ÁB ÁB Á!BÁ"B Á&CÂB ÂB Â!B,Â)B/ Â+B,Â,B/ Â/CÃC)rì  r’  r÷  r  rù  rú  )rì   r_  r+  r.  ÚexistingrA  s   ffdd  rT   r0  Ú#MatrixAdapter._schedule_invite_join/	  sa   û€ à×*Ñ*×.Ñ.¨wÓ7ˆß˜' T×%7Ñ%7Ô7¿HÈXÏ]É]Ï_Ê_Ù÷	;ó 	;ô ,3×+>Ò+>¹|»~Ó+Nˆ×Ñ Ó(rV   c               ó    € V ^8„  d   QhRRRR/# r~  rR   )rS   s   "rT   rU   r�  @	  s   € ÷ "[ñ "[¸ð "[È4ñ "[rV   c                ó   € \        V\        4      '       d   VP                  R/ 4      M/ P                  R/ 4      p\        V\        4      '       g   R# VP                  4        F—  w  r4W0P                  9   d   K  V P                  V4      w  rVV P                  V\        V4      4      '       g   \        P                  RVV4       Kd  \        P                  RVV4       V P                  \        V4      WVR7       K™  	  R# )z?Join rooms still present in rooms.invite after sync processing.rh  ÚinviteNr,  z8Matrix: reconciling pending invite for %s (is_direct=%s)r-  )rÔ   r¡   r’  rB  r÷  Ú_extract_invite_dm_signalr/  r}   rƒ   rØ  r  r0  )rì   rÝ  Úinvitesr_  Úinvited_roomr+  r.  s   &&     rT   ro  Ú,MatrixAdapter._schedule_pending_invite_joins@	  sØ   € ä1;¸IÄt×1LÒ1L�9—=‘= ¨"Ô-ÐRT×YÑYÐZbÐdfÓgˆÜ˜'¤4×(Ò(ÙØ%,§]¡]¦_Ñ!ˆGØ×,Ñ,Ô,Ùð "&×!?Ñ!?ÀÓ!MÑˆIð ×+Ñ+¨G´S¸³\×BÒBÜ—‘ØNØØôñ
 Ü�K‰KØJØØôð
 ×&Ñ&¤s¨7£|¸yÐ&ÖZó; &5rV   c               ó    € V ^8„  d   QhRRRR/# )rL   rJ  r   ra   ztuple[bool, str]rR   )rS   s   "rT   rU   r�  d	  s   € ÷ %ñ %°cð %Ð>Nñ %rV   c                óª  € V P                   '       g   R# \        V\        4      '       g   R# VP                  R/ 4      p\        V\        4      '       g   R# VP                  R. 4      p\        V\        4      '       g   R# V FÌ  p\        V\        4      '       g   K  VP                  R4      R8w  d   K3  VP                  R4      V P                   8w  d   KU  VP                  R/ 4      p\        V\        4      '       g   K  VP                  R4      R	8w  d   K—  \        VP                  R
4      4      \        VP                  RR4      4      3u # 	  R# )zþRead the is_direct flag and inviter from a room's invite_state.

The stripped ``m.room.member`` event for our own user carries the
``is_direct`` flag from the original invite; its sender is the
inviter. Returns ``(False, "")`` when the signal is absent.
rf   Úinvite_staterv  rÜ  zm.room.memberÚ	state_keyrÂ   Ú
membershiprG  r+  r‡  )Frf   )rã  rÔ   r¡   r’  rN   rQ   r}   )rì   rJ  rN  rv  rÃ  rÂ   s   &&    rT   rH  Ú'MatrixAdapter._extract_invite_dm_signald	  s  € ð �}�}ˆ}ØÐä˜,¬×-Ò-ØÐà#×'Ñ'¨¸Ó;ˆÜ˜,¬×-Ò-ØÐà×!Ñ! (¨BÓ/ˆÜ˜&¤$×'Ò'ØÐãˆEÜ˜e¤T×*Ò*ÙØ�y‰y˜Ó  OÔ3ÙØ�y‰y˜Ó%¨¯©Ô6Ùà—i‘i 	¨2Ó.ˆGÜ˜g¤t×,Ò,ÙØ�{‰{˜<Ó(¨HÔ4Ùä˜Ÿ™ KÓ0Ó1´3°u·y±yÀÈ2Ó7NÓ3OÐOÒOñ ð  ÐrV   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   r_  r}   r  rî  ra   r  rR   )rS   s   "rT   rU   r�  ‹	  s(   € ÷ ñ ¨Cð ¸3ð Àsð È}ñ rV   c              ƒ  ód  "  € V P                   '       g   R# RRRRVRV//p V P                   P                  \        V4      \        P                  V4      G Rj  x€L
 p\
        P                  RW24       \        V4      #  L%  \         d"   p\
        P                  RT4        Rp?R# Rp?ii ; i5i)	zJSend an emoji reaction; returns the reaction event_id, or None on failure.Nrk  r  zm.annotationr  r
  zMatrix: sent reaction %s to %szMatrix: reaction send error: %s)	ré  r#  r   r   r"   rƒ   r„   r}   r‚   )rì   r_  r  rî  rÂ   Úresp_event_idrÎ   s   &&&&   rT   rê  ÚMatrixAdapter._send_reaction‹	  s™   é € à�|�|ˆ|ÙØ! J°À
ÈHÐV[Ð]bÐ#cÐdˆð	Ø"&§,¡,×"AÑ"AÄ&ÈÃ/ÔS\×SeÑSeÐgnÓ"o×oˆMÜ�L‰LÐ9¸5ÔKÜ�}Ó%Ð%ñ pøô ô 	Ü�L‰LÐ:¸CÔ@Ýûð	üs@   ‚B0¢7B ÁA?Á$B Á>B0Á?B ÂB-ÂB(Â"B0Â(B-Â-B0c               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   r_  r}   rï  rÒ  ra   rQ   rR   )rS   s   "rT   rU   r�  ˜	  s0   € ÷ Mñ M¨cð MÀcð MÐSVð MÐ`dñ MrV   c              ƒ  	óB   "  € V P                  WV4      G R j  x€L
 #  L5irt   )Úredact_message)rì   r_  rï  rÒ  s   &&&&rT   Ú_redact_reactionÚMatrixAdapter._redact_reaction˜	  s   é € Ø×(Ñ(¨ÀVÓL×LÐLÑLùs   ‚˜™c               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   r_  r}   rï  rÒ  ra   rä   rR   )rS   s   "rT   rU   r�  ›	  s0   € ÷ Gñ G°Cð GÈCð GÐY\ð GÐfjñ GrV   c                óÜ   a aaa€ R VVVV 3R llp\         P                  ! V! 4       4      pS P                  P                  V4       VP	                  S P                  P
                  4       R# )zBRedact a reaction after a short delay so message delivery settles.c               ó   € V ^8„  d   QhRR/# rã   rR   )rS   s   "rT   rU   Ú@MatrixAdapter._schedule_reaction_redaction.<locals>.__annotate__ž	  s   € ÷ 		mñ 		m Tñ 		mrV   c               “  óŠ  <"  €  SP                   '       d)   \        P                  ! SP                   4      G R j  x€L
  SP                  SSS4      G R j  x€L
 '       g   \        P                  RS4       R # R #  L? L&  \        P                   d    h \         d#   p \        P                  RST 4        R p ? R # R p ? ii ; i5i)Nz$Matrix: failed to redact reaction %sz4Matrix: delayed reaction redaction failed for %s: %s)r  rù  rÁ  rY  rƒ   r„   r  r‚   )rÎ   rï  rÒ  r_  rì   s    €€€€rT   Ú_redact_laterÚAMatrixAdapter._schedule_reaction_redaction.<locals>._redact_laterž	  s    øé € ðmØ×9×9Ð9Ü!Ÿ-š-¨×(NÑ(NÓO×OÐOØ!×2Ñ2°7Ð<MÈvÓV×VÖVÜ—L‘LÐ!GÐIZÖ[ñ Wñ PÙVøä×)Ñ)ô ØÜô mÜ—‘ÐSÐUfÐhk×lÒlûðmüs\   ƒC…5A> ºA:»A> ÁA<Á	A> Á A> Á6CÁ:A> Á<A> Á>C ÂC ÂB;Â5CÂ;C Ã CN)rù  rú  r  r&  Úadd_done_callbackr%  )rì   r_  rï  rÒ  r`  r  s   ffff  rT   Ú_schedule_reaction_redactionÚ*MatrixAdapter._schedule_reaction_redaction›	  sQ   û€ ÷		mó 		mô ×"Ò"¡=£?Ó3ˆØ×&Ñ&×*Ñ*¨4Ô0Ø×Ñ˜t×=Ñ=×EÑEÖFrV   c               ó    € V ^8„  d   QhRRRR/# )rL   rÃ  rB   ra   rä   rR   )rS   s   "rT   rU   r�  ¬	  s   € ÷ Oñ O¨|ð OÀñ OrV   c              ƒ  	ó
  "  € VP                   VP                  P                  r2V P                  '       dJ   V'       d@   V'       d6   V P	                  W2R 4      G Rj  x€L
 pV'       d   W@P
                  W23&   R# R# R# R# R#  L%5i)u   ðŸ‘€N)ro  rÊ  rn  r  rê  r  )rì   rÃ  Úmsg_idr_  rï  s   &&   rT   Úon_processing_startÚ!MatrixAdapter.on_processing_start¬	  sh   é € Ø×*Ñ*¨E¯L©L×,@Ñ,@�Ø×"×"Ð"§v·'Ø&*×&9Ñ&9¸'È<Ó&X× XÐß Ø=N×'Ñ'¨Ð(9Ó:ñ !ñ 3:¡vÑ"Ù Xùs"   ‚;B¾BÁBÁBÁBÁ(Bc               ó$   € V ^8„  d   QhRRRRRR/# )rL   rÃ  rB   ÚoutcomerD   ra   rä   rR   )rS   s   "rT   rU   r�  ³	  s(   € ÷ sñ s°,ð sÐIZð sÐ_cñ srV   c              ƒ  	ó–  "  € VP                   VP                  P                  rCV P                  '       d&   V'       d   V'       d   V\        P
                  8X  d   R # V P                  P                  WC3R 4      pV'       d   V P                  WER4       T P                  YCV\        P                  8X  d   RMR4      G R j  x€L
  R #  L5i)Nzprocessing completerË  rÑ  )ro  rÊ  rn  r  rD   Ú	CANCELLEDr  rn  rc  rê  ÚSUCCESS)rì   rÃ  rk  rg  r_  Úeyes_event_ids   &&&   rT   Úon_processing_completeÚ$MatrixAdapter.on_processing_complete³	  s“   é € Ø×*Ñ*¨E¯L©L×,@Ñ,@�Ø×&×&Ð&¯f¿GÀwÔRc×RmÑRmÔGmÙØ×/Ñ/×3Ñ3°WÐ4EÀtÓLˆßØ×-Ñ-¨gÐF[Ô\Ø×!Ñ! '¸wÔJ[×JcÑJcÔ?c±8ÐiqÓr×rÔrùs   ‚;C	¾C	ÁA:C	Ã CÃC	c               ó    € V ^8„  d   QhRRRR/# r¦  rR   )rS   s   "rT   rU   r�  ¼	  s   € ÷ ñ ¨ð °ñ rV   c              ƒ  	ó@  "  € \        \        VR R4      4      pV P                  V4      '       d   R# \        \        VRR4      4      pV P                  V4      '       d   R# \        \        VRR4      4      p\        VRR4      pV'       g   R# \	        V\
        4      '       d   VP                  R/ 4      M\        VR/ 4      pR;rx\	        V\
        4      '       d&   VP                  RR4      pVP                  RR4      pM>\        VR4      '       d-   \        \        VRR4      4      p\        \        VRR4      4      p\        P                  R	W‚Wt4       V P                  V P                  V P                  3 F  p	V	! WGW‚4      G Rj  x€L
 '       g   K   R# 	  R#  L5i)
r‡  rf   Nr  r_  rÂ   rk  r  r
  z'Matrix: reaction %s from %s on %s in %s)r}   rÓ   rŠ  r'  rÔ   r¡   r’  r”  rƒ   r  Ú_handle_approval_reactionÚ_handle_model_picker_reactionÚ_handle_choice_picker_reaction)
rì   rÃ  r‡  r  r_  rÂ   r  Ú	reacts_tor
  Úhandlers
   &&        rT   rõ  ÚMatrixAdapter._on_reaction¼	  s]  é € Ü”W˜U H¨bÓ1Ó2ˆØ×Ñ ×'Ò'ÙÜ”w˜u j°"Ó5Ó6ˆØ×#Ñ# H×-Ò-ÙÜ”g˜e Y°Ó3Ó4ˆÜ˜% ¨DÓ1ˆßÙÜ9CÀGÌT×9RÒ9R�g—k‘k .°"Ô5Ü" 7¨L¸"Ó=ð 	àÐˆ	Ü�j¤$×'Ò'Ø"Ÿ™ z°2Ó6ˆIØ—.‘. ¨Ó+‰CÜ�Z ×,Ò,ÜœG J°
¸BÓ?Ó@ˆIÜ”g˜j¨%°Ó4Ó5ˆCÜ�‰Ð=¸sÈIÔ_Ø×6Ñ6¸×8ZÑ8ZØ×;Ñ;ó=ˆGá˜W°Ó=×=×=Ð=Úó=á=ùs   ‚FFÆFÆ	FÆFc               ó<   € V ^8„  d   QhRRRRRRRRRRRRR	RR
RRR/	# )rL   ræ  r¡   r_  r}   rw  r
  r‡  rç  Úinvalid_textry  rå  ra   ztuple[bool, Any, Any]rR   )rS   s   "rT   rU   r�  Ö	  sT   € ÷ 'ñ 'Øð'Ø'*ð'Ø7:ð'ØADð'ØNQð'ØZ]ð'Ømpð'à+ð'à7Lñ'rV   c
              ƒ  óÆ  "  € VP                  V4      p
V
'       d   V
P                  '       d   R# W*P                  8w  d   RV
R3# V P                  V
4      '       d   V! W#V
4      G Rj  x€L
  RV
R3# V P	                  W#WZV4      G Rj  x€L
 '       g   RV
R3# V	f   V
P
                  MT	P                  V4      pVf   V P                  W#V4      G Rj  x€L
  RW«3#  Lr LT L5i)a  Shared gate for reaction prompts: (handled, prompt, selection). handled=False => not our
prompt; selection=None with handled=True => consumed without action (wrong room, expired,
unauthorized reactor, or a key that is not a choice). ``choices`` defaults to ``prompt.choices``.NT)FNN)r’  r³   rn  Ú_matrix_prompt_expiredÚ_validate_matrix_prompt_reactorry  Ú_send_invalid_reaction_feedback)rì   ræ  r_  rw  r
  r‡  rç  r{  Ú
on_expiredry  rí  Ú	selections   &&&&&&&&&&  rT   Ú_claim_reaction_promptÚ$MatrixAdapter._claim_reaction_promptÖ	  sà   é € ð —‘˜iÓ(ˆß˜ŸŸ˜Ø$Ð$Ø—n‘nÔ$Ø˜ Ð%Ð%Ø×&Ñ& v×.Ò.Ù˜W°Ó8×8Ð8Ø˜ Ð%Ð%Ø×9Ñ9¸'ÈfÐ^cÓd×dÖdØ˜ Ð%Ð%Ø'.¢�V—^’^¸G×HÑHÈÓMˆ	ØÒØ×6Ñ6°wÈ<ÓX×XÐXØ�VÐ&Ð&ñ 9ádñ YùsF   ‚+C!®-C!ÁC!Á(CÁ)C!ÂCÂ		C!Â?C!ÃCÃ	C!ÃC!ÃC!c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# ©rL   r_  r}   rw  r
  r‡  ra   rQ   rR   )rS   s   "rT   rU   r�  ë	  s2   € ÷ ñ °sð Àsð ÐQTð Ð^að Ðfjñ rV   c              ƒ  ó^  "  € V P                  V P                  WW4R\        R4      V P                  V P                  R7	      G Rj  x€L
 w  rVpVf   V#  ^ RIHp V! VP                  V4      p	V	'       d„   RVn        V P                  P                  VR4       V P                  P                  VP                  R4       \        P                  RW–P                  Wt4       V P                  W4      G Rj  x€L
  R#  L´ L  \         d"   p
\        P                  RT
4        Rp
?
R# Rp
?
ii ; i5i)	zRResolve a pending exec-approval prompt from a reaction. True if it was the target.r  z)platform.matrix.approval.invalid_reaction)ry  N)Úresolve_gateway_approvalTzKMatrix reaction resolved %d approval(s) for session %s (choice=%s, user=%s)z;Failed to resolve gateway approval from Matrix reaction: %s)r‚  r  r   Ú_expire_matrix_approval_promptr  Útools.approvalr‡  rm  r³   rn  r  rƒ   r  Ú_redact_bot_approval_reactionsr‚   re   )rì   r_  rw  r
  r‡  Úhandledrí  r4  r‡  r“   rÎ   s   &&&&&      rT   rt  Ú'MatrixAdapter._handle_approval_reactionë	  s  é € à(,×(CÑ(CØ×+Ñ+¨WÀÈjÜÐ9Ó:¸D×<_Ñ<_Ø×/Ñ/ð )Dó )1÷ #1Ñˆ˜ð Š>ØˆNð	]Ý?Ù,¨V×-?Ñ-?ÀÓHˆEßØ"&�”Ø×/Ñ/×3Ñ3°I¸tÔDØ×0Ñ0×4Ñ4°V×5GÑ5GÈÔNÜ—‘ØaØ×-Ñ-¨vô?ð ×9Ñ9¸'ÓJ×JÐJñ ñ'#1ñ  KøÜô 	]Ü�L‰LÐVÐX[×\Ð\Ùûð	]üsU   ‚AD-ÁC:ÁD-Á C> Á5A>C> Ã3C<Ã4C> Ã8D-Ã<C> Ã>D*Ä	D%ÄD-Ä%D*Ä*D-c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# r…  rR   )rS   s   "rT   rU   r�  
  s9   € ÷ eñ e¸3ð eÈ3ð eÐUXð eÐbeð eÐjnñ erV   c              ƒ  óŠ   "  € V P                  V P                  WW4R\        R4      V P                  RRR7
      G Rj  x€L
 #  L5i)zNApply a model-picker reaction. True if the reaction targeted a pending picker.r  z-platform.matrix.picker.invalid_model_reactionT)Úredact_bot_reactionsN)zswitch modelz(platform.matrix.picker.verb_switch_model)Ú_handle_picker_reactionr  r   Ú"_expire_matrix_model_picker_prompt)rì   r_  rw  r
  r‡  s   &&&&&rT   ru  Ú+MatrixAdapter._handle_model_picker_reaction
  sR   é € à×1Ñ1Ø×/Ñ/°ÀSÐR`ÜÐ=Ó>À×@gÑ@gØHÐ_cð 2ó e÷ eð 	eñ eùs   ‚:A¼A½Ac          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# r…  rR   )rS   s   "rT   rU   r�  	
  s9   € ÷ Mñ M¸Cð MÈCð MÐVYð MÐcfð MÐkoñ MrV   c              ƒ  ó€   a "  € V 3R lpS P                  S P                  WW4R\        R4      VR4	      G Rj  x€L
 #  L5i)zOApply a choice-picker reaction. True if the reaction targeted a pending picker.c              “  óH   <"  € SP                   P                  VR 4       R # 5irt   )r  rn  )Ú_room_idÚtarget_event_idÚ_promptrì   s   &&&€rT   Ú_expireÚ=MatrixAdapter._handle_choice_picker_reaction.<locals>._expire
  s   øé € Ø×0Ñ0×4Ñ4°_ÀdÖKùs   ƒ"r0  z.platform.matrix.picker.invalid_choice_reactionN)zapply choicez+platform.matrix.picker.verb_apply_selection)r�  r  r   )rì   r_  rw  r
  r‡  r™  s   f&&&& rT   rv  Ú,MatrixAdapter._handle_choice_picker_reaction	
  sK   øé € õ	Là×1Ñ1Ø×0Ñ0°'ÀcÐSbÜÐ>Ó?ÀØKóM÷ Mð 	Mñ Mùs   ƒ4>·<¸>r�  c               ó@   € V ^8„  d   QhRRRRRRRRRRRRR	RR
RRRRR/
# )rL   ræ  r¡   r_  r}   rw  r
  r‡  rç  r{  ÚverbsrÙ   r�  rQ   ra   rR   )rS   s   "rT   rU   r�  
  s\   € ÷ ñ ØðØ'*ðØ7:ðØADðØNQðØZ]ðØmpðà*ðàEIðàVZñrV   c
             ƒ  ó„  "  € V P                  WW4WVWx4      G Rj  x€L
 w  r¼pVf   V# RVn        VP                  VR4       \        V\        4      '       d   TMV3p VP
                  ! V.VO5!  G Rj  x€L
 pV
'       d   V P                  W,4      G Rj  x€L
  V'       d   V P                  W/VR7      G Rj  x€L
  R#  L¤ LL L- L  \         dl   p\        P                  RT	^ ,          T4       T P                  T\        R\        T	^,          4      \        T4      R7      TR7      G Rj  x€L 
   Rp?R# Rp?ii ; i5i)z¢Claim the picker, fire ``on_selected(room_id, *selection)`` and post its confirmation (or the error).
``verbs`` = (log verb, catalog key of the user-facing verb).NT©r  z%Failed to %s from Matrix reaction: %szplatform.matrix.picker.failed)Úactionre   )r‚  r³   rn  rÔ   r  rz  Ú"_redact_bot_model_picker_reactionsr  r‚   rƒ   re   r   r}   )rì   ræ  r_  rw  r
  r‡  rç  r{  r€  r�  r�  r‹  rí  r�  ÚargsÚconfirmationrÎ   s   &&&&&&&&&&$      rT   r�  Ú%MatrixAdapter._handle_picker_reaction
  s*  é € ð
 ,0×+FÑ+FØ˜y¨v¸ló,X÷ &XÑ"ˆ˜àÒØˆNØˆŒØ�‰�Y Ô%Ü& y´%×8Ò8‰y¸y¸lˆð		0Ø!'×!3Ò!3°GÐ!C¸dÓ!C×CˆLß#Ø×=Ñ=¸gÓN×NÐNßØ—i‘i À	�iÓJ×JÐJñ
 ñ#&Xñ DáNáJøÜô 	0Ü�L‰LÐ@À%ÈÅ(ÈCÔPØ—)‘)˜G¤QÐ'FÌqÐQVÐWXÕQYË{ÔbeÐfiÓbjÔ%kØ%.ð ó 0÷ 0õ 0áûð		0üs‰   ‚E šB?›AE ÁC Á4CÁ5C ÂC ÂCÂC Â"C Â8CÂ9C Â=E ÃC ÃC ÃC ÃD=ÃAD8Ä,D/Ä-D8Ä2E Ä8D=Ä=E c               ó    € V ^8„  d   QhRRRR/# )rL   rí  r   ra   rQ   rR   )rS   s   "rT   rU   r�  *
  s   € ÷ Oñ O¨Sð O°Tñ OrV   c                	óv   € \        VR R4      pVRJ;'       d"    \        P                  ! 4       \        V4      8„  # )rr  N)rÓ   rø  ré  r   )rì   rí  rr  s   && rT   r}  Ú$MatrixAdapter._matrix_prompt_expired*
  s4   € Ü˜V \°4Ó8ˆ
Ø Ð%×NÐN¬$¯.ª.Ó*:¼UÀ:Ó=NÑ*NÐNrV   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   r¬  r}   r_  r›   ra   rQ   rR   )rS   s   "rT   rU   r�  .
  s&   € ÷ Jñ J¨3ð J¸ð JÈtñ JrV   c                ó  € \        V RR4      e   V P                  WR7      RJ # \        RR4      P                  4       P	                  4       R9   ;'       g,    \        V P                  ;'       d    WP                  9   4      # )zVResolve live gateway authorization, falling back to the startup snapshot when unwired.Ú_authorization_checkN)rn  TÚGATEWAY_ALLOW_ALL_USERSrf   r  )rÓ   Ú_is_sender_authorizedrú  r�   r£   rQ   r  )rì   r¬  r_  s   &&&rT   r/  Ú!MatrixAdapter._is_authorized_user.
  s„   € ä�4Ð/°Ó6ÒBØ×-Ñ-¨gÐ-ÓGÈ4ÐOÐOä!Ð";¸RÓ@×FÑFÓH×NÑNÓPÐThÑh÷ Jð JÔlpØ×"Ñ"×HÐH w×2HÑ2HÑ'HómJð 	JrV   c               ó0   € V ^8„  d   QhRRRRRRRRRRRR	/# )
rL   r_  r}   r—  r‡  rí  r   Úprompt_labelra   rQ   rR   )rS   s   "rT   rU   r�  6
  s<   € ÷ ñ ØðØ-0ðØ:=ðØGJðØZ]ðØbfñrV   c              ƒ  	ó�  "  € V P                  W14      '       g=   \        P                  R WSV4       V P                  W\	        R4      4      G Rj  x€L
  R# \        VRR4      p\        V RR4      '       dK   V'       dC   W68w  d=   \        P                  RWSV4       V P                  W\	        R4      4      G Rj  x€L
  R# R#  Lr L
5i)	z<Matrix: ignoring %s reaction from unauthorized user %s on %sz%platform.matrix.reaction.unauthorizedNFrp  r  Tz5Matrix: ignoring %s reaction from %s; requester is %sz&platform.matrix.reaction.not_requester)r/  rƒ   r  r  r   rÓ   )rì   r_  r—  r‡  rí  r¯  rý  s   &&&&&& rT   r~  Ú-MatrixAdapter._validate_matrix_prompt_reactor6
  sÆ   é € à×'Ñ'¨×8Ò8Ü�K‰KØNÐP\Ðfuôwà×6Ñ6Ø¬!Ð,SÓ*TóV÷ Vð VáÜ˜FÐ$7¸Ó>ˆ	ä�4Ð3°T×:Ò:¿yÈVÔM`Ü�K‰KÐOÐQ]ÐgpÔqØ×6Ñ6Ø¬!Ð,TÓ*UóW÷ Wð WáÙñVñWùs*   ‚ACÁCÁ-CÁ>;CÂ9CÂ:	CÃCc               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   r_  r}   r—  rJ   ra   rä   rR   )rS   s   "rT   rU   r�  G
  s1   € ÷ Vñ V¸Sð VÐSVð VÐ^að VÐfjñ VrV   c              ƒ  	ó¨   "  €  V P                  WVR 7      G Rj  x€L
  R#  L  \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i5i)rŸ  Nz4Matrix: failed to send invalid reaction feedback: %s)r  r‚   rƒ   r„   )rì   r_  r—  rJ   rÎ   s   &&&& rT   r  Ú-MatrixAdapter._send_invalid_reaction_feedbackG
  sE   é € ð	VØ—)‘)˜G°O�)ÓD×DÔDøÜô 	VÜ�L‰LÐOÐQT×UÒUûð	Vüs6   ‚A„# š!›# ŸA¡# £A®A
ÁAÁ
AÁAc               ó(   € V ^8„  d   QhRRRRRRRR/# ©rL   r_  r}   r—  rí  r   ra   rä   rR   )rS   s   "rT   rU   r�  M
  s+   € ÷ 3ñ 3¸Cð 3ÐRUð 3Ð_bð 3Ðgkñ 3rV   c              ƒ  	ó   "  € R Vn         V P                  P                  VR4       V P                  P                  VP                  R4       V P                  W4      G Rj  x€L
  V P                  W\        R4      4      G Rj  x€L
  R#  L) L5i)TNz platform.matrix.approval.expired)r³   r  rn  r  rm  rŠ  r  r   ©rì   r_  r—  rí  s   &&&&rT   rˆ  Ú,MatrixAdapter._expire_matrix_approval_promptM
  s�   é € ØˆŒØ×'Ñ'×+Ñ+¨O¸TÔBØ×(Ñ(×,Ñ,¨V×-?Ñ-?ÀÔFØ×1Ñ1°'ÓB×BÐBØ×2Ñ2ØÜÐ0Ó1ó3÷ 	3ò 	3ñ 	Cñ	3ùs$   ‚ABÁ B
Á!"BÂBÂBÂBc               ó(   € V ^8„  d   QhRRRRRRRR/# r¶  rR   )rS   s   "rT   rU   r�  V
  s1   € ÷ Qñ QÀð QÐVYð QÐcfð QÐkoñ QrV   c              ƒ  	óÔ   "  € R Vn         V P                  P                  VR4       V P                  W4      G Rj  x€L
  V P	                  W\        R4      4      G Rj  x€L
  R#  L) L5i)TNz$platform.shared.model_picker_expired)r³   r  rn  r¡  r  r   r¸  s   &&&&rT   r‘  Ú0MatrixAdapter._expire_matrix_model_picker_promptV
  sh   é € ØˆŒØ×+Ñ+×/Ñ/°ÀÔFØ×5Ñ5°gÓF×FÐFØ×2Ñ2Ø¤aÐ(NÓ&OóQ÷ 	Qò 	Qñ 	Gñ	Qùs!   ‚8A(ºA$»"A(ÁA&ÁA(Á&A(c               ó$   € V ^8„  d   QhRRRRRR/# ©rL   r_  r}   rí  r   ra   rä   rR   )rS   s   "rT   rU   r�  ]
  s'   € ÷ \ñ \¸Cð \Èð \ÐQUñ \rV   c              ƒ  ó¤   "  € VP                   P                  4        F-  w  r4V P                  WR4       \        P	                  RW44       K/  	  R# 5i)zWRedact the bot's seeded approval reactions (delayed), leaving only the user's reaction.zapproval resolvedz0Matrix: scheduled bot reaction redaction %s (%s)N)rv  rB  rc  rƒ   r„   )rì   r_  rí  rî  Úevt_ids   &&&  rT   rŠ  Ú,MatrixAdapter._redact_bot_approval_reactions]
  sA   é € à#×7Ñ7×=Ñ=Ö?‰MˆEØ×-Ñ-¨gÐ?RÔSÜ�L‰LÐKÈUÖ[ó @ùs   ‚AAc               ó$   € V ^8„  d   QhRRRRRR/# r¾  rR   )rS   s   "rT   rU   r�  c
  s'   € ÷ bñ bÀð bÈSð bÐUYñ brV   c              ƒ  	ó  "  € VP                   P                  4        F6  w  r4 V P                  WR 4      G Rj  x€L
  \        P	                  RW44       K8  	  R#  L   \
         d"   p\        P	                  RY54        Rp?Ke  Rp?ii ; i5i)zmodel picker resolvedNz.Matrix: redacted model picker reaction %s (%s)z5Matrix: failed to redact model picker reaction %s: %s)rv  rB  rX  rƒ   r„   r‚   )rì   r_  rí  rî  rÀ  rÎ   s   &&&   rT   r¡  Ú0MatrixAdapter._redact_bot_model_picker_reactionsc
  st   é € Ø#×7Ñ7×=Ñ=Ö?‰MˆEðbØ×)Ñ)¨'Ð;RÓS×SÐSÜ—‘ÐMÈuÖ]ó @áSøäô bÜ—‘ÐTÐV[×aÒaûðbüs>   ‚ B
£A¸A¹AÁB
ÁAÁBÁ&BÁ<B
ÂBÂB
c               ó$   € V ^8„  d   QhRRRRRR/# )rL   r_  r}   r  ra   rä   rR   )rS   s   "rT   rU   r�  k
  s!   € ÷ 'ñ '°ð '¸sð 'Àtñ 'rV   c                	óX   a aa€ R  VVV 3R llp\         P                  ! V! 4       4       R# )c               ó   € V ^8„  d   QhRR/# rã   rR   )rS   s   "rT   rU   Ú<MatrixAdapter._background_read_receipt.<locals>.__annotate__m
  s   € ÷ 	Pñ 	P˜Tñ 	PrV   c               “  ó¨   <"  €  SP                  SS4      G R j  x€L
  R #  L  \         d"   p \        P                  RT 4        R p ? R # R p ? ii ; i5i)Nz*Matrix: background read receipt failed: %s)Úsend_read_receiptr‚   rƒ   r„   )rÎ   r  r_  rì   s    €€€rT   Ú_sendÚ5MatrixAdapter._background_read_receipt.<locals>._sendm
  sE   øé € ðPØ×,Ñ,¨W°hÓ?×?Ô?øÜô PÜ—‘ÐIÈ3×OÒOûðPüs6   ƒA…# š!›# ŸA¡# £A®A
ÁAÁ
AÁAN)rù  Úensure_future)rì   r_  r  rË  s   fff rT   rÂ  Ú&MatrixAdapter._background_read_receiptk
  s!   ú€ ÷	Pò 	Pô
 	×Ò™e›gÖ&rV   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   r_  r}   r  ra   rQ   rR   )rS   s   "rT   rU   r�  t
  s!   € ÷ ñ ¨sð ¸cð Àdñ rV   c              ƒ  	ó¬  "  € V P                   '       g   R #  \        V4      \        V4      rC\        V P                   R4      '       d&   V P                   P	                  W4V4      G Rj  x€L
  M™\        V P                   R4      '       d%   V P                   P                  W44      G Rj  x€L
  MY\        V P                   R4      '       d'   V P                   P                  W4VR7      G Rj  x€L
  M\        P                  R4       R # \        P                  RW!4       R#  L¶ Lx L8  \         d"   p\        P                  R	T4        Rp?R # Rp?ii ; i5i)
FÚset_fully_read_markerNÚsend_receiptÚset_read_markers)Úfully_read_eventÚread_receiptz)Matrix: client has no read receipt methodz&Matrix: sent read receipt for %s in %sTzMatrix: read receipt failed: %s)
ré  r   r   r”  rÑ  rÒ  rÓ  rƒ   r„   r‚   )rì   r_  r  rÙ  rÃ  rÎ   s   &&&   rT   rÊ  ÚMatrixAdapter.send_read_receiptt
  sü   é € Ø�|�|ˆ|Ùð	Ü  ›/¬7°8Ó+<�%Ü�t—|‘|Ð%<×=Ò=Ø—l‘l×8Ñ8¸ÀeÓL×LÑLÜ˜Ÿ™ ~×6Ò6Ø—l‘l×/Ñ/°Ó<×<Ñ<Ü˜Ÿ™Ð'9×:Ò:Ø—l‘l×3Ñ3°DÐ_dÐ3Óe×eÑeä—‘ÐHÔIÙÜ�L‰LÐAÀ8ÔUÙñ Má<áeøô ô 	Ü�L‰LÐ:¸CÔ@Ýûð	üsr   ‚E˜AD% Á(DÁ)?D% Â(D!Â)AD% Ã*D#Ã+D% ÄEÄD% ÄEÄD% Ä!D% Ä#D% Ä%EÄ0EÅEÅEÅEÚlevelrØ  c               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   Úok_msgr  Úerr_msgr}   r×  ra   rQ   rR   )rS   s   "rT   rU   r�  ˆ
  s*   € ÷ 
ñ 
°Uð 
ÀSð 
ÐTWð 
Ðhlñ 
rV   c             ƒ  óò   "  € V P                   '       g   R#  V! 4       G Rj  x€L
  \        \        VR8X  d   RMR4      ! V!   R#  L#  \         d"   p\        \        T4      ! Y54        Rp?R# Rp?ii ; i5i)zdRun one client call when connected: log *ok_msg* and return True, or log the error and return False.FNr„   r  T)ré  rÓ   rƒ   r‚   )rì   Úcoro_factoryrÙ  rÚ  r×  rÎ   s   &&&&$ rT   Ú
_client_opÚMatrixAdapter._client_opˆ
  sd   é € à�|�|ˆ|Ùð	Ù“.× Ð Ü”F u°Ô'7™G¸VÔDÀfÒMÙñ !øô ô 	Ü”F˜EÔ" 7Ô0Ýûð	üs>   ‚A7˜
A ¢A£!A ÁA7ÁA ÁA4ÁA/Á)A7Á/A4Á4A7c               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   r_  r}   r  rÒ  ra   rQ   rR   )rS   s   "rT   rU   r�  ”
  s/   € ÷ Zñ Z¨Cð Z¸3ð ZÈð ZÐUYñ ZrV   c              ƒ  	ó`   a aaa"  € S P                  VVVV 3R  lRSS3R4      G Rj  x€L
 #  L5i)c                 óx   <€ SP                   P                  \        S4      \        S 4      S;'       g    R R7      # )N)rÒ  )ré  Úredactr   r   )r  rÒ  r_  rì   s   €€€€rT   r(  Ú.MatrixAdapter.redact_message.<locals>.<lambda>–
  s.   ø€ �D—L‘L×'Ñ'¬¨w«¼ÀÓ9JÐSY×SaÐSaÐ]aÐ'ÔbrV   zMatrix: redacted %s in %szMatrix: redact error: %sN©rÝ  )rì   r_  r  rÒ  s   ffffrT   rX  ÚMatrixAdapter.redact_message”
  s5   ûé € Ø—_‘_ßbØ(¨(°GÐ<Ð>XóZ÷ Zð 	Zñ Zùs   †!.§,¨.c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rL   rš   r}   ÚtopicrG  úOptional[list]r+  rQ   Úpresetra   r  rR   )rS   s   "rT   rU   r�  ™
  s<   € ÷ ñ ØðØ%(ðØ7EðØY]ðàðà)6ñrV   c           
   ƒ  	óê  "  € V P                   '       g   R # VR8X  d)   \        R4      '       g   \        P                  R4       R #  R\        P
                  R\        P                  R\        P                  /P                  V\        P
                  4      pV P                   P                  T;'       g    R T;'       g    R T;'       g    .  Uu. uF  p\        V4      NK  	  upWFR7      G R j  x€L
 p\        V4      p	V P                  P                  V	4       \        P                  RY‘;'       g    R4       V	# u upi  LQ  \         d"   p
\        P                  R	T
4        R p
?
R # R p
?
ii ; i5i)
Nr2   rL  zMMatrix: refusing to create public room without MATRIX_ALLOW_PUBLIC_ROOMS=truer0   r4   )rš   rç  Úinviteesr+  ré  zMatrix: created room %s (%s)ÚunnamedzMatrix: create_room error: %s)ré  rû  rƒ   rØ  r   r/   r1   r3   r’  Úcreate_roomr   r}   r÷  r&  r  r‚   )rì   rš   rç  rG  r+  ré  Úpreset_enumÚur_  Úroom_id_strrÎ   s   &&&&&&     rT   rí  ÚMatrixAdapter.create_room™
  s@  é € ð �|�|ˆ|ÙØ�]Ô"¬;Ð7R×+SÒ+SÜ�N‰NÐjÔkÙð	àÔ 0× 8Ñ 8¸-ÔIY×I`ÑI`Ø&Ô(8×(HÑ(HðJçJMÉ#ÈfÔVf×VnÑVnÓJoð ð !ŸL™L×4Ñ4Ø—\�\˜T¨¯¨°$ÐV\×VbÐVbÐ`bÐVbÓAdÑVbÐPQÄ&ÈÆ)ÑVbÑAdØ#ð 5ó 9÷ 9ˆGô ˜g›,ˆKØ×Ñ×"Ñ" ;Ô/Ü�K‰KÐ6¸×EVÐEVÈYÔWØÐùò Beñ9øô ô 	Ü�N‰NÐ:¸CÔ@Ýûð	üsh   ‚AE3ÁA-E Â5
E Ã 
E ÃE ÃD=Ã$E Ã0EÃ1AE Ä4E Ä<E3Ä=E ÅE0ÅE+Å%E3Å+E0Å0E3c               ó$   € V ^8„  d   QhRRRRRR/# )rL   r_  r}   r¬  ra   rQ   rR   )rS   s   "rT   rU   r�  °
  s&   € ÷ Xñ X¨ð X°sð X¸tñ XrV   c              ƒ  	ó\   a aa"  € S P                  VV V3R  lRSS3R4      G Rj  x€L
 #  L5i)c                 ó`   <€ SP                   P                  \        S 4      \        S4      4      # rt   )ré  Úinvite_userr   r   )r_  rì   r¬  s   €€€rT   r(  Ú+MatrixAdapter.invite_user.<locals>.<lambda>²
  s   ø€ �D—L‘L×,Ñ,¬V°G«_¼fÀW»oÔNrV   zMatrix: invited %s to %szMatrix: invite error: %sNrä  )rì   r_  r¬  s   fffrT   rõ  ÚMatrixAdapter.invite_user°
  s5   úé € Ø—_‘_ÞNØ'¨°'Ð:Ð<VóX÷ Xð 	Xñ Xùs   … ,¥*¦,c               ó$   € V ^8„  d   QhRRRRRR/# )rL   Ústater}   Ú
status_msgra   rQ   rR   )rS   s   "rT   rU   r�  ·
  s'   € ÷ 
eñ 
e¨ð 
eÀCð 
eÐQUñ 
erV   c              ƒ  	ó@  a aaa"  € S P                   '       g   R # SS P                  9  d   \        P                  RS4       R # R\        P
                  R\        P                  R\        P                  /oS P                  VV VV3R lRS3RRR	7      G R
j  x€L
 #  L5i)Fz!Matrix: invalid presence state %rr)   r+   r-   c                 ó`   <€ SP                   P                  S S,          S;'       g    R R7      # )N)ÚpresencerÖ   )ré  Úset_presence)Úpresence_maprì   rù  rú  s   €€€€rT   r(  Ú,MatrixAdapter.set_presence.<locals>.<lambda>À
  s(   ø€ �D—L‘L×-Ñ-°|ÀEÕ7JÐS]×SeÐSeÐaeÐ-ÔfrV   zMatrix: presence set to %szMatrix: set_presence failed: %sr„   )r×  N)	ré  Ú_VALID_PRESENCE_STATESrƒ   rØ  r   r(   r*   r,   rÝ  )rì   rù  rú  rÿ  s   fff@rT   rþ  ÚMatrixAdapter.set_presence·
  s�   ûé € Ø�|�|ˆ|ÙØ˜×3Ñ3Ô3Ü�N‰NÐ>ÀÔFÙà”m×*Ñ*¨I´}×7LÑ7LÈmÔ]j×]vÑ]vðxˆà—_‘_ßfØ)¨5Ð1Ð3TÐ\cð %ó e÷ eð 	eñ eùs   †BBÂBÂBc               ó$   € V ^8„  d   QhRRRRRR/# )rL   rÃ  r   r
  r}   ra   r  rR   )rS   s   "rT   rU   r�  Ä
  s!   € ÷ ñ  #ð ¨Cð °Mñ rV   c                ó  € V f   R# T \        V \        4      '       d   V P                  R4      M\        V RR4      3 FK  p\        V\        4      '       d   VP                  V4      M\        W!R4      pV'       g   K@  \	        V4      u # 	  R# )z[Extract a simple value from a Matrix state event object or dict (top-level, then .content).NrÂ   )rÔ   r¡   r’  rÓ   r}   )rÃ  r
  Úobjrð   s   &&  rT   Ú_state_event_valueÚ MatrixAdapter._state_event_valueÃ
  sw   € ð Š=ÙØ´:¸eÄT×3JÒ3J˜5Ÿ9™9 YÔ/ÔPWÐX]Ð_hÐjnÓPoÓpˆCÜ$.¨s´D×$9Ò$9�C—G‘G˜C”L¼wÀsÐQUÓ?VˆEß‰uÜ˜5“zÒ!ñ qñ rV   c               ó    € V ^8„  d   QhRRRR/# )rL   r_  r}   ra   zOptional[int]rR   )rS   s   "rT   rU   r�  Î
  s   € ÷ ñ °Cð ¸Mñ rV   c              ƒ  óŠ  "  € V P                   '       d   \        V P                   RR4      MRpV'       dT   \        \        4      ;_uu_ 4        VP	                  V4      G Rj  x€L
 pVe   \        V4      uuRRR4       #  RRR4       \        V RR4      pVe}   \        VR4      '       dk   \        \        4      ;_uu_ 4        VP                  V4      G Rj  x€L
 p\        VRR4      e    \        VP                  4      uuRRR4       #  RRR4       R# R#  Lµ  + '       g   i     L¡; i LT  + '       g   i     R# ; i5i)zCstate_store first (cached), then a direct joined_members API query.r®  Nré  Újoined_membersÚmembers)	ré  rÓ   r   r‚   Úget_membersrŠ   r”  r
  r  )rì   r_  r®  r  rH  rL  s   &&    rT   Ú_get_room_member_countÚ$MatrixAdapter._get_room_member_countÎ
  sò   é € àDHÇLÇLÀL”g˜dŸl™l¨M¸4Ô@ÐVZˆßÜœ)×$Õ$Ø +× 7Ñ 7¸Ó @×@�ØÒ&Ü˜w›<÷ %Ò$à&÷ %ô ˜˜y¨$Ó/ˆØÒ¤'¨&Ð2B×"CÒ"CÜœ)×$Õ$Ø#×2Ñ2°7Ó;×;�Ü˜4 ¨DÓ1Ò=Ü˜tŸ|™|Ó,÷ %Ò$à=÷ %ó ñ A÷ %×$úñ <÷ %Ö$ñ üsk   ‚3E¶EÁDÁ"DÁ#DÁ5EÂAEÃD/ÃD-Ã'D/Ä EÄEÄDÄD*	Ä%EÄ-D/Ä/E 	Ä:	Ec               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   r_  r}   Ú
event_typer
  ra   r  rR   )rS   s   "rT   rU   r�  Þ
  s)   € ÷ 	ñ 	°3ð 	ÀCð 	Ècð 	ÐVcñ 	rV   c              ƒ  óX  "  € V P                   '       d   \        V P                   R4      '       g   R#  V P                   P                  \        V4      V4      G Rj  x€L
 pT P                  YC4      ;'       g    RP                  4       pT;'       g    R#  L9  \         d     R# i ; i5i)z?Fetch a stripped string field from a room state event, or None.Úget_state_eventNrf   )ré  r”  r  r   r‚   r  r�   )rì   r_  r  r
  rÃ  rð   s   &&&&  rT   Ú_get_room_state_valueÚ#MatrixAdapter._get_room_state_valueÞ
  sŠ   é € à�|�|ˆ|¤7¨4¯<©<Ð9J×#KÒ#KÙð	ØŸ,™,×6Ñ6´v¸g³È
ÓS×SˆEð ×(Ñ(¨Ó4×:Ð:¸×AÑAÓCˆØ�}ˆ}˜Ðñ	 TøÜô 	Úð	üsF   ‚1B*´(B ÁBÁB Á!B*Á9B*ÂB*ÂB ÂB'Â#B*Â&B'Â'B*c               ó    € V ^8„  d   QhRRRR/# )rL   r_  r›   ra   rä   rR   )rS   s   "rT   rU   r�  é
  s   € ÷ =ñ =°:ð =Èñ =rV   c                óê   € Vf7   V P                   P                  4        V P                  P                  4        R# V P                   P                  VR4       V P                  P                  VR4       R# )z>Drop one cached room identity (or all when *room_id* is None).N)rò  rÚ  ró  rn  ©rì   r_  s   &&rT   rj  Ú)MatrixAdapter._invalidate_room_identitiesé
  sW   € àŠ?Ø×!Ñ!×'Ñ'Ô)Ø×)Ñ)×/Ñ/Ö1à×!Ñ!×%Ñ% g¨tÔ4Ø×)Ñ)×-Ñ-¨g°tÖ<rV   Úforce_refreshc               ó$   € V ^8„  d   QhRRRRRR/# )rL   r_  r}   r  rQ   ra   r^  rR   )rS   s   "rT   rU   r�  ò
  s"   € ÷ ñ °Cð È4ð Ð\nñ rV   c             ƒ  ó  "  € V P                   P                  V4      pV P                  pV^ 8*  ;'       g:    \        P                  ! 4       V P
                  P                  VR4      ,
          V8*  pVe   V'       d   V'       g   V# V P                  VRR4      G Rj  x€L
 pV P                  VRR4      G Rj  x€L
 pV P                  VRR4      G Rj  x€L
 pV P                  V4      G Rj  x€L
 p	\        V4      p
\        V P                  P                  VR	4      4      pV	RJ;'       d    V	^8*  ;'       g    T;'       d    V
'       * p\        YYxR
V9   d2   VP                  R
^4      R,          P                  4       ;'       g    RMRT	Y¶;'       g    T;'       g    TY¬'       d   RMR\        T;'       d    T
;'       d    V	RJ ;'       g    V	^8„  4      R7      p\        V P                   4      V P                  8¼  dF   \        V P
                  V P
                  P                  RR7      pV'       d   V P!                  V4       WÐP                   V&   \        P                  ! 4       V P
                  V&   V#  ELÝ ELÅ EL­ EL—5i)zIResolve room identity; member count is the primary DM signal (see below).rÇ  Nr&   rš   zm.room.topicrç  zm.room.canonical_aliasÚaliasFr†  r.  rÙ  )r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  )r
  r   rœ  )rò  r’  rô  rø  ré  ró  r  r  rQ   rñ  r^  r¢  r�   rŠ   rõ  r�   rj  )rì   r_  r  ÚcachedÚttlÚcache_freshr`  ra  rb  Úmember_countrg  r+  Úis_likely_dmr0  Úoldests   &&$            rT   r/  Ú$MatrixAdapter._resolve_room_identityò
  s+  é € à×&Ñ&×*Ñ*¨7Ó3ˆØ×-Ñ-ˆØ˜Q‘h×kÐk¤$§.¢.Ó"2°T×5RÑ5R×5VÑ5VÐW^Ð`cÓ5dÕ"dÐhkÑ"kˆØÒ§+·mØˆMØ×4Ñ4°W¸mÈVÓT×Tˆ	Ø×5Ñ5°g¸~ÈwÓW×Wˆ
Ø $× :Ñ :¸7ÐD\Ð^eÓ f×fˆØ!×8Ñ8¸ÓA×AˆÜ  ›OÐÜ˜Ÿ™×+Ñ+¨G°UÓ;Ó<ˆ	ð %¨DÐ0×FÐF°\ÀQÑ5F×pÐpÈI×LoÐLoÐ^oÔZoˆÜ%Ø¸ZØHKÈwÌ˜Ÿ™¨¨QÓ/°Õ3×9Ñ9Ó;×CÐC¸tøÐ\`Ø ,Ø#,×;bÐ;bÈ×;bÐ;bÐ[bØ/Æ<¹4ÐU[Ü˜)×hÐhÐ(9×hÐh¸|ÈtÐ?S×?gÐ?gÐWcÐfgÑWgÓiôkˆô ˆt×$Ñ$Ó%¨×)FÑ)FÔFÜ˜×6Ñ6¸D×<YÑ<Y×<]Ñ<]ÐgkÔlˆFßØ×0Ñ0°Ô8Ø)1×Ñ˜gÑ&Ü15·²Ó1Aˆ×%Ñ% gÑ.Øˆò- UÚWÚfÚAùsŒ   ‚A9JÁ<JÂJÂI9ÂJÂ7I<Â8JÃI?ÃJÃ+JÃ,>JÄ+JÄ8	JÅAJÆJÆ	JÆJÆ9	JÇJÇB+JÉ<JÉ?JÊJc               ó    € V ^8„  d   QhRRRR/# rN  rR   )rS   s   "rT   rU   r�    s   € ÷ Nñ N¨ð N°ñ NrV   c              ƒ  	óZ   "  € V P                  V4      G R j  x€L
 P                  R8H  #  L5i)Nr.  )r/  rh  r  s   &&rT   r–  ÚMatrixAdapter._is_dm_room  s'   é € Ø×1Ñ1°'Ó:×:×EÑEÈÑMÐMÑ:ùs   ‚+—)˜+Úlog_failureÚrequire_dictc               ó    € V ^8„  d   QhRRRR/# )rL   r'  rQ   r(  rR   )rS   s   "rT   rU   r�    s   € ÷ 
8ñ 
8°Dð 
8ÐPTñ 
8rV   c             ƒ  ó„  "  €  V P                   P                  R4      G Rj  x€L
 p\        TR4      '       d5   T'       d!   \        TP                  \        4      '       d   TP                  # \        T\        4      '       d   T# R#  Ld  \         d*   pT'       d   \        P	                  RT4        Rp?R# Rp?ii ; i5i)zIReturn the m.direct account-data mapping, or None when absent/unreadable.úm.directNz/Matrix: get_account_data('m.direct') failed: %srÂ   )	ré  Úget_account_datar‚   rƒ   r„   r”  rÔ   rÂ   r¡   )rì   r'  r(  rL  rÎ   s   &$$  rT   Ú_fetch_m_directÚMatrixAdapter._fetch_m_direct  s�   é € ð	ØŸ™×6Ñ6°zÓB×BˆDô
 �4˜×#Ò#¯\¼ZÈÏÉÔVZ×=[Ò=[Ø—<‘<ÐÜ! $¬×-Ò-ˆtÐ7°4Ð7ñ CøÜô 	ßÜ—‘ÐNÐPSÔTÝûð	üsD   ‚C „B	 ¢B£B	 §C ÁAC ÂB	 Â	B=ÂB8Â2C Â8B=Â=C c               ó   € V ^8„  d   QhRR/# rã   rR   )rS   s   "rT   rU   r�     s   € ÷ +ñ +¨ñ +rV   c           	   ƒ  	ó¼  "  € V P                   '       g   R # V P                  RR7      G R j  x€L
 pVf   R # VP                  4        UUu0 uFG  p\        V\        4      '       g   K  V F&  p\        V\
        4      '       g   K  \        V4      kK(  	  KI  	  pppV P                   Uu/ uF  qUWT9   bK	  	  upV n        V P                  4        R #  L¢u uppi u upi 5i)NT)r'  )	ré  r-  r  rÔ   rN   r}   r÷  rñ  rj  )rì   Údm_datarh  r
  Údm_room_idsÚrids   &     rT   rm  ÚMatrixAdapter._refresh_dm_cache   s³   é € Ø�|�|ˆ|ÙØ×,Ñ,¸Ð,Ó>×>ˆØŠ?ÙØ+2¯>©>Ô+;Ô|Ñ+; %¼zÈ%ÔQU×?V”vÓ`eÐ[\ÔisÐtuÔwz×i{”v”s˜1–vÑ`e‘vÑ+;ˆÑ|Ø?C×?QÒ?QÓRÑ?Q¸ Ñ 2Ò2Ñ?QÑRˆŒØ×(Ñ(Ö*ñ ?ùó }ùÚRùs9   ‚*C¬C­CÁ
CÁ'CÂCÂCÂ(CÂ5CÃCc               ó$   € V ^8„  d   QhRRRRRR/# )rL   r_  r}   r.  ra   rä   rR   )rS   s   "rT   rU   r�  *  s!   € ÷ 2ñ 2¨Sð 2¸3ð 2À4ñ 2rV   c              ƒ  ó&  "  € V P                   '       g   R# V P                  RR7      G Rj  x€L
 ;'       g    / pVP                  V. 4      p\        V\        4      '       d   TM. pW9  dQ   VP                  V4       WCV&    V P                   P                  RV4      G Rj  x€L
  \        P                  RW4       RV P                  V&   V P                  V4       R#  L² L>  \         d!   p\        P                  RT4        Rp?LLRp?ii ; i5i)zõPersist a room as DM in m.direct account data after an invite. ``m.direct`` is absent (404)
until the account has had a DM; fetch the current mapping (if any), append *room_id* under
*inviter*, write it back so ``_refresh_dm_cache`` sees the DM.NT)r(  r+  z+Matrix: recorded %s as DM room (inviter=%s)z%Matrix: failed to update m.direct: %s)ré  r-  r’  rÔ   rN   rŽ   Úset_account_datarƒ   r  r‚   rØ  rñ  rj  )rì   r_  r.  r1  Úrooms_for_userrÎ   s   &&&   rT   r>  ÚMatrixAdapter._record_dm_room*  sî   é € ð �|�|ˆ|ÙØ)-×)=Ñ)=È4Ð)=Ó)P×#P×#VÐ#VÐTVˆØ Ÿ™ W¨bÓ1ˆÜ+5°nÄd×+KÒ+K™ÐQSˆØÔ(Ø×!Ñ! 'Ô*Ø-�GÑðMØ—l‘l×3Ñ3°JÀÓH×HÐHÜ—‘ÐIÈ7Ô\ð #'ˆ�‰�wÑØ×(Ñ(¨Ö1ñ $Qñ Iøäô MÜ—‘ÐFÈ×LÑLûðMüsQ   ‚*D¬C­
D¸A
DÂC# Â"C!Â#C# Â=#DÃ!C# Ã#DÃ.D	ÄDÄ	DÄDc               ó$   € V ^8„  d   QhRRRRRR/# )rL   rJ   r}   r»  ra   rb   rR   )rS   s   "rT   rU   r�  ?  s"   € ÷ ñ °ð ¸cð ÐQ_ñ rV   c                óp  € RVRV/pV P                  V4      pV'       d   RV/VR&   V P                  '       d-   V P                  V4      '       d   RVP                  R/ 4      R&   V P	                  V P                  V4      4      pV'       d*   WQ8w  d$   RVR&   WSR	&   \        V4      \        8”  d   VR VR	 V# )
zBBuild Matrix text content with HTML and outbound mention metadata.r»  r¶   Úuser_idsrg  TrÙ  ri  rS   rh  )Ú_extract_outbound_mentionsr  Ú_has_outbound_room_mentionÚ
setdefaultÚ_markdown_to_htmlÚ_inject_outbound_mention_linksr‰  rm  )rì   rJ   r»  r  Úmention_user_idsr[  s   &&&   rT   r  Ú)MatrixAdapter._build_text_message_content?  sÀ   € à'0°'¸6À4Ð&HˆØ×:Ñ:¸4Ó@ÐßØ)3Ð5EÐ(FˆK˜Ñ%Ø×$×$Ð$¨×)HÑ)HÈ×)NÒ)NØ?CˆK×"Ñ" <°Ó4°VÑ<Ø×%Ñ% d×&IÑ&IÈ$Ó&OÓPˆß�D”LØ$<ˆK˜Ñ!Ø,0Ð(Ñ)Ü˜kÓ*Ô-?Ô?à Ð)¨;Ð7GÐ+HØÐrV   r  r�   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rL   r  rb   r  r  r�   rô  ra   rä   rR   )rS   s   "rT   rU   r�  P  s,   € ÷ 5ñ 5Ø)ð5Ø8Eð5à*ð5à6:ñ5rV   c               ó  € \        T;'       g    / P                  R4      ;'       g    R4      pV'       d
   RRV//VR&   V'       dE   VP                  R/ 4      pRVR&   WER&   RVR	&   TP                  RRT;'       g    T/4       WQR&   R
# R
# )zCApply Matrix reply/thread relation metadata to an outbound payload.r¹  rf   r¶  r  rk  r  r  TÚis_falling_backN)r}   r’  r?  )rì   r  r  r�   r¹  r  s   &&$$  rT   r  Ú&MatrixAdapter._apply_relation_metadataP  s˜   € ô ˜Ÿ˜ R×,Ñ,¨[Ó9×?Ð?¸RÓ@ˆ	ßØ+:¸ZÈÐ<RÐ*SˆK˜Ñ'ßØ$Ÿ™¨¸Ó<ˆJØ%/ˆJ�zÑ"Ø%.�zÑ"Ø,0ˆJÐ(Ñ)à×!Ñ! /°JÀ×@UÐ@UÈIÐ3VÔWØ*4˜Ó'ñ rV   c               ó    € V ^8„  d   QhRRRR/# )rL   rJ   r}   ra   z	list[str]rR   )rS   s   "rT   rU   r�  `  s   € ÷ añ a¨sð a°yñ arV   c                	ó˜   € V P                  V4      w  r#\        \        P                  R  \        P                  V4       4       4      4      # )c              3  óB   "  € T F  qP                  ^4      x € K  	  R# 5i)ra  N©r²   )rv   Úms   & rT   rx   Ú;MatrixAdapter._extract_outbound_mentions.<locals>.<genexpr>b  s   é € Ð!_Ñ6^°§'¡'¨!§* *Ó6^ùs   ‚)Ú!_protect_outbound_mention_regionsrN   r¡   r¢   Ú_OUTBOUND_MENTION_REÚfinditer©rì   rJ   Ú	protectedr�   s   &&  rT   r=  Ú(MatrixAdapter._extract_outbound_mentions`  s;   € Ø×=Ñ=¸dÓC‰ˆ	Ü”D—M‘MÑ!_Ô6J×6SÑ6SÐT]Ô6^Ó!_Ó_Ó`Ð`rV   c               ó    € V ^8„  d   QhRRRR/# r   rR   )rS   s   "rT   rU   r�  d  s   € ÷ Iñ I¨sð I°tñ IrV   c                óh   € V P                  V4      w  r#\        \        P                  ! RV4      4      # )zFReturn True when outbound text contains @room outside protected spans.z(?<![\w/])@room(?![\w:.-]))rN  rQ   rö   r©  rQ  s   &&  rT   r>  Ú(MatrixAdapter._has_outbound_room_mentiond  s+   € à×=Ñ=¸dÓC‰ˆ	Ü”B—I’IÐ;¸YÓGÓHÐHrV   c               ó    € V ^8„  d   QhRRRR/# r¬   rR   )rS   s   "rT   rU   r�  i  s   € ÷ ñ °3ð ¸3ñ rV   c                óÂ   € V'       g   V# V P                  V4      w  r#\        P                  R V4      p\        V4       F  w  rVVP	                  RV R2V4      pK  	  V# )zCWrap outbound Matrix mentions in markdown links outside code spans.c                óP   € R V P                  ^4       RV P                  ^4       R2# )Ú[z](https://matrix.to/#/rŸ  rK  )rL  s   &rT   r(  Ú>MatrixAdapter._inject_outbound_mention_links.<locals>.<lambda>n  s+   € °a¸¿¹À»
°|ÐCYÐZ[×ZaÑZaÐbcÓZdÐYeÐefÑ4grV   ú MENTION_PROTECTEDÚ )rN  rO  r÷   rÀ  r¤   )rì   rJ   rR  ÚplaceholdersÚlinkedr•   Úoriginals   &&     rT   rA  Ú,MatrixAdapter._inject_outbound_mention_linksi  sa   € çØˆKØ"&×"HÑ"HÈÓ"NÑˆ	Ü%×)Ñ)Ñ*gÐirÓsˆÜ& |Ö4‰MˆCØ—^‘^Ð&;¸C¸5ÀÐ$EÀxÓPŠFñ 5àˆrV   c               ó    € V ^8„  d   QhRRRR/# )rL   rJ   r}   ra   ztuple[str, list[str]]rR   )rS   s   "rT   rU   r�  s  s   € ÷ 'ñ '°cð 'Ð>Sñ 'rV   c                ó†   aa€ . oR V3R lloT;'       g    RpR F  p\         P                  ! VV3R lV4      pK!  	  VS3# )zEProtect markdown regions where outbound mentions should stay literal.c               ó    € V ^8„  d   QhRRRR/# )rL   Úfragmentr}   ra   rR   )rS   s   "rT   rU   ÚEMatrixAdapter._protect_outbound_mention_regions.<locals>.__annotate__w  s   € ÷ 	5ñ 	5˜sð 	5 sñ 	5rV   c                óH   <€ \        S4      pSP                  V 4       R V R2# )r\  r]  ©rŠ   rŽ   )re  r•   r^  s   & €rT   Ú_protectÚAMatrixAdapter._protect_outbound_mention_regions.<locals>._protectw  s*   ø€ Ü�lÓ#ˆCØ×Ñ Ô)Ø*¨3¨%¨tÐ4Ð4rV   rf   c                ó2   <€ S! V P                  ^ 4      4      # )rŽ  rK  )r±   ri  s   &€rT   r(  ÚAMatrixAdapter._protect_outbound_mention_regions.<locals>.<lambda>}  s   ø€ ±h¸u¿{¹{È1»~Ô6NrV   )z```[\s\S]*?```z	`[^`\n]+`z\[[^\]]+\]\([^)]+\)rX  )rì   rJ   rR  r!  ri  r^  s   &&  @@rT   rN  Ú/MatrixAdapter._protect_outbound_mention_regionss  sI   ù€ à"$ˆ÷	5ð 	5ð —J�J˜Bˆ	ÛPˆGÜŸš˜wÔ(NÐPYÓZŠIñ Qà˜,Ð&Ð&rV   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rL   r¶   r}   rh  r  rB  rè  ra   rQ   rR   )rS   s   "rT   rU   r�  €  s2   € ÷ kñ kØðkØ)6ðkØQ_ðkØkoñkrV   c                ó  € V'       d&   V P                   '       d   V P                   V9   d   R# V'       g   V'       g   R# V P                   '       d   V P                   V9   d   R# V P                  4       pV'       dQ   \        P                  ! R\        P                  ! V4      ,           R,           V\        P
                  4      '       d   R# \        T;'       d'    V P                   ;'       d    RV P                    2V9   4      # )z¡True if the bot is mentioned; ``m.mentions.user_ids`` (MSC3952) is authoritative
even when the body has no ``@bot`` text (pills may live only in formatted_body).TFú\bzmatrix.to/#/)rã  Ú_user_localpartrö   r©  r	   Ú
IGNORECASErQ   )rì   r¶   rh  rB  r‘  s   &&&& rT   Ú_is_bot_mentionedÚMatrixAdapter._is_bot_mentioned€  sª   € ÷  §§ °$·-±-ÐCSÔ2SÙßŸNÙØ�=�=ˆ=˜TŸ]™]¨dÔ2ÙØ×(Ñ(Ó*ˆ	ßœŸš 5¬2¯9ª9°YÓ+?Õ#?À%Õ#GÈÌrÏ}É}×]Ò]ÙÜ�N×iÐi t§}¡}×iÐi¸<ÈÏÉÀÐ9WÐ[iÑ9iÓjÐjrV   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R/# )
rL   r_  r}   r¶   rÂ   r¡   r  r²  rQ   ra   rR   )rS   s   "rT   rU   r�  �  sA   € ÷ Zñ Z sð Z°#ð ZÀð ZÐRVð ZØ)-ðZØ26ñZrV   c                óv  € V'       g$   V P                   '       d   \        V4      '       g   R# WP                  9   g#   V P                  '       d   WP                  9  d   R# \	        V4      pV'       d   W`P
                  9   d   R# VP                  R4      '       * ;'       d    V P                  W#4      '       * # )zœSynchronous pre-check of the ``_resolve_message_context`` park branch (only DM-ness
needs an await; a DM voice's mark is released as soon as that is known).Fr    )rÿ  rI   r  r  r  rü  r¯   r¼  )rì   r_  r¶   rÂ   r  r²  r¹  s   &&&&&& rT   r÷  ÚMatrixAdapter._voice_may_park�  s…   € ÷  $×"7×"7Ð"7¼~Èg×?VÒ?VÙØ×&Ñ&Ô&¨4×+>×+>Ð+>À7×ReÑReÔCeÙÜ  Ó,ˆ	ß˜§m¡mÔ3ÙØ—?‘? 3Ó'Ô'×YÐY°×0JÑ0JÈ4Ó0YÔ,YÐYrV   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   r¶   r}   rÂ   r¡   ra   rQ   rR   )rS   s   "rT   rU   r�  œ  s&   € ÷ sñ s¨#ð s¸ð sÀñ srV   c                óÐ   € VP                  R4      ;'       g    / pT P                  YP                  R4      \        V\        4      '       d   VP                  R4      4      # R4      # )z\``_is_bot_mentioned`` fed from an event's content (MSC3952 ``m.mentions`` is authoritative).rg  rh  r<  N)r’  rs  rÔ   r¡   )rì   r¶   rÂ   Úmentionss   &&& rT   r¼  Ú#MatrixAdapter._content_mentions_botœ  sb   € à—;‘;˜|Ó,×2Ð2°ˆØ×%Ñ%Ø—+‘+Ð.Ó/ÌZÐX`Ôbf×MgÒMg°·±¸jÓ1Iósð 	sØmqósð 	srV   c               ó   € V ^8„  d   QhRR/# r4  rR   )rS   s   "rT   rU   r�  ¢  s   € ÷ iñ i ñ irV   c                ó®   € V P                   '       dC   RV P                   9   d2   V P                   P                  R4      ^ ,          P                  R4      # R# )zF``@bot:server`` -> ``bot``; empty when the user ID has no server part.r†  rŽ  rf   )rã  r¼   r�  r7  s   &rT   rq  ÚMatrixAdapter._user_localpart¢  sC   € à:>¿-¿-¸-ÈCÐSW×S`ÑS`ÔL`ˆt�}‰}×"Ñ" 3Ó'¨Õ*×1Ñ1°#Ó6ÐhÐfhÐhrV   c               ó    € V ^8„  d   QhRRRR/# rÇ   rR   )rS   s   "rT   rU   r�  ¦  s   € ÷ ñ  3ð ¨3ñ rV   c                ó¶  € V'       g   R# V P                   '       d   VP                  V P                   R4      pV P                  4       pV'       dK   \        P                  ! R\        P
                  ! V4      ,           R,           RV\        P                  R7      p\        P                  ! RRV4      p\        P                  ! RRV4      pVP                  4       # )	u„   Strip explicit ``@user:server`` / ``@localpart`` tokens only â€” never bare localpart
words, or "Hermes Agent" would become "Agent".rf   z
(?<![\w])@rp  ©Úflagsz	[ \t]{2,}r/  z\s+([,.;:!?])ú\1)rã  r¤   rq  rö   r÷   r	   rr  r�   )rì   r¶   r‘  s   && rT   r¾  ÚMatrixAdapter._strip_mention¦  s—   € ÷ ÙØ�=�=ˆ=Ø—<‘< §¡¨rÓ2ˆDØ×(Ñ(Ó*ˆ	ßÜ—6’6˜-¬"¯)ª)°IÓ*>Õ>ÀÕFÈÈDÔXZ×XeÑXeÔfˆDä�vŠv�l C¨Ó.ˆÜ�vŠvÐ&¨¨tÓ4ˆØ�z‰z‹|ÐrV   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   r_  r}   r¬  ra   rR   )rS   s   "rT   rU   r�  µ  s!   € ÷ 
ñ 
¨sð 
¸Sð 
ÀSñ 
rV   c              ƒ  óì  "  € V P                   '       d   \        V P                   RR4      MRpV'       dk   \        \        4      ;_uu_ 4        VP	                  W4      G Rj  x€L
 pV'       d*   \        VRR4      '       d   VP
                  uuRRR4       # RRR4       VP                  R4      '       d'   RV9   d    VR,          P                  R4      ^ ,          # V#  L|  + '       g   i     LQ; i5i)z=Get a user's display name in a room, falling back to user_id.r®  NÚdisplaynamerŽ  r†  :ra  NN)ré  rÓ   r   r‚   Ú
get_memberr‡  r¯   r¼   )rì   r_  r¬  r®  Úmembers   &&&  rT   rÀ  ÚMatrixAdapter._get_display_nameµ  s®   é € àDHÇLÇLÀL”g˜dŸl™l¨M¸4Ô@ÐVZˆßÜœ)×$Õ$Ø*×5Ñ5°gÓG×G�ßœg f¨m¸T×BÒBØ!×-Ñ-÷ %×$Ò$ð ×Ñ˜c×"Ò" s¨g¤~Ø˜2•;×$Ñ$ SÓ)¨!Õ,Ð,Øˆñ H÷ %×$üs@   ‚3C4¶C4ÁC!Á"CÁ#C!Á/C!Â)C4Â7(C4ÃC!Ã!C1	Ã,C4c               ó    € V ^8„  d   QhRRRR/# )rL   rI  r}   ra   rR   )rS   s   "rT   rU   r�  Á  s   € ÷ Tñ T Cð T¨Cñ TrV   c                	ód   € VP                  R 4      '       g   V# V P                   RVR,           2# )ró  z"/_matrix/client/v1/media/download/:é   NN)r¯   rá  )rì   rI  s   &&rT   rú  ÚMatrixAdapter._mxc_to_httpÁ  s5   € Ø×!Ñ! (×+Ò+ØˆNØ×"Ñ"Ð#Ð#EÀgÈbÅkÀ]ÐSÐSrV   c               ó    € V ^8„  d   QhRRRR/# r¬   rR   )rS   s   "rT   rU   r�  Æ  s   € ÷ lñ l cð l¨cñ lrV   c                óH  € \        V4      p\        V4      w  r\        \        4      ;_uu_ 4        ^ RIpVP                  . ROR7      pRVP                  9   d   VP                  P                  R4       VP                  V4      pVP                  4        VP                  R4      ^8X  d#   VP                  RR4      P                  RR4      p\        \        V4      V4      uuRRR4       #   + '       g   i     M; i\        \        T P                  T4      4      T4      # )u]   Markdown â†’ org.matrix.custom.html via ``markdown`` when installed, else the regex fallback.N©Ú
extensionsÚ
html_blockz<p>rf   z</p>)Úfenced_coder}  Únl2brÚ
sane_lists)ry  rY  r   r×  ÚmarkdownÚMarkdownÚpreprocessorsÚ
deregisterÚconvertÚresetr“   r¤   rh  rm  Ú_markdown_to_html_fallback)rì   rJ   Ú	tex_storeÚ_mdÚmdr[  s   &&    rT   r@  ÚMatrixAdapter._markdown_to_htmlÆ  sß   € ä,¨TÓ2ˆÜ*¨4Ó0‰ˆÜ”k×"Õ"Û"Ø—‘Ò)Y�ÓZˆBØ˜r×/Ñ/Ô/Ø× Ñ ×+Ñ+¨LÔ9Ø—:‘:˜dÓ#ˆDØ�H‰HŒJØ�z‰z˜%Ó  AÔ%Ø—|‘| E¨2Ó.×6Ñ6°v¸rÓB�Ü&Ô'<¸TÓ'BÀIÓN÷ #×"×"Ò"úô #Ô#8¸×9XÑ9XÐY]Ó9^Ó#_ÐajÓkÐks   °B2C-Ã-C=	c               ó    € V ^8„  d   QhRRRR/# ro  rR   )rS   s   "rT   rU   r�  ×  s   € ÷ /ñ / ð /¨ñ /rV   c                	óÌ   € V P                  4       pR V9   d=   VP                  R ^4      ^ ,          P                  4       P                  4       R9   d   R# VP                  RR4      # )r†  rf   r  z&quot;>   r"  ÚvbscriptÚ
javascript)r�   r¼   r£   r¤   )rp  rÊ   s   & rT   Ú_sanitize_link_urlÚ MatrixAdapter._sanitize_link_urlÖ  sT   € à—9‘9“;ˆØ�(Œ?˜xŸ~™~¨c°1Ó5°aÕ8×>Ñ>Ó@×FÑFÓHÐLnÔnÙØ×Ñ  XÓ.Ð.rV   c               ó    € V ^8„  d   QhRRRR/# r¬   rR   )rS   s   "rT   rU   r�  Þ  s   € ÷ Iñ I¨ð I°ñ IrV   c           
     óæ  aa€ . oR R lpR V3R llo\         P                  ! RV3R lV \         P                  R7      p\         P                  ! RV3R	 lV4      p\         P                  ! R
V3R lV4      pRP                  R \         P                  ! RV4       4       4      pVP	                  R4      p. p^ pV\        V4      8  Edq   W5,          p\         P                  ! RV4      '       d   VP                  R4       V^,          pKR  \         P                  ! RV4      pV'       d^   \        VP                  ^4      4      pVP                  RV RVP                  ^4      P                  4        RV R24       V^,          pKÎ  V! V4      '       d²   . p	V\        V4      8  dy   V! W5,          4      '       de   W5,          p
T	P                  V
P                  R4      '       d
   V
R,          M!V
P                  R4      '       d
   V
R,          MR4       V^,          pKˆ  VP                  RRP                  V	4       R24       EK�  R( FÑ  w  r¼\         P                  ! W¶4      '       g   K#  . pV\        V4      8  dj   \         P                  ! W³V,          4      '       dG   VP                  \         P                  ! W³V,          4      P                  ^4      4       V^,          pKy  VP                  RV RRP                  R V 4       4       RV R24        EKb  	  VP                  V4       V^,          pEK�  RP                  V4      pR) F,  w  rï\         P                  ! WïV\         P                  R7      pK.  	  \         P                  ! R R!V4      p\         P                  ! R"R#V4      p\         P                  ! R$R%V4      p\        S4       F  w  ppVP                  R&V R'2V4      pK  	  V# )*z0Comprehensive regex Markdown-to-HTML for Matrix.c               ó    € V ^8„  d   QhRRRR/# )rL   Úlnr}   ra   rQ   rR   )rS   s   "rT   rU   Ú>MatrixAdapter._markdown_to_html_fallback.<locals>.__annotate__â  s   € ÷ 	Iñ 	I˜Cð 	I Dñ 	IrV   c                ó>   € V P                  R4      ;'       g    V R9   # )ú&gt; )r®  r¸   )z&gt;rÉ   )r¯   )r«  s   &rT   Ú_is_bq_lineÚ=MatrixAdapter._markdown_to_html_fallback.<locals>._is_bq_lineâ  s   € Ø—=‘= Ó1×HÐH°R¸=Ñ5HÐHrV   c               ó    € V ^8„  d   QhRRRR/# )rL   Úhtml_fragmentr}   ra   rR   )rS   s   "rT   rU   r¬  å  s   € ÷ 	-ñ 	-¨ð 	-°ñ 	-rV   c                óH   <€ \        S4      pSP                  V 4       R V R2# )ú
 PROTECTEDr]  rh  )r²  r•   r^  s   & €rT   Ú_protect_htmlÚ?MatrixAdapter._markdown_to_html_fallback.<locals>._protect_htmlå  s*   ø€ Ü�lÓ#ˆCØ×Ñ Ô.Ø" 3 % tÐ,Ð,rV   z```(\w*)\n(.*?)```c           
     óô   <€ S! V P                  ^4      '       d>   R\        V P                  ^4      4       R\        V P                  ^4      4       R24      # R\        V P                  ^4      4       R24      # )ra  z<pre><code class="language-rb  z</code></pre>z<pre><code>)r²   r  ©rL  rµ  s   &€rT   r(  Ú:MatrixAdapter._markdown_to_html_fallback.<locals>.<lambda>ì  sn   ø€ ‘mà—7‘7˜1—:’:ð .¬l¸1¿7¹7À1»:Ó.FÐ-GÀrÌ,ÐWX×W^ÑW^Ð_`ÓWaÓJbÐIcÐcpÐqôZà%0´¸a¿g¹gÀa»jÓ1IÐ0JÈ-Ð#XôZrV   r�  z`([^`\n]+)`c                óL   <€ S! R \        V P                  ^4      4       R24      # )z<code>z</code>)r  r²   r¸  s   &€rT   r(  r¹  ð  s'   ø€ ±-À&ÌÐVW×V]ÑV]Ð^_ÓV`ÓIaÐHbÐbiÐ@jÔ2krV   z\[([^\]]+)\]\(([^)]+)\)c           
     ó–   <€ S! R \         P                  V P                  ^4      4       R\        V P                  ^4      4       R24      # )z	<a href="rb  z</a>)r—  r¦  r²   r  r¸  s   &€rT   r(  r¹  ô  sE   ø€ ‘mØœM×<Ñ<¸Q¿W¹WÀQ»ZÓHÐIÈÌLÐYZ×Y`ÑY`ÐabÓYcÓLdÐKeÐeiÐjôlrV   rf   c              3  ój   "  € T F)  pVP                  R 4      '       d   TM
\        V4      x € K+  	  R# 5i)r´  N)r¯   r  )rv   r<  s   & rT   rx   Ú;MatrixAdapter._markdown_to_html_fallback.<locals>.<genexpr>÷  s/   é € ð OÙ"M˜Qð  Ÿl™l¨?×;Ò;™ÄÈaÃÔPÛ"Mùs   ‚3ž3z(\x00PROTECTED\d+\x00)r¹   z!^[\s]*([-*_])\s*\1\s*\1[\s\-*_]*$z<hr>z^(#{1,6})\s+(.+)$z<hrÉ   z</hr®  :é   NNr¸   rº   z<blockquote>z<br>z</blockquote>r  c              3  ó.   "  € T F  pR V R2x € K  	  R# 5i)z<li>z</li>NrR   )rv   Úitems   & rT   rx   r½    s   é € Ð6\ÑV[Èd¸¸d¸VÀ5Õ7IÓV[ùs   ‚r  z\nz<br>
z0<br>\n(</?(?:pre|blockquote|h[1-6]|ul|ol|li|hr))z\n\1z+(</(?:pre|blockquote|h[1-6]|ul|ol|li)>)<br>rƒ  r´  r]  ))z^[\s]*[-*+]\s+(.+)$rJ  )z^[\s]*\d+[.)]\s+(.+)$rF  ))z\*\*(.+?)\*\*ú<strong>\1</strong>)z	__(.+?)__rÁ  )z	\*(.+?)\*ú<em>\1</em>)z(?<!\w)_(.+?)_(?!\w)rÂ  )z	~~(.+?)~~z<del>\1</del>)rö   r÷   ÚDOTALLr¾   r¼   rŠ   r±   rŽ   r²   r�   r¯   rÀ  r¤   )rJ   r¯  r‘   rÛ   Ú	out_linesr;  rÁ   Úhdrr×  Úbq_linesr«  Úitem_rerü   rB  r!  Úreplr•   r`  rµ  r^  s   &                 @@rT   r�  Ú(MatrixAdapter._markdown_to_html_fallbackÝ  sL  ù€ ð  ˆõ	I÷	-ð 	-ô
 —’Ø!ôZð œŸ	™	ô#ˆô —’˜Ô(kÐmsÓtˆä—’Ø&ôlàó	ˆð
 —‘ñ OÜ"$§(¢(Ð+DÀfÔ"MóOó Oˆð —‘˜TÓ"ˆØˆ	ØˆØ”#�e“*�nØ•8ˆDÜ�xŠxÐ<¸d×CÒCØ× Ñ  Ô(Ø�Q•�ÙÜ—(’(Ð/°Ó6ˆCßÜ˜CŸI™I a›LÓ)�Ø× Ñ  2 e W¨A¨c¯i©i¸«l×.@Ñ.@Ó.BÐ-CÀ3ÀuÀgÈQÐ!OÔPØ�Q•�ÙÙ˜4× Ò Ø�Øœ#˜e›*”n©°UµX×)>Ò)>Ø��BØ—O‘O¨b¯m©m¸G×.DÒ.D B r¦FÐTV×TaÑTaÐbf×TgÒTgÈ"ÈRÎ&ÐmoÔpØ˜•F’AØ× Ñ  <°·±¸HÓ0EÐ/FÀmÐ!TÔUÚÛ b‘�Ü—8’8˜G×*Ô*Ø�EØœc %›jœ.¬R¯XªX°gÀQ½x×-HÒ-HØŸ™¤R§X¢X¨g¸QµxÓ%@×%FÑ%FÀqÓ%IÔJØ˜Q�šØ×$Ñ$ q¨¨¨Q¨r¯w©wÑ6\ÑV[Ó6\Ó/\Ð.]Ð]_Ð`cÐ_dÐdeÐ%fÔgÛñ !cð × Ñ  Ô&Ø�Q•“Ø—‘˜9Ó%ˆó.‰MˆGô —V’V˜G¨6¼¿¹ÔCŠFñ	.ô
 —’˜˜x¨Ó0ˆÜ—’ÐKÈWÐV\Ó]ˆÜ—’ÐFÈÈvÓVˆÜ& |Ö4‰MˆC�Ø—^‘^ m°C°5¸Ð$=¸xÓHŠFñ 5àˆrV   )=rÞ  rß  râ  r  r  r  r  r  r  r  r  r  r  r  ré  r�  rí  rê  rç  rè  r  r  rñ  rå  ræ  r  rá  r  rì  r÷  rð  r›  rœ  r	  r  r  rý  rä  r  r
  rù  rú  r  r  r  r  rÿ  rò  rõ  ró  rô  rî  r¢  rë  r  r  r  rü  rã  rû  r�  rt   r»   )NNN)NrÇ  )NNNN)NNNFN)NNNNF)FN©Fr6  )rf   rf   NFr0   )r)   r+   r-   )r)   rf   )rf  )“rS  rT  rU  rV  rW  Úserial_receive_loopÚsupports_code_blocksÚsplits_long_messagesÚtyped_command_prefixr•  r�  rß  Úpropertyr™  r£  r§  ré   r'  rX  r  r1  rþ  r   rE  rN  rT  r\  rk  rg  r–  r›  r«  rÅ  r¿  r½  rÞ  rÿ  rí  r  r  r*  r1  rQ  rV  r\  ra  rt  r  r€  rµ  rÅ  rË  rÙ  rÞ  Ú_EA_CMD_BUDGETrâ  rð  rû  rö  r  r  r#  r  r5  r  r‚  rC  rB  rp  r´  rû  rÛ  rk  rn  rŠ  r’  r—  rï  r£  rô  rË  rÒ  rà  r®  r­  rö  rù  r÷  r7  r0  ro  rH  rê  rY  rc  rh  rp  rõ  r‚  rt  ru  rv  r�  r}  r/  r~  r  rˆ  r‘  rŠ  r¡  rÂ  rÊ  rÝ  rX  rí  rõ  r¨  r  rþ  r  r  r  rj  r/  r–  r-  rm  r>  r  r  r=  r>  rA  rN  rs  r÷  r¼  rq  r¾  rÀ  rú  r@  r¦  r�  rY  rZ  r[  s   @rT   r—  r—    s5  ø† Ù6ØÐØÐØÐØÐà3ÐØ1°CÕ7Ðàñó ðõð ôló ðl÷Vrð Vrõp
ð ôoó ðoð
 ô	 ó ð	 ð ôzó ðzð
 ôzó ðzð
 ôó ðð ô;ó ð;õõ"õ&$õLLõ6&ðP ÷ó ðõ>õ@DõL	.õ&EõP
Bð-°E÷ -õ^,÷8Bð Bõ4õõ"hõAõ4P÷
/ð /õ+ðDÐbg÷ D÷4mó mõ<+÷|qð q÷
gð g÷,qð q÷
.ð .÷6qð qð €NàôCó ðCõð* ˜U I¨v°xÀÈ6ÐSXÐY€MØÐEÀyÐR{ØÐ!IÈ6ÐSyð{€Oð "Ð#MØ$Ð&SØ#Ð%QðSÐõk÷4ð õB	&÷Cð Cõ,C÷$Dð $DõL
õnõ=÷Cð Cõ0'ð.Ð\a÷ õ.$õ6dõ8ð ô:ó ð:õõ	.õ+õ./m÷bCGð CGõJW÷ =ð =õ81÷:;1ð ;1ðz ô
Yó ð
YõKõBdõð*OÀuð OÐ]_÷ Oõ""[õH%õN÷Mð M÷Gð Gõ"Oõsõ÷4'ð 'õ*õ.eõMðàLQ÷õ0O÷Jð Jõõ"Võ3õQõ\õbõ'õð(
ÐZc÷ 
÷Zð Z÷
ð õ.Xñ
 'Ñ'KÓLÐ÷
eð 
eð ôó ðõõ 	÷=ð =ðÐRW÷ õ>Nð
8¸5ð 
8ÐW\÷ 
8õ+õ2÷*ð ð"5ØHLð5à-1÷5ñ 5÷ a÷I÷
÷'÷kò k÷Z÷s÷i÷÷
÷T÷
lð  ö/ó ð/ð öIó ÷IrV   r—  r¹  Úmedia_filesÚforce_documentc             ƒ  óî  aaaaa"  € \        V R/ 4      ;'       g    / p ^ RIp TP	                  R4      ;'       g    \        RR4      ;'       g    RP                  R4      o\        T RR4      ;'       g    \        R	R4      ;'       g    RpS'       d	   T'       g   \        R
4      # ^ RIHo RRT 2RR/oTP                  4       ;_uu_4       GRj  x€L
 oTTTTT3R lp	\        T4       FW  p
 \        P                  ! T	! T
4      ^R7      G Rj  x€L
 pTP	                  R4      '       d   KC  Tu uuRRR4      GRj  x€L
  # 	  XuuRRR4      GRj  x€L
  #   \         d    \        R4      u # i ; i L¤ Lg  \         d$    \        R4      u u uuRRR4      GRj  x€L 
  # i ; i Ll LX  + GRj  x€L 
 '       g   i     R# ; i  \         d   p\        RT 24      u Rp?# Rp?ii ; i5i)z_standalone_sender_fn: out-of-process delivery via the Client-Server API (cron without gateway).rŒ  Nz/aiohttp not installed. Run: pip install aiohttprˆ  r„  rf   r    r†  r‚  zGMatrix not configured (MATRIX_HOMESERVER, MATRIX_ACCESS_TOKEN required)r  ÚAuthorizationzBearer zContent-Typezapplication/jsonc              “  ó�  <"  € R \        \        P                  ! 4       R,          4       R\        P                  ! ^4      P	                  4        2pS RS! SRR7       RV 2pS	P                  VSV R7      ;_uu_4       GRj  x€L
 pVP                  R9  dD   \        R	VP                   R
VP                  4       G Rj  x€L
  24      uuRRR4      GRj  x€L
  # VP                  4       G Rj  x€L
 pRRRRRSRVP                  R4      /uuRRR4      GRj  x€L
  #  L› La LL L5 L  + GRj  x€L 
 '       g   i     R# ; i5i)Úhermes_rg   r�   z/_matrix/client/v3/rooms/rf   )r	  z/send/m.room.message/)r�  r‡  NzMatrix API error (z): r  Tr5  rõ   rn  ro  r  >   éÈ   éÉ   )rP   rø  r*  ÚurandomÚhexÚputrÖ   r   rJ   r‡  r’  )
ÚpayloadÚtxn_idrp  rL  r"  rn  r�  rˆ  r  rÎ  s
   &    €€€€€rT   Ú_do_sendÚ"_standalone_send.<locals>._do_send=  s  øé € Ø"¤3¤t§y¢y£{°TÕ'9Ó#:Ð";¸1¼R¿ZºZÈ»]×=NÑ=NÓ=PÐ<QÐR�Ø#˜Ð$=¹eÀGÐRTÔ>UÐ=VÐVkÐlrÐksÐt�Ø"Ÿ;™; s°GÀ'˜;×J×JÔJÈdØ—{‘{¨*Ô4Ü)Ð,>¸t¿{¹{¸mÈ3ÐUY×U^ÑU^ÓU`×O`ÐNaÐ*bÓc÷ K×JÒJð "&§¡£×,�DØ% t¨Z¸À9ÈgØ(¨$¯(©(°:Ó*>ð@÷	 K×JÔJáO`ñ Kñ -÷ K×J×JÓJüs�   ƒB EÂDÂEÂ8D)Â?D!Ã 	D)Ã	EÃD#ÃEÃD)Ã/D%Ã0D)ÄEÄD'ÄEÄ!D)Ä#EÄ%D)Ä'EÄ)E	Ä/D2Ä0
E	Ä;E	Ä=	Erp   zMatrix API timeout (30s)r  zMatrix send failed: )rÓ   rÓ  r×  r   r’  r   rà  r¿  r  rÔ  Ú_standalone_payloadsrù  r"  r?  r‚   )Úpconfigrn  Úmessager¹  rÑ  rÒ  rŒ  rÓ  r†  rÞ  rÜ  r‘   r  r�  rˆ  r  rÎ  s   &f&$$$       @@@@rT   Ú_standalone_sendrã  *  sº  üé € ä�G˜W bÓ)×/Ð/¨R€EðMÛð6ð —i‘i Ó-×ZÐZ´Ð<OÐQSÓ1T×ZÐZÐXZ×bÑbÐcfÓgˆ
Ü˜ ¨$Ó/×^Ð^´:Ð>SÐUWÓ3X×^Ð^Ð\^ˆß§ÜÐgÓhÐhÝ&Ø" g¨e¨WÐ$5°~ÐGYÐZˆð ×(Ñ(×*×*Ô*¨g÷@ñ @ô 0°Ö8�ðBÜ#*×#3Ò#3±H¸WÓ4EÈrÔ#R×R�Fð —z‘z )×,Ô,Ø!‘M÷! +×*Ò*ñ 9ð ÷# +×*Ò*øô ô MÜÐKÓLÒLðMúñ +ñ SøÜ#ô BÜ%Ð&@ÓAÓA÷ +×*Ó*ðBú÷ +×*×*Õ*ûô$ ô 6ÜÐ0°°Ð4Ó5Õ5ûð6üsR  ‡G5 E ¥G ½G Á%G Á7G Â
G ÂG Â
G Â(G5Â)+G ÃE9ÃG ÃF2Ã2!E=ÄE;
ÄE=ÄF2Ä1F2Ä4G ÅF.ÅG ÅG5ÅF2Å
G ÅF0ÅG ÅG5ÅE6Å3G5Å5E6Å6G5Å9G Å;E=Å=F+	ÆF2ÆG Æ#F&Æ$G Æ)G5Æ*F+	Æ+F2Æ.G Æ0G Æ2G	Æ8F;Æ9
G	ÇG	ÇG Ç
G5ÇG ÇG2ÇG-Ç'G2Ç(G5Ç-G2Ç2G5c               ó    € V ^8„  d   QhRRRR/# )rL   râ  r}   ra   zlist[dict[str, Any]]rR   )rS   s   "rT   rU   rU   R  s   € ÷ ñ  #ð Ð*>ñ rV   c                óâ  € Rp\        \        4      ;_uu_ 4        ^ RIpRRR4       . p\        P                  ! V \
        \        4       F�  pRRRV/pVer   \        V4      w  rVVP                  VRR.R7      pRR	R
\        \        P                  ! RRV4      V4      /p\        / VCVC4      \        8:  d   VP                  V4       VP                  V4       K‘  	  V#   + '       g   i     LÇ; i)z¬One m.room.message content per chunk. The caller chunks on characters, and a chunk of
non-Latin text can still exceed the homeserver's byte cap, so re-chunk on UTF-8 bytes.Nr»  rf  r¶   r”  r}  r‘  rS   ri  rh  z<h[1-6]>(.*?)</h[1-6]>rÁ  )r   r×  r—  r;   r  r–  r€  rY  rh  rö   r÷   r‰  rm  ri  rŽ   )	râ  rŸ  Úpayloadsr  rÜ  Ú	tokenizedrž  r[  rq  s	   &        rT   rà  rà  R  så   € ð €CÜ	”+×	Õ	Û÷ 
à€HÜ$×5Ò5°gÔ?`ÔbkÖlˆØ˜h¨°Ð6ˆØŠ?Ü#3°EÓ#:Ñ ˆIØ—<‘< 	°}ÀhÐ6O�<ÓPˆDØ!Ð#;Ð=MÔObÜ—’Ð0Ð2HÈ$ÓOÐQZóP\ð ]ˆIäÐ6 Ð6¨IÐ6Ó7Ô;MÔMØ—‘˜yÔ)Ø�‰˜Ö ñ mð €O÷ 
×	ús   šCÃC.	c               ó   € V ^8„  d   QhRR/# rã   rR   )rS   s   "rT   rU   rU   f  s   € ÷ :-ñ :-˜4ñ :-rV   c                 ó¬  aa€ ^ RI Hp HpHo ^ RIHoHpHpHpH	pH
p ^ RIHp V! R4       V! RRRR4      '       d   R# R. F  pV! V4       K  	  R	 VV3R
 llp	V	! RR4       V! R4       V	! RRRR7      p
V
'       d   V	! RR4       V! R4       M"V	! RR4       V	! RRRR7      '       d	   V! R4       V
'       g   V ! R4      '       dã   V! RR4      pV'       d   S! RR4       V! R4        ^ RIHp V! R4       V! R.RR7       V! R 4       V! R#4       V! R$4       S! R%4      pV'       d#   S! R&VP!                  R'R(4      4       V! R)4       MV! R*4       R/ F  pV! V4       K  	  S! R+4      P#                  4       pV'       d   S! R,V4       R# V! R,4      '       d   V! R-4       R# R# R#   \         d   pT! R!T 24       T! R"4        Rp?LÃRp?ii ; i)0zGInteractive credential setup (setup_fn); CLI helpers are lazy-imported.)Úget_env_valueÚremove_env_valueÚsave_env_value)rí  Úprompt_yes_noÚprint_headerÚ
print_infoÚprint_successÚprint_warning)Údeclines_reconfigureÚMatrixzReconfigure Matrix?r‚  rƒ  Nc               ó$   € V ^8„  d   QhRRRRRR/# )rL   r
  r}   Úquestionra   rR   )rS   s   "rT   rU   Ú'interactive_setup.<locals>.__annotate__r  s!   € ÷ ñ �#ð  ð ¨sñ rV   c                ój   <€ S! V3/ VB pV'       d!   S! Y R 8X  d   VP                  R4      MT4       V# )r„  r    )rà  )r
  rõ  Úkwrð   rí  rì  s   &&, €€rT   Ú_askÚinteractive_setup.<locals>._askr  s6   ø€ Ù�xÑ& 2Ñ&ˆßÙ˜3Ð<OÔ5O §¡¨SÔ 1ÐUZÔ[ØˆrV   r„  z0Homeserver URL (e.g. https://matrix.example.org)zCAuth: provide an access token (recommended), or user ID + password.z-Access token (leave empty for password login)T)r‡  r­  u9   User ID (@bot:server â€” optional, will be auto-detected)zMatrix access token savedzUser ID (@bot:server)ÚPasswordzMatrix credentials savedz$Enable end-to-end encryption (E2EE)?Frù  rí  zE2EE enabled)Ú	sync_venvz Preparing Matrix dependencies...rõ   )rü  z9Matrix dependencies prepared. Restart Hermes to use them.z+Matrix dependencies could not be prepared: z-Run `hermes pm install`, then restart Hermes.u,   ðŸ”’ Security: Restrict who can use your botz-   Matrix user IDs look like @username:serverz?Allowed user IDs (comma-separated, leave empty for open access)rÖ  r/  rf   zMatrix allowlist configureduE   âš ï¸�  No allowlist set - anyone who can message the bot can use it!z6Home room ID (leave empty to set later with /set-home)ÚMATRIX_HOME_ROOMzHome room cleared.)zMWorks with any Matrix homeserver (Synapse, Conduit, Dendrite, or matrix.org).zC   1. Create a bot user on your homeserver, or use your own accountzE   2. Get an access token from Element, or provide user ID + password)uI   ðŸ“¬ Home Room: where Hermes delivers cron job results and notifications.zE   Room IDs look like !abc123:server (shown in Element room settings)zD   You can also set this later by typing /set-home in a Matrix room.zILeave blank to clear a previously saved home room (cron / notifications).)Úhermes_cli.configrê  rë  rì  Úhermes_cli.cli_outputrí  rí  rî  rï  rð  rñ  Úhermes_cli.setup_platformsrò  r}  rü  r‚   r¤   r�   )rê  rë  rí  rî  rï  rð  rñ  rò  rÁ   rù  r†  Ú	want_e2eerü  rÎ   rÕ  Ú	home_roomrí  rì  s                   @@rT   Úinteractive_setupr  f  sç  ù€ çQÑQßs×sÝ?Ù�ÔÙ˜HÐ&;Ð=RÐTe×fÒfÙóZˆñ 	�4ÖñZ÷ñ ñ
 	Ð	ÐPÔQÙÐTÔUÙÐ&Ð(WÐbfÔg€EßÙÐÐZÔ[ÙÐ1Õ2áÐÐ6Ô7ÙÐ! :¸×=Ó=ÙÐ4Ô5ß‘Ð/×0Ò0Ù!Ð"HÈ%ÓPˆ	ßÙÐ.°Ô7Ù˜.Ô)ð	HÝ$áÐ9Ô:Ù�x�j¨4Õ0ÙÐUÔVñ 	ÐAÔBÙÐBÔCÙÐ`ÓaˆßÙÐ1°=×3HÑ3HÈÈbÓ3QÔRÙÐ7Õ8áÐ^Ô_óbˆDñ �tÖñ	bñ
 ÐSÓT×ZÑZÓ\ˆ	ßÙÐ-¨yÖ9ÙÐ0×1Ò1ÙÐ+Ö,ñ 2ñ= 1øô ô 	HÙÐGÈÀuÐMÔNÙÐF×GÑGûð	Hús   Ã*!F+ Æ+GÆ6GÇGc               ó$   € V ^8„  d   QhRRRRRR/# )rL   Úyaml_cfgr¡   Ú
matrix_cfgra   zdict | NonerR   )rS   s   "rT   rU   rU   ­  s!   € ÷ 8ñ 8 ð 8°4ð 8¸Kñ 8rV   c                ó"   € \        V\        4      # )uÀ   ``apply_yaml_config_fn`` (#24849): config.yaml matrix: keys â†’ MATRIX_* env (env wins; skipped under a
multiplexed secondary profile's scope) + ``PlatformConfig.extra`` (extra-first readers).)Ú_apply_yaml_bridgeÚ_YAML_BRIDGE)r  r  s   &&rT   Ú_apply_yaml_configr
  ­  s   € ô ˜j¬,Ó7Ð7rV   c               ó   € V ^8„  d   QhRR/# rÛ  rR   )rS   s   "rT   rU   rU   ³  s   € ÷ @ñ @˜Tñ @rV   c                ó¼  € \        V R/ 4      ;'       g    / p^ RIHp VP                  R4      ;'       g    VP	                  R4      ;'       g    Rp\        V RR4      ;'       g5    VP	                  R4      ;'       g    VP	                  R4      ;'       g    Rp\        \        V4      P                  4       ;'       d    \        V4      P                  4       4      # )	zµConnected = homeserver + token (or password). Reads via hermes_cli.gateway.get_env_value so
setup-status callers that patch it see the same value; PlatformConfig extras are honored.rŒ  Nrˆ  r„  rf   r†  r‚  rƒ  )rÓ   Úhermes_cli.gatewayÚgatewayr’  rê  rQ   r}   r�   )r—  rŒ  Úgateway_modrˆ  r†  s   &    rT   Ú_is_connectedr  ³  sÊ   € ô �F˜G RÓ(×.Ð.¨B€EÝ,Ø—‘˜<Ó(×`Ð`¨K×,EÑ,EÐFYÓ,Z×`Ð`Ð^`€JÜ�V˜W dÓ+÷ Cð C¨{×/HÑ/HÐI^Ó/_÷ Cð CØ×)Ñ)Ð*;Ó<÷Cð CØ@Bð 
ä”�J“×%Ñ%Ó'×>Ð>¬C°«J×,<Ñ,<Ó,>Ó?Ð?rV   c               ó   € V ^8„  d   QhRR/# rã   rR   )rS   s   "rT   rU   rU   ¾  s   € ÷ ñ �Tñ rV   c           "     ó6  € ^RI Hp ^RIHp ^RIHp ^RIHp V P                  ! R"/ VBRRRRR	\        R
\        /BVBR\        R\        RRR.RRR\        R\        RRR\        R\         RRRRRVRRRVP"                  R VP$                  /BVP&                  B  R!# )#ra  )ÚPLATFORM_HINT)ÚSEND_ENTRY_KWARGS)ÚDASHBOARD_CARD)Úgateway_envrš   rõ   rç  ró  Úadapter_factoryÚcheck_fnÚensure_deps_fnÚis_connectedÚrequired_envr„  r‚  Úinstall_hintz!pip install 'mautrix[encryption]'Úsetup_fnÚapply_yaml_config_fnÚcron_deliver_env_varrý  Ústandalone_sender_fnr�  rî  u   ðŸ”�Úallow_update_commandTÚplatform_hintÚdisplay_tierÚmediumÚenv_overridesÚenv_enable_credentialsNrR   )Úadapter_hintr  Úsend_targetsr  Údashboard_cardr  rf   r  Úregister_platformr—  r  r…  r  r  r
  rã  r•  ÚENV_OVERRIDESÚENV_ENABLE_CREDENTIALSÚAUTHZ)rÕ  r  r  r  r  s   &    rT   Úregisterr.  ¾  s  € Ý+Ý/Ý.ÝØ×Òñ Ø
ñàðà%ðä7DðäObñð ñô *ð	ô 9Fð	ð
 *Ð+@ÐAðð
 Qtðô #ðô :Lðð cuðô .ðô C]ðð ekðð "ðð $ðð ðð "×/Ñ/ðð  +×AÑAñð FQ×EVÑEVôrV   rR   >   Úm_forbiddenÚm_missing_tokenÚm_unknown_token>
   ú.bmpr  r  r  ú.svgú.avifú.heicú.heifú.jpegr  >   ú.aacú.amrú.m4aú.mkvú.movú.mp3ú.mp4rÔ  rÑ  ú.wavú.flacrÕ  ú.webm)u   ðŸ”Ÿ)u   ðŸ…°ï¸�u   ðŸ…±ï¸�rÊ  rt   r6  )
)r5  r6  r£   )rÂ  rÃ  r£   )r¿  rÀ  r£   )rº  r»  r£   )r½  r¾  r£   )rÕ  rÖ  Úcsv)r´  rµ  rB  )r¶  r·  rB  )r×  rØ  rB  )r�  rŽ  r}   )¢rW  Ú
__future__r   rù  r…   r�  r‡  Ú
contextlibr   Úloggingr²  r*  rö   r{   r[   r‡   rø  r¿  r   r   r   Údataclassesr   r   r[  r	   r  Úhtml.parserr
   Úpathlibr   Útypingr   r   r   r   Ú
agent.i18nr   Úagent.secret_scoper   Úgateway.platforms._sharedr   r  r   r�  r   rú  r   r�  r   r   r   r   r   r   r   r   r×  r}   rÜ  Úgateway.configr8   r9   r!  r:   r;   r<   r=   r>   r?   r@   rA   Úgateway.platforms.eventrB   rC   rD   Úgateway.platforms.helpersrE   Ú&plugins.platforms.matrix.voice_mentionrF   rG   rH   rI   Ú	getLoggerrS  rƒ   r‹   r^   r˜   r  rÃ  r°   rª   r´   r½   rÅ   rÌ   r¨  rÕ   r×   rÝ   rß   r^  rl  rx  Ú_MatrixModelPickerPromptÚ_MatrixChoicePickerPromptrm  r–  r•  r€  r‰  rš  Úhermes_constantsr›  r¡  r¬  rO  r•  r¤  r¸  r  r  r1  r¥  r£  r¹  rÁ  rÉ  rÙ  ræ  rò  rþ  rû  r  r  r  r  r  r5  r:  r@  rD  rg  rM  rU  rY  rh  rm  rv  ry  r  r‰  r…  r—  rã  rà  r  r	  r
  r  r.  rR   rV   rT   Ú<module>rU     sõ  ðñõ2 #ã Û Û Û Ý Û Û Û 	Û 	Û Û Û 
Û ß 6Ñ 6ß (å 'Ý "Ý ß +Ó +å Ý )÷ó ð
O÷e÷ eó e÷  4÷÷ ñ õ 9ß PÑ PÝ @ß lÓ là	×	Ò	˜8Ó	$€à Ð ðw¸U÷ wõ
#ðJ Ÿ*š*Ð%OÐQS×QZÑQZÓ[Ð õõ40ð "$§¢Ð,FÓ!GÐ õ"õ(5ñ$ 'ò (ó Ð õ<õ,Vô(A$˜:ô A$ñH �$Ô÷ð ó ðð ÷Rð Ró ðRð ÷
Fð 
Fó ð
Fð 8KÐ JÐ Ð4ð
 Ð ð %7¸!Õ$;Ð !Ø>Ð õ%õUõ
Cõ( ?àÐ à—z’zÐ"[Ó\Ð àuÐ á'ò )Yó ZÐ á'ò )oó pÐ ÷ "' Ñ&OÁ;Ó&O§¡Ñ&OÁ;Ó&OÓ!OÐRaÕ!aÐ Ø"@ÐCkÕ"kÐ õW÷
[õ"iõ
cõ6õ2õ$õ(÷3÷Rõ
õAõ\õ
]õ
Cõõ$õõ:Að —
’
ÐJÓK€Ø5Ð Ø3Ð õõ0,õ(õõõõ õ.ôbM$Ð'ô M$ð`H%6À4ð %6ÐUYð %6Ðjoô %6õPõ(:-ðz€õ8õ@÷øðEd ô Oð .1Ð0€JÐ0�Ð0˜6 FáÐ% rØÐ(¨*°lØÐ,¨k¸=ð,Jó K€Iñ Ð-¨rØ�(˜I y°-Àð4Pó Q€MáÐ3°RØ�> 8¨]Ð<MÐOeð:gó hÐáÐ'¨¨l¸A¸zÈ1Ð-MÓNƒJðOús   ÂL ÌAM,Í+M,