§
    éƒtjk± ã                  óŒ  — d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	m
Z
 ddlmZmZmZmZmZmZmZm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mZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& dd
l'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z5 ddl6m7Z7 ddl8m8Z8m9Z9m:Z: dddddddddddddœZ; e<e; =                    ¦   «         ¦  «        Z>d‹d„Z?dŒd#„Z@d�dŽd(„ZAd�d)„ZBd�d+„ZCd�d,„ZDd‘d.„ZEd’d1„ZFd“d”d2„ZGd•d4„ZHd–d8„ZId—d<„ZJd˜d=„ZKd™d>„ZLd™d?„ZMd™d@„ZNd™dA„ZOdšdC„ZPd“d›dF„ZQ ejR        dG¦  «        ZSdHZTdœdJ„ZUdœdK„ZVd�dM„ZWdNddOdOdPœdždV„ZXdWddXœdŸd]„ZYd“d d^„ZZdd_œd¡da„Z[d“d”db„Z\d“d¢dd„Z]d£df„Z^d¤dg„Z_d‹dh„Z`d“d”di„Zad“d”dj„Zbd“d”dk„Zcd“d”dl„Zdd’dm„Zed¥dn„Zfd¦do„Zgd§dp„Zhddqœd¨dt„Zid©du„Zjd“d”dv„Zkd“d”dw„Zldªdy„Zmdªdz„Znd“d”d{„Zod«d|„Zpd¬d}„Zqd’d~„Zrddœd­d�„Zsd“d®d„„Ztddddd…œd¯dŠ„ZudS )°u^   Build analyst-style structured insights from statement jobs â€” never expose retrieval jargon.é    )ÚannotationsN)ÚAny)ÚInsightMetricÚInsightTableÚInsightTransactionÚStructuredInsight)Ú_detect_currency_symbolÚ_detect_spend_categoryÚ
_money_outÚ	_money_inÚ_pretty_moneyÚ_rough_categoryÚ_row_matches_keysÚis_pdf_overview_question)Úapply_paragraph_styleÚwants_paragraph_format)Úis_coverage_challenge)ÚFINANCE_INTENT_LABELSÚclassify_finance_intentÚextract_merchant_queryÚis_analyse_overview_askÚis_biggest_expenses_questionÚis_financial_advice_questionÚis_payment_list_questionÚis_period_coverage_questionÚis_profit_loss_questionÚis_statement_field_questionÚis_statement_identity_questionÚis_statement_period_questionÚ is_vague_single_payment_question)Ú_MONTH_ALIASESÚ_date_sort_keyÚ_full_statement_textÚ_month_tokenÚ_normalize_date_labelÚ_parse_day_monthÚ_row_matches_day_monthÚ_spend_by_date_from_rowsÚ_spend_by_date_from_textÚis_per_date_spend_questionÚlist_agent_statement_jobs)Údb)Úunique_ready_docs)ÚdatetimeÚtimezoneÚ	timedeltaÚJanuaryÚFebruaryÚMarchÚAprilÚMayÚJuneÚJulyÚAugustÚ	SeptemberÚOctoberÚNovemberÚDecember)ÚjanÚfebÚmarÚaprÚmayÚjunÚjulÚaugÚsepÚoctÚnovÚdecÚjobúdict[str, Any]ÚreturnÚstrc                ó$   — t          | ¦  «        pdS )Nu   â‚¹)r	   ©rI   s    ú,/var/www/html/CA-Chatbot/app/saas/insight.pyÚ_currP   L   s   € Ý" 3Ñ'Ô'Ð0¨5Ð0ó    ÚvÚobjectÚcurc                ó,   — t          | |¦  «        p|› d�S )Nz 0.00)r   )rR   rT   s     rO   Ú_moneyrV   P   s   € Ý˜˜CÑ Ô Ð1 s M M MÐ1rQ   é8   ÚtextÚlimitÚintc                óF  — t          j        dd| pd                     dd¦  «        ¦  «                             ¦   «         }t          j        dd|¦  «                             d¦  «        }|sdS t	          |¦  «        |k    r|n!|d |dz
  …                              ¦   «         d	z   S )
Nú\s+Ú Ú Ú
z-(?i)\b(upi\s*id|upi\s*ref\s*no|tag:|note:).*$z -|,ÚPaymenté   u   â€¦)ÚreÚsubÚreplaceÚstripÚlenÚrstrip)rX   rY   Úts      rO   Ú_clean_descri   T   s™   € Ý
Œˆv�s˜T˜Z R×0Ò0°°sÑ;Ô;Ñ<Ô<×BÒBÑDÔD€AÝ
ŒÐ?ÀÀQÑGÔG×MÒMÈfÑUÔU€AØð ØˆyÝ�A‘”˜%’�ˆ1ˆ1 Q {¨°© {¤^×%:Ò%:Ñ%<Ô%<¸uÑ%DÐDrQ   c                ó(  — |                       d¦  «        pi }t          |                      d¦  «        pi ¦  «        }|                       d¦  «        pi }dD ]D}|                      |¦  «        €-|                      |¦  «        �|                      |¦  «        ||<   ŒEt          | ¦  «        }t          | ¦  «        }|                      d¦  «        €,|r*t	          t          d„ |D ¦   «         ¦  «        d¦  «        |d<   |                      d¦  «        €,|r*t	          t          d	„ |D ¦   «         ¦  «        d¦  «        |d<   |                      d
¦  «        €|rt          |¦  «        |d
<   |                      d¦  «        €|rt          |¦  «        |d<   |                      d¦  «        €q|                      d¦  «        �\|                      d¦  «        �G	 t          |d         ¦  «        t          |d         ¦  «        z
  |d<   n# t          t          f$ r Y nw xY w|S )NÚcalculationÚmetricsÚstatement_totals)Ú	money_outÚmoney_inÚpayments_madeÚpayments_receivedÚnet_cashflowrn   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S ©N©r   ©Ú.0Úrs     rO   ú	<genexpr>z"_header_metrics.<locals>.<genexpr>g   s(   è è € Ð(IÐ(I¸1­°A©¬Ð(IÐ(IÐ(IÐ(IÐ(IÐ(IrQ   é   ro   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rt   ©r   rv   s     rO   ry   z"_header_metrics.<locals>.<genexpr>i   s(   è è € Ð'FÐ'F¸­	°!©¬Ð'FÐ'FÐ'FÐ'FÐ'FÐ'FrQ   rp   rq   rr   )
ÚgetÚdictÚ_outflow_rowsÚ_inflow_rowsÚroundÚsumrf   ÚfloatÚ	TypeErrorÚ
ValueError)rI   Úcalcrl   ÚheaderÚkÚout_rowsÚin_rowss          rO   Ú_header_metricsr‹   \   s  € Ø�7Š7�=Ñ!Ô!Ð' R€DÝ�4—8’8˜IÑ&Ô&Ð,¨"Ñ-Ô-€GØ�WŠWÐ'Ñ(Ô(Ð.¨B€FØ\ð 'ð 'ˆØ�;Š;�q‰>Œ>Ð! f§j¢j°¡m¤mÐ&?ØŸš A™œˆG�A‰Jøå˜SÑ!Ô!€HÝ˜3ÑÔ€GØ‡{‚{�;ÑÔÐ'¨HÐ'Ý$¥SÐ(IÐ(IÀÐ(IÑ(IÔ(IÑ%IÔ%IÈ1ÑMÔMˆ�ÑØ‡{‚{�:ÑÔÐ&¨7Ð&Ý#¥CÐ'FÐ'F¸gÐ'FÑ'FÔ'FÑ$FÔ$FÈÑJÔJˆ�
ÑØ‡{‚{�?Ñ#Ô#Ð+°Ð+Ý#& x¡=¤=ˆ�Ñ Ø‡{‚{Ð&Ñ'Ô'Ð/°GÐ/Ý'*¨7¡|¤|ˆÐ#Ñ$Ø‡{‚{�>Ñ"Ô"Ð*¨w¯{ª{¸:Ñ/FÔ/FÐ/RÐW^×WbÒWbÐcnÑWoÔWoÐW{ð	Ý&+¨G°JÔ,?Ñ&@Ô&@Å5ÈÐQ\ÔI]ÑC^ÔC^Ñ&^ˆG�NÑ#Ð#øÝ�:Ð&ð 	ð 	ð 	ØˆDð	øøøà€Ns   Ç.G; Ç;HÈHú
str | Nonec                ó`  — t          | ¦  «        d d…         }t          j        d|¦  «        }|r;t          j        dd|                     d¦  «        ¦  «                             ¦   «         S t          j        d|¦  «        }|r-|                     d¦  «        › d|                     d¦  «        › �S d S )	NéÄ	  už   (?i)(\d{1,2}\s*(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)'?\d{0,4}\s*[-â€“]\s*\d{1,2}\s*(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)'?\d{0,4})r\   r]   ra   zo(?i)statement\s+from\s*[:\-]?\s*(\d{1,2}[/-]\d{1,2}[/-]\d{2,4})\s*to\s*[:\-]?\s*(\d{1,2}[/-]\d{1,2}[/-]\d{2,4})z - rz   )r#   rb   Úsearchrc   Úgroupre   )rI   rX   ÚmÚm2s       rO   Ú_period_labelr“   v   s¶   € Ý Ñ$Ô$ U d UÔ+€DÝ
Œ	ð	_àñ	ô 	€Að
 	ð 7ÝŒv�f˜c 1§7¢7¨1¡:¤:Ñ.Ô.×4Ò4Ñ6Ô6Ð6å	Œð	<àñ
ô 
€Bð
 
ð 0Ø—(’(˜1‘+”+Ð/Ð/ "§(¢(¨1¡+¤+Ð/Ð/Ð/Øˆ4rQ   c                ó(  ‡— t          | ¦  «        dd…         }t          j        d|¦  «        }|r;t          j        dd|                     d¦  «        ¦  «                             ¦   «         S t          j        d|¦  «        }|r²t          j        dd|                     d¦  «        ¦  «                             ¦   «         }t          j        dd	|¦  «                             ¦   «         }t          |                     ¦   «         ¦  «        d
k    r*|                     ¦   «         r| 	                    ¦   «         n|S | 
                    ¦   «         D ]É}|                     ¦   «         Š‰r‰                     d¦  «        rŒ.t          j        d‰t          j        ¦  «        rŒOt          j        d‰¦  «        rHd}t          ˆfd„|D ¦   «         ¦  «        rŒ‚t          j        dd‰¦  «         	                    ¦   «         c S t          j        d‰¦  «        rd‰vr‰c S ŒÊdS )zHBest-effort account / statement holder from header text (bank-agnostic).NrŽ   z�(?i)(?:customer\s*name|account\s*holder|account\s*name|name\s*of\s*customer)\s*[:\-]\s*([A-Z][A-Za-z]+(?:\s+[A-Z][A-Za-z]+){0,3})r\   r]   ra   zN(?i)\b((?:mr|mrs|ms|smt|shri)\.?\s+[A-Z][A-Za-z]+(?:\s+[A-Z][A-Za-z]+){0,3})\bz3(?i)\s+(HARYANA|PUNJAB|DELHI|INDIA|CITY|STATE)\b.*$r^   rz   ú---z^page\s*\d+z^[A-Z][A-Z\s.'-]{2,48}$)ÚPAYTMÚ	STATEMENTÚHDFCÚICICIÚAXISÚSBIÚBANKÚUPIÚNOTEÚ	PANCHKULAÚHARYANAÚSECTORÚADDRESSÚJOINTc              3  ó    •K  — | ]}|‰v V — Œ	d S rt   © )rw   ÚtokÚss     €rO   ry   z"_account_holder.<locals>.<genexpr>»   s'   øè è € Ð,Ð, �3˜!�8Ð,Ð,Ð,Ð,Ð,Ð,rQ   z$^[A-Z][a-z]+(?:\s+[A-Z][a-z]+){1,3}$ú@)r#   rb   r�   rc   r�   re   rf   ÚsplitÚisupperÚtitleÚ
splitlinesÚ
startswithÚmatchÚIÚany)rI   rX   ÚlabeledÚ	honorificÚnameÚlineÚskipr§   s          @rO   Ú_account_holderr¶   Š   s  ø€ å Ñ$Ô$ U d UÔ+€DÝŒið	6àñô €Gð
 ð =ÝŒv�f˜c 7§=¢=°Ñ#3Ô#3Ñ4Ô4×:Ò:Ñ<Ô<Ð<å”	ØYØñô €Ið ð 	<ÝŒv�f˜c 9§?¢?°1Ñ#5Ô#5Ñ6Ô6×<Ò<Ñ>Ô>ˆåŒvØBØØñ
ô 
÷ Š%‰'Œ'ð	 	õ
 ˆt�zŠz‰|Œ|ÑÔ Ò!Ð!Ø#'§<¢<¡>¤>Ð;�4—:’:‘<”<�<°tÐ;à—’Ñ!Ô!ð ð ˆØ�JŠJ‰LŒLˆØð 	�A—L’L Ñ'Ô'ð 	ØÝŒ8�N A¥r¤tÑ,Ô,ð 	ØÝŒ8Ð.°Ñ2Ô2ð 	2ðˆDõ  Ð,Ð,Ð,Ð, tÐ,Ñ,Ô,Ñ,Ô,ð ØÝ”6˜& # qÑ)Ô)×/Ò/Ñ1Ô1Ð1Ð1Ð1åŒ8Ð;¸QÑ?Ô?ð 	ÀCÈqÀLÀLØˆHˆHˆHøØˆ4rQ   údict[str, str]c                óÄ  ‡‡— t          | ¦  «        dd…         Ši Šd&ˆˆfd„} |d	d
¦  «         ‰                     d	¦  «        rdt          j        d‰¦  «        }|rM|                     d¦  «                             ¦   «         }|                     ¦   «         dvr‰d	         › d|› �‰d	<    |dd¦  «          |dd¦  «          |dd¦  «          |dd¦  «          |dd¦  «          |dd¦  «          |dd¦  «         ‰                     d¦  «        s |dd¦  «         ‰                     d¦  «        r‚t          j        d‰d         ¦  «        d                              d ¦  «        ‰d<   d!                     ‰d                              ¦   «         dd"…         ¦  «                             d#¦  «        ‰d<   t          | ¦  «        }|r|‰d$<   t          | ¦  «        }|r|‰d%<   ‰S )'z8Pull common bank-header identifiers from statement text.Né   ÚkeyrL   ÚpatternrK   ÚNonec                óÚ   •— t          j        |‰t           j        ¦  «        }|rEt          j        dd|                     d¦  «        ¦  «                             d¦  «        }|r	|‰| <   d S d S d S )Nr\   r]   ra   z :-)rb   r�   r¯   rc   r�   re   )rº   r»   r‘   ÚvalÚfieldsrX   s       €€rO   Ú_grabz(_extract_statement_fields.<locals>._grabÉ   st   ø€ ÝŒI�g˜t¥R¤TÑ*Ô*ˆØð 	"Ý”&˜  a§g¢g¨a¡j¤jÑ1Ô1×7Ò7¸Ñ>Ô>ˆCØð "Ø!��s‘��ð	"ð 	"ð"ð "rQ   Úaccount_branchz?account\s+branch\s*[:\-]?\s*([A-Za-z0-9][A-Za-z0-9 /,&-]{1,40})zA(?i)account\s+branch\s*[:\-]?\s*[^\n]+\n\s*([A-Z][A-Za-z ]{2,30})ra   >   úJOINT HOLDERSr¢   ÚCURRENCYú, Úbranch_codez"branch\s*code\s*[:\-]?\s*(\d{3,8})Úaccount_numberzG(?:account\s*no\.?|a/?c\s*no\.?|account\s*number)\s*[:\-]?\s*(\d{9,18})Úifscz8(?:rtgs/?neft\s*)?ifsc\s*[:\-]?\s*([A-Z]{4}0[A-Z0-9]{6})Úmicrzmicr\s*[:\-]?\s*(\d{6,12})Úcust_idz(cust(?:omer)?\s*id\s*[:\-]?\s*(\d{5,15})Ústatez$\bstate\s*:\s*([A-Z][A-Za-z ]{2,30})Ú	bank_namezV\b((?:HDFC|ICICI|SBI|AXIS|YES|KOTAK|IDFC|PNB|BOB|CANARA|UNION)\s+Bank(?:\s+Ltd\.?)?)\bz1\b([A-Z][A-Za-z&. ]{2,40}\s+Bank(?:\s+Ltd\.?)?)\bz1(?i)\b(?:phone|email|od\s*limit|currency|india)\br   z .r]   é   z ,.Úaccount_holderÚperiod)rº   rL   r»   rL   rK   r¼   )r#   r}   rb   r�   r�   re   Úupperr©   Újoinr¶   r“   )rI   rÀ   Úm_cityÚcityÚholderrÎ   r¿   rX   s         @@rO   Ú_extract_statement_fieldsrÔ   Ä   s}  øø€ å Ñ$Ô$ U d UÔ+€DØ€Fð"ð "ð "ð "ð "ð "ð "ð 
€EØØJñô ð ð
 ‡z‚zÐ"Ñ#Ô#ð QÝ”ØPØñ
ô 
ˆð ð 	QØ—<’< ‘?”?×(Ò(Ñ*Ô*ˆDØ�zŠz‰|Œ|Ð#KÐKÐKØ.4Ð5EÔ.FÐ+PÐ+PÈ$Ð+PÐ+P�Ð'Ñ(à	€Eˆ-Ð>Ñ?Ô?Ð?Ø	€EØØRñô ð ð 
€Eˆ&ÐMÑNÔNÐNØ	€Eˆ&Ð/Ñ0Ô0Ð0Ø	€Eˆ)Ð@ÑAÔAÐAØ	€Eˆ'Ð:Ñ;Ô;Ð;à	€EØØañô ð ð �:Š:�kÑ"Ô"ð 
ØˆØØ@ñ	
ô 	
ð 	
ð ‡z‚z�'ÑÔð MÝœ(Ø@Ø�7ŒOñ
ô 
ð ô÷ ŠU�4‰[Œ[ð 	ˆw‰ð Ÿ(š( 6¨'¤?×#8Ò#8Ñ#:Ô#:¸2¸A¸2Ô#>Ñ?Ô?×EÒEÀeÑLÔLˆˆw‰å˜SÑ!Ô!€FØð *Ø#)ˆÐÑ Ý˜3ÑÔ€FØð "Ø!ˆˆxÑØ€MrQ   Úquestionr   c                ó¤  — t          | ¦  «        }|                      d¦  «        pd}|pd                     ¦   «         }g }t          j        d|¦  «        rg d¢}�nœt          j        d|¦  «        r|                     d¦  «         t          j        d|¦  «        r|                     d	¦  «         t          j        d
|¦  «        r|                     d¦  «         t          j        d|¦  «        r|                     d¦  «         t          j        d|¦  «        r*|                     d¦  «         |                     d¦  «         t          j        d|¦  «        r*|                     d¦  «         |                     d¦  «         t          j        d|¦  «        r*t          j        d|¦  «        s|                     d¦  «         t          j        d|¦  «        r|sg d¢}t          j        d|¦  «        rg d¢|z   }t          ¦   «         }g }|D ]6\  }}	|	|v rŒ
|                     |	¦  «         |                     ||	f¦  «         Œ7g }
|D ]E\  }}	|                     |	¦  «        r+|
                     t          |||	         d¬¦  «        ¦  «         ŒF|
sHdD ]E\  }}	|                     |	¦  «        r+|
                     t          |||	         d¬¦  «        ¦  «         ŒF|                     d¦  «        r+|
                     t          d|d         d¬¦  «        ¦  «         |                     d¦  «        r+|
                     t          d|d         d¬¦  «        ¦  «         |
s%t          d t          d          d!d"|› d#�g d$g¬%¦  «        S |
d&         }t          |
¦  «        d'k    rd(|› d)|j        › d*|j        › d+�nd,|› d-�}t          d t          d          d.||
d/g¬%¦  «        S )0zKAnswer branch / IFSC / account number style asks from the statement header.ÚfilenameÚ	statementr^   z9(?i)state\s+account\s+branch|statement\s+account\s+branch)©zBranch coderÅ   ©zAccount branchrÁ   ©zAccount numberrÆ   ©ÚIFSCrÇ   ©ÚStaterÊ   z(?i)\bifsc\brÜ   z(?i)\bmicr\b)ÚMICRrÈ   z(?i)\bcust(?:omer)?\s*id\b©zCustomer IDrÉ   z=(?i)\baccount\s*(?:number|no\.?|num)\b|\ba/?c\s*(?:number|no)rÛ   z7(?i)\bbranch\s*code\b|\bbranch\s*(?:number|no\.?|num)\brÙ   rÚ   z(?i)\baccount\s+branch\bz(?i)\bstate\bz(?i)\bstatement\brÞ   z(?i)\bbranch\bzT(?i)\bbank\s+name\b|\bname\s+of\s+(?:the\s+)?bank\b|\bwhich\s+bank\b|\bwhat\s+bank\b))ÚBankrË   rÜ   rÚ   Úaccent©ÚlabelÚvalueÚtone)rÙ   rÚ   rÛ   rÜ   rÞ   rá   ÚneutralrÍ   úAccount holderrÎ   ÚPeriodÚstatement_summaryzStatement detailsu5   I couldnâ€™t find branch / account identifiers on â€œuO   â€�. Try asking for the statement overview, or check the first page of the PDF.z)Looked through the statement header text.©ÚintentÚintent_labelÚheadlineÚsummaryrl   Ú	footnotesr   ra   u   From â€œõ   â€�: z is ú.u.   Here are the account / branch details from â€œõ   â€�.zAccount & branch detailsuI   Read from the statement header / first page â€” not a general definition.)rÔ   r}   Úlowerrb   r�   ÚappendÚsetÚaddr   r   r   rf   rå   ræ   )rI   rÕ   r¿   r×   ÚqÚwantedÚseenÚorderedrå   rº   rl   Úprimaryrð   s                rO   Úbuild_statement_field_answerrþ     s�  € å& sÑ+Ô+€FØ�wŠw�zÑ"Ô"Ð1 k€HØ	ˆ�R×ÒÑ Ô €Að %'€Få	„yÐMÈqÑQÔQð "nð
ð 
ð 
ˆ‰õ Œ9�_ aÑ(Ô(ð 	,Ø�MŠMÐ*Ñ+Ô+Ð+ÝŒ9�_ aÑ(Ô(ð 	,Ø�MŠMÐ*Ñ+Ô+Ð+ÝŒ9Ð2°AÑ6Ô6ð 	6Ø�MŠMÐ4Ñ5Ô5Ð5ÝŒ9ÐUÐWXÑYÔYð 	@Ø�MŠMÐ>Ñ?Ô?Ð?ÝŒ9ÐOÐQRÑSÔSð 	@Ø�MŠMÐ8Ñ9Ô9Ð9Ø�MŠMÐ>Ñ?Ô?Ð?ÝŒ9Ð0°!Ñ4Ô4ð 	:Ø�MŠMÐ>Ñ?Ô?Ð?Ø�MŠMÐ8Ñ9Ô9Ð9ÝŒ9Ð% qÑ)Ô)ð 	.µ"´)Ð<PÐRSÑ2TÔ2Tð 	.Ø�MŠMÐ,Ñ-Ô-Ð-ÝŒ9Ð&¨Ñ*Ô*ð 	°6ð 	ðð ð ˆFõ Œ9ÐlÐnoÑpÔpð 	nØdÐdÐdÐgmÑmˆFõ ‘U”U€DØ%'€GØð %ð %‰
ˆˆsØ�$ˆ;ˆ;ØØ�Š�‰ŒˆØ�Š˜˜s�|Ñ$Ô$Ð$Ð$à#%€GØð Yð Y‰
ˆˆsØ�:Š:�c‰?Œ?ð 	YØ�NŠN�=¨u¸FÀ3¼KÈhÐWÑWÔWÑXÔXÐXøàð ^ð
ð 		^ð 		^‰JˆE�3ð �zŠz˜#‰Œð ^Ø—’�}°5ÀÀsÄÐR[Ð\Ñ\Ô\Ñ]Ô]Ð]øà‡z‚zÐ"Ñ#Ô#ð 
Ø�ŠÝÐ 0¸Ð?OÔ8PÐW`ÐaÑaÔañ	
ô 	
ð 	
ð ‡z‚z�(ÑÔð ^Ø�Š•}¨8¸6À(Ô;KÐR[Ð\Ñ\Ô\Ñ]Ô]Ð]àð 
Ý Ø&Ý.Ð/BÔCØ(ð]Èð ]ð ]ð ]ð ØBÐCð

ñ 

ô 

ð 
	
ð �aŒj€Gõ ˆw‰<Œ<˜1ÒÐð 	F�8ÐEÐE '¤-ÐEÐE°W´]ÐEÐEÐEÐEàL¸hÐLÐLÐLð õ
 Ø"Ý*Ð+>Ô?Ø+ØØØ^Ð_ðñ ô ð rQ   c                ó¦  — t          | ¦  «        }t          | ¦  «        }|                      d¦  «        pd}t          | ¦  «        }t	          | ¦  «        }|                     d¦  «        }|                     d¦  «        }|                     d¦  «        }	|	€>|�<|�:	 t          |¦  «        t          |¦  «        z
  }	n# t          t          f$ r d}	Y nw xY w|	€$t          dt          d         dd	|› d
�g g ¬¦  «        S t          |	¦  «        }
|
dk     rdt          |
|¦  «        › d�}d}d}n%|
dk    rdt          |
|¦  «        › d�}d}d}nd}d}d}d}t          |t          |
|¦  «        |¬¦  «        g}|�3|                     t          dt          ||¦  «        d¬¦  «        ¦  «         |�3|                     t          dt          ||¦  «        d¬¦  «        ¦  «         |r%|                     t          d|d¬¦  «        ¦  «         |r%|                     t          d|d¬¦  «        ¦  «         t          dt          d         d|dz   |z   |g d |› d!�g¬"¦  «        S )#uQ   Focused profit/loss style answer from statement net cashflow â€” not a full dump.r×   rØ   ro   rn   rr   NÚinsightsÚCashflowu*   I couldnâ€™t determine net cashflow on â€œuK   â€�. Ask for total spent and total received, or upload a clearer statement.rì   r   uI   Based on this statement, money out exceeded money in â€” net cashflow is z  (a net outflow for the period).ÚdangerzNet outflowuI   Based on this statement, money in exceeded money out â€” net cashflow is z (a net inflow for the period).Úsuccessz
Net inflowuP   Based on this statement, inflows and outflows balanced â€” net cashflow is zero.rè   úNet cashflowzwThis is statement cashflow (credits vs debits for the period), not accounting profit/loss or your live account balance.rä   úTotal spentúTotal receivedrê   ré   z!Profit or loss on this statement?r]   u   Figures from â€œu   â€� statement totals.©rí   rî   rï   rð   rl   Ú
highlightsrñ   )rP   r‹   r}   r“   r¶   rƒ   r„   r…   r   r   rV   r   rö   )rI   rÕ   rT   r‘   r×   rÎ   rÓ   ÚreceivedÚspentÚnetÚnet_fÚverdictrç   rå   Únoterl   s                   rO   Úbuild_cashflow_verdictr  n  sô  € å
ˆs‰)Œ)€CÝ˜ÑÔ€AØ�wŠw�zÑ"Ô"Ð1 k€HÝ˜3ÑÔ€FÝ˜SÑ!Ô!€FØ�uŠu�ZÑ Ô €HØ�EŠE�+ÑÔ€EØ
�%Š%�Ñ
Ô
€CØ
€{�xÐ+°Ð0Að	Ý˜‘/”/¥E¨%¡L¤LÑ0ˆCˆCøÝ�:Ð&ð 	ð 	ð 	ØˆCˆCˆCð	øøøð €{Ý ØÝ.¨zÔ:ØðY¸Xð Yð Yð Yð Øð

ñ 

ô 

ð 
	
õ �#‰JŒJ€EØˆq‚y€yðTÝ% e¨SÑ1Ô1ðTð Tð Tð 	ð ˆØˆˆØ	�ŠˆðSÝ% e¨SÑ1Ô1ðSð Sð Sð 	ð ˆØˆˆàdˆØˆØˆð	Cð 	õ
 	˜E­°°sÑ);Ô);À$ÐGÑGÔGð€Gð ÐØ�Š•}¨=ÅÀuÈcÑ@RÔ@RÐYaÐbÑbÔbÑcÔcÐcØÐØ�Š•}Ð+;Å6È(ÐTWÑCXÔCXÐ_hÐiÑiÔiÑjÔjÐjØð TØ�Š•}¨8¸6È	ÐRÑRÔRÑSÔSÐSØð \Ø�Š•}Ð+;À6ÐPYÐZÑZÔZÑ[Ô[Ð[åØÝ*¨:Ô6Ø4Ø˜#‘ Ñ$ØØØE hÐEÐEÐEÐFðñ ô ð s   ÂB: Â:CÃCúlist[list[str]]c                óf  — t          | ¦  «        }t          j        d¦  «        }|                     ¦   «         }g }g }|D ][}|                     |                     ¦   «         ¦  «        r|r|                     |¦  «         |g}ŒD|r|                     |¦  «         Œ\|r|                     |¦  «         |S )zCSplit statement text into date-headed payment blocks (Paytm-style).úD(?i)^(\d{1,2})\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\b)r#   rb   Úcompiler¬   r®   re   rö   )rI   rX   Ú
date_startÚlinesÚblocksrT   r´   s          rO   Ú_payment_blocksr  º  sÈ   € å Ñ$Ô$€DÝ”ØOñô €Jð �OŠOÑÔ€EØ €FØ€CØð ð ˆØ×Ò˜DŸJšJ™LœLÑ)Ô)ð 	Øð #Ø—’˜cÑ"Ô"Ð"Ø�&ˆCˆCØð 	Ø�JŠJ�tÑÔÐøØ
ð Ø�Š�cÑÔÐØ€MrQ   Úblockú	list[str]údict[str, Any] | Nonec                óÒ  — t          j        d¦  «        }d}t          j        d¦  «        }d                     | ¦  «        }|                     | d                              ¦   «         ¦  «        }|sd S t          j        dd|¦  «        }t          j        d|› d	|› d
�|¦  «        rd S t          j        d|¦  «        sd S d }t          j        d|¦  «        }|rJ	 t          |                     d¦  «         	                    dd¦  «        ¦  «        }n# t          $ r d }Y nw xY w|r|dk    rd S |                     |¦  «        }	|	r’|	                     d¦  «                             |	                     d¦  «        ¦  «        d                              ¦   «         }
|
› d|	                     d¦  «                             ¦   «         › �                     ¦   «         }n$t          j        dd| d         ¦  «        d d…         }t          j        dd|t           j        ¬¦  «                             ¦   «         }t          |                     d¦  «        ¦  «        d›d|                     d¦  «        d d…                              ¦   «         › �}||d d…         |d | |d d…         dt          |                     d¦  «        ¦  «        |                     d¦  «        d d…                              ¦   «         dœ	S )Nr  z/Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Decz’(?i)(?:Paid to|Money sent to|Received from|Recharge of|Transferred to)\s+(.+?)(?:\s+Note:|\s+UPI\s+ID:|\s+Tag:|\s+HDFC|\s+payu|\s+State Bank|\s*$)r_   r   r\   r]   z(?i)\d{1,2}\s+(?:u   )\S*\s*[-â€“]\s*\d{1,2}\s+(?:ú)zj(?i)\b(paid\s+to|money\s+sent|received\s+from|recharge\s+of|transferred\s+to|upi\s+ref|money\s+received)\bu+   (?i)-\s*-?\s*(?:Rs\.?|â‚¹)\s*([\d,]+\.?\d*)ra   Ú,r^   éP   z \s+(HDFC|ICICI|Axis|SBI|Bank).*$)ÚflagsÚ02drz   rÌ   éð   T)	ÚdateÚdescriptionÚdebitÚcreditÚamountÚrawÚ
_from_textÚ_dayÚ_month)rb   r  rÐ   r®   re   rc   r�   rƒ   r�   rd   r…   r©   r¯   rZ   r«   rõ   )r  r  ÚmonthsÚpaid_reÚblobÚdmÚflatÚamtÚm_outÚpaidÚprefixÚdescÚ
date_labels                rO   Ú_block_to_rowr6  Ï  sé  € Ý”ØOñô €Jð @€FÝŒjð	Pñô €Gð �9Š9�UÑÔ€DØ	×	Ò	˜% œ(Ÿ.š.Ñ*Ô*Ñ	+Ô	+€BØð ØˆtÝŒ6�&˜#˜tÑ$Ô$€Då	„yØO˜vÐOÐOÀfÐOÐOÐOØñô ð ð ˆtåŒ9ð	ð 	ñô ð ð ˆtØ
€CÝŒIÐDÀdÑKÔK€EØð ð	Ý˜Ÿš A™œ×.Ò.¨s°BÑ7Ô7Ñ8Ô8ˆCˆCøÝð 	ð 	ð 	ØˆCˆCˆCð	øøøàð �#˜’(�(ØˆtØ�>Š>˜$ÑÔ€DØð 2Ø—’˜A‘”×$Ò$ T§Z¢Z°¡]¤]Ñ3Ô3°AÔ6×<Ò<Ñ>Ô>ˆØÐ2Ð2˜4Ÿ:š: a™=œ=×.Ò.Ñ0Ô0Ð2Ð2×8Ò8Ñ:Ô:ˆˆåŒv�f˜c 5¨¤8Ñ,Ô,¨S¨b¨SÔ1ˆÝŒ6Ð5°r¸4ÅrÄtÐLÑLÔL×RÒRÑTÔT€DÝ˜Ÿš ™œÑ$Ô$ÐDÐDÐD¨2¯8ª8°A©;¬;°r¸°r¬?×+@Ò+@Ñ+BÔ+BÐDÐD€JàØ˜C˜R˜C”yØØØ�$Ø�D�S�DŒzØÝ�B—H’H˜Q‘K”KÑ Ô Ø—(’(˜1‘+”+˜b˜q˜b”/×'Ò'Ñ)Ô)ð
ð 
ð 
s   Ã6D ÄDÄDÚdayÚmonthúlist[dict[str, Any]]c                ó  — |pdd d…                               ¦   «         }g }t          | ¦  «        D ][}t          |¦  «        }|sŒ|                     d¦  «        |k    r.|                     d¦  «        |k    r|                     |¦  «         Œ\|S )Nr^   rÌ   r)  r*  ©rõ   r  r6  r}   rö   )rI   r7  r8  ÚmonÚhitsr  Úrows          rO   Ú_day_hits_from_textr?  
  s—   € Øˆ;�B˜˜˜Ô
×
!Ò
!Ñ
#Ô
#€CØ!#€DÝ  Ñ%Ô%ð ð ˆÝ˜EÑ"Ô"ˆØð 	ØØ�7Š7�6‰?Œ?˜cÒ!Ð! c§g¢g¨hÑ&7Ô&7¸3Ò&>Ð&>Ø�KŠK˜ÑÔÐøØ€KrQ   c                óê   — |pdd d…                               ¦   «         }g }t          | ¦  «        D ]B}t          |¦  «        }|sŒ|                     d¦  «        |k    r|                     |¦  «         ŒC|S )Nr^   rÌ   r*  r;  )rI   r8  r<  r=  r  r>  s         rO   Ú_month_hits_from_textrA    sƒ   € Øˆ;�B˜˜˜Ô
×
!Ò
!Ñ
#Ô
#€CØ!#€DÝ  Ñ%Ô%ð ð ˆÝ˜EÑ"Ô"ˆØð 	ØØ�7Š7�8ÑÔ Ò#Ð#Ø�KŠK˜ÑÔÐøØ€KrQ   c                óD   — d„ |                       d¦  «        pg D ¦   «         S )zFTable-extracted outflows only (may be incomplete vs statement header).c                ó8   — g | ]}t          |¦  «        d k    ¯|‘ŒS ©r   ru   rv   s     rO   ú
<listcomp>z!_outflow_rows.<locals>.<listcomp>$  s(   € ÐDÐDÐD�!µ*¸Q±-´-À!Ò2CÐ2CˆAÐ2CÐ2CÐ2CrQ   Úrows©r}   rN   s    rO   r   r   "  s%   € àDÐD˜Ÿš ™œÐ-¨2ÐDÑDÔDÐDrQ   c                óD   — d„ |                       d¦  «        pg D ¦   «         S )Nc                ó8   — g | ]}t          |¦  «        d k    ¯|‘ŒS rD  r|   rv   s     rO   rE  z _inflow_rows.<locals>.<listcomp>(  s(   € ÐCÐCÐC�!µ)¸A±,´,ÀÒ2BÐ2BˆAÐ2BÐ2BÐ2BrQ   rF  rG  rN   s    rO   r€   r€   '  s%   € ØCÐC˜Ÿš ™œÐ-¨2ÐCÑCÔCÐCrQ   c                ó    — g }t          | ¦  «        D ];}t          |¦  «        }|r(t          |¦  «        dk    r|                     |¦  «         Œ<|S )z>Outflows parsed from full statement text blocks (Paytm-style).r   )r  r6  r   rö   )rI   r=  r  r>  s       rO   Ú_text_outflow_rowsrK  +  s[   € à!#€DÝ  Ñ%Ô%ð ð ˆÝ˜EÑ"Ô"ˆØð 	•:˜c‘?”? QÒ&Ð&Ø�KŠK˜ÑÔÐøØ€KrQ   c                óZ   — t          t          | ¦  «        t          | ¦  «        z   ¦  «        S )uœ   Union of table rows + text blocks â€” same source month/date lookups use.

    Keeps â€œlist all paymentsâ€� consistent with August/July month queries.
    )Ú_dedupe_category_rowsrK  r   rN   s    rO   Ú_complete_outflow_rowsrN  5  s(   € õ
 !Õ!3°CÑ!8Ô!8½=ÈÑ;MÔ;MÑ!MÑNÔNÐNrQ   ú
int | Nonec                ó¢   — t          | ¦  «        }|                     d¦  «        }|€d S 	 t          |¦  «        S # t          t          f$ r Y d S w xY w)Nrp   )r‹   r}   rZ   r„   r…   )rI   r‘   r'  s      rO   Ú_header_payments_maderQ  =  sa   € Ý˜ÑÔ€AØ
�%Š%�Ñ
 Ô
 €CØ
€{ØˆtðÝ�3‰xŒxˆøÝ•zÐ"ð ð ð Øˆtˆtðøøøs   ª9 ¹AÁAÚ	indexed_nútuple[int, int] | Nonec                ó€   — t          | ¦  «        }|€dS |�|nt          t          | ¦  «        ¦  «        }||k     r||fS dS )zMReturn (indexed, header) when indexed count is short of the statement header.N)rQ  rf   rN  )rI   rR  Úheader_nÚns       rO   Ú_extraction_gaprW  H  sQ   € å$ SÑ)Ô)€HØÐØˆtØÐ*ˆ	ˆ	µÕ4JÈ3Ñ4OÔ4OÑ0PÔ0P€AØˆ8‚|€|Ø�8ˆ}ÐØˆ4rQ   aI  (?i)\b(all|every|each|full|complete|entire|list|list\s+out|show\s+(?:me\s+)?all|break\s*down|detail(?:ed|s)?|itemi[sz]e|every\s+payment|all\s+payments|all\s+transactions?|full\s+list|only\s+(?:a\s+)?few|more\s+(?:payments?|transactions?|rows?)|rest\s+of\s+(?:the\s+)?(?:list|payments?|transactions?)|show\s+(?:everything|more))\biô  Úboolc                óT   — t          t                               | pd¦  «        ¦  «        S ©Nr^   )rX  Ú_FULL_LIST_REr�   ©rÕ   s    rO   Ú_wants_full_listr]  ^  s"   € Ý•×$Ò$ X ^°Ñ4Ô4Ñ5Ô5Ð5rQ   c                óJ   — t          t          j        d| pd¦  «        ¦  «        S )Nz6(?i)\bhow\s+many\s+(?:payments?|transactions?|txns?)\br^   )rX  rb   r�   r\  s    rO   Ú_wants_payment_countr_  b  s$   € Ý•”	ÐSÐU]ÐUcÐacÑdÔdÑeÔeÐerQ   r>  c                óî   — t          t          |                      d¦  «        pd¦  «        ¦  «        pDt          |                      d¦  «        pd¦  «                             d¦  «        d         d d…         S )Nr"  r^   r_   r   é   )r%   rL   r}   r©   )r>  s    rO   Ú_row_date_labelrb  f  sd   € å�c #§'¢'¨&¡/¤/Ð"7°RÑ8Ô8Ñ9Ô9ð 	:Ýˆs�wŠw�v‰ŒÐ$ "Ñ%Ô%×+Ò+¨DÑ1Ô1°!Ô4°S°b°SÔ9ðrQ   TF)ÚoutrY   ÚfullÚsort_by_daterF  rc  rd  re  úlist[InsightTransaction]c               ó  ‡— |s|€
t           }d}n0t          dt          t          |¦  «        t           ¦  «        ¦  «        }|rt	          | d„ ¬¦  «        }nt	          | ˆfd„d¬¦  «        }g }|d|…         D ]�}‰rt          |¦  «        nt          |¦  «        }	t          |¦  «        }
|                     t          |
pdt          t          |                     d¦  «        pd	¦  «        d
¬¦  «        |	d›‰rdnd¬¦  «        ¦  «         Œ‘|S )zPBuild transaction cards. Prefer full chronological lists for analytical answers.NTra   c                ó>   — t          t          | ¦  «        pd¦  «        S rZ  )r"   rb  ©rx   s    rO   ú<lambda>z_txn_items.<locals>.<lambda>}  s   € ­^½OÈAÑ<NÔ<NÐ<TÐRTÑ-UÔ-U€ rQ   ©rº   c                óD   •— ‰rt          | ¦  «        nt          | ¦  «        S rt   )r   r   )rx   rc  s    €rO   rj  z_txn_items.<locals>.<lambda>�  s   ø€ ¨3Ð@�* Q™-œ-˜-µI¸a±L´L€ rQ   ©rº   Úreverser#  r`   éH   ©rY   ú,.2frc  Úin©r"  r#  r&  Ú	direction)Ú_TXN_HARD_CAPÚmaxÚminrZ   Úsortedr   r   rb  rö   r   ri   rL   r}   )rF  rc  rY   rd  re  Úcaprü   Úitemsrx   r0  r"  s    `         rO   Ú
_txn_itemsr{  m  s?  ø€ ð ð 5ˆuˆ}ÝˆØˆˆå�!•S�˜U™œ¥]Ñ3Ô3Ñ4Ô4ˆàð 
Ý˜Ð#UÐ#UÐVÑVÔVˆˆåØØ@Ð@Ð@Ð@Øð
ñ 
ô 
ˆð ')€EØ�T�c�TŒ]ð 

ð 

ˆØ"Ð4�j˜‰mŒmˆm­	°!©¬ˆÝ˜qÑ!Ô!ˆØ�ŠÝØ�\˜TÝ'­¨A¯EªE°-Ñ,@Ô,@Ð,MÀIÑ(NÔ(NÐVXÐYÑYÔYØ�}�}Ø#&Ð0˜%˜%¨Dð	ñ ô ñ	
ô 	
ð 	
ð 	
ð €LrQ   Úpayments)rå   rU  ÚshownÚindexed_totalrå   rU  c               ó–   — |dk    r|sdS |�| |k     rd| › d|› d|› d�S | |k     rd| › d|› d|› d�S |�| |k    r	d| › d|› d	�S d| › d|› d
�S )uG   Honest list coverage â€” never claim 'all' when header count is higher.r   NzShowing z of r]   uS    from the statement for this view â€” ask about a date or merchant for more detail.z2. Ask for the full list if you need every payment.úShowing all z reported on the statement.z retrieved from the statement.r¥   )r}  r~  rå   rU  s       rO   Ú_list_footnoter�  ”  sà   € ð ˜ÒÐ (ÐØˆtØÐ ¨Ò 0Ð 0ð<�uð <ð < (ð <ð <¨Uð <ð <ð <ð	
ð ˆ}ÒÐð?�uð ?ð ? -ð ?ð ?°%ð ?ð ?ð ?ð	
ð Ð ¨Ò 1Ð 1ØH˜eÐHÐH eÐHÐHÐHÐHØG˜%ÐGÐG %ÐGÐGÐGÐGrQ   c                ó   — dS )uD   Internal gap detector â€” do not surface extraction jargon to users.Nr¥   )rI   rR  s     rO   Ú_extraction_incomplete_blurbrƒ  ­  s   € àˆ4rQ   ©Ú	matched_nr…  c               óD   — g }|�|dk    r|                      d¦  «         |S )u;   User-facing footnotes â€” no extraction/indexing internals.Nr   zCFigures are based on the payments found on your uploaded statement.)rö   )rI   r…  Únotess      rO   Ú_coverage_footnotesrˆ  ²  s-   € à€EØÐ ¨Q¢ Ø�ŠÐZÑ[Ô[Ð[Ø€LrQ   c                óB  ‡+— t          | ¦  «        }t          | ¦  «        }t          | ¦  «        pt          | ¦  «        }|pd                     ¦   «         }|                     d¦  «        }|                     d¦  «        }|€8|r6t          t          d„ |D ¦   «         ¦  «        d¦  «        }t          |¦  «        }t          | ¦  «        }d}	|�J|rH	 t          |¦  «        t          t          |¦  «        d¦  «        z  }	n# t          t          f$ r d}	Y nw xY wd}
dŠ+|rt          |¦  «        nd}|r|d	         |d         c}
Š+n…|rt!          |¦  «        nd}|rp|}
|                     ¦   «         fŠ+d
„ t%          j        d|                     ¦   «         ¦  «        D ¦   «         }|r&|d	         ‰+vr|                     ¦   «         |d	         fŠ+g }d}d	}|
rƒ‰+r�t)          | ‰+¦  «        }ˆ+fd„|                      d¦  «        pg D ¦   «         }|s|rt+          ||z   ¦  «        ng }t          t          d„ |D ¦   «         ¦  «        d¦  «        }t          |¦  «        }i }|D ]Ä}t-          t/          |                     d¦  «        pd¦  «        ¦  «        pd}|r/d                     |                     ¦   «         dd…         ¦  «        nd}|                     |dd	dœ¦  «        }t          |d         ¦  «        t5          |¦  «        z   |d<   t          |d         ¦  «        dz   |d<   ŒÅt7          |                     ¦   «         d„ ¬¦  «        }|dd…         }t7          |t4          d¬¦  «        dd…         }|
r*|
                     ¦   «         r|
pd                     ¦   «         n|
pd}g }|
r|d}|r*t          |¦  «        d	k    r|rd|z  t          |¦  «        z  }|                     tA          |› d�|rtC          ||¦  «        nd|› d�|�d |d!›d"�ndz   |rd#nd$¬%¦  «        ¦  «         | "                    tA          d&tC          ||¦  «        d#¬'¦  «        tA          d(t/          t          |pd	¦  «        ¦  «        d$¬'¦  «        g¦  «         |	�3|                     tA          d)tC          |	|¦  «        d*¬'¦  «        ¦  «         |r%|                     tA          d+|d$¬'¦  «        ¦  «         |rŒ|rŠt          |¦  «        d	k    rw|
su|d	         \  }}dt          |d         ¦  «        z  t          |¦  «        z  }|                     tA          d,|d!›d-|› �t          |d         ¦  «        › d�d*¬%¦  «        ¦  «         g } |
rë|réd}!|r-t          |¦  «        d	k    rd.d|z  t          |¦  «        z  d!›d/�}!|                      |› d0tC          ||¦  «        › d1|› d|!› �¦  «         t7          |t4          d¬¦  «        dd…         D ]i}|                      |› d2tC          t5          |¦  «        |¦  «        › d t-          t/          |                     d¦  «        pd¦  «        ¦  «        › �¦  «         Œjn|
r|                      d3|› d4�¦  «         |dd…         D ]�\  }"}#d}$|r@t          |¦  «        d	k    r-d.dt          |#d         ¦  «        z  t          |¦  «        z  d!›d/�}$|                      |"› d0tC          t          |#d         ¦  «        |¦  «        › d1t          |#d         ¦  «        › d|$› �¦  «         Œž|dd…         D ]g}|                      d5tC          t5          |¦  «        |¦  «        › d t-          t/          |                     d¦  «        pd¦  «        ¦  «        › �¦  «         Œh|r|n|}%tG          tI          |%dd6d7¬8¦  «        |¦  «        }&g }'|
rO|rM|'                     d9|› d:tC          ||¦  «        › d1|› d;�¦  «         |d<k    r|'                     d=|› d>�¦  «         n<|r:|d	         \  }"}#|'                     d9|"› d?t          |#d         ¦  «        › d@�¦  «         |	�\|rZ|
r|sVt5          |d	         ¦  «        }(|(|	dz  k    r8|'                     dAtC          |(|¦  «        › dBtC          |	|¦  «        › dC�¦  «         t          |¦  «        dk    rK|
r|sG|'                     dD|d         d	         › d.t          |d         d         d         ¦  «        › d@�¦  «         |
rA|r?dEtC          ||¦  «        › dF|› d1|› dG�d                     |'dd…         ¦  «        z   })dH|› d�}*n)dI})|'r#|)dz   d                     |'dd…         ¦  «        z   })dJ}*tK          dKtM          j        dKdL¦  «        |*|)|| dd7…         |&g dMdN|rdO|› dP�ndQg¬R¦	  «	        S )SuP   Evidence pack for save/cut/habit questions â€” metrics + merchant concentration.r^   rn   rp   Nc              3  ó4   K  — | ]}t          |¦  «        V — Œd S rt   ru   rv   s     rO   ry   z+build_financial_analysis.<locals>.<genexpr>Ä  ó(   è è € Ð:Ð:¨A�* Q™-œ-Ð:Ð:Ð:Ð:Ð:Ð:rQ   rz   ra   r¥   r   c                ó8   — g | ]}t          |¦  «        d k    ¯|‘ŒS ©rz   ©rf   ©rw   rh   s     rO   rE  z,build_financial_analysis.<locals>.<listcomp>Ù  s$   € ÐRÐRÐR˜AÅsÈ1ÁvÄvÐPQÂzÀz�aÀzÀzÀzrQ   r\   ç        c                óZ   •— g | ]'}t          |¦  «        d k    ¯t          |‰¦  «        ¯%|‘Œ(S rD  ©r   r   )rw   rx   Ú
focus_keyss     €rO   rE  z,build_financial_analysis.<locals>.<listcomp>â  s;   ø€ ÐmÐmÐm�aµjÀ±m´mÀaÒ6GÐ6GÕL]Ð^_ÐakÑLlÔLlÐ6G�Ð6GÐ6GÐ6GrQ   rF  c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rt   ru   rv   s     rO   ry   z+build_financial_analysis.<locals>.<genexpr>ä  s(   è è € ÐEÐE°!¥
¨1¡¤ÐEÐEÐEÐEÐEÐErQ   r#  ÚUnknownr]   rÌ   )ÚspendÚcountr–  r—  c                ó:   — t          | d         d         ¦  «         S )Nra   r–  ©rƒ   ©Úxs    rO   rj  z*build_financial_analysis.<locals>.<lambda>ï  s   € ½¸aÀ¼dÀ7¼mÑ8LÔ8LÐ7L€ rQ   rk  é   Trm  ç      Y@ú spendu   â‚¹ 0.00z	 paymentsõ    Â· ú.0fz
% of totalr  rè   )rå   ræ   Úhintrç   r  rä   ÚPaymentszAverage spendrã   rê   zTop merchant shareu   % Â· ú (z% of spend)ú: ú across z
 payment: z	No clear uN    payments found on this statement â€” advice below uses overall concentration.z	Largest: Fé   ©rc  rd  rY   zStart with õ    â€” z
 payments.é   zSet a weekly u9    cap and skip 1â€“2 orders to cut that bill meaningfully.u    â€” highest concentration (z payments).zOne payment of z is well above your average of ró   zNext, trim repeat spend at zOn this statement you spent ú on ú payments. zCutting zhBased on your uploaded statement, here is where spending concentrates and a few practical places to cut.zSpending habits & savings ideasÚfinancial_advicezFinancial AdvicezHow much did I spend overall?zShow my biggest expenseszHow much spent on Ú?zHow much spent on groceries?)	rí   rî   rï   rð   rl   r  Útransactionsrñ   Úsuggestions)'rP   r‹   rN  r   re   r}   r�   r‚   rf   r“   rƒ   rv  rZ   r„   r…   r
   r   rõ   rb   r©   Ú_category_hits_from_textrM  ri   rL   rÐ   Ú
setdefaultr   rx  rz  Úislowerr«   rö   r   rV   ÚextendÚ_format_txn_amountsr{  r   r   ),rI   rÕ   rT   r‘   r‰   rù   Útotalr—  rÎ   ÚavgÚ
focus_nameÚcatÚmerchantÚtokensÚfocus_matchedÚfocus_totalÚfocus_countÚ	text_hitsrF  Úby_merchantrx   r4  rº   ÚbucketÚrankedÚtopÚhighestÚdisplayrl   ÚshareÚtop_nameÚ	top_statsr  Ú	share_bitr³   ÚstatsÚpctÚsample_rowsÚtxnsÚrecommendationsÚhirð   rï   r“  s,                                              @rO   Úbuild_financial_analysisrÏ  º  s¾  ø€ å
ˆs‰)Œ)€CÝ˜ÑÔ€AÝ% cÑ*Ô*Ð@­m¸CÑ.@Ô.@€HØ	ˆ�R×ÒÑ Ô €Aà�EŠE�+ÑÔ€EØ�EŠE�/Ñ"Ô"€EØ€}˜€}Ý•cÐ:Ð:°Ð:Ñ:Ô:Ñ:Ô:¸AÑ>Ô>ˆÝ�H‘”ˆÝ˜3ÑÔ€FØ
€CØÐ˜UÐð	Ý˜‘,”,¥¥S¨¡Z¤Z°Ñ!3Ô!3Ñ3ˆCˆCøÝ�:Ð&ð 	ð 	ð 	ØˆCˆCˆCð	øøøð "€JØ"$€JØ'(Ð
2Õ
  Ñ
#Ô
#Ð
#¨d€CØ
ð 	;Ø!$ Q¤¨¨Q¬Ðˆ
�J�Jà01Ð;Õ)¨!Ñ,Ô,Ð,°tˆØð 	;Ø!ˆJØ"Ÿ.š.Ñ*Ô*Ð,ˆJØRÐR¥¤¨&°(·.².Ñ2BÔ2BÑ!CÔ!CÐRÑRÔRˆFØð ;˜& œ)¨:Ð5Ð5Ø&ŸnšnÑ.Ô.°°q´	Ð:�
à*,€MØ€KØ€KØð )�jð )Ý,¨S°*Ñ=Ô=ˆ	ØmÐmÐmÐm˜CŸGšG F™OœOÐ1¨rÐmÑmÔmˆØCLÐ\ÐPTÐ\Õ-¨i¸$Ñ.>Ñ?Ô?Ð?ÐZ\ˆÝ�CÐEÐE°}ÐEÑEÔEÑEÔEÀqÑIÔIˆÝ˜-Ñ(Ô(ˆà57€KØð 3ð 3ˆÝ�3˜qŸušu ]Ñ3Ô3Ð9°rÑ:Ô:Ñ;Ô;ÐH¸yˆØ,0Ð?ˆc�hŠh�t—z’z‘|”| B Q BÔ'Ñ(Ô(Ð(°iˆØ×'Ò'¨°sÀQÐ-GÐ-GÑHÔHˆÝ  w¤Ñ0Ô0µ:¸a±=´=Ñ@ˆˆw‰Ý˜f WœoÑ.Ô.°Ñ2ˆˆw‰ˆå�K×%Ò%Ñ'Ô'Ð-LÐ-LÐMÑMÔM€FØ
��!�Œ*€CÝ�X¥:°tÐ<Ñ<Ô<¸R¸a¸RÔ@€Gà,6Ðg¸:×;MÒ;MÑ;OÔ;OÐgˆzÐ˜R×&Ò&Ñ(Ô(Ð(ÐV`ÐVfÐdf€GØ#%€GØð 
ØˆØð 	7•U˜5‘\”\ AÒ%Ð%¨+Ð%Ø˜KÑ'­%°©,¬,Ñ6ˆEØ�ŠÝØ Ð(Ð(Ð(Ø2=ÐM•f˜[¨#Ñ.Ô.Ð.À:Ø#Ð.Ð.Ð.ÐRWÐRcÐ2N¸Ð2NÐ2NÐ2NÐ2NÐ2NÐikÑlØ!,Ð;�X�X°)ð	ñ ô ñ	
ô 	
ð 	
ð ‡N‚Nå µV¸EÀ3Ñ5GÔ5GÈhÐWÑWÔWÝ 
µ#µc¸%¸*À1±o´oÑ2FÔ2FÈYÐWÑWÔWð	
ñô ð ð €Ø�Š•}¨?Å&ÈÈcÑBRÔBRÐYaÐbÑbÔbÑcÔcÐcØð TØ�Š•}¨8¸6È	ÐRÑRÔRÑSÔSÐSØ
ð 

ˆuð 

�˜u™œ¨Ò)Ð)°*Ð)Ø! !œfÑˆ�)Ø�˜i¨Ô0Ñ1Ô1Ñ1µE¸%±L´LÑ@ˆØ�ŠÝØ*ØÐ3Ð3Ð3¨Ð3Ð3Ý˜I gÔ.Ñ/Ô/Ð:Ð:Ð:Øð	ñ ô ñ	
ô 	
ð 	
ð €JØð 
�kð 
Øˆ	Øð 	Q•U˜5‘\”\ AÒ%Ð%ØP˜U [Ñ0µ5¸±<´<Ñ?ÐPÐPÐPÐPˆIØ×ÒØÐ]Ð]�& ¨cÑ2Ô2Ð]Ð]¸KÐ]Ð]ÐR[Ð]Ð]ñ	
ô 	
ð 	
õ ˜­:¸tÐDÑDÔDÀRÀaÀRÔHð 	ð 	ˆAØ×ÒØÐtÐt¥f­Z¸©]¬]¸CÑ&@Ô&@ÐtÐtÅkÕRUÐVW×V[ÒV[Ð\iÑVjÔVjÐVpÐnpÑRqÔRqÑFrÔFrÐtÐtñô ð ð ð	ð 
ð 
Ø×ÒØo˜ÐoÐoÐoñ	
ô 	
ð 	
ð ˜2˜A˜2”wð 
ð 
‰ˆˆeØˆØð 	U•U˜5‘\”\ AÒ%Ð%ØT�u�u U¨7¤^Ñ4Ô4Ñ4µu¸U±|´|ÑCÐTÐTÐTÐTˆCØ×ÒØÐfÐf•v�e E¨'¤NÑ3Ô3°SÑ9Ô9ÐfÐfÅ3ÀuÈWÄ~ÑCVÔCVÐfÐfÐadÐfÐfñ	
ô 	
ð 	
ð 	
ð �R�a�RŒ[ð 
ð 
ˆØ×ÒØf��z¨!™}œ}¨cÑ2Ô2ÐfÐf½ÅCÈÏÊÈmÑH\ÔH\ÐHbÐ`bÑDcÔDcÑ8dÔ8dÐfÐfñ	
ô 	
ð 	
ð 	
ð $1Ð=�-�-°g€KÝ�z¨+¸4ÀeÐSTÐUÑUÔUÐWZÑ[Ô[€Dà!#€OØð 
�kð 
Ø×ÒØa˜'ÐaÐa­¨{¸CÑ(@Ô(@ÐaÐaÈ+ÐaÐaÐañ	
ô 	
ð 	
ð ˜!ÒÐØ×"Ò"Øb ÐbÐbÐbñô ð øð 
ð 
Ø˜!”f‰ˆˆeØ×ÒØ\˜$Ð\Ð\½CÀÀgÄÑ<OÔ<OÐ\Ð\Ð\ñ	
ô 	
ð 	
ð €˜7€¨J€¸;€Ý˜ œ
Ñ#Ô#ˆØ��a‘Š<ˆ<Ø×"Ò"Øe¥&¨¨S¡/¤/ÐeÐeÕRXÐY\Ð^aÑRbÔRbÐeÐeÐeñô ð õ ˆ3�x„x�1‚}€}˜j€}¨[€}Ø×ÒØ[¨#¨a¬&°¬)Ð[Ð[µs¸3¸q¼6À!¼9ÀWÔ;MÑ7NÔ7NÐ[Ð[Ð[ñ	
ô 	
ð 	
ð ð 5�kð 5ð/­6°+¸sÑ+CÔ+Cð /ð /Èð /ð /Ø!ð/ð /ð /à�hŠh� r¨ rÔ*Ñ+Ô+ñ,ð 	ð
 .˜gÐ-Ð-Ð-ˆˆð1ð 	ð ð 	DØ ‘m c§h¢h¨¸rÀ¸rÔ/BÑ&CÔ&CÑCˆGØ4ˆåØ!Ý*Ô.Ð/AÐCUÑVÔVØØØØ˜b˜q˜b”>ØØà+Ø&Ø/6ÐZÐ+ Ð+Ð+Ð+Ð+Ð<Zð
ðñ ô ð s   Ã-C< Ã<DÄDÚinsightc                ó
  ‡— | j         | j        d„ | j        D ¦   «         t          | j        pg ¦  «        d„ | j        pg dd…         D ¦   «         t          | j        pg ¦  «        dd…         dœ}|pd                     ¦   «         }dŠ|r)t          |¦  «        }|r	|d         Šnt          |¦  «        Š‰s”| j        pg D ]‰}|j	        pd                     ¦   «         }t          j        d	|¦  «        rWt          j        d
|¦  «        sBt          j        dd|¦  «                             ¦   «         pdŠ‰r‰|j        |j        ddœ|d<    nŒŠn½‰r»‰                     ¦   «         r‰                     ¦   «         n‰}t#          ˆfd„| j        pg D ¦   «         d¦  «        }d}	d}
|rK|j        rDt          j        d|j        ¦  «        }|r(t%          |                     d¦  «        ¦  «        }
|
dk    }	||r|j        nd|r|j        nd|
|	dœ|d<   |S )z.Compact evidence JSON for the LLM advice pass.c                ó8   — g | ]}|j         |j        |j        d œ‘ŒS )©rå   ræ   r¡  rÓ  ©rw   r‘   s     rO   rE  z*analysis_evidence_dict.<locals>.<listcomp>u  s(   € ÐbÐbÐbÈQ˜aœg°´ÀÄÐHÐHÐbÐbÐbrQ   c                ó8   — g | ]}|j         |j        |j        d œ‘ŒS )©r"  r#  r&  rÖ  r�  s     rO   rE  z*analysis_evidence_dict.<locals>.<listcomp>w  s8   € ð 
ð 
ð 
àð ”V¨A¬MÀQÄXÐNÐNð
ð 
ð 
rQ   Né
   r©  )rï   rð   rl   r  Úsample_paymentsÚrecommendations_seedr^   r   z(?i)\bspend\bz(?i)^(total|average)\s+spendz(?i)\s+spend\s*$T)r³   rµ  ÚdetailÚfoundÚfocus_merchantc              3  óz   •K  — | ]5}‰                      ¦   «         |j        pd                       ¦   «         v ¯1|V — Œ6dS ©r^   N)rõ   rå   )rw   r‘   r·  s     €rO   ry   z)analysis_evidence_dict.<locals>.<genexpr>˜  sL   øè è € ÐaÐa�1°:×3CÒ3CÑ3EÔ3EÈ!Ì'È-ÐUW×I^ÒI^ÑI`ÔI`Ð3`Ð3`ˆQÐ3`Ð3`Ð3`Ð3`ÐaÐarQ   Fz(\d+)\s+payments?ra   )r³   rµ  rÚ  r|  rÛ  )rï   rð   rl   Úlistr  r®  re   r
   r   rå   rb   r�   rc   ræ   r¡  r²  r«   ÚnextrZ   r�   )rÐ  rÕ   Úpayloadrù   r¸  r‘   rå   rÄ  Úfocus_metricrÛ  r|  Úm_countr·  s               @rO   Úanalysis_evidence_dicträ  p  sš  ø€ ð Ô$Ø”?ØbÐbÐRYÔRaÐbÑbÔbÝ˜7Ô-Ð3°Ñ4Ô4ð
ð 
àÔ*Ð0¨b°#°2°#Ô6ð
ñ 
ô 
õ !% WÔ%7Ð%=¸2Ñ >Ô >¸rÀ¸rÔ Bð
ð 
€Gð 
ˆ�R×ÒÑ Ô €AØ!€JØð 3Ý$ QÑ'Ô'ˆØð 	3Ø˜QœˆJˆJå/°Ñ2Ô2ˆJØð #
à”Ð& Bð 	ð 	ˆAØ”W�] ×)Ò)Ñ+Ô+ˆEÝŒyÐ)¨5Ñ1Ô1ð ½"¼)Ø/°ñ;ô ;ð õ  œVÐ$7¸¸UÑCÔC×IÒIÑKÔKÐSÈt�
Øð à *Ø!"¤Ø"#¤&Ø!%ð	1ð 1�GÐ,Ñ-ð �EøøØ	ð 
Ø(2×(:Ò(:Ñ(<Ô(<ÐL�*×"Ò"Ñ$Ô$Ð$À*ˆÝØaÐaÐaÐa˜œÐ.¨BÐaÑaÔaØñ
ô 
ˆð ˆØˆØð 	%˜LÔ-ð 	%Ý”iÐ 4°lÔ6GÑHÔHˆGØð %Ý˜wŸ}š}¨QÑ/Ô/Ñ0Ô0�Ø  1š�àØ+7ÐA�\Ô'Ð'¸TØ+7ÐA�lÔ'Ð'¸TØ Øð%
ð %
ˆÐ Ñ!ð €NrQ   rz  c                ó  — g }| D ]‡}|j                              dd¦  «        }	 t          |¦  «        }t          ||¦  «        }n# t          $ r
 |j         }Y nw xY w|                     |                     d|p|j         i¬¦  «        ¦  «         Œˆ|S )Nr  r^   r&  )Úupdate)r&  rd   rƒ   rV   r…   rö   Ú
model_copy)rz  rT   rc  rh   r'  r¾   r0  s          rO   r´  r´  ¬  s©   € Ø
€CØð Eð EˆØŒh×Ò˜s BÑ'Ô'ˆð	Ý˜‘*”*ˆCÝ˜˜cÑ"Ô"ˆCˆCøÝð 	ð 	ð 	Ø”(ˆCˆCˆCð	øøøà�
Š
�1—<’<¨°#°/¸¼Ð'B�<ÑCÔCÑDÔDÐDÐDØ€Js   £AÁAÁAc                óT  — | j         d| j        g}| j        rZ|                     d¦  «         | j        D ]=}|j        rd|j        › d�nd}|                     d|j        › d|j        › |› �¦  «         Œ>| j        rL|                     d¦  «         |                     d¦  «         | j        D ]}|                     d|› �¦  «         Œ| j        rä| j        j	        rØ| j        j
        rÌ|                     d¦  «         |                     dd	                     | j        j	        ¦  «        z   d
z   ¦  «         |                     dd	                     d„ | j        j	        D ¦   «         ¦  «        z   d
z   ¦  «         | j        j
        D ]0}|                     dd	                     |¦  «        z   d
z   ¦  «         Œ1| j        rŽ|                     d¦  «         t          | j        ¦  «        }|                     |dk    rd|› d�nd¦  «         | j        D ]<}|j        r
|j        › d�nd}|                     d|› |j        › d|j        › �¦  «         Œ=| j        r8|                     d¦  «         | j        D ]}	|                     d|	› d�¦  «         Œd                     |¦  «                             ¦   «         S )uI   Fallback plain answer for copy / audit â€” still analyst tone, no jargon.r^   r£  r  z- **z:** z**Highlights**z- z| z | z |c              3  ó   K  — | ]}d V — ŒdS )r•   Nr¥   )rw   Ú_s     rO   ry   z&insight_to_markdown.<locals>.<genexpr>É  s"   è è € Ð&LÐ&L° uÐ&LÐ&LÐ&LÐ&LÐ&LÐ&LrQ   r¦  z**Payments (z)**z**Payments**rŸ  r¨  rê  r_   )rï   rð   rl   rö   r¡  rå   ræ   r  ÚtableÚheadersrF  rÐ   r®  rf   r"  r#  r&  rñ   re   )
rÐ  r  r‘   r¡  Úhr>  rV  rh   ÚwhenÚfs
             rO   Úinsight_to_markdownrð  ¹  sÞ  € àÔ˜r 7¤?Ð3€EØ„ð >Ø�Š�RÑÔÐØ”ð 	>ð 	>ˆAØ%&¤VÐ3�>˜œ�>�>�>�>°ˆDØ�LŠLÐ< ¤Ð<Ð<¨Q¬WÐ<°dÐ<Ð<Ñ=Ô=Ð=Ð=ØÔð #Ø�Š�RÑÔÐØ�ŠÐ%Ñ&Ô&Ð&ØÔ#ð 	#ð 	#ˆAØ�LŠL˜˜a˜˜Ñ"Ô"Ð"Ð"Ø„}ð 8˜œÔ.ð 8°7´=Ô3Eð 8Ø�Š�RÑÔÐØ�Š�T˜EŸJšJ w¤}Ô'<Ñ=Ô=Ñ=ÀÑDÑEÔEÐEØ�Š�T˜EŸJšJÐ&LÐ&L°g´mÔ6KÐ&LÑ&LÔ&LÑLÔLÑLÈtÑSÑTÔTÐTØ”=Ô%ð 	8ð 	8ˆCØ�LŠL˜ §
¢
¨3¡¤Ñ/°$Ñ6Ñ7Ô7Ð7Ð7ØÔð DØ�Š�RÑÔÐÝ�Ô$Ñ%Ô%ˆØ�Š¨a°!ªe¨eÐ* AÐ*Ð*Ð*Ð*¸ÑHÔHÐHØÔ%ð 	Dð 	DˆAØ&'¤fÐ4�a”f�?�?�?�?°"ˆDØ�LŠLÐB˜dÐB A¤MÐBÐB¸¼ÐBÐBÑCÔCÐCÐCØÔð #Ø�Š�RÑÔÐØÔ"ð 	#ð 	#ˆAØ�LŠL˜˜Q˜˜˜Ñ"Ô"Ð"Ð"Ø�9Š9�UÑÔ×!Ò!Ñ#Ô#Ð#rQ   c                óœ  — t          | ¦  «        }t          | ¦  «        }t          | ¦  «        }t          | ¦  «        }t	          | ¦  «        }|rt          |t          ¬¦  «        nd}|                     d¦  «        }|                     d¦  «        }|                     d¦  «        }	|	€>|�<|�:	 t          |¦  «        t          |¦  «        z
  }	n# t          t          f$ r d}	Y nw xY wg }
|rd|› �nd}|rd|› d	�nd}|	�‘t          |	¦  «        }|d
k     r-|
                     d|› |› dt          ||¦  «        › d�¦  «         nj|d
k    r-|
                     d|› |› dt          ||¦  «        › d�¦  «         n7|
                     d|› |› d�¦  «         n|
                     d|› |› d�¦  «         |rf|
                     dt          t          |¦  «        |¦  «        › dt          t          |                     d¦  «        pd¦  «        ¦  «        › d�¦  «         |                     d¦  «        }|�…|rƒ	 t          |¦  «        t          t          |¦  «        d¦  «        z  }|
                     dt          |¦  «        › dt          ||¦  «        › d�¦  «         n# t          t          t           f$ r Y nw xY w|                     d¦  «        }|ra|�_	 t          |¦  «        t          t          |¦  «        d¦  «        dz  k    r|
                     d¦  «         n# t          t          f$ r Y nw xY w|
                     d¦  «         d                     |
¦  «        S )uN   Insightful overview prose â€” observations, not a restatement of metric cards.rk  Nrn   ro   rr   ú for r^   r£  r  r   zLooking at this statementuD   , money going out ran ahead of money coming in â€” a net outflow of ró   u,   , inflows beat outflows â€” a net inflow of z(, inflows and outflows roughly balanced.u'   Hereâ€™s a quick read on this statementzThe standout outflow was r#  Úpaymentú).rp   ra   úAcross z+ payments made, the average send was about rq   rÌ   uX   Outgoing activity is much denser than credits â€” everyday spend is driving the picture.u   The cards show the raw totals â€” the takeaway is the cashflow direction and what is driving it, not just the headline numbers.r]   )rP   r‹   r“   r¶   r   rv  r   r}   rƒ   r„   r…   rö   rV   ri   rL   rZ   ÚZeroDivisionErrorrÐ   )rI   rT   r‘   rÎ   rÓ   r‰   Úlargestr
  r	  r  ÚpartsÚwhorî  r  Úmader¶  Úrecv_ns                    rO   Ú_overview_narrativerü  Ú  s  € å
ˆs‰)Œ)€CÝ˜ÑÔ€AÝ˜3ÑÔ€FÝ˜SÑ!Ô!€FÝ˜SÑ!Ô!€HØ/7ÐA�c�(¥
Ð+Ñ+Ô+Ð+¸T€Gà�EŠE�+ÑÔ€EØ�uŠu�ZÑ Ô €HØ
�%Š%�Ñ
Ô
€CØ
€{�uÐ(¨XÐ-Að	Ý˜‘/”/¥E¨%¡L¤LÑ0ˆCˆCøÝ�:Ð&ð 	ð 	ð 	ØˆCˆCˆCð	øøøð €EØ$Ð
,Ð
�&Ð
Ð
Ð
¨"€CØ#Ð+ˆ>�ˆ>ˆ>ˆ>ˆ>¨€Dà
€Ý�c‘
”
ˆØ�1Š9ˆ9Ø�LŠLð:¨Cð :°ð :ð :Ý$*¨5°#Ñ$6Ô$6ð:ð :ð :ñô ð ð ð �QŠYˆYØ�LŠLð9¨Cð 9°ð 9ð 9Ý#)¨%°Ñ#5Ô#5ð9ð 9ð 9ñô ð ð ð
 �LŠLØ_¨CÐ_°Ð_Ð_Ð_ñô ð ð ð 	�ŠÐK¸sÐKÀDÐKÐKÐKÑLÔLÐLàð 
Ø�ŠðN­­z¸'Ñ/BÔ/BÀCÑ(HÔ(Hð Nð NÝ�C §¢¨MÑ :Ô :Ð G¸iÑHÔHÑIÔIðNð Nð Nñ	
ô 	
ð 	
ð
 �5Š5�Ñ!Ô!€DØÐ˜TÐð	Ý˜‘,”,¥¥S¨¡Y¤Y°Ñ!2Ô!2Ñ2ˆCØ�LŠLØc�#˜d™)œ)ÐcÐcÕPVÐWZÐ\_ÑP`ÔP`ÐcÐcÐcñô ð ð øõ �:Õ'8Ð9ð 	ð 	ð 	ØˆDð	øøøð �UŠUÐ&Ñ'Ô'€FØð �Ð"ð	Ý�4‰yŒy�3�s 6™{œ{¨AÑ.Ô.°Ñ2Ò2Ð2Ø—’Ønñô ð øøõ �:Ð&ð 	ð 	ð 	ØˆDð	øøøð 
‡L‚Lð	=ñô ð ð �8Š8�E‰?Œ?Ðs8   Â,C ÃC"Ã!C"È*A$J ÊJ)Ê(J)ËAL ÌL!Ì L!c                ó`  — t          | ¦  «        }t          | ¦  «        }|                      d¦  «        pd}t          | ¦  «        }t	          | ¦  «        }t          | ¦  «        }|rt          |t          ¬¦  «        nd }t          |pd¦  «        }	|pd}
t          |
¦  «        rt          | |
¦  «        S t          |
¦  «        r”|rmt          dt          d         dd|› d�t          d|d	¬
¦  «        g|rt          d|d¬
¦  «        gng ¢t          dt          |¦  «        d¬
¦  «        ‘g dg¬¦  «        S t          dt          d         dd|› d�g g g ¬¦  «        S t!          |
¦  «        rP|rNt          dt          d         dd|› d�t          d|d	¬
¦  «        g|rt          d|d¬
¦  «        gng ¢g dg¬¦  «        S g }|r%|                     t          d|d	¬
¦  «        ¦  «         |                     d¦  «        �9|                     t          dt%          |d         |¦  «        d¬
¦  «        ¦  «         |                     d¦  «        �9|                     t          dt%          |d         |¦  «        d¬
¦  «        ¦  «         |                     d¦  «        �Pt'          |d         ¦  «        }|                     t          dt%          ||¦  «        |dk     rdnd¬
¦  «        ¦  «         |                     d¦  «        �E|                     t          dt          t)          |d         ¦  «        ¦  «        d¬
¦  «        ¦  «         |                     d ¦  «        �E|                     t          d!t          t)          |d          ¦  «        ¦  «        d¬
¦  «        ¦  «         |r%|                     t          d|d¬
¦  «        ¦  «         g }|re|                     d"t%          t          |¦  «        |¦  «        › d#t+          t          |                     d$¦  «        pd¦  «        ¦  «        › �¦  «         |                     d¦  «        r“|                     d¦  «        r~	 t'          |d         ¦  «        t          t)          |d         ¦  «        d%¦  «        z  }|                     d&t%          ||¦  «        › �¦  «         n# t,          t.          t0          f$ r Y nw xY wg }|	r!t3          t5          |d'd'd ¬(¦  «        |¦  «        }g }|	rX|                     d)¦  «         t7          t9          |¦  «        t9          |¦  «        ¦  «        }|r|                     d|¦  «         n|                     d*¦  «         |	rd+|› d,�|rd-|› �ndz   |rd.|› �ndz   d/z   }nt=          | ¦  «        }t          dt          d         d0|||||¬1¦  «        S )2Nr×   úYour statementrk  r^   rë   ré   zThis statement belongs to ró   rã   rä   rê   rè   ÚDocumentz,Read from the statement header / first page.r  u4   I couldnâ€™t find a clear account-holder name on â€œuN   â€�. Try opening the first page of the PDF, or ask for the statement overview.úStatement periodzThis statement covers z+Taken from the statement header date range.rn   r  r  ro   r  r  rr   r  r   rp   úPayments maderq   úPayments receivedzLargest outflow: r¨  r#  ra   zAverage payment size: Tr§  zDAsk about spend by date, a merchant, or a category for a deeper cut.z@Ask for payment details, a date, or a merchant for a deeper cut.u    Hereâ€™s a clean overview of â€œõ   â€�rò  z
 covering z6. Figures in the cards come from the statement totals.zStatement overview©rí   rî   rï   rð   rl   r  r®  rñ   )rP   r‹   r}   r“   r¶   r   rv  r   r]  r   rþ   r   r   r   r   rL   r   rö   rV   rƒ   rZ   ri   r„   r…   rö  r´  r{  r�  rf   Úinsertrü  )rI   rÕ   rT   r‘   r×   rÎ   rÓ   r‰   r÷  rd  rù   rl   r  r  r¶  rÌ  rñ   r  rð   s                      rO   Úbuild_statement_summaryr  $  s•  € Ý
ˆs‰)Œ)€CÝ˜ÑÔ€AØ�wŠw�zÑ"Ô"Ð6Ð&6€HÝ˜3ÑÔ€FÝ˜SÑ!Ô!€FÝ˜SÑ!Ô!€HØ/7ÐA�c�(¥
Ð+Ñ+Ô+Ð+¸T€GÝ˜H˜N¨Ñ+Ô+€DØˆ�B€Aõ # 1Ñ%Ô%ð 4Ý+¨C°Ñ3Ô3Ð3å% aÑ(Ô(ð 
Øð 	Ý$Ø*Ý2Ð3FÔGØ)Ø>°VÐ>Ð>Ð>å!Ð(8ÀÈXÐVÑVÔVðàW]Ðe•}¨8¸6È	ÐRÑRÔRÐSÐSÐceðõ "¨
½#¸h¹-¼-ÈiÐXÑXÔXðð
 ØIÐJðñ ô ð õ !Ø&Ý.Ð/BÔCØ%ð\Àxð \ð \ð \ð ØØð
ñ 
ô 
ð 	
õ $ AÑ&Ô&ð 
¨6ð 
Ý Ø&Ý.Ð/BÔCØ'Ø6¨VÐ6Ð6Ð6å H°FÀÐJÑJÔJðà[aÐi•=Ð'7¸vÈIÐVÑVÔVÐWÐWÐgiðð ØDÐEð
ñ 
ô 
ð 	
ð €GØð [Ø�Š•}Ð+;À6ÐPXÐYÑYÔYÑZÔZÐZØ‡u‚uˆ[ÑÔÐ%Ø�Š•}¨=ÅÀqÈÄ~ÐWZÑ@[Ô@[ÐbjÐkÑkÔkÑlÔlÐlØ‡u‚uˆZÑÔÐ$Ø�Š•}Ð+;Å6È!ÈJÌ-ÐY\ÑC]ÔC]ÐdmÐnÑnÔnÑoÔoÐoØ‡u‚uˆ^ÑÔÐ(Ý�A�nÔ%Ñ&Ô&ˆØ�ŠÝØ$Ý˜S #Ñ&Ô&Ø!$ q¢ �X�X¨iðñ ô ñ	
ô 	
ð 	
ð 	‡u‚uˆ_ÑÔÐ)Ø�Š•}¨?Å#ÅcÈ!ÈOÔJ\ÑF]ÔF]ÑB^ÔB^ÐenÐoÑoÔoÑpÔpÐpØ‡u‚uÐ Ñ!Ô!Ð-Ø�Š•}Ð+>ÅcÍ#ÈaÐPcÔNdÑJeÔJeÑFfÔFfÐmvÐwÑwÔwÑxÔxÐxØð TØ�Š•}¨8¸6È	ÐRÑRÔRÑSÔSÐSà€JØð 
Ø×ÒØ{¥¥z°'Ñ':Ô':¸CÑ @Ô @Ð{Ð{Å{ÕSVÐW^×WbÒWbÐcpÑWqÔWqÐWwÐuwÑSxÔSxÑGyÔGyÐ{Ð{ñ	
ô 	
ð 	
ð 	‡u‚uˆ[ÑÔð ˜aŸeše OÑ4Ô4ð ð	Ý˜˜+œÑ'Ô'­#­c°!°OÔ2DÑ.EÔ.EÀqÑ*IÔ*IÑIˆCØ×ÒÐIµv¸cÀ3Ñ7GÔ7GÐIÐIÑJÔJÐJÐJøÝ�:Õ'8Ð9ð 	ð 	ð 	ØˆDð	øøøð €DØð 
Ý"Ý�x T°¸DÐAÑAÔAØñ
ô 
ˆð €IØð ]Ø×ÒÐ_Ñ`Ô`Ð`Ý�c $™iœi­¨X©¬Ñ7Ô7ˆØð 	&Ø×Ò˜Q Ñ%Ô%Ð%øà×ÒÐ[Ñ\Ô\Ð\àð 	+à<¨xÐ<Ð<Ð<Ø#)Ð1Ð�vÐÐÐ¨rñ3à(.Ð6Ð$˜FÐ$Ð$Ð$°Bñ8ð GñGð 	ˆõ & cÑ*Ô*ˆåØ"Ý*Ð+>Ô?Ø%ØØØØØð	ñ 	ô 	ð 	s   ÑAR, Ò,SÓSc                óÔ  — t          | ¦  «        }|pd}d}t          j        d|¦  «        }|rR	 t          dt	          dt          |                     d¦  «        ¦  «        ¦  «        ¦  «        }n# t          $ r d}Y nw xY wt          | ¦  «        }t          |t          d¬¦  «        d	|…         }t          d
„ |D ¦   «         |¦  «        }|s.t          dt          d         ddg g t          | ¦  «        ¬¦  «        S |d         }	d}
t          | ¦  «                             d¦  «        }|rJ	 dt          |	¦  «        z  t#          |¦  «        z  }d|d›d�}
n# t$          t          t&          f$ r d}
Y nw xY wt)          | t+          |¦  «        ¦  «        }dt+          |¦  «        › dt-          t          |	¦  «        |¦  «        › dt/          t1          |	                     d¦  «        pd¦  «        ¦  «        › t3          |	¦  «        r&dt3          |	¦  «        pd                     ¦   «         z   nd› d|
› �	}|r|› d|› �}t7          dt1          t+          |¦  «        ¦  «        d¬¦  «        t7          d t-          t          |	¦  «        |¦  «        pdd!¬¦  «        g}t9          g d"¢d#„ t;          |¦  «        D ¦   «         ¬$¦  «        }t          dt          d         d||g ||t          | ¦  «        d%gz   ¬&¦	  «	        S )'uM   Ranked outflows with merchant, amount, and date â€” not a totals restatement.r^   r×  z(?i)\btop\s+(\d+)\brÌ   é   ra   Trm  Nc                óÒ   — g | ]d}t          t          |¦  «        pd t          t          |                     d¦  «        pd¦  «        d¬¦  «        t          |¦  «        d›d¬¦  «        ‘ŒeS )Nr#  r`   ro  rp  rq  rc  rs  )r   rb  ri   rL   r}   r   rv   s     rO   rE  z*build_biggest_expenses.<locals>.<listcomp>µ  s…   € ð 	
ð 	
ð 	
ð õ Ý$ QÑ'Ô'Ð/¨4Ý'­¨A¯EªE°-Ñ,@Ô,@Ð,MÀIÑ(NÔ(NÐVXÐYÑYÔYÝ$ Q™-œ-Ð.Ð.Øð	ñ ô ð	
ð 	
ð 	
rQ   r   zBiggest expensesuY   I couldnâ€™t rank individual expenses â€” no indexed outflow lines on this statement yet.©rí   rî   rï   rð   rl   r®  rñ   r   rn   r�  u    Thatâ€™s about r   z&% of total statement spend on its own.zHere are your top uM    expenses by amount â€” each with merchant, amount, and date. The largest is ú to r#  za payeerª  ró   r]   ÚShownrã   rä   ÚLargestr  )ú#ÚDatezMerchant / descriptionÚAmountc                ój   — g | ]0\  }}t          |d z   ¦  «        |j        pd|j        pd|j        pdg‘Œ1S )ra   õ   â€”r`   r^   )rL   r"  r#  r&  )rw   Úirh   s      rO   rE  z*build_biggest_expenses.<locals>.<listcomp>í  sY   € ð 
ð 
ð 
ñ ��1õ �A˜‘E‘
”
Ø”�˜%Ø”Ð* Ø”�˜Bð	ð
ð 
ð 
rQ   ©rì  rF  zJRanked from indexed outflows (statement text + table rows), largest first.©	rí   rî   rï   rð   rl   r  r®  rë  rñ   )rP   rb   r�   rv  rw  rZ   r�   r…   rN  rx  r   r´  r   r   rˆ  r‹   r}   rƒ   r„   rö  rƒ  rf   rV   ri   rL   rb  re   r   r   Ú	enumerate)rI   rÕ   rT   rù   Útop_nÚm_topr‰   rÁ  rÌ  rÂ  rÅ  Úheader_spentrÊ  Ú
incompleterð   rl   rë  s                    rO   Úbuild_biggest_expensesr  ¦  s�  € å
ˆs‰)Œ)€CØˆ�B€AØ€EÝŒIÐ,¨aÑ0Ô0€EØð ð	Ý˜�3˜r¥3 u§{¢{°1¡~¤~Ñ#6Ô#6Ñ7Ô7Ñ8Ô8ˆEˆEøÝð 	ð 	ð 	ØˆEˆEˆEð	øøøõ & cÑ*Ô*€HÝ�H¥*°dÐ;Ñ;Ô;¸F¸U¸FÔC€FÝð	
ð 	
ð ð	
ñ 	
ô 	
ð 	ñô €Dð ð 	
Ý ØÝ.¨zÔ:Ø'ØoØØÝ)¨#Ñ.Ô.ð
ñ 
ô 
ð 	
ð �Œ)€CØ€EÝ" 3Ñ'Ô'×+Ò+¨KÑ8Ô8€LØð ð	Ø�* S™/œ/Ñ)­E°,Ñ,?Ô,?Ñ?ˆCØV sÐVÐVÐVÐVˆEˆEøÝ�:Õ'8Ð9ð 	ð 	ð 	ØˆEˆEˆEð	øøøõ .¨cµ3°x±=´=ÑAÔA€Jð	�S ™YœYð 	ð 	Ý ¥¨C¡¤°#Ñ6Ô6ð	ð 	å•s˜3Ÿ7š7 =Ñ1Ô1Ð>°YÑ?Ô?Ñ@Ô@ð	õ ?NÈcÑ>RÔ>RÐZˆF•o cÑ*Ô*Ð0¨b×7Ò7Ñ9Ô9Ñ9Ð9ÐXZð	ð 	ð ð		ð 	ð ð ð ,ØÐ+Ð+˜zÐ+Ð+ˆõ 	˜G­3­s°4©y¬y©>¬>ÀÐIÑIÔIÝØÝ� C™œ¨#Ñ.Ô.Ð4°"Øð	
ñ 	
ô 	
ð€Gõ ØAÐAÐAð
ð 
õ " $™œð
ñ 
ô 
ðñ ô €Eõ ØÝ*¨:Ô6Ø#ØØØØØÝ% cÑ*Ô*ØWÐ
XñYðñ ô ð s#   ®>A- Á-A<Á;A<Ä&)E ÅE,Å+E,c                óê	  ‡— t          | ¦  «        Št          | ¦  «        }t          |pd¦  «        rt          | ¦  «        nt	          | ¦  «        }|                     d¦  «        }|                     d¦  «        }|€8|r6t          t          d„ |D ¦   «         ¦  «        d¦  «        }t          |¦  «        }t          | ¦  «        }t          |pd¦  «        }d }|�J|rH	 t          |¦  «        t          t          |¦  «        d¦  «        z  }n# t          t          f$ r d }Y nw xY wt          dt!          |‰¦  «        d¬	¦  «        t          d
t#          t          |pd¦  «        ¦  «        d¬	¦  «        g}	|�3|	                     t          dt!          |‰¦  «        d¬	¦  «        ¦  «         |r%|	                     t          d|d¬	¦  «        ¦  «         g }
t'          |t(          d¬¦  «        d d…         }|D ]f}|
                     t!          t)          |¦  «        ‰¦  «        › dt+          t#          |                     d¦  «        pd¦  «        ¦  «        › �¦  «         Œgd }g }|rÄi }|D ]\}t-          t#          |                     d¦  «        pd¦  «        ¦  «        }|                     |d¦  «        t)          |¦  «        z   ||<   Œ]|rAt/          ddgˆfd„t'          |                     ¦   «         d„ ¬¦  «        D ¦   «         ¬¦  «        }t3          t5          |dd¬¦  «        ‰¦  «        }g }t7          | ¦  «        }|r{|                     d¦  «         t9          t          |¦  «        t          |¦  «        |¬¦  «        }|r|                     d|¦  «         |                     t?          | ¦  «        ¦  «         |r~tA          | t          |¦  «        ¦  «        }|r.|› dt          |¦  «        › d t          |¦  «        dk    rd!nd› d"�}nÖ|r,d#t          |¦  «        › d t          |¦  «        dk    rd!nd› d$�}n¨d%}n¥d}|r_d&t!          t)          |d         ¦  «        ‰¦  «        › d't+          t#          |d                              d¦  «        pd(¦  «        ¦  «        › d)�}d*t!          |‰¦  «        › d+t          |pd¦  «        › d,t          |pd¦  «        dk    rd!nd› d-|› �}tC          d.tD          d.         d/||	|
|||¬0¦	  «	        S )1Nr^   rn   rp   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rt   ru   rv   s     rO   ry   z)build_spending_summary.<locals>.<genexpr>  r‹  rQ   rz   ra   r  r  rä   ÚTransactionsr   rè   ÚAveragerã   ú
Date rangeTrm  rÌ   rŸ  r#  r�  ÚCategoryr  c                ób   •— g | ]+\  }}|                      ¦   «         t          |‰¦  «        pd g‘Œ,S )r^   )r«   rV   )rw   r³   r0  rT   s      €rO   rE  z*build_spending_summary.<locals>.<listcomp>0  sI   ø€ ð ð ð á!˜˜cð —Z’Z‘\”\¥6¨#¨sÑ#3Ô#3Ð#9°rÐ:ðð ð rQ   c                ó   — | d          S )Nra   r¥   rš  s    rO   rj  z(build_spending_summary.<locals>.<lambda>2  s   € ÈÈ1ÌÈ€ rQ   rk  r  ©rc  rd  z2Totals prefer the statement header when available.©rU  ú Listing the z indexed outflowr§   z I could retrieve.u(   Hereâ€™s how money left the account â€” ú listed below.u]   Hereâ€™s how money left the account on this statement, with the largest outflows highlighted.z Largest was r£  ró  rô  z
You spent r¥  ú paymentú on this statement.Úspending_summaryzSpending summaryr  )#rP   r‹   r]  rN  r   r}   r�   r‚   rf   r“   rƒ   rv  rZ   r„   r…   r   rV   rL   rö   rx  r   ri   r   r   rz  r´  r{  rQ  r�  r  r³  rˆ  rƒ  r   r   )rI   rÕ   r‘   r‰   rµ  r—  rÎ   rd  r¶  rl   r  rÂ  rx   rë  rÌ  Úcatsr¸  rñ   rU  r  r  rð   Útop_noterT   s                          @rO   Úbuild_spending_summaryr-    sÈ  ø€ Ý
ˆs‰)Œ)€CÝ˜ÑÔ€AÝ.>¸x¸~È2Ñ.NÔ.NÐfÕ% cÑ*Ô*Ð*ÕTaÐbeÑTfÔTf€HØ�EŠE�+ÑÔ€EØ�EŠE�/Ñ"Ô"€EØ€}˜€}Ý•cÐ:Ð:°Ð:Ñ:Ô:Ñ:Ô:¸AÑ>Ô>ˆÝ�H‘”ˆÝ˜3ÑÔ€FÝ˜H˜N¨Ñ+Ô+€DØ
€CØÐ˜UÐð	Ý˜‘,”,¥¥S¨¡Z¤Z°Ñ!3Ô!3Ñ3ˆCˆCøÝ�:Ð&ð 	ð 	ð 	ØˆCˆCˆCð	øøøõ 	˜Mµ¸¸sÑ1CÔ1CÈ(ÐSÑSÔSÝ˜Nµ#µc¸%¸*À1±o´oÑ2FÔ2FÈYÐWÑWÔWð€Gð €Ø�Š•}¨9½FÀ3ÈÑ<LÔ<LÐS[Ð\Ñ\Ô\Ñ]Ô]Ð]Øð XØ�Š•}¨<¸vÈIÐVÑVÔVÑWÔWÐWà€JÝ
��z°4Ð
8Ñ
8Ô
8¸¸!¸Ô
<€CØð mð mˆØ×Ò�V¥J¨q¡M¤M°3Ñ7Ô7ÐkÐk½[ÍÈQÏUÊUÐS`ÑMaÔMaÐMgÐegÑIhÔIhÑ=iÔ=iÐkÐkÑlÔlÐlÐlà€EØ€DØð SØ!#ˆØð 	;ð 	;ˆAÝ!¥# a§e¢e¨MÑ&:Ô&:Ð&@¸bÑ"AÔ"AÑBÔBˆCØŸš  cÑ*Ô*­Z¸©]¬]Ñ:ˆD�‰IˆIØð 	Ý Ø# XÐ.ðð ð ð å%+¨D¯JªJ©L¬L¸o¸oÐ%NÑ%NÔ%Nðñ ô ðñ ô ˆEõ #¥:¨h¸DÀtÐ#LÑ#LÔ#LÈcÑRÔRˆà€IÝ$ SÑ)Ô)€HØð 3Ø×ÒÐMÑNÔNÐNÝ�c $™iœi­¨X©¬ÀÐJÑJÔJˆØð 	&Ø×Ò˜Q Ñ%Ô%Ð%Ø×ÒÕ,¨SÑ1Ô1Ñ2Ô2Ð2àð 
Ý1°#µs¸4±y´yÑAÔAˆ
Øð 	vàð Eð E­C°©I¬Ið Eð EÝ˜d™)œ) qš.˜.�3�3¨bðEð Eð Eð ˆGð ð 	vð\Ý�t‘9”9ð\ð \Ý58¸±Y´YÀ!²^°^¨c¨cÈð\ð \ð \ð ˆGð
 vˆGˆGð ˆØð 	ðQ¥¥z°#°a´&Ñ'9Ô'9¸3Ñ ?Ô ?ð Qð QÝ¥ C¨¤F§J¢J¨}Ñ$=Ô$=Ð$JÀÑ KÔ KÑLÔLðQð Qð Qð ð
R�  sÑ+Ô+ð Rð RµS¸¸À!±_´_ð Rð RÝ˜%˜* 1‘o”o¨Ò*Ð*ˆsˆs°ðRð RØGOðRð Rð 	õ
 Ø!Ý*Ð+=Ô>Ø#ØØØØØØð
ñ 
ô 
ð 
s   Ã-D ÄDÄDc           
     ó:  — t          | ¦  «        }t          | ¦  «        }t          | ¦  «        }|                     d¦  «        }|                     d¦  «        }|€8|r6t	          t          d„ |D ¦   «         ¦  «        d¦  «        }t          |¦  «        }t          | ¦  «        }t          dt          ||¦  «        d¬¦  «        t          dt          t          |pd	¦  «        ¦  «        d
¬¦  «        g}|r%|                     t          d|d¬¦  «        ¦  «         t          t          |dd¬¦  «        |¦  «        }	g }
t          t          |	¦  «        t          |¦  «        d¬¦  «        }|r|
                     |¦  «         t!          dt"          d         dd||	g |
¬¦  «        S )Nro   rq   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rt   r|   rv   s     rO   ry   z'build_income_summary.<locals>.<genexpr>o  s(   è è € Ð8Ð8¨1�) A™,œ,Ð8Ð8Ð8Ð8Ð8Ð8rQ   rz   r  r  rä   ÚCreditsr   rè   r   rã   FTr$  Úcredits)rå   ÚincomezMoney receivedz/Credits and inflows recorded on this statement.©rí   rî   rï   rð   rl   r®  r  rñ   )rP   r‹   r€   r}   r�   r‚   rf   r“   r   rV   rL   rZ   rö   r´  r{  r�  r   r   )rI   rÕ   rT   r‘   rŠ   rµ  r—  rÎ   rl   rÌ  rñ   r  s               rO   Úbuild_income_summaryr4  h  s˜  € Ý
ˆs‰)Œ)€CÝ˜ÑÔ€AÝ˜3ÑÔ€GØ�EŠE�*ÑÔ€EØ�EŠEÐ%Ñ&Ô&€EØ€}˜€}Ý•cÐ8Ð8°Ð8Ñ8Ô8Ñ8Ô8¸!Ñ<Ô<ˆÝ�G‘”ˆÝ˜3ÑÔ€FåÐ,µF¸5À#Ñ4FÔ4FÈYÐWÑWÔWÝ˜I­Sµ°U°Z¸a±´Ñ-AÔ-AÈ	ÐRÑRÔRð€Gð ð WØ�Š•}¨<¸vÈHÐUÑUÔUÑVÔVÐVÝ�z¨'°uÀ4ÐHÑHÔHÈ#ÑNÔN€DØ€IÝ�#˜d™)œ)¥S¨¡\¤\¸ÐCÑCÔC€DØð Ø×Ò˜ÑÔÐÝØÝ*¨8Ô4Ø!ØAØØØØð	ñ 	ô 	ð 	rQ   c                ón  ‡‡‡ ‡!— t          | ¦  «        Š|                      d¦  «        pd}t          |¦  «        �r­t          t	          | ¦  «        ¦  «        }t          |                      d¦  «        pg ¦  «        }t          |¦  «        t          |¦  «        k    r|n|Š‰s&t          dt          d         dd|› d�g g dg¬	¦  «        S t          t          d
„ ‰                     ¦   «         D ¦   «         ¦  «        d¦  «        }t          d„ ‰                     ¦   «         D ¦   «         ¦  «        }t          g d¢ˆˆfd„t          ‰                     ¦   «         t          ¬¦  «        D ¦   «         ¬¦  «        }t!          | ¦  «        }t#          t%          |dd¬¦  «        ‰¦  «        }	dt          ‰¦  «        › d�t'          t          |	¦  «        t          |¦  «        t)          | ¦  «        ¬¦  «        pdg}
|
                     t-          | ¦  «        ¦  «         t/          | t          |	¦  «        ¦  «        }d|› dt1          |‰¦  «        › dt          ‰¦  «        › d�}|r|› d|› �}t          dt          d         d|t3          dt1          |‰¦  «        d¬¦  «        t3          dt5          t          ‰¦  «        ¦  «        d ¬¦  «        t3          d!t5          |¦  «        d ¬¦  «        g||	g |
¬"¦	  «	        S t7          |¦  «        }|s2t9          |¦  «        }|rt;          | ||¦  «        S t=          | |¦  «        S |\  Š Š!‰ › d‰!                     ¦   «         › �}‰ d#›d‰!                     ¦   «         d d$…         › �}t          t	          | ¦  «        ¦  «        }|                     |¦  «        }|                      d¦  «        pg }ˆ ˆ!fd%„|D ¦   «         }tA          | ‰ ‰!¦  «        }|rJtC          ||z   ¦  «        }t          t          d&„ |D ¦   «         ¦  «        d¦  «        }t          |¦  «        }�n|r-|}tE          |d'         ¦  «        }tG          |d(         ¦  «        }nà|r9|}t          t          d)„ |D ¦   «         ¦  «        d¦  «        }t          |¦  «        }n¥tI          | ¦  «        }tK          |¦  «        }|rd*|› �nd+|› �}|rd,|› d-�|rd.|› d/�nd0z   nd1|› d2|› d3�}t          dt          d         ||t3          d4|d ¬¦  «        t3          d5d6d7¬¦  «        g|rt3          d8|d ¬¦  «        gng ¢g d9|› d/�g¬	¦  «        S |tM          |d:¦  «        z  }|rtM          |tN          ¬¦  «        nd }g }|re| (                    d;t1          tO          |¦  «        ‰¦  «        › d<tS          t5          |                     d=¦  «        pd0¦  «        ¦  «        › �¦  «         tK          |¦  «        s&| (                    d>t1          |‰¦  «        › �¦  «         |r t#          t%          |dd¬¦  «        ‰¦  «        ng }	d?|› d@|› dA�g}
|rBt'          t          |	¦  «        t          |¦  «        ¦  «        }|r|
 *                    dB|¦  «         |r5t          |¦  «        t          |¦  «        k    r|
 (                    dC¦  «         tK          |¦  «        }|rd*|› �nd+|› �}|r,|› dD|d:k    rdEnd0› dF|› d/�|	rdGt          |	¦  «        › dH�nd0z   }n=dI|› dJt1          |‰¦  «        › dK|› dD|d:k    rdEnd0› d/�	|	rdGt          |	¦  «        › dL�nd0z   }t          dt          d         ||t3          dt1          |‰¦  «        d¬¦  «        t3          d!t5          |¦  «        d ¬¦  «        t3          dMt1          |‰¦  «        d7¬¦  «        t3          dN|d ¬¦  «        g||	|
¬O¦  «        S )PNr×   rØ   rF  Údate_lookupzSpend by dateu    I reviewed dated outflows in â€œuj   â€� but couldnâ€™t assemble a reliable day-by-day view. Try a specific day such as â€œspend on 16 Julyâ€�.zDSearched payment history lines with calendar dates on the statement.r  c              3  ó@   K  — | ]}t          |d          ¦  «        V — ŒdS ©rµ  Nr™  ©rw   rR   s     rO   ry   z$build_date_lookup.<locals>.<genexpr>ž  s.   è è € ÐAÐA°�%  '¤
Ñ+Ô+ÐAÐAÐAÐAÐAÐArQ   rz   c              3  ó@   K  — | ]}t          |d          ¦  «        V — ŒdS ©rV  N©rZ   r9  s     rO   ry   z$build_date_lookup.<locals>.<genexpr>Ÿ  s,   è è € Ð1Ð1 •�A�c”F‘”Ð1Ð1Ð1Ð1Ð1Ð1rQ   ©r  ÚSpentr¢  c           
     óž   •— g | ]I}|t          ‰|         d          ‰¦  «        pdt          t          ‰|         d         ¦  «        ¦  «        g‘ŒJS ©rµ  r^   rV  ©rV   rL   rZ   )rw   rå   ÚbyrT   s     €€rO   rE  z%build_date_lookup.<locals>.<listcomp>£  sa   ø€ ð ð ð àð �˜r %œy¨Ô1°3Ñ7Ô7Ð=¸2½sÅ3ÀrÈ%ÄyÐQTÄ~ÑCVÔCVÑ?WÔ?WÐXðð ð rQ   rk  r  Tr$  zDaily table covers all z& dates with spend among indexed lines.r%  z,Payment list includes every indexed outflow.u(   Daily spending across the statement â€” z payments totaling z. z# dates with spend are listed below.r]   r  r  rä   zDays with spendrè   r¢  )	rí   rî   rï   rð   rl   rë  r®  r  rñ   r   rÌ   c                ó\   •— g | ](}t          |‰‰¦  «        ¯t          |¦  «        d k    ¯&|‘Œ)S rD  )r'   r   )rw   rx   r7  r8  s     €€rO   rE  z%build_date_lookup.<locals>.<listcomp>Õ  s@   ø€ ÐcÐcÐc˜!Õ'=¸aÀÀeÑ'LÔ'LÐcÕQ[Ð\]ÑQ^ÔQ^ÐabÒQbÐQb�AÐQbÐQbÐQbrQ   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rt   ru   rv   s     rO   ry   z$build_date_lookup.<locals>.<genexpr>Û  ó(   è è € Ð9Ð9¨A�* Q™-œ-Ð9Ð9Ð9Ð9Ð9Ð9rQ   rµ  rV  c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rt   ru   rv   s     rO   ry   z$build_date_lookup.<locals>.<genexpr>ã  rE  rQ   zPayments on z	Spend on zNo payments on r)  z The statement covers ró   r^   õ   I searched â€œu   â€� for money-out activity on z}. No matching payments showed up for that calendar day on this statement. You can try a nearby date or ask for spend by date.zDate searchedÚResultúNo payments foundrã   r   z)Looked through dated payment history for ra   zLargest on this day: r¨  r#  zAverage payment: zScoped to outflows dated õ    on â€œrô   r   zUTotals use the full statement text (table extract alone was incomplete for this day).r(  r§   rª  ú All z" indexed matches are listed below.zOn rÄ   ú went out across r'  r  r  r  )+rP   r}   r*   r)   r#   r(   rf   r   r   r�   r‚   Úvaluesr   rx  Úkeysr"   rN  r´  r{  r�  rQ  r³  rˆ  rƒ  rV   r   rL   r&   Ú_relative_month_keyÚbuild_month_spendr-  r«   r?  rM  rƒ   rZ   r“   r_  rv  r   rö   ri   r  )"rI   rÕ   r×   Úby_textÚby_rowsrµ  rV  rë  r‰   rÌ  rñ   r  rð   Ú	day_monthÚ
month_onlyrå   Údate_keyrÀ  rF  Úmatched_rowsr¾  Úmatchedr—  rÎ   Úcount_qrï   r¶  r÷  r  r  rB  rT   r7  r8  s"                                 @@@@rO   Úbuild_date_lookuprY  ‰  s[	  øøøø€ Ý
ˆs‰)Œ)€CØ�wŠw�zÑ"Ô"Ð1 k€Hå! (Ñ+Ô+ñ 9
Ý*Õ+?ÀÑ+DÔ+DÑEÔEˆÝ*¨3¯7ª7°6©?¬?Ð+@¸bÑAÔAˆÝ˜G™œ­¨G©¬Ò4Ð4ˆWˆW¸'ˆØð 	Ý$Ø$Ý2°=ÔAØ(ðI°xð Ið Ið Ið ØØaÐbðñ ô ð õ •cÐAÐA°R·Y²Y±[´[ÐAÑAÔAÑAÔAÀ1ÑEÔEˆÝÐ1Ð1 R§Y¢Y¡[¤[Ð1Ñ1Ô1Ñ1Ô1ˆåØ1Ð1Ð1ðð ð ð ð å# B§G¢G¡I¤Iµ>ÐBÑBÔBðñ ô ð
ñ 
ô 
ˆõ *¨#Ñ.Ô.ˆÝ"¥:¨h¸DÀtÐ#LÑ#LÔ#LÈcÑRÔRˆàU¥c¨"¡g¤gÐUÐUÐUÝ�3˜t™9œ9¥c¨(¡m¤mÕ>SÐTWÑ>XÔ>XÐYÑYÔYð >Ø=ð
ˆ	ð
 	×ÒÕ,¨SÑ1Ô1Ñ2Ô2Ð2Ý1°#µs¸4±y´yÑAÔAˆ
ð<°qð <ð <ÍVÐTYÐ[^ÑM_ÔM_ð <ð <Ý�2‰wŒwð<ð <ð <ð 	ð ð 	0Ø#Ð/Ð/ gÐ/Ð/ˆGÝ Ø Ý.¨}Ô=Ø$Øå M½ÀÀsÑ9KÔ9KÐRZÐ[Ñ[Ô[ÝÐ$5½SÅÀRÁÄ¹\¼\ÐPYÐZÑZÔZÝ Jµc¸!±f´fÀ9ÐMÑMÔMðð
 ØØØð
ñ 
ô 
ð 	
õ  ! Ñ*Ô*€IØð 5Ý(¨Ñ2Ô2ˆ
Øð 	@Ý$ S¨(°JÑ?Ô?Ð?Ý% c¨8Ñ4Ô4Ð4à�J€CˆØÐ$Ð$�U—[’[‘]”]Ð$Ð$€EØÐ/Ð/Ð/˜EŸKšK™MœM¨"¨1¨"Ô-Ð/Ð/€HÝ&Õ';¸CÑ'@Ô'@ÑAÔA€GØ�[Š[˜Ñ"Ô"€FØ�7Š7�6‰?Œ?Ð ˜b€DØcÐcÐcÐcÐc˜tÐcÑcÔc€LÝ# C¨¨eÑ4Ô4€Ið ð &
Ý'¨	°LÑ(@ÑAÔAˆÝ•cÐ9Ð9°Ð9Ñ9Ô9Ñ9Ô9¸1Ñ=Ô=ˆÝ�G‘”ˆ‰Ø	ð "
ØˆÝ�f˜W”oÑ&Ô&ˆÝ�F˜3”KÑ Ô ˆˆØ	ð 
ØˆÝ•cÐ9Ð9°Ð9Ñ9Ô9Ñ9Ô9¸1Ñ=Ô=ˆÝ�G‘”ˆˆå˜sÑ#Ô#ˆÝ& xÑ0Ô0ˆØ-4ÐMÐ) %Ð)Ð)Ð)Ð:MÀeÐ:MÐ:Mˆð ðÐ8˜eÐ8Ð8Ð8Ø5;ÐCÐ1¨Ð1Ð1Ð1Ð1ÀñEð EðF ð Fð FÈð Fð Fð Fð 	õ !Ø Ý.¨}Ô=ØØå O¸5ÀyÐQÑQÔQÝ HÐ4GÈhÐWÑWÔWðð ^dÐk•=Ð'9ÀÈiÐXÑXÔXÐYÐYÐikðð
 ØKÀ5ÐKÐKÐKÐLð
ñ 
ô 
ð 	
ð •#�e˜Q‘-”-Ñ
€CØ.5Ð?�c�'�zÐ*Ñ*Ô*Ð*¸4€GØ€JØð 
Ø×ÒØ¥F­:°gÑ+>Ô+>ÀÑ$DÔ$DÐÐÍ;ÕWZÐ[b×[fÒ[fÐgtÑ[uÔ[uÐ[{Ðy{ÑW|ÔW|ÑK}ÔK}ÐÐñ	
ô 	
ð 	
õ   Ñ)Ô)ð BØ×ÒÐ@­f°S¸#Ñ.>Ô.>Ð@Ð@ÑAÔAÐAàQXÐ`Õ�z¨'°tÀ$ÐGÑGÔGÈÑMÔMÐMÐ^`€DØI¨UÐIÐI¸8ÐIÐIÐIÐJ€IØð &Ý�c $™iœi­¨W©¬Ñ6Ô6ˆØð 	&Ø×Ò˜Q Ñ%Ô%Ð%Øð 
•S˜‘^”^¥c¨,Ñ&7Ô&7Ò7Ð7Ø×ÒØcñ	
ô 	
ð 	
õ # 8Ñ,Ô,€GØ)0ÐIÐ%˜eÐ%Ð%Ð%Ð6IÀ%Ð6IÐ6I€HØð 	
àÐEÐE U¨a¢Z Z˜c˜c°RÐEÐE¸UÐEÐEÐEØHLÐTÐD•s˜4‘y”yÐDÐDÐDÐDÐRTñVð 	ˆð l�%ÐkÐk�6 %¨Ñ-Ô-ÐkÐkÀÐkÐkÐV[Ð_`ÒV`ÐV`ÈsÈsÐfhÐkÐkÐkØ48Ð@Ð0•s˜4‘y”yÐ0Ð0Ð0Ð0¸bñBð 	õ
 ØÝ*¨=Ô9ØØå µV¸EÀ3Ñ5GÔ5GÈhÐWÑWÔWÝ 
µ#°e±*´*À9ÐMÑMÔMÝ 	µ¸¸SÑ1AÔ1AÈÐQÑQÔQÝ ¨e¸)ÐDÑDÔDð	
ð ØØðñ ô ð rQ   c                ó(
  ‡‡‡— t          | ¦  «        Š|                      d¦  «        pd}|pddd…                              ¦   «         Št                               ‰‰                     ¦   «         ¦  «        }t          | ¦  «        }|                      d¦  «        pg }ˆfd„|D ¦   «         }t          | ‰¦  «        }t          t          | ¦  «        ¦  «        }	ˆfd„|	 	                    ¦   «         D ¦   «         Š‰r9t          t          d	„ ‰                     ¦   «         D ¦   «         ¦  «        d
¦  «        nd}
‰r+t          d„ ‰                     ¦   «         D ¦   «         ¦  «        nd}|rJt          ||z   ¦  «        }t          t          d„ |D ¦   «         ¦  «        d
¦  «        }t          |¦  «        }�n‰r|r|t          |¦  «        k    r|}|
}|}nô|r9|}t          t          d„ |D ¦   «         ¦  «        d
¦  «        }t          |¦  «        }n¹t          | ¦  «        }d„ |D ¦   «         }|r&dd                     |¦  «        › �|rd|› d�ndz   dz   n	|rd|› d�nd}t#          dt$          d         d|› �d|› d|› d|› d�t'          d|d¬¦  «        t'          d d!d"¬¦  «        g|rt'          d#|d¬¦  «        gng ¢g d$|› d%�g¬&¦  «        S |t)          |d'¦  «        z  }|rt)          |t*          ¬(¦  «        nd}g }|rh|                     d)|› d*t/          t+          |¦  «        ‰¦  «        › d+t1          t3          |                     d,¦  «        pd¦  «        ¦  «        › �¦  «         |r|                     d-|› d.|› d/�¦  «         |r t5          t7          |d0d0¬1¦  «        ‰¦  «        ng }d2|› d3|› d4�d5g}|rBt9          t          |¦  «        t          |¦  «        ¦  «        }|r|                     d|¦  «         d}‰rYt          ‰¦  «        d'k    rFt=          g d6¢ˆˆfd7„t?          ‰                      ¦   «         tB          ¬(¦  «        D ¦   «         ¬8¦  «        }t#          dt$          d         d|› �d9|› dt/          |‰¦  «        › d:|› d;|d'k    rd<nd› d�	|rd=t          |¦  «        › d>�ndz   t'          d?t/          |‰¦  «        d@¬¦  «        t'          dAt3          |¦  «        d¬¦  «        t'          dBt/          |‰¦  «        d"¬¦  «        t'          d|d¬¦  «        g||||¬C¦	  «	        S )DuK   Answer spend scoped to a calendar month â€” never dump the whole statement.r×   rØ   r^   NrÌ   rF  c                óZ   •— g | ]'}t          |¦  «        d k    ¯t          |‰¦  «        ¯%|‘Œ(S rD  )r   Ú_row_in_month)rw   rx   r<  s     €rO   rE  z%build_month_spend.<locals>.<listcomp>=  s8   ø€ ÐSÐSÐS˜!¥z°!¡}¤}°qÒ'8Ð'8½]È1ÈcÑ=RÔ=RÐ'8�AÐ'8Ð'8Ð'8rQ   c                ó–   •— i | ]E\  }}t          j        d t          j        ‰¦  «        › d �|                     ¦   «         ¦  «        ¯B||“ŒFS )ú\b)rb   r�   Úescaperõ   )rw   rˆ   rR   r<  s      €rO   ú
<dictcomp>z%build_month_spend.<locals>.<dictcomp>A  s]   ø€ ð ð ð áˆAˆqÝŒ9Ð-�2œ9 S™>œ>Ð-Ð-Ð-¨q¯wªw©y¬yÑ9Ô9ðØ	ˆ1ðð ð rQ   c              3  ó@   K  — | ]}t          |d          ¦  «        V — ŒdS r8  r™  r9  s     rO   ry   z$build_month_spend.<locals>.<genexpr>F  s.   è è € ÐOÐO°1�U 1 W¤:Ñ.Ô.ÐOÐOÐOÐOÐOÐOrQ   rz   r�  c              3  ó@   K  — | ]}t          |d          ¦  «        V — ŒdS r;  r<  r9  s     rO   ry   z$build_month_spend.<locals>.<genexpr>G  s,   è è € Ð?Ð? 1•3�q˜”v‘;”;Ð?Ð?Ð?Ð?Ð?Ð?rQ   r   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rt   ru   rv   s     rO   ry   z$build_month_spend.<locals>.<genexpr>K  rE  rQ   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rt   ru   rv   s     rO   ry   z$build_month_spend.<locals>.<genexpr>S  rE  rQ   c                ó(   — g | ]}t           |         ‘ŒS r¥   ©Ú_MONTH_FULLrÔ  s     rO   rE  z%build_month_spend.<locals>.<listcomp>W  s   € Ð:Ð:Ð:¨Q�+ aœ.Ð:Ð:Ð:rQ   z This statement mainly covers rÄ   r£  r  ró   z Statement period: r6  z	Spend in rG  u   â€� for money-out activity in zB. No matching payments showed up for that month on this statement.z9 Try a month that appears on the PDF, or a specific date.ÚMonthrè   rä   rH  rI  rã   r   z
Scoped to u'    only â€” not the full statement total.r  ra   rk  zLargest in r¤  r¨  r#  zStatement covers z (answer filtered to rô  Tr$  zScoped to outflows dated in rJ  rô   uH   This is not the full statement spend â€” only the month you asked about.r=  c           
     óž   •— g | ]I}|t          ‰|         d          ‰¦  «        pdt          t          ‰|         d         ¦  «        ¦  «        g‘ŒJS r@  rA  )rw   rå   rT   Úmonth_bucketss     €€rO   rE  z%build_month_spend.<locals>.<listcomp>Š  sf   ø€ ð ð ð àð �˜}¨UÔ3°GÔ<¸cÑBÔBÐHÀbÍ#ÍcÐR_Ð`eÔRfÐgjÔRkÑNlÔNlÑJmÔJmÐnðð ð rQ   r  zIn rL  r(  r§   rK  r'  r  r  r¢  r  r  )"rP   r}   rõ   rg  r«   r“   rA  r)   r#   rz  r�   r‚   rM  rM  rf   Ú_months_presentrÐ   r   r   r   rv  r   rö   rV   ri   rL   r´  r{  r�  r  r   rx  rN  r"   )rI   rÕ   r8  r×   Úmonth_labelrÎ   rF  rV  r¾  rQ  Úbucket_totalÚbucket_nrW  rµ  r—  ÚpresentÚpresent_labelsr¡  r¶  r÷  r  rÌ  rñ   r  rë  rT   r<  rj  s                            @@@rO   rP  rP  4  sƒ  øøø€ å
ˆs‰)Œ)€CØ�wŠw�zÑ"Ô"Ð1 k€HØˆ;�B˜˜˜Ô
×
!Ò
!Ñ
#Ô
#€CÝ—/’/ # s§y¢y¡{¤{Ñ3Ô3€KÝ˜3ÑÔ€Fà�7Š7�6‰?Œ?Ð ˜b€DØSÐSÐSÐS˜tÐSÑSÔS€LÝ% c¨3Ñ/Ô/€Iå&Õ';¸CÑ'@Ô'@ÑAÔA€Gðð ð ð à—M’M‘O”Oðñ ô €Mð
 XeÐm•5�ÐOÐO¸×8LÒ8LÑ8NÔ8NÐOÑOÔOÑOÔOÐQRÑSÔSÐSÐjm€LØCPÐW�sÐ?Ð?¨×(<Ò(<Ñ(>Ô(>Ð?Ñ?Ô?Ñ?Ô?Ð?ÐVW€Hàð &
Ý'¨	°LÑ(@ÑAÔAˆÝ•cÐ9Ð9°Ð9Ñ9Ô9Ñ9Ô9¸1Ñ=Ô=ˆÝ�G‘”ˆ‰Ø	ð "
 ð "
°½CÀÑ<MÔ<MÒ0MÐ0MØˆØˆØˆˆØ	ð 
ØˆÝ•cÐ9Ð9°Ð9Ñ9Ô9Ñ9Ô9¸1Ñ=Ô=ˆÝ�G‘”ˆˆå! #Ñ&Ô&ˆØ:Ð:°'Ð:Ñ:Ô:ˆð
 ðEÐH¨T¯YªY°~Ñ-FÔ-FÐHÐHØ!'Ð/ˆ~�Fˆ~ˆ~ˆ~ˆ~¨Rñ1àñð ð 6<ÐCÐ1¨Ð1Ð1Ð1Ð1Àð 	õ !Ø Ý.¨}Ô=Ø. Ð.Ð.ðK ð Kð KÈð Kð KØSWðKð Kð Kõ
  G°;ÀYÐOÑOÔOÝ HÐ4GÈhÐWÑWÔWðð ^dÐk•=Ð'9ÀÈiÐXÑXÔXÐYÐYÐikðð
 ØX KÐXÐXÐXÐYð
ñ 
ô 
ð 	
ð$ •#�e˜Q‘-”-Ñ
€CØ.5Ð?�c�'�zÐ*Ñ*Ô*Ð*¸4€GØ€JØð 
Ø×ÒðD˜+ð Dð D­µ
¸7Ñ0CÔ0CÀSÑ)IÔ)Ið Dð DÝ�3˜wŸ{š{¨=Ñ9Ô9Ð?¸RÑ@Ô@ÑAÔAðDð Dñ	
ô 	
ð 	
ð ð \Ø×ÒÐZ¨fÐZÐZÈ;ÐZÐZÐZÑ[Ô[Ð[àQXÐ`Õ�z¨'°tÀ$ÐGÑGÔGÈÑMÔMÐMÐ^`€DàI {ÐIÐI¸8ÐIÐIÐIØRð€Ið ð &Ý�c $™iœi­¨W©¬Ñ6Ô6ˆØð 	&Ø×Ò˜Q Ñ%Ô%Ð%à€EØð 
�˜]Ñ+Ô+¨aÒ/Ð/ÝØ1Ð1Ð1ðð ð ð ð å# M×$6Ò$6Ñ$8Ô$8½nÐMÑMÔMðñ ô ð
ñ 
ô 
ˆõ ØÝ*¨=Ô9Ø*˜[Ð*Ð*àq�+ÐqÐq¥¨¨sÑ!3Ô!3ÐqÐqÀeÐqÐqÐ\aÐefÒ\fÐ\fÐUXÐUXÐlnÐqÐqÐqØ48Ð@Ð0•s˜4‘y”yÐ0Ð0Ð0Ð0¸bñBõ  µV¸EÀ3Ñ5GÔ5GÈhÐWÑWÔWÝ 
µ#°e±*´*À9ÐMÑMÔMÝ 	µ¸¸SÑ1AÔ1AÈÐQÑQÔQÝ ¨{ÀÐKÑKÔKð	
ð ØØØð#ñ ô ð rQ   c                óø   ‡ — d                      ˆ fd„dD ¦   «         ¦  «                             ¦   «         }t          t          j        dt          j        |¦  «        › d�|¦  «        pd|› d�|v p|› d�|v ¦  «        S )Nr]   c              3  ó`   •K  — | ](}t          ‰                     |¦  «        pd ¦  «        V — Œ)dS rÞ  ©rL   r}   )rw   rˆ   r>  s     €rO   ry   z _row_in_month.<locals>.<genexpr>¦  sK   øè è € ð ð Ø"#�ˆC�GŠG�A‰JŒJÐ˜"ÑÔðð ð ð ð ð rQ   )r"  r#  r'  Úaccountr^  ú')rÐ   rõ   rX  rb   r�   r_  )r>  r8  r-  s   `  rO   r\  r\  ¥  s©   ø€ Ø�8Š8ð ð ð ð Ø'Pðñ ô ñ ô ç‚e�g„gð 	õ Ý
Œ	Ð,�œ	 %Ñ(Ô(Ð,Ð,Ð,¨dÑ3Ô3ð 	Øˆuˆ<ˆ<ˆ<˜4Ðð	àˆ;ˆ;ˆ;˜$Ðñô ð rQ   c                ó¦  — | pd                      ¦   «         }t          j        t          j        ¦  «                             ¦   «         }t          j        d|¦  «        r>|                     d¬¦  «        }|t          d¬¦  «        z
  }t          |j        dz
           S t          j        d|¦  «        rt          |j        dz
           S t          | ¦  «        S )zFResolve 'last month' / 'this month' / explicit month name to jan..dec.r^   z\b(last|previous)\s+month\bra   )r7  )Údaysz\b(this|current)\s+month\b)rõ   r.   Únowr/   Úutcr"  rb   r�   rd   r0   Ú_MONTH_ORDERr8  r$   )rÕ   rù   ÚtodayÚfirstÚprevs        rO   rO  rO  °  s¶   € à	ˆ�R×ÒÑ Ô €AÝŒL�œÑ&Ô&×+Ò+Ñ-Ô-€EÝ	„yÐ/°Ñ3Ô3ð ,Ø—’ !�Ñ$Ô$ˆØ•y aÐ(Ñ(Ô(Ñ(ˆÝ˜DœJ¨™NÔ+Ð+Ý	„yÐ.°Ñ2Ô2ð -Ý˜EœK¨!™OÔ,Ð,Ý˜Ñ!Ô!Ð!rQ   ©r8  rN  útuple[str, ...]c               ó‚  ‡— d	ˆfd„}g }t          | ¦  «        D ]¥}d                     |¦  «        }|                     ¦   «         } ||¦  «        sŒ7t          |¦  «        }|sŒIt	          j        |                     d¦  «        pd¦  «        p|                     d¦  «        }	|r|	|k    rŒ�|                     |¦  «         Œ¦|S )
uÓ   Parse Paytm-style payment blocks from full statement text.

    Tags like ``# Groceries`` often sit on a following line, so we group by
    date-headed blocks and match the whole block â€” not single lines.
    Úblob_lowrL   rK   rX  c                óú   •— ‰D ]v}|                      ¦   «                              ¦   «         }|sŒ+|                     d¦  «        r|| v r dS ŒHt          j        dt          j        |¦  «        › d�| ¦  «        r dS ŒwdS )Nr  Tz(?<![a-z0-9])z(?![a-z0-9])F)rõ   re   r­   rb   r�   r_  )r�  rº   rˆ   rN  s      €rO   Ú_block_matchesz0_category_hits_from_text.<locals>._block_matchesÉ  s–   ø€ Øð 		ð 		ˆCØ—	’	‘”×!Ò!Ñ#Ô#ˆAØð ØØ�|Š|˜CÑ Ô ð Ø˜�=�=Ø˜4˜4ØÝŒyÐD­"¬)°A©,¬,ÐDÐDÐDÀhÑOÔOð Ø�t�tðàˆurQ   r_   r*  r^   )r�  rL   rK   rX  )r  rÐ   rõ   r6  r!   r}   rö   )
rI   rN  r8  rƒ  r=  r  r-  Úlowr>  Úmon_keys
    `        rO   r°  r°  ½  së   ø€ ðð ð ð ð ð ð "$€DÝ  Ñ%Ô%ð ð ˆØ�yŠy˜ÑÔˆØ�jŠj‰lŒlˆØˆ~˜cÑ"Ô"ð 	ØÝ˜EÑ"Ô"ˆØð 	ØÝ Ô$ S§W¢W¨XÑ%6Ô%6Ð%<¸"Ñ=Ô=ÐRÀÇÂÈÑARÔARˆØð 	�W Ò%Ð%ØØ�Š�CÑÔÐÐØ€KrQ   c                óö  — t          | d„ ¬¦  «        }t          ¦   «         }g }|D �]R}t          |¦  «        pd                     ¦   «         }t	          j        dd|                     d¦  «        d         ¦  «                             ¦   «         }t	          j        dd|¦  «                             ¦   «         }t	          j        d	|¦  «        }|rUt          | 
                    d
¦  «        ¦  «        d›d| 
                    d¦  «                             ¦   «         dd…         › �}t          t          |¦  «        d¦  «        }||f}	|	|v r|dk    r�Œ(|                     |	¦  «         |                     |¦  «         �ŒT|S )zJPrefer table-extracted rows; drop text duplicates of the same date+amount.c                ó4   — |                       d¦  «        rdndS )Nr(  ra   r   rG  ri  s    rO   rj  z'_dedupe_category_rows.<locals>.<lambda>è  s   € ¨a¯eªe°LÑ.AÔ.AÐ)H¨¨Àq€ rQ   rk  r^   r\   r]   r_   r   z
'?\d{2,4}$zA(?i)(\d{1,2})\s*(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)ra   r   rz   NrÌ   )rx  r÷   rb  rõ   rb   rc   r©   re   r®   rZ   r�   r�   r   rø   rö   )
rF  rü   rû   rc  rx   r"  rU  r‘   r0  rº   s
             rO   rM  rM  æ  s`  € å�TÐHÐHÐIÑIÔI€GÝ‘u”u€DØ "€CØð ñ ˆÝ Ñ"Ô"Ð( b×/Ò/Ñ1Ô1ˆÝ”6˜& # t§z¢z°$Ñ'7Ô'7¸Ô':Ñ;Ô;×AÒAÑCÔCˆÝ”6˜-¨¨XÑ6Ô6×<Ò<Ñ>Ô>ˆÝŒHØPØñ
ô 
ˆð ð 	IÝ˜aŸgšg a™jœj™/œ/ÐHÐHÐH°·²¸±
´
×0@Ò0@Ñ0BÔ0BÀ2ÀAÀ2Ô0FÐHÐHˆHÝ•J˜q‘M”M 1Ñ%Ô%ˆØ˜ˆoˆØ�$ˆ;ˆ;˜3 š7˜7ÙØ�Š�‰ŒˆØ�
Š
�1‰Œˆ‰Ø€JrQ   c           
     ó¶  — t          | ¦  «        }|                      d¦  «        pd}t          | ¦  «        }|pd                     ¦   «         }t	          j        dd|¦  «        }t	          j        dd|¦  «        }|                     d¦  «        }|                     d	¦  «        }t          | ¦  «        }t          | ¦  «        }	|€|	rt          |	¦  «        }|€|rt          |¦  «        }t          t	          j
        d|¦  «        ¦  «        }
t          t	          j
        d|¦  «        ¦  «        }|
r| p7t          t	          j
        d|¦  «        ¦  «        ot	          j
        d|¦  «         }|r|
 p't          t	          j
        d|¦  «        ¦  «        s| o|
 }|
r|sd}d}g }|rA|�?|                     t          dt          t          |¦  «        ¦  «        d¬¦  «        ¦  «         |rG|�E|
rdnd}|                     t          |t          t          |¦  «        ¦  «        d¬¦  «        ¦  «         |�E|�C|rA|s?|                     t          dt          t          |¦  «        ¦  «        d¬¦  «        ¦  «         |r%|                     t          d|d¬¦  «        ¦  «         |                     t          dt          |¦  «        d¬¦  «        ¦  «         |rA|s?|�=|
rdnd}dt          |¦  «        › d|› t          |¦  «        dk    rdnd› d |› d!�}|
rd"nd}n¤|�0|�d#t          |¦  «        › d$�nd}dt          |¦  «        › d%|› d&�}d'}nr|�dt          |¦  «        › d(�}d'}nZt          |                      d)¦  «        pg ¦  «        }d*|› d+|› d,|dk    rdnd› d-�}d'}t          d.t          |¦  «        d¬¦  «        g}t          d/t!          j        d/d0¦  «        |||g d1g¬2¦  «        S )3zIAnswer how many payments were made/received from statement header totals.r×   rØ   r^   z\b,\s*ade\bz madez\bmad\brú  rp   rq   Nz,(?i)\b(credits?|deposits?|received|inflow)\bz(?i)\b(debits?|withdrawals?)\bz(?i)\breceivz(?i)\bmade\bTFr  r  rä   zCredits / depositsr  r  rè   rê   rÿ  r%  ró  zThis statement shows r]   ra   r§   u    (money in) on â€œrô   zCredits receivedú and z	 receivedz payments maderó   zPayment countz payments received.rF  u(   I couldnâ€™t find a payment count on â€œu   â€�. I extracted z transaction linez from the PDF.zExtracted linesÚpayment_countzPayment CountzXCounts use statement header totals when available, otherwise indexed credit/debit lines.r  )r‹   r}   r“   rõ   rb   rc   r€   r   rf   rX  r�   rö   r   rL   rZ   r   r   )rI   rÕ   r‘   r×   rÎ   rù   rú  ÚrecvrŠ   r‰   Úwant_creditÚ
want_debitÚ	want_recvÚ	want_maderl   rå   Úkindrð   rï   ÚextraÚrows_ns                        rO   Úbuild_payment_countr“  þ  s�  € å˜ÑÔ€AØ�wŠw�zÑ"Ô"Ð1 k€HÝ˜3ÑÔ€FØ	ˆ�R×ÒÑ Ô €Aå
Œˆ~˜w¨Ñ*Ô*€AÝ
Œˆz˜6 1Ñ%Ô%€Aà�5Š5�Ñ!Ô!€DØ�5Š5Ð$Ñ%Ô%€Då˜3ÑÔ€GÝ˜SÑ!Ô!€HØ€|˜€|Ý�8‰}Œ}ˆØ€|˜€|Ý�7‰|Œ|ˆå•r”yÐ!PÐRSÑTÔTÑUÔU€KÝ•b”iÐ AÀ1ÑEÔEÑFÔF€JØÐ/ Z ð Ý�RŒY�¨Ñ*Ô*Ñ+Ô+ÐQµB´I¸oÈqÑ4QÔ4QÐ0Qð ð Ð/ K ð Ý	�bŒi˜¨Ñ+Ô+Ñ	,Ô	,Ð	=°I°ÐRÀ{À?ð ð ð ˜:ð Øˆ	Øˆ	à#%€GØð b�TÐ%Ø�Š•}¨?Å#ÅcÈ$ÁiÄiÁ.Ä.ÐW_Ð`Ñ`Ô`ÑaÔaÐaØð Y�TÐ%Ø(3ÐLÐ$Ð$Ð9LˆØ�Š•}¨5½½CÀ¹I¼I¹¼ÈYÐWÑWÔWÑXÔXÐXØÐ˜DÐ,°Ð,À9Ð,Ø�Š•}Ð+>ÅcÍ#ÈdÉ)Ì)ÁnÄnÐ[dÐeÑeÔeÑfÔfÐfØð TØ�Š•}¨8¸6È	ÐRÑRÔRÑSÔSÐSØ‡N‚N•= z½¸X¹¼ÈYÐWÑWÔWÑXÔXÐXàð ^˜ð ^ tÐ'7Ø&Ð5ˆxˆx¨Iˆð/¥C¨¡I¤Ið /ð /°ð /½SÀ¹Y¼YÈ!º^¸^°c°cÐQSð /ð /Ø (ð/ð /ð /ð 	ð *5ÐMÐ%Ð%Ð:MˆˆØ	Ð	Ø04Ð0@Ð,�˜D™	œ	Ð,Ð,Ð,Ð,ÀbˆØK­#¨d©)¬)ÐKÐKÀ5ÐKÐKÐKˆØ"ˆˆØ	Ð	ØH­#¨d©)¬)ÐHÐHÐHˆØ"ˆˆå�S—W’W˜V‘_”_Ð*¨Ñ+Ô+ˆð_°xð _ð _Ø!ð_ð _Ø;AÀQº;¸;°C°CÈBð_ð _ð _ð 	ð #ˆÝ Ð'8ÅÀFÁÄÐR[Ð\Ñ\Ô\Ð]ˆåØÝ*Ô.¨ÀÑPÔPØØØØØmÐnðñ ô ð rQ   c           
     ór  — t          | ¦  «        }t          | ¦  «        }t          | ¦  «        }|                     d¦  «        }t	          | ¦  «        }t          | ¦  «        }t          t          |dd¬¦  «        |¦  «        }t          |¦  «        }	t          |pd¦  «        r–|�t          |¦  «        n|	}
t          dt          |
¦  «        d¬¦  «        g}|r%|                     t          d	|d¬¦  «        ¦  «         t          d
t          d
         dd|
› d|
dk    rdnd› d�|t!          | ¦  «        ¬¦  «        S g }|�2|                     t          dt          |¦  «        d¬¦  «        ¦  «         |                     t          dt          |	¦  «        d¬¦  «        ¦  «         |r%|                     t          d	|d¬¦  «        ¦  «         g }t#          |	t          |¦  «        |¬¦  «        }|r|                     |¦  «         |                     t!          | ¦  «        ¦  «         t'          | |	¦  «        }t)          | ¦  «        }d}|r%d„ |D ¦   «         }dd                     |¦  «        › d�}|r|› d|	› d|	dk    rdnd› d|› �}n|	rd|	› d|	dk    rdnd› d|› �}nd}t          d
t          d
         d ||||¬!¦  «        S )"u?   List outflow payments â€” lighter than a full spending summary.rp   Tr$  r^   NúPayments on statementrè   rä   rê   Útransaction_searchzWhich payment?zYour statement shows r(  ra   r§   uZ   . I can't tell which one you mean without more detail â€” try a merchant, date, or amount.rì   zPayments (header)zIndexed & listedrã   r%  c                óh   — g | ]/}t                                ||                     ¦   «         ¦  «        ‘Œ0S r¥   )rg  r}   r«   rÔ  s     rO   rE  z&build_payment_list.<locals>.<listcomp>~  s.   € Ð@Ð@Ð@°A•+—/’/ ! Q§W¢W¡Y¤YÑ/Ô/Ð@Ð@Ð@rQ   z Indexed months include rÄ   ró   r&  z indexed paymentz I do have below.zHere are all z% I could retrieve from the statement.z8I couldn't find indexed payment lines on this statement.zYour paymentsr
  )rP   r‹   rN  r}   rQ  r“   r´  r{  rf   r    rZ   r   rL   rö   r   r   rˆ  r�  r³  rƒ  rk  rÐ   )rI   rÕ   rT   r‘   r‰   r—  rU  rÎ   rÌ  ÚlistedÚheader_showrl   rñ   r  r  r+  Ú
month_hintÚlabelsrð   s                      rO   Úbuild_payment_listrœ  L  s‚  € å
ˆs‰)Œ)€CÝ˜ÑÔ€Aå% cÑ*Ô*€HØ�EŠE�/Ñ"Ô"€EÝ$ SÑ)Ô)€HÝ˜3ÑÔ€FÝ�z¨(¸À4ÐHÑHÔHÈ#ÑNÔN€DÝ�‰YŒY€Få'¨¨°BÑ7Ô7ð 
Ø$)Ð$5•c˜%‘j”j�j¸6ˆåÐ 7½sÀ;Ñ?OÔ?OÐV_Ð`Ñ`Ô`ð
ˆð ð 	XØ�NŠN�=¨x¸vÈIÐVÑVÔVÑWÔWÐWÝ Ø'Ý.Ð/CÔDØ%ðk¨ð kð kÀKÐSTÒDTÐDT¸S¸SÐZ\ð kð kð kð Ý)¨#Ñ.Ô.ð

ñ 

ô 

ð 
	
ð $&€GØÐØ�ŠÝÐ 3½3¸x¹=¼=ÈyÐYÑYÔYñ	
ô 	
ð 	
ð ‡N‚N•=Ð'9ÅÀVÁÄÐS[Ð\Ñ\Ô\Ñ]Ô]Ð]Øð TØ�Š•}¨8¸6È	ÐRÑRÔRÑSÔSÐSà€IÝ˜&¥# h¡-¤-¸(ÐCÑCÔC€DØð Ø×Ò˜ÑÔÐØ×ÒÕ(¨Ñ-Ô-Ñ.Ô.Ð.å-¨c°6Ñ:Ô:€JÝ˜SÑ!Ô!€FØ€JØð EØ@Ð@¸Ð@Ñ@Ô@ˆØD°·	²	¸&Ñ0AÔ0AÐDÐDÐDˆ
àð Màð Ið I¨ð Ið IØ ’k�kˆsˆs rðIð IØ<FðIð Ið 	ˆð 
ð Mð@˜Fð @ð @¸6ÀQº;¸;°C°CÈBð @ð @Ø3=ð@ð @ð 	ˆð
 MˆåØ#Ý*Ð+?Ô@Ø ØØØØðñ ô ð rQ   úStructuredInsight | Nonec                óœ  ‡‡— t          |¦  «        }|sdS t          |¦  «        }|r@|d                              ¦   «         |                     ¦   «         k    rt          | |¦  «        S |                     ¦   «         fŠd„ t	          j        d|                     ¦   «         ¦  «        D ¦   «         }|r&|d         ‰vr|                     ¦   «         |d         fŠt          | ¦  «        Št          | ‰¦  «        }ˆfd„|                      d¦  «        pg D ¦   «         }|s|rt          ||z   ¦  «        ng }| 
                    ¦   «         r|                     ¦   «         n|}|sQt          dt          d         |› d�d	|› d
�t          d|d¬¦  «        gg dd                     ‰¦  «        › d�g¬¦  «        S t!          t#          |dd¬¦  «        ‰¦  «        }	t%          t'          d„ |D ¦   «         ¦  «        d¦  «        }
t)          |	¦  «        }|
t+          |d¦  «        z  }d|› d|dk    rdnd› d|› d�g}t)          |¦  «        t)          |¦  «        k    r|                     d¦  «         |                     t1          | ¦  «        ¦  «         t          dt          d         |› d�d|› dt3          |
‰¦  «        › d|› d |dk    rdnd› d!�	t          d"t3          |
‰¦  «        d#¬¦  «        t          d$t5          |¦  «        d¬¦  «        t          d%t3          |‰¦  «        d&¬¦  «        g|	ˆfd'„t7          |t8          d¬(¦  «        dd)…         D ¦   «         |¬*¦  «        S )+zBSum spend for a named merchant/payee across rows + statement text.Nr   c                ó8   — g | ]}t          |¦  «        d k    ¯|‘ŒS r�  rŽ  r�  s     rO   rE  z+build_merchant_spending.<locals>.<listcomp>¥  s#   € ÐFÐFÐF�A½3¸q¹6¼6ÀAº:¸:ˆa¸:¸:¸:rQ   r\   c                óZ   •— g | ]'}t          |¦  «        d k    ¯t          |‰¦  «        ¯%|‘Œ(S rD  r’  ©rw   rx   rN  s     €rO   rE  z+build_merchant_spending.<locals>.<listcomp>«  ó;   ø€ ÐcÐcÐc�!µ*¸Q±-´-À!Ò2CÐ2CÕHYÐZ[Ð]aÑHbÔHbÐ2CˆAÐ2CÐ2CÐ2CrQ   rF  Úmerchant_analysisrž  u   I looked for payments to â€œul   â€� on this statement and didnâ€™t find clear matches. Try the exact merchant name as it appears on the PDF.ÚMerchantrè   rä   úSearched narrations for: rÄ   ró   r  Tr$  c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rt   ru   rv   s     rO   ry   z*build_merchant_spending.<locals>.<genexpr>¾  ó(   è è € Ð5Ð5¨•j ‘m”mÐ5Ð5Ð5Ð5Ð5Ð5rQ   rz   ra   r€  z matching paymentr§   r^   r  úHTotals use the full statement text (table extract alone was incomplete).úSpending on r¤  r¥  r(  z). Every matching payment is listed below.zMerchant totalr  r¢  r  rã   c                ó²   •— g | ]S}t          t          |¦  «        ‰¦  «        › d t          t          |                     d¦  «        pd¦  «        ¦  «        › �‘ŒTS ©rŸ  r#  r^   ©rV   r   ri   rL   r}   ©rw   rx   rT   s     €rO   rE  z+build_merchant_spending.<locals>.<listcomp>Ø  ói   ø€ ð 
ð 
ð 
àõ •j ‘m”m SÑ)Ô)Ð]Ð]­{½3¸q¿uºuÀ]Ñ?SÔ?SÐ?YÐWYÑ;ZÔ;ZÑ/[Ô/[Ð]Ð]ð
ð 
ð 
rQ   rm  rÌ   r3  )r   r
   rõ   Úbuild_category_spendingrb   r©   rP   r°  r}   rM  r²  r«   r   r   r   rÐ   r´  r{  r�   r‚   rf   rv  rö   r³  rˆ  rV   rL   rx  r   )rI   rÕ   r³   r¸  rº  r¾  rF  rW  rÄ  rÌ  rµ  r—  r¶  rñ   rT   rN  s                 @@rO   Úbuild_merchant_spendingr°  ™  sÚ  øø€ å! (Ñ+Ô+€DØð Øˆtå
  Ñ
*Ô
*€CØ
ð 6ˆs�1Œv�|Š|‰~Œ~ §¢¡¤Ò-Ð-Ý& s¨HÑ5Ô5Ð5à�JŠJ‰LŒLˆ?€DàFÐF�œ &¨$¯*ª*©,¬,Ñ7Ô7ÐFÑFÔF€FØð )�&˜”) 4Ð'Ð'Ø—
’
‘”˜f QœiÐ(ˆå
ˆs‰)Œ)€CÝ(¨¨dÑ3Ô3€IØcÐcÐcÐc˜Ÿš ™œÐ-¨2ÐcÑcÔc€DØ9BÐRÀdÐRÕ# I°Ñ$4Ñ5Ô5Ð5ÐPR€Gà"Ÿlšl™nœnÐ6ˆd�jŠj‰lŒlˆl°$€GØð 
Ý Ø&Ý.Ð/BÔCØÐ'Ð'Ð'ðH¨wð Hð Hð Hõ #¨¸7ÈÐSÑSÔSÐTØØE°4·9²9¸T±?´?ÐEÐEÐEÐFð
ñ 
ô 
ð 	
õ �z¨'°tÀ$ÐGÑGÔGÈÑMÔM€DÝ•#Ð5Ð5¨WÐ5Ñ5Ô5Ñ5Ô5°qÑ9Ô9€EÝ�‰IŒI€EØ
•#�e˜Q‘-”-Ñ
€CàX�uÐXÐX°e¸q²j°j¨s¨sÀbÐXÐXÈgÐXÐXÐXð€Iõ ˆ9�~„~�˜D™	œ	Ò!Ð!Ø×ÒØVñ	
ô 	
ð 	
ð ×ÒÕ(¨Ñ-Ô-Ñ.Ô.Ð.åØ"Ý*Ð+>Ô?ØÐ#Ð#Ð#ð6˜7ð 6ð 6¥f¨U°CÑ&8Ô&8ð 6ð 6À%ð 6ð 6ÐX]ÐabÒXbÐXbÐQTÐQTÐhjð 6ð 6ð 6õ Ð 0½¸uÀcÑ8JÔ8JÐQYÐZÑZÔZÝ 
µ#°e±*´*À9ÐMÑMÔMÝ 	µ¸¸SÑ1AÔ1AÈÐQÑQÔQð
ð
 ð
ð 
ð 
ð 
å˜G­¸TÐBÑBÔBÀ2ÀAÀ2ÔFð
ñ 
ô 
ð ð%ñ ô ð rQ   c                ó  ‡‡‡— t          |¦  «        }|sd S |\  }Št          | ¦  «        Št          |¦  «        Š‰rt                               ‰pdd¦  «        nd}t          | ‰‰¬¦  «        }ˆfd„|                      d¦  «        pg D ¦   «         }‰rˆfd„|D ¦   «         }t          |¦  «        t          |¦  «        k    rt          ||z   ¦  «        }nt          ||z   ¦  «        }|rd|› �nd}|s—t          dt          d         | 
                    ¦   «         › d�d	|› d
|› d�t          d| 
                    ¦   «         d¬¦  «        g|rt          d|d¬¦  «        gng ¢g dd                     ‰d d…         ¦  «        › d�g¬¦  «        S t          t          |dd¬¦  «        ‰¦  «        }	t          t!          d„ |D ¦   «         ¦  «        d¦  «        }
t          |	¦  «        }|
t#          |d¦  «        z  }d|› d|› d|dk    rdnd› |› d�g}|r|                     d|› d �¦  «         t          |¦  «        t          |¦  «        k    r|                     d!¦  «         |                     t)          | ¦  «        ¦  «         t          dt          d         | 
                    ¦   «         › d|rd"|z   nd› �d#|› |› d$t+          |
‰¦  «        › d%|› d&|t          |	¦  «        k    rd'nd(› �	t          d)t+          |
‰¦  «        d*¬¦  «        t          d+t-          |¦  «        d¬¦  «        t          d,t+          |‰¦  «        d¬¦  «        g|rt          d|d¬¦  «        gng ¢|	ˆfd-„t/          |t0          d¬.¦  «        d d/…         D ¦   «         |¬0¦  «        S )1Nr^   r~  c                óZ   •— g | ]'}t          |¦  «        d k    ¯t          |‰¦  «        ¯%|‘Œ(S rD  r’  r¡  s     €rO   rE  z+build_category_spending.<locals>.<listcomp>ë  r¢  rQ   rF  c                ó4   •— g | ]}t          |‰¦  «        ¯|‘ŒS r¥   )r\  )rw   rx   r8  s     €rO   rE  z+build_category_spending.<locals>.<listcomp>í  s(   ø€ Ð;Ð;Ð;�a¥=°°EÑ#:Ô#:Ð;�Ð;Ð;Ð;rQ   z in Úcategory_spendingrž  zI looked for z	 activityu}    on this statement and didnâ€™t find clear matches. Try a merchant name that appears on the PDF, or ask for overall spending.r!  rè   rä   rê   rã   r¥  rÄ   é   ró   r  Tr$  c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rt   ru   rv   s     rO   ry   z*build_category_spending.<locals>.<genexpr>  r§  rQ   rz   ra   r€  z
 matching r(  r§   zFiltered to z<. Payments outside this month on the statement are excluded.r¨  rŸ  r©  r¤  r¥  r«  z/Every matching indexed payment is listed below.z+Matching indexed payments are listed below.zCategory totalr  r¢  r  c                ó²   •— g | ]S}t          t          |¦  «        ‰¦  «        › d t          t          |                     d¦  «        pd¦  «        ¦  «        › �‘ŒTS r«  r¬  r­  s     €rO   rE  z+build_category_spending.<locals>.<listcomp>'  r®  rQ   rm  rÌ   r3  )r
   rP   rO  rg  r}   r°  rf   rM  r   r   r«   r   rÐ   r´  r{  r�   r‚   rv  rö   r³  rˆ  rV   rL   rx  r   )rI   rÕ   r¸  rå   rl  r¾  rF  rW  Ú
period_bitrÌ  rµ  r—  r¶  rñ   rT   rN  r8  s                 @@@rO   r¯  r¯  à  s�  øøø€ Ý
  Ñ
*Ô
*€CØð ØˆtØ�K€Eˆ4Ý
ˆs‰)Œ)€CÝ Ñ)Ô)€EØ6;ÐC•+—/’/ % +¨2¨rÑ2Ô2Ð2À€Kõ )¨¨d¸%Ð@Ñ@Ô@€IØcÐcÐcÐc˜Ÿš ™œÐ-¨2ÐcÑcÔc€DØð <Ø;Ð;Ð;Ð;˜4Ð;Ñ;Ô;ˆå
ˆ9�~„~�˜T™œÒ"Ð"Ý'¨	°DÑ(8Ñ9Ô9ˆˆå'¨¨yÑ(8Ñ9Ô9ˆà)4Ð<Ð%˜Ð%Ð%Ð%¸"€JØð 
Ý Ø&Ý.Ð/BÔCØŸš™œÐ-Ð-Ð-ð\ ð \ð \°
ð \ð \ð \õ  J°e·k²k±m´mÈ)ÐTÑTÔTðàWbÐj•= x°{ÈÐRÑRÔRÐSÐSÐhjðð ØI°4·9²9¸TÀ"À1À"¼XÑ3FÔ3FÐIÐIÐIÐJð
ñ 
ô 
ð 	
õ  �z¨'°tÀ$ÐGÑGÔGÈÑMÔM€DÝ•#Ð5Ð5¨WÐ5Ñ5Ô5Ñ5Ô5°qÑ9Ô9€EÝ�‰IŒI€EØ
•#�e˜Q‘-”-Ñ
€Cð 	`�uÐ_Ð_¨Ð_Ð_¸eÀqºj¸j°s°sÈbÐ_ÐR\Ð_Ð_Ð_ð€Ið ð 
Ø×ÒØd˜;ÐdÐdÐdñ	
ô 	
ð 	
õ ˆ9�~„~�˜D™	œ	Ò!Ð!Ø×ÒØVñ	
ô 	
ð 	
ð ×ÒÕ(¨Ñ-Ô-Ñ.Ô.Ð.åØ"Ý*Ð+>Ô?Ø—K’K‘M”MÐXÐXÀ;Ð)V¨&°;Ñ*>Ð*>ÐTVÐXÐXðL˜5ð L *ð Lð Lµ°u¸cÑ0BÔ0Bð Lð LÈEð Lð LØDIÍSÐQUÉYÌYÒDVÐDVÐ@Ð@ð  ]JðLð Lõ Ð 0½¸uÀcÑ8JÔ8JÐQYÐZÑZÔZÝ 
µ#°e±*´*À9ÐMÑMÔMÝ 	µ¸¸SÑ1AÔ1AÈÐQÑQÔQð
ð T_Ðf�} 8°;ÀXÐNÑNÔNÐOÐOÐdfð	
ð ð
ð 
ð 
ð 
å˜G­¸TÐBÑBÔBÀ2ÀAÀ2ÔFð
ñ 
ô 
ð ð'ñ ô ð rQ   c           	     óþ  — t          | ¦  «        }t          | ¦  «        }t          | ¦  «        }t          |¦  «        }t	          | ¦  «        }t          | ¦  «        }|                      d¦  «        pd}t          dt          |¦  «        d¬¦  «        g}	|�3|	 	                    dt          dt          |¦  «        d	¬¦  «        ¦  «         |r%|	 
                    t          d
|d	¬¦  «        ¦  «         |                     d¦  «        �9|	 
                    t          dt          |d         |¦  «        d¬¦  «        ¦  «         |�||k     rd|› d|› d|› d�}
d}nd|› d|› d�|�d|› d�ndz   }
d}t          dd||
|	g g ¬¦  «        S )uM   Answer follow-ups about payment list coverage â€” without exposing internals.r×   rØ   zPayments reviewedrã   rä   Nr   r•  rè   rê   rn   r  r  u   On â€œu   â€� I can review z6 individual payments in detail (the statement reports zo overall). Overall totals use the statement figures; ask about a date or merchant to inspect specific payments.zPayment coveragezI can review u    payments on â€œr  z", matching the statement total of ró   Úperiod_coverageÚCoverager  )rP   r‹   rN  rf   rQ  r“   r}   r   rL   r  rö   rV   r   )rI   rÕ   rT   r‘   ÚcompleteÚindexedrU  rÎ   r×   rl   rð   rï   s               rO   Úbuild_coverage_explanationr¾  0  sô  € å
ˆs‰)Œ)€CÝ˜ÑÔ€AÝ% cÑ*Ô*€HÝ�(‰mŒm€GÝ$ SÑ)Ô)€HÝ˜3ÑÔ€FØ�wŠw�zÑ"Ô"Ð1 k€Hõ 	Ð/µs¸7±|´|È(ÐSÑSÔSð€Gð ÐØ�ŠØÝÐ 7½sÀ8¹}¼}ÐS\Ð]Ñ]Ô]ñ	
ô 	
ð 	
ð ð TØ�Š•}¨8¸6È	ÐRÑRÔRÑSÔSÐSØ‡u‚uˆ[ÑÔÐ%Ø�ŠÝ µV¸A¸k¼NÈCÑ5PÔ5PÐW_Ð`Ñ`Ô`ñ	
ô 	
ð 	
ð Ð ¨(Ò 2Ð 2ð,�Xð ,ð ,°ð ,ð ,Ø&.ð,ð ,ð ,ð 	ð &ˆˆð C˜GÐBÐB°XÐBÐBÐBØCKÐCWÐ?°HÐ?Ð?Ð?Ð?Ð]`ñbð 	ð &ˆåØ ØØØØØØðñ ô ð rQ   c                ó  ‡— t          ¦   «         Št          | ¦  «        pd}t          | ¦  «        dd…         }t          |¦  «        }t	          |                      d¦  «        pg ¦  «        }||dd…         fD ]j}t          j        d|¦  «        D ]R}t          j        | 	                    d¦  «         
                    ¦   «         ¦  «        }|r‰                     |¦  «         ŒSŒkt          |                     ¦   «         ¦  «        t          |                     ¦   «         ¦  «        z   D ]r}t          j        d|¦  «        D ]Z}t          j        | 	                    d¦  «         
                    ¦   «         dd	…         ¦  «        }|r‰                     |¦  «         Œ[Œs|                      d¦  «        pg D ]Ç}	t          t          |	                     d
¦  «        pd¦  «        ¦  «        p#t          |	                     d
¦  «        pd¦  «        }
t          j        d|
¦  «        D ]Z}t          j        | 	                    d¦  «         
                    ¦   «         dd	…         ¦  «        }|r‰                     |¦  «         Œ[ŒÈˆfd„t           D ¦   «         S )z<Return ordered month keys (jan..dec) found on the statement.r^   Ni N  rF  r¹   ú›(?i)\b(jan(?:uary)?|feb(?:ruary)?|mar(?:ch)?|apr(?:il)?|may|jun(?:e)?|jul(?:y)?|aug(?:ust)?|sep(?:t(?:ember)?)?|oct(?:ober)?|nov(?:ember)?|dec(?:ember)?)\bra   z?(?i)\b(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*\brÌ   r"  c                ó   •— g | ]}|‰v ¯|‘Œ	S r¥   r¥   )rw   rˆ   rÛ  s     €rO   rE  z#_months_present.<locals>.<listcomp>ˆ  s   ø€ Ð2Ð2Ð2�! q¨E z zˆA z z zrQ   )r÷   r“   r#   r)   r(   r}   rb   Úfinditerr!   r�   rõ   rø   rß  rN  r%   rL   rz  )rI   rÎ   rX   rQ  rR  r-  r‘   rº   rå   rx   r"  rÛ  s              @rO   rk  rk  c  ss  ø€ å‘e”e€EÝ˜3ÑÔÐ% 2€FÝ Ñ$Ô$ V e VÔ,€DÝ& tÑ,Ô,€GÝ& s§w¢w¨v¡¤Ð'<¸"Ñ=Ô=€Gà˜˜e˜t˜eœÐ%ð ð ˆÝ”ðeàñ
ô 
ð 	ð 	ˆAõ
 !Ô$ Q§W¢W¨Q¡Z¤Z×%5Ò%5Ñ%7Ô%7Ñ8Ô8ˆCØð Ø—	’	˜#‘”�øð	õ �g—l’l‘n”nÑ%Ô%­¨W¯\ª\©^¬^Ñ(<Ô(<Ñ<ð ð ˆÝ”ØNØñ
ô 
ð 	ð 	ˆAõ !Ô$ Q§W¢W¨Q¡Z¤Z×%5Ò%5Ñ%7Ô%7¸¸¸Ô%;Ñ<Ô<ˆCØð Ø—	’	˜#‘”�øð	ð �WŠW�V‰_Œ_Ð" ð ð ˆÝ$¥S¨¯ª¨v©¬Ð)<¸"Ñ%=Ô%=Ñ>Ô>ÐZÅ#ÀaÇeÂeÈFÁmÄmÐFYÐWYÑBZÔBZˆÝ”ØNØñ
ô 
ð 	ð 	ˆAõ !Ô$ Q§W¢W¨Q¡Z¤Z×%5Ò%5Ñ%7Ô%7¸¸¸Ô%;Ñ<Ô<ˆCØð Ø—	’	˜#‘”�øð	ð 3Ð2Ð2Ð2•|Ð2Ñ2Ô2Ð2rQ   c                óæ   — g }t          j        d| pd¦  «        D ]V}t          j        |                     d¦  «                             ¦   «         ¦  «        }|r||vr|                     |¦  «         ŒW|S )NrÀ  r^   ra   )rb   rÂ  r!   r}   r�   rõ   rö   )rÕ   rc  r‘   rº   s       rO   Ú_months_mentionedrÄ  ‹  s|   € Ø€CÝŒ[ð	aàˆ�Bñô ð ð ˆõ
 Ô  §¢¨¡¤×!1Ò!1Ñ!3Ô!3Ñ4Ô4ˆØð 	�3˜c�>�>Ø�JŠJ�s‰OŒOˆOøØ€JrQ   c           	     óð  ‡— |                       d¦  «        pd}t          | ¦  «        }t          | ¦  «        Šd„ ‰D ¦   «         }t          |¦  «        }ˆfd„|D ¦   «         }ˆfd„|D ¦   «         }|r
d|› d|› d�}n^|rVt	          |¦  «        d	k    rd|› d
|d         › d�}n9d                     |dd…         ¦  «        d|d         › �z   }	d|› d|	› d�}nd|› d�}g }
|rgd„ |D ¦   «         }|
                     d                     |¦  «        › dt	          |¦  «        d	k    rdnd› dt	          |¦  «        d	k    rdnd› d�¦  «         |r|s|
                     d¦  «         |r.|r,|
                     dd                     |¦  «        › d�¦  «         g }|r%|                     t          d|d¬ ¦  «        ¦  «         |r8|                     t          d!d                     |¦  «        d"¬ ¦  «        ¦  «         |rB|                     t          d#d                     d$„ |D ¦   «         ¦  «        d%¬ ¦  «        ¦  «         t          | ¦  «        }|                     d&¦  «         t          d't          d'         d|||
|¬(¦  «        S ))uV   Answer why certain months appear / donâ€™t appear â€” from full statement, not chunks.r×   rþ  c                ó(   — g | ]}t           |         ‘ŒS r¥   rf  rÔ  s     rO   rE  z)build_period_coverage.<locals>.<listcomp>�  s   € Ð6Ð6Ð6¨•k !”nÐ6Ð6Ð6rQ   c                ó   •— g | ]}|‰v¯|‘Œ	S r¥   r¥   ©rw   r‘   ro  s     €rO   rE  z)build_period_coverage.<locals>.<listcomp>Ÿ  s#   ø€ Ð4Ð4Ð4�Q 1¨GÐ#3Ð#3ˆqÐ#3Ð#3Ð#3rQ   c                ó   •— g | ]}|‰v ¯|‘Œ	S r¥   r¥   rÈ  s     €rO   rE  z)build_period_coverage.<locals>.<listcomp>   s   ø€ Ð6Ð6Ð6˜1¨¨g¨¨�Q¨¨¨rQ   õ   â€œu   â€� covers **uR   **. That printed period is what the statement contains â€” not a retrieval sample.ra   u    â€� only includes activity in **r   zO**. I checked the statement header and every dated transaction on the document.rÄ   Néÿÿÿÿr‰  u   â€� includes activity in **u   I reviewed â€œur   â€� but could not pin a clear calendar period from the header. Ask me to list spend by date for a day-by-day view.c                ó(   — g | ]}t           |         ‘ŒS r¥   rf  rÔ  s     rO   rE  z)build_period_coverage.<locals>.<listcomp>»  s   € Ð7Ð7Ð7¨!•{ 1”~Ð7Ð7Ð7rQ   r]   ÚisÚareuH    not on this statement â€” there are no dated lines or header dates for z
that monthzthose monthsró   zaThe month(s) you named do appear on the statement; ask about spend on a specific date for detail.zMonths actually present: r   rã   rä   zMonths presentrè   zNot on statementc              3  ó0   K  — | ]}t           |         V — Œd S rt   rf  rÔ  s     rO   ry   z(build_period_coverage.<locals>.<genexpr>Ú  s&   è è € Ð@Ð@°1¥¨A¤Ð@Ð@Ð@Ð@Ð@Ð@rQ   r  zMAnswered from the full statement period and dated lines, not vector snippets.rº  r  )r}   r“   rk  rÄ  rf   rÐ   rö   r   rˆ  r   r   )rI   rÕ   r×   rÎ   rp  ÚaskedÚmissingÚpresent_askedrð   Újoinedr  Úmiss_labelsrl   rñ   ro  s                 @rO   Úbuild_period_coveragerÕ  ˜  sÅ  ø€ à�wŠw�zÑ"Ô"Ð6Ð&6€HÝ˜3ÑÔ€FÝ˜cÑ"Ô"€GØ6Ð6¨gÐ6Ñ6Ô6€NÝ˜hÑ'Ô'€EØ4Ð4Ð4Ð4˜%Ð4Ñ4Ô4€GØ6Ð6Ð6Ð6 Ð6Ñ6Ô6€Màð 
ð]�(ð ]ð ]¨ð ]ð ]ð ]ð 	ˆð 
ð 
Ýˆ~ÑÔ !Ò#Ð#ð^�hð ^ð ^ÀÈqÔ@Qð ^ð ^ð ^ð ˆGð
 —Y’Y˜~¨c¨r¨cÔ2Ñ3Ô3Ð6R¸nÈRÔ>PÐ6RÐ6RÑRˆFð^�hð ^ð ^¸6ð ^ð ^ð ^ð ˆGðB˜Xð Bð Bð Bð 	ð
 €JØð 
Ø7Ð7¨wÐ7Ñ7Ô7ˆØ×ÒØ�yŠy˜Ñ%Ô%ð Lð LÝ˜;Ñ'Ô'¨1Ò,Ð,ˆtˆt°%ðLð Lõ  # ;Ñ/Ô/°1Ò4Ð4ˆ|ˆ|¸.ðLð Lð Lñ	
ô 	
ð 	
ð ð 
˜Wð 
Ø×ÒØoñ	
ô 	
ð 	
ð ð 
˜'ð 
Ø×ÒØD¨¯	ª	°.Ñ(AÔ(AÐDÐDÐDñ	
ô 	
ð 	
ð €GØð ]Ø�Š•}Ð+=ÀVÐRZÐ[Ñ[Ô[Ñ\Ô\Ð\Øð 
Ø�ŠÝØ&Ø—i’i Ñ/Ô/Øðñ ô ñ	
ô 	
ð 	
ð ð 
Ø�ŠÝØ(Ø—i’iÐ@Ð@¸Ð@Ñ@Ô@Ñ@Ô@Øðñ ô ñ	
ô 	
ð 	
õ $ CÑ(Ô(€IØ×ÒÐdÑeÔeÐeåØ Ý*Ð+<Ô=Ø#ØØØØðñ ô ð rQ   ©Úprior_questionr×  c          	     óð  — t          | ¦  «        }t          | ¦  «        }t          | ¦  «        }|r't          t	          d„ |D ¦   «         ¦  «        d¦  «        nd}|                     d¦  «        }|                     d¦  «        }t          | ¦  «        }|pd                     ¦   «         }	ddt          |¦  «        › �|�d	t          ||¦  «        › �nd
z   dz   g}
|�'|
 
                    dt          ||¦  «        › d�¦  «         |�&|
 
                    dt          |¦  «        › d�¦  «         t          | ¦  «        }| 
                    d|	› �¦  «         g }|�3| 
                    t          dt          ||¦  «        d¬¦  «        ¦  «         |�3| 
                    t          dt          ||¦  «        d¬¦  «        ¦  «         |r%| 
                    t          d|d¬¦  «        ¦  «         t          dddd||
|¬¦  «        S )uI   Explain how totals were derived â€” prefer header, disclose row coverage.c              3  ó4   K  — | ]}t          |¦  «        V — Œd S rt   ru   rv   s     rO   ry   z)build_calc_explanation.<locals>.<genexpr>ö  r‹  rQ   rz   Nrn   rp   zthe previous figurezIStatement header totals are treated as primary for overall spend/receive.z(Indexed outflow lines on this document: z
 totaling r^   ró   zHeader money out: zHeader payments made: zRecomputed while explaining: zHeader total spentr  rä   zSum of indexed outflowsrè   rê   rã   r   zCalculation checkzHow the figures were derivedz»I re-checked the full statement. Overall cash totals come from the statement header when present; date/merchant/category cuts aggregate every matching indexed transaction on the document.r  )rP   r‹   r   r�   r‚   r}   r“   re   rf   rV   rö   rZ   rˆ  r   r   )rI   r×  rT   r‘   r‰   Ú	row_totalÚ
header_outrU  rÎ   Úfocusr  rñ   rl   s                rO   Úbuild_calc_explanationrÝ  í  s=  € õ ˆs‰)Œ)€CÝ˜ÑÔ€AÝ˜SÑ!Ô!€HØBJÐT••cÐ:Ð:°Ð:Ñ:Ô:Ñ:Ô:¸AÑ>Ô>Ð>ÐPT€IØ—’�{Ñ#Ô#€JØ�uŠu�_Ñ%Ô%€HÝ˜3ÑÔ€FØÐ4Ð4×;Ò;Ñ=Ô=€Eð 	TØBµ3°x±=´=ÐBÐBØ4=Ð4IÐ0�˜y¨#Ñ.Ô.Ð0Ð0Ð0Èrñ	Sà
ñ	ð€Jð ÐØ×ÒÐI­v°jÀ#Ñ/FÔ/FÐIÐIÐIÑJÔJÐJØÐØ×ÒÐCµ3°x±=´=ÐCÐCÐCÑDÔDÐDå# CÑ(Ô(€IØ×ÒÐ<°UÐ<Ð<Ñ=Ô=Ð=à€GØÐØ�Š•}Ð+?ÅvÈjÐZ]ÑG^ÔG^ÐemÐnÑnÔnÑoÔoÐoØÐØ�Š•}Ð+DÍFÐS\Ð^aÑLbÔLbÐirÐsÑsÔsÑtÔtÐtØð SØ�Š•}¨8¸6ÈÐQÑQÔQÑRÔRÐRåØØ(Ø/ðhð ØØðñ ô ð rQ   Úorg_idÚagent_idc                ó‚
  — t          j        | |¦  «        pg }t          d„ |D ¦   «         ¦  «        }d„ |D ¦   «         }d„ |D ¦   «         }|pd                     ¦   «         }t	          t          j        d|¦  «        ¦  «        }t	          t          j        d|¦  «        ¦  «        }	t	          t          j        d|¦  «        ¦  «        }
t	          t          j        d|¦  «        ¦  «        }|s9t          d	d
ddt          ddd¬¦  «        t          ddd¬¦  «        gg dg¬¦  «        S |sõ|s|rñdt          |¦  «        › dt          |¦  «        dk    rdnd› d�|rdt          |¦  «        › d�ndz   |rdt          |¦  «        › d�ndz   dz   }t          d	d
d|t          dt          t          |¦  «        ¦  «        d¬¦  «        t          ddd ¬¦  «        t          d!t          t          |¦  «        ¦  «        d"¬¦  «        gd#„ ||z   d$d%…         D ¦   «         d&g¬¦  «        S d'„ |D ¦   «         }t          d(„ |D ¦   «         ¦  «        }t          d)„ |D ¦   «         ¦  «        }t          d*t          t          |¦  «        ¦  «        d"¬¦  «        g}|r2|                     t          d+t          |¦  «        d¬¦  «        ¦  «         |r2|                     t          d,t          |¦  «        d¬¦  «        ¦  «         |r?|                     t          d-t          t          |¦  «        ¦  «        d¬¦  «        ¦  «         t          g d.¢d/„ |d$d0…         D ¦   «         ¬1¦  «        }|	r7t          |¦  «        dk    r$d2|d3         › d4�}|r|d5|› d6|dk    rdnd› d7�z  }�nŒ|rj|r;d8t          |¦  «        › d9t          |¦  «        dk    rdnd› d:|› d6|dk    rdnd› d7�	}�nMd;t          |¦  «        › d9t          |¦  «        dk    rdnd› d<�}�n |
r,d=t          |¦  «        › d9t          |¦  «        dk    rdnd› d>�}nò|r^t          |¦  «        › d?t          |¦  «        dk    rdnd› d@�|rdt          |¦  «        › dA�ndz   |rdt          |¦  «        › d�ndz   dBz   }n’d                     dC„ |d$dD…         D ¦   «         ¦  «        }t          |¦  «        dDk    rdEt          |¦  «        dDz
  › dF�nd}dGt          |¦  «        › d9t          |¦  «        dk    rdnd› dH|› |› dB�}|r	|dI|› dB�z  }|dJz  }t          d	d
dK||dL„ |d$dM…         D ¦   «         |dNg¬O¦  «        S )PuU   Answer knowledge-base / document-metadata questions â€” never summarize PDF contents.c                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS ©ÚstatusÚreadyrG  ©rw   Úds     rO   rE  z&build_kb_inventory.<locals>.<listcomp>#	  s,   € ÐQÐQÐQ Q°a·e²e¸H±o´oÈÒ6PÐ6P˜qÐ6PÐ6PÐ6PrQ   c                ó@   — g | ]}|                      d ¦  «        dv ¯|‘ŒS )rã  >   ÚpendingÚindexingÚ
processingrG  rå  s     rO   rE  z&build_kb_inventory.<locals>.<listcomp>$	  s-   € Ð_Ð_Ð_�Q a§e¢e¨H¡o¤oÐ9^Ð&^Ð&^ˆqÐ&^Ð&^Ð&^rQ   c                ó@   — g | ]}|                      d ¦  «        dv ¯|‘ŒS )rã  >   ÚerrorÚfailedrG  rå  s     rO   rE  z&build_kb_inventory.<locals>.<listcomp>%	  s-   € ÐLÐLÐL�A Q§U¢U¨8¡_¤_Ð8KÐ%KÐ%KˆaÐ%KÐ%KÐ%KrQ   r^   z(?i)\bpages?\bz,(?i)\bfilename|file\s+name|document\s+name\bz0(?i)\bhow\s+many\s+(?:documents?|files?|pdfs?)\bz%(?i)\bstatus|ready|uploaded|indexed\bÚdocument_qazKnowledge baseúKnowledge base is emptyuÊ   I don't have a knowledge base yet, so I can't list filenames or page counts. Please upload a knowledge base first (PDF, TXT, MD, or CSV in the Knowledge panel) â€” I wonâ€™t invent files or page counts.Ú	DocumentsÚ0rè   rä   ÚReadyu5   Metadata only â€” no document content was summarized.r  zI see z uploadra   r§   z, but none are ready yetr£  z still processing)rÄ   z faileduB   . I wonâ€™t guess page counts or contents until indexing finishes.zUploads in progresszTotal uploadsr  Ú
Processingrã   c                óV   — g | ]&}t          |                     d ¦  «        pd¦  «        ‘Œ'S )r×   Úfilers  rå  s     rO   rE  z&build_kb_inventory.<locals>.<listcomp>Q	  s1   € ÐYÐYÐY¸Q�˜AŸEšE *Ñ-Ô-Ð7°Ñ8Ô8ÐYÐYÐYrQ   Nrµ  zAsk again once status is ready.c                óV   — g | ]&}t          |                     d ¦  «        pd¦  «        ‘Œ'S )r×   Údocumentrs  rå  s     rO   rE  z&build_kb_inventory.<locals>.<listcomp>U	  s1   € ÐAÐAÐA°a�S�—’�zÑ"Ô"Ð0 jÑ1Ô1ÐAÐAÐArQ   c              3  ó^   K  — | ](}t          |                     d ¦  «        pd¦  «        V — Œ)dS )Ú
page_countr   N©rZ   r}   rå  s     rO   ry   z%build_kb_inventory.<locals>.<genexpr>V	  s;   è è € ÐCÐC¸•c˜!Ÿ%š% Ñ-Ô-Ð2°Ñ3Ô3ÐCÐCÐCÐCÐCÐCrQ   c              3  ó^   K  — | ](}t          |                     d ¦  «        pd¦  «        V — Œ)dS )Úchunk_countr   Nrú  rå  s     rO   ry   z%build_kb_inventory.<locals>.<genexpr>W	  s;   è è € ÐEÐE¸!•s˜1Ÿ5š5 Ñ/Ô/Ð4°1Ñ5Ô5ÐEÐEÐEÐEÐEÐErQ   zReady documentszTotal pageszIndexed chunkszStill processing)ÚFilenameÚStatusÚPagesÚChunksc                óf  — g | ]®}t          |                     d ¦  «        pd¦  «        t          |                     d¦  «        pd¦  «        t          t          |                     d¦  «        pd¦  «        pd¦  «        t          t          |                     d¦  «        pd¦  «        pd¦  «        g‘Œ¯S )r×   r÷  rã  rä  rù  r   r  rü  )rL   r}   rZ   rå  s     rO   rE  z&build_kb_inventory.<locals>.<listcomp>e	  s´   € ð 
ð 
ð 
ð õ �A—E’E˜*Ñ%Ô%Ð3¨Ñ4Ô4Ý�A—E’E˜(‘O”OÐ. wÑ/Ô/Ý•C˜Ÿš˜lÑ+Ô+Ð0¨qÑ1Ô1Ð:°UÑ;Ô;Ý•C˜Ÿš˜mÑ,Ô,Ð1°Ñ2Ô2Ð;°eÑ<Ô<ð	ð
ð 
ð 
rQ   ra  r  u   The indexed file is â€œr   u   â€� (status: ready).z It has z pagez	 indexed.rõ  z ready documentz	, I have zI have uY   , but page counts were not recorded for these uploads â€” I wonâ€™t invent a page number.z	You have z in the knowledge base.z	 documentz readyz still processingró   c              3  ó"   K  — | ]
}d |› d�V — ŒdS )rÊ  r  Nr¥   ©rw   rV  s     rO   ry   z%build_kb_inventory.<locals>.<genexpr>‰	  s*   è è € Ð;Ð;¨A˜< ˜<˜<˜<Ð;Ð;Ð;Ð;Ð;Ð;rQ   rœ  r‰  z morezYour knowledge base has r¤  z Combined indexed pages: u]    Ask about spend or a merchant if you want the statement contents â€” not just the file list.zIndexed documentsc                ó   — g | ]}d |› d�‘Œ	S )rÊ  r  r¥   r  s     rO   rE  z&build_kb_inventory.<locals>.<listcomp>™	  s    € Ð4Ð4Ð4 Q�L˜!�L�L�LÐ4Ð4Ð4rQ   r¦  u\   This is inventory metadata (filenames, pages, status) â€” not a content summary of the PDFs.)rí   rî   rï   rð   rl   r  rë  rñ   )Úsaas_dbÚlist_kb_documentsr-   re   rX  rb   r�   r   r   rf   rL   r‚   rö   r   rÐ   )rÞ  rß  rÕ   Úall_docsrä  rè  rí  rù   Úwants_pagesÚwants_filenameÚwants_countÚwants_statusrð   ÚnamesÚtotal_pagesÚtotal_chunksrl   rë  r˜  r‘  s                       rO   Úbuild_kb_inventoryr   	  s  € åÔ(¨°Ñ:Ô:Ð@¸b€HÝÐQÐQ¨(ÐQÑQÔQÑRÔR€EØ_Ð_˜(Ð_Ñ_Ô_€GØLÐL˜ÐLÑLÔL€Fà	ˆ�R×ÒÑ Ô €AÝ•r”yÐ!2°AÑ6Ô6Ñ7Ô7€KÝ�"œ)Ð$SÐUVÑWÔWÑXÔX€NÝ•r”yÐ!TÐVWÑXÔXÑYÔY€KÝ�œ	Ð"JÈAÑNÔNÑOÔO€Làð 
Ý Ø Ø)Ø.ð9õ
  K°sÀÐKÑKÔKÝ G°3¸YÐGÑGÔGðð ØNÐOð
ñ 
ô 
ð 	
ð" ð 
�gð 
 ð 
ð&•S˜‘]”]ð &ð &µ#°h±-´-À1Ò2DÐ2D¨3¨3È"ð &ð &ð &à8?ÐGÐ4•C˜‘L”LÐ4Ð4Ð4Ð4ÀRñIð -3Ð:Ð(•C˜‘K”KÐ(Ð(Ð(Ð(¸ñ<ð Sñ	Sð 	õ !Ø Ø)Ø*Øå O½3½sÀ8¹}¼}Ñ;MÔ;MÐT]Ð^Ñ^Ô^Ý G°3¸XÐFÑFÔFÝ L½½CÀ¹L¼LÑ8IÔ8IÐPXÐYÑYÔYðð
 ZÐYÀ7ÈVÑCSÐUWÐVWÐUWÔBXÐYÑYÔYØ8Ð9ð
ñ 
ô 
ð 	
ð BÐA¸5ÐAÑAÔA€EÝÐCÐC¸UÐCÑCÔCÑCÔC€KÝÐEÐE¸uÐEÑEÔEÑEÔE€Lõ 	Ð-µS½¸U¹¼±_´_È8ÐTÑTÔTð$€Gð ð cØ�Š•}¨=ÅÀKÑ@PÔ@PÐW`ÐaÑaÔaÑbÔbÐbØð gØ�Š•}Ð+;Å3À|ÑCTÔCTÐ[dÐeÑeÔeÑfÔfÐfØð iØ�Š•}Ð+=ÅSÍÈWÉÌÑEVÔEVÐ]fÐgÑgÔgÑhÔhÐhåØ9Ð9Ð9ð
ð 
ð ˜3˜B˜3”Zð
ñ 
ô 
ðñ ô €Eð ð !s�#˜e™*œ*¨š/˜/ØJ¨E°!¬HÐJÐJÐJˆØð 	_ØÐ^ +Ð^Ð^¸;È!Ò;KÐ;K°C°CÐQSÐ^Ð^Ð^Ñ^ˆGùØ	ð sØð 		ðW�#˜e™*œ*ð Wð W½CÀ¹J¼JÈ!ºO¸O°S°SÐQSð Wð WØ%ðWð WØ3>À!Ò3CÐ3C¨C¨CÈðWð Wð Wð ‰Gðj�#˜e™*œ*ð jð j½CÀ¹J¼JÈ!ºO¸O°S°SÐQSð jð jð jð ‰Gð 
ð sØp�c %™jœjÐpÐpÅÀEÁ
Ä
ÈaÂÀ¸¸ÐUWÐpÐpÐpˆˆØ	ð så�5‰zŒzÐJÐJ­3¨u©:¬:¸ª?¨? C CÀÐJÐJÐJØ7>ÐFÐ3•C˜‘L”LÐ3Ð3Ð3Ð3ÀBñHà,2Ð:Ð(•C˜‘K”KÐ(Ð(Ð(Ð(¸ñ<ð ñð 	ˆð —’Ð;Ð;°°r¸°r´Ð;Ñ;Ô;Ñ;Ô;ˆÝ14°U±´¸a²°Ð-�˜E™
œ
 Q™Ð-Ð-Ð-Ð-ÀRˆð ¥s¨5¡z¤zð  ð  ÍÈUÉÌÐWXÊÈÀ#À#Ð^`ð  ð  Øð Øð ð  ð  ð 	ð ð 	BØÐA°;ÐAÐAÐAÑAˆGØÐrÑrˆåØØ%Ø$ØØØ4Ð4¨%°°°¬)Ð4Ñ4Ô4Øàjð
ðñ ô ð rQ   )Úoriginal_questionÚconv_intentr×  Úprior_answerr  r  r  ú$tuple[str, StructuredInsight] | Nonec          	     ó6  — |pd                      ¦   «         }|p|                      ¦   «         }|s|sdS t          |¦  «        }	|	dk    r!||k    r|dv rt          |¦  «        }
|
dk    r|
}	ddlm}  ||¦  «        p2 ||¦  «        p't	          t          j        d|dz   |z   ¦  «        ¦  «        }t          |¦  «        pt          |¦  «        }|r&|s$t          | ||¦  «        }|rt          |¦  «        |fS t          | |¦  «        }|sgt          j        d|dz   |z   ¦  «        rJt          j        | |¦  «        }d	„ |D ¦   «         }|s't          d
dddg g g ¬¦  «        }t          |¦  «        |fS dS |d         }|dk    st          |¦  «        st          |¦  «        rct          |¦  «        st          |¦  «        r!t          ||¦  «        }t          |¦  «        |fS t!          ||p|¬¦  «        }t          |¦  «        |fS |dk    �rY|p|}t          |¦  «        }t#          |¦  «        st#          |¦  «        rt%          ||¦  «        }n¯|dk    st'          |¦  «        rt)          ||¦  «        }n‰|dk    r!t+          ||¦  «        pt-          ||¦  «        }nb|dk    rt/          ||¦  «        }nK|dv rt-          ||¦  «        }n6|dk    st#          |¦  «        rt%          ||¦  «        }nt1          ||¦  «        }t3          |j        pg ¦  «        dgz   |_        |r6t3          |j        pg ¦  «        |_        |j                             dd¦  «         t          |¦  «        |fS |	dk    st#          |¦  «        st#          |¦  «        r2t%          |t#          |¦  «        r|n|¦  «        }t          |¦  «        |fS t;          |¦  «        st;          |¦  «        r!t=          ||¦  «        }t          |¦  «        |fS |	dk    st?          |¦  «        st?          |¦  «        r!tA          ||¦  «        }t          |¦  «        |fS |	dk    st'          |¦  «        rPt)          ||¦  «        }tC          |¦  «        }|rt3          |j        pg ¦  «        |z   |_        t          |¦  «        |fS |dv rct'          |¦  «        rT|	dv rPt)          ||¦  «        }tC          |¦  «        }|rt3          |j        pg ¦  «        |z   |_        t          |¦  «        |fS |	dk    r!tE          ||¦  «        }t          |¦  «        |fS tG          |¦  «        ptG          |¦  «        }tI          |¦  «        pKtK          |¦  «        ot          j        d|¦  «        p'|o%|o#tI          |¦  «        pt          j        d|¦  «        }|rttI          |¦  «        s&tK          |¦  «        rt          j        d|¦  «        s|r?|}|r|r|dv r|}tM          ||¦  «        }|rtO          ||¦  «        }t          |¦  «        |fS tI          |¦  «        s$tK          |¦  «        r6t          j        d|¦  «        r!tM          ||¦  «        }t          |¦  «        |fS |	dk    rdt+          ||¦  «        }|rRt3          |j        pg ¦  «        tC          |tQ          |j)        pg ¦  «        ¬¦  «        z   |_        t          |¦  «        |fS |	dk    rLt/          ||¦  «        }t3          |j        pg ¦  «        tC          |¦  «        z   |_        t          |¦  «        |fS |	d v rôt;          |¦  «        r!t=          ||¦  «        }t          |¦  «        |fS tU          |¦  «        s|	d!k    r6t          j        d"|¦  «        r!tW          ||¦  «        }t          |¦  «        |fS tY          ||¦  «        }|r t[          |¦  «        rt          |¦  «        |fS t-          ||¦  «        }|	d!k    r d!|_.        t^          d!         |_0        d#|_1        t          |¦  «        |fS te          |¦  «        s|r6t          j        d|¦  «        s!t1          ||¦  «        }t          |¦  «        |fS |	d$k    r!t1          ||¦  «        }t          |¦  «        |fS |dv �rÉ|�rÆt          |¦  «        st          |¦  «        r!t          ||¦  «        }t          |¦  «        |fS t          |¦  «        }|dk    st#          |¦  «        r!t%          ||¦  «        }t          |¦  «        |fS tG          |¦  «        rH|rFt          j        d|¦  «        r1tM          ||¦  «        }tO          ||¦  «        }t          |¦  «        |fS tK          |¦  «        rnt          j        d|¦  «        s|rWt          j        d|¦  «        rBtM          ||p|¦  «        }tG          |¦  «        rtO          ||¦  «        }t          |¦  «        |fS |dk    st'          |¦  «        r3t)          ||¦  «        }d%|› d&|j3        › �|_3        t          |¦  «        |fS |d'v rqtU          |¦  «        stU          |¦  «        r#tW          ||p|¦  «        }t          |¦  «        |fS t-          ||¦  «        }d(|j3        › �|_3        t          |¦  «        |fS |d)k    stI          |¦  «        r!tM          ||¦  «        }t          |¦  «        |fS |dk    r!t/          ||¦  «        }t          |¦  «        |fS |dk    r1t+          ||¦  «        pt-          ||¦  «        }t          |¦  «        |fS |d*v �rti          |¦  «        r!t%          ||¦  «        }t          |¦  «        |fS t          |¦  «        st          j        d+|¦  «        r!t          ||¦  «        }t          |¦  «        |fS |d$k    rt1          ||¦  «        }nl|dk    rt/          ||¦  «        }nU|dk    rtE          ||¦  «        }n>|d)k    rtM          ||¦  «        }n'|dk    rt)          ||¦  «        }nt-          ||¦  «        }d,|j3        › �|_3        t          |¦  «        |fS |	d-v rº|	d)k    r0tI          |¦  «        r!tM          ||¦  «        }t          |¦  «        |fS tY          ||¦  «        }|rt          |¦  «        |fS t-          ||¦  «        }|	|_.        t_          j5        |	d.¦  «        |_0        t3          |j        pg ¦  «        d/gz   |_        t          |¦  «        |fS dS )0zÐReturn analyst markdown + structured insight when we can answer from statements.

    Always aggregates over the full statement job (header + all indexed rows/text),
    never over a vector-chunk sample.
    r^   NÚgeneral>   ÚverifyÚ	follow_upÚexplain_calcr   )Úis_kb_meta_questionz(?i)\bknowledge\s*base\br]   c                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS râ  rG  rå  s     rO   rE  z,try_structured_kb_answer.<locals>.<listcomp>Î	  s,   € ÐCÐCÐC˜1¨¯ª¨h©¬¸7Ò(BÐ(B�QÐ(BÐ(BÐ(BrQ   rî  zDocument Q&Arï  zBUpload a PDF, TXT, MD, or CSV to teach this agent, then ask again.r  r  rÖ  r  r6  r´  r2  >   r   Ú
comparisonr*  r£  rº  u_   Re-checked against the full statement after your challenge â€” not defending the earlier reply.zSPrior answer was set aside; figures below are freshly aggregated from the document.r¬  >   r  r  >   r  rî  rŠ  z(?i)\bpayments?\bz((?i)\b(?:list|payments?|transactions?)\br„  >   r   r  r*  r   z#(?i)\b(biggest|largest|top\s+\d+)\bzSpending insightsrë   u   Following up on â€œrò   >   r   r*  r£  z-Following up on your earlier spend question: r–  >   r2  r   r6  rŠ  r*  rë   r–  z1(?i)\b(missing|incomplete|only\s+\d+|rest\s+of)\bzFollowing up: >   r£  r–  ÚAnalysiszDName a merchant (e.g. Zepto or a person) for a focused payment list.)6re   r   Úapp.saas.knowledge_stater  rX  rb   r�   r   r  rð  r+   r  r  r   r   r¾  rÝ  r   rÕ  r*   rY  r¯  r-  r4  r  rß  rñ   r  r  r   r  r   rÏ  rˆ  r“  r   r   r]  rœ  r   rf   r®  r   r  r°  r   rí   r   rî   rï   r   rð   rÄ  r}   )rÞ  rß  rÕ   r  r  r×  r  rù   Úoriginalrí   Úrewritten_intentÚ_is_kb_metaÚkb_metaÚoverview_askÚinvÚjobsÚdocsrä  ÚemptyrI   rÐ  rÜ  Úfocus_intentr‘  Úparagraph_askÚpayment_contextÚmerchant_insightÚprior_intents                               rO   Útry_structured_kb_answerr,  ¡	  sq  € ð 
ˆ�R×ÒÑ Ô €AØ!Ð& Q×-Ò-Ñ/Ô/€HØð �Xð Øˆtõ
 % XÑ.Ô.€FØ�ÒÐ˜q Hš}˜}°Ð@gÐ1gÐ1gÝ2°1Ñ5Ô5ÐØ˜yÒ(Ð(Ø%ˆFð LÐKÐKÐKÐKÐKàˆk˜(Ñ#Ô#ð  { {°1¡~¤~ð ½Ý
Œ	Ð-¨x¸#©~ÀÑ/AÑBÔBñ:ô :€Gõ +¨8Ñ4Ô4ÐRÕ8OÐPQÑ8RÔ8R€LØð 1�|ð 1Ý  ¨°8Ñ<Ô<ˆØð 	1Ý& sÑ+Ô+¨SÐ0Ð0å$ V¨XÑ6Ô6€DØð ÝŒ9Ð0°(¸S±.À1Ñ2DÑEÔEð 	9ÝÔ,¨V°XÑ>Ô>ˆDØCÐC ÐCÑCÔCˆEØð 
9Ý)Ø(Ø!/Ø6Ø`ØØ!Ø ðñ ô �õ +¨5Ñ1Ô1°5Ð8Ð8Øˆtà
ˆqŒ'€Cð �nÒ$Ð$Õ(=¸hÑ(GÔ(GÐ$ÕK`ÐabÑKcÔKcÐ$Ý  Ñ*Ô*ð 	9Õ.CÀAÑ.FÔ.Fð 	9Ý0°°hÑ?Ô?ˆGÝ& wÑ/Ô/°Ð8Ð8Ý(¨¸^Ð=WÈxÐXÑXÔXˆÝ" 7Ñ+Ô+¨WÐ4Ð4à�hÒÑàÐ* (ˆÝ.¨uÑ5Ô5ˆÝ& xÑ0Ô0ð 	:Õ4OÐPQÑ4RÔ4Rð 	:Ý+¨C°Ñ:Ô:ˆGˆGØ˜]Ò*Ð*Õ.HÈÑ.OÔ.OÐ*Ý'¨¨UÑ3Ô3ˆGˆGØÐ0Ò0Ð0Ý-¨c°5Ñ9Ô9Ð_Õ=SÐTWÐY^Ñ=_Ô=_ˆGˆGØ˜XÒ%Ð%Ý*¨3°Ñ6Ô6ˆGˆGØÐ`Ð`Ð`Ý,¨S°%Ñ8Ô8ˆGˆGØÐ.Ò.Ð.Õ2MÈeÑ2TÔ2TÐ.Ý+¨C°Ñ7Ô7ˆGˆGå-¨c°5Ñ9Ô9ˆGÝ  Ô!2Ð!8°bÑ9Ô9Ømð=
ñ 
ˆÔð ð 	Ý!% gÔ&8Ð&>¸BÑ!?Ô!?ˆGÔØÔ×%Ò%ØØeñô ð õ # 7Ñ+Ô+¨WÐ4Ð4ð 	Ð#Ò#Ð#Ý& xÑ0Ô0ð 	$å& qÑ)Ô)ð 	$õ (¨Õ9TÐU]Ñ9^Ô9^Ð-e¨X¨XÐdeÑfÔfˆÝ" 7Ñ+Ô+¨WÐ4Ð4å˜xÑ(Ô(ð 5Õ,CÀAÑ,FÔ,Fð 5Ý(¨¨hÑ7Ô7ˆÝ" 7Ñ+Ô+¨WÐ4Ð4àÐ#Ò#Ð#Õ'CÀHÑ'MÔ'MÐ#ÕQmÐnoÑQpÔQpÐ#Ý*¨3°Ñ9Ô9ˆÝ" 7Ñ+Ô+¨WÐ4Ð4à�ÒÐÕ"<¸XÑ"FÔ"FÐÝ# C¨Ñ2Ô2ˆÝ# CÑ(Ô(ˆØð 	FÝ $ WÔ%6Ð%<¸"Ñ =Ô =ÀÑ EˆGÔÝ" 7Ñ+Ô+¨WÐ4Ð4ð 	Ð.Ð.Ð.Ý& qÑ)Ô)ð 	/àÐ0Ð0Ð0å# C¨Ñ+Ô+ˆÝ# CÑ(Ô(ˆØð 	FÝ $ WÔ%6Ð%<¸"Ñ =Ô =ÀÑ EˆGÔÝ" 7Ñ+Ô+¨WÐ4Ð4à�Ò Ð Ý% c¨8Ñ4Ô4ˆÝ" 7Ñ+Ô+¨WÐ4Ð4å*¨8Ñ4Ô4ÐQÕ8NÈqÑ8QÔ8Q€Må  Ñ*Ô*ð 		
Ý˜XÑ&Ô&ÐT­2¬9Ð5IÈ8Ñ+TÔ+Tð		
ð ð Øðõ )¨Ñ8Ô8ð ZÝ”9ÐHÈ.ÑYÔYð ð ð 5Ý  Ñ*Ô*ð5å˜XÑ&Ô&ð5å+-¬9Ð5IÈ8Ñ+TÔ+Tð5ð ð5ð
 ˆØð 	#˜^ð 	#°Ð?VÐ0VÐ0VØ"ˆEÝ$ S¨%Ñ0Ô0ˆØð 	?Ý+¨G°XÑ>Ô>ˆGÝ" 7Ñ+Ô+¨WÐ4Ð4å Ñ)Ô)ð 5Ý˜Ñ"Ô"ð5Ý')¤yÐ1EÀxÑ'PÔ'Pð5õ % S¨(Ñ3Ô3ˆÝ" 7Ñ+Ô+¨WÐ4Ð4àÐ$Ò$Ð$Ý)¨#¨xÑ8Ô8ˆØð 	9Ý $ WÔ%6Ð%<¸"Ñ =Ô =Õ@SØ�s 7Ô#7Ð#=¸2Ñ>Ô>ðAñ Aô Añ !ˆGÔõ ' wÑ/Ô/°Ð8Ð8à�ÒÐÝ& s¨HÑ5Ô5ˆÝ  Ô!2Ð!8°bÑ9Ô9Õ<OÐPSÑ<TÔ<TÑTˆÔÝ" 7Ñ+Ô+¨WÐ4Ð4àÐ?Ð?Ð?Ý" 8Ñ,Ô,ð 	9Ý,¨S°(Ñ;Ô;ˆGÝ& wÑ/Ô/°Ð8Ð8Ý'¨Ñ1Ô1ð 	9Ø�jÒ Ð ¥R¤YÐ/UÐW_Ñ%`Ô%`Ð å,¨S°(Ñ;Ô;ˆGÝ& wÑ/Ô/°Ð8Ð8å2°3¸ÑAÔAÐØð 	KÕ 6°xÑ @Ô @ð 	KÝ&Ð'7Ñ8Ô8Ð:JÐJÐJÝ(¨¨hÑ7Ô7ˆØ�ZÒÐØ'ˆGŒNÝ#8¸Ô#DˆGÔ Ø2ˆGÔÝ" 7Ñ+Ô+¨WÐ4Ð4å Ñ)Ô)ð 9¨\ð 9ÝŒyÐ4°hÑ?Ô?ð 	9Ý-¨c°8Ñ<Ô<ˆGÝ& wÑ/Ô/°Ð8Ð8àÐ$Ò$Ð$Ý)¨#¨xÑ8Ô8ˆÝ" 7Ñ+Ô+¨WÐ4Ð4ð Ð-Ð-Ñ-°.Ñ-Ý  Ñ*Ô*ð 	9Õ.CÀAÑ.FÔ.Fð 	9Ý0°°hÑ?Ô?ˆGÝ& wÑ/Ô/°Ð8Ð8Ý.¨~Ñ>Ô>ˆØÐ,Ò,Ð,Õ0KÈHÑ0UÔ0UÐ,Ý+¨C°Ñ:Ô:ˆGÝ& wÑ/Ô/°Ð8Ð8Ý! (Ñ+Ô+ð 	9°ð 	9Å2Ä9Ø7¸ñD
ô D
ð 	9õ )¨¨nÑ=Ô=ˆGÝ+¨G°XÑ>Ô>ˆGÝ& wÑ/Ô/°Ð8Ð8Ý˜HÑ%Ô%ð 	=ÝŒyÐ-¨xÑ8Ô8ð =Øð=Ý#%¤9Ð-AÀ>Ñ#RÔ#Rð=õ -¨S°.Ð2LÀHÑMÔM�Ý)¨(Ñ3Ô3ð GÝ3°G¸XÑFÔF�GÝ*¨7Ñ3Ô3°WÐ<Ð<à˜=Ò(Ð(Õ,FÀ~Ñ,VÔ,VÐ(Ý'¨¨^Ñ<Ô<ˆGàL nÐLÐL¸7¼?ÐLÐLð ŒOõ ' wÑ/Ô/°Ð8Ð8ØÐPÐPÐPÝ+¨NÑ;Ô;ð =Õ?[Ð\dÑ?eÔ?eð =Ý0°°nÐ6PÈÑQÔQ�Ý*¨7Ñ3Ô3°WÐ<Ð<Ý,¨S°.ÑAÔAˆGØ_ÈgÌoÐ_Ð_ˆGŒOÝ& wÑ/Ô/°Ð8Ð8ØÐ/Ò/Ð/Õ3KÈNÑ3[Ô3[Ð/Ý(¨¨nÑ=Ô=ˆGÝ& wÑ/Ô/°Ð8Ð8Ø˜8Ò#Ð#Ý*¨3°Ñ?Ô?ˆGÝ& wÑ/Ô/°Ð8Ð8ØÐ.Ò.Ð.Ý-¨c°>ÑBÔBð ÕF\Ø�^ñGô GˆGõ ' wÑ/Ô/°Ð8Ð8Øð 
ð 
ñ 
õ ! Ñ*Ô*ð =Ý/°°XÑ>Ô>�Ý*¨7Ñ3Ô3°WÐ<Ð<Ý$ XÑ.Ô.ð =µ"´)ØDÀhñ3ô 3ð =õ 5°S¸(ÑCÔC�Ý*¨7Ñ3Ô3°WÐ<Ð<àÐ2Ò2Ð2Ý1°#°~ÑFÔF��Ø Ò)Ð)Ý.¨s°NÑCÔC��Ø Ò0Ð0Ý-¨c°>ÑBÔB��ØÐ!5Ò5Ð5Ý,¨S°.ÑAÔA��Ø Ò.Ð.Ý+¨C°Ñ@Ô@��å0°°nÑEÔE�Ø@¨w¬Ð@Ð@ˆGŒOÝ& wÑ/Ô/°Ð8Ð8àÐ<Ð<Ð<ØÐ)Ò)Ð)Õ.FÀxÑ.PÔ.PÐ)Ý(¨¨hÑ7Ô7ˆGÝ& wÑ/Ô/°Ð8Ð8Ý2°3¸ÑAÔAÐØð 	KÝ&Ð'7Ñ8Ô8Ð:JÐJÐJÝ(¨¨hÑ7Ô7ˆØˆŒÝ4Ô8¸ÀÑLÔLˆÔÝ  Ô!2Ð!8°bÑ9Ô9ØRð=
ñ 
ˆÔõ # 7Ñ+Ô+¨WÐ4Ð4àˆ4rQ   )rI   rJ   rK   rL   )rR   rS   rT   rL   rK   rL   )rW   )rX   rL   rY   rZ   rK   rL   )rI   rJ   rK   rJ   )rI   rJ   rK   rŒ   )rI   rJ   rK   r·   )rI   rJ   rÕ   rL   rK   r   rt   )rI   rJ   rÕ   rŒ   rK   r   )rI   rJ   rK   r  )r  r  rK   r  )rI   rJ   r7  rZ   r8  rL   rK   r9  )rI   rJ   r8  rL   rK   r9  )rI   rJ   rK   r9  )rI   rJ   rK   rO  )rI   rJ   rR  rO  rK   rS  )rÕ   rL   rK   rX  )r>  rJ   rK   rL   )rF  r9  rc  rX  rY   rO  rd  rX  re  rX  rK   rf  )
r}  rZ   r~  rZ   rå   rL   rU  rO  rK   rŒ   )rI   rJ   rR  rO  rK   rŒ   )rI   rJ   r…  rO  rK   r  )rÐ  r   rÕ   rŒ   rK   rJ   )rz  rf  rT   rL   rK   rf  )rÐ  r   rK   rL   )rI   rJ   rÕ   rL   r8  rL   rK   r   )r>  rJ   r8  rL   rK   rX  )rÕ   rL   rK   rŒ   )rI   rJ   rN  r  r8  rŒ   rK   r9  )rF  r9  rK   r9  )rI   rJ   rÕ   rL   rK   r�  )rI   rJ   rK   r  )rÕ   rL   rK   r  )rI   rJ   r×  rŒ   rK   r   )rÞ  rL   rß  rL   rÕ   rŒ   rK   r�  )rÞ  rL   rß  rL   rÕ   rL   r  rŒ   r  rŒ   r×  rŒ   r  rŒ   rK   r  )vÚ__doc__Ú
__future__r   rb   Útypingr   Úapp.models.schemasr   r   r   r   Úapp.pdf.calcr	   r
   r   r   r   r   r   r   Úapp.saas.answer_styler   r   Úapp.saas.conversationr   Úapp.saas.finance_intentr   r   r   r   r   r   r   r   r   r   r   r   r    Úapp.saas.kb_answerr!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   Úapp.saasr,   r  r  r-   r.   r/   r0   rg  rß  rN  rz  rP   rV   ri   r‹   r“   r¶   rÔ   rþ   r  r  r6  r?  rA  r   r€   rK  rN  rQ  rW  r  r[  ru  r]  r_  rb  r{  r�  rƒ  rˆ  rÏ  rä  r´  rð  rü  r  r  r-  r4  rY  rP  r\  rO  r°  rM  r“  rœ  r°  r¯  r¾  rk  rÄ  rÕ  rÝ  r  r,  r¥   rQ   rO   ú<module>r7     s#  ðØ dÐ dà "Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð PÐ OÐ OÐ OÐ OÐ OÐ OÐ OØ 7Ð 7Ð 7Ð 7Ð 7Ð 7ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð #Ð "Ð "Ð "Ð "Ð "Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6à 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2ð ØØØØØØØØØØØðð €ð ˆt�K×$Ò$Ñ&Ô&Ñ'Ô'€ð1ð 1ð 1ð 1ð2ð 2ð 2ð 2ðEð Eð Eð Eð Eðð ð ð ð4ð ð ð ð(7ð 7ð 7ð 7ðt;ð ;ð ;ð ;ð|ið ið ið iðXIð Ið Ið Ið IðXð ð ð ð*8ð 8ð 8ð 8ðv	ð 	ð 	ð 	ð	ð 	ð 	ð 	ðEð Eð Eð Eð
Dð Dð Dð Dðð ð ð ðOð Oð Oð Oðð ð ð ðð ð ð ð ð �”
ðñô €ð €ð6ð 6ð 6ð 6ðfð fð fð fðð ð ð ð ØØØð$ð $ð $ð $ð $ð $ðV ØðHð Hð Hð Hð Hð Hð2ð ð ð ð ð
 IMð ð ð ð ð ð ðsð sð sð sð sðl9ð 9ð 9ð 9ð 9ðx
ð 
ð 
ð 
ð$ð $ð $ð $ðBGð Gð Gð GðTð ð ð ð ðD]ð ]ð ]ð ]ð ]ð@_ð _ð _ð _ð _ðDð ð ð ð ðBhð hð hð hðVnð nð nð nðbð ð ð ð
"ð 
"ð 
"ð 
"ð" ð	&ð &ð &ð &ð &ð &ðRð ð ð ð0Kð Kð Kð Kð Kð\Jð Jð Jð Jð JðZDð Dð Dð DðNLð Lð Lð Lð`0ð 0ð 0ð 0ð 0ðf%3ð %3ð %3ð %3ðP
ð 
ð 
ð 
ðRð Rð Rð Rðp "&ð0ð 0ð 0ð 0ð 0ð 0ðf~ð ~ð ~ð ~ð ~ðL %)Ø"Ø!%Ø#ðuð uð uð uð uð uð uð urQ   