From afbe7ad0f7fbebb47e5668343c4ddd3ff9f0b4ae Mon Sep 17 00:00:00 2001 From: littletomatodonkey <2120160898@bit.edu.cn> Date: Sun, 20 Jun 2021 14:14:45 +0800 Subject: [PATCH] fix visualization (#924) * fix visualization * fix doc of en * add note for rebuld lib --- deploy/configs/inference_logo.yaml | 2 +- deploy/utils/draw_bbox.py | 17 +- .../tutorials/quick_start_recognition_en.md | 154 +++++++++++------- .../product_demo/result/anmuxi.jpg | Bin 111863 -> 111821 bytes .../result/daoxiangcunjinzhubing_6.jpg | Bin 90553 -> 90465 bytes .../tutorials/quick_start_recognition.md | 16 +- 6 files changed, 113 insertions(+), 76 deletions(-) diff --git a/deploy/configs/inference_logo.yaml b/deploy/configs/inference_logo.yaml index 0385387f..a98b6c38 100644 --- a/deploy/configs/inference_logo.yaml +++ b/deploy/configs/inference_logo.yaml @@ -1,5 +1,5 @@ Global: - infer_imgs: "./recognition_demo_data_v1.0/gallery/test_logo" + infer_imgs: "./recognition_demo_data_v1.0/test_logo" det_inference_model_dir: "./models/ppyolov2_r50vd_dcn_mainbody_v1.0_infer/" rec_inference_model_dir: "./models/logo_rec_ResNet50_Logo3K_v1.0_infer/" rec_nms_thresold: 0.05 diff --git a/deploy/utils/draw_bbox.py b/deploy/utils/draw_bbox.py index 8246fbf4..7c8044d1 100644 --- a/deploy/utils/draw_bbox.py +++ b/deploy/utils/draw_bbox.py @@ -26,9 +26,9 @@ def draw_bbox_results(image, if isinstance(image, np.ndarray): image = Image.fromarray(image) draw = ImageDraw.Draw(image) - font = ImageFont.truetype(font_path, 20, encoding="utf-8") + font_size = 18 + font = ImageFont.truetype(font_path, font_size, encoding="utf-8") -# color = (0, 255, 0) color = (0, 102, 255) for result in results: @@ -38,15 +38,14 @@ def draw_bbox_results(image, xmin, ymin, xmax, ymax = result["bbox"] text = "{}, {:.2f}".format(result["rec_docs"], result["rec_scores"]) - th = 20 - tw = int(len(result["rec_docs"]) * 20) + 60 + th = font_size + tw = int(len(result["rec_docs"]) * font_size) + 60 start_y = max(0, ymin - th) - -# draw.rectangle( -# [(xmin + 1, start_y), (xmin + tw + 1, start_y + th)], -# outline=color) - draw.text((xmin + 1, start_y), text, fill=color, font=font) + draw.rectangle( + [(xmin + 1, start_y), (xmin + tw + 1, start_y + th)], fill=color) + + draw.text((xmin + 1, start_y), text, fill=(255, 255, 255), font=font) draw.rectangle( [(xmin, ymin), (xmax, ymax)], outline=(255, 0, 0), width=2) diff --git a/docs/en/tutorials/quick_start_recognition_en.md b/docs/en/tutorials/quick_start_recognition_en.md index fdd14589..7d9925ce 100644 --- a/docs/en/tutorials/quick_start_recognition_en.md +++ b/docs/en/tutorials/quick_start_recognition_en.md @@ -34,32 +34,43 @@ If the image category already exists in the image index database, then you can t The detection model with the recognition inference model for the 4 directions (Logo, Cartoon Face, Vehicle, Product), the address for downloading the test data and the address of the corresponding configuration file are as follows. -| Models Introduction | Recommended Scenarios | Test Data Address | inference Model | Predict Config File | Config File to Build Index Database | -| ------------ | ------------- | ------- | -------- | ------- | -------- | -| Generic mainbody detection model | General Scenarios | - |[Model Download Link](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/ppyolov2_r50vd_dcn_mainbody_v1.0_infer.tar) | - | - | -| Logo Recognition Model | Logo Scenario | [Data Download Link](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/logo_demo_data_v1.0.tar) | [Model Download Link](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/logo_rec_ResNet50_Logo3K_v1.0_infer.tar) | [inference_logo.yaml](../../../deploy/configs/inference_logo.yaml) | [build_logo.yaml](../../../deploy/configs/build_logo.yaml) | -| Cartoon Face Recognition Model| Cartoon Face Scenario | [Data Download Link](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/cartoon_demo_data_v1.0.tar) | [Model Download Link](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/cartoon_rec_ResNet50_iCartoon_v1.0_infer.tar) | [inference_cartoon.yaml](../../../deploy/configs/inference_cartoon.yaml) | [build_cartoon.yaml](../../../deploy/configs/build_cartoon.yaml) | -| Vehicle Subclassification Model | Vehicle Scenario | [Data Download Link](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/vehicle_demo_data_v1.0.tar) | [Model Download Link](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/vehicle_cls_ResNet50_CompCars_v1.0_infer.tar) | [inference_vehicle.yaml](../../../deploy/configs/inference_vehicle.yaml) | [build_vehicle.yaml](../../../deploy/configs/build_vehicle.yaml) | -| Product Recignition Model | Product Scenario | [Data Download Link](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/product_demo_data_v1.0.tar) | [Model Download Link](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/product_ResNet50_vd_Inshop_v1.0_infer.tar) | [inference_inshop.yaml](../../../deploy/configs/) | [build_inshop.yaml](../../../deploy/configs/build_inshop.yaml) | +| Models Introduction | Recommended Scenarios | inference Model | Predict Config File | Config File to Build Index Database | +| ------------ | ------------- | -------- | ------- | -------- | +| Generic mainbody detection model | General Scenarios |[Model Download Link](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/ppyolov2_r50vd_dcn_mainbody_v1.0_infer.tar) | - | - | +| Logo Recognition Model | Logo Scenario | [Model Download Link](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/logo_rec_ResNet50_Logo3K_v1.0_infer.tar) | [inference_logo.yaml](../../../deploy/configs/inference_logo.yaml) | [build_logo.yaml](../../../deploy/configs/build_logo.yaml) | +| Cartoon Face Recognition Model| Cartoon Face Scenario | [Model Download Link](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/cartoon_rec_ResNet50_iCartoon_v1.0_infer.tar) | [inference_cartoon.yaml](../../../deploy/configs/inference_cartoon.yaml) | [build_cartoon.yaml](../../../deploy/configs/build_cartoon.yaml) | +| Vehicle Subclassification Model | Vehicle Scenario | [Model Download Link](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/vehicle_cls_ResNet50_CompCars_v1.0_infer.tar) | [inference_vehicle.yaml](../../../deploy/configs/inference_vehicle.yaml) | [build_vehicle.yaml](../../../deploy/configs/build_vehicle.yaml) | +| Product Recignition Model | Product Scenario | [Model Download Link](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/product_ResNet50_vd_Inshop_v1.0_infer.tar) | [inference_inshop.yaml](../../../deploy/configs/) | [build_inshop.yaml](../../../deploy/configs/build_inshop.yaml) | -**Attention**:If you do not have wget installed on Windows, you can download the model by copying the link into your browser and unzipping it in the appropriate folder; for Linux or macOS users, you can right-click and copy the download link to download it via the `wget` command. +Demo data in this tutorial can be downloaded here: [download link](https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/recognition_demo_data_v1.0.tar). -* You can download and unzip the data and models by following the command below +**Attention** +1. If you do not have wget installed on Windows, you can download the model by copying the link into your browser and unzipping it in the appropriate folder; for Linux or macOS users, you can right-click and copy the download link to download it via the `wget` command. +2. If you want to install `wget` on macOS, you can run the following command. ```shell -mkdir dataset -cd dataset -# Download the demo data and unzip -wget {Data download link} && tar -xf {Name of the tar archive} -cd .. +# install homebrew +ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"; +# install wget +brew install wget +``` + +3. If you want to isntall `wget` on Windows, you can refer to [link](https://www.cnblogs.com/jeshy/p/10518062.html). If you want to install `tar` on Windows, you can refer to [link](https://www.cnblogs.com/chooperman/p/14190107.html). + + +* You can download and unzip the data and models by following the command below +```shell mkdir models cd models # Download and unzip the inference model wget {Models download link} && tar -xf {Name of the tar archive} cd .. + +# Download the demo data and unzip +wget {Data download link} && tar -xf {Name of the tar archive} ``` @@ -75,27 +86,28 @@ cd models wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/ppyolov2_r50vd_dcn_mainbody_v1.0_infer.tar && tar -xf ppyolov2_r50vd_dcn_mainbody_v1.0_infer.tar # Download and unpack the inference model wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/product_ResNet50_vd_aliproduct_v1.0_infer.tar && tar -xf product_ResNet50_vd_aliproduct_v1.0_infer.tar - cd .. -mkdir dataset -cd dataset + # Download the demo data and unzip it -wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/product_demo_data_v1.0.tar && tar -xf product_demo_data_v1.0.tar -cd .. +wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/data/recognition_demo_data_v1.0.tar && tar -xf recognition_demo_data_v1.0.tar ``` -Once unpacked, the `dataset` folder should have the following file structure. +Once unpacked, the `recognition_demo_data_v1.0` folder should have the following file structure. ``` -├── product_demo_data_v1.0 -│ ├── data_file.txt -│ ├── gallery -│ ├── index -│ └── query +├── recognition_demo_data_v1.0 +│ ├── gallery_cartoon +│ ├── gallery_logo +│ ├── gallery_product +│ ├── gallery_vehicle +│ ├── test_cartoon +│ ├── test_logo +│ ├── test_product +│ └── test_vehicle ├── ... ``` -The `data_file.txt` is images list used to build the index database, the `gallery` folder contains all the original images used to build the index database, the `index` folder contains the index files generated by building the index database, and the `query` is the demo image used to test the recognition effect. +here, original images to build index are in folder `gallery_xxx`, test images are in folder `test_xxx`. You can also access specific folder for more details. The `models` folder should have the following file structure. @@ -119,33 +131,39 @@ Take the product recognition demo as an example to show the recognition and retr #### 2.2.1 Single Image Recognition -Run the following command to identify and retrieve the image `./dataset/product_demo_data_v1.0/query/wangzai.jpg` for recognition and retrieval +Run the following command to identify and retrieve the image `./recognition_demo_data_v1.0/test_product/daoxiangcunjinzhubing_6.jpg` for recognition and retrieval ```shell +# use the following command to predict using GPU. +python3.7 python/predict_system.py -c configs/inference_product.yaml +# use the following command to predict using CPU python3.7 python/predict_system.py -c configs/inference_product.yaml ``` +**Note:** Program lib used to build index is compliled on our machine, if error occured because of the environment, you can refer to [vector search tutorial](../../../deploy/vector_search/README.md) to rebuild the lib. + + The image to be retrieved is shown below.
4zS3C{-mn`r7VIi)gSiwh_paZPoPtz4p`i(+b`yv(oe=Xr zL!gwy-8z**5Gi<(w^6`aJDu}3tr5V8l1fv{=_6$os!u+{zVp#Kwx0sbqt~2o%fCck zgW(B_J9cu0BQbm*IW%bXjZ^qNqFPZgr}AqV-Z+xK$HqGj=}9AVGnci zp*nnni{0Zah^j^zjirf1c|ioVv;?=jd7Y;H t1{XjS7h2=__0yuGS6OQIG~_bA8a*P0kQ++8aKH2N(Ms9Fa!QK5&pr92W_v)*Mx z+-R-R-p+Z;)u084hP>XCv@wg;64>UT%W$BX*e^hj8N8Lb+pobp%5tg^Bi0!Cv9|!$ zDQSCqa$#Z}Ee>*zn-tayvRip*7U?Z=IgIpz))>q2tb32M;Aj~_`nW!EB02w7@dusL z?p{$@);Wg?r%E0!{Sy? 8>a!~#DJ*q4nlp{P3P P|JF#&op4*IjBm^d^o5 |S+&Z>xbU+y977zl2*i+F)M?h9_asEl%vsBm-uiZ~GDYs$k6wX8UT zWcuN_6YAK{lui>sL=q<`o#?S=JFSayya5gz{)!61X*S4?pQ|~?1w73cDjoz5rn$gS zj4-F6MoG0h_E`$=3|k4#0Kmk$3D+Z633m|toxL%a6Je1ps^|JgXp^H*yC58PHC7~p zQ29Q~=LK+?WQ!H}3oL3)399^I*T)IVJyoO~k=*W&G5~HFFH)a0U9D 2WGk3VCg>c+;$9yObq)3M%^pV=d>LP0 ziPAq#Am^>?G1NWbxr&D~NAFTjgFyNi#ElPzm3fq@7PgM9=nI9T>D(frF~ON`M`2Fg zzAg3%n4Yb^gHUtroXpyT%>u=3B0@C0!;%4@(i`G+@3;* tWO`U7ku&o1Ci`0=SLfSerm?|n&hEy#@MNCB@48lH25g}lX0y2f{R;wteoT`9= zkUB6Aks(kJvSqF!hB**~kRTvKBmojalD&Pe^qlklp6B;{?;oY8VaVS1zV5ZIYpr$L ziTC|UEr|Nu*YiZE-7=~KrBUdT*LG%OEP=r>1zhJTlKU7Ub0K#d)%34u+s!v3+SYCK zxT^e}ejzNgd+mAO+lbk0Ax+0Q*s5)_6E2#6u$pJtpR(4FmX8VFdQ@>gq~`R&GVm*f z(jDy8s9oWpgg;)sphfYAHWUeUEz?4FyG(8{`@1UsSeF8w;aD}pWjqU%#$^&IRTgVL zV>M#M2G_OLgVY$-a@l)1CFXodpTQ3;GxxEQ$@Dwl7$n>V@YC+0e1H1lQO@;82fl<* zp97gqYTRJMa!;GapP35N_N#l_?Sk+GY#;~YR*9;~pF#;IYxDzHJBwt}^n$zD;rE-( ze?PnmsYrB#t&w$^)j}yD*HU{BvE387NYaoS#Sk}t2@mhNCc3}!0Y$gzi~}uHSwXFm zcyT6zB?ik>N&7njOTMdgQL>keSsHA&Ry~cwx4h!yq35u5T4UJZ$@M1ChzX%e84KSF z8N%Jt&0bbgQ9v9K5#cg;VSUkTTGWzobPnq5c2Ps5*4klBkrfD&=AbuDwyRd XBKF1m>(Sjf*xQv#`jnk#6g5M@EiGy-& zuwlY-n3Xw4p-mpRYvKjs&7+uf4L?|jwpURMGcrdMJA1b6?Z}11lSyE7?=Di7f1m{L zyL%h<_<7 +nu(D{>X#m4=vuAC=?junic5*+ zQq1X9Kh+!J7n2ANVvP5POi#PghgdAo9Cs44g_g<_sxI~R>?hvcr^b^|gY86 SrfjY&hK!NeW#+wDJ!0EzW^PnTt(S7UxBznw#Q&;&;;SaqUj94Ny-V?u{P zy?SeCNWV|A`$Baq3(s_rDIadqIB_PKqCJR4gDg+-<8J%;{zJ>Ui`2JDzpk@;ElkU= z+8h8Ff*5=v-*VYzp=J{l$V=K!o`ze$@Nm5~z`t&?EbdrwTi%3Z&G84{Oktg wGD zzzoCFcx%VJw+U>FB^ `>U+KBM7s7MTnR84ouI5l z2U01YGhLLTlDD4ckRDnLkt}Q)qGgSW#;_%hoF(BK#G tt~K8BddH6EXR>iHx0|95vm=&O*DRP}MAJn-+WL zYI1GQ(%m>VoVlT4LirSr*B(x%ixv^JkKB4a-QNop#9hBt$QbAe(NOR0CiwyGL;H}K z2}whHzO?Gm7~qoV3$NhgJO^Yu@d}-~g9&SicT^AtBPVE0lp?nFDMtzXqI@M(t9IJ0 z2QVfaz{Y`hw7XDSzB3~Z^EQ5*_iQUV#`;_x8S$w2n&T+eS+9ASI~48X%&v=U9xneD zAL<-=fc(Jp=)ekzb>r}@_?{FpK?s_NZ{_Pv7R$~T4zB$;FATr+q|Y0~w^_L}X=|QL zp3Guxs!IsTJgU_J++VcrV0o+7&{R)cE~7j7Kc;95of@@MfPSRBpzuCYAl9|%t_v*Z z__%CdyA{rTjD^1dgf;eHE}hZewd7{=jVD(K4@V+nUAHP~fVxV1Lf#)QYpPyD@$a&6 z$hOb)FGTt7zMMWrcQF_gHFm^bcB_ipLy)EZ6{1)zTa~5~xD-!sFMz!{lQE}=Bg$#b z@-3^x-?5T!x{MWfy}Ed${4sV=c6QpSGo%+O8>=u$4+0r_ic{j&9Evp`W~E3OQpne? z^7$UGu-m0|RLw77u8DIhk%gsfx+lCk((BV{!Rk~Z{q^QZMN%^-84v=8Bs+@6q%D(K zOiKMVRw|F)@9!Q>X_jYRE16U&69oh+eGG*XWWAM@dM5jNVyg%JqxRkWP$v^@Upf9| zWLjI}aC2nLguU#WM$pLQG8fAb&$Vs4osj0PMd(nCU={$>`bS?P_*3RT}$KbISfmA%FwyL8f^~gB&%1L>>^mXLZoulm@=kBt`rO1?E z7KWtQvXBoSSbyYf%sWqC*Qm5Fc;thZ`(!lIiImUxh1dmRzHn`@iagEB%nq!CB3>`! zq!{B5J#M8v$#sIM1xGyuXe*aJjXetrL6?tVa;M&UE9Is1?fH2TWp*@e#hkOiYS-I2 zB}ta3dg3PIRVmGyo>v|5{IW6|oe4Znv$xsN?3`o0l)u8?L-9J&Wj3~e;UhPRA3Ep{ zR4`{6aJVONSJ$6E#kev&UF|&&&(7DHG5+w55Xo+;?wFOM?XaTQBs>@S$GC7-`?XRy z60=2>z4>?iO2nFczo#my?iRrt5tvE{8>XHttWgwWw^c=xQ05&riOGphs#BlOml#L7 zRrZ2ieRWjN_OFNL63h?SJbcw%x#>utmUfNtorBF6r}|>$KzN8GR>%y`yh$+mRcc z?6|m+zvY;YhrK72TGfiKA^IQZ`IA;KcdBU7(b?hX#3if; by#q-?WQ?S`)@-I_rOamfZ4-WF&_C$oyf#qeB{b)=9t#F4-7l*%E}X=zzRH$f z9DqK>u)(Q+_bFmqK79g)oX=ng{I`<~%#x5-_lr6Bgx2YtW-EZK-Ctn*-+u l2O+^cBD=)*0_5g^e0Na&I&v#G%g)n zb$PZw*2CMWF~IF;59b07h{%S2=5xXA|4zNfp2CgwIH42j=s;P!*6`~ZU7R9KMfja)JCdYyY?wM zMQb~t6#D%hlYV|V)M%=~%GP0A8oJJ=KjTl_8fOf8ZGK>t&Z_z~hvoF3&02rYbnm#= zkMY@&0)vd^QLoLqZh+Hxmz~4PLo@n|ru&~$KT+jqY9pUU=HHuY+z5){5SJmf{=2#1 zie{3tBHwtE`>xi(Gh4rFuXu|W<5#f&oUF`KxvyWxtwUr9s!Jp??K)JM*T}TO`#I !LPsP^WGs=#OEJyrfF!ht+_03bN9TRhj ?^=;%Ec1jZ+qebMS;ZmKY4oa%-wM0>FE^40=_ zYfSqB;~&*#ZsoCE!@U@yIDmam8At=l?1;hbD%|{lbbEJ?l<6s7H)b%yU)@)&sj?&@ z>wQK6sJSSXVcFd(>i3m$ek`}i!rI|kjMOT!>rr-uYga4mgPZc@>w`SW%5Y{?v`^KM zxItSX)6CIOy5q~n3C)QZ?Q@C^VFKA_->6(d8L}p24}Ob_&3k#8xTP<;mZ$ww7ulQP z3XinZR5M#mn94+TAY)OZu_d{rlJ~5wEoaKFS$OaXyZrOm$gt@k%aZAhCo0Il{Lb`J zX>#7L6V%>1`hz*wi*Y~`NP`|X$2`K@Z<7Af1{%H#UGWs=?$9SHnwa#9&FMk_G;Hjofn?wcCSVVXgKTJwt9# z&X9h!TVK=`wA)E !v;IH{C{DiVwruTw8XS91<-;`t! zUhF*en5#L-qX{d!v7z2(j CUj%+>lacASaJ kQhJ_)y(!UUn%am89bx&EX?75N_9~V!lhLK!6e^!zQ&B_5 zWH+xr*3ho!=i78wiqyWt^%l%Q%?a&kRcMr)F~E@;%B`xA725p_N%J>uTvT;LOIMm1 zAKP|1X4aLqgQaY1fYCHpK;6__IGvSqW>>a!ZwDpK#QW0wV2S0a=SxO4rik9x>KowD ztHzUv`Shvq6HpYRw;UD#nUJuje9L)B&^B=aQA3=3i*{9t@`MbH-_6!jaq6x1>`@yi zPkHdTpuegBfapS3G8DW(WE@sr0<#mAlcCJ7PGq9}UiG!FB=<|LMOdE7b !90}m=kLS=T4tw`xY%uh4ms4(4+KZc4y54n@tuGZMb8h4fwfk0d1)Z &Lw)U9=j5?yj@*Y>g6J+yNswp)A7J+o z{_md2`;-1i4VZ1#=qvK^OtpS%Ibfk)j`r#)>; ^G&Wu(?JZ80~ZBXe3n4gEg znyho(r@Z06s_@ikl83LL=S-Y*r;f)0W^g%$X;+aC$gygiCg#W69Nq!yqBt>s@wt7{ zp}u#Bf2%@j`BN-mallOiciNklGTgM9rizDe{Fy3O`Kbz* F3J0{-(R}2eYd iAG)I p&rV)#%A9_iN$TjcS7K^OxT6h)fffkS`b@&R2xGSrJw zM_NW $G~#b|8;9nOsKm8gV+LPp zQ2Di7Q^Q+d)XCM?t0BFQyz~UzIEh})Zde3zl=TK%%i--M-gtkZ66L(V(ET<%zV<>u zSu)d-^ @g!$!Fn#t8HwoqYjQhrY%IPiUtiQZfOoP z9aZ&mqk3 {hq&HZtu5cI(HUMI^E|v=o$# zR!*wvh6%`0wAupZ@$3?|l&W!3)xIFD3-#JF;y_eabe2RN3hB 8C%v3PyC7Ql0C^8~;Ok1F zzx=l5h%D>@g9BYnUPmZ4r;Y>VV=t{Lm6jj>>e~}_lo6ZCoYeK($t#!mz3hk1%;gkS z{C@afj3@EeznGg~NN|_hZsW2#AuWG q~EJ z{0R(6=hW!6Kmd!pCPQsBYaA4xBYUbe`?S$=j&`+~gK9h{{F_-%S-PMu$} $6{lRF&UG z@YTrAurHUK)FpORlk~Jss#`hZkqIO5HddjJ$4yLR3U*S4JxVA4{Tq1)vAkJ*u4nnm zM%4p7c69z*f7Z82#O8JJAGAVEEwNZEu^y*%(;Q@Z1f{%Gvv8;@|H-J`m&Gswnc@jF zqCLF3dz=0lQpDVSBt&8JaLwkjt})Y?!y1I>H8I8GDpw9*U+$N2YL&uk#k;$%L_Btk zAnroTM3e1XUQj#0sFNBD>Q!S4wP7vVPx8mZ)?m*oJDBbfLlLfJ$T&Kl&uoMpCPWo9 z82_bPxHozYS;!?9k0m8}l%+zsvI3!oPLjv@8IPa2PNtlt#-y#5Z@P`;zYR#6ANwk3 zGh>EMUz&vtB}6E`b)!rqhr%GcRZ5R$^sqmHOZp>IN>aX-4=32=0*6{rbwu#8L^eaI znBq094j0|EW%qvd?6NguF5()!LTS)DHHE6^ldGaDmKtv$Yy&wKyFSkApF`dk(r(of zIsNMXrq_467^eQ`$7gPG2>X)whk)DGJyOGuTCh@3$&TgO6ly~5G@9?zpTq&n6w;&% zMB~t$roob2JX+k(bdirtR`QE#pLnuHaGEyS5#g>t^CGqJ@z}fb(VV4dc?XnMGciA1 zmrwJb|4RO^p6`Fm)E52vzf7&5<^$@dOL-{D0SW5~5a~fo1f=L3)@7IP2haQ8pSa&n z6N5iuA!JOz-=Dnq$yC|@U~cRiUjS$6g$KZmUW1P8L1yU`AbS||&~I~>f(5@OLDuqW z0LVG$2g{lMy~G|zz)=$opPI9 z>Rmn
)y<25x`5H%MaPfTHH>OUyovP8$ z&0VH3sed*a$ZBVO$0nYbc$ 0%+V%U$!j 0K*7IFc_wP$EI5afN~mjI4mdh`g*gzf(#D20`zuP5q{q>x zef5SPDzmUqP0pNPznps2mn-8vkZ@E-&z~SxHlOXSjVz1XJ)TRRILEbi<7j(=N>r6S zzSy)crxmwS9w<$zC#@zngJU=?Jy;Td(|ZlKB~(->v|n9ti@rKDfw%=~0oXb(LfNn0 zf%)Y&yAHa@V`3|Pau2T_P6~d~?4K7M>t!^t2lI`aXsg!=CsICP|Kr=+Pff{|UG+cj zz3O{(jt(LDS9VW!TPkz#6pDCR8`Jp0!2Q78(w*l*n)0oru9#dA6sn|i`fD}axf~T; zW~uyD^{eLSd$cU68p8W7)cZYA1s^T%)UF)VM?jJN<#?H^iHicXbLy=0SP*EF)j~C+ z7Fonvp*1U!FG`RlDQ)Ciu5Xn8(2Ca3!g9T%Gras@1-K|vQp(XN+U}3@;Hj=Yz;tN* zh2lrPMy#L0h9(<`J&7YA3Mu!nKgA6`!VTyMF|Nv-<^yf*8s= I{w{h3>kxsUKIGczR&4I7gt+MA#qG@~sMdrYX ztr)46+BGnYKqAvmmemhGU<^2VR_*f)+TaMoijsw$3J%Vlwt+^Zel$f)(I>h+e!Oxz zT4T>@M-6tRG?S4ekFFq_9giX|3G9rguqb~5YLpW?G*($OJAl5}8e*kNlE)BBuE;GL zJ&gOG(|t$$z4vg73b~0R044A{Md|UceL$6Jg`P2X&p-NHZ{p*;2r3*yvX8nBt=`94 zZ?HHVsV3H|a`RP;L$a{gr-I6_=@PoNmxslYZD*#^+oU`JFkzj#8?LCsZxon{6jlCc zDM 6kLlf{t$92>XfWr z+FV+=rd)D3)ad<9bV`6Tv{4|jljx*(3%{1tC;lpCuL!>)cAC60bG_1GHFoO<^%{#~ z4?>6Q=_r73+aPB5V_41<_O6_&G?P%+zRH#*;A|(&k$a 8XhssU3f!Rd;5_ z(Z`&-C>@Oxm3*9cg+)H4+EPt2v5;!X`R?6F_(7^{Q4Bp;Vw6?D6e*m&n&LS9@fw8} zL%Y&X;#Y@!>2I<{Hd}8STyJG{ime3oRB>I9feopEEO*Agj(2_z~b?W$&=5g=E PT(_RqgnZ68GIXGBucwRKPD6Yd9 u1}7h!DqFW6EL?R}iLOY?EwZNU|y zUL-q?02#T;`b32&gHsxXw|`~)F^ZkJM!xRB`0xRXf*+F~H;at>a`KoKV2Fs1n_)8d z${VjKEbO+T!+Kf5xAjA);JaM;(c1BQ>59mEY`NbFhUH9Pc?);ny)kG#VrN<4YpDL* zZ-cT~zM1m=U W@`UOh7*5R>#>BZ5aw>^DxJ0ePXI)J52 zeqT2nB6sJMUA4Qm>RG^T!|tP6HQ=#9Z|W0mgzESLwO45>BfU2C-JF2!KOMvp8BWqC z4VKrOT^FN7t|=I60+RKI3b;?2a-EcP-K0k6uSsAEpbGt!Nh~pvldI7$Guyc2c`8=z zvBX{tqwX8B)D|4Lz33lJaOH)%(43iHWun@&ZA25h0WhQ8X4TmAo22~$te86*1VJn6 zA^)L> 3iQ<%Z}k~P|?yo$9T(B z?b+dm#PVjx2~p2%7>G?^{_hSsaPY?7c>qfKt=B~sEzoXYuVfl2Qx7@{c cbPHJjy;=T3O1)$%!l2xbkHi^g4m|gi0k<`L*rLPlnQ5r zp+lYAyt0q;rUiJ=CHChwW{ Vt{DSxD-9ue>Bc6^ +r#$Z1u& z=zfoyrF*eLNxVyoc5hU+cR1pPEAtDyS>qE$fNM?T-8wQg+aEoG*ST2CBzukYhV)t2 zwh-ewM1)mkX~#(`kX{k8KRf*L;K^dmu6~Ak7ZUK;_)L_gAD&y_>0eksJSt4cxN9)U z%sF>=noKNN`1u!vp#M9~vILX6406x;)3NTAFVVp+Q#tG-(mSy79ogK2fP67%hTmqw zK Fuu>hjkdjhmT<1Uw%snw_*(v9&A|`xDl6 R=sT}oq)q&|(v1AS1J$cPm&RURM z!sVM){w$cm=Bs!bk1j1uVofPgF{=BQwfJ^$ZJoiJWtaf?jxK>oF<*I2Zg`tZy;_lZ zlV`$uU8+7CzvfA{m-hSn0sWg|!C&p|auWeZ3@lfqsvvpoS+f;$0~m)d`>t^9?UhSd zF|FP{8YAX083#7Dp0XO&Zdq8vQW44h?I?EE nhOZ4@=UL?^spSkd?7FU7cM zBEqNhAJ7w{TRlLQYQsCQbDn&aSrwZt$v-k8Uhh#~5SKCfZGVJoD>4>o(SeO&L;2A! zB~+2eFwaLNAF#bRU2mASp{>%v90}+$-)%&h8$TUN_qWIc6A6AXvFhOyBL_0aIsM>( zrTOkaFOu(3?I3< kc)G;)gbNgl{4--zZ5-l%?<_@F&OM40 z+g&X6!jtZ`*F+sSWZl`c_jwo7c&yIS=Xd1k5SRL9I=~}!QHoW1pnq{#!Fk=z?q?OL zKH~6~#NXKdVc+;4?F?HUw{f&M(sei`LaHbjbNKZ}Mp&}#$Rzz~JA=~sj;8lF4a;g( zkmpX@28Q2H_RE8LeQ7Q*q_zI);e_ao7d;>(^z&BQht!(~8}=QGmsp!5XQa?Cz?S+A zXJooIEY0a{s3ueMwW?AjP&%t3BpgMNvB_3=4oh9;3}f%ROvt*gD98&h9J|f9RSR3h zE58KQ6(u2iYhpoNq&3A;hz;Rg!y|QJ9&1vw?EUB&qe-(}qVY4ghY|HVe>F$yBaf*k zmdng33yFp2N_pSPW3DTlj83#@>70m5{p-tNt;A=g-)Sf8#_ts4DIk?YV%bJEVFRQE z%&1~n*fs5HP&BTvSklF>p`7n{R8bz+Jk5L=pD;uyk-js Slfln0SMW z-0sOErc;}iF<9kUXNmenlvX?}_IPRa03H{U!U*nM9Vnn|zuO=6ah_5OA$VA@GV=bz z+S$7g-m?pVE#5-be8rPfV1ChFeKBAiUs!^Z#QbZgWBZ+!d=R>y0gcAJxiV+L8}(!( zDSjOmAM)G_mAvMCtMU~09U8B&W#3}tSMHS<7{x8dB34~Qn>^|67sv^rL(w^0JAHUQ ziZUmp@?(?rltsJ+qj$o?z-0GL8*8nqX8hQ_lx*f?(U`JSKpAIpASet(dAQU)MR``X zh$HWX)>b=ffp>V+Pni7LbCWB%2Fs$KYm5$*#=VLqhCQ)8 B}z zqeb*$a6A8qXA_%GsRDp3iP@LAP4JdKL(gdU%ao}FFnbzJqPfDJ^+z9?GtFw!@U12a zyR2%_p0UPi@KftCUGP7Mbt;x*Ry^ZzinmTyKT~nN{hQKzFD(QKA!w)oKN&jK-uzGM z_Vi=PU2H|mwCO+Obi)%uThsM1wUeJ}{ZzDF*eb#Z?zgauFjvKIzWUT5_uQU}^PJV! zGFKgU%$Wm&1b3RrH#OyVa+vcq+f|cLC_iO747xpSCBPz6vp17z(Glu1Y#(jdOLRu3 zpLz>ORCCh%XEtEFG-p9+_;f8+i2iD0t5 H}+ z5omg7I_S?Q@2N28p)|7e c!dArP%?O@H~ zTbc`&{P{{+LGa(s9aL*7iYpS=#dDSa%!;s*lEg^2glrssY<7TDgM1!7Ttn6mxD XX&wSlON6pQ6k`tYB;9ke&{@FR|us2i?J>n1A{9ZNI#h*zbo!6nY?D@ z;dHYwf)|wEQ6@mEbi=g7<1|5 ILR5c W)a*_+NFJpovt}sD1ieS*TXQU iij{RRN z4J<|r`ulZ5JhEyju@cie3;|j!PxL9EPJxH|ZLX2x=$R}QE#)+i`x|8wWdK^*^Zh#V zLJWlDgN67|jP@|o;T;r0^4uk$ j3g~ngLwA#){l{ygZBj(>WXSJt~@446$aGW++ z));@8wGB_@nFg>IGcRa*o3}G|zL^C17CMyB;iAbj7)&?wtpXYclW_-<>vAKRhg zw#G5daT{fX`?TL{C2NH6oC{qq;!RU745Lj{wJ-9+pkd3j|KWnn$Kf<3hG%OR0Y(0e zqP!z7VbMNl?{i0g2BEeiqT?icLgR&ogGn)={F@XK&l)+UqSScQA>HcDPd=yZ@Ny(d zJ+sf~U<3p^*=|mGlk!)ZhOh$^c|t#`aRQ*#!c{7 1Ul+{=}Ccm z)20qyAddn5+q5@R;gV u4Pt5Icd(PWU3-{QhB0mmOBS%-QX8Ii?O{#Bc&ab^>a4G zr1)B;_=T=_o`XcESuROyJFZM_l?F`&GK~jP_t -y-3qqLal*_FcQiu|AI` zWIlx1ck--jhtc|6S?KHEy`xLlhLX6bT)3O8GBcDe&BKepognu2sYsDhelF3R1S9RN zl6#7r(zcUmt0A3ZS_!!P1 (j0+d>_b6GRd7Aapmo<`b8`a1OQ E`s=qfMDORn-bW#O8m1j-^3I!yeSzRQpu*p?|L37OfvUcY6jz}J#ne)uBp z`d37AoB4-FnxhmRv{V|y&!&;g@d~7mH970D(T+(`HW4YVqOoMaG}ln!I1$Z$wzjZq z`xEwTlE6?l$GY?+Vu+>W(Lj!BqERLS=uZr%zA)@RSz*h$8c1dyR#NADPeYo5+6t%P zT+WSQ(m16(JrP5|B}sZVG+To#Kx-TZqsg!2da*Y74s~f^>fWUWbD{0ycS)C@)T+?D zsDmE6DO`G# 9`DK<<7K|@$c|dK z
7g*Uy_IwO3$t);ta ^+KpqVRO+H5#0{nJjePI^2=#?QoVO~)rEBZtds z{vi)n^WOa0c)h{-#c^eVK{iT{@8v54@t6>6Tl%2r7LOkWO^L7i43EW0_az9B{s?56 zPb3S1q2Vx6g9w8MI!AtCGSa)p2?P20cp?W;K)R`63gl-)p&3V#lCV#>23Of@DuZMz z2kpv(1}9biq8Jmu8pcgx^Nzz&+Y6P*PP4`5(V=_JO+&iJAOp00`YapbEh;-ky@4$K z8m|oP+cP3|xLIjM7auy)YPr#S85VcFvd0?sHoiNm>WmEC8F}QM?Nw?&S({B5IGw qR(vxC04Qdgb8zPiw$j{nbJ@yT8{ZJuJ0hN7-d-}uid@3at9pTpeVsR zy1E;OPF=e)$X`Ib5t-O+JvfNo^f(q96uPyN`iJ(%6!8qtT+S-~Lu5ZJtoI2HBX0Sx zf{7})p}7!BewiTmI*9dt 3;33ref%cE{Uc_%$8Ix~L+ho~G8My9B>j$Z9JYmvYFy~?0_1rMFa;Z3#;Z{;E zuqdIw#|A&Bt*L$W$~0ds{ll0lUim4k|BK@$>s1S7?Ou3xo`S3o(V**#JkNP>u7yr+ zSN8s>IiA>iq$-ir*XKYK&w5cjG#42P(Jf|akn^om(MRs_vzta;)05gWf7<#Oq&$Dd z{{- tawZ5>;rkmMpbv%(#(qxzdVZ1IgjnXg~rw(0VvlovM|7lU# #>USkalAaycOLkC6(cWvA8D2M zezB98=iTO*CgN?^BxO+7+dSIjz%%yuXQAn{KjIKUx;kTz}rbEKTGwX5|9$JE%>y4! z4@I>Rxk(X!i{GR?8)3h`yI*iVA5-SDwvMj*Wl265&eEY-@s+$}U(%II#=vr`NlSWG zy)I{LfO)7k>b!BPJ+$8W>9Y2f3cKyKBEmbk-R`04k!EAKp`@(t25-wLrlWlJszTrK zSS >sn|!jlfq^TcSPwI$LbcXVlrfYHT|Ep@V*2@yydaK z@EXUWL|t}$*EU8_iIFEA>5EQoFr6mN*Pg;ND;>!7 CvlAGy1dBZYe^Kw9T8Pk$U<`@GQrBk?Sm3${IwiNP5M2+$8?7U?n0! z5y9)Z%7*kv_iOB0o8AV>8XLzoPh@S3^-MoiQ~oLYg10Kaqw%%v9zD@nZ|gN#PdcEN z(1BG<2e74^GQ#7X@C+M9bb-p-Y?ok$u5X6OvNRT@K8b?nc#Weoh)naQ&rCB#bMzrv z!C}op?WN8TMD>H6W%s$Xtt~d>JR!Vistj+vE^6A?Y9C6*ciu5Wv~WsX{bV;)`MWAf zVz`p&25=_B%e~iqe8pI?<9d(Ru2!s|n`NNCZ0z9C;FyKTwA1&*J3@5h8ugsX?o*gm zeH*b>Oe}1*BOR6*Hn7O;c5C|k->U 5{EK|4)sB>u!)Fp9Sy~!&9Rt9h&vBEL zUiAZ=*l3Vu|EP!bU6@GUZbNkD;m(kJ$EMq34P$g_nf(^6B5pRLYJ<3JVlCy$4F3!N z zF0D4O?lfCdvM=p44eDKZtA3)`l%iN zq Fmk-!Ry=fbScCX+#LeY{`sf!AI)&ea0o%Uxq! 9go1s3+MGzPJhbt#P6X)n?P@pg#U%=W+hKKfMtA1bB9r>FX+BVI^CC% z<^PBPApIc=)82h}7$N}vJuFcyT)oM`dvvZ hE)V`R%yVBS7Nbq;@Dn(+sQ N2i{$RC+|$8uk^;R~o1Ds)InlW(b0*&k-@G;>o6->x_Nf7xaBm(ti7G_R<#$XK zH?NPRNYj2M1x>R$4b)lZrqE78Vs>sQrU_R7)tNP69*;Ny_I4Y#;@W5EXl9Cq;iuoh z0e0{(z$nOkcsi@`F7P)v+>8kCV2@*?nfQfl8@77HFlGNE(p^}JO$G|23RjpMN_qX) zbO04jkcK0YEH_L+%j;;?6o9Zvh1(P}M{`AK06Vv50M86-C$ U)Bf5mktlY;1b#T=Apk~i@%Z?mnk!H7dVgIsU0H5 zahE(ug*W{`mlbT`kDu+F`&w%`!@RqV;HOJXb;mDGXSP5$+WlAKRa9Z@=Q+AQb 67g-0HyWx(VPPkpJZSI$ zVY6XTNUa$f$8%{g+!Gtb?o^o#@Go0zDpjS+kz+B I==|PN`M<-U& zexC^Txq!K(`}EqurciBPIbV|RS&yz{p5C7N2XkwDLl GCrKII#`DWv|;Dag+5Y>Fmks*-K2s$o`_60 z_46F?R7etcR#{8X7{XBNuJQ^d*WvTU^*7N)T!Yn)bjBm?zLuXQ hO8G26cdGGW!-RsqQ*18c z7_?>bj0PT_O3vJvesrTOMT}gvTdcKiBUXo-^dFk3GBMcB2d{@GbZF=)I~v5>Iy0V4 z(y1d1l#$r)cg*W@E=?Fkm6=$}43(?ecCjy07BX!$N5@bwJJk+MP|md~&T%$rcF{x{ z+N-#xINeDMRpZ~wh#0ZgB7O~Tb&Is5s14?BTEc*WB^Hhv&JJ2Fe$eW&?*X$zxDk zAA(!4rx49g 92okqo@x|9oyYn?q z88qX>Ay2kjzjya&DKA Cj;W9k}%9bEhD3GjbGY%f)VXG^#snMs+%B|Sc>gcZd zwKwg3nf3=?)X8H(k`uxgm1F0qpSXjyhiGlYBU=45_FC&oyB|oP*m|*#xUd_tI2zrO z_??v(^54FM%NrV(!&z1(`R>?1 e2~rl@^k?9t5rjpC09Enh(2w%%ASs^4=Q-Zx2l<7fC5 z-w6KH={+yMV0BRRKllI_F3{gn_dC3Rv1NirnN^xj@91AgbHvlKM^FFROR!E*!cC88 z2^_jp17(OFZ;NA)m~S*Ta ecUTZQY+`ha$#BB3U@nz9;Z28-68D |DF59NDQ?vvH#3{-cfqv_X~DS8utfuP2(B;gpp@B03K_d+P(=+ z_-ZCLY7DLrhT~s^-*veybj;U#T}-rAPU);@Q&NNmPuBNLQbBlpUD_AV3I#reWnIi( z@@6{U)a(J;MNAVOO*&yQyzPTFq~fq^1MJ$1r(ULy3zR B6y-qQM&_ifLK*VRnu_5RJO(m3%BOsFlKM36+{by)4*Ny+s09tsr_`|= zv@w-ttJumeav$w2=@Y^-+)9kq c!1w6Rq8Jf% 2^@mM0>n?T$3~XU5dV Hy^#NT0ZeK&%&G&}-LBl;JM ~GD4?SKVgk-vHRo6OPH z=$v;wBt;nIJ#ID_ui9Xjj$e_DOB!F0r7w4XNsyTCSiIA7-8_1Y$IL(HF6RG|ixAOM z=(~|U8`eF$U*U$%&Ao}f0jD7+up=axevc}XD%+)=I6l5E{b^anc^yDGuX93qnuliN zDd^|k%&wgd#t}+CD)$eE KeFm~Dy;P!Ec4)=X{v zyB~t>FH9b 4q*R2I0|Sr92_+U zMImcM3V`^<$>4(vhw}b~>|g(TlcxMp^3%t0y+8R|*7G(K{G>I`u;(wG1++cYdjvL$ z-%)|-+%z0pt&nk)zsV}o^k5sBENwK@Ml=xxYG8T3kd4K8ZpN0E)f(u9PrzXz@O7}q zu>ZuuETWgW*M-V1xfncrU36qO7I9Q-jX#2nZ1y@k6UT@GrU5UmL1=?j5^qvwJyJP1 z@JAO5W+vy{KJcZC+Uy-PHgj$dHJA&^4A_I71q1f`;Cck|(@I1lm8;U?2xV@F$nlus z#G;FsR)cf{m4n?brdeS}K49nDWl!cHLJ>RE6kc)5OH^WKZS;FrdZ7yT5Sx$lbU`@g z@2` #b( zQ2T^Eg G#}3Gh66eAdByOZwy4%S5-FO)bQXf|JGX}`P|=9bKF-sS z-%mmFeDRi8raK3AC>!6(SRq-XSnW@ eX|$5vv}PIf`N^dR)iou%m65*h22h z(Y_W|Qr>rw6jD$hKuQ>Q)~}XvHFC?Z-)JIWSM7l9&MVZ4XfKFyYB%52>oyVc{LB1& z3G{AOxtzhQnv1pP0~L`Zdg9QRM=L=9CyPG?Cy1~*jUgi+I%UDi$2T%Ae_06yyR+Us zGAI??*_CsRNkE6q&lCi3qi>{}Tjm8E_gKR+y5cnQ*W>8}xS%(L)9(OJF0@9{ToP=k z++Eq1a}V)B{*W~Y(ub0HS!0JaCqw4_=PagE@DKkzad1i`oK$jD!5U-c*AQ1wC_ko8 z*KGIt(c-%%vD8|+Q#gk~0BcXM#mTQ-(-FU;E~d`u4#J}|eU3jq>k7$jHaJ *n vmsjzbjX{ t>xD$C0gbJR|{}3toU8 zyi+L!KXc31DesM0grIE?23 LUHBH d6(Lkz-l{=(*z=^o^%m`qX3i8|V~6en3teND9wV^q2?aw0ceq x^TFY+r(KoFzktGb z?`~$K&)J7L5vnY$c@iOEYA!E*CNMo wL5}>XTsu5qV&Kp@i?-(n zc@wc`tLUJ| w~$C6CwQ|1J%pa#fD-A2(Pj9s3fo=qFMgJ_e-}_IxgTA<*>m(1$0l1 z5`G>gt)o8ZasOc@jw@HPKxP6hRMZ~i0-Av+wJ9)jVgf2K+cz;?bqUsZCT~W5gLIWL zxdUhnGSx2|bp?Y*|C2A+=Dr>i5+PTbo*oq*qs9Y6gRP7t#MO9mJuT1?v($rr-bXbA zBbEMeb=SE}d)tO3E{cAsRv$s4lyMY$KYLAkSQTe~%m3ttys0Y~R1Y3#LCAP#t?j+{ z*oEE~0#Bz+&9gH(PVONm(9Mcz#d;__envN=AJBCv9$*BPIZm4A`=T=n=X5mYR5N^o zkm-*Ig5C*JeB>_PlQ|328xCJ6W5U2S#_y#nv&b8YdujnJ=c-B9R0)DEhrhLK9UoD@ zZeX#iC17WPkUqC7NZA?@LR*B3;u0D_do8O@$X+3Pw63d6zVUEV_JE4ACO!vNMo5?A zdvB@x>x}>Gjr@-amI0;aqXEF#sj%1IN;rv6f$aVcry>>pv*ZP !Z! zPvO)RmZ!>qaJi%NU72Gpw+zX(Q@s2x32NGUinjIo5$tusH`ZFELExGCb#BZCOYfuX zON|rur#HARmf>dt=MFw*jo|*&`?k7_sW7`^HxUEUn+yZ8ivTT)9M#+v5BKX3O>^-w z!ccXWtC_3qNsLC57Q+KRnA9`Bzo)y6A*+d)jUIYCdWh~tstlIYHO4QhKLBuekg!QX zKYNFft^F0IvQ9-Kr7q=&z$2YXn!x}~0K|-nd#y1e*g4-buaQA8fYN%XdNOGrs?)EI zi41qB7zA$6sq!BX&183;sELN5)KkF}tqZkNry-4ltxH`}O`3re?EsfNRt5F|tiF_Z zCe#J?wNKh_9qM^=i2eC=@D!0@c;`$pRI1ea!DnRYz7fW~WhWQ6M(Vq6rn&+TDkZ2p z-sq>z)PejmQR)dbE9xVZw&4;eW1SDaV#n(@HFa8T+46_QZ|r=OMfzSX*Q_0ZU3VC( zj1JjYjal4SdmG-SGaBo *P5a?Bq8l~9 ZArp+M#eVani1{R-GMR}kX2!d)M*fo ^9||u*AXb?1gj2)(%MMNXnXMkLag$ zWnDWf;b|_Pl=_994#8CLX6qH!;CiHoWoNe7nh5+}jTrf2>nD#3N_um`!=Y2Q@lUqJ zr^1?In)d>>zmxUaJAJliRMQBItvVK*71RSc6ue+{zGTZ5AA+UIsQo3}azYL5zAXj` zh+f}Z&9LD!=RWY08`o-D&XTl~of2J0?E2nD)o&h_`$;pq$Kmz#k<%Lln{XpU4BNl! z-8O3rf8~DOE0#=gPl^VrEDC0-(ti)^JYTvxU+?MJ@?><^M&`^sGF^;_dyCmg|161M zJvlZ7{X>}G0;{#xKfCU`7tEU*{ome>wL1tytsd+qc)+iDcAZ@)PU5ovwep3Z|#G zF;;|iKf?Sc)*w-Qqj=(WEo&%r7*@mG8t<{jKl%R4iRtoQNH)=nzCg`*lIoJ;-? oW#%Z2g)o~EE3dSFZa{YUV?NxNRDO%%bzmv{|C(eq5>=Z zq@x1w@ZdtJwa$Ny+x}gej)z$%{yFKQ+a `&!@>;l f;lz+3@hh2qljM8_8=x>JvZ$sRgOHfhX5bfX)pi%CPjo>a62n>3F$QWg#{g(gvI zGv$h8Z9+qh^_s=VLR!cgul~g~_ BJv%ji*SfF{0iYy j zr!vt~M5cVsLAkwuQmKH{i4@gMCec9Xcz`{aFDgZfdk-NM=h8vw%iQzD#(f`7&Ji7p ze!_-dY~B!m_BnF)#NHEbGrIBP3D--9*Cuo%9LEP2WVhT?(=NVWvo1DCRxO!PRgyqZ z3uu>toh1F}xW*{V*S6nAd-xhP3~ui>9=|(qM4$sz q4U=a_BWArVQ8t6qgE&n4awKIp6|SoQHGNu?2&N)Aor51 zDvm(w4?0$+|H%Ve@%5jAHpu}QHAgnk{2>SvBtXb{uacyVeiq=vUgiJ|(yQjR(1Eyi zAuzR-j#ekzVkjvXz7vvy$E@B_(;d*I4ChCUY!DJWr@SeSwNKd0OiZR?(4n)A+=Ash z<8Bfv_A 1{n$9{XxRW^oO~;s;s@3{hmGQKB9=wrWnYishu0# zK}6~&ibEBY()vGBRQo^^5xXlHrtZFzH_W-16;qZZeFpXwo&1jW9? mBXJIf05^l?#9gOql57xO@%HLZTrJ%7$2`DZ?d@=Ed{#_?i6Q3x0uQ;GH7?`PG zem?Q!i9cnKG-4_?iy4ek0s>t^Mm>8F@ee*M3C8HHio?sJF>Ils`r%(utxZH*KDMcq zaUj?=NZ1|%9rMmSik1>tWU4J-@|{E?V~$2TZE)Lx^P1=JeAboWcbzSY8wdoQw%|Ez zAS;FOy()uYcr}T}CI>|5!bM7Ud z=~$`qn6=%i!IK`4_Xvw2Q97V-afP?b;^L`aJqKdc+DG&>t<83p^_A^EYzn+u5-vAY zLEjfdSgs7=f1PsiNeB|uWe(z>jIFQWQo>H8jw&*#Zi1-^aL#QC-9>thq#ul_xIi7* zgYB9?`}v5<3iP6V2#OH2iW#C@Ho6j{7wyDq_P`3oT0E%YvR&b0dn*lY?sK?5;nzvw z_sIh_CkQ?baaM`#8&3WeMN6}N1WoqpgmGlCov8v7@!3?dJrPQqgVn%7!T-xbDW+iz z{#o+B#fTrv5@4tjrqKBngtg8kyLCP8QT|Z)k)@HjwKrNwootUgQbu;Z=Tz2NQc^OW z=&5}0MAZ{-@TB_Tj=x}=MOUUjg1t%lu21=+VDgGa5{>a8C)n?7<| AzpA!`Wn_^@vWu`JAgQ*LRWF)CO{!rzApV&r)GhHv zZ$-zFMCv5%l>AmT7uzzYox{zLl1-G`taa~uUn_x?o-r$O=D!?jHXyqxvH=IdO*V>w z!TIW6XeOk#@EFU1?|}Q2tO|__v1^Z|+>@uJ*d`Rs=xuoc^XSuszCJE+c5@3MA^)j3 z8;wWTQ2Lo88su*i+EUPUju)U 9xJlko>2;wbNTE<$v0<9<#E|AC(py5tIXm!yCx3S z@?O7u1+Z`K{XzUO@h7pvjT?C+DN?Uz9bp}!`0`wuAM$YTHL9 i}YPxu2tRNrgR`w^a=xolei%bb;z7x3pv`u9y-?rW}I-j|CKUR z?FL!+m}x&AUFokdR(^YXvVr;4F3bjNyo6P8I4B<{3Ec qrX$3-!egZOxme{ADea>aCyRrccBnmUsO3uKt@S_mTAPG~t0=>YAI4+y zOa~D_qCP_E9V943gw@j+zWrHQaNg*UmU4r}NZ3`tTCOfZ=dlX$Nipjqgwd7w;r2l1 z ~xVDGvn{O-Vfnf_ cnfAW3t4X)LDrd(BI59@spoL2bmd^_}neTp9mi S-lzlhKQaUY&Fo zH=hKxd (1K+bpkru{xb4;SdI_e(9k_?4Os^0DIas#jQz!x9<1FfDafPy551_}15h z@)%$UoU;C&9m5|CJ9H!(J9)pS1UvZXBV~BYnnuY1<#kX1q#Xs?hqvlJc6=9>PWdnE z<6qwgtwqO_xxoK7>Ej8X@L%7D|B^m5H=OWmU98`#DkwBOsPOm$3Z5nZ5>C~>r~ycI zmALKPfBB~lO8R3EFEl*JL=-nWBW> #n>t z6bAQ5iY3#oCtV!rrn3Xy!%FuNniWC35KVo(^zA*Vcrq$ON-@!U(>-S_Ha(OvZFX_e z-Y+U=#xJ544}@@O_a9|3Inv@+?H187S6;DZ5v#qaTL-s@Qj~FBlE*QNwT!C*NTd0F z&XU-9?C>|DqKVAmI@80+EJjZMpY2n&OSAb7*5a31S0WB!#Uoa2u)pJMqM^b#(e`&U zOhVGL1Mk_Ga=w@~(n%;jZl^j&`-0M(G1q-9k9jZ2u i zP%S2M#L1OZh zb)lhE7t|_j=k6SZ*7ZuJB1C(4M=>44kwv*D5j=B2x_!WTJ&mVjQM!Vre6?@pmqQ=S z_V=}o;WW|>ROU}>N*}fttpE@{c=uEG`uP~boXH68a}c`v3L<7sTT&EG%uURp0%X%J zS(d`pFWRaBvBdFRD3X&{u^6r5D%DGsDo@$?sOPr=%Ny3G Wf}M{Y2lLY2I&WkV%IUW6!1*BK39=2gRQLcb&B~XVN#4fLt%6az&p) ziA-babtvfeveuh48vE_bvWVB=H=>#?AN)JcPs% NtjdL9 2C6s*lNI ztM<{HS2igf9FYy8vV*JP(X?f~n`RCr5Y|_Aoi!))BlW$0p_6^JfM=>zlvsupkCFP- z+ig7sn7N(th4Ja03hgl~gKO%6Hps^kp6GqwO{?5OSQAf1*Ve5& ANd`0FN&`r?>y- 1N7-`1Y*J*^1BS&``q^lzj*y>W}` zk^+#ha=>T`g2KILye~W%-9~tqjP~L4WYlK2DXHJLosR{CM5X1#lmJFueK0Ns#vs?Y z3~!mo)y3Z`jfnTq)M{pYo8rYU>CH4Bd}7%LLcL0HQpG}CJ01en)noE_qXxe%FjK7Q z4Eyd?=A7jT@D8c%cXJmYP5UHC>HKz_b_l91%i35r?8B2eT07>;s_W6PzU}0 r*RmA5+x;ePE{bEBQBhFeLzYN8feaX`;APjY ~wU$xT5Ka(mH^4hp z^(-7T=AJfG9MZdBuJ9kmexW?fw$+ohHKJJl )U-WbVSDbf zh~sFSttoKt&6 `G|v4H-vdyPLeL6O~cJ z%uVP1vfoovk=7rkhRM%!`x;=I>XN?bCSLJGkl*YQcdEA6zpR7a?yNF=Z}jkqC>JOg z?WLHJ%PC{Z->N~!du!SxE^X5@cFA_K6z~2Kl9cX5E?;r#iq_gz)swOQ!A8wzwuDTm zgi1|c_ovoDv#Isn%7M)Iz{7B&ej#!O)nwI6B{r*d-L x8r9E9*@-Q|4*sE)wu z@4Cj{AY;?GcojVro0ucnLx#4D8Ebx>n5jrc I<3SerG~^ldwe zRVoUinXkhJ1|)}6StNa=;hAh$(9rUuK;z@c%Z$!Y3oq*eh(+$O>;uSjeK7N^4?I`1 z*gn> f9wI{;1mLfG^7oynX)OQ_hOLkRye%n zB9*SXV#^Pfrf5y|J6tKz?@(?TZnv}tpABEL%meBX>l=5`p78^xc3RzQ>@IZsXUUSh z_%P*O52`DrG9UD3?8Xi-0c ~0rvMsLADmW3TyRG|PV-n6RH_1;AsrJ$SnHaP{&GQS&Y!$(y`HbI<5xFvwjvE~ zz{hk+vhi=)AH+P1b_4Zx(R~!7V~dGS88&7Z2(ULRvj`)s2H)V>nZfV)yQtf1x+}M2 zW8;1cNZ0Y;EKCDL&$P-!mq(5e) ceq%v6*H5XkY3P-EPeh%N@_po@+krL~H zwLc+3o?NO~roG3#ZTj6j;;%)P6Rt6|2bDi3{M2zi5~s^u$F*wm(_I^%(UM}=-zfDZ z7Tk(u-{BGVDQ!AHbjn)Ah`?!}Z@u%f0&+PrKNOd2yPp4!ap4Xe>XuudD8jc!FynMz z=(#vLjP|gUlgE5r7h G)L=RAIAFn6N+o}^$3Op|u2QQ@+{z)25tLxp}`_Llzp%9L23MSLP3 zzEX^wM!IxaT(XPx^7civ+hc4{yDWo%WeEYA$uq|&^ _=^Ko(e^+Pg$r9uCrWxgBiK=qV8I*-uH>`_ohyw7P2gBLChMQiKoB-@V*%u zws*T~E}|>%Y`~x&F2 <98Z`btp1Eq-_RKg{2yQ;xGknI-s)_Z2W)u6; L_ zP2?W#%?_G*79NEQA6#YI_Z3IjKyBAtf+xH7V7qbH{!qv|_q#D*` pm+s8{2}iPgCZ4)h?U^RL5J22%j%co51)lS*eT4ElQyT=X;z zaF7PpBUR})&UPRH%o}?8B5259?fWwuwO6sx9@sNP!Z(J9E6^1hlkJMNN(YSii)27y zp3+)l(ObhbsTGB7Cs;Kqt0y=@b*XRdRupY2nc)u>=GITNs!|}4O@CDmalmk~oN*HZ z4^HclWP<+*BVs%BLKD%tvPitYGTY?_4vl{pka6}TYam5K`BNEChO#g%Yao4YchT#W zz6CRnW_K~Sbpq|U!f8ym#LkqS7Uc;?(g=&=evyjrf}?to^6JK02JSujRki8$0*7&= zjbKr;S!}c|mh1fJFg5tZXRps*fJ?q$&K0{W`One!g>qVNeC|4&HZTk?&HQz^^jyZ# zyHgO36A5CqI9LhT1C1BEw{UeOsiVtxlvT5>9jQLDlzR014?%oY#sCl#-hxYlG5ySY zp#n1F)eAAogTr;}4& - u=TkG(hDrV2qw~tpvF03Bk@844eUBM)opXNhiRd^N z;nN!U1_2;=L32vgZ*Lm$3RhW)+&jetnTPj<%v}}3Ugv2$1*>x>PJzwDOo>`s;M5~q zi)<0P7CXnf31xSF-{+wH-qARy^N!T03kD`AdlpP|A
{82S3fGl!h$yG9RAe=y_hBb2xKr5ZY9dKBs YOu*c>PoyGucKcR&Hx zM8N?g@gt;<9QwvoKJs^L6J&P^Cs;n2WERbQ9-*?u>@}q$EP{Mon-n(W=NlvXxL8i; zL*=1Ag^A1Ay<-o v zlRZQ;Ct9?#t|E&Yy+___3*RPw#Es@i*EixR{eD}!#Dqn8MG{VV4bMJ!uoM~IF&NdT z`6Ur~_nqO?lCcalu%Iq0m^|l6kX}6ZG%1^WTF6#TaM3v!Qe5_y=P_WA_UJS6nTpJ} z5l*si-9`S(k*LD_PbB!|V;DrTRb{kn=Fqd6gOqyPt%9u oY$tzv3nDA)Pr zOHAcaWbzjD?0@E|=@1!BYl1xR<=%_;8t{BAQ1kF7W12*@{Y4=^CX-cBe4<_O@7@ zEYmSG(D;W_Dw>oKq%JdnkJhGiFAin~3%({7$v}~$e9-$--=ccKM3USdt3cPc+3ZD( z6nkexv+V5iSne6xN;cgD?^;vaS-Xhsz(&G=h|#9td`3VTATFml@1ck?xA^!|2&XKS zIZ)ebYQ1)pwJ!+9&e?bnmm=LIUg`=I;AdL}34iMruWPv&`M8-D#AK*7`M~0S)nLR4 zmf!6Yc-j4TWgOvbcS4<-9#KD7dU%kLzp_juD+*vO2Dp0l#1gR}uPVQ(Z8uuh-M;Bi z@74VtzwHzKiT^g;Ml*InV!fg; vfJM^16ei|yrVm?RnPV!rBMJ_)L zIa>2;BibTVY}UDuLG1Aj bu$jtAuuwjd=QLVKhek*GDs$0C&xFO0m+3%1i644WAvUYl^;v)@O@l>ui zmVb hc2&14Xf=vmLK?C+2$s!1EQ(HV zylmMug{Ope 4$|M$v+we)UAy)kg# UFL81&MAo$S 0M=28IIhTLs+2xFM3BJE%s0;>NKDyS} znqsWRlx1~-fhyqg8oRGEwfcsDSi3soWbvBDarYRSb%yCK-bo&|CuZT6lRT{gt9)J> z=Gki?LfE~z 5D`!q@u{-LrtG8cGuc|QYZ~)I40E!;ZOBZ|wDMjvcGW ZE-{h54%Z@hi#)H(-kPc`