+
    lHàjO ã                   ó¦  a € R© t’0 t R t^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIHt ^ RI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 ^ R	IHtHt ^ R
IH t  ^ RI!H"t"H#t# ^ RI$H%t%H&t&H't'H(t(H)t) ^ RI*H+t+H,t,H-t-H.t.H/t/H0t0H1t1H2t2H3t3 ^ RI4H5t5H6t6H7t7H8t8H9t9H:t:H;t;H<t<H=t=H>t>H?t?H@t@HAtAHBtBHCtCHDtDHEtEHFtFHGtGHHtH ]P’                  ! ]J4      tK]P˜                  ]Pš                  ]Pœ                  0tORtPR R ltQR R ltRR R ltSRtT]U! 0 Rªm4      tVR«tWR R ltX]P²                  ! R]P´                  4      t[]P²                  ! R]P´                  4      t\R R lt]R R lt^R¬R R  llt_R! R" lt`R­R$ R% lltaR& R' ltb]	PÆ                  ! 4       td/ te] ^ k R( R) ltfR­R* R+ lltgR¬R, R- llth]PÒ                  R.3]PÔ                  R/3]PÖ                  R03]PØ                  R133tmR2 R3 ltnR4 R5 ltoR6 R7 ltpR8R9R:RR;RR<RR=R/R> R? lltq^]R#3R@ RA lltrRBR9/RC RD lltsRE RF lttRG RH ltuRI RJ ltvRKtwRLtxRMtyRN RO ltzR®RP RQ llt{RR RS lt|R¯RU RV llt}R°RZ R[ llt~^ R\IH€t€H�t� R] t‚R^R_R`RaRbRcRdReRfRcRgR`Rh/RiRcRjR`RkR#^Rl^/RmRcRjR`RnR#]RoRp//RqRf.//tƒR^RrR`RsRbRcRdReRfRcRgR`Rt/RWRcRgR`Ru//RqRfRW.//t„R^RvR`RwRbRcRdReRfRcRgR`Rx/RyRcRgR`Rz/R{RcRgR`R|/R}RcR~R`RR#R9//Rq. R±O//t…R€t†R�RcRgR‚RTRv.R`RƒR#RT/RvRcRgR`R„//t‡R… R† ltˆR^R‡R`RˆRbRcRdReR‰RcRgR`RŠ/R‹RcRgR‚RWRŒ.R`R�R#RW/RfRcRgR`RŽR#RX/R�RcRgR`R�/RmRcRjR`R‘R#^2/RiRcRjR`R’R#^ /R“RcRgR‚RYR”.R`R•R#RY/R–RcRgR‚. R²OR`R—R#RW/R˜RcRjR`R™R#^ //	RqR‰.//t‰Rš tŠR› t‹Rœ R� ltŒRž t�RŸ tŽR  t�]€EP                   ! R_R¡]ƒ]Š]‚R¢R]�R£7       ]€EP                   ! RrR¡]„]‹]‚R¤RR¥7       R¦ t‘]€EP                   ! RvR¡]…]�]‚R§R]‘R£7       ]€EP                   ! R‡R¡]‰]Ž]‚R¨RR¥7       R# )³zõFile Tools Module - LLM agent file manipulation tools.

Companions: ``file_tools_paths`` (task-aware resolution), ``file_tools_write_guards``
(write-side guards), ``file_tools_read_tracking`` (per-task dedup / loop-detection /
staleness state).
N)Ú	ExitStack)ÚPath)Úget_nt_namespace_errorÚget_read_block_error)ÚGUARDRAIL_REFUSAL_KEY)Úhas_binary_extension)Úis_background_review)ÚShellFileOperationsÚnormalize_read_paginationÚnormalize_search_pagination)ÚDEFAULT_READ_LIMITÚcount_conflict_blocks)Ú
file_state)Ú_is_secret_file_argÚredact_sensitive_text)Ú_expand_tildeÚ_path_resolution_warningÚ_resolve_base_dirÚ_resolve_entry_for_taskÚ_resolve_path_for_task)	Ú_READ_DEDUP_STATUS_MESSAGEÚ_check_approval_required_writeÚ_check_binary_document_writeÚ_check_cross_profile_pathÚ"_check_protected_instruction_writeÚ_check_sensitive_pathÚ_is_internal_file_tool_contentÚ_stale_overwrite_blockerÚ_stale_write_refusal)Ú_bump_consecutiveÚ_cap_read_tracker_dataÚ_carry_full_write_baselinesÚ_check_file_stalenessÚ_check_not_found_cacheÚ_known_full_content_sha256Ú_file_metadataÚ_file_versionÚ_mark_full_write_baselineÚ_mark_verification_staleÚ_note_read_coverageÚ_patch_failure_lockÚ_patch_failure_trackerÚ_read_trackerÚ_read_tracker_lockÚ_record_not_foundÚ_record_patch_failureÚ_reset_patch_failuresÚ
_task_dataÚ_update_read_timestampi † c                ó$   € V ^8„  d   QhR\         /# ©é   Úreturn)Úint)Úformats   "Ú5/home/ubuntu/.hermes/hermes-agent/tools/file_tools.pyÚ__annotate__r:   5   s   € ÷ 
:ñ 
:œSñ 
:ó    c                 óÚ   €  ^ RI Hp  V ! 4       P                  R4      p\	        V\
        \        34      ;'       d    V^ 8„  pV'       d   \        V4      # \        #   \         d    Rp LKi ; i)zõReturn ``file_read_max_chars`` from config.yaml (default on missing/invalid). No module
cache: ``load_config_readonly`` is already mtime+path cached, and a process-lifetime slot
would pin the launch profile's value under the multiplexed gateway.)Úload_config_readonlyÚfile_read_max_charsN)Úhermes_cli.configr=   ÚgetÚ	ExceptionÚ
isinstancer7   ÚfloatÚ_DEFAULT_MAX_READ_CHARS)r=   ÚvalÚvalids      r9   Ú_get_max_read_charsrG   5   sd   € ðÝ:Ù"Ó$×(Ñ(Ð)>Ó?ˆô �sœS¤%˜LÓ)×5Ð5¨c°A©g€EßŒ3ˆs‹8Ð9Ô"9Ð9øô ô ØŠðús   ‚A ÁA*Á)A*c          	      óh   € V ^8„  d   QhR\         R\        R\        \         \        \        3,          /# )r5   ÚcontentÚ	max_charsr6   )Ústrr7   ÚtupleÚbool)r8   s   "r9   r:   r:   B   s,   € ÷ ,ñ ,¤cð ,´cð ,¼eÄCÌÌdÀNÕ>Sñ ,r;   c                ó²  € \        V 4      V8:  d'   Y '       d   V P                  R4      ^,           R3# ^ R3# V P                  R4      p. p^ pV FG  p\        V4      V'       d   ^M^ ,           pWF,           V8”  d    MVP                  V4       WF,          pKI  	  V'       g   VP                  V^ ,          RV 4       RP	                  V4      \        V4      R3# )aÏ  Trim line-numbered ``read_file`` content to the last COMPLETE line within *max_chars*.

Returns ``(kept_text, lines_kept, truncated)`` so the caller can offer a
``next_offset`` instead of rejecting the read. If not even the first line
fits it is clamped mid-line so the read is never empty and the cursor advances.

Ported in spirit from nearai/ironclaw#5029 (dual line/byte cap on ``read_file``). Where hermes
previously hard-rejected an oversized read (forcing the model to guess a smaller ``limit`` and burn a
round-trip returning nothing), this trims the content to the last *complete line* that fits within
``max_chars`` and reports how many lines were kept so the caller can offer a ``next_offset``
continuation.
Ú
FNT)ÚlenÚcountÚsplitÚappendÚjoin)rI   rJ   ÚlinesÚkeptÚrunningÚlineÚadditions   &&     r9   Ú_truncate_to_char_budgetrZ   B   sÂ   € ô ˆ7ƒ|�yÔ Ø¶G˜Ÿ™ tÓ,¨qÕ0ÀUÐJÐJÀÀUÐJÐJà�M‰M˜$Ó€EØ€DØ€GÛˆÜ�t“9§T¡¨qÕ1ˆØÕ 	Ô)ÙØ�‰�DÔØÕŠñ ÷ Ø�‰�E˜!•H˜Z˜iÐ(Ô)Ø�9‰9�T‹?œC ›I tÐ+Ð+r;   c          
      óT   € V ^8„  d   QhR\         R\        R\        R\        R\        /# )r5   Úresult_dictrI   ÚoffsetrJ   r6   )ÚdictrK   r7   )r8   s   "r9   r:   r:   `   s1   € ÷ ñ ¤Dð ´3ð Äð Ô]`ð Ôehñ r;   c                ó  € \        W4      w  rVpW&,           pWPR&   RV R&   RV R&   W€R&   RVR R	V R
V RV^,
           RV RV R2V R&   \        VP                  R^4      ^ ,          4      V8¼  d   RV R&   V R;;,          R,          uu&   V# )zrTrim *content* to the char budget, annotate *result_dict* with the
continuation hint, and return the trimmed text.rI   TÚ	truncatedÚbytesÚtruncated_byÚnext_offsetzOutput truncated at the Ú,z-char read budget after z line(s) (showing lines Ú-ú of z). Use offset=z to continue.ÚhintrO   Útruncated_lineszv Note: the first line alone exceeded the budget and was clamped mid-line; its remainder is not retrievable via offset.)rZ   rP   rR   )	r\   rI   r]   Útotal_linesrJ   ÚtrimmedÚ
lines_keptÚ_rc   s	   &&&&&    r9   Ú_apply_char_budgetrm   `   sÉ   € ô 6°gÓIÑ€G˜ØÕ%€KØ$�	ÑØ#€K�ÑØ")€K�ÑØ!,�Ñà
" 9¨Q -Ð/GØˆ,Ð.¨v¨h°a¸Àa½Ð7HÈØˆ-�~ k ]°-ð	Að �Ñô ˆ7�=‰=˜˜qÓ! !Õ$Ó%¨Ô2Ø)-ˆÐ%Ñ&Ø�F×ðMõ	NÓð €Nr;   i Ð c                ó$   € V ^8„  d   QhR\         /# r4   ©rM   )r8   s   "r9   r:   r:   ‡   s   € ÷ 
-ñ 
-¬4ñ 
-r;   c                óp   € \        V RR4      pVf   R#  ^ RIHp \	        Y4      #   \         d     R# i ; i)z¡True when *file_ops* targets the host filesystem (only then may we stat paths
or rewrite V4A headers to host-absolute paths; sandboxes have their own namespace).ÚenvNT)ÚLocalEnvironment)ÚgetattrÚtools.environments.localrr   ÚImportErrorrB   )Úfile_opsrq   rr   s   &  r9   Ú_file_ops_uses_host_pathsrw   ‡   sC   € ô �(˜E 4Ó
(€CØ
‚{ÙðÝ=ô �cÓ,Ð,øô ô Úðús   •& ¦5´5z/^(\*\*\*\s*(Update|Add|Delete)\s+File:\s*)(.+)$z-^(\*\*\*\s*Move\s+File:\s*)(.+?)\s*->\s*(.+)$c                óH   € V ^8„  d   QhR\         R\        R\        R\         /# )r5   ÚpatchÚpath_to_resolvedÚpath_to_entryr6   )rK   r^   )r8   s   "r9   r:   r:   ›   s0   € ÷ jñ j¬Sð jÄDð jÔY]ð jÜ36ñjr;   c                ó®   aaa€ \        V4      '       g   V # RR VV3R lllo\        P                  V3R lV 4      p \        P                  V3R lV 4      # )um  Rewrite V4A file headers to the resolved host paths (host backends only).

The shell layer must patch the SAME files ``patch_tool`` resolved for
locking/staleness, not re-resolve a relative header against its own cwd
(which can differ â€” the git-worktree cwd bug). Delete and Move headers take
``path_to_entry``: they act on a symlink itself, never on its target.
c                ó<   € V ^8„  d   QhR\         R\        R\         /# )r5   ÚrawÚentryr6   ©rK   rM   )r8   s   "r9   r:   Ú7_rewrite_v4a_patch_paths_for_host.<locals>.__annotate__§   s&   € ÷ Nñ N”#ð Nœdð N¬sñ Nr;   c                 ón   <€ V P                  4       p V'       d   SMSP                  V 4      ;'       g    T # ©N)Ústripr@   )r~   r   r{   rz   s   &&€€r9   Ú_resÚ/_rewrite_v4a_patch_paths_for_host.<locals>._res§   s,   ø€ Ø�i‰i‹kˆß!&‘Ð,<×AÑAÀ#ÓF×MÐMÈ#ÐMr;   c                 ó€   <€ V P                  ^4       S! V P                  ^4      V P                  ^4      R8H  R7       2# )é   ÚDelete©r   ©Úgroup©Úmr…   s   &€r9   Ú<lambda>Ú3_rewrite_v4a_patch_paths_for_host.<locals>.<lambda>¬   s3   ø€ �Q—W‘W˜Q“Z�L¡ a§g¡g¨a£j¸¿¹À»
ÀhÑ8NÔ!OÐ PÑQr;   c                 ó�   <€ V P                  ^4       S! V P                  ^4      RR7       RS! V P                  ^4      RR7       2# )rˆ   TrŠ   z -> r‹   r�   s   &€r9   r�   r�   ®   s>   ø€ �Q—W‘W˜Q“Z�L¡ a§g¡g¨a£j¸Ô!=Ð >¸dÁ4ÈÏÉÐPQË
ÐZ^ÔC_ÐB`Ñar;   )F)rw   Ú_V4A_SINGLE_HEADER_REÚsubÚ_V4A_MOVE_HEADER_RE)ry   rz   r{   rv   r…   s   &ff&@r9   Ú!_rewrite_v4a_patch_paths_for_hostr•   ›   sU   ú€ ô % X×.Ò.Øˆ÷Nó Nô "×%Ñ%ÜQÐSXóZ€Eä×"Ñ"ÜaÐchójð jr;   c                ó0   € V ^8„  d   QhR\         R\        /# ©r5   Úpathr6   r€   )r8   s   "r9   r:   r:   ±   s   € ÷ [ñ [¤#ð [¬$ñ [r;   c                óÈ   € \         P                  P                  \        V 4      4      pV\        9   d   R# VP                  R4      ;'       d    VP                  \        4      # )zXReturn True for concrete device/fd/proc paths that can hang reads or leak process state.Tz/proc/)Úosr˜   Únormpathr   Ú_BLOCKED_DEVICE_PATHSÚ
startswithÚendswithÚ_BLOCKED_PROC_SUFFIXES)r˜   Ú
normalizeds   & r9   Ú_is_blocked_device_pathr¡   ±   sL   € ä—‘×!Ñ!¤-°Ó"5Ó6€JØÔ*Ô*ÙØ× Ñ  Ó*×ZÐZ¨z×/BÑ/BÔCYÓ/ZÐZr;   c                ó`   € V ^8„  d   QhR\         R\         \        ,          R,          R\        /# )r5   ÚfilepathÚbase_dirNr6   )rK   r   rM   )r8   s   "r9   r:   r:   ¹   s*   € ÷ "-ñ "-¤ð "-´´dµ
¸TÕ0Að "-ÌTñ "-r;   c                óæ  € \        V 4      pVeZ   \        P                  P                  V4      '       g5   \        P                  P	                  \        P
                  ! V4      V4      p\        P                  P                  V4      p\        V4      '       d   R# \        4       pTp\        ^4       FÊ  p \        P                  ! V4      p\        P                  P                  T4      '       g>   \        P                  P	                  \        P                  P                  T4      T4      p\        P                  P                  T4      p\        T4      '       d    R# Yt9   d    MTP                  T4       TpKÌ  	   \        P                  P                  \        P                  P                  V4      4      p\        T4      #   \         d      KW  i ; i  \        \        3 d     R# i ; i)zâTrue if the path (literal, any symlink hop, or final realpath) is a blocked device.

Literal first so /dev/stdin is caught before resolving to a terminal path;
every symlink hop is checked so an alias cannot bypass the guard.
TF)r   rš   r˜   ÚisabsrT   Úfspathr›   r¡   ÚsetÚrangeÚreadlinkÚOSErrorÚdirnameÚaddÚrealpathÚ
ValueError)	r£   r¤   Úexpandedr    ÚseenÚcurrentrl   ÚtargetÚresolveds	   &&       r9   Ú_is_blocked_devicerµ   ¹   sd  € ô ˜XÓ&€HØÒ¤B§G¡G§M¡M°(×$;Ò$;Ü—7‘7—<‘<¤§	¢	¨(Ó 3°XÓ>ˆÜ—‘×!Ñ! (Ó+€JÜ˜z×*Ò*Ùä“U€DØ€GÜ�2ŽYˆð	Ü—[’[ Ó)ˆFô �w‰w�}‰}˜V×$Ò$Ü—W‘W—\‘\¤"§'¡'§/¡/°'Ó":¸FÓCˆFÜ—‘×!Ñ! &Ó)ˆÜ" 6×*Ò*ÚØŒ>ÙØ�‰�ÔØŠñ ðÜ—7‘7×#Ñ#¤B§G¡G×$4Ñ$4°ZÓ$@ÓAˆô # 8Ó,Ð,øô! ô 	Ûð	ûô ”ZÐ ô Úðús$   Â6GÆ<G ÇGÇGÇG0Ç/G0c                ó<   € V ^8„  d   QhR\         R\         R\         /# )r5   r˜   Útask_idr6   ©rK   )r8   s   "r9   r:   r:   Þ   s!   € ÷ 
ñ 
œsð 
¬Sð 
´Sñ 
r;   c                óh   €  \        \        W4      4      #   \        \        \        3 d    T u # i ; i)a2  Best-effort task-cwd resolution of a search hit's path.

Search backends may return cwd-relative paths while the process cwd differs, so both the
read-block filter and the redaction classifier must resolve against the task cwd. An
unresolvable path is used as-is (the raw path is still worth classifying).
)rK   r   r«   r¯   ÚRuntimeError)r˜   r·   s   &&r9   Ú_resolved_match_pathr»   Þ   s3   € ðÜÔ)¨$Ó8Ó9Ð9øÜ”Z¤Ð.ô ØŠðús   ‚ –1°1Údefaultc                ó0   € V ^8„  d   QhR\         R\        /# ©r5   r·   r6   ©rK   r7   )r8   s   "r9   r:   r:   ë   s   € ÷ ñ ¼ð ÌSñ r;   c                ó  aa€ ^ oR VV3R llp\        V RR4      '       d;   V P                   Uu. uF  q2! VP                  4      '       g   K  VNK   	  upV n        \        V RR4      '       d1   V P                   Uu. uF  qB! V4      '       g   K  VNK  	  upV n        \        V RR4      '       dD   V P                  P                  4        UUu/ uF  w  rEV! V4      '       g   K  WEbK  	  uppV n        S# u upi u upi u uppi )zÙRemove credential/cache/env paths from a SearchResult in-place; return the omitted count.

Each path is resolved against the task cwd first (search backends may
return cwd-relative paths; the process cwd can differ).
c                ó0   € V ^8„  d   QhR\         R\        /# r—   r€   )r8   s   "r9   r:   Ú9_filter_read_blocked_search_results.<locals>.__annotate__ó   s   € ÷ ñ ”sð œtñ r;   c                 óT   <€ \        \        V S4      4      '       d   S^,          oR# R# )rˆ   FT)r   r»   )r˜   Úomittedr·   s   &€€r9   Ú_allowedÚ5_filter_read_blocked_search_results.<locals>._allowedó   s%   ø€ äÔ 4°T¸7Ó C×DÒDØ�q�LˆGÙÙr;   ÚmatchesNÚfilesÚcounts)rs   rÇ   r˜   rÈ   rÉ   Úitems)Úresultr·   rÅ   rŽ   ÚfÚcrÄ   s   &f    @r9   Ú#_filter_read_blocked_search_resultsrÎ   ë   sÎ   ù€ ð €G÷ñ ô ˆv�y $×'Ò'Ø%+§^¢^ÓH¡^ °xÀÇÁ×7GŸ!˜!¡^ÑHˆŒÜˆv�w ×%Ò%Ø#)§<¢<Ó?¡<˜a°8¸A·;Ÿ˜¡<Ñ?ˆŒÜˆv�x ×&Ò&Ø*0¯-©-×*=Ñ*=Ô*?ÔOÑ*?¡$ !Á8ÈAÇ;œ˜šÑ*?ÒOˆŒØ€Nùò Iùâ?ùãOs#   °C7ÁC7Á=C<ÂC<ÃDÃ&Dc                ó0   € V ^8„  d   QhR\         R\        /# )r5   Úexcr6   )rA   rM   )r8   s   "r9   r:   r:     s   € ÷ Jñ J¤ið J´Dñ Jr;   c                óˆ   € \        V \        4      ;'       g,    \        V \        4      ;'       d    V P                  \        9   # )zFReturn True for expected write denials that should not hit error logs.)rB   ÚPermissionErrorr«   ÚerrnoÚ_EXPECTED_WRITE_ERRNOS)rÐ   s   &r9   Ú_is_expected_write_exceptionrÕ     s:   € ä�cœ?Ó+÷ Jð JÜ�3œÓ ×HÐH S§Y¡YÔ2HÑ%HðJr;   c                ó0   € V ^8„  d   QhR\         R\         /# )r5   Úraw_task_idr·   r¸   )r8   s   "r9   r:   r:     s   € ÷ ("ñ ("´3ð ("Äñ ("r;   c           
     óD  € ^ RI HpHp ^ RIHpHpHpHpHpH	p	H
p
Hp V! 4       pVR,          pV! V 4      p V
! V 4      pT! VP                  R4      ;'       g    T;'       g
    VR,          V4      pV! WÀ4      pV! V4      '       dL   V! VVR7      '       d<   V! VV4      '       d   RMVR,          pVV8w  d   \        P                  RVVV4       Tp\        P                  R	WÑR
,          4       V! WÍV	! WÞV4      VVR,          VVR7      pVV3#   \         d    Rp Lài ; i)z¯Build the terminal environment for *task_id* via the shared ``_create_configured_env``,
so a file tool that runs before any terminal command still gets the configured backend.)Ú_is_container_backendÚcoerce_ssh_remote_cwd)Ú_create_configured_envÚ_get_env_configÚ_is_mounted_host_cwdÚ_is_unusable_container_cwdÚ_resolve_task_host_cwdÚ_select_imageÚget_session_cwdÚresolve_task_overridesÚenv_typeNÚcwd)Úmounted_hostz
/workspacezaIgnoring host/relative cwd override %r for %s backend (won't exist in sandbox). Using %r instead.z*Creating new %s environment for task %s...ºNé   NÚtimeout)Úimagerä   rè   r·   Úhost_cwd)Útools.terminal_tool_configrÙ   rÚ   Útools.terminal_toolrÛ   rÜ   rÝ   rÞ   rß   rà   rá   râ   rA   r@   ÚloggerÚinfo)r×   r·   rÙ   rÚ   rÛ   rÜ   rÝ   rÞ   rß   rà   rá   râ   Úconfigrã   Ú	overridesÚrecorded_cwdrä   rê   ÚfallbackÚterminal_envs   &&                  r9   Ú!_create_terminal_env_for_file_opsrô     s3  € ÷ X÷X÷ Xó Xñ Ó€FØ�jÕ!€HÙ& {Ó3€IðÙ& {Ó3ˆñ   	§¡¨eÓ 4× UÐ U¸× UÐ UÈÈuÍÐW_Ó
`€Cñ & fÓ:€HÙ˜X×&Ò&Ñ+EÀcÐX`×+aÓ+aÙ#7¸¸X×#FÒ#F‘<ÈFÐSXÍMˆØ�(Œ?Ü�K‰Kð>à�X˜xô)ð ˆÜ
‡K�KÐ<¸hÐPRÍÔTÙ)Ø¡¨hÀ6Ó JÐPSØ�yÕ!¨7Øô€Lð
 �\Ð!Ð!øô7 ô ØŠðús   ¶D ÄDÄDc                ó0   € V ^8„  d   QhR\         R\        /# r¾   )rK   r	   )r8   s   "r9   r:   r:   9  s   € ÷ >ñ >œ3ð >Ô/Bñ >r;   c           	     ól  € ^ RI HpHpHpHpHpHpHpHpH	p	 T ;'       g    Rp
V! V
4      p \        ;_uu_ 4        \        P                  V 4      pRRR4       Xe’   T;_uu_ 4        W9   d$   \        P                  ! 4       W0&   VuuRRR4       # \        VRR4      pV'       d    V! V
4      f	   V	! W¬4       \        ;_uu_ 4        \        P!                  V R4       RRR4       RRR4       V;_uu_ 4        VP#                  V \$        P&                  ! 4       4      pRRR4       X;_uu_ 4        T;_uu_ 4        VP                  V 4      pVe   \        P                  ! 4       W0&   RRR4       Xf`   \)        W 4      w  rþV;_uu_ 4        WáV &   \        P                  ! 4       W0&   RRR4       V! 4        \*        P-                  RWðR,          4       RRR4       \/        X4      p\        ;_uu_ 4        V\        V &   RRR4       V#   + '       g   i     ELÀ; i  \         d     ELqi ; i  + '       g   i     ELY; i  + '       g   i     ELe; i  + '       g   i     ELA; i  + '       g   i     EL; i  + '       g   i     Lß; i  + '       g   i     LÆ; i  + '       g   i     T# ; i)a[  Get or create ShellFileOperations for the task's terminal environment.

Uses terminal_tool's per-task creation locks (no duplicate sandboxes).
Subagent task_ids collapse to "default" (``_resolve_container_task_id``) so
delegate_task children share the parent's container; RL/benchmark task_ids
with a registered env override keep their isolation.
)	Ú_active_environmentsÚ	_env_lockÚ_last_activityÚ_start_cleanup_threadÚ_creation_locksÚ_creation_locks_lockÚ_resolve_container_task_idrá   Úrecord_session_cwdr¼   Nrä   z %s environment ready for task %sræ   )rì   r÷   rø   rù   rú   rû   rü   rý   rá   rþ   Ú_file_ops_lockÚ_file_ops_cacher@   Útimers   rA   ÚpopÚ
setdefaultÚ	threadingÚLockrô   rí   rî   r	   )r·   r÷   rø   rù   rú   rû   rü   rý   rá   rþ   r×   ÚcachedÚold_cwdÚ	task_lockró   rã   rv   s   &                r9   Ú_get_file_opsr	  9  só  € ÷-÷ -õ -ð
 ×&Ð&˜Y€KÙ(¨Ó5€G÷ 
ŽÜ ×$Ñ$ WÓ-ˆ÷ 
àÒßŠYØÔ.Ü*.¯)ª)«+�Ñ'Ø÷ ŠYô ˜f e¨TÓ2ˆGßðÙ& {Ó3Ò;Ù*¨;Ô@÷  –Ü×#Ñ# G¨TÔ2÷  ÷' ÷, 
Ò	Ø#×.Ñ.¨w¼	¿ºÓ8HÓIˆ	÷ 
÷ 
ŠçŠYØ/×3Ñ3°GÓ<ˆLØÒ'Ü*.¯)ª)«+�Ñ'÷ ð ÒÜ%FÀ{Ó%\Ñ"ˆHß’Ø0< WÑ-Ü*.¯)ª)«+�Ñ'÷ ñ "Ô#Ü�K‰KÐ:¸HÈbÅkÔR÷ 
ô # <Ó0€Hß	ŽØ#+Œ˜Ñ ÷ 
à€O÷[ 
�ˆûô( !ô Úðúç—�ú÷' �YˆYú÷, 
×	Ð	ú÷
 �YˆYú÷ —ú÷ 
�ú÷ 
Žà€Oús­   ¹HÁ%I ÂI Â%HÂ7I ÃH,	ÃI Ã6&IÄ.JÄ9-I(	Å&#JÆ	I<	Æ%,JÇ2
J"ÈH	ÈH)È%I È(H)È)I È,H=È7	I É I	ÉI%	É(I9É3	JÉ<JÊJÊJ	Ê"J3	c                ó2   € V ^8„  d   QhR\         R,          /# )r5   r·   Nr¸   )r8   s   "r9   r:   r:   z  s   € ÷ *ñ *¤#¨¥*ñ *r;   c                óÞ  € \         ;_uu_ 4        V '       d   \        P                  V R4       M\        P                  4        RRR4       \        ;_uu_ 4        V '       d   \
        P                  ! V R4       M\
        P                  ! 4        RRR4       \        ;_uu_ 4        V '       d   \        P                  ! V R4       M\        P                  ! 4        RRR4       V '       d'   \        P                  ! 4       P                  V 4       R# \        P                  ! 4       P                  4        R#   + '       g   i     Lû; i  + '       g   i     LÂ; i  + '       g   i     L‰; i)z=Clear file-operation state for a finished task, or all tasks.N)rÿ   r   r  Úclearr-   r,   r*   r+   r   Úget_registryÚforget_task)r·   s   &r9   Úclear_file_ops_cacher  z  sÎ   € ç	ŽßÜ×Ñ ¨Õ.ä×!Ñ!Ô#÷	 
÷ 
Ö	ßÜ×Ò˜g tÕ,ä×ÒÔ!÷	 
÷ 
Ö	ßÜ"×&Ò& w°Õ5ä"×(Ò(Ô*÷	 
÷ Ü×ÒÓ!×-Ñ-¨gÖ6ä×ÒÓ!×'Ñ'Ö)÷+ 
�ú÷ 
×	ú÷ 
×	ús#   �4D6Á6E	Â%6EÄ6E	Å	E	ÅE,	za FIFO (named pipe)za socketza character deviceza block devicec                ó2   € V ^8„  d   QhR\         R,          /# )r5   r6   Nr¸   )r8   s   "r9   r:   r:   ›  s   € ÷ 0ñ 0¤ d¥
ñ 0r;   c                ó:  a€  \         P                  ! \         P                  ! V 4      4      P                  o\        P
                  ! S4      '       g   \        P                  ! S4      '       d   R# \        T3R l\         4       R4      #   \         d     R# i ; i)a$  Human name for a non-regular file type that would hang a read, else None.

Stat-based sibling of ``_is_blocked_device``: a FIFO/socket in a workspace
hangs like ``/dev/zero`` but has no recognizable name. Host filesystems
only; unstattable paths return None and flow to the normal read path.
Nc              3   óL   <"  € T F  w  rV! S4      '       g   K  Vx € K  	  R # 5irƒ   © )Ú.0Ú	predicateÚlabelÚmodes   &  €r9   Ú	<genexpr>Ú%_special_file_kind.<locals>.<genexpr>¨  s   øé € ÐVÑ/BÑ+˜9ÁiÐPTÇo—’Ó/Bùs   ƒ$š
$za special (non-regular) file)	rš   Ústatr§   Úst_moder«   ÚS_ISREGÚS_ISDIRÚnextÚ_SPECIAL_FILE_KINDS)r˜   r  s   &@r9   Ú_special_file_kindr   ›  ss   ø€ ðÜ�wŠw”r—y’y “Ó'×/Ñ/ˆô ‡|‚|�D×ÒœTŸ\š\¨$×/Ò/ÙÜÔVÕ/BÓVØ.ó0ð 0øô	 ô Úðús   ƒ4B ÂBÂBc                ób   € V ^8„  d   QhR\         R\        R\        R\         R\         R,          /# )r5   r˜   r]   Úlimitr·   r6   Nr¿   )r8   s   "r9   r:   r:   ¬  s>   € ÷ G7ñ G7¤3ð G7¼3ð G7Äsð G7ÔUXð G7Ô]`ÐcgÕ]gñ G7r;   c           
     ó”  a€ ^ RI HpHpHpHpHp	Hp
 V
! \        V4      4      '       g   R# \        V4      p VP                  \        V4      VR7      pVP                  '       g   VP                  f   T! VP                  ;'       g    R4      h\        P                  ! VP                  RR7      pV	! V\        V4      4      pTP1                  4       p\3        T4      pY#,           ^,
          pRP5                  TT^,
          T 4      p^ RIHp T! 4       o\:        ;QJ d.    T3R lTP=                  R4       4       F  '       g   K   RM#	  RM! T3R lTP=                  R4       4       4      pRT'       d   TP?                  TT4      MRRTRTP@                  RTT8„  RR/pTR,          '       d$   RT^,            RT R\C        TT4       RT R2	TR&   \E        4       p\3        TR,          4      T8”  d   \G        TTR,          TTT4       TR,          '       d:   TR,          p\I        TR\K        \        T4      4      R7      TR&   TR,          T8g  pMRpT^8X  d�   TR,          '       gr   T'       gj   T'       gb   TPM                  R 4      '       gK   \O        \        T4      T4       \Q        \        T4      T4       \R        PT                  ! T\        T4      4       \V        PX                  ! TRR!7      #   T\        \        P                  P                   3 d°   p\"        P%                  RT RR7       TP&                  P)                  4       pTT9   ;'       g    TT9   ;'       d    TR	8g  pT'       dL   \+        Yø4      '       d;   \        T4      P-                  R
4      '       g   \/        RT  RT RT R24      u Rp?#  Rp?R# Rp?ii ; i)"a  Render an extractable document (.docx/.xlsx/.pdf/...) as paginated text.

Returns the JSON result, a tool_error for an actionable extraction failure
(size cap, encrypted, malformed), or ``None`` to fall through to the normal
read path. Runs BEFORE the binary-extension guard.
)ÚANYDOC_EXTENSIONSÚEXTRACTABLE_EXTENSIONSÚMAX_DOCUMENT_BYTESÚExtractionErrorÚextract_document_bytesÚis_extractable_documentN)Ú	max_byteszDocument bytes unavailableT)Úvalidatez!document extraction failed for %s©Úexc_infoz.ipynbzUnsupported document typeúCannot read 'ú' (u"   ): document extraction failed â€” z8. Use terminal utilities to inspect or convert the file.rO   )Úget_max_line_lengthc              3   ó@   <"  € T F  p\        V4      S8„  x € K  	  R # 5irƒ   )rP   )r  rX   Úmax_line_lengths   & €r9   r  Ú+_read_extracted_document.<locals>.<genexpr>Õ  s   øé € ÐXÑBW¸$œ#˜d›) oÖ5ÓBWùs   ƒFrI   Ú ri   Ú	file_sizer`   Úextracted_documentzUse offset=z to continue reading (showing re   rf   z lines)rg   ©Ú	file_readÚsecret_filerh   ©Úensure_ascii)-Útools.read_extractr$  r%  r&  r'  r(  r)  rK   r	  Úread_file_bytesÚerrorÚbase64_contentÚbase64Ú	b64decoder¯   ÚbinasciiÚErrorrí   ÚdebugÚsuffixÚlowerrB   r�   Ú
tool_errorÚ
splitlinesrP   rT   Útools.tool_output_limitsr0  ÚanyrR   Ú_add_line_numbersr5  ÚminrG   rm   r   r   r@   r'   r2   r   Úrecord_readÚjsonÚdumps)r˜   Ú	_resolvedr]   r"  r·   r$  r%  r&  r'  r(  r)  rv   ÚbinaryÚdocument_bytesÚextracted_textrÐ   Ú_doc_extÚ_binary_docrU   ri   Úend_lineÚ	page_textr0  rh   r\   rJ   ÚrenderedÚredactedr2  s   &&&&&                       @r9   Ú_read_extracted_documentrZ  ¬  sX  ø€ ÷9÷ 9ñ #¤3 y£>×2Ò2ÙÜ˜WÓ%€HðØ×)Ñ)¬#¨i«.ÐDVÐ)ÓWˆØ�<�<ˆ<˜6×0Ñ0Ò8Ù! &§,¡,×"NÐ"NÐ2NÓOÐOÜ×)Ò)¨&×*?Ñ*?È$ÔOˆÙ/°ÄÀIÃÓOˆð  ×%Ñ%Ó'€EÜ�e“*€KØ�~ Õ!€HØ—	‘	˜% ¨¥
¨8Ð4Ó5€IÝ<Ù)Ó+€Oß“cÔXÀ)Ç/Á/ÐRVÔBWÓX—c—c’cÔXÀ)Ç/Á/ÐRVÔBWÓXÓX€OàÇI�8×-Ñ-¨i¸Ô@ÐSUØ�{Ø�V×%Ñ%Ø�[ 8Ñ+Ø˜dð$€Kð �;×Ôà˜( Q�,˜ð (Ø�x˜q¤ X¨{Ó!;Ð <¸DÀÀÈWðVð 	�FÑô $Ó%€IÜ
ˆ;�yÕ!Ó" YÔ.Ü˜;¨°IÕ(>ÀÈÐU^Ô_Ø�9×ÔØ˜yÕ)ˆÜ!6Ø Ü+¬C°	«NÓ;ô"=ˆ�IÑð ˜yÕ)¨XÑ5‰àˆØ�!Œ˜K¨×4Ô4¿Xß#¨K¯O©OÐ<M×,NÒ,Nô 	"¤# i£.°'Ô:Üœs 9›~¨wÔ7Ü×Ò˜w¬¨I«Ô7Ü�:Š:�k°Ô6Ð6øðg œZ¬¯©×)>Ñ)>Ð?ô Ü�‰Ð8¸$ÈˆÔNð ×#Ñ#×)Ñ)Ó+ˆØÐ"3Ñ3÷ Ið IØÐ.Ñ.×GÐG°8¸xÑ3Gð 	çœJ s×<Ò<Ü˜C›×+Ñ+Ð,G×HÒHÜØ ˜v S¨¨
ð 3)Ø),¨ð .2ð2ó3õ 3õ ûðús2   ·AK2 Â;K2 Ë2&OÌA
OÍ#OÍ1AOÎ6OÏOc                óH   € V ^8„  d   QhR\         R\        R\        R\        /# )r5   Ú	task_dataÚ	dedup_keyr˜   r6   )r^   rL   rK   )r8   s   "r9   r:   r:   ö  s(   € ÷ ñ ¤Dð ´Uð Ä#ð Ì#ñ r;   c                ól  € \         ;_uu_ 4        V R,          P                  V^ 4      ^,           pW0R,          V&   \        V 4       RRR4       X^8¼  d)   \        RV^,            R23RVRV^,           /\        R/B # \
        P                  ! RR	R
\        RVRRRR/RR7      #   + '       g   i     Le; i)zŽReturn the "unchanged" stub for a repeated identical read, escalating to a
hard BLOCK after 2 stubs so weak tool-followers don't loop forever.Ú
dedup_hitsNz8BLOCKED: You have called read_file on this exact region uâ    times and the file has NOT changed. STOP calling read_file for this path â€” the content from your earlier read_file result in this conversation is still current. Proceed with your task using the information you already have.r˜   Úalready_readTÚstatusÚ	unchangedÚmessageÚdedupÚcontent_returnedFr:  )r-   r@   r    rG  r   rN  rO  r   )r\  r]  r˜   Úhitss   &&& r9   Ú_dedup_stub_or_blockrg  ö  sÕ   € ÷ 
Ö	Ø˜Õ&×*Ñ*¨9°aÓ8¸1Õ<ˆØ-1�,Õ 	Ñ*Ü˜yÔ)÷ 
ð
 ˆq„yÜðØ  1�H˜:ð &0ð0ñ-ð ð-ð  �ð-ô % dÐ+ñ-ð 	-ô �:Š:Ø�+ØÔ-Ø�Ø�Ø˜Eðð ôð ÷+ 
×	ús   �7B#Â#B3	rY  FrV  ri   Úversion_beforeÚsnapshotc                óª   € V ^8„  d   QhR\         R\        R\        R\        R\        R\        R\        R\        R	\        R
\        R,          R\        /# )r5   r\  r·   r˜   Úresolved_strr]   r"  r]  ÚpartialrY  rV  Nr6   )r^   rK   r7   rL   rM   )r8   s   "r9   r:   r:     sv   € ÷ Dñ D¤tð D´cð DÄð DÔTWð DÜ$'ðDÜ03ðDÜ@EðDÜSWðDä&*ðDä>AÀD½jðDô VYñDr;   c               ój  € Ve   T;'       g    \        V4      MRpVRJ;'       d#    VRR Tu;8H  ;'       d    \        V4      8H  Mu pRp\        ;_uu_ 4        V R,          P                  VR4       V R,          P	                  V4       V R,          P	                  W$V34       \        V RW$V34      p \        P                  P                  V4      pVV P                  R/ 4      V&   V R,          pV'       d–   Ve’   V^8  d‹   W°R	,          V&   VP                  V4      V8H  pV'       g5   V'       * pV'       d   V	e   \        WWÔWšV4      w  røT;'       d    V'       * pV'       d(   VVV&   V P                  R
/ 4      P                  VR4       V'       g   VP                  VR4       V'       d   V^8¼  d2   V R	,          P                  VR4       V R,          P                  V4       \        V 4       RRR4        \        P                   ! WV'       * R7       V'       d    ^ RIHp V! \-        V4      4       X# X#   \         d     ELci ; i  + '       g   i     Ld; i  \"         d    \$        P'                  RRR7        Lmi ; i  \"         d    \$        P'                  RRR7        X# i ; i)uÐ  Bookkeeping after a real (non-stub) read; returns the consecutive-read count.

Per-task tracker under the lock (stub counter, history, consecutive count,
mtime for dedup + staleness, page coverage, and the write_file baseline once
the task has seen every line UNREDACTED â€” in one page or by paging
contiguously through a file too big for one; a redacted page returned a
non-round-trippable ``Â«redacted:â€¦Â»`` sentinel, so it must not bless an
overwrite that would persist the sentinel into a credential file). Then
OUTSIDE our lock (no nested locking): the cross-agent registry, and the
background-review read-mark (a FULL read of a skill file counts like
skill_view so a follow-up skill_manage(patch) is accepted).
NFr_  Údedup_generation_readsÚread_historyÚreadÚread_timestampsÚfull_write_baselinesrd  Úblind_patches)rl  zfile_state.record_read failedTr,  )Ú!mark_background_review_skill_readz"background-review read-mark failedéÿÿÿÿ)r&   r%   r-   r  r­   r   rš   r˜   Úgetmtimer  r«   r@   r)   Údiscardr    r   rM  rA   rí   rD  Útools.skill_manager_guardsrt  r   )r\  r·   r˜   rk  r]   r"  r]  rl  rY  rV  ri   rh  ri  ÚversionÚstableÚcompleterQ   Ú
_mtime_nowÚ	baselinesrt  s   &&&&&&&$$$$$$       r9   Ú_record_successful_readr~    sw  € ð  <JÒ;Uˆx×6Ð6œ=¨Ó6øÐ[_€GØ˜DÐ ×cÐc W¨S¨b \°^×%cÔ%cÄ~ÐVbÓGcÔ%c€FØ€Hß	Ö	Ø�,Õ×#Ñ# I¨tÔ4ØÐ*Õ+×/Ñ/°	Ô:Ø�.Õ!×%Ñ% t°UÐ&;Ô<Ü! )¨f°dÀEÐ-JÓKˆð	ÜŸ™×)Ñ)¨,Ó7ˆJØHRˆI× Ñ Ð!2°BÓ7¸ÑEð Ð4Õ5ˆ	ß�gÒ)¨e°a¬iØ,:�gÕ˜yÑ)ð !—}‘} \Ó2°gÑ=ˆHßØ&œ;�ß˜xÒ3Ü)<Ø!°À(ÐYaó*cÑ&�Hà#×4Ð4¨H¬�ßØ*1�	˜,Ñ'Ø×$Ñ$ _°bÓ9×=Ñ=¸lÈDÔQßØ�M‰M˜,¨Ô-ß˜ !œØ�gÕ×"Ñ" 9¨dÔ3ØÐ.Õ/×7Ñ7¸	ÔBÜ˜yÔ)÷= 
ð@EÜ×Ò˜wÀ(¼lÕK÷ ð
	Nõ UÙ-¬d°<Ó.@ÔAð €Lˆ5€LøôS ô 	Úð	ú÷ 
×	ûôD ô EÜ�‰Ð4¸tˆÖDðEûô ô 	NÜ�L‰LÐ=ÈˆLÕMØ€Lð	Nús{   ÁAIÂ64H?Ã*IÃ;A IÄ<IÅIÅ).IÆIÆ2AIÇ>I$ È$J È?IÉ
IÉIÉIÉI!	É$"J	ÊJ	Ê"J2Ê1J2c          
      óT   € V ^8„  d   QhR\         R\        R\        R\         R\         /# )r5   r˜   r]   r"  r·   r6   r¿   )r8   s   "r9   r:   r:   ^  s8   € ÷ X"ñ X"œð X"¤cð X"´cð X"ÔY\ð X"Ômpñ X"r;   c                ó®  €  \        W4      w  r\        V RR7      pV'       d   \        V4      # \        V 4      P	                  4       P                  4       '       d   RM
\        V4      p\        WR7      '       d   \        RV  R24      # \        W4      p\        \        V4      4      '       d1   \        V4      pVe"   \        P                  ! RRR	R
V  RV R2/4      # \        \        V4      4      pV'       d   \        V4      # \!        WWV4      p	V	e   V	# \#        \        V4      4      '       d+   \        RV  RVP$                  P'                  4        R24      # \        V4      p
\)        RW£4      pVe   V# W¡V3p\*        ;_uu_ 4        \-        V4      pVR,          P/                  V4      pWÍR,          9   pRRR4       \        V4      p\        V4      '       d   \1        V
4      MRpXe,   \3        4       '       g   VV8X  d   X'       d   \5        XWÀ4      # TP7                  \        V4      '       d   T
MT W4      pVP9                  4       pVP/                  R4      ;'       g    Rp\;        V\        4      '       dX   VP=                  R4      '       dA   ^ RIH p VPC                  V! V 4      4       \E        RW£\        P                  ! VRR7      4       V'       g   VP/                  R4      '       d   \        P                  ! VRR7      # VP/                  R^ 4      p\G        4       p\I        VPJ                  ;'       g    R4      V8”  d9   \M        TVPJ                  ;'       g    RVVP/                  RR4      V4      Vn%        RpVPJ                  '       dG   VPJ                  p\O        VR\Q        V
4      R7      Vn%        VPJ                  V8g  pVPJ                  VR&   VPJ                  '       d+   \S        VPJ                  4      pV'       d   VVR&   V R 2VR!&   V'       dA   V\T        8”  d6   V^È8”  d/   VP/                  R"4      '       d   VPW                  R!R#VR$ R%24       VP/                  R4      pVP/                  R&4      R'8X  d$   \Y        VP/                  R(V4      4      ^,
          pM8W,           ^,
          p\;        V\X        4      '       d   V^ 8”  d   \[        VV4      p\]        XY0Y¡TYÁ^8„  ;'       g    \_        VP/                  R"4      4      T;'       g    \_        VP/                  R)4      4      VVV\a        VR*R4      R+7      pV^8¼  d   \        R,V R-23R.V R/V/\b        R/B # V^8¼  d
   R0V R12VR2&   \        P                  ! VRR7      #   + '       g   i     ELå; i  \d         d   p\        \        T4      4      u Rp?# Rp?ii ; i)3uL  Read a file with pagination and line numbers.

Guard order: NT/device-namespace prefix (raw string, no resolution) â†’
device-path blocklist (no I/O) â†’ stat-based special-file guard (host only)
â†’ Hermes internal denylist â†’ document extraction â†’ binary-extension guard
â†’ negative-result cache â†’ dedup stub â†’ real read.
ÚRead©ÚverbN)r¤   r.  zE': this is a device file that would block or produce infinite output.ÚsuccessFÚnoteÚ'z' is u�   , not a regular file â€” reading it would block indefinitely, so no read was attempted. Use terminal utilities if you need to interact with it.zCannot read binary file 'r/  zF). Use vision_analyze for images, or terminal to inspect binary files.rp  rd  rn  r>  r4  zFile not found:)Úexpired_archive_fieldsr:  Ú	is_binaryr5  ri   ÚunknownTr7  rI   Úconflict_blocksz¬ unresolved git merge-conflict block(s) (<<<<<<< / ======= / >>>>>>>) in this range. Resolve them (keep one side or combine, delete the markers) before editing around them.Ú_hintr`   zThis file is large (rd   zj bytes). Consider reading only the section you need with offset and limit to keep context usage efficient.rb   ra   rc   rh   Ú	_snapshot)rl  rY  rV  ri   rh  ri  z.BLOCKED: You have read this exact file region z| times in a row. The content has NOT changed. You already have this information. STOP re-reading and proceed with your task.r˜   r`  z%You have read this exact file region z¾ times consecutively. The content has not changed since your last read. Use the information you already have. If you are stuck in a loop, stop reading and proceed with writing or responding.Ú_warning)3r
   r   rG  r   Ú
expanduserÚis_absoluter   rµ   r   rw   r	  r   rN  rO  r   rK   rZ  r   rE  rF  r#   r-   r1   r@   r%   r   rg  Ú	read_fileÚto_dictrB   r�   Útools.tool_result_storager‡  Úupdater.   rG   rP   rI   rm   r   r   r   Ú_LARGE_FILE_HINT_BYTESr  r7   rL  r~  rM   rs   r   rA   )r˜   r]   r"  r·   Únt_errÚdevice_baserP  ÚkindÚblock_errorÚ	extractedrk  Úcached_not_foundr]  r\  Úcached_versionÚcontent_served_in_generationrv   rh  rË   r\   Ú_errr‡  r5  rJ   rY  Ú
unredactedÚ	conflictsri   rV  rQ   Úes   &&&&                           r9   Úread_file_toolr¡  ^  s�  € ðP"Ü1°&Ó@‰ˆô (¨°6Ô:ˆßÜ˜fÓ%Ð%ä" 4›j×3Ñ3Ó5×AÑA×CÒC‘dÔIZÐ[bÓIcˆÜ˜d×9Ó9ÜØ ˜vð &4ð 4ó5ð 5ô +¨4Ó9ˆ	ô %¤]°7Ó%;×<Ò<Ü% iÓ0ˆDØÒÜ—z’zØ˜uØØ˜D˜6  t fð -,ð ,ð#.ó /ð /ô +¬3¨y«>Ó:ˆßÜ˜kÓ*Ð*ä,¨T¸fÈWÓUˆ	ØÒ ØÐô  ¤ I£×/Ò/ÜØ+¨D¨6°°Y×5EÑ5E×5KÑ5KÓ5MÐ4Nð OVð VóWð Wô ˜9“~ˆÜ1°&¸,ÓPÐØÒ'Ø#Ð#ð "¨5Ð1ˆ	ßÖÜ" 7Ó+ˆIØ& wÕ/×3Ñ3°IÓ>ˆNð ,5ÐBZÕ8[Ñ+[Ð(÷  ô ! Ó)ˆÜ9RÐS[×9\Ò9\œ¨Ô5ÐbfˆØÒ&Ô/C×/EÒ/EØ" nÔ4×9UÜ'¨	°9ÓCÐCà×#Ñ#Ô4MÈh×4WÒ4W¡LÐ]aÐciÓqˆØ—n‘nÓ&ˆð �‰˜wÓ'×-Ð-¨2ˆÜ�dœC× Ò  T§_¡_Ð5F×%GÒ%GÝHØ×ÑÑ5°dÓ;Ô<Ü˜f l¼T¿ZºZÈÐbgÔ=hÔiß�;—?‘? ;×/Ò/Ü—:’:˜k¸Ô>Ð>ð
  —O‘O K°Ó3ˆ	Ü'Ó)ˆ	Üˆv�~‰~×#Ð# Ó$ yÔ0Ü/Ø˜VŸ^™^×1Ð1¨r°6Ø—‘ ¨yÓ9¸9óFˆFŒNð ˆØ�>�>ˆ>ØŸ™ˆJÜ2Ø dÔ8KÈLÓ8Yô[ˆFŒNà—~‘~¨Ñ3ˆHØ%+§^¡^ˆK˜	Ñ"à�>�>ˆ>Ü-¨f¯n©nÓ=ˆIßØ1:�Ð-Ñ.à �kð "uð uð ˜GÑ$÷ ˜)Ô&<Ô<Ø˜C”K K§O¡O°K×$@Ò$@Ø×"Ñ" 7Ø& y° mð 43ð 3ô5ð
 "—o‘o mÓ4ˆØ�?‰?˜>Ó*¨gÔ5Ü˜;Ÿ?™?¨=¸&ÓAÓBÀQÕF‰Hà•~¨Õ)ˆHÜ˜+¤s×+Ò+°¸a´Ü˜x¨Ó5�Ü'¨	°7À,ÐX]Ø(1ÀQ¹J×;mÐ;mÌ4ÐP[×P_ÑP_Ð`kÓPlÓKmØ19×1eÐ1e¼TÀ+Ç/Á/ÐRcÓBdÓ=eØ19À{Ø7EÜ18¸ÀÈdÓ1SôUˆð �AŒ:ÜØ@ÀÀð H>ð >ñ1ð ð	1ð
 #ð1ô )¨$Ð/ñ1ð 1ð �AŒ:à7¸°wð ?cð cð ˜
Ñ#ô �zŠz˜+°EÔ:Ð:÷i  ×Ðûôj ô "Üœ#˜a›&Ó!Õ!ûð"úsÁ   ‚,V+ ¯AV+ Â
AV+ Ã&V+ ÄV+ ÄAV+ ÅV+ Å:V+ Æ/VÆ;AV+ ÈV+ ÈAV+ É(/V+ ÊAV+ Ë V+ Ë7V+ Ì3V+ Í$V+ Í(2V+ ÎAV+ Ï31V+ Ð%(V+ ÑCV+ ÔAV+ Õ/'V+ ÖV(	Ö"	V+ Ö+WÖ6W×	W×Wr   c          	      óV   € V ^8„  d   QhR\         R\         R\        R\         R,          /# )r5   r£   r·   r   r6   Nr€   )r8   s   "r9   r:   r:   û  s-   € ÷ ñ œsð ¬Sð ¼Dð ÌSÐSWÍZñ r;   c               ón   €  \        V'       d   \        M\        ! W4      4      #   \         d     R# i ; i)z—Task-resolved path string, or None when resolution fails for any reason.
``entry``: keep a symlink in the last component (``_resolve_entry_for_task``).N)rK   r   r   rA   )r£   r·   r   s   &&$r9   Ú_resolve_or_noner¤  û  s3   € ðÜ¯uÕ+Ô:PÐPÐRZÓdÓeÐeøÜô Úðús   ‚"% ¥4³4c                óŽ   € V ^8„  d   QhR\         \        ,          R\         \        ,          R\        R\        R\        R,          /# )r5   ÚpathsÚcontent_pathsr·   Úcross_profiler6   N)ÚlistrK   rM   )r8   s   "r9   r:   r:     s=   € ÷ ?ñ ?¤¤c¥ð ?¼4Ä½9ð ?Ìsð ?Ü)-ð?Ü25¸µ*ñ?r;   c                óø   € V  F7  p\        WB4      ;'       g    V'       d   RM
\        WB4      pV'       g   K5  Vu # 	  V F  p\        WB4      pV'       g   K  Vu # 	  \        W4      ;'       g    \	        W4      # )a
  Run the shared write/patch guards in order; return the first error string.

Order matters: hard denies (sensitive path, mirror) and the corruption
guard run before anything that could prompt the user, and ONE approval
prompt covers every path of a multi-file patch.
N)r   r   r   r   r   )r¦  r§  r·   r¨  ÚpÚerrs   &&&&  r9   Ú_write_precheck_errorr­    s   € ó ˆÜ# AÓ/÷ Nð Nß!‰DÔ'@ÀÓ'Lð 	ç‰3ØŠJñ	 ó
 ˆÜ*¨1Ó6ˆß‰3ØŠJñ ô /¨uÓ>÷ >ð >Ü-¨eÓ=ð?r;   c          	      ót   € V ^8„  d   QhR\         \        ,          R\        R\        R\         \        ,          /# )r5   r¦  rz   r·   r6   )r©  rK   r^   )r8   s   "r9   r:   r:     s1   € ÷ ñ œ$œs�)ð ´tð Äcð ÌdÔSVÍiñ r;   c                ó&  € . pV  Fˆ  pVP                  V4      pV'       d   \        P                  ! W%4      MR;'       g    \        WB4      pV'       g   V'       d   \	        V\        V4      V4      pV'       g   Kw  VP                  V4       KŠ  	  V# )uÞ   One pre-edit warning per path, in priority order: cross-agent registry
(names the sibling subagent) > per-task staleness > workspace divergence
(relative path resolving outside the terminal's cwd â€” the worktree-cwd bug).N)r@   r   Úcheck_staler"   r   r   rS   )r¦  rz   r·   Úwarningsr«  ÚrÚws   &&&    r9   Ú_edit_warningsr´    su   € ð €HÛˆØ× Ñ  Ó#ˆß34ŒZ×#Ò# GÔ/¸$×dÐdÔCXÐYZÓCdˆß—QÜ(¨¬D°«G°WÓ=ˆAß‰1Ø�O‰O˜AÖñ ð €Or;   c          
      óp   € V ^8„  d   QhR\         R\        \         ,          R\        R\         R,          RR/# )r5   r·   r¦  rz   Ú
session_idNr6   )rK   r©  r^   )r8   s   "r9   r:   r:   (  sB   € ÷ @ñ @œ#ð @¤d¬3¥ið @Ä4ð @ÔUXÐ[_ÕU_ð @Ðdhñ @r;   c           	     ó  € \        Y Uu. uF  qBP                  V4      ;'       g    TNK  	  upVR7       V FD  p\        W@4       VP                  V4      '       g   K'  \        P                  ! WV,          4       KF  	  R# u upi )z•Post-success bookkeeping: verification-stale marker, then per path refresh
the read stamp (no false staleness on the next edit) and record the write.)r¶  N)r(   r@   r2   r   Ú
note_write)r·   r¦  rz   r¶  r«  s   &&&& r9   Ú_note_editedr¹  (  sp   € ô ˜WÈUÓ&SÉUÈ×';Ñ';¸AÓ'>×'CÐ'CÀ!Ò'CÉUÑ&SÐ`jÕkÛˆÜ˜qÔ*Ø×Ñ ×"Ô"Ü×!Ò! '¸AÕ+>Ö?ó ùò 'Ts
   ŠB
¦B
i N  gš™™™™™é?i€ c          	      ód   € V ^8„  d   QhR\         R\         R,          R\         R\         R,          /# )r5   r·   r´   NÚnew_contentr6   r¸   )r8   s   "r9   r:   r:   >  s3   € ÷ ñ ¤cð ´S¸4µZð Ìcð ÔVYÐ\`ÕV`ñ r;   c                ó*  € V'       d%   \         \        V4      u;8:  d   \        8:  g    R#  R#  \        V 4      P	                  V4      p\        VRR4      p\        VRR4      '       g   \        V\        4      '       g   R#  \         \        T4      u;8:  d   \        8:  g    R#  R# TP                  4       TP                  4       reT'       g   R# ^ RI
Hp \        T! T4      T! T4      ,          P                  4       4      pT\        \        T4      \        T4      4      ,          p	T	\        8  d   R# \        \        T4      \        T4      4      T,
          p
TR R\        T4      R RT	R R	T
R R
\        T4      R R2
#   \         d     R# i ; i)aÉ  Return a hint when ``new_content`` mostly re-sends what is already at ``resolved``.

Reads the OLD content through the task's own file ops (``read_file_raw``, the sandbox/remote
backend the write targets), never the host path: on a remote backend the host file is a
different file, and a host FIFO at that path would block the write lock forever. Bounded size
and a line multiset comparison (linear) instead of a sequence diff (quadratic on repeated lines).NrI   r>  )ÚCounterrd   rf   z lines were already on disk (z.0%z unchanged); ~z( line(s) actually changed. Re-sending a z”-char file costs output tokens for every unchanged line; for edits like this use patch (old_string/new_string), which sends only the changed region.)Ú_REWRITE_HINT_MIN_CHARSrP   Ú_REWRITE_HINT_MAX_CHARSr	  Úread_file_rawrs   rB   rK   rA   rH  Úcollectionsr½  ÚsumÚvaluesÚmaxÚ_REWRITE_HINT_MIN_UNCHANGED)r·   r´   r»  rË   ÚoldÚ	old_linesÚ	new_linesr½  rb  ÚratioÚchangeds   &&&        r9   Ú_whole_file_rewrite_hintrË  >  su  € ÷ Ô3´s¸;Ó7GÖbÔKbÕbÙð cÙðÜ˜wÓ'×5Ñ5°hÓ?ˆÜ�f˜i¨Ó.ˆÜ�6˜7 D×)Ò)´¸CÄ×1EÒ1EÙð 2Fô $¤s¨3£xÖJÔ3JÕJÙð KÙØŸ>™>Ó+¨[×-CÑ-CÓ-EˆyßÙÝ#Ü‘W˜YÓ'©'°)Ó*<Õ<×DÑDÓFÓG€IØœœC 	›N¬C°	«NÓ;Õ;€EØÔ*Ô*ÙÜ”#�i“.¤# i£.Ó1°IÕ=€Gà�Qˆ-�tœC 	›N¨1Ð-Ð-JÈ5ÐQTÈ+ÐUcÐdkÐlmÐcnð o2Ü25°kÓ2BÀ1Ð1Eð Fvð	vðøô ô Úðús   °AF ÆFÆFc                ón   € V ^8„  d   QhR\         R\         R\         R\        R\         R,          R\         /# )r5   r˜   rI   r·   r¨  r¶  Nr6   r€   )r8   s   "r9   r:   r:   `  sE   € ÷ @"ñ @"œ#ð @"¬ð @"´cð @"Ü#'ð@"ä # d¥
ð@"ä69ñ@"r;   c                ó   € \        W4      ;'       gS    \        W4      ;'       g@    \        V .V4      ;'       g+    \        V .V4      ;'       g    V'       d   RM
\	        W4      pV'       g   \        V4      '       d   RpV'       d   \        V4      #  \        W4      pW/p\        4       ;_uu_ 4       pV'       d&   VP                  \        P                  ! V4      4       \        WV4      p	V	'       d-   \        P                  ! \        W	V4      RR7      uuRRR4       # \!        V .Wr4      p
\#        W&V4      p\%        V4      P'                  T;'       g    T V4      pVP)                  4       pV
'       d   V
^ ,          VR&   V'       d   VP+                  R4      '       g   W½R&   V'       d   WmR&   VP+                  R4      '       d   \-        W4       M2V'       d   V.VR	&   \/        Wb\1        VR
R4      4       \3        W .Wt4       RRR4       \        P                  ! XRR7      #   + '       g   i     L(; i  \4         d‡   p\7        T4      '       d,   \8        P;                  R\=        T4      P>                  T4       M,\8        PA                  R\=        T4      P>                  TRR7       \        \C        T4      4      u Rp?# Rp?ii ; i)uâ   Write content to a file.

``cross_profile`` bypasses the sandbox-mirror lost-write guards only
(unadvertised in the schema; the mirror rejection error teaches it â€” the
cross-PROFILE guard it was named for no longer exists).
Nz¡Refusing to write internal read_file display text as file content. Strip read_file line-number prefixes or reconstruct the intended file contents before writing.Fr:  r�  r>  rg   Úresolved_pathÚfiles_modifiedÚ_content_sha256z"write_file expected denial: %s: %szwrite_file error: %s: %sTr,  )"r   r   r   r   r   r   rG  r¤  r   Úenter_contextr   Ú	lock_pathr   rN  rO  r   r´  rË  r	  Ú
write_filer‘  r@   r2   r'   rs   r¹  rA   rÕ   rí   rD  ÚtypeÚ__name__r>  rK   )r˜   rI   r·   r¨  r¶  r¬  rP  rz   Ú_lockÚblockerr±  Úrewrite_hintrË   r\   r   s   &&&&&          r9   Úwrite_file_toolrÙ  `  s\  € ô ! Ó/÷ Tð TÜ*¨4Ó9÷Tð Tä0°$°¸ÓA÷Tð Tô -¨d¨V°WÓ=÷Tð T÷ %‰tÔ*CÀDÓ*Rð	 ÷
 Ô1°'×:Ò:ð/ˆ÷ Ü˜#‹Ðð+"ô % TÓ3ˆ	Ø Ð,ÐÜ�[Œ[˜Eßð ×#Ñ#¤J×$8Ò$8¸Ó$CÔDô /¨tÀÓHˆGßÜ—z’zÔ"6°tÀiÓ"PÐ_dÔe÷ Š[ô & t fÐ.>ÓHˆHÜ3°GÈÓPˆLÜ" 7Ó+×6Ñ6°y×7HÐ7HÀDÈ'ÓRˆFØ Ÿ.™.Ó*ˆKßØ*2°1­+�˜JÑ'ß K§O¡O°G×$<Ò$<Ø&2˜FÑ#ßð 09˜OÑ,Ø�‰˜w×'Ò'Ü& tÕ5çØ5>°K�KÐ 0Ñ1ô .¨iÄ'È&ÐRcÐeiÓBjÔkÜ˜W fÐ.>ÔK÷? ô@ �zŠz˜+°EÔ:Ð:÷A �[ûôB ô "Ü'¨×*Ò*Ü�L‰LÐ=¼tÀA»w×?OÑ?OÐQRÕSä�L‰LÐ3´T¸!³W×5EÑ5EÀqÐSWˆLÔXÜœ#˜a›&Ó!Õ!ûð"úsi   Â H< Â5A#H)Ä
H< Ä#AH)Å9H)ÆH)Æ$H)Æ0H)ÇH)Ç*H)È	H< È)H9	È4H< È<KÉA;KËKËKc                ó´   € V ^8„  d   QhR\         R\        \        \         ,          \        \         ,          \        \         ,          3,          \         ,          /# )r5   ry   r6   )rK   rL   r©  )r8   s   "r9   r:   r:   £  s8   € ÷ -ñ -¤Sð -¬U´4¼µ9¼dÄ3½iÌÌcÍÐ3RÕ-SÔVYÕ-Yñ -r;   c           	     ó@  € ^ RI Hp \        P                  V 4       Uu. uF'  q"P	                  ^4      VP	                  ^4      R9   3NK)  	  ppT\
        P                  V 4       UUu. uF.  q"P	                  ^4      VP	                  ^4      3 F  qDR3NK  	  K0  	  upp,          p. p. p. pV Fa  w  r‰VP                  4       p
V! V
4      '       d   \        RV
: R24      u # VP                  V
4       V	'       d   TMTP                  V
4       Kc  	  WVV3# u upi u uppi )a²  Extract every path named in V4A headers, rejecting ``..`` traversal.

Returns ``(all_paths, content_write_paths, entry_paths)`` or a tool_error
string. Header paths come from patch CONTENT (more attacker-influenceable
than ``path=``, which keeps its legitimate ``..`` use). Move headers check
BOTH endpoints; only Update/Add write text and feed the binary-document
guard; Delete and Move act on the directory entry (``entry_paths``).
)Úhas_traversal_componentFz*V4A patch header contains '..' traversal: zš. Use the agent's cwd-relative path (no '..') or an absolute path in '*** Update File:' / '*** Add File:' / '*** Delete File:' / '*** Move File:' headers.)ÚUpdateÚAdd)	Útools.path_securityrÜ  r’   ÚfinditerrŒ   r”   r„   rG  rS   )ry   rÜ  rŽ   ÚheadersÚgr¦  r§  Úentry_pathsr~   Úwrites_textÚv4a_paths   &          r9   Ú_collect_v4a_header_pathsræ  £  s  € õ <äF[×FdÑFdÐejÔFkÓlÑFkÀ—‘˜“
˜AŸG™G A›JÐ*;Ñ;Ó<ÑFk€GÐlØÔ$7×$@Ñ$@ÀÔ$GÔjÑ$G˜q×RYÑRYÐZ[ÓR\Ð^_×^eÑ^eÐfgÓ^hÓQiÈA�E“
ÑQi‘
Ñ$GÒjÕj€GØ€EØ!€MØ€KÛ#ÑˆØ—9‘9“;ˆÙ" 8×,Ò,ÜØ<¸X¹Lð IAð AóBò Bð
 	�‰�XÔß%‰¨;×>Ñ>¸xÖHñ $ð  Ð,Ð,ùò mùÛjs   ž-DÁ&4DÚreplacec                óÖ   € V ^8„  d   QhR\         R\         R,          R\         R,          R\         R,          R\        R\         R,          R\         R	\        R
\         R,          R\         /
# )r5   r  r˜   NÚ
old_stringÚ
new_stringÚreplace_allry   r·   r¨  r¶  r6   r€   )r8   s   "r9   r:   r:   À  s€   € ÷ ["ñ ["”Sð ["¬C°$­Jð ["Ì3ÐQUÍ:ð ["Ü �:ð["Ü;?ð["ÜPSÐVZÕPZð["äð["ä8<ð["ô  �:ð["ô 25ñ["r;   c	                ó¦  € V'       d   V.M. p	\        V	4      p
. pV R8X  dS   V'       dK   \        V4      p\        V\        4      '       d   V# Wœ^ ,          ,          p	W¬^,          ,          p
V^,          p\	        WšWg4      pV'       d   \        V4      #  V	 Uu/ uF  qî\        Wæ4      bK  	  ppV Uu/ uF  qî\        WæRR7      bK  	  pp\        4       ;_uu_ 4       p\        . VP                  4       OVP                  4       O Uu0 uF  pV'       g   K  VkK  	  up4       F(  pVP                  \        P                  ! V4      4       K*  	  \        WŸV4      p\        V4      p\        VP                  4       V4      pV R8X  dj   V'       g   \        R4      uuRRR4       # Ve   Vf   \        R4      uuRRR4       # VP!                  V4      ;'       g    TpVP#                  VW#V4      pMYV R8X  d;   V'       g   \        R4      uuRRR4       # VP%                  \'        W_VV4      4      pM\        R	V  24      uuRRR4       # VP)                  4       pV'       d   R
P+                  V4      VR&   VP!                  R4      '       g½   V	 Uu. uF7  pVP!                  V4      ;'       g    VP!                  V4      ;'       g    TNK9  	  ppVVR&   \-        V4      ^8X  d   V^ ,          VR&   \/        WiWø4       \1        VV\3        VRR4      V4       \5        YoP                  4        Uu. uF  pV'       g   K  VNK  	  up4       RRR4       XP!                  R4      '       d~   R\        VR,          4      9   dg   ^ pV R8X  d-   V'       d%   \7        YoP!                  V4      ;'       g    T4      pV^8¼  d   RV RV: R2VR&   MR\        VR,          4      9  d   RVR&   \8        P:                  ! VRR7      # u upi u upi u upi u upi u upi   + '       g   i     LÕ; i  \<         d   p\        \        T4      4      u Rp?# Rp?ii ; i)z›Patch a file using replace mode or V4A patch format.

``cross_profile``: same semantics as ``write_file``'s flag (mirror-guard
bypass only; unadvertised).
ry   TrŠ   rç  zpath requiredNz"old_string and new_string requiredzpatch content requiredzUnknown mode: z | r�  r>  rÏ  rÎ  Ú_writeszCould not findzThis is failure #z
 patching a,  . Stop retrying with variations of the same old_string. Either: (1) re-read the file fresh to verify current content, (2) use a longer / more unique old_string with surrounding context lines, or (3) re-read the file in full, then use write_file to replace it if the targeted region is hard to anchor.r‹  z#Did you mean one of these sections?zfold_string not found. Use read_file to verify the current content, or search_files to locate the text.Fr:  r  )r©  ræ  rB   rK   r­  rG  r¤  r   ÚsortedrÃ  rÑ  r   rÒ  r´  r	  r$   r@   Úpatch_replaceÚ	patch_v4ar•   r‘  rT   rP   r¹  r!   rs   r0   r/   rN  rO  rA   )r  r˜   ré  rê  rë  ry   r·   r¨  r¶  Ú_paths_to_checkÚ_content_write_pathsÚ_entry_pathsÚ	collectedÚprecheck_errÚ_pÚ_path_to_resolvedÚ_path_to_entryÚ_locksÚ_rÚstale_warningsrv   Ú_knownÚ_replace_targetrË   r\   Ú_resolved_modifiedÚfailure_countr   s   &&&&&&&&&                   r9   Ú
patch_toolr   À  s  € ÷ !%�t‘f¨"€OÜ Ó0ÐØ €LØˆw„Ÿ5Ü-¨eÓ4ˆ	Ü�i¤×%Ò%ØÐØ Q�<Õ'ˆØ¨!¥Õ,ÐØ  •|ˆÜ(¨ÐPWÓg€LßÜ˜,Ó'Ð'ðE"ñ ZiÓ,iÑYhÐSUÔ1AÀ"Ó1NÒ-NÑYhÐÐ,iÙbnÓ)oÑbnÐ\^Ô.>¸rÐRVÔ.WÒ*WÑbnˆÐ)oÜ�[Œ[˜FÜÐ+bÐ->×-EÑ-EÓ-GÐ+bÈ.×J_ÑJ_ÓJaÑ+bÓiÑ+b RÔfhŸb˜bÑ+bÑiÖj�Ø×$Ñ$¤Z×%9Ò%9¸"Ó%=Ö>ñ kä+¨OÐPWÓXˆNÜ$ WÓ-ˆHô 0Ð0A×0HÑ0HÓ0JÈGÓTˆFð �yÔ ßÜ% oÓ6÷ Š[ð Ò%¨Ò);Ü%Ð&JÓK÷ Š[ð  #4×"7Ñ"7¸Ó"=×"EÐ"EÀ�Ø!×/Ñ/°ÀÐYdÓe‘Ø˜”ßÜ%Ð&>Ó?÷) Š[ð* "×+Ñ+Ü5°eÐP^Ð`hÓiók‘ô " N°4°&Ð"9Ó:÷1 Š[ð4 !Ÿ.™.Ó*ˆKßØ*/¯*©*°^Ó*D�˜JÑ'Ø—?‘? 7×+Ò+ñ 1@ó&AÙ0?¨"ð '5×&8Ñ&8¸Ó&<×&_Ð&_Ð@Q×@UÑ@UÐVXÓ@Y×&_Ð&_Ð]_Ò&_Ù0?ð #ð &Aà0B�Ð,Ñ-ÜÐ)Ó*¨aÔ/Ø3EÀaÕ3H�K Ñ0Ü˜WÐ7HÔUÜ+¨G°V¼WÀVÈYÐXZÓ=[Ð]nÔoä% g×=UÑ=UÔ=WÓ/^Ñ=W°rÔ[]·°Ñ=WÑ/^Ô_÷Q ðX �?‰?˜7×#Ò#Ð(8¼CÀÈGÕ@TÓ<UÔ(UØˆMØ�yÔ §TÜ 5°g×?TÑ?TÐUYÓ?Z×?bÐ?bÐ^bÓ c�Ø Ô!à'¨ °jÀÁð I0ð 0ð ˜GÒ$ð 7¼cÀ+ÈgÕBVÓ>WÔWðCð ˜GÑ$ô �zŠz˜+°EÔ:Ð:ùò -jùÚ)oùâiùò>&Aùò 0_÷Q �[ûô| ô "Üœ#˜a›&Ó!Õ!ûð"úsù   ÂP' ÂO;Â,P' Â2P ÃP' Ã*PÄ
PÄPÄA2PÆ
PÆ
P' Æ#PÆ5
P' Ç PÇ%PÇ>
PÈ
P' È*PÈ=
P' ÉPÉ *PÊPÊP
Ê,P
ËP
ËAPÌ+
PÌ:PÍ PÍP' Í&'P' ÎP' Î+AP' Ï;
P' ÐPÐP$	ÐP' Ð'QÐ2QÑQÑQrI   Ú.Ú	discoveryc                óª   € V ^8„  d   QhR\         R\         R\         R\         R,          R\        R\        R\         R	\        R
\         R\         R\         /# )r5   Úpatternr³   r˜   Ú	file_globNr"  r]   Úoutput_modeÚcontextÚorderr·   r6   r¿   )r8   s   "r9   r:   r:     sx   € ÷ U"ñ U"œð U"¤cð U"¼Sð U"Ü �:ðU"Ü58ðU"ÜGJðU"ä ðU"ä7:ðU"ô ðU"ô ð	U"ô .1ñ	U"r;   c
                óð  €  \        WT4      w  rTRY\        V4      T;'       g    RWEV3p
\        ;_uu_ 4        \        P                  ! V	RRR^ R\        4       /4      p\        Wº4      pRRR4       X^8¼  d   \        RV R23R	V R
V/\        R/B # \        VRR7      pV'       d   \        V4      #  \        \        W)4      4      p\        V4      pV'       d   \        V4      # \!        RWé4      pVe   V# \#        V	4      P%                  WWWEWgVR7	      p\'        VV	4      p\)        VRR4      ;'       g    R  FR  p\)        VRR4      '       g   K  \+        VP,                  R\/        \1        VP2                  V	4      4      R7      Vn        KT  	  VP5                  RR7      pV'       d	   V R2VR&   VP7                  R4      ;'       g    Rp\        V\        4      '       d;   VP9                  R4      '       d$   \;        RWé\<        P>                  ! VRR7      4       V^8¼  d
   RV R2VR&   VP7                  R4      '       d   RWT,            R2VR&   \<        P>                  ! VRR7      #   + '       g   i     EL
; i  \        \        \        3 d6   pTp\        T\        4      '       d   \        T4      '       g   h  Rp?ELýRp?ii ; i  \@         d   p\        \        T4      4      u Rp?# Rp?ii ; i)!zSearch for content or files.Úsearchr4  Úlast_keyNÚconsecutivero  z(BLOCKED: You have run this exact search z times in a row. The results have NOT changed. You already have this information. STOP re-searching and proceed with your task.r  Úalready_searchedTÚSearchr‚  )	r  r˜   r³   r  r"  r]   r  r  r  rÇ   rI   r7  )Údensifyze result(s) omitted because they target credential, token, cache, or secret-bearing environment files.Ú_omittedr>  zPath not found:Fr:  zYou have run this exact search zY times consecutively. The results have not changed. Use the information you already have.r�  r`   zResults truncated. Use offset=zB to see more, or narrow with a more specific pattern or file_glob.r‹  r  )!r   rK   r-   r,   r  r¨   r   rG  r   r   r   r«   r¯   rº   rB   r   r#   r	  r
  rÎ   rs   r   rI   r   r»   r˜   r‘  r@   r�   r.   rN  rO  rA   )r  r³   r˜   r  r"  r]   r  r  r  r·   Ú
search_keyr\  rQ   r•  Úresolved_search_pathrÐ   r˜  Úcached_search_nfrË   rÄ   rŽ   r\   Ú_search_errr   s   &&&&&&&&&&              r9   Úsearch_toolr    s  € ðO"Ü3°FÓB‰ˆð  ´°T³¸I¿O¸OÈÈUÐ\aÐbˆ
ßÖÜ%×0Ò0°Ø˜D -°°NÄCÃEð;Kó LˆIä% iÓ<ˆE÷  ð
 �AŒ:ÜØ:¸5¸'ð B@ð @ñ1ð  ð	1ð
 "'ð1ô )¨$Ð/ñ1ð 1ô (¨°8Ô<ˆßÜ˜fÓ%Ð%ð	Ü#&Ô'=¸dÓ'LÓ#MÐ ô +Ð+?Ó@ˆßÜ˜kÓ*Ð*ô 2°(Ð<PÓZÐØÒ'Ø#Ð#ä˜wÓ'×.Ñ.Ø¨vØ°KÐX]ð /ó _ˆô 6°f¸gÓFˆÜ˜ ¨DÓ1×7Ð7°RÒ7ˆAÜ�q˜) T×*Ô*Ü1Ø—I‘I¨Ü 3Ô4HÈÏÉÐQXÓ4YÓ Zô\�–	ñ 8ð
 —n‘n¨T�nÓ2ˆçà�)ð Eð Eð ˜
Ñ#ð
 "—o‘o gÓ.×4Ð4°"ˆÜ�k¤3×'Ò'¨K×,BÑ,BÐCT×,UÒ,UÜ˜hÐ(<ÄtÇzÂzÐR]ÐlqÔGrÔsà�AŒ:à1°%°ð 9Vð Vð ˜
Ñ#ð �?‰?˜;×'Ò'à0°µÐ0@ð AGð Gð ˜Ñ ô �zŠz˜+°EÔ:Ð:÷O  ×Ðûô* œ¤\Ð2ô 	Ø#'Ð ô ˜#œ|×,Ò,Ô5IÈ$×5OÒ5OØÿùð	ûôf ô "Üœ#˜a›&Ó!Õ!ûð"ús‘   ‚6K ¸1I*Á)(K ÂK Â3I> ÃK Ã%K Ã7AK ÅAK Æ)K Ç	/K Ç9A	K É&K É*I;	É5	K É>K	Ê*KÊ>K ËK	Ë	K ËK5ËK0Ë*K5Ë0K5)ÚregistryrG  c                 ó   € ^ RI Hp  V ! 4       # )z=Lazy wrapper to avoid circular import with tools/__init__.py.©Úcheck_file_requirements)Útoolsr  r  s    r9   Ú_check_file_reqsr  |  s   € å-Ù"Ó$Ð$r;   Únamer�  Údescriptionu[  Read a text file with line numbers and pagination. Use this instead of cat/head/tail in terminal. Output format: 'LINE_NUM|CONTENT'. Suggests similar filenames if not found. Use offset and limit for large files. Reads exceeding ~100K characters are truncated on a line boundary and return a next_offset; continue with offset to read the rest. Documents auto-extract to readable text: .ipynb, Office (.docx/.xlsx/.pptx and legacy .doc/.ppt/.xls), PDF (text layer), OpenDocument, RTF, EPUB, SQLite (.db/.sqlite: schema, row counts, first rows). Cannot read images/binary â€” use vision_analyze for images.Ú
parametersrÔ  ÚobjectÚ
propertiesr˜   Ústringz8Path to the file to read (absolute, relative, or ~/path)r]   Úintegerz9Line number to start reading from (1-indexed, default: 1)Úminimumr"  z–Maximum number of lines to read (default: 2000, max: 2000). Reads are additionally capped at a ~100K-character budget with a next_offset continuation.ÚmaximumiÐ  ÚrequiredrÓ  uÛ  Write content to a file, completely replacing existing content. Use this instead of echo/cat heredoc in terminal. Creates parent directories automatically. OVERWRITES the entire file â€” use 'patch' for targeted edits. For an EXISTING file, call read_file first: write_file refuses (file untouched) when this task has no current full read/write of the file or the file changed on disk since; on refusal, read_file, merge, then retry. Auto-runs syntax checks on .py/.json/.yaml/.toml and other linted languages; only NEW errors introduced by this write are surfaced (pre-existing errors are filtered out). The result's verified:true means the on-disk content hash was confirmed â€” do NOT re-read the file to check the write landed.zWPath to the file to write (will be created if it doesn't exist, overwritten if it does)z%Complete content to write to the filery   a  Targeted find-and-replace edits in files. Use this instead of sed/awk in terminal. Uses fuzzy matching (9 strategies) so minor whitespace/indentation differences won't break it. Returns a unified diff. Auto-runs syntax checks after editing. Finds a unique string and replaces it.zFile path to edit.ré  z‹Exact text to find and replace. Must be unique in the file unless replace_all=true. Include surrounding context lines to ensure uniqueness.rê  zjChanged replacement text; it must differ from old_string. Pass empty string '' to delete the matched text.rë  ÚbooleanzLReplace all occurrences instead of requiring a unique match (default: false)aã  Targeted find-and-replace edits in files. Use this instead of sed/awk in terminal. Uses fuzzy matching (9 strategies) so minor whitespace/indentation differences won't break it. Returns a unified diff. Auto-runs syntax checks after editing.

REPLACE MODE (mode='replace', default): find a unique string and replace it. REQUIRED PARAMETERS: mode, path, old_string, new_string.
PATCH MODE (mode='patch'): apply V4A multi-file patches for bulk changes. REQUIRED PARAMETERS: mode, patch.r  ÚenumznEdit mode. 'replace' (default): requires path + old_string + new_string. 'patch': requires patch content only.z´REQUIRED when mode='patch'. V4A format patch content. Format:
*** Begin Patch
*** Update File: path/to/file
@@ context hint @@
 context line
-removed line
+added line
*** End Patchc                ó$   € V ^8„  d   QhR\         /# r4   ro   )r8   s   "r9   r:   r:   ñ  s   € ÷ ñ ¤ñ r;   c                 ól  €  ^ RI Hp Hp V! 4       ;'       g    RP                  4       P	                  4       pV ! 4       ;'       g    RP                  4       P	                  4       pTR9   d   R# TP                  R^4      R,          pTP                  R	4      '       d   R# RT9   #   \
         d     R# i ; i)
u„  Whether the active main provider/model is the OpenAI/codex family â€”
the population trained on the V4A apply_patch dialect.

Provider-family-coarse on purpose (no per-model training-diet table to
go stale): direct OpenAI providers always qualify; on aggregators
(openrouter/nous/azure...) the MODEL slug decides (gpt-*/o-series/
codex). Fail-closed to the universal replace-only schema.
)Ú_read_main_modelÚ_read_main_providerr4  FTÚ/zopenai/>   ÚcodexÚopenaiúopenai-chatúazure-openaiúopenai-codexru  )zgpt-zgpt.Úchatgptr-  Úo1Úo3Úo4Úo5)Úagent.auxiliary_clientr*  r+  r„   rF  rA   rR   r�   )r*  r+  ÚproviderÚmodelÚslugs        r9   Ú_is_openai_family_mainr;  ñ  s£   € ðßPá'Ó)×/Ð/¨R×6Ñ6Ó8×>Ñ>Ó@ˆÙ!Ó#×)Ð) r×0Ñ0Ó2×8Ñ8Ó:ˆð ÐUÔUÙà�;‰;�s˜AÓ˜rÕ"€DØ‡�ÐS×TÒTÙØ˜ÑÐøô ô Úðús   ‚B$ ˜,B$ ÁB$ Â$B3Â2B3Úsearch_filesaÕ  Search file contents or find files by name. Use this instead of grep/rg/find/ls in terminal. Ripgrep-backed, faster than shell equivalents. On macOS, broad searches above the user home automatically skip TCC-protected folders (Desktop, Documents, Downloads, Library, Movies, Music, Pictures); target one directly when access is intentional.

Content search (target='content'): Regex search inside files. Output modes: full matches with line numbers, file paths only, or match counts.

File search (target='files'): Find files by glob pattern (e.g., '*.py', '*config*'). Also use this instead of ls. Discovery order is the fast bounded default; exact global newest-first order is an explicit opt-in and may scan the full tree.r  zPRegex pattern for content search, or glob pattern (e.g., '*.py') for file searchr³   rÈ   zK'content' searches inside file contents, 'files' searches for files by namezCDirectory or file to search in (default: current working directory)r  zOFilter files by pattern in grep mode (e.g., '*.py' to only search Python files)z1Maximum number of results to return (default: 50)z0Skip first N results for pagination (default: 0)r  Úmodifiedz—File-search order: 'discovery' is fast bounded traversal order; 'modified' is exact global newest-first and may scan the full tree; ignored for contentr  z‘Output format for grep mode: 'content' shows matching lines with line numbers, 'files_only' lists file paths, 'count' shows match counts per filer  zDNumber of context lines before and after each match (grep mode only)c                 ó¾   € VP                  R 4      ;'       g    Rp\        V P                  RR4      V P                  R^4      V P                  R\        4      VR7      # )r·   r¼   r˜   r4  r]   r"  )r˜   r]   r"  r·   )r@   r¡  r   ©ÚargsÚkwÚtids   &, r9   Ú_handle_read_filerC    sZ   € Ø
�&‰&�Ó
×
(Ð
(˜y€CÜ˜tŸx™x¨°Ó3¸D¿H¹HÀXÈqÓ<QÐY]×YaÑYaÐbiÔk}ÓY~ð  ILô  Mð  Mr;   c                 ó¨  a aa€ SP                  R 4      ;'       g    RoS P                  R4      '       d&   \        S P                  R4      \        4      '       g   \        R4      # RS 9  d   \        R4      # \        S R,          \        4      '       g*   \        R\	        S R,          4      P
                   R24      # ^ RIHp V! R	R
V VV3R l4      # )r·   r¼   r˜   zdwrite_file: missing required field 'path'. Re-emit the tool call with both 'path' and 'content' set.rI   u%  write_file: missing required field 'content'. The tool call included a path but no content argument â€” this is almost always a dropped-arg bug under context pressure. Re-emit the tool call with the full content payload, or use execute_code with hermes_tools.write_file() for very large files.z,write_file: 'content' must be a string, got r  ©Úrecord_file_editrÓ  Ú
whole_filec                  óÎ   <€ \        SP                  R 4      ;'       g    S\        S R,          S R,          S\        S P                  RR4      4      SP                  R 4      R7      # )r¶  r˜   rI   r¨  F)r˜   rI   r·   r¨  r¶  )Ú_ownedr@   rÙ  rM   r?  s   €€€r9   r�   Ú$_handle_write_file.<locals>.<lambda>:  sP   ø€ ÄÀrÇvÁvÈlÓG[×GbÐGbÐ_bÔdsØ�&�\ 4¨	¥?¸CÜ˜4Ÿ8™8 O°UÓ;Ó<Ø—6‘6˜,Ó'õAr;   )r@   rB   rK   rG  rÔ  rÕ  Ú/hermes_cli.observability.shared_metrics_harnessrF  )r@  rA  rF  rB  s   fl @r9   Ú_handle_write_filerL  $  sÆ   ú€ Ø
�&‰&�Ó
×
(Ð
(˜y€CØ�8‰8�F×Ò¤:¨d¯h©h°vÓ.>Ä×#DÒ#DÜð-ó
ð 	
ð ˜ÔÜðó
ð 	
ô �d˜9•o¤s×+Ò+ÜØ:Ü�D˜•OÓ$×-Ñ-Ð.¨að1ó
ð 	
õ Qá˜L¨,ö 9ó ð r;   c                ó$   € V ^8„  d   QhR\         /# )r5   Úownerr¸   )r8   s   "r9   r:   r:   A  s   € ÷ !ñ !”#ñ !r;   c                ó|   € ^ RI Hp V! V 4      ;_uu_ 4        V! R/ VB uuRRR4       #   + '       g   i     R# ; i)z�Run an edit tool with its late LSP verdicts attributed to ``owner``, the calling session
(``agent.lsp.deferred``): they ride that session's next tool result.)Ú
bind_ownerNr  )Úagent.lsp.deferredrP  )rN  ÚfnÚcall_kwargsrP  s   &&, r9   rI  rI  A  s,   € õ .Ù	�E×	Õ	ÙÑ �KÑ ÷ 
×	×	Ó	ús   —*ª;	c                 ó’   a aaa€ ^ RI Hp SP                  R4      ;'       g    RoS P                  RR4      oV! RSV VVV3R l4      # )é    rE  r·   r¼   r  rç  ry   c                  óR  <€ \        SP                  R 4      ;'       g    S\        SS P                  R4      S P                  R4      S P                  R4      S P                  RR4      S P                  R4      S\        S P                  RR4      4      SP                  R 4      R7      # )	r¶  r˜   ré  rê  rë  Fry   r¨  )	r  r˜   ré  rê  rë  ry   r·   r¨  r¶  )rI  r@   r   rM   )r@  rA  r  rB  s   €€€€r9   r�   Ú_handle_patch.<locals>.<lambda>N  s�   ø€ ´6¸"¿&¹&ÀÓ:N×:UÐ:UÐRUÔWaØ˜Ÿ™ Ó(Ø—8‘8˜LÓ)°d·h±h¸|Ó6LØ—H‘H˜]¨EÓ2¸$¿(¹(À7Ó:KÐUXÜ˜4Ÿ8™8 O°UÓ;Ó<Ø—6‘6˜,Ó'õ4r;   )rK  rF  r@   )r@  rA  rF  r  rB  s   fl @@r9   Ú_handle_patchrX  I  sB   û€ ÝPà
�&‰&�Ó
×
(Ð
(˜y€CØ�8‰8�F˜IÓ&€DÙ˜G T÷ ,ó ð r;   c                 ó  € VP                  R 4      ;'       g    RpRRRR/pV P                  RR4      pVP                  WD4      pV P                  RR4      pVe-   \        V\        4      '       d   VP                  4       '       g   Rp\	        V P                  R	R
4      WVV P                  R4      V P                  R^24      V P                  R^ 4      V P                  RR4      V P                  R^ 4      V P                  RR4      VR7
      # )r·   r¼   ÚgreprI   ÚfindrÈ   r³   r˜   r  r  r4  r  r"  r]   r  r  r  r  )
r  r³   r˜   r  r"  r]   r  r  r  r·   )r@   rB   rK   r„   r  )r@  rA  rB  Ú
target_mapÚ
raw_targetr³   r˜   s   &,     r9   Ú_handle_search_filesr^  W  sç   € Ø
�&‰&�Ó
×
(Ð
(˜y€CØ˜) V¨WÐ5€JØ—‘˜( IÓ.€JØ�^‰^˜JÓ3€Fð �8‰8�F˜CÓ €DØ‚|œ
 4¬×-Ò-°d·j±j·l²lØˆÜØ—‘˜ BÓ'°Ø—(‘(˜;Ó'¨t¯x©x¸ÀÓ/DÈTÏXÉXÐV^Ð`aÓMbØ—H‘H˜]¨IÓ6ÀÇÁÈÐTUÓ@VØ�h‰h�w Ó,°cô	;ð ;r;   c                 ó’   €  ^ RI Hp  V ! 4       '       d    R\        R,          P                  RR4      /#  / #   \         d     / # i ; i)u  One-word capability upgrade: "PDF (text layer)" â†’ "PDF (scanned or
text)" when hosted OCR has a trusted route (see
read_extract.hosted_ocr_available). Config/env probe only â€” no
network at schema-build time. Compaction's tool refresh (#97073)
picks up a key added mid-session.
©Úhosted_ocr_availabler  zPDF (text layer)zPDF (scanned or text))r<  ra  ÚREAD_FILE_SCHEMArç  rA   r`  s    r9   Ú_read_file_schema_overridesrc  h  s^   € ð
Ý;á×!Ò!àÔ/°Õ>×FÑFØ&Ð(?ó ðð ð "ð €Iøô ô ØØ€Iðús   ‚7 •7 ·AÁAÚfileu   ðŸ“–)r  ÚtoolsetÚschemaÚhandlerÚcheck_fnÚemojiÚmax_result_size_charsÚdynamic_schema_overridesu   âœ�ï¸�)r  re  rf  rg  rh  ri  rj  c                 óÔ   €  \        4       '       g   / # RRRR\        R,          /\        R,          R,          CR\        R,          /CRR./p R\        RV /#   \         d    / u # i ; i)	uì   Layer the V4A patch mode onto the base replace-only schema for
OpenAI-family mains (see PATCH_SCHEMA comment). Config/context probe
only â€” no I/O at schema-build time; compaction's tool refresh
(#97073) re-evaluates on model switches.rÔ  r  r   r  r  ry   r%  r  )r;  Ú_PATCH_V4A_PARAMSÚPATCH_SCHEMAÚ_PATCH_V4A_DESCRIPTIONrA   )Úparamss    r9   Ú_patch_schema_overridesrq    s‡   € ð
Ü%×'Ò'ØˆIà�HØØÔ)¨&Õ1ðä˜|Õ,¨\Õ:ðð Ô*¨7Õ3ñð
 ˜˜ð
ˆð Ô5°|ÀVÐLÐLøÜô ØŠ	ðús   ‚A ”AA ÁA'Á&A'u   ðŸ”§u   ðŸ”Žc                ó@   € V ^8„  d   Qh/ ^ \         9   d
   \        ;R&   # )r5   r   )Ú__conditional_annotations__r^   )r8   s   "r9   r:   r:      s    € ÷ ñ ÷R Ò ”Ñ òSr;   >   ú/dev/ttyú	/dev/fd/0ú	/dev/fd/1ú	/dev/fd/2ú	/dev/fullú	/dev/zeroú
/dev/stdinú/dev/randomú/dev/stderrú/dev/stdoutú/dev/consoleú/dev/urandom)z/fd/0z/fd/1z/fd/2z/environz/cmdlinez/mapsz/smapsz/smaps_rollupz
/numa_mapsz/memz/auxvz/pagemaprƒ   )r¼   )r¼   FN)	rç  NNNFNr¼   FN)	rI   r  Né2   rU  rI   rU  r  r¼   )r˜   ré  rê  )rI   Ú
files_onlyrQ   )“rs  Ú__doc__r@  rÓ   rN  Úloggingrš   Úrer  r  r  Ú
contextlibr   Úpathlibr   Úagent.file_safetyr   r   Ú agent.tool_result_classificationr   Útools.binary_extensionsr   Útools.skill_provenancer   Útools.file_operationsr	   r
   r   Útools.file_operations_commonr   r   r  r   Úagent.redactr   r   Útools.file_tools_pathsr   r   r   r   r   Útools.file_tools_write_guardsr   r   r   r   r   r   r   r   r   Útools.file_tools_read_trackingr   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   Ú	getLoggerrÕ  rí   ÚEACCESÚEPERMÚEROFSrÔ   rD   rG   rZ   rm   r”  Ú	frozensetrœ   rŸ   rw   ÚcompileÚ	MULTILINEr’   r”   r•   r¡   rµ   r»   rÎ   rÕ   r  rÿ   r   rô   r	  r  ÚS_ISFIFOÚS_ISSOCKÚS_ISCHRÚS_ISBLKr  r   rZ  rg  r~  r¡  r¤  r­  r´  r¹  r¾  rÅ  r¿  rË  rÙ  ræ  r   r  Útools.registryr  rG  r  rb  ÚWRITE_FILE_SCHEMArn  ro  rm  r;  ÚSEARCH_FILES_SCHEMArC  rL  rI  rX  r^  rc  Úregisterrq  r:   )rs  s   @r9   Ú<module>r      s”  øðöó Û Û Û Û 	Û 	Û Û Û Ý  Ý ç JÝ BÝ 8Ý 7÷Qñ Qç RÝ ß C÷õ ÷T÷ Tõ T÷V÷ V÷ V÷ V÷ Vó Vð 
×	Ò	˜8Ó	$€ð  Ÿ,™,¨¯©°U·[±[ÐAÐ ð "Ð õ
:õ,õ<ð, !Ð ñ "ò #ó Ð ð!Ð õ
-ð  Ÿ
š
Ð#UÐWY×WcÑWcÓdÐ Ø—j’jÐ!QÐSU×S_ÑS_Ó`Ð õjõ,[÷"-õJ
÷õ0Jð —’Ó!€Ø€Ó õ("÷V>÷B*ð6 
‡]�]Ð)Ð*Ø	‡]�]�JÐØ	‡\�\Ð'Ð(Ø	‡\�\Ð#Ð$ð	&Ð õ0õ"G7õTðBDà-2ðDàKOðDð )-ðDð >BðDð MQ÷DðN -.Ð<NÐ_h÷ X"ðzÀ5÷ õ?õ*õ@ð !Ð Ø"Ð ð
 "Ð õ÷D@"õF-÷:["÷|U"÷v 0ò%ð ˆKð ð  q	ØØ�ØØ�V˜X }Ð6pÐqØ�v˜y¨-Ð9tÐvð  BCð  ENð  PQð  RØ�f˜i¨ð  9Qð  S\ð  ^pð  r{ð  }Að  Bð
ð
 	�V�HððÐ ð. ˆLØð  qØØ�ØØ�V˜X }ð  7Pð  QØ˜ ¨-Ð9`Ðað
ð 	�V˜YÐ'ððÐ ð& ˆGð ð	1ð
 Ø�ØØØ˜ØÐ3ðð Ø˜Øð   mðð Ø˜Øð   Lðð Ø˜	ØÐmØ˜5ðð
ð. 	Ò8ð3ð!+€ðb(ð ð Ø�Ø�˜GÐ$Øð  HØ�9ð	ð Ø�Øð  UððÐ õð4 ˆNØð  oØØ�ØØ˜ ¨-ð  :Lð  MØ�v˜x¨°)¸WÐ1EÀ}ð  Wdð  foð  qzð  {Ø�V˜X }Ð6{ð  ~Gð  ILð  MØ˜& (¨Mð  <Mð  NØ�f˜i¨Ð8kÐmvÐxzÐ{Ø�v˜y¨-Ð9kÐmvÐxyÐzØ�f˜h¨°¸jÐ0IÈ=ð  [tð  vð  ALð  MØ˜F H¨fÒ6XÐZgð  j}ð  Hð  JSð  TØ˜ 	¨=ð  ;Að  CLð  NOð  Pð

ð 	�Y�KððÐ ò*Mò
õ:!òò;ò"ð* 	× Ó �{¨FÐ;KÐUfð  rBð  JPð  hoð  Jeõ  fØ × Ó �|¨VÐ<MÐWið  uEð  MUð  mtõ  uòð, 	× Ó �w¨°|È]Ðeuð  ~Dð  \cð  ~Uõ  VØ × Ó �~¨vÐ>QÐ[oð  {Kð  SYð  qx÷  yr;   