Files
FXandRatesDashboard/__pycache__/generate.cpython-312.pyc
T

253 lines
32 KiB
Plaintext
Raw Normal View History

2026-04-12 20:13:22 +00:00
Ë
JüÛiþrã óºdZddlZddlZddlZddlZddlmZmZddlmZddl Z ddl
Z ejjdd«Zejjdd«Zejjdd«Zd Zd
dd d d
dœddddœddddœdddœdœZddddddddddddœ Zddiddid did!did"did#œZd$d%d&d'œd(d%d)d'œd*d%d+d'œd,d-d.d'œd/d0d.d'œd1d2d.d'œd3d%d.d'œd4œZid5d6d7d%d8œd9d:d;d%d8œd<d=d>d%d8œd?d@dAd-d8œdBdCdDd-d8œdEdFdGd-d8œdHdIdJd0d8œdKdLdMd0d8œdNdOdPd0d8œdQdRdSd2d8œdTdUdVd2d8œdWdXdYd2d8œdZd[d\d0d8œd]d^d_d0d8œd`dadbd0d8œdcddded0d8œdfdgdhdid8œdjdkdid8œdldmdnd8œdodpdnd8œdqdrdsd8œdtdudsd8œdvdwdxd8œdydzd{d8œd|d}d~d8œdœ¥Zd€dddƒœd„d…d‚dƒœd†d‡dˆdƒœd‰dŠdˆdƒœd‹dŒddƒœdŽdddƒœd‘d’d“dƒœd”d•d“dƒœd–œZid—d˜“d™dš“d›dœ“ddž“dŸd “d¡d¢“d£d¤“d¥d¦“d§d¨“d©dª“d«d¬“d­d®“d¯d°“d±d²“d³d´“dµd¶“d·d¸“d¹dºd»d¼œ¥Zd½d¾d¿dÀdÁœZidÂdÓdÄdÅ“dÆdÇ“dÈdÉ“dÊdË“dÌdÍ“dÎdÏ“dÐdÑ“dÒdÓ“dÔdÕ“dÖdדdØdÙ“dÚdÛ“dÜdÝ“dÞdß“dàdá“dâdã“dädådædçdèdédꜥZdë„Zdödì„Zd÷dí„Zdødî„Zdùdï„Zdð„Z dñ„Z!dò„Z"dødó„Z#dô„Z$e%dõk(re$«yy)úué
FX RADAR — Data Generation Pipeline
Fetches global yields, commodities, ETFs, vol data, FX, and news.
Outputs data.json which the HTML dashboard reads.
Run locally: python generate.py
Run via GitHub Actions: automatic on schedule
éN)ÚdatetimeÚ timedelta)ÚPathÚ FRED_API_KEYÚÚFINNHUB_API_KEYÚ GOV_API_KEYz data.jsonú^IRXú^FVXú^TNXú^TYX)Ú1MÚ2YÚ5YÚ10YÚ30Y)rrr)rr)ÚUSÚUKÚGermanyÚJapanrÚ3MÚ6MÚ1YrÚ3YrÚ7YrÚ20Yr) ÚDGS1MOÚDGS3MOÚDGS6MOÚDGS1ÚDGS2ÚDGS3ÚDGS5ÚDGS7ÚDGS10ÚDGS20ÚDGS30ÚIRLTLT01DEM156NÚIRLTLT01GBM156NÚIRLTLT01JPM156NÚIRLTLT01CAM156NÚIRLTLT01AUM156N)ÚEurozonerrÚCanadaÚ AustraliazUS 20Y+ TreasuryrÚlong)ÚnameÚcountryÚdurationzUS 7-10Y TreasuryÚmediumzUS 1-3Y TreasuryÚshortzUK GiltsrÚmixedzEurozone Govt Bondsr-zJapan Govt BondsrzUS Total Treasury)ÚTLTÚIEFÚSHYzIGLT.LzIBGL.LÚJGBSÚGOVTz
US2Y.GBONDÚus2yzUS 2Y)ÚkeyÚlabelr2z US10Y.GBONDÚus10yzUS 10Yz US30Y.GBONDÚus30yzUS 30Yz
UK2Y.GBONDÚuk2yzUK 2Yz UK10Y.GBONDÚuk10yzUK 10Yz UK30Y.GBONDÚuk30yzUK 30Yz
DE2Y.GBONDÚde2yz
Germany 2Yz DE10Y.GBONDÚde10yz Germany 10Yz DE30Y.GBONDÚde30yz Germany 30Yz
JP2Y.GBONDÚjp2yzJapan 2Yz JP10Y.GBONDÚjp10yz Japan 10Yz JP30Y.GBONDÚjp30yz Japan 30Yz
IT2Y.GBONDÚit2yzItaly 2Yz IT10Y.GBONDÚit10yz Italy 10Yz FR10Y.GBONDÚfr10yz
France 10Yz ES10Y.GBONDÚes10yz Spain 10Yz
CA2Y.GBONDÚca2yz Canada 2Yr.Úca10yz
Canada 10YÚau2yz Australia 2Yr/Úau10yz
Australia 10YÚnz2yzNew Zealand 2Yz New ZealandÚnz10yzNew Zealand 10YÚch10yzSwitzerland 10YÚ SwitzerlandÚse10yz
Sweden 10YÚSwedenÚno10yz
Norway 10YÚNorway)z CA10Y.GBONDz
AU2Y.GBONDz AU10Y.GBONDz
NZ2Y.GBONDz NZ10Y.GBONDz SW10Y.GBONDz SE10Y.GBONDz NO10Y.GBONDÚgoldÚGoldz$/oz)r=r1ÚunitÚsilverÚSilverÚwtiz WTI Crudez$/bblÚbrentz Brent CrudeÚnatgasz Natural Gasz$/MMBtuÚcopperÚCopperz$/lbÚwheatÚWheatu¢/buÚcornÚCorn)zGC=FzSI=FzCL=FzBZ=FzNG=FzHG=FzZW=FzZC=FÚSPYzS&P 500ÚQQQz
Nasdaq 100ÚIWMz Russell 2000ÚEEMz EM EquitiesÚFXIzChina Large CapÚEWJzJapan EquitiesÚEWZzBrazil EquitiesÚEWGzGermany EquitiesÚEWUz UK EquitiesÚUUPzUS Dollar IndexÚFXEzEuro ETFÚFXYzYen ETFÚFXBzGBP ETFÚFXAzAUD ETFÚFXCzCAD ETFÚGLDzGold ETFÚUSOzOil ETFzAgriculture ETFz
Energy SectorzFinancials Sector)ÚDBAÚXLEÚXLFzVIX (S&P 500 Vol)zVXN (Nasdaq Vol)zMOVE (Bond Vol)zVIX Short-Term ETF)z^VIXz^VXNz^MOVEÚVIXYzEURUSD=XÚEURUSDzGBPUSD=XÚGBPUSDzUSDJPY=XÚUSDJPYzUSDCHF=XÚUSDCHFzAUDUSD=XÚAUDUSDzNZDUSD=XÚNZDUSDzUSDCAD=XÚUSDCADzUSDSEK=XÚUSDSEKzUSDNOK=XÚUSDNOKzUSDCNY=XÚUSDCNYzUSDMXN=XÚUSDMXNzUSDBRL=XÚUSDBRLzUSDZAR=XÚUSDZARzUSDINR=XÚUSDINRzUSDKRW=XÚUSDKRWzUSDTRY=XÚUSDTRYzUSDPLN=XÚUSDPLNÚUSDHUFÚUSDCZKÚUSDSGDÚUSDIDRÚUSDTHBÚDXY)zUSDHUF=XzUSDCZK=XzUSDSGD=XzUSDIDR=XzUSDTHB=XzDX-Y.NYBcóDtsy d|}tddddœ}tj||d¬«}|j«|j «}t |t «rt|«d kry|d
}t|«dk\r|d nd}|jd «}|r|jd «nd}||t||z
d «nd} |||d
k7rt||z
|z d
zd «nd}
|| |
|jd«dœS#t$r} td|d| «Yd} ~ yd} ~ wwxYw)z8Fetch latest EOD data from EODHD for a bond/rate symbol.Nzhttps://eodhd.com/api/eod/ÚjsonÚ)Ú api_tokenÚfmtÚorderÚlimité©ÚparamsÚtimeoutérÚcloseéédÚdate)ÚvalueÚchangeÚ
pct_changer¤z EODHD error (ú): ) ÚGOV_KEYÚrequestsÚgetÚraise_for_statusr•Ú
isinstanceÚlistÚlenÚroundÚ ExceptionÚprint) ÚsymbolÚurlržÚdataÚlatestÚprevr¥Ú
prev_valuer¦Úes ú generate.pyÚfetch_eodhd_eodr¼¬sDå ØðØ*¨6¨(ÐÜ&¨vÀÈaÑPˆÜ L‰L˜ V°RÔ Ø ×ÑÔØv‰v‹xˆÜ˜$¤Ô¨T«°QªØØa‘ˆÜ˜d›) qš.ˆtAŠw¨dˆØ
˜7Ó#ˆÙ*.T—XX˜&°Dˆ
Ø16Ð1BÀzÐG]”u˜)¨1Ô-ÐcgˆðÐ  ZÐ%;À
ÈaÂô
5˜:ÑÑ3°cÑ9¸1Ô ð ð ØØ—JJ˜
ð
øô òÜ
 ˜x s¨1¨#Ðûðús‰A&C;Á0B
C;Ã; DÄDÄDcó¦tstd|«y d}|tdd|dœ}tj||d¬«}|j «|j «}|jd g«Dcgc]
}|d
d k7sŒ |Œ}}|rt
|d d
«Std
|«ycc}w#t$r}td|d|«Yd}~yd}~wwxYw)z!Fetch latest value from FRED API.z FRED key missing for Nz3https://api.stlouisfed.org/fred/series/observationsr•Údesc)Ú series_idÚapi_keyÚ file_typeÚ
sort_orderré
rÚ observationsr¥ú.rz No valid FRED obs for z FRED error (r¨)ÚFRED_KEYr²r•Úfloatr±) r¿rr´Úobsrºs Ú
fetch_fredrÊÍå Ü
РðàØØ Øñ 
ˆô
L‰L˜ V°RÔ Ø ×ÑÔØv‰v‹xˆØŸ(™( >°2ÓLQ¸!¸G¹*ÈÓ:KŠqÐРܘ˜Q™ Ó 
Ш Ð ùò
Møô ò
˜y˜k¨¨Q¨CÐ ûð2ús6—AB,Á1
B'Á?B'ÂB,ÂB,Â'B,Â, CÂ5C à Ccó¼i}t|j««} tj||dd¬«}|D}||} t |«dk(r|d}n|d|}|j «}t |«dk\rt
t|jd«d«} t |«dk\r"t
t|jd «d«nd
}
|
r|
d kDrt
| |
z dz
d zd«nd
} | |
| t|jd«d
œ||<ŒÖ |S#t$r} td|d| «Yd
} ~ Νd
} ~ wwxYw#t$r} td| «Yd
} ~ |Sd
} ~ wwxYw)z;Fetch quotes from Yahoo Finance for a dict of ticker: name.FT©ÚperiodÚprogressÚthreadsr ÚCloseéÿÿÿÿr¢r—éþÿÿÿNr)ÚpriceÚ
prev_closeÚ
change_pctÚ timestampz yfinance parse error (r¨z yfinance batch error: )
ÚkeysÚyfÚdownloadr¯Údropnar°ÚilocÚstrÚindexr±)
Ú tickers_dictrÍÚresultsÚ ticker_listr¶Útickerr1Ú close_seriesÚclosesÚlastr¸Úchgrºs
Úfetch_yf_quotesræçs{à€GÜ+€Kð{‰{˜;¨vÀÈtÔà Aˆ Ñ'ˆ
AÜ# (Ø#'¨¡=Là#'¨¡=°Ñ#8%×.Üv“; !Ò ¤ v§{¡{°2¡Ó!7¸Ó;DÜ?BÀ6»{ÈaÒ?Oœ5¤ v§{¡{°2¡Ó!7¸Ô;ÐUYDÙ?CÈÈqÊœ% ¨¡¨q¡°CÑ 7¸Ô;ÐVZ"&Ø&*Ø&)Ü%(¨¯©°bÑ)9Ó%:ñ %G˜DMøñ Að6 €Nøô
ò
AÜа¸¸A¸3Ð@ûð
Aûô ò
ШР€Nûð.úsB#D9ÁC DÄ
D9Ä D6ÄD1Ä,D9Ä1D6Ä6D9Ä9 EÅEÅEcóŠi}t|j««} tj||dd¬«}|D]9}||} t |«dk(r|dj «}n|d|j «}t |«dkrŒQt
|jd«}t |«dk\rt
|jd«nd } t |«d
k\rt
|jd «nd }
t |«d k\rt
|jd
«nd } t|d«| rt|| z dz
dzd«nd |
rt||
z dz
dzd«nd | rt|| z dz
dzd«nd dœ||<Œ< |S#t$r} td|d| «Yd } ~ Œ`d } ~ wwxYw#t$r} td| «Yd } ~ |Sd } ~ wwxYw)z9Fetch longer history for calculating 1W, 1M, YTD changes.FTrÌr r—éúÿÿÿééêÿÿÿr¢©Úd1_pctÚw1_pctÚm1_pctz History parse error (r¨z History batch error: ) r×)
r1Úd1Úw1Úm1rºs
Úfetch_yf_historyróà€GÜ+€Kð{‰{˜;¨vÀÈtÔà @ˆ Ñ'ˆ
@Ü# ! '™]×3! '™]¨6Ñ2×;v“; ’?Øä˜VŸ[™[¨™_Ó-Ü/2°6«{¸aÒ/?”U˜6Ÿ;™; r™?Ô+ÀTÜ/2°6«{¸aÒ/?”U˜6Ÿ;™; r™?Ô+ÀTÜ03°F³ ¸rÒ0A”U˜6Ÿ;™; ,Àtô# ^ÙACœe T¨B¡Y°¡]°cÑ$9¸ÙACœe T¨B¡Y°¡]°cÑ$9¸ÙACœe T¨B¡Y°¡]°cÑ$9¸ñ !˜
ñ! @ð8 €Nøô
ò
@ÜШx°s¸1¸>×?ûð
@ûô ò
Р+× €Nûð-úsO$F ÁAE8ÂF  C)E8Å2F Å8 FÆFÆF ÆFÆF Æ GÆ)F=Æ=Gc
ó‚tsgS d|dt}tj|d¬«}|j«}|ddDcgc]J}|jdd«|jd d«|jd
d«|jd d «|d
œŒLc}Scc}w#t$r}t d|«gcYd}~Sd}~wwxYw)zFetch news from Finnhub.z(https://finnhub.io/api/v1/news?category=ú&token=réÚheadlinerÚsourcer´rr©r´rÚcategoryz Finnhub news error: )Ú FINNHUB_KEYrªr•)r´ÚarticlesÚarºsÚfetch_finnhub_newsrÿ5å Øˆ ðظ
À'Ì+ÈÐÜ L‰L˜ bÔ Ø—6‘6“8ˆð˜c˜r 
ðð
ŸE™E *¨bÓŸ%™% ¨"Ó—uu˜U ŸE™E *¨aÓ 
ò 
ð
ùò 
øô òÜ
Ð& q  ûðús0Š:BÁABÂBÂBÂ B>Â$B9Â3B>Â9B>c
ó\tsgS tj«jd«}tj«t d¬«zjd«}d|d|dt}t j |d¬«}|j«}|j
d g«}|d
d Dcgc}|j
d d
«d
d|j
d d
«dd|j
dd
«|j
dd
«|j
d«|j
d«nd|j
d«|j
d«nd|j
d«|j
d«nd|j
d«dk(rdnddœŒÑc}Scc}w#t$r}td|«gcYd
}~Sd
}~wwxYw)z%Fetch economic calendar from Finnhub.ú%Y-%m-%dé)Údaysz1https://finnhub.io/api/v1/calendar/economic?from=z&to=rõÚeconomicCalendarNé(Útimeré ér2Úeventr¸õ—ÚestimateÚactualÚimpactÚhighÚredÚorange)rÚctryÚevr¸ÚfcastÚactÚimpz Finnhub calendar error: )
rÚnowÚstrftimerr•)ÚtodayÚfuturer´ÚeventsrºsÚfetch_finnhub_calendarrLå Øˆ ðÜ ×
ÓÜ—,,“.¤9°!Ô#4Ñ4×>¸JˆØAÀ%ÀÈÈVÈHÐT[Ô\gÐ[hÐÜ L‰L˜ bÔ Øv‰v‹xˆØÐ,¨bÓð˜C˜R 
ððŸ˜f bÓ)¨#¨2П˜f )¨"¨RП˜i¨Ó—e‘e˜G RÓ(Ø)*¯©¨v«Ð)B˜Ÿ˜fœ
ÈØ./¯e©e°JÓ.?Ð.K˜Ÿ˜*ÐQYØ*+¯%©%°«/Ð*Eq—u‘u˜X”È8Ø !§¡ h£°6Ò 9‘u¸xó
ò 
ð
ùò 
øô òÜ
Ð*¨1¨#Ð ûðús1ŠB"FÂ,CFÆFÆFÆ F+ÆF&Æ F+Æ&F+có ddlm}d}dddœ} t j
||d¬ «}|j
«td
|jd t|j««||jd «}g}|jd
«D]T}|jxsd}d|vsŒd|vsŒtj|«}|j di«j dg«}n|s
td«gSg} |D}
|
j dd«} |
j dd«} |
j dd«}
|
j d«}|
j d«}|
j d«}|
j dd«}|
r|
ddnd}t|
«dkDr|
ddnd}d}| |ž tt|«j!d d«j!d!d««}tt|«j!d d«j!d!d««}|
j d"d«}|r||kDrd#n||krd$nd%}n||krd#n||kDrd$nd%}|d&k\rd'n|d(k\rd)nd)}| j'||d*| | rd+| d,ndz| t|«nd-| t|«nd-| t|«nd-||d.d/œ
«Œ¢td0t| ««| dd1S#t$rtd«gcYSwxYw#t"t$f$rYŒ«wxYw#t($r}
td2|
«gcYd}
~
Sd}
~
wwxYw)3uQFetch economic calendar from Finviz — data is embedded as JSON in a script tag.r)Ú
BeautifulSoupu0 bs4 not installed — skipping Finviz calendarz https://finviz.com/calendar.ashxz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36zen-GB,en;q=0.9)ú
User-AgentzAccept-Languageé)ÚheadersrŸz Finviz status: z, html length: z html.parserÚscriptrÚentriesÚ
calendarIdr¶z' Finviz: no JSON entries found in pager Ú referencer¤r ÚforecastÚpreviousÚ
importancer NrÃrrúisHigherPositiveÚbeatÚmissÚinlineérr—rõ🇺🇸ú)r
Úfinviz)
rrrr¸rrrr+z Finviz parsed rows: é<z Finviz calendar error: )Úbs4rÚ ImportErrorr²Ú status_coder¯ÚtextÚfind_allÚstringr•ÚloadsrÇÚreplaceÚ
ValueErrorÚ TypeErrorÚappendr±)rr´r Úsoupr"r!Útxtr¶ÚrowsrºÚev_nameÚrefÚdtr r%r&r'Údate_strÚtime_strr+Úa_valÚf_valÚ higher_goodrsÚfetch_finviz_calendarrJis7ðÝ
-€Cà€Gð
CÜ L‰L˜ g°rÔ Ø ×ÑÔÜ
Ð! !§-¡- °ÄÀAÇFÁFà ¸}ИQŸV™V ]ÓðˆØ—m‘m HÓ ˆFØ—-‘-Ò% 2ˆCؘCÒ L°CÒ$7Ü—z‘z #“ØŸ(™( 6¨2Ó2°9¸bÓAÙð  ñÜ Ð ˆˆØó' ˆ—ee˜G (ˆ—%‘%˜  RÓ(ˆv˜"ˆBØ—UU˜8“_ˆFØ—u‘u˜ZÓ(ˆHØ—u‘u˜ZÓ(ˆHØŸ˜|¨QÓ/ˆJá"$r˜#˜2w¨"ˆHÜ$'¨£G¨b¢Lr˜"˜Ry°bˆˆÐ! hÐ&:ð Ü!¤# f£+×"5Ñ"5°c¸2Ó">×"FÑ"FÀsÈBÓ"OÓP!¤# h£-×"7Ñ"7¸¸RÓ"@×"HÑ"HÈÈbÓ"QÓREØ"#§%¡%Ð(:¸AÓ">"Ø).°ª™vÀuÈuÂ}¹VÐZb™à).°ª™vÀuÈuÂ}¹VÐZb˜ðš?%¸ZÈ1º_±ÐRZˆ K‰KØ Ø Ø ˜ ±S¨¨3¨%¨q¡k¸AØ)1Ð)=œ˜
À5Ø*2Ð*>œ˜ÀEØ&,Ð&8”s˜6”{¸ØØ ö
ð9' ôR Ð&¤s¨4£y CRˆyÐøôS òÜ
Њ ðûôl#¤IÐÙðûô* òÜ
Ð)¨!¨Ð ûðúsiJ5BK&Â$K&Â)AK&Ã2B'K&ÆBKÈ7A=K&Ê5KË
KËK#Ë K&Ë"K#Ë#K&Ë& L Ë/LË>L ÌL c
óDddlmcm}ddg}g}|D\}} tj|dddi¬«}|j |j «}|jd «ddD]€}|jd
d «}|jd d «} |jd
d «}
ttj|
d«j««} |sŒj|j||| | ddœ«Œ‚ŒÔ|S#t$rd} YŒ-wxYw#t$r} td|d| «Yd} ~ Œd} ~ wwxYw)z3Fetch news from free RSS feeds (no API key needed).rN)z:https://feeds.content.dowjones.io/public/rss/mw_topstoriesÚ MarketWatch)z.https://feeds.bbci.co.uk/news/business/rss.xmlz BBC BusinessrÃrz FXRadar/1.0)r z.//itemÚtitlerÚlinkÚpubDatez%a, %d %b %Y %H:%M:%S %ZÚgeneralrúz
RSS error (r¨)Úxml.etree.ElementTreeÚetreeÚ ElementTreerªÚ
fromstringÚcontentÚfindallÚfindtextÚintrÚstrptimerÖr>)
ÚETÚfeedsrýr´ÚrootÚitemrMrNÚpubÚpub_tsrºs
Úfetch_rss_newsr`½s@ç VØ
€Eð€HØò2‰ ˆˆVð ˜S¨"°|À]Ð6SÔTˆ—=‘= §¡Ó+ˆDØŸ  YÓ°Ð
ØŸ
 g¨rÓ2Ø—}} V¨RÓ0Ø—m‘m I¨rÓ2ðÜ ¤×!2Ñ!2°3Ð8RÓ!S×!]Ñ!]Ó!_Ó`Ø—OOØ$)Ø"(Ø#Ø$*Ø$-ñ %õñ
ð 2ð, €OøôØ’Fðûôò M & ¨¨Q¨CÐ0× 1ûð 2úsB™BC:Â-C)à C:à C:Ã) C7Ã4C:Ã6C7Ã7C:Ã: DÄDÄDcó˜ tj||dd¬«}|dj«}t|«dkryt |j
d«}t|«dk\rt |j
d«nd}t|«dk\rt |j
d «nd}t|«d
k\rt |j
d «nd}t
|d «|rt
||z d
z
dzd«nd|rt
||z d
z
dzd«nd|rt
||z d
z
dzd«dœSddœS#t$r} td|d| «Yd} ~ yd} ~ wwxYw)zEFallback: fetch a single ticker individually if batch download fails.FrÌr—NrÑr z Single ticker history error (r¨) rØ)
r1s
Úfetch_single_ticker_historyrbßsIðÜ{‰{˜6¨&¸5È%ÔPˆØg×Ü ˆv‹;˜Š?ØÜV—[[ %ˆÜ'*¨6£{°aÒ'7ŒU6—;;˜r
#¸TˆÜ'*¨6£{°aÒ'7ŒU6—;;˜r
#¸TˆÜ(+¨F« °rÒ(9ŒU6—;;˜
$¸tˆä˜4 “^Ù9;”e˜T B™Y¨™]¨cÑ1°1ÔÙ9;”e˜T B™Y¨™]¨cÑ1°1ÔÙ9;”e˜T B™Y¨™]¨cÑ1°1Ó
ð
ðBFñ 
ð
øô òÜ
Шx°s¸1¸#Ðûðús#:D%½C#D%Ä!D%Ä% E Ä.EÅE có”‡/—td«tdtj«jd««td«tj«j «dziiiiiiggiiiiidœ}td«i}t j«D]>\}}t|«}||||<td|d|d «tjd
«Œ@|jd «|jd «|jd
«|jd«|jd«|jd«|jd«|jd«|jd«|jd«|jd«dœ |dd<td«tj«D]—\}}i}|j«D]A\}}t|«}||||<td|d|d|d «tjd
«ŒC|sŒ_|jd«|jd«|jd«dœ|d|<Œ™td«tddd d!d"œ«}|j«D]\Š/} td‰/d| d#«Œ|djdi«}
|
jd$«|jd«r |dd#|
d$<|
jd%«|jd«r |dd#|
d%<|
jd&«|jd «r |d d#|
d&<|
jd'«|jd!«r |d!d#|
d'<|
jd(«€ûtd)« d*D]b} tj| d+d,¬-«} | j rŒ(| d.j#«}
t%|
«d/kDsŒJt'|
j(d0«}n|
jd(«€w|
jd$«}|
jd%«}|-|+t-|||z
d2zzd3«|
d(<td4|
d(d «n&|$t-|d5z
d3«|
d(<td6|