
    Pmjj_                       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mZ ddl	m
Z
mZmZ  ej        e          ZdZ eh d          Z eh d          Z ej        d	          Zd
ddIdZdJdZdKdZdLdZ ed           G d d                      ZdMdZdMd ZdNd"Zdd#d$dOd'ZdPd*ZdQd,Z dQd-Z!dRd.Z"dRd/Z#dSd0Z$dRd1Z%dTd2Z&d3 Z'dUd4Z(dUd5Z)dTd6Z*dVd8Z+dWd:Z,dXd<Z- G d= d>          Z.dYd?Z/dZdCZ0d[dDZ1d\dFZ2d]dGZ3ddHgZ4dS )^aC  Gateway Health & Diagnostics OTLP export runtime.

This exporter emits operator-owned gateway service-health metrics plus
narrow redacted diagnostic events. It is deliberately in-process and fail-open so
it works under systemd, launchd, s6, containers, tmux, nohup, or a simple shell
without a sidecar/watchdog dependency.
    )annotationsN)	dataclass)AnyDictOptionalzhermes.gateway.diagnostics>	   cloud.regioncloud.platformcloud.providerservice.versionservice.namespacedeployment.environment.nameservice.nametelemetry.scopeservice.instance.id>	   nameversionplatformseverity	new_state	old_state	subsystem
error_codeerror_classz^[A-Za-z0-9._:/-]{1,128}$i  limitrawr   r   intreturnstrc               z    	 ddl m}  |t          | pd                    pdd |         S # t          $ r Y dS w xY w)Nr   )redact_for_export z
[redacted]z[redaction-unavailable])agent.monitoring.redactionr!   r   	Exception)r   r   r!   s      L/home/thesage/.hermes/hermes-agent/agent/monitoring/gateway_health_export.py_redact_stringr&   /   sf    )@@@@@@!!#ciR..11A\6E6JJ ) ) )((()s   ), 
::Dict[str, str]c                b   i }t          | t                    s|S |                                 D ]\  }}t          |          }|t          vs| |dk    rddlm}  ||          ||<   ;t          |          }t                              |          set          |d          |k    r{|||<   |S )zIAllowlist bounded resource labels and reject values changed by redaction.Nr   r   _safe_instance_id   r   )

isinstancedictitemsr   _RESOURCE_ATTRIBUTE_KEYSagent.monitoring.gateway_healthr*   _SAFE_RESOURCE_VALUE	fullmatchr&   )r   attrskeyvaluer*   texts         r%   _safe_resource_attributesr7   7   s    Ec4   iikk  
U#hh...%-'''IIIIII**511E#J5zz#--d33 	$c***d22c

L    configDict[str, Any]telemetry_scopec                   t          |           }t          |                    d                    }ddlm} d|d<    |t          |                     |d<   ||d<   |S )zCBuild the safe OTLP resource shared by metrics and diagnostic logs.resource_attributesr   r)   zhermes-gatewayr   r   r   )_gateway_health_configr7   getr0   r*   _install_id)r9   r;   ghr3   r*   s        r%   _runtime_resource_attributesrB   M   su     
 	'	'B%bff-B&C&CDDEAAAAAA,E.#4#4[5H5H#I#IE
 .E
Lr8   eventc                    i }t           D ]F}|                     |          }|t          |t                    rt	          |          n||d| <   G|S )Nzhermes.)_DIAGNOSTIC_ATTRIBUTE_KEYSr?   r,   r   r&   )rC   r3   r4   r5   s       r%   _diagnostic_log_attributesrF   [   sd    E) \ \		#=:DUC:P:P![!6!6!6V[oooLr8   T)slotsc                      e Zd ZU ded<   dZded<   dZded<   dZded	<   dZded
<   dZded<   dZ	ded<   dZ
ded<   ddZdS )GatewayHealthExportRuntimeboolenableddisabledr   reasonNr   streamermetric_providerlog_handlerlog_streamerzOptional[threading.Thread]threadzOptional[threading.Event]
stop_eventr   Nonec                   | j         | j                                          | j        | j                            d           | j        =	 t          j                                        | j                   n# t          $ r Y nw xY w	 ddl	m
}  |            }|                    d           | j        |                    | j                   | j        |                    | j                   n# t          $ r Y nw xY wd | j        | j        | j        fD             dfd	}rAt!          j        |d
d          }|                                 |                    d           d | _        d | _        d | _        d | _        d | _         d S )Ng      ?)timeoutr   get_emitterg      ?c                    g | ]}||S N ).0items     r%   
<listcomp>z7GatewayHealthExportRuntime.shutdown.<locals>.<listcomp>   s(     
 
 
 r8   r   rT   c                 \    D ]'} 	 |                                   # t          $ r Y $w xY wd S rZ   )shutdownr$   )r]   
closeabless    r%   _closez3GatewayHealthExportRuntime.shutdown.<locals>._close   sP    "  MMOOOO    D s   
))z%hermes-gateway-health-export-shutdownTtargetr   daemong       @r   rT   )rS   setrR   joinrP   logging	getLoggerremoveHandlerr$   agent.monitoring.emitterrX   flushrN   unsubscriberQ   rO   	threadingThreadstart)selfrX   emitterrb   workerra   s        @r%   r`   z#GatewayHealthExportRuntime.shutdownp   s   ?&O!!!;"KT***'!##11$2BCCCC   		<<<<<<!kmmGMM#M&&&}(##DM222 ,##D$5666 	 	 	D	

 
"mT->@TU
 
 


	 	 	 	 	 	  	%%<  F
 LLNNNKKK$$$ #s%   +A8 8
BB	A(C2 2
C?>C?rf   )__name__
__module____qualname____annotations__rM   rN   rO   rP   rQ   rR   rS   r`   r[   r8   r%   rI   rI   e   s         MMMFHOKL)-F----,0J00004 4 4 4 4 4r8   rI   c                b    | pi                      d          pi }|                     d          pi S )N
monitoringgateway_health_exportr?   )r9   mons     r%   r>   r>      s6    <R

\
*
*
0bC77*++1r1r8   c                    | pi                      d          pi }|                     d          pi }|                     d          pi S )Nrz   exportotlpr|   )r9   r}   r   s      r%   _otlp_configr      sK    <R

\
*
*
0bCWWX$"F::f##r8   rJ   c                    t          |           }t          |           }t          |                    d          o)|                    d          o|                    d                    S )NrK   endpoint)r>   r   rJ   r?   )r9   rA   r   s      r%   _enabledr      sX    		'	'BDy!!Rdhhy&9&9Rdhhz>R>RSSSr8   F)auto_installpromptr   r   c                H   | r%	 ddl m}  |d|           n# t          $ r Y nw xY w	 ddlm} ddlm} ddlm} ddl	m
}m}m} dd	lm}	 dd
lm}
 ddlm} ddlm} ddlm} ddlm} ddlm} ||||	|||||
||||dS # t          $ r}t7          d|           |d }~ww xY w)Nr   )ensurezexport.otlpr   )OTLPLogExporter)OTLPMetricExporter)Observation)INVALID_SPAN_IDINVALID_TRACE_ID
TraceFlags)	LogRecord)SeverityNumber)LoggerProvider)BatchLogRecordProcessor)MeterProvider)PeriodicExportingMetricReader)Resource)r   r   r   r   r   r   r   r   r   r   r   r   r   zOTLP metrics SDK unavailable: )tools.lazy_depsr   r$   4opentelemetry.exporter.otlp.proto.http._log_exporterr   6opentelemetry.exporter.otlp.proto.http.metric_exporterr   opentelemetry.metricsr   opentelemetry.tracer   r   r   opentelemetry._logsr   opentelemetry._logs.severityr   opentelemetry.sdk._logsr   opentelemetry.sdk._logs.exportr   opentelemetry.sdk.metricsr    opentelemetry.sdk.metrics.exportr   opentelemetry.sdk.resourcesr   RuntimeError)r   r   _lazy_ensurer   r   r   r   r   r   r   r   r   r   r   r   r   excs                    r%   _require_metrics_sdkr      s    	>>>>>>Lv66666 	 	 	D	LXXXXXX]]]]]]555555UUUUUUUUUU111111??????::::::JJJJJJ;;;;;;RRRRRR888888."4&",. 0$,'>*-J 
 
 	
  L L LACAABBKLs$    
%%AA? ?
B!	BB!headers_envOptional[Dict[str, str]]c                    i }| pi                                  D ]E\  }}t          j                            t	          |                    }|r||t	          |          <   F|S rZ   )r.   osenvironr?   r   )r   resolvedheader_nameenv_namevals        r%   _resolve_headersr      se    !H"-"3!:!:!<!< - -XjnnS]]++ 	-),HS%%&Or8   r   c                f    |                      d          r| d t          d                    dz   S | S )N
/v1/traces/v1/metricsendswithlenr   s    r%   _metric_endpointr      s>    && >,3|,,,,-==Or8   c                    |                      d          r| d t          d                    dz   S |                      d          r| d t          d                    dz   S | S )Nr   z/v1/logsr   r   r   s    r%   _logs_endpointr      su    && ;,3|,,,,-
::'' <-3}----.;;Or8   c                 P    	 ddl m}  t          |           S # t          $ r Y dS w xY w)Nr   __version__unknown)
hermes_clir   r   r$   r   s    r%   _versionr      sI    ******;   yys    
%%c                 d    	 ddl m}  t           |             pd          S # t          $ r Y dS w xY w)Nr   get_active_profile_namedefault)hermes_cli.profilesr   r   r$   r   s    r%   _profiler      sX    ??????**,,9	:::   yys   ! 
//c                b    	 ddl m} t           ||                     S # t          $ r Y dS w xY w)Nr   )ensure_install_idr   )agent.monitoring.policyr   r   r$   )r9   r   s     r%   r@   r@     sU    ======$$V,,---   yys     
..c                    t           j                            d          rdS t           j                            d          st           j                            d          rdS t           j                            d          st           j                            d          rdS t           j                            d          rd	S d
S )NINVOCATION_IDsystemdS6_CMD_ARG0
S6_VERSIONs6	containerz/.dockerenvLAUNCHD_SOCKETlaunchdmanual)r   r   r?   pathexistsr[   r8   r%   _supervision_moder     s    	z~~o&& y	z~~m$$ 
|(D(D t	z~~k"" bgnn]&C&C {	z~~&'' y8r8   c           	         ddl m} 	 ddlm}  |            pi }n# t          $ r i }Y nw xY w ||dt                      t          |           t                      t                                S )Nr   )build_gateway_health_snapshot)read_runtime_statusT)gateway_runningprofile
install_idr   supervision_mode)	r0   r   gateway.statusr   r$   r   r@   r   r   )r9   r   r   runtimes       r%   _read_gateway_snapshotr     s    MMMMMM666666%%''-2   ((

v&&

*,,   s    **c                 "    ddl m}   |             S )Nr   build_cron_health_snapshot)agent.monitoring.cron_healthr   r   s    r%   _read_cron_snapshotr   *  s#    GGGGGG%%'''r8   c                    d} 	 ddl m} | t          dt           |                                z  } n,# t          $ r t
                              dd           Y nw xY w	 ddlm} | t          dt          |	                                                    z  } n,# t          $ r t
                              dd           Y nw xY w| S )a  Count live background/subagent work that ``active_agents`` does NOT include.

    ``hermes.gateway.active_agents`` counts foreground turns + in-flight cron
    jobs + API runs, but deliberately excludes backgrounded ``delegate_task``
    subagents, ``terminal(background=true)`` processes, kanban workers, and the
    runner's own background tasks (they are tracked only for the scale-to-zero
    suspend guard, ``_scale_to_zero_has_live_background_work``). Without this
    metric a peer churning through delegated subagents shows ``active_agents=0``
    on the fleet dashboard. Best-effort and content-free: a single integer,
    no job/task identity. Returns 0 if a source can't be imported.

    Delegation is counted TASK-granular (``active_task_count``): a fan-out batch
    of N subagents contributes N, not 1, so the metric reflects real concurrent
    subagent load rather than dispatch-unit/pool-slot count. This intentionally
    differs from the async pool's capacity accounting (one batch = one slot).
    r   )active_task_countz-background-work async-delegation count failedTexc_info)process_registryz-background-work process-registry count failed)
tools.async_delegationr   maxr   r$   loggerdebugtools.process_registryr   count_running)totalr   r   s      r%   _read_background_work_countr   0  s	   " EU<<<<<<Q--//00111 U U UDtTTTTTUU;;;;;;Q,::<<==>>> U U UDtTTTTTULs!   .3 &AA 8B &CCc                     	 ddl m}  t          dt           |                                 S # t          $ r  t
                              dd           Y dS w xY w)u  Count live async delegation UNITS (dispatch/pool slots).

    Complements ``_read_background_work_count`` (which is task-granular): this
    counts each ``delegate_task`` dispatch as ONE regardless of fan-out width,
    matching the async pool's capacity accounting (a batch = one slot). Together
    the two metrics let an operator see both slot pressure
    (``background_delegations``, alert vs ``max_concurrent_children``) and real
    concurrent subagent load (``background_work``). Delegations only — it does
    not include ``terminal(background)`` / kanban work, which are already folded
    into ``background_work``. Best-effort; 0 if the source can't be imported.
    r   active_countz#background-delegations count failedTr   )r   r   r   r   r$   r   r   r   s    r%   "_read_background_delegations_countr   Q  sp    7777771c,,..))***   :TJJJqqs   *- &AAc                .   t          |           }	 ddlm} |j        rt	          |j        d         j                  ni }|j                             |dt                      |                     |j                             |dt                      |                     n`# t          $ rS}t                              dt          |          j                   t                              dd	           Y d }~nd }~ww xY w	 t                      }nb# t          $ rU}t                              d
t          |          j                   t                              dd	           |cY d }~S d }~ww xY w|j                            |j                   |S )Nr   )GatewayMetrichermes.gateway.background_workr   r5   
attributes%hermes.gateway.background_delegationszIbackground-work snapshot unavailable; metric not exported (error_type=%s)z"background-work snapshot tracebackTr   zMcron health snapshot unavailable; cron telemetry not exported (error_type=%s)zcron health snapshot traceback)r   r0   r   metricsr-   r   appendr   r   r$   r   warningtyperu   r   r   extend)r9   gateway_snapshotr   baser   cron_snapshots         r%   _read_runtime_snapshotr  f  s   -f55JAAAAAA?O?W_t$,Q/:;;;]_ ''M5133  	
 	
 	
 	 ''M<8::  	
 	
 	
 	
  J J JWII	
 	
 	
 	9DIIIIIIIIJ +-- 
  
  
 
 	[II	
 	
 	
 	5EEE
  ##M$9:::s8   BB$ $
D.A	C<<DD 
E3A
E.(E3.E3rT   c                   t          |           }|                    dd          sd S 	 ddlm} t	          |           }|j        D ]}|                    |           d S # t          $ r  t          	                    dd           Y d S w xY w)Ndiagnostic_events_enabledTr   )rs   z#gateway health snapshot emit failedr   )
r>   r?   agent.monitoringrs   r  eventsemitr$   r   r   )r9   rA   rs   snapshotrC   s        r%   _emit_snapshot_eventsr    s    		'	'B66-t44 K,,,,,,)&11_ 	  	 ELL	  	  K K K:TJJJJJJKs   4A &B	B	sdkc           	         t                     }|                    dd          sd S t                     }t          t	          |                    d                              }t          |                    d                    } |d         ||pd           }t          dt          |                    dd	                              d
z  } |d         ||          }t           d          }	 |d         |g|d         	                    |	                    }
|

                    d          }|d         g d}d fd}|D ]#}|                    | ||          g           $|
S )Nmetrics_enabledTr   r   r   r   headers   export_interval_seconds<   i  r   )export_interval_millisgateway_healthr;   r   r   )metric_readersresourcezhermes.gateway.healthr   )zhermes.gateway.upzhermes.gateway.statezhermes.gateway.active_agentszhermes.gateway.busyzhermes.gateway.drainablez hermes.gateway.restart_requestedr   r   zhermes.platform.upzhermes.platform.degradedz+hermes.cron.scheduler.heartbeat_age_secondsz.hermes.cron.scheduler.last_success_age_secondsz*hermes.cron.scheduler.catch_up_occurrenceszhermes.cron.jobs.enabledzhermes.cron.jobs.runningzhermes.cron.jobs.overduer   r   c                     d fd	}|S )Nc                    	 t                    }fd|j        D             S # t          $ r! t                              dd           g cY S w xY w)Nc                R    g | ]#}|j         k     |j        |j                  $S r[   r   )r\   mr   r   s     r%   r^   zI_start_metric_provider.<locals>.callback.<locals>._cb.<locals>.<listcomp>  s8    gggqXYX^bfXfXfAGQ\::XfXfXfr8   zgateway metric callback failedTr   )r  r   r$   r   r   )_optionsr  r   r9   r   s     r%   _cbz5_start_metric_provider.<locals>.callback.<locals>._cb  sp    1&99gggggHDTgggg   =MMM			s   "& (AArZ   r[   )r   r  r   r9   s   ` r%   callbackz(_start_metric_provider.<locals>.callback  s3    	 	 	 	 	 	 	 	 
r8   )	callbacks)r   r   )r>   r?   r   r   r   r   r   r   rB   create	get_metercreate_observable_gauge)r9   r  rA   r   r   r  exporterinterval_msreaderresource_attrsprovidermetermetric_namesr   metric_namer   s   `              @r%   _start_metric_providerr-    s   		'	'B66#T** tDDHHZ$8$8 9 9::Htxx6677G(s'((GOtTTTHaRVV$=rBBCCDDtKK1S01(S^___F1 0  N $s?#xZ''77  H 677Em$K  L&       $ V V%%khh{>S>S=T%UUUUOr8   r   c                    | d         }t          |pd                                          }|dv r|j        S |dk    r|j        S |dv r|j        S |dk    r|j        S |j        S )Nr   r   >   fatalcriticalerror>   infoinformationr   )r   lowerFATALERRORINFODEBUGWARN)r  r   r   sevs       r%   _severity_numberr;    s    )*N
h#)
$
$
*
*
,
,C
#####
g~~##
%%%""
g~~##r8   c                  *    e Zd ZdZddZdd
ZddZdS )GatewayDiagnosticLogStreamerzEEmitter subscriber that sends gateway diagnostic events as OTLP logs.r9   r:   r  c                V   t          |          }t          |                    d                    }t          t	          |                    d                              }t          |d          } |d         |d                             |                    | _         |d          |d	         ||pd 
                    | _        | j        	                    | j                   | j        
                    t                    | _        |d         | _        || _        d| _        d S )Nr   r   gateway_diagnosticsr  r   r   )r  r   r   r  r   r   )r   r   r?   r   r   rB   r"  	_provider
_processoradd_log_record_processor
get_logger_DEFAULT_DIAGNOSTIC_SCOPE_logger
_LogRecord_sdkexported)rr   r9   r  r   r  r   r(  s          r%   __init__z%GatewayDiagnosticLogStreamer.__init__  s   F##"488M#:#:;;!#dhhz&:&:";";<<5$9
 
 
 /-.J8N8N~8^8^___8#78"C!"HgoNNN
 
 	//@@@~001JKKk*	r8   batchlist[Dict[str, Any]]r   rT   c                   ddl m} |D ]Q}|                    d          dk    rt          |          } ||                    d                    }|| j                            |          n| j        }d}|                     |                    d          | j        d         | j        d	         | j        d
         j	        t          |                    d          pd                                          t          | j        |                    d                    t          |          |          }|                    |           | xj        dz  c_        Sd S )Nr   )source_logger_for_exportrC   gateway_diagnosticsource_loggerzgateway diagnosticts_nsr   r   r   r   r   )	timestamptrace_idspan_idtrace_flagsseverity_textseverity_numberbodyr      )r0   rM  r?   rF   r@  rC  rE  rF  rG  DEFAULTr   upperr;  r&   r
  rH  )	rr   rJ  rM  evr3   rO  otel_loggerrW  records	            r%   __call__z%GatewayDiagnosticLogStreamer.__call__  sc   LLLLLL 	 	Bvvg"666.r22E 54RVVO5L5LMMM !, ))-888\ 
 (D__&&//#56	"34 Il3;!"&&"4"4"A	BBHHJJ 0BFF:<N<N O O#D))  % 	 	F V$$$MMQMMM;	 	r8   c                    	 ddl m}  |                                |            n# t          $ r Y nw xY w	 | j                                         | j                                         d S # t          $ r Y d S w xY wNr   rW   )rl   rX   rn   r$   rA  force_flushr@  r`   )rr   rX   s     r%   r`   z%GatewayDiagnosticLogStreamer.shutdown  s    	<<<<<<KMM%%d++++ 	 	 	D		O'')))N##%%%%% 	 	 	DD	s   #& 
332A+ +
A98A9N)r9   r:   r  r:   )rJ  rK  r   rT   rf   )ru   rv   rw   __doc__rI  r^  r`   r[   r8   r%   r=  r=    sW        OO   "       D
 
 
 
 
 
r8   r=  c                l    ddl m} t          | |          } |                                |           |S r`  )rl   rX   r=  	subscribe)r9   r  rX   rN   s       r%   _start_diagnostic_log_streamerre  (  sB    444444+FC88HKMMH%%%Or8   rS   threading.Eventthreading.Threadc           	          t          dt          t                                         dd                              d	 fd}t	          j        |dd          }|                                 |S )
Nr  logs_export_interval_secondsr   rT   c                 ~                                   s&t                                                     $d S d S rZ   )waitr  )r9   intervalrS   s   r%   _runz$_start_snapshot_thread.<locals>._run2  sO    //(++ 	*!&))) //(++ 	* 	* 	* 	* 	*r8   zhermes-gateway-health-exportTrc   rf   )r   r   r>   r?   ro   rp   rq   )r9   rS   rm  rR   rl  s   ``  @r%   _start_snapshot_threadrn  /  s    1c088<<=[]^__``aaH* * * * * * * * T0NW[\\\F
LLNNNMr8   c                8   t          |           }|                    dd          r|                    dd          sd S ddlm}  |t	                      t                                }t          j                    }||j        vr|	                    |           |S )Nr  Twarning_error_events_enabledr   )GatewayDiagnosticLogHandler)r   r   )
r>   r?   r0   rq  r   r   ri   rj   handlers
addHandler)r9   rA   rq  handlerroots        r%   _attach_log_handlerrv  ;  s    		'	'B66-t44 BFFCacg<h<h tKKKKKK))(**hjjQQQGDdm##   Nr8   r[  c                0    |                      d          dv S )NrC   >   cron_executionr  r|   )r[  s    r%   _gateway_health_eventry  G  s    66'??BBBr8   c                   t          |           st          dd          S t          |           }t          dd          }d}|                    dd          s|                    dd          rO	 t	          d	          }n=# t
          $ r0 t                              d
d           t          dd          cY S w xY w|                    dd          rj|h	 t          | |          |_	        nQ# t
          $ rD t                              dd           |
                                 t          dd          cY S w xY w|                    dd          r|	 ddlm} |                    | t                    |_        |j        t!          d          t#          | |          |_        nQ# t
          $ rD t                              dd           |
                                 t          dd          cY S w xY w	 t)          |           |_        n,# t
          $ r t                              dd           Y nw xY w|                    dd          ro	 t-          |            t/          j                    |_        t5          | |j                  |_        n,# t
          $ r t                              dd           Y nw xY w|S )z;Start P0 gateway health export if configured. Never raises.FrL   )rK   rM   TrK   Nr  r  r   zbmonitoring.gateway_health_export.enabled but OTLP SDK is unavailable; install 'hermes-agent[otlp]'r   otlp_unavailablez+gateway health OTLP metrics failed to startmetrics_start_failedr   )otlp_exporter)event_filterz*gateway health span streamer did not startz.gateway diagnostic OTLP export failed to startdiagnostics_start_failedz/gateway diagnostic log handler failed to attachz.gateway health snapshot thread failed to start)r   rI   r>   r?   r   r$   r   r   r-  rO   r`   r  r}  start_streamingry  rN   r   re  rQ   r   rv  rP   r  ro   EventrS   rn  rR   )r9   rA   r   r  r}  s        r%   start_gateway_health_exportr  K  sW   F L)%
KKKK		'	'B(iHHHG$(C	vv&& 	X"&&1Ld*S*S 	X	X&e444CC 	X 	X 	XNN/    
 .eDVWWWWWW	X 
vv&& \3?	\&<VS&I&IG## 	\ 	\ 	\NNHSWNXXX-eDZ[[[[[[	\
 
vv)400 
`S_		`666666,<<VRg<hhG'"#OPPP#A&##N#NG   	` 	` 	`LLITXLYYY-eD^______	`
W1&99 W W WFQUVVVVVW	vv)400 Z	Z!&)))!*!2!2G3FG<NOOGNN 	Z 	Z 	ZLLITXLYYYYY	ZNs^   0B 7B;:B;C- -AD;:D;AF* *AG87G8<H &H:9H:AJ &J?>J?r  )r   r   r   r   r   r   )r   r   r   r'   )r9   r:   r;   r   r   r'   )rC   r:   r   r:   )r9   r:   r   r:   )r9   r:   r   rJ   )r   rJ   r   rJ   r   r:   )r   r   r   r'   )r   r   r   r   )r   r   )r9   r:   r   r   )r9   r:   )r   r   )r9   r:   r   rT   )r9   r:   r  r:   r   r   )r  r:   r   r   r   r   )r9   r:   r  r:   r   r=  )r9   r:   rS   rf  r   rg  )r9   r:   r   r   )r[  r:   r   rJ   )r9   r:   r   rI   )5rb  
__future__r   ri   r   rero   dataclassesr   typingr   r   r   rj   ru   r   rD  	frozensetr/   rE   compiler1   r&   r7   rB   rF   rI   r>   r   r   r   r   r   r   r   r   r@   r   r   r   r   r   r  r  r-  r;  r=  re  rn  rv  ry  r  __all__r[   r8   r%   <module>r     s    # " " " " "  				 				     ! ! ! ! ! ! & & & & & & & & & &		8	$	$8 $9 
& 
& 
& 
 
  'Y 
( 
( 
( 
 
  "rz">??  .1 ) ) ) ) ) )   ,       > > > > > > > >B2 2 2 2
$ $ $ $T T T T 26e #L #L #L #L #L #LL                  	 	 	 	   "( ( (   B   *+ + + +\
K 
K 
K 
K3 3 3 3l   @ @ @ @ @ @ @ @F   	 	 	 		 	 	 	C C C C2 2 2 2l !!r8   