From d0738dac0872a4349ee8644f2ed807eccd66fdc8 Mon Sep 17 00:00:00 2001 From: LongHairedHacker Date: Tue, 24 Jul 2018 00:24:35 +0200 Subject: [PATCH] Working SSTV prototype --- firmware/scripts/sstv_test.py | 120 ++++++++++++++++++++++++++++++++++ firmware/scripts/testcard.png | Bin 0 -> 32547 bytes 2 files changed, 120 insertions(+) create mode 100644 firmware/scripts/sstv_test.py create mode 100644 firmware/scripts/testcard.png diff --git a/firmware/scripts/sstv_test.py b/firmware/scripts/sstv_test.py new file mode 100644 index 0000000..dedf0dd --- /dev/null +++ b/firmware/scripts/sstv_test.py @@ -0,0 +1,120 @@ +#/usr/bin/env python3 +import numpy as np + + +from scipy.io import wavfile +from scipy.misc import imread +from matplotlib import pyplot as plt + + +WIDTH = 640 +HEIGHT = 496 + +OUTPUT_RATE = 48000 + +VIS_START_FREQ = 1900 +VIS_START_DUR = 300 +VIS_PAUSE = 10 +VIS_ONE_FREQ = 1100 +VIS_ZERO_FREQ = 1300 +VIS_BIT_DUR = 30 +# Code 97 + even parity, lsb first +VIS_BITS = [True, False, False, False, False, True, True, True] + +SYNC_FREQ = 1200 +SYNC_DUR = 20 + +PORCH_DUR = 2.080 + +PIXEL_DUR = 0.382 + +COLOR_LOW_FREQ = 1500 +COLOR_HIGH_FREG = 2300 + +phase_acc = 0 + + +def sine_gen(freq): + global phase_acc + phase_inc = (2 * np.pi / OUTPUT_RATE) * freq + phase_acc += phase_inc + if phase_acc > 2 * np.pi: + phase_acc = phase_acc - 2 * np.pi + + return np.sin(phase_acc) + + +samples_left = 0 +def make_tone(freq, duration, data): + global samples_left + samples = duration / 1000 * OUTPUT_RATE + samples_left + sample_count = int(samples) + samples_left = samples - sample_count + + for i in range(0, sample_count): + data += [sine_gen(freq)] + + + + +def make_vis(samples): + make_tone(VIS_START_FREQ, VIS_START_DUR, samples) + make_tone(SYNC_FREQ, VIS_PAUSE, samples) + make_tone(VIS_START_FREQ, VIS_START_DUR, samples) + + make_tone(SYNC_FREQ, VIS_BIT_DUR, samples) + for bit in VIS_BITS: + if bit: + make_tone(VIS_ONE_FREQ, VIS_BIT_DUR, samples) + else: + make_tone(VIS_ZERO_FREQ, VIS_BIT_DUR, samples) + + make_tone(SYNC_FREQ, VIS_BIT_DUR, samples) + + +def main(): + + image = imread('testcard.png', mode='YCbCr') + + samples = [] + + make_vis(samples) + + for y in range(0, int(HEIGHT/2)): + make_tone(SYNC_FREQ, SYNC_DUR, samples) + make_tone(COLOR_LOW_FREQ, PORCH_DUR, samples) + + for x in range(0, WIDTH): + lum = image[y*2, x, 0] / 255.0 + freq = COLOR_LOW_FREQ + lum * (COLOR_HIGH_FREG - COLOR_LOW_FREQ) + make_tone(freq, PIXEL_DUR, samples) + + for x in range(0, WIDTH): + cr0 = image[y*2, x, 2] / 255.0 + cr1 = image[y*2 + 1, x, 2] / 255.0 + cr = (cr0 + cr1) / 2 + freq = COLOR_LOW_FREQ + cr * (COLOR_HIGH_FREG - COLOR_LOW_FREQ) + make_tone(freq, PIXEL_DUR, samples) + + for x in range(0, WIDTH): + cb0 = image[y*2, x, 1] / 255.0 + cb1 = image[y*2 + 1, x, 1] / 255.0 + cb = (cb0 + cb1) / 2 + freq = COLOR_LOW_FREQ + cb * (COLOR_HIGH_FREG - COLOR_LOW_FREQ) + make_tone(freq, PIXEL_DUR, samples) + + for x in range(0, WIDTH): + lum = image[y*2 + 1, x, 0] / 255.0 + freq = COLOR_LOW_FREQ + lum * (COLOR_HIGH_FREG - COLOR_LOW_FREQ) + make_tone(freq, PIXEL_DUR, samples) + + + samples = np.array(samples) + + samples = samples * 0.75 * 32767 + samples = np.int16(samples) + + wavfile.write("output.wav", OUTPUT_RATE, samples) + +if __name__ == '__main__': + main() diff --git a/firmware/scripts/testcard.png b/firmware/scripts/testcard.png new file mode 100644 index 0000000000000000000000000000000000000000..a0cce5a0e9d82c38ee0266e26e0f771c091dbb5a GIT binary patch literal 32547 zcmb5W1yoi2_B9NMAV?!6Dbi8`(xsq;l!SnENr!-xq)3UBl;ja9NeStemKLNtM5Mdn zTj%jU@Bh2s`;Kpn*E{aufpgA2d;j+Otu@zNbM6ooB^g}oo7gBQD7bR6(yAyZXuc>Y zs9V=C;4l1`(?0M6!}zg`G|DCNe;@0zqv0=D4zk)#C@7q_k^e_^%am||KVmw|DL%xU z$0Wr;=ih0w^@l%EI6u^Kma@0CHM4U@k#aOMayB!ibG3A~pp%hPRMGUqBSS% z5S^&9ndPew+muXojDIc_uw97zMUFnvNI7ljI-Ys8A>_lJw7BcOx?V9;9!@J^hZ=q+ zpKZ4pa171;KTFIy6<#3HTTf_xp8os=@5OL}Fj-{;IR_ z`ClLEXx|-8)O$ADb)RLqyY1L9&z2zS`>(^(oWjDkb(e_~kt*Hr<70Q#oS4^~s-5ft zi?<_{MRre*JFFGmISArNzI=JlyMeZu zd+YT4YgyS7H8m+GC*IS;O=fbO@$uBySdw0ZMBmZTkxcnj!xt~2LPD^365hFdk{!F- zh<)FMHY2*1?-r$&t&|XxFR8V=sK5%+yJQN(CmRu&kJ&z}dDn)i9L7 z`b09k?O^I0Zl34mKBX}Cp0O`1Z)&@%pcCZVgR}PG&1ezt_Vt>l6CZCGM)k;r*XnbL zBka#ZCO4*PR{s2Xri?aaCjg7^=E1EA#IO)`XoUQ;iScpR6Q@(97+uEh?g_oUN{&^N z9y=o=Bke!)G&`3Zwc;KMr!Yl#{+3G%J~!t!HR1Ll$f8PYA#ju`A09>&-9t^r{gzZ? z$TzQWHvh7p>diCi9{TcY82-}qgu0w$`d{MfULF1z8>>n^Lq|i+g>5K2cIQ!vMIuv{ zr8f(!jg{5>fDEnPZBBEK~F?L|^K5mmZD2fce2^8L< zy(0Xb7xhNe_s35Y6B9q@PxU7vfc^yv4&=H_$`Jk}`v5 zc{(#6$CKZ@`K^Tgb<@Z9HiWDx=-kz4`1s%E@0s&+))Ifhx4fohnl9JzOtpf4;vN;= z?%tp>@ilaA9Fy}Y0Y=(`-DA(y&X+7V=G712IEh4@4Gs zh#8#Im0e*<^*0I%^xd_S{i#~MiNaLNJ%lodSJ$pPf+A9P6OFWL_4?~}eM5)+No38VfnlJ`gVUM*}s=% zkj)-^*8ObJq%@uNS_2Mi5YGn(X17G&ww=c)xKD$85mbTAxA7SJ3kbwMLBNSHdfmHs z@5oaek6O5;P_M?JN*6+)R{sl{`Ykj+l!*#^OuFdKB9nH!onujdfB)LU=~o$pmcM@e ziotn%=8X|OjTJrfW)+X)SL)$|>Vy(%G}5Rab1pTOHZ~bqS+EZ=@My(rFZPt>43>61 z>LAk^zI-63sY#Zj{?>KIE55T+4vzKV!v`&cw~wURk_x06OYaN*#5gxH=P%^N7V%g4 za?Y-^FMe>)5_Y=TKs(51X>XsMlVdr^W-hzJSq8Vu z^FwW2-63?Mu}|zAtDp&st8)ubW2F!zDT7vz&B|IULO04AKGtzAtLRLA5GTGu2FWa0@WpGB_HdFz z-M%HqIBGJ2X6_<(>-|=vY~j?2%-rGe_g%}{DTp<7CtY%KE#KIRWb06)Sr;!iTA^4f z@`j3tp*WF>C8hPs3D;BAoEzr7$wp>o568khKN)h%Dl6lAH(VB8T%<4soq5xKbgKS3 z@xDu^cYlzayl_7?s@6z8`OSGu3ln zGfmY9Tjqz~t>iT9bwM0oL9{1_XM%CC-1sJeTC*&C&$ z?edx9maqsOLEeY?j~a>t>#l36*>T0>lyRA&=6nx@^S}5#ix@E}PSJ z-WB>=D;C=9?CdNxQ8mI(v3)#>Plo7Ilz4e~zBM*B1_g$^^kR)IZ_$!nJkr>tzp~I< zm_VB6fk^B(xYDbUX<2xBd!EBq`gQ@sFZ#U;E3ySV4K&N?4Mu(1TTe|!4{BxY--X6p zYnV|6NFm~~Hro+(`%SY^&thze+24x4^4MTL#dX@q!XkKk`$cR@v~u;;C)fBx*1H;G zq!|hJ(^S7f%`7M=_*zj>>bj|KWo@mIDaH0}oadpk=r($V-PAm+t!|ZLKvWbV;1VzQbv82h<9gGphO72N(%ZKzW-zE*+p7qBkifFgAuxMO& zxx=lx9rDqLobTSff&P9;Q5th+=a`Ba?jLeM0YxFQwciw3QW8C4-7nEVq)TB zXE)~6A#VJQEh>5~bR>DKa!V;#{7s;5>s=@bYtwZ}QbBkFlaufImIp<=>0M>f(+5}# zj=qtR)6y>29ZoO&`I*<<)59uQa?Ji;B{X)Mz~S3?O z)m3ggK~71z5Z`dd$ji(7O!yK13f(Vnhp^AKAo`_G?0NR*P6=69Wpb8Gt5 zW^qxGL;FcH{X-LqNMt=k4`TC+JbW--pY2o5>`Sk6pN?R*{&ZuZ(eDae?3IR@FLU}) z#xGTA@WaBw08*5Aow`63X$Qaqr5rn4HiyX9ryDg0t6<{qzJ3He-zhDbk%mdd1j&L*$ng!_%2<2i7g`KN zX{Dvn@Y}TeGBsetj>*a7R1A4PGEa3ZY3Zj3e%Nfg$Qw62{D_XAp8-FL2#FgkEM|ET z$2d@$e<5$%!otEco<}X6=qj<28APev$jWnmdN?>b`dN;Kp0R@)=XDd^tAn*$L?I3r zXYLR{d5s-ypNVAW;9I^|NsX1;QX($)vR8iprX$DslY@{AajMdVy@YIHpxj=$az)tQ z%zrG3&F@AWN-j}wjOC6dTq<-HxvuBZ-?z?i10F!C9)K^@Pn0qaN|Z4_7VhXtFh?C(ZbNskOTD1u(7{B|9Eyw1C8|o+Glw> z)lYyhV1ee+f@tVzA{Gu$Np3`O0CahAv}N>Xbydjggb&aSQ+yXI_l{96x+=K_T9oPy z9E`CFd)f%G19Hd(iA#4%T93}XT{b4=Y;8HREFI^*U48oW=?!x2OnEwb5*H;(B<4k? zi@`xDL8@VC{3wp^>n_k1yZ_0_hTxckd|~3^@>J?ui5Y~9O~T?ANC81K9u{6k=7a+; z;r4AoXhMP$g!8$5`?fq5?N=&@z zy&Y=6&CUJs@b4$MkqGaF7VNl-)6L~U#04L8jW>5lqC{K+X^?xS&uha8fYG$irPuq; z475^`oWH@6d?Q3!(D^rkOgL3qdHK^$M6jo4gFQJPAK%tuv@#K1ko#ucAwVz{!}3H9 zRV--}Bh@I#1a806f`0$`^C>r19zHVpl1NKOr)wZx1}msJS==jeWySL9BerlatdFS2 zpF>u2>}v05Xo29!26ozPmW-7PiIgp>CqRfF4Ii z4ky;)t3zWQp2cazY(9H6re|6jK4t7^tolepgCq!#nw}^G>e4d@-L=YLl5x_Zd)_TV zD9?M)rXuiu)R(Mvi(?0JTjw?g8%~J$0-Y0gJs7Id({_vB;@C<(pR4sSRmIsZc_D_V z#5{(Iwe4y1e`;Ik0N4lqV(;*fS6sX|j8cGVwHx*sL>{HSp@*eqh|_X!aY@MoZt_LQ zY3dppw!dr6yd``tmVJ6h8ZKT^?>TC=+vTvoOO?+Qbo%wq#ClIV4pH4$%y4ahFR1DQ~E`aQ<_s9?gl#VrJ$O=VU z?|!u7=U<-ymkRZVXwwdEduE4Hl9uxF!fA>;B^%^Zgky)a8h795C+#YcWgyb6b&Dd? zck=@}LdN9u=NIqT!otGWM2+@dt2$?h%Uz$Nd9sEMpYt!5WgpSE=7MO4e~>zkbl%UA z%~U-*pScv9Ih{VFvXy~7*C%l)3UE%(=k4-PS>cC~DGLR!1)2SDUN!BLQz8Z;p`e4P zq+ZTwt(5q=D5KtFq2?byR9_G`+IucgK0NA=0m>r}f*~Q^sU^dU{$GUVIw(9SFd6=|ghzBGmi6{r%$F+BHv$ z&`2BYxYnH=#{nXNI!snG_k*!*lm;6F{9R z=M^F-#`g)MKI!P|XH`_hLtEbDj|tt~P~s<57kpCj7?klbEe$lnn&^h&;=9vchkC%n zAY0wH!J|yE^4qWrqdQFnJ&(9KI5_0d?(hsgfP4mN!`OUB005P}adomm>E4^0OP z#gM5ex^t`X3O+$Zdo23XPw#Wkf2ez7eGFjp3-%(LotrcAKAo81;p2Nl%{%r`T3ntp z-o(Kn(oM0k3{qRFRTSMmjsTc zJ)9cO2YK9>=R2+^dzO!6WXkeGf(292@$m7#%mlMx#W)(T5^UKJD3#s!8BGXVefO=G zZfKRd@vZCy^ijxKNI^-dw!=)%*i^y}AMae=B@axSo0T`znytaWok5G2l4|^iZ!+{b zX7t4{%u2H+y-EEnx?;nHGUF_|Aua6|qYu4miQMeyD0#!h{+D}Hx`ZM_zBXd);#W!$ zFS2mGoyu^RgwbuD8@4mF1g3--jFydK)LqfK=$u&@%#J+^k?mym%T`8U@KNbrq$uP3 z!v7W{bw}aNWMo0vKC_LOu(|)%FHZ88pE0~@@e=)?VPqvoH^3@Rd!O3Y?K0DwMWKg> zhZl~V{d90h;6b@0;HyXDG-vbcSHZk6k(6;~@}&=8@UdP!3w!sD<(N3CL=H{n(IcP< zDs?#vh*=mPLoH(^q%gvTqk8HV#%AhEJ|u-5oB_**iFJT>4HD>k41jkXGlogbn@3RE_Iu zV7V@ocE4?@Sjoj{&KLj(uqj@w{9r5@%YRKzZ^o6>;|RZ0_*j8X#ZjlS_czyuQ#}k! zOcDaZ94%l=&JHgxW{#sJj)`?SqN5P}H}E4!7=;%^azm!%1)SdpHa{ENPSf|+BZUJaBQiV* z>XOpZ8}rp;@CyTxQD3SUP@z{_vHoJDv1+K1rKP3G5i zfLp0;tUO(ykxI7&eVo~g)nN`~a)cxS!4dU}4^m&vW_=d~&fdn?{9l<5dq+fPj(c6- zjyFPQ1iYR(r>m>oj#9AhdUgoU*3xWu~GUCIH#*|zP%!wQPQ_>0o zfvCVdOid}idiCPqi8x~UWPcU8!gF(TpE%78wMi2c+J-3{p#|Ibux(hl$hcl@roHN8 zzV0()%UqNoVC?czA+`uNsfs$b8n<vfj~oBR=08cf8DrIU4uYKh>;rS$uH< zUSy?hFM+%gTHEE85MnA3m;BESbM6<%%eGyrJtySr$~0HAH}rARO=(gDf^v^_NBk!n z3UIlLc1XkPk}b$9_3}LMgw?v+>+x!>gTG zk~{e4E1?s&md-shFWR!QGUyMV?ageB#?op3ALy&Gr_@fOsC+nA;)|E*>abZKPCZtudvrtYo)Q?z7%d0@XeI_Fhn zVxX_jgy?hnGsHUWv06}5p8(T}dAPgKEsebwEg&hmOlml$EYz>F>hiXLfq}Kb>CFg< zi%Q$h!JQo*fL|BN-sh_Z6E3M zLt(cABNXbWG%<#0Q_C^%^G%SdTWq)SbGvsJeohQe<5EH%b4#1IqZ*e@*uHA*H8DAJ z=wa%(tc~yPfB|231^+^Bh*U<*TbnQX{m?g4(7G~l{tM77o=lWH{oYZS&7UO1ZZTqC zAZDqUsR~GJa$ha=RZc2IjjfM)M+tk$*qWYwb6sv;UQM>qW|*CnIHJOq5~{-bL{T~Q z_3PKm8Ikb(;JhgAHwPD2{FKmn(`NaC03;cSi|vR6fPh_2bmX(*%jxct zr5$S4kh?-I-gV*HKDkzWv$fjsrI8sk2*|w9#UeE z7JE@Zi`PJvS~U7qFY`|90ZS1`uj$bpKlabihXqtc-c> zxHA1e>%Rxmv0c)lqq%9lRhfW54e-MTR)kKI9PC#*`dm z&f!B`94T~*7luFH-FVWej>bBu3RO^b%(03pJw08w(xGWMzT%Mg(HG%a}QK&FwJ)*ENy4hhgO*E~V zIwI(vG0ReG5J0A`2V z3{x`_DF2vVaF^ z`(>yaw@m&2A}-Zw*hhndgHWvX$%qJ}cnrxgAbG+x3Q3n3HwTv9hNG|pbr4w+r@%x( zMK#od4{zIP!oCI71-nDcd;lVr8{T99`zA@i-tl?LQP$Ly!lh{dbCn#8H ze|QDWO-U@kA_sU6%m!e8Me!_byNv=B)nusB6e&V`+r_(z%`YY!FxdX;2-KCIgA(wj zzqW@!-^z#iK}M*B9EZF< zkZB;V4;!dEIAi_4#9M}^X{k07GcyHz5AwpWO%j=kwG;%7TvMnaij0t4V@!KbxEXK= z-;ksy0};@n&yr_I*W_0w!^N^5W_0K9S(tI}=qdQs1X#uI4 z<^g)g!NcQ$9Ap?Atj+?ndVuEM4F*jFln9iYkr9cNsejsPer$9%(eQQ3D00iMFiKt- zVwp%Dc%Pfx(9A3#AtC9=lhWs8dE4gE2M(MoXWo^Aru^6a`NZ=d zY<#e@e`B`b6<WleBHU zk{sj1^VGsZ#)}0XcIW3>sfme%Xnv)Vv0~J3>=UkF1|Iia9`}}(JQZxgKNhI%YO^*_ zLibOOkghZuWQ~7WQ&sIHa>r+1vpj{YLX_qtDN*)|y%a_zddAy06s3n*A1+JXi!5JH zzPAo(s=oiNklSuer+R*6;X5v z#zlsvY5m~Q(vNvjeS<=R9hc@KMHyyusfg@f->$NJEO*C{h_8$oq9%IP^*T>8Nn8H{ ze{{chV5g)h^Ks9jW5ARRWnfTT+)YOzVs7~?2{sOl;>2~TbxRi>FYWd0yG86>apw!} zNXFEfyDw(%aE)8wj56Dgcl6Ni&5~o( zM0wa+xo!FS%$>%2;zw>0xM%2Ybr!C7t7OBw@1IVGC78Y^bB~I5!)nf|nPGN&ec9;K z$Uf_KoPi#RKy4^m$DoN{GFE=B9OV>_zSXuqD2#93+gRnasvNgo$!gbQYSA-RIoZ}v zaJD`(?f!d~Gt>Pwq9}SqV!qRke?pRf!f=AAyQk^$#30WfGvMF>;$(>E=TBbGgVLVK z>U%mw=TF#4InvPkji0kU_Az)ZO~0(7JL&9_(DJ7iCjtlbRSBQ^W)Faznqm1vCVskB z`nA0L$N2d7FooB&3VS@lVjHq33om=9W+=@CGG7`p5@G!}^7&>IdVK6;%41KqlC)b9 z9kyc@drq2fCv|Xuz`vX@)wY${IPh5u9b}puUuGTl*TlqUx&DJhMO`df`&@07aA8q9 zrl;_Nbx6nFOwiRXH8s^EF8*=4#M?)Yvk~RK(jJl1bDHD`=jX%DPEyp{V(q~{nudmM zFe|4nX2$EY*`a;DH&f2kRidR;`R&J#oRY^l($c02@8twvT7`ftlc*AQ>$*x6~F*u1cuGbfBH7{PCx zu;<#%QFbq8-@ihusv0YK6VwKLFz5dvww*1T&4t2-#Xw)8p{T5rEFAlMre3t^<9x9a za;j0KE96-(w{yH3bLpu`NI3S{`DQPok5_2rcD$N!(a%v~bWzGTYPS8fF3%T)(~Eeo z?R#K4q>Ln`7usEG{_uobTDrV4fxS^Kq=8DE8fC_rdM;An+ z2Ed`Aez5$V7|@0lH1Ar2>-Y*mPO71?D@{*K9*B0EzT{`-AOiTGRW4K%}t_X2Mk#!j^oJVX|Y<8jDjRXhRuEiG$VAU^U;D4@oHTMnazm~aO-yusRV zqu=Lv$T#Ws&YrxCE-&ZC#Vy4SMoxr)l#;dN#t9uCXMEkX3dJ{ga$tY;eq5YY&X!77TQcn0`H;zHa8btLqqEO8vwfL zyENAW19N2=a&Nrjkc^dNOP)w!BucnVpfZI#S+~JK)L*~orPE8@M0NI3klX~4JCSAG zI#rXVm-3ZA3l8pRf1GJ(!Sdj7C~btfyEO)KNCapBZ>EKuG_4;yszb5of`l+iIi`zZ zvX;Wgj8U59YspJyeZ^SLGFU7z5gquxB<{uEy(nLw#On>89My{1oa|1oS ze^nJ5DVfyKc}{@?S`m-b`sD|}mBtwXM3$pAyO3>$lWoX>@+tqWB-01G+-Cu>)XT*}9X8Kjfb<>^Q) z%1+wpY5J1G9bl(LRte#Uh7y)&3+Qi>KErzii};Q<7kxfP#UjekK^}QgB}P@rO+)ID zt*rzDzezn1x_=kC_j9iN?5-jm;J@GyEZPw1pTqJf$eRG*FR5?oJ0Tv|!eQU;c&fIXR!Z;)Sh=K#oHVZ)c?CkHvd;<*hKH{r)pV(m$(Q zbZoAi`cll;1;eQI0DOGT=72e#r|tJk-iCCfXpwgJJRGgqPZePBAQFusk+)kL^`bvbh&do9{fMtNFrt=1Cp{IDu#W^*VI92mH=SHzzjG+WB zMzIH%3~hv9Lj9~`6*rE5c{xAKQ9^xg+i1>murvKK|4qGSZrPfk%BFEYdP6V8CNDhp zX~R8UDIXt+5a|~S^NyL@9y3>%UbepfE^ze>#cg$3ob+wL?=v3}p_9EQ7J+J-%G&~I z4Mxwmr>B$7Zy@H;nS+Ub)^TawsMV&~a^zf%H!1ZpZ(y2h^5+ z6gUH8FMPGu5B7ts9x9`(cRTBrV(mz5GV=0lbn88~<}FMVl$Kv@lxH9UW}8P`f3ot; z11!)x;2IZmlv~x<%*hZ-?$Ag?U-ie=Rl)6e&*&au5X1cCs4LE4HLf+nN3?lujZvYr z66*t=?we_Yb>m3@%RLiyEvvU%tZ*itzJ|sMd;ZY;ZjUyO6m@iP z@QoGmJNDcn*6({xNZw%^pYni$twadtwla5Ra9_M6F|eE&TI|<}uxLX=?|+*U(k;Z^ zG?C9Gk`-_fL;LD_%R&QfjL*&$5@m=H1LSztEa`8vzZ9cwCnhU(NyKgIGuZq_0g$sX zp?0fj+zT~g0J%47mgx^em-4rs(>-xo0y(CTY%N&@;YgzT_IQH|pD(_^iRp2gN6LO! zbkwKQ7^BpIlDSdJfi=VsDKGdGH&o>}DNWz|*SF~D%e9{EIIKRs*7bvjIJR+^*>`}% z&5eNci%{u{xfBAg;J37B{O``z#~MO~KRuLgAq@@9EA^wK%zjaGr_!X%cL?u;8(tvw zO^vRaTN-UrjaXbb_Zq)S<-H%e*QjK_gpXRItD;f%rYjQ*cC)b>BGsYzt9t97S)%|h zfnN!Jf1Fe{RT`fCpSydu%M9n5(l-z8RO(WIdV4Lhvrv9uys%C@ok@X>Ix2SgQ%j7>Q4JvdrIi#k&BnQio zheCz!JF?OWHAsZErz2OmM2M7B)U@>C`;_G0Dm>c7&5q{BP7}f83;Ft&ECami_dWI6 zCun|Y7;@2#?^KBRk0doN<<648#4jVmw3L$wi!0$BCE^R(Deb=pSyf!v?@h->euFmq z^S(})R>(Nc{;Q2>%DW^?5s$`gbYz*CL?}TGUex@OvAqlyuN^V2Avp? zJNDQ!Kpe?hpb^7j7KcsP&TZ!#lDk7F@~es47nRI6l}yG~ynylvd#^a6%ghp^C^%S< zDR#$Lo8;)9+Z9tam6tiohYq2VlzLk`Qt1_H#p@?oYp>8OB*m@fJ#r~G%Wu|9dvt?a#!xG!M zHpQ&e|6`zOv=OC_S-IpaP--NezC3ewwd?jRrR3jP>FEJ}es`5p*OqXD!sCt0GONe? z{H`EOE-$Dnrzlsg!-&?ho9LdFrlgDYgfp#x&*jRMt`h!aE>9b@qi@%_{>pfNudJjM zl!dkI;g~F+$T21-JY4ucw7zmS+?+7l2_@s&arF`C?7*1*;`uA#Q8<;m@A|~656Ss+ zLpdYv$7bg9PrA#sYGo3yQ`YNPdH$lH5p;Z$x;~MUki59BmhHgC-D(?pHRHO)RON_F0ET7J04t*zFaGh*QS$AQ&K2fMzWPrUgGK2=(_xyZeH(X|&RtjWSr zZ-2&hc0Sej5$o(pdbRDw&;Joz3ICXQ28iTQIG$&f>>V=7G9+tbwDC>-zgu3UrRZ%E ziueC*(>tT3TQbHDb5j^cMl0BTyh=)28BC!?N_mp{Njm+rZLzQV{jg)b$94j}O^q>1 zI!}Z2H7AVo1BK))zqTG@UR}MkHHva(;U2a!l+WNe+bE-Kb~tfhHP*qdtvB>4ViokF zCrRfR9E`3#{*?r33|qnf+O64YrLA+uqK5ykH-{|>X_b0{X3-u<5m^w_YHoPI+xxW%j5KMw=BP;&qj#~2 zjm+oCTnft5h-OfSkcI7ufob%A+Rr@Of8`L0D1YS;VS>aBZq$63ckC(10j(5=p#C+i z2&rNH$FKs8rXm`vnhQw~DI7~e{TPz)J7rOL^ZvuuX%_fR1t$6M&kQ*=e+*NS78=fY zV2oS_hQ1bGNw2S`shGg^omkJRuTRZJc#lUR-C=P(cA@PHw+OD~Upj$Atv^lbu=ZoY zLDcxCa!GFTmZjXHiq3LbMgo6&{74!J@8pJy)rPF>?4XdjC*HdYnja`BT^YRZar97~ z@7%pPF|V6SzEsoT8IT97Vdk2jAmP47{_5t!yYTRx?{^?%>Wj;P<4$$|Me!i5KTv$r zr6xq09^L;wOk+UF=8#`l1Yd09q5}pxf@?79#BBt_N~h^gYEa472(YqUjf;P6UzK$cU?+N8! zkAx0l^;&e&k+a#$gP9A;nahjA&=bmXJXB^eZW_Ok3|=f}6VozW43!ETW&MELN*r>7 z7%yeksCvktsA^(lxHPp~Ub&4IYtZF>i$upZ^cBqmvRgcx3OWyd&W58tnehHLj9w&s z74wl%wpz5LYMw2MgAReL)NtC|nWRS1HiXq)20`8(c*O##gb zmBP%~Zlt5_gPQeb)zb-;9Oe`w@?0!H7UA4D=?{n{uaw;VAaP9%kK+n47}4Iv`z8FB z3oXCa%uxIT(oo8R%FcBCOsf9~yD}@q@_`ifQ3NXW!4jeHo37mqr<$q%NihFT{e(5J zOqr!=bNi{6w|{341A-!!jA&O2(ZR@}=H8~l5#d8mc9qJFEAhevDe;;j$~{6rNy+n$ zRcw4n1ofa9=o9|wm&cysFzG0igdBRUVj`?>Ij?(w1u!O^9CY_<8Az9={4LacS)GqW z!7`gsv435W$n$}8*1vhU>b0l1b{d+9;=L>~!}^EpsfGq<$MFO2{|}aGa=faz^MqLb z&nzE|RyH>5#wP?w<8An1h9(BW26H<*JE@uCa&N=C!-Tpz*f6BYZ%C>ve`Lg;1f!X# zuBDFUUBuBV$Tr{)Fwcc~ePo)_^tIFx7@wyT)%YIkKDd0sh{ zGiA*fIqbdbkAOgg=?qT-&hgow>qRsXm<=-#T}xo-h*rujX16|Pv}%}X@EA-`itaSs zs7wKal?{K*g%F}I2<#1Dvz5;Tb>FJb$ntK%<+-!4B4_+*|J8|g7kE2Z&k&<+BI}!F z=hoyH`d?hnSsR~;h!=*@*80gYMZ+W>j2hkzK3=D|$b^FuslZgsejU-L`D3&0CUOwN zkf4B;r@SHtULuz-t**9+{MIJ!cl&*yJ%(X%g2MCj4>0rrVG(GWbJVT8F0)iw*}Lco zu1yx3Xi+kPcz#vc>V4wt&3MkrOC!C{3;YW{|h}x)wG%+Uok* zdEc40&TwyO%~*L^c>#62pQNEz(v;ny2jxikOK?^(MT4BcPcivW@|mhf zp7r~y?`Jld6BG(*^Q>RMmATbT?^};On;3pxUub*z?A35@URj@Kk(leajQ$rgI1*0+ z1LS2tpg8B9w9 zZI=w(=iG0!)dGy(fN=I-`Aj9&>~5cgeOCb3pa0H`v|q%;lw3bS*bKUjPwDCY2L~?WyV(&g=<@HQhRoSU*2hP|bm{#@x~p z3+8xyH#0#V4(}Hh7DmcvpyU8}+Ydd7x-A2e!T)%9V73Z70px3sA78I=Sw~(2viyP( zM34%UDZFr%a2DB0Df4?PgVO0wQa%2#()gUc0393BLX$0V&WbdS0mJ3F;e=QKbpu2Q z(yicqGKg>l*%0_0K>2m+X4p=<&sn<-%zQKrykcQK9!@3nZCT>dy}G)(^5rV&mxc@B zFLehuLAoG%w$%(%7=+p3#?-rrh}~VpWwOE9JQ;allSzbF+n}<9qM8~pr~&4FY8oto zRvI|hd#kqjIV$r8Z~xT-?6`aPJdAB~UHKjOQ& zWN@)$;I>*&akLZP(A|tL(S5wT?7rPf1}=%&F>?fDneF*dE*{W+Bh}p1H8sdvt0~Y|& z1j$u@L=SU!&;2|D#v9n%3$&LX6quT6&j)DlLVR7GH(bU`oDWLCjCV`5c)? zWI1t~=VXJyyYk@Dq=1PG$OU+1co1dA!Y z*d754a3Z!m>O{}?25T=bPHRDO>A7xgU;-L;-Q zyEN-}NR$xbiUtO>NcA^(68^cQE`tjmkhDZID?2WB5Yo6W5`wp-GPS#P;f46=Sl`YP zmrnwiTD|wuX}2ex`sVgMjv;tt>bC;8K+${*B2lm@Erl?r&LVF9i$m*Y00e6pg{?=fS@{l z4hk^_052Y^z?5()Dk`3x`dn^;MR)mh=2G0?@?^w)ImOkXW(xVqP4B~+vu)bTyWoY* z&(Gfi+slqW?U^qGXeda2w$C?x5K&QKbp{&w;veC*GpD+}h8VVYlm6psjTJZSpQzR2 z5`MrZl2D&N(*h47_*eWEN2g61lJk#4KwgkHw9P*8E7k9_%ZZxONost$W=1Rj`sAz&S*X7<7STJItG3ZB7C>n>Li@RMBT=o)Q zPVT#&C;n6nafk9(^e*TV-j5mT*-YrqVA-{ZY}NuReR&eK;y)G?wsq_YsvYo)c7_l$ zBb_H9(r8dB*kX;{+&;jw57JZ&AxceoM zK)pdv8VauS73ai&fU96w9*O9^9d!-t1n?LG$N3g4$Wp=W3xZU5?>iY>HzuK`f$m02 zSJxCIItonwgDX&*z&qSn?{$hqz(@m3X699JWb!AquDg`_TzW$}&<3?%fq*Z zad9PJ^;?ajz)YduGAXgOd<^z`Q2;;B8)a zaRPNPSn5G31TNAaD|}J1Z=mS@fa``&!}`E=*myBlRaVNvSAeh==>-K}g!o}qAIRML z78e=7n~(+1rvMRq|Kwyh9350{tM`D6Lgpvr03Ec-H|NLQNR!W}jPT)Q3 zYB;-&RQCQ}TQl|Ws5UlOQfF%oxK38-Fo%XL4ae|)ConN1a{%B$WM{RHVRIGl1t zYAT_Ih{D+-ZEVPZnV0~n^de}c08hbG9y&TOz#t!)0uTwQ6QOGfe7ywD5C)4V&oZN0hL@`1tcIZ{odI4HCg2Z<(MR*y*ZStKG=2w zS;2r?DgyaYgwL4?Fb;BpRR8$$z>xT>mCRrfbfftN1ux*(q@<*v?plUFGEm_;f$R(U zZqV~x?i*aTrbz`MWu3?h)dNDNnX_L4;2|-E_=d-1Ah89k2l77CLb z6MP|$oSb$~%!T8-K$6`K>Ly6`pfBA9v(65jSbm=>0!&trZ=oLC2e`(KgG||+@#$4n z31DEZzdYX@go5zBvih+KYT} z3+Q@5DutB10t|rQ!09UakeUk03Et82u=a&H@C<+;+6nd-+&egL2n%jF$g5W(d3kvd z%@VU=0@EL%`G@q3tX8o3o54~8_V{m0jxP?@w2=-Br0zXUg)UZp03ImwYO}5#TnC_M zeDi=(S!*=ctMSJVA|wWbj-WZ4nWO6yw60qD-wy_ztZ}A0B0JTeQ;>H#_InM{le&IU z&b4*FqSbbCw<>P#RPD;UUPbi`--3NC??aV4DH>%2??9h#1ZXZKBt&uDQ#EHOkg@|V z5@O;z&+h4pM4uDe{9OCV-lcdSdFt|^__7a&Xk^QrulWyllU(x8NZdP`jX50rbM$qywRHI4$-euL8J=?P zQu>AW?aiO*7pHT@qFtvaTY{fGJNlxV<@4@sJM4()Fwckz6WU1mOr(qy z;knZpNP8Qew*xjn)ug3OML-DF zw>*)FYj}^*FUFpuafjbm9*uQ1ezPg16guvSPVNm3%W~`6a(PTx3{UFgwR*SjU}bnx z;bHnoq69S;*JH#2&+oG7?~-{_7HvS0PUNVI36zE0$sY5=y)6r~hJYz3;We>g=ju4b0^ z{oQGDmpn|eIcTSCvZuU=KcNPYv#0ouVHcFlxk?&ga$SkuYYOnK2I zb|}^vK`hJuuqw6Cnaw$9@gnCxwm>UU;cd>d2>xf?ff+Q?CRNIg_7wk8@IE*=CS`D? zr6gak7CYd*B>xO3WHQ!djPUD&kq0&v5&hsc`cqC_9&L;Y4$v2+#d5>g$mqTfBd|j? ziIo@1a&)TeP*9>|r31iIVM`by4N#A*1uvT+lDc>EFb}xSC|g^UbMMOy@2J0ri9xh4 zfL9CdU8^w=9#M`j1gW&*%1+fjL$q{asL0WonUiDKRZxPsNMC<=SWa5{dxb#-J1BlP z>QSZT=#t>z>vOxuurSE8%*Y2ZG(4{-zCoVRuLF+|2LtrvO8Ng&+LuRD^~ddMqJfG`5!FdZNJ5b*LrMrCDno|MLlO-#av5{M@hVD>uVgb=c=cCcN}4Ab9XI4HCh<4 z`zk(`GI@^WQaiqbRxY85%nDIy5ZYe4j~?-H@^OWk$4a`)<4Y|CkeZPDzetNiPvOY1 zb~O+tt+#c#dE;*1VU|to{Y`(q@WTxaO>LH{KEZXC^RkDSh9|F8TZ%*G?ZB4VdiHRd z_Ys`56WzVl*%@lqh@ytkDfA#gsP5iQMo333Rg8~uG@3XXOa@^{G}_8m4rFaxfqNA^ zJwnXH40j#C{S?9TZosXjg|!$<)8Tg_)O~r*Te9WA-I2f*Htt3XTBkPUn^~)xJgm&d zuX?TeKGV08Vg2=Excy53sArsJd3iYi!9b%(VeENMpc!2G{Bs*$dBjKB#y)@XLRXmm zV*WW)aFF`i+uL&n_`<5mBXpT;&>2+r@BChR2q(IWIzL2YU!oR9bP)nu`zdy>p@3w zb4z=SZX?#ycP%kw1^@zP^sPCiUe*b3Y;&NxM_1g5mG3U_ zT9koU`|Q%^XsZUyLJ1qF&f7Zlaa3{^T@I^Nr;>JMd3qIW+9tr>R{rznTHwp%#(@k+ zx~?ldVL01XQ}1|aOF)5$MQv4A;4yQwOeC!l&fP7xD`Ru8K{LbNsA_`Pc>A`cb$7fL z=KkGw1y(hd1X1hK>V0Gl+ovvuwA=kUOK$edIL7yeVY??dkd}P|K(IFOjN=N^Z=kLa z57|lYl^-6oezz~*nR7YslvT>b4j-s*|h%k((*pN@+D3D^w;*7WL%qFL(@ z3|lk`g*l-<&0MeS$WXMDj}^C|`bzTZTjjoBq1Z$AOG}fTL-9&OVfON|>DJDajrvim zU7tIg)M+X7xwl$(D;A`wDVex!rBcY`bv4;`WB#W#S*kV~uRU{o2ivudvK_y!oXdZW zpnV=V9o7$GoX;tzO>kHDCh^@dt{QM-VWbDrM9FWzm!Cwc7hwt7%t&wVvf_uG`bueS zYTCzZI}7!|+fXPvL@;IoyhAKP_|r3@&HY&auy7T*@ZQynWyPCsP^LPY81hEcl62zf z*_k8y`&OS>NN8BzZ|`8L9U?B0zkBpct$MAqZ2sn{QP|PsFa5ub|7f36==fse?=R%YFuw%rT|Z~lbz0e0#~`L95TueQ)#`$=118M%tB`d3JeFGw!?j;97_c0>ysbhKzB?Ol z)v$aMA(0AC9@>_QW10G-Adki8MzVQ-fYCyZ`--`_QkpNcgXAp?o3g#_r+)84yncCi zweD45Pe5Jt4vtI3HMeNugbM0Gl1ZLh^Ed4Z)#K^~sSvg@mX@oL^D4n33a|t<%}jbD zE*ryO4K$nGbs1B<6^0u4#jVFIOq=Bx6a4<*LIDO3L*Q%hPE%wei1lX{m(Do*BO@4L z8$L=ZK(Pu6ZoAja6RIoZkM_h+&gzviXOsEvXx>Mb*5_jh`uOS78{ERr3yG6Bfc%Tm z61ZNmtwP@2ijNTmooyqb4h27GLm{M}=k_)>JGjC?(Caa3vjh(FVxA$q@;Dz$Y$qUI z{qS}$V%W6vx407d?r@nKvE!G6gy4cW99iDhj?#oweE&9`$9#9}Fn|DqAb2@ECHkM; zodaE{AT>@2tZ79CzJygY{)1H-o0{IDR+#lPQDtT(pT~#{99G_Z&C*(4vU4W$-Ko=M zIW`Hz05c$${trAIjL5n@kiYTp@E{?vS;Qmj-k0*h#5qwg*@VaR}%4a34R3e zy5!_UeBkCr3F+%o!Z3d@cXQKY>b53!LN8vQ%S&tDw6Fw{?;Sz<;qK4_0^$P2J4+CM zFjKU!un?-sysQRjaV5$(Qt{bhjW-OBP)1@nVBsViq+kKW^fms5(+>V6n0sfnIVb(u zSv7b1axqk}-xp>lz`qkOJc^(2eLQJxoi;@~>`+>K&-)=kH08PZY%*Z26cbbxsXcwo zCBw}i*)X*}ku~@6Gx=_Mgd$ivSX)~S;*x<*M*jWPQ%Rf;46>Gs2P$(N=UbO#$Hu(o zN);AM>n9F{&ljulJeM7mPWat>z5SBhLSgv)*vaL^9^SF9-q&?S5)As)U~$@yB0Ff!SU!{M?fuE#vwdd!{KjnyV9fIOXs6Qoi z&(PS|>f#?8Pq0p4TVPfN{FQ1Osg)M<;DH&8xG?b?TtSLB_I)Yf-Rq%AVmNmD_DT>- z82`gJBP5*@t;CouSW_^25!IF;yO6aRXw-``@vI@L7p$!blE`1l7hEntV~TE2MTIJc z6d%OJ0TYabERJK=9H>8Z&m`B;NHY{fYTx16{gK`u3*g))6+MkHCBVEIq2MJ33eM) z^JKhl-}5oi9#K$5$FMe7`b0l0iOnNF`bL`G6>?DG{0f@s(fS_7JqBz&f{a%o9ibS0$2WbZ7MnD>9MT}`k-u{Y_aMdfDS9W3!h#rM_aCm`{bkcuqFIC$59l{Y$jHVG$<_`cqMB`D9bv1!cc zU4hsE@f}WbSSTb>!oo*e@Spnr9sp9*7I4Y@r)#Y8FPnzxWI%i1Sh|wmDf=?^`3z6b z?_pg}5cmjt55@^|%5y67Lfh+Y*2&XTrK>!miJMNabG|-?toz z5!({*hq}0>`B?st?2e9((0;%Lt?&u=j025e01?$S8lNXF>Ri@rdP@@d9j~RAeZ$Ck zhDM{=+S}9S`m<^#UmyjwU456y6j`I!C(0FWMd`nC(BMXB#mS?uW|x=m{2qBPe4XWo zhRe(*(_Pu6VYA-}TTn|OJ&u}eP>2|!-+$mhIaKRBe}=TlWU}TB-*_znt+Y#v%Jwwk zmN%yyqZlUZ3CX!nReyCsQHB)<2jfV)tDaK7u#_bKEY|#g z+IMN*W45KsPiwaGhA!)9PDd?`eC3iG=#n??zh&B=wp`cqi{LxYiMF1yZhzF<#d|R7 zw`}fVL> z;;_dk$Z$moE-SB+Yg1~wJX&VH#_iz`5PJDrJ+ZvZzH9v_YHQuXxkqK(Tg79{{Rh82 zo`0$;JSs{XwlNx8`RH8D&qeZzqy0jSZn-T2GabrEfXzx`Qn)#MeSL#7$}sNuw;;$a zC&V-Df{pK`Tq>O*0Pfd7WV^3xN}Zpw2mNi)Kd zU*3CP|8#va+539Ssds08IoD52*I(l*-lniCAtU_7hU?=idbD`L9cgIH5S)iy?dh-sp!~>u)%|+6MqPx0+I z;%ZA>0Nu7SkO;^?2x4T;`tlnbTuZ#Q>*H6x7^9y~ppzS}vZu?C-KMG3sOLZE;msIZ zbIl#u5muT%en8HvRKQi}*@GWyrBP(oK*4+Rtt=2;1vTl~O*B<}e~A^$<%iLC1R@5noN ziq{X775D(<;z=rt%qrMBv-y^{Ag@1QBgbCtg1WGuE*R8~-Zl*dC&YvT+JjwaI zoxqV2Ad?)BG0=3eT@=KD^TG9rIB?A6nmauAH(;qsK&14=K&l)g^FMTQ{J(0ac!mE3Pf449yq%K-K*A2)6=nyV9iuk z6X6xQg%>ZhDqyzL@@RKLKY04~k{f3adR3jmD;~Z7>XKz$&rA3~j*n++?Zu36j4t^t zPzhl&b-#wZBQ6DyUWcV>6q)MKm7hD1<%3ySn91S@0{{RRf=+2G%|QL2Nif1~k{XT4 z=>MQ=Bo1l8;NY`h9M&4_ZS0gYzpvH+hBxBa3laPYH|3_LyD#>mj9>vNK>!Z`95#y+ zg6mYizpPXVI09d4bkC632`v2v`wb}MJEAqZGF{u;&(qQIS`*I*U{iS%gWE6vRfiMC zUWjf#$3BxLdNq~gn}9K}Vw7ofFsS$}{_mC0f-xTKz=_^37nkl46%`>g7k-s7YzJa^ zal(~)_g|vb(u0?KD?QK?VW^m&Fa2pC2WOKV2Bzs1(Y?zwZH;-5?M4&|thjb2xWM>W zG(OEPDx8+@&FF}#uVlVjgu)A6m1xlj1q4<}fkh+?a;h}@ zJSt75ONX`%9sEaFRCG`;3uEkTA*%AT-?yN5{X}y4{c+HY;2JuhPokjZNMKm_OlqwO z3A~HcK(t!m>;x>Lf5%l9Lkxem)HT$EjP%5!z}qD_Xbbb6C^wn9=JeCBGhe{Fi|I@_>^*)rcqRA=T01 zzWQhPAe)@qB^;*Dzo&6Gy20lF?N-zfBD8Lf5LJRpYlOmLvcAmyS@iVbxVrI8@U#LF zwNNfC#j2OUg6tBqs8dHl1))71uNFvfxFRf{aPq**O&HI|Q8xE7Uq%z_S#SXm3S8rM z7nwL$RDN?gB$R!F;>dlgyliQ49_Eo<(IZLQx0!X)7>W!V-mWf}5WMH0o+7l)No)tZ zN5i!1)5wvU#pxej%i00Hhf1f5#~cS%(XU)V^zY7IKiqg?g0X!oU$JhC;60!EL~GN7 znqLho6i(*1?G9KPk_!#bymQG~NQOO=&CGe)R*7N&iyttNd{J!$`{5*yoBo8FS|zpq z-Bx{9&itI5x6`G|i%bU{i4kI`fgZ|S4n}D~82d6QM4#vMgze^_1Mj8RW}IgPx^=p~ z+C8lqTV5KQ$j!VFrY)!!HHI3BxI0lk0q;|XFaFz%6Mi?oAn3s`Z&at}zBRM?jZSLn zRJMdEll9^MWFD==qeT)DMpsn^sZNQ>$|^wu5WO$A&lAo=)ZZ&iy%#S7GQ-cmT;qb^ zqMJ`{L{KnmR#Wur&>W?w<9V1ueObFSeOb5Re6;ei^6v0UgDj@W`Iq-SvDxqkQ>@_U zr;f^rYeqrc^;c{qneUg8+IsFqQe}r?TFdr~GcEVid+ReCX@KB_btkTFZb|}7$B*E_ z8Wfwm%^Hz~s}#)6e=8N5u`?FFu&mJ6c>P)O)Ey(n{Xc7NXy^&9<7@bqD9KCW3P9!8 z={cbZ#YaYl9GzFzrO(e4#+z1!#C|4wVYd*04&_d9KR7~L*eak_`H4OBLs3=!l31y} z_j~tiLKy^%fduW@AI zEoaf6U7YR$bCrdiYV5F&G|tFSkJw8HdxBe^|KQdUIlkkt+fJL^zD-gzDoQ*;*aGGi zX(w~TsH)1Nth#d$o#BsGc6RFb_4PG~j$e4BV)8I|4jgC4F_Y&Cr!ZKSAsCLYg`&a( z9`*R2XS3>c)|ooWYpV;;NN#*paQC5BA5*=S)RRnnH~=- z=pR)abVAS1WuJ;^Q`|Wws4j`zgZ?#b~(x`lbpc8zM#lueOTaqd(pH zOZa1Cb@F;$p0V|Z`geLVePgq$D*qpd&{)H3&T5W72*n%fe2`XlD^-(I^Ma5D37r(0 z|3d|(cHbWQcY7 z?8Km~l=LO(M$z8*`}?rNp#HM6UGht1r!1UeKl9P}r;A8s-k zObLNa=O*rJrNMGC(rNBaunuOX-=a1r)(b5J$Qxjmg!PiVyx9}JBj7*u@7RH03_HaV zD60t#Q(s-2o4dPRgbg!!9n}$bI#qRX2al)d3LR^9ANZTbsv6NJvU5~qChtMgJm9Sl ziZw2kZ}U~&6y0^@ViH>fNrkr^X`iVXBeV}!@^GEA<3XZ9DuZf;%t^{l-{{1_!C?dw z*!{_N$mGxZejI{U4QR)8Vdf$Pc5cbSq(XC=6x>+;W*&I{{D5TN1$VeOx_0YnB2`3PFpKbjbAUO10LCk{f9LdXShia|#u*(gcC9z8f-?%aZc_mFmi0_Y?R`vPMXncH;gy5K+r`yz8Q zGewVuQ57U>GT~bWLn9T4T~3@hp}qmYt#JXIYy-UfV98==WTc~$EQDizRXuzkv-Io=o~e#4nC%T&>Qy%m>iuA z?PG4Z3~1$68NiBaNVA)KDy@lliIg`kav$CXCWp;R?ccScs$-dOtFF-|zOZef7=B)m zld@U$m!?Zbtp3)-EpnK=t_Wlh)sZkEQ+jd-Crh@O$SW!;>RhnxJL%4X@46icN(wIm zmjIcEeGn&{87JT#NT_^pT901L(ol?K&&KB>3^4MxbE1SMENj_A*drX#aD!_ic4YLm zw)imwAt@vI-M+`#WDNyeP<3F5E8YcFQ6;^>EfJQ@jEsy=XK5MuyovTBYW(XK3eC-X{U{Vt)_{psN$9Eb{Izp&Gbo*P`N{-Q28CDEYvv^xii`AHYcS zap2vQ**Lg=LD9DcH54hKK3y<7gIZvE32M5oj!z7Xt5>2+D8{I+vti;M@43D4Yy zUV?npj+%dPato${Ak~YHzjrlUxCT@|WBKPML$EENrLM@{rj3*==iQT?^&ZPF?hNy4 zP>}QDF8@4ZF>*%rv36NrTX&~4>#fe@#7r1woWd(KAdfx87E<(-!<2gcV#5El}cT)FqKzo94*=`#u)o%Ki9Rn z$GXxl0-m%zPILGSx(?zlwwf=JqoryAlv#@GOuLo%0luj1bSc65?w2JYMY;{I>UUmU zV+rPtBRAf?V>dcmSTQ?s>i5*(7EEWGv0mYRW%OkKwv{D}If*>BG5;u8Xq;TWnX)_m zW|COY(eUnx=1cHh*K|yv+MUhQrx{;;Q?mb)QrCdWZrc6H`V)}sfGjz?wCzLojkOMO zwZpPKt@PFUHjaG%!G35Y^j8k6_V-7jA~tYX6#Cy(hk`=sZj0&*Y1RGSio#Q+hvEm; z*YSSdb|@>R^%qDs1&^@;AIXh8pK_0uw$Rc0>}A`gJnXgQiZ+wkY*F3JOd*?4){!Th z&AgU`ou-|8rVko)P@N_$8o0KG(@JXVGxlHErObco`N!+u|8fi_3GJW9>9Zcv`m1vp zyArs}+?>#(bjUdQv+&lLfhHxf@EcLcF~qEzhF+f>2F}qwz;kNy+=S)3#b+z)?IUYO&f5+0B_+)p8qKbqc`B55Id1C-;b%8`lJZKV zVitJl1H7x=YM^*zVVcZwFFyJ_RP6!LJ+if`DF3L56i9dYH z$Z)MWt>AcKz@|0N1fk2ZUlE`3^lIUS%SN%RXyrDtMz#ws$#__hlFu>MM)jQ(MDWQBLBWcv6 za`0T(!+K6Axan@Tl+W?)3q?HierSbu=zJdXd(~+@dsnHf;dwXkJ`w8YCPoKsZ zz4Iz|7q~ZDUHr9n*RINA{NLn~F?4@7x-?c1_NE#{%auBdee!UIR1 zEeh`3Nbb7%{l3t|0`E{K=liEcOx;{=wTcd}#3whzPQTkR{)2z>r-2>H$_$1^K@BZ^ zmD%rnRNaQ|R5_W`;ZYjwM~}h|T;~0k*p}%i0Z)_l`weAQykslTY9I4?v(bc}f530U zyqSbv%v^4Z@|!d(v+va{E$tc_65m{k-bC!W>M&35|7IW3#BgMMe&Z}lz{R`2E*{*n zMP7Y(JV&H})+V3-LRmzN3*BQJpWVpCB_CdSpl;^M!*ipz6tyat+bFVEWHTw&^~*c& z+hg2e`H5bvj*$vFhgF$<>lg)`JVI5z3CQJbZxUau0g2zLfgM=2=iJF8v z$BJraX7~c0NN>8DT8!41)QRIevbU7Zqz=64m3jT$a=TOBapm&sug*2v)G0>9zb^Z7 zX4ioO#os52Q83aqx;>$-=xqaiF~I~qjAf;G^#zfmM`ezuElNnd5Arns^OO9&oU1m-mH) z#4~R4=t`Ju9587k{hP5z;~d3|OsF$Il9Jx`)bX(}t@hjA?UMYlIh8~!du+%Usm^oW z{2N*<`^T?_zbBo=+Qm6QGej!XlOH>8o*3gMqj=-SUJ;Sg7xM%5GiGoL>WWfF&O2tr zQz%<%>m+dkdbcz0_U=%|8 zc~;fPt-vwsi9z>usi`c&!YX^%d4xh8`qQ8=`=h2JNj@`l6FbNuaBscN>H9k(UTGeZ z4Q!O&z^b<+LT&gq2&oe%Iy5xgva>d0rnjS5mmHpiO{oga+mNgDrcXLUn(H6Kq zZBo&*wQ}I0$}N5p9lgKOf&6yf(N4Ltao0N<@6xl6S>Z?l%=mk(5UIz<`)zF=B<9ar z6m>FhyKTg#W@kX*w7#4hR$VQ6;XQhkJ`MN@i&78BKiUzO>*jY$j{};6+t`%6&1++m8;>}3 z$S8_^K4xLTaQSk=X2#ApV%dUcwA=-@(59l)dCbnAS7>ZxO4i*e>7^Twfd5B;M>^@S z`hGNNI&+i54)()}%H?V^ixv<1ZgL%IlMFK@>#0f6-qh9}>FXadGTDfu{a`{iz%~UB z87O;V7YNw>NR;eX<4vJ1JaOSjOng`a4?lStC6U<%=28kOQa*o=aT~k~gzYNx3>rpZ+y}@|0i> zMsPmN%w)HWZy^^b=ZH^9*NKL7*$(dH7=B(AGGWMGC%S=gl}AjnxCKl8v9b(Jh9Di(~|%xG}BT%A}K-PA-$cQm6RlAiaH53R|4 zx3Iw5J_=oc$6Eh@{h@3cmze7qTV$ei_uO=xH#Bj=bnW)pqJ;eX&Gz;(6?=29D;mo| zeKWPCZI?%KV&y}J6xcQCkLSS3hmPSO)c_D^oi%GzvpA$85IB*jY; zhZ=tHr5e2+D)ujbayZDtx{<@`@+4hKWRzt#rpDx0L$q9_({yE2?6i%z@nEk1Q#GfP z=A-IWyw&ASoebTkHU|NZvC+yA(T`sW7&1NB?%S`cDe$k6^d7S@Obhnl+#+UpHYB2Y zo0+3X?clTf4Gq94TI##~%ykajAcbF0e6cEZi7sHT+xl1Eea`V5p5l5Px&f}oFO=qQ z&(VJ#`n1O^Lg1hue+B7zhV;x#k00HYVwky3ef!1w^V(@!n^%6eeUy=HR5>O~{a4Sv zRf=)#XWWz$iKm*~c>dyAb??L4S`{PX+|iL!>N4BdugY*goY-7K|LeW5y5{GV{TCl! z?U(eCx^uBSOi=F!zgTk#wu--o3nn~6INTNDJDHD zr=GI>PHcGoV3e?S!!|Nk{1d@@gISK-sg7o`rjPSyX-%yH58~td<|b=2G)2-iNZg~h zFYKJzekWaNP3ueC!J0^bo`682Wo# zRkbIwn$v7cm{#LQvA}Yjw_@tk&Vn&I%7y_Vc9hSG6vJDNajYR5FI*@%&da=k9l;PlC?Qa&$WH|aL22i z*_yY^kWYvCK|+yod&`)1Pak^lNK5QM)J!vdrBO14vaWRbw5dk9pt(_!3Te9q=cWXw zJ?5P0!$pO6G#zLgJl(Id(cCGoKCALK20JbfcEMk-u~9R@E>&kP;FxN-6O@B{2oCC3 z&yRUB-zIF$qiSd6X+kl(h0}vvW_~EYyxHw)Mb2CfRP64&>>u#8V!+|8gy-FJds#gj zKVLTh$gItm&Z?0OvEjTsI7I1iVocyjOJ{BzNV3e-7SynyrTZL_>3H4Vex#*kq0}He zW%u@&(3CazRi8xzLpe5VSf*|4S$f~(d~(~FqBHbIlVk6x^ON=N=nb}JvhA-Uy?n{^ zs$=>BT~fo*5ApNjnwr-i1czQa-{%;~khV@l_@n2d%m<|>o|=!(YrDwA$hwF27RV&l zg*`kxZx#DxT1-;%gZ~ESC=IPHXE#mptz&ZoXTieVdeP168?d~(@aFLyqg|_IJT9!V ziGH2Ca#YW1uz!6!w_o6JQ{TrULRJ~ed6iqrdTdFXk9DtOtNw>noAy%p40~f(m{r0^ zp6|mN)dq=Q|B$XIO;>)yc2#+h&^i}LDzxb7`NxylVDInv4;*7*PeL)~@}*noX1dZr zx`JR7bELwv4HDJYWHFuKz|3&BUHkb*_muB_U+n|)iqsn8;Lao&GalFZDK zKKL6ckr2tMsQmq(K(4(}KZJ}qtffs~qd)9iGRyB=JZYf1eg>+cMm(Sn6j8Ivf4&s&NQu0B(W!C+`S)F? zT;2cph(Di1UM;d}7jecG|1XPaInVj?lE^Z&z$9H|i9gHy|8oKU=d1Sje~yLClot3L X{BT?`(F)J5r#r5yrSd|_?B@Rhu>4r1 literal 0 HcmV?d00001