
    ֛j:                       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	m
Z
 ej                  j                  dd      Z e
d      Zej                  j                  dd	      Zej                  j                  d
d      dk7  ej                  j                  dd      dk7  ej                  j                  dd      dk7  ej                  j                  dd      dk7  ej                  j                  dd      dk7  dZg dZdZdZ ej(                  dej*                        Zh dZg dg dg dg dg dg dg dg dg dg dd
Zd d!d"d#d$d%d&d'd(d)	Zd* Zd+ Zd, Zd- Zd. Zd/ Zd0 Z d1 Z!d2 Z"d3 Z#d4 Z$d5 Z%d6 Z&d7 Z'd8 Z(d9 Z)d: Z*d; Z+y)<zControlled Phase-1 retrieval repair.
Read-only against knowledge DB, Obsidian and Graphiti.
No entity merges, source writes, Graphiti writes or index changes.
    )annotationsN)PathKNOWLEDGE_DBz+/opt/struktur/youtube-research/knowledge.dbz/opt/obsidian-vaultGRAPHITI_URLzhttp://127.0.0.1:8644RETRIEVAL_ENTITY_RESOLVER10RETRIEVAL_INTENT_GATING"RETRIEVAL_GRAPHITI_PROVENANCE_GATERETRIEVAL_ENTITY_FIRST_FTSRETRIEVAL_CROSS_LAYER_DEDUPE)entity_resolverintent_gatinggraphiti_provenance_gateentity_first_ftscross_layer_dedupe)u   lüftungsprofi mallorca   lüftungsprofizlueftungsprofi mallorcalueftungsprofizmallorca airserviceszmallorca air serviceszcompany:lueftungsprofi-mallorcau.   Lüftungsprofi Mallorca / Mallorca AirServicesz\b(?:eisen|heinz)\b>)      für   überorandaufausdasdemdenderdesdieeinforhowistmitourtheundunsvonwaswiewirdoeseinehaveintoodersindthatthiswhatwithabouteinemeineneinertheirwhich)	agent
autonomousagentenlong-runningreliability
monitoringrecoverycontexttoken)r>   r?   subagentskillsworkflowrC   )rA   dauerbetriebrC   rD   rB   )costrF   budgetrate
modellwahl)
provenienzsourceevidenceaudittraceability)wissensbasis	knowledgeragobsidian	retrieval)failurerD   rC   retryrB   )	guardrail
validationerrorrD   )
autonome	autonomenr@   z
ki-agentenlangfristigkostennachvollziehbarkeitwissenu
   ausfällenfehlverhalteng?g      ?gffffff?g?      ?g?g?g      ?g333333?)	AUFTRAGSBESTAETIGUNGRECHNUNG
BESTELLUNGPROJEKTDATENTECHNISCHE_UNTERLAGEANGEBOTINBETRIEBNAHMEEMAILSONSTIGc                 B    t        j                  dt         ddd      S )Nzfile:z?mode=roT
   )uritimeout)sqlite3connectDB     &/home/hermes/knowledge_query_repair.pyrory      s    5H!5$rJ
Jrw   c                    t        j                  d| j                               D cg c]  }|t        vs| c}d d S c c}w )Nu   [\wÄÖÜäöüß-]{3,}   )refindalllowerSTOP)qxs     rx   tokensr      s9    "**-G	"RdQVW_cVcqdehfhiids   ??c                    t        |       }g }|D ]'  }|j                  t        j                  |g              ) t	        t
        j                  ||z               d d S )N    )r   extend	EXPANSIONgetlistdictfromkeys)r   bets       rx   expandedr       sO    	!9a
)QAHHY]]1R())T]]1Q3 "%%rw   c                :    dj                  d | D              xs dS )N OR c              3  L   K   | ]  }d |j                  d d      z   d z     yw)"z""N)replace.0r   s     rx   	<genexpr>zphrase_expr.<locals>.<genexpr>$   s%     +XAC		#d0C,CC,G+Xs   "$z"wissen")join)valuess    rx   phrase_exprr   $   s    +XQW+X X f\ffrw   c                   | j                         g }t        t        t        d      D ]  }|v s|j	                  |        t        t        j                  |             }|r^|d   }|dv xr3 t        j                               dk  xr t        fddD               }t        t        ||t        v rdnd	|rd
nd||dS d d d ddd|dS )NTkeyreverser   >   r   r      c              3  &   K   | ]  }|v  
 y wNrv   r   r   lows     rx   r   z!resolve_entity.<locals>.<genexpr>-   s!       `tmn`aeh`h  `t   )mallorcaunternehmenfirma	   geschäftwebsiter   exact_aliastoken_aliasmediumhighcanonical_entity_idcanonical_namematched_alias
match_type
confidence	ambiguityproject_hintnoneF)casefoldsortedALIASESlenappendbool
PROJECT_REsearchsplitany	CANONICALCANONICAL_NAME)r   hitsaprojectmatched	ambiguousr   s         @rx   resolve_entityr   &   s)   ZZ\4
S
. Q#Xdkk!n	j"	#
q'';;  tCIIK@PRS@S  t\_  `t  ss  `t  ]t  Yt) )>Za  AH  LS  ASo|  Yf  @I  t|  OU  bk  {B  
C  C#T$\bpv  DI  Y`  	a  arw   c                   | j                         |j                  d      st        fddD              ry|j                  d      rt        fddD              ryt        fd	d
D              ryt        fddD              ryy)Nr   c              3  &   K   | ]  }|v  
 y wr   rv   r   s     rx   r   zclassify.<locals>.<genexpr>3   s       #y18  #yr   )	projektangebotu   auftragsbestätigungauftragsbestaetigung
bestellungrechnungverkauftu   stücku   lüftungsgeräter   r   c              3  &   K   | ]  }|v  
 y wr   rv   r   s     rx   r   zclassify.<locals>.<genexpr>5   s       ,|AH  ,|r   )
u	   was weißz	was wisstr   r   r   r   
leistungenpartnerr   zmallorca aircompanyc              3  &   K   | ]  }|v  
 y wr   rv   r   s     rx   r   zclassify.<locals>.<genexpr>6   s     jQSjr   )smartfanu   lüftungsanlageu   lüftungsgerätu   luftqualitätfeuchtigkeitproductc              3  &   K   | ]  }|v  
 y wr   rv   r   s     rx   r   zclassify.<locals>.<genexpr>7   s     RQSRr   )r>   kiautonomrV   zsecond brainwissensresearchunclear)r   r   r   )r   entr   s     @rx   classifyr   1   s    ZZ\GGNs  #y  6x  #y   y	GG!"  ,|  ?{  ,|  )|  FOjijjs|RQRR[erw   c                     dj                   fddD              j                         t        fdt        D              xs dv S )N c              3  Z   K   | ]"  }t        j                  |      xs d        $ yw) N)strr   )r   kr   s     rx   r   z_entity_text.<locals>.<genexpr>;   s(       DACaB  Ds   (+)titlesummarycontent	statementfactsource_identityoriginal_pathpathc              3  &   K   | ]  }|v  
 y wr   rv   )r   r   ss     rx   r   z_entity_text.<locals>.<genexpr><   s     $qAF$r   mallorca-airservices)r   r   r   r   )r   r   s   `@rx   _entity_textr   :   sR    88  D  *C  D  D  M  M  O$G$$C(>!(CCrw   c                $   t               }t        j                  |_        g }	 t        d   r|dk(  rt
        n
t        |       }t        |      }|j                  d|f      j                         }|D ]M  }t        |      }	t        |      dz   |	d<   d|	d<   t        |	      |	d<   |dk(  r|	d   s=|j                  |	       O ||j                          S # t        j                  $ r g cY |j                          S w xY w# |j                          w xY w)	Nr   r   zSELECT v.id,v.youtube_id,v.title,v.channel,v.summary,v.published_at,(-bm25(videos_fts)) score FROM videos_fts JOIN videos v ON videos_fts.rowid=v.id WHERE videos_fts MATCH ? ORDER BY score DESC LIMIT 30   rankSOURCEsource_kindentity_match)ry   rs   Rowrow_factoryFLAGSr   r   r   executefetchallr   r   r   r   closeError
r   r   intentcoutvalsexprrowsrds
             rx   ftsr  >   s   4w{{C*+	0AwxPQ{$4$yy  b  dh  cj  k  t  t  v$ a	!W1C
aiXAm$4Q]^_Q`q?Pi. 18::a= 
	
 	Ri	
  	
s$   BC C:'C= 9C::C= =Dc                $   t               }t        j                  |_        g }	 t	        |       }|dk(  rt
        }t        |      }|j                  d|f      j                         }|D ]  }t        |      }	t        |	      |	d<   |dk(  rh|	j                  d      sVdt        |	j                  dd            j                         v s+dt        |	j                  d	d            j                         v r|dk(  r|	d   s|dk7  r|	j                  d      r|	d   st        |      d
z   |	d<   d|	d<   |j                  |	        ||j!                          S # t        j"                  $ r g cY |j!                          S w xY w# |j!                          w xY w)Nr   zSELECT rowid,doc_id,source_identity,project,document_type,original_path,content,(-bm25(kdata_fts)) score FROM kdata_fts WHERE kdata_fts MATCH ? ORDER BY score DESC LIMIT 30r   r   eisen, heinzr   r   z/eisen, heinz/r   r   r   r   r   )ry   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s
             rx   kftsr  M   s   4w{{C{$YW4$yy  D  FJ  EL  M  V  V  X$ Ba	!W1QaiQUU9-3quuM^_aGbCcClClCn1n  sC  GJ  KL  KP  KP  Q`  ac  Kd  Ge  Gn  Gn  Gp  spi. 18iAEE),Q~5FXaZ1V9(=)CJJqMB 
	
 	Ri	
  	
s$   DE E:'E= 9E::E= =Fc           	        t               }t        j                  |_        g }	 t	        |       }dj                  d |D              xs d}|j                  d| d|D cg c]  }d| d
 c}      j                         }|D ]  }	t        |	      t        j                  d      xs d      j                  d	      rd
ndd<   ddddddj                  j                  d      d      d<   t              d<   dt        j                  dd            j                         v }
|dk(  r|
rd   s|dv rd   st        fd|D              d<   |j                          |j!                  d d       t#        |d d d      D ]
  \  }|d <    |d d |j%                          S c c}w # t        j&                  $ r g cY |j%                          S w xY w# |j%                          w xY w)!Nr   c              3      K   | ]  }d   yw)zstatement LIKE ?Nrv   )r   _s     rx   r   zkus.<locals>.<genexpr>b   s     'Iq(:'Is   z1=1zSELECT id,statement,source_identity,source_version_id,source_locator,evidence_class,review_state,gold_state,legacy_placeholder,content_version_hash FROM knowledge_units WHERE legacy_placeholder=0 AND review_state NOT IN ('REJECTED','LEGACY') AND ()%r   r   )k-daten:youtube:r   DERIVEDr   g?g333333?re   g?gffffff?)	GESICHERTu
   BESTÄTIGT	PLAUSIBELUNSICHERu   WIDERSPRÜCHLICHevidence_classquality_weightr   r
  r   )r   r   c              3     K   | ]6  }j                  d       xs dj                         j                  |       8 yw)r   r   N)r   r   count)r   r   r  s     rx   r   zkus.<locals>.<genexpr>k   s3     Squu[)/R99;AA!DSs   <?	relevancec                "    | d   | d   z  | d   fS )Nr  r  idrv   r   s    rx   <lambda>zkus.<locals>.<lambda>m   s    ;*:(;;AdGD rw   Tr      r   r   )ry   rs   r   r   r   r   r   r   r   r   r   
startswithr   r   sumr   sort	enumerater   r   )r   r   r   r  r  r  clausesr   r  r  project_sourceir  s               @rx   kusr(  _   s<   4w{{C{$FKK'ID'IIRUGyy  M  NU  MV  VW  Z  nr  [s  ij  ^_  `a  _b  bc  \d  [s  t  }  }  $ a	!W13quu5F/G/M2+N+Y+YZq+rx  yBa$'SSTWkmnrrstsxsx  zJ  tK  LN  O1!!_1^ C.?(C$D$M$M$OO>i^An4E%%a.?SdSS1[>::a= ((DT(Rs3Bx".caQ1V9.	Sb	
 [s 	Ri	
  	
s6   ;F3 F.
,D1F3 .F3 3GG GG G0c           	     4   t         j                  j                  t        dz   t	        j
                  | dd      j                         ddid      }	 t         j                  j                  |d	      5 }t	        j                  |j                               }d d d        g }t        j                  d
g       d      D ]  \  }}|j                  dd      |j                  d      d|dddd}	t        |j                  d      xs] |j                  d      xsJ |j                  d      xs7 |j                  d      xs$ |j                  d      xs |j                  d            |	d<   |j                  |	        |S # 1 sw Y   xY w# t        $ r g cY S w xY w)Nz/searchr{   )querylimitContent-Typeapplication/jsonPOSTmethodr   rr   resultsr   r   r   scorezgraphiti:/searchUNKNOWNunattributed_graph_factF)r   r3  rP   r   r   provenance_statusr   episode_uuidepisoder   source_description	timestampr   attribution_present)urllibrequestRequestGRAPHjsondumpsencodeurlopenloadsreadr$  r   r   r   	Exception)
r   r   r   reqr  r  r  r'  r   items
             rx   graphrI  s   s   ^^E)ODJJ"7M,N,U,U,WYghzX{  DJ  K	~~c"-ITZZ5I1I#quuYr*1- cafR wAS[\kt  Jc  sx  	y4#AEE.$9  %yQUU9=M  %yQRQVQVWhQi  %ymnmrmr  tH  nI  %y  MN  MR  MR  S^  M_  %y  cd  ch  ch  ix  cy   z4::d	
 
* JI 	)s+   !F	 3$E=C%F	 =FF	 	FFc                  
 g }t         dz  t         dz  t         dz  t         dz  t         dz  g}|D ]  }|j                         s|j                  d      D ]  }|j                  dd	      }|j                         
t        
fd
t        D              st        
fddD              sS|dk(  rY|j                  dt        |j                  t                     z   t        |      |d d t        
fd|dk(  rt        n
t        |       D              dddd         |j                  d d       t        |d d d      D ]
  \  }}	||	d<    |d d S # t        $ r Y w xY w)Nz
LP-CONTEXTz03-ProjekteProjectszEmail-Agentz
AG-CONTEXTz*.mdutf8r   )encodingerrorsc              3  &   K   | ]  }|v  
 y wr   rv   )r   r   r   s     rx   r   zobs.<locals>.<genexpr>   s     (1a3h(r   c              3  &   K   | ]  }|v  
 y wr   rv   r   s     rx   r   zobs.<locals>.<genexpr>   s     4q!Q#X4qr   )r   r   r   	obsidian:  c              3  @   K   | ]  }j                  |        y wr   )r  r   s     rx   r   zobs.<locals>.<genexpr>   s3       uz  GHuxu~u~  @A  vB  uzs   r   r   Tr   )r   r   textr  r   r   r   c                    | d   | d   fS )Nr  r   rv   r  s    rx   r  zobs.<locals>.<lambda>   s    +q):';< rw   r   r{   r   r   )VAULTexistsrglob	read_textOSErrorr   r   r   r   r   relative_tor"  r   r#  r$  )r   r   r   r  search_rootsrootpr   r'  r   r   s             @rx   obsr_     s   u\)%*=eJ>NuUbObchiucuv pT	x::f pa	
fI	6qzz|3
((
(4qGp4q1qrzj::Su1E-F!FcRSf\]^c_c\dqt  uz  X^  `i  Xi  MT  ou  vw  ox  uz  rz  IQ  ae  mn  o  ppp <TJc#2hq!-SQqA!F)-CR (s   E	EEc                    | j                  d      r| d   S | j                  d      rd| d   z   S | j                  d      ry dt        | j                  d      xs | j                  d            z   S )Nr   
youtube_idr  r   zunknown:rowidr   )r   r   r  s    rx   identityrc     sf    EE
A&7$88EE,z!L/99EE&M3quuW~6v777rw   c                    | j                  d      }|r|j                  d      r|S |r|j                  d      r|S |r|j                  d      r|S y )Nr   r  rQ  r  )r   r!  )r   sids     rx   evidence_idrf     sJ    UUCNN:&s
CNN;'CNN:&s
rw   c                    	 t               }|j                  d| f      j                         }|j                          d|r|d   iS d iS # t        $ r i cY S w xY w)NzAselect document_type from kdata_documents where source_identity=?document_typer   )ry   r   fetchoner   rF  )identity_valuer  r  s      rx   source_metark     s    D!AIIY[iZkluuw!yz  zA  zA  zC  M\  ef  ]^  _`  ]a  Lq  Eq  lp  Lq  Eq)s   AA	 A	 	AAc                 B    t         j                  j                  dd      S )NOPENROUTER_API_KEYr   )osenvironr   rv   rw   rx   envrp     s    "**..!5b99rw   c                   |syt               }|syt        j                  ddddddd	d
|  d| dgdd      j                         }t        j
                  j                  d|dd|z   dddd      }	 t        j
                  j                  |d      5 }t        j                  |j                               }d d d        d   d   d   j                  d      }t        |t              rdj                  d |D              }t        |xs d      j                         d fS # 1 sw Y   jxY w# t         $ r!}	dt#        |	      j$                  fcY d }	~	S d }	~	ww xY w) N)uE   Die vorhandenen Wissensquellen ermöglichen keine belastbare Antwort.insufficient_evidence)uN   Relevante Quellen wurden gefunden, aber die LLM-Synthese ist nicht verfügbar.llm_not_configuredzqwen/qwen3.7-flashg?rR  systemu  Beantworte auf Deutsch streng quellengebunden. Nutze nur den erkannten Intent und die attribuierten Quellen. Kombiniere Belege, kennzeichne Widersprüche, Dokumentdatum, Dokumentart und Projektbezug. Behaupte keine rechtliche Entity-Gleichheit ohne Beleg. Erfinde nichts.)roler   userzFrage: z\n\nMaterial:\n)modeltemperature
max_tokensmessagesF)ensure_asciiz-https://openrouter.ai/api/v1/chat/completionsr-  zBearer zhttp://127.0.0.1:8655zHermes Knowledge Query)r,  AuthorizationzHTTP-RefererzX-Titler.  r/  Z   r1  choicesr   messager   r   c              3  v   K   | ]1  }t        |t              r|j                  d d      n
t        |       3 yw)rT  r   N)
isinstancer   r   r   r   s     rx   r   zsynth.<locals>.<genexpr>   s1     -ref*QtBTaeeF2.>Z]^_Z`.`-rs   79znQuellen wurden gefunden, aber die LLM-Synthese ist fehlgeschlagen; es wird keine unbelegte Antwort ausgegeben.)rp  r@  rA  rB  r<  r=  r>  rC  rD  rE  r   r  r   r   r   striprF  type__name__)
r   ctxnr   bodyrG  r  r  r   r   s
             rx   synthr     s   	pUx
jj.Sdgo  {L  `M  V\  ip  qr  ps  sE  FI  EJ  gK  NL  _M  N  \a  b  i  i  k^^KDas  EN  OR  ER  by  D\  R]  ek  l`~~c"-ITZZ5I1I
I,q/)
$
(
(
3'bgg-rjq-r&rg	W]		!	!	#D	(( JI 	  `  O  PT  UV  PW  P`  P`  `  `  `s7   5!D/ $D#:A(D/ #D,(D/ /	E8EEEc                h
   | xs dj                         }|st        d      t        d   rt        |      n	d d d ddddd}t        d   rt	        ||      nd	}t        |||      t        |||      t        |||      t        |||      t        |||      d
}g }dddd}|j                         D ]  \  }}t               }	|D ]  }
t        |
      }
t        |
      }||	v r|	j                  |       |dk(  r(t        d   r|
j                  d      s|dxx   dz  cc<   ]|dk(  r7|dv r3|
j                  d      dk(  r|
j                  d      s|dxx   dz  cc<   |dk(  r$|dk(  r|
j                  d      s|dxx   dz  cc<   ||
d<   ||
d<   ||
d<   ||
d<   t!        |
      |
d<   |
j                  d      xs t#        |      j                  d      |
d<   dd t%        |
j                  d!d"            z   z  |
d#<   |
j                  d$      d%k(  rd&n$t&        j                  |
j                  d      d'      |
d(<   |
d#   |
d(   z  |
d)<   |j)                  |
         t        d*   ri }|D ]h  }
|
j                  d      xs; d+t+        |
j                  d!            z   d,z   t+        |
j                  d            z   }||vs|
d)   ||   d)   kD  sd|
||<   j t-        |j/                         d- d./      d d0 }nt-        |d1 d./      d d0 }g }|D ]1  }
|j)                  d2D ci c]  }||
j                  |       c}       3 g }|D ]  }
|
d   dk(  r*|
j                  d3       d4|
j                  d5      xs d }nr|
d   d6k(  r|
j                  d7      xs dd d8 }nQ|
d   d9k(  r|
j                  d:      xs d}n3|
d   d;k(  r|
j                  d<      xs d}n|
j                  d=      xs d}|j)                  d>|
d    d?|
j                  d       d@|
j                  d$       dA|
j                  d       dB|
j                  d!       dC|
j                  d       dD|         t1        |dEj3                  |      d dF t5        |            \  }}||rdGn!t5        t        dH |D                    dIk\  rdJndK|||||||t7        |      t9        |      |j                         D ci c]  \  }}|t5        |       c}}t5        |      t5        t        dL |D                    |t        dMdN	S c c}w c c}}w )ONr   zquestion darf nicht leer seinr   disabledr   Fr   r   r   )fts5
kdata_fts5knowledge_unitsgraphitirW   r   )project_without_project_intentr5  non_entity_sourcer  r   r;  r5  r   r   )r  r  r   zEisen, Heinzr   r  r  r  layerr   entity_resolutionr   rf  rh  <   r     	rrf_scorer   SYNTHETIC_TESTg?re   quality_multiplierfusion_scorer   zgraph::c                T    | d   | j                  dd      | j                  dd       fS )Nr  r  r   r   r  r   r  s    rx   r  zask.<locals>.<lambda>   s2    Q~->quuEUVW?XZ[Z_Z_`fgjZkYk,l rw   Tr   r{   c                    | d   S )Nr  rv   r  s    rx   r  zask.<locals>.<lambda>   s    1^+< rw   )r  r   r   rh  r   r3  r  r  rf  r   r   r   source_locatorr   r   r6  r   z | r   r  r   i  r  r   rW   rT  r   [|z|kind=z|doc=z|rank=z|evidence_id=z]
z

i]  insufficientc              3  b   K   | ]'  }|j                  d       s|j                  d        ) ywr   Nr  r   s     rx   r   zask.<locals>.<genexpr>   sI       ]dz{  KL  KP  KP  Qb  Kc]^]b]bct]u  ]d   //   	supportedr   c              3  b   K   | ]'  }|j                  d       s|j                  d        ) ywr  r  r   s     rx   r   zask.<locals>.<genexpr>   sa       x  VW  fg  fk  fk  l}  f~  yz  y~  y~  P  yQ  xr  )questionr   expanded_tokensraw_candidate_countsfinal_context_countdistinct_source_countfinal_contextfeature_flags)	answerr   warningr  r   rejected_candidatesrQ   sourcesrX   )r  
ValueErrorr   r   r   r  r  r(  rI  r_  itemssetr   rc  addr   rf  rk  float
DOC_WEIGHTr   r   r   r   r  r   r   r   r   )r  r   r   r   rawallrowsrejectedr  r  seenr   identbestr   rE   r  blockspayloadr  r  vs                        rx   askr     s   N	;<< 12^Ateiz~  MW  ek  x}  MR  9S 13y3vD3v,>QTUVWZ[aQbnstuvy  {A  oB  NQ  RS  TW  X^  N_  `	TUjklX99; OZU4
u$ Oa	!W1HQKetmH88E?ZE"<=aeeLaFb&'*'HiE%EE!%%PYJZ\jJjstsxsx  zH  tI-.1.8iE6M!%%2G !1$!h1W:%Q()3F1GY_Qx[N1]quu_7M7xQ\]bQcQgQghwQxAo$6RaeeF3/0011[>!"}!57G!G2Z^^\]\a\abq\rsvMw1{^A&:$;;1^W^^A=NOO" 

	$ KaUU=Rhs155='99#=c!%%.>QQ1tmq(a)@@aK #luy
z{~|~
'g"<TJ3BOw	
 qQ	..  'o  p!AEE!H*  p  qq

 zQwZAEE'N#33quuY7G7M26N!Oz<!%%	*:*@b%4)Hz$$aeeK.@.FBgz:quuV}':wf#--!AgJ<q'8!9 :&}AU@VV[\]\a\abq\r[ssyz{zz  AG  {H  zI  IV  WX  W\  W\  ]j  Wk  Vl  lo  pw  ox  y  zz aF+FU3CLAnUXY\  ]d  @G  ]d  Zd  Ve  gh  Vhk  nv  BI  ^a  kq  HP  \_  jq  JK  U[  \]  U^  qy  z{  q|  il  ir  ir  it  Tu  be  bc  de  UV  WZ  [\  W]  U]  Tu  LO  PW  LX  qt  ux  x  [b  x  u  q@	  Q	X	  i	n	  ~o	  	p	  p	 p Tus   T)
!T.),__doc__
__future__r   r@  rn  r|   rs   urllib.requestr<  pathlibr   ro  r   ru   rV  r?  r   r   r   r   compileIr   r   r   r  ry   r   r   r   r   r   r   r  r  r(  rI  r_  rc  rf  rk  rp  r  r  rv   rw   rx   <module>r     s   # , , , ::>>.!NO
 !jjnn^$;<JJNN#>sCSH**..!:3?DZZ^^,PQTUWZZZZ^^$@EsJzz~~&DSI3N	 ,	?2::,RTT2
 U}  Kr  }  MO  ^c  mZ  qj	  t	m
  {
t  Er  s	#'4TY]ux  DF  X[  dg  rt  u
 J i& g	aD$(8

 :`+p	rw   