From 42ac300102c70ec7306bb45b528f6312b1ea9d50 2012-06-04 06:00:56 From: Marek Rosa Date: 2012-06-04 06:00:56 Subject: [PATCH] Removed my old examples from tests folder --- diff --git a/tests/gdpbarchart/gdpData b/tests/gdpbarchart/gdpData deleted file mode 100644 index 6cf75b826a64ee924bda647b545c40aa6d27ce8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@K)|rWAb=SIU*Hzcv z`(v*wy;o=KeJyM6WqoH7kV$}jcHisz{qz2wxt4hC=X>VNWagav-1lh-8yc)iQOYN% zH3^Coc~`^)K~bciT#g`!IbwL2aDS-a|54;09?iKw3?G8vJGqbl9sfK2-#vz7=2C({ zNl}U-Dqa~IlhlR(GxZJa55oJ)!vPHLFXu_yXmx60iY8s2rqD#kDKu@nc5-VkPgg25 za#doAGFGW+&!jc1>Y@$1dPyih1ECPy-hk{|KI5E(@-+~Oz?~Rdm-QNZF$Fon^t(`u zAgi=*xNiXr(wBg{<|pm;MP8cDg(Az3sxujg19)x}84 zgO0l{kNb9Nn~dsgB;`Y==f4l>Vs}eMbuy9)p!1Qu-pdopWK>5ZsSvu%cl{}F4EMb} zjHDvy8qhXA?X<6q>R==lL)VulSGDhNDx=yPNhQ$rc67Vmw$3uj-AF2hty@3YyDxjV zjA~~jmBF^{S9*{9ZH0_-Gm^?-yT~O^SEW9dQEiQ+3fSIqYX=8!ZyD9bNUDVG%R052 zJy^`we^*3-;CHyT{s6ujr|?O5INlp?jay)!uzT1AYy&n8Q(ysD2TY89M(?0`=n-^1 zszoQEk!WAEE!qNkgRsa2WCyYsnaX8lco428w)~~zGzwLs`4uRh&|>PZY&qc~#0(U9 zcs}3u@vYR^#F;N|af$>*vPXEF()NX%yo8Lzbnim65{2Hn}^BRaHfVJ%7I-H91A2 zQgB%fcNWDGo!bz0Ld?KOkCoEZpEinYIc!>kS!CERSifSajfq2bT1C7rlf-^~-ZimV zEVVWi7&!6q27g9+jF9Pa*CZ$tb?Hry-*MY6b0?%i%z$qtN#j-h_7V~yW+4jlqg6?2 zDWS_<6RS*2Q6=)(gyGlL{no`^DmD}tIP~T%H1DdjRAeZyFe1%o=2gWPnU(JGXcSTM zVQNi$442pRrqpkh2SR0*MhXL`s`_1cZtWnmFj81JEi3NT%GFODTbgv`6z&?asS3Fw zF-FeYnba8W7D36gK!+o)jAM(2k}#ln)QCdwyUQJ$HT#4p|B@TE zdA?#>Zy&-$h#6?6*35Pfjv;U%W})euW`!*^2dpu!7MOzxv2h$vPSKTi(+6YQ-Lqa} zhnjFD#MH#||2zJ7{O|bx#j$d!JKz4dK}PG_ z|2_CpJPjX(_rqQBCfIB28g?1mhpohBV=62Z>xH>s&Cz%0O*9)lh^|3tG#-sW`=IWq z82O4kK#Gv#$R=a~lFVhNJBT(ygI5aME$z1~WJV0pT8PVF$34johw>)r9fcZP4!h>{ zU{=1Frgs!-a0TpMcIQl)Mol;iaV6{(Q1L3b&lJK*h^t`V4RcEFJ()u|)^Dig^&4u3 zdJVN@D-N5~nBL48e*I=wdj-`f3lx7`p87lZq1r2`#@XPq%fUtAJ_iU}A)SRYFr5JgVvwV%{c%68uB}`2l*M9&Sh2SAjok-FF6ke zoede&m>>yqtdQr!Ac&5hlX9IP#|U`=3?!0ct-0z-ju!Gl7&wK@J!4QW)^@`5fu!X9PJ+$jjiM zVV;{j+9nfZq>z`xkTU$jqK(}5jS%t*ICRr3wU2EoL52%?B@DgP`$70LKY|Ps@+ugy zd)bz5hh`CEX#GJ4Ikf($gAA!J>>!62h8LMIbnwCShc{fM1_FsHHie*riwH(q%Cs(z}-Cg3=|?8R<=yipcJ@G!K;R zee0R~*K-lst(NA4^2JwuV1QagdezbbP+2xddWUcpk)E}*5L_v~>d~}_6p>wPX%S%d zjLv9%^ty=bQcH`$)kEIzgCiP=$j-I21Y8T+c~EV`)w)i#v=m&+_|Y;{ypp{Dn2+~8yv%rngg2eRPl?2&A$g@G|yIIpGyO$GWdm+yOB@ebvvgh0Y(p|`N zLD{Njzil|Yj3Co!5U33)!K%6t7Lcwh^HY%Ami;7Ve^#YY{Zcl5bsf&t zS!+Wj3;IiB+e({vl#((-B^wUh+}8brC|pWP4V4@iw778Cw&yblQo<>wwMs71>%|7X zttAY39^xZi9V0$`~Slb{5pOK--$2AQ#t=1;BD~cod3^Y=di8VLToZN z4D-PpF*EcDSND&iYf%!7MF*i>QETKIav#Y<4kK$38kxjp#9vBec&P%!uj6^1TN&~~ zr2m>@JhwFDMF_+P^4!9Z7bDR9I?r1g@)D%a;$^cDDcQpCVU@z}7e&tx{X9)dHaAqt zV4wCYuAV4dB_*2~D&-KAt?w1MY_ODUYN%Ae{$VR}E5~w;Rue;|5(YlmeX1zyg_LY; zs8qqhqv)aY|MQcSY}8OM9BJNAHyml!P(K`LYSgKg35Peow&!W0iHtNclCt2i74}CS zTs>& z*&M!5Hp@uKhhtxU`Xk1|Q8v>^DS+e0-?}UrX)l{$q!hw&xq;{UA3H9aZln}J#R%9< zIdhe4nvqfrW01uiX3yIu%P>+(V07G7lRc_6vUDS*6h`lFTx>VcUN+T8DT5RI*Y{Ol zJ0hE6q?AL|!-%`>=V7umBc%eWcTuUGE_Icq8Yz`fQxTU8p1R3WjFc*vX0^L?%Ii6@ zCXH+;XVv!#j?uhLRM33jt4TZhI|ujB6-KA-I@9=C!h#=os5jk|J;^!AI^s zeVpTjhLRM6OL=|Xw-@<1DjP~t0)9XD>1LMwbH|v5l9YnWzGc6U+1JN0x}hXxAanBh z+szL%j!_LIDF@lXpRT>y)6P-RP?8FeQxSZ3&CR2Z;~Pp+2@2(^tHo2Hg720zmF7*`R^kIqyPIz!6-rRe%RV_I8s3Kz^hD=`@E`a;s^oF2VWXz zjlbeA7l#XI0r;}=idj|Q5pkG+7J?7h`hKVWJSYwo&?4~e&#^n76bFij3TQDzQO5^< z?Jx87-x-Ol@&7mC^YH{c6z`7P;V2jX=V1r1U$6|W{`+BWSPS$udIdd$Zbs*E(f?4i z8*0mW{`ZkwWG}J=N#?StK5Qt=#8o%EryG@%^TTqb;GNkd0=rOVL!ouVGVsp1jr-SF z4;u=pBbI}AQv+NA7LKqXXVnoaz=yv5#+97+laVty(bPb!M9|eGIR|9qj5<;kg6{7y zwV#ZfUPr1Pa+HzN>PXdtjxsW%j#M-3NTwT&A!b5kR@stY!~A9BR3j-1BID;){Vd{c zV~UZK4PLEsn6zr2SVpE9Njc!p)vvODzLqH?Q;not@W+9a*PXS_GBU+T$^#G1w%QT& z(-s+-Y$WA_hr8W{g6+tS5JO}oFlBB%5?-N0e7xG*f5RVjvn_klU|6Kfk7tiGU{~vKR9*+0G zTj4nN2UdU`!q#xD|3oYl>xnsGP0&{;i(W)`q07(=GzuMvc0p}WjEntCk^dm;5VCIM zuRml|YoiGWRj}jL^Y7D>B4m`Sk#q%inN!pv;_O5jlA-k+K`<1d185OU6z zj~ngTI_WM!wG#4N@aD{B)KtR~l)aGWfw#HS3%a~R3Cd2$^TE4QorX@k$qD&!^L z>kk{=Sog>yD2b4lf^VBjGaKD{L{Nl~mqDzp$=uK54-k}C$jhP0pTFGNJquD$aw2K|c^TELj+D(wLzefGQBCVeIS6t*xC2*io79nV5#(aO7%s!c zb)-B5$&ZTWGHg^w%14kYyASWIbQ%_^JFCmq!`6kbQn!AqnYat#Yprz0>NOWgXczf|+0WE`#|GLp=__a*& zAOS6hRui*+?*7G294w#}&~9FsM=W|p93-HX(AE6b;ZE0l#RCPj3bt<@1N!6!i3ij> zAtbQg2_XUXP6+WAP6){ag}at~J7PbR=r6=spm=6V$8)|i!cT~^L8UWMW8f&Jr%b=L-+`BF(|%Ak(-Z)61{}D1e9Lco3PHS zFVRzoOF_k9hm%n^OcnNV8_`}2T*Z1bxglGNJb-D`2bu(f6dn27q+G&U`LYxI%2OJvu z>zkKEXCcmptw$z}yKwq5(MgDNU>hjDSDIl#bQI!T=v*{4#4jR+@DSoW=&ae9?K%V@ zItXz-biH~l>yM?oi1tEU09&j3?lR3hO1KMgA#9zLINWE96VXnHi(u<*suL3DmxP-T z7ehCC+QT(x#}I9WxCFW#l60Js9>mvwJJcJ&Z{R2K&G-UbgAc=fa7Vl`_7Y>T)7Y=y z+kY3%|Nnqq=i2|>=+Ed3bOJgA_5Rm$4*nlG#M&wR%-E5tgeXPS6kW_<-mRF!X$F{! z7e=u`98NXBT&!?rdZ*c9Z3=H(Mk*4bbbZcE`}->sZ}t*vlLeT8=FFqxhf)`bwHg6t zVGFlW&bfn=WLlkLK0=wGO!Np%s{_dd7zsV01+IYT1MXHo3iHZa+4=RVS#bHp)S0r6HZpBA{|qBCqLhl)R$(Nu(5dx@jz{)t39Zf(kI=`0^Cp{qNKSRs>bg84l9H4fd4eh?CSEC5B}S_gxWWi`c)U9DWI=(0mhba0 ztuGDJbn)J&ZF}qE{|E$sf>+|_@m=`OcoH6rx5X{657;d%hl>E#VzaSm%pdEB$uJas zjFzFN(JknYXbM;V+i~swQ=|Yni2Q=2bJ^$*NA0MFZjFVzPvsYMnby@>JJO^LcWa5N z6lIJ&EJcx`Og6vL9J#P{1Y)fnQCDM{U1oOwhtr1F)!62~Juh!W?6kv7+_>xNwIEeu zY>b*OnRLXfpyrnX?X;2g$PAqI>!#>E!{6CyBkGY^ID6REkG)lwoV4L4Uf*S1cWeIy zl}3NxaB%$Px82T)owQ*MCSu^g!Y1+2Ni?C=jq68D;vHN5ZTbE6ls+^~%Ms-FskSZIA#nU}~KI*%t4QinRj;m<8#> zI}clUbG?mr0ACZsQ#F(L@v!P@((+L3p5q5U+Gqpohzzv!@_u>0xmKnP;C*ESkwr}Y zuszOMM}PgbG?SEkJyC+B9->p+x9%^%3{>37{>AyxaIw};fLW-V;QVCy@R5X8=VXPa za(U})th1^3@z;4Kgcb@p7oz+1{h?pRTtW+koP{pGUY#coqa3yU_#z#yQ6;Kk6fwH) z!*F$!B38|tTfc86&(D5x)b?#C4Fj$GXNvNotR1y|8cM@Lt8YV(ukrR4X?yebHe8(; z%X=?J&h|dD^x+DT)~A*-;IMjwch3o)B5ki)%7UYVk1yQdt+dkiG$DA(-yV3lbkD}- zp*yU!J-$N*Jk(x_&HmvHU;iDEAqbv_ufP>}5blLL;AYsLSQ&PLYy0P8ld+LlA1?Mc zLvM5SekJGeD^P#511d&7BX>A|{{XTInT^CC`jx#_TJP`IV8O$go9DM{ztvjXou8c) zu1ZjAIs_||Q@An@&g}hdfoI7hLfehgOoSTayye1dLhEJBS+{IeKZ(|pU#b!wr%=Un z&yIWeLrx_h_L|&AqU~xRFmUi;x0pS5S4gy73z=(Tw~t#R z({?bD81QQ0567l2^^|Gb8%Zp9i`%C>o8sf7b?5C!SUTsdCF<=6*M6r)#jB#Z`)oTM zguXxX#!1_*!9)ynv!69)J-)(8>(*c*7P`+_-r;qV!`9li{2L0JqDsk7YN{XXn7++m z*P*+twQY%B$*c4@qlD7ths_)m*!9T=vDR6DSvYb>j@A6tPo-KXehf5hiXx->eS`Z>k4BZR&ys2#4HX95 zzh&0PF=e|{D>qbF@T6_tkI12K60HOO{=!nZ+Na>#N${X@)86*Mi4tuq1Azg5^h|Rd zbWa02^;-Q-&T!`OO^##Go4 z%pEgF@1i;Ae)Jd4^Y4x}LQ0S|+=>7F@YG68M$~^_ium|y$3Py>-(oWV3=&dKT~&14 z=c$$ai_^HLkh$l^`k*3DE%7f-V_}lVlB%&|#qG6XlL6dmDIW4jE{!rVMQ55*;*|0L zjWSUY!?nEpin$9DmX~yl8_-@W`UlAwa6x11d1jM)d#%+!NX~-ur_Uc=- z?$U#mX)6Bvoc~(xG`4t+qqccNX&7*B%!CcaEC1uDZPrj47MvUDqmBzIlWKLdCc-o- zd9WgJ5^q$U-fk`q_&iXmZDOb}(0Ro@^`cpfRNL54VPPAQdD4B15@{RhYE+WGV{l66 z9J}Mo7K^mzwUmLWgWKdReSBM_HLIm8Ov(6b08x&}w7QuRVd~VBI62UJ0BM~D9=e}0 zO{O(5k{CEO^V#B0n~%%1xRJ!dnb8B9|MW_1qt%UURZF^p#bp^{`r%9NtHm~2w2sKY zkkqj&3*SZBXpuT13nSdu1(N&S?de%2?z|YUPEaSx2PE@`i+?|t`Ziv5?r8^mdS-n( zSHPb97fsCtJzZzu;?-%@^PAizKkpW4eu}UEPW<}6n|L;U z5MP69@kD$$-W!*4@qZq+4_k_*VPiS(-vg6k2>J*uL=U5@&}ryc6rgR;=E!TL3^|M} zM>6WH{L>#2dYZwN8QA)soATI>YZ5xcKwx3(-Z`f>4EkhGr|Z58CnzQfo4syNZ@bc&(E!U0cTe@s6z&4y0ay;hY{qfy9%m1^Fj2iF}%Z)blTV?%4| zhzz*8bNTtH_Fru1$#p~)T#If20(UKz(Ynw*Oqm`Xr;Lx+*`7Sj+L0e;ie$9fNMbzgLmyZU_&eGh%6j2$oyzU zM2IsTW73@$)tpDo*?8VOg>Vgev?_^zC0oY*0!WpQGacPD*4Gp8tZsO`aB`uYD+{PsLJQAPEao=U>?4{o6i**3H2WRVP&Y z>H!0Pu}V8)^Ur#yB1NI$a_N!zVS!}Z z4iOzzOBvYh?o+2HB@q%jl($eJYE4S2zPJwxdz-p$c&LOPY9KH$$ZzMRlcU`vbclh# z!hvhv?=9N5N=)lQ^$>NnZ#}kn|N36zMvLje0?fb>mi9{@%PPe5AOU9KDF3vS<7tdF z9n5>%A#tjBRZ^1PA%T8g7rVd6`C?568EXvmU3Ky=i$$xf>4C-?3j=(5{x<981}l01 zAFzceHC*ryd(Z2UxVZFy6&?5;GO+hgUJhG6J6q8K-ysXZAJ6}DLw!?1>o#2o;ry)X z-mI1h=OV|S3zX3P4Fm=@ne)YJ&2uja?Pnmc(9-kx;-ZQ!t!Q794!n?*s^Hv;De{0+ z?pFDd|FtTx-1X1Kt!P+p0tS4Y_VVMt@oBASP;UYjqC1i%9-H!u72S_}uBIUh&dKKu zj_D|531UU}6+i|tT|1!NMk~6H0J4agPm@-+M6@n04^hM`_@0vADqg?0d@@Hw`_xhf z{I(gfUz2i2ME9ztEZEW`$8k(}xPnBf8 zCPXPUe7U*w?AGRr0ox4r|2V|8{}djJ2jiV_YaGQMVP)7EY&*6PQ)6LRcgz+;(T8XO z`X6)?x)4o9N1?u`D{78BLQ0WS$QESY-|hclLwnY_4F+D^dm}P=Tyq<`YaNk=mu9TC zYO#}Ry1MYyVX#^=MOVZ|e55Mdyi6CMC z(ng1Q_bWkJ?YZqaJJH)Ld4etNQCDT)?l0P5fw71!-J!0^!o3rEKJ0gB0zvDBZ3e4q zRu=}^t@3?oRYK72Le5pkUk{m*DW?g#oshH8e_>WP`)QbncH@hTj&sH94eCm}28oVDM5@udTGPD;1ty_CV+?dfV4m&^MzO~*94>m{XK4HX8w zcP+!I;xSU%#ZY0vhuDLc-`Kyjruoen%=wBmQmLpmT)h%i6%%(|u%?}iHO^4X+}rqY zL76q}sMomgMpNy_Le(Vc^+kQS^W?@F17qc`V>f*aw5A=5H5N|DzvJc`tf(Uq;LLHh+*hgCB>PoXWe8Sp1y)RbLnx zEj5xDi1iBib8ksI87(oAIHPp6+0IKAZUn8HcQHtU9(!A9_YcTj?*6n8LeT8r~UsQ906M*W;Zs+R{j3z_Y6@hc*A@ z8(;rhAw%`^e|FJkunX8mY!=p!tM|X7^H3EUgmyp)wQ2%x8!XZC&j9DiTZFsw_O1yHs6bwWcR+Vxs)6_E#jQ$Xm;+?M=hIMM;5kEiE71 z?n&eS`eX*GWd#e5Cph@fn2GA|Pp-F@hMaG`WPZXW9~%9?IGusB1{C|<8FZ-?jhJ|0 zCWBPb8ZP|dygv`l`SXy6r6hZpUun7Ke7{!ItOgS>7SmeDTTwF`Ou$+?wnD_z3|*N} zPF3lum-=CAwT07SF*RL)8K^qw-`T6_2Qf8GfLWLb#UCby_Lfo^ypL7>Ll`Tm4R(OR1@b3JWm@QlK;C zwhIw`{2zzl*YM-`dR^=9i#uSSv0K<>Y!~PGPsD<`*xv$ui?ZlBbO*W=%|I1sAlebN zK}|Wo|0b|`RcnrlsH9rT zIe8c2_Lg9~tSB|_;&4>O8*%?FzCSzLSW$`JA@}?b9rC{8nPo*Ke21L1?G^hVfZv5I zp5KLxgE6W!-hmFX-!{*Rnq&Z(!K)*2D{7(vWQTX%O-U$~&LDA3Ub?`)!p8kvU>&g07@-!W8bSfM+9%{ur>$NlYmPn6rfI zrbX|2=q;vV1egV{O^@|{yk?h-iq@Bj7)7iiIa(LfptCL}u6MJLQBg(`1HNsz@cOLv z2N|U>l30lJ3CL(39b-$4*O@6rv@%AW$k(P3p?nKBwC9J|s&HFsTwRrGG6SOHHzZ84 zrN-7(xtu>gHJP>jzCAUD@0Q_IE~pLzp&q_*`h`$pLgnG0wza25*QYa3+$T794c10R zjpA=QICU!LAF5L|v3!4glimGWMvanDBaI{mw%ydU^hn8i88yO4VximiNA0$``a4p? z`Topc^^|%B(0@o-5-ziP=SU4}C=CM_nA|!Uygks7ifkwi3m1>O~O{@-}j-63Nw;8cUGE}VQORVNQG8kl(Vm@!Hk5{e`$jIFFbdbze_KBOzlhJp2jVTT_gt%=hb_W}Vq)|Q7wa3Y_HT_^Ag_>e z#9(=JydpVSHGym4_1#Hu zyxn-W8&i7qr272plNmVfogBG%)v71e`(K~TLd6ovpEv9Z_{|VG6B(>XNz;`ehf%Su zHeDyIs9t<1UyT{W%xtKH5>q_|X;~;4J#ux&SJQh?Jxro?Sd~~4=y9diSD{fwMJW}D z^?G58C&zeqd^N2H<^6BZW#CUedcKb7)+oL0~gWKIZW8TUXXLVyc}0a}i8m%MX3qnTaVk z0cOFQvQsY$oL5!v5gDY`C>1qx1t-}~KmOndQoTo{Kw@B=zfaRv4#Cx{Hv|$36Xwpa z*xF^WgmUG*n;;eUX1KS--Pf-x7hmqP`jLckF%THAL3{Q&_}E55IU5Kp*lapC`R&SO zBFc%ku|dj2o#nOt(Cm6U?+Ov+SW6jbJL;5qZ098+N?uD@Xy0!_$)GWWjM8oF7^KKh zOp2@SU+ZgmI`96ky<}7?BZ+}MuVl3kdd58ydn1X3{k9G}cKAt*n6l%a;y|@VKm1QP zkN)s%tgV=`6<`KR$7WQX0cWi!8{W`VV-_)+L|sNilr?{+0~JZS9G0Fxv3ZEYB@rd7 zr3_p)Bz$$tBWpyIw3f2)XT)cxe3)DHdX0gK1ckoKs>z@YPh6v4R1G1 zCaYerQNvl-#L~V!;eAR(iTK~MgOBY|Gyn> z#(4o}v2C0mP&4``!!YzIT8bV=H=xtek!XLk)AyQx8rh00LZ;TY_YZ$qQdZoRP4!o1 z&?gH@Ji3Y~%i6nP;SAQ60IRl$DGUC|4oKE0lzcx=z&zpUfTBPnJ@+p~AwLC4To?PD>C`nC_V;#^`dIyz`)M=RtuY3azCK zOpy*aHoH@Sh(c;93)9^!cD7zOjUZ>~9#wSBqiw0`KO`zKpCD%nIRnk+K7DQTEt()_ z2ssPQQv=pNk0>U{={yfiO^j7&_|gbvKijk`JWi0)gq(rBKRvh5ESN=*8A8s&K4X^7 zd|@-zkxb`(%Rn{PEC%r(!nk69Rcx>GZrvTpsSTxJVBi?}FLRn=j^vbv(y(x#Pgwo_aA=@D{*TeG|2>Is!586Exb}Yl-VrCTuh@O806UDW#%5u0 zTtwi5wZf3^I{?o^Cv)w;3-Tv&3|XU_1K7Y}O{)2hUBQiT*Z;lQ6G!*CBc)^_zkjb# zV_dhJKVRr=O(qzh#llNVtX?SAz4j#I`AI&3N=2F~KAn?elu`VI+a$GGQ|m3t+XfB@ z@#USJVI8)#JtK#nF=U?Z0@=FLma28xV<|tR3 z=_e(J>8_wrDif<`9WqZobcyLdSV~43Dhw#S`@Gcr^(`@}Ter_E(R}$1?;7FJcGm?l z87{z_VMji9dpFNrOoj@ ze<*@ya-M%EZo{?vyRd~=JT{1H^IM{y(EHza`$|SfbFF?y)S7Gc|3C_mLtL$=kco!7 zfAHJ$3=&?6h4aN{tk2w@Ly*CGuGYlr+8^_ZHX>&2Hi8Tiat4~Tz|Vt`Ckb+(kh9SA zR8my$IMg|y3EXZy=khsGK^j;C|ER ztzyEvTamrKLl!)UZ+T?vlO#K`C%*>5U!l~fm4az#w?DOWU6Zoij_gs7%z#_t*Ps8P zhp!#!&CC5$HC))vg=rCq`mTWk>tDCa`gqum>|T$|z`dtFPdnr_!H(=!kIcfoi(88i z_nhEGdYO!>k@;v)naFQ(r<(;Cc1N;zvR(4)*VHxI5YT-<`?8gSVzyN`CFyo$U1Q&Sc>s==`8v ziVa`??GZJC=iiv3$aV$-3vKsG zg7^JUQN2H2|Kt?4zWS9cZe&AC%qy+2+JXTi;dXV1^^G<6`IdH1gWWUiG{ zYgF93tZ8PUW!q^j2HDSaAf4(@!Fk`mBd)WLpK>4_>rcVOgp$%(VYlx~Nq#uqw12!j zOc9@^h*4|!Suw7=zRi}B4#o zYStR?5f6Ox;Mz%#RraJ^eL5G>A?@59wqCL)ZR^vy&~Cc5&y6PbB9b4hH|-ytT79q0 zeid7CrrKIa8Kjxrxh}Uvq)bRzr1^h__|EQ1N==4wSKvDsb+x0lJVX)A_a@eBLw-r? z_({2~perf)=Vvi+rCaAaee>M9lEgnhi-l{K-EMnzp@SDG*4dr<&Z^gX?7021mH*kU zT}cslp6Ne5k7-uy)!4gIzy4IXzWQS~QS^fv$%t-AsM<$jO!sBw=A&lcXy)jgCl2-3)}9BwW2c zHneA<_uT~&vbll4fMd!uPuD-qC1f)Lfd$8kv)!h_VG^>bPMD~QQm5)X|AIi51@GNm zBxDl-8Q*~VW+nUIriN1D_lv(SI+lD_LU zcMy{}@67n7CuwxU-_lL;U`n$>Okx7eK`5E6SIVvfgKjKq5DMMC1wgS3)@H9s($cxx1GTUB);ktr97t1 zfHbvAH-DQbjF{Tt<`&!ObwvgesjI@@K3iowt**#IqI>Vp0SkWA?-uB*PEJwCL-pNk zwi`!<_qz0#ez!n@!a&vszjC=5iepht6mU!mVEP@u5T%&jMQq26Gh!rMf>;-^gTsIjT0ryidx+}X}Pxjvcm zSa1B8JJ)r;y{0~yb6uy4|1vkz{r*>LWVk;5KZ38qr{hX|Fy0+^;4Hv%tO`4aZO4{k z(=a6#gmuQG=yNm+{S{q^PC=v5!JGwfL0cl9ko#Oba1>dO%;o%n;kqbbvhMY%6Vw{r zFHN0W-9K_y$$lb9h#7G1k6)7aWCsvxA!fmOd0+9IdDA3`e1-Al7d7bTYz0rlMoDKL zmn0Z)&M8jGu*uyrO%iXwSs0Qz;@kw=6{1PJ(_Ygrv?MuT;fT=VqKUPTfy>%X?Vd0= zRHUkfEc_+vLE_rbCZf1%7|)kA-&+~ef;Z)fVrwA-;fYUq)_W$3Ce%U}2JCNH9CSF` zO3C}#zHtgZj{N5Mmw4HLwpKCU83R6MxUJf|xQkWvcgBJ*e(rt?iYi)1ne^sZjXS5C zQ6sd1;QEi#b|2W(qP600(=p&WxlbHs;oN%s-=<^1^>0lcWR2`18>cIc3eKC1RBB@Q z7^}+W?$A5qJIKZwDGaFEx_#7g(I2ugMhXkAEPChq^5lH6Zpyl^LLZgG)Z%p;dafO< z-)yg%GB9~^@6<=$h<>xZYRba2hXroZMg@`)x;Lvx-~ta_NFlNLa_UW76UlG`&Oq_b zAJ?|mK9&qK;GBbUwb7z?JzOM_)jUeA?*zpIow4AeG)aU3XCR)jWZC$;XC&bUoC`wb zAN>|zkQ2Hc+hM9EH8F-a@g+Jxx# zwNtv1Lb=!*bJ$oG2pMTlPetD`q~Vxqp=W4V8fc(9h3~x{gPX1 ze5^u08MUnws)-nQK@x1h8Q6M#)!golhU@D;*Zx1i^YKIYI$Vp#a~?pS?=t|4v9s77 zY$fLfBw)iaU#tTr{k{vp3N-2a9$-(oh~PZ(D>Ab_Pe2l6aCH{8_Qv-8wAR^SAn%|; z?zt#caz6#vgd{8Cb(={vDQahZZ~s$=0re-~UeMQH4;9Ra)Nk4YHT+sn?zE}R=0A!& zaY?^vPc>!Wl&;U2;%`-Ae*tCTOvPVYRDBJ5l0iz!_*d zPOQina8lxHz**RI&+IgCFFaWP%>`}ovg7P@7GxF`LvT;krq&o8!X;MW)3>izLW z|Z%QN17@B40f`u+bS`Srhr_%VC~J{M2KBf0wD8gGHU!){=i*gk9p zHWQnG4aT}*tuQn68Cr>+MYo}g&@^-`>W_M$667!B0aAz@%p)7s5gRS>ELMiX8-%Aml}G z&`OiG*`pf~RJ@QE!=UC~yFO$m6VxOjFM&a3=Qn>m+?Ajv3VA6U6uo=?$Y1UfluF3U zV5oho+~xxp6I7g#m%|8?*IQ4%*+WpVLS6wQo|>&HZ#kNvCJ1>Y9M%hJR`=LNP)Z@M zf+G*UpJdw2m7rqkFRWB_{iT(Ps=v5W3SkM%gccoqIv!8kM^NL1JPTT^Y-)bZ#G0VS z33)bbd8F_$b&+DOs32La2S3<{bo_&c7dx8oP@+#;`3=qBFHi4jq z)Nfy?!Sx#$YEb|YLl&vDVMSaa6-Mqeb zkZx9AL#SKkP}9m~$~J77Ev9upTv?5>z)A8!<)=S$mWydq0nP`P>}acf)0&ED69Fy& zmu5K~`Dwu_F^vmwA^3gXzGkDdoWwLHz(wG4#mFyr5*v$YRDg>?cD~pAutn{}G$Ozy zAm{V?kB4%6#ndbTE(Ljc7gn!qe??5q6yP#YkUV;Ln)Ra12 z3Y8|b;(H-wqky(Ek4)xCo$T24D&{77N5YF*()@{ea#>i_sJ4W^^H% z!dU=+v?D4*QRMOW*+5gcOcDNf%KZdBV;(pt8nSMdZJ?O;72teu@P)Ep%n}bV4F$LW z98n)adK~;Lrhxz#f}>r}`SxB(ign95Yj6?x&sK5y*2lZWx&@szxEP$6b*1y*wdcgT zC7m_61e|hPmUDlBQcU+2;8JkbCsO?zp%K$Uzqkxs^a?M(v8<1n7COe|;P;o*+uh3x z#I(>et^nDw>G=nOP*S=lVA1P5G2OjhSDfxvuP;t} z)#r>`()`|+CN++C=Ge!w*_L!yAnvnB@v~=e={gBnu6p1a zj&&5Wy!0kHoN@OMI{f(vvT;XrClTF2NDB~TUs3c_k#51{cUp)bC)dVvrp{eRix4EU zbtz}C+X-ngf|L*!&htwp1+)Y~*sk6$_@$BpT8bc#wzO``FO?L~G6eZBZRQ6N-C9V? z5wwY&8TTz*g|q@eWpDfX>;+u2e68)YEKm#j{K4#>q#j7eMN14!9YW8}hW7ym|qo zp5}te!T69RtGq!crW zf*vL0IpFP>Ce{~+5d=L_$aBHFK&KzNMSBtS2qDh{A5FxXR^{acJzU81!RJMRGwiJ_ zsyAh*;RWF9+@)*Mh!)kGGSu)w@NN5*?9=hV)tfTZ@FMWn^?vrMIRgkfT*!;Tx4_a7 z*SpyfbeNErfWN{=$`6ICBj`{eF9lzdA#uCuPXs+w$jiWAwjaZOE89oVAwpgbkzwSw zpamWTJw(VWAey5ZpRnAVpa%O)XkEf}jTpc@=DwG-8*v|22XRuD>US4ywN^ zh8|ddUkp7!VAC_ff#0pEcXNk|=|BO_0(%?1+)>I-5z_$zoDKHGm4?koIU=V01vm%n zmTvvpKVZF>?k~W(U|%Qk3+s}1-}nDx@I&}QJO=NLOR(oyHns_ykEyXpuFkt)P0?2< zgPupXb1{D^IvVvw+o6`o2jnJ_$$9%fBQuZ*)%*X6wdVEq$7#*#?U2)&*4rbeH8JR7 z%LGsR-Wt)=?2bf>8wgq8&#}4pJKH{&XfXpJ8$7#v!dZICR-#1>gdFhfn={__*D{F~ zF%WXWi+0mHteF!hp=TKgdEjOCFSB}^Hj&UX4TOB~e>gkufTp##0VgS2L};6qWkE$0 z1VsT+hIkHw3l&k^15{KTprVM|E8Q*X^|~kSz4yFM3Z=W0<-)DFQE}@R)Jv06{K=O; zpXYr;M9#=K?|FUaQc2Le1FWoh6rlufdY+k*L;Luv=u(YPfj0wKYr5_h{i=ynBh=vC zb-%>JqNcxUBGm{Dc>8(gyc|y(R@N+v(1NPjBYWFA`LePyDMAOT4twA>&DyZCW>N&v z7(DU3jI+_KtPF}E`qz{Hw95X}g_SjfA`Fn`>R%Ys+nSX%og#{$Mb%x!UmrWMveGG{ z7+N=!4BnUQ$I6;k$3xYusdYS6&6-ljW7Vv*-*lOBpgZx`>R}$6ys}b%6IKAOYf=Jy z&K&W|n*5tE1-O6d-RZ9_c6en?`c0S;JRO?WszdB*udIo`2~&X=dq0O*=8W~qn(&)2 zHF!OJ*OwQ^bzWI1zX>D$6c$y?T`-`dSJwF7glWOM345CFlS{p_#{DKt2R_JLxdA;Y zezyM!|Be4UXiI3Bv?N*&S|H7xW{JJPim{8>ZfqGg2OEoZ!J1+SdJ8>=u0=D^0ca3P zM=B8wasZM3uJXsv!-Lz>{Ih(bg>5;pzQ@;v9^4k@BNX6`!^T;?>CHX3-sU5SHaBc3 z=WbAy2e-NT2;zUE^_#G%bhpM_FCxOSc7z&1>8(?V>uhHJ3>r{1w0ZpS5~T;Xsrd*k zczbihC7x`F2e*m&2pxELb&JLA%@;kmp5`O;;KSr4V@~+@^5A-yk0=CR`)wOk$XMXP z<(Q8k2C|FK<5Tl1Jh+X`M-W5W@LjQ*4f8#??&c$kp_Rtt%5ev=2iNU?y`vlY|T4*rX<(7x}DZav3D7fa9ll9!_YeXL9Kztb{2; zDqZhYjbL(}NLU5OFa93?wBdCo*O7$PFo~IY?8wUIOl~6**1%C$# z=)S1ET?`T3kc4$`_~1DMpDv1Ea_vc24-=Uo;@z_n>D&gS-(MlJR^nesjJ0;8SOZMi zCx2YE{soh3OTtAk?XctB0h#ekt_=wn!}Rh4%ep5&tEvBYi*}B-mT3C}h#7zvtpQev zl@cv~C$<=yfepi=Fkj4xxa+@-<`Ogi<>(xA6xtp2LmLt8-+-J#)*56?NRG( zr5?Q0Hja!docOD5G({GIH#WWhYWZ3Bt8O$!8o=8Qn8);oYS$liqp7k8yjxJ*z;53e zS8hx#Sqwe~FO0Uo|K61w{hQaW+%CU)@5+t(&5Ktqq`c$Ig^XUpFFiC&78g*23|frp zk+PA+VR1WCL>{E|J>GQPu1hR#Bt_&y3xAiT52rm~aXV3j9Ab>^={+A+u(%NvQ2=cQ z>Nh+vv}19@DMA5}C1KMBjvm3{hEaqPVyADh*52O6;)YU$3flC$1$Q1LvAI{Z@c1qkH-sXz(AMCX;_=0u#cfX!I@s{aED+AHXK{lmLJt{{ z`^ThY#QZAzTq6o0Tk=)&efR!fWuI$=0lGf%c-1HH#ILf?HKGV|o*%L_G#T})>~oDM zhRxOw$aAjx`m5}-nRn+u%RbkBdCuatuH(Hn*WY}PmycL4*jNUR0c2z^hqe;IlZU46 zT_pbF3XuOW@M6oAfBo7;;y6q#$lwI(MQHg&bcxk+TM1y|0`d$#WHm%lcT_>b$r<&)of=Tut#+C1Vvt_PRS zX0@>>>Gf;#i2ryYxS~9GFd=0r&K*wX1|U1-dY-Sc$GOAEya*JGa=bo?)(PhhCG%pS z4D?-IDM4`V5c40xa0i?J5{5g-{HHM7fwj8UT=2-P>#)UmFIVn>T2clc4c+$1MkjLR zCe)I7p#0GL@SH(JU*Er$%m;Tye%RY@D0Joat0m>&MkmX}#fgQk-1u6u0NgpVc-Y2* z&#v6QwWI>vi=Lfwb9-M`Ztc%{l;Cc7_Wng_=UutAzw1$f`ww3Clc+0PxwSv+QG`Zfq^71^3@MzTQ4|yDPV6EvW;K7cK0mF8KVj{^#hQ z@Bfd}*3+_R6KH*D9e(WsP>7wywqPP`3eg92!kT0D=o_>Qy@c*Um!KKwaI_2Bins^( zh?FBT;x1qXGS^H+a2Ah2`4}q~T3nlZWTxE?7LQI5GHC77D*XHRRVCr0;Y@fuNt9HM@^;}2H^uy_s>Q2>!H{VvB;#?wj68T$`(D7Ze5#cMzjDu}+kHmB2x7#7ctBGiy3?EgjA7-#WpDMACWt1aRO zxK3p8Y$!qt(QuLjm5(#q8Kuw9?$CEIfcbT>-hYRht%=? z9d|(;AK-E4Q+obNgm_1PqU2o-n~c|J-PO3YL;DMAe@g4Sj4oZXxCW1Ag3F8YodtJcX+Qgug0%- z<^`B2J&;|oT2zw%#+lc~L=}R9#j{sR#Byg|YZGMv%Di5pQz>(tdHyD<2xt}ozhzz` zXP%#lDhB$Z*1MApXPtSi>ilY#=UeAzyF8ydzuV=tBz=sV3lraMTD?>1!{oIfVHr#s z|9wPQ(jX?!n}qXV;>}X~Wzt83`A_ zq&7#U77y9Q1x&heC)MZHSSGIt2`k~K#TI>Y(^@fko+PY-NpHHWyBwuv@;pdb z4M%rU4Zk%$i^=1Vum&c(IDVfx*ow((Ou||?Mi<|VRSuavcM{gYX{&o+TMa$1r&=By50F7Oap>4?V@?Ig@Y^oVKoAzpz*(lgB3E zVmSS@!;{eYOPD;C+0UwZxY_Tjc}#O3R#&%wm+I&L)%AZ5(w5U^(S{Ih-v+yloxrlO zF<2NzN1vbBsPEfGugj!)^J0G+ zs07M~y~>tEt@P&g{B58LsDnkLTTM}U^LqR?Pz}`mt5)|~c*L96{kMS{pjdT&L(krU z-n?$V4b%dKVVj++V5v8+>u&>fK;3Zby@k1GkN*zs6_Vr4i~en3A<#YT z@F4(y>&@%(+du;-{`~DjyHq7bUm^a0o*MRq5lRE4j-n=m{ z&79YQ_Z@t;wz&MEF)!7e*MSeZ5B(({HaF%?Hs|%=bKJ5rk3q`Dyh-MKA^3iCv|)36 zWn3KU3H|C|7^Tp6|+A86)!yoCq@ij}0azW|i z=tomJl+k(PYM=~U|8Q>RlJzI)yswV*U}v*=EH6`eP% z2I|1gP0j2^-rGgz4XuHCaDTLHYs0@0I&Vk~ECjEnO&vMTwIQ81xCR=)n~U*_w2|ZK zyg@av2vnV#dHdy!&vf3v8dwZIHH(URw2t^C4=}SBjF(_$H5jkIndM--e!uN}azT;r zxG4j<@4R{OzYUau!skw@PkMU%{Qfun&%gg`hq+@`=qt1gy^0<{*P>ivUN8tHZnseu ziXat8A#oqD9gz~Jtm|O$J?dE2$LG|su8-fij)i@EcjJ1!T-ZN1x5JXpCm4J;BbC7c zEPjIxOC1?}S0l}XgVr{iR$P|G;JX-UJ{-LD<3G*42Qc`~MoP?0W2AFj*<%=dwviUV zPq%-}m2BegKSYqz0?SKeXp9gS26XS8_X*;Ct%!Ea=w zdN}ir{jst4w=wt*Mp_8xy1n#ndwwc|-_S@6aN$ICyVF7<*4{{qVAlDlEoTGb8Ts)ubuJ@mIW zS2B3BjI2`PwasEg$SAyN$PEYieq~iQeWUd0c_jmuNz&Q}-N07N1>=EWPeEMcC&JQPZ z4cO(xZ@DPn2Iq&7xfbk+81?-4o;aKzO6EGS|JA*7VKFywen&FbgQEj&cYX7JjPpB? zc_BEy)}=wqQ`tB_gv<@#q|2+j{C^I~xJ#FD39P7lEO zL1b=Rp3M&=bL0AKemgQZF3{$;rF6`>u<4~nZN|=6%;E=7gbX$dY8K|TfXU*wp@=-_ zUAbcQ$^bEo-n;o5yh}u^S*Bt_h$U8 z|CLa^{zpdJLF3WJ(4uHfX((2X{flkH<`H9l1m=!@CdT{I=xTH(I)Iq*yC7eYJIFO; zHTM zZ)vyr`QI-5L{nD;z9`-L4}4?c!XIhsiotj0m$rQN78m{qQ&&@s!G%BE)Ya5uaN!R# zbu|?kIQ*g28%_Ok#;OXr5S@FOBg4qBCc(;(X zHlll14!^(I041n8w155cr|uknKeGWU@ZRT&yI*jBcYZt(U|B0bjiAn&z6gik*KEE9 zyt3<0o1NB!!;do?parjI&vb10?h1$B$83NOyxntR$s50^9DZ-J0ebMRY0~H6^RIFE zz03v_f)BHDPM&_=jl+*M8(;vRGBR?yyD#GKdzuX>0^jx0=$M?b9DWb80mTqoF}2;X z9u^#ace4RCH9k1}Ze{~&s(f(xUCjp6)cL^qG2|XR7wlJ!12H}&HQ)c=r{&T1(U#Jt z(+1JPX`VC->@hL(KZGsEW)Xcr6xI@Jh*qM-=s9#V%10-naYR4hihM`zBl*Yy1H$P3zBS zp+j~_rJd6TXTE6x8XatuXtnHR_H$>xX$2ZRbd38;JhPYHnLpD+6+)-Jr(90xM9%yS z6J>z()kw;MS7K-W3=>rZnV-%?PZ_<{nLph`6+`EYyKMTe$GYm^vMJxX^de)ULnUe>_6FOS?*p|3YH+A4_XZbHpl%x&H}lH8vX? zM$G&@F$}#=%=>qtVssihgt*`LMd`>V#@k|C;7#Ug zh-dhM5hE|)g63qdflLd~aPNyYxWJ3dwGhv=ZP^Zl;euvlu7l3UtlM>{Ou_|C$y^UT z6q9wjk~b`!YNwlYYQ^!Vps zRic}~xwg%N7P-D^%VouG0(Nbi4=t7*o1s<&xCvObtsH#&Fu!N#Hlc0;ytXZX7W1MU zO1^z^6EJIAq6b|+v&DM%eQp9qZL1`@-sNX}vQN7S=(Vj1TC0OpiDi5@fm3a(hSsAK zh1^q(-2{%ctp?J@g#^r-z;Y8bs%^E9wr%9b$V&-s0*BgG2Q8Dk9P{4L-A&N2w$(%1 zm6E-VwgxwWeQjF^?G5ird_qUK2^!S42Iw&R$mFQJV{QVw+O`Nf`W@!Txr(WTkH;|!p>s5 zuoc)MERE<3jPC%-f7Jo!qiN_M6c9ZE1Nri6XTTgpM4Z&@!4&i*Rg5cuXgI&UenB^; zAdZ9;#7tT+!Y{i$Q_zQml@M8BZ++&@Ura%75>`P}G1o3)Sqf9oi-gq>3)z3w$9f1; z5KF=uhz^mQ3LLkYDd=zfxf3E)-LjL|ImDYzAKyxBy0D9~g(e5*_fmjF3 z1^t9xCuaW}(D~>{v@_ZS#gGa_hnzvSAY!7e4>4`$xZp>{f&Z#h7Q)zh8L{*pmvF&U zGB?0p-~0DF9!ZSrQ^>ps_Id3j-svy^7o?GSF^u<|bNkJ1D_oFD=Eka-g2`lVtePp9 zMCQh-nSzOC>R#qT&rTMs=WEZn3nrM+GRW4v9iINp!CjDIM(07d2dgR<>xa4v#+%Xk z&=XtG1U{PWE*NJ<%VD#ogS@IL0^9{-&FBK?bGAiD&QW`JL9!XGfPUo>k^gExx(mjb z(MssM4o!PiI?Y`$+Kg5~KgE$pzL<-5a{@7KEv zhMCa@82)|V@H42DyI`mpT?9L?_3ZhyU$MJjh#6fByL7|EeFxgP3kLtT#;Rb@Z)>ay z2L86js$c-AW6uR|br+YgZ)ll<1QM2kck|nxZR8%s6!a(IJn-?-u6qsqFEIuENH`yS zkSr?m2$;YW#FMZbeBKv!_}o$lO8rmr_}`Ma2l#-MV|myiY!x;iOU7ccK+F|G(Z{G7 zJwfyXTQ-9X~WC@)q<#CI_G5*FLd-fb+3E323th6g+QG~J5t`MgP zW2IdolTuJO7o2(bY1h|J*I7aaMaaO}r3kXQ|5KKbP7!(F-27GjR?e_s37se+ADopX zJeu`v3QOon5pr<8_X_s6%a$x*BZ?>h=lAT1Wh|S=5;{!cN!MX~UT;A+?mS8vOg_r4RmKF-u4-C9DA#Coj%@zWE(XXiE`V zaH&x{&G^rBme7VGbl}p4M`4Oj>sdl;iqM10BHfou&plZ}D~c!tS4z*&@A0~`gq9Rx z0M|V2LuZ!fvV;~CQ3P@;>?T+Q*|LN*iYNy8(Qdo4brV@aj3SJ+l7%Qm7;7a95ppk{ z3nOz@ocHlsj|&!%xeP|?SN}!d+zl7ZC-XcA=KAf7D;^u^&F)ScPp}Ax( zhu}_Hm{p&RxL^*M7r^K?LivRK#NFa-GFQOp%ndshI1!`MEHYQZsN#_$JrcL!f=n`3 z!7d@u3+*%GaluS7SHmumZ%^+HzJd!f$Xo;A7Q^P)G3Ri>3^Lb3cwot!9lacI!E`d$ z!7iN|W;}UC{M>Xh*TZfXbF89gPOfhMo=A^BdH)xLIiW9zIsYz{hmJxcQFr7cQiL2u zmLijh6Cj?#4s}%7RzSzQRd!9Y{5^#sb%ZD(J#uQydCQKT!uEB9s37Cyh9fh_b?_7h z*Ab$I%#fl}D`EpYg+Xj=?8cAN1__bvDH6t=4)LfNQx~@SpY_y*zW=kHy3mKxXXk>g`ir9`K6}9u zwxkFd*uH3CzoX+@u!JorA`k4iVI8*mP8>_%C zSeDS8BJ|*3f^E_$M>b37MiGVJFv8N#30uVyx>AGz94_igTik&d_*^KW2prM;^BIm% zRJVUd_5A-P?F?-VErZsN7C?;qmoYIGkGZ0E(LLxiG?bX@%aLWZ=lH)nf`vWnQ}bU1 zS2t6R3it5|7WSx5o*J&L&~%%vhzJ&TuTP!^Zg4N1^=ZYnU}3lV6~V1t=xIp8*kB>7PhK(HzV?MOo<-z=|KGkB!p{GXeJ_HAk^jFPDTJNs z==*ZPr@@~`xXdT|;fOjyWDs+I{bg9y0#9Lh9U*zp65Vv9>nbmfFpLPXG!v4K&@87% zU-T4))^QFwY+yYtH<}saDePEBNC9-n9B{Tga$a@&cdBmxd9^@pWSMN{r^9^)d>65ryb?Or4`Hl4{jxTv-tYt$>2YBt7jI35_x^= zla~jV=QeTc*ZowmFs?p%`EXTd7!mnze6X-jee&dRO=a|@<$7ZD>s_C`0=S{y(EY*r z#lgZ}^~qDf^#L=5*LocY7RJ^mPYKu2vz+4RF{|6ZD-vG4|JQQb2wF?55<7?Su{dJv zzmFb3Gl`jgEZUy9$G1b?BDat{hpg8o)q5+ z6psG$tOA(sW(eFevp7&V>d&(jaK;-OzX_{}{yXWk6 z@6Var0)-?0JWCBTiVk19+>+?ONBnt~2F_|4<8*E#Y61_ni%mIClD$u>C7)?RDp)F7=)KRK#H?#mIT54IP31TudiA$WKR1Q*H0}zQ3%ziOX3SF=N91HSKn9zHgemWV2ON>3 z*?>IQY~GSDnsL$T+0zTm<^D_mcFO1$r?Z6h#Hy=D1d%6@l^4I zH5`$>*#HG>GoRhAMJAskYG5`%3EM@r@%eszB1dFrHb4afF9wt+i$8Njwq^s=Fqk7- z5S3xU5!sjx(7=#R#o^cD{W&6QvjJMz{%m~6wAX+mvN9W>gF(~#AYbH-IU-B50eTqN zd&`^25*9~fVK$%;wi_yT*q@Tj5z)*B7+}zygNsXj_H#s-*?=P0(MsBWP^VKI5o$J| z7*028z<4`cIG4<2 z(6ZUkC7X2Tap4>?&x2Nj7I^eiLtHqU%=4kW!?8vUv?p=lEHalvr{2+f<~`-%!b~zR zfOKt&--?65xNs(!D2=!U!q4_U;=lcWR@3Iw#?ZRaTGN==2kZuR5!;3du}MS^ z5QI6SRm45P5p*e8%U1x-?zpAqp@bp#!(SMr@957~mml zV?II;9(-@TP`EwZL)6-QL?L*?cMz~Ack&SVn~yMnZ|ieLgg-vwA@VaHQ3TO@EexSk zhIoitnU5%j)|1-x^&e^NA@coSJA;aR{@2c+qL%+-XHXYW3)2oc7ref^aOXt1i;KwH z)XBh`yeiw3yLB$2=B6$WRJGOy4+-^f5qX)qeDJYkdFi^hkuIWUrcMsNalXV{pM2Iu z)YQ}!K=eqPcV5eSxQLpVIt8S)H;B7??RF7)nmQ%4I6tkgqinW|$ivjBpw);*L$6QH zWs5kb!;~7q9=?$fLtA50qd{m6*8@(uh}=!jr-im>CV%N?(Tgo|GtJT=wEh<=%Gn}U zQ=>;{3(F=F#>LbWBDDQGo+q+J&ZfqI&^~4?zsMG`O-&JEF|c?raosFaQ;b+#kX%jt zS^sMgx&B`ejgGy-N{F_<3tNh1Vu@HcEC6%H5cC<*{?DP?P$_X=kVwn|0#IiZK^`L- znW1IWA(T8;nY z&taXzMG0hXfVL0TmOktM4Hxw%^CIZ*TshM+XDKe~N9M(lQ4zlkwpQSxcrrKc?mHtq7LRG`&5-&UGE_ZHXoq`=l8tYXjPg1bN&Csy5IlH zumji%Y%Vq$>w&c;<^bQ(ho}-ghOR>w5qAP{Xb8$dEssBmL21VpUBwpSk;Ggy^(F}@^gOBU?4PZXYV2P$vL;?7c zFu*3~|-3}cC=P=p$M zZ8@uto#HY}ltvL6@GW!wymkdXEKw>&Xu-EsziWH6rlrOEe^-TOkKeeO`-@r z_H4mOC7MVPg%CUA)=8g!f+d}f#*kWrgw_9!bM4Bo)4Z~I`-l0BsnfhBy%}i^~)E*e4R3h;VEj&NkZ)3|6jnJYo1cK?;se>>r#VPviXZ_5gYX4t&IMMKG44c-Bt z9d1XyCDHmv5pw_sV)S22jQie1Yd?Zy5=lsim~AogXCs`F?CI@UQ*WU9`Gfhl zU|ai~9vvMpHbl&-U#1@JT>L4j?U}V9V!VEtg>dhTgT*L`<(=W-&Z6yR&fRa^hz?)i1LI9*c849NqC~h}f}ynWgY>d8QL< z6LGbT>X%stkHBUReW$y!#SYZ&I2SHI{5_fb>Hu5ZkZNRb#r(CEqYHw<|jO#S+GrY6{?5?tlf6?WVHDHdLd4Yt`kP zmLrI3v!)s)Ts=GI^w1+jjuq9Y;2O{SVKV(#w%C$t)Nl<}+S}sc6}H%dYBX@Ata7jP zDv?8@8ZBJqay#Jb?xO|rD_XEM=7WK(1hFRMaS6g<92o`(S zC$9tw!=pBbU04zrB_H=_-pR9-Zr@#<9 zcQaZJH(-wqUk+8di@TZ81u*C6?ZMG1BD<>@t$>^D({xMQdbx{Z%xERdaca|Gbwi%J zINFR>!JMsL=nypCUEIZtR>PbfvyNzUTf2*+%xDeVcwbL%bkW0I49#dQ+|+4r_x%^P zxr>1rts}174_$w=gS)u18Lfxg@-vrR(yVnCN1D-vaObxU-QKNHx{9l7g<6_ugFWAU zXrzm~IKoVB5!`dk_tg9uN_TO%8C?ty+?cY;_ZBh!hMCbN@X&@gzOs);f7bu|(f$>* zle8_gY+5F5G_5zSBh8D}2>XORz%|q=pkZ;un--O z#-SZhPt=B(DU=`=kzL4AB=f&s0hgfF&mCe?Qmg-liNCUr+u95p(@KU*5Hin)LH&!X z&OKM);ssEhJtHNP<_6ROu)>7NaXS}a&V7f-H%GElg&($e}fi!Pp2 z1M@(Ue)#036?t^=#2T0nN=EF|_dB_QE}l>W<=}d|C$<9qGrBmX1{Q#u!@3^n#Arnq zkFS9WaQn<6J2&7-7murfN^m>y?V4WlRdnmIy#hnn2Id#4*+oLmFd;Kr+h;R5rV5!1z^YoHdCoXbBlc8xV%JgNrj!1Wn@#zx=WM;9m6Ks~qvVo}y} z4PBgA0}H|Z_}-g0Yz&}_N7g_CcsTahqLmYhW>W(t5eu zu{Ry);$bzg1XL_#wQqOPl`bAy153e!1}`~d`iIcPLuz0dcsQxivF%T%xQhpy8A?<@ zGwW85POi6W-v3oU|Npc4|5oTrRE6$GrRYSo2kJw#`$tGFvK`?fsmAwz3`z6qYJ**q zM*X-Mut=UP?j7HsA@MTOGH4UtzjME)<2jOM)gM#DOiNB3J>D}eZPKjN+HXt87<==Ptk{!p9c$f{4 zgNjapLjMLQITDW9fCBJ*Z|?i^drosCjm-uq!1IhR2_f%Wa3t<#1C*fRpUvk#zx3ot z+{^~3z%x&2*uLqXITBa10c!B9N7%)cvClXX7qbBx@Z{j0eVsfHF(p4L%*RYiN*!HY zU1XZ;tu4yfZA=N9gk^A=$AY!Hl~2t~KfXccFJVd=k+2%hXuIhvVqMIXIFPUgrpJC}m3JeqyCDf{Vfw74*BBo?m=b#u z*1;J~!rScl#$-wwkgy)kX7c)`MG#kFN5X}0-jnZ*`V1wm+m?h4Z~?pfC(qPVOoqlo_oD-te&+_gEIuR9aJDoYYBg;~zLX0owLy2PS- zQ@~%i4C`-?aTnqe8oB?@g`Iuw@BbFL5tm?OE`t$1xQc&Zz|Z%8WB;`NFT}htJM;yr zLrXhKrgzO{z zHhp!GM4LJlI91rRO4Ibai=>OGQ-jkNR9y~__HvO#nK}(P%^En%r_Xv92{d(DaO&~r z)(X$5E)rnsbl`;T?tu}v_Pasx>es_(|C9bK9B+}Fsf|K`-mn&9JaglT~bp~*D zcEORiO?+G=5vHyPT!^JNd#G>gA_+Hj#o)@=@Voj=2{zJv@T!lp`O%@=*7^w=pI=Z_-*tD|@NgE?ogV!TIc!G8` zhNQKTYCz>3r^Kx5dl?dcBh`Y}i?ed@Fyb2gj8q3IN7|>2n0%cfX=S8(P_=mU34x453^#CpzPv!>5?Jm1H z__7Z!8As+tkQW}dWPiXNTr!r-i=nWih1c9EOk9#o<|R-()nNGrU5iV`ka;N-hVCgj z-JSUTj3)CkC}f^@Ie&+TOGf?VY1792m?nME^B*DOJ#a}9najZYb!Xq5&zONr63ILd zJY5*>K4W`dTr!f(^TB;jcJW*dah)T`Tn_G@(Z5);%N3UlC-VYu-|6nv@2*X8$uKfk zfJcq+_E8RgxMV1q6Z4!F`siu9CgYMJWUc}g&w_@Z*s~3n3?_3mxPN2QsH=Uu;F3XP zt^p5ao7=5x+X9yiBy%lz^yQ%F&XUHsWB{4#z?0aQ_WLTPIh*;hm5ZdOsmlY$j<2&`^|Is7`~Q)q-~T|GAB{yrunM9FxPa}#mJxUV zW3f0a6!XFyh`ay0L?3Vh%|XRzIywxEMq8t76hWRKI^-;}4ar6_h*MS{OzDq}j=D}u zPW~}(i_E*;Xz$C7OsO*ot6^l%fxdU}znD@s32R_P*!9Ys_AyK;i-fhX(<0W*;~P&g zr8o)eAZW>NzU*;Zrj$v-dKj~-VfNw6hnP|Z2^Yd1vSYX6?{{QM=_G7`u|Y}9CQ=`! z)QN-M>Cg-@%kNBH zn9_zMTn77ID1Mdp504@JQEk8L_@wH+48XhR{nz6Rlp$?kq%!bfMQLkQ&l?P>oss5& z_xBd}a%8t*NNtTYA5?W5aP`wlCPQjtq;l}K%bYip^S3jk)<#+YJ~;F&+wOmfA+<76 z1^B2q8ujm>J`Aa)kt)H*?Hs2_3m1me!bnx%bFpm8pyY21Da}aL;LE8U?f*_V%aCG5 zN{p4_M;%A6_|A}`MydsGWWk|`r3XWb7^x0aRd&d+I+4tfEHF|%_%imx=#ncL49R>W zErbYvN?Z1!1q{hNBQ-$U`|DqN1`;!gxkg$9>0jP9-gwWGA(>;O#gO%?xW};G+ZmGC zMp^=0{~qi+Z_pQpWR{VZLg$e{_W>!9=2c#~+ zB^hKcgR}cC%Ta(UxMT*I=fU|HgJ{;o7&D#B^WnT!Z9laiq{JoZWG;sb!v5}~J~0-T zOe6CGxM--8Z=)pQ{8PzX0sp$-5Vm4=#LxNv_}csbRj&Z}gq35t*gm55XA*P&E|@Ro zh*qID(97s9bTK*|9fEd7TcVE02c#UyLk=OUk%h#m%pSP($9I~} zdg0OtGS`E1n|3|8i0s0p;bdM2&VEe3+|11amxhtK0bKkmC%i)Gj7vkwya-&>_1%$Q zIRKY-B=cf$Ibbj?rhjW(+JVeVz|{`vmtku+TpB{=rQmY>eH;0=Yq+#MnU{gfCz^OB zo$t(+23LPsQQeq--Ejfc2><)1ZWgnpK~y6Hs-9g}d(GvsrGZqF2UIWi-ru0v!Irk8 zntV{O1!uosb(Ae_OEq$!{1g{tA=u5922f1_(9z^s|7!ZNrERE20kkD8Z_a+AWJ_C9 zjS{He-1}$D_f>4EKh>y!w&}2b=eq{5rG8YS2AUh8rB6S!8x!4| zEp19Qr9gM@rOx_IIaAt%)T!sf;1{Y@Gn;xcrJf`#gCUErJ!#d{o+mxN`| z=u9bxg!5sCB-?&lnuwUv#w09007T^_IL zK8PuGC1E9u+`7;bRWX0I|1ouc|NFn%zc(@auS80a3&>7nDKe+_?7w;vF#5-j{P6{XJvT1-5hu)fB)6u~pKf#0<7{Fx4nv!{koM>Al0*(m_9b^m^@jnh4$(F`bjUF;nme`MpYt5GSrJ6#>>U%Y(d~jQ~G>&Qv z&}HE6Bdg*?Y-t~=DT3}TcITdbpUH}fwtQL#62+ZKX0!c%0g|>9IbynbIjFEC)}5J`Eo{I+!U#5X6Wt@2(g`H20gnQP zb#FA782?j9SPLFVk4|2YLE!NutOF1KRUdwHXE;+jj)e8#$$qY8>!_1V=~xmj1W)6> z&Y9jWi78DcVFP$@*K%xH^k}AZ3<(#32bMiL$1dSlxBr&N=>O{fFQH}9l4w0>fi!oT zCH4X<#x7#JiSd69HU{g3wI|xY4f+}_L$9Fw(N*YQL?4iVMxs6_1Nn+PLbSx)|8`^v zGK)B&@nB^Ccu?9cDdk6*%=*y|@4 z*{zIJ1)hGp@p)%dAtT$@NY&s)#tNr*jpj14eT-BCp7xr{JrcBwd4WH&cb;+Gv0Fy}+#U5somBQ<~*Z&n2| z*PUf#H#5>AQ0af*NoKwcBfF`Q7K5rzyV=g107iBbBP{{%Z{6J8wVRlc?P;W?;6u}e z6Ksi_)oc$VEdw9Ey^k9^egrf7=d5wYte;N~PHr7O^C2UZncbL#W#E|8mCz>4cg$>e z63zq1-w0aF<#;o*-AFheoEf%w>sc(4ne9r#a&VC&O>o`HVP?CKZ~?f?-=g(QPh@60 zldu9@v(&Y0GI1<3n@z$>klQcQm({y3Gn+-iDsXL7Kd-16tC-n139G@?V@vvd@&Cxo zW|FW5T#M)^7HNE#*$fiaf~yyUE+pTHWoFY!SO=~NUd>b=Sj5bBB4Itqbz%iIL3d`h9SN6#^2PCm@)TFMY}?vhX)f50bNn^A zacS);%t&`t#I?t7&^zN|iy`pdM)o7#S5eJviY?PXD{~olnF#%{UkqlpRrzG!5)L)PHFgL2OWVcsT8}h6?2?&vGi&Ytv38zuO=SJwo|(`rC?qpU=v5R^Y=|_K zb3lp+D2kwf0s;ck1sh`TN_r4`?`7?}>bfdQ4-g;_us7_z_h-<(%_JuG|IU7%yzs?! zeSay#oHFCgnF%h1?pl;JLjT?RwvRi^bSZSxqD%&d%M$UoFYdV%4$`8m35I_EJgVQ3 z-Y$i%T9h@z(fIX<@Tf5^g#)!Hlf#JK+k5m`t%y`;!`zmM!XnmA%>EfeYMqwWX ztpqpre42z-__w!z^Y-)q6*K`Yie`^J#iZCtY#lZiOT>b(J{SXik6uClMz^6$$(^7Y;E0g(s`;$;c!(ahnG4( zwsBfAo>dsA`i?E#cIiJ~>1I+Gpjy=mOL+7baqC~Z6#8q?_DbQ<$li{6Ne^8L{j?}6 zgF|mz-jo%c>QXpNi?VV!#A&!+PC*}+LSHS)D&XKfNrEm%^IQsjv?!~D9)^85yWi>j zy#IF`Lc2mcLF3cXX#O-?>?JXyAFX5ap6tqP~BPc*>O#}>b~`%7X~I8A+`5&m^(;$dWG zn^j?+`h*Pr?Ru8ARG&=bs!ue*^BHLPFx=3paH{%5GraIV%xaAh`Au`wC*-h1FGlib zdZATew)#X1yzr#ansbXxWT{WI!iz<7vWGq#U|X1}u^TLfu@`Y!So~(&!VHa}G8p%* zaT>EY-?lJaW2hV^*zQ`sWD5ClX&OTnFfpi@c66D{ws4BZP$it~d3t3Dx4^bARb!|M zrWAf$(QU&W+rku$p=vngK=ZqyAxmuwlQo7UFdYZu$E`kLTR2%`s0L0kzA&IBbfaxy zlEzRiOxvYz?0ajiZDFFuP#w(NcVv*z8MiG=&=``!jK$JRm*8OA!buuK^)PeAD8ub> z`C)Z|g0?DWaMU985C3{ERH{qYlBfl5 zXuIvL%?p{Fu1cZ~e3~(F*qDV&n4B(3LJGe0`IO{7C5y>1R1)>z%ZI+%g@HUKr?Zl1 z0N?h{pJ>?YBa_ofNwoj}HzV?x@nJw$~(38&9_9y09aWM4>a!S`t^l;=CGJ&d3RKO#Ch~eIO zZB`saeWDT`6>aJI5}9XJI9Gk53Lf9vdGxpm33UBZ;hcc=yLE@nt5?QTTU;Hp>pUpNOz_62ca#;Nn@x2dOqvA z5sU9^%ju~xR0)T2UakqmxV9WejiD;&T{$WIZ0G&9oE{oO)ez2K#lLdH)0Wd+V@Lvh zmn;-NH#}m?anKm5fj$|&)g%5~Ys=}TF;okEFxSGFt#fTT_8LQV(C1M9XJ-ZECa}{O zl0u(^t1D}sJhSE4Y7EswA7jIL(x@_9j*Z4p1B7{X(jBq!wj67Xp+@KvTD|a-bFnSQ zN@GX{eUD&!DtY&8IhGnjP0-JLGFyIIYRj?E7;1(AW(Si4{0nV4<{CqC7)YP&dERl5 zEyqk_s09YZSc?~T!fZLF8bhscxJ?Xi^pYR*|L*Pg|NXb;e-&f%uw-l`ITNtP4A2*- z96gWjMtN#h0o;nLBIg3Jl#~CQ==QS?ff)%uu87RRlQ1*~XK^sJsp$1NuE|*vTL`!Bj2>PIP^iZ7O1X8&Sc8M9id^hbb!3m)9CfJpB+dVI22f^{D@@B}; zOB;N?(U0KxQMnv;O&Jy%pHWS4hEaJ7)LZi8wdwas1jm=kTcLiQ|Ayz`bp*$U+M$<1 z%ZmQv2e3nw^3sk{=} zg`c-fNV6q4L#Vt8+E?X-tvwt!8Dk1UrTknRladDeQ5neBsEiZwSsHDzAsm z@Aod>7`l((xKeoo9I(~vbc^)*&+Gq_|CjrJvaqq37iLTL0ME!{fz#+_bP1Y;RW>p>a$Bj(jBX7qPL8r^g5hpU`Ud&ru{hbvrWuZNxPJQb z7)KT-OWDX_%#jb?S8m*3aWa)n3!IqnN#ANiHj9&?Y+7Lg&-Y%}{B#BZc0~PLhI3V8mndceO8{FgS?{S_30J zb{HP3=+59IC}=Gl@3wJtaXH~v&-tEZa3(5fBTPi>{=Nb97@P?TDuc;>hMn@ZPi1go6toFW zIi%md7%_GPAAk-DL zA&>pvBexL=IpS|aILJ)$4K%$7uI-PGJm)_hx&PU`R}*Ag>0F!ko0S7|;$}b42G!EJ>|d}M_FR72z57RdI+yhe%ArfQVxtd>kJGu#U$6x_M+t}1*N{o#7i@(C ztXBl(F7&tN;_VM>B4LK}kNdRKQzrfAK?j~X9v%5?nKhT8AyNUIJ`)G-4RyBW(ltaX zVILSGJP=W9%{A5#se%K$T{T;nm1)g2(h#YJ?&l7bucM8z=62N(kwCXa!#`X$S!>Ph zq9IZP2i>M<{D~<)IztIFIo4G=2>$)YlzgrLE>(Fo7`{K+)f%IQs{AW&)1Jn z8?3n{=@Ujj{Us;cf98Le-?QexIga2C4W+)b!L)va9sQSo>j1JOxW0UCS0iMszFV` zvTY+Hq$XUT>Lfr~-14xMS!%-dR&_O?aV=7sW6{%uJ5<%xg661XXV;8k6YdaIR|lF$ zJPyB~{L+LwSk*~^ylX$#(dH$J|<`cPuR^-y(< z;O?qJ-?nh#Ot|i32M^3ozljsk$ccaDD3Om+S7Ca0jWnX7DWL#E~A|786`o zY6o5l9Rf0ivtKn6+<{bH1|8=0*%*BPE5UW4@^a`nY*Cf_fsq7v0F_t3?uVuYUSGYI z;P$8TO6Vwg{$|ZweS+JM%Bx_Xp^gLkY<)~{`%-x|>^G$Q#p*BygWGo7P?NEclLXH9>MKJ<#o_?slNYB*Kq{biOQwWZStuX zGajBMxIL-79(om7{aN|f8-nXdHh*^bIvV4!s2 zv(3|;e%}9=_`h8LI|&OVX9ISaA^IM@g;t@*(M{-bbSfHy`lJ0&GgKFOjN7&nS@>4%Vltr6jTDU z$DMoLqZ|2Yi3(Z+vriz7UwPXZ+yn)!h1oNccN$KNW^gAdXdTRa-qP4LznQ^}S5PU; zg0q?E>@Ws5PC@Ho_F37TfZY-XH&#I#VBWKx^Rsoy-!@S}8{tg*ouw_?7BjdL6jTOh zUQah_OCx_?4__rcK8PCY3?{Tf`ZGSQ{j#~E6z9HiKb#vv z!F6zOr>%xZlBeR_U<#H(ubpjd`dxBt96`bL&?EHuA>EDBac&R=H$cxn+zzqyl5p;D z3T}jhm!;3xyrB=y4WwWh9170LJd)qx+yDx0g5IBIEzHs_`FZ_s`u}$R@AtcZbICbC z0NNilNA-{wNGoy)IfxV^3&=NA_oDOKuMgE7o|%(Cjxeo=-joHG5eARdzIzOh%Zh7X z!)}RpN2r_ij=^IpXc=5S{!Wo=ehGs|C}=rcxv_5K5R+^M4_D9%$lbYg;TVgK3?4&4 zDdG6q@eY1 z)q?4lcF$bP;B{2c2FSS_vLqw$34_-`K^r0O!Ws)X!;!%=P*54WxNajTO>lFmyb)qI|Kes8Pb9cgsayti zE_1G!9;qa_IaJ;R^~Ss{S+uN%;AT^KGc?d~U3+&+)z9;PW0c4LINAu>AeuF;1NI8L zf?dK6U`5zmvIiJN_5fCx4*HNh0yv5mqXlR@IrjHLjgfcA734g!16hG&B4gORAv!jg zeo)-3xGBj~bAL2SLegz#$oUjDZ?KB0gpA7KpyX&DHqT2%RYCg44Yc)nC2XFjimHZ; z)o$bM26kifJXDkf;@dA<=U?l?=DDk=8i;Smbrd~0&*r(Qs9M-HZOh|nt_Rt?K`N>a z8h3D*pSEf^o9C*cq!8b-zImtTQ8sU&imHdqm-X8l@w;rEi;8N1<|jwP0?{`%Z-9zw zg!XL4#er@XY+ipAC4)WJ?6;Uw8Oi4LQ&CN@|5cYeqZg7Js;`P_hHfbr?C>5_*}Og~ zN)Cq_pRKyL$&<}Il!_}I0&Ep_Z$oaaEn)!<|85^@?p8RvDQV6ufHe&6@r;^RDf3a$ZP^9#yD z`y9Y|b`)F-zQsHWFWa>g=h;$l9r(Vq+O*;HP&&_sGLlIVjODj2i_WvAzgSvreSN+j&NHXrCTM6s_AAn)gY(QN zxEUI)ES6_355sw;6fB2?UG#@%6U=a)2?e)6)`VG2e}Qv9|Nk!)q1~fZ(*B^Wp)I7P z(;{eq=0qc~@7P1E0sD)b|MRhYEKzCxUylBP7Lh$b0vbe)|0XDc+(&AVd*Hc+Q}2$DJ8WUV@U40N(7Q%^mbInY>9#q6Tok6&lW2@`cHZ zR}!^=*Vs^yJX^rz#VLt8!1MhcFTGdH!{kLP2^m=P5%(x}vSRY0ltdF)+pWp%SZ*tm zH(p6JgN^y?jtBVGF?r*ZgdA*I&AmKi%|j+HQc1Lcjf>7b2OqmLc@avY6>QaAGWG3h z0fRTTeV7hP%$V7JS{*?`h)M1t3|_c`mVs{*a&_<06BxWP3R(`nZMx&#b4EOaH(Eg} zz}xgOWo$!F1}{uOE5WBNi0wR!s|?;K1+9We%Vyr1!>1X%kqTN3^)l}hU-u7Y@In<- z0u3^Z`(|~%&)|h9XbtS>-K%=oi8~Blu!7b?1Kp9gV`klA@J1+T9n{~pKi>E$ISmR@ zP$@L%o4b7Fj5G#sxPsP0gE?IeySS3?8>pZSu+znLBjxHbaw;;{%!=n=^R63Mz+YA39&_=_X_F zd=#_=nnj(_pWKhf;6Vj#g%;jP(%=|^%>yd^aVaz*d`5MG-Pt^E6;%dVy{x`3FBY`3c za5Vtu>r-$ecx<`ZIm<(c^YtiL1|Hu@Z(3rv4d?4pa1(gi%XN3TxHrz%q2OllGVMUy z(u`X;pGLuQ@K$GFrvLGcI3J_n7Vu`M@rR*3^>98)!L8s;!dN4#7bCYu`Wl$<=BT=IIC{XrV~KCvO?U;Wt^$VRLx#lK z?>FJiR&|vya>t&b?($v9+xg3c9EFyW~w>~oM1S} zde_PiCcGJ{t_F@Vi^K=My<@_guIg&xxF_%DhhMy9!keb*>fprA9aoDSpP2CSRGk#Y zOn8Kzc%E*;%T;ytFt!AB!)rI1@TRJ|1{i;Ka_E)KVzA$U9hcG2vyZx@MTMJoQ55#EvGs3{@wGQ_NSSp(!i1Nm>RMs?k^-Y0{kcru6r~=z6y&o%Wyd`yMXHi014}BmjIJ3nk;zL@ z66Ij&@v8xEd!{gX$x5OEEOqt`aYYU>d6ShyC0J3N6xVxn0h5=cB&xv584INegHHWy z|C#^G`9JFVzqRD(&qXuQP_z%)6?u--B7Y!U@@@XFmj&NR$BFzNGjk@-oYlU8^5WA{ zCXoYp{rW1~09l;{zo$B12O5*#R$oXJS@0dzc`0c6Q@+c;D_P$|ov#PYPYp7nkf9d* z?&^F4xLQ2*@eo^q1>ZrPZv;1IIk~?vi?-l*Q|D#i_UPuMuh)t#`1b026S!yb_tM@u z{Vn)*>U=YJGDcc5o{d`YZPj@>c->7tpCgc1@NLxj7VvUL$?%V54i>oOK z>*E%j|6}2qpuFjEDY;}{X6(2mvX^Tt&bOrCGN?2E&52W39?rL*;BrWxv(pIsqaNp* zQ*Z@jj-YQ^VdaVQ%_z7Mvg{)qY%K_!Z%V;c&}1}n|3T0UoNq$G)zD(hyoi#;?l_-K z!4hchYnH~nZie$&6kG$@Jq;H*3>=U1nG{?L%?;yvb~*JN=MxlM2W@y`qt`f$!}&M` zOQH49;D_?eg*cx~lpQ*Z-x2pY2CY)CcEH>Ti5=yc%f^eYSR;(Q|t zmcjnD&m?)XF5vvG6x;*{?O5dAWl|B&??S=N(Bt?Ux4=h(alRo1%OMCet{M=x7w31T z;1=jUyWsB{YjRNSL>aT{z!i?ws)b8@aehY%mV(=NN^X1^a~F1y2us7pU|yI#)){?+UPUjV`%w`(o1FKL zKwVICR0ny293hRSI15>e zTSg!BJjzF}ksTv2tT*kn{Q!4IJFGElSa(6B8V zmJxh^DlZ3hHG^Mf4v8T6epFro8p_|U+|%t6!5>EDm7p0(Fq^)q7s2wtiuLCVtSc{q$>?Qa^s9XwK$N$~As288$52o^ZaK&dWaJq1g;CoSd1GtItXJtRV zNANwVyb;_!a6jxw!Xkq2LFF=VH|bQ`HC;!7?@r}S;8B;gH_jz72)-MYH-qOF_i@%m zatQt)Dwl&dvtCy3O?4vpu2kLv-W_|Ohnm|H{DD;73O+ydu$1-Vneko7PEl92Q!GW0 zP4UP)3;qCgU1k}$(|zWNy?eKt@%yW*E=Q0RjORBk`2EyXSAgs8;r?46?6TnZRp%=~ zOXp?y@2$?0`%J{OQ_nitTkw0S z^EE)eq;+PV>-P5c-xZmF&@R#z(fnuzSS7X!3&D)gda{*|McGIzc|SHW4u{59Wd27B@&wXd#*vya?6(>f~KlOLgdwFJ)fpY@Qn zfa}R0t9^A1oEy7;lliAxp8Rm_t83xxu5KOAjS2JQkI}xm4$dXEZizYM=*b_geYF(M z8Ga%DwHNu>VcJ*M!+gW_@sGpFZ9Yo->IPWQ;Z#a}RYy<$NbRc|;k@&*yL)bsBTK0E z)iStf6qq=rmHdl^XkXm~m)>`gWJgLo`N7&(H^WtfrX>vBOzvwVw6B&!UgnDX3oQ?} zw|}Gd^*{d8{;SEk{uqo+j`W+!F}?>mx*tMv73+Td=jF~%)tU5PKUK{$+-AKzup(2C z) zoIN>wtvf$a+gftJ#B7Q_77cdiCumzMgA1punfx3bW?)-_`){=8W+{U{8VY4TH zg7&Sb6lUGLz;D|`ni`U70>~Qn(G95ddKZk*$8B9ZZ;&m{&!^x9sMBOoa=8}b{8<#-2s>=mXZyd9u#e8>4SD7XpIdAIkyxi$yqPp9B!Xjm{=P$0o8p3M`mB253Nw&~d0aas%0_bUmN8FAo7zCz1SuiE&eNt^fHhi3y5TNj$8>L#!vI z#Z8@>l0<&@+@BA9^v&A8sl@Jthk($!xCZ(zEZUIQnC~ILwJxrOzDMX%W?PbnfT4A9 z9UQi%@bsfvGY>tZP!*7SD%!hu#E0%NU<>!JUW5B8?3(>(-6S{FCK;cIB$LfvP2 z2)b%r+z3O1qmJeqcJUB&(Yja$!=iYmRm_JT0z<8fn_zhE#S{1TU-J-j*1EVEj=SPu z0@vR15OmVISPo;&V;!$g_w*2S)VjC@PJCyLT)aZ}5OmPGxE03nm`|^pOK^b!rME8y zpU=^rts;)&0(}ZD10S8zdgq&;#07d3Tn=7!oxXmU&WZN+Z-ER$XeG2Iv_M*CtQHes z;n-lT8)k^UMX#Zk(F3R$EkF~|V00jAf$Abp5gGCqvV)uhgffbdvKx?0I+`jeq2!SP)w?bRbEneF;Hh2guwBD^tAZV0=Cx0 zRS@d;8uWMf5gr1T*2UG($D?-PnX=lS*Z)TU|G59Z5jl_SM~aa}NEZ2q?ehvj`}3c4 zMx?}(QxdW(!q0Uj*?1}|Hw+tl(^xQ$$|^c=7tAvjL{eF${w-H;V?hL!RT&uECUaw{ zth&QIZ!#B7WfJ3Uj95bO<9`1Cuo`eYv+Jsv1H1^qXezG-r^CZXUHTS42*Rkm4xB$Z zy2O7IZk$gAynQ7&P?g} zrF+vNLJ&;lGVu4>ffeD869~ZwDsKW8y)4rwB+3av5S2HB%lFybH7?r;!Eh>9%%^V`wOi=K=EbHLK`zd-tSfh9)pVw?vF^D z`@3xdPfvcy&A%@*6HNWxHiMVl>{?GuU2P`F`Q6IFtC%iXP8Wuo39^5;E#T#+)vGTz zL@@+e?H8z#J;sj<3r!zS`^bFb&JbiOXc@Gq+LL=YJ%%C3P|$K{#SQimoAhG{(iOA< znioFpYD%kQ2+|a^5}NJ^j5WM*jv<($pjD7nvBJ1g9Lx};Drhw{`7rQG{4^(qAVonX z(0uh?lc4mhws!*IMuq_Lp=b}rqYv;omw>$QF}LlCb>HbN`b!a?M>H5SAv zk}{;@khQ1CQ8HG+nh-;WGmdhGV4|YB8TLI{OT;c2!4OPPP&piU*duiEc=D5C6to5Q z?(ni&_R88=5KSEyOPLR6&HK6jU)X=v|6fMSppBt<(5z{C*b}TCJB4k;mS7p!SZoO9 zfOSFNpsnQCzY|@B=Aa>HPgD=NjhsW)BGbsX_~&IKw9y$res<<`YX|G}l!Sz|M8z_) zYb?8`1bE^$LTgQ#M!4Z#YW$F%+iiqanlduD<-+NGJGd2H9d~5i%YT*nrq6);U7b!g~Q&~bn*;Im$PlkPrZsW0pxU#7NUvrN1e=a#k2pOc&RhVi7edlw+n-J2K zxdg$YP9BLRgvQFe2EjH~^{OL;M#{Vv!3tmAD<*_pm3bY4?OE38JR$6&%%up{_;=^s zETN(DH?4;q(kjnFBK($@OALw408!v z=&7P=pij((?90zLvV|Thsuucq8Js$F>?~X8uA=IoPoKoIbB^?83*A(d6#9fdy0m;B z#ug4zQT5PwWbtsvb&J_TR~6L&{i1Sj?HilK77kQVjWCe8xCJji#umD$C>abop>y_7 zkS|*}Kt(mdkl?qnX9te3h5c1jGaOa9b2K~m8C%#-Maf~fv*$&R!Q__jtD;)q*vJ;! zYM=XTVILLM3L{x%vvf@@Y=q95dbd)z;-=9{b2Pw4*jrPk46by)$Ah#kkxT>GUKQzQw0UYi;X?ZBsRhxnljZ; zcxcGr?k!<9!tRrZ|i@uh0#Cup1c`}>G7F)Ig`oV zvHRWYtXapev4v48N)DYm?iqV*PDVy*%GAKj+>CRx+{jF*rc5o&?iCW0v7X#zLo{XTV9qF;!uyNJOt7Ym z6y{`GY+3h;Ya<+?DN_%pmcg>E!^p{6kfuxnoOWWMQ%WkiTMyTiX@s*(k75SKo6QB_KNHS&SG20`TrDh9xxEY(bs4_ zdKl%A{XhuX8|{odMk|OJxrEt31Kpl8@#@eBAT&ksT zn%aOAyzjh-V>Sm_S2>trEr7&A&_OYt8~hxP=C#(z({&CTbQPz%3z08mn4ZB2)1yFiYkYl z_w@NQGp`$4n5v>Gpkd0=G`FbpY+;Ius)R<7`^Q{+vV$#5R#8=u0k#gD9hk-zPF7LX zkl|$7uoB4G!XyNDcA_B0^^Vx2uEMB9rzH z4vtHRn;bWFQd|zXlc94jW^8aYVvE=+ss()Cc;WRqlMieWOGULpWQhMP!$}F|BBqYx zk6kk{A(K3Sa<=vx*M24ci{1MSt}i`mE+W+EGVrnhJWGk+Z!W^s=yGriu8EJtz05@n zHM#=aLCoXs@7ZlGqN~xB;9);_V{Fq+bCIzcT?JkUL0IJ5@#Z2UHM$zSm^tD)S3lfb z)K!g^fX9t19cF*`WB5j|!NKcJ!0`LF2@hx%T4s(&N8r=-OCDuLlbB{C^>8R0i zh>i02Fu8e*xrnAlw?Nc?QrgD!>EEciQ5j-W1#dUarrdbnw0#F6u?Wt>Crp ziNTN7?q!RdRC-}@&wd-aAb0Fzwy39yDg$>ejUO7@Ma&jCs;F|%wv1ETE7gfD>Y<`4 zz(Wf!*b&sGEwa22V?Ng0P(<*dlus zB>|68ujZ9*4`++)R8$Rk+}aw{_j4*+WUHdcF7!xpQ+1JmEwWKjb>PXJJD^7>`B~N~ zN(x@w*fyC_`WIVdrK0M=i@5YCANhE;$Wlc$fHw(Ifk~^5vPBjusu8>Z2e!d)&)Fh# z6(s|&E;~kF(k*3+%v4kpc(d})HocG?Y>}yoY6hRjFAZFh^!(@gALD*r|Mw?tGi@m? zgBDKnqS?_pVlOc{_BXZ@E5vfKC~_X)h#8^p(d+1C^booZU4mw#(WpP#pX>t+$UdM6 z`3u>OtVD8tJQ<8B`mx*xxmP8mOiOHk{Laa8=GqUFdN4%^N}?K^mIuCnExpDRO;QpP zaBld`sU8cuFh%i7q6VC2uPZ0c)0v_;B~c45a96a=@9)hN#VUz9aBYxamZR< z92dY8jZzYouwTUFuJQ@`OwmXsQ3YKNHtgDTE|n^1fg4rUZM9rrpQ-GG{a%1C#)+-9Lf~=CTS-iw%UY?hEi}DxS9GW?B=&a?d`v3 z`}#kM^*=Ib<7mFLJ~UIBF7^Vuf|X*2vGv$eEC-9h0;?SLzNjgxgFGW=0vD0}ND(qmbrm3n_{X|=7xuWqM$9{>xJY4Qfx0>G`D?Gagw(G)o*t+SiCaw6kRmu z7c2v}4F`=~zuulMD)HBif;HgIIC|2A zu%UF(v|q3m+;KP}yCoY;7v=qeb>MdAIrID2ccP1Oe?cj@vs$|6?dTf1XzDLm4<6iq zG+>G4d%7s+7i<78yvN1%cu_(ZW&eVW;8l|wvqGy z6l?_62cx5JQ8{{sZ1eNc1a<5F{W|Iw_xm~B$jeE|{rTUvKx(sk;`Tac>pX1n!#qXZwv^z!vvXQO)3< zeGdoAEnV1RClw_JkItT{pV?H!7WY(9EugJX|S*15jDmN9|s+HBc<$KFb#WrfCM0d`{Wu{_lwX#O{==vU}Vk@<> zR`(AaF%?^?m34Y4nFgj}3$;?JC$5}lDmGUu>-Eihyf77;sg(`-v8^{v#inXyqyEe9 z)}~?;wNhpPuX~${*=l8z!Nw`)O~ov=vbh7oASF|+ly~SlmfQ%0TG`UUY$YjiwX(HC z;HdKqF+zljUyq(5dw@k~DmoH%Ma@wRd4SX)$B?zi zLL`lRqaVln;vdU02Pe)*nUqO(iJA8uGL3AxxOfZ&x4@Lce*Fe^`hbf^Q*bNHfcS^h zu)!>GSo^gSKU-T$UVFcI=dx9njt`q99;Ix`z`Z~s1-2Qm#3PkWIe4I3y-N4nQkFPW z*;IfBBPWiVm1WElhbWs$@Myut24C)FmN;11RDoxv5yNtNxU<9~lui42Jk##0E0(at zLCQt~p7*b?d22e2B_6J9YQS@2U7NBb9!ngkY-+*t4;PnB`#XRo4p26A;3a+7jvFj{ zme^m}kjI>D@mCH#+Q<_7DVuum@?!2pqvQ1~@i1jW9&xsH9%ggWkR|q2HjUtYMTu|p zd_9)fN7=~0`{Z+77F(LJ#8BCgbD6<=^9uH#W{H8aX$D{Q(WP5W->}5q%0>>+w=VG| zqIoRwP-R1onG4-^_@32giH9hgR)|^Y>LhseV~Yo?^v9*3CjNQZ(p9_JVlNd{2I`tu zU41YwkS+F9QRP5Z?|LFU=_6b0p`t24{btA1g0UCaVs{l)2^!Yjo}ZLRj!teWstU-M zPq&P)Nn?u#siCg3lQvbL0zq~O^^b6Wb_5ej_ zE*gUNAY1=cO;xx^PrY@hBZMG6m(VS@RI(Wael{i&%Lf&=ld2cImisnR%QGOTlJ(4viT8(Wi z$-!VUrF$=hA>!yYU!pKvoJ7H8Ff90VYQ_s2T%1V3 z7prJo96`ZNaLP$qx7NtBxOglDH^U4Ezl%M(Mz^7*MD)+t{=dAuiu83-+MB_TYZ!*L--on`{k|e%zg`eg&J! z<2>8GZSwRg()$%J)l4^OqTT73uto@_Lx^VK@Cr<3g_@ z+P^4ofa$I~#W!(BUa*k&55!O53uuA;#ry#$;wmdR$fI$|6=big)!U< z&Wo2X_bTf8FUrfv@`R+4!(Y6Ly8Mgsau~~Yy4!v5X|E!~e^FimWBaaexnq3AtElt8 zD6fREQg3WQxA|U0o&H666`VvM1ve@;dlhy37vk+)Zt&0OJGtUD8JfL z;#FkuFUo6RViimF%-iwj_}^dk{(m-lg*?iSL+z3K$X;X>l7WmQLqA?-MLpW@CkR%# z7;?|zkf66LiCIzi->n=TTqSu%TbN{4rrH{ zb?YE!n|E)7cX`myqsUI{;xahm#6{rQWx7X^t=7fmFx0{%dS}8nk0Kkbiz{I0sy@s) z<`R!0Ypshb;YhRPdfwJy9z|AK7gxcsiGt?F?$I7amRc8A!*Dx~L6t;_N0Eir#S$2P zJ|fS00Nta=T*59&B}#d}hc)8o`rnlM|59lqXwEbv z>=o9CoxqB*Sy(hS1hd94^buN*o<_H#E6^NtJPOgCve^L`Q8b*&D?v+4U38!AOrj`|%Bw)DRkzvM_-UdjfXb^u z3rxQH_P8}s6*yr^6b z-f{jPW#<{t#1by-Eg+}}n4VA!APRygMMM!~Mi5a!q$(;3h>COsv3EUokB#(T?{e&2 z526C0h8hC)-g~d#0{5ET1n%eApU?BoW+9n(-q|u6Y#X?C6*I?^%+=uikjw#tUND$B z1IfG*eAs#1YLWE}vz!6CS+@|by3Q;*DBfk3@t)TRiSJZ5u%B*;&_Cz|AZEzGI$o#Vn_3WAhlOD|#DB84uC0b!$G$ppEo81)j-#%vfx?8;U7auHndLa>+FB^% zGQVX+5}(^k*Ve)9L|U4^V7Xb2y{@f?yQFh^?b_qodjHSw^*^@btMM85c-)W30c;$> zo?zA3d2AQ94x5Qh#D-zc|8o~$4Uq}9qbt!=Gy?TPyQ7_vw}=|aNA@D?k*wC$KM;hK zlhJa~F*RjsYEtWI(VZJ#+2}>Ga?&ZH4Agd6YOUCGhLw{>5zQ~>eM}pBn9IsZrHBfk zygbEWrQtYMP6|a-g36_Feft-EV&x=Lgc2xUKeb!Mox{pWqKGO`{lLJZfL*}KNu-Es zP+OV$3rm)=a;8&64NzU%ynI6cnXH@yil_xQ{;@iG%Fuw7GmRqZz}>PJV{#PZSvgZF zg6QReu7)e@SFv)YP=pG+T9=rpk11F=@f6Vj-oL%D!XqBAawb!R8oZ&;b3Ix2m6a1m z5sl#E{=sIOtE(9~t*6COQ(~IW#DTl>F7VC=vKTorBwPgU&UH+mYoE!;nMA_H;Qr** zv*)`lW#mjGVFkG76m@m?-(wg#(Ii{~?)$Efi8himawd>)DR>mJOsF1tn2|G{gv-FA zNuST&J(9)98Arn9;DLSrlb;WzGjgIxxB@)5F{Dg#$e)ojmV_(8gFV-pvW6{UD5|@yewnp1d@3Xcx0T&xguT1 z%o$1M#o&&=q-$Mp$JYCQDewQ8h6my%l859V3)+4M5L3Wz{q&5~xR#T^9HZ_X)~h};1uQZzg52l% zMHBu$$`mlkycqHp+LaBTbC@Y$khubKKHTcnnD~+@pp$tCH1`bx>j%za3TR|r3N6np zQ}(y(&J=Vd^D<~JW z2OQ^bUC$JBA#)|P@^Xy=Pe(8XMr2+Etu|VninYg?g3e@K4Xvxbyw)3P%M^4X^BUOG zHRM2I)?lWfBbnF2UdzreRx-kv0z)#dgAS)lzX?0VGX(}@UJsrAUibH+6&$9Z1DUI! z^V0ei>`BD;rBCJ!(Cuh_=EYa@nF2jBSHpfo$3+GB5&OZ(yb<>EJc&;VxyTVGT)EWJU zyhadC&H^n}3vS+5i2}_9oSgYust(+)@|0I4_2=Zw(^B=|K1*+i^xX$e&Ri{}0?)!r ztUhB3PR<-H)c{`CM>!pMx}TFXTT7|I%O;b^E?a+ba%O3%M)0CG+a}NJ2rDO>lCKNF zJ;tcq8^dE+IWsAu2;4aEq9SxLnt+Z*2cTAHN8}AL@?S>wBO8&~#Ex{k zeoHwT6qB3~+foBO8fn;6=p5n>3A3P?0Vgty$96V$0$yN(*Fa;iDUICtj zEREV{md+IPC-X}1WWd{51AYx*3f#$D30_#<`fRaeD^t*q%&WlDWQ&J!7b2JfH!`mQ zZ)3_+9u7Il6u6RkE%+=^^eT6{&J?(ic^&xHWvJVguv(_Tnau0Kk8@>ZbCwaQqA!`N zATs6k{+y#k>gq%04G=kD6tVo86I0+s=4y!Y{)+x*3voQX$-EJEIOyxK{_O*fp!II2 z)HyN9u?gu}@y!E#6bKpTwv;1q&{9R z{Z>}yHX27@r=?23Z40|gBd5*a2zqL%QgHj?bhB+nH#mYGT8bF>^GbI1NkupUTP;O= z@9(>8UOaa=N6=kMRe)E5vR9*5t>Fl4v{WT{z44QyXb7RKwUiRP+N-+dR56Ytu+mah z;N|%BKB7DZN5I!o)!2QVkGGT3#mnuI321 zT1pKuPyZK(t9o$+94*xd(I%t)S4{0&-~T(Ey#8MXQU4Fc`{F!Y4||CHI5P!6a>`gb~wC_#+cBu3)0JtAdds?t?>Ri@AbmZC4G)&aLmAxN9y~ zFhSeZz=`2=3)bHm!xfCzcC|1j-|+O%^Oan|IBi!4W4C;z&kKLf6+~&fdKh=s<;=fq z6<07;+o|A`!p)L}#dTc47;V=86B5}s)_Y&(3L>?g8cyZgMsNQzj4O!Hc8zdK*4Fdq zRe)!{U(SSwkEaVpYiJ30IkI42;a@d$L9m9Fg4gjLvApwUbipVMEd#F`EV5Lqm2^Rn zhL(f3A+^hj|JI`m0yVS(yk!S;AL?UD7mU=4Fg&ss!(|&-MB_=ObM( zTtlnC`-X9!GV|=|f&dMz1|L`dEqY3n<$_@vS_3|9b)Ril;z1YqYiKR_#`##X=EXd^ zV5o-Hfu8~LCCD6Ky1-9E>ml-}zu^+SsdRy_hN>XmJ>Mvz+5q9xb(+@qF%@p{M(|RGev!sdLl}6 zQ{YYJ#o$5rNdc8J-I)R}GFN~H{pJmD>3N8JR_*7d)F5d1z~j32`P z#xwCT_#m85^!ElAI_4k_1kBX0J{=pJ8w3Fv9 z+qlL%Tp_CMDxm#|uw9K;=5mFIwyT7_ZgyWC7DDu^h1yOD?F<~ojrf?y6)ezpRnSiU zE=U+5?W&>E+$YSOtxvgvdD^Z9x;cM(FfTZjE10Y8YGMB}_g!!GqPT)N+O7@` zs4v=`VRDNrn62&V;ebmi=#UNb?Ot}O-6439^Jr=2wur0QCt z^t<)1vDdyOW`Y!5TMizt&?}?`*qI5Eb!`QBwDQeY!>E7E1WCHK5D|X01fSpv;j%SIRWY{_y7Q{$T-dc5s$ zBT1sPrwe;%XbreO_9}hNwIy_+t%lZuhnL>Cr+oIH3%hG*9e5I5RB_n7D_v-#q4nUI z-HMBsmKV~6)*7k;uRbk2zclO}U1+7D4d6X$yVTY{iZ0}9s2aQzoK3R*r+_Z(rlF1C z{lS7a-In~z7Fssndm5Aw7n2b)HLK+YQ|8LT_a85@g%(s(1nT=l41KXeNEezDMo(jk zr#F2-*g`XEyaF^jM#cs%ptFTMsv-JPALQ)Jrfjy5OEsn7QK7tX*ku-5$f24t@c80% z@1*xKwvbIV<={!bsS}UhzQq=@sHOrumHmt=55LA1GO4B#JiALXJzdqEEo4v)F^vj+ z*VXoH99u}I8ls5a=rVWQu7zwNjcTgFi(gkRZ2!lWE$m7)HQ?pnc4K|5H?f7LR8tFH z?^Fd_C0nwECR9@g-u86GEX8ZsLSw3_2k+)}yy?DjIa}C;YE<9@JNSWNmkPGfh-wxn! zq84yLc_@b5C$hjkWHqs~b~ZC%U`rNmy)@bSo)Th=JRmelUob#yCLF12Rq&8;$%@Ol zD^~`sALKU zk$E+A_{(2kG_Qs!^d$2d*k|#8ul-lDnZki&UJKo3{JdED=rvO~fXwUQKm zTS^!9)ldacz0RHcVqZO7*hfQ4fNF&Mob07v=t3tAEd|#*9I_o`Xh0YC*3dF=LteDa zV%uoC&{0FnLDQo6rOJ_g=|Tq$tpGRQ_P{~U^K@Y^4Xp$>X^LrsZhof=?KM;h8q4~> z-kab{7usoP6}bMr+T`cH%dO}CA~e_klkgy7?oY$sWA)e>OpMLLqA?%L8taU{M{l5o z=s&0sU5rjgL(xH~EozK>LT)1pDI{D12mN@iy1G7sAxtLWQV1gK2Jbjr z!w@Esa2bTVS&fJ3rx?OS5-x`@ak?F^{1`(xorEhO5RPUU=8Zf+3tr!c}m{g9kSj-3?+0r;u8BwPnaZ;4pNygZE|j3wcE7%Dmz(=9^C5XO+O3P!9yU+8hz zm?4}*!VPfjmnHQ*-^^wRCz7xlMszG$c_`&ChA^6h8{wF4A02L595WM6(9NEOP+-*2 zvBR6?X2S8hwg?IeIu(T`*_#Q+>Dpo_e9*=0{e=x?!YEy)Hyq z-2i>~`M#H#Fih80!X5ma@;#?kn+Zd8trG4GJ7QbCRm>HJ5LTaRt2%z{d-23xGvR36 zmep{VWRk(|&%_Z2>)IN)JO6$DJ|SU8>DpSjcjTUH+(hF47^G|K;J)|Fzid8DY3={9 z&Cmao;r|e$e-=^yd*YTjirvSGi246IEDa0A+%Yct9leDXpu5qP=nOO(4M5${ZfGau z1JVCWkyFTaWG#|S>_}&$iI~mLJda9_X@2d9Q5HHr+Sr;VV*G~Xu*<@`JNLi%N)yq4 z!wT4GQ1X+yLya^M?KiB1U4}TF-nM%vP1N-_R6^RKTh1cpQ<}*1H>`rRE&gZEC%V%_ zCcj}dq#f$n+YWA^iHv{48ptrE$8@dkKofQO4QnCm>uv{m*V8nS(QjA>&5I-NP7m!t z6LtO#>!FoR1QLaeqKP{FhAL>Y6!SqZGHIfYzhMJ(bh8C}mfWO?41Ys4w5`6m*MDXx zPh_BHOF+LNzWn6)j=lq*>JYlwutcRB!E{naReR#r|I#LA-Dq>%nCC%Uovvgzwyz=t) zj=F$7JYlAeRKtS9HzQ_D?7|by(2p(|$ZT`D<6L^M!Csti)Ni%diVG^EAXil`<; z^>RngL))Y|--78;q?RUtUA+jQb{%=u-aF-n%hA>2Y3a&>i z{t-wJmZ%$LH!A3Jpe~KOb~;OBNf8Zj2qOxdD_g@7Sx|%;!luJ%z181YB6EspguY`F z^EzD^P7|5^9u5kj{*@aJ-i4Vo5$`uFg8KYUqa#el(?s0guoxORpLB`!)2E3zzo7ye z`1Kb1n-PO1`!_6shNgWB)Q|VlM6BPi6m~o*sPIK(t@Hmh1b>NN$4l@t#2jD?z7U^| zhvPoD1I{AqfagRGD8LS5LTo9Pf{n#|u|60N(??&UP3SpPgw8@EQFoMyyhmz?dB8?u zXaC1$DT;4ikT5tVEh~oKd`7}QDJ;r`WTun zu@p^gGoT*4Z;BXDWS(p(if%JN1wL(Iu4Me9vJ_2dGoS(dPz|fKebLcUG``IMHTW_2 z&6m7MGc85q+6-uf=)Sb+r?R)wM9sI&5x?n_m}H`2N6el4Pj#*$zWf{q`UG>Ik} zLxRN!x~Az&K1~!!f(isZG9rxZ8Xsc60AdT(N!Vww+|=5dIbNGe$$60 z3Lrrhq9;+#BKA3q1RD_jame4qpXpD6YD8ZW(2Mw>p(NOdbQsjh^0tY{Pcz&U>TT^$ z3{t)tQl$55h0sJaL_>=8p7K0QL{LK%dMgH>F%ba`Dbf47e2j_6M?*^W54)~xz5hS1 zdHvsfd^^4fkHH~sgX>}Uu&dZXY!fycn}qpeP8gG@|L>tC=uu++zYv{5jQeh=8HyoK z5G8UN*@3J>W)Zt-Yom!<>fPY@3}Wzv9-qV`b}he06C3=74bbba0Vx}*kI=*&enU0% zTGy}Ju5UIpvHow^2*Kl5r*Ed-Vu|%yvuVpIS)!f+@1!Ts*1W4{iE)Z30-yYYZH_uU zWQj3~C6)Z7I5eo1{8f-G;aVSfSP(%s%(qw0K_0nRNXdy+Ef}ciq!y0an zWQi6~L>WW^_MN&Rt7eJjQ$#sLR;-y%?>&_znnw{8;K#hIy~d04SfaTUQ3<~F8dzhz z^&m?$ha!~VYvexx&R$1YqS+Kt1wP~Uw2_@QvP82eq8hv{t=PAUMtnv#Mbv=zd07Qr zONfDZCPmbOFZU{L_KB3SL|GJ32fnEc0w<1(Wr;E=q8_3{uPAWq0G4P5MW|qhtF#N# zJI`W?GAN<}nk4@lG3j5Tnn|Y!HSDzfJ5BtmA4`-*5sk2`+nEiObuQ+j<^|35buwWg zg8ciW&qYg7N}GwY2t4m!ZdMmQ-dvR2W_uzL>b<=%*<6&=rY2IN-O{k1=Ay(lHIW?s zzvZ7W7fo+d6KRqWK4+MvD51@RD+BM`_NJV7bu|}FYqNbhg7)y13C%@Q+td{Za_1&9 z-%>QC&D~dmCyze)4L`7}_4;2Twf;}W$KXS7C!9;? zf3%$|w$pZH&~>;?x2S@hTyalrR}Nhr&C=GrVsOPhv|R=4TY2m3UqUulY^&`mp=-#4 z#6{;ebH&}Yof5j-SYspdPUDJgv|SZ+zPvHt@_rasY_098q05^Q5tkAkbH!HLj;McE zjg|_^t+`^pwyTBxhW1Dq;bF=Zchh!tu>Y@qFHbi;;)*S`T|FF>8Jg4OO;4`aLffez zi1WLA#nqK7HrI9y(6?Vf|JRD|T(Oz9Q^O&`b3aYj3%O#Rwrhm`g9h$gcuP(bbAKoP zLdcolwd*o3HBHR<4T~V3rT=F8t#>pr`!_6x{PMM{wytrfiCMp)0`fg%$G#QZq=}io zVF~R1Kv5_zg>;-Om{oL$6P#iRrSJI^ZrF;f#WXSPH!Oz^o1Zq!;?>f` zU4O$0*ef|yS)12~CN}*ID`C&?347OG+)Wdk{Dw+sr#!i5yiq<)Z2TKmL3@i`Wycb8 zY2q%wVKwZPS~BeCeOH>;=r^o^jvKjiCi9AD;?BQeE$r+0%EPgCE=}C&H>`s$bI-7i z!-#|L_#4*4e)BI(a9HuA_4%Kc>;L8WDLfZniKpXHMDKURnb=S45vIh>Vmq)kSSB_B z8%k9E91KMtqm}3>RE91?6VVWK0Ln)Vke5gua)HPItBINa7zAO7TUMS8PR+>7n%aCL z8FatxHGFQOh$RlCh*IcjX8ytXqk<(4p@=d#$RQG(dZ}iKM^i*O9C-KaoS~{pmN=Lq zD&U}%_qX)Ey_6*$MG=+IYy2DgEB9zDaS%l)p{KXRP%$fnB@U#BD(Lxkl`m@BjU^sQ z5!KN9q<-&FqA@J-2#TnIuw<*vAn$CJcsNDWLcgWKg%yhLEO7uu)WM-(-tlSkrnAJu zD54(vPwP5xQra$-*qJ9lH^Om4XJ($6spg8Ew3BQh?7kyvYZrY*~!{ zTjI=tbF%#C;%p5q0$+A*|5V+xi7uY0p~c|)+}8zD2i4HUSsJPUU-z51OnotxF3!}@ z67X$S_273ba;V?g-6iNt23?${ zp%oD4xn`{KhIDbNhE_rY=Hk@Tr@GR`DH^JTrmF*Xe0HBi7bk0I6*LWBaB^3N!E|ww zhE_wG;h`N*AqIT@YlJP1(>6tj!LrPigo)KQ#fYJ)HA0veZKFU8h56eE zGfCT&ARWCfEh5ZBZBvSLeDSrpO|-TtLprTreuOX+v`snE*~7tyFypmN1!5#9Z$7qh z+NKiek}YWdoG5LhM2y`xH1BP!wy8o)D!wfu#?Ud8oLvZAOuLo~BP?0sNQx+eZgY$~ z2V5kE$_R=mh8{=$DqXubk0lPL2nFm{J}J3_G`MyBziH(A|I>)--v_tDO?B@6>5X+l zpP+^4PIM7E0Ue04k@rXyl83AzcJTk%_!2WcXQEGM&6tr8lhV8rQG7;BW;38{u*tThda$%pt7W;-D@aI8_@%%*@QzJ$?ENG*(Uoql`8O+CJZ z-cCpzoHEFVu21`mFQK&)QV)|V*B=npJ?BfhwiBX)8BdDQi+|-=N=%6m{Wd}x&?U$0 zjvnAkOxoFp8m1TfU9JCa&zBgt6VeE?R$e~ju``b;=|axkh0v-_@^M3>FH>Sf=0%Wq zW7|r{$QevYXEHB_>dllGl6fiQ zFL$oeSI09Y24r3a`I$W5pUbW=B^}7T9P(49HeKbcU`q7KyaL)t*Wa1G<{ML@N9L7~ zzvmkFfy-#)+e8tV9~}*2}y})DEQ~-;sxi5;=$LLe?X*bngJ5OPbF)8id9qr#7FY&l5SV>|Z{VE*Y$$ zHQ?yaGgck&O>~L3hSq{pAuEnIP2543cxh-IIJ5El-*9y>T{1{R>%qBD*SRwz%IOkM z4OM}Q@tniPc67RApoTVp%RYN%dmh8-k^vg31{Vcaju}-ypi4Y7v=QVt*kyiM!DC2T zO2UwAqOxjvL=z0R3Rp9iA#o?+B5-|vPJR802MkF+5-tWeqXQDAOg3Xk+(=jfZcO4d zEDfz-NL)#{1QceKbR5OcVMts^xD?b3HJ=gtbOb}%B@0$-pVo$=g;1+*D=*G}shQyA9>%cwF zzMdd)H$&2sgzLd0ryf}=6Z$YDJxEvup52<)I4~rEA+aUl2JmJ*I##vq8bi{Zgw^1k z*cI=8_5(v=L&A;V{l|}4Hp07^N}yHXeXo;M(Wq4AAkCm zFEMW?qzp!s^Hw$cOw?eMcUlIZrMYJgxu*Q=&hAvTf;?MKxD zQD)r6T`3)HB;(tUssj@1;8Tll+_RC4Yd@+U$Rr0#>OSPzNTS-0Qi1Je&K=z=e%VOI zwjb31c1_$07AFj{k&J0SN)7hxcHFim*Ud%}*?v?b*gMl?r%mW)jwGV_A<$6bhY%P; z*ybfO6e(w$ZX6oSk%Vh0B`7k@n9z?klOqY!QdOXM#PTyMJFenLLbX&iC>gLi=_AbH zNJ6w!4N#u1+Z}Oc4@WXuOVxs!?ICb)h6P6wtflHe?SeA@Zub2+l2KZ!9@O2ZzuA(Y z&yfUaDHTxL-Va}7qM?=G-~#jm zQ>ms)poS{JVgEfBAJGQUB|t-~z+uebRZLY->-E1e2!0PQ#t-7_@pL>4AAp-ahY|CB4vHX;iLw6-vJF{@r2X%+KP_{9X-mBn z+Pv67%d??xZ}m)^w)H7fij#Rccr#TwV9^o>O3bkc1h^z6HA z^RogYo+ML87D4YVo(9TySv<)M9a#(qUl?z`xo0v@lA$9N(EDnAl5z1zo+MpImcYS7 zm%Sf5o6VD?>Bv&(vvp(R@kgC_l2jd82H^zrwfhsAc#;$ySq_KvbM@|SKZYks){zy^ z=X10xvGF8HI$T%LaX6E8qzXn%4ee7dkaHw)I)~GMq&)aKn>d_Uopx#%e$+DPz=0#J_5W1r z{C_MCaR;1%{lFe#mDm|^6x6s(!MMflf3j?_v^RfDUFU16-G2^=Y3OVxmDhTJpyN&Okp=EWrR zNUGNU6gQtEwbW`+2TCG-#XdgQmm{^%QuUxrRk-4?btp$_uBB9ej zj3H%{a0N7W`d9CJngK(~BH>DCn)va<-Pzs@DU*bi;NyN|xphr2L&_lGDyZLoifNeN z4u+IY!qw2oMzwF*+(!&4jf86;E!4m~|LRnRv?~eMLKf4&+S6wgLuyLGb&$O%ib?;G z&XAgra6L40SNoT&Wiq73B&>qgk-V?(6HOS>E+pIld*s_s6JD6WkQ$M&8rsCK?wMzI zogwW^!i~_{BTEefzcQtr$a%aFd>HX$|1i1(Q`(Wti@^Km@0TTpon%T4$-EeRjJ}i* znLd*#H6U{Z_|UUFY}8aIrnCc@mw@N@25z;^B*tTXGA{*hd)s#oT-&R){*TkF|C5bJ z;a)f&$BDkLzz$&>una65^T5o|pXeQ;^52WDCg%RZs4L1vejyK#QsgKiK<2k|?@#l_ zmbSe3CNv>sYD`*cM)R_U?vYv2o8D*G(g3Qdg#!ouI=ZTUC|f#=YU-euYqk>z=+Bn= zQ%ybec{cFQ`5u3H88Q5k@u?}zYwcVaAHQx&mJv@1bYu}I^1gS!uIvm? z>Z2oz!ByYE^O6qj<4FhWNChZ-B7M3^BI8NDbz})B?HzIN;Bf<<)JsQ}0>!(OtAj2* z=1B+X$TCpY6&;5rqCBamjw}a?h<`tYHh$qr2kOWQaJA!&*}E_M@T3EDWF@%r&SaS1 zv1vT1hmIt&>AP{b>G795X@4C_%qg(5?{}=+!jrn|$ZAk}@9L?N<5zjoemb%Sl&=!b zU28d;Cw0@2wLlrJ|1s!X5l`x>BkMqQ_Vbf-H%NF=7ad8=F8Z!Yj~|Bdq|Q201sY1$ zS116VC+({v8^8@K`iDhdCh(+vbfg+I?cba~%i=pv>ZBtZ!Sy&}FzmnvjxtQaP-|DWkWSZgAU-H5b!JQ=KO{aaD>f-1jwmZTZMAf=cz?k{n$VV4Kx5ygBPomA zETq%g@+FWqOWN^~#W4%%)V6#nWH0`A;zcFq3M(B3#=A!BWd)d-RYEmwQ*37j9mGcL&r4dw91Z_KI?3$eR zfGrKDnqp|@;Tiuk>LptmMl}lPX!q_@-pG8mG?Z#epmP@o$>S|jwlsulN}-$I#N~GP z|6xlgzYm@!wMW9)(vehC1>F+k{L{DSv!x@brW*F+iQ>+_scL=yXDEW-#`E#L z#QZ-CACC{gd*NNN&)6-j5Ic-*!RBJISOC@+V-q#N1GEf1j&4S0prJ$!Ku6vYmH%;M zGctqN$^Rq)nNiD^n3|NDoSLF}(IYtf%F@d7a(@e1=eB$mIDJ!G)nVmy3t6YOd^I>R zVM5@)QKlBMj&1oGaJ;Uk%W9(m7Ba)Od@VRN?u_?}9R(ILgSLDfICJny_AunTg{(tc zz8;((FtGM!U(`aT-C%iv9Fi()koo0y~wi=~Z>eizS^$5v7nGyQ1Iak6T#MxfD?b z>3{Fqx@@%#OFD-l$|3EJMcRP-omtY^6j1>g<`$XG_j|CUvnZkxGIm@Qy2k%xNwX+RB)PP`|qA^{bBx z3u$6oz6ctop0qIbEN|}r-J0+JY3~2q@J09}+=r&R+2;3l6l{up-%*Co|KLDj2-aN2M@Kfoa0ltI#s4@kWi2a6ho&aSw62j`8n(drXZ|G%8LO>iSqP39 z;vx4QC@f^mwtNvd&hezl0=`(t7;X7taBB0>e_eJLTFB^ac?CGLpzr;@(|%aUXl?lt zaQ=9%e5uP=3t88;d?~o}ewy;sGjj`>XhN@uZw>{plvnyTZtDy}r+gV|L zX43|`Y>0-cVOCI2#m1+1=rX9GjWBc0&j4mE!jXZNX5w0AWrbGPmBWc?XBVsrILDC<&{7p};$5Th7b-_` zWFA_I`2O`a-vFM(Vf5EhN*HrI`}u-*#KF63spdCt&Y!gJ$Z(FVpOzwi4$NtRD~GB% zGB+(%1E&m6i0@+<%aOTisaiOFxm!Bx=01+hMN8Gelxfn0GK+2;nX{H6ej>v>HvEVu zR9`Knf?4m`UHc7Dab$h8R0EvZclfafnR7WZCoQFhvkG5s_`2f^N7h?QHNpjP0bSO; zW$u+ufK6;`se_G0S6#g5(dQt2L6vefosRN#_e^da9jURJV{_F@`9 z{*PMgXrhU-*<`9Iheqa;Ps#4k*|IpQseoM) zxBJZ=lgF0DQcWf7V!vX;PgN(jEQV^7&^Xb?;#cSfwrmpBRKYG`u`4U4xUgjtsiqp5 zH1*nLRYSCirkWbqb?cQy@2?a8oe5M^3+dir3+tS(vSs6`rVg^smHN?n=h(7wR8tRm zp|h*bnU=C;QB2iOw2EJBmz3t@DqLEYklZFE_LQlGEw1$?#m}r}0BTYKB*8f2WejPu9Z^6^>k+>bM zNA&v(m=Mdvf-y(T5PgZ(qUX?UMD3sSKdXM~Ay0`h{}du6`u(*3J^P0sY|o1HsiqXRE5L+=Oa~+UJg`c^~#Jw%nL%%0U4>eA@8a zDQtNcs;K~1gzM(pSv_UTji{y)T-}+lIOpgnw!AadD8V)6&rScX&t=OyQB4)NI=kRL zs&-(@J5o(GxQ6A2Z;L+2mK#z{4JbscitjBW+89txEhwrwS~*kCo-OY{HFZF-DgB&l z(j2y2pK9ts>808GXRYvH%k`*61^@&q+9E7VH1puL!4u=~&^ zqty#1TFK_O7oz}scip=)d}=o<*}V2*O2C1XAEKy<%dKQ{+lwg$2N&-_!y4SIWOLe! zDFcW73NEG5*jBRH?ZuRXBk`*~(EpiiC7ab=Oa(Z~_b7kIv9^+Bw--|hjyai*HBTRG zC7an^j1nAApA+)J+1E;z)m}^$IFbAya%=y~RGdLP}hGN@mOFWloFd`)9Y2%DI0Kt^)aMXLi51-N8}L`GfEVaCyq+sy@>K9Odjk2v>v48D?%R zduRPYcq7Qakbiu=$33>3NzK%S;Pj!x^UvP;i!EnRO%XVI`ZS})h|ZSNsiqiQn7`{K zeSa^uoJKVYa51#-#OrsSH5~UG0#oz{vVoE!q6!$_%W;JZt{Nrp_vkfe!mlS0nc)iyZwh|RWLMVZy;MG zcayvRhi26Mg zrk8BGJ~`$l@ADs;)x#+;^qhG97&p1oe`uzH3CE}NN<9X+$$S5YW(_bo^L$fGAL3Wy z_#c|7VPfH-o3as=ZgPkJ(5w-rIsL7Qj%GN@d;LKsC<=pl zta(1vQEvAK;liJ{*!)O=zkUwrjbfj?oxyj#&FBkrCqXwAtbS7h}e!7bs{Ba|q z6HR~K$8F^e7rD$p`+2W~DHc zVec~N#D(VmZ;6B>cqyKP$Ka0GC#(QlhmFB(urBB)^bT5zocXo5z^&TG*khR)ul#@7vG@E<2AGd8q}^A)Wj?3^2r)n3Og3uUI(K_)8%m* zS_Y9a-*wD|r|I%o4K0WI1qRFRSenu0F&bI{_1-T}60S<3%O`1QCBz>HH^JJUbooRL zRYC*99b1j3Orgu8HM9yE-rKujjHwe{K0!mPVdwj=qPrGer_0A{Xbm*o&~tfI)JwX2 zoQBpyhKo_fkEii;d6b6MLGI#(bIaGSrpw1_Xg%b=o%&$!gfhB(jE1V9?LlXW>=W^6 zks8_n9rQmm{Jp9dT^^yKYG|KU{_t7wCAvIZLmQ#v{ZzxVCJ8R`us`mhL|0oSJpM6i zgNr=$j~fvk&0My5)?x+TJFrz)8WxFpW44$PF)L_5FQL28 z)o2$)$X&VF%?OWiznZWpR41?tg8 z(M<<>uyc*5rVKO~^}{CL&}Zj%rkZk~76&afE4{$Z?L;*dK;<8Vzq-L==XRu;N>G2x z`h&>lBRkiSYLuYfB^^Xn_haW8P)!x6@pST99O%Q&?LalvplZRb#}C*lcCJ3v)PTl< z^R!bbLUyhm)zpI9zw#{h%t~VC;#5-y?pByJT>_cxT#Rb!!M%GwjRyFhXXm0+qXG}U zy2VRrec8DP)ii(y)=$RO%8J^G(gC6;nRk>sHQ^&!dPUaL)3K$c}M}C7(+X#o&y^2}Ng{3oQ8@ico;FuUGEG zcKyYY&!&hHP+%}^e$ibgmV6dPl!B`VtJ7bfUc{1TQ$!h1Z0|$!-^gUiXHrBtC_NFm zpZ3&>CC{RW3Q%TW#QCs(2uq$x5tX1MZmRjXurQW<21O`ANzS26_8~o%JcA;tKw*B- z?(KUwu;l3!Q4N$`i!7U%9xQnpMbv=m*9UzLqg`3@REnqt^_Bw->c$;p$x|qz4m6$} zz1}!)FH4?G5%u6!VPV6I=e=3-B#KahyB%ik?XtXyB~PS?2Jo-imMS|M8mhe~XF!ABqpcZE<6w7PyTmuw$46TZScL5!hhN4(p13Mem_yL{%U{ z=c6&GA8L^`aQ|!HjV%@2+&1o9n3U>S4sSdYcC(`l|k74vgmJ z_R@9@aKd0C=sNlUH`iXMMZ#q;n7wRW`sbyLTs{ex!@$|YZH%812iT2- zD`4Q>$g0=p2y98hl`zQ4Tl(YSP)4o=2`k~q;urpp?;K#{nv-x99Gd0O;!{U-i1e$mNhQ@!fCgYLoW=+B?s% zCeprd&rGPIqGTo}6d?h-qJjuwMG!<(ic%C*M8t~NE0$^Y-d5eUtYxM5 z63SXuU3p>7)^?BEgX|Fbdd9t419=CAFi6qL5*up?r)OKk^SoMf>XA zP60G@4_>C;?x~`E^o9zd>Cs8}%=%+0dWhao5i~R4X0Do)n@eC8Bv%$TU6q25pxwESyv@r{GDiUxW^YG`ZLu`7NF zeL4@lp=ziq-815AkhzNPuQyZ!+s^}j?=QSj(f#y>(2B-p!Gs->O)9#t-cTLvw0M1& z*G*0;=swzAZ8r2dH)Mh9H;A6XL=|i@CT#VnuWM!WbPb_~O^)wZFMZ%9qo-+zYG^*DX~v~FRWdqKL)1X& zkQ-j}uV>5XsT!gdO7E{9wP#0|jE>L{b&yK3+~&P)kDQ(&oVMj3GA;5y&jA5Kvz@5K4c^{l=E2qP>R4%w4=XA*V`~o>WSxe=Cn&tewOCGD_bf}if2bIll zR6E&pl+z(vssNOayE|x%yj)IC(o%(>#M+x5y4+Px2Wu%b1y8c9x~sY*rzdKuVo-7L zj#HmJCpkSqOO=4qZckr*8gg1r2WhENkheS8#~ynxr^jolGEiz+F(J&(MotH6sd7;6 z)aB)oX`STsI4xBHs@tdk%75MVcpm6x3M*HSg$wR>;%-ry`bJxWW}g8Gc*r{}HhA*cPc zR2_ILv59{^yN`+p_ypVw?}S@mpRhYvHg*78h0Q{n`u9aKtx&IH;2#+kGpmblcw9VM@>s-V*eMv9 z&>M+)6*!s8rC-}ITftD;P7O{b|1o&QuKfyz)OOY2%!vrQ?$y637^$|a0T&MQD|(bY zq8JP9{iwCybvcz{T59vU4!MyYGN#4%wmLQB--#D=zFGV0zz@E4IUF(;B zQpPmb5V^3|YsJgd?0qt(nTE)NeXU%t9xCr5W14D+eCSbl#u2|2BxB4pL;>_%J?8p_ z;w>_!iH0bI-j0c0nIBrn7*h>V1i_leQ+yU*l`$q7q8PfH1^!j?rK^lF)(|DIPv+2| zg=c(ajFE;Yg?-k2Jy5&aO2!y!h%)GYe<8OskdZM48loKbT@i238MToy5)DxSJ+|So zL3>}y7(zo-LYV9Oc;N^rV{i>o1-+IY->|gnP8ow~2sIpJbxzvv^=TQsKtohR-%InG z0HE2HOVh&=G(>{HjhQ zUKagzIrHu^8J(yh3c&02xux~bhso#!4N(X_IJ@=ln&%{=<26JP_=kS#?ltDRjE>U~ z#SovW3f~;S{&@b^%!d1aWJnSvArfDSt3)MfMtmUd62-)?#4chrkxYaWBZ%H;HP90O z2Y-N<;pgz(s2}*xQ^1tC8TJ;th2>!}%86U2T&mW%@VJLU5oZgFPvob6&2m zl`?%AXbITcpv=00- z>}RSTLP_!U9l{cE_Rlt}hl$$DgneR8^fl zJkdYIg6Z%R76EmDY4#Gz-hyfW6BdK&y`Ju)y9~8p+WmwjpnBejwb$=Fv0&Q%gr%UO zxLvSK1WLB~3Clo5zUjh)#yc$-ho7(?2UDr1!MmcR)9K}+Fkp*_pxA9KOve8 zoVGjZoxjw)>z}X=JV@b|b?m&GVyv`BsZxuYN)L*$)aGR^ zmU`Mzj6$22w|HU5P>fugSG2s;(nDzfHkg0I`TyyXNof5qC*BaH#35oC5k`0r*7yg! z52Oa1?m)ea=Q!;_Vd5!+FBBLY2Lc+eE-{2n; z8uIXl4@zDz!-k2ZW;>sG2{M(fLxp8eW$?D3CE##dhkE%UxT{ImbtKqcd& zFH;4Z{ZXGZ{qqndGeloT4O?0j4Sf-8tYil3%TzeT-%gs&7csF$G*TRgKd#C{ z;}GN7Kyv{T@H||>J(M!Af#v}wZIWAF|D!+d|3B@&x&QY_!kw^3D}cB7O*{wn23zqo zd^+xr_r=@d=GX`9HkOY@{_WUew7EuJa#nawt)YLytm#qV(f=-JFoTCyXH!YmK=>P| zpu&Y`lY$kgx6CYWldMF9b0F9l;(gtAKFJayoD1RNDJw0T%_Lb|g!7;`j@?XF7LY6^ z!uhaY)P-xyeN9Mafe52%_BpBbc7wSjlOn=sl5H2Z?a{y{Br{)xi{Jpoq8Kyg9?8rT z;bJ&^T*%VMx9IO-Nim^fUIAMT*wORd8j@l{#Jmz(I<2tkVsnCG zCW(0!wEUFhnCpO!f3TRVp>@@Ju*AIi&*%T$m1IlyOIAu^Bz_VXH2!}kZW5Q#yniV% zjTlOFBc%8{ycR!?X8f!0+4v-UFz$p~;Re_FK%Zog~{3sEs|?`+OA1I*4#7 zi2W8`yx6@v$=Zu>8HhXGbjMPB9?7aixE#bKwE43&wUK0%B3uDxx(v8l`1=ErwG-h= zFe~Kgz)v|3N!C_`t3YfE-^1>o#*l1l5mtlf^FyaQc{q@)jR;qRnK3D^pN*>`S!)rl z0SPr%zPR=xNY+Y(Yr&kU11>gy{|m`lif|oB8rywL#;qNe?DwnbHG0%+@Q^&rt+h6= zWaTbLl+WnTSR7Vzq+rPCw^mXH7OV&b17J)mUW9Goext4589a#+SM!sQG z2b)>4Ep%iFxC2LwopW!JC2OuDOToQeJqBk1wAto5vJ5;9X!2K!kO)h*nT{+6FKNGw zf`eZz*`_+O0=)BDM$V`xwq(t8WF`2Rw0gMl9CU1(=*TMYwcF!4!Eh<3bcH2rtRrin`H6@_XODlhWQ}xWEo|xH_Uc}KFQay-G#i0RlNeM?7fMkzSty)wZoE)12c_K9hB*a>flU>>X1y~T6>?&IjH)s z67oY=xu801m9RgbyRge{L=Bb=ubu+~KQsDlXM z$YUI_@_(-F6HCw5iTCYSkWW5Kfq3eZj|K#;^Q4QN5w2JTz!gqbj2I0FNvC$mWsT;ea8o5z8 zXMNhn1XQPQ68ei7n}qF0Z4&k&dXumZF`I-oAG=v-y)!rWMs?Qa5LDx~2(2rAi|{ED zwhTozaf{Fs&E6`s|2bRxqnfl;c*o={6IADBbwPDrmhgA7`B}ogrEIf8b-^}apHsI9 z+g!Na0M)eZ9Z+4gUFZwaw+o+r@s6gbF4@ru)ulUx_ONV+uvg1>wnTNsPGKK1cJ@Mb zS|gzR%>YC*si68f3=PgKFfLrpt^w(dXSB*;g9uyG$wf@DVLm+ z?2=@nb{i}iBy zU$OgGF?Jf;i7mmR^?fxccDS$#89jYgNThHFTiAY1c-ut;px9wzUI5$1t(fmL%9&z^ zig_V)`29R>k}w;keHW2<;j)~3tfMq*nwhR4(%^6>HU(|Q|tgSuYm2wju^Qn;w8m; zi+Lq z?7oj=`-*T5c=-DX+2`3uNw$v&=Yo4fI+^!8WJ9vOMHsCZzNWVHs!1nVcM;A9&(1kS zwkbSIvb{vO0KA>q#c6HDRg!fR;X?2(eU17B(UfFeMYssO54``z;`~LD?J2^=;KR~u z&8Nl|ldOvfmw+=nJvXAv#~Z!f>>71P9-WSvB~9K1IO z7<)Xzo@Bd=a0Ph3&Ec#0mk^TeCc>5A%ZA04ac+A^wyOwNLA=MQ_1*e~lB}Z$t0A#* zq1o&VOOov(!qw2o33Kbwd~w<;=-r|tJ@8t z`{Z@$pkjmdhKga^jlbA#p@yp1iF!jNu*1o9&$`6-Qn3^ChDu?#nDzT!|6-wHgY<^V zVAoI2X58@iSFz*uhRPwDcH6gS993+f-cSYXL7)EJs#hx&J5Fz?61sJi3{e^%QL$t7 zhN@t{_fwx4Sk$Z7F?vI4=t*R)wtjO%#RljNRl`9Y%`Zy_yQjKvmXk=W4h!@GhrGiXN`{`-kW#sB!O8aF+@`T=rH zbX}2g+JxWlA!n-Vij7})c6LI}MAwy=B&;g3K+ag#m6~D~6FMVjr0dE|hh6JSLf5MH ze!ZQo*|wPr?xD{e-H5J)sYVHut3#1B8`X%ef~lLEyiExSvSw#AqSbI= z?uOgjMqd3f{tweU|G$UCf_RSF{~jWZm`J!2GQ1uy#t-02@KC%TZi&6a%CRHZ3T#Tl zoxlE_-*fH0_cF5*A`(J`Uw>4W4A|vy2}-W5@C)bY*x2w{c2SXGVKc)2y&@TX^A@FF zIBOo*LCLkzm&t+Y7Fg4OK`7&(FOv%wn%H-6C8yGt$%o6R z>=U!@&Qx+reVGE75z>0Whk#v5&Q4#Z5N7^vkl{r7DLGqxnIgFQD6#sI#8%0*)|V-U ztGkvz`#A83lC#m5DS??2%g<)}G*NQa`ZA?(O_#uhLvD~t&PrdV46X?$+US<1Z%!BG+8k zTT6?)l`% zxglDr5So4-$DYr$l5>N#R1q{w%%1%8@LzInkd`WjW>0*l1e~gta|5+h2{bR+efVXs z%W`gjmMVp&Y(mfTmiJNA- zer=@D3CDy#n0rt3@>#L<|Ve2&x{YTyZMb7onQmE%{`=RTp!|4>)Til~(L)_2A zvsdj+igOq99B6QB>0*-!g%sCI%yXgfKe8pRZ)ZfP@s;<|`=B{WTGXZC!^N{Z_&=2fsoCw7nQ+h&UEB<5;pG1G0u z@#ZTiuA`V&Ls_5w)sgei`*slX8fatM_D%lUVHDS1%xj@dr<$ZG@wP(ycMz`s|IhQk z=1IaNzGwzuEioXT5|zYxVi#Hk#1lb;7txs@@qh5Y@j}%8x1;ty35U1?ZiGF=^07nM zD%AS@FwBaJMZJx2KzMX`azglw5Jx*dh>m0L0V^(quTffYF}k)4_Sx~}be>;~6&I~* z%b^RiXNR5RGb=7i*H%F1Io=`epIoiD8M?L-x;rvX_dkbOanp5e74&$?mnXg0X~j*` zwQA@c)I1`*9_>}6uC0bcg2xi?pPE>4Q*~_(^s{!cnmZ`eii^;-wb1YLm8_zu3M+1k zuC0Rs>toM#E5A)~-_Icl2#HPziBAyj!+HC``C}EuSiu|LcoExFl9cM$6J5`&1nX*mJ z4cAgR(DYQ)+5^5}a&DNG%7rF&b#rSxhReC3S}G5kOj$N@=dIWu=l}R)k~@+=Bzw^4 zKMl2hM>O`=|6kjFIz9vU$NQkx-xPa;M*rWiEm-1z&IPvRr3S8qK|tiJh{&Ih9I$IY z+HsU)2jlDso>8f`yoLTm&gAX$(KcG@Pvk~s=A%Rl{fWH94;dK6n}0vPk>T;tA!v;Y zK3F~fBiyzr#Wxr89Ed-Z7_BO9M)A$WJQos^>er;LJWKIS#T*^G%ubzOW_VG&nV9Fp z=A%C;V%yxM_$Fdr0Hwq4;+;R`P`s&_7ed*)!p!HPX%ufF=0#9}nWn&pO(@=2%!{F7 z%z)uthbL0Jk(if2%hP98j-nP)yrGzvLK_pS#7Sy3#T$ru8EieEXN{MCKE+GKyd2t% z9_jgIWBikq!# z^I)guZ~y$`*;*?uQP<|fj(&IlxcTI>6_=oE3t;z{GmG0Dg;rd=t}TRJ^O~2+Rp7DE>==ggu%;;p!uy0!%NEIEB7esAj^?LP>U+>rbx*^E~I zBT?%&BOVgh2##2QTK)i{8(~Qp;Lq_o{15yHz6DQ1Z9f3_z&qnIoWP!9YU~nr0Na4g z!GbjZ8ld36U#~naJSsfeQMmTdQ8+KU<<>=|eP{*mqU~y-Jo8o3hmV(~{P&As#>C8; zAzXfU^2vxV!xAi|ymJH1fv5i7do1K`mXvpDpt-$o^V*@RP7kpd2UtO0fN73$}oK97$@ab4YURp{26`l;DkUauWX>TFhA0Do9)xr zQr@nC*1^JqJ{)g%(vG(^=#FT3T)Z6&iJt!b#P)$9$-=LI_bi^Sz1a=7<6G;A6o3a` z>LPp=_psw_^h655BeQ^QqYGEr@z#1GMc~PLhN*MSu;Z=tM2f+)$${gpRvxh9E%ii7 zzzg$?2_vR$u;UeaBBkK@?im3#d$-&1ay^kU@UT*H@kPOWJHC~kNIAG?$p;KQ9c#zS z^h7GagQ$ei8?L@~Jf$a62_D~C{VM6mUOS%D6R85vp6q?~{=wKE>;F-W-T&huQHa+5 z8;Cim7w{k)2owAj>I1IghwzPP?jM1Vz{v2$zC~w(*^_HW!k-p9q(MC-Mh36CG_yexwMOgC|FCU$NZlO!6Z{xB|TN=^HLl zvm`%Uge$=tPv^h;D$p?*Cc;(V(?vYQzs#KEhl;QoN?y2}epVPp^1dQm4GkBB6qQx? zCwU(cu7PIW1Hz+k^(OftB3z4B9gohQNLWSkgGIOwHt#UrK7UxOf*+*aA7_JC|8#B@ z=j*QE2Wq<=g@POlX_&~`=Oqx$2r`qR4Z;8l|y3Y zKS2kg`YHI{+O7f`q{bedwc<|&@2>4Cp=tG4v%h`A6nrmjR|U;G|N5YOZ)*kbrtQ?Q z<+bU(PKFFp@UGgf8j_v-p1kCj3GKfXULZdICtfmM0wo>L8sI%~6U_q-5$lO$B7_)3 zbR}f?7qkW_(06{%|GxeQUo!steOCe_qe4SMXA8fqU_o*HN;*!H@iR3<4#eaeg4>M` zmGQ9}A{TsYdumta`HM0>MnmL*4{;ZgUtjo5#z$+2eDLvL!in5%gJgV^hA04^=Bry2 zJ3$#gLqimTZ`U8M8h)|4jGwL{iomz*=oe!K2g&$p8UnS`+ORZmY=MlA)DR`$qx*)9 zP1<&m@l!QKDfqBG@nW+c<79k5jtV~IM5)y_#MGb}<_bf#NYOn^b#qjZUJ_t|Lz;zgYVP3aXlAj>z;IqNQ)K+af UGIL2jNQ861qxNTw7CXNBKNf-8P5=M^ diff --git a/tests/gdpbarchart/gdpbarchart.pro b/tests/gdpbarchart/gdpbarchart.pro deleted file mode 100644 index 0dc534c..0000000 --- a/tests/gdpbarchart/gdpbarchart.pro +++ /dev/null @@ -1,20 +0,0 @@ -!include( ../tests.pri ) { - error( "Couldn't find the test.pri file!" ) -} - -QT+= sql -TARGET = gdpbarchart -SOURCES += main.cpp\ - widget.cpp -HEADERS += widget.h - -!mac { - FILE = $$PWD/gdpData - win32:{FILE = $$replace(FILE, "/","\\")} - DESTINATION = $$CHART_BUILD_BIN_DIR/test - win32:{DESTINATION = $$replace(DESTINATION, "/","\\")} - # TODO: QMAKE_POST_LINK does not work on mac; how to copy the data file? - QMAKE_POST_LINK += $$QMAKE_COPY $$FILE $$CHART_BUILD_BIN_DIR -} - -!system_build:mac: QMAKE_POST_LINK += "$$MAC_POST_LINK_PREFIX $$MAC_TESTS_BIN_DIR" diff --git a/tests/gdpbarchart/main.cpp b/tests/gdpbarchart/main.cpp deleted file mode 100644 index eabf99a..0000000 --- a/tests/gdpbarchart/main.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the Qt Commercial Charts Add-on. -** -** $QT_BEGIN_LICENSE$ -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include "widget.h" - -int main(int argc, char *argv[]) -{ - QApplication a(argc, argv); - Widget w; - w.show(); - - return a.exec(); -} diff --git a/tests/gdpbarchart/widget.cpp b/tests/gdpbarchart/widget.cpp deleted file mode 100644 index 2aae2de..0000000 --- a/tests/gdpbarchart/widget.cpp +++ /dev/null @@ -1,244 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the Qt Commercial Charts Add-on. -** -** $QT_BEGIN_LICENSE$ -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "widget.h" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -QTCOMMERCIALCHART_USE_NAMESPACE - -Widget::Widget(QWidget *parent) - : QWidget(parent) -{ - setGeometry(100, 100, 1000, 600); - - // right panel layout - barChartRadioButton = new QRadioButton(tr("Bar chart")); - barChartRadioButton->setChecked(true); - scatterChartRadioButton = new QRadioButton(tr("Scatter chart")); - scatterChartRadioButton->setChecked(false); - countrieslist = new QListWidget; - countrieslist->setSelectionMode(QAbstractItemView::MultiSelection); - - //list of years widget - yearslist = new QListWidget; - yearslist->setSelectionMode(QAbstractItemView::ExtendedSelection); - for (int i = 1990; i < 2011; i++) - yearslist->addItem(QString("%1").arg(i)); - - QPushButton* refreshButton = new QPushButton(tr("Refresh")); - connect(refreshButton, SIGNAL(clicked()), this, SLOT(refreshChart())); - - QPushButton* printButton = new QPushButton(tr("Print to pdf")); - connect(printButton, SIGNAL(clicked()), this, SLOT(printChart())); - - QVBoxLayout* rightPanelLayout = new QVBoxLayout; - rightPanelLayout->addWidget(barChartRadioButton); - rightPanelLayout->addWidget(scatterChartRadioButton); - rightPanelLayout->addWidget(countrieslist); - rightPanelLayout->addWidget(yearslist); - rightPanelLayout->addWidget(refreshButton); - rightPanelLayout->addWidget(printButton); - rightPanelLayout->setStretch(0, 1); - rightPanelLayout->setStretch(1, 0); - - QChart *chart = new QChart(); - chart->setTitle("GDP by country"); - chart->legend()->setVisible(true); - - // main layout - chartView = new QChartView(chart); - QGridLayout* mainLayout = new QGridLayout; - mainLayout->addWidget(chartView, 0, 0); - mainLayout->addLayout(rightPanelLayout, 0, 1); - mainLayout->setColumnStretch(0,1); - setLayout(mainLayout); - - // connect to the database - db = QSqlDatabase::addDatabase("QSQLITE"); - db.setDatabaseName("gdpData"); - if(!db.open()) - { - qDebug() << "could not open database. SQLite db file missing (?)"; - return; - } - - // get the list of all countires and regions. - QSqlQuery query; - query.exec("SELECT DISTINCT country FROM gdp2"); - - // add the countries to the country filter - while (query.next()) { - countrieslist->addItem(query.value(0).toString()); - } -} - -Widget::~Widget() -{ - // - db.close(); -} - -/*! - refreshes the chart -*/ -void Widget::refreshChart() -{ - chartView->chart()->removeAllSeries(); - - // selected countries items list is not sorted. copy the values to QStringlist and sort them. - QStringList selectedCountriesStrings; - QList selectedCountriesItems = countrieslist->selectedItems(); - for (int i = 0; i < selectedCountriesItems.size(); i++) - selectedCountriesStrings.append(selectedCountriesItems[i]->text()); - selectedCountriesStrings.sort(); - - QSqlQuery query; - // selected years items list is not sorted. copy the values to QList and sort them. - QList selectedYearsInts; - QList selectedYearsItems = yearslist->selectedItems(); - for (int i = 0; i < selectedYearsItems.size(); i++) - selectedYearsInts.append(selectedYearsItems[i]->text().toInt()); - qSort(selectedYearsInts.begin(), selectedYearsInts.end()); - - if (barChartRadioButton->isChecked()) - { - // use the sorted selected coutries list to initialize BarCategory - QStringList category; - for (int i = 0; i < selectedCountriesStrings.size(); i++) - category << selectedCountriesStrings[i]; - QBarSeries* series0 = new QBarSeries(); - chartView->chart()->axisX()->categories()->insert(category); - - // prepare the selected counries SQL query - QString countriesQuery = "country IN ("; - for (int i = 0; i < selectedCountriesStrings.size(); i++) - { - countriesQuery.append("'" + selectedCountriesStrings[i] + "'"); - if ( i < selectedCountriesStrings.size() - 1) - countriesQuery.append(","); - else - countriesQuery.append(")"); - } - - // perform a query for each selected year - for (int i = 0; i < selectedYearsInts.size(); i++) - { - query.exec("SELECT country,gdpvalue FROM gdp2 where year=" + QString("%1").arg(selectedYearsInts[i]) + " AND " + countriesQuery); - QBarSet* barSet = new QBarSet(QString::number(selectedYearsInts[i])); - - // while (query.next()) { - // qDebug() << query.value(0).toString() << " : " << query.value(1).toString(); - // } - query.first(); - - // the data for some of the coutries for some years might be missing. - // QBarChart needs bars to have same size - for (int k = 0; k < selectedCountriesStrings.size(); k++) - { - if (selectedCountriesStrings[k] == query.value(0).toString()) - { - *barSet << query.value(1).toReal(); - qDebug() << query.value(0).toString() << query.value(1).toReal() << " : " << QString("%1").arg(selectedYearsInts[i]); - query.next(); - } - else - { - // data missing, put 0 - *barSet << 0.0f; - qDebug() << "Putting 0 for the missing data" << " : " << QString("%1").arg(selectedYearsInts[i]); - } - } - series0->append(barSet); - } - // add the serie to the chart - chartView->chart()->addSeries(series0); - } - else if (scatterChartRadioButton->isChecked()) - { - QString yearsQuery = "year IN ("; - for (int i = 0; i < selectedYearsInts.size(); i++) - { - yearsQuery.append("'" + QString("%1").arg(selectedYearsInts[i]) + "'"); - if ( i < selectedYearsInts.size() - 1) - yearsQuery.append(","); - else - yearsQuery.append(")"); - } - - // perform a query for each selected country - for (int i = 0; i < selectedCountriesStrings.size(); i++) - { - query.exec("SELECT year,gdpvalue FROM gdp2 where country='" + selectedCountriesStrings[i] + "' AND " + yearsQuery); - query.first(); - - QScatterSeries* series = new QScatterSeries; - series->setName(selectedCountriesStrings[i]); - // the data for some of the coutries for some years might be missing. - for (int k = 0; k < selectedYearsInts.size(); k++) - { - if (selectedYearsInts[k] == query.value(0).toInt()) - { - *series << QPointF(query.value(0).toInt() , query.value(1).toReal()); - qDebug() << query.value(0).toString() << query.value(1).toReal() << " : " << QString("%1").arg(selectedYearsInts[k]); - query.next(); - } - else - { - // data missing, put 0 - *series << QPointF(selectedYearsInts[k] , 0.0f); - qDebug() << "Putting 0 for the missing data" << " : " << QString("%1").arg(selectedYearsInts[i]) << " " << query.value(0).toInt(); - } - } - // chartArea->axisX()->setRange(selectedYearsInts[selectedYearsInts.size() - 1] + 1, selectedYearsInts[0] - 1); - chartView->chart()->addSeries(series); - } - chartView->chart()->axisX()->setRange(selectedYearsInts[selectedYearsInts.size() - 1] - 1, selectedYearsInts[0] + 1); - } -} - -void Widget::printChart() -{ - QPrinter printer; - // QPrinter printer(QPrinter::HighResolution); - printer.setOutputFormat(QPrinter::PdfFormat); - printer.setOrientation(QPrinter::Landscape); - printer.setOutputFileName("print.pdf"); - - QPainter painter; - painter.begin(&printer); - chartView->render(&painter); -} diff --git a/tests/gdpbarchart/widget.h b/tests/gdpbarchart/widget.h deleted file mode 100644 index 61feb08..0000000 --- a/tests/gdpbarchart/widget.h +++ /dev/null @@ -1,54 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the Qt Commercial Charts Add-on. -** -** $QT_BEGIN_LICENSE$ -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef WIDGET_H -#define WIDGET_H - -#include -#include -#include - -QTCOMMERCIALCHART_USE_NAMESPACE - -class QListWidget; -class QRadioButton; - -class Widget : public QWidget -{ - Q_OBJECT - -public: - Widget(QWidget *parent = 0); - ~Widget(); - -public slots: - void refreshChart(); - void printChart(); - -private: - QChartView* chartView; - QListWidget* countrieslist; - QListWidget* yearslist; - QSqlDatabase db; - QRadioButton* barChartRadioButton; - QRadioButton* scatterChartRadioButton; -}; - -#endif // WIDGET_H diff --git a/tests/tablemodelchart/customtablemodel.cpp b/tests/tablemodelchart/customtablemodel.cpp deleted file mode 100644 index 2ae986e..0000000 --- a/tests/tablemodelchart/customtablemodel.cpp +++ /dev/null @@ -1,276 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the Qt Commercial Charts Add-on. -** -** $QT_BEGIN_LICENSE$ -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "customtablemodel.h" -#include -#include -#include -#include - -CustomTableModel::CustomTableModel(QObject *parent) : - QAbstractTableModel(parent) -{ - qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); - - m_columnCount = 7; - m_rowCount = 10; - - m_labels.append("Apples"); - m_labels.append("Oranges"); - m_labels.append("Pears"); - m_labels.append("Peaches"); - m_labels.append("Coconuts"); - m_labels.append("Bananas"); - m_labels.append("Kiwis"); - m_labels.append("Grapes"); - m_labels.append("Plums"); - - // m_data - for (int i = 0; i < m_rowCount; i++) - { - QVector* dataVec = new QVector(m_columnCount); - for (int k = 0; k < dataVec->size(); k++) - { - if (k%2 == 0) - dataVec->replace(k, i * 50 + qrand()%20); - else - dataVec->replace(k, qrand()%100); - } - m_data.append(dataVec); - // m_labels.append(QString("Row: %1").arg((i + 1))); - } -} - -int CustomTableModel::rowCount(const QModelIndex & parent) const -{ - Q_UNUSED(parent) - return m_data.count(); -} - -int CustomTableModel::columnCount(const QModelIndex & parent) const -{ - Q_UNUSED(parent) - return m_columnCount;// + 1; -} - -QVariant CustomTableModel::headerData (int section, Qt::Orientation orientation, int role ) const -{ - if (role != Qt::DisplayRole) - return QVariant(); - - if (orientation == Qt::Horizontal) - { - switch(section) - { - case 7: - return "Fruit"; - case 1: - return "Count"; - case 2: - return "Ordered"; - default: - if (section%2 == 0) - return "x"; - else - return "y"; - } - } - else - return QString("%1").arg(section /*+ 1*/); -} - -QVariant CustomTableModel::data(const QModelIndex & index, int role) const -{ - if (role == Qt::DisplayRole) - { - switch(index.column()) - { -// case 7: -// return m_labels[index.row()]; - default: - return m_data[index.row()]->at(index.column()); - break; - } - } - else if (role == Qt::EditRole) - { - switch(index.column()) - { -// case 7: -// return m_labels[index.row()]; - default: - return m_data[index.row()]->at(index.column()); - break; - } - } - else if (role == Qt::BackgroundRole) - { - QRect rect; - foreach(rect, m_mapping) - if(rect.contains(index.column(), index.row())) - return QColor(m_mapping.key(rect)); - - // cell not mapped return white color - return QColor(Qt::white); - } - return QVariant(); -} - -bool CustomTableModel::setData ( const QModelIndex & index, const QVariant & value, int role) -{ - if (index.isValid() && role == Qt::EditRole) - { - switch(index.column()) - { - case 7: - m_labels.replace(index.row(), value.toString()); - break; - default: - m_data[index.row()]->replace(index.column(), value.toDouble()); - break; - } - emit dataChanged(index, index); - return true; - } - return false; -} - -Qt::ItemFlags CustomTableModel::flags ( const QModelIndex & index ) const -{ - return QAbstractItemModel::flags(index) | Qt::ItemIsEditable; -} - -bool CustomTableModel::insertRows ( int row, int count, const QModelIndex & parent) -{ - Q_UNUSED(parent) - - if (row < 0) - row = 0; - beginInsertRows(QModelIndex(), row /*dataTable.count()*/, row + count - 1); - for (int i = row; i < row + count; i++) - { - // m_points.insert(row, QPointF(10,20)); - QVector* dataVec = new QVector(m_columnCount); - QVector* colorVec = new QVector(m_columnCount); - for (int k = 0; k < dataVec->size(); k++) - { - if (k%2 == 0) - // dataVec->replace(k, i * 50 + qrand()%20); - { - int difference = 0; - if (i < m_data.size()) - { - if (i - 1 >= 0) - { - if (row > 0) - difference = (int)((qAbs(m_data[i]->at(k) - m_data[row - 1]->at(k)))/count); - else - difference = (int)((qAbs(m_data[i]->at(k)/count))); - dataVec->replace(k, m_data[i - 1]->at(k) + qrand()%qMax(1, difference)); - } - else - dataVec->replace(k, qrand()%40 + 10); - } - else - { - if (i - 1 >= 0) - { - dataVec->replace(k, m_data[i - 1]->at(k) + qrand()%40 + 10); - } - else - { - dataVec->replace(k, qrand()%40 + 10); - } - } - } - else - dataVec->replace(k, qrand()%100); - colorVec->replace(k, QColor(Qt::white)); - } - m_data.insert(i, dataVec); - m_labels.insert(i,(QString("Row: %1").arg(i + 1))); - } - endInsertRows(); - return true; -} - -bool CustomTableModel::removeRows ( int row, int count, const QModelIndex & parent) -{ - if (row > this->rowCount() - 1) - return false; - if (row < 0) - row = 0; - if (row + count > rowCount()) - return false; - beginRemoveRows(parent, row, row + count - 1); - for (int i = row; i < row + count; i++) - { - QVector* item = m_data.at(row); - m_data.removeAt(row); - delete item; - m_labels.removeAt(row); - } - endRemoveRows(); - return true; -} - -bool CustomTableModel::insertColumns ( int column, int count, const QModelIndex & parent) -{ - if (column < 0) - column = 0; - beginInsertColumns(parent, column, column + count - 1); - m_columnCount += count; - for (int i = column; i < column + count; i++) - for (int k = 0; k < rowCount(); k++) - if (k - 1 >= 0) { - m_data[k]->insert(i, m_data[k - 1]->at(i) + qrand()%40 + 10); - } else { - m_data[k]->insert(i, qrand()%40); - } - endInsertColumns(); - return true; -} - -bool CustomTableModel::removeColumns ( int column, int count, const QModelIndex & parent) -{ - if (column > columnCount() - 1) - return false; - if (column < 0) - column = 0; - if (column + count > columnCount()) - return false; - beginRemoveColumns(parent, column, column + count -1); - m_columnCount -= count; - for (int i = column; i < column + count; i++) - for (int k = 0; k < rowCount(); k++) - m_data[k]->remove(column); - endRemoveColumns(); - return true; -} - -void CustomTableModel::addMapping(QString color, QRect area) -{ - m_mapping.insertMulti(color, area); -} - -void CustomTableModel::addMapping(QString color, int left, int top, int right, int bottom) -{ - addMapping(color, QRect(QPoint(left, top), QPoint(right, bottom))); -} diff --git a/tests/tablemodelchart/customtablemodel.h b/tests/tablemodelchart/customtablemodel.h deleted file mode 100644 index 18fdb6c..0000000 --- a/tests/tablemodelchart/customtablemodel.h +++ /dev/null @@ -1,66 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the Qt Commercial Charts Add-on. -** -** $QT_BEGIN_LICENSE$ -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef XYPOINTSMODEL_H -#define XYPOINTSMODEL_H - -#include -#include -#include -//#include -#include -#include - -class CustomTableModel : public QAbstractTableModel -{ - Q_OBJECT -public: - explicit CustomTableModel(QObject *parent = 0); - - int rowCount ( const QModelIndex & parent = QModelIndex() ) const; - int columnCount ( const QModelIndex & parent = QModelIndex() ) const; - QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole ); - Qt::ItemFlags flags ( const QModelIndex & index ) const; - bool insertRows ( int row, int count, const QModelIndex & parent = QModelIndex() ); - bool removeRows ( int row, int count, const QModelIndex & parent = QModelIndex() ); - bool insertColumns ( int column, int count, const QModelIndex & parent = QModelIndex() ); - bool removeColumns ( int column, int count, const QModelIndex & parent = QModelIndex() ); - - void addMapping(QString color, QRect area); - void addMapping(QString color, int left, int top, int right, int bottom); - void clearMapping() { m_mapping.clear(); } - - //signals: - - //public slots: -private: - QList * > m_data; - QHash m_mapping; - QList m_points; - QStringList m_labels; - int m_columnCount; - int m_rowCount; - - -}; - -#endif // XYPOINTSMODEL_H diff --git a/tests/tablemodelchart/main.cpp b/tests/tablemodelchart/main.cpp deleted file mode 100644 index 9b452ce..0000000 --- a/tests/tablemodelchart/main.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the Qt Commercial Charts Add-on. -** -** $QT_BEGIN_LICENSE$ -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include "tablewidget.h" - -int main(int argc, char *argv[]) -{ - QApplication a(argc, argv); - TableWidget w; - w.show(); - - return a.exec(); -} diff --git a/tests/tablemodelchart/tablemodelchart.pro b/tests/tablemodelchart/tablemodelchart.pro deleted file mode 100644 index 25432b8..0000000 --- a/tests/tablemodelchart/tablemodelchart.pro +++ /dev/null @@ -1,18 +0,0 @@ -!include( ../tests.pri ) { - error( "Couldn't find the test.pri file!" ) -} - -QT += core gui - -TARGET = tablemodelchart -TEMPLATE = app - - -SOURCES += main.cpp\ - tablewidget.cpp \ - customtablemodel.cpp - -HEADERS += tablewidget.h \ - customtablemodel.h - -!system_build:mac: QMAKE_POST_LINK += "$$MAC_POST_LINK_PREFIX $$MAC_TESTS_BIN_DIR" diff --git a/tests/tablemodelchart/tablewidget.cpp b/tests/tablemodelchart/tablewidget.cpp deleted file mode 100644 index fa4d9d7..0000000 --- a/tests/tablemodelchart/tablewidget.cpp +++ /dev/null @@ -1,611 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the Qt Commercial Charts Add-on. -** -** $QT_BEGIN_LICENSE$ -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "tablewidget.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "customtablemodel.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -TableWidget::TableWidget(QWidget *parent) - : QWidget(parent), - m_series(0), - m_mapper(0), - m_model(0), - m_pieMapper(0), - m_pieMapper2(0), - m_barSeries(0), - m_barMapper(0) - // specialPie(0) -{ - setGeometry(1900, 100, 1000, 600); - qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); - // create simple model for storing data - // user's table data model - m_model = new CustomTableModel; - m_tableView = new QTableView; - m_tableView->setModel(m_model); - // m_tableView->setMinimumHeight(300); - m_tableView->horizontalHeader()->setResizeMode(QHeaderView::Stretch); - m_tableView->verticalHeader()->setResizeMode(QHeaderView::Stretch); - - m_chart = new QChart; - m_chart->legend()->setVisible(true); - m_chart->setAnimationOptions(QChart::SeriesAnimations); - m_chartView = new QChartView(m_chart); - m_chartView->setRenderHint(QPainter::Antialiasing); - m_chartView->setMinimumSize(640, 480); - - // add, remove data buttons - QPushButton* addRowAboveButton = new QPushButton("Add row above"); - connect(addRowAboveButton, SIGNAL(clicked()), this, SLOT(addRowAbove())); - - QPushButton* addRowBelowButton = new QPushButton("Add row below"); - connect(addRowBelowButton, SIGNAL(clicked()), this, SLOT(addRowBelow())); - - QPushButton* removeRowButton = new QPushButton("Remove row"); - connect(removeRowButton, SIGNAL(clicked()), this, SLOT(removeRow())); - - QPushButton* addColumnRightButton = new QPushButton("Add column to the right"); - connect(addColumnRightButton, SIGNAL(clicked()), this, SLOT(addColumnRight())); - - QPushButton* removeColumnButton = new QPushButton("Remove column"); - connect(removeColumnButton, SIGNAL(clicked()), this, SLOT(removeColumn())); - - QPushButton* specialPieButton = new QPushButton("Add slices using series API"); - connect(specialPieButton, SIGNAL(clicked()), this, SLOT(testPie())); - - QPushButton* specialPieButton2 = new QPushButton("Remove slices using series API"); - connect(specialPieButton2, SIGNAL(clicked()), this, SLOT(testPie2())); - - QPushButton* specialPieButton3 = new QPushButton("Modify slices using series API"); - connect(specialPieButton3, SIGNAL(clicked()), this, SLOT(testPie3())); - - QPushButton* xyTestButton = new QPushButton("Append XY point"); - connect(xyTestButton, SIGNAL(clicked()), this, SLOT(testXY())); - - - QLabel *spinBoxLabel = new QLabel("Rows affected:"); - - // spin box for setting number of affected items (add, remove) - m_linesCountSpinBox = new QSpinBox; - m_linesCountSpinBox->setRange(1, 10); - m_linesCountSpinBox->setValue(1); - - // buttons layout - QVBoxLayout* buttonsLayout = new QVBoxLayout; - buttonsLayout->addWidget(spinBoxLabel); - buttonsLayout->addWidget(m_linesCountSpinBox); - // buttonsLayout->addWidget(addRowAboveButton); - buttonsLayout->addWidget(addRowBelowButton); - buttonsLayout->addWidget(removeRowButton); - // buttonsLayout->addWidget(addColumnRightButton); - // buttonsLayout->addWidget(removeColumnButton); - buttonsLayout->addWidget(specialPieButton); - buttonsLayout->addWidget(specialPieButton2); - buttonsLayout->addWidget(specialPieButton3); - buttonsLayout->addWidget(xyTestButton); - buttonsLayout->addStretch(); - - // chart type radio buttons - m_lineRadioButton = new QRadioButton("Line"); - m_splineRadioButton = new QRadioButton("Spline"); - m_scatterRadioButton = new QRadioButton("Scatter"); - m_pieRadioButton = new QRadioButton("Pie"); - m_areaRadioButton = new QRadioButton("Area"); - m_barRadioButton = new QRadioButton("Bar"); - - connect(m_lineRadioButton, SIGNAL(toggled(bool)), this, SLOT(updateChartType(bool))); - connect(m_splineRadioButton, SIGNAL(toggled(bool)), this, SLOT(updateChartType(bool))); - connect(m_scatterRadioButton, SIGNAL(toggled(bool)), this, SLOT(updateChartType(bool))); - connect(m_pieRadioButton, SIGNAL(toggled(bool)), this, SLOT(updateChartType(bool))); - connect(m_areaRadioButton, SIGNAL(toggled(bool)), this, SLOT(updateChartType(bool))); - connect(m_barRadioButton, SIGNAL(toggled(bool)), this, SLOT(updateChartType(bool))); - m_barRadioButton->setChecked(true); - - // radio buttons layout - QVBoxLayout* radioLayout = new QVBoxLayout; - radioLayout->addWidget(m_lineRadioButton); - radioLayout->addWidget(m_splineRadioButton); - radioLayout->addWidget(m_scatterRadioButton); - radioLayout->addWidget(m_pieRadioButton); - // radioLayout->addWidget(m_areaRadioButton); - radioLayout->addWidget(m_barRadioButton); - radioLayout->addStretch(); - - // create main layout - QGridLayout* mainLayout = new QGridLayout; - mainLayout->addLayout(buttonsLayout, 2, 0); - mainLayout->addLayout(radioLayout, 3, 0); - mainLayout->addWidget(m_tableView, 1, 0); - mainLayout->addWidget(m_chartView, 1, 1, 2, 1); - setLayout(mainLayout); - m_lineRadioButton->setFocus(); -} - -void TableWidget::addRowAbove() -{ - m_model->insertRows(m_tableView->currentIndex().row(), m_linesCountSpinBox->value()); - -} - -void TableWidget::addRowBelow() -{ - m_model->insertRows(m_tableView->currentIndex().row() + 1, m_linesCountSpinBox->value()); - -} - -void TableWidget::removeRow() -{ - m_model->removeRows(m_tableView->currentIndex().row(), qMin(m_model->rowCount() - m_tableView->currentIndex().row(), m_linesCountSpinBox->value())); -} - -void TableWidget::addColumnRight() -{ - m_model->insertColumns(m_tableView->currentIndex().column() + 1, m_linesCountSpinBox->value()); -} - -void TableWidget::removeColumn() -{ - m_model->removeColumns(m_tableView->currentIndex().column(), qMin(m_model->columnCount() - m_tableView->currentIndex().column(), m_linesCountSpinBox->value())); -} - -void TableWidget::updateChartType(bool toggle) -{ - // this if is needed, so that the function is only called once. - // For the radioButton that was enabled. - if (toggle) { - // specialPie = 0; - m_chart->removeAllSeries(); - m_series = 0; - // m_chart->axisX()->setNiceNumbersEnabled(false); - // m_chart->axisY()->setNiceNumbersEnabled(false); - if (m_mapper) { - m_mapper->deleteLater(); - m_mapper = 0; - } - - if (m_pieMapper) { - m_pieMapper->deleteLater(); - m_pieMapper = 0; - } - - if (m_pieMapper2) { - m_pieMapper2->deleteLater(); - m_pieMapper2 = 0; - } - - // if (m_series) { - // delete m_series; - // m_series = 0; - // } - - // renable axes of the chart (pie hides them) - // x axis - QAxis *axis = m_chart->axisX(); - axis->setAxisVisible(true); - axis->setGridLineVisible(true); - axis->setLabelsVisible(true); - - // y axis - axis = m_chart->axisY(); - axis->setAxisVisible(true); - axis->setGridLineVisible(true); - axis->setLabelsVisible(true); - - m_model->clearMapping(); - - QString seriesColorHex = "#000000"; - // QPen pen; - // pen.setWidth(2); - - if (m_lineRadioButton->isChecked()) - { -// m_chart->setAnimationOptions(QChart::NoAnimation); - - // series 1 - m_series = new QLineSeries; - -// m_mapper = new QHXYModelMapper; -// m_mapper->setModel(m_model); -// m_mapper->setSeries(m_series); -// m_mapper->setXRow(0); -// m_mapper->setYRow(1); -// m_mapper->setFirst(3); -// m_mapper->setCount(4); - - QAxisCategories* xCategories = m_chart->axisX()->categories(); - xCategories->insert(50, "Jeden"); - xCategories->insert(100, "Dwa"); - xCategories->insert(150, "Trzy"); - xCategories->insert(200, "Cztery"); - xCategories->insert(250, "Piec"); - xCategories->insert(300, "szesc"); - - m_mapper = new QVXYModelMapper; - m_mapper->setModel(m_model); - m_mapper->setSeries(m_series); - m_mapper->setXColumn(0); - m_mapper->setYColumn(1); - m_mapper->setFirst(3); -// m_mapper->setCount(4); - - // m_series->setModelMapping(0,1, Qt::Vertical); - // m_series->setModelMappingRange(3, 4); - m_chart->addSeries(m_series); - seriesColorHex = "#" + QString::number(m_series->pen().color().rgb(), 16).right(6).toUpper(); - m_model->addMapping(seriesColorHex, QRect(0, 3, 2, 4)); - - // // series 2 - // m_series = new QLineSeries; - // m_series->setModel(m_model); - - // mapper = new QXYModelMapper; - // mapper->setMapX(3); - // mapper->setMapY(4); - // // mapper->setFirst(3); - // // mapper->setCount(4); - // m_series->setModelMapper(mapper); - // // m_series->setModelMapping(2,3, Qt::Vertical); - // m_chart->addSeries(m_series); - // seriesColorHex = "#" + QString::number(m_series->pen().color().rgb(), 16).right(6).toUpper(); - // m_model->addMapping(seriesColorHex, QRect(3, 0, 2, 1000)); - - // // series 3 - // m_series = new QLineSeries; - // m_series->setModel(m_model); - - // mapper = new QXYModelMapper; - // mapper->setMapX(5); - // mapper->setMapY(6); - // mapper->setFirst(2); - // mapper->setCount(-1); - // m_series->setModelMapper(mapper); - // // m_series->setModelMapping(4,5, Qt::Vertical); - // // m_series->setModelMappingRange(2, -1); - // m_chart->addSeries(m_series); - // seriesColorHex = "#" + QString::number(m_series->pen().color().rgb(), 16).right(6).toUpper(); - // m_model->addMapping(seriesColorHex, QRect(5, 2, 2, 1000)); - } - else if (m_splineRadioButton->isChecked()) - { - m_chart->setAnimationOptions(QChart::NoAnimation); - - // series 1 - m_series = new QSplineSeries; - // m_series->setModel(m_model); - -// m_mapper = new QVXYModelMapper; -// m_mapper->setSeries(m_series); -// m_mapper->setModel(m_model); -// m_mapper->setXColumn(0); -// m_mapper->setYColumn(1); -// m_mapper->setFirst(0); -// m_mapper->setCount(-1); - - // m_series->setModelMapper(mapper); - - m_chart->addSeries(m_series); - seriesColorHex = "#" + QString::number(m_series->pen().color().rgb(), 16).right(6).toUpper(); - m_model->addMapping(seriesColorHex, QRect(0, 0, 2, 1000)); - - // // series 2 - // m_series = new QSplineSeries; - // m_series->setModel(m_model); - - // mapper = new QXYModelMapper; - // mapper->setMapX(2); - // mapper->setMapY(3); - // mapper->setFirst(2); - // mapper->setCount(4); - - // m_series->setModelMapper(mapper); - - // m_chart->addSeries(m_series); - // seriesColorHex = "#" + QString::number(m_series->pen().color().rgb(), 16).right(6).toUpper(); - // m_model->addMapping(seriesColorHex, QRect(2, 2, 2, 4)); - - // // series 3 - // m_series = new QSplineSeries; - // m_series->setModel(m_model); - - // mapper = new QXYModelMapper; - // mapper->setMapX(4); - // mapper->setMapY(5); - // mapper->setFirst(2); - // mapper->setCount(-1); - - // m_series->setModelMapper(mapper); - - // m_chart->addSeries(m_series); - // seriesColorHex = "#" + QString::number(m_series->pen().color().rgb(), 16).right(6).toUpper(); - // m_model->addMapping(seriesColorHex, QRect(4, 2, 2, 1000)); - } else if (m_scatterRadioButton->isChecked()) - { - m_chart->setAnimationOptions(QChart::NoAnimation); - - // series 1 - m_series = new QScatterSeries; - -// m_mapper = new QVXYModelMapper; -// m_mapper->setSeries(m_series); -// m_mapper->setModel(m_model); -// m_mapper->setXColumn(0); -// m_mapper->setYColumn(1); -// m_mapper->setFirst(0); -// m_mapper->setCount(-1); - - m_chart->addSeries(m_series); - seriesColorHex = "#" + QString::number(m_series->brush().color().rgb(), 16).right(6).toUpper(); - m_model->addMapping(seriesColorHex, QRect(0, 2, 2, 1000)); - - // // series 2 - // m_series = new QScatterSeries; - // m_series->setModel(m_model); - // m_series->setModelMapping(2,3, Qt::Vertical); - // // m_series->setModelMappingRange(1, 6); - // // series->setModelMapping(2,3, Qt::Horizontal); - // m_chart->addSeries(m_series); - - // seriesColorHex = "#" + QString::number(m_series->brush().color().rgb(), 16).right(6).toUpper(); - // m_model->addMapping(seriesColorHex, QRect(2, 1, 2, 6)); - - // // series 3 - // m_series = new QScatterSeries; - // m_series->setModel(m_model); - // m_series->setModelMapping(4,5, Qt::Vertical); - // // series->setModelMapping(4,5, Qt::Horizontal); - // m_chart->addSeries(m_series); - // seriesColorHex = "#" + QString::number(m_series->brush().color().rgb(), 16).right(6).toUpper(); - // m_model->addMapping(seriesColorHex, QRect(4, 0, 2, 1000)); - } else if (m_pieRadioButton->isChecked()) { - m_chart->setAnimationOptions(QChart::SeriesAnimations); - - // pie 1 - m_pieSeries = new QPieSeries; - - m_pieMapper = new QVPieModelMapper; - m_pieMapper->setValuesColumn(1); - m_pieMapper->setLabelsColumn(7); - m_pieMapper->setSeries(m_pieSeries); - m_pieMapper->setModel(m_model); - m_pieMapper->setFirst(2); - // m_pieMapper->setCount(5); - // pieSeries->setModelMapper(mapper); - - m_pieSeries->setLabelsVisible(true); - m_pieSeries->setPieSize(0.35); - m_pieSeries->setHorizontalPosition(0.25); - m_pieSeries->setVerticalPosition(0.35); - - m_chart->addSeries(m_pieSeries); - seriesColorHex = "#" + QString::number(m_pieSeries->slices().at(m_pieSeries->slices().count()/2)->brush().color().rgb(), 16).right(6).toUpper(); - m_model->addMapping(seriesColorHex, QRect(1, 2, 1, 50)); - - - // pieSeries->slices().at(0)->setValue(400); - // pieSeries->slices().at(0)->setLabel(QString("36")); - - // pie 2 - m_pieSeries2 = new QPieSeries; - - m_pieMapper2 = new QVPieModelMapper; - m_pieMapper2->setValuesColumn(0); - m_pieMapper2->setLabelsColumn(7); - m_pieMapper2->setModel(m_model); - m_pieMapper2->setSeries(m_pieSeries2); - m_pieMapper2->setFirst(2); - - m_pieSeries2->setLabelsVisible(true); - m_pieSeries2->setPieSize(0.35); - m_pieSeries2->setHorizontalPosition(0.75); - m_pieSeries2->setVerticalPosition(0.65); - m_chart->addSeries(m_pieSeries2); - seriesColorHex = "#" + QString::number(m_pieSeries2->slices().at(m_pieSeries2->slices().count()/2)->brush().color().rgb(), 16).right(6).toUpper(); - m_model->addMapping(seriesColorHex, QRect(0, 2, 1, 1000)); - - // // pie 3 - // pieSeries = new QPieSeries; - // pieSeries->setModel(m_model); - // pieSeries->setModelMapping(2,2, Qt::Vertical); - // pieSeries->setLabelsVisible(true); - // pieSeries->setPieSize(0.35); - // pieSeries->setHorizontalPosition(0.5); - // pieSeries->setVerticalPosition(0.75); - // m_chart->addSeries(pieSeries); - // seriesColorHex = "#" + QString::number(pieSeries->slices().at(pieSeries->slices().count()/2)->brush().color().rgb(), 16).right(6).toUpper(); - // m_model->addMapping(seriesColorHex, QRect(2, 0, 1, 1000)); - - // // special pie - // specialPie = new QPieSeries; - // specialPie->append(17, "1"); - // specialPie->append(45, "2"); - // specialPie->append(77, "3"); - // specialPie->append(37, "4"); - // specialPie->append(27, "5"); - // specialPie->append(47, "6"); - // specialPie->setPieSize(0.35); - // specialPie->setHorizontalPosition(0.8); - // specialPie->setVerticalPosition(0.75); - // specialPie->setLabelsVisible(true); - // m_chart->addSeries(specialPie); - } - // else if (m_areaRadioButton->isChecked()) - // { - // m_chart->setAnimationOptions(QChart::NoAnimation); - - // QLineSeries* upperLineSeries = new QLineSeries; - // upperLineSeries->setModel(m_model); - // upperLineSeries->setModelMapping(0, 1, Qt::Vertical); - // // upperLineSeries->setModelMappingRange(1, 5); - // QLineSeries* lowerLineSeries = new QLineSeries; - // lowerLineSeries->setModel(m_model); - // lowerLineSeries->setModelMapping(2, 3, Qt::Vertical); - // QAreaSeries* areaSeries = new QAreaSeries(upperLineSeries, lowerLineSeries); - // m_chart->addSeries(areaSeries); - // seriesColorHex = "#" + QString::number(areaSeries->brush().color().rgb(), 16).right(6).toUpper(); - // m_model->addMapping(seriesColorHex, QRect(0, 1, 2, 5)); - // m_model->addMapping(seriesColorHex, QRect(2, 0, 2, 1000)); - // } - else if (m_barRadioButton->isChecked()) - { -// m_chart->setAnimationOptions(QChart::SeriesAnimations); - m_chart->setAnimationOptions(QChart::NoAnimation); - - m_barSeries = new QGroupedBarSeries(); - -// QAxisCategories* xCategories = m_chart->axisX()->categories(); -// xCategories->insert(0, "Jeden"); -// xCategories->insert(1, "Dwa"); -// xCategories->insert(2, "Trzy"); -// xCategories->insert(3, "Cztery"); -// xCategories->insert(4, "Piec"); -// xCategories->insert(5, "szesc"); - - QStringList categories; - categories << "June" << "July" << "August" << "September" << "October" << "November"; - - m_chart->axisX()->categories()->insert(categories); - - int first = 3; - int count = 6; - m_barMapper = new QVBarModelMapper; - m_barMapper->setFirstBarSetColumn(2); - m_barMapper->setLastBarSetColumn(4); - m_barMapper->setFirst(first); - m_barMapper->setCount(count); - m_barMapper->setSeries(m_barSeries); - m_barMapper->setModel(m_model); -// barSeries->setModelMapper(mapper); - m_chart->addSeries(m_barSeries); - -// QStringList categories; -// categories << "June" << "July" << "August" << "September" << "October" << "November"; - -// m_chart->axisX()->categories()->insert(categories); - - QList barsets = m_barSeries->barSets(); - for (int i = 0; i < barsets.count(); i++) { - seriesColorHex = "#" + QString::number(barsets.at(i)->brush().color().rgb(), 16).right(6).toUpper(); - m_model->addMapping(seriesColorHex, QRect(2 + i, first, 1, barsets.at(i)->count())); - } - - - } - - - if (!m_barRadioButton->isChecked()) { -// m_chart->axisX()->setRange(0, 500); -// m_chart->axisY()->setRange(0, 220); - } - m_chart->legend()->setVisible(true); - - // repaint table view colors - m_tableView->repaint(); - m_tableView->setFocus(); - } -} - -void TableWidget::testPie() -{ - // m_pieMapper->setCount(-1); - QPieSlice *slice = new QPieSlice("Hehe", 145); - slice->setLabelVisible(); - m_pieSeries->append(slice); - - slice = new QPieSlice("Hoho", 34); - slice->setLabelVisible(); - m_pieSeries->append(slice); - // m_series->modelMapper()->setMapX(4); - // m_tableView->setColumnWidth(10, 250); - // if (specialPie) { - // specialPie->remove(specialPie->slices().at(2)); - // // specialPie->insert(4, new QPieSlice(45, "Hello"));//specialPie->slices.at(2)); - // specialPie->append(4, "heloo"); - // } -} - -void TableWidget::testPie2() -{ - QPieSlice *slice; - if (m_pieSeries->count() > 0) { - slice = m_pieSeries->slices().last(); - m_pieSeries->remove(slice); - } - - if (m_pieSeries->count() > 0) { - slice = m_pieSeries->slices().first(); - m_pieSeries->remove(slice); - } -} - -void TableWidget::testPie3() -{ - QPieSlice *slice; - if (m_pieSeries->count() > 0) { - slice = m_pieSeries->slices().last(); - slice->setLabel("Dalej"); - slice->setValue(222); - } - - if (m_pieSeries->count() > 0) { - slice = m_pieSeries->slices().first(); - slice->setLabel("Prawie"); - slice->setValue(111); - } -} - -void TableWidget::testXY() -{ - if (m_barMapper) - m_barMapper->setLastBarSetColumn(m_barMapper->lastBarSetColumn() + 1); - // if (m_series->type() != QAbstractSeries::SeriesTypeLine) { - // m_series->append(QPointF(150, 75)); - // } - -// if (m_series->count() > 0) { -// m_series->remove(m_series->points().last()); -// } -} - -TableWidget::~TableWidget() -{ - -} diff --git a/tests/tablemodelchart/tablewidget.h b/tests/tablemodelchart/tablewidget.h deleted file mode 100644 index 0a84bc3..0000000 --- a/tests/tablemodelchart/tablewidget.h +++ /dev/null @@ -1,90 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the Qt Commercial Charts Add-on. -** -** $QT_BEGIN_LICENSE$ -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef TABLEWIDGET_H -#define TABLEWIDGET_H - -#include -//#include -#include "qchartview.h" -//#include "qxyseries.h" -#include -#include -#include -#include -#include -#include - -class CustomTableModel; -class QTableView; -class QRadioButton; -class QSpinBox; - -QTCOMMERCIALCHART_USE_NAMESPACE - -class TableWidget : public QWidget -{ - Q_OBJECT - -public: - TableWidget(QWidget *parent = 0); - ~TableWidget(); - - - public slots: - void addRowAbove(); - void addRowBelow(); - void removeRow(); - void addColumnRight(); - void removeColumn(); - void updateChartType(bool toggle); - void testPie(); - void testPie2(); - void testPie3(); - - void testXY(); - - private: - QChartView* m_chartView; - QChart* m_chart; - QXYSeries* m_series; - QVXYModelMapper *m_mapper; - CustomTableModel* m_model; - QTableView* m_tableView; - - QRadioButton* m_lineRadioButton; - QRadioButton* m_splineRadioButton; - QRadioButton* m_scatterRadioButton; - QRadioButton* m_pieRadioButton; - QRadioButton* m_areaRadioButton; - QRadioButton* m_barRadioButton; - QSpinBox* m_linesCountSpinBox; - - QVPieModelMapper *m_pieMapper; - QPieSeries* m_pieSeries; - QVPieModelMapper *m_pieMapper2; - QPieSeries* m_pieSeries2; - - QGroupedBarSeries* m_barSeries; - QVBarModelMapper* m_barMapper; -// QPieSeries* specialPie; -}; - -#endif // TABLEWIDGET_H diff --git a/tests/tests.pro b/tests/tests.pro index 4277bfe..5405b59 100644 --- a/tests/tests.pro +++ b/tests/tests.pro @@ -7,6 +7,4 @@ SUBDIRS += \ auto \ chartwidgettest \ wavechart \ - gdpbarchart \ - tablemodelchart \ qmlchartproperties