ó
    õ�sj…:  ã                  óB  • S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	J
r
  SSKrSSKrSSKrSSKJr  SSKJr  SSKJr  SS	1rS
rSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jr SS jr!S S jr"\#S:X  a  \RH                  " \"" 5       5        gg)!uV  Fill the RJ REIT metric sweep workbook from the playground RAG.

For each ticker tab whose folder holds both a 10-Q and a 99-2 for the target
quarter, applies each in-scope row's prompt to both documents through the
playground batch API and writes the answers into the 10Q and Deck columns.

The rules, exactly as the workbook defines them:
  - A row is in scope when its Found column is "xbrl" or
    "docling (non-xbrl tool)"; not_reported rows are left untouched.
  - The prompt is the sheet's own formula computed here (openpyxl does not
    evaluate formulas): "Find {Metric}. Return {Quarter} value".
  - A scalar answer records its printed value; an unanswerable records the
    #not found# sentinel; a failed question records ERROR: <message>. An
    in-scope row with an empty Metric cell is reported and skipped.

Tabs without a loaded document pair are reported as skipped, never silently
dropped. Only the 10Q and Deck cells are written; the workbook is saved as a
new file after each ticker (checkpoint) and uploaded to S3 at the end when
--output is an s3:// URI. One batch runs at a time so total provider
concurrency stays at the batch runner's own bound.

Answers are cached in ade_playground.sweep_answers, keyed by the document's
content-derived doc_key, the exact prompt text, and the answering model. A
question with an open cache row is reused â€” value and provenance copied from
the stored {field header: value} response â€” and only misses reach the batch
API. Error rows are never reused. There is no bypass flag: to re-measure,
close the rows (SET valid_to = now()) and the next run asks fresh.
é    )ÚannotationsN)ÚPath)ÚJsonb)Údb)ÚDEFAULT_MODELÚxbrlzdocling (non-xbrl tool)z#not found#c                ó  • U R                  S5      =(       d    SnUR                  S5      (       a  UR                  SS5      S   $ UR                  S5      (       a$  UR                  SS5      S	   R	                  S5      $ g
)zBThe parse's table number a reference points into, from its ref id.Úref_idÚ z	#/tables/Ú/é   éÿÿÿÿÚtÚ-r   N)ÚgetÚ
startswithÚrsplitÚsplitÚlstrip)ÚrefÚrids     ÚH/home/mande/repo/quber/.claude/skills/rj-reit-sweep/scripts/run_sweep.pyÚtable_numberr   4   sm   € à
�'‰'�(Ó
×
!˜r€CØ
‡~�~�k×"Ñ"Ø�z‰z˜#˜qÓ! "Ñ%Ð%Ø
‡~�~�c×ÑØ�y‰y˜˜aÓ  Ñ#×*Ñ*¨3Ó/Ð/Øó    c           	     óô  • U R                  S5      nU R                  S5      n[        U 5      nUS:X  a>  U R                  S5      b,  U R                  S5      b  SU SU SU S   S	-    S
U S   S	-    3$ US:X  af  U R                  S5      =(       d    SnU R                  S5      =(       d    U R                  S5      =(       d    SnSU SU SU 3R                  S5      $ Ub  SU SU 3$ SU SU=(       d    S 3$ )a`  One cited reference as a human-readable location on the page.

A table cell reads page, table, row, column (row and column 1-based; the
table keeps the parse's own number, taken from the cell's t<N>-<r>-<c>
ref id). A figure value reads page, chart, segment. A whole table or a
line item reads page and table number. Anything else reads page and kind.
ÚpageÚref_typeÚ	tableCellÚrowÚcolÚpz table ú row r   z col ÚfigureValueÚchartÚfigureÚsegmentÚtextr   Ú ú, Ú	reference)r   r   Úrstrip)r   r   ÚkindÚtabler$   r&   s         r   Úreference_partr.   >   s  € ð �7‰7�6‹?€DØ�7‰7�:Ó€DÜ˜Ó€EØˆ{Ó˜sŸw™w u›~Ñ9¸c¿g¹gÀe»nÑ>XØ�4�&˜ ˜w e¨C°©J¸©NÐ+;¸5ÀÀUÁÈaÁÐ@PÐQÐQØˆ}ÓØ—‘˜Ó ×, HˆØ—'‘'˜)Ó$×=¨¯©°«×=¸2ˆØ�4�&˜˜%˜  7 )Ð,×3Ñ3°DÓ9Ð9ØÑØ�4�&˜ ˜wÐ'Ð'Øˆtˆf�A�d×)˜kÐ*Ð+Ð+r   c                ó  • U =(       d    0 R                  S5      =(       d    0 R                  S5      =(       d    / nU Vs1 s HJ  nUR                  S5      S:X  d  M  UR                  S5      c  M.  UR                  S5      [        U5      4iML     nn/ nU H]  nUR                  S5      S;   a"  UR                  S5      [        U5      4U;   a  M:  [        U5      nXd;  d  ML  UR                  U5        M_     SR	                  U5      $ s  snf )	a#  The cited references of one answered question, joined for the column.

A citation of a whole table or of a line item says nothing a cited cell
in the same table has not already said, so those are dropped when such a
cell is present. Repeated renderings collapse to one, citation order kept.
ÚresponseÚ
referencesr   r   r   r   )r-   Ú
chunkTableÚ	line_itemz; )r   r   r.   ÚappendÚjoin)r   ÚrefsÚrÚcoveredÚpartsr   Úparts          r   Ú
provenancer;   T   só   € ð �Y�B�O‰O˜JÓ'×-¨2×2Ñ2°<Ó@×FÀB€Dñ óâˆAØ�5‰5�Ó Ñ+ó 	)à01·±°e³ó 	)ˆ�‰ˆv‹œ Q›Ó(Ùð ð ð
 €EÛˆØ�7‰7�:ÓÐ"FÓFØ—‘˜“¤¨cÓ!2Ð3°wÓ>ÙÜ˜cÓ"ˆØÕØ�L‰L˜Öñ ð �9‰9�UÓÐùòs   Á D	ÁD	Á1 D	c                óº  • U R                  S5      (       a  SU S    3$ U R                  S5      =(       d    0 nUR                  S5      nUR                  S5      =(       d    0 nUS:X  a  UR                  S5      =(       d    S$ US:X  a  [        $ US	:X  a2  UR                  S
5      =(       d    UR                  S5      =(       d    S$ [        R                  " USS9$ )NÚerrorzERROR: r0   ÚshapeÚvalueÚscalarr   ÚunanswerableÚproser'   Úanswer)Ú,Ú:)Ú
separators)r   ÚNOT_IN_DOCUMENTÚjsonÚdumps)r   Úrespr,   Úpayloads       r   Ú
cell_valuerL   l   sº   € Ø
‡w�wˆw×ÑØ˜˜W™˜Ð'Ð'Ø�7‰7�:Ó×$ "€DØ�8‰8�GÓ€DØ�h‰h�wÓ×% 2€GØˆxÓØ�{‰{˜7Ó#×) rÐ)Øˆ~ÓÜÐØˆwƒØ�{‰{˜6Ó"×> d§h¡h¨xÓ&8×>¸BÐ>Ü�:Š:�g¨*Ñ5Ð5r   c                óH   • U R                  S5      (       a  gU [        :X  a  gg)z+The cache status of one written cell value.úERROR:r=   Ú	not_foundr?   )r   rG   ©r?   s    r   Úanswer_statusrQ   {   s$   € à×Ñ˜×!Ñ!ØØ”ÓØØr   c                ór   • U R                  SU45      R                  5       nUc  [        SU S35      eUS   $ )z®The content-derived storage key the cache is keyed by.

The documents API deliberately withholds doc_key (nothing in the UI
needs it), so it is read from the table directly.
z:SELECT doc_key FROM ade_playground.documents WHERE id = %sz	document z not in the libraryr   )ÚexecuteÚfetchoneÚRuntimeError)ÚconnÚdoc_idÚfounds      r   Údoc_key_forrY   „   sE   € ð �L‰LÐUÐX^ÐW`Óa×jÑjÓl€EØ�}Ü˜Y v hÐ.AÐBÓCÐCØ�‰8€Or   c           	     ó”   • U R                  SU[        45      R                  5       nU VVVs0 s H
  u  p4oSXES._M     snnn$ s  snnnf )z<The document's current cached answers, question text -> row.zzSELECT question, status, response FROM ade_playground.sweep_answers WHERE doc_key = %s AND model = %s AND valid_to IS NULL)Ústatusr0   )rS   ÚANSWER_MODELÚfetchall)rV   Údoc_keyrX   ÚqÚsrJ   s         r   Úopen_answersra   �   sP   € à�L‰Lð	Bà	”,Ðó÷ �hƒjð	 
ñ
 BGÕGÂ±:°1¸˜!Ñ.Ò.ÁÓGÐGùÔGs   ­Ac           
     óz   • U R                  SX[        45        U R                  SX[        U[        U5      45        g)zDRecord a fresh answer: close the key's open row, insert the new one.z�UPDATE ade_playground.sweep_answers SET valid_to = now() WHERE doc_key = %s AND question = %s AND model = %s AND valid_to IS NULLzqINSERT INTO ade_playground.sweep_answers (doc_key, question, model, status, response) VALUES (%s, %s, %s, %s, %s)N)rS   r\   r   )rV   r^   Úquestionr[   r0   s        r   Ústore_answerrd   š   s?   € à‡L�Lð	Tà	œLÐ)ôð
 	‡L�Lð	'à	œL¨&´%¸³/ÐBõr   c                ó¤  • [         R                  " U  S3USR                  U5      SS.SS9nUR                  5         UR	                  5       S   n [
        R                  " S5        [         R                  " U  S	U 3S
S9R	                  5       nSU;  a  [        SU SU S35      eUS   (       d  OMc  US    Vs0 s H  ofS   U_M
     sn$ s  snf )Nz
/api/batchÚ
r?   )rW   Ú	questionsÚwanté<   )rH   ÚtimeoutÚjob_idé   z/api/batch/é   ©rj   Úrunningzbatch z lost by the server mid-run (z=); the checkpoint holds every ticker finished before this oneÚrowsÚindex)	ÚrequestsÚpostr5   Úraise_for_statusrH   ÚtimeÚsleepr   rU   )ÚbaserW   rg   r7   rk   Ústater   s          r   Ú	run_batchry   ¨   sé   € Ü�ŠØˆ&�
ÐØ¨T¯Y©Y°yÓ-AÈ7ÑSØñ	€Að
 ×ÑÔØ�V‰V‹X�hÑ€FØ
Ü�
Š
�2ŒÜ—’ ˜v [°°Ð9À2ÑF×KÑKÓMˆØ˜EÓ!ô Ø˜˜Ð =¸e¸Wð EMð Móð ð �Y×Øñ ð */¨vªÓ7ª #�‰L˜#Ò©Ñ7Ð7ùÒ7s   Â;Cc           	     ó¾   • U R                  S5      (       a=  XR                  SS5      S   -  n[        R                  " SSSU [	        U5      S/S	S
9  U$ [        U 5      $ )Nús3://r   r   r   ÚawsÚs3Úcpú--quietT©Úcheck)r   r   Ú
subprocessÚrunÚstrr   )ÚuriÚdest_dirÚlocals      r   Úfetchrˆ   À   sW   € Ø
‡~�~�g×ÑØŸ:™: c¨1Ó-¨bÑ1Ñ1ˆÜ�Š˜˜t T¨3´°E³
¸IÐFÈdÒSØˆÜ�‹9Ðr   c                 ó´  ^3^4• [         R                  " SS9n U R                  SSS9  U R                  SS SS9  U R                  S	[        S
SS9  U R                  SSSS9  U R                  SSSS9  U R                  SSSS9  U R                  SS SS9  U R	                  5       m3[        [        R                  " SS95      n[        T3R                  U5      nT3R                  =(       d"    T3R                  R                  SS5      S   S-   nUR                  S5      (       a  US -  O
[        U5      n[        R                  " T3R                   S!3S"S#9R!                  5       m4S^U3U44S$ jjn["        R$                  " US%S&9nT3R&                  (       aP  T3R&                  R)                  S'5       Vs/ s H)  owR+                  5       (       d  M  UR+                  5       PM+     snOS nUbG  U Vs/ s H  owUR,                  ;  d  M  UPM     n	nU	(       a  [/        S(S)R1                  U	5       3S*S+9  gS=n
=n=pÍ[2        R4                  " 5        nUR,                   GHÊ  nUS,:X  d  Ub  Xø;  a  M  U" US-5      U" US.5      nnUb  Uc*  [/        S/U S0T3R6                   S1T3R8                   S23S*S+9  MV  Xo   n[;        S3 US    5       5       VVs0 s H  u  nnUUS-   _M     nnn/ n[=        S4UR>                  S-   5       Hš  nURA                  UUS5   S69RB                  nURA                  UUS7   S69RB                  nURA                  UUS8   S69RB                  nU[D        ;   d  Mf  U(       d  [/        S/U S9U S:3S*S+9  M€  URG                  US;U S<U S=345        Mœ     U(       d  [/        S/U S>3S*S+9  GMY  U VVs/ s H  u  nnUPM
     nnnT3RH                  (       a)  [/        U S?[K        U5       S@USA    SBUSA    SC35        GMª  0 nSDUUSD   4SEUUSE   44 GHu  u  nn n![L        RL                  " 5       n"[O        UU SA   5      n#[Q        UU#5      n$[;        U5       VVs/ s H0  u  nnU$R                  U5      =n%b  U%SF   SG:X  d  UU%SH   ;  d  M.  UPM2     n&nnU&(       a.  [S        T3R                  U SA   U& Vs/ s H  nUU   PM
     sn5      O0 n'U'RU                  5        V(V)s0 s H  u  n(n)U&U(   U)_M     n*n(n)[W        U&5      n+[;        U5       GH  u  nu  nnUU+;   an  U*R                  U5      n)U)(       a  [Y        [[        U)5      5      OSIn,U)(       a  []        U)5      OSJn-UU,0n.U-(       a  U-U.U SK3'   [_        UU#U[a        U,5      U.5        OAU$U   SH   n/[Y        U/R                  USJ5      5      n,[Y        U/R                  U SK3SJ5      5      n-U,R                  SL5      (       a  US-  nURA                  UU!U,SM9  U
S-  n
U-URc                  U0 5      U'   GM     [K        U5      [K        U&5      -
  n0UU0-  nU[K        U&5      -  n[/        U S1U S?[K        U5       SNU0 SO[K        U&5       SP[L        RL                  " 5       U"-
  SQ SRU SA    SS3S*S+9  GMx     ST H}  nU SK3n1U1U;  a&  URd                  S-   UU1'   URA                  SUU1   U1SM9  URU                  5        H5  u  nn2U2R                  U5      (       d  M  URA                  UUU1   U2U   SM9  M7     M     URg                  U5        GMÍ     S S S 5        T3RH                  (       a  gURg                  U5        UR                  S5      (       a$  [h        Rj                  " SUSVSW[Y        U5      USX/S*SY9  [/        SZU
 S[U SOU S\U S]U 3
S*S+9  gs  snf s  snf s  snnf s  snnf s  snnf s  snf s  sn)n(f ! , (       d  f       N¬= f)_Nz7Fill the metric sweep workbook from the playground RAG.)ÚdescriptionÚworkbookz(source workbook: s3:// URI or local path)Úhelpz--outputzldestination for the filled copy (s3:// URI or path); default: source stem + '-filled.xlsx' beside the source)ÚdefaultrŒ   z--yeariê  ztarget filing year)Útyper�   rŒ   z--periodÚQ2ztarget filing period, e.g. Q2z--basezhttp://127.0.0.1:8101zplayground server URLz	--dry-runÚ
store_truez/report scope per tab without answering anything)ÚactionrŒ   z	--tickerszIcomma-separated tab names to process (e.g. BRSP,KREF); default: every tabzrj-reit-sweep-)ÚprefixÚ.r   r   z-filled.xlsxr{   zfilled.xlsxz/api/documentsrm   rn   c                óÞ   >• T Vs/ s HE  nUS   U :X  d  M  US   U:X  d  M  US   TR                   :X  d  M.  US   TR                  :X  d  MC  UPMG     nn[        U5      S:X  a  US   $ S $ s  snf )NÚfolderÚfiling_typeÚyearÚperiodr   r   )r—   r˜   Úlen)Útickerr–   ÚdÚhitsÚargsÚdocss       €€r   Ú
target_docÚmain.<locals>.target_docâ   s“   ø€ ñ ó
â�Ø�‰{˜fÑ$ó ð �-Ñ  KÑ/ó ð �&‘	˜TŸY™YÑ&ó	 ð
 �(‘˜tŸ{™{Ñ*÷ Ùð 	ð 
ô ˜d›) q›.ˆt�A‰wÐ2¨dÐ2ùò
s   †A*—A*¢A*·A*ÁA*F)Ú	data_onlyrD   z'ERROR: no such tab(s) in the workbook: r)   T)ÚflushÚSummaryz10-Qz99-2zSKIP z: no r(   z 10-Q/99-2 pair in the libraryc              3  ó8   #   • U  H  oR                   v •  M     g 7f)NrP   )Ú.0Úcs     r   Ú	<genexpr>Úmain.<locals>.<genexpr>   s   é € Ð1IÂ5¸a·'¶'Â5ùs   ‚é   ÚFound)r   ÚcolumnÚMetricÚQuarterr"   z: in scope but Metric is emptyzFind z	. Return z valuez: no in-scope rowsz: z in-scope rows -> docs 10Q=Úidz Deck=z
 (dry run)Ú10QÚDeckr[   r=   r0   zERROR: row missing from runr   z ProvenancerN   )r   r«   r?   z
 answers, z	 cached, z
 asked in z.0fzs (doc Ú))r¯   r°   r|   r}   r~   r   r€   z
SWEEP DONE: z cells written (z	 asked), z errors -> )rš   r„   r–   r„   Úreturnzdict | None)6ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsr   ÚtempfileÚmkdtemprˆ   r‹   Úoutputr   r   rr   r   rw   rH   ÚopenpyxlÚload_workbookÚtickersr   ÚstripÚ
sheetnamesÚprintr5   Úplayground_dbÚconnectr˜   r—   Ú	enumerateÚrangeÚmax_rowÚcellr?   ÚIN_SCOPEr4   Údry_runr™   ru   rY   ra   ry   ÚitemsÚsetr„   rL   r;   rd   rQ   Ú
setdefaultÚ
max_columnÚsaver‚   rƒ   )5r!   ÚworkdirÚsrcÚout_uriÚ	local_outrŸ   Úwbr   r½   ÚunknownÚtotal_writtenÚtotal_cachedÚtotal_askedÚerrorsrV   ÚnameÚten_qÚdeckÚwsÚiÚhr    rp   r7   rX   ÚmetricÚquarterÚ_r_   rg   ÚsourcesÚlabelÚdocr«   Út0r^   Úcachedr¦   ÚaskedÚresultsÚjr   ÚfreshÚ	asked_setr?   Úprovr0   ÚstoredÚn_cachedÚheaderÚby_labelr�   rž   s5                                                      @@r   Úmainrð   È   sÛ  ù€ Ü×ÒÐ,eÑf€AØ‡N�N�:Ð$N€NÑOØ‡N�NØØØ{ð ñ ð
 ‡N�N�8¤#¨tÐ:N€NÑOØ‡N�N�: tÐ2Q€NÑRØ‡N�N�8Ð%<ÐCZ€NÑ[Ø‡N�N�; |Ð:k€NÑlØ‡N�NØØØXð ñ ð
 �<‰<‹>€Dä”8×#Ò#Ð+;Ñ<Ó=€GÜ
�—‘˜wÓ
'€CØ�k‰k×M˜TŸ]™]×1Ñ1°#°qÓ9¸!Ñ<¸~ÑM€GØ+2×+=Ñ+=¸g×+FÑ+F�˜-Ò'ÌDÐQXËM€Iä�<Š<˜4Ÿ9™9˜+ ^Ð4¸bÑA×FÑFÓH€D÷	3ð 	3ô 
×	Ò	 ¨uÑ	5€Bð LPÏ<Ï< $§,¡,×"4Ñ"4°SÔ"9ÓGÒ"9˜Q¿W¹W¿Y‹yˆq�w‰wŽyÑ"9ÒGÐ]a€GØÑÙ%Ó@šg˜°"·-±-Ñ)?—1™gˆÐ@ÞÜÐ;¸D¿I¹IÀgÓ<NÐ;OÐPÐX\Ò]ØØ:;Ð;€MÐ;�LÐ; ;Ü	×	Ò	Ô	  DØ—M•MˆDØ�yÓ  WÑ%8¸TÓ=PÙÙ$ T¨6Ó2±J¸tÀVÓ4L�4ˆEØ‰} ¡Ü˜˜d˜V 5¨¯©¨°Q°t·y±y°kÐA_Ð`ÐhlÒmÙØ‘ˆBÜ(1Ñ1IÀ2ÀaÂ5Ó1IÔ(IÔJÒ(I¡  1�1�a˜!‘e’8Ñ(IˆCÑJØ*,ˆDÜ˜1˜bŸj™j¨1™nÖ-�ØŸ™ A¨c°'©l˜Ð;×AÑA�ØŸ™ Q¨s°8©}˜Ð=×CÑC�ØŸ'™' a°°I±˜'Ð?×EÑE�ØœHÕ$Þ!Ü  d V¨5°°Ð3QÐRÐZ^Ò_Ù Ø—K‘K  e¨F¨8°9¸W¸IÀVÐ$LÐ MÖNñ .ö Ü˜˜d˜VÐ#5Ð6¸dÒCÚÙ'+Ô,¢t™t˜q !›¡tˆIÑ,Ø�|�|ÜØ�f˜Bœs 4›y˜kÐ)DÀUÈ4Á[ÀMÐQWÐX\Ð]aÑXbÐWcÐcmÐnôò Ø13ˆGØ(-¨u°c¸%±jÐ'AÀFÈDÐRUÐV\ÑR]ÐC^Ô&_Ñ"��s˜FÜ—Y’Y“[�Ü% d¨C°©IÓ6�Ü% d¨GÓ4�ô !*¨)Ô 4ôâ 4™˜˜1Ø#ŸZ™Z¨›]Ð*˜Ñ3°q¸±{ÀgÓ7MÐQVÐ^_Ð`jÑ^kÑQk÷ Ù 4ð ñ ö
 ]bœ) D§I¡I¨s°4©yÑQVÓ:WÒQVÈA¸9ÀQ¼<ÑQVÑ:WÔXÐgi�Ø5<·]±]´_ÔE²_©6¨1¨c˜˜q™ 3š±_�ÑEÜ ›J�	Ü!*¨4§‘I�A‘v˜˜1Ø˜I“~Ø#Ÿi™i¨›l˜Þ8;¤¤J¨s£OÔ 4ÐA^˜Þ25œz¨#œ¸2˜Ø$)¨5 >˜ÞØ>B˜H¨ w¨kÐ%:Ñ;Ü$ T¨7°A´}ÀUÓ7KÈXÕVà!'¨¡¨:Ñ!6˜Ü # F§J¡J¨u°bÓ$9Ó :˜Ü" 6§:¡:°°°{Ð.CÀRÓ#HÓI˜Ø×'Ñ'¨×1Ñ1Ø !™˜Ø—G‘G ¨&¸�GÑ>Ø! QÑ&�MØ7;�G×&Ñ& q¨"Ó-¨eÔ4ñ# "1ô$ ˜t›9¤s¨5£zÑ1�Ø Ñ(�Øœs 5›zÑ)�ÜØ�f˜A˜e˜W B¤s¨4£y k°¸H¸:ÀYÌsÐSXËzÈlð [ÜŸ9š9›;¨Ñ+¨CÐ0°¸¸D¹	°{À!ðEàõñI '`óX )�Ø!˜7 +Ð.�Ø Ó$Ø"$§-¡-°!Ñ"3�C˜‘KØ—G‘G ¨#¨f©+¸V�GÑDØ#*§=¡=¦?‘K�A�xØ—|‘| E×*Ó*ØŸ™ A¨c°&©kÀÈ%Á˜ÓQó $3ñ )ð �G‰G�I×ñc "÷ 
!ðh ‡|‡|ØØ‡G�GˆIÔØ×Ñ˜'×"Ñ"Ü�Š˜˜t T¬3¨y«>¸7ÀIÐNÐVZÒ[Ü	Ø
˜˜ð (ØˆN˜) K =°	¸&¸ÀÈWÈIð	Wàòð
 ùòK Hùâ@ùó Kùó -ùóùò
 ;XùÛE÷W 
!Õ	 ús}   Æ,^"Ç^"Ç(^'Ç?^'ÉA?_	Ë^,
ËB _	ÍA_	Î2^2
ÏB_	Ñ-^8Ò^8Ò"_	Ò/^>Ò>_	Ó_Ó-G=_	Û.5_	Þ,_	ß	
_Ú__main__)r   Údictr²   z
str | None)r   rò   r²   r„   )r   rò   r²   r„   )r?   r„   r²   r„   )rV   úpsycopg.ConnectionrW   r¶   r²   r„   )rV   ró   r^   r„   r²   zdict[str, dict])rV   ró   r^   r„   rc   r„   r[   r„   r0   rò   r²   ÚNone)rw   r„   rW   r¶   rg   z	list[str]r²   zdict[int, dict])r…   r„   r†   r   r²   r   )r²   r¶   )%Ú__doc__Ú
__future__r   r³   rH   r‚   Úsysr¸   ru   Úpathlibr   r»   Úpsycopgrr   Úpsycopg.types.jsonr   Úquber.playgroundr   rÁ   Úquber.playground.agentr   r\   rÇ   rG   r   r.   r;   rL   rQ   rY   ra   rd   ry   rˆ   rð   Ú__name__Úexit© r   r   Ú<module>r      s�   ðñõ: #ã Û Û Û 
Û Û Ý ã Û Û Ý $å 0Ý @àÐ-Ð.€Ø€ôô,ô,ô06ôô	ôHôô8ô0ôMð` ˆzÓØ‡H‚H‰T‹VÕð r   