
    `gj                       d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZmZ ddlmZ ddlmZmZmZmZmZ ddlmZ ed   Z G d	 d
e      Z ed       G d d             Z ed       G d d             Z G d dej>                        Z dQdZ!dRdZ"dSdZ#dddTdZ$dUdZ%dVdZ&dWdZ'dXdZ(dYdZ)dZdZ*d[dZ+d\d Z,d]d!Z-d^d"Z. ej^                  d#      	 	 	 	 	 	 	 	 d_d$       Z0 ej^                  d#      	 	 	 	 	 	 	 	 d`d%       Z1 ej^                  d#      	 	 	 	 	 	 dad&       Z2 ej^                  d#      dbd'       Z3dcd(Z4ddd)Z5dd*	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ded+Z6ddd,	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dfd-Z7dd*	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ded.Z8dd*	 	 	 	 	 	 	 	 	 	 	 	 	 dgd/Z9	 dh	 	 	 	 	 	 	 	 	 	 	 	 	 did0Z:	 	 dj	 	 	 	 	 	 	 	 	 	 	 	 	 dkd1Z;	 dh	 	 	 	 	 	 	 	 	 	 	 	 	 did2Z<	 dh	 	 	 	 	 	 	 	 	 	 	 dld3Z=d4d5dd5d6	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dmd7Z> G d8 d9      Z?dnd:Z@dod;ZAdpd<ZBdpd=ZCdpd>ZDdpd?ZEdpd@ZFdpdAZGdpdBZHdpdCZIdpdDZJdpdEZKdpdFZLdpdGZMdpdHZNdpdIZOdpdJZPdpdKZQdpdLZRdpdMZSdpdNZTdddddO	 	 	 dqdPZUy)ra  Safe Hermes Console command engine.

This module backs ``hermes console`` and is intentionally narrower than the
full Hermes CLI. It exposes a curated set of native adapters that can later be
shared by the dashboard console websocket without becoming a raw shell.
    )annotationsN)	dataclassreplace)Path)CallableIterableLiteralNoReturnSequence)
strip_ansi)okerrorconfirm_requiredexitclearc                      e Zd ZdZy)ConsoleCommandErrorz$User-facing console command failure.N)__name__
__module____qualname____doc__     L/root/.hermes/venv/lib/python3.12/site-packages/hermes_cli/console_engine.pyr   r      s    .r   r   T)frozenc                  B    e Zd ZU ded<   dZded<   dZded<   dZded<   y)	ConsoleResultConsoleStatusstatus stroutputcommandconfirmation_messageN)r   r   r   __annotations__r"   r#   r$   r   r   r   r   r   !   s'    FCGS "#"r   r   c                  R    e Zd ZU ded<   ded<   ded<   ded<   dZd	ed
<   dZded<   y)ConsoleCommandtuple[str, ...]pathr!   usagesummary1Callable[['HermesConsoleEngine', list[str]], str]handlerFboolmutatingr    confirmationN)r   r   r   r%   r/   r0   r   r   r   r'   r'   )   s,    
JL>>HdL#r   r'   c                      e Zd ZddZy)_ArgumentParserc                6    t        | j                   d|       )N: )r   prog)selfmessages     r   r   z_ArgumentParser.error4   s    !TYYKr'";<<r   N)r7   r!   returnr
   )r   r   r   r   r   r   r   r2   r2   3   s    =r   r2   c                L   t        j                         }t        j                         }d}t        j                  |      5  t        j                  |      5  	  |        }t        |t              r|rt        |      d d d        d d d        |j                         |j                         z   }|r t        |j                         xs d|       |j                         S # t        $ r#}t        |j                  xs d      }Y d }~d }~ww xY w# 1 sw Y   xY w# 1 sw Y   xY w)Nr   zCommand exited with status )ioStringIO
contextlibredirect_stdoutredirect_stderr
isinstanceint
SystemExitcodegetvaluer   striprstrip)fnstdoutstderrrB   resultexctexts          r   _capture_outputrL   8   s    [[]F[[]FD		#	#F	+ &Z-G-G-O &	&TF&#&6 ((	& & ??v00D!$**,"V4OPTv2VWW;;=  	&sxx}1%D	&& & & &sH    DD$C<D	D(DDDDD	DD#c                    t        |       j                         }t        |      dk  ry|j                  dd      }t	        |      dhk  S )N   Fu   ─-)_strip_ansirD   lenr   set)linestripped
normalizeds      r   _is_status_footer_rulerV   I   sG    4 &&(H
8}q!!(C0Jz?se##r   c                   | j                         }|rKt        |d         j                         s/|j                          |rt        |d         j                         s/t	        |      dk  r| j                         S t        |d         j                         }t        |d         j                         }|j                  d      r|j                  d      s| j                         S |d d }|rKt        |d         j                         s/|j                          |rt        |d         j                         s/|rt        |d         r|j                          dj                  |      j                         S )N   zRun 'hermes doctor'zRun 'hermes setup'
)	
splitlinesrP   rD   poprQ   rE   
startswithrV   join)rK   lineslastprevs       r   _strip_console_status_footerrc   Q   s&   OOE
E"I.446		 E"I.446
5zA~{{}uRy!'')DuRy!'')D-.OO01{{}#2JE
E"I.446		 E"I.446'b	2		99U""$$r   L   )limitc                   dj                  | j                               } t        |       |k  r| S | d |dz
   j                          dS )N    z...)r_   splitrQ   rE   )r+   re   s     r   _table_summaryrj   h   sI    hhw}}'G
7|uk	"))+,C00r   c                t    	 t        j                  | dd      S # t        $ r}t        d|       |d }~ww xY w)NFT)commentsposixzCould not parse command: )shlexri   
ValueErrorr   )rS   rJ   s     r   _split_linerp   o   sB    N{{4%t<< N!$=cU"CD#MNs    	727c                r     d v sd v ryh dt        fd|D              ryt         fddD              S )Nz$(`T>   &&2><<>>||2>>&;<>|c              3  &   K   | ]  }|v  
 y wNr   ).0tokenshell_tokenss     r   	<genexpr>z)_contains_shell_syntax.<locals>.<genexpr>z   s     
5U5L 
5   c              3  &   K   | ]  }|v  
 y wr   r   )r   chrS   s     r   r   z)_contains_shell_syntax.<locals>.<genexpr>|   s     +brTz+r   z|<>;)any)rS   tokensr   s   ` @r   _contains_shell_syntaxr   v   s:    t|sd{QL

5f
55+F+++r   c           
        | syddddddddd	g}|j                  d
       | D ]  }t        |j                  d      xs d      d d }t        |j                  d      xs d      d d }|j                  d      xs d}|j                  d      xs |j                  d      xs d}t        |      j                  dd      d d }|j                  |dd|dd|dd|         dj	                  |      S )NzNo sessions found.ID<32rg   Sourcez<12Msgsz>5z  Title / PreviewzR----------------------------------------------------------------------------------idr        sourcerO      message_countr   titlepreviewr[   <     )appendr!   getr   r_   )sessionsr`   sessionsidr   messagesr   s          r   _format_sessionsr      s   #Sz8C.&4EFGE	LL G'++d#)r*3B/W[[*1c23B7;;/41G$DI(>D"E
""4-cr2Cy&Qxm2eWEFG 99Ur   c                    | j                  d      xs | j                  d      xs d}| j                  d      xs d}| j                  d      xs | j                  dd      rd	nd
}| d| d| d| dS )Nr   job_id?namez	(unnamed)stateenabledT	scheduledpausedz job: z (z) [])r   )jobactionr   r   r   s        r   _format_jobr      su    WWT]6cggh/63F776?)kDGGGW	40HhEXVD6F83ugQ77r   c                 H    t        dd      } | j                  d      }| |fS )NhermesFr5   add_help_console_command)dest)r2   add_subparsers)parser
subparserss     r   _parser_rootr      s-    (U;F&&,>&?J:r   c                t    | j                   D cg c]  }t        |t        j                        r|  c}S c c}w r   )_actionsr?   argparse_SubParsersAction)r   r   s     r   _subparser_actionsr      s8     oofh889 	  s   #5c                    | j                   D ]R  }t        |dd       |k(  st        |dd       |k(  s$t        |dd       }|s4|t        j                  usGt	        |      c S  y)Nr   metavarhelpr    )_choices_actionsgetattrr   SUPPRESSr!   )r   r   choice	help_texts       r   _choice_helpr      sf    )) &664(D0GFIt4TX\4\5IYh.?.??9~%	&
 r   c                    | sy| t         j                  u rydj                  t        |       j	                               }|sy|j                  d      ry|S )Nr    rg   Run `hermes )r   r   r_   r!   ri   r^   )rK   r+   s     r   _clean_summaryr      sN    x   hhs4y()G.)Nr   c                .    i dfd | d       S )Nc                
   t        |       D ]t  }|j                  j                         D ]U  \  }}g ||}t        t	        ||            xs t        |j
                        }|rj                  ||        ||       W v y r   )r   choicesitemsr   r   description
setdefault)	currentr)   r   r   child
child_pathr+   	summarieswalks	          r   r   z$_summaries_from_parser.<locals>.walk   s    (1 	(F%~~335 (e*t]T]
(fd)CD %%I ((W=UJ'(	(r   r   )r   argparse.ArgumentParserr)   r(   r8   Noner   )r   r   r   s    @@r   _summaries_from_parserr      s    ,.I	( 	r   c                     y r   r   )_argss    r   _noop_console_commandr      s    r   )maxsizec                    	 t               \  }}t        j                  |       }t        ||      } ||fi |t        i t        |      S # t        $ r i cY S w xY wr   )r   	importlibimport_moduler   r   r   	Exception)module_namebuilder_namemain_handler_namer   r   modulebuilders          r   _extracted_summariesr      sb    )^
((5&,/
I02GHI%f-- 	s   AA
 
AAc                    	 t               \  }}t        j                  |      }|j                  |       }t	        ||      } ||       t        |      S # t        $ r i cY S w xY wr   )r   r   r   
add_parserr   r   r   )rootr   register_namer   r   r   
top_parserregisters           r   _registered_summariesr      sf    )^
((5**40
6=1%f-- 	s   AA A"!A"c                    	 t               \  }}t        j                  |       } t        ||      |       t	        |      S # t
        $ r i cY S w xY wr   r   r   r   r   r   r   )r   r   r   r   r   s        r   _builder_summariesr      sS    
)^
((5%%j1%f-- 	   >A AAc                    	 t               \  }}t        j                  |       } t        ||      |       t	        |      S # t
        $ r i cY S w xY wr   r   )r   add_namer   r   r   s        r   _adder_summariesr     sS    )^
((5!!*-%f-- 	r   c                X    t        | dd       }t        |      st        d       ||       S )Nfuncz1No handler is available for that console command.)r   callabler   )argsr   s     r   _invoke_namespacer     s-    4&DD>!"UVV:r   c                P    |j                         D ]  \  }}t        | ||        | S r   )r   setattr)r   attrsr   values       r   
_set_attrsr     s,    {{} #edE"#Kr   namespace_updatec                   t               \  }}t        j                  |      }	t        j                  d      }
t        |	|      }t        |
|      } ||fi ||i |j	                  | g||      |r |       t        fd      S )Nhermes_cli.mainc                     t               S r   r   	namespaces   r   <lambda>z0_dispatch_extracted_subcommand.<locals>.<lambda>/      #4Y#? r   r   r   r   r   
parse_argsrL   )r   fixedr   r   r   r   r   r   r   r   main_moduler   main_handlerr  s                @r   _dispatch_extracted_subcommandr	    s     &FJ$$[1F))*;<Kfl+G;(9:LJ<,l;<!!4"7%"7$"78I#?@@r   handler_namer   c                *   t               \  }}t        j                  |      }	|j                  |       }
t	        |	|      } ||
       |r|
j                  t	        |	|             |j                  | g||      |r |       t        fd      S )Nr   c                     t               S r   r   r   s   r   r  z1_dispatch_registered_subcommand.<locals>.<lambda>F  r  r   )r   r   r   r   r   set_defaultsr  rL   )r   r  r   r   r   r  r   r   r   r   r   r   r  s               @r   _dispatch_registered_subcommandr  2  s     &FJ$$[1F&&t,Jv}-HZWV\%BC!!4"7%"7$"78I#?@@r   c                *   t               \  }}t        j                  |      }	t        j                  d      }
 t        |	|      |      }|j	                  t        |
|             |j                  | g||      |r |       t        fd      S )Nr   r  c                     t               S r   r   r   s   r   r  z._dispatch_builder_subcommand.<locals>.<lambda>[  r  r   )r   r   r   r   r  r  rL   )r   r  r   r   r   r   r   r   r   r   r  r   r  s               @r   _dispatch_builder_subcommandr  I  s     &FJ$$[1F))*;<K..z:J6G!HI!!4"7%"7$"78I#?@@r   c                   	 t               \  }}t        j                  |      } t        ||      |       |j	                  | g||      	|r |	       t        	fd      S )Nc                     t               S r   r   r   s   r   r  z,_dispatch_adder_subcommand.<locals>.<lambda>m  r  r   r  )
r   r  r   r   r   r   r   r   r   r  s
            @r   _dispatch_adder_subcommandr  ^  sf     &FJ$$[1FGFHj)!!4"7%"7$"78I#?@@r   c                (     d fd}|S )Nc           	     (    t        |      S N)r   r  r   r   r   r   r   )r	  _enginer   r   r  r   r   r   r   s     r   r-   z#_extracted_handler.<locals>.handlerx  s%    -#%/-
 	
r   r  HermesConsoleEnginer   	list[str]r8   r!   r   r   r  r   r   r   r   r-   s   `````` r   _extracted_handlerr   p      	
 	
 Nr   c                (     d fd}|S )Nc           	     (    t        |      S )N)r   r  r   r   r   r  r   )r  )r  r   r  r  r   r   r   r   s     r   r-   z$_registered_handler.<locals>.handler  s%    .#'%-
 	
r   r  r   )r   r  r   r   r  r   r-   s   `````` r   _registered_handlerr$    r!  r   c                (     d fd}|S )Nc           	     (    t        |      S r  )r  r  s     r   r-   z!_builder_handler.<locals>.handler  s%    +#%/-
 	
r   r  r   r  s   `````` r   _builder_handlerr'    r!  r   c                $     d fd}|S )Nc                &    t        |      S )N)r   r  r   r   r   r   )r  )r  r   r   r  r   r   r   s     r   r-   z_adder_handler.<locals>.handler  s"    )#-
 	
r   r  r   )r   r  r   r   r   r-   s   ````` r   _adder_handlerr*    s    
 
 Nr   r   r    )r/   r+   r   r0   c               D   |D ch c]  }t        |       }	}|D ]~  }
t        |
      }|gt        |
      }dj                  |      }|xs |xs i j                  |      xs d| d}| j                  ||| |t        |
            ||	v |xs d| d        y c c}w )Nrg   r   z`.`?r/   r0   )tupler_   r   r   )enginer   pathshandler_factoryr/   r+   r   r0   r)   mutating_pathsr   	child_key	full_pathr*   command_summarys                  r   _register_command_familyr6    s     /77deDk7N7 

*%	.E*-.	#!aio2%:%:9%Ea<X]W^^`IaE*-..0%A<wb)A 	 	

 8s   Bc                      e Zd ZdZddddZddddZddd	Zdd
ZddZddd	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	ddZ
ddZddZddZddZy)r  z1Curated line-command executor for Hermes Console.i N  )output_limitc               N    || _         g | _        i | _        | j                          y r   )r8  historycommands_register_defaults)r6   r8  s     r   __init__zHermesConsoleEngine.__init__  s$    ("$?A!r   F	confirmedc                  |j                         }|st        d      S 	 t        |      }|r|d   dk(  r|dd  }|s| j                         S t	        ||      rt        d      | j                  |      }|!|dvr| j                  j                  |       |S | j                  |      \  }}|j                  r,|s*t        d||j                  xs d|j                   d	
      S |j                  | |      j                         }| j                  |      }| j                  j                  |       t        d||      S # t
        $ r/}	t        dt!        |	      j                         |      cY d }	~	S d }	~	ww xY w)Nr   r   r      zUHermes Console does not run shell syntax. Use one supported Hermes command at a time.>   r   r:  r   zRun `r,  )r#   r$   )r"   r#   r   )rD   r   rp   _help_resultr   r   _execute_builtinr:  r   _resolve_commandr/   r0   r*   r-   rE   _cap_outputr!   )
r6   rS   r?  raw_liner   builtinr#   r   r"   rJ   s
             r   executezHermesConsoleEngine.execute  sr   ::< &&!	U *F&)x/((**%h7)0 
 ++F3G"#77LL''1 11&9MGT	$&$)0)=)= *1w}}oR0	  __T40779F%%f-FLL) fhGG" 	U S1A8TT	Us2   +D< A
D< AD< "AD< <	E4$E/)E4/E4Nc           
        |r?|j                         }| j                  |      \  }}|j                   d|j                   S g d}t	        | j
                  j                         d       D ]I  }|j                  rdnd}|j                  | d|j                  ddt        |j                                K |j                  g d	       dj                  |      S )
Nr[   )zHermes Consoler    zSupported commands:c                    | j                   S r   )r*   )cs    r   r  z/HermesConsoleEngine.help_text.<locals>.<lambda>  s
    AGG r   )keyz *r   rg   r   )r    z* requires confirmationz;Built-ins: help, help <command>, history, clear, exit, quit)ri   rD  r*   r+   sortedr;  valuesr/   r   rj   extendr_   )r6   subjectr   r#   r   r`   markers          r   r   zHermesConsoleEngine.help_text  s    ]]_F!226:NGUmm_Bw&788

 dmm224:KL 	\G$--T4FLLF81W]]3$7q9X8YZ[	\ 		
 yyr   c                   | j                  dddt               | j                  dddt               | j                  ddd	t               | j                  d
ddt               | j                  dddt
               | j                  dddt               | j                  dddt               | j                  dddt        dd       | j                  dddt               | j                  dd d!t               | j                  d"d#d$t        dd%       | j                  d&d'd(t        dd)       | j                  d*d+d,t        dd-       | j                          y ).Nr   r   zShow Hermes component status.doctorrU  z!Run diagnostics without auto-fix.)logszlogs [name] [-n N]zShow recent Hermes logs.)r   listzsessions list [--limit N]zList recent sessions.)r   statssessions statszShow session store statistics.)configshowconfig showzShow current configuration.)rZ  r)   config pathzPrint config.yaml path.)rZ  rR   zconfig set <key> <value>zSet a configuration value.TzUpdate Hermes configuration?r-  )cronrW  zcron list [--all]zList scheduled jobs.)r^  r   cron statuszShow cron scheduler status.)r^  pausezcron pause <job>zPause a scheduled job.zPause this cron job?)r^  resumezcron resume <job>zResume a paused cron job.zResume this cron job?)r^  runzcron run <job>z%Run a job on the next scheduler tick.zTrigger this cron job?)r   _status_doctor_logs_sessions_list_sessions_stats_config_show_config_path_config_set
_cron_list_cron_status_cron_pause_cron_resume	_cron_run_register_broad_cli_surfacer6   s    r   r<  z&HermesConsoleEngine._register_defaults)  s_   k8-LgVk8-PRYZi!57QSXY*,GI`bpq+-=?_apq(-9VXde(-9RT`a&(7 	 	
 	&(;=SU_`(-9VXde$/ 	 	
 	'0 	 	
 	31 	 	
 	((*r   c                   i dddddgt               fdddd	dgt               fd
dddddgddhfdddddgt               fdddddgt               fdddddgt               fdddd dgdhfd!d"d#d$dgdhfd%d&d'd(d)d*gt               fd+d,d-d.g d/h d0fd1d2d3d4g d5h d6fd7d8d9d:g d;h d<fd=d>d?d@g dAh dBfdCdDdEdFg dGdHdIhfdJdKdLdMg dNh dOfdPdQdRdSg dTh dUfdVdWdXdYg dZd[d\hfd]d^d_g d`h dafdbdcdddegt               fdfdgdhg dih djfdkdldmg dnh dofdp}|j                         D ]/  \  }\  }}}}}t        |||      }t        | ||||||||fdqr       1 | j	                  dsdtdut
        dvdwx       | j	                  dydzd{t        dvd|x       | j	                  d}d~dt        dvdx       | j	                  dddt        dvdx       | j	                  dddt        dvdx       | j	                  dddt               | j	                  dddt        dddd      dvdx       ddg}	t        | d|	t        dd      d        t        | dg dt        dd      g dd        t        | dg dt        dd      g dd        dddg dh dfdddg dh dfdddg dh dfdddg dh dfd}
|
j                         D ]/  \  }\  }}}}}t        |||      }t        | ||||||||fdr       1 y)zARegister non-admin CLI commands that are safe for Hermes Console.versionzhermes_cli.subcommands.versionbuild_version_parsercmd_versionr   dumpzhermes_cli.subcommands.dumpbuild_dump_parsercmd_dumpdebugzhermes_cli.subcommands.debugbuild_debug_parser	cmd_debug)sharedeletezprompt-sizez"hermes_cli.subcommands.prompt_sizebuild_prompt_size_parsercmd_prompt_sizeinsightszhermes_cli.subcommands.insightsbuild_insights_parsercmd_insightssecurityzhermes_cli.subcommands.securitybuild_security_parsercmd_securityauditbackupzhermes_cli.subcommands.backupbuild_backup_parser
cmd_backupimportz!hermes_cli.subcommands.import_cmdbuild_import_cmd_parser
cmd_importrZ  zhermes_cli.subcommands.configbuild_config_parser
cmd_config)zenv-pathchecktoolszhermes_cli.subcommands.toolsbuild_tools_parser	cmd_tools)rW  enabledisablez
post-setup>   r  r  r  pluginszhermes_cli.subcommands.pluginsbuild_plugins_parsercmd_plugins)r  r  r  installupdateremove>   r  r  r  r  r  skillszhermes_cli.subcommands.skillsbuild_skills_parser
cmd_skills))browse)search)inspectr  r  )zlist-modified)diffr  r  r  	uninstallresetzopt-inopt-outrepair-officialsnapshotexportr  r  )taprW  r  addr  r  >   r  r  r  r  r  r  r  r  r  r  r  r  mcpzhermes_cli.subcommands.mcpbuild_mcp_parsercmd_mcp)
r  )catalogtestr  r  r  loginreauth	configurepicker>   r  r  r  r  r  r  r  memoryzhermes_cli.subcommands.memorybuild_memory_parser
cmd_memory)rS  offr  r  r  authzhermes_cli.subcommands.authbuild_auth_parsercmd_auth)	r  rS  r  r  r  logout)spotifyr   r  r  r  r  >   r  r  r  r  r  r  pairingzhermes_cli.subcommands.pairingbuild_pairing_parsercmd_pairing)r  approverevokezclear-pending>   r  r  r  webhookzhermes_cli.subcommands.webhookbuild_webhook_parsercmd_webhook)r  	subscriber  r  r  r  zhermes_cli.subcommands.hooksbuild_hooks_parser	cmd_hooks)r  r  rT  r  >   r  rT  r  zhermes_cli.subcommands.slackbuild_slack_parser	cmd_slack)manifesthermes_cli.subcommands.profilebuild_profile_parsercmd_profile)r  r[  infocreateusedescriberenamer}  r  r  r  r  >	   r  r  r}  r  r  r  r  r  r  zhermes_cli.subcommands.cronbuild_cron_parsercmd_cron)r  editr  tick>   r  r  r  r  )hooksslackprofiler^  c                ,    t        || |||t              S )Nr   )r   _apply_confirmed_defaults)r  r   r   r   r  s        r   r  zAHermesConsoleEngine._register_broad_cli_surface.<locals>.<lambda>S  s#      uG %>u r   )r   r0  r/   r   r1  )rZ  migrateconfig migratezUpdate config with new options.Tz2Update Hermes configuration with missing defaults?r-  )r   r  z<sessions export <output> [--source SOURCE] [--session-id ID]zExport sessions to JSONL.zExport session data?)r   r  z!sessions rename <session> <title>zRename a session.zRename this session?)r   optimizesessions optimizezOptimize the session store.zOptimize the session database?)r   repairz,sessions repair [--check-only] [--no-backup]z+Repair a malformed session database schema.zRepair the session database?)r  r  zShow active profile status.)sendzsend --to <target> <message>z(Send a message to a configured platform.r  zhermes_cli.send_cmdregister_send_subparserzSend this message?r  )r  portalhermes_cli.portal_clir   c                    t        d| dd      S )Nr  r  r   )r*  r  s    r   r  zAHermesConsoleEngine._register_broad_cli_surface.<locals>.<lambda>  s    .'	+ r   )r   r0  r   r1  project)r  r  r  z
add-folderzremove-folderr  zset-primaryr  archiverestorez
bind-boardhermes_cli.projects_cmdbuild_parser)	r  r  r  r  r  r  r  r  r  c                     t        d| ddd      S )Nr  r  r  cmd_projectr'  r  s    r   r  zAHermesConsoleEngine._register_broad_cli_surface.<locals>.<lambda>  s    *:)+ r   )r   r0  r   r/   r1  kanban)init)boardsrW  r"  r  r"  rmr"  switch)r"  r   r"  r  r"  zset-workdirr  r  r  assignreclaimreassign)diagnoselinkunlinkclaimcommentcompleter  blockscheduleunblockpromoter  )rX  )runs)	heartbeat)assignments)contexthermes_cli.kanban)r   r#  r$  r&  r(  r)  r  r*  r,  r.  r1  r3  r5  r7  r9  r  r;  r=  r?  rA  r  c                     t        d| ddd      S )Nr  rG  r  
cmd_kanbanr  r  s    r   r  zAHermesConsoleEngine._register_broad_cli_surface.<locals>.<lambda>  s    *:#+ r   zhermes_cli.bundlesregister_clibundles_command)r  r  r  r}  reload>   r  r}  rL  zhermes_cli.checkpointsN)rS  r  pruner   clear-legacy>   rP  rN  rQ  zhermes_cli.curator)rS  rb  r`  ra  pinunpinr  )zlist-archivedr  rN  r  rollback>
   rV  rS  rT  rN  rX  rZ  rU  r  r  r[  zhermes_cli.pets)r  r  selectr  r  scaler  rT  >   r  r_  r  r]  r  )bundlescheckpointscuratorpetsc                ,    t        || |||t              S )Nr
  )r$  r  )r  r   r   r   r  s        r   r  zAHermesConsoleEngine._register_broad_cli_surface.<locals>.<lambda>K  s#      wJ!-%>w r   )rR   r   r   r6  r   _config_migrate_sessions_export_sessions_rename_sessions_optimize_sessions_repair_profile_statusr*  r   r   r   )r6   	extractedr   r   r   r  r0  r/   r   portal_paths
registeredr   r  s                r   rp  z/HermesConsoleEngine._register_broad_cli_surfaceU  s   q
0&q
 -#q
 .$[)[)q
, 4*!-q
: 1';q
H 1'Iq
V /%Wq
d 3)eq
r /%
+sq
@ .$G<Aq
N 0&^SOq
\ /%,5(]q
n ,"!oq
b /%3:&cq
p -#
qq
` 0&J?aq
n 0&C-oq
~ /$@5 /$ 1&
%> .#@@Uq
	f GPooFW 	BDB67L%,VWlKI$!#37PWfr !	$ 	!-M 	 	
 	"J'/ 	 	
 	"// 	 	
 	$)9 	 	
 	":97 	 	
 	)		
 	*662'<>WX- 	 	
 ":. &'>M	
 	! ))BNS
9#	
J 	! B ))<nM.yC	
N %!M7 )S; %%@ "qN]5

l HRGWGWGY 	CDC68\5(-dFHEI$!#37QYht !	r   r    r-  c               V    t        |      }t        ||||||      | j                  |<   y )N)r)   r*   r+   r-   r/   r0   )r.  r'   r;  )r6   r)   r*   r+   r-   r/   r0   rL  s           r   r   zHermesConsoleEngine.registerU  s2     Dk+%
cr   c                   |d   }|dk(  rCdj                  |dd        j                         xs d }	 t        d| j                  |            S |dk(  r<d	j                  d
 t        | j                        D              }t        d|xs d      S |dk(  rt        dd      S |dv rt        d      S y # t        $ r }t        dt        |            cY d }~S d }~ww xY w)Nr   r   rg   rA  r   r"   r   r:  r[   c              3  6   K   | ]  \  }}|d z    d|   yw)rA  r4   Nr   )r   idxcmds      r   r   z7HermesConsoleEngine._execute_builtin.<locals>.<genexpr>s  s#     [xsC#'"SE2[s   zNo history yet.r   z[2J[H>   r   quitr   )r_   rD   r   r   r   r!   	enumerater:  )r6   r   headrP  rJ   r"   s         r   rC  z$HermesConsoleEngine._execute_builtinj  s    ay6>hhvabz*002:dG?$T$..2IJJ 9YY[9T\\CZ[[F f.I8IJJ7? AA## (( ' ?$WSX>>?s   B1 1	C:CCCc                0   | j                  |      }|rt        |      t        t        t	        |      d      dd      D ]?  }t        |d |       }| j                  j                  |      }|s/|t        ||d        fc S  | j                  D cg c]  }dj                  |       }}t	        |      dkD  rdj                  |d d       n|d   }t        j                  ||dd      }	|	rd	d
j                  |	       dnd}
t        d| d|
       c c}w )Nrh   r   rX   rg   rA  rY   g?)ncutoffz Did you mean: z, r   r    z$Unsupported Hermes Console command: .)_rejection_forr   rangeminrQ   r.  r;  r   rW  r_   difflibget_close_matches)r6   r   rejectedsizerL  r#   r)   	availableprobesuggestionssuffixs              r   rD  z$HermesConsoleEngine._resolve_command{  s   &&v.%h//#c&k1-q"5 	4Du&Cmm'',GVDE] 333		4 15>SXXd^>	>(+Fa$VAY//yAdS@K?499[#9":!<QS!$HqQWPX"YZZ	 ?s   Dc                    |d   }|j                  d      r| dS h d}||v rd| dS ddd	d
dddddddddddd}t        |      dk\  r|d   |d   f}||v r||   S t        |d d       dv ryy)Nr   rO   z$ is not available in Hermes Console.>   whatsapp-cloudacpguimoachatclawr  modelproxyservesetupr  r  desktopgatewayoneshotfallbackwhatsapp	dashboardr  
completionpostinstallz`hermes z%` is not available in Hermes Console.zE`config edit` opens an editor and is not available in Hermes Console.zC`mcp serve` starts a server and is not available in Hermes Console.zN`profile alias` creates shell wrappers and is not available in Hermes Console.zF`skills config` is interactive and is not available in Hermes Console.z4`skills publish` is not available in Hermes Console.zE`portal login` is interactive and is not available in Hermes Console.zE`portal open` opens a browser and is not available in Hermes Console.zD`kanban tail` streams output and is not available in Hermes Console.zE`kanban watch` streams output and is not available in Hermes Console.zH`kanban daemon` starts a service and is not available in Hermes Console.zK`kanban dispatcher` starts a worker and is not available in Hermes Console.zH`kanban swarm` starts agent work and is not available in Hermes Console.zL`kanban decompose` starts agent work and is not available in Hermes Console.zJ`kanban specify` starts agent work and is not available in Hermes Console.z/`kanban gc` is not available in Hermes Console.))rZ  r  )r  r  )r  alias)r  rZ  )r  publish)r  r  )r  open)r  tail)r  watch)r  daemon)r  
dispatcher)r  swarm)r  	decompose)r  specify)r  gcrY   rA  >   r   rO  r   r~  zK`sessions delete` and `sessions prune` are not available in Hermes Console.r    )r^   rQ   r.  )r6   r   firstblocked_topblocked_pairspairs         r   r|  z"HermesConsoleEngine._rejection_for  s    q	C W@AA
0 KeW$IJJ gc"r"j#Y!h g f!h"l&s!k%s#oO
" v;!1Ivay)D}$$T** OO`r   c                8    t        d| j                               S )Nr   rq  )r   r   rq  s    r   rB  z HermesConsoleEngine._help_result  s    T$..*:;;r   c                    t        |      | j                  k  r|S t        |      | j                  z
  }|d | j                    d| dS )Nz
... output truncated (z bytes omitted))rQ   r8  )r6   r"   omitteds      r   rE  zHermesConsoleEngine._cap_output  sP    v;$+++Mf+ 1 11+$++,--EgYo^^r   )r8  r@   )rS   r!   r?  r.   r8   r   r   )rP  
str | Noner8   r!   r8   r   )r)   zIterable[str]r*   r!   r+   r!   r-   r,   r/   r.   r0   r!   r8   r   )r   r  r8   zConsoleResult | None)r   Sequence[str]r8   z tuple[ConsoleCommand, list[str]])r   r  r8   r!   )r8   r   )r"   r!   r8   r!   )r   r   r   r   r=  rH  r   r<  rp  r   rC  rD  r|  rB  rE  r   r   r   r  r    s    ;.3 " 7< &UP .*+X~N 

 
 	

 C
 
 
 

*"["5n<_r   r  c                $    | rt        d|       y )NzUsage: )r   )r   r*   s     r   _expect_no_argsr    s    !GE7"344 r   c                (   dD ]  }t        | |      st        | |d        t        | dd      dk(  rt        | dd       t        | dd      dv rt        | dd       t        | d	d      d
k(  r't        | dd      st        | dd      st        | dd       t        | dd      dk(  r)t        | dd      }|dv rt        | dd      st        d      t        | dd      yt        | dd      dv rt        | dd       t        | dd      dk(  rt        | dd       yy)zFSkip nested prompts after the console-level confirmation has happened.)yesTr   Nr  forcecheckpoints_command>   r   rR  plugins_actionr  r  F	no_enableauth_actionr  	auth_type>   api-keyapi_keyr  z=auth add --type api-key requires --api-key in Hermes Console.import_nameskills_action>   r  r  r  r  r  memory_commandr  )hasattrr   r   r   )r   attrr  s      r   r  r    s7     &4D$%& t'.(:gt$t*D15NNgt$t%t,	9tXu-gdKQV6WD+t,t]D)U2D+t4	..wtYPT7U%&efft]D)5t_d+ 0  	eT"t%t,7eT" 8r   c                j    t        |d       ddlm ddlm t        fd      }t        |      S )Nr   r   SimpleNamespace)show_statusc                 $       dd            S )NF)alldeepr   )r  r  s   r   r  z_status.<locals>.<lambda>  s    [UQV1W%X r   )r  typesr  hermes_cli.statusr  rL   rc   )r  r   r"   r  r  s      @@r   rc  rc    s)    D(#%-XYF'//r   c                T    t        |d       ddlm ddlm t        fd      S )NrU  r   r  )
run_doctorc                 $       dd             S )NF)fixackr   )r  r  s   r   r  z_doctor.<locals>.<lambda>  s    :o%T.R#S r   )r  r  r  hermes_cli.doctorr  rL   )r  r   r  r  s     @@r   rd  rd    s    D(#%,STTr   c                   d|v sd|v rt        d      t        dd      }|j                  ddd	
       |j                  ddt        d       |j                  d       |j                  d       |j                  d       |j                  d       |j	                  |      j
                  dk  sj
                  dkD  rt        d      ddlm}m j                  dk(  rt        |      S t        fd      S )Nz-fz--followz-`logs -f` is not available in Hermes Console.rV  Fr   log_namer   agent)nargsdefaultz-nz--lines2   typer  z--levelz	--sessionz--sincez--componentrA  i  z&logs --lines must be between 1 and 500r   )	list_logstail_logrW  c            	           j                    j                  d j                   j                   j                   j
                        S )NF)	num_linesfollowlevelr   since	component)r  r`   r  r   r  r  )nsr  s   r   r  z_logs.<locals>.<lambda>  s9    KKhh((JJ((ll
 r   )r   r2   add_argumentr@   r  r`   hermes_cli.logsr  r  r  rL   )r  r   r   r  r  r  s       @@r   re  re    s    t|zT)!"QRR&59F

#w?
ic2>
	"
$
	"
&			4	 B	xx!|rxx#~!"JKK3	{{fy))	

 
r   c                z   t        dd      }|j                  dt        d       |j                  |      }|j                  dk  s|j                  dkD  rt        d	      d
dlm}  |       }	 |j                  dg|j                  d      }|j                          t        |      S # |j                          w xY w)Nzsessions listFr   z--limit   r  rA     z/sessions list --limit must be between 1 and 200r   	SessionDBtoolT)exclude_sourcesre   order_by_last_active)r2   r  r@   r  re   r   hermes_stater  list_sessions_richcloser   )r  r   r   r  r  dbr   s          r   rf  rf  #  s    /EBF
	R8			4	 B	xx!|rxx#~!"STT&	B((#H((!% ) 
 	
H%% 	
s   .B( (B:c                   t        |d       ddlm}  |       }	 |j                         }|j                  ddg      }|j	                         }d| d| d	| g}d
D ].  }|j                  |      }	|	s|j                  d| d|	        0 dj                  |      |j                          S # |j                          w xY w)NrY  r   r  Tr  )exclude_childrenr  zTotal sessions: zListable sessions: zTotal messages: )clituitelegramdiscordr  r^  r   r   r4   r[   )r  r  r  session_countr   r   r_   r  )
r  r   r  r  totallistabler   r`   r   counts
             r   rg  rg  8  s    D*+&	B  "##TF8#T##%ug&!(,xj)

 M 	5F$$F$3Er&E734	5 yy


s   AB1 7)B1 1Cc                <    t        |d       ddlm} t        |      S )Nr\  r   )show_config)r  hermes_cli.configr  rL   )r  r   r  s      r   rh  rh  O  s    D-(-;''r   c                F    t        |d       ddlm} t         |             S )Nr]  r   )get_config_path)r  r  r  r!   )r  r   r  s      r   ri  ri  V  s    D-(1 !!r   c                    t        |      dk  rt        d      |d   dj                  |dd        ddlm t        fd      S )NrY   zUsage: config set <key> <value>r   rg   rA  )set_config_valuec                             S r   r   )rL  r  r   s   r   r  z_config_set.<locals>.<lambda>d  s    #3C#? r   )rQ   r   r_   r  r  rL   )r  r   rL  r  r   s     @@@r   rj  rj  ]  sF    
4y1}!"CDD
q'CHHT!"XE2?@@r   c                8    t        |d       dd}t        |      S )Nr  c                     ddl m}   | dd      }|j                  d      s|j                  d      rt        d       nt        d       |j                  d	      xs g }|D ]  }t        d
|         y )Nr   )migrate_configF)interactivequiet	env_addedconfig_addedzConfiguration updated.zConfiguration is up to date.warningsz	Warning: )r  r  r   print)r  resultsr
  warnings       r   _runz_config_migrate.<locals>._runj  sk    4 U%@;;{#w{{>'B*+01;;z*0b 	)GIgY'(	)r   r  r  rL   r  r   r  s      r   rf  rf  g  s    D*+
) 4  r   c                    t        dd      }|j                  d       |j                  d       |j                  d       |j                  |      dfd}t        |      S )	Nzsessions exportFr   r"   z--sourcez--session-idc                    ddl m}   |        }	 j                  rf|j                  j                        }|st	        dj                   d      |j                  |      }|st	        dj                   d      |g}n|j                  j                        }|D cg c]  }t        j                  |d       }}dj                  |      }|r|dz  }j                  d	k(  r t        j                  j                  |       nXt        j                        j!                         j#                  |d
       t%        dt'        |       dj                          |j)                          y c c}w # |j)                          w xY w)Nr   r  	Session '' not found.r  F)ensure_asciir[   rO   zutf-8)encodingz	Exported z session(s) to )r  r  
session_idresolve_session_idr   export_session
export_allr   jsondumpsr_   r"   sysrG   writer   
expanduser
write_textr  rQ   r  )	r  r  resolved_session_iddatarowsrowr`   rK   r  s	           r   r  z_sessions_export.<locals>._run  sC   *[	}}&(&;&;BMM&J#*-	"--.UVV(()<=-	"--.UVVv}}BII}6DHISTZZ%8IEI99U#DyyC

  &RYY**,77w7O	#d)OBII;GHHHJ J HHJs   BE7 "E2 B!E7 2E7 7F	r  r2   r  r  rL   r  r   r   r  r  s       @r   rg  rg  y  s\    "3eDF
!

#
'			4	 B8 4  r   c                    t        dd      }|j                  d       |j                  dd       |j                  |      d	fd}t        |      S )
Nzsessions renameFr   r  r   +)r  c                    ddl m}   |        }	 |j                  j                        }|st	        dj                   d      dj                  j                        }|j                  ||      st	        dj                   d      t        d| d|        |j                          y # |j                          w xY w)Nr   r  r  r  rg   z' renamed to: )
r  r  r  r  r   r_   r   set_session_titler  r  )r  r  r!  r   r  s       r   r  z_sessions_rename.<locals>._run  s    *[		"$"7"7"F&)Ibmm_L*QRRHHRXX&E''(;UC)Ibmm_L*QRRI12.HIHHJBHHJs   BB. .C r  r%  r&  s       @r   rh  rh    sS    "3eDF
%
s+			4	 B 4  r   c                8    t        |d       dd}t        |      S )Nr	  c                     ddl m}   |        }	 |j                         }t        d| d       |j	                          y # |j	                          w xY w)Nr   r  z
Optimized z FTS index(es).)r  r  vacuumr  r  )r  r  r  s      r   r  z _sessions_optimize.<locals>._run  s@    *[	IIKEJug_56HHJBHHJs	   ? Ar  r  r  s      r   ri  ri    s    D-. 4  r   c                    t        dd      }|j                  dd       |j                  dd       |j                  |      d	fd}t        |      S )
Nzsessions repairFr   z--check-only
store_truer   z--no-backupc                    ddl m} m}m} | }|j	                         st        d| d       y  ||      }|t        | d       y t        | d|        j                  ry  ||j                         }|j                  d      rK|j                  d	      rt        d
|d	           t        d|j                  d              t        d       y t        d|j                  d             )Nr   )DEFAULT_DB_PATH_db_opens_cleanlyrepair_state_db_schemazNo session database at z (nothing to repair).z! opens cleanly; no repair needed.z does not open cleanly: rZ  repairedbackup_pathzbackup: z
strategy: strategyzRepaired session database.zRepair failed: r   )
r  r2  r3  r4  existsr  
check_only	no_backupr   r   )r2  r3  r4  db_pathreasonreportr  s         r   r  z_sessions_repair.<locals>._run  s    [[!~~+G94IJK"7+>WI>?@	1&:;=='BLL8HI::j!zz-(!6 789Jvzz*5678./!OFJJw4G3H"IJJr   r  r%  r&  s       @r   rj  rj    sY    "3eDF
|<
l;			4	 BK. 4  r   c                <    t        |d       t        dddddd      S )Nr  r   r  r  r  )r   r  r   r   r   r   )r  r	  )r  r   s     r   rk  rk    s+    D)$)4+' r   c                    t        dd      }|j                  dd       |j                  |      ddlm t        fd	      S )
Nz	cron listFr   z--allr/  r0  r   )	cron_listc                 *      j                         S )N)show_all)r  )r@  r  s   r   r  z_cron_list.<locals>.<lambda>  s    9bff#= r   )r2   r  r  hermes_cli.cronr@  rL   )r  r   r   r@  r  s      @@r   rk  rk    sA    +>F
5			4	 B)=>>r   c                <    t        |d       ddlm} t        |      S )Nr_  r   )cron_status)r  rC  rE  rL   )r  r   rE  s      r   rl  rl    s    D-(+;''r   c                    t        |      dk7  rt        d      ddlm}m} 	  ||d   d      }|st        d|d          t        |d      S # |$ r}t        t        |            |d }~ww xY w)	NrA  zUsage: cron pause <job>r   )AmbiguousJobReference	pause_jobzpaused from hermes console)r<  Job not found: Paused)rQ   r   	cron.jobsrG  rH  r!   r   )r  r   rG  rH  r   rJ   s         r   rm  rm    s}    
4yA~!";<<:5Q(DE !ODG9"=>>sH%%	 ! 5!#c(+45s   A A.A))A.c                    t        |      dk7  rt        d      ddlm}m} 	  ||d         }|st        d|d          t        |d      S # |$ r}t        t        |            |d }~ww xY w)NrA  zUsage: cron resume <job>r   )rG  
resume_jobrI  Resumed)rQ   r   rK  rG  rM  r!   r   )r  r   rG  rM  r   rJ   s         r   rn  rn    sz    
4yA~!"<==;5a! !ODG9"=>>sI&&	 ! 5!#c(+45   A A,A''A,c                    t        |      dk7  rt        d      ddlm}m} 	  ||d         }|st        d|d          t        |d      S # |$ r}t        t        |            |d }~ww xY w)NrA  zUsage: cron run <job>r   )rG  trigger_jobrI  	Triggered)rQ   r   rK  rG  rQ  r!   r   )r  r   rG  rQ  r   rJ   s         r   ro  ro    sz    
4yA~!"9::<5$q'" !ODG9"=>>sK((	 ! 5!#c(+45rO  )stdinrG   rH   r  c                L   | xs t         j                  } |xs t         j                  }|xs t         j                  }|t	         t        | dd                    }t               }|rt        d|       	 |rt        dd|d       | j                         }|dk(  r|rt        |       y	|j                  |      }|j                  d
k(  r|st        d|j                   |       yt        |j                   dd|d       | j                         }|j                         j                         dvrt        d|       |j                  |j                  d      }|j                  r*|j                  dk(  r|n|}t        |j                  |       |j                  dk(  ry	1)z&Run the local ``hermes console`` REPL.isattyc                      y)NFr   r   r   r   r  z"run_console_repl.<locals>.<lambda>:  s    r   z9Hermes Console. Type `help` for commands, `exit` to quit.)fileTzhermes> r    )endrW  flushr   r   zConfirmation required: rA  z [y/N] >   yr  z
Cancelled.r>  r   r   )r  rS  rG   rH   r.   r   r  r  readlinerH  r   r$   rD   lowerr#   r"   )	rS  rG   rH   r  r/  rS   rI   answerstreams	            r   run_console_replr_  -  sv    SYYE!szzF!szzFB75(MBDE "FIPVW
*"6>~~2:6"%==..-f.I.I-JK V0019rVZ[^^%F||~##%\9l0^^FNNd^CF==%}}7VVF&--f-==F"9 r   )rF   zCallable[[], object]r8   r!   )rS   r!   r8   r.   )rK   r!   r8   r!   )r+   r!   re   r@   r8   r!   )rS   r!   r8   r  )rS   r!   r   r  r8   r.   )r   zSequence[dict]r8   r!   )r   dictr   r!   r8   r!   )r8   z2tuple[_ArgumentParser, argparse._SubParsersAction])r   r   r8   z list[argparse._SubParsersAction])r   zargparse._SubParsersActionr   r!   r8   r!   )rK   r  r8   r!   )r   r   r8   dict[tuple[str, ...], str])r   argparse.Namespacer8   r   )r   r!   r   r!   r   r!   r8   ra  )r   r!   r   r!   r   r!   r8   ra  )r   r!   r   r!   r8   ra  )r   r!   r   r!   r8   ra  )r   rb  r8   object)r   rb  r   rc  r8   rb  )r   r!   r  r  r   r  r   r!   r   r!   r   r!   r   +Callable[[argparse.Namespace], None] | Noner8   r!   )r   r!   r  r  r   r  r   r!   r   r!   r  r  r   rd  r8   r!   )r   r!   r  r  r   r  r   r!   r   r!   r   rd  r8   r!   r   )r   r!   r  r  r   r!   r   r!   r   r!   r   rd  r8   r,   )NN)r   r!   r  r  r   r!   r   r!   r  r  r   rd  r8   r,   )r   r!   r  r  r   r!   r   r!   r   rd  r8   r,   )r/  z'HermesConsoleEngine'r   r!   r0  Iterable[Sequence[str]]r1  zLCallable[[Sequence[str]], Callable[['HermesConsoleEngine', list[str]], str]]r/   re  r+   r!   r   z!dict[tuple[str, ...], str] | Noner0   r!   r8   r   )r   r  r*   r!   r8   r   )r   rb  r8   r   r  )r  zbool | Noner8   r@   )Vr   
__future__r   r   r<   r  	functoolsr   r:   r  rn   r  dataclassesr   r   pathlibr   typingr   r   r	   r
   r   tools.ansi_stripr   rP   r   RuntimeErrorr   r   r'   ArgumentParserr2   rL   rV   rc   rj   rp   r   r   r   r   r   r   r   r   r   	lru_cacher   r   r   r   r   r   r	  r  r  r  r   r$  r'  r*  r6  r  r  r  rc  rd  re  rf  rg  rh  ri  rj  rf  rg  rh  ri  rj  rk  rk  rl  rm  rn  ro  r_  r   r   r   <module>ro     s   #      	   
 *  B B 6 JK/, / $# # # $  =h-- =
"$%. 24 1N,8
$ T"   	 # T"
   	 #  T"


  
 #
 T" # EIA
A A 	A
 A A A BA 	A:  $DHA
A A 	A
 A A A BA 	A> EIA
A A 	A
 A A A BA 	A8 EIA
A A 	A
 A A BA 	A0 EI
  	
  B 76  $DH
  	
  B 78 EI
  	
  B 76 EI
  	
 B 74 )+37
!
 
 #	

 b
 &
 
 1
 
 

6i_ i_X5
#>0U>&*.("A!$#!L!0! !@	?(&')  #/
 / 	/r   