From d1a222d9e9cc9e0371964334956b77d9c6d1a2cc Mon Sep 17 00:00:00 2001 From: zzlgreat Date: Tue, 2 Dec 2025 12:22:49 +0800 Subject: [PATCH] update pay ui --- __pycache__/app_vx.cpython-310.pyc | Bin 132393 -> 153340 bytes app_vx.py | 500 +++++++++++++++++++---------- 2 files changed, 331 insertions(+), 169 deletions(-) diff --git a/__pycache__/app_vx.cpython-310.pyc b/__pycache__/app_vx.cpython-310.pyc index 59b31b8a914168b2d3c26b6b4be9a118d29fbd18..a772109ee2d7c6e92cb3ec8068c592a8f3d63b68 100644 GIT binary patch delta 62052 zcmbTf34B!5**`w#&YG35hke+I?1-R|eG?Uf0xn$97;*US(WR zgF9}ZQ9*EP?Y{SIt95LvZAl>AY;CQ+*5&{GKKEv3GDP40{>kS)_uR8D&v~BbJm)!Q z4($qj_Doi+CND4Bg};y2O{j=2^SJ)VkMuu=&cPG8wwudkxC|9`>GoUcD&(rvn%#zG zxDRU0o`WvKvtHA^A#bF=;SH%u-$s{tZbJc5`NICHfF4k;P@p;MpbPJ8!@pgrnCnVc zb)Lr+%Bi2O;4J|G1h`hZs?{dDpj-L2f!~keEWMtW8#$; z9$7U?A5}G4A6+#@A5&GN7ge35pH($hA6qp}A6GSAA73>=pHMYXpI9|XpHwwjpR8OB z0c4VolvDI6iftS&ZTzv_Mue&GNPQ&U-NI*AP1UD5g`cCJbAih!FuLz>8Qnv%soUN9 zw9vHeuF%NRDaj7$5uRRku70j0=@~w+s#q_sI$uA(YKA_eYNkH3YL-5$YPLRG!h411 zRL#}rR?XAr$#?JY{Hg`|0&({VFRWUmFA{g(@C8+i^~K^Y3}0Avk$#bK#ZbR~;ft%5 z=u0G^fB2HB61_y+1HwzIF4Zp;_rUOFRhQ|PRV~w(RSnRWi{GH|imJ=?%d4)?uaIvQ zzEZyu`3(+VRkc#r#cxRX>Z(=xs;X=BYpSl*uNA*w_?)Uzy|n5&{W>5A5)2KORjt-n zJDHU07c!q^ z%tq$3k@=3$4rF|zF-Jn@&Ttv?#5EtTB5^H9x)#EHT(FuS57seUEXqew$II?=@EI`;1t*e!D|q3?p<< z)9-M;))<~NdSf+A3|ad$ljy3#cj|YB?rgp*bO#1!e`tSmoYclxD@CqD(fh?!f#NE~ zwH|((o9{Nlp*v8Ws{7psF(}oZ&^<;q#%G(t+&vF-_nv)P{j18Q-;23D4hilvYC`uS zL9Ly@*pMv1Re7NKepK{8^8=v=4=TevXtywef?So&5--vZ!(l{;Nmqi>8A`wR>U*ob z_InfQ9tSJ7-KayNWyVHh(;gcKHlyD5*w({kk7xs2*GsmIh~3}V0`xi5mv=^+zjQ_P^0|z*F{E=v*S9{&;Avyq^da%lnYAHFT)-$yjKCWIMN?3z41* zp}5fFK)k1oYxHM~ZThpucKvV&$Rv2Y!?+RneZ;uQxEb%~fT}xI#vZ(1G;TBY;{B4bFLcznJ#=i1$GF3=c6juc_bKBR<1Qn%e}~eK8*$@q zL_2{D?=kL0hWCcfmn=Q{EAYF|H~_x`P9d+t=YHb>_&nhFyat~Kjb`{XJ3g<&=b-Tr zd>(Rq-hj`;#v|}~#PRtCd>)M%kHPCP$LpK$dfa#dK2JD4Z^Gx0@g#hnbbP)ApQntc z;q$cP^KJM%V>}C=XC0sKz~``W1U^R`pYOuwIpcZwJn#5?4?ZnM>;-te;COu>UN0Ii z!RIB%=Lg17;~0A8hsMjsalC(IoG@O&`^Uzs#%p;01cUce<8|YWwaWO$9xZgl_@?pZ z4h$s*^JfzFt+cRj8{culelB6(HNF>1Cj7qf11Io*B=CpE_mW{hGJfoY{lfT(@lzE1 zONsNdj?9gp8~?)?`maK<=ARnBz?}G{@hkCp%XrIp8!6s4er>#i_pi~&gz+vK`7Rn6 zBig(JuiqHIh1YMLb|)nJ-=$UIJ>z|+3hzqT?~OMQsyVIxgYicv^fwZEGA(7R(dLBx z);MLHMiqW1aoQOt=49|ET|CSW3;{S2d{}bbX#lOw?)c6n5os#g+5FV3pGd?%IkO-%ZFEKG( zh|-R?!lS|cCsqk=&@Dg@9Vm^yMJ2j z0SFr?vH#_S4l-g6k|Ag?o*@$a5nMq$Ls9I%ov6doG8&Gs5fbxbCv;?5=qQAame5a} z&@pNKP=wI4B=mn78pG$BNq? zc;?BM2G@K%3*^fU*FrptGw5ITa;tMII33~70e6G!h9 z=W4`Rm5h^HfnF)gGce|5MDT0yTq{-V=A$+=fDtP){p|9S+5oxt8w*FNy6!c#4E z?aKs}oLDt@YMq$bP8{T9}{oEvniFfdB{QJq6ejILl3(4=0kq| z;dY8;i_rOfu0#brE{|(FN~_MA?Aqs#Oxpyp1@b?afl@>e^&5uPTtLwa+224ZjqTDg z-$M)?fn=zlf&S1(;@yPzD2id|?9qrb5*_L{%`~4;whzPbj9P;^p%1V2IVEg8sIdN{ zXo$?VIfab54=pjaJ72@(YX`oDBkS7{a$_|o)=l@h?)R~RGB_kEH+Q7(NXay8y|HtT zmkn7i&zM`4%hk@+cZr^T`SRGp(hC+|v9M%C!n>v{90?^nQL`?T@U0DP3{^*qRKizP zQ@uV^UpEvf{&3*N-~|#8w0(oMWzq6=!PcYCw;sRq)SXY%jc2TTn?E?Vw6cIt;OtJ1p@8zzd zk%_|j;fnJ0i)-p4q4_n{)uHleMNRdkXh_|7jCFPpf2kP3)2~0!cH5(E&ozJW%Ffn@ z9%y~#_^DfVe(=gI5^sF4?asq(ySLhrS|8biLB+teZ+*S>#y#y1-G1ujt*txnYdvv% zV*8!3rnbXQ#4ggFe(A=x_)D#K>~7uqXzTH#Z4WoKJ@{xB@!AeFwLbEA>oa$^y>J2v z+T$;vUhQ{3-}cNyt=nI0J#x&hN@fLH_uUq2-FxKp%}=)OdZO*vji>hA1k`Ff@Sq*N zb3qcR{pLLgLxt!#e3ujB)bZC(J#i~AwDra(#H*dksP@4GGYH0Uy13yg&j;xEqdS%b zFdt9kdjO59(N*ed)BshZ8>X0J*^Rk? zIgNRMxzRkN@b|@x-NStI4d&Y|TCm-PclQdy9x-|KG+0 z4|j?Kls1clK*F}2M_c#p=@b^LEsI1p)tE+cu=Vgwr<%8R3N^~2Wvj~~q2gfMT}RsX zJllHQ%FG}+*Nan=qOJK@>+9Qzkw^9t5g*!NI=3BvsP*RKX=!%0HJwO)24@D7MF+=r${>}yojGWfGoMSN6;+{{I`r7-+m5#G z#c0GhkL_ueoH(Z*zauk?4Rs;2K9w4?@buw_{_kY#LS^CTy3+D>q4M>m6`+*n#WW zO)%P?J_t-o7GI=d2|pT1USWbpxE7VvjUz!w(&7|Swcohs)T__7KD)bZ=f2|9*w1X} zHm=j?Cp|iPYi2@4ih>CbCso4336t<}N+bfn{g@zsBG7^9<_Z*VUJj7xk=FAL-X!um zAwr^emjj&W`xWDsD9G&UL@bAKo!&DSuv~8`5j)Ydvxis z*W)WP4ZzpWr@HW8K9sDm$nxh2IAjC{0C$~jhGUm5i91p*|i1=0>ix{uti1Pm7Yc@ z2Mn*_+vDB|Zii&vW}m1=J@|G-{mlVGSWZSpuF0;*Jdws7VVqSc3e;VUnzimb3P96kB!>tGj2UWIvl`p9;XVs0rZM~2Bib_jWWPdt%Y z05-N+0craB-Ru*C(@y&*s9YxWyp(GbUx%u%%> z@CFxDt@5U-H9c$7&rJCgX(e@iQE-R&B61mIrkjtq-+51Quqa?g5t{I9Dysm6g41L* z69XNTjsfF0*H)OAIjQL$Nn|bDTpp^W2xx9%bZ^KsYfK2dDs)KMm@IfGD45?dfxt)C zhs+m|AkqsUA86$n<^+3MWz4k+Gceh)sF*dOb15qt zy3Joao&xIl`Sv6)awmM4muo{&$jfCREG`nB>awa(-2l|(%)#e+W8dKz5Thu|+=wXB zF=iEACV=i+Aw5<-DHsxuAM+yOQHIE8t zx#*gL*cZ8;9$A=*=%rzQZG?yJ)VctJ!tXwFN4;E!tYw7I&7b z;aUi3s#$}tC+cqWY*(=@5G^Y`&0dI@>Y%m-B4(v8`Q?W|>ML|@3E=I=JBwmxrGLH0 zTo}dvC?rEKWI#`2!0_JZF?{!XiM@@k=Ilm~xHQ8*-L*xl9!f#AGRFw?av^OQV&pPL zW~aQ; zwIPbw1@*h_*r`e(U33#|=J zeL|}+%o=*S;b~Sgj<6I?Y%_Kt=#5KvA|#l0KR09ne9sen76vbFwN zHoWrT;yYK%);vwQq+VZYrvig8QH6?WUk2O*mFLTbbG~|>c95wq$ZDtQ>P2<(T;Tun zS-F1!0R3Dh_STlurS`7lRDw_MGngi)80IjRT`*}t9M5(Qyb}|6yTV+UyG3glh#26S zTilIqa}HvFYc|S;VKl2b8`D-Zw7%Tc^u!t!US50VV$ux9q{*o_z?z^kYv_yUxmfQd zqf2amqo+f0WN!*?@!Wve8$uv7aLKkHm#3M$o-8_&!J=baD$YjZ&s-sr8+WXn+P6Q^ zy7MM`U1cLZ*H!mF(0=!c)`JgVwNhg4LMC+s0g{Q*7m&^r{Zvh?3IC?Dm{|>Bw8$&dM9-$wiKLhm2~}ZIsxr3{2!9bE{3Y9#`6wrUh~Nm<3_f8h zJ~EXr0^VFV*-HQzoD1ITY06hYm9K#Ze;)7-`%A;{4*Z>wsqUGO%K8j+%|$VStv`XI z;j(DF<`dN~M)XR1e1qj?$Wo-~J-9dtZ4Q;!Q4|vLlIZ3T!;aN(4C2Fe$Shr| z=cfqu55lGQihxpLjZ+@ta>iLo!MDD;9KKjlVHMM{zzRe{(I_w?BKTZV7eoeMU(Hx? zFfG=Z&9G4zl3zi77>}DJ05RiA+Y(r!tl64!A$vVs!G1+VaaF96R za|*E-a63U4C~V$~fIRTN$hmN6ng&eG_$R6U!uN3?AM{zsb%7fAWr5}cl`bG|H)&rq zjGZ4I+qK$q!kH7XT(eZPF!n7J*sv%Hq#1U6eJa+u#u|0Oii#`o3U$|u9{1w5; zbzJhKYjPfKZ@L$v%8I)F2uQDuUB3=AEQuB6nu1&+iR?jS8^h+%l@d$@xz@rj;kPGX z$dsBNfLD><7QKZ&3Yy);#CH;WCBp4R=vhFxYa=7z(llZJ6aw5mAbsb%$@$^Zh+X+M zc1`Y}l4lZ0Tcve|Tm%#=4Hm|Jgc7ihRdp^C(s4p+7NuAHmUGfj)78 znw}O5>f{2|#s+L*R79Na6k?Nb*Vfe9m_f1wPFuEFM9Os9g8)+y!qW*MfGAzkoZAq8 zK4}gyfTAEdB-f|pnh*x@)eAJH4{%_xtXCV(`Wg(#keEx#sS%MsBB~!xJ|5whOHe4r z*k$^ozzSMxal|9}kkZ`5g+^7|13n%~am`+k94!kP0=gPCEW04ZHLCSqk{-xz6xclX zyCoOw5+K~uFdV7q~+w$Wq6yxTP>P&BUXuoeRqGB0+r1J{k_HhQ-!@L(^QCSv3< z2JvG7ZhJr5$qmEhKfzk^fzfOo{OShQFD z9*3IcM|(H-IfI({NzI_#kT($w$eGMWaQW_ZK@pYjYhC|{0>}cL72CVpPuzX_*+*=hP%v%EJIPZeEDJ^J z%<4$7)%aPKDE3p>6Ks9c#*|?d^awg$KL1;25W=GaIx>5s5PX{yrPq zq2AS^iuF6;B|`kA7O~^$`xhP5|J1$r@bBf>MTNE=Dt8%VU9?u3YD?D-Aah#>ItQ*q zZhB|P>edvdaW|upsN1rMuoO;kS(2Jn!Yso4UO_;Ow#Xbd7m>AZ6a1jq35PSC(bjf;mGgMUu@w|F%hphJ1;(0z6+Of11z~!Vl^N_UPCgXNB_o@RxhkP!nc-^ag~GBS`72TJ!mKnc1AkH^viVdlg?au+6yN>KU%(ln2w%^ReBm}a} zoy^r?c_KVbMR8vzJjEP-*R&hb6LLc(K$=b-duCCQG9O3cx<1SS^Uy9Wy^?iY=_RX- zC~YSWCN)N_kKB9m)qCtvNcDNP+EOrI=75Ond#G5j#rF)6sv23_v*;YWPj^QI8a(#g+1cNQWTl<{i`d3Kn zXJ&o|{!%?wjwiylZpFYu&r#d}rCl@l=Ru0{+7&<+`wT-grs{FLL8P3%jhZ>G!QZGg z6ODnFSGu+#BL9&X$ZI407HuW`u}n-#Jy(MLnllgw6QE;a5Z~atDCN6}_~))Wj9Miz z<>ay0u9L@ZZQFnIsb>$utf2LtC))PE-1^Gij(yk8tm*OytVcStfK3(Ab+XGhAvLGR z6a~v7!ht%+4dTxXMe4#)>I0aH%J)2n&4%p>UfwqF%E_eF0ILv<&mXZzVcv!m#b-B-)Gra zzyVE~w0~<~dh#H0eF;UymnntB8KQP7>vB@Djz3bfTs%V2eg_AYPmr>))DkUNEVRYj z5X2~HRDA924$Za?V~us#K~1EVq$wA_6yz2N(8JS(4#-0gNur*pca2t$Q!HEjkeHR= zhyMouCZv!0>cftIQKKKlb8|{-^cwEIt{5pIYlAmzHXvY&r4=nXDq#d$NI`0~Xybf# zf?h5gHA&L8pnwh765^ZEQKM&@g3jUtG&4DLZMQsr`rvMRyBSM8dz0J7HWG)}ZI6;< z9DB^!c!u=^)y}tk9RZZh-QwW#%a%CX*ryLa)4JC-xFL@5ueQuAt4i&2@7FKsf(_6nT6aA=o4viC4la9gy(ZZ8VAVdbVhr zW&2C_a-X{XE2n{!_e0|UFr@V4=F8e5Tb=b~4-motbZ{Ou46BSDs#nt}?K6+BAx+?# z-^YhG*e;Qp~m$PHK{xQ#be7U0QP8#sP_=^|cn^9ERRAb@QPcU^BJOD8vAKel23 z%}vTgdXF=A+4bIK8_O!fBo!1WVvg}hMDNylUq2$tbv-A2s~pN7ZoQYJmtim4s0G!% z8^qK>c#^16YvF5dBgkMk-6+mb!C4xEI2NsooMOjvE5_rdqKHZ%TVdq;q+!fg@|9#R zb|#%vnq04uj0g#7goAsqFu%eCwbkozxy`;*a7urhed((78rZGgqhw)(joX8+$n*wS zU18fSa1gs~AURpK9Odj-Ws?!{A3IOeF_#$=smy`V94Oa4!dSc*F`r22w%E{iOH; z`yOzii8&f(y#1g3X<%-kZ(w3zKwwayUv`hcdD_ril|3LZFgMS<%GxlYSF8YO1@*#k zM1g$J7EO(+y`v!T+Fv805LgViZ4W`yP@09(Boq(^p?mVmxNc4|vM88X<~Nwy#B`>{ zI7Qv+(14h$?dCgLcQv1W_0{CwOBy{&Ay!F4-jpd*CQP1k?u5w`CZ99C;?hOzVI#Dr z3=&5}mfjFP`|NWkpF5PB_o6-KWdQBn=#p`h5tPB>xB)A#6SOL0gw+J)1O`Ep zHhsMz47U5bm2)1fqs^*qGn8#p46aFKc)A+5L~nbCV`)a>Tuida6jUJK_JO)|3}jdD zz(2FU@O0Pyp8ch#d%*{u?&h0FX3gq8xRhPkp>#Qp3{zYW#}{wdyvQLKAI{a%{8z!;*EatRIOe}uMmLOJ_eA!Jn)RXT z<=Q-+JJQ;2Idt1Yx4mb_>mmp@gyr4F>gD%N8!UaCzzF%a(jvDE(PHaiSQ+ zh>7g9v!|aoagr!vV|D#d2#xF05uw=52pgEH=%YeLudcT#ZpUzM7N;~ZmwTho@naDZ05i(Ql2oKHTgyK<9iz_7#8K&!hk&)iphg(KGG{gP z0lIPT2tvVqSc2L*bRw5I06Rz6pFAkrl1aV0uYRV3M7^AqLQ?OJJhG4zQ1VI_wW#(Q zG))5^BW^oUM7rbli=(xRa?Uvx$|Vim?XiX66BMZxI)ZHTSL`?Twyit+0bJnx5tvAM z!!>0_BuzGMVyy22I7`2Tm-*{3rlO5#SDi0;mawnM{9#}S;@Jl*pL%ufrW8s)=eis6 z(|Q{9Yj^D#?JD=ge>z?j#vVh`PW`*2;ViD$AyRoT!92L3VF*o@4Al>7vhA8V#CD64 z9KO(Jb2LN*?ih_mH>WfWf(~N01LL4M`yUr$9B`ZkmUk4vXvGvu-)n>7{01+y)AE+} z7Y8}75rr^|B9Cl-oqqN;7~}@id!Kt%G^UFrhXE2-av1Vc!;pY|OKp83yCPCi4au~+ zJQgx%p$8IK6_FZHgQ~Kq?nThNC*3abHx^gqB>Gq+JH*^6ORkS)iI38DnG2 zpP=jphfz8?1;MAd{xyQD>#0#&Q?b_kDWcU~06;crGf3$7PM&z_RLhA|CmswsNxy4+QqNvf5f1qx^)MB$vi{g>Xzn4E2*83I<{&leEl=+mF}-(3 zd*&})dhvw|OP4R4fBCY7dfyE1#Vb}^y0m1;O5MGrZ1WkR%jaIQaQTHR7ACyqW!SfF zzZh+hh14OBd6aI7D)|TEohWOz{;XL_A4@Mq>C-Mg?*k>(_ zNTbkVMg1VlGlk@0Ly=|^aAzN+rt4BnZJ7ITtsAAhn_U4do#9&pY8uV0%meH57&-l* z0i&8OvRdNgN}N2#Y4k;Le#wplSGS#*HjqQrBkDFz8tYGe2B^PSzP`oXK1QWTT#b-P!Sxsu<6FEE+Vau-(^SAVIN1~=pmGdaEBq?*k z4a-WI1qsjPNMyDkwya{XB5~{-C9?{n$e-|ZhfQ)M;ak6nZ7(zvUZXNgRa)t zGifwS?O}jqn{t+6OpbET^GPhlL_ENddRmE2?a(wD6+El#~y_ z;v5TclWvn1Hg?`QbV&jE!m-5ih<4vpE<_kP7v}FGvZ#0?r#n0>5Cs|K|k>eryA$znd?S!0GmAYc7hmsgoR zSBbDCm4hB2Zw$bTL5DQ+RqL7o+w%v(Z;?3=aD~}JS$`Wa{i>c!-wOZ+-wkr~A|Ns` zPto*&cL&Mt%_#Xaz5?G1m6l-yLYdVE!*vdtjCEUE2A+58$2ued%Ip%1*%wYt> z30Q!ctbsX#pCbt#V}t%iKvq)Zuw-_i$%>d**K?5<3U@64@=(Z*Y$7p?3%hkatY7na;_+Sz>FxKMX z)X92s=-60aX2(gH$O4H)zm=}8$I;{p6BBw8!ziaF++_w%@RZk7RpDd=hb-Z(Mf0MN zdzqu28>w3zDK{(ZV-Q>E6#%8KErowtWn~idr=C&fJOT@nsY)YdYeHAKEo0aeZKi6u zdsw}i?L!4hQuSYf1{ASQv`vyO0p@h}Nb6gS{iP$uFDE@Sv6yi1^6RmHO*3a8veQ+d zYiPh$`lh;kwDq$Q!?ilM_0foFYL2z_Uxn6!k&%(MuANK*i8(W1mIIpvL3MsY{bug5 zels$7c3M`5jZ;v8wQ$9n>LL>!r*E%9=Rpo^y!2D;7zMOHjrfeA;W21#ltv zh4k2*S=lc}6&Bvh>`1tL*h%+b#bI8+xN}kYUe>;;o|Z+UgG%$etPMwdT60Evtk{@W za;0Zkb9A+JLD5RD*@PUd$BTBxBz3BMVG7lFvLNJy{WYc;7}a2=p)+&FO$BlYx8u0;9FO(E)b-P( zy5)?%jj21Aktnc^o<7unwG;Kr>9d*noO35l z`|8Y5YNCMElS3syq-fdNh~eb$*ty0cN%|fuSBb6xvTzi19MqLIWcE^TEPq9t*{P*f z9&6cov$cq_tn-GAP32gX$}thZoftfO9!byAdjGtB{tc{6ow}oVI&(O$c*xXL4mGJ9 z^c-qYLpWJe9_o|{n>a9H{dW2Qf1RC`^=z@!=7Zv4^HX_kNack~JJ1d3HIaT|1tIEL#TG5-W2ZP~JW}+oo$_8cinmt#mQP!2SM`%^b z+A@30b&c$JQUDVcQm~pPSWi$*P)k6iuo)%TM6j8lfq)%p-bj#|?cx&p>qWqy-IjOG zP0CC0-8wYqx&E|Y`_xbIW&+NVk>Z&;ycU^5;xB)!23fby9eR~{0^W}3B>X}SZ$+v4 z_k=5|*LM&>5!QsC9Aq6HB1lz4>cH0BOEmi-99F@+!kFaU`@bEuMD`-+x+>OIUmU8p zg+m!d7Mk#^z-=vNs_1jzsr#`8;Q4SfV??E!QMtZnRPg~M+vl-fn>SEBAgi2D<`rs- z%?K(is;HC4Z-rujTJi^OU175SoE{SvBR!a6D?=EJ$7Mc97r2$aa71_Rone=)9!FR! z${`0l*0Oiu9+fRiQ&U4kYy1Vlft|Z9kv$^}^#Nqs+F9>=tcnX34A{slWjTvsfc(pp z4(YbOcfpkLHff_gVT6o~kx1lq5U5h7{kf-Q^y1-4XKv<8$$W%RN->hR(DS1Rg)}GJ zi$OYVDqt6oSwJqyOGhDp^;nNwIQ^V179zIP-o?~}a=IcK4w;Ww1s4q(DU&ZXhR?7E z16=;mCdD>to2IOl7ftrv$=dI?_FXhs+o-G~7e&>>*2s%*DjLV89cSPPf>iH{OR$q; ze9&Y4^5SJG!hKw;xnGvGV977k(^lan0}Yug0l7thlSM{(CGx7E&P0R@Gl~$A8KAyp{pXSi{ky9B(}?ti$C_U< z0=4DrzOiJxde+KXIxr?U`YUF_sclbkB4$ZZum7itnr|_=Ot@Fz;;J@UW|OjS@jF+( zsifpVq(>O}Re-ZH=U!LUe-;tDd99x;?T<>c`o2r!Lk}~H_W+!ECT&P|J9@n3wM&C) zygdcD-o;#ML3CW&fYn^u5X&SsD`(l}s|3x{rVD%dB^H*xpdyB2-B=b~7csXo zMylS-FHulY1=GG#i6E0`gx7j^*^Bc}BcqN9atdxL1F<}nh?#lx5)LZCsoZ9GtzRrZ zKla~F7UEE9XuxA?ATrd_VA#NBtn($qk??^OVrR(YaG7lc8K@?cgbgs;g`B0DEH3Fs zj!J*8_0)=>IxIugzT#)AQaC0gk26WnSyvM+T?gudyjk0NGG_$oa)<=dJWg|)tW!?`vJUW50=6;{xD?m1EU8!z3!GZG%qJLfh#~&@P)T5N zloSo_q9d+ybx90U<0}j{Isfb#Mt&z_&Piua#*D54UHsyz;F52$7D7hPVGYr30;&l{;cj!846F!p^C!ODCB*)9}aMwCGBZ8zDU;og)+~qy2UZt%N=* zO_Pyo5i7qDxbn}AO%3j976N1PHQ>loY-G&*9FdB;ng7De-j6!AzxA1Yr?$O(`o#y% zXy~VY4m(*yss`M{6-WX>x0-wHoB$%o&^=I7MQf^BBotKYQG1m_mfK3DE$HU_p>%15@ITOoY!^R*X_D&;A1x^=$ehR%8J0p* zu=M$*XJ5?PC%lU$O`5iVugR0I=yFti=<5TlUN5J5y|5k7@t+GKX8JVi8>RmUrD|mQ zIe=25RVbvQ8C0?2XMXryjXX+hSo_!hS?#j6ty^C#3nP_qhoNP%#Twor zVAO%3*w~GfNh+4enz1%i4Z{F)Rv(`=y5hU%r>t%gUP?oelzQAYo+dYgy$<&G*WnT? z^B8MV%#nJ@npD|u&=|HB>g1|~4_A2LAiFIaH8GlIt*M-+uCNYOUZOs=KCYZTbt}Cm zBS{)ovojKfa_vE+e$!f5??~nAOJ%F_ZLhU@{dH=(rP_K~Z?8Xijfh@jnZ+h%)2tFWoMb8o=j zB6PFKeUx=o^-W62lBCTat z%?#yR%+YwqS~{YC3>Q9~K76=1nA%(r@dJx;S#Jv+9L?xs07~FJhaaSIX(Fv=E8Dly zH={11((9y1rV4yMD>VYqtu-4)Y8PrPdp1l~J?0|o6&-qGWCd;e&&<&ymctvif!XWI zxa$U`Rm9#*l4^a-G8b#sfXIl;q*+b$AiXNV`MeA8POGt)BP1np8wuRzMMMoMbkD#9 zYhPrrc8$+E5}Bf1thJnsyrbrbo<_7#w=nZt0X_|kTseMZ)%cM{iLIdB&5%6+y3f{M zB~+<-5+$rK|73k$x5yrVkF5(g&Wg#l%xZ)sJhb7l_c1aG5i6en<|nq5uqb7j83mc& zq2D65WFf)%Yz~!C2{(49WJlJV&48aV;17)aGF@YpX8AV_Rx_+on}*|F7kCMW5rjUU zpUI)d6?G7(R+qs{He(+7ZEM`ikUts$oRd0$1i;BfjP8{s$Qj+s>g7A?VyNfWcoF{w zpY`KSbF@`jOSjGaRiC}A!ajoA3GN`MRMzbJ!P-(Bo39@qyA-8T{7?3y$$Hq`*j4Jc z*lemFbU&6zqTZ-vu3yz`b0xFuihQ`)Y^ZspysgYO4fm~K4a2mjeb%CeG1@icWIbaj z#kSoB^21ttJFTj*~PHBHmMmcS_J#l)^K4dvQc;b90$z=DwySb`Q{4>P?Jz z_cZhnL>X=6U*CV~niRFOB73J}Pe-&Ea&(c_`#e#B|Pz0S}Y6hMYWc<0{B3&a2xSM$s5lUXpj9Dy4t`ZQ+IczL^mbyk+qH`>>#*}77jr?vcGD=zkW zyXC^0CU~Y^!b+|NIOH>%Sj}Xgip8l(6G&nBB`{!^!w6Su)>FH#9Tey?CVKmiIIZn`d|}h*E|jHP)&P_G?~PUG&}s(-hC&gQgAi@3P9_R z$M`WD;E>Xj#tY9H^yZC>eN!q40usH~U_rpm z)s3aenv~V=M^~CV5z~6+_Mt7W-tmA2BwckEj$gfPt&3khp$qgeE17XUfnb85nV?I| z`bWHQ;jIkWMIdAD?ig*8Mzk`fApN({ZMTP&<24U<-Q?`r1AeRI?)pCF8*EW6qso*C z(Y2xFw|B=>Y&6|E!aHc_P0YuQEs9UQBNrEsyd-6BV=wqVWL~cWwELLK-!ZY^+XZUF zlCFw($KgUo_L$U4nhP_hb-12xVn|c~xJ{8?&`Os_F;~B89-AAj-22Y1AtSS=CecVL zfNd%J#xk4EZ>GOYRH7WU$yKW{W9;7MyadtBm{k` zSj+WvP1UT^_l=ajE?}IDf}j?ccV-wdVt%XWz%DIps~LWN;E;O8y8ixw-BSu@QP2)i z))V)SjXlAc)B}@vT+lYg9$#bDqDP>Qr*g=A5f^ zO(n8J8?9vz^t$M~4Eq*9A`e#|V7eGQ7zKH}4+BUhMCqFFiEr0x)@Km4C}16VU<8^= zZPbSkyr}N8o_KJscDb_t{9wPSqMjGc+cM_(Jb|bisR>H-wAJnvxL()3_L>^Bx2+k? z{bOX6U)AyqZOjx_n9CE{r!t#4V4`=EAr~?#eL&&Ze1qU!f_Dfq)OAT^X%W5KrnlY3CHl|FUSRP!m8crHO| zeIfNekAA5&!~0CVpMIk0=)7{0B?R`e-(t9I(fVxNv@K_BW!k|~_A(OW0e2CkL6~#{}ed9VJKuGr~zeb>Cd9o@=A#cdW>x)26UCz+O>~ z(yiyh<^~pC3DWEVe0Dx`kI>_^a-Ktv{IU3L+^ zJFiF0UWfxtMY6likC@R`rp)N&95I{VLC{FFGGJvrzDgZxS@U=YmPp_1vJO5`6iao+ zC&+9Oe)kZ$u`j4$m-e+Ve`))_SloY$G|cYnkVfk85hn+2B5+l6^&G)xB~`gq9F}SY@*BvaceSwW70~uEaU(`1#v}j_0W}SL^ z!~&TO$p)KGGpA<>wlYozKJ;?55n`1q7UmVv`fmoTrO&KTFSR`KOtH$BIp;wJ=pcxq ze|dK3K%xQgO-4$JOU8kLU(w;QKIxK!mVS6(9$S{2Th{i&<6{}fBXlM;Lzc6uG6$sV zR1!RZj zPXQ}*WPv)~^5l`Tl`c4Q6zNJjtg9twc9Ok%BR2sPJ^>H>fCNmNYO%k4NHbG0u0f1L zZo6etcd7O<(cxbFd`avz=5-7J{cQIpo3)zNlpYOa`hHahpc*Ym%44Oq;rfj6H(x~1 zIa!!Iy^yodrDb_O;Uz^rtFUFlz%I%)y>^v8vsSkZvsHP1R!kI)GITO(GC4>P5&>B5 ziD|h#Bn2pjKdFJmA{Q#-*h(p;I|Hz9N;7joeu_l436eBAqj@s4s{~EnU>@HfV0U+n zGTr89tU+GKF06g7PllVV$mohhu4r|f9ot@6R_O~@`M=9}JzyO1!h>2*Zct+mP(xf| z{*%>vT!w4M(GlbAEe4ZF>2$bFgF8<*vk3XE&a!@Wbm4-d%pgg8?9)Yy>GwJSG`Vjf zEAwvz9}xVV;2#7Z68saOVWjo@r+QnFW0QnrnTJ`~2(w6bzulF6m_la62)cR`j08yJ zMQfrEYn0CDpui!f6OmEI@`vaj>fuve{v-An`@^o(e!3n*A_yMxkbF5NFomNAbC8JnAi@&4wge1vMFvDK^DTg6 z^s_rfH{WK2U#CZy+C_wSB!Zq7z6d=Zp6tZ16Wh5Xj6ofhNzc~_>L}O_dPjD4ddA;B zp#s*8Z*(t`im>fG;I%n(00J}kbKyqWtO429>u;=@kYKgnC6Mm=P0}Twve5Y*{Dx#B z#(QZ+O)&q=~}>M`s5A748264YPBaZqzE(Vz|BK`q(9%xH+M;SkPM$`gq-+1B@d z9Mp!oTmJOp4F$7yu^)vSQDCsG3tkbIpbpCsekU7`VgvPE`i&(RuB>~02O?m-^t)yL zdiuZ)v)g;KRhzZ+yatTfZ$dG zK@})90Z9cJO?-l1bKgmE;~Q2F*o?)-cK%da7SP$5eJ)aP)}LMdoWL+g?4sY7IPf z?zNBMTlZ`Vh1Mt3@`Rcz%YcNMCoDLj=8JuW&4rcj4dItMOKtl7Fxo8=*dhpSGNK$u zJqwyaES@3Vqch&Not_H-B2JBd1Q+HD zr_5j--(&3W6a0YShXiD%de+?Pn(BIJwjxDCy_s_5Rz|y<;3ov%ww^z|Zj@7Ih_kp< zE_GXh79<;H+Jcoer+sWNwKXotIf8>TlAw)!GSO|_+Ww;Yxi$AsV>E0{um95|d->Re z_Cc8={UdhzBx^;LwmLLphe3o#(Q{TX&w7G+tZb%4!#?vcKm-zzPozf|us));2Fb&9 zSj(8h5PD9aOAJ*-a-rfAw+7+*6K+(T$NYp`Ql((NKp;yp8APrH?FH8X2FR+bKU{iF z1UDu?bHFptrsziAVubeyHY${l^VRs_HM1BVGz7G-8?g7FpJwfas$c_{E8Jhh13y;^ z`%X;bsDrGG^cFxO0P1PqxreRoQZoYsQbQ^7IWK_0hhQYwiDNhBD)Se?ax3{OPg&{871DX)XPC;efxO^BQ`tUORp*_kPf^ z<8cU{w^*AWTHF3TZh;6j%9J`~^s(H)Xb(m?F2RhPLhU1*d9-QbFU#vsw3_6Lf{i z{jAGA?Wg@S*9!e-lB$<6Ya z{$^yhjgh`G$C+Q5rHm`{HMg;ZjOM}M!F5ia_1YKXvc)Vz`_8^hH^w@$ZGiRVjgrY2Ywyl( z@u$7&nVG^9bGXq13vb!Uj&oR7BJZ?4KW-ReiOtCN1~gk?z7yZ?Q&ZHj`1gHkOpGfw zb1AX)Qi96}mJuumfcd$M%qvXy-%4m1au|gta|LruEnWnDxqNGg*ZNg&d&hoi+C-Yo zF-XZXLezxCiU9K_>n!YCIQh5vDP&FL1!~jmYRfW?%Q{<*l70}GDPv;BM4%DbWDsM^ zi1(#y2*G#)5qv0qr0qBTi~*ux>#BpMF|r_IN_x%c8)tTppzCU?LYL&lcW0?z zsvYsNY&B8U#&6G7iwBKs#4nNH%C&J(T*+nMW*f!j)^bZ?R{X0l&zTCJ=KBnw*ohqmEJJOZ8?3Tnnu007 zK-sX$sC{>6-moeu6^1F-+5DIUum|GjdT`|&t`)~`DBxH8a6e9gX5M`CCpjvj)Wz|6 zd1~U6OAt-xxxiXneH%5Gu=JdD(P-_ZFkGa`V+kWt2uohBWB+Y048w($|`{p?qyee zY&SKcAk}%|8XYg~riSEw&K^SoS0ByXfArRFDo6Rs*y~O40|jbu%s|*7C9Nuv+oHgV z*gCmaNvDmU;mP=M zWI>f1iP3^8eO!fb${v)6P(mVPzVDA;)?F1|b{nJKPA~@rCVGe^Hf4VPP8-F|2s%Je zhi%gB%bnzIt%%)!PcOn0=J|@CFWhM+sll34*-NJTnbdZ7BZA%@c=`q5u|zsW){RVnFAvs zoXPD=x!OQw9*l45sivyR_|rY{i&L+~FX^Q|n-T5V+^aFC(O20!+NZhiL07cU=x6lb zqx!mx0S9n1J`BKcG3rd0kryo}?I-aHjDfgY(O20&zO}dN+4o~(NVPJ8$i&ZJ2H+VG zf2y|{)NddR%cjCWF%O1i1ESq33z`QB$rv2}eQ#CPN6<@fNF;}Hw$RYxSM^b2hl)3m zNASy>fi5y<62#HmMJvo5@kjco;+~>&V&|fxC6h8pIDOQhf%majbf*6+z#+{(CH5{o zK8v5#S6z^HTLIE+>8l0~PnAhZlgPp9u{yL#?(s2KGo`NLuk=*|gx$$DanX=WOcgdJ zY~dc(U=EXYg|{Met>*kX$aweDmEvl}{FE&}p^C?ti!kz8bgf7#1rk}&;*S=p@#hGMy_ddQSyI}Bz-OXBZi2JPZ0$N& zIF2QXJsRk0?{FQ!cOg`0YK0NdBM1C26wVNu8XZKg<$N1YZ zxQ^3@8{*C;C*hAW@OQ1?&XODAE{J;YQ&qSK5h%!;k+TiY0ou0u<&LbcrRm#K8x5#NnP!PbJ^ojBW?qMuCLKpXjg7R=CFkQ|qBH0jlFQKkHfe5X zOHXc&yo~SrEFy(E8HG61OvWplX{3TuX2zi9I;T>ECfv^fn}VEqQJe=%Faos48T2=Psg(csy|Hq0XhZklNSFJZrxo`76tvuDhsczF|j(W;>G^NN!?c$E$20O zv*SYssUhmQ`0PPyfDx7YG4cY!fhJ zN_0Z$`HT_&&oDKpXa=0Y?Fw+nKCSj4V-{R98H{Hro?&G4rpMP0SLY~y z{NQkPm2FLIX!}RN;8=DqR>p^qP=~Wbm-Ymz9Di?wdPT+K2S%#9wN>iqv{B%r>gM>o z(Q3BZ8Q(Tq?JOXd6|giJvh7 zrUqRV93y6Z#6dZA&xzJo@3Ma{7r4R6;kOCQ$MLEnb%VCb9sg^Q8g$OAE|ETUieBXU zO>FCCf;NIv@!4mopid;Lrg-QqHFi~M2Bet2G;1fTcr(EPCKavf9J*wkaT5ciJ^Em ziWg5*gG7KgkE2+q&86TJc1hZlqF@zU>m1ohm)}t1u10bVd+2$#M>=s5n=Cz^8U^(I z#p!qMq{@;3ktLVU?%q^8r0=Ar(v@jl6dyWC_0oRYEk1pcGSnMK4@^?CvjQ_wFr?d@ zqklY4U7&i8W{2yn%o_x#q^r!6T=Ea*lE3kM^+O-^P-S-}1I93*XqH-R1-E&QLKm=G z8^tKL7(i`&niV@OkU>4G=zAc3$80r8yTcX#)@(Jp;BNZKnpP@4I{u&8YOvP5AU?s3PGtsLkpZy#A?D-s zaJLH~?uQEEV=q+CjiMjIC9?*mPQxFjp|a@Vg1B~(+IBG&MYh3$60_(IiJ#2}tIQX3 z1uT5l)Zo&yTBo>Px@xCWh{f|8kj{JX7S`qx86j;6sAf z3AnbCm9}||{g!2J!z+>F+!`Va|GVPzmaAz#Ipkm+y~giRG=NC*BX#Zf>^XJ(@wNvaJ$?A0lP^E${2Y_%j9)6( zjJza&Dap>2W!4aUnpQ51>v=cG@6()O?fYXb6E!c4r z79$w=I~fs%bTzjGT?KoIpE!pPAi6Mirb#WoZAve^P!L=&T6mdYx!|_+hrJGFvY0T! zzI3KkUj6tvfM6g&AwhqFAc3gC2Gb=SoYA+xVcqf>Dz+A)6%(>L$+m||%_mV|T`m-( zobhjG>%WO+=s9WUG17K>*RY9e34SQC?Aag-a%?Qp!d<3D#M~Sox)Ortr}0@U)xv9K zmJ&6c-`lb^S%N$nSe3#h;un6Qy`mb%r_`EZ3rqGA%^$G%t*mJiU9Y*~zh9{aGTetoA8&;aWr*M6}i_^tnU@7wqe^ zn|)oZ`led3B>~!6txH`He4o#`lbK13{k{JFc!W9kd%xTLe$RJ3=X=iirY%y1+7}t! z?LM%~)EnK4E>mwt=Fhz{e`1zQzWqBRWIez%x=MX{wtTBmJ+1vKv*n9xRAor|Yph{r zvU>m0T$yT5Z}%}_ET8xZ69GSEg#~}ndDEW3Y$lS(A+ce9m}PZbp%%I5?x?pQi(h0N zze3f!F9QXL?fSoU57X7nj*zLfjNhq@U-8*Bc3%Qm2e=obr3QY#=d-I;uimHVtB>CU zgW)Z>o4BP8zk2*8;5QM!2K*)=#Rq&wb4hHOtk>*;x*I~ynn^7aB=4l1nt|)~S|-X{ zh_4>JPKgHQ;B9L3tq5=DMBj$vZCdngG~UkTn_jyo$#f&9YXvr#?w0ImG3Y-BKGXRO zjHYY5RETjy#xi)!K+rM?nh^^!RwHC4LRL%2%(##igv>%ni-gRI3)zg2*$CMzA+zle zy>5?73Y~1G>h*hE`h-1>V16LO%-_CT1q<|vWAkIo+EJvy(N5D>W6VnrFGh4^y|de`rNW#J7)cTgBn@%DyMH* zBxSj@S4#T5Y1Ou>ycK_d+m{__jz+y1*Fm%j@v(rBokbM}ij0-0vi6xg6aW-9YCM1h%j7E$tvrYU~ zCUcYpJ)bVw2gnjCTL8{mhHMLj?g*u^14&K4&)9GBBSMr4`T8VZUt<(mw_^*nEb?4A zZFCN36It42t!0bYCrh#%AK|NPF(Mlftoru;Hkn^fAxI_g5Xc%Wt91rnvk0;YatLw> z@(AQ4OxAo^{bQSfFW8R??IKDYWmW$JQScVQ-yG%WFv)A|%YAXO^e%m)EoSUx?(bO_ zZd4^De`XLdL!l8F?~s=hhw(S-n;X@fiCc*$p;Mn@-2Q_qEW~PL$(4@zF2s8LOD(lY zec;aJwLzzyZtIgxYD(%Gt~2hjDPRa?YSz`Ss~q)y_p+DOD=`PHME6fxeLs2SL|gRS*a z?*GMt??YdT@PQ-L(S7ugb)NM!J|OmPp-U#-K^A)mUBs{ytMVvo%4X%&9?7;Y-HfIG zL*&yjhD(20_sg5r*VS0!VG&^mme}W$+I6VVNsr zWMYsni!jw?SM0V+AftwvQ}05oC;IJeqZGcEnSVmuZY92@!XNWhc8*0>(-zR1?`2z0 zbf{&n&xpIRvTf=fajkky3q_a9r7Pz5lK_x8MW%R}?0MenOQ-o9IRv%~z_ke!VQg;M z$HMF(3hpHk*(2G+|AYY|W9g$y5KM)PGQ4mxuqEAMv3|{1Ho~oYuT$e}Qmk?y$|agi zvDj8bz9;jnltJ3!yDW&zJ~DaBq#T>F6PQeaEA2p7@1?dMl`aSjNe-yhSa5*TciEK9tBooCx+3G9BXT*deZedVs@0-U18N$ zb;wgBLW4FRfK@y~a3S;PwT9n{gIOfNk}En-5DKSOk+2FbVa4#XZO+-+Tbf-lp({6k1Mn%qiv*t$tg$azfO3KL z!b0V&Hhw`INR=O9ZXZQoZ8Wf?-QKbJ1X3@<}a)L>p+%Ye&R6Ae3=5;R1vEU*VnOm?@I z`JQF}`GSDW(ANSs!+|{#HW#E#gpu%(=#9DQgKpzDu4XzP!GAKZrwJ0#SE&3ib|@p9 zi$nxaugmrmgI3SO%Z|1Mr)Bop^j6kZMp1Mqg>kMHnXJ$)uDS|VYXW{Vr~AX()dHot zo!!&#RLWib)pHArbcQ9Ad8CwBJ8NCF2Lfk}3=*m#axxg5H?TGj=<#brMZtW zWd@Y_Uy2eNqS9H{FrL&(4w_>9k|Q8w(+<+ZWC+B%nRGoF2Qmf+>r81jh6Z#dR)Ioc zqJV3!;V!8?8X(sG(v_Z{!}2E~)R!Kya~er!4Au?gwuQcoBOPf=u66NVwHq3+wlL`4 z26xE62z53gF0u}$%Q}Vx;0`Dp&KJY{6bw)8Q$}6@m!6xrl8sCQ_~JUuJ~w@o{H+sn zQ!sw!Y$t9`KDfVk@6JWbFId|1h}HY(6Q8L|jd7?GO#%re#Q{b+Fg-$E2~oujL8bD6 zm)+c|H;SFGfxSCZ%*Tt|7%U+oS~B)_qS@<&FtUa#T~lbb88?{m?q(wu=(@sj$4k!) z#pUfL>y;Y7Wxp_{rM5f3D}m?%YYgLAno%ersB zSAWquTm-s2VIAzAnQCsr>Kml-AWwqE^P3J_845dT`_Nc$L2@MGa@wvCJaMsh#4`!~ zdc8zUibixtUCB{bO4Jogn;P}=MDt6dOHbe9MxV-ns7YcF2HCojc;l=}xOyn65OM^Z z0ry&VwEcl(b|^h-L!z-?qB(TekOXwMY+PyE7v?l>hfmfJvP!jxZ_Wm%aW8yx#Mfni z%Kn52i*J!jZI6PZha=aHj6kZMiz{u#q8D~{M4uRi%iy)PVCKnFn0a~aZ=+w>y;+7X z`r?V**L&AcN*OxNI9%~ZE*3s<_>SJa*Yk4Aoe!Vry0iD@13gFXf|LSe6?(TGjM^<^ z1`_kc{m&eK?v|-ZlKG`6*7#dgeyA+APcED4Evv7onJ}@odbzJ`oJ8ZO;=eLXV4IrS zwlw1Ii)Kdbx#^zcPwno#;lZ9~x(CLETnbh0TWx-leOnvT^maYf^ZfSSt{tcl#!=6= z4xb3^vh3pad}~*Ab@jlUq}G@-qs%?Y1{MAG&BzA#TmQ2JHV2R?a9iui&Km}cTg*#n zn0u5>$oMDjc?!nRcij!S*|PW|2>xyDY(@jmbFe)7vb1AE7;ybY#IC8HQa5?xq}mC6 zuwej(<3H5LpVUL(%kfinHFfn>H501pCa$QdnJWJWe%ju2+tu+S&6EN8U%7tWm3G-9 z1!Sa#Xe$R}(a{j%y*ec&#Ku1hY&Kd%KR{nsGGX$!+^i9Qa<(O%~=?Hs%dS zdLDfmQ>q<7(%Zx(*|D;+M*EL1cd#DfD~QKH1bL|c`i(+E`Lg1Jh12WHj`y;g+m{#b z7j4zSG8Zj-UtxUwDBgi~F<1~nFOHxzoc(1Cf*C7Y?f$G|Uus;_8>cw^r*kin0kHI; zL|X!o_MB{vBkeBG>>K-`&5aULlO$wEsK{PsrI3;ng1|_=k#$~pQ1xguqel)}!z}++WLV;7O*KCN}S z-03h14Z+4v?W~dG?1uh~QbnRD#I@8oN)T5#%hRQb3n}3&GHlL7Tzu~26%uaEC~#5( zyZfRp^*g9vTcht&PmPLm<`u2@BKJ$+>vLE+^?#& zQm3_YzZ#J@0Z~2pp&$wVzq)YX=IFS%d*^=jV-?a?UmDB|WSWrL)l0WKf?0tqxQFUR zaA%v@#+d+MWLI;>%x+7R@L>|3gC#asFAnD6mych8gn1>b&@99`n-{4I?bPy?!?)m& zw(F5{h?&`v8-n-!9gTXiUeuZwEDGe)GmyPqga7;vcc7rFkUm)Di&rJIrQ4fGv#3iF z)Ay2uHV0z_i_K!Bx!x?sia#+}f}BbMMUv09K(SeZb#(ZKM8w!;4(Tc}OY~x_q$PSN z8B1wjuoJe_1FmniM zuq%i%Vq-m0Puiyiz2Y7v?&0DdE$%XLSL(%xQ!ef?dJ)_erWbk6F}+=0eJo?*IWF?7 zl9VI#>fp#gQcDQ;-3L<4kwDLQa|Ftpd#|=0_oN3$nWMT=_ay{Jqh0ZV;23i>vK$u} zZo+3sLQ5GWAT_-htyu{?jYj$!pf^57Ib!5UjIolc7OCi0Dt_b4aeDCvXNXD6vF5nK z1an+*f?k)KfKLrY3sn-q<}kR%h$|N^uQ}W-Gt13NbBtMmqf2bhq!Au9A&_bK0u_M~ z=Fsg51p-8FwcE8|9(+ggUEcCd2z44)O3Y!187emMh(yJ4XQVB)Ej!}ca>D`Q>}SYY5@J&AAMKuE|qpf?1^x0M9O?MPUQ zlT>~3^=>nFZo+olca4OP>r)V#W+%sBs={E3BsGreQ-k9JRc01GSc7K{p0#*pwp7Da zw?08X2kv2aD7}Fn#&fh;vs3fGZPp5`L;j(^>eI{`wEMYcE#P#s4!xD9!%2uf1IflC z(kFa&)yQdl5&UQBgo*I2#jnz=2CUO(?Qz0)wpk50hdy}DHLC#UnYn=T0~KbTK76|d z_jz#V(;dRg0=yJN0!qyq_zW{^0T-IcB3KUuI*fD7@isK;^+nSX%nbB~dba-6#{>2H z`TAlr!-NdCnFyE&<%DGPr^KR!n-cUTIN)B&Q|idRw{)jtOM9eovjgMn^$UR3Qgn|Z zJDPq$^e|h-DE7aRu?nNe%dA@;QuC(V$hr46E)^v`s)mpMxN{RJfWt-B7Y zyqV9ly+kyQ%qnn3MWSH99tRhX+3Ixb!fu+x0NZ|@dwl?+rL$m>a?Ll6Kn+>c zd#Y`NSDJ01L1<`71VUDHB?~5tvm6>$qFZ$3TQ?t46SBSwx0phpO-4W1UDhjyRCP#B zcb{hwol#*jFsz}*Z_u6!a257IP!KyT_K>D^#yDc3ia-vr1{~S^3^~ClKh%kEH??is zLN-%zOf#3QXe=i-hlO({-Bs9UQhs6P3EynOKxVM)ZiFK&$D^W{AgAL+MECs!vPr4p zczA=a2M8$EYAb1z@Q-6X7U1{%M05`wPU{;3H23Qddm`gN-Xek>%uZPCBn<3f=tU+tR-uxq&6f^a zZ$75d$H>XnXnv+rzJCQR=Fk9{NS|)!r={DDb6Q1@tGSsi^pOEGhKWX5ZI7$MVb61? zycZvHLPZ@)>iEl+KkVL}&K&E&<7%fDI;sk76SYF+Y#8tHID z~=n>>KqNR6+yaztO!xwIh3$)*wpA>-_abq-w~1m$GTgeRxhe7>>ndm zj)u`yuB;h{Rk1o|U3yrR&-@Ll4q_^H3UrK!f15zsK~7j+fK(R16j-n$M7 zp>Dl#M5WkA$Rh^MJ~Ht<%4*9Xl0zOrMQk#Pokx+GXfM-)O;9p}d?kJ_keM8e;bCy#8-5VVqVAct*f6?VQrq%y6|e1(|!5# z3L1@a5G=bC5eaY@vL=dL#ow$uUQp%BW&V|^BF2vwLcWHbK&m{*EL@pF8!i!<2X19- z;V8-HQ!DwXnowbXgeV!L0!AHj_ZL`AN7Zbt&S@Pus_OH`prSlgnS-DI{X|>M%X;Ui zni74e|5V3 zSFhJY2-I^x1yl6YATSa1;Fl)Ynkd*xH`9%`fX(y>Hs1<(=niHGDIdxJD$_tEUjb4+ zRZnb92Twu#0&XF}6G6&nc4aXZi1w^FQa-aQyU$lhdBg~2nOVqdj+rH-JOob7>_Cp> zGb@lwZiL<-r2H(90eNP&o*DuzpRG>KIUwZ|gCRJ`A2%~VE#1FUb>Ijh zn2TSYnSnZdOioJI5dB zHe=#BC-R&tDT_ma0uWinDC2yyps$SjdEkO1w5TpE;1K@D0*SFOLg1I0rCm-C_(MTE z2R^xB$kOK&c5I@C2w!nV@qZR-l>6k^TbVB*bD+4>L<* zjFeQ%kcxiA;s;JeNKZw}B2#muISQ2DsNw|uLU0mBpwt)1=j!dOQI}Mdez{rEhb1#v zUy+zFBtf4v3H&iomdU2K-+L~)SOqCfGY_s2;&Q{4Zx)z^CU69<C-O|=Q(v_w15BPo{cHLqy3efCFWsZ*t~iQ1f9E;c7D#T$ zfXPP0%P>)Z8NqWjM$<2gQq(eJL_9oF)XLS?7yqf&YSRWGjfec75yf+>&SFjJ$e2e< zV&1lm0g!sI&%4x+{mF2ybh7l9(^cWL#{LvK{(t7)=u?7puE#Ed41kYZ$gAguCyyWA zWt?KLMEna~eipYM0EC6F90j1Y%TKwGp#Q0$3eMdIzpzsDj zvJ8Y(fSU_nLJsXq`sn^_s#li$T+I#}scqX1q*|o3FXT zKJFTTIN81nEkx?Sa*S~v^A(~&h;EURYoOmGCsp?*(&FT8w<0d7YqFG=3 zN6 z*2>?g25pJ6`_|v6QA(?FSlz!>W3niMU=u1r)-7;Y@Bdbf))qRfl2_Dd^^!I36&R*^ zvAg{hbxLWA9MXf?d9mTDI|yKj75B`K&SBH99F-TB{YX-Gsj{3yvcvCf$-Nt~O1m7mOouCB(tX`>%ZONesX#Ng^b`#t~u!oUcP(?}l zgIW+Wx>(WZbQy=ThB%ac$b>R~2!lcJ#tvfJj{OHiW6l0Fb9|6~B7rJw3c-ZP0*XLt zBSVRk);OeWqo+v_B#2=~T8QZRXUIY5SD_>xA?pT1N1OpmY5rtLY9l{v@L-0P{pwr}S;Tj0%`;A421<703*n)l2O;`Hu)lC*La)E^J8-ST%NHYm%SA-O% zG1ur=6*+}Uk1s{vc*Ql$-)inr#Yywn16Dh&9X*(<_E`se)X*w5f?0qScnZAWP`04zMzH?HQjo8Xh$2A)fB8GE;tmfvcC?WjN z5bM}U=W;Wx%FJWni zqq=S_wq(|^zo~rt225Ene~(bvBl+^<8PkpAhQo+6%;XU(v~R(PKVpslVoi8gl}(a! zxd96{S3Q|MXpO)58|#}l8+Xy`MS@)fr@0JR``%US3ZgR;n3_p)Q4)?6D4+kHDruxZ zO`l-C4C{}WdLMzzPBKQuuWL&l z-v-N=4+%~+p}b%$stjdd~mAaV_m7FJi-i+F7BGL5-w z0N`=6m3?WEHh}KI7FeE(9e1^$qbxUC*=c`o-Hry61g_gCDKUdB@Sl66@N3sMB*U zW|rRtm~RZFQ>HD^YT&em$pR;RG=M#ffnEX{D)J?-ZEn_iCA!}@U_Je@8v6Avh8;#4 zj5Ar|IXlX<5QgkN%--Xqk#=6N+>Ky?`^Pah5jp)UVVH>beRO%_=Ly!tPt;W*(W{8u zcoogwPD-5xT-K(;!Ud%Qal@5#)&_X@%@c#9Fs|ljC8p>$FuJjg#T!tRY6KjD*@m)D zaWEvc9P+PSbSc%XXZBKz`{|OILMqPE+hv(RS3W_s{BpOYy$>NqjA1NHTmhx1a(cB9 zwYjIrdhb(JkwiCa@YzN=t3OlILT8bHEoA=zdA9C|OB111by@#Ckr0_@PEkl(Z z9S8ZHc*K276g1P=yTB>JS_Dqfb7-OuvJuVGkD79R?o2ekfl{2h3wdJCdg?P(m~OzM zGI6QlXYsDFGES?Zvt)@6(4(E8KkCEz{Fr^8qI?rqk#5}FtpAi9V>9D#aq^aV?mF$$ z5f(g<;7^8%1}dVfrUae0d*fH>XkUfE6Z>E^?%q3&t{)bHE!Lav?RoGP$T;&3_#L zVV=LK6$hNUF^PjSR)J{KgiD*-{M3BtpRS}Y;p?2)-6)$=uI+Z7HLjIfg`%}0f>Eoa zzFMJ1N>nU{B49vaqjfrQ)4VYnpkGj*$aWoN8F8(lHh(J_pbNs{K1Kb528aOn^TAHKKbbV-ib9ebxiND z2ivoVXmq0V9qy{CwvAPOe`|Xg6F;yOCGjp_zWA$3&^~=C;{9=V*Sk;M=8Z2hjrdAE zsC4qBvfJt=?;hD|-F#XZq4vqKOz<%;>;NBs`hnhEJB}ZIGCB$=sD0>0JEeEQiWSSe zHgejBA@O_P-QDRO1ld!)M8~-uZeGp{WS`sN8s|mz&J8Cuw>7P4ZPsy}NNBxZoE=Fu z)$)fa_;O@wG!g6ofRv5Dm2x0Ft@OEJJC`?O>uAbZXi7Y2LUFWAQlvD(4nKC%zh>&_ z=G&Lrc=7Uijpxl*j7?OLXvFZft%0)zM0Flp%#G`y zm9WmZovU9lJL$_DM|=2sCjpKFu$hL-m%f&Ljaqxy#`^sR`=^n?V2&PI(+phMx_*s; zy9^^X(*C=SIi&DiByv1-r4hjLpDkiy$etz(uRdIbj{L1RK8Hk7F~ds;*wqXUG++AW zW@AG~bNjmL){Qu0HrP5wIf0kKnRfBwjBQoXJJt3UyMsnGV~;1OA*dy&Bd7=PrPxt1 z$fmR!6X-pW-X3r8KryMcILRoJX(#fI7j_vDhpN>3fh3=_CbdlcYIf1*Rs4I}3X@Pn=a5YO(d>v#MGxu|7Pjyso9p=mM+g3pFEY8QtqN>+&zuq!6!{uy5)y z=-NU+v3KJr!HWbxA{fgacAT!cboJ1+g07e7QtVORL^+L{3BE<}Zv?jz+)W@BjC&dR z1i>Nt{m`)%@KHE@DUBD+o4as%{HYV*6|t zOOpu@GVyIdsh;m=ECN{g3Fc3+Zt_!DR%i3BFEnIYAr227*=sv6OHRUH20_ zMDQ@dlLXHYyhM1ic%I+|f;R}nP|o`yIzJ@%jNo$uH=8Y)AeBJQ5#+c)#Og}vH&5cmj$w;@~(;ccv^UmF28dp?gSpIq4#YSW=mB3m!)jSw1L`+e#C*ZIhj z-ejy3>9}zEEMr|eSslwDoC---mv|dt4{yLlEC~}^vSG53a3dN#{f5wx2Z>}ZCPru* zOXF(W*oajHTnnI-N%y-=6iaI zYcUx98ys3gUAhyBEus{gLZukoh>$|oyyiTc>Bz=giSm+Be>x=z2LtkFJ?wxu@fhnh zhqlat0|YrIpNU76D08J^-vSDsOxqRc`l%7oy~@swmH!d;f>0=ybN6`9s< zr#3V+J#!9xM&q|89SS~~!A!vP%=E1EjP%9n*_o614*xRo&&eDWd53ggW}ODPz|3+& zm(Qir9hs}(JBjZJp`t0C@=WDPffQhBy2Is$yTqgNVfo&RN}&X@>l``stS8Zg>8!RP3(nuHFCdcitouV%%@PKjEEs-|hF@bI(2J+%iAh zk$B*Ogm8UoYLW~89{#C+b=C83*Sq}a{4W6?Gw}q@N_M#nm!WE0y7N}Ll5b7daIztP1RGy?Wswt?VBHu`j6@@8yUR%O58dY0hx>V=gxZPv#M(*vB>7IOIj(lHK3Uv7YNpgq)u)O(y=GeN zbbY$GGiqkk&eUg$JF{k1?eY5Y;_g{9yLOH~N8DL8b8F}6^TeH9GrxAeKEHNBSYJ?^ zt}hhNoSH?oC+H{CF4h;zx2jp9FG1~l)s)qqs4tEBour=xzuq;=YM1NF#jj7zirSU> zN^$4boLqZ~eu}vJ)~u>MRX86)>A`5HCV6|Q#aHO6T995dBr zl!|LCT>Zs0uERARt_k8d5w1z%Iu5SM;+oPCIu)*I;x`?x8RD8b)#YC+u32!c6W8$w zovnv!jX8RqF;}lQ=IIT_e0_tlKsQmTfU!`bEkd*t#I+c%CE_YWCTvYvAJ^3`z?8NGWSjOps{2s;`K>1nzv(|;hk7z$r-)fZWXBz|bbE;j=pRszc z$G6Qtk{zRO_fM4fxqjdq-#ZMSKfI%Sr{6*0m_9Cep68$Hukvr-rs?M!OY{qjHTs1{ zh5lRr^l0B2hJU+D-(^%9Rd`>7p|{qk-tIE0{oB`FjKR0tSZAz9$R4A{sKxsdqt2+u z+cFybml_-VmsNTU(+F($=$G$S#=@}CXl&fBblccuY(}&zkl_}i2^lu|$4HhQ{Yv=# z#t6YL6fNW`_%s`5!RM@~&(-h=8(ZPCHR`h$K4%-}z~`K(&o%JbW^9Mg_NdRb^TRIV zTw@2kc0|3dL!_O?dGI+e>eB+B^NkDOb3xQ+AABw}ehZ)9Mt%0fXP0pid@hRmTo0d% zjot9s9rd{ZK6{Ky;B!gT=f?T2uwfaO!t2tg*G-6YnQ=LME|2=$Y}m#Xz|1YimBv+g zA26;q_Tqi3agA{;-nW4^Za1zoTB?+>ZI5M~iBcut$s*glf^&J!(7_ z4Lu~Gk9SJ>JL8FH*aOCs#_v&u2PMu^o#H%g{2?0WAv7R-yYWY~;7`Ug^wb~rC$tOM(QampHuXOmoYW!LJe`ox~cn#^Eknq<# z!Xw6CCHzU_Z^j$jU19zA#@~%M5%DQO=Ub@E+r~Q*?;plj+rw=2^B9SXjIWJ< zVIaOBk^bEg=^Nu)$?Qe(|E|OTd*cW3f64gK_z9W+kA(l+9*!Jcc$CC>nPK?SI)%FN z?Lqrd{43Gmxb~JI$cral62BS^P3RPwh)~S;Nc-n#XmY2}6ojTq=wIMU!_xy5d@UL? zy;IDL-C<>9O4Qe*!96<#XCY~}ghryFIh{g#A+)!I{xurfr&DMyLi2ZxH=~&rbqXy;=s*d53$8(U1|y@lqcMkcidllNp%U|* zXy~v`p~De6LPEpuMuSJT2m5y+a1@@=i~tnB7mYFIm>8vqF*X|GNVUuNzR}>yJr(>X;+Z7H9*u?`7j6%hVkaZQlxU_O%_jj(#WQU?UDKj0Ow)n7?t0z@f*Z2cl0zrSRp0a%I^5qLpEGu7e>e9K^PbUtrhAo{s`hbcg_%~Mv zg5~w=BXJeJinacuC!iKbhoe;oJV!OU-2@(jIP3MLd;0Uc0#C<3)|=t|@dTc-&OfPY zMbO(4zt6SaWgZ`l3u)6_L66}vlBz*ahPP5%?g}QXOKj0X9wWJrYoBV43&jOiNSqXj zlgc=uxS*>%$%zA3vbB2IP_@#!aM|RZl_)9Vsi-&nk$C^+hHBFvuwGdLsyT_tHAm8sI*Udyv$(E{T1 zfZIF^FOzOFOdurGOqXPxCN(HG{TmvA2IBw%0@MssG_RJXJpIjWF6;6Yr_N?O%>Y1& ziX^S^SFfwCt11sRb)rbgF1bAj7vNtx%l?3a$$dRnW`N^C7#*`y{PrFt6i zRGNN&iDq8Nk9fmh>1(VBn)CVP^`WI3{Rfl;;hKrW=Yi_xRHE2vr0CvW>%LI*aR%V?5Kfx1wXF@h`4Kgo6S?`N}Rj7 z!r#E&EAcutAws1(=2dV(t@hUheG&D`+89Z`ErIeHe`WBWF6+WmAL`B0qogUVa4K<~ z%Q{mpTrRb`jCo5X_cJaUR9{(d*7}0&Q4xGSRP|asyOAd z=t%tW;7xvCozy{47)h!y{X*$J486t%_K;DIN=r+wWAd8`Vigrv5sAq>AK-PD_3&v! zymVG5JFmaiyHz_qM-{VbLM|pL2c#e#9hhn?fUmXh^xokkH{AWl49!M_ zL=wRagBbQ}wnXA8tIa^rycOPN4#V6&!-#k*>T7GOgXT5#iE97`f+Zd)L{AAct_f6_ z)zbCmwTPf6fT=c=!@pBQ1mn5Z%V*?j*~d^V08wm3+^jI`-?`S- zX{(F0Qe|yjJwZKeeOb}ldSP{7;8Dx~F7r$$F~?5C-C)+6d+E#1GK~2KtIAg}HrA7Z zfS$xk2ev@+8~rsWAv575DO#2?A9q;~`mU^Gi&xB(7MG!d4>RWmg2w@n`|t3Ic*q7i z*Os0=%h&n>9W2i&0!9yq@p(1yQkA33-!rdA(4Z`P=6TA~`r?`brQG;_C8dQyYz1&< zy=0skABppuXq`36e_pYqi`7P^jJU>z2ESPnXKrSqE$9n>{{hlvn!}$L(chtDy2z>P zl-0NLEI|)iBV3%`V1N>tjMa?s@xPVO(zRb&mQ%FSHE z7IW@RNleo`{mhqK){?3`Rbj2G`Yqb|(sRA79&1lbd4wri2rhP6>(*Wtev0m=3I0Iv zM}j{QR1!P`0J`r63Gj`!9?_m-+~*0T3CFhlQr3)OO@ijd%%*9Yiv3wX7p?&J zy8wPimjcWK(teA#Ogcwdhx^t~2@B3Zuo%jD)e@cS0^321PnY1W7JD@ILcy!Qz{ zAm~zH8f3eQ_2um){HUz;4eN8IDep4+ORLD`amTby+DJE-i|9)&=V8B5^hK zJ|pmp=tv#Ow!Yku4Y9-e%Z7#8$1bbToLulJv;C~Q0+=GJ$~wETXGRYe^94Mb`cMWN zN#88%Uh|yXUr%l=4Gf6y?Ig4|2WGIq2Lhuf{CWx&m=1xkTqdY`NPxboz<_8D{e#AE zCXK`yjkOH{^Aos1NbCSTzSd{1_Xh)=QEJ^0%+-c!)*pj2w12y-q{hP0Qt~%QV15}( z97$O3-$E)lCN;t%S=QFZtoV^E|2vnpsc|CnxvR1N$XGsK#q!aU8%%$tAHryb|Cp?- z9~%e6mqv3LxKV0Txv_9?ESIlixkNl{^D*tXb7OY=glO_-HeQr+2V%EVvE|>iD!sD@ zf?U>foBB+Gj^r|726mayoFJVN#1VK2y3!J}AIOA*2nG|}LU1d=Z3MRyNbL^N)iLs%F>sg5O4u@f^qmaq7_g?0`ab$WyTgbE z(395q>gpgFG@3Q0X4P&PqP^|1>@CIMp$~64Et!-MZJ<@yv?7}=jHGnX&=$-KUqhs8 znx%c^vYu}$*1mLE|7;qv`Uum#L+~NNM+Bb}{Da`11pgxVmf#119|?XYAhOIP*07MS z7~l+Rk_X+L2%md@IJ_$`b^MERg3Nw-{lBA%M+y7lc$tcK}Y2(T36GKU;n5vc=PcM8bns{}Z_ihoJUI=i`dco1Tj zWSjqG-$jz<)tmn6s=5>WTO5f_I+KM*JS+U0gPp2y7d-WN$n_8~4YNzn3c7))UcW$B z5h}Dqvqqhjr;4mGEBm!ppVeDi6p5R=5e=8Q~5328;J{62W$N1Fl+O<{f6&jaUGr6t`Y^IY```F6^|~Hv#og# zNyc>AyseXTFg&DXwnSs6QmYN)ki$BvRAj5CLUa|vQd7MD;h%^GKF*7%*v)Nqo5 zb>q&L)i`U*d3lD6oCFA~bwLgt>F?K&V>L}1PN!dr&$5y}|1D{oSfhj(AX%0p%Y!cK z+w)4ZJDS?wC}e+vHS_$w>O|}G^GD`(SMPDi=^@R!;rwFMmi2!B{B3H2weEtvuu$u2 zHkbq58S<2J%1W~SPZc$N%tHp>Jk~oAikq)INcMIjzf8eG$UpzfVW27vT zqexF)TOTZ63kFkfZZSu|r>rFB|AXL8ur}^FZETl{u43)TQM;|;W`xGMEzczdYBQ>s zWu>l5Y(4&xQ7SwNA;Qp)9J>6-9lMWV=p?UsjuIezTSkkJTRaPrhH-#9tX(*Lke@p1 z!uCZHmevP?i>ufBBc2Ah%+U-P!;tvdFdg{o!ojkV{QnOe$aLE=@|>~7iC21?v$Hb{ zyCCTv)Gm@-gZczO4UL$?t@=yT7cXJ0_Oa%iE+bw{m%;i5Q&75*K5>#Hl0b6@^6o4R z#uz0rndP>gxpcT16~%Fam37(n@K^+Nnlq1_+xmX%EzuE7yhc$hgIRD&B1g zGCb`fWa%{gsIW&)`7()?m85s2$^#6G=^vQSZ@6mgB33jKH*fUl33K=wGv?$@m59;a z9@OMibU+{r@kx7Gu=ltBr6`!i_H9!8-El^jZ3L~u1AusUr$q8Mn@K+RPu9h-?A>aQ3 zH;8Jn-n0doJ*?T+p3-gM`w`sew(h;QSnZege|qf;;jRT!0{?INN=wl^Mpg3h~GgBk;JK0{yHpNnbTi(Tj$;IbU5OzsjsSn z4f0839EqcZ6X;~1#v+%$q7mk6&Q+0wN`J6ot*@pA8ihY--p{&Fz=`x+e(EXn%NLf- zS-E`0vQx`v&zikpu6Zv*VEC<#csKfL8ZlBt4tkoYC?!P_p_M#+;}o^Xa^JK>Ra+HhCYVSPPANPU2{`E?NVsPH?7v5Qudd(sGe5;+Y+tGH(zmvEH(Hh1^nkrTaTeY9fKdIJHx0q@)P4!|RhP}R~ z##wAgq;>%Hs*;8=bT>9NsoR#$E*57ctfH2m+m zt$w!_XfG=J@i$aYd*%l!(K_wcVHt-}R*4%TRRGK-Xg&&qz^z3?yJVJvYSeGynjY3! zzh&JuBr8zntE%1DDP#>yghOG#cYHyPoRm0))so~Beqv%AFjQwTHn8YjLM|ZcSXC^SMs(>4h}B~`S~W02N7aOoAQng1_axz8 zR`TeNypnH8A zfk+flZk~t|R+y`-lkcAAm6}#s`|q9}&S1eJ<9N7G<}4<3DP%I@L=rG6v6ch9l4W)& z$UKRDuM)gMFp;^^%oK5BNl2DZ&F2vi(dq-R)w74!)mPVSl zt`M?qVxz5xwKtV@=-v_Gx8Oywy#sMlu!FbmQi}!R8#G0a zhiW61iBH(DUu&oNG0W_ZE4bNCm}=P2UpD49_Z4c@9_zaMhN#auDTK-PX5$GEg+Xk* zz-A&hb`-=J-d%CaT_y2lO{t}&r6b3bP8vC8L`ZXv+J&`A^ll_kmZHdfGA{Iz7G`5zLpA_3A@4VPT6h&gdKQz*^*o^egz^ z%y=@agho><&HCEdl5c?VlTIcBpUaghXD5T#UsqLKhfNSr1nc}2LGwZ4lh{IA$+@C) z1=u17tB2~Z^}xeJR&wpg{F>n309Z?>-9y%)#qffy6?Jvy?-*V|Ak#q??$?9btst~~ zJ&cF`3q02N!%O?efd^KA7k2zhf{Q#|`fr7G!{OnH?*+9MH#XwD+WPw8^VI1^nvoSu z2*qP_NcLX9Q(T(MNN?YlbBb%ZYm6)KW#@f4ryzVeniI_4t+tdXS92mZkQWD)krPV1 z+I5Y_eaOK?qgOD;dg9SjwU<>P*x;KU2Ch+W018YYOG)fZ8hnX+Xwe|U|RreDMBxds+`lcc01D;4q z(DWJHd}3fnge;4SeNb#PKkKhA9&M zg(Tq9x6yv7N#$E#yzI5#+@|{5KkQWt?X7WIob}>gj-JrUc&{Vv0k_aPStd45Mckmu z@8Sk7m^^Tavle=^i^yP#uTg4`h~o3HlQZB4EGhJ-DH$5~J73iS)@BLx15GJ?VNvSu-O8 z#jp=@lr9pwV;7kkVid$#XGbnjnl<3+EUVzJ_lz8mMl`arM=siN))06o6K7pTBKx3ZGnT{Xa4m@1~J-p)^1DLdAjXwuRfvp0#( z9Z8DK1(8J4kNq25yfBwB>WK1ae) zW9|NXZkYV~*N}7o`TRPjrm=4iGKx@(FjTQt_=$}Z2r3B-0`kI6$mp=g^mRsSA%g`7 zQA|YEe~q)|yjiFwwpP74S|!&of{!^Jw)Vd@m_ph!Zxx4WZFROVC2^=@-Fn>UaVAY! z=Dkc26W*kU@1tLbKo;?0N17i*+n4c$As;J>iin1FKPguhvAm9z&e;uet!n_%9b5HC ziW9@>o=@Yf-@ZLT9pC!I+mEW_|Hfj3s%XzK&mo{V(q4kJu}e5PvF@D(b)+F^mRV1} zJE4@dfjS{3BD(byY;DB$#tQ7jG;0vzNd0W8jKQZ|*6{ZRq`b-Ez5ysRpSDhYZ&H{I zD#;UrwV=?P0jxWFM7_2C;M#h_q@~l50R??;^HZd-4jejYlT|0dT|JB4Kp?z^_8c>t zpeF(6;&!=r5uAsZ;nVb-OjkNwQ193%$HKjpu5KpcNV2n!uAG*{WUr+kIbF?fZ9CFV zD1w{A)<51aaW?dbRJjeA%`>O7k;Db9 za=pKuW{|22$s{sZnlcl!L|}ro`|TX--4BY@!q$WjUs0tiSwYU`rrT8} zG-u+Oii%-Yzr#xVXhWE)1vcL{G(efhIyP2|&to1klgIi`S|4P9ba4V)*zC+%Nw5Qp zxNnWW#yp#?C4Th8dfHk8u2>29ZjK< z-i#}qFZytdEF4;}CVgByM@BR!)@`5WrLtumW6OHw(-E?u z(q-UuQW4)}%Vi7*>Nc{)l3fh-!g01Uo*+dEf0Oaz>8A)-swoq82aX^DNQEcJ;E2_j z8xFd~O)@rcf&^qi<3g`>|7Ua5s@Cs68>@6O7jq@jm9=jhm7Iwrb05Rz17ONN6;ZHd z3)?^%u;)jBn6SVi46)Sb(RO%C@ChD0a!)iW?3PA3RKQE4QX_j z=1JF{E@W~hBbE~o-R-?hx4DxIPimRG){mf;% ztF^~h*J(ZXpo$m+`|v6=*8rMx(Or{93_@lQp-GTYWSc@_g^VIV=H~kl?vA$x{cG+F zk#mKJ$aqBJJxUQoBwm=se28jpA!s7_4MB*Yncytz)_*M$E@duZ@{YOOVZnku;aD;V zu3)}939bZ)qz3DQ5P|~Ot4r*G+`Y5dR0Px@B|MF_|#6##g(>@J)X> zo;xuREy2|^=(3qO{WRj|(ve%>V>S^m2lF=_F8P#E*9^bMkk~w{qu|65|7E%-B^_C^ z?De)j`?+{1>s#g&SI;hyl48YikpGFv?pK#hRTqa@Qi)b(Zo~UOSMmj?l87eS8D&w- z52Cb+6!scRqdBOoq^EfYKRTGK!!Yln-xUOR6Wl`(men#bpU9vSrYcOA!#&~&&{ipf zURbHjm6H)t(le4%fo;fv>PqNLJeyMP9Qg`}{Z3CiHc*dmC&le-ClwdnOS-TRE7e!6 zv0qoJ>KDVzUaF}++NyYay`~;h=d}%YtHp7niA%@}oU`(&QxOEuJ!PdV;eCYQwAz}6ow!N9JS~OK^ZylhTwS%hd=K*Shrv4z~ z@J%e=*~^Mm;fO-y0iFR<5{}Tc3pvU$t;g^x0?z0}dtb4dKk+?OzzI6S`bPyLwZ2PV zNSetI%gqlFt!a>*Uab1qlLo4^ zoE}lL&DDtDOzTRI^8Deii z#S`gH@9tyXGRfaV*Fpv?A~+48V?uzfEf^?CbSB|0Gt+X$UO}*u;A8^M(|Y2py85~; zFtPzh3PVZ=o=?G?a<6t$cpoJCOM<6DjC)xVn z6YL;(L9-tltnO3w_QoM<`L#Oj(}z)Eboi5Tmd)MoUnxs!#EhFRYsyfhc(K^ zHO^5~EIXE)UAkYyG@%fR>1H^U(8ty%(Z!y_DOg{?7Yv$0yLvj!mpG*gDU0(2L@?^@ z&MvGqOek}WQ0zWtaU($&Vy$DmWdwbgRwO1N#IQ(=LSkK{{}=(zWRj%>!qmGGA9MYd z;5!1D-kxR^ILA3$b09uT=EO#z46jHE<<2lyqI|)|fJ3wUnb0Qq9W#4^fGp395%W{@ zdz#=61W`^4*Ejt96Tve8m@YBzQq6y!UM~>5NbnND{}8+kFv@&|&Q}TkOz;1@!UnZ+cG%S}o#y+ouT8Rt?XQBx!{ z8Gt9UxiZe|Ld7i{LGK)%0uCc4es>wx#>~R4_L{A1$<5+GS zQ9DqTWIs7pO;tIz8mE4vF0z})sos58B63sDHB}?3xG)7wj%XkFtL?kSso`^&B_>U& zVwW;x5meA$E^^j+Xtpc~C*UM^0?r}w@n~kRwu14>r$$gX!0NIaYhOn>av}43w)nBD zA+8q8Vy)R5tpk4hvXQ;*gA>$G-u;MX+H#EXsflXUVwqk_G@vF?iY((Avd5`i8oZs6 z+sny_vYBMs-NboklD%${st*5zR47!2n~NnoGFgVRcE^=xQy8n%Dwh#refb~@AS-o7 zwT#;i7TU?~*}^C?f^pU|SdaFbPQzTTK~eemcg(7uE$EKe``F=0kU=j^vaRFPXw{Eh znAP^$aq2WR_d7L;tAHOdgAFJMou%k5WT66z=%UT(;r0&lB;i!M+k^3vg6*FOb9Mmj znxbxWrg33pZ!w*Vc}a#ET^R&!0uMnPL5v^f@l$4~caau!FGSrXvzYa(yBw$eYL>#3 zneVS2vHEk8{n=DCT)WxTmN!kE>dq#0JC@Zwbcqm3V@MW9b%K4Jm8ti=u-@YoYCQiX>VtiZeELEbsoZx&P(07*g`O675e2=rf zcr4yoV!Z2#1Z(Ll#rBJ{R2_U1?S@^-W4|<89h%03*v^cZ2^(i+mAsUs@ER*EBK4Vc zy@6Oz;u+al-e#>$!+vUxDpe=j-_B7()JFU9Y%T9h?B5mC%Xpd3Xu>OmOx^5$Qh(Kf=iW;3(s_Iy94}$KHBPbC{ zi;1aS@FFw#HQdtSY;_PtG}l~?EcGOsMVuMQOm!oM7*mKzEX`x%3fB&yr3TC*1{T}@ znx~3ae8rTRj={^oPQWeY(beIvS<5d8geHYbQleDC#dyCtfY}rRMB4qKiekaCz^+9{gjz^E^Zroa8Du#NX(Ko;lX_^kdmL?VF9iwBf6u*^Ii(J=Ff z?Pr~xdZOwlchl%e(OYS7$Qxa6PeZ_R(T36-5*Ug`JC=AENf2pE?K&G){431i%*=tu*~EM26FK6sKE=b^E~-cSSSz`aau zRS(oE%V#x(X2D_Ccly_OtU=C|}Oo#FJ2vND1%p^BZMbE7Y(7 z;w?tSb@YA)h%%ogmJZ>~_2d&&gKen6i{CU3j!;VV_YyqQEF_w$Gdfa$%4 zZpo|0_ODd)JDvANnnNp99`58s6e*J|Cz1@svCh9q)*YQyEzX5aIg9JDGBj$LzX}R0 zxUH!DlM6(4loeBr1VcvPCRb>M9#?~HwH=rmtotc?s=Y#%vU zjTkS?cLJ!Z+gT(X3>Zqf@L$=3{w#^}E_?ndYEzuYgL|Fq-=Cr;sipQ$r>G$rq*^bY z*?0o13rV)8y=ax1wkjCc;+2cDjsqQW%5h_>Ym(vFi#?4-yj-0Xzb*k+XKB%^v)mzf zV6ntXiN=!4v*42!a<5ColY}SP{(hC3uA1!0r>f$xbnZ87<64w%Rsmp^If=NIAVG%^ z$$Ewh&D7FW2f%A<1o2Tq6QYx}f-n+CS&4HIml^AO>2~%FgrzW`bXctOyJYBb`bMxG zVj{^}7=nNz_(f8pd-;VOOov1j7!L0QcM=q?OkSmhyJm2emRzXCYqfX{i3e(#$Nr6u z!|KcI9lCmF+*))hTI945Zrxq&3xW$J`f94`P3WGrW!Tn8BGbK%!3tc9Wlpj8o~HV% zDfYvsse$=S3G=sa3opiSX6a59wSPWM_3E{nwZr4mlGC}J^2cU^2v;2hkUAE$rLyX zwkg2=yS0WEV>(<@8H{HDoHWNu!hi$u3jhY}7@)nwH3RBwymvfx%k%R9&y3e`6#auwLlj-{n#{9d>{-IK> z4Ij(7%teePog|r_z)zAI?s$r6W^XYAAtf(sAv&5UZ=z6%w#L+8l0sP|s;}8Al++Gi z=16Lw1(JWfLxGj{M^)-9?I+D%w^sEVKdmcE6S6*zg^8U?WOf=49h>1v$jDq~KfG2I zct554Y5SeEYM5MN({;L+W?_cF=3WAg4Sbg_VUzoqI+>r+9*r((cdVf?WwbX#MI+6n zOU!hlmge)bfD6Lr06M$y)Q?z*FxD8W6b39PmZ$ z>_=)Gv;^ZK)kTj`bYXWf_I59`6RGY)x>m6@g4E&s6uig! z0zKgCe4RYRvaO(A%}7i*4%L86 z8{by7S^4TH6|2e+sUrPA7-ZBoVVL1JMNlB8X|)An|5Z3d%slZ#BUbIwwu z!GP@rXQ{#IW9cV0qCz&e$PS;S^0hlt?d#4`7xolXKgEEP5w8qtyU(5$hU`LhT~Bw6 zYt^+pt05av6M;P4-WXQn`hU+05vT?q@(+Ryp)QSCNxC=fjh%bY{Pf$rvWnXfcn&sG& z=60b9tcq`_!KRb7{@N|hFp3$NWKXA%yx5k+jwBg!T61hm|78AR$+??;LSiy)&11kZ zhB1iV`xr;4O)NmNM%mpk6Ven)B`unJnAcLa*`h0+4Ht`*%!oqFLcQ-YR47{LSnwg1 zko^n@3!l86PGOc})Vh(MHxt}Ka09_j1h*52q3c$<1i@W!Tg8AY39cXzyO;3K(ax@^ z*w}%<4y9T!`EN#TU|ZIr8G3T3GasE6Zj;!=WP%2JhpqDSpF|G4OA718+%*u0x_N&g zbaDH4wwgQs31&?K)RW}qILA^Yq|=3_VwBWqPrX9*o>r|ckzcA2w`&5Z@2qe~j|9AG8>{yWn1+jbt8BrbzjMNb=f_mw? z*xc$Em53{|0dY?3VgIyGEm95k!u@JlLTQ|c^qbqR->)ukhmDbY-J!U3DR@TV8I5NQ zo>Dwx@!-;I^Y47O4BLlWBMsb!yl%WPYA=q&A>?Q%e%%=H<<}SZD((3CH@+rxeEo#4 ziP103jKkL?`Lb`nN%ajIqxZ_W55rN9B9gmsx61=4>ce5UXn975MN^a`rNkSX|{ z%D03}?G&;AA=41DKtiT<3R#Je=?GaVA=9^oW7(}i&xi8Eg03!*|4f)274G2f<>WhD9Le5 ziT4B=V7$1-+lXt_#u{w1#0D2$t@j3k$}lyd zWAR{bCn?|^c#87d$a7U6p0n?R8*hP8@W>rk9NBvd#*xha!puZ}7Abfx(llu!2U1_A zJOZmKPF+he_T#sx67LS?e3%P+)`)Ww?34p)(Ab^u<8skwlmeaVrgx6=D2xq{Q`5eym2C{_;Go-N5*|i}_tda4`XE zWA3(>+^WX*=X}arI?tsat*z~DM{KjNyHyR!^`Tir{ioNoQJhXlfS* zM_`ft+(Gq~$Md7dYyaU+bzJ|ydw)zQNrEXSUGBE^@|5h4nkW4Sxv}EPwt~CVGL>A* z0?<};fZcqz+PNqTRf9$;yF8B)3B6d?`x)aMeu_ZVn~^j#he0wi6*8Q)lXHp7(&5On z%kEJJM~bj~GD6BAdkR&2Ckns&F@RxY?n>{JID} zg1Mf9mX)O8q&wWP$x|j_srP@O$mqY&WMa}tUzTwdu~$r&@Y8N)VQ}6UmSRmVvJ>ye zj?9JW_OScaBJb76r)j8NwqNDiGwM}B+co#AGu1F6=0H1dZNLIXf{+yL6%2~0EOxp* z=#V--TZq1qE#645iC}}>e5l=AAdDw^w5ytRKa(*Wp2k)PW612v7$lNd#>pb|1l~*_ zd@R7!GDy2CI3~ekFfWZ7w?(u~a7K;{8fMN@6>?`>z&TYRmEXY3uVW=+BF(k@EJ7tB zx%QYtDp&h$x_#~gYN>Z00-A;i0^7cRK>bAvcTA6EE9M=u951{>c(pJPF3aj^ocCm{ z)~Ns|8K`eD9x|AfnM4#FN3e{aB8e}jYXyN!G=g9rxj_Gzf??Tw7K?Q{qedr@+QVwN zqfeD|MY%*1Ryv*uq&(rLQU~daDXfSvA7Rq_8860~H;_Jr4U3v0{7cxRbXNr<3nIcX zOgutQbX9aozf0pq*OJDIiXx4d9+n1n3>4>xe`co+mZqc<%Sk*p>#VyA^7Pb=z7aLm zI2I)*s{@Y4&_ih4;cv3HIfS&bdTwsDpL|4}_RFo`qaMXrx-Z>6=}~pR_j-~-p+gFT zA5(XwHcN9F zwvWCiBOe~usNu((1Y-D9#Gr@3P2dHyZ5+y!?}&$+X=*0bS_;R zWkVJ2g-;l1ZV()>j1ySQa#^G08Aco}^<3zDt1tC4Rc z+1cK}^JM`!?}W>C;GIA-J8nU$Fh4@9dFB_a!)XAR1ElqAII`@FiIWiJSXAIrllF_+ zc<@>9ASj?=khWLiA4gCqtifh}fNhLL+NJEzpH~C1btd}-Ra8Yu0ced8>3p`NyX`ZJ z86a2{dvjkVjE}V*w^s8&PxPcq2P({)S^Q4>IuzFF^eRO`hf7X&?Cddl>0Op1LQ@yp z$0!Df_#^{b`c}rWG+xGXjE8n15ixUw?_sH3NQ6l1M0N2jk1U$++9W@Ecjy zO#~#u_8yR}#B%BimICP$u>)+C(_snp0oer1Y^M8x*%$<;5Zn$wp81z+_R5`%cB7s= zwB`88O+aTLt`m)f<}4S-CYM6Cy9gkX*|B34WKmm-D{O*+-WhFAzN8i??M`=F+RF-q z^4Hl4t8@daDJ*0U^R2U|{Z$PK%L*15NBeqS2g`t<(1qfqhdIj3TacGC>M-DhCr*+i_v7>%F<&qk|#RG!^}-6`vG7FnF;oYDTk>0cT3blDUED}=n4Di60(x2#D=I4 ztJGRrB`h&UmmC3MX9KuUm<)j!nF;C1IFK>e9WkXk80tbyYy!7!$;n!0`o4p$CyB)R zUr6Z;(S8mhR8Nau;}}iXNyaE-^NIi>JxK=b8Ak~zJJTNchPq1KC7U~W8{20~9wk=a zC#YhNnMu^BDMzz@V(Rdg44P#gl>`p-9lod);zpUE4(; zD%{RA$2LAvhvq%R$|NpXxp>9G#S6>kN>S)LF@+uKro^7k!JuP`Ys<9Pe5^)l54!D3 zK2`&>Mww)yL{u6;@{)X-=;n&aXp7Hxz}i@5Ov3)VHM%equI$ zpN4mTd58PpNAKX#+}{|`ToB}bhQwe}2+P<;VW>ZTQ#I=vty&>`KxjZq@;+B{A@Ea# zr#MuIEbj~EhTzl3wGIU|Txj%#fv5oNvrxlmN^mVTk4ec<|`K5!L_D+8{+p}bJPP=2T=RBQ~| z>!rW6wl}KwPB1^%Kh%4hLUjOQ8W{X(Mlk*I*ts9EUGeC!#b zajOT6TNwXM8NothFnY5Hm>CipjQg!Tyx-~+nznMA2cI>#F3x#x!p|KCixG1mFfs)1 zLCqybN%PS2K!4`K^IR>1_qpIZB#iw41C4loZe-91V`%eGY_Koc>8e!xx!&ywp^Q25 z^M44PYK%Z=s*^mJ6&kWlb);NqjBFkn9Ewbbp~zw48V=WRagBg$M77Hph43N^zevc! z@eYp;4cn~+)`x}*9DzbM8e>Ak(7w{paKN#l5ojgNf$@kw4#`F$&N+Oyj1m)RF8s$E zgmLg4jb~7(1aOQoVXp_i6GJ6{ljwu@aUm8vIg|l7C77>=GL5`#Sl%(F2J=HbqwZ;N zXGPu9L&Fd{BQzXvW@v<^nnwx}e;*o(iU5X28u%^YP!G_=|5DT zC39fDoJ%8QCsQT#2cpq2^9+t0DVYu{De}yI%Vs^Qg$uVzl|5 zwT^8(c#xkm@jb+f;S#`xE%?q2A8nnpxbdwBKV_W5j(JPbFC>i zH~DJJnd*3iiqb2yxTwgZnboDlh{z+N?}~D~m-y~bb#b8=mZKq)+V}l{oz}lY0-S-y zr4UY+QIbau>b77~N3!1&JVo#{Bc|evKK3O0@Do405=^w~7G^I!LFuYwl)0ZCa!5=@ zlnkaAJ`Xc95zDxFCEmFUvEE+wqZ&IyP*0^>BOd$4_d` z{4{zOvSp9cRRmY0CpUj|V8q#(|2YLD>fat5f58D5{AJ1?eml+WNw@p`tQL=!&2l`$ z_7ECLcEF>c*PuJT&$7w|~&p->Y%R)qHQU2Bw*EJmo7bVfh&nuYav1DXE z@3z-?wHc!st0`&Baid3%7(E969R&Y|ge<5QKvbK}@LQH;zvR_MheaKTX$fAFMga3Q zDTgJ>i2aU!-vX4x>CP{12=#~tCS>++ghhH*HU=B9w&L_%RGXG@{ta?!%tg^h&f9Tx z-+f0eKIi?*?s~uF;Uf>*TjRAP#{f34Tg77nDXq3Awz6o=MP(hI4G{xB;HG z0hD%J3n1!<*o>cGW`f6?-S*uH+QO&5Wl{i%MTRPS3L8Kekd+qV1I!H0tW~z6j&s%Sl~c`g9Hv1I7DEH zz@Y+%2^?-fh`SL#d)?`8B-Z8SZ!Up-+SnC^L%32q~}o!}0Fy9n+kxQF0Ag8KoQ zdM=gUhbxG#mt(5L0U%C^&g3XssWVq1_Q05)*p!K5fc*6V+^*pyM!FizU5!3=*eFpT zjb7UE9SWp{0^iDM&;lwKYbl!5?7x&giD}#BB6x|ofXsJq- zoh{~S*6%f!U68AdoctzIVRuM(%4J4i6ZeAfQls|Ev<|W5T+_s%Q+rpgHl))!Pz$qt zo?$N%bP;!`znE_jP=UgQFLEE4Tv`$6dbdZ1%&4bymiu6oWEnbcbmd+bu_=d3O1jnG zL|+qeiV}e-rFUp9xitfmQM0OM6LFLkNdf=*vjvq?qW)klYNnU$tKkeX9=Q4=|l|ls! z=XmjGX;Bp{sgnw(L3Pa6PWC2zqiyx3*tg_s1-RkBV?UFxP0-$Rx4HXkgO&E2W)CmW zhGuLfHGfC!iirP_W>*zxL$r@Idk@}fnf+jaHcBmN`=~%Ws=}Wjb|X)&E&t%bo8=VG z(Ve@F+;FpVakcqrd+@AI!5`jqb~O02_Tb~&gWtdM;L)vDMT0+Y51!o~3{B?4t=po( z7!hvh_t7nGi8k&?FPbPdFGE5MjC1f3`vlzFEZ5yl^0J28mTf;Mw*B!SZKn3IyKTf^ZIpIOtKcfB(<<~^Ec0yw zNDa~DQH?IFN5Hs4kO9EOaJnITL>KLQ(k1HVyDq!6M4O_v*`Jqa6HduuKsG@RK`(+& zPykkxr7>~z=uOavAeW#oK^_2lC!g;A1O)^G=<78vvqM9*1z|k_mQ38Vgr7g|V6dIA zIlTcHbY}1bA+F=3N0(WOBqkPP}bby*@axI3!85dRc{jr zzG7>4U63Z7N6h^vydm`0u+=@Tq)i>j>JC*7{lo|+(K&RvjWzk4&G>}iQ-aS3z5u{a zE;+XZI7@@wk(8XxY7E#@higgNC)xIb;o1$_m+rRDhHH;#nfD`;Cij?;qp@RDW{AP| zBcrqxO1FEC){YlO1diDAn?RxtZof_-c!D?D|p-rwZL|pO5>p!_<3dr*N<<}yw&#{+{*UnU`?e6i~^0=^6 zJ-+>i9mP0vnAMWaKnv*7*`E1yk%vV0xA^!S+eOyo9$8u`(wodI?_YJ!`*sU0S-TE` zFxC*WVkNDlivpOQWvGMDD{YEBza* z{hJ&{vV{IJKz2me33^V|s(N+sHW=vQN{acv{*6gDE zO@{KXt=YFvRkBsLkoXW#MAr;tQP|5)nWoJR?}Qs;K)4V&NhfwIT+z+&&fDq4lq^k` zm5A6D9l->fjxO&eJ7gl8B%~!Bjp$|GMvS^K_2a@RXCna4`X}2TOw(-bfZN_W9o&_{ z4(iznC8L_+P_>a|g4Ccrwx@i|9mt3aO_X>;!sYPR&7Eqh9zI`yffhAqftnZ_%yZwVg=|a$g66sSRC+W`a2wUdF7!}7_F0B7- zmKL3>!f;9_52t60W@FS9&j3ZxL1NCbmKR8is0wF>i-||VAVo&Xky%4ejrIYy0`V85 zg)ayr&_F25O%KUs7LcTOT|5y<`3si3pJXSCARO?WdU6LtcM=G3Nd0k?XqMLRm;Cmc zSz2%HuQ_dPcq`>?d+~U@XTL(M7bA!04~qz&dX1jsQ(z2OJmSTV7QHSd2+}{X((gC; zt8MsAS9{nTEx*@5)?yFg+e>X}wS9lzG78jP6=yEMtxoi$&h2 zkIk8x;$9la?XUrriw)=y`r|9cPB}&;^Zek6Gt=yo=4*v%N&l~@a|?~D2m|oW>~4BI zJvljXiKdDxZEBj>R1FQeY|5rB=cTajHZEBcI-5l;=n};1lRgbnU-VT) z>x-E%FFHYgk;y_yl9f6S_M31#_ukjO=_&%QdX#Z{5LBrnY&;%;QSu~Mzoop;DMSvWFf_VbPdz@0=G zlwyoKFMmmyOlXKTkq68{VvK?x1#zdC#kzY@tSigOqq3>Wnv@wM@K7yBAmzB(H`{alDl>c#c@)eMbQB!p@;E30 z_q1K^f}20leXHz?1w9wMO`>k>^uDrJ&FMk?y|SZoQn(M35*0$6o|e=~r9Zg%WBM0WU_ zm%%H*ZLfF(=@R$?xH-kIkiG*yfOYT(a3c^m?od>8ZGc)j4xEW7IgL=36NM&3Pc7&? zV+^b%O=Ibb3bV)EP{Eova_@4vQLBtfnI`H7q)5Dkr|eWwPugdTdPk@1Kxo-n4Rxqe zp0DheMLp#E$u5~{iPV;)y=z|g%aBY4B?Zs(edYCdb^Fo09?yD1-cBzN%`R_SxYbu- zQ{;@-6{dX^^n`7qIW3xax|j{VGspZNBfaPlXjX+w9ADr zNX)%#nuvN~Dwf@-$>_Lf^IRvITZjGLQ2BnS0OOXSSnJ%KdHa}10SF{ ABLDyZ diff --git a/app_vx.py b/app_vx.py index 1e51f6c6..9685449b 100644 --- a/app_vx.py +++ b/app_vx.py @@ -5381,6 +5381,114 @@ def get_comment_replies(comment_id): }), 500 +# 工具函数:解析JSON字段 +def parse_json_field(field_value): + """解析JSON字段""" + if not field_value: + return [] + try: + if isinstance(field_value, str): + if field_value.startswith('['): + return json.loads(field_value) + else: + return field_value.split(',') + else: + return field_value + except: + return [] + + +# 工具函数:获取 future_events 表字段值,支持新旧字段回退 +def get_future_event_field(row, new_field, old_field): + """ + 获取 future_events 表字段值,支持新旧字段回退 + 如果新字段存在且不为空,使用新字段;否则使用旧字段 + """ + new_value = getattr(row, new_field, None) if hasattr(row, new_field) else None + old_value = getattr(row, old_field, None) if hasattr(row, old_field) else None + + # 如果新字段有值(不为空字符串),使用新字段 + if new_value is not None and str(new_value).strip(): + return new_value + return old_value + + +# 工具函数:解析新的 best_matches 数据结构(含研报引用信息) +def parse_best_matches(best_matches_value): + """ + 解析新的 best_matches 数据结构(含研报引用信息) + + 新结构示例: + [ + { + "stock_code": "300451.SZ", + "company_name": "创业慧康", + "original_description": "核心标的,医疗信息化...", + "best_report_title": "报告标题", + "best_report_author": "作者", + "best_report_sentences": "相关内容", + "best_report_match_score": "好", + "best_report_match_ratio": 0.9285714285714286, + "best_report_declare_date": "2023-04-25T00:00:00", + "total_reports": 9, + "high_score_reports": 6 + }, + ... + ] + + 返回统一格式的股票列表,兼容旧格式 + """ + if not best_matches_value: + return [] + + try: + # 解析 JSON + if isinstance(best_matches_value, str): + data = json.loads(best_matches_value) + else: + data = best_matches_value + + if not isinstance(data, list): + return [] + + result = [] + for item in data: + if isinstance(item, dict): + # 新结构:包含研报信息的字典 + stock_info = { + 'code': item.get('stock_code', ''), + 'name': item.get('company_name', ''), + 'description': item.get('original_description', ''), + 'score': item.get('best_report_match_ratio', 0), + # 研报引用信息 + 'report': { + 'title': item.get('best_report_title', ''), + 'author': item.get('best_report_author', ''), + 'sentences': item.get('best_report_sentences', ''), + 'match_score': item.get('best_report_match_score', ''), + 'match_ratio': item.get('best_report_match_ratio', 0), + 'declare_date': item.get('best_report_declare_date', ''), + 'total_reports': item.get('total_reports', 0), + 'high_score_reports': item.get('high_score_reports', 0) + } if item.get('best_report_title') else None + } + result.append(stock_info) + elif isinstance(item, (list, tuple)) and len(item) >= 2: + # 旧结构:[code, name, description, score] + result.append({ + 'code': item[0], + 'name': item[1], + 'description': item[2] if len(item) > 2 else '', + 'score': item[3] if len(item) > 3 else 0, + 'report': None + }) + + return result + except Exception as e: + print(f"parse_best_matches error: {e}") + return [] + + # 工具函数:处理转义字符,保留 Markdown 格式 def unescape_markdown_text(text): """ @@ -5470,6 +5578,7 @@ def api_calendar_events(): offset = (page - 1) * per_page # 构建基础查询 - 使用 future_events 表 + # 添加新字段 second_modified_text, `second_modified_text.1`, best_matches 支持新旧回退 query = """ SELECT data_id, \ calendar_time, \ @@ -5481,7 +5590,10 @@ def api_calendar_events(): fact, \ related_stocks, \ concepts, \ - inferred_tag + inferred_tag, \ + second_modified_text, \ + `second_modified_text.1` as second_modified_text_1, \ + best_matches FROM future_events WHERE 1 = 1 \ """ @@ -5552,90 +5664,114 @@ def api_calendar_events(): events_data = [] for event in events: - # 解析相关股票 + # 使用新字段回退机制获取 former 和 forecast + # second_modified_text -> former + former_value = get_future_event_field(event, 'second_modified_text', 'former') + # second_modified_text.1 -> forecast + forecast_new = getattr(event, 'second_modified_text_1', None) + forecast_value = forecast_new if (forecast_new and str(forecast_new).strip()) else getattr(event, 'forecast', None) + + # 解析相关股票 - 优先使用 best_matches,回退到 related_stocks related_stocks_list = [] related_avg_chg = 0 related_max_chg = 0 related_week_chg = 0 - # 处理相关股票数据 - if event.related_stocks: + # 优先使用 best_matches(新结构,含研报引用) + best_matches = getattr(event, 'best_matches', None) + if best_matches and str(best_matches).strip(): + # 使用新的 parse_best_matches 函数解析 + parsed_stocks = parse_best_matches(best_matches) + else: + # 回退到旧的 related_stocks 处理 + parsed_stocks = [] + if event.related_stocks: + try: + import ast + if isinstance(event.related_stocks, str): + try: + stock_data = json.loads(event.related_stocks) + except: + stock_data = ast.literal_eval(event.related_stocks) + else: + stock_data = event.related_stocks + + if stock_data: + for stock_info in stock_data: + if isinstance(stock_info, list) and len(stock_info) >= 2: + parsed_stocks.append({ + 'code': stock_info[0], + 'name': stock_info[1], + 'description': stock_info[2] if len(stock_info) > 2 else '', + 'score': stock_info[3] if len(stock_info) > 3 else 0, + 'report': None + }) + except Exception as e: + print(f"Error parsing related_stocks for event {event.data_id}: {e}") + + # 处理解析后的股票数据,获取交易信息 + if parsed_stocks: try: - import json - import ast + daily_changes = [] + week_changes = [] - # 使用与detail接口相同的解析逻辑 - if isinstance(event.related_stocks, str): - try: - stock_data = json.loads(event.related_stocks) - except: - stock_data = ast.literal_eval(event.related_stocks) - else: - stock_data = event.related_stocks + for stock_info in parsed_stocks: + stock_code = stock_info.get('code', '') + stock_name = stock_info.get('name', '') + description = stock_info.get('description', '') + score = stock_info.get('score', 0) + report = stock_info.get('report', None) - if stock_data: - daily_changes = [] - week_changes = [] + if stock_code: + # 规范化股票代码,移除后缀 + clean_code = stock_code.replace('.SZ', '').replace('.SH', '').replace('.BJ', '') - # 处理正确的数据格式 [股票代码, 股票名称, 描述, 分数] - for stock_info in stock_data: - if isinstance(stock_info, list) and len(stock_info) >= 2: - stock_code = stock_info[0] # 股票代码 - stock_name = stock_info[1] # 股票名称 - description = stock_info[2] if len(stock_info) > 2 else '' - score = stock_info[3] if len(stock_info) > 3 else 0 - else: - continue + # 使用模糊匹配查询真实的交易数据 + trade_query = """ + SELECT F007N as close_price, F010N as change_pct, TRADEDATE + FROM ea_trade + WHERE SECCODE LIKE :stock_code_pattern + ORDER BY TRADEDATE DESC LIMIT 7 \ + """ + trade_result = db.session.execute(text(trade_query), + {'stock_code_pattern': f'{clean_code}%'}) + trade_data = trade_result.fetchall() - if stock_code: - # 规范化股票代码,移除后缀 - clean_code = stock_code.replace('.SZ', '').replace('.SH', '').replace('.BJ', '') + daily_chg = 0 + week_chg = 0 - # 使用模糊匹配查询真实的交易数据 - trade_query = """ - SELECT F007N as close_price, F010N as change_pct, TRADEDATE - FROM ea_trade - WHERE SECCODE LIKE :stock_code_pattern - ORDER BY TRADEDATE DESC LIMIT 7 \ - """ - trade_result = db.session.execute(text(trade_query), - {'stock_code_pattern': f'{clean_code}%'}) - trade_data = trade_result.fetchall() + if trade_data: + # 日涨跌幅(当日) + daily_chg = float(trade_data[0].change_pct or 0) - daily_chg = 0 - week_chg = 0 + # 周涨跌幅(5个交易日) + if len(trade_data) >= 5: + current_price = float(trade_data[0].close_price or 0) + week_ago_price = float(trade_data[4].close_price or 0) + if week_ago_price > 0: + week_chg = ((current_price - week_ago_price) / week_ago_price) * 100 - if trade_data: - # 日涨跌幅(当日) - daily_chg = float(trade_data[0].change_pct or 0) + # 收集涨跌幅数据 + daily_changes.append(daily_chg) + week_changes.append(week_chg) - # 周涨跌幅(5个交易日) - if len(trade_data) >= 5: - current_price = float(trade_data[0].close_price or 0) - week_ago_price = float(trade_data[4].close_price or 0) - if week_ago_price > 0: - week_chg = ((current_price - week_ago_price) / week_ago_price) * 100 + related_stocks_list.append({ + 'code': stock_code, + 'name': stock_name, + 'description': description, + 'score': score, + 'daily_chg': daily_chg, + 'week_chg': week_chg, + 'report': report # 添加研报引用信息 + }) - # 收集涨跌幅数据 - daily_changes.append(daily_chg) - week_changes.append(week_chg) + # 计算平均收益率 + if daily_changes: + related_avg_chg = round(sum(daily_changes) / len(daily_changes), 4) + related_max_chg = round(max(daily_changes), 4) - related_stocks_list.append({ - 'code': stock_code, - 'name': stock_name, - 'description': description, - 'score': score, - 'daily_chg': daily_chg, - 'week_chg': week_chg - }) - - # 计算平均收益率 - if daily_changes: - related_avg_chg = round(sum(daily_changes) / len(daily_changes), 4) - related_max_chg = round(max(daily_changes), 4) - - if week_changes: - related_week_chg = round(sum(week_changes) / len(week_changes), 4) + if week_changes: + related_week_chg = round(sum(week_changes) / len(week_changes), 4) except Exception as e: print(f"Error processing related stocks for event {event.data_id}: {e}") @@ -5660,8 +5796,9 @@ def api_calendar_events(): highlight_match = 'concepts' # 将转义的换行符转换为真正的换行符,保留 Markdown 格式 - cleaned_former = unescape_markdown_text(event.former) - cleaned_forecast = unescape_markdown_text(event.forecast) + # 使用新字段回退后的值(former_value, forecast_value) + cleaned_former = unescape_markdown_text(former_value) + cleaned_forecast = unescape_markdown_text(forecast_value) cleaned_fact = unescape_markdown_text(event.fact) event_dict = { @@ -5907,6 +6044,7 @@ def api_future_event_detail(item_id): """未来事件详情接口 - 连接 future_events 表 (修正数据解析) - 仅限 Pro/Max 会员""" try: # 从 future_events 表查询事件详情 + # 添加新字段 second_modified_text, `second_modified_text.1`, best_matches 支持新旧回退 query = """ SELECT data_id, \ calendar_time, \ @@ -5917,7 +6055,10 @@ def api_future_event_detail(item_id): forecast, \ fact, \ related_stocks, \ - concepts + concepts, \ + second_modified_text, \ + `second_modified_text.1` as second_modified_text_1, \ + best_matches FROM future_events WHERE data_id = :item_id \ """ @@ -5932,6 +6073,13 @@ def api_future_event_detail(item_id): 'data': None }), 404 + # 使用新字段回退机制获取 former 和 forecast + # second_modified_text -> former + former_value = get_future_event_field(event, 'second_modified_text', 'former') + # second_modified_text.1 -> forecast + forecast_new = getattr(event, 'second_modified_text_1', None) + forecast_value = forecast_new if (forecast_new and str(forecast_new).strip()) else getattr(event, 'forecast', None) + extracted_concepts = extract_concepts_from_concepts_field(event.concepts) # 解析相关股票 @@ -5975,136 +6123,150 @@ def api_future_event_detail(item_id): '环保': '公共产业板块', '综合': '公共产业板块' } - # 处理相关股票 + # 处理相关股票 - 优先使用 best_matches,回退到 related_stocks related_avg_chg = 0 related_max_chg = 0 related_week_chg = 0 - if event.related_stocks: + # 优先使用 best_matches(新结构,含研报引用) + best_matches = getattr(event, 'best_matches', None) + if best_matches and str(best_matches).strip(): + # 使用新的 parse_best_matches 函数解析 + parsed_stocks = parse_best_matches(best_matches) + else: + # 回退到旧的 related_stocks 处理 + parsed_stocks = [] + if event.related_stocks: + try: + import ast + if isinstance(event.related_stocks, str): + try: + stock_data = json.loads(event.related_stocks) + except: + stock_data = ast.literal_eval(event.related_stocks) + else: + stock_data = event.related_stocks + + if stock_data: + for stock_info in stock_data: + if isinstance(stock_info, list) and len(stock_info) >= 2: + parsed_stocks.append({ + 'code': stock_info[0], + 'name': stock_info[1], + 'description': stock_info[2] if len(stock_info) > 2 else '', + 'score': stock_info[3] if len(stock_info) > 3 else 0, + 'report': None + }) + except Exception as e: + print(f"Error parsing related_stocks for event {event.data_id}: {e}") + + # 处理解析后的股票数据 + if parsed_stocks: try: - import json - import ast + daily_changes = [] + week_changes = [] - # **修正:正确解析related_stocks数据结构** - if isinstance(event.related_stocks, str): - try: - # 先尝试JSON解析 - stock_data = json.loads(event.related_stocks) - except: - # 如果JSON解析失败,尝试ast.literal_eval解析 - stock_data = ast.literal_eval(event.related_stocks) - else: - stock_data = event.related_stocks + for stock_info in parsed_stocks: + stock_code = stock_info.get('code', '') + stock_name = stock_info.get('name', '') + description = stock_info.get('description', '') + score = stock_info.get('score', 0) + report = stock_info.get('report', None) - print(f"Parsed stock_data: {stock_data}") # 调试输出 + if stock_code: + # 规范化股票代码,移除后缀 + clean_code = stock_code.replace('.SZ', '').replace('.SH', '').replace('.BJ', '') - if stock_data: - daily_changes = [] - week_changes = [] + print(f"Processing stock: {clean_code} - {stock_name}") # 调试输出 - # **修正:处理正确的数据格式 [股票代码, 股票名称, 描述, 分数]** - for stock_info in stock_data: - if isinstance(stock_info, list) and len(stock_info) >= 2: - stock_code = stock_info[0] # 第一个元素是股票代码 - stock_name = stock_info[1] # 第二个元素是股票名称 - description = stock_info[2] if len(stock_info) > 2 else '' - score = stock_info[3] if len(stock_info) > 3 else 0 - else: - continue # 跳过格式不正确的数据 + # 使用模糊匹配LIKE查询申万一级行业F004V + sector_query = """ + SELECT F004V as sw_primary_sector + FROM ea_sector + WHERE SECCODE LIKE :stock_code_pattern + AND F002V = '申银万国行业分类' LIMIT 1 \ + """ + sector_result = db.session.execute(text(sector_query), + {'stock_code_pattern': f'{clean_code}%'}) + sector_row = sector_result.fetchone() - if stock_code: - # 规范化股票代码,移除后缀 - clean_code = stock_code.replace('.SZ', '').replace('.SH', '').replace('.BJ', '') + # 根据申万一级行业(F004V)映射到主板块 + sw_primary_sector = sector_row.sw_primary_sector if sector_row else None + primary_sector = sector_map.get(sw_primary_sector, '其他') if sw_primary_sector else '其他' - print(f"Processing stock: {clean_code} - {stock_name}") # 调试输出 + print( + f"Stock: {clean_code}, SW Primary: {sw_primary_sector}, Primary Sector: {primary_sector}") - # 使用模糊匹配LIKE查询申万一级行业F004V - sector_query = """ - SELECT F004V as sw_primary_sector - FROM ea_sector - WHERE SECCODE LIKE :stock_code_pattern - AND F002V = '申银万国行业分类' LIMIT 1 \ - """ - sector_result = db.session.execute(text(sector_query), - {'stock_code_pattern': f'{clean_code}%'}) - sector_row = sector_result.fetchone() + # 通过SQL查询获取真实的日涨跌幅和周涨跌幅 + trade_query = """ + SELECT F007N as close_price, F010N as change_pct, TRADEDATE + FROM ea_trade + WHERE SECCODE LIKE :stock_code_pattern + ORDER BY TRADEDATE DESC LIMIT 7 \ + """ + trade_result = db.session.execute(text(trade_query), + {'stock_code_pattern': f'{clean_code}%'}) + trade_data = trade_result.fetchall() - # 根据申万一级行业(F004V)映射到主板块 - sw_primary_sector = sector_row.sw_primary_sector if sector_row else None - primary_sector = sector_map.get(sw_primary_sector, '其他') if sw_primary_sector else '其他' + daily_chg = 0 + week_chg = 0 - print( - f"Stock: {clean_code}, SW Primary: {sw_primary_sector}, Primary Sector: {primary_sector}") + if trade_data: + # 日涨跌幅(当日) + daily_chg = float(trade_data[0].change_pct or 0) - # 通过SQL查询获取真实的日涨跌幅和周涨跌幅 - trade_query = """ - SELECT F007N as close_price, F010N as change_pct, TRADEDATE - FROM ea_trade - WHERE SECCODE LIKE :stock_code_pattern - ORDER BY TRADEDATE DESC LIMIT 7 \ - """ - trade_result = db.session.execute(text(trade_query), - {'stock_code_pattern': f'{clean_code}%'}) - trade_data = trade_result.fetchall() + # 周涨跌幅(5个交易日) + if len(trade_data) >= 5: + current_price = float(trade_data[0].close_price or 0) + week_ago_price = float(trade_data[4].close_price or 0) + if week_ago_price > 0: + week_chg = ((current_price - week_ago_price) / week_ago_price) * 100 - daily_chg = 0 - week_chg = 0 + print( + f"Trade data found: {len(trade_data) if trade_data else 0} records, daily_chg: {daily_chg}") - if trade_data: - # 日涨跌幅(当日) - daily_chg = float(trade_data[0].change_pct or 0) + # 统计各分类数量 + sector_stats['全部股票'] += 1 + sector_stats[primary_sector] += 1 - # 周涨跌幅(5个交易日) - if len(trade_data) >= 5: - current_price = float(trade_data[0].close_price or 0) - week_ago_price = float(trade_data[4].close_price or 0) - if week_ago_price > 0: - week_chg = ((current_price - week_ago_price) / week_ago_price) * 100 + # 收集涨跌幅数据 + daily_changes.append(daily_chg) + week_changes.append(week_chg) - print( - f"Trade data found: {len(trade_data) if trade_data else 0} records, daily_chg: {daily_chg}") + related_stocks_list.append({ + 'code': stock_code, # 原始股票代码 + 'name': stock_name, # 股票名称 + 'description': description, # 关联描述 + 'score': score, # 关联分数 + 'sw_primary_sector': sw_primary_sector, # 申万一级行业(F004V) + 'primary_sector': primary_sector, # 主板块分类 + 'daily_change': daily_chg, # 真实的日涨跌幅 + 'week_change': week_chg, # 真实的周涨跌幅 + 'report': report # 研报引用信息(新字段) + }) - # 统计各分类数量 - sector_stats['全部股票'] += 1 - sector_stats[primary_sector] += 1 + # 计算平均收益率 + if daily_changes: + related_avg_chg = sum(daily_changes) / len(daily_changes) + related_max_chg = max(daily_changes) - # 收集涨跌幅数据 - daily_changes.append(daily_chg) - week_changes.append(week_chg) - - related_stocks_list.append({ - 'code': stock_code, # 原始股票代码 - 'name': stock_name, # 股票名称 - 'description': description, # 关联描述 - 'score': score, # 关联分数 - 'sw_primary_sector': sw_primary_sector, # 申万一级行业(F004V) - 'primary_sector': primary_sector, # 主板块分类 - 'daily_change': daily_chg, # 真实的日涨跌幅 - 'week_change': week_chg # 真实的周涨跌幅 - }) - - # 计算平均收益率 - if daily_changes: - related_avg_chg = sum(daily_changes) / len(daily_changes) - related_max_chg = max(daily_changes) - - if week_changes: - related_week_chg = sum(week_changes) / len(week_changes) + if week_changes: + related_week_chg = sum(week_changes) / len(week_changes) except Exception as e: print(f"Error processing related stocks: {e}") import traceback traceback.print_exc() - # 构建返回数据 + # 构建返回数据,使用新字段回退后的值 detail_data = { 'id': event.data_id, 'title': event.title, 'type': event.type, 'star': event.star, 'calendar_time': event.calendar_time.isoformat() if event.calendar_time else None, - 'former': event.former, - 'forecast': event.forecast, + 'former': former_value, # 使用回退后的值(优先 second_modified_text) + 'forecast': forecast_value, # 使用回退后的值(优先 second_modified_text.1) 'fact': event.fact, 'concepts': event.concepts, 'extracted_concepts': extracted_concepts,