From ac292309c1254c3fbac8179e49e887aa568765b8 Mon Sep 17 00:00:00 2001 From: visionworkz <31665404+visionworkz@users.noreply.github.com> Date: Fri, 8 Dec 2017 22:59:27 +0800 Subject: [PATCH] Exposed jitter_image in Python and added an example (#980) * Exposed jitter_image in Python and added an example * Return Numpy array directly * Require numpy during setup * Added install of Numpy before builds * Changed pip install for user only due to security issues. * Removed malloc * Made presence of Numpy during compile optional. * Conflict * Refactored get_face_chip/get_face_chips to use Numpy as well. --- appveyor.yml | 1 + dlib/travis/build-and-test.sh | 1 + examples/faces/Tom_Cruise_avp_2014_4.jpg | Bin 0 -> 66360 bytes python_examples/face_alignment.py | 6 +- python_examples/face_jitter.py | 96 +++++++++++++++ setup.py | 17 +++ tools/python/CMakeLists.txt | 27 ++++ tools/python/src/dlib.cpp | 2 + tools/python/src/face_recognition.cpp | 78 ------------ tools/python/src/image.cpp | 3 +- tools/python/src/numpy_returns.cpp | 149 +++++++++++++++++++++++ tools/python/src/numpy_returns_stub.cpp | 67 ++++++++++ 12 files changed, 364 insertions(+), 83 deletions(-) create mode 100644 examples/faces/Tom_Cruise_avp_2014_4.jpg create mode 100644 python_examples/face_jitter.py create mode 100644 tools/python/src/numpy_returns.cpp create mode 100644 tools/python/src/numpy_returns_stub.cpp diff --git a/appveyor.yml b/appveyor.yml index 8be00a8d2..e2ce8cf5e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,6 +6,7 @@ build_script: # build test - mkdir %APPVEYOR_BUILD_FOLDER%\build_test - cd %APPVEYOR_BUILD_FOLDER%\build_test + - pip install numpy - cmake -G "Visual Studio 14 2015 Win64" ../dlib/test - cmake --build . --config %CONFIGURATION% diff --git a/dlib/travis/build-and-test.sh b/dlib/travis/build-and-test.sh index 0958b2700..77570c1c8 100755 --- a/dlib/travis/build-and-test.sh +++ b/dlib/travis/build-and-test.sh @@ -16,6 +16,7 @@ if [ "$VARIANT" = "examples" ]; then fi if [ "$VARIANT" = "python-api" ]; then + pip install --user numpy ../cmake/bin/cmake ../tools/python -DCMAKE_BUILD_TYPE=Release ../cmake/bin/cmake --build . --target install -- -j 2 diff --git a/examples/faces/Tom_Cruise_avp_2014_4.jpg b/examples/faces/Tom_Cruise_avp_2014_4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb2d73327898153e3abcedc2dd717909ccc638a0 GIT binary patch literal 66360 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

t?LYFbl(6Dwy+RjR-2n&o$8i}yLk75^$ zk~yq-oSdY42pW26i!NLGf|GAgd4qX>jVkI+PyPis-J2o;zpa9FEzr~vrJ8PBSms~L z8W0H5Jtw0ofJQXmFgt!aO|f+6D%DdUm1hPM4~|oI*DClXTf|=ZyJVRKN{eS7oEc{` z$YYY%c(?Iq3f0|`${sGKQh$3-o8^A6TiEraB_cz$F+H)^{|AqXghE2Tzi&6HNGauO zJ1502qv!_2xXr;5B->@dk^x4~+lO_6oAhtXuUJd*Gp%0lZYsILK zvqiVRKmP5Xqup;th~TVYu2pZ`Ht?92_TPF1%4?DcM z<0)LDfHt~g(@1#w+d*N0Tp6iYDvKC8pO!CAW#e}fIqrRK*j-+o(9+Y(Vbls(=I$5E z!XRnh9@?<1dKHpY-j#dCo z>+poOG?p6}&@4cS=iIx#-(BKZCwM;CHFFpk)iYW~t?kJ|9P7PHyy#Z+YPA`yHiB-a z5~pZ$v$5iJ;@m(G$d%y(50Fn3e*W}ooM}5jKnrU|hkX8$OCRrqSw{$|2LuPHx_gxO zY{swdGtQlZ2eM3Mvs>y$cD^XS9zvfR#}TKGIMo6&d|HQ?cOkJ=%537u;-5T+y{_ld z!Q2~$Cu*c99|+dtIi@)6ONrRTI6}HLpi}P5hklce39hctBH^TW#L?ZRxRY+IW9u~$ zZdNScTrKS7+Z%&&SC3=NSbeV>B>+U64}JR!Xu=%N&3)Z?y@+FLd0Rda9U|%Qr7hl!#l6;n@X<$`*>tsq4O+dEMD9-$m2Ra)qxfQEXO|!_HL_AyBS7cdhp#7J zw|5=eDI=mru^X$onuhP?FN5L`Mzd9SC}l1q&;$L^;(AZD3hpFhl9?d_S_Ps~PL9D& z6(SVre^e)TTg7Pd%M%rxcP(I3{?ON{?EXlNWid0zkwQdz#xG6qP^}0u(GM#VpUS(F ztg^Rf9>A@7m1+!&PzdAto?eGgkf|3&`IMrkW#R`vU^Mn8}H}!OfiCkXE+y- zt7wgBLfrJyjP_T=+~;vs^YV>oQImBY#(dHV`?u3bTaBs+-K)wS{-vEOYQ#^){jmZO zIeFyDx1DOXLbM>ka|LXoPk zBZo1p0^pu|&F^V+P*JNdgSB}Hhe59~ZWd)z;{^5OWBI`@4wsacyq35q|Guc~JFjxhU2d_NTG;0047_^Vbc*isnN_G*h2yS4entP3+UMU? z!($a>~Oup_agety=vagE^8)`!p1Wnxtsu_srB}3;SW(>JMQXhMO@_* zM0s|Mps1*lMEN)@)&tRL*-}3bb3F=Y;4F-rSR>Lg!eZ;rcU|?$>b@67D!B=I=v__U zv&OS0Xo@UM#^+E%3L^`yc1j)HpHn}nXJTmdv^F+&OcRb0HR=OFSBGFvVGIn7{kD{x zScm+1EuCu%f7VRgb^fz9j*Xs&m);mgZ)|*>nT^9-GS)_6Lpf%aL)X4>Gz?T&P*@Ns z*U9ozg4|lR@Illy?;UC+%{CfF1snzctX1__Ik2wXD=3QnybbhJGx`M_l6ZbgUhN-C zu2&Kl3LeEKv@oOhEIJ3ad;R2nj2A=rb|`)xD?rqXkpJN94CFC-PwjV!toDr*i`MJ? z3(#zVg|VbzY%b{`u=MJ14dy=mjH|kFRflK@;(95?&u)~Qlxp8EpqeeF2P5cQn~VnP zh{CNyP#Vm#h@|~^KS<^Y{xa%LtlzzkLc5KTwTh6%_W#F1o$r5KWX2Nz?#wy8w7=HXv5z+mVuVq3fw3E| z{RK?MT`}^yHJ-|K*FMFrt*Snd+$0=T)vYMkIUKQAwuIfefMK(3}RUGHHHNBm|@ z;>LCn^#wNvn`mzlTWW}{gXnp8O_RKjll(k}W|W_mPSjeIHc{Db2T}65BY!UU$}U4e ze7Ikvk_g%WfmjqY48DF+P)WYxEX&wbJz@Vpi2ClYrrM}krFTN;9nvULLq|YK0))_e z6)B+#NE2zw3xq)E3B79QU4n>Ur4xz>h#HDW2?~mehzN>!`R@Aex_`hqKb&=*z4y$X znP+Z7A}=UDpH@(G{Nvxb_IuCVn}l3@It-q984*|RJziADo-MFAZRARxg8LEw&iPIS zNIB;u_0iq+eDmch{wmu(pPhQ%0MB~<@T??2|FN|T0LcJj}j}Do?geulP61Lc}-sUf3ZJA6b~mkyZM(6 z;dDoNqz>I8leE2Z*+-=s5WC6Heb2Ka=H@>X^_JS*P$!`4cUl`Ak-;eoA1}z@N@`9d zUyJm=Qz%MJy3pKwErsK%+1gWJiIHm4{M3g1Z+Nm60&gVY|6SH%`=w{%+}_5SW@{aB zXRtJ3y>1=pewCxhFzHsF#GL!)3U(c01g(>A8Q+vJJUdmD5%{A8+0VA*A9E&x-8p80 z-Qq>yUwlXKW8P|n_?w3mll!}rpnU(Bac2WvgS)q zR2~nPdJ1x`l^4z*MSlNxj#9Zsz5b!c5lm@8|J?ZgOEp$!d=X)iI~o!9Cu8-B)$lyj?Qbmq!;h$Hsda5kNMf8=@Q zcVN|@4O4ma{`zsoU;;UFSZv($&xV5+^(C*fAy7V{!$5H#{uu-RM&Qub7!Amw+)H!t z&qq1x{x!O!L`~2vJ4s%58tQo|4j;G{lb-oeFmyDb`PS}y;FnIWgxBN^176dFnx^J1 zeeqWZrFWxT|9AWcG6YgC0FzPa%oDQ%?s^#w05OAPOL^u*}B+XCfBr?jKJ#$KcU z<`l5}bD_a)>8aQG_qP3hNht#M(T9d@Pw)Is;DiC-+<8U@MiwSU7MB0*mgo6o8Pox1 z7D=_s#&$mN$P^+YnZggYwV&J5K=`H(u1ArWy1h5P|E~;@cUy2hNlZezZap8axB=1N*<4>nIo(Fp=AQ;Zd>s9I|O-opGzZbMsjQ7{bW36+QOY*-kVD| zi3@G{Rit;{o;+a#{Js9*Yx+AjXBG40!L5ks(CJ=%dpQ5?4>OLi=RU+IQ_ov;AC5FU zEOI;0)rulAih+v)`QcEC{`= z&(&2+Z&N(U?QwT$b&b*I$G_;oaN8?N-?XdtHrbS_1r>=ZxjosV_{LXd4)4#0LaNzG ze1svH*k9Uh2KI5UX2S}J-OXOLv*_1gAI_rt$3hMvW0U<5M-O&=`IDSB3BQYSTJWTc z;ucWacdjsDRmPUr3B2~*Y(+1Spl&~{Ci2Oo*>H2!cy97`GM{15sWQZ6AM~8K(Qu2$ zi{7cq6LyQc*e|37+Nxx#tzykn;P3QMptaFG)QYNNQQq%8>>zOW4f4x196kLhvy)V< z%>5Dr&3hF>O|%D>bPSX~GQsbaKPV<9iZP~cUZYieW@ZMOaxGmg+x2a# z{q+v@?L(o@%QBoqBX`qhMst21#mm_{ z_7E19TK?Fh{CXQ-4%%oH`c~ZHjKBQv9I(;oYpK@*iREs#JJ_~Q$#92lO=ZJlZp=$v zy+2ZLp;r8KrklX2n2-UbIC619{6eLsEJ&d^yb4mSa8afc8e6}JgV$>F7SEWF*ihO| zw!1i5pe%QllKy&JkbL$(wp9Qvh!bSV7Ko%nS=pn^0lJRs!G>|)cbQ;P=`>rhGLiM5my zZgHhqhK~R&^U5B`e|YCrRGy?dq52gz+!}?vGDrUcFC#K|0ds_3;oN7#Tzi;9236=wYl?~nuANLjzeBEI2>VvoxWw3LgL>KyZ) z%l5}e7xc#lTQtAt_-pxkq4nwar53=_jOyZ?%irwnLNXJXLlK5*7k-Ex{GPCzY`=}5d)N6K#=LW! zuz?h7I0;m$5$gPFa<8W|nh`V^{Vpa>&Rg1!wnbhahdZ%lAH%ONa<4^)6{yGQxXKXNkh(;nBTV3LBjym$k=;`!zS{5^T)ta=s4-)@}!q;=yp zMh;@Zz4vzGW(=75-o^zxb1fZ=f>`+vSvd=ZZuAb-#A-Kt!Bi&lHERIk(|fy8+O~-r ziu}rA6T%&-CtrNEh4k1!)Mj5ch+K#ex!yv#7ceLp>lVIk|> zxLbfSW8a8dK*I~*yOZEaaoE+!)~;-ysGMp}QG5Q1a(h6aIJx2;Qokm_zNR)ieWV8U z+E?+|PiQ!pBk;d((`~9oeo?>6Kf7s{@J`|s-bT*mz^arCRW5oa1X5l*7AkVA^k)O1 zS6D?^8Xz}Bow?f+{8;bS*X9}8-tknbQ&6i2a-u)}U}HBMJ{EG%1#IYI_en|r>qoXI zI}4a-Jm>U`eU>ufX_5cGbHCVr7o_F&(TZf%dikf5S}cAzj78gQUZ$fPk7S541_eDXK^wb5ZQCsD1L_6xQE7CHMkv6e9w~ zg{2y_i?AP8is$IMJC8#Z+bH&O`*l*L{uH&eBu(r_^xTH=4y0FTxUmv|0RNN|J(L<* z$kA76fPW=MzHrfa;pyLfmFEf5SFi-NQi~_MRV^pfJTyt(%4jmwu`n%Wq1@$$Zfz{U z_oFpT%^&X6s{Xk#G7(sb8p_KkAplHQdi6|qwY4{XG`wJYk~lYC=<2?$Y&tK}bl!J$G-GV!JNLr= zoPF#{=en+nS3?=`AbPzjdP>ZN>)p)@qc@~PKG%&PR9TL!B`Kc4O%1;+8c}Dm5LSE5 zsI|2!55ZCK|ImX6S2@4V<+Z}2=L{}c1)uH8bXym?jMsnKyFHR*NfJdj_Z=CPzm-7l zgr8r?OM8dT2M4pnH1%)fH4)xEfKB!P%E>-cL zrG&e?-JI>xRws{JZGLVs6NwRHp(DwO1v8ktG*>6IgWTw^A?~^^s;TDs2V)rZQ{CD3 z{*yN{_|^hot=2>N@qK!q{c!-Ba5{iGIA0mBdh24q$Hr|IoqRwt$*hP zi|6!T69l_bh2oe_7}TnuU6hLt1SmdZbkn~~tMAi4<9u|l-e4+`PPKX&3f>Daey#2z z*eA4el--&0@b;yL>=%DZ3k#=Sd4FrUwy?(rqhFYaRPE!{e)*G@|qIQe>n{ zDa*4&YVS@1lXYVAn8mkelj+6J**`!2@~Fm7@|Weq_no3flH;u|dD!`>nI)20^4a@- z&p#Ajr`_0m{3#(kO%YVcSo`R@V2si4XVPyyiP1VEj|!~u_9__Zd40DVm_obgit-@S zNdDBLnk4{pP)vA;*ZUOn^-#%$8?SrtLzSkJ zeixg^bOit0W;oJ)P42$DeM!A7PmjO#yLldVtItQxXPKLT9D3AXMUcz}rgiNaudf&t zSywq+7n~dMdIZ5DXzt%z2&47aSrZiHqQz~JZP%O#> z>@@uCJ?y2Xn2oE*&J2OJm!e?YjaSyCmawraeB-J-pBp%0C>2!zOwSC^W0_qvPRsME=k<3t zUbUJvv0RCs_D6rhj3f3S%SpfO)J;}qzQ2vM?iYwzF;Cuuj`s51>;2drWVJH$;if{y z=cdE7>b>e0Jw|0K$9sn6bF8=Kn{HitFn*Y}PBXpo2d2`ysw&o!|GDLRf`EV4qpzN+ zj;YE6DyKIm^0%YLe_BR^f|pd&_xcq_BqOSq_ZOaoU3hQyCGs!%G!NC-=VajOSu7W+ z?{Nk3y(Rljr@^y~OP!q06Efc~sEWNWHT%N*nsu1?^4-gysU6y@h92+VB8nsX6B?x( zFMT2W_IvvWeeCFFdLa3j2$_Eb7Uyq_ykXdLTH%u0_$&+b%76Hee9*-jBAvk5F=p{W6e!m%eecwb2`ZBA`R|K1dRI&nN7_0Zvi z&LQF2ZHLmw5~mo&Ux`vq+;cW?Sqs0=q}EmYCpR2pq|cr>&Aa^#cTALCi9U=bZhySD zVD9kmTnqK8tjmNARB^X{z8RA!H01fmVB*2czU_yr4&&fOKO2L<54faK-g4}3iN7m% z{@NJ-HT^n%DJuEr@E^;fxZr-p8vOikkhto0oh<=9)3M_IrXTL|!0ZLrdyae7a%X5- z{{Pze&OChoKjHBVO{)XWaP%3BCd*I;=l0gs{vUEae@T`&mGzuikMQ4gjQ`Q77Vf~t zSitViki8tvZ8z=x2i!rtR1OxPRVPia$qkbEcMj$^f3Qi;b+<}zuJhwj;@);YW`#mD zX`xH$4?@EjKF};1?@kxF^FLu5(YxG)7y9)}enXrOTmoB~wM{PGVZ2&I*nYdoW*NT_WeEC#X-_q=>^l5vL~v=Ru=D#MQ1 zC8&S%t2GDLYH5fSfCHw-2MI;;(n4j#P!va&`UE#IVUY1^4q>~3&bH7zFhE5z_;Qmo zePwg&f04Zt`q>h>Ff-C4?bqcF>lZjYcr)9pF6#*tiG>pT%pNlUQrj zlrIm*1}H0yiP~;dQQqn9DbN7un~Obma{>^8{l9Z{DIUU%uJ8AO%O5_o_&-Far|JbT zKBbXL70MrjhEgjFD0Q=`4Mrw<@;+SfB2zb-3Y8p|6MVb=Tp(wh{guEH+g7vn1=0mO z0z&D&FN(mlcabx~d_@~-uafRS@KMFec?*B;e#L`$bhGWmHd7>5FUVEV6r+@lUMFX! zT=pIAtAduO6#TJJiiW=hZl*NI#%juDz02=rOOEKS)kjQwZG<)4FVSomy3R!HK1!bJ zcjeb*PSAeiL1bUACOlccE*sCq+mJ%<{lM8W1toQghNdUV6P$i9J#y9%P;lTdY$N-fp}-`T!6(@F$l3%Xc_OTRDkI}WCM))t zYhAeOH&}eFfs|W;!Rb(mk2H%Og+)yz@JRb0Za21ZvDSo(K!*(VKI&0`D)2pKHtp0V zC@+K`K)A^T#w(w>7G3Q*7lwANRKamoQbhQt@ki$S=M?yn`_P;3 zBLFm_9$OpqpAB#?=lK$Va`Iiy0vC@|bD`U0WJTO2jMmE@gmCn ziZ#%ZQZ{nxrW}8jEwIw;{7a5~uwEx$@bIT*3uA*(7VfCjZjXVAf#17Ijz=kr0qWiU zUG*>nL!Pt}pbI#tLzG$c8CO`XD*B|o^_qywYujPWOGK)1y>*09)!e^xa|p>E&|rV1 zTYzBBy{?oBd;8o)A2{@rN4KN+5CZcnUg>pdWZt0T(wZTs7Pt_c2&jeAQ*9ox)kw)q ziWJWeK}tJx1_kh5`Nx78#+l;%*7R$n+#fRYC-tMw#&>&(_o$2PZLu5pNAY;^c$S-f zvd(qA;up^sEh<_wm#OY!ZRs`wVN{Mt1|n^&ata?De+De z*5~HdP5`#*@aB71J)t3&ui$?3K{CYWNa{`*jmk-?HDeck2*O75OPL2lx_A?g_}e1# zXcP~4={`gqdh=F>I%S4hpHmctfm9V`XI@$_@E7K$m6e6XS}MmZN?Ij0v0zQ#@5?R~ z-Z?hmh>UUlrgFQWNwxAB{#DpT4_lrxt5@>vhtId;tv;eW^|r(BpaBAblVp%G{|@ct zf}&W_qYgJw^k0JWUj{SwuM#ZiW=!hGF4O*< z+n!_KUkHV`r1U+5_KUgGiDYTUDp#*iqJ7u+-PpkgB^ffO4F2~ROelUZ=D0xG%usMG z732JE?X23U)++mYP@3AVmxKK}h@2d%i*Qi^TAd^vc}w;d`{dR~?=gLCL5$-QKW=$q zO+&Bog=B`MtD$MW)j0YkZQ}`e3h<9`aC!XIQi@R3V{!22m+RC#KtzkUZ0uCyZ60z} zE^+1GIk-plWU3V+E);wCH5N|w)W_cQU&`cx3%Pv+YBj_yxjpEDWO zvP)u7TG!<1Q?ux2jI3ep2pg1yz`t`B#Msu27Ec%9LXW4!;NvgG7v;jbZ*|){;l_FC9+_!(3>u2uuKO?~LC{F0fsTpYUOs>i_tUlYj!8-=vH0C zOGs}@XGu1>Wu0_4-GY8~;#b1IbD}}xf*{o5(DezCEUy~o`rw1L*x>Lb$TAN0B-~9h z$}JjbRKyib#MVaZjnAlKa z1%zY{jDc@xniiO5f^v^UXriPCcWX<1F9K9RR^bLHim+g!fK26*2Pv+xb}Zp1u%ErW zt?5vSNu~lhu(yBFIP`4A17cfp5!us?2w?tq&gTi`qj@A7ZDQVpLM~}s6ib58LpyQW zGu?2Zp@nit-B1e;kEY!_^Yuq6)^}LULQO`z6op*ol8N=!FbO^eB7fidV>SNqi-2`h z$L&;X6HVMde*$9)vb(RcGIBHJLdrr_&wAmJOfeg*L@+(bVYawW)`iWsU&g$#m>v2! z0>a5hvd@eznFL_V(wY%^1S3*!#DxA)gm>^Cg#8+%(Pz!_?kVDIQcHzoDXMO_8jYpe zu=C4%Ey8J5uk$X`l?R`;84>7zhee`={+&yS4dyib`8RLJRbC;Qlc@REWZNeizkAa^ zb*8iT+FCh|_RuC(P>CqY%FEy1^@Qz)*_YD2%wF`~_9EMyVISHG`gCmS2bt`k{qrNk zUq%*Rk1Og`e+tTd*X*wA@t@y6am0JhLvE*BlQ6a^wS2@yKY2{lsTIB?i#ad z(r#PsPE_atfz~c39I@6R@t3!yDrFUi5qi3Mq5e6QG0>*5M3_6t+3Wp@xG>~eTK707 zQIIz&|C(3?wK`Tv%Ij>}DY&g5fR4A|{|3AIhd@_e_Om@8TH}ShrULia!HxzS3N$Cf zUf}lxlL8{swOd>)I0}~>vUI{Gz$&XqaEgP-SYEq%lab?pP;0@8JD6>CirQD!(C0*`T!}+Z{vq>2rmR~?+;oQAr?E`C^CCXtR~fHK-lgLoYR`CW)bqQP zBl~QZER*{?@D)|Xt}#JfPj5=Fe3{H&2e9Zu3ctp0(;1t-WO`)UX=ht-_s7lXobPBA zU(=O$LjoVz*Sx>8Ex#_|m(tl+I$M=u&vz)rdrshQZbzQx^%5Q_i`_QH!x3PyK9KLw z=I9kb3(oI&DAjA2XB{E!5ie2eG^lPg0)d$3;)D(~ls#6Pu@Y~G3{vdMw+J9D4T2b5 z7W(SBQgsc7^aY^OAWd+9J^pmNK$%!N++Ew06?LU5cJa~z+O z4Gk~b!^!aA-K=XEa=0JHt`&!P=n}&f+L>Y>hmPjS^`V|l(WB{@7#|}hQGq3T_Lc`l zq2_WS)IWaZk_^q#gSI?>IvupU7cVe}cuD8k`H~q_X7e=Q8LPZ>JFYiY>FHk}zc6Ai zYRu!0RAzPnnOy&tE0KFxYWB5_vTr`lQl}D0hE|NG*y7 z&ht~#EsPlN6}}VFos@u<%f;qL+gxodbXV zAB-+W963waKjJR8rz74HgQ3uiJqiuHOceubtJ(gyM4fc_Qzu&x4uO1LsPVYm#~Pf? zHz0W1_G>}6$Qprut%T$qm_jAiE%C`fjbLG3qS*YaZco|V3w3uEI3TY`W+bf^iP_q! zcUrO(J-KHRd)A|Yi{caon1|}=+_W(5wWjHp0=GHguu#Pu&^r;v@)AyGiO7k$u43Zt z`d?*N!9GG0gO~hf^0e0`Gq911jBx%T`gOfz->upO?X1uus|V~Qp4opv*I`1>I4No$ zqXZ2kEVg4TMiBHQ;J?ADG2m*rd{FBd6Lc4@Eje$E^B)?rw*JDWn#DH4AN$c z?Y-2Yi=SwGt8TW9^U~i*{J-MUv@Q?WkYcrv)HQ4Lf959NbK^! zTH|`~DA$Dg+Fi)K)IY!sug{cKk`GKmJ!5Sfp3mf;DX2(~w8Tg_)ZZXBY0m2eA<`d0 z?)u#gn=!w~EOyO++Xk4S^pR>+;%4dNqudu`Ij^ryv}byO3_hUl#-XO~58&h%>LdkF zHu^yhLCaQsz=u=hd5<27BUr}(Uk9Zl=RPsxL>=~kQ>IwW%P%HF z(FI3bPG9Hgs2w9S!-6%K>k-#~9Xa&i^E~AY@T@NPEmuA3$3tCZ4yCGHMphij_xI?bJMt6)c_aM{_L`HQ8FHoCQDxZ##9*H+0R!0jlOI!T6 z&$LDFyNB5I;jdfxlRnKS3pO(I1`JkYK$c3;KT1&GXVy@q5s7U!zMAw_-w2qp^x1kU z#C6_j;DZ%)p+)C=o&AK29USFtq&)Jm$10CWy-o-$Ao91|TmiCE?M0km@f1xrbpUiG zmH$^v%ebZ=7#FS%Sx3=GU-)dcJ=I1spbTq(!ysR=6EK1qGVD7{A5U~sVswh?9$M31 zst}7{v0KHrd-;(h){|X z7q#+A&PoEvmpZu<^rm`fws{*E@mwFMyzL-;euK{OW&*fs{^Q80c5b$CCDb`Uh&$7& zw;=pVxhM>UYsSb$_S6qGY^U>Z5fbIv7!2tavW3wM^N&9r#B0>qXUG@&{f#j2wR|g& z{Vt>-AgR+7WG8WXbgk@_tnU*7+ixI>pjIIyy~g5(Fu2EnPP8V8xRol!EJoc)ogU%~ zQyLfJ6RhX&K2}JC5aFm%R#F6QC~7-+^zs-EL@Z|aj=cw_sW(X3!O2xzH2clMVX1tx zYB6oV<+bJ-RON5sw$NO)f9H%#uBL?h-Slvx-HGAVki)FB<; zpLC~36nF$=5(=}{RunFjHN9N8C%{&XP9TaC6^JjB*jG0p|IU$nyH9Z)SK?5Tcl+e1 zlQ#z^%1dlmDWtkGK8<)RmictZA4#Ro6tDo^*iEOSnXkETG#DYbLc(^-K53boP3BBht5C6tAczv)72ja-p zJ{{W`^s%-J7W?8wk>L@gzNmR!#E$Uz2GnWH*Lxe(iE4+Ym}D;=-=w{Cf^en~jnUzMw%blRTB?a^D~y z(QP<9yMLKRCCQ|aUx^T0-)JnFZbr%99{(>_r$XlCBvch#J(~_f*kvLhLB8`3>kyE| zN*#TeAXn@TptcQqs5Kw9f3a2lep&Z4>(DDk^R8~=UXoQQBw!SfzQJ)nN>ZT3SDErk z*@SGhB)8`AUw`Nq{%p%Hkg`z;=Jk^TEv_@Qz*+u)IvZ~UNk=$9cn{KyJ>OP!LHq~a zEwH^{`AQ}~KMFXvjnAt2%@?q5!%e(7d*pt3=Rh;t*oVLt&f-c4%q-VJohoESB>UPe z$~g3D*nrE^LyKXYRymwFV0h_$D4jC9>Kv!EJ&8A=bZ`T-nn;$P%WBExNO~`=&u(Kj zy?C@lqPm{Ndg?`~jgt&E$dsKw8mHc{NT43d%9Z%W%YMkYD2U3x`|(y@Y9NUXoQmTc z7D?s0rqKfElrM->8AruvDf_+R_brL#vBJqZ6};;AVySp|t1_6eef!@zwtEA=gi-sZ z8%xf1exK$dE@zYoEAgsuxO&J-d-scI-r|BO3vs4?To&uUolby_RQk$<+V5F@bBDSC z9od<(_iW7NoY7NZ7*z4wE_wq|hIAbO;~vMyek=2xxkQw-*+w};(qC|WPx&+_U?`Se zm*7J#n2*s>`2x%k=l&oyOG+2&$bS4D@@XymvS%HRlM{7-E=yG+B?$p(<@WnNb|rd> z%chrGXCDitB7mDL!@dCTlnzKhxPs73f#vNXt3u8Oo<~l+f6n{%Zil;AtyBMx?N0?dxx`=)5s4H^TD z6OG1=7gy|MVn(adB@(k>>o!x8LoT%vU!mH#m1MsF@wG6aUFyqfAb2mX8%@qh5SgHC zJ!6i#9_2mpRu`*%FDMQsicaKNvH;t4lO-Bxe-hSn@r7h{Lo-BRO6?${!jG=pDy4eO z+_v;G>zT)kB+k3>K9st#k2KnqNmxVUwIahr zT%J%Ml`_8xi4C%C4>gaAy}H$l2kGL(D}6CKF^T0q&d1vw>eE ztR-hBhEojM-VgpKd>?hOlvq?c2VcCvjjo#5*;mTbo^vfCwpqp1G7^*U_uyYbkwsC+ zu#&=4-1Gk|%bm|8yeKaIA;L@9vgP{>(PvK1avZ$p?e6qnD8#P)nMp{uM|ZuR!X#j1 zo3FV$8VIQ=!6Chmk?=tWCG&L?E{*=SHeTo1* zcZMLuZjllc!g>oA$;8e%;TQ%11giIuo}3Uk)Z{!|O!(1_CQgpts-f@g{)(0z=?J2^ zur+AL9dz3>yP6gwws+Xvl22%;Zo2>L**D#~Wce9-?wGvgeSpEd1v3orC7=AFP@MI_ z1Mj8VV@guCibV}m;F7=;!=^dz>fAS#v<@w>#LzX?Ab=lTRB1{IOs@pAQ^L22T9DM> zgQ%e59!x+`$U%o2YnDi<^oE?M>>v-jSP3XTR37nyA2wqys2e;dCUBQ7>sm%dG#FRX zrSwRNatz1j$9^%D6bO$Q;XH4_qp)VAU$LGLpG-6VG;%m&3HV8*D+iLUX3p=gAkpzk z00iR+(UxfF_DyS!)oa|t|L~E@nD7dp@EFQIUze1Fd3#Xccu{%JIAT!)hN)k*_WsYl z>8siFy-g-(&#(Rb9W8MJoQL8H_|j{JWt@#Kx~O^ie(qDJ`HFjinXV25W^OmowiWe+ z!yR+hK1xs{AV|rTPP1^^XH#DH(VxZGIw$8OloB#Y^ZMMK$)KdOeiPyvfNHY2r?=#}N1-Zg%m~Nnml2ZtPz@gvE2Xwh80ze;mvW z*V)WnD+azi(Az~4ovW5l8J+jd7&KeN!RC8zMNhIlPtU8X!+Gk^olkt{V4)e9Q+%!( z(_>8-&6?%oLDmPuyK|lRA52??3}GCAWS7Nd ztsLn#VW(Q_Zvtl|ur&)gYZRz$^YggFCwivC1sfqNef)z}7m5+Dg%66Lonw~$^y~e} z5SrBYJw$3jE~w8{W)k(T_u*jbl#tYvN07%Z^u7GgtBCJePYJiipmY-h;04Oil3(Ej zNG$6T2sM#PKVo-#y1<7Y5_eZzoqd?6DDCloN7qt~tsPrFULKw-kyqqf zc{30Fz8lm677`PG=Xy-qZ|3i*is};ANTtI2IE?844C^p)2K_A&qS9 z6KvGF2{z{`V1%w<9K7asdN*6hBghD|Kf9<@PmRSO4jZB)vSVao>bMGrwYWN299b|u zfwB{|SMaq;1=j%hFb}0H7dQz!txEynTG-RV{wQQW%hs#);1HTfxm1>9$X5BKz$#3< zF!&)lcXb;5`ro;MQC+PGV_QE!@e@87a|6T`eZivx-m}}5WJB$cuL1jlYF7XlRy+0( zDK1Zfc$MMUmLqVX?j5&!u&TWI3l;Rit9Qbzh#!1WBf+o_ZULrhmM(0-8N z@4QZuo4DLi-A$m@=)fZ0&c17j)okA@D9K_bkGrT&UJ&pW1S1D3DMrk`&Q{x*?vy(F z!h(yX5`}Tm2WGyBy2^9m(4IR{nq8Cccx<%>`S^@=g-vj8_+_0TOF59B*mM>LRKHRy zf!~Df0yxuLbD!GszR@SkC#jlad+Q~MwCe{hvdUhIxu}Y2aoBh4#r@8x-@DeR8bia(p8psYkrbircbPEBIoV+DSPE>e|i8=X$6E6#vis><4 zxBcxtDdfW`uQUm)C)(^fnRJI**NC2R@Uwo*JKQ!ArvUsR*#_$}@ODr@Exm>iQdJl) zUd3}EMC2J?Ry^>@-GqH`fiBez5sN4x*%iz&AmnUG((3)QDVh*DkXovBLA476>iIVd z29kMNaB&?uBwnosi5If$*;V%+%*;J#)YILAo}XB7J-&(-A5|vAQHUB&CE>2&zpj~| z@uuE0Ea(iM-v&8gl4m>+*R5|WaNw9B(49^~fzUY^xdf?H`58Pcy|89p2Jg=IfIauM zD95+iQn~GjLt2TXaw1fRdcP@(2)Z2eAHPg zNG%U3n&SPb6`)7&4B|WKoTxFF7t7Kx2{z88Ee+Oy6s6y- zBGfNubJuGsrSsD)%Nny>a?5fp&347*d@TmMC*Ix4T@ecPBa&53?fA)rOdoYwC12Mr zTnTy(hzPb5Q0L=dsjrk|vLyspzFzHlRtSpq)+(@t73lAYb@WWeY14fz=1bD?7yRaj zZZk)xP^q=CqbMb+dUS>_#h_q*d0=MGxyx@AJ!Fw0LhRUa&NH?U5(wvw1_ zHWMY8ZB1wGE@(p|o`~GEi1dgRZ&|sY^-?LVkr_ExF2RACSi<113(0#>u0yQk0v9uA zVa3||H|k(LQ92R{(7=HT^cRDDiJ)%RtW;wCDK86LT>*R|-6tm&OPDQBNg2=&bt)Ge z-ldWt6;c4p+emxVz5ypk=$R{Kwq$pb`od~=oMAD=K}ntj7wij$IId^;lGUc0QlbUI z$LL+*W78~Sxd5tV}_y{kc$LzO!49e$+LF8?YgNFRn1LZu>$I zlDepG0kbRE#1E-v($%L+eiorBgfZ_^*-rQ+Fg-Ah$6~^Q^+jX>x0w5)7enowS6%xB z5f!yQ*UI4qt**_DKQdCni-_`$8{(FmlB1NpV1RPXP{*wF!OTWC>xt^^ z&_q0pWn5{zrt$gJ)QKn|;Wd6FJEsZ$o*T8ePB)4p0EL6Ws??v^f;hD=Dv2P`+9aTq zT}ll@7AO#O(K*>_2vnGUfd4G^@ zN@l$ho3XE^t8!hqHh(F#uxPx-wuyMNnq#;aP*0*8KtkA~@^(p5nP%RuWp9jO{7iG{ z9&n+tN}0hx3CZCfhw+STe)et>Q$|8sWIahqf_bWcpNQoLk>KRxj|BaBS3r6(*}HZ` zs2~Spi6`$XwL#2Db@Bt&(TFSTf=fNva>Blb=w)++*B+Im48K4|%08QCr3fuytY|;# zcbrOh^@v8B_U^8fzVMFX_R)cfwz^x(+x^yw0_{Zgocs_^9_<|L`MjR^`9HUnbk-Sp zSh1abVhuy5o0|X|Q}K5fx)4p|2PK*$pXUxYo{dam zKk)78`8vzyU?A0QS4N_Y$@N$qP+yG4&dJxgTf=^`4;pz3SEM&5iDPus0Y|NWo=z6d z=ynw#VHCmUAU7o6K*UF{Z--(B%eyd1%_C7LxmG+Wl#J-NtHk6z#!BYr4p!X;LM%8}CwJk!0L@0&4VokcP#lDs z2B=pGYWOn>ousETL`!n-YB|0beJacY5|6FY;ETkj1kI8xQ(A!t2R||K|L()tOexKrZRhGHH(P5fx5Yy z_St=GN!`?Xw-tqV1>u9KV&X72*a>HVTMYM23GttIJ-UP6cV)gZ(8p?cyA_$k3PI3s zVo3?9fy;x5LtpkUZt3}^Wy#K%AXZtEy9%1a+b43d%2Md!I!+zIfm{pyI6(7~EY77L2w8NfDi?8m<86Ew=YVN6;*=ym zX~Bd-OARvB*0%W{F%U1?*5%dZ-{Cz;Wn zB8vAnuuIr<>4)0Mn=y zyA;_VWPm_~<)gVAtDzOgREXpFy}#f(@ui2y?PV+yks+ymTr}($PQWYm@*|;9(2KQ* za|-Er^t*zYMPZpG??9HU9QtI2@mbK6ZI)uV7SMX_T2FgP*0Rs?h8H8y{t`4sF-8Sh zf4N)C&6n|F0`HFS94uvAN`S2iAvR(Tp=L(4~H9mUtF#?di|!EKG(=je*o; z9MYbLjx#ZaDAziGsz)S{$$l%SC<|*TrdJ@;rekgH1+3K7s;lPwljYc?Aq z*(1xZCUT%g`uYe0_1I@|krIBMv{7kbrv=-BFAW_v8F$ z&|-+u0-^~Qp--hiKY&jXREn1 zO6F|Ld=X}y-pI&HhI|G+#6iUHsx|FTu+KMt%Mc{%;eX^Y(wY*96T@Q63v1A#(I7m(!zG%gJG4Op z#DHxi`~X2vlzJXai%rpqy%7`aEH1Y{!xU7?EZO90=2E)9qGMmdm6HjEw-=h6lGh{z z!pNXw0w_ePgUvcirW-5u$i-WPo1ReYlg^S0IXY)!^d{rzYcXmI;CHsuf=vxH=x7D0 zvP6)La!uPwkRZ}v({ZJ1B4bG|$AQX{5n2$@Iev)=^uh`BfxDsV+>?jdFkEap{{T?z z-HQ3rom_h&NuAyOjf$dL?1`YIf<}-t9pqZ^rnJVPYp6qmKH%lG2 zP(DO42b>9+ZU#u@o*5GJ@HYn=WXAmtSQ(PZ5mDg4S!Yfx@?jY?lhCzVroo({2(x1+ zjT#t#lx@+l{{RLXk+85nm%(kGi53S7Z_R)7U`J{{L-JdV*Yb!HZ?Q6_h<75EZiU80 zyg3u1g2HBbC4)3Hkt*0-C9c%u*g*}~M(?o9xj^bsK1T&J>_qfQzhMmvudrRn{d#rSeOQ+XC`3Rn5S+VHt+`9c*fnt_ zxZM$}*$SKyu7$KzERzikPxDSRl4zYE*dY;>k}Vnh@EWgv879IfW%?!^{{WtJa>Q4m zwqM$xv?n-^PDh%tY=%_KN9cPNW7yUTu*63dNeMieI%Mf4W`abKlBO(zAR!jPQASh= z7gc`7QiF!sEQBheh_OhvAeBIr3ZWJ+FC`z@R7A9ibYv$&WZ(Y)1mKp=42_P)f{~<+ zXYfKUJJpk=KY!Sn5s$aSun+3TXG@+}+x03`J@X&;ut7DUIT*hICu+xjM1UW}`cV)p)nCaJGX!xSwf zpG+gnKQ3QrRdD?u`*BsD{mZ0I5AhQaK zK1hYT4m2e~rPhs72pqJ3rZMD;{tz`DgfGk|z=cdt{{RiNVn#-f{{RF!Qb^od+=3?^ z-`JmJaGr2W-{mLm9tOH%>v0lt5Z8x=`V%Cz-|{L_map2+(D^HIt3R>+$L)g9nVnH( zrsxpiB7_u$UJD8N&`Q#1Z4H@3Dg72?VJiOsMvi(geXdr|o_)fAh{trm}7N>&G zmOD}EnY8oTfo6!hk4{3Xe?Q2C>J2|1CMG}IjZ?pPkI*Kh!d)mxb!r z(6A@?F@!YN(9oIrGI^1ULI_%C2}q&|2_>UL1q zmX7T&(PiNGm*`NkUkB47&kCtr2`7j2c898)U(t>6r)i8_FHDtdXc@lfbNG?62_v*I zDGzcYN?4)C*-)jK5Ojrsp{|z#QR8uQY9pa32&Kb*k00levV&N+8&V|Lfi6Z6w2#Sa zWDJ4`8r3q4k{aZG3TjOfnH&|$6zt!iobE0O=)5q{r{tH~B<~IWn6Wa}C)F{g-uQ87 z6ga;8+pqjFpS0KqZV>4L4mnA-MaO4;P(r)P5Gl1@*QCQ7ADG$wgh zlqb;_WM>d3V7f)_T@0~G18tEb=OEnS&1{I5&)A^r{bmN&j_D7}^tEN_AsmF|YXynO znI!1{00|_(Y)o%mhO~_mvNYck)GZMqB}X4OFAT*XULYD{sMCS-?J)TPxxk0 zxfGA~I9RWX^d~a6!i>Y7BlxliM-Kl0k|8wDDO`lp4LmrH`hg)6m=m$^HQ}2ZbrhOg zmP9EmOXTFq@IEHJ90oszBM}Hm`)pjAGBm=eP3<%rOqBl2K}4U_(uN#=FGSD zJQ!*ofq@3&9kdtV^q05wF&NvTzrp5wudMb z%rhiYU?e9z{+Pt97!nCSQ5?w&leLN3n)PF0=8g)FDnggQhX{*AIls19Qi{T#)MN1OEUEC>4!?$vN(nvMQR~g%fMA z#ZNwV1!Nj~Gwk@0xxZ#{K9RqFEX#jqqiXv8_3|Z}C ztkB`$HSb~y1sgm4Du_h_MQsWZu3S!t*N4&=ytC#|DZ{CAoEb<@R~zz5S8%3|UhWJn zt*u0Xig~|Qb7ROp=4}jymRfwYnn zm}kKUr%n+eS1_L9`wznnwNrEOV&3;?rM#s<)dR24zvJ5hy)Ax}r8k`-T!i{{j%Ulk zngN7RFDF9IRbm5sKtf{UtNhGQyiHV7UMMAss!*d=<$-kw#8$a{F&Lg| zY|+G3Sct8*OQzB*62ea1^slen$S_Dqw<&qtb6jzbPhDmh|M zg|Gs_0jwTKso<(L6`B-(h?_fX{{YQ*mTc2H^d}wB&_e+Nfk3`C6Q)9`gp5YE7t#J8 zyPdNG&9{4%iADf;DQmOb&SIfcL$sZ zuc8@qRhDFZwRYfdpnTDs{dr_6Mz8>k0e-;%pyKnU$w>Q^8xA%Iu>79zcrd#X95daS zZ0g-WSP6CE!o`RL1_M9L5&c@(w6HQY_*^=kaIs;ZEp`heugiavbYE$IlNED!V*_W= z23;~Mr`h0lIwv+~2MuB~E(ZFr5|?@JDo+-QOL3kllXEI<|Q` z_wb?)8Fy;Jb;RWG#$08&YbJH}+fCJj$)JRMxBGSd;V*r#vd%FvHRtxo@auv)Al7DO z>ILo*J*T2eAJx~w)&>?Pj~GmaoOqWkn@9#=5`iw+yb~v*CTyKSmIa;9R!0^GyqdqI z+p_LE{5;#?)UcJelIru@9s*^SS!5H)L7vmmcO>ndT3e^m2ed=oo98WqA=JBvRy$zJ zvG2A!c?{t2sDZGx_Q@>cw<0H8Kl6b`GES$Byg}LZ$&a$zFj@HxbLYm{CSTtSOvx_R zCld*FIRgtXGcemXXIswiZipgfoMegR(RFnW^?%&q$QQd8uK0uGsXE~G8p}IfxYV}7 zwz3Swqu+7r9A_D4**7@bf0wS~1nU=UO>7cgJ?Jx6A5C9>?~-sz0=}&K_BwA7_Mb0k+OnEOB)(9`UmPWByyuQ^$@!VkeFU z-HWGj$E(D|>;u%0zN{I+UFG3z zz2HywUF^Hy>yu}$2YkD*ELePFcq^dRJf6#PV)!>diL=1=*OsoIkqp@z7n84&WKrLd z-mhq~>0ro7P2t>({{R+2L}o+72_vFe6)MIv#UXB>UtxmV9qCe z29CEw33Y7D93DW$n+2c9eP;wt6RA?7fhF<|?-ouk8OPH85zOsnokzQQ)u8TE)E+f> z!bcBW;6?pLdWa9+36t&e1@nOh*xL*G8~*@T{;U>o&YSw*6g9BJjoIM0u0aP~$Pp3D zw7M4Tps*I_+;I94kG2H3buF`o@i1%_%*2ntbK}5wWvuSf7Ik8KAo9||W$Ct~B?@r& zcK#T4Pk48P*Di)wY%PpA-VZH~HNz9s%ag1f@Z4)P2J$z%#5Rj*F6?2l$>5pPE1PFy z&(X~Lh8ud3$jgnS=tw=GRpKF+jttua)-x`qWF5C$`q`h1{0)XrTn7WcB8`rXtAVyb zZ_xzu_qGyqcIcE$XAdQrPk`7k<1Ds#0{~qi&vOVw7Ik*;3Zl127u%Sq`TT<#_{avR;zM&X7iMdRdXbc-GP7<+jb>axSCsya$ELU~grO z^M(cx@>uG@Cm926*2+04`+w44>+o*;RyM@BA{eu7g_ZHPn0ki7%uNfvlbpf(BLTPj z4XwLLWV{2jcv~*E%Y?M8qLB?55l3SDfN=v>(jhH&{c5UN?tChS9e|whO-L9{i?6q&zPuLRtmW!#`j zy;%0$3&{y}`3L+Lfmj~a=M!zSW@pPfh)l`t-VggNhuLAbpZW35{{Vru)oB-JviTap zXcl%L*e@lQ%d%V8b#8GSZvg)Q2Jrbev)LwuLrbPy7QVvqbVjGSY$khlPgdARBk|&K zfNA+($F4lRm1U1i3DhOIE3qg}APYtdVZa$=-+}!nh~w(t&sKRox}~4qIE2sizl@dN z2yjC5j=P8Uc;DE){9wbe5AH+AYzr`mfc-Akw(Nh2{2ZRIFL~JrKER2uOllcz>=B== zs@B-OUccS)`tEXsw?^Oa8~)eW$@~)C@No720KuYqaQ<@g{{YGULVUV=WOX8Y zWJU5l{{RpF!~h@>00RI60RaI40RaI300000009vYAu&N9Q7~a~f&bb72mt{R0Y4CY z!E|yD3xoKiN(!)~GNGmk74$@qzfBwyE*=E(Nbq>`DT_=>MLrF#-VKUkWfDwmjjjm- z{fS~}{4whycwDEFL(>Y1`HMf`h(cjC=#peMhm!?$@X^c@71Ag%JfotaB#n)++943H z;Tb`^9h$~EM)A&PTSSAsrghd7|=#nStvNnFg-V}whJj4G0aOb5CGh-3A zf_^hWsj|jYPW&RsQyE)em10_mQ4+I5iD>9UWNb|eaBU(A8W4!lP@6(Beu;e-`SDf| zq(l@Jn1qcAje+Q;G6cdQ)8TM{Av0FjFDhx`*c!@=g7;;SkTK{PFqtZeHWNef~^ zLJg!c6V}DHB#}tSjSVJ0^ht~QZ4Am&p)HC)Y$j1A*o!dUBVh|Gqimv>Xo|X8Oh3@V zPK_ys`VB^ev`y$umhjRW8^tM0gvwDsv=-T+VZ1CHdSW%A{)!DV6Q+eqQs}s|1QUyFH|bc?Y7I19i{Q!~W6-AbBs4>8r722A2!FVAr6`$yM9T^g zP-dDOj{=>EhRX>?fqonxWiQ1o#{Lwqg+gKk@KZ%JAMQkkkb`wLV#A@oq`k}-^u;|I zj})aS!8##8*ww)$G$2D77ScJvEn>s^jPyu&l^=#}@SZ5yA?eejh9)T+u{Jm*V~B6E zVsw2FHN08uj^%uqVt5nidu5|=mXC6={J|_JLUcC#8y1hhD+qJJVPb?*XQO5P7^aYl zr$<(Y-{Sd=vplWXT0{IAL+|6?nj>iFVMBT!@jM?7#%Z46!H-Dje9R_NtXClA)@#Bp z4_IHdpN7cpVhs?}2ZIlz+xZ@6qT=obrTK!w$yhBaC3rB%Ho>%21|LL0i1!8>7PusE zZ}f)G1UE=)FogKL6HsV_*)W49p+?a0OG?fD3}YAI@{u1B5SUnaevSw5gU1H!bcNBT z$SLTOdkD51^9~77>A?#c^wCkQHHFiW@a71Ro5Cgy5aJuzM8~k-g=2?sZas@{MvSOF ziD*XRAy^o=I=UlRM!zp&k@i z^wi0e*30>Y8-IrW3B+y82Z6oeC?kU!I36gr%b~KK7A6Y}{{TdsHpGUZej6jR*x3j2 z@R}Y|6Vd3@O!{eJj9A1pG$En-8iRieN}WR22u)sL3GqLLigg775YcgszR$aHF3W;h{kCkfR7_M1(|yo5Mp> zL}DS&g_Y?KUTzk!%?xbtc%puZ+*~F!l8nb>E)?!j5QHWWyJ6?ZkkF928X%hx$~MpP zLUECsLstp>8@`NEk1dxdT{n&fxAQQAqM}b7N4Rn#7=<6{YCT~FKNQ#KlYA@iZVi+| z5v~ttlOMxlbg{N9dSF9a!Wg(Vph(2c#)gfJB(x-&gc?kt7su`(lu9if9|zd--@{f~ z;nf}oq44t`gJ_4*LuQ1MB4)12zamGXM$njiIv??R8scAqSwo^p!}32t>kK?rC6QK< zH2Ca)#g%oDRS6m3&`gw#36WhJyc>9A(1-lNG%2^>f*M(OH^FX${Z)*e)_OX^*oYd`Y#@ZNhuj)C$R!Zq!XrWMj=nUE_YJ!E zf<(eNPaPA2lHzLU))z6hL9LJ)4UBq{5R^T;^dTnk!U=pK=uCq{T9_8Zcrc+bnEeEj zYYTZ`HE@SR`B;KqC~Zu44Hp^`#>lM|oh%y4-d_F#hzUe+cpudl(j|qDGKpgl!!R32 zYlj9gyiFuRLpeD^`(H?;$NG3JXQX6Ieu%e*%^&I^egfn|kfq@kAM@AdVs{+Eb3GwN zvyF|rO$8d@FFB6mGcqy1L`D9QSGVl};w?7?;#)1`xrbkv2Qv+Q3%D>Kj2}aI z)cOfiPob3p68?qW<=N_@VG=OoHn)WMb$nqy<;I*SOSiYRQC#sa2sZX%Pq7KFies!;-t z*@EnS#AzPbN}Dx_XIE>)Fi_>Ceq|XGgtfR}8_41UZDWA|kl8?WD8RC^G$C3ODGNZO zP6h(-FGGoJ!J}Jddp%%9fl~si7a2!C(Gk$UXkfRcpU4;~w9A-Ak0iGuc!6vWmQ>NM zrD1To8FpNA9HaCMWx<6$j>%}vn3O+C!ACQ>n3zGhNlaH?Nm4dlbE!d{%y5qp+bJhx zyiG`8N^=w)z!ZnfMbY<|81Sf!vtQGKwQLl&*8IZ2nMkXr;>?4NEjm2#+wm)?|VMmiT-!yiGO?P_ObF zvFO;~Y5dF4c_NVlDBemx5ly=C-A=tc9l8c)qif@cG zdW%<%lPBVAld)!7j(fJ&AP8E)%}dMKWnf|1fv+gSwRBSb%F1C+KbT8;?_Zg^j?Mhp z3G2cz>zL*GULTpA7NYU$RVTFyf~2P*iJKK+dCCzO16os|j5H+AAT+TzL1`JTK9bbB zDhZT=_4E=kQ96lHqa18YW@&>nBs;O{3`)QuHjfi|V9ZN`4=<&J%)uWlW-UlnbWBbv zVk~f{mIhCA+`b^-;Tp<8W@1IQv|E`d@&_@fIz48c4>1L;1$34PvwZ&mNq1fHG)$^F z24~b{+B_t$2euG=K+KY^J}USkbq859SV81QULhu1Q!~I-;4u$-DrorZmlSned5U&Ks{B`HOXu^v6~%ERw7gY7w6+ zFdCZH84V2e_Kq!|hUL+T;-M%Uwhc2_jJrQmgw35s)49wU!SzTL9Y=ArwS^0p%n*Li zLv0^vclRkvIEZR;ATC%n75@NHqZ1S(1JcImrlvm2s^NTQZ&4&-H_ks`)YQTkIme0W} zYO_{be-WBdIs{FLRIMxT9SRLNkLE1`E#=>pROQrLhwc4D^mS4Cg+il6l^hccWqg`t z`j6i8)Y}nFtTlDdnS_XU?f1lfM=K9uEQPlX*M6c}3Iuc(5s~#`D-mP3V7f%a`Cx81 zRWY)XjRcce37}oW5swYg73M8@il|LI%8iBwB4g=revOeMML9#8hO4M2GGtE-z)U)U z_JT~1#vyYPsJ9Cgmi5oMpm-xQ?KdMpS7l!ELpoEqVrGa`(vLJiu{Jw5pQL z*O(x4QuGnr_*YVqd_Z3cvd`!8ln?CA2#Ul(E7JLpFL(RHJmt_ISQg;QM-5fxDGy(e z5M%+c!llkyhB->dhI~yP<#7@uucaSM!XjK1>J>nlLVdba0KEooI^aZB&#`< zvPFXa$1sSjWFYy&6fK6=<;=89j|N{H%;=u$FUF#+?sm+%Jg_I_38o%ZZ1jZ|9(tFO zXG0R2v_gRQsMzImYP@Lzld#NYURceM_{upd8Z`bGlbjJWeq!%5u}9>JGUn343`n(3 z-ui%n2N%DNBG&1V55+Lg0Z{({i1Qh%F1}`HoPqj^-DN2*)$2|^Ig6Kkqfv}lQIg>F zYLF!gZJQ^e0^%`HHfHAWOG|JON3k&egY+xF3e52SjDapS!8!;$2?1RJH_q)042pw3TiHh zMjWV@*efmXUo5&#syM$dP*MYW4}v5PGJaO|h|9(!7I~KquSE2UA^CwzJuCa*m|}au zaT;Lit_WNjqesCRxox)2IM8D&gG+1inUvh{h@S{W%L^h;xsA`R#~$hc$!lfqRV9iB z{$bR*-7b!a(*FRMIF-x8*D;UT2L56jS&J0}xmG9H06r`7M-A09 zG(SAeT1C`PnMy5Qd6&gbQ5D)tmns?IQ3Ge2$qu5q6BfdNAyhf2Q#d+djroW=K8lGF zT}R4&iOP*;{KUP@=tWx&jKi(|WgVd-Q4uPENuWewWAe(uf}SAuLe&#|ww@Dj+Zn%@ zzDdO&%utf>sKL;oL7UlJ@!}w_KS2P`l9w0d<${KdC29WQmU3HtZFa{^fI0^+Y^>YN zv4?-}GSt-F3%{NsO0EsF_k|dys7LoRONS`NVX#|YnQGo}P(LsboKVQ_%l$*eyJc6) zVIHE3>?0Ds*j@{G^bo_WSYh2_pK;}rkHka!iNKF5XW}XGAbjo??;?QDE)Yfduvx}| zg$L?1uYge{FoI-1%%d&}TF(W3;O$~qhW`L^g4ezi5a(x~;7en*SxWvTfI*{AhylP) zw7E2O%I83pk-MgVG1ys?1->OK)65xyOl?A)MFA4qVo!$ zR9lJ`FoQ8=fN2(TxSiX7Q$#mg&|3`+*~l^K0eD&=mLQ^*@c#g_CRI=AcNSus#EOvG z&*w!dX~t%-Vu`cF&1P)Z;sI)JV2XUPV%`t51vx-XS=u92ns()Q%Qh{*ZC*L-iQh|C-CK4+>rl>Oqct=nJ^w7xYLhxoC$0cXi2`G?qs(d(lA z5FwUiOai|*_k^Kb3(tZ~z`sPNtq;s#b3qT-sCU)JJ}SayNLAd?@UP{8D61#12kqiI z7NY+EA=ikyzL}t34dn9?Tl9>tgA($^+K86OOwjmI6I|};Dm4oC0v3f=Zx2sUcpog&= zbAbNf}!(gm=PecXCZ-`Y@&P6Nj zEEfEN{B8jQL#X$Nu|ae{a)EBb22sBOPt000G_3ysamaAytbSs}-@GsZO#zsczI*Xd z@eA#6l}N5za>Y?)#g~|oW}=PD_=aY2&r-W3UlOG-BNm0w?q073`@F>qIe3Y1g631C zZB0D*m<~m)P&En^I#UOlmm$l6{KpB3)V1uEfp2A>F9aer(5x>XctLSw(Uq}4^QVe} zDno1j4*n(>$cnAs-V@!iYgF?4h(`9<59JmH`rsl!GkiV#N5~lfHgFwFWGPK-`C!Gn zu#UwGn#=DM06A_7f@~|l?j9>V!0;Z;k+487@{Wmt>_!bZ=e+vm> zby6Zf3^*BNd3laU+cG*SL)rJ24NoXj{7i)oyuXQp`7p#eBh7yeK`eph7_+#f411qF zbw-g|X0f-yo;t8CzAGu_Wm;C#RqN8sQ{qY2-+}>() zi)!7N>eCm}`8n4TthL&~csYLr*g>p6K|yOT(ViFfiC7#0e+<+ZSz9)- z>RSUg4=+#!!N5zJm*Qc9`r;lQfxJ!I-c~--WICaVl({sMISGZOyk88-sx}$8Ay(%L zfrci!JBd`j$h8%mth(-`uwgq#Mx!z^ZA?YAlFzhoR~Z zJX5z%2XIs@0lnXKD7WOliOxD6*fxTp>Rw)0gwtkEC$AxXHo5`N#7$4FL@e3$ncUl@0-i9tar~j15JN21&#vEP)zcAn0M0 zy1$8&XDbwW?l$t;q3gJm+Nx>WN8UKhwp5KC|b$qhS91DQ)U z)$ToQ3Ws+thAII;(SBd%Q(#5% zn6pMvR`(5r7{@-~aBtg&9bsv+Rzgx-s->V=qH*2Kpyg&r$4QnN=sAHsoCho`rDFuA zYO<)<$DJBUz%~1xs3=1dh~uy>;6;Yoa#kNQqb`8OA$g4Mx}L9N;J=t*at{O3<$n>- z$f{r*f40H`p;7sLvDwbRI*W4B3!=k`v4IU>IsPDbt8K4Rp%7Q#9DF|WCOwbtbndqE z0bAO%_y|zjysg7kriW*n{C;STuNGFm*#0oBzmZW8H~BGa^%m#t6ux&6w(KRJD(*WQ z2CUc6W@0&8<_gRe!pFo&*>7h!0U-u~sd8J|&$(hLGU+fm zi)U9Es4LN^F~N$}x|skNSY8f&>LMHFD(a5j3511!T70}UnR2xd8CtCT%YF;l7COhb zEkTt~6gl}GcshiJ-~b;FO+OKbtSmv>WxcsofJSJ-pLQqWYh*EO1@J>wFfu+1mGVPJ{tX>fmRC@?7SJC8Uao?!IX z<|Y^Vhj%7{{4k&_Ssd{H01&$1G#TeD zTO~udT2Vp4RV#l}8$(qZh;JgYL@1^NvLI1z$+(E1=!}{imR4$T)P}NR6(EDKRH{-d z09Stp_c`J!Dkt-%019gjkMy&IrA;SY`iM&Gp>yA>n66c3?PmV~QSQpN*EGY}07nag zXdMM#RB^;YjVvkePL2qTR;MWWt_XcdYfgvPKZwv(B0Ja|B0jytiaT7w9#j_Vi8hAy; z77$*0+wKj#09_Y`pb-ed@M9+UfJX24D}{uj{lJS$4b%_;OGCdTrYy7^Fc={pBM;XM zC1O<&-OQMbbyYPj6dw=q8&V@=9k1e52jD#t>b3ie8JyJr0H3Hr28i=z58SixG~rKN5y%fXVEK)}L#o;B=33mjSLznk9O8+uMLpD1 z$T_0eux&S3EUcq;r!WLJC@&;ia}ZPg{>;6%l58IgG=+>ShPN0JE%G4SYIeGs_y$D} zHbSC7i>;c^_Y?~T(kbga%vCB8g#Q4s@IeflYmafTZ<5r9k3Ym5>b4w(F?UhrU zh}{oO9wL&?jXXcU2bOG+#y{*r*eliG`HsQR(+$10g+CLc-<41+*=8<^4<3y1QJj z5rPIes{Fung?mi0S{=%BYT~~U znLsOWZ`prQE8QsQ{{UPFmM`tgyLB^;ZybCjk~S7$v0Aulzld_aJLZ+hEZx;g_)S)y zH;BYhx)X@BP)?1^vcWZk4nWZerR%}d;#n$7YM*h$vC(=|9iE*Fdq7Mvm;OJP zYJ$t+y~iRCJ_mIuL!lqke_^VP6%O+c19_BYkPKG_eq#bM^xL?AYC+rMbsNm4v1#L? zDwum{PKdVJEwADP1(j`xge%1={KubyA@$2BhRcxGnCk|E*nl&mJ|>jEBZeHww$0*J zi?fHgF-#0WDpF0csfBK433`tki*OE+fZz&;*c!0s#4!nU4R3?)%d*9*ruKhuffBAa zPwrZPwHN4$jbhFDcz|>Z!@rjVKyT%sm7#ZtRNJbDN@g;TAV_~=?xJ*o<^v+Th%5?f zGXzg;eT1gAF_fx`So=*j*EePPnP6LnTs6F`WVEt%{IA8M# ze1w3|&%_WdYD-^6KJ_q2jNVZc8%2og$ILDQXj@N+u|H+=5e6KN`a6v-6NtC<8pur9 zbT;2rEIOn6uU?}|6rUn)iOQy_p??uG3%Y#t!xl9%^Q0IA&(R&qGTW%J%(+sPQ}Jtu zpBoo~RCzJrhn%>bV8zA>n5Hcnw~7`7+-2YPIc2Z3<&P@;5D+h$^mdJKeSm*)s^Zq3 zJ|MFvXu&?{)LOcV2vxyC_ta$!Ois%{O40$)d_Z>D(m}hTbyrbfyx383#fPO_Oi^pf zz<4?VC<#lZSpY6NUvi6;rqZgAffEvg^vl%%9=r007efWAi8krnR@OW=$8{pv=fS1%WIcTR~pn_+JXs@0570jK9b#+V) ze&FuNbXEyyQmfd)P8Nn>**nfD_bZ;x;t_0mXoaHNY5Cj)uSgm+y`dPP8k&*B&wUt`oqLVKHyOG3l48+GW^tQIPml5U{i znN{?YBIh*h6N2Ez3khvB4ZO-gu~7-xh9QuzM7q`M8KJBDTqk_kxO4h5LV?k5_9EgT zRp|cU1$sAL37$pqSo=Y$!n15pHt`6hZC@C`&#C|KxuH&U?rsbVm)uQ6?Iu z+AvaFcQB06FfX@ktrlg!6K zY@d3RV@#by4&o%bUI>YMl;GxbAG8}&R|j#IIJ=qQe23y*)q*`?YBNUF3(LR62Fl9U zpK!`W=KlbqR2G}=DsJ2(Q=&W^Nzd8~ea8tF&7D%fT&i)C-csk0f-C zR4)r!(Dh#Dw<;L^C3amlHi zXj5Kg6_}1?*sv`*nTm@qI{F0s;Z_JYYzBkwabT{yVGFlu_`lSx018LR{Zu<^OI6H! zKd_g3G}fM@g|9Z;s9v~(3z(M}<(z5`WsV|74a8r#CqIbM#%cD2n(}StTfrLCU^jh@ z#450*QKq9rqR(;8977#fn2=n!iwhkGP-$wZ;sqlA0GNrZ$*G&HK)UuI$Ul?y2T-b# z^&JUb;9D^*IGt$=p!q+UcJm)E?pzNUy8hye(n}3w@ST^mrxOy;ax?=m6xa@ zfEp|a>dR>UcielMfW1re4vniFTNo)zpFTZ8zU8xJi_=o5VY*KnQv@Opx0N-jv?2dp-a4(|U zfB{Y5sZhQpmz}_XH_ODpa9b3o2KOnTZ^IOZOObn+#j|ta)li}|98OCX8cswP0F zVmgTN71!QBBn0|A7Frrqd=P1}Z1_v_OymxTDpy$6*pMp4BR62#WXy#{jbeI(3yUZfC zd6u>QaPcil+hKsv!m>971%6U#Z6c!Mk`&Gl5XReJvqaTYs#S${ z2R_H@4iQn^!iSk|c_rmYb8y1y4+Z_fykN?)xmFN-O9rdr6LC`yao57*gW_ji=?VOx zTtQ7aj4`%F;ScIM743ZE{fS9vLGv826mx1T5!_loGa{Mks%6;gC(N=PW@w9l;-T65)Zhc*!hc%ee4e+1IE8hmmgK zwlKW44Ph{E#474w<|XPYXk}bR8+sxf{yLOk;x>${*jpCy2E?T<5gWC*{{V3eOhVmm zJhNuo#0v;kU=q7=>K+2hEx+*!py1W&B8W;R3rDcTqTKSPA*M53)CUVqdVnr0vbjLG zl|wzi*w+65J$g(-c9D_cA97ID4Nr$3xx(RJOu%m1Z{ku^1r7Nt_b;a0-pqdz zz;aE(35je(3ThJ&Fa!Y@gZ%|eFM2-m^Ou4wDr7yi9@Tk4{lfG^@p6X5uf%XzXHCQi zf;lPsLQvIm$5iPqRxvaAiNavPh!@0d%Uj?|7P9R3FvmQ=BDu`Lh)|+`_7X@ zP+Th#V^M;(GZuM@&7%jHi=v!gDgm%XhmhyuJ1B{EbjKmUd^R`unE(W*P0m8`8Dv@q z!6MZ<2Lt3c8IwFqM2p1Bhp|iSo;n+lt*n?q+!rGZfq$4m z1zuvo+&Nb)6pv;i*Gk}b?s99WTb(%W1Az)2VhzeI6D$?(9!P@j+v_z9??o#~fK~=^ zQ+4yrY8$yGs}mi&CQ8YECRM5?DRIQy(AA&RxB%CyFNh)GiWSTQOfkR`C-dV!U!O4cEkJ!gCTFGxv$WvzYv^#ORqn+*M$iz8O*0 zNI9ucF4ts0tx8I#iLz|j1?Jffi&`+?<^t_5FoO6#qDu4xi#*v}5QT6Q0fk#z6Gzl>6*3>% zPz;xD6}~O%wRCSV9*YVZyiJltQKWHRAwm?bQq@Dq9&$=m zFVAx?Pf?T_ahZn96-P6}a3)-R2B_2Aqk4BJmf6E9M3#b~fY&2fVuWAq;$lp^QvrBC zhrnl&TgV!DAfn_O_=>JBiC`Y6f-#Hnm+mG3#$|FTm);5<1@je`3p$mI!7P_V#4O?| z4k`f0rZ|PaA~j99lMumgdSQmEO3-!&6D|o4h9TRc_`Hn1{;Gp$-U_wI8(_S+Yu>#8~xP;-McS3>rh@k*zNmNC? zQD`f?;;O%K2J1C&W2WPN(%7K;<;u5GUtZKgyRihdcQ!6U{ODz4$8^J8(aT^hi zF#?~6RelU;Vo_xIjaFi)5Vp&L*RAhyskMK^w)2x}JC%^M?EdC3X4dZLs?+Tt0ckTO4vrUnqPM z!Bzq#(^uCpLxX}UAW%hcF$$ssJTO+fr>R06E-cJBULsrkqP8ggz}Pq@ZZ!~6r-8Fzr)Q7RgWwbBG?4U5PSeqoznwXy|) z>Z|@@t;XpvW>i*}P4O@f5 zyiF;p{KqphxB|;~)Wp<6o9yad9(!{v6(v!*c%=sy3RMj9YJiN?qI4jGnZ2)qPFl$WKsi+vh#^*zw3_~E&x#Yi&Z_D z@iGZ<#p_yvn~)3ubDc{hEkIfMi#@ZGJKx@36Se3Rb%=5>3tJVA%(Lzi8WYV_t)YZu&qIl@~S1#Z<@Ut}W_Q=(Mtn461gT*{?WPb(!h z1&0pA7MTvAXRlr&4|037l47Ni{(1@t(%qL@d2 zF+%3bw|RiN!;}L2vdbl|!cH@SeWDTl8h_H+fo#-v+86%E zT*`O)mwC8yj%X}PaKl&nfz8g6j>s<1Tf|5?mI?uKbsj3GiSgR!14QPpr2=Q5C&W_}W5%E08{lnRN1iKo<$iF(8W98-CgTg)6rrbVs<#ctW23#`H^ zt=m&1g9ZEIQWpR~R@e0dp!f(5wIEk-PFDNN6sb)N$J7}< zGcgbSjf;br$u!EKw!}BoMi7p+SGY{w=(vEctWTI`*jnH~Z7vRGg??p#a<>4h%w@n8 zdzWc&Of%onZs5zNE5u4B8pa@#d#uN_(4*%0n4suHv4!@+jKMsR_hgteiKA8{4Qv#+ zv9kAjd`7Uh$l!W*#b8ri!n^Zp5``LfY_P1+JYfRM2pYa644w;?oxB$@;A=xK$w9S? zGL2@`oIzJi?16Quchoa8l>n!?R~RsHdtZaNAZROhbrc>VtYd=atb3XUoMS99sez)G zDFRtRYhr36d8E|86fqnqc8M7_wiG{K})u zHqQ|j$1#KkV_gTij{sWAhOKIn6l)8@nZJ3&xQB^7KhNG9p|3Lm!Z*xqi=BERAkGSn zn|DX3u`^Nc`-QPB@fH15#}N!LR#=6C+jFR9%gW7{@Igy9yI4z6O4W7ZJ5*&MK!p`C zm5?qA*nD=zS^+58tJVJDz$%xgK>q-D3dZ$`S?K02lywP@8Ri&Bn+7J;wB^6FwLWV3 zLy5IK&gqo_-9R%g$AWVE!~%|7{pA2W6x##D6`7_OT4yyGjt)t6D$L(7t$maR62Pik zzDP1F3k<31Q0kf0>M8=PE}Y+~dU14!XogA-PSW5@Re@I%uE?b;ZxJ}ZyrTQ+RL^qp zWqXEsuZhMp?q!16O)h0Ae8omPjCY7c#$c;7Ko!nq$PUJlwtMj_ISar>Ur=C8zo}Z% zK!mre{^h{PFw+-S6O9Ho`_Z zLoNsQ#tLo3wpPOv4J*&MmSWAhn0*S3!VF8Cqf8QrEC}}jqiuBuTiUg$r~yIc)LGb2 zm^*$YfxBC9l!D<6qvjw!%D5t&ORq3Tq` zRZ9evu1sU^88t%e8}<@{k!e@%((A;-1EF?(nI++y-V+NJprvPs!tH=4?mW0%*Yx5S z4ay7lnn`;p<_ndCt>-eDkxLx;h|5~|WkWP|nNw}N19bxo(0PlIWo_{>kn#)pfq{XU zNvV__B?V&I8$O^ymff59hAR}^GNOxky+-2JpAx)exz=Y&9&spXZ`%s1s^Q$TVY8wl z<_}q1MAI8En0mWEi!8xv&c+v1ZIS-sYzM+a%Ca{JOzKb@qT{o?3X0lO3u>MiDIXvQ zm=O!!et3jkEFDnNeqjpWzE?%ddb(l;s-pt793Ek1UBH0gF%YW{(&fw;IPP3>{^him zM4>S*g1U1mYqH)s{KcW50*tT%%AzuPzlfKE4US+!wVF}3HHi3DE>)-MDwwY|h~jqD zSt*Hf6J&nC7_iUYI%=)7ibEjT*Y!q-5MqmeF`b4LzuW{--)UT_wP+!#v^QQO+d8xw z_?3fWIK`x~HCO}7a-_Ng%tAaEDi#g_+FcxNi*XfIyN_&@RWh)%g~9<@-E|d*fh*_S zeo?y7td-!eyv&8U!Q7xAbe&WUZ&ljY{L6TT(&x@;CMbND-`e5|x-VzRjbj?4ADGC6P}Q8u1uq@J1T^P7 zF?OR#aUiE~#LrHCCO8{KYs|VH%7gZoPaNiN%&#GqF<2e}7YIyTDuwHD{xndgyv!(N zr3s^VuQIr=pk(z5Z}Q?9Q*n++?C$a&4aXtHw^u2-dX|KRTT!YQe%C8m4O77NII&{$ z@dPnm89`)CZf!*`)}b=qTK92M_AputYX1PdP4Gx^KRB2;hHWr3=dB~_+|{{RU5 z$E@!c$8cO69zt9_0|4kF$$jQ9jyQ&k7ZU~)!IJ{u=P^+muQ1@bSeGs@aPooNPzQqdX!`w zEwKJ2s;{Q#A-Tsi7w@@|M#~w3fR+KPyWwyEgLa|qD=t$vi|;TjXy4r}&3X)vjm698 zEP#6WnHgA0+q>a`hTe@0n8+u%Kbn;{iz)m?!4pjtE-sMljCylrdSP1dTrVs}WZ5I5$iLBtgOV~_D!L%habgKD}AlI2dHttq{_+k<3b;?qtl#QaeY$K@U z{X};Y#3Je0DU5~tPY{7N74Sd+#gV39O_jB_GKF}&w+OJgtAMo;Z5jJXaiYK<`bI3A z-DR9hJC%bSH4=AGVe>h<5UbVq1QbQk&KB+J9?G;iR%;MIL&XyKh{5G89B_vZ3Kbr2 zpE31IkZ1e2ASiI0Lsh7;l<9hBP~et(h+$S@iTfN(7%BVQ3aWu^Xw%d;DWkiLy&&#c zc#dkO6+5dxc*=lXlJTy~My65g#0n08vG-i28EtIDi{oPtm?^8_v-1!(5ms&d#njl! zxOfXXG5U$vxvNS&++@@d zRWt!F^8LzSrQqqq^hBZFA80DVh3aHB{lXe~M$*mX)C5+Hdn)}vtg0(q$34S6%Nb^) zI+ZHr>R=UuTk2v#XeMeTV3>rk>fAa3I6+g=OSZo?+<|yH$*S-I?PX$NJAjtFo+h0 z{P!#XhdG#5>av%JyN4;v0OZUd&xjd%Rn({o%7nw&+Xbr})_)VAJ!)A+>z*c3%kDS? zPCtou(@y$>fiv4z5P$^a!k_$=y{uNIV%tkiH>lVG1QHuuN{#!eRq7G8`nkdy=Q8`R zi9xrU<^quEbUNs#tHBeo4nLOh&@!~hhk`+QCNz(N~c)#wZIljZFy(0-hy?!u_FGmUA}E zkr3W}h5SR%3&ghL(inybzwuDjuEP24fnms`RQ&~Gp)${B7q3Sk=!$5hj^^&0IT8mWR?Oe}ybomCor;=rZwsE~px zuj)_+N-l%>C0+7t+55yzVX=9%FLWcc0=Tw*1VKbaf0fLOPof zTt>wTPCZJg%Y>x<=2bB4Esk=R!m3$(RzH?~<}9+r3ixg@ZZFN$GZ;V1n&R6-c#MF_ z_?LjEfj7V|y+9GoUEEh^oeF(Mi0MnS)N5N}6Ii)GRm+Q<#Ia`2tGGofJ|NY>0XiO` zDr&MuEtNjrrs~V+C3@U$SU*s0M)``>A2H1VExDM@E=E&p6knDII?|J>X3B2*A|*={ zo%}+D?eM6UOTRM)Gb?+ntd;}JTJsDG1A$OHec}dt%r~0|Fhr-ce7lO$4X7Y$YFn7D z+=Xi6hx)C`!+7Ea%b{HUWp*q$w(|r`Z_n_F&`(;Fg^^v**vz7v=31djnlN(4p$-`J z9f0|d3n(Zdg?>Mfe;RtlDB3f&OjuQQz*H&HB? zwYHrRC{l{xKe*Of8@t^`wr%T}VmKULV_2-qlMyNmFjQ5Rj-ZTzuQ3p+Iwfl_aICz{ zveX^~M-HakmPA_GGEK@+&SO6U3@heXs+Cv7NP07Hk^xq^vJvX(r*33Xo)40mh(LShxe7u3n1aH1KYgv#G6G%h%MgPPliQOqseTSlex zDOFnAbj(!m%K(jJ!M8AQDNVe}14deawpPX=HG#xK)Q-0b$oUwwJC#aW!Ki&TjXcbk z(x=e@0#qI)(5$jFl>N$9IHV9K!3nF}HM*`PX?yW4fN_W&&h$Y-7VfwqHCD4}-Esc_ zVCRJ}UQwh{S{3{86fc5}{7lm(LJIxjrYzf!=5KT2RTeq8?bK0+ZxGjlZdwfr)k+!T zQKoagB3jsWYrf&HEE~&+%vN)#m@jgO!lm<_dzI-7DrFXJ;{6R0>48 zI>A-AQUy4!W<%5rMvGPTPDmS2>)-Lc(ATG~|@3eTw0 zSkAJFI^~Y(c_3=47uh#M z05WpJR88?II2nYyzF>m#tvnvMf^h5$w1%B17fNGVl9pYq`E#~2n#wullDa( ze85&&lrFqQQu~I`m9p#EPGG+XhIjUu3zsmois(UZZlYBjhY;3W$5j2IR9JUSOv~h6 z8pH~#$>soLUhZUfS9OLbW0O!?g=QNdv_0nzGM!zVQt zyufD(UM5!4UwL(06)$j|Z5&bTm5QuJs@qo)gRzDXTNTW%IgFx8`9MJwF;nSU;#_D( zDwS8!ca$ti3haPIvZ36v)iZrhx@hf&a4^xgFzDE{HJ{>JP?pz@j-x=JumdT-%L5{c zo67vfl1rB(dLcAxd2}5-VE#kV>Fx;o2K@ox<+zV#|~D6dayn90gW2KUz)@JCyd^KVBWUJC;gSvr>i?Vp0(6=w#IK zK}?d3A4Gg&QyG~060^Q9486@hW-(P;2XDkOzZ#ohr-%x-$8hZoH=dyixfY;7rb}yQ zn2Mk=zGW=9CVY1YOhXM+IvNf#I*2EdWv$BXp~PjX(n8wlm1TOB)%-(YYYL@Ctp1^4 z37qo~O~PpRnU=^R(;Yx}w~4Aj*o5aN2bo1$%Ar6^Y3>D5ucGjtAtNWgqoSi7#AmA5 zo%IS*>e}tp!AB){m$QI(FrfK|Cc!2TaS9T|r{Vy$R3<_-iETPFD4U#+Fglh?DG*%~ z7nGsyP)h|&(3OP7pbCm!3_a+_P*esXEVzgkrcnOz3UNU!27-5(CFv(qnP9z=)~Q0| zc232KR)W%-y!wHwTNJDeN6{)VTyVquMK-b8SBu=e(K>+JhG$f`UhY)^lD8c|y2|x6 z1YF@!3zD*(&728OjHqaq0n`e;uS~RnBppi zM`w75VwS!OCh(&AUZol;ik+Lp7%tRubJQ<1r}Z7jmoW>}2)MjN$V8$Tms)Scy~jJ0 z`IF5=$0QIXVjW@uQ!ZiA1x00y>1y4|US&xu36IgUG-gv-g6)C@+^ue)QK^wByvt@! zq=EE55`!v_aB!*h>UxTUFB ztCt|$axt>jw%au3fJI?;(tvIX1O-XMEJrBC=f4m<=Sr;(BT=bCC@(kojZ>dHI4YG1e)GdOvdmXsNU zEX$QL;w+I$J4=rcp5_VjEvv-1X3wNUKjt-K5`kYarUTO$yFQ7KM9!dY4s!OyaKsm3 zhyle*puAL~9kEix3j(XN3&EVy*l@au1+ieLA{Ie_!IokxLur;(=Qk<9#X{MmbIeqx z?AGQy<4|;7d>fUiS=3}GdraiI*se$g?bSjAkyn#Y4Mos;ggOlyYGhi@`<4u0m^)qx zOhZaH97Tgp<^GTv;1HBD)C5N&7#$+q7Z){3eG;IATuJ``#RCqrl;Rb$E}&juW@QBg zA)s|J&cqiiwJemujUjZKWl5psfqXFMiAF77XQ%*ZJVaKj%%ij+jOYEz=yJ@q#X_O8 zGXS=yB}E{}q&08dK`K^kY&ef@uoQI6&>Wk5!ix9%mRU1(m_gn3tbZSnl7nx8qVLP5TO7wGr_2hJ3uwQZ>SyLCoZ5SL)v9B{ve{7 zeuN=v);%>*LMjdP`OId4*nS@}#1f;E=5EP(R%aThW{&Y34KuHy;4S_`AB#x1KL0bNRkaKur!Ge&XL z116^lUgdd1+#ej4%l#6$`%BziIYtI{#Fk)hOT@IXsGInRG8Td_xsEctk%0>#d4xya zv?g}t#xGV&R4keU*T;~`zLEW*03zTH&fuhe4>fF})nNWJW4rU-fGbh|zwV3lB zj)!3`6w1rVFk#PgLQeA$ho3PEh~tC)$~r8x#xXW#S#Oxshf^iZhuTta06by;0Ku^? zM3s<31ysc{`Z;s-TN;dLibM3o>Rcg1Gax8MsZm)BekK#t8wSK94sfewS@6WjMvfXZ4iBRhD zN=Fe#WDJe>DFABbjQ({!Y0nX0ufSXru~xr$;qn6zjPNXG(fyCR4J;g%*YPMDjW^sC zopmWy)DS7M9ZcNgI(ESVFQzqNuW<=dg{f#9!sYc1jYlgt2N<}xhRX9Eh>2UKeTx48 z;(}5k!_-7tjx0)7(UruyN61DEPYg)0%)p{irxB!7djfpKw!Cf~9PuowSyyZgjEZ6@ zks?-)1|~yjTbQhZZ94Ie;Oc#-ZWO!*q82c5P*Fm>OA*af0v|BePPK-h!;-eWLGsqd zpAnUd)-@D8iMy`Ijmr3j;Y&4hO8ha|yE%u1n|OPO*FCsCA%G*GCJhe7L4XXQ4Fh`5 zEGCCzre_rSGnuYfIu$ZC35NY{a)IJF!~$1YgXC-O@X@!Dat9s@ENjs>-P+G9ZLrD)GrpTjVy9fbG=#?!f z;O+z+vueSa7sf6bBIi<@iiMIQ>3{IVRptKx;nG&+K{HPz*ELOFMNMK>`WQB z?NNFn5jc)ubxg`tS|b7PiO+b%Q<4O_tJ?`1Yfd*16etW3Jsjtl*dLS;3v2#F;Jk+K zxX4>zL3Wmcw?E^N7B9tMSWB$SK|-}MoK`AW&T*KqZJcsNK`UUDP<1G2yOn?j&|4a1 zMQ;Q8mQ3Eu;w5cqrYB4yU(9xx{YtCLEAPotz|*z))VQ#eAh&c%Xe!k*$@d&YP!uz1 zuAQk0ped+2R&~X}Yh#;~908$?0OdKYl}&LOrg`UT z5c(5{YnTX$(7+a@jrRjk0#J%`2+M>kJkEaIG1>d32Lfg&)GQAYz}Zp3Y;mRgl;j$U z93Dmymif4`1KArIR}8Ug^C6C5W3n`r+m~~ctP5W-Oa#Rv2~~b$K)tRNFv%)ROxqoR zj0Xg?vFB2ln>u5R=`98Lp3xo0JVD5y)y%8F!mYk4bpUym3E?dE51-~DuCe1W-Dsv{ zoH?jUR(GxFtr6)I`OwRU-ju1|2p;6B6u0Gdf~W(BAkT;o$xnCf7F zqlkNjAPvm{o=J7Mx}_~c^a~IKt=Rw#;NWApFV9hmWzcyd4G*Kl4LN{ynP|=TW~G`x zGP>|*F_DEh#Io~+#1op?@c@Ex)EH=LrFf>2wK2WUIGjWX0)8S2!|3C7=Sf6m$`#fb0(0k*QU?lt`V> zuZgt^+CxpPaS#~X;nPe(4&*Q}78X`2p^fL}5p%=T<}%FF)BvWXEOn@nZP}b#9Y?>V zeHAgRj|+i>mnI^m(*ziUY%Ws!irJ6e0FbJ2x+vsL@hHKAILbf=7;idr& zOvDddolL4x>M%DHDx%FWP*fb}i0ZcpcDmG3ntot$!jwj71f&3jO6{m9#}fDjcEN(h zs@pbWp5bFivSelpy zt8(fTg8OBI)H^Vg<^hTr1&2nZLHs7g-_yP(kTDnlG|LS|IeJ_Jhz=$a!l{9x4rq*# zEqs#Pny4N(0I*mQbjt&Kmm0Z=#MgwZXmyA;0UkypVi~}Jcd_A*M&`9ImTo2kdwP_Q zE$0#GAR8Lj$GCyZDePshv|xIG`7tSdKrsS#wMwR7LZEjmo&=>WtPISwnuw}6$0n{) zk^s@rHuk`r<9c?>gC{b|)mp2B0*%#efLg#-4iIrM&2ZFkN{MW`=frl%W%C-dx+TOg zLMT3B)Op5Y*{WfkvinHmxG6zMw=*QPDq#wl^(hzhMxe$a=A!8=p%BN2DFBcG%&3O} zT?kg8iD9{(OBk$1hf@eC}THlqi{^(5Z{BzD8oHP zDE-7}@9!Ofj$;hZ zi#}R}o%JX++h$KkxX`$iI8cxX4DuYR-Uo|lulHU-r zK3kaV3aaWj=V}Nn?aJ+eLvTf&1U1R?5ZWG&W!Bc>9hq}O6~A2&0dQKx5MmV=jed~C z9wc3+E1gP~8QU-r#^KT01$~%S->-WXEKHbcEDT~Nmt;69e|Z@h`^wv6ptwhP*p;`m?R5w8j1rF z^u*u`tSkcfMxv>(D=`)uytT|QZA?L1M{^3ajImZP%n)hRMjseVdmYzNb9h}wdo+!a zp7m0MQgTEIRf}{*%d+O;MMvDAggJg8D2C6Zqzabhf($?eBAldZ^$ZJQ9cpIt2e>i? zl-&}w30fo^?W%2#ml!jPB@L8WZNpBT674eB*)O1mY+hom`6})qpjSl6)}1^`-v(uP zbuOmHh{Gk;Hx@VZ1v+`=Tglyo6;e<2a~#6K#E~kNd_Jm*&6W#Q`@;CWvSejfHyn_A zE(OBcfn1#?V=S;LaJVMa_?Gxe$uDrht1>~VEBSzNeGx@p#2_=WH33_VOJ%8QU#~MU zV`r2C{TqAn7Aq}jy6gV{o0l|9(o}@NOc9K)rF=@U6)_%jC}SlYFl`u9Z_w2Q&_j<~R#5t})!WAos%pjT&s`TqrH(0ZUxf!I;t4FhPwD z;L>b!0no*hAZQ?2jbgOX3Nl zsstb$)?YBJR_joN5A>7@`#Oj%K*gI|(KWKLbdelc&s)9Az%zdCAd{%Y%yCG`e_m9V{)iYv7d_Tive&QY5-KJjM$x zs;*#)E(V%23?Kd|6ww?+t(S&n#KRXkj|jIGEH?^V%`xZctAbKLig_g`DbLI#8VZ?5 zDB+0!te45i_ZdRvwbze`Dqd>FaRL7TpJ|fHb8wu%$$Uy=%UOVQ2G1~EGOWhpyC)GK zXs#QGA9giY?s5W9HV&!>JsV5PY}~6V+~zNLjjUs2HYq@GLY=`l9T2M~IgOdFO-xwF z?k+&jnLtAD0vYWB@Ed@vgUr$jVetsMqNP2xjY2?aT=N+tf-WUD@7$|O#PlKt$f)FV zi&J$IW|nT!Zjb)}6$h9neMLa1*CmxKB|4Ajs(B>~Jd&Aa(UvSA&H?4_4|gVANR7SA zdxDtjaNnZMv*>tbzOKOOnN4(zP2pGLe~4_b8kcA-)*!3G<@f64v>HQll)GKrucOUN z)X}iN^~CI{q0gpdQkY>g_Lr%w)vyRfyfC1A_bLuYo0)|r%rs*RuH^*{xq+BD0=C6LJVMZ2g@(pMvn$+1 zdK?LX?g+@cPFRi>9!MoEEiDa$4y%?+zxjNseWC;7h{-i^iWXcMgyreIs zj-tX0g~C<3%)MlmI%2A6W6ezJ{Y*mjn%ncpp3DTX{{VF!gtO}MN`{#Z$R`NtHedA+ z-6?E{7`L8@n_(*+=Mh3Xm8>pPIN8*?C6rZF!Hc!DG2`2J&mJOC$e7RfDywzd1ITb( z6R~Ad<{~K!+lx;z1xpTbmMX9WId(%aCF$yG8=_iQobxglYoU&v67zMa+m)B%TB1F~ zKs4tQ4wS;KY?PoEs1z>8RWJ?cr&7|3V|xDpu%#%-w>E^BAw!8w3=hU>(jimu>lnGQ;Vqm3<`4IG9E`WLar;jr_z`RjKyUghB$f z^AHuzW}n7~55vUD=(l32CGRG>n>ZUC=tCBVwRykJMQN~q*D67aOO zx0#SIh5KMp8yFcr@#rC;<_fUNrLw$6$*sT->I)JKHILl6ve-L|qStto0CLM>8YO1c z72&>lmSJhks?L1sQlR$59Dz_fs`dkM3T5J4a0f3jgzDkDs&E`YYJ<3;4Fhax5pI>l zBpixHQqm*!Gk-X&gNxNM|>pmaroeZTqq+4i_al*-}^9q4wHVWq>&b$?40 z)Odic8-rcp9%nJf0iO&(h7TD(VpkNT!<`AHugMYYSa@9`! z%TCJL-{Kjp42*4H!?dglcKM1_>5-^_Sy|LU0KPLARn7h&P@{CGQP2%$^SDL;y!s%a zXsZV@^}r~&$P28^*tU(A)zQ*l%jOdXT+BgZ#9lBzF+pX(6TZa2dvHn%yME>b8jr-| zan?dmDf-;LV6RL#my)xINT1k9kU*D_m=~fArVDp zietPp+GFl_4@M33{_`-6Q0q7On3^hOTYNv*L{{T|L zv5VZnPBY>d<#hYTq{iOhHe$Mo*sF<3QSrFNhmPRT?TThoLu33*#mThl40#M@Fv4Kh zF$}2B;%Ilhvfc9=Ga-X`-2HKVEeL0vO_$-=?<79Os@GmY==ampi#pIh(#}+?m5N0 z%)0saFJ$NMH6}*GrVQj8M@4lMcuNg9#dUePzagey=@73b- zA)>Nh+Ab8LE3sW}1jl)CGrtPJ78~&qqjp%^1^!GtMBJ|Gp#;S=JDn)zx`=@P0C6~k z&?aFT3aFV@Wp)}>pSdWQ^LmuU+53cgfjLek%giZP2i$BLOJ*J*H7?-baj3%L%TdLJVTBenC0zbKiF7Fo0s5m!p z90XIy{_EXU)xRTdh{oAPrJL4NvtaSp0k zky=lgixm40&Y($D{(AmlQi6rIeRg5_lrvjZ{0ynIS-qKdMgqo0W9Zdd=#_)exSLV% zK)-TdV+6ZO#}f5W28*u}=OV}=K2iu!9F_Le+yJnuh5%Hm?uW}RRqX!&Qq@PkjI=Mq z7chUAYCP^Gf(~3{GO$?8go$QD!D*+?;!s=MX{^^(X zVvKL%T#W;R`GC^K^_f}Qz6o98Ru*0*8TQJ9zHf5*ZnoU4UmX(ZqGX1^UkJBb4Zx$^ zw*xFhip_BKDuCZc-|AJGJQAQ+#7G)?O?3gOc)8*Ei>Y?v4l^&fCTkO^hn^s%4~bMi zWU=-`8%6pEu*2?Mx`DO4B4cq=0I8}UR79jVl z8Liy0MR$%NCm^n86Pdj6C=eRLGJ?16S#0gBOK5U&m`9wd-BTRtZxlpiRf;8T0KMu5 zJG;2ZjyH;yUs41J+>SY#~Fhpq&>O zGwfiDoSCF^7MQm;a9lw`Eqj?I_XhPb;S9#en?Bt7lufGWuf#wX4{g34AcJ0$`ajG^ z;ng<_RmK%o`#r-oxXsl4l8CYxXb1ZrXryQxC~B`KPYfw4!w3;fA^{52;}B_sUZt$+I-j_O zh67q2%n^zRXP0*zVm2d*Z1kyqCUH=1bkq%bhl~TGZ}BZ^gvR&ll*Nq9v}?caOO}U+ z?K0yWf4_)LkC4BsQn-DBMKOm0`;^Nh(s6hAWx&=4 z4ZuN#e`zUG$Q+OW2bTmU)pQD$^)L!NN2N{gGNl!r-OG%hbmTn^M*uXXiHy7%$KohW z_D!Pg@3vaRazmj@+zh?MVS&smt+%KGr5@fPxkv?^aZwd+xP-8c9v&GbFy1iEsJNz(#;g$P5jO6p?Uo1{7rHu9X}jI#t>&7eZba0 z_%Gy{K}%EQ)0ks;G(BB@k_8!zs)tXAD_scSLnvu%tNy6`%`_sTn$zsd<~&*@#py8a z2ZcUQ)spVpX?k}mA;YKI2ssIL2ww}(qsqXg22+MVNU8jn_cl4;sY0@S&ay0Rn682p zDQvY1v=;GfKp`vpNTn4=K?aw;iFMUH#0D@&5A>IA-Lpxd1Np;Lph@ z_n_w4U(^i_#|HLa?3CR^8x`lthykL~-^t1-PvlZGm4op7M@mA9-VeHr)geo#*{>6k zpOOCnvBF&yY}o+xek{^E7xak=V8%^B9n2g@zjFnjiC%XZ@w}^D8>ou|THM?<#Y31X z?}>*u=gbgZh)oy9iHz#6GbpB&d`-i^s()xP5dv5tSJA&Xi$^_lbxBWn+TH1zE4lm^P_UIy2O;SspfiBIfe#e-f2#W8oGpcglYd&~GCE z2J>auxm%O2h~soy8q|OTVIy;nE_xsmMh#+ygR>TZ)z3OS1Ji{YIS3xre!I zG^XlgV=TEjN_ind)lW+%BYu_sU&IVD8!2CB;uOPF?-%~u#$}H(ejG<)0{1e&B?O~- zZTMgSrbRvJ{4kWDAiueke2L-U2+IP2FHD{+jD&0-<->?F1Kh%JN0AY_& zToRiVP}R!30YI_WRhGrq%QB6pYrOY4D;3Ags>VGZ=ZF<&$jSNo1%X-N+cck^XWFI3 zTF01GA%R7a>>_-}oWo8fVqNATn~#DX;*rLSi!EklGl@z!h||or`GJeR z)k*@cFCpd`VIwxG{zX59fKWi25@3siR)5kHxE-i`IU$Rq;S`R1mOPU3!*59I{K}9+T<_FU_&HY3dS5#3(%$b!{yILF|XWo3(WW14?#HgO1G-XKcUX84sdhbAWCVAS=Q(F`GNvd*CKKND?k zrPM3t2Z)Z@gUJMSj$pd{#p{`T5j%6K-77Tp2JRclF1Jt|H7K+|KSCX1tlp*H!*B^L z&7ZR|)D}8H{merBmHy2^Q7sB+p$>HX#7<4wZ`{PT3K0|l`7;TJBf(fS{zy<-?ayEE zmM$P&1H@PxK3~cLqO7g;$%i|G!>d213`V6FdWukO&^#QJ?h{Y-_$LyjDm;Hti&4-D zGGT_P#Y>`6%6=6t2H{}}C!8_pqi)5-xEnQRmWkYBi^1?g z=5=)vfEDu{$zc7!xS@w68D-^MWkEWatJC6bySOf3mf^37Ma28D9YZ^VUojm-Pq`96 ztBCoIAAVrll5{6P-?>Ja?i_1Iqk;1BK@^>ZW+cn3P@nHpAo(fzBY7&SvLD>L$)0sy zf3jM|Si-vh0E|OI-rNZVRIER?VQ3aYB_MyK!9=te43-%SBg2X8V#|I>S~9Dm_;D1{ zj;*}3{wKKB@n7x(A(98+d_w|gmuCJ+M<40;D6FX=$jK;`(?!!&Qy^MK`I0TN0lk%G zOp(RUkbRqlvXcU=Urbo3RRmS}i3K;gw7ZnwLc_|`w+FL;93{Z91C}bgYpBsuXQS{$ zCC}JB?S~SCHR6xlXe@>neNzynp3m`Zh%m$b9J6x*%IlZliM*cGwq-)?nkMC9sMX4` z%pZi<#X)kR5>uN~oA)i0Sec3DCv*JFGm6Z&oyOOBoHEOCh@`$?{pBkh%&B6ziN^~J zHJ)H+SmsfkN77VP&PegEFw7{kjC?ZDy4EZG#0Hr~@Ynlr4og(wVEi;s_Yh%q+mrtQ zAH=z_Y|S1&sJ#wsfUpM{DIT(wdkAE3f22dSH<`E`^d+%plNx|OHnZ%@h?=ub9p*4D z5%HI2;!sM$yWzwM0h<9Ba%x*)p}KztbOF!vLQK-`XqyXWo<>oi9?+!%{{Squq`@)| zokdYD!T#8vkxTo$eW7y<-F{ttp=7gfN5-M9djpSCT;itr6!Q<_;eYa#oL9lRc4zSe zfXB-=e=1.5.1'): + print(textwrap.dedent(""" + Warning: Functions that return numpy arrays need Numpy (>= v1.5.1) installed! + You can install numpy and then run this setup again: + $ pip install numpy + """), file=sys.stderr) + setup( name='dlib', version=read_version(), diff --git a/tools/python/CMakeLists.txt b/tools/python/CMakeLists.txt index f47eadf54..ad5b26170 100644 --- a/tools/python/CMakeLists.txt +++ b/tools/python/CMakeLists.txt @@ -8,6 +8,22 @@ add_definitions(-DDLIB_NO_ABORT_ON_2ND_FATAL_ERROR) include(../../dlib/cmake_utils/add_python_module) +# Test for numpy +FIND_PACKAGE(PythonInterp) +IF(PYTHONINTERP_FOUND) + EXECUTE_PROCESS( COMMAND ${PYTHON_EXECUTABLE} -c "import numpy" OUTPUT_QUIET ERROR_QUIET RESULT_VARIABLE NUMPYRC) + IF(NUMPYRC EQUAL 1) + MESSAGE(WARNING "Numpy not found. Functions that return numpy arrays will throw exceptions!") + ELSE(NUMPYRC EQUAL 1) + MESSAGE(STATUS "Found Python with installed numpy package") + EXECUTE_PROCESS( COMMAND ${PYTHON_EXECUTABLE} -c "import sys; from numpy import get_include; sys.stdout.write(get_include())" OUTPUT_VARIABLE NUMPY_INCLUDE_PATH) + MESSAGE(STATUS "Numpy include path '${NUMPY_INCLUDE_PATH}'") + include_directories(${NUMPY_INCLUDE_PATH}) + ENDIF(NUMPYRC EQUAL 1) +ELSE(PYTHONINTERP_FOUND) + MESSAGE(FATAL_ERROR "Could not find Python interpreter") +ENDIF(PYTHONINTERP_FOUND) + add_definitions(-DDLIB_VERSION=${DLIB_VERSION}) # Tell cmake to compile all these cpp files into a dlib python module. @@ -33,6 +49,17 @@ set(python_srcs src/global_optimization.cpp ) +# Only add the Numpy returning functions if Numpy is present +IF(NUMPYRC EQUAL 1) + list(APPEND python_srcs src/numpy_returns_stub.cpp) +ELSE(NUMPYRC EQUAL 1) + list(APPEND python_srcs src/numpy_returns.cpp) +ENDIF(NUMPYRC EQUAL 1) + +if(NOT ${DLIB_NO_GUI_SUPPORT}) + list(APPEND python_srcs src/gui.cpp) +endif(NOT ${DLIB_NO_GUI_SUPPORT}) + # Only add the GUI module if requested if(NOT ${DLIB_NO_GUI_SUPPORT}) list(APPEND python_srcs src/gui.cpp) diff --git a/tools/python/src/dlib.cpp b/tools/python/src/dlib.cpp index 784b0ac7e..42f84a919 100644 --- a/tools/python/src/dlib.cpp +++ b/tools/python/src/dlib.cpp @@ -21,6 +21,7 @@ void bind_correlation_tracker(); void bind_face_recognition(); void bind_cnn_face_detection(); void bind_global_optimization(); +void bind_numpy_returns(); #ifndef DLIB_NO_GUI_SUPPORT void bind_gui(); @@ -55,6 +56,7 @@ BOOST_PYTHON_MODULE(dlib) bind_face_recognition(); bind_cnn_face_detection(); bind_global_optimization(); + bind_numpy_returns(); #ifndef DLIB_NO_GUI_SUPPORT bind_gui(); #endif diff --git a/tools/python/src/face_recognition.cpp b/tools/python/src/face_recognition.cpp index e93e2ae4c..1d1e5bebe 100644 --- a/tools/python/src/face_recognition.cpp +++ b/tools/python/src/face_recognition.cpp @@ -209,76 +209,6 @@ void save_face_chip ( BOOST_PYTHON_FUNCTION_OVERLOADS(save_face_chip_with_defaults, save_face_chip, 3, 5) BOOST_PYTHON_FUNCTION_OVERLOADS(save_face_chips_with_defaults, save_face_chips, 3, 5) -// ---------------------------------------------------------------------------------------- - -boost::python::list get_face_chips ( - object img, - const std::vector& faces, - size_t size = 150, - float padding = 0.25 -) -{ - if (!is_rgb_python_image(img)) - throw dlib::error("Unsupported image type, must be RGB image."); - - if (faces.size() < 1) { - throw dlib::error("No face were specified in the faces array."); - } - - boost::python::list chips_list; - - std::vector dets; - for (auto& f : faces) - dets.push_back(get_face_chip_details(f, size, padding)); - dlib::array> face_chips; - extract_image_chips(numpy_rgb_image(img), dets, face_chips); - - for (auto& chip : face_chips) - { - boost::python::list img; - - for(size_t row=0; row faces(1, face); - boost::python::list result = get_face_chips(img, faces, size, padding); - size_t num_images = boost::python::len(result); - if(num_images == 1) { - return boost::python::extract(result[0]); - } else { - throw dlib::error("No face chips found!"); - } -} - -BOOST_PYTHON_FUNCTION_OVERLOADS(get_face_chip_with_defaults, get_face_chip, 2, 4) -BOOST_PYTHON_FUNCTION_OVERLOADS(get_face_chips_with_defaults, get_face_chips, 2, 4) - - -// ---------------------------------------------------------------------------------------- - void bind_face_recognition() { using boost::python::arg; @@ -302,14 +232,6 @@ void bind_face_recognition() "Takes an image and a full_object_detections object that reference faces in that image and saves the faces with the specified file name prefix. The faces will be rotated upright and scaled to 150x150 pixels or with the optional specified size and padding.", (arg("img"), arg("faces"), arg("chip_filename"), arg("size"), arg("padding")) )); - def("get_face_chip", &get_face_chip, get_face_chip_with_defaults( - "Takes an image and a full_object_detection that references a face in that image and returns the face as a list of lists representing the image. The face will be rotated upright and scaled to 150x150 pixels or with the optional specified size and padding.", - (arg("img"), arg("face"), arg("size"), arg("padding")) - )); - def("get_face_chips", &get_face_chips, get_face_chips_with_defaults( - "Takes an image and a full_object_detections object that reference faces in that image and returns the faces as a list of list of lists representing the image. The faces will be rotated upright and scaled to 150x150 pixels or with the optional specified size and padding.", - (arg("img"), arg("faces"), arg("size"), arg("padding")) - )); def("chinese_whispers_clustering", &chinese_whispers_clustering, (arg("descriptors"), arg("threshold")), "Takes a list of descriptors and returns a list that contains a label for each descriptor. Clustering is done using dlib::chinese_whispers." ); diff --git a/tools/python/src/image.cpp b/tools/python/src/image.cpp index 97a1ee389..76ad126f5 100644 --- a/tools/python/src/image.cpp +++ b/tools/python/src/image.cpp @@ -1,6 +1,7 @@ #include #include #include "dlib/pixel.h" +#include using namespace dlib; using namespace std; @@ -25,10 +26,10 @@ string print_rgb_pixel_repr(const rgb_pixel& p) } // ---------------------------------------------------------------------------------------- + void bind_image_classes() { using boost::python::arg; - class_("rgb_pixel") .def(init( (arg("red"),arg("green"),arg("blue")) )) .def("__str__", &print_rgb_pixel_str) diff --git a/tools/python/src/numpy_returns.cpp b/tools/python/src/numpy_returns.cpp new file mode 100644 index 000000000..cd586d1e0 --- /dev/null +++ b/tools/python/src/numpy_returns.cpp @@ -0,0 +1,149 @@ +#include +#include +#include "dlib/pixel.h" +#include + +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include + +dlib::rand rnd_jitter; + +using namespace dlib; +using namespace std; +using namespace boost::python; + +// ---------------------------------------------------------------------------------------- + +boost::python::list get_jitter_images(object img, size_t num_jitters = 1, bool disturb_colors = false) +{ + if (!is_rgb_python_image(img)) + throw dlib::error("Unsupported image type, must be RGB image."); + + // Convert the image to matrix for processing + matrix img_mat; + assign_image(img_mat, numpy_rgb_image(img)); + + // The top level list (containing 1 or more images) to return to python + boost::python::list jitter_list; + + size_t rows = num_rows(img_mat); + size_t cols = num_columns(img_mat); + + // Size of the numpy array + npy_intp dims[3] = { num_rows(img_mat), num_columns(img_mat), 3}; + + for (int i = 0; i < num_jitters; ++i) { + // Get a jittered crop + matrix crop = dlib::jitter_image(img_mat, rnd_jitter); + // If required disturb colors of the image + if(disturb_colors) + dlib::disturb_colors(crop, rnd_jitter); + + PyObject *arr = PyArray_SimpleNew(3, dims, NPY_UINT8); + npy_uint8 *outdata = (npy_uint8 *) PyArray_DATA((PyArrayObject*) arr); + memcpy(outdata, image_data(crop), rows * width_step(crop)); + + boost::python::handle<> handle(arr); + // Append image to jittered image list + jitter_list.append(object(handle)); + } + + return jitter_list; +} + +BOOST_PYTHON_FUNCTION_OVERLOADS(get_jitter_images_with_defaults, get_jitter_images, 1, 3) + +// ---------------------------------------------------------------------------------------- + +boost::python::list get_face_chips ( + object img, + const std::vector& faces, + size_t size = 150, + float padding = 0.25 +) +{ + if (!is_rgb_python_image(img)) + throw dlib::error("Unsupported image type, must be RGB image."); + + if (faces.size() < 1) { + throw dlib::error("No face were specified in the faces array."); + } + + boost::python::list chips_list; + + std::vector dets; + for (auto& f : faces) + dets.push_back(get_face_chip_details(f, size, padding)); + dlib::array> face_chips; + extract_image_chips(numpy_rgb_image(img), dets, face_chips); + + npy_intp rows = size; + npy_intp cols = size; + + // Size of the numpy array + npy_intp dims[3] = { rows, cols, 3}; + + for (auto& chip : face_chips) + { + PyObject *arr = PyArray_SimpleNew(3, dims, NPY_UINT8); + npy_uint8 *outdata = (npy_uint8 *) PyArray_DATA((PyArrayObject*) arr); + memcpy(outdata, image_data(chip), rows * width_step(chip)); + boost::python::handle<> handle(arr); + + // Append image to chips list + chips_list.append(object(handle)); + } + return chips_list; +} + +object get_face_chip ( + object img, + const full_object_detection& face, + size_t size = 150, + float padding = 0.25 +) +{ + if (!is_rgb_python_image(img)) + throw dlib::error("Unsupported image type, must be RGB image."); + + matrix chip; + extract_image_chip(numpy_rgb_image(img), get_face_chip_details(face, size, padding), chip); + + // Size of the numpy array + npy_intp dims[3] = { num_rows(chip), num_columns(chip), 3}; + + PyObject *arr = PyArray_SimpleNew(3, dims, NPY_UINT8); + npy_uint8 *outdata = (npy_uint8 *) PyArray_DATA((PyArrayObject *) arr); + memcpy(outdata, image_data(chip), num_rows(chip) * width_step(chip)); + boost::python::handle<> handle(arr); + return object(handle); +} + +BOOST_PYTHON_FUNCTION_OVERLOADS(get_face_chip_with_defaults, get_face_chip, 2, 4) +BOOST_PYTHON_FUNCTION_OVERLOADS(get_face_chips_with_defaults, get_face_chips, 2, 4) + + +// ---------------------------------------------------------------------------------------- + +void bind_numpy_returns() +{ + using boost::python::arg; + import_array(); + + def("jitter_image", &get_jitter_images, get_jitter_images_with_defaults( + "Takes an image and returns a list of jittered images." + "The returned list contains num_jitters images (default is 1)." + "If disturb_colors is set to True, the colors of the image are disturbed (default is False)", + (arg("img"), arg("num_jitters"), arg("disturb_colors")) + )); + + def("get_face_chip", &get_face_chip, get_face_chip_with_defaults( + "Takes an image and a full_object_detection that references a face in that image and returns the face as a Numpy array representing the image. The face will be rotated upright and scaled to 150x150 pixels or with the optional specified size and padding.", + (arg("img"), arg("face"), arg("size"), arg("padding")) + )); + + def("get_face_chips", &get_face_chips, get_face_chips_with_defaults( + "Takes an image and a full_object_detections object that reference faces in that image and returns the faces as a list of Numpy arrays representing the image. The faces will be rotated upright and scaled to 150x150 pixels or with the optional specified size and padding.", + (arg("img"), arg("faces"), arg("size"), arg("padding")) + )); +} \ No newline at end of file diff --git a/tools/python/src/numpy_returns_stub.cpp b/tools/python/src/numpy_returns_stub.cpp new file mode 100644 index 000000000..0a5877cf1 --- /dev/null +++ b/tools/python/src/numpy_returns_stub.cpp @@ -0,0 +1,67 @@ +#include +#include +#include "dlib/pixel.h" +#include + +using namespace dlib; +using namespace std; +using namespace boost::python; + +// ---------------------------------------------------------------------------------------- + +boost::python::list get_jitter_images(object img, size_t num_jitters = 1, bool disturb_colors = false) +{ + throw dlib::error("jitter_image is only supported if you compiled dlib with numpy installed!"); +} + +BOOST_PYTHON_FUNCTION_OVERLOADS(get_jitter_images_with_defaults, get_jitter_images, 1, 3) + +// ---------------------------------------------------------------------------------------- + +boost::python::list get_face_chips ( + object img, + const std::vector& faces, + size_t size = 150, + float padding = 0.25 +) +{ + throw dlib::error("get_face_chips is only supported if you compiled dlib with numpy installed!"); +} + +object get_face_chip ( + object img, + const full_object_detection& face, + size_t size = 150, + float padding = 0.25 +) +{ + throw dlib::error("get_face_chip is only supported if you compiled dlib with numpy installed!"); +} + + +BOOST_PYTHON_FUNCTION_OVERLOADS(get_face_chip_with_defaults, get_face_chip, 2, 4) +BOOST_PYTHON_FUNCTION_OVERLOADS(get_face_chips_with_defaults, get_face_chips, 2, 4) + +// ---------------------------------------------------------------------------------------- + +void bind_numpy_returns() +{ + using boost::python::arg; + + def("jitter_image", &get_jitter_images, get_jitter_images_with_defaults( + "Takes an image and returns a list of jittered images." + "The returned list contains num_jitters images (default is 1)." + "If disturb_colors is set to True, the colors of the image are disturbed (default is False)", + (arg("img"), arg("num_jitters"), arg("disturb_colors")) + )); + + def("get_face_chip", &get_face_chip, get_face_chip_with_defaults( + "Takes an image and a full_object_detection that references a face in that image and returns the face as a Numpy array representing the image. The face will be rotated upright and scaled to 150x150 pixels or with the optional specified size and padding.", + (arg("img"), arg("face"), arg("size"), arg("padding")) + )); + + def("get_face_chips", &get_face_chips, get_face_chips_with_defaults( + "Takes an image and a full_object_detections object that reference faces in that image and returns the faces as a list of Numpy arrays representing the image. The faces will be rotated upright and scaled to 150x150 pixels or with the optional specified size and padding.", + (arg("img"), arg("faces"), arg("size"), arg("padding")) + )); +} \ No newline at end of file