+
    lHàjVš  ã                  ó°  a € 0 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	H
t
Ht ^ RIHtHtHtHtHtHt ^ RIHt ^ RIHtHtHt ^ RIHt ^ RIHtHtHtHt ^ R	I H!t!H"t" ^ R
I#H$t$H%t% ^ RI&H't' ]PP                  ! ])4      t*Rt+Rt,Rt-R R lt.R R lt/R R lt0R R lt1 ! R R4      t2R R lt3R R lt4R R lt5]
 ! R R 4      4       t6 ! R! R"4      t7R# R$ lt8/ t9R%]:R&&   R' R( lt;/ t<R)]:R*&   RmR+ R, llt=R-R.R/R0/t>R1 R2 lt?R3 R4 lt@R5 R6 ltAR7 R8 ltBR9 R: ltCRnR; R< lltDRoR= R> lltER? R@ ltFRA RB ltGRC RD ltHRE RF ltIRG RH ltJRI RJ ltKRK RL ltLRM RN ltMRO RP ltNRQ RR ltORS RT ltPRU RV ltQRW RX ltRRY RZ ltSR[]GR\]HR]]S/tTR[]SR\]JR]]N/tUR[]GR\]JR]]N/tVR[]PR\]QR]]R/tWR[]GR\]OR]]N/tXR^ R_ ltYR` Ra ltZRbt[Rc Rd lt\Re Rf lt]Rg Rh lt^RiRRjR/Rk Rl llt_R# )pé    )ÚannotationsN)Ú	dataclassÚfield)ÚAnyÚCallableÚDictÚListÚOptionalÚTuple)Úhermes_home_key)ÚActorÚSettleReasonÚTargetState)Úoperation_session_key)ÚConnectionOperationÚDetachedOperationÚIllegalTransitionÚTarget)ÚKindÚrun_operation)Úhosted_namesÚmisrouted_to_mcp_error)Ú
tool_errorç      >@uÝ  Settled once; do not re-ask on your own for any target the user skipped or that timed out, but a later request from the USER for that same app is not a re-ask â€” run it. Connected targets' tools are available now through tool_describe/tool_call and are named under tools_listing. A target with discovery_error is authorized but its tools are unavailable; retry discovery with manage_connections using that target's authorize or install action without asking for consent again.uQ  No connection card is drawn for this turn. Show any connect_url to the user so they open it in a browser, then ask them to say when they are done. Connected targets' tools are available now through tool_describe/tool_call and are named under tools_listing. A target with discovery_error is authorized but its tools are unavailable; retry discovery with manage_connections using that target's authorize or install action without asking for consent again. Do not re-ask on your own for skipped or timed-out targets, but a later request from the USER for that same app is not a re-ask â€” run it.c               ó   € V ^8„  d   QhRR/# ©é   Úreturnú	list[str]© )Úformats   "Ú9/home/ubuntu/.hermes/hermes-agent/tools/connectors/mcp.pyÚ__annotate__r#   .   s   € ÷ 2ñ 2˜	ñ 2ó    c                 ó<   € ^ RI Hp  \        R V ! 4        4       4      # )r   ©Úlist_catalogc              3  ó8   "  € T F  qP                   x € K  	  R # 5i©N)Úname)Ú.0Úes   & r"   Ú	<genexpr>Ú!_catalog_names.<locals>.<genexpr>1   s   é € Ð1¡.˜Q—&–&£.ùs   ‚)Úhermes_cli.mcp_catalogr'   Úsortedr&   s    r"   Ú_catalog_namesr1   .   s   € Ý3äÑ1¡,¤.Ó1Ó1Ð1r$   c               ó   € V ^8„  d   QhRR/# r   r    )r!   s   "r"   r#   r#   4   s   € ÷ 'ñ '˜9ñ 'r$   c                 ó.   € ^ RI Hp  \        V ! 4       4      # )r   ©Úinstalled_servers)r/   r5   r0   r4   s    r"   Ú_configured_namesr6   4   s   € Ý8äÑ#Ó%Ó&Ð&r$   c               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚactionÚstrÚnamesr   r   úOptional[str]r    )r!   s   "r"   r#   r#   :   s!   € ÷ ñ ˜sð ¨9ð ¸ñ r$   c           
     óŽ  a €  \        4       p\        4       pS R8X  d   \        T4      M
\        T4      pT Uu. uF  qfT9  g   K  TNK  	  ppT'       g   R# T Uu. uF  qfT9  g   K  Yc9  g   K  TNK  	  ppT'       dY   \	        4       ;'       g    \        4       p	T Uu. uF  qfT	9   g   K  TNK  	  p
pT
'       d   RP                  T 3R lT
 4       4      # S R8X  d\   RRP                  T4       RRP                  T4      ;'       g    R R	2T'       d   R
RP                  T4       R	2,           # R,           # RS  RRP                  T4       RS  RRP                  T4      ;'       g    R R	2	T'       d   RRP                  T4       R	2,           # R,           #   \         d   pR T 2u Rp?# Rp?ii ; iu upi u upi u upi )z could not read the MCP catalog: NÚinstallÚ c              3  ó<   <"  € T F  p\        SV4      x € K  	  R # 5ir)   )r   )r+   r*   r8   s   & €r"   r-   Ú%validate_mcp_names.<locals>.<genexpr>I   s   øé € ÐWÉYÀTÔ2°6¸4×@Ð@ËYùs   ƒz#unknown MCP server(s) for install: ú, z*. Install works for catalog entries only: z(empty catalog)Ú.z, Already configured (use enable/authorize): Ú zunknown MCP server(s) for z: z. z+ works for servers already in mcp_servers: z(none configured)z" Catalog entries you can install: )r1   r6   Ú	ExceptionÚsetr   Újoin)r8   r:   ÚcatalogÚ
configuredÚexcÚallowedÚnÚunknownÚforeignÚhostedÚ	misrouteds   f&         r"   Úvalidate_mcp_namesrP   :   sÙ  ø€ ð8Ü Ó"ˆÜ&Ó(ˆ
ð %¨	Ô1Œc�'Œl´s¸:³€GÙÓ4™%�Q¨GÑ#3�qˆq™%€GÐ4ßÙÙ!ÓN™'�Q¨gÑ%5Œq¸!Ñ:M�qˆq™'€GÐNßÜ“×(Ð(¤3£5ˆÙ 'Ó7¡˜1°©;—Q�Q¡ˆ	Ð7ßØ—8‘8ÔWÉYÓWÓWÐWØ�Ôà1°$·)±)¸GÓ2DÐ1Eð F%Ø%)§Y¡Y¨wÓ%7×%LÐ%LÐ;LÐ$MÈQðPçZdÐ=¸d¿i¹iÈ
Ó>SÐ=TÐTUÐVõnð	
ð kmõnð	
ð % V H¨B¨t¯y©y¸Ó/AÐ.BÀ"ÀVÀHð M#Ø#'§9¡9¨ZÓ#8×#OÐ#OÐ<OÐ"PÐPQð	SçIPÐ/°·	±	¸'Ó0BÐ/CÀ1ÐEõ	Zðð WYõ	Zðøô% ô 8Ø1°#°Ð7Õ7ûð8üò 5ùò Oùò 8sF   ƒF ¸F8ÁF8ÁF=Á(F=Á0F=Â GÂ-GÆF5Æ&F0Æ*F5Æ0F5c               ó   € V ^8„  d   QhRR/# )r   r*   r9   r    )r!   s   "r"   r#   r#   \   s   € ÷ ñ ˜ñ r$   c                óZ   € ^ RI Hp V! V 4      pVf   \        RV  R24      pRVn        VhV# )r   ©Ú	get_entryzno catalog entry 'Ú'Úconfig_invalid)r/   rT   Ú
ValueErrorÚfailure_class)r*   rT   ÚentryÚmissings   &   r"   Ú_catalog_entryr[   \   s9   € Ý0á�d‹O€EØ‚}ÜÐ1°$°°qÐ9Ó:ˆØ 0ˆÔØˆØ€Lr$   c                  ón   € ] tR t^gt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tR# )Ú_CatalogBackendzSThe real work behind an MCP target. One object so a caller can pass another one in.c               ó    € V ^8„  d   QhRRRR/# )r   r*   r9   r   úlist[dict[str, Any]]r    )r!   s   "r"   r#   Ú_CatalogBackend.__annotate__j   s   € ÷ cñ c ð cÐ)=ñ cr$   c                ó\  € ^ RI Hp \        V4      P                  P                  ;'       g    .  Uu. uFn  q2! VP
                  4      '       d   K  RVP
                  RVP                  RVP                  RVP                  RVP                  '       d   RMVP                  /NKp  	  up# u upi )zBThe credentials the catalog entry declares that have no value yet.)Úget_env_valuer*   ÚpromptÚrequiredÚsecretÚdefaultrC   )
Úhermes_cli.configrb   r[   ÚauthÚenvr*   rc   rd   re   rf   )Úselfr*   rb   Úspecs   &&  r"   Úrequired_envÚ_CatalogBackend.required_envj   s”   € å3ô ,¨DÓ1×6Ñ6×:Ñ:×@Ð@¸bÐ@ócá@�DÈÐW[×W`ÑW`×IaôX�˜Ÿ™ H¨d¯k©k¸:ÀtÇ}Á}Ø˜4Ÿ;™;¨	¸¿¿¸±2È$Ï,É,óXá@ñcð 	cùò cs   ²B)ÁAB)ÂB)c               ó    € V ^8„  d   QhRRRR/# )r   r*   r9   r   r   r    )r!   s   "r"   r#   r`   r   s   € ÷ ?ñ ? ð ?¨ñ ?r$   c                	ó4   € ^ RI Hp VP                  VRR7      # )r   ©Ú	mcp_oauthN)Úclient_redirect_uri)Útools.connectorsrq   Ústart)rj   r*   rq   s   && r"   Ústart_oauthÚ_CatalogBackend.start_oauthr   s   € Ý.ð �‰˜t¸ˆÓ>Ð>r$   c               ó    € V ^8„  d   QhRRRR/# )r   r*   r9   r   Úboolr    )r!   s   "r"   r#   r`   x   s   € ÷ :ñ :¨ð :°ñ :r$   c                ó|   € \        V4      P                  pVP                  R8H  ;'       d    VP                  '       * # )z¥A catalog entry whose own OAuth the card must run. Provider-mediated OAuth is not one:
its token comes from ``hermes auth <provider>``, so the plain probe covers it.Úoauth)r[   rh   ÚtypeÚprovider)rj   r*   rh   s   && r"   Úinstalls_with_oauthÚ#_CatalogBackend.installs_with_oauthx   s2   € ô ˜dÓ#×(Ñ(ˆØ�y‰y˜GÑ#×9Ð9¨D¯M©MÔ(9Ð9r$   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r*   r9   ri   údict[str, str]r   r   r    )r!   s   "r"   r#   r`   ~   s!   € ÷ ñ ¨ð °.ð ÀSñ r$   c                ó  aaa	a
€ ^ RI HpHpHo
 ^ RIHp V! S4      '       * o	R VV	VV
3R llp \        S4      p\        SVS4       VP                  SV! V4      SVR7      #   \         d   pS	'       d   S
! RSRTR7       h R	p?ii ; i)
z«Install an OAuth entry through the card's flow. The configuration is built in memory and
lands, together with the setup values, only when ``initialize`` accepts the token.)Úcard_install_configÚis_installedÚrecord_mcp_installrp   c               ó   € V ^8„  d   QhRR/# ©r   r   ÚNoner    )r!   s   "r"   r#   Ú9_CatalogBackend.start_install_oauth.<locals>.__annotate__†   s   € ÷ 	?ñ 	?˜ñ 	?r$   c                 óF   <€ \        S 4       S'       d   S! R SR4       R# R# )rG   ÚsuccessN)Ú	_save_env)ri   Úfreshr*   r„   s   €€€€r"   ÚcommitÚ3_CatalogBackend.start_install_oauth.<locals>.commit†   s   ø€ Ü�cŒNßÙ" 9¨d°IÖ>ñ r$   )Úcfgri   Ú	on_commitrG   Úfailed)ÚerrorN)
r/   r‚   rƒ   r„   rs   rq   r[   Ú_check_declaredrt   rD   )rj   r*   ri   r‚   rƒ   rq   r�   rY   rI   rŒ   r„   s   &ff      @@r"   Ústart_install_oauthÚ#_CatalogBackend.start_install_oauth~   s…   û€ ÷ 	aÑ`Ý.á  Ó&Ô&ˆ÷	?ó 	?ð
		Ü" 4Ó(ˆEÜ˜D %¨Ô-Ø—?‘? 4Ñ-@ÀÓ-GÈSÐ\b�?ÓcÐcøÜô 	÷ Ù" 9¨d°HÀCÕHØûð	ús   ¯2A" Á"BÁ-BÂBc               ó$   € V ^8„  d   QhRRRRRR/# ©r   r*   r9   ri   r€   r   r   r    )r!   s   "r"   r#   r`   –   s!   € ÷ ,ñ ,˜Cð , nð ,¸ñ ,r$   c                óŽ   € ^ RI Hp V! V4      ;_uu_ 4        V P                  W4      uuRRR4       #   + '       g   i     R# ; i)zûProbe the entry's in-memory configuration with ephemeral credentials; save both only
after the server answered. A failure writes nothing, so a failed reinstall keeps the
previous configuration. A first install is recorded once as an extension install.)Úrecorded_catalog_installN)r/   r™   Ú_install)rj   r*   ri   r™   s   &&& r"   r=   Ú_CatalogBackend.install–   s.   € õ 	Dá% d×+Õ+Ø—=‘= Ó+÷ ,×+×+Ó+ús	   —3³A	c               ó$   € V ^8„  d   QhRRRRRR/# r—   r    )r!   s   "r"   r#   r`   Ÿ   s!   € ÷ ñ ˜Sð  ~ð ¸)ñ r$   c                	ó>  € ^ RI HpHpHpHp ^ RIHpHp ^ RIH	p	H
p
 \        V4      p\        WV4       V! V4      pVP                  P                  ;'       g    .  Uu0 uF"  qÝP                  '       g   K  VP                   kK$  	  ppVP#                  4        F!  w  ppWþ9  g   K  V'       g   K  V! WÏV4      pK#  	  T! / \%        V! 4       ;'       g    / 4      CVCV! 4       R7      p V	! W4      ;'       g    .  Uu. uF  p\'        V^ ,          4      NK  	  ppV! V4       V
! W4      '       g   \)        RV R24      pRVn        Vh\-        VP#                  4        UUu/ uF  w  ppVV9   g   K  VVbK  	  upp4       V# u upi u upi   T! T4       i ; iu uppi )r   )Úcurrent_secret_scopeÚcurrent_secret_scope_homeÚreset_secret_scopeÚset_secret_scope)Ú_inline_non_secret_valuer‚   )Ú_probe_single_serverÚ_save_mcp_server)Úprofile_homerU   z5' was rejected: suspicious command/args configurationÚconfig_rejected)Úagent.secret_scoperž   rŸ   r    r¡   r/   r¢   r‚   Úhermes_cli.mcp_configr£   r¤   r[   r“   rh   ri   re   r*   ÚitemsÚdictr9   ÚRuntimeErrorrX   r‹   )rj   r*   ri   rž   rŸ   r    r¡   r¢   r‚   r£   r¤   rY   r�   rk   Úsecret_namesÚkeyÚvalueÚtokenÚtoolÚtoolsÚrejectedÚkÚvs   &&&                    r"   rš   Ú_CatalogBackend._installŸ   sw  € ÷	có 	cçXßPä˜tÓ$ˆÜ˜ SÔ)Ù! %Ó(ˆð 05¯z©z¯~©~×/CÐ/CÀÐ/CÓTÑ/C dÏÍœ	˜Ÿ	œ	Ñ/CˆÐTØŸ)™)ž+‰JˆC�ØÖ&¯5©5Ù.¨s¸Ó?’ñ &ñ
 !Ø9ŒtÑ(Ó*×0Ð0¨bÓ1Ð9°SÐ9Ù2Ó4ô6ˆð	&Ù/CÀDÓ/N×/TÐ/TÐRTÐ/TÓVÑ/T d”S˜˜a�–\Ñ/TˆEÐVá˜uÔ%Ù ×*Ò*Ü# a¨ vÐ-bÐ$cÓdˆHØ%6ˆHÔ"ØˆNÜ C§I¡I¤KÔE¡K™D˜A˜q°1¸Ñ3D”4�1�a’4¡KÒEÔFØˆùò% Uùò Wøá˜uÕ%üó
 Fs<   ÁFÁ6FÃ)F Ã8F Ã=FÄF Å F
Å1F
ÆF Æ
Fc               ó    € V ^8„  d   QhRRRR/# )r   r*   r9   r   r‡   r    )r!   s   "r"   r#   r`   ¾   s   € ÷  ñ  ˜3ð   4ñ  r$   c                óf  € ^ RI HpHp ^ RIHp V! R4      ;_uu_ 4        V! 4       pVP                  R4      p\        V\        4      '       d&   \        VP                  V4      \        4      '       g   \        RV R24      hRWa,          R&   V! V4       RRR4       R#   + '       g   i     R# ; i)	zæFlip ``enabled`` under the scope and lock the dashboard's toggle route uses
(``PUT /api/mcp/servers/{name}/enabled``): the two read-modify-write paths run in one
process, so an unserialised write here drops whichever landed first.)Úload_configÚsave_config)Úconfig_write_scopeNÚmcp_serversrU   z ' is not a configured MCP serverTÚenabled)	rg   r¸   r¹   Úhermes_cli.web_routers._commonrº   ÚgetÚ
isinstancerª   rW   )rj   r*   r¸   r¹   rº   ÚconfigÚserverss   &&     r"   ÚenableÚ_CatalogBackend.enable¾   s…   € ÷ 	?ÝEá ×%Õ%Ù “]ˆFØ—j‘j Ó/ˆGÜ˜g¤t×,Ò,´J¸w¿{¹{È4Ó?PÔRV×4WÒ4WÜ  1 T FÐ*JÐ!KÓLÐLØ'+ˆG�M˜)Ñ$Ù˜Ô÷ &×%×%Ò%ús   ŸA6BÂB0	r    N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rl   ru   r}   r”   r=   rš   rÂ   Ú__static_attributes__r    r$   r"   r]   r]   g   s.   † Ù]õcõ?õ:õõ0,õ÷> ñ  r$   r]   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r*   r9   rY   r   ri   r€   r   r‡   r    )r!   s   "r"   r#   r#   Î   s(   € ÷ -ñ -˜#ð - cð -°ð -À4ñ -r$   c                óî   € ^ RI Hp VP                  P                  ;'       g    .  Uu0 uF  qDP                  kK  	  ppV F+  pWe9  d   \        RV  RV 24      pRVn        VhV! V4       K-  	  R# u upi )z�Configuring one MCP is not a general env-writing primitive: refuse the whole map before the
first write if any key is undeclared or unwritable.)Úvalidate_env_var_name_for_writerU   z,' does not declare the environment variable rV   N)rg   rÌ   rh   ri   r*   rW   rX   )r*   rY   ri   rÌ   rk   Údeclaredr­   Ú
undeclareds   &&&     r"   r“   r“   Î   sx   € õ Bà',§z¡z§~¡~×';Ð';¸Ð';Ó=Ñ';˜d—	”	Ñ';€HÐ=ÛˆØÔÜ# a¨ vÐ-YÐZ]ÐY^Ð$_Ó`ˆJØ'7ˆJÔ$ØÐÙ'¨Ö,ó ùò >s   ©A2c               ó    € V ^8„  d   QhRRRR/# )r   ri   r€   r   r‡   r    )r!   s   "r"   r#   r#   Ü   s   € ÷ 'ñ '�>ð ' dñ 'r$   c                óh   € ^ RI Hp V P                  4        F  w  r#V'       g   K  V! W#4       K  	  R# )r   )Úsave_env_valueN)rg   rÑ   r©   )ri   rÑ   r­   r®   s   &   r"   r‹   r‹   Ü   s$   € Ý0à—i‘i–k‰
ˆß‰5Ù˜3Ö&ó "r$   c               ó   € V ^8„  d   QhRR/# )r   r   r   r    )r!   s   "r"   r#   r#   ä   s   € ÷ ñ ˜#ñ r$   c                 ó   € \        4       # r)   )r]   r    r$   r"   Ú_default_backendrÔ   ä   s   € ÜÓÐr$   c                  ó„   € ] tR t^ít$ RtRtR]R&   ]! ]P                  R7      t
R]R&   ]! ]R7      tR]R	&   R
tR]R&   RtR# )Ú_WorkzWOne target's work in flight: an OAuth attempt the watcher polls, or a worker's outcome.Nr   Úattempt)Údefault_factoryzthreading.EventÚdoner   r±   rC   r9   r’   r    )rÄ   rÅ   rÆ   rÇ   rÈ   r×   Ú__annotations__r   Ú	threadingÚEventrÙ   Úlistr±   r’   rÉ   r    r$   r"   rÖ   rÖ   í   s:   ‡ áaà€GˆSÓÙ!°)·/±/ÔB€Dˆ/ÓBÙ¨TÔ2€Eˆ9Ó2Ø€Eˆ3‡Or$   rÖ   c                  ór   € ] tR t^÷tRtR R ltRR R lltR R ltR	 R
 ltR R lt	R R lt
R R ltRtR# )Ú_Runnerz6The backend plus the work for one operation's targets.c               ó    € V ^8„  d   QhRRRR/# )r   r8   r9   Úbackendr   r    )r!   s   "r"   r#   Ú_Runner.__annotate__ú   s   € ÷ 	:ñ 	:˜sð 	:¨Sñ 	:r$   c                	óH   € Wn         W n        R V n        / V n        / V n        R # r)   )r8   rá   Úop_idÚworkÚapproved_env)rj   r8   rá   s   &&&r"   Ú__init__Ú_Runner.__init__ú   s$   € ØŒØŒØ$(ˆŒ
Ø&(ˆŒ	ð
 8:ˆÖr$   Nc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   Útablezdict[str, Callable]Ú	operationr   Útargetr   ri   zOptional[dict[str, str]]r   r‡   r    )r!   s   "r"   r#   râ     s4   € ÷ ?ñ ?Ð,ð ?Ð9Lð ?ÐV\ð ?Ø)ð?Ø59ñ?r$   c                	óL   € WP                   ,          ! YY4;'       g    / 4       R # r)   )r8   )rj   rê   rë   rì   ri   s   &&&&&r"   ÚrunÚ_Runner.run  s   € à�k‰kÖ˜4¨F·I°I¸2Ö>r$   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rë   r   rì   r   ÚcallzCallable[[], Any]r   r‡   r    )r!   s   "r"   r#   râ   	  s1   € ÷ Jñ JÐ2ð J¸Fð JÐJ[ð JÐ`dñ Jr$   c           	     ó®  a aaaa€ SP                   '       d.   \        P                  RS P                  SP                  4       R# \        4       oSS P                  SP                  &   R VVV VV3R llp\        P                  ! \        P                  ! 4       P                  V3RRS P                   RSP                   2R7      P                  4        R# )	zRRun one blocking backend call on a worker thread; ``observe`` reports its outcome.z3mcp %s %s: not started, the operation settled firstNc               ó   € V ^8„  d   QhRR/# r†   r    )r!   s   "r"   r#   Ú#_Runner.spawn.<locals>.__annotate__  s   € ÷ 	!ñ 	!�dñ 	!r$   c                 óº  <€ . p R p S! 4       ;'       g    .  Uu. uF  p\        V4      NK  	  p pSP                  '       d.   \        P                  RSP                  SP                  4       R# WuSn        Sn	        SP                  P                  4        SP                  P                  4        R# u upi   \         d   p\        TSS4      p Rp?L¥Rp?ii ; i)rC   Nz7mcp %s %s: outcome dropped, the operation settled first)r9   rD   Ú_detailÚsettledÚloggerÚdebugr8   r*   r±   r’   rÙ   rE   Úwake)	r±   r’   r*   rI   rñ   rë   rj   rì   rå   s	       €€€€€r"   ÚbodyÚ_Runner.spawn.<locals>.body  s¯   ø€ Ø!ˆEØˆEð3Ù04³·°¸"°Ó>± tœ˜Tž±�Ð>ð × × Ð ä—‘ÐVØ!Ÿ[™[¨&¯+©+ô7áØ%*Ð"ˆDŒJ˜œ
Ø�I‰I�M‰MŒOØ�N‰N×ÑÖ ùò ?øÜô 3Ü  T¨6Ó2•ûð3ús,   ‡B8 •B8 šB3®B8 Â3B8 Â8CÃCÃCTúmcp-Ú-©rì   ÚargsÚdaemonr*   )r÷   rø   rù   r8   r*   rÖ   rå   rÛ   ÚThreadÚcontextvarsÚcopy_contextrî   rt   )rj   rë   rì   rñ   rû   rå   s   ffff @r"   ÚspawnÚ_Runner.spawn	  sœ   ü€ à××ÐÜ�L‰LÐNÐPT×P[ÑP[Ð]c×]hÑ]hÔiÙÜ‹wˆØ!%ˆ�	‰	�&—+‘+Ñ÷	!ô 	!ô$ 	×Ò¤× 8Ò 8Ó :× >Ñ >ÀdÀWÐUYØ $ T§[¡[ M°°6·;±;°-Ð@ô	BßBGÁ%Æ'r$   c               ó    € V ^8„  d   QhRRRR/# ©r   rë   r   r   r‡   r    )r!   s   "r"   r#   râ   &  s   € ÷ 2ñ 2Ð!4ð 2¸ñ 2r$   c                	ó(  € V \         VP                  &   VP                  V n        Wn        V P                  R 8X  d.   \	        VP
                  4      ^8”  d   V P                  V4       R# VP
                   F  pV P                  \        W4       K  	  R# )Ú	authorizeN)	Ú_RUNNERSrä   rë   r8   ÚlenÚtargetsÚ_prepare_togetherrî   Ú_PREPARE©rj   rë   rì   s   && r"   ÚprepareÚ_Runner.prepare&  sm   € Ø$(Œ�—‘Ñ!Ø—_‘_ˆŒ
Ø"ŒØ�;‰;˜+Ô%¬#¨i×.?Ñ.?Ó*@À1Ô*DØ×"Ñ" 9Ô-ÙØ×'Ô'ˆFØ�H‰H”X˜yÖ1ó (r$   c               ó    € V ^8„  d   QhRRRR/# r  r    )r!   s   "r"   r#   râ   0  s   € ÷ :ñ :Ð+>ð :À4ñ :r$   c           
     óÚ  € VP                    Uu. uFX  p\        P                  ! \        P                  ! 4       P
                  V P
                  \        W3RRVP                   2R7      NKZ  	  ppV F  pVP                  4        K  	  \        P                  ! 4       \        ,           pV F8  pVP                  \        RV\        P                  ! 4       ,
          4      4       K:  	  R# u upi )aê  Start every OAuth flow at once and wait for the URLs once. Each flow blocks until its
provider publishes an authorization URL, so a sequential prepare would keep the card empty
for one wait per target.

The wait bounds how long prepare blocks, not how long a provider may take: a row still
pending afterwards is left to its own thread, which is the only writer of that row and
ends with the URL or the flow's own failure. Failing it here as well would make two
writers of one row, and a URL that arrives a moment later would have no row to land on.

Each thread runs in its own copy of the calling thread's context: a named-profile turn
binds its home through a contextvar, and the flow resolves ``mcp_servers`` and stores the
token by that home.Tzmcp-prepare-rÿ   g        N)r  rÛ   r  r  r  rî   r  r*   rt   ÚtimeÚPREPARE_WAIT_SECONDSrF   Úmax)rj   rë   rì   ÚthreadsÚthreadÚdeadlines   &&    r"   r  Ú_Runner._prepare_together0  s¾   € ð V_×UfÒUfóháUfÈ6ô ×#Ò#¬;×+CÒ+CÓ+E×+IÑ+IØ*.¯(©(´H¸iÐ)PÐY]Ø+7¸¿¹°}Ð)E÷GáUfð 	ð hó ˆFØ�L‰LŽNñ ä—9’9“;Ô!5Õ5ˆÛˆFØ�K‰Kœ˜C ¬D¯IªI«KÕ!7Ó8Ö9ó ùòhs   �AC(c               ó    € V ^8„  d   QhRRRR/# r  r    )r!   s   "r"   r#   râ   F  s   € ÷ ;ñ ;Ð!4ð ;¸ñ ;r$   c                	óî   € VP                    Fd  pVP                  '       g0   VP                  \        P                  \        P
                  39  d   KF  \        V P                  ,          ! WV4       Kf  	  R # r)   )r  r÷   Ústater   ÚpendingÚ	initiatedÚ_OBSERVEr8   r  s   && r"   ÚobserveÚ_Runner.observeF  sP   € Ø×'Ô'ˆFà× × Ð  F§L¡L¼×9LÑ9LÌk×NcÑNcÐ8dÔ$dÙÜ�T—[‘[Ö! $°6Ö:ó	 (r$   c               ó   € V ^8„  d   QhRR/# r†   r    )r!   s   "r"   r#   râ   M  s   € ÷ ñ �tñ r$   c                ó  € V P                   e!   \        P                  V P                   R4       \        V RR4      p\	        V P
                  P                  4       4       Fˆ  w  r#VP                  e   Vf   K  VP                  \        P                  8X  d%   ^ RIHp V! VP                  P                  4       K\  VP                  \        P                  \!        V4      / 4      V&   KŠ  	  V P
                  P#                  4        R# )a  The operation is over. An attempt still waiting on the browser is stopped when the user
ended the turn, and otherwise left to finish: the card closed, not the authorization. What
it commits is picked up before the session's next turn (``adopt_late_connections``).Nrë   ©Úcancel_attempt)rä   r  ÚpopÚgetattrrÝ   rå   r©   r×   Ú
settled_byr   Ú	interruptÚtools.connectors.mcp_oauthr'  ÚflowÚ_LATE_ATTEMPTSÚ
setdefaultÚ	_late_keyÚclear)rj   rë   r*   rå   r'  s   &    r"   ÚcloseÚ_Runner.closeM  sµ   € ð �:‰:Ò!Ü�L‰L˜Ÿ™ TÔ*Ü˜D +¨tÓ4ˆ	Ü˜tŸy™yŸ™Ó0Ö1‰JˆDØ�|‰|Ò# yÒ'8ÙØ×#Ñ#¤|×'=Ñ'=Ô=ÝEá˜tŸ|™|×0Ñ0Ö1àLPÏLÉL”×)Ñ)¬)°IÓ*>ÀÓCÀDÓIñ 2ð 	�	‰	�‰Ör$   )r8   ræ   rá   rä   rë   rå   r)   )rÄ   rÅ   rÆ   rÇ   rÈ   rç   rî   r  r  r  r"  r2  rÉ   r    r$   r"   rß   rß   ÷   s.   † Ù@õ	:÷?õJõ:2õ:õ,;÷ñ r$   rß   c               ó    € V ^8„  d   QhRRRR/# )r   rë   r   r   ztuple[str, str]r    )r!   s   "r"   r#   r#   `  s   € ÷ Oñ OÐ,ð O°ñ Or$   c                óV   € V P                   ;'       g    \        4       V P                  3# )uÿ   The ``(profile, session)`` pairing ``live.open`` keys an operation by. ``profile_key``
is stamped there; the detached no-card path never opens, so fall back to the calling
thread's home â€” ``close`` runs on the tool thread under the turn's profile scope.)Úprofile_keyr   Úsession_key)rë   s   &r"   r0  r0  `  s&   € ð ×!Ñ!×6Ð6¤_Ó%6¸	×8MÑ8MÐNÐNr$   z%dict[tuple[str, str], dict[str, Any]]r.  c               ó    € V ^8„  d   QhRRRR/# )r   Úagentr   r   r   r    )r!   s   "r"   r#   r#   n  s   € ÷  ñ   #ð  ¨)ñ  r$   c                ó*  a€ \        \        V RR4      4      p\        4       V3p\        P	                  V4      pV'       g   . # . p\        VP                  4       4       F³  w  rVVP                  4       pVR,          R8X  d   K%  VP                  VR4       VR,          R8w  g   VP	                  R4      '       d   K^   ^ RI	H
p ^ RIHp	 V! 4       P	                  V4      p
\        V
\        4      '       d   V	! WZ/4       VP                  V4       K³  Kµ  	  V'       g   \        P                  VR4       \        V RR4      oV'       d!   Se   RS9  d   . SOV3R lV 4       OV n        V#   \          d    \"        P%                  R	TR
R7        EK3  i ; i)zîRegister the servers whose authorization committed after their card had closed, and add
them to the agent's toolset selection. Runs between turns, so the result that said "not
connected" is followed by a turn in which the tools are there.Ú
session_idNÚstatusr  ÚapprovedÚdiscovery_error©Ú_load_mcp_config©Úregister_mcp_serversz&late MCP connection %s was not adoptedT)Úexc_infoÚenabled_toolsetsÚno_mcpc              3  ó8   <"  € T F  qS9  g   K  Vx € K  	  R # 5ir)   r    )r+   rK   r¼   s   & €r"   r-   Ú)adopt_late_connections.<locals>.<genexpr>�  s   øé € Ð-U¹°AÈWÑDT¯aªa»ùs   ƒ�
)r   r)  r   r.  r¾   rÝ   r©   Úpollr(  Útools.mcp_tool_configr@  Útools.mcp_tool_discoveryrB  r¿   rª   ÚappendrD   rø   rù   rD  )r9  r7  r­   ÚattemptsÚadoptedr*   r×   Úsnapshotr@  rB  rÀ   r¼   s   &          @r"   Úadopt_late_connectionsrO  n  sc  ø€ ô (¬°°|ÀTÓ(JÓK€KÜÓ˜kÐ
*€CÜ×!Ñ! #Ó&€HßØˆ	Ø€GÜ˜hŸn™nÓ.Ö/‰ˆØ—<‘<“>ˆØ�HÕ Ô*ÙØ�‰�T˜4Ô Ø�HÕ Ô+¨x¯|©|Ð<M×/NÒ/NÙð		XÝ>ÝEá%Ó'×+Ñ+¨DÓ1ˆFÜ˜&¤$×'Ò'Ù$ d ^Ô4Ø—‘˜tÖ$ñ (ñ 0÷" Ü×Ñ˜3 Ô%Ü�eÐ/°Ó6€Gß�7Ò&¨8¸7Ô+BØ!V 7Ð!VÔ-U¹Ó-UÐ!VˆÔØ€Nøô ô 	XÜ�L‰LÐAÀ4ÐRVˆL×WÐWð	Xús   Â=AE*Å*#FÆFzdict[str, _Runner]r  c               ó$   € V ^8„  d   QhRRRRRR/# )r   r8   r9   rá   r   r   rß   r    )r!   s   "r"   r#   r#   •  s!   € ÷ :ñ :˜ð : cð :°Wñ :r$   c                ó<   € \        Y;'       g    \        4       4      # )u²   The runner for one MCP operation. ``prepare`` binds it to the operation, so the card's
answer and its Try again â€” both of which arrive on another thread â€” find the same work.)rß   rÔ   )r8   rá   s   &&r"   Úopen_runnerrR  •  s   € ô �6×8Ð8Ô&6Ó&8Ó9Ð9r$   ÚCancelledErrorzKtool discovery was interrupted; run the same action again to list the toolsÚTimeoutErrorz!the server did not answer in timec               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rI   r   Úrunnerrß   rì   r   r   r9   r    )r!   s   "r"   r#   r#   ¢  s(   € ÷ >ñ >�ð >˜gð >¨vð >¸#ñ >r$   c                óà  € ^ RI Hp \        V 4      ;'       gW    \        V \        4      '       d?   \
        P                  V P                  P                  V P                  P                  4      MRp\
        P                  WD4      pVP                  P                  VP                  / 4      P                  4        F  pV'       g   K  VP                  VR4      pK!  	  V! VRR7      ;'       g    R# )zçThe user-facing text of a failure. Every value the card submitted for this target is
replaced by exact match before the pattern redactor runs: an opaque credential has no
recognizable shape, so only the runner knows what to remove.)Úredact_sensitive_textr’   z
[REDACTED]T)Úforce)Úagent.redactrX  r9   r¿   ÚBaseExceptionÚ_BARE_ERRORSr¾   Ú	__class__rÄ   ræ   r*   ÚvaluesÚreplace)rI   rV  rì   rX  Útextr®   s   &&&   r"   rö   rö   ¢  s¼   € õ 3äˆs‹8÷ Hð HÜ% c¬=×9Ò9ô %×(Ñ(¨¯©×)?Ñ)?ÀÇÁ×AWÑAWÔXØ?Fð 	ä×Ñ˜DÓ'€DØ×$Ñ$×(Ñ(¨¯©°bÓ9×@Ñ@ÖBˆß‰5Ø—<‘<  |Ó4ŠDñ Cñ ! ¨TÔ2×=Ð=°gÐ=r$   c               ó    € V ^8„  d   QhRRRR/# )r   r*   r9   r   r    )r!   s   "r"   r#   r#   ±  s   € ÷ Fñ F ð F¨ñ Fr$   c                óh   € ^ RI Hp V! V 4      pVe    \        VP                  ;'       g    R4      # R# )z]The manifest's ``post_install`` text for a catalog name; a custom configured server has none.rS   rC   )r/   rT   r9   Úpost_install)r*   rT   rY   s   &  r"   Ú_catalog_instructionsrd  ±  s1   € å0á�d‹O€EØ,1Ò,=Œ3ˆu×!Ñ!×'Ð' RÓ(ÐEÀ2ÐEr$   c               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# )r   rë   r   rì   r   Útor   Úactorr   Úfieldsr   r   rx   r    )r!   s   "r"   r#   r#   ¹  s:   € ÷ ñ Ð(ð °&ð ¸kð ÐRWð Ðcfð Ðkoñ r$   c                óä   €  V P                   ! VP                  W#3/ VB  R#   \         dC    T P                  '       g   h \        P                  RTP                  TP                  4        R# i ; i)aF  Move one target from the prepare, worker-outcome or observe path.

Continue on the RPC thread can settle the operation between any read of the target's state and
this call. A settled operation has a frozen result, so the lost move is dropped rather than
raised into the tool result; anything else is a real contract violation.Tz6mcp target %s: %s dropped, the operation settled firstF)Ú
transitionr*   r   r÷   rø   rù   r®   )rë   rì   rf  rg  rh  s   &&&&,r"   Ú_moverk  ¹  s`   € ðØ×Ò˜VŸ[™[¨"Ñ>°vÒ>ÙøÜô Ø× × Ð ØÜ�‰ÐMÈvÏ{É{Ð\^×\dÑ\dÔeÚð	ús   ‚" ¢A/¿,A/Á.A/c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rë   r   rì   r   Údetailr9   r   r‡   r    )r!   s   "r"   r#   r#   É  s/   € ÷ 
Wñ 
WÐ(ð 
W°&ð 
WÀ#ð 
WÈ$ñ 
Wr$   c                ón  € V P                   '       d#   \        P                  RVP                  4       R# VP                  \
        P                  8X  d0   V P                  VP                  RV\        P                  R7       R# RVn
        \        W\
        P                  \        P                  VR7       R# )znReport a failure, whatever the row was doing: a repeated failure has no state change to
emit, only newer text.z;mcp target %s: failure dropped, the operation settled firstN)Úconnect_urlrm  rg  ©rm  )r÷   rø   rù   r*   r  r   r‘   Úrefreshr   Úbackend_watcherro  rk  )rë   rì   rm  s   &&&r"   Ú_failrs  É  s�   € ð ××ÐÜ�‰ÐRÐTZ×T_ÑT_Ô`ÙØ‡|�|”{×)Ñ)Ô)Ø×Ñ˜&Ÿ+™+°4ÀÌe×NcÑNcÐÔdÙØ€FÔÜ	ˆ)œ[×/Ñ/´×1FÑ1FÈv×Vr$   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rV  rß   rì   r   r*   r9   r   ztuple[list[str], str]r    )r!   s   "r"   r#   r#   Ö  s)   € ÷ 0ñ 0 ð 0°ð 0¸sð 0ÐG\ñ 0r$   c                ó
  €  ^ RI Hp ^ RIHp V! 4       P	                  V4      p\        V\        4      '       g   \        RV R24      hV! W%/4       \        V4      R3#   \         d   p. \        Y`T4      3u Rp?# Rp?ii ; i)zYRegister one committed server in the current profile scope and report its callable names.r?  rA  z$no committed MCP configuration for 'rU   rC   N)rI  r@  rJ  rB  r¾   r¿   rª   r«   Ú_registered_tool_namesrD   rö   )rV  rì   r*   r@  rB  rÀ   rI   s   &&&    r"   Ú_register_connectedrw  Ö  s~   € ð
0Ý:ÝAá!Ó#×'Ñ'¨Ó-ˆÜ˜&¤$×'Ò'ÜÐ!EÀdÀVÈ1ÐMÓNÐNÙ˜d˜^Ô,Ü% dÓ+¨RÐ/Ð/øÜô 0Ø”7˜3¨Ó/Ð/Õ/ûð0ús   ‚AA ÁBÁ*A=Á7BÁ=Bc               ó$   € V ^8„  d   QhRRRRRR/# )r   r*   r9   Úwait_secondsÚfloatr   r   r    )r!   s   "r"   r#   r#   å  s!   € ÷ ñ  ð °Eð ÀYñ r$   c                ó$  € ^ RI Hp ^ RIHp ^ RIHp ^ RIHp V! V 4      p\        P                  ! 4       V,           pRp VP                  RV  24      p	V	'       g   \        P                  ! 4       V8¼  d   V	# WbP                  9  ds   VP                  P                  V4      p
V
RJ;'       d$    \        V
R	R4      RJ;'       d    \        V
R
4      pV'       d   V	# V'       g   V
e   V! V 4      '       g   V	# Rp\        P                  ! R4       KÓ  )a'  The server's callable names, read from the registry once its registration has finished.

Registration is a no-op for a server the process already holds, and that includes one another
task is still connecting: saving the configuration wakes the config watcher, which starts its
own connect, so a large server (hundreds of tools) was reported with no tools three seconds
before they were registered. A server that failed discovery earlier is parked with no tools
and is woken once. A server that finished registering with no tools is a valid empty list.)Úmcp_tool)Úreconnect_mcp_server)Ú_resolve_server_key)ÚregistryFTrý   NÚsessionrv  g      Ð?)r±   r|  Útools.mcp_tool_loopr}  Útools.mcp_tool_scoper~  Útools.registryr  r  Úget_tool_names_for_toolsetÚ_server_connectingÚ_serversr¾   r)  ÚhasattrÚsleep)r*   ry  Ú_corer}  r~  r  r­   r  Úwokenr:   ÚserverÚfinisheds   &&          r"   rv  rv  å  sê   € õ (Ý8Ý8Ý'á
˜dÓ
#€CÜ�yŠy‹{˜\Õ)€HØ€EØ
Ø×3Ñ3°d¸4¸&°MÓBˆß”D—I’I“K 8Ô+ØˆLØ×.Ñ.Ô.Ø—^‘^×'Ñ'¨Ó,ˆFØ TÐ)÷ >ð >¬g°f¸iÈÓ.NÐVZÐ.Z÷ >ð >Ü˜FÐ$<Ó=ð çØ�ß˜šÑ.BÀ4×.HÒ.HØ�ØˆEÜ�
Š
�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>  r9   r   r‡   r    )r!   s   "r"   r#   r#     s9   € ÷ Tñ TÐ+ð T°Vð TÀIð TÐ`cð TÐmqñ Tr$   c                óz   € R V/pV'       d   W4R&   \        W\        P                  \        P                  3/ VB  R# )r±   r>  N)rk  r   Ú	connectedr   rr  )rë   rì   r±   r>  Úextras   &&&& r"   Ú_connectr‘    s5   € Ø$ eÐ,€EßØ#2ÐÑ Ü	ˆ)œ[×2Ñ2´E×4IÑ4IÑSÈUÔSr$   c               ó    € V ^8„  d   QhRRRR/# )r   rì   r   r   r   r    )r!   s   "r"   r#   r#     s   € ÷ Wñ W�6ð W˜eñ Wr$   c                ó€   € V P                   \        P                  8X  d   \        P                  # \        P
                  # )z?Try again is the user's move; a first attempt is the backend's.)r  r   r‘   r   Úuserrr  )rì   s   &r"   Ú_actorr•    s(   € àŸ™¬×);Ñ);Ô;Œ5�:‰:ÐVÄ×AVÑAVÐVr$   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# ©r   rV  rß   rë   r   rì   r   ri   r€   r   r‡   r    )r!   s   "r"   r#   r#     s2   € ÷ 
1ñ 
1˜ð 
1Ð-@ð 
1È&ð 
1ÐWeð 
1Ðjnñ 
1r$   c                ó¤  € \        V4      p\        VP                  4      Vn         V P                  P                  VP                  4      p\        TR7      T P                  TP                  &   \        Y\        P                  YEP                  \        TRR4      R7       R #   \         d"   p\        Y\        Y`T4      4        R p?R # R p?ii ; i)N©r×   rm  rC   ©ro  rm  )r•  rd  r*   Úinstructionsrá   ru   rD   rs  rö   rÖ   rå   rk  r   r   Úauth_urlr)  )rV  rë   rì   ri   rg  r×   rI   s   &&&&   r"   Ú_start_oauthr�    sž   € Ü�6‹N€EÜ/°·±Ó<€FÔðØ—.‘.×,Ñ,¨V¯[©[Ó9ˆô  %¨WÔ5€F‡K�K�—‘ÑÜ	ˆ)œ[×2Ñ2°E×GWÑGWÜ˜ (¨BÓ/÷1øô	 ô Üˆi¤¨°fÓ!=Ô>Ýûðús   §%B# Â#CÂ.C
Ã
Cc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# r—  r    )r!   s   "r"   r#   r#     s2   € ÷ #ñ #˜ð #Ð-@ð #È&ð #ÐWeð #Ðjnñ #r$   c           
     óð   € \        VP                  4      Vn         V P                  P	                  VP                  4      pYBn        R#   \
         d"   p\        Y\        YPT4      4        Rp?R# Rp?ii ; i)zTThe install row waits pending; the card draws a field per credential it still needs.N)rd  r*   r›  rá   rl   rD   rs  rö   )rV  rë   rì   ri   rd   rI   s   &&&&  r"   Ú_declare_envr     s^   € ä/°·±Ó<€FÔðØ—>‘>×.Ñ.¨v¯{©{Ó;ˆð #Öøô ô Üˆi¤¨°fÓ!=Ô>Ýûðús   œ%A	 Á	A5ÁA0Á0A5c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rV  rß   rì   r   ri   r€   r   r_   r    )r!   s   "r"   r#   r#   )  s/   € ÷ Xñ X˜gð X¨vð X¸Nð XÐOcñ Xr$   c           
     ó$  € V P                   P                  VP                  4      pV Uu. uFZ  pVP                  RR4      '       g   K  TP                  \	        VP                  R4      ;'       g    R4      4      '       d   KX  VNK\  	  up# u upi )z¯The declared credentials that still have no value. The install runs on a worker thread,
where ``install_entry``'s prompt for a missing credential would block on stdin forever.rd   Tr*   rC   )rá   rl   r*   r¾   r9   )rV  rì   ri   rÍ   rk   s   &&&  r"   Ú_missing_requiredr£  )  s{   € ð �~‰~×*Ñ*¨6¯;©;Ó7€HÙ%ó X™X�TØ�x‰x˜
 D×)ô Ø25·'±'¼#¸d¿h¹hÀvÓ>N×>TÐ>TÐRTÓ:U×2V÷ ˆD™Xñ Xð Xùò Xs   ªBÁ	'BÁ1BÂBc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# r—  r    )r!   s   "r"   r#   r#   1  s9   € ÷ [ñ [˜7ð [Ð/Bð [ÈFð [ÐYgð [Ðlpñ [r$   c           
     ó¸  a aa€ / S P                   P                  SP                  / 4      CVCo \        S SS4      pT'       dZ   TSn        TP                  SP                  SP                  \        P                  RRP                  R T 4       4       2R7       R # SS P                   SP                  &   \        S4      p. Sn        \        TS\        P                   TRR7      '       g   R # \#        S S4      '       d   \%        S TSS4       R # S P'                  TSTT T3R l4       R #   \         d$   p\        TS\        TS S4      4        R p?R # R p?ii ; i)Nzwaiting for rA   c              3  óF   "  € T F  p\        VR ,          4      x € K  	  R# 5i)r*   N)r9   )r+   rk   s   & r"   r-   Ú!_start_install.<locals>.<genexpr>=  s   é € Ð9`ÑX_ÐPT¼#¸dÀ6½l×:KÐ:KÓX_ùs   ‚!©ro  rg  rm  rC   rp  c                 óP   <€ SP                   P                  SP                  S 4      # r)   )rá   r=   r*   )r=  rV  rì   s   €€€r"   Ú<lambda>Ú _start_install.<locals>.<lambda>G  s   ø€ ¨F¯N©N×,BÑ,BÀ6Ç;Á;ÐPXÔ,Yr$   )ræ   r¾   r*   r£  rD   rs  rö   rl   rq  ro  r   rr  rF   r•  rk  r   r   Ú_installs_with_oauthÚ_start_install_oauthr  )rV  rë   rì   ri   rZ   rI   rg  r=  s   f&f&   @r"   Ú_start_installr®  1  s-  ú€ ØB�&×%Ñ%×)Ñ)¨&¯+©+°rÓ:ÐB¸cÐB€HðÜ# F¨F°HÓ=ˆ÷ ð &ˆÔØ×Ñ˜&Ÿ+™+°6×3EÑ3EÌU×MbÑMbØ#/°·	±	Ñ9`ÑX_Ó9`Ó0`Ð/aÐ!bð 	ô 	dáØ'/€F×Ñ˜Ÿ™Ñ$Ü�6‹N€EØ€FÔÜ�˜F¤K×$9Ñ$9¸5È×LÓLÙÜ˜F F×+Ò+Ü˜V Y°¸ÔAÙØ
‡L�L�˜FÖ$YÖZøô% ô Üˆi˜¤¨¨f°fÓ!=Ô>Ýûðús   ¯D+ Ä+EÄ6EÅEc               ó$   € V ^8„  d   QhRRRRRR/# )r   rV  rß   rì   r   r   rx   r    )r!   s   "r"   r#   r#   J  s!   € ÷ ñ  ð °&ð ¸Tñ r$   c                ó„   €  \        V P                  P                  VP                  4      4      #   \         d     R # i ; i)F)rx   rá   r}   r*   rD   )rV  rì   s   &&r"   r¬  r¬  J  s7   € ðÜ�F—N‘N×6Ñ6°v·{±{ÓCÓDÐDøÜô Úðús   ‚-0 °?¾?c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# r—  r    )r!   s   "r"   r#   r#   Q  s3   € ÷ =ñ = ð =Ð5Hð =ÐRXð =Ø,ð=Ø15ñ=r$   c           
     ó�  €  V P                   P                  VP                  V4      p\        TR7      T P                  TP                  &   TP                  '       d   R# TP                  TP                  TP                  \        P                  \        TRR4      R7       R#   \         d   p\	        YY%4        Rp?R# Rp?ii ; i)z¡The row is already ``initiated``; publish the authorization link onto it. The same
``initiated`` + ``connect_url`` pair is what every card reads as its URL step.Nr™  rm  rC   r¨  )rá   r”   r*   rD   Ú_fail_installrÖ   rå   r÷   rq  rœ  r   rr  r)  )rV  rë   rì   ri   r×   rI   s   &&&&  r"   r­  r­  Q  s�   € ðØ—.‘.×4Ñ4°V·[±[À#ÓFˆô  %¨WÔ5€F‡K�K�—‘ÑØ××ÐÙØ×Ñ�f—k‘k¨w×/?Ñ/?Äu×G\ÑG\Ü$ W¨h¸Ó;ð ö =øô ô Ü�f¨Ô5Ýûðús   ‚&B# Â#CÂ.C Ã Cc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   rV  rß   rë   r   rì   r   r’   r   r   r‡   r    )r!   s   "r"   r#   r#   a  s2   € ÷ =ñ =˜'ð =Ð.Að =È6ð =ÐZ]ð =Ðbfñ =r$   c           	     ó  € \         P                  ! \        4      ;_uu_ 4        V P                  P	                  VP
                  4      Vn        RRR4       \        W\        W0V4      4       R#   + '       g   i     L(; i)z A failed install asks for its fields again, so the card can reopen the form over the draft
it kept. Nothing was saved, so every declared field is still missing.N)Ú
contextlibÚsuppressrD   rá   rl   r*   rs  rö   )rV  rë   rì   r’   s   &&&&r"   r³  r³  a  sO   € ô 
×	Ò	œY×	'Õ	'Ø$Ÿn™n×9Ñ9¸&¿+¹+ÓFˆÔ÷ 
(ä	ˆ)œW U°FÓ;Ö<÷ 
(×	'ús   £+A.Á.A>	c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# r—  r    )r!   s   "r"   r#   r#   i  s2   € ÷ 
8ñ 
8�wð 
8Ð+>ð 
8Èð 
8ÐUcð 
8Ðhlñ 
8r$   c           
     óX  € \        V4      p\        W\        P                  VR R7      '       g   R#  V P                  P                  VP                  4       \        YTP                  4      w  rg\        YYg4       R#   \         d"   p\        Y\        YPT4      4        Rp?R# Rp?ii ; i)rC   rp  N)r•  rk  r   r   rá   rÂ   r*   rD   rs  rö   rw  r‘  )rV  rë   rì   ri   rg  rI   r±   r>  s   &&&&    r"   Ú
_do_enablerº  i  s…   € Ü�6‹N€EÜ�¤K×$9Ñ$9¸5È×LÓLÙðØ�‰×Ñ˜fŸk™kÔ*ô 1°ÀÇÁÓMÑ€EÜˆY Ö7øô	 ô Üˆi¤¨°fÓ!=Ô>Ýûðús   ²%A= Á=B)ÂB$Â$B)c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# r—  r    )r!   s   "r"   r#   r#   v  s2   € ÷  8ñ  8˜ð  8Ð-@ð  8È&ð  8ÐWeð  8Ðjnñ  8r$   c                óB  €  V P                   P                  VP                  4       Uu. uF%  qDP                  RR4      '       g   K  VR,          NK'  	  ppT'       d0   ^ RIHp \        YRRP                  T4       RT! 4        R	24       R# \        T4      p\        Y4      '       d    T P                   P                  TP                  / 4      p	\        T	R
7      T P                  TP                  &   \        Y\         P"                  Y‰P$                  \'        T	RR4      R7       R# \        Y\         P"                  T4        T P                   P)                  TP                  / 4       \+        YTP                  4      w  r«\-        YY«4       R# u upi   \         d"   p\        Y\        Y`T4      4        Rp?R# Rp?ii ; i  \         d"   p\        Y\        Y`T4      4        Rp?R# Rp?ii ; i  \         d"   p\        Y\        Y`T4      4        Rp?R# Rp?ii ; i)zPOff the desktop nobody can fill a credential in, so a missing one is the answer.rd   Tr*   N)Údisplay_hermes_homezset rA   z in the environment or z/.env, then install againr™  rm  rC   rš  )rá   rl   r*   r¾   rD   rs  rö   Úhermes_constantsr½  rF   r•  r¬  r”   rÖ   rå   rk  r   r   rœ  r)  r=   rw  r‘  )rV  rë   rì   ri   rk   rZ   rI   r½  rg  r×   r±   r>  s   &&&&        r"   Ú_install_nowr¿  v  s¹  € ðØ,2¯N©N×,GÑ,GÈÏÉÔ,TÓsÑ,T D×X`ÑX`ÐakÐmq×Xr”<�4˜—<�<Ñ,TˆÐs÷ Ý8äˆi 4¨¯	©	°'Ó(:Ð';Ð;RÙ$7Ó$9Ð#:Ð:Sð"Uô 	VáÜ�6‹N€EÜ˜F×+Ò+ð	Ø—n‘n×8Ñ8¸¿¹ÀbÓIˆGô $)°Ô#9ˆ�‰�F—K‘KÑ Üˆi¤×!6Ñ!6¸×K[ÑK[Ü˜W h°Ó3õ	5áÜ	ˆ)œ[×2Ñ2°EÔ:ðØ�‰×Ñ˜vŸ{™{¨BÔ/ô 1°ÀÇÁÓMÑ€EÜˆY Ö7ùò; tøÜô Üˆi¤¨°fÓ!=Ô>Ýûðûô ô 	Ü�)¤W¨S¸&Ó%AÔBÝûð	ûô ô Üˆi¤¨°fÓ!=Ô>Ýûðús^   ‚'F ©FÁFÁF Â*&G Å&G2 ÆF ÆG ÆF;Æ;G ÇG/ÇG*Ç*G/Ç2HÇ=HÈHc               ó(   € V ^8„  d   QhRRRRRRRR/# ©	r   rV  rß   rë   r   rì   r   r   r‡   r    )r!   s   "r"   r#   r#   ™  s*   € ÷ =ñ =˜7ð =Ð/Bð =ÈFð =ÐW[ñ =r$   c           
     óž  € V P                   P                  VP                  4      pVe   VP                  f   R # VP                  P	                  4       pVP                  R4      pVR9  d   R # V P                   P                  VP                  R 4       VR8X  dc   VP                  R4      ;'       g    RpV'       d   \        W. \        W`V4      4       R # \        WVP                  4      w  rx\        WWx4       R # VP                  R4      ;'       g    Rp	V P                  R8X  d   \        WW)4       R # \        W\        W�V4      4       R # )	Nr<  r=  r’   r>  rC   zthe authorization flow failedr=   )r=  r’   )rå   r¾   r*   r×   rH  r(  r‘  rö   rw  r8   r³  rs  )
rV  rë   rì   rå   rN  r<  r>  r±   Úregistration_errorr’   s
   &&&       r"   Ú_observe_oauthrÄ  ™  s  € Ø�;‰;�?‰?˜6Ÿ;™;Ó'€DØ‚|�t—|‘|Ò+ÙØ�|‰|× Ñ Ó"€HØ�\‰\˜(Ó#€FØÐ*Ô*ÙØ
‡K�K‡O�O�F—K‘K Ô&Ø�ÔØ"Ÿ,™,Ð'8Ó9×?Ð?¸RˆßÜ�Y¨¬G°OÈVÓ,TÔUñ 	ô )<¸FÈFÏKÉKÓ(XÑ%ˆEÜ�Y¨ÔBÙØ�L‰L˜Ó!×DÐDÐ%D€EØ‡}�}˜	Ô!Ü�f¨Ô7ÙÜ	ˆ)œW U°FÓ;Ö<r$   c               ó(   € V ^8„  d   QhRRRRRRRR/# rÁ  r    )r!   s   "r"   r#   r#   ±  s*   € ÷ 'ñ '˜Wð 'Ð1Dð 'Èfð 'ÐY]ñ 'r$   c                óž   € V P                   P                  VP                  4      pVe   VP                  e   \        M\
        pV! WV4       R# )zSAn install is an OAuth attempt for an OAuth entry and a worker for every other one.N)rå   r¾   r*   r×   rÄ  Ú_observe_worker)rV  rë   rì   rå   r"  s   &&&  r"   Ú_observe_installrÈ  ±  s8   € à�;‰;�?‰?˜6Ÿ;™;Ó'€DØ $Ò 0°T·\±\Ò5M�nÔSb€GÙˆF˜vÖ&r$   c               ó(   € V ^8„  d   QhRRRRRRRR/# rÁ  r    )r!   s   "r"   r#   r#   ¸  s*   € ÷ 8ñ 8˜Gð 8Ð0Cð 8ÈVð 8ÐX\ñ 8r$   c           	     óê  € V P                   P                  VP                  4      pVe!   VP                  P	                  4       '       g   R # V P                   P                  VP                  R 4       VP                  '       dL   V P                  R8X  d   \        WW#P                  4       R # \        W\        VP                  W4      4       R # \        WVP                  4      w  rE\        WWE4       R # )Nr=   )rå   r¾   r*   rÙ   Úis_setr(  r’   r8   r³  rs  rö   rw  r‘  )rV  rë   rì   rå   r±   r>  s   &&&   r"   rÇ  rÇ  ¸  s£   € Ø�;‰;�?‰?˜6Ÿ;™;Ó'€DØ‚|˜4Ÿ9™9×+Ñ+×-Ò-ÙØ
‡K�K‡O�O�F—K‘K Ô&Ø‡z‡z€zØ�=‰=˜IÔ%Ü˜&¨V·Z±ZÔ@ÙÜˆi¤¨¯©°VÓ!DÔEÙÜ0°ÀÇÁÓMÑ€EÜˆY Ö7r$   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# r—  r    )r!   s   "r"   r#   r#   Ç  s9   € ÷ ^ñ ^�Wð ^Ð)<ð ^Àfð ^ÐSað ^Ðfjñ ^r$   c                ó   € R# )zSAuthorize needs no approval: the row's verb opens the link the flow already minted.Nr    )rV  rë   rì   ri   s   &&&&r"   Ú_nothingrÎ  Ç  s   ‚ r$   r
  r=   rÂ   c               ó    € V ^8„  d   QhRRRR/# )r   rY   zdict[str, Any]r   r€   r    )r!   s   "r"   r#   r#   ×  s   € ÷ Uñ U�~ð U¨.ñ Ur$   c                óÎ   € V P                  R 4      p\        V\        4      '       d8   VP                  4        UUu/ uF  w  r#\	        V4      \	        V4      bK  	  upp# / # u uppi )ri   )r¾   r¿   rª   r©   r9   )rY   Úrawr³   r´   s   &   r"   Ú_answer_envrÒ  ×  sN   € Ø
�)‰)�EÓ
€CÜ7AÀ#Ät×7LÒ7L s§y¡y¤{Ô3¡{™t˜qŒC�‹F”C˜“FŠN¡{Ò3ÐTÐRTÐTùÓ3s   » A!c               ó$   € V ^8„  d   QhRRRRRR/# )r   rë   r   rÑ  r9   r   r‡   r    )r!   s   "r"   r#   r#   Ü  s"   € ÷ $1ñ $1Ð/ð $1°cð $1¸dñ $1r$   c           	     óœ  €  \         P                  ! V4      p\	        V\
        4      '       g   / p\        P                  V P                  4      pVP                  R4      ;'       g    R
 EF¤  p\	        V\
        4      '       g   K  T P                  \        VP                  R4      ;'       g    R4      P                  4       P                  4       4      pVf   Kq  \        VP                  R4      ;'       g    R4      P                  4       pVR8X  dV   \        W54      p V P                  ! VP                  \         P"                  \$        P&                  3/ V'       d   RV/M/ B  Kÿ  VR8X  g   EK	  Vf   EK  VP.                  \         P0                  8X  d$   VP3                  \4        W\7        V4      4       EKR  VP.                  \         P8                  \         P:                  39   g   EK„  VP3                  \<        W\7        V4      4       EK§  	  VP                  R	4      \>        P@                  PB                  8X  d6   V PD                  '       g"   V PG                  \>        P@                  4       R# R# R#   \        \        3 d    / p ELvi ; i  \(         d/    TP*                  '       g   T P,                  '       g   h  EK\   EK`  i ; i)zÉFold the card's ``connection.respond`` payload into the operation: a skip, an approval that
starts the backend's work, and Continue. The card never reports an outcome, so any other claim
moves nothing.r  r*   rC   Nr<  Úskippedrm  r=  r*  r    )$ÚjsonÚloadsÚ	TypeErrorrW   r¿   rª   r  r¾   rä   rì   r9   ÚstripÚlowerÚ_cancel_attemptrj  r*   r   rÕ  r   r”  r   Úresolvedr÷   r  r  rî   Ú_APPROVErÒ  r‘   ÚexpiredÚ_RETRYr   Ú	continue_r®   Úall_resolvedÚsettle)rë   rÑ  ÚanswerrV  rY   rì   r<  Úkepts   &&      r"   Úapply_answerrå  Ü  s  € ðÜ—’˜C“ˆô �fœd×#Ò#ØˆÜ�\‰\˜)Ÿ/™/Ó*€FØ—‘˜IÓ&×,Ð,¨"Ó,ˆÜ˜%¤×&Ò&ÙØ×!Ñ!¤# e§i¡i°Ó&7×&=Ð&=¸2Ó">×"DÑ"DÓ"F×"LÑ"LÓ"NÓOˆØŠ>ÙÜ�U—Y‘Y˜xÓ(×.Ð.¨BÓ/×5Ñ5Ó7ˆØ�YÔô # 6Ó2ˆDðØ×$Ò$ V§[¡[´+×2EÑ2EÄuÇzÁzñ Kß<@¨°4Ñ(8ÀbôKð
 �z×! fÕ&8Ø�|‰|œ{×2Ñ2Ô2Ø—
‘
œ8 Y¼ÀEÓ8J×KØ—‘¤+×"4Ñ"4´k×6IÑ6IÐ!J×Jà—
‘
œ6 9´kÀ%Ó6H×Iñ/ -ð0 ‡z�z�,Ó¤<×#9Ñ#9×#?Ñ#?Ô?È	×H^×H^ÐH^Ø×Ñœ×/Ñ/Ö0ñ I_Ñ?øô; ”zÐ"ô Ø‹ðûô( %ô Ø——�¨y×/@×/@Ð/@Øó 0A“ðús0   ‚I8 Ä AJÉ8JÊJÊKÊ/KËKË
Kz{the authorization had already completed when this was canceled, so it was kept; run the same action again to list the toolsc               ó$   € V ^8„  d   QhRRRRRR/# )r   rV  zOptional[_Runner]rì   r   r   r9   r    )r!   s   "r"   r#   r#     s"   € ÷ 	>ñ 	>Ð-ð 	>°vð 	>À#ñ 	>r$   c                óÎ   € V e'   V P                   P                  VP                  R4      MRp\        \        VRR4      RR4      pVf   R# ^ RIHp V! V4      '       d   \        # R# )z´Stop the target's OAuth attempt so a late reply cannot be adopted. Returns the note for a
cancel that lost the race: the attempt had committed, and a completed authorization stays.Nr×   r-  rC   r&  )rå   r(  r*   r)  r,  r'  ÚAUTHORIZATION_KEPT)rV  rì   rå   r-  r'  s   &&   r"   rÛ  rÛ    s[   € ð 28Ò1Cˆ6�;‰;�?‰?˜6Ÿ;™;¨Ô-È€DÜ”7˜4 ¨DÓ1°6¸4Ó@€DØ‚|ÙÝ9á!/°×!5Ò!5ÔÐ=¸2Ð=r$   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rë   r   r:   r   r   r;   r    )r!   s   "r"   r#   r#     s"   € ÷ ñ Ð(ð °ð ¸}ñ r$   c                óä   € \         P                  V P                  4      pVf   R# V P                  '       d   R# V F0  pV P	                  V4      pVf   K  VP                  \        W4       K2  	  R# )zÎRe-run the named MCP targets on the open operation (the card's Try again): a fresh OAuth
flow, a fresh install, a fresh enable. Returns an error message when the operation is not one
this module is running.Nz(this operation has no MCP work to re-runz0this operation has settled; its result is frozen)r  r¾   rä   r÷   rì   rî   rß  )rë   r:   rV  r*   rì   s   &&   r"   Úretryrë    s`   € ô �\‰\˜)Ÿ/™/Ó*€FØ‚~Ù9Ø××ÐÙAÛˆØ×!Ñ! $Ó'ˆØÔØ�J‰J”v˜yÖ1ñ ñ r$   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   rV  rß   r:   r   r8   r9   r7  r   r    )r!   s   "r"   r#   r#   (  s1   € ÷ 3ñ 3˜Gð 3¨Ið 3¸sð 3ÐQTð 3ÐY\ñ 3r$   c           
     ó¾  € \        V Uu. uF  p\        VR V4      NK  	  upVR7      pVP                   F  pV P                  \        WV4       K  	  VP                  RR7      p\        ;QJ d&    R VP                   4       F  '       g   K   RM	  RM! R VP                   4       4      '       d   RMRVR&   \        VR	&   \        P                  ! VRR
7      # u upi )Úmcp)r7  T)Ú	with_urlsc              3  óZ   "  € T F!  qP                   \        P                  8H  x € K#  	  R # 5ir)   )r  r   r   )r+   Úts   & r"   r-   Ú"_no_card_result.<locals>.<genexpr>-  s    é € Ð*gÑUfÐPQ¯7©7´k×6KÑ6KÖ+KÓUfùs   ‚)+Fr   r÷   r<  Únote)Úensure_ascii)
r   r   r  rî   Ú_NO_CARDÚresultÚanyÚNO_CARD_NOTErÖ  Údumps)rV  r:   r8   r7  rK   rë   rì   Úpayloads   &&&&    r"   Ú_no_card_resultrû  (  s³   € Ü!ÁUÓ"KÁUÀ¤6¨!¨U°FÖ#;ÁUÑ"KÐYdÔe€IØ×#Ô#ˆØ�
‰
”8˜YÖ/ñ $à×Ñ¨ÐÓ.€Gß'*£sÑ*gÐU^×UfÒUfÓ*g§s§s¢sÑ*gÐU^×UfÒUfÓ*g×'gÒ'g™Ðmv€GˆHÑÜ"€GˆF�OÜ�:Š:�g¨EÔ2Ð2ùò #Ls   ŠCÚtool_call_idrá   c               ó4   € V ^8„  d   QhRRRRRRRRR	RR
RRR/# )r   r:   r   r8   r9   Úconnection_callbackz3Optional[Callable[[dict[str, Any]], Optional[str]]]r;  r;   rü  rá   r   r   r    )r!   s   "r"   r#   r#   2  sO   € ÷ ñ Øðàðð Mð	ð
 ðð  ðð ðð 	ñr$   c          
     ó~  € \        W4      pV'       d   \        V4      # \        W4      p\        V4      pVf   \	        WpW4      #  \        V  U	u. uF  p	\        V	RV4      NK  	  up	\        VP                  VP                  \        R7      W„VRR7      VP                  4        # u up	i   TP                  4        i ; i)Nrî  )r  r"  ró  F)r7  rü  rþ  Úwith_urls_in_result)rP   r   rR  r   rû  r   r   r   r  r"  ÚNOTEr2  )
r:   r8   rþ  r;  rü  rá   r’   rV  r7  rK   s
   &&$$$$    r"   Úrun_mcp_operationr  2  s¦   € ô ˜vÓ-€EßÜ˜%Ó Ð Ü˜Ó)€FÜ'¨
Ó3€Kð Ò"Ü˜v¨fÓBÐBðÜÙ/4Ó5©u¨!ŒV�A�u˜fÖ%©uÑ5Ü˜Ÿ™°·±ÄdÔKØ#Ø 3Èô	
ð 	�‰�ùò 6øð 	�‰�ús   Á	B* ÁB%Á%/B* Â%B* Â*B<r)   )r   )rC   )`Ú__conditional_annotations__Ú
__future__r   r¶  r  rÖ  ÚloggingrÛ   r  Údataclassesr   r   Útypingr   r   r   r	   r
   r   r¾  r   Útools.connectors.contractr   r   r   Útools.connectors.gateway.configr   Útools.connectors.operationr   r   r   r   Útools.connectors.runr   r   Útools.connectors.targetsr   r   rƒ  r   Ú	getLoggerrÄ   rø   r  r  rø  r1   r6   rP   r[   r]   r“   r‹   rÔ   rÖ   rß   r0  r.  rÚ   rO  r  rR  r\  rö   rd  rk  rs  rw  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  s   @r"   Ú<module>r     s  øðß "Ð "ã Û Û Û Û Û ß (ß =× =å ,ß FÑ FÝ Aß hÓ hß 4ß IÝ %à	×	Ò	˜8Ó	$€ð Ð ð(ð ð=ð õ2õ'õõD÷d ñ d õN-õ'õð ÷ð ó ð÷fñ fõROð 9;€Ð5Ó :õ ðH  "€Ð
Ó !÷:ð ÐcØÐ7ð€õ>õFõõ 
Wõ0÷÷@TõWõ

1õ#õXõ[õ2õ=õ =õ
8õ 8õF=õ0'õ8õ^ð ˜ y°,ÀÈ(ÐS€Ø˜ 9¨n¸hÈ
ÐS€Ø
�| Y°ÀÈ*Ð	U€Ø˜¨Ð4DÀhÐP_Ð`€Ø˜ y°,ÀÈ*ÐU€õUõ
$1ðNJÐ õ	>õõ*3ðð #'ðð ÷ñ r$   