From 65119bdd9fcaa8c4475f1c4e21cead32b1092288 Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Mon, 3 Jul 2023 14:51:58 +0300 Subject: [PATCH] NAS-122708 / 23.10 / Add `tautulli` to `community` train (#1315) * initial commit * add tpls * add values * add UI * remove unrelated var --- library/ix-dev/community/tautulli/Chart.lock | 6 + library/ix-dev/community/tautulli/Chart.yaml | 27 +++ library/ix-dev/community/tautulli/README.md | 8 + .../ix-dev/community/tautulli/app-readme.md | 8 + .../tautulli/charts/common-1.0.9.tgz | Bin 0 -> 55985 bytes .../community/tautulli/ci/basic-values.yaml | 11 + .../community/tautulli/ci/hostNet-values.yaml | 8 + library/ix-dev/community/tautulli/item.yaml | 11 + .../ix-dev/community/tautulli/metadata.yaml | 8 + .../ix-dev/community/tautulli/questions.yaml | 224 ++++++++++++++++++ .../community/tautulli/templates/NOTES.txt | 1 + .../tautulli/templates/_persistence.tpl | 34 +++ .../community/tautulli/templates/_portal.tpl | 12 + .../community/tautulli/templates/_service.tpl | 15 ++ .../tautulli/templates/_tautulli.tpl | 51 ++++ .../community/tautulli/templates/common.yaml | 11 + .../community/tautulli/upgrade_info.json | 1 + .../community/tautulli/upgrade_strategy | 31 +++ library/ix-dev/community/tautulli/values.yaml | 26 ++ 19 files changed, 493 insertions(+) create mode 100644 library/ix-dev/community/tautulli/Chart.lock create mode 100644 library/ix-dev/community/tautulli/Chart.yaml create mode 100644 library/ix-dev/community/tautulli/README.md create mode 100644 library/ix-dev/community/tautulli/app-readme.md create mode 100644 library/ix-dev/community/tautulli/charts/common-1.0.9.tgz create mode 100644 library/ix-dev/community/tautulli/ci/basic-values.yaml create mode 100644 library/ix-dev/community/tautulli/ci/hostNet-values.yaml create mode 100644 library/ix-dev/community/tautulli/item.yaml create mode 100644 library/ix-dev/community/tautulli/metadata.yaml create mode 100644 library/ix-dev/community/tautulli/questions.yaml create mode 100644 library/ix-dev/community/tautulli/templates/NOTES.txt create mode 100644 library/ix-dev/community/tautulli/templates/_persistence.tpl create mode 100644 library/ix-dev/community/tautulli/templates/_portal.tpl create mode 100644 library/ix-dev/community/tautulli/templates/_service.tpl create mode 100644 library/ix-dev/community/tautulli/templates/_tautulli.tpl create mode 100644 library/ix-dev/community/tautulli/templates/common.yaml create mode 100644 library/ix-dev/community/tautulli/upgrade_info.json create mode 100755 library/ix-dev/community/tautulli/upgrade_strategy create mode 100644 library/ix-dev/community/tautulli/values.yaml diff --git a/library/ix-dev/community/tautulli/Chart.lock b/library/ix-dev/community/tautulli/Chart.lock new file mode 100644 index 0000000000..ae581f4cec --- /dev/null +++ b/library/ix-dev/community/tautulli/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.9 +digest: sha256:c3eb00f142d5d1cdbff7843940c150a00bd916520363e6ee9f459ce61fa92b40 +generated: "2023-06-29T18:41:24.595112921+03:00" diff --git a/library/ix-dev/community/tautulli/Chart.yaml b/library/ix-dev/community/tautulli/Chart.yaml new file mode 100644 index 0000000000..0618ffdb32 --- /dev/null +++ b/library/ix-dev/community/tautulli/Chart.yaml @@ -0,0 +1,27 @@ +name: tautulli +description: Tautulli is a python based web application for monitoring, analytics and notifications for Plex Media Server. +annotations: + title: Tautulli +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: '2.12.4' +kubeVersion: '>=1.16.0-0' +maintainers: + - name: truenas + url: https://www.truenas.com/ + email: dev@ixsystems.com +dependencies: + - name: common + repository: file://../../../common + version: 1.0.9 +home: https://tautulli.com/ +icon: https://avatars.githubusercontent.com/u/34385001 +sources: + - https://github.com/onedr0p/containers/tree/main/apps/tautulli + - https://github.com/truenas/charts/tree/master/library/ix-dev/community/tautulli + - https://github.com/Tautulli/Tautulli +keywords: + - media + - analytics + - notifications diff --git a/library/ix-dev/community/tautulli/README.md b/library/ix-dev/community/tautulli/README.md new file mode 100644 index 0000000000..68da1c4281 --- /dev/null +++ b/library/ix-dev/community/tautulli/README.md @@ -0,0 +1,8 @@ +# Tautulli + +[Tautulli](https://tautulli.com/) is a python based web application for monitoring, analytics and notifications for Plex Media Server. + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `Tautulli` directories. +> Afterward, the `Tautulli` container will run as a **non**-root user (Default: `568`). +> All mounted storage(s) will be `chown`ed only if the parent directory does not match the configured user. diff --git a/library/ix-dev/community/tautulli/app-readme.md b/library/ix-dev/community/tautulli/app-readme.md new file mode 100644 index 0000000000..68da1c4281 --- /dev/null +++ b/library/ix-dev/community/tautulli/app-readme.md @@ -0,0 +1,8 @@ +# Tautulli + +[Tautulli](https://tautulli.com/) is a python based web application for monitoring, analytics and notifications for Plex Media Server. + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `Tautulli` directories. +> Afterward, the `Tautulli` container will run as a **non**-root user (Default: `568`). +> All mounted storage(s) will be `chown`ed only if the parent directory does not match the configured user. diff --git a/library/ix-dev/community/tautulli/charts/common-1.0.9.tgz b/library/ix-dev/community/tautulli/charts/common-1.0.9.tgz new file mode 100644 index 0000000000000000000000000000000000000000..42302997338c43da5c5c05bb219df33d54886f45 GIT binary patch literal 55985 zcmV*EKx@AriwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PMYaciT9!I68m(Q{ZvjcdT4XmiIgUbu!QGq%*ml#V2-p-o2Up za$pjYFs2BGpyYTGfA@E=k=VFsu@a}nbGjpwK%r1rYC)kYB;zqjcFsmH%X_zQ9RF$g zPru*q9~~UcRz6Pm;9PyL14 zvOD)c9+)H~hdCw*J=p*t$9arSz!{$v;3dAwV0H`m?AU-Q{vBl$ljH<+Yn-Sg<^UFzT9m9pl=r9%@`-INrcWxmY;yX_WS*f z4L`&IjN>a9UOzuMnVQjPemqh5*GB{jF#lj}e&&WB`cq z6eWntzW~4q&M}Oiq8Q#@ppYaHJpsFY`87ouCXxF-7ch$thw}XZ;&_sw%Tb2th{RF( zg-*f{QL25}XDG_+=<16z3$n zJpn<$7#keQU+E-{&q<8K+Y|6&@S5c38KNl3H#V*y9lh{DU>^z?2fc&d-hMr#l+b*b zA?k&uJ{Ayn4|{v{@WwF1FuL-Blix~c{oYY;_n;o2pL`UBlMLs#XC%qd=bW_^63L*& zsGq-k@$>{79{m^p>)or5n0mvrFDSb_nw}j+^TbHljQIwTc`K#v{nWWk~ z1fw@ee9LP8ien@s01Xa|V{&tz;VF*M5Iv(IjG+)X1~8_gOsYOd`df;^kc`vwj0|v$ z)C?Aq!P`l~W~JPj_@@x2@CwH`$Ea9+Fp5sV`w#N3C?mx}0H6y_U%q4nCy{tLu=^%o zoQ+^IL~2ala6-MpbPV%wBoLjXX^h4w$zjZE(4tX#OT#=Ce^(4(hA5e2p+GvuW32YJ zFrA!$gMPn1=6{aSn9rU6dXD*Q`ZPh*D7tGEJnX+>C13yk;^~Xik7uXn7ou>NjY${XXE4L#G{%r3MfRM;C{rwtzsbaOIg25s zuQ@=zt-wi6#$=M@vWKT($o{${*GQY6Im*U3;qabkFhu9(F1c^=&xGWNa#HeNtRo`? zBessd@(%nN`~$@y86%JraG6ce>(dKxad!Ih8UK7ag2^?wB@-clCp3p~%(&o}FQ6w> zzSEMW_qgy6?(V>8n)Wsr^l(CRGCl#pmoFeE{{zP{*zEnzWkqmz$GTmVV1En<$#vwO zl5oPOGK0_G8E-gN`3O@0(-ed-0apkN$RvpX%nRY3QKDz413d};m&uUtgqa-97X#5( z%m9F^$q?YAfWHmW7(t2v+W-Je0H$<;^oIV0GiWv>2ZMZGxr>G|N7|X4EEv2(R13H2k z;(OAcfm(uUV=QE(XZ$s|x&@Kg1OFz==Y~urU-C(Q4)f6o*b(4WX_yUBet}{X=BII7 z?Aw0^Q<%kMNbe1eDa>|Q1C5B}ffUh>7$f`4x`7$m_%mR9n6J+a4N%7B6kt<+1Al(@IY(In;}=PevH=W{+;bO9J>ii6;s7bwh7PD^pMeCbpQd8fxP z<)w?iJbMSLu0%Kv$-lcurljvK@|9B~yMm#RDXw7X!V6)HoKX^Ry`P-E@nRbJ%evZ2 zf4k4m-<74GpTASE`SRId`~b$h=C@X^AHXB+KRFtwFJ+kaN^eEG8T2)sr4BuglON||Je47kDhh%5P}63F+w0shQn z$drk)l(K2E0lCDLW~e(!hZ&3z_!qfiGU*izuO}(UM+ihPhgVDhd$ep*OOuZ`E;Fhday zKp>D|yfOg6j{N#jybVB5C{F>9GH$PU)d6>R8{Di6wuD*%PPV$1tWFWuFYh_=}tXnv)Fi%A(*l!1-S& ze^KE07Yb5dzd+TZjiy%`7{4vv3PE1OP{Ee?osGy%@`^+z_5LwJ`3PkU&yW?+@B|Ug zP?(eK7Lcsa)c^=bD7*$K%uteRWwf~n*jyao&kWcY-~mVwicr+kfRr8O;5y)U7~@E2 zg7gGHu4rzHj~jBfc9}4SliEqyy<fha!R)?sN!G#R{6s0k_Ws0aU+FYb4l-3VY z9!QDVVgVG74OZGbGdzabt@V~mc|r^)S+NgrTV7GdV|i1LW<2}rU;k=BYrA-n@Mpn0>X+3+iSDDAl*mC^V@{#$%X7c2~QAj+|HB z(0LV1k{risR&`-C#tEko@ATarNE!S1kN>DCL35Z-=>Gu`0W?M^1$*pwf&yzw;Xh1o zt&@%)w69FIJG1sXwqB~`FOAO@GT6HpPXo69fZ)0O)d62Yf)ggAfFmwAacS=t!P)ydY1G`|aC?|`_UBPbpF&|hB z6iT834Ww{lpLQN8dn1!ruF);y$qC7s1WZ}4aRN*nwxu;4CKTKt&cVner#M2=ys&ki zkt=u=--5Fj9Z@<)Inc%FY?5pMLAvH1DE#m4)Zvj}-Ud%(Q^khCp^FLq-{i_V^yPR3 zBNUH&bhI-fZaVFADjUGlAri7smAW<94}R11mDCH*e;4`TFf}5vgLYIFeG2k{|Z?(UfXxnL>hRTeh}j zYdh}B0}b`~_GOP`5o~@@V#MFyTwLA-x`d&9G-M23DkMpQ!n`XF%O4-|t={TpM64G8 zpm0P$@DGS{#u=DWrW7)!iX%Smw>@ydSOF`s$B0Ohhz1TQ$u8)I*<^ygH6;W~Tbve< zt(iq>vEjCOmLbTSl!`1FfU<*6PcKh@IlXvxS6D*=6NVyXG#RJfdX*IYr-OF!m?P4L z@HN1m@RgPd6c&=tmK?Sf z3sYP4w`Rl!+gS?pwOEbDaKAmPovF92*sHI%`X>3U4@dq0Pt*CI#t`Q|18ngBJ~}=+ zFwg(?`bS5*>+`==Jf;+q*ynxu2~`QIUx=nDuP!&EnbI0jp3hLd~%f^%(n3h5qn!FyKo17P47 z2O# zj9pwAXeA`?_FXCYaCeVO$zDUEW>0lZ-nc zytzqGMn^d1P6ztDBnfyg(E4x^ShcyY!wJ~jV)8ZUh9LN90)83>vL79{{Fp>$d8ifM zFa`&GlKZGSk-xj+2NvMP0Py#i3de?R$CpAKEokH|+x%&wS_ED6i7yJq5$^852k;;N zVHO=aMW4%}6(dyAkzq$NHa*?b&z@I-7R^f5L=dwmF(`xO3jgtcUuiT5N z8aCSl0`DBKmw})!cL~JAvr41>FE1-D;sD&>|GU>e-nI4r-GlyG|6j#pokFPL z{$3q`6@K<%Mfu)5s8H`Ke1O&Gr8xoX^z(WFs{#w0aTIObzaOwgpZ1QxC60e2PvCME zwmC%dmaaTNI#(3EH)mjHF?@I4z#0vH6mMW7Qb18??G9W*SgJelcjdF24nJZlj_|wh zz~-0pHy4-B-#)we`0nD_+dI%5fxI9355Bd{yRG()`?i)L>GW!6;De z{b-a}wrPM9sh#55-UHGi(JUJ5Dt#br#_~{|Abqpn^n%p4Om}Zv`eUijwS?r$__ubttC0(n)G?_N#tte6}P4 zFQNT;cel~)cFlO*yBpV-u^%ziuVA_{MmdZO5;CS&g6Sm%=i}{3x-p(Up3wXi%7zGR z=@n#&Qc7UM-vL|x*%ITcp2DFAn(kC{O=Em1?9nNS0`*GRY4s7IBa%sTqGz#~1H7`$Mm_qbqa&iP zo83Lzufp7i%=c|~BsEcMcBYmi+kSl8>|#rA6xq>;&q-upG1pFVfB2>rdUacU`Fx{I zUp>y|ujAEjGHb7CaWY*NX~7@(J}}p4vL5M3_U(hKZ!M|c&r_xUMTJk?;woU1{&#e^ zZ|i@@yT@z&Zxs*M^GXNEWvGDV)cMY|z_Oby6+yixtJej~))!O&tHrE8(9)<7N4$$OFitMtER zo&Ei(h5om9Z0moA`~9{4w~~h|c}qI``~J@T+MoG-qw~I{pY^TJ`PORP51`g9^^9+= z53Ti~wLY}Slw9jWYkdg(A@rd?+Eb;MNYoeO)`b{x8}K6Wj}vaL~h~R8wD9W3!0*y10OCNm372J6)1sw-S1+K<`xR z$eK!WNqq(M(}d*ck0)YO@qeEFe@O=5#`_s zKj+i7mTjvNZMd^48^#lwqwF6zLRzdsS%Al^76rf!ju0RjNJ!4=Ws?|5==`S*mri(> zWD)h3S*jIt7lgkrF3u5wlYB%n{BKU79%Jk}KmYOtaGgE71;Lph##<7j00iP6W6v$A z$qR-Cyf}t9ZDo zCnK>fK?4-i=G*Fka_ZJv#F}HpcuFwmyFVb1`rb;HQzTrnGm;EvcPUd6 z25(aMX@UYP?;ZMNFbm$vAVgV?2RMXz5fIpg`4|M(lPi=ZC`Vj$%wr?6y`J00X@N)W zJDcdhK-d=uI>1Cc-}}roAxBofW|eq!lkExvQfCl!RsNYjo?c zoo09nb99Yv{gvn0n|Q^Zz43V4uWi&A1C9a{%kvB;!>0x%=Z%ClM=UH8wY7}=!#~yX zKiBtG5&!GR6aRDfcN}yia!&DmPe~-OVP6Z+0M+nwl!J2;0a@e+F_oL8J23#HHz2#|Qgs{=bq(@OL)G;8`-|xdxw3(wLvO&Mg9nIn*mMUH0_3G>a?%0+Dht z0Gr|m2(Hm>05-4DZAZ9O-edHj690`NQIMCPH}qFy4$C<;5TsxwrV} zk^t|2q8|WG#J_ol#Sj$RJR1aWJ$}rCX~7|+JyL-Z6Qm%N!cGj|ybMD>yR)*s_w;!k6z$0*viw`e5V#4)2nfkdz!Td0GKE1{N`M-6ZB$o(*av?F1xH+;jlaM zWl>VT_NSTAZCD+!HEe+~D>?_tVoRJAXM3JE&U~M!Sz_@O+ ze1p@7TKP}&p;<%%Y?A->j~)5%_-O6_x01)O|9839k{WgHzO)2^Zb{BqVp-P-YNj#1 zwd~hmtZ(khvP3soNcf!b0`jN1ZTKATG#jsRob5_K8uKZA>&6qBKSd}#Bk8TQ0$6gN zisuJ<9fzIEUE6kp^H~IbqM%z&Fea!769DBvq!1GnH0X62WeKzK3Wus$kdP4CBEj9G zaE!nW0@n$-5mT^`0tXox19KRZrJC^~oCEYZjd6(c_?APwC_L*x2osQ@0m`_0BwuP(s)z7qhc3dJ^K=RY(Pft#txdpyuSnyQI60H_yJ8vgumF24B!9vzUS^nZFH$&v) zf*TGD0S-qUV;_74uMwb=%;*e2pE1p;<#nx`$4$n>I;ssd4Q#)3E>Bs^%&g**tpa`e zbiuRFsSvIbl628H&2PcaCXgq7FMAu4Eq^a;j3gax_kQa%%8#N>NG?GCjH4&u{ZF4h zF!sVp%NUM}ztd>rb%D)D&KBSkvHgAWTsIiRaLA{OxSE@xDY<3>Yk)qdI73m;u?JO% z^t^RmdoDt;vHXeF&?}Ir%}yBEF?mGky>eXM&=!%gMIEx0jEgPPKvPMwp6AJ?Bv z5KrVWCv80zi}gx4-Yi z|JpxZ>whbG#P%*+IVc!Rl2EuL4@d@vC_x#_nNGr|0#G}x<}#97zV>Hq>VOv771!Ft z3`@B2NZbB;910KI3BH1u+@Oqm7Eh889PLXdiJ-`IOI32-cGDaB=1w}(hg%tyaIm&wA zMb53Va!!E1bpO)hUMj3RoCW7#OlZyqpr}QA7PggKRtj_(V*H+yS*%}%=Tux70gwuJ zr>oo2!Xj=%%s6!Xw=rt=Jk(aY{4MXTfUh7!X$(UIg8vLa@G+Qe=6&mp^?^LK{Ga5j z;Qzb*1Bd?~>>jN7|0(twa$YsuO58oH(s zE%!|BgQYBTVgZOkU{kxe)VEKP+BBv*SlgH=w0L8RFtv?|LiLS(>j}Dk?)CBS|2$67 z7^cgx{ZXUY7Mw!CS=kS9?vnY@y{1ZKHxeO0!m^jY-kl z$0ZmPqw)yRFe&o(Uct1&pvbB`RskjEvEX`+Z=dW3%(zd2*$97I-OjAef#zRpCb5L4Y5!;6VY1Nmk7oJ5Z`*&4 z50BRQKUeY?`@bCQC9(hs@rU37MPHW82z*xu^|W4cP>g-m^WDGA)@H4F9N|qjxsPt*$`2FXnuu2@NK)~oKh@IhxGD>O!D|X~2_QbMXfb3-G7Z4585y7G)XUI->b}v+821~x zeTxP>T6dVCy!dl~Q5>tKm4C2lN|*5jp_mzf;!lW<>p5;zuz3Of7naWP&1oojU4fKBmIPZ8D= z`M`>GX%kucOeslQ(9pB+fop7$`72m0F~QyxVX3{{)~Dg)R`u%Xti$uRhjTO*VNc4W zXv&X9OKZn5|-ii-v+LU8bkkBzGurO%R6T+JHeKxF1ggA=*!FfpLGO&x)s zsEj(tMTX+$`Bn(WDCRC%vL}`kSi>;Lo({+)@q|Ot%Q$jCPo9Hx*-3^m|EzB$xS?<&#zuB-if^T88QIqTy^sr9dSeD`zx| zn%ul(AtlpSu+)naoA2nOg@Y%=)*QU zt$Z2rx-6(i!M4C_#TPb9KV<7h3;mzTqW5Y4JvcnrckI9G_>Zf39Q~h-_R@?14A_ri z2oQZ)vN51iuhSI>U3<_Z2Z@u%hQMEUO&y&l6yw{zTG9pZj`cxDqTwEGm6pfgJOLo^Q5!363w<*gYWRwlQl4io6Nhro%7Zq5 zsXUr9Bes8o(@8N3lHn*iI0uylfs8G@JesqP^;mKKu~X+o^U${TR!`IZKfs?+^lULF zkcR#Lcz55i{~YhF_y3hV#{T~+8|>wIfvCCjLvVnyGfQOwJCDHWl;8*?I0h-fNscl* zlAjR>Pu~~|oJ^ZTMV|Ds2UgfpuW=QPEwD=y&J}{EkOytAqiD@mGB>2+= z6>com{tO;OeB%+ykx+L8;y3_7NXF@eN5-4vIL7&H0D@r#(-9770D>uw5b;?JLzwbW z)kxzJF$xb5UY=txk0sDgtir%{)!OqzAi(~aCEOxKp-i^Jk76@2=F#=)w98_>+u3?T z7>ARX$0D3PlBtn9ZIe@lVHB4F9{+IpzqS-u5b*MU^@JqWlDzz19m=~`rx(9f0uo=V zVLAOSC?aa=9XWp|VwZXw;veT}hga4BKG%bnldcpJ2@|}0}x#P zFWUnGHl_4Epj~A?(6T=NJtv5d7tb!MzzD-)tCd(XoMAedOM%F^eDe!8A?Miybvhtm z|C-uQyPnCN?CIMVzdw7+Hnh`UUc7v9`Qq7y=&IVaYPNSLM$;?}|Ni3Q#V;?PeSG@t z_ZMfX(SV5%fscoPA_9LlNfM^*Kq^Ekwy5}w#v&ELRv(ZI40&Lnth3GEWr$BhfRd># zl<+l4GHsESyKOI+k8huyKK=OS z^~?YH`1Z{kxv2%a-WBJ!>T`+Iv%{FmeXwg1mb9w$&HA8;*@$8t_JwKmhBhB!M_pC{)M@w z)N5rF=#$4F;3ahgoGf4lswV#{AU(D(bJm$zDpE_7(2O>Ut~~aoJ#cDyMdUWd2Blg4 zM9m|56@a?Ya#Ud2%TP)v&WVvOoWwZ1tumGt6E!Hy1|WDbcun&23{jNiH3613Q&s^Z z-Bf2*4Nl`5cuScsho&eCEPdFtyZP`gnplYHCBP@mMmTK*G;>^uhY!y>TV_GyZ<+LT z{S;4={1@W^3U9+0-CzE%{r>T>E&uKA9+#FLIdW2D8`{xem(;=ralf5RCFXmH$wqf+G@^Bds$MX|rJHY>R)& zRI@$n_{U*bthnsTe3yd@oSuN68JHH_N#{wjW&UrA`@c#)D0|ssRP|%tC}8QhGcZqr z))<%+)KL+`yf`sALbDN5wrr#1qbpxQa`?*&%bJI?-7Ps=?OwHtC?~R0^aO;K#xQLj z2O_0!0D^KgcjP5lEeP_S-A(BVT{%*68G6^>d_80^o+F?0+`VbIYk%$kwVKC}|M*}pG5Q;a_d^JOvM2ZB{VQ{E%Y@?cuTt`I zJtsu!Zo`U^lBmdN?}Qytr*m3jb(w&?*Xvn6y#osaBUO39E(AOgpa)Z)a^B4w?uTb3 zvg?{xuXY~sTsJ9+#JRNWl97#ElPzjN>jE#MPm%xJy`^H%ui`eEM}$Lma0e~jJ#`b^ zbAd~CO=WoZ^~^&2yfzv9JZM*6WG`{hL7S37kpo|lb6fn>CagIsVpp-z+AJ2Af8IJI zZJ4|!>IxliqW#trxB_O~3^rzQ(Z%YyY|ZEDR`fYRD`s*HZ7X7dcqT~Y+-^C)jZS-K zdDTq!PV?pV$-0K;Evik9iV>9jgbkK|0=l?*)^1VgoWWu1#u5VsJ>vL zWnvaY&Ryk$^8eXMpe z9Kblfg5mX3@x9=k3MX$kH;t5q!dJ9q_Q*@iqU>YYQ9rpXw+pqK3ZDvt@}ht_7`&8f zNkS;;F-cRD0jF7E2GU44A~Y|-slPb5o?D&o2v*5t634SIvN|SYRWQ9vb{>JtNyh!y z7!I#denYZrK$2~Ma}aXpHCmtt;3Owwm}909-*T6=T-L@pU=st7!Ju?c%Fvih5nK4< z9=JexuG-65CYeeE0iUOX^Q2~KkxPrk9PZ=9ypCD zVI4!FyVRzkA{^u=VSLay4PU>x1aL4wVb1Z>#&#P(S`?G?6v+#XzVWn)+*xdd;*<)h zzZe&AGeU_mW0*QK$r#TfgMriqzO^p)EuKdGUohq07fA!vp#Sgf?_2kO_jZpC*Zw~% zdG!3hD5KyPNO8ElG*C)?wr9~imnb+3m`Q1OTWzhOH)#2V%WHyj3}gInb=}8s?jJ#_ zbT>;USD&9r^~6?vIPm8Lkf~v}K#6%dOlo3@(85Y#)w)o?RJjy|J3E zYjR8jx?ifTSlNBj#B<$l;3!5O9YOaoSI$Odoj}$II$&$l8Saipn*SBzm;o&Hy*NWK zx&^Rky#()-=(VAA#X0wk=#7dRRDzY^iB)?{Kx3RJCNS~`$?G~Hb2KD;#BCj+PED}4 z=+gveJfm=oAk8_(4nelXP~6(HLK`G~*hMU<5>=0{ib1MVy>Zn0^_&d zUBCaQng5fkMUw#6^Z(uc?va!K>)^1z=KrgB4Ez5%AM9nZd^#!c4=&@}}O?igX^Ia7%F(w((&iI7{FbPqNH3mXt?j1i{&TVcN~e>-AV zNyzH^)ddut9CLI}U@()Dhu&WKM??I=O{@#8h5`1AHxxPtTqQ1IO*Ez4R%xaxw1bs?B8M(pF;0eUfYKktoX5LwQkca6739r9p9|Vh7q!R+d zx59tLUS$j5@7W953RIVPjL5|6R8fm&u}}kJr?0@Zfel*fmMuU6h2#{looq7p*++1Fmh)f1j3sFahjFx@>xF}%G%AxR=8E;H^r$6~l zFhrEgqtY-cyo7g^N%G>)GSf0lSNI z-3F%!u?t8df&=rSL8ItwNKKwuCr)pRZg@(tiuS~`YT2Jz6}tyk75g)*Voq$Ug87jZ zH>SN++V}?6m%P5ur^)_T2H&}_`(L|z`}+sZ{jZ~S{{NLchWPeY4fb**w_@)65K^1g zn`IjU3(&Rk7HcFevrHjcl&}3#RQbIQn2&qU6t-*XIrc4ySz;k&$qap(Aez&Y4FJM) zaw3DZD`@I-FH9%G8)=NjB)hFFCq4uH%t|X3<1x-Te-gh=Hca!6T~anHWZH8`DNcr< zzb*Vzgi8;fX*k~oV+6Ug(Inw@%cC>Zt)4$uc5VAbcNRlIBU&vMtBBB6qcpeEJD;Dw z0}6>H?_G0u>3iSCM8}rp5K-(nD$<@PQU0m#cf)j|Sd9?|(^Q$BpTDcQ1QEg*v0?XU zNM%jdN1qPRc$A^QGXVY|>6%5HRy(lEC7MyB`AZK9<=64AC^7dqnU|d?Jn*B}mg|Qg zRtqpD#VpSd033^R6Uq1>PNZM7NSIO((L|ymC!pi*pd3JiU%W`fQ+1`IqnVn$j`CU$ zy`ILj+G`TB<|L#Yx@$8?@jTpBsm)Lm5qiy zu-n-NTffEx=JG|qcgSA7!ZBvTzj%4r?~gk!;wJK2BC|G%gfRbX=X~dK=lRa7o!?Yj z&lzN^6y7<f~eb(4?a2#-SCB3L=otm~C1q%@_w76KDRT9d@ zNPsAhw)m|Z!OI2rQUbo|6mEelPIKO}z4R5YsBmJNt3*VTQH=IG{#1i)4ms?3V&`aO zoNYkjnB1^t2P7NAociO#@#7y61VyAQRr{~R-on`r3m5HWcneF1)M%D^>DzvVpL=i z35GGbf^h&y%3YTX$^1LYdc(#{i@h&Y)vCb!s_;9CGJi?-r6|U8NBGN$q$#YRH#dM= z$)7^t?rsAz9(bPNDUQ()J!48f*T)tN8Q_@vQZgRu zR5FVR*HrytEgrliA&f_a=7FdhtG`v_4UMMaUts$;gfN9yIL0|f{3xZgHHGDz zDvR`(V!&a*C_1s_>&8j|bZZVUz8H7bSp(qx2T$sXdJLnCqyhr_)f&gL+AK)&CR{9C z+sT<)m@D74Yxjf)zkln!Tk==^06#*zgU# zR2aOOqAbIabP+7d{Du0OcY>N)ZJ27PhO7TDTr1G4AyRppnDWpBHwcXJaFnxxlT;wZ zLmWue4-Rsa@rVk@b92|!rAuxQ@HBs3juL=CXPfe#kjuVoJ$!1ay;^s@+P4w?!j`i0Nq)Y5?GG+rpFLJ^fq4$GjN%%s z8k*uHUj<3khE^#hwB5m+zL;Q~`&!jLzEUjF&6#f}Nsh-zdNK!w=o7q4LXrrmwbA$+ z#Hpg)*#q;p>w5bOJQ9rtjO!C8%qT$mj^LXm$JWR44J1+ktyuy{B4>Po>4#S5RF(bE z#k;v@whpBIy!LKhFk)yk%@rhJdW?SFAsN%VL@K zgQ3vQD$jfGx53+?(Ry8?%MvlipR|VRu1-ZOa~gkAHrB*^k>QDflZzI%6S05er1-eS%e;a$29snt1MsU*h-DGT3-6L8#Fm* zR8K2L%f~r&aBJ52<2+6Le@f!X7`-BsWd1Y|P4SZ82>S|qiZY66j*<|09rY?NovZr;WqlRLsC-l2z3@c{(5wdq z|EV}aP{FxfUnrx;My6XYODjqSiHu}n;@_sG$b7C}t*%F_j7whVviG$3kS8`8$EE=fy43g5jPBO8lv zB3bQ!1#AoR`#TmHYV8fH5o+~iB40bU4RH+9z;4{F>C+p2qNc)NVAaz@ZoFq3qN^o@ zaE#&*QY3fbYSJq6sfDJ$hn^%3wlUnG^z41rj;h^W&(N`%@b|T`~ zY9-z9bT8_YCfN8bI}IX@2~0^dGl2348$JXzIm2Tm(l;(o&+1OIDmSg7y0uvq@Y$}_ zUp^e z6&39>c@wRgPPCjlwp)$@rzHHDI<6`i9ytgmvvjv`A#pHqdt~K3Dyk$!@}pudTP4cH z%ZsTttWt%VV~{}D#hp!wmyv(iX^;H7w*|tMBjM<`P1W}q=~Q$Lug5tvt1x%%ID7#%o85ykag?>_oUJWqiehUvr;@> zlc-vH$+wv$veI$_2OX@>q-J^M-T#MKy1f1WaNpklk9ODjKUVS>`#&4hd)fc%!khm< zOh6Bze*a9MiVGN-VdrE442IbMS)UsAf5QP=<+Al5RB|pSN3Dajcq7s(h~Jwo1ts@k zI5L)#7RgdmnbdU62^yYx_kWpkp%n{g*#GzY$M*g2gT3Q}_5Qz#$Jqbnpxz4$sLs*x z12KT2liyeoSS|}-y;>FvP-S2~Vr7CIgH|*gA(6O1=7+gAu2JVQnd#o>!bTsMtWR z=V;@?6OjXpQIwb%p#%-$0HB*vOA9J{IIM!kdZ0sb6S1JV9Xas(F;1?Zdw=GY{|b$+ zg#_5B{~z1---Dywwfwh|$Grcc26b%&m|q6ey7^;S0`hQaQs8|V0t(u%tpP0`@BWWI z=O{~H{36LwHh>}8`B;Xco&6R-!~TD;w|`{Ee>*;2-~U_5BRz-2c!OfVwJ;}(Fac*G z`Jyi*odb6s-`9p?H+I9uYHT%ZY&2+W+sPBVjm-v)ZQG4)+ji!Ce*br^`2e%#tU0sK z-q(GNX7+it=}L8wtb-KK+{k$9jje9OCx>Y|l2b#Tksq&=ajV|%A9|ZXTI;WZ8y3lm zC&~Y9&Cd#1LdOIPR$Z#&$8+AqU02r@gN51@jY%S(SljSEEm_-)La3$qt^~m-Ya9ezV#k~!%T62RHzc7^+bF_Z(sE3j-LN)9ZUj>dVURqV@7^216U6Y|tLT?^QW`S&h2Y)`YxJof-;!dN zIrV=zM@!f)8I<<-`pS2&G#9m*smh=I(#i;>xs)Wq&>D0ynl*s-mu;jz4wu_OFbP-K$*eJ#8KfoMHbF4* z`SsMBWUf`~Ui&9u2NptPI`o>*!bK3W$LxBjQLliEfkEZX5E~=WcyoYxmx5*u5up+3 zi3Tf-iBj%)f$Xh}iFXd3M^&qTc`8>iRr0#QGJ^hwa~ z-)B#xZSZZ@0QfM@uni#NzjHx^Z{tLo8gX8?#iu|+Bn0n?Dr0lj<8jVkC~Ewe(zUQ& zLuJ7BT0>r-HyDR%`J--;$`ZzOroKSsUiQuht;F;t@40ts*bIsq@t>XR>STTI5`IJ? zW>T@YaY3?5z~CF_0zE;3FbaJam+kCEbUGh9;=kR7ZmeL}2CEu(fHa?|cH+V(*wIJ( zYc4PJH_kKQz3(Rt09=3Y{Wr+?qh#StDJ&I00L2p7Kh3lHK0u!v#RAJ&;&qUT)J@&o zX6-nmr=`z?8#+fhrW8NaG*dk4hLat{5(y#3x_S`x`Hv`GX;;2lJzXss{D>$ti1S z2<}#7{yo0jvGtv2mD@s>STED5+eS{5cPyqKU#^jZU?=ZN-uT0Q?h(1y(eU~&=9%LR z`2E@^Fk_GpD0W@00c$${5tebs{Q`&n_o9X}c~RIQvfD@#l>9Vtpcm~Ka<0s#nh-q z45%7S9peO-WtMPy@dfK@7CGiy$)X@45wzCAd$paMycUB+UD^yK*V%+3ey3VoLm1)O zQ8FmWexY$P6m0b(V;#~j6H>`M|KduzE>~YLeibRFOu#6Q9J5dvbq_g>E7n5C3tu%} zY&NlKG`hr&4RZTS!>KC~-8k@Prko6hPbei8^QR-;@EvH$6DB)fH~(RtDc3UkR`;Cl zNmJby8FbO<`*5>-JWzLWI;%O^`u_X#KLwTBy&8zycpWfN^E))Chc4ror~Tl3Aof7O z`IBOFzaBPZw%~cVqwmOx#qLq)52lwex^6;UHuOsj^#!3pp2mBvVYEY^8r7&dO9AOm z@Ut}s$)^)}lO&S`*rfCk`=9<^K9yB-vZZLMZtv_XaJx4OT4qg2M)!QeELk1%vx~|% zz(*84#k~TzY2ifihm6>)7zJQQ^7PGGy)#=t+35n_jetHF7W4%(#zj`|V?hsTDV=utKSxVr zl3-_auXgUeDwtn5%7M9RjkVe5%a1tk5AWs&;OEHf&YOGM-_E&Ozi}@llSRCZ9!Ewo z0~3}A1u&ALuQ<4+Bpje+kMU9D`M&x3Y!BLO1RuspiOb)?)yP~9@YVBp()*!I{pTuL z@+(I|Bv`))Y<#2xReNzapk6Tp#1y%2aLG?yQ?2&otM>Gk*-edd>^*-C z@s-*X#%#ZH=4EwCw`K~!sX$K)pKxJmh=MsU#B82omfQ@~%2fkrs~p~=9@xrdcaf2C zYX^7Deu&k~#u=@0Lf`fG^|hrCY*v8BhqI^6cW|wCIWM61 z90Nb_MLN#cnm4*TQ`U9*Llra0k2pj&?5#qV4@&z5l-Nlih(SdyvXv}1N5ZT~orHKC zYO=^0!2ayGG~Bc_`Kjvn*ebTA9&w848(M{uV|w{}$wT#xL-rz$j+v)x9gS)pp@jGy z1J+Usn|AVP(vSXln?q;X)ww|TRx(FX=hR>}@j^b(BQI5@`?38M_`Qz$`IZ1C7(gBt zL%_x5!{P@RAvE!mVcn2z{m`^YKfiqU>=l@B!eCLu!(Y{dQs6o2yMTf&?WlfJ(RnZ?Xn*y-PKqfrBtqrPw`f)@%t|I4)mgjbs0yB>ePyq>;;aAF)k#zK8` zS@)t?V5n0Td$Os>uHJ{hlY8Zi;jZzlboK8R&7V58>Iado=idJ^8~p$91O|?P0GUdf zCq|E3{d?JL21xJS&u_c(!QydVRTpgwgx+A%^IN?t9eb4gtY!wV00Wm*d;?ldmHJ$84_TuI%5Je}q(K65v$a z_=Nwk%xw^CkTdRm9qZCz9YrF1U`xb|bdF!QVs_@4gUD3;-&8s=EicN*@>(Qu;#LPf zO`r=_e_1UcfhR>yb1!3rB9mv}SqBud^REEM7jH6R1!J6#K+D^!R&9|Nq#^)4uImF{wfTPwSiL) z0|2&IM{IuBAFeU!+pBvZk3yCUx*iM06DD+X-FQxmC*<>6zQuNfl%@6?)4zJV6)wX) zlrc-AkgJn~!xlaNxIls_6naCn2fa z6|OvBJp&Z=^&u<|0;MVY0-5PC#c?p&NdmFashpd=xRwD`k!>)8!4pNp@qHQWBrdFk@%6p9%3#qS#=nK=~V-|^`5sXqgDT64*78u z&H3U&;59R{*|^?mpl(NF1yIz4J$2WQebqX#9IBMG#AA zVOmKZePtx2Rp~X-P0VPc*6Bci&`{5C7c67zb*PsrHD_YZQw~kG0*@xd`bE87u=T3@ zv)U<0v_AI3hS||cu!(QU1K1s&05*iz^bbM$BgRLdi&*B;w-$8L@~=myqqXW{lMv-= z^NRyL@#TV23tlf?qg8`l?i1Pdfok~zYSLv3w0`qTi1D2(te_4nAN0&6R6)AX0QY>OXX_YMulEBf7v5jS zDdyZc)y$T(NHMq)QVPm%fyHMA`R({AQ$wq;AB&{3#Ze>S`%7}ojE+HfN1>y(l_XCC zb{SL_*4S_!`AWf;uP*WRek41plR)A5WA-kH`0R4|4Gf;tH90_lvX z{>Vu7K%C-sCi%Mf=w^0Yu5T~VOzi9w;O~pbQ#H-y4q#pV7;{`}e4->aV-d}3c2sm= z?~?y?X&xZ4{7qSN@d>x>r$t=%QU-U@S@#LoI%lHI+%;QOb3(BmGH2_P^Q_Fcl0)aL z$OO1TfzAwKz>a4%n(?dc#VuOPQ%COYTHm)L6qQ3bY4xf7D`P3+ruCER z)YwO}==adT${)TAavZ;f9%NtI3fJ&W*rWU5+@q{2Uu;f9sM6iO%}&`l0P?nvu-cSI*;2WjM*f17GM=; z(J^Xf3oLz*rJ$BB5JjUxxErcM(q_Jlb8ImNVe#UC85`Lo38L!(kpNo8QKYY*Avq)v zH<9*3XQ5OHFe1nWBoOlozsJE~hWk#Y-MChR?SJiz26Ey5Xe^nE;T_YKw_Mn?gz21K ztg+6JMk&dCI#j5;#e*^r1@Z8jE5x^R?Fo=nZ-Y8?Z23g4o1R43%}if#R%b? z9tqn-1h6LpdCZ#vzRpkz`3O_e>4O&0@kE0L!~L|Q8BtT%Vc~%leYVxBn{eJ|T|uZz zUJ3n8TV}!Wc?f?YR3gJ75{rU4q&N-B`a~inH(5mh%;`+LU`;tD1agUTt+*n|2iH^u z1y7PqtXcZp>#oDYOOA|aK{@j1>Dya(LfC!FaRgH-qJZLZi*GR8;r;U0KmPTKQmbJ~ zPG`EhY?q$i(~#-R$96j5jLh%LT0K?Jhlcc@nZ;WZaJYSvKW zqV}L;wPxp?qM^gPPn*Dsrwo?t$<|R=0Z>u9?SSU5Nt0$WwQo#08cfC!F-n1c5N2O6QvuBjymZsI5HN3*61iDiiqIJ^S<81g@kwFjJlmDh0Rb2OH*}1Fkv99_ zu$RTVL|`|TXMSkeXk-J?U6$I$aw09Z2Ne%N`z#*Jk8AcWzRQOm8ky$8i6_Q;@j=UF z!wx^!!*@uv|8bSj=EKrHt3TUJeVr*p~1_L@)rmo(wxz(jSg{trVo7&G+{>p@w} z72<-+O-I9b#{H5;z$BdAzNU%M1u}O8xNWvS1n~*2`~=(YZtx#+nv90kQHEiega=`~ zs@+J-@W$NUrUFIiAxoxFC=!sT4U+k{B!wA4N;vdY>w-}0;`urHh?U|^1bu2@zP5~9 zV}1XaJvt>-6JbLkUKskXDce%Ee9Y{LYMkh{p9N6)6qN}Rbf~?Svvzv0mhUv)nRC5~ z<(+e6`^$;_m{(r9Z?ipG&$)QKW59kfSTde5sb0TlzF$HWjk5#oD{wv&ObxG=Edt4O zne$hGbo?$W-+$uBeZlVM6^ktZ-uLxmQx9Zs?+bWS#f$(0vCu*XvMmS}ig{rSa6H6X zjg(|M)t9heH4&=444rgBdbqJ*k|T)^p(&(5Viy>RJi|s}zJq^bT>l=vh~v+DnN^TP z=Pjxd89r(BZMyj;(0r9QXVl*9Fyy1NovzyAgmQ@|_jg`kfPhW%?#RCIG0tQv7Ng?t z_19B^-C2jrP!-}gEen0D{xVeGe;7@PUFTXr{BxkGJds7xV6?C#mlPtt2GN%MSYnPh z<2q-m*`8Zh*R{D-B1ieNDny?T)b3Mb|E9=Q6i%)I$}9xOT5HX4di=0k;K3KUd&tyT zffqGbG$|-8#IU_xT#^PUjPoL_ZXU)Geu@sr#K>t;36G zmy;mb%Fn$|i#$sAK~^TU`r^V}LEOEVWNHnGU7E2h)62bro-_G$lqrxbo!g$$CvVb$DrANz zwqyqV=0$+Gc&5sMTt&Z_n&h)}^ipINx!H`I6!P%1NeT4gO@bt(@m(==5GZ7=` z6~CKyg>%#O^3=&o-u$3FUkJM24JJK6oYUx_sjIcK+*4_KfGeB5Zw;ntb#MpKnT0wL zr<0}WQ%%hYYIH2t@w?)k7}^^fMhR2*r_oUr^~Xw=`V*T!@!{4YZr4THA7jc~gNSI4 zcLG7=eBTKUG@+z0$8j;*MLt#q`RdQRyoXL-fih2&=gV3mr|u!5a1nT?IlLrT>!P_J z9OTbl4K|35KN_bOGz36PJ{YHNK`$$dw z0FI`sHVCtqc_@DwO}dlXE^T!z8Y5GQYxlBJ3l;;_)^Y~@`qIpVAC3}!2WnGthe=;O zU1&1Q!4Xz)Ou{^enx&Chbd^LEmQ(h}!}%qB7-80G@hC~v8{s2e#mJ6(oud>lQc^SC z&-E_^OFLW)*{7;+d&Y;97T9)M8!X(~U6s@4SR1+58m-|`(fNLC#e4Zgb!dL}_kR^4 z0?vw;m#owTd{bd{HVT~MMB}SFv7B~3+xhG*n`0|D^|PPq1yf+l8$AqphQiU#>habk zZbBw7n2%-F-c(pk3fF$RRiDecMvbsidbi?L=Y6>7C~_)s=hMLRJm!YZmm^qUK>Nn> zKNc@=Lbt=c5k~?6A%5fu$#eo{3ZsU9T#UZ7h0?AAJK+ZdJrBxi!1I_jrTs9r{TqBi zUOJKUhu#}*(*2|BeM4s9zC?87DQo3`OY${33o#P1OT+oPuybd9^OQ0ZpeQXsz?}Jd zt~h=JZ1-d*f!!KMTMop4=YQ`9@HNy&d0BrV6Q1D_?}=IKfE(>dB~e+6l8;ahHgP82+0lc<62_Zd8W0X{I*j`LB-Yz0e`(YoT@qDm4C(CQEzr z$o;3@C(-Zoa!M7-ilRY(Pv^B=Q{+O%k|uW*vIM2CX(y>IbjHP4cYO|{;eHXK5vaeW zQ~VsqDB@u#pxuPq1{)K~dk7C%cgxF=n8(s8)*ZKTW2`ly>vo0N?p&JYw{vok9uT)I ziQ0m%n-^U|j!YYFl;Qo%K+#TjuQIsX9u{Jg zfZ=PzpjAynAT%pB$faAN8JK210D|=l9ok}$a=`pUnL>g;_+x~s*MS5hJ*Us7o@|0D z6=zG%)Ga84<*#}PNpg(66xa~#bhs9xw6IkUVO^;$Jg^)nm13abUx)Cco@@|l*mwIB zZrt{m?0V>qvUm!A)D@i(Rhyw+nkdeCYN}4hh;HvQA9JMXE#I zWO-!s%PI_#RW`vnZpEw4Jgnc@X&`(DInYWSYvf~JV!v{qCqxCis4fnh6Irya-X1&=f5&OUs`_!1& zQBtQXn5%LRvXJpV8Lsv1#a>tcn@`39Yo0ZaZ~E!D=V>Preeh6&Ex00?7Qva0sVyX~3ZsUgKpwZjYfMS<`Th(+Y)W{Cn1 z42c6C`AM~1E7;<(CZ0ByST@&qS{O+o%%T>9Ia( zHrdQSASvQ`V@LS>bw{}37F2$~`qV{uvS0h2&K?;y_yk74Gwx%QgK3Pzj_p<6>@~3+ z?i93E(V_R+aJS>>{crw$ihUcGyH4R^A_E8OU_ZF|AoB$jk4GjHLPL*k?Q*buXjVPn zU)~-&iul{?s(rfljhbE;(bjyfEl%I-ZpRL*{9gTm2b^n7VEK8~%s||42ypx9&K+VI z=)7fcYQ(lxvjWSReV%!#dm*st*>L;$2#Vt@VEr)5)*z*q|Ip(Q^HN}lzv^njzL_>k zYx@>|2c})hi9?*A8?m`{97Emo#T&kSs&0}_S}DG4@fH54*ckqz>Y$0L$<&we7jyjN z4f-AB?~zaWK_}HQuefvQ{iW5k3#sXQ<*PDE*ZdwKgK{ouVjdpM-+Ze3LqTu=N@Do>dzCwye<%uvO2l>+)z}D0RF^pW0bUMM{tuoT;@5Y~ zn3_A)d0|gDNw~)abZGsBu&mReSB^1|%tQzGv;E~&H!rZx|04$gn^X3>L~*oB-!ykS z?xyy-Y8k9&C-eT2j%VNO5`fbAo4A1TapBFLS@7ERoxKkLLPw;$Z-9d@0Nzo0fO#e6 z6kyRqSD52N-)$dl6d;hNOW&lDFJmr%keHUF`)0pPfpC;#Z34MkBFm|Gcp|TyVg3}) z3cqqcO0$-l+y$9N={ln0c<1@qhMMy8EiK0MCa2VSD_y?qX~Al1Aog?agKo)4_iTnn z!`b?-b}D;X+7nBpHv$SGnQBY>7zw-dAzVN>B`<#Xzbt|4twww^cJbhX5Q6x= zyG_f#6`y1a2sH>eqZR`fNP1u7M41Gu@Ae1A4M$a{Qj_lxFEe91Jh;_8Zi+ebmYtU} zY0^{w@~IuZHVP=WXG-dZWA#YgWjA0=tyWDn_;=z?f!2z&KJYYKE~ddrhVEa0t55ZB zpd)@L5*QElYMBA;%Xf!Szn1-G)Vk>ctVyA+@3UffFMJSY)b(qZP?VFqEd9ZtcGe%p zA!wprqIo@1I-|E?QTj8rWd+~x?8s&E*P2e%+W%c_32O8jzhk8bE*DR&slb=;zuhFD zjsgF|XD>kM?gwx?2n7zm3Ty~Ao&!Vg`3-MfkwsjTT}keb(_NxA!Ns#4cWrsKVBTnP z2FauSw}Vd&OX8fqZQ@tbw?dk$iEI$v*us;;lns*u=HCi~ulq^wHtg8N66I>Ac%yO( z$Dt(0xQb}ovH``oiW=Q&zQzgLUeO z^@*a=*S(fCk!O+Ozt^V3NfY;$nVOWiQKC)Jtfm(uHzJi21@}Qb9e1DZoV+a*LzcZY zDIA{%f(btqX?)U{zd~_bfeoX^U{6KWt#H)=>$$K~e~QIz9QvY)e;B1KE{yI$dHM_v zMoWl|>3>NcS}QZv0ikXP0YnI(Nwo$R$7;O&7Yjr=hN0v&cOK80=qEa|a@PB{(jL-B z%3L#mIe&N4{-bMsx8vt3U~Ug01}v#!mVo7S-ju<-%_u{CkH?gUqRj>l!) z8g=)0+)idZsTJ7s$miunL<+!+hM2${+rQB!;-Hyq=R!Afxwi84Jh+nt=%;N(^2&~( zbKedU1Wq&gOJp<_)}G}^-jwF+w+MGh@95aY?RJZ%vS?IX+0^#6LZ9U?*$hg3g>$4f zTEV?nut$E`Sb;8om9Xfe)peI)^wpb)Co1wvK;okr_YiePv(*lNs35ugU?w6?9)u*^ z2ZDUP!PCm0V*rEa2bl4<<+mf!LeDyULy{ZyPEw;NRCyHgG_(3O>ZWep#H^jHE4WU= zOe6j!$$}M;OGHLPbKWzf={YzpXI0+`w-V;tRWkQjWq(iwr3e{11QbRhVX7v=tJKq z=n?ixs^Sw-^#N*RC&|*R;*)xp(Ph!~?ua#fg(BC%ANv~;Ieayw8H#d7sY2;+nvd#@ zHsx(zhv=tMY_T*>66Zg-;@Zdm$-Jns2j?^wO@YRn-TR2+A$HIB2`)-6Vb4~LZmeZs z-wy+?K8k`1$`%14Qesrumz=tUPw)EQlng&w-8GOh-Sh3&1nH5E=7nJ)~hQO;xj zUJ>QGVQ&QbE}QXa#p?d0q=1Z&1JyE0z2pjyv)z+6NW~{`#1^E*F-^6f93$ptfnPIY=OF{nb}H za!34*b?e0WLcg$eb`kz>j(P%;ap*2LoYoHVIC*aqMoYkSclj}UO4L8YwDXsLySjQU z96yZ10}pd{R_VF~16U95es*pWN{>&>rKFWc>N=gwj{aPJHgi^8N%Z;v@gn7VeEWI%8y@4HbrQtPV(cGRh)9x- zTb*`!z4dIzWPrFja><^4-CBvrycQU>44sJ@>pYCD?2V(j33=6ioF}IENX6qMXLiv{ zTA?Lnik(G=uU}r*#5_jVMf)p$Y+Mzcym_aRALz>C~TjN z;M<4i&Tb)L57*PT^-;8UTwiOw<#jw!=-99%FaMcf%}9K+0+&Wjq(5~}gIDS`Wa%-= z^(z;RDVZC#EbryUpW;7XJVv&-H-;!a>k9*uEhC) zywVh&(e=%G94xP^< zC5O*~jKannuqno;7j4y7>ZgA{w{>bj9U49yi&EN zc8@#~09(O<762_V(u_brMCr(T!3N%-45CHw8{YB|gb#ssce=w**iI18Q3Q$>_^rqA zrS<2d@Jr?&j?n1=Q}4Fi!FQ0;(FKsu_v; z8>udtvU>~c45XfOOdqE-+IRkDM`3xDI&$p&@tZx_}39t+<^ z*o__+6n_1?uaNZLOWxlfvzus4|Ec9(p?w{4D+G9+5honx#BVBQz5!^83ZY*CZh@74 zKugx~s4IQLG}dQ+VNr4)xmk1kp(LA9x~cdcX5#DVu$OXz8A~&J$qUYJdkU8Ul1CAM zO#&;ibJ(yTTdKqOx)?ij?e7aLZEe+s$tH>AcdsfwCWvcHpEfj+W8|sNnK1&hy}xCK zpz?@DtBY5cp9-Gp9m?rvZdla12~~*{hq9;DnRvMxp-h*sW``R4eFm);m8vM--QX2kAUlg4}1B6 zKY*r@S3vrv>6EYeh>z`FC(K7_p=gmDFN6o4Y2ja*aN1`zoa52C5ma;`AT9)x{6^xq%q)~i^pTeN z#cve}eh-7j4T+H7n_-OD}KELJReLmT#JQWj=NJ z3pR~%%Cc{vQ=Y3bMJnrxPDbE8tOBAKIPRcN>vf`oY*UF@D8el z4>r0oM0kLKFa=2o>TNc^$!fSvP&&?c#g5vN6@0HC^4nL_5O&U)!!NacYO?RB-v=r& zv6XB;2HXa3?g040H^uLLyM3R4rr$ePpcM(UYD9gc$CTWy(*_vlKl;hR%rk1%Hjkwy zwhCv9<=W4mOz5(4kenwb=S;-4lWSs*+=trRI+{7KXQ8h?hdUDG@j!=}`ufQZ#TSNC zU`oIWh)qET4!HFh`7*oE9bS6%QThxN?mk!TxVRv}PrH1O67yXPqoGZ5J>>ki-c@4F zjQ3BPWd~&f@5oyz-cJl__7flD%fNj0yKS3Z_VZyVyp~l7KVVwh8`AfUa}+SYc%ST< zc5nu|l8v$e`hWu&-Tth#!YG)cV#|}L!D1Fn>P1SKhZol}@oJ_onosd$pZQ+xvNt5V z)}geDF`jp{cy8H?@S2f#@=&+EP)8lVs^RI!=r==ohJ0+pc3O$4(5~6O^>+>K2!lo8 zy{nu9AR>~?){jkib93|0&mbm=y)H4j0S>Y28KZC15>fh$s0EN>DL-P>bD5XVcC`+~ z19n;W^|tEKUQ|WvWK-o|QQGyT5+{{N?L|-Knm6MzbO#06cInxjl#c7DR`1iy-}8 z^#<$k4<3=4GONc1PbnB8riOQA^ZWG{Ck=U%^$sb^GnGUvCj4*w z?{+&ZU0W!LV+=R4)2J2Yfdu4tZ+oWik8pV_@~=hrPik{5jB}@zcE~Mw06) zAM;#p^c{i%iT`QWCH^0sUw8Eb@tX2FTv1lY9$ok47y6(Ein(S^6!cdk|=3m>_sYE6rR&_GlEgc@rG=k-zwd;96Z7qeDmxz@(2 zlO0C>B6CQ5-bqFFFyjNo&yTdvJDkD;>)IrxqO)amR%dQ=83VdzBgW?5*Bm`jz2&`G z0MU#By3NV;OOBmEgfbz-HT-z)mDQ~YmKUbV^NUR1b652lkfZ$sWD&PL3s3$I`}}&@ zfbBQRto{J7ISKOzj+pES4yYy;;ww7@QBz77z|HcLgTDj=s^kevd3zXjOZx$gNH}>oG4t|FD%Mz&+d@Sd}8I*I)nB&=c$2p-L zN`O~je=Qiap29H$ovSm5ZX~WTRN%R z?vG|JndBoalQyzQDl&cu2wRiXB#!9lnNsXn(J5YX>*Xcs5;lD43ubZn6^tV%Y#PMy zBO>Vq_KZ<2I5@ROq`!(_u9_HlXtYlDO~r5eS1+*;T;~ooz63dRR-R205)Z^OGb+@n z+Jl5UBrY`+M(4m;Vv?irP4qv5Q0QR|!|)%Q+YoQAqqu=KP<8i{$sIo9>3KdrJ;vzd z4jFyeg9M`3Hu*j0{`VucG%BsoBo5fujQ*6=bk?mLsRFotaUFuOPi^IJ9HeYZ1|K0R zD)ml5P;6p_+oKu~+2cy#hM{@iBbYNS)joAM%tJ=U)2&5K2}bg?h0&2Y-W7+!*!9oz z$&{oTIgXEuv~>EJDo()kFe=8$f6+@o|1~!^wy8@)#)KfJaBNt~ z7dL*>mR@lOX;b4ktwXWhEQSQNc=V!((sdgScOI8=>+#Euy|nqN+|{m+QYg;xv0kn# z5F#R;0;?Ph{1!a;9j6dSocU_De=lYFxF|h`7@<*~i)Y1YN%F3D zPL{|P0*4CITgSmyB)IvU5)cz1@%zr z;!?v)$jp@aB^t;Pq%tDekscIh(Zmhu@`w5RPZvbm+8+F?w!=6v(P;iWW=3hvmC0Qz zy7g?;_jsC!KH;#T4ot$%u@suQ@*963{h7`T^`a}0Nbq}mE-`)1@Ta6MLn%UqII4^(Q=W*;m*Zr6nOU}Iba zF;6M&IYw8VF$b=O9!7rRpC+BHSt;7BhfUkO$Jv&%F+i2s6z>|^K9mL=d&o4g?(O11 zDBlS=#_4|K9yb3gL-W0`+L@ow#jo@F>NHd>A0mx1JA}EB7^YpaNXTLP`&?KQe0!5L zuRsy*A+Q~n0i0i*IT(ZMrMz<>+2_iB?*mtZS2pRnf}9_!>%NlmJf*WdVX{jYKtAWvgh#epFf~vI5m_)lgf+8yMuJc-F}3TPOosj zcmW9lkJP+ofsbBlg-;*($cb3L{z54@H#7##J{grba9x{z{%!nT`2Ji);${v7{s`u) zyfy7^JM4n*sW;}iYqSJbSTr)ov<~VXa#MT7#J5Ds{&h1b2a)WN78VJ=&Xyk~v(ga8 ze|A#l&*oi5YpOjVv{^kj`&!0l$-l7#ubH)v4WTW(?|(1;eWo4+{XT7|E8t~gy91X7Gw2v}^rVi46{m`y(ZYt~iZF{j|J+t=cAr;=t3(i58Z^FlQrR zzG}K%tb&kHjh`_qgYFqBLx?V}!nX=T-qs`e;<#a*YBQU4ki3r%FNr@8fTOsv2ra`d z&;$8TsYxjEQv2@98Z@74ZlEYvqc3Yv6N2u6GG*JJtQR^@@p}Ad9LZ)K_eNy7sEv(x zkB@d$wBt`G+V!t0)L$X+97AUiQCi2l6wLl~+D#W4x$wIdENwktu`dRDWNZ=*>D!kG z00d!;l#sb`fcvd5NoFPqvF!xliY@C4hy0%Axeu3~N1Y+iF@TbLr_n&ZY8nrswp%l! zOuiJw`J2b2X%K<-`KIn0-8o45>QR`Wd@Rrq8TS^ZXZ6XlIXwPO;VnV?0k6Q zu{Q|ny^IUh7nV&wpB}XtFEQbbCsW8R=DG1X54%)i7#U$XP5=e8^;?ifdkdg1i-D{! ze}AI@h&C;ppD}lq2|aVx54PwFFp@rbk-PI>xJIp`dfzV}6uavz++M+;c@>I05Z!Kw zl{q>3G<;94xzBzpX`maUpFadiy9#oXPJs_|B(316bi(d9xTk_t^krZ6cOffOHgc>2 zO2FYOo3TIda3$_m;cLnHl!j+~BA(xDT<>euKZ`~{&_j%*8yZU0L;uMzOrV|V(*Gj; z`b2#8X4nmmFzo2|>#P2!5qyphT|!oz!}Q2Q>o({W8x&HFfL!{@;v<4Va;cl>?*+dC zh=mLS?QK;DBX8x^&f5eMFHDAzog#vIa~|=rTsPq-;VzYe$t0llq{(cCNHm$e>yZwM zHOFLz6Zj~oQ9VPzKLTdQ?YKY@#qvgv>UKKRf(trE8CXW{PdLihz3gSNc?zOYE}aA& z4uT+=zRf;^+|C980uq~@uF9hD*RFV5gxHz^T)_`nGm0!!U}iCi4^p6w=|n3mZ(UrA z-@vy8_fx?9Zh8ZZen5J6A-|%cmeR^ss!61ZcY9$uM-F$5_Y^brL5eL;BA-XhDE&`~ zp_}J{xmK!+Y|?KOvDHGBDMDRP9b+jS^ur#kvlf5GpvNLtuEPUXnPOh zH>lI%2>GLbI2^A{uYy}=*_v)q+m83%twdu+YcQ)mO!mZ2qHneEn*%T~$_ngvnnYh5 z!bn7<(D$Rl%xl+RV`qFq3rKC32jaamlU0F$P75y6^M^5oB6TFnU5c@~COZPA>nq%X zQ-)6F5+UF?F`ugCw|56s_-z`Y)8y7&c$WG^i~5MNBWVurYncKo?zh?L@C>^?(5 z@1<^@huWUH?BCcMaRo8`<^eNx{zKZU~MnfTpMt0FFlnKkNl1 zW`wuF$PbSH1J2nn#BdcKEz}&LZ4r`ELz^Y^o+j5WIf*9^+H@b^98_)9FS9MgI?<>b z2BYsTh8_Jcw=Ud^rhz%Em{Fuin`ibBV(~CXG5udSvw;~{5C&K7^_wvLGVn=}>k-^m zUU+6c^cwN;N8MpTh=>$qY9`WAvO}QOWNkuhlJXgKN9T}i zZqTmc<*8B8Ltgbm3f@-&{6wO@Wim_velA=Bj{87e-}p1QoiPOboaxbrp*V5b!^?5y zIlE^&PaQ5_z24xewa>`yP!DTiwz0X@s_djsc*s$XR*_(of7zIt#uI)_aXkZ+6@44B zbVweP#{Sd|1)KyEALk)Ua{v7T=fV||wg!-sIb!Hp;O(giI0Nib>v`JvC4$qUB@~FP~%JLrMTm8jA?cbdO#E4oYGUWaN zofd1E)(#*ZT;Vzh;>RZ;PTJ|pvbzzkEM!D4`UUb5lmP!fQA9t^`_{$LNXp%muEO7b z@*6w5rEj%4To$va#1;8@+Jx&)S~Ls)i+%S_jg_!Tc*&Dp#y^L@y9*Cg@n=g9lV&K7 zf7YRLVwxUleWe^jiH^#@K7!*x&{KGqve`*y_CjIvRf_)Wi6Jsn@0xa_WnF+U53l1c zkd;l8X?FzhAr%d)ARL$g%KVhu*5OtOg%VO`L8B0U<>q|&ZpF{UPm zH@6s1m_26jA%{eaf9K6`!%FzVRvk>6F>rf z_Yd-$HujS@X6C(4ag)STbe>AWqz+vBVbvBozuT1l4+}x`zLhAO?hx@=dtkC)9);im z#+eXKvJ?iH(FBPjnO*h<1u$m}bXLr|9?Ph|tC{AD4BVoOf&`{)rXUre1{i~ZGqzIL zjNhWqUj3Zf5zb7?#2ICNTC4Ukb4y-cVNzoHvq&_KTsw8XM}e!931Qq*zU%+ zF-g(V`e>m4!;>Rd|9f<@vHxCA*#eg^%TO9~;vptpWO}^GaTKyGk-*>%-Xc2aZ3!w* z^CTf@Mgg6oC<3<;xe=Qe$G5v6MG?&KJtNK8)OZf#u(t(bbSreY+ewNh_%jLxmHN*+ zgCf^eB0vHON8i% zlbnK!7cXgVkfem2MZEzI5!@HmQ}U1A;GPB~MEg&2!#l;@|D2=_9^q^$nV&>yvi~UO ze>plj*~tHEDKNpmpp;?~kHGz5k4f$$DfIV3M1vG38Gm`MC3&F>m@tOoe}K1>2@Wuf zz;l?vh}`yiTi{$)k(ufc&Za13r}B3&Ng^C@0`MJRXDRqjw)&mQ?!3hsD5{Cal;@Fw zARtkMc$RyvUQj}dIOtVkJVCB_cqIbv#o!p@kp@$Ik7#d8CMFarO%#egUzww$AW6wR z4iU&Hn&c74GaTUzBg&wj!XhOm{YstehCcnU))byli z!bpDrV^-5bPxhFgk(&OVIt8SzM{11(ng`;Q`~~8Cc7syJk}|IHhNB}zGZbei1PBIG zkl`5uk0b{(c*om{Z`BMHjSE(>VB+bn#H(W1V3KGE7?l=(ibaEz>OCW1LZXN~fGaeE zafSm`ku|eD&9a1!_V+28-J^6s(%b!=-o4ryiaxrdcSb68Ugo^sAlAG_W<7#>TP;zf z5M=Z;u*WStGWFPdTQ#E>>s5h~qDh1#*RKF|N5y45_GJ$yNkKpkzJ?=jQ;g!C|LSAhuZ!YtFtoz7uk0dBzc;!^Ad|g`8Fka z!U(U_*+=9S2jB)}4+sfrcK0Xx-=}0I&loxYz1|g$1IA@Uglh@p*(u2;H;jX`LO9`i zCB+jxK*|Lst~NL)K_OcyijJdv)A1#zm@8_(7aL0vJp&x@Umg5*RT^ z#2ND9-QNbi-qselh_jT0Ip+itqx2uMNxuM3Ld67m?}momx?pVwtyHt zD6lwf7ZX&Pk{!iiffpoora6Aoo@#orB-_0cQ-)6R5w{H@-O zR_}jq(qhno`3XRi{^$6xl>h5^xY_?}DSZE5n^$C<3?K?1Rw$ZIcviqkk3?)PF7_OkG^|cfdB9CE25Xxw9kM z6Z$b-u{^{;y%P2HPcdKqO27V!;;=xTVXLS?dqYBWNz$xug27jStYLqye+lzce%qpf z=F*31P;ml6lO(TuxJK2o2kTc&uCu+EetJ41b|HP+l9xk9s|HICF$NzVe|94G=pZ_v3xUiN%KwR!J zf&jyiNBD=)B@w!i6hMasXnm}!eQ%ts#_@h{+P3hQ0u1AX6b~$$&S&N`{`biC-{Cfq zvKFtj$EyjMf&HaUhzzE;D7)0}ir?m;Jk7GCuRcjql97N!vN8F~tbYCcQrFf8v`Fqy z)u=j%82b51G$_;i9k9*462x&dh~@Jgbszzt9?1?BT`vx9i(o6(#BU4w2cw98tWr(? zBYd;ZkNN#i2Dh~W`ae84J1XUW+QffePcijB+7Zl{?@Hos)Da{-B~c_PTngjxJW8hU zO+EuBrXuDW)S!IbrPclqU;=NX9l{(0po#xGJS^@1)6Mm>+NC~B61snX&@bs(dtD&ZPKsSY)E}-K z#;XiwXp%?W@kr&D>%ipvP)Z-jItXuI7EJf=4{lHfJ#c>ME%Apct?0khp{ywX=fP3Q z|L5%Z@Nh%_*HKLVPik-J6s9NyFh~id&AVS|kJ;8$RvUcX)LidL_2EFUgza^9h3bAF z43*Ed^%>yG@?>zA-=H)`8KMJB_O$^Y6N5{icoa1*6Yb#2-G#0kh(&FwjZwof!>D+^ zk{=auKt|x-XutS;aEBg^UtB!|idz=vuZy5C`&&uwg++c9i86_c=fZYd`O6oY&JYLLPEj{j84}ccNul}8r6Lck(%XBKrZ`0W z8YqtgaC#(fgv1>y=BUUt|k~op}44v@C-{!cW#`xee=lY@x_}f zRu{*&fF>x|8T2kDKoWJ)i1yqRc7!5yPvK;nOUF&fftS$MFN@;FeV(OZL~BqD=`|p$ zRKBlSBl?R>usBrTn4io6Vu6e9k*_~I31tNhN;>+ z#-e0oO8F!}Di)?(<)Rkno0=AS@Wj44VY7$DI9FMZJe)Ni%g%ptu% z8A@jiBsa>Y*v%vbp`pb{fhqMj49jOU=h;!^YE^ryre?=oW}sL$x~I(tx7%=?I~{TF zDith6h&vS~EfmI3obtgi1Q1ZssCKt9$R?hEVzmQI0Y%kTlb%t{NgCVjR%eqsgrc-r z3oI2$)QbITf9=`U8|BT{SsM6%aloOJ?ten@Jx)o?m89K7fd>BnXn5epe?K@mJ=pO7 z>nNuEhcUz89;O)HM5tQntCz;W`0f|^nL*o7e6OBzvA>{X4%w%{6wP$VOY|4?SQv?E zi!igbelSJBovasOs$y>LSk%(|M5qdWO3BPf2fr#E(~VphpGWo?)?RLMS;n z!*pH4ER5WAOYhKRB%`eOn<@aX8)W4UJyw0d&K6fQrp|;_;fmLr6E)?ELLpRf?d-b} zsa*cm_uuvFpZaZ>7sH`C@5|`(LSSqIseW^|qGAGkUspofwC}A>3LDE|JxA6!4{RqV zDWa&xFU0^2M$yYBKP!fXaOD)B_}=fd(zyN z{_FJU%(eeGI@s`kYbnYmAmuK{e2!&SnLI6m?dx^WhW7GCp7S==OK($@5Q;OBKK4OB zgSUOqPx2_bBoPiY-^HODfxh8+QG5q}|Gh%SP6*AEfW2pYE1$~`B`qBp6*71We*e8M z`n}ZPSgs!hlxw$!lFsP_+;smxbn|~7G77NS|LZ9B{ug%g3+{jQIX5|{whFQ^ z*O$in26xK1l+U}uSfA60qVn9tg16-%70Ot@&zh5v3)6b8A>XrY`*|~kfxmF#GCwnF zS5Cz_x@`aHJX$$q5LtG5hUW>i2(&D9O_R(fv;Wnlt)Cv;OCFSla)G z!%hB|wG^9$$asBEx*+axW#yLbj{)%Yt`o$8mjNp7)_T*ILoXG|Y&pNcH@R=%U zW0La<>irDONcw11nW34kQesFeKrP3>tE^d4Ar$)j6#X+tG?OvxIOqq%nFZ&`@HO^2 zwk>D=>-WDnHx^L+^3ufr9UPV7{~mAjzw0T&&w`!%+{6k3e(sYAxI>S^t4Q)}jOl~i z79EoqrjOOpfqlG2J-0I9ejVHHox9{rcFJ!GM#bPpW|&eO-?GQ7eLfJ!08X9w>T?qW z^iQ`R6_acLc7R}ty?u$Ct>;O?Hm3DvP4m*1tx5y^&qxYy z(f%ixBv<0^<;VXyK62wf9}Z8CHuQfjMS4PsyiiH<3yJa>dQI|JMtf|w{E%y;F#9;S zo4JUet2X+}7f>CTE%DSH4?A?+XC@)`zf)%ilg@X+Gk8Daw$pCqq8)vum!&!4A4rBZ z)DDrnxBFRPEK>Hu)83Yi6(v7tTFu8g_VbKEcL}qpc){Azk4&2q{)Xl^#dGR;#bjz{l3aLrO9MPJMi&^$Zcg9U_3ghnwDyvRP}yySFB;*vMg3*w7b{sg8E-4+*`XnJNCPR?Ci^%YUwZ z;JvSp5N41{=OL$;XZIv}!P*%8H<3x%s?2d>JTSr4i$p)t4Qq6l#vnIKD%F>NmgxQ| zB{Td#L^J&YCU1b*>YywwymWs?84pZ+FClJsr>?+;QRLg*OF0@OM1J>-S|T%O?Udml zK_3GW9fG{iffRitTeN8v_z@4fBFV!#v`5;P=Bd7>(vtsYRF=_*Uj!|~B<>&wH1PjN zXQ!_H_u=tyW^vXBeacS4eu(b-pfA&6^zB1Xus{R-OgGHB{*oLF zUte|m0cTT^XZl&+=uX$?>Hj~?=q>+5>1Hlse!c^>L%_e$0pJXY(w9IWYVfzYh_nxG z@jZ$`LP!MA;1-PcXK}Wl!T4^Uk{M!E#{g6L<--)E2vSjN%=odQ{+KK2u!I7AhO;C> zbihMqxI<8iHuO)h&8_YAfQLH*_d8%a%D}dI{2Pc+yaSHxrc`rWdt{)+?M@{vspzjf zvkt62P!7wr+kn#oqyq+07T$akk@`N}lgI;Fr_OX({W1VNe*Y9w4`S@iF(>McuIrs{ z_1@=6lnt)pJ6e!|W|ksJ{_JdeqmGMv{jQeX!W&!8zO6{};jy|iAz&tY)7fMhKsmlDvAZ$fIiu=B2 zmZn6trG?;@ZF%zLd_B^r-2bac`>spl{r~BioBw@d|GlQN1!VAVnTMSx7=I&zg#BH_=jM%#d_BRpuVG?0pdS|_3R0B0u&PK-yhZ>c z1PuE|r$v-HRbPJ2P#VJsT*MhlCp>5J7=PY-_O6IVxF_iExYzpu{G_71g1sNW*sjF` zVv6Q}0O#?esK>LwqR#=Q!wKSkp zl1CxeXv9c_pT6PYc;j0Xf&`^1ka+Jm@E7#xYE!zF-v9tSA0qqnow^-lPydXf8Msys zlCr7mI0JU>q0^c}*1f>+y48@Iu=sEypnliSQP|;oeAk2y__5hwClKUu_ zH2{YSH7ubkguo4o$b)AOsQ%=wLgg-KGXv%T1|Rs(k6--&1~|qUhS3WY!N)5UkT|5B z$*6Y#zJ?n|F~b zEAcQMkL4`BlvW4Eya@((R7CCJ&G4w>oWWK3L#q2KU`iZPsO;ziu zdPP+&?9$Tyk^qS%X)W`P;G9%Ib65$@>97Vr#ey&NA~N@(Apw#YBqXFp?9^WGoQZ@Y zshXgl(z+O?-0mX6;%<#ej?TBc;3m&N0Ap~201<}&A&OaT&YF^N-;r|$LOX*gpkx<3 zlAM1%h4%(O4|ueT1{@b5^rSm@ zGss#Z=>qb*w(U3c?gLr4$5*%fbU_{jNnQc+Tnl3zAPbNAuLES|_+RzW6I>VyAP0`LmQchm-Xd_zctVC>Z|R)JjK=%OG` z3C-S!@O!?G<^#FD(M3T{5$E1zxIYib^K8HRMi&LSh)(GJXg-kZ8(jj(G8&>Ec;GIv~%t{oF>k zg`P#k1f0S&drsmEeU{myVe|kWDaha*k0cYI5XAx7sR9}18R53pw!zpnxkK^XM6SNk zMX@ZB$nr`2IfVhbv{dT+{<2!fTDdT48|?sc@4x=%y*+UK_Ql%~xR@m=;W53nBuv5H z-Ve4e*3{x%|9u4BUqAQ93ap1+0*jzIuc=d zq<6VI$BKv6NihQFd@1$-Fapv_&D~EprI~nB1e^uR!bRzxl#hHIl8kDn2APAff7q9B zNE$Q(A3pYgxy9uZcL$9?pX)hmR%tP&+J!L!M?IwyUinB)`_vS_;wPcNyvE^2( zn_A2WX|;MNi$GGj;?!Z#4s-Je3hvsj#a#t>gVG)6>cF$2>d=nh4KCkbyr=?io`Z(B z=Mf3hJdSaE3m^q4A=yq#@ZP^ZzxsEl3M@Z&^HxFmgx^w{V zJuR=oIVX1&;QgGEJb9Yn$=E_{a(}`RqK`B~vnMmT+^hF8#rHTux9BB1%v5~PrvP4} zAahLtp9Xjo1p%2QmnoTG>+)buvb<982AMWro0IOX7Q94b@o9i(=CH9pe-e{xrPzUC zXn{9})W1sb!jvRW0lb7XniMaSq4Md38^9Y(yl0sS-WNO64Dg&Y@JsGo1|H3m zBtqO*B=X?#3$MKaeWXEF?cA_>@Y*R}JUSO=G@~8>TVT&{F9fOv7bDaTu)>2;{?T(o zM$aSVi=zX28aYgbhJ(ohBXDy1C;p4G-XqW-4!LH7>n$|%JmOIVi^q&Ir+DfZq8WsAhKP(&H@QdNdwD77=JFd{nA3Z6Z1{_2&Q zg-a4v;d+#XnNve$g|-`;4Me@YfO2vKWU5S>^!PLm#d!tw)8+3GkA+= zt!m@93cspudW$**MJwN@M(u;O^+m#RXJc2}rC06i3%8kaCuWxLdiR6+PTm#Gcsj}8 zZ84JhJGm~J@pNLO8(*Z8%RGvJYG*-3v&hQMb+!sUQZ1UnTlrUFBu~GXydl}8h)ge5 z`ro8lQR)w2;i<*jrXc4b)Uzo96T(Oh`xTJ*9>tu>6tFyy^bVyL3qy3xEuJuqzsmrO zAG0azk%v-aK*dsP$?zn?s)6ls3}=XUJl@#_IQx!*f8;a+&;WGMyI{{@L({zZCGI_UjGQWZFC7kqe!VsZ~N^l^KdWeFYa zbLZeeDj(kvo~CktM#4Nobbkh8c#G2gDT-!$LSwtXRbYP)#{x!7;vG5vh8LaXZ#wGr z_P_^*{)oWvHK6jhs+Hcr;Nv#?SAQo>H9l^uzpOV#PykuO zcw*I5F#&W)09n8ETzwUj4AGC<{6GFoOy(Q*dn8?gg$j`Z7^H+!ekQV29+qa=I#fj1 zh4Fv<-~T-ZGX#~ zh(hscaXmp%1~9*o7*`pVj|YNri9=SCUw7V!6vHq;A-H)oKvFA}`$LS&&5eN^0fP=k zg7w+YliL)A!ZBj7lAsBu|G&A&m)S>C{LkT;6aVvohXmdD|F5BJ6>&*ATzpkta(SKb z6~ox_o~!*GSG)Tx=V99`Ee?m?5{>w9R2j;vTouQYO8S&@+^Fl$KurV%kn+&p)WArw zIg4{?kMRp18z5=$>C%w=nM5HifDnuncBZNx5*1Niwq2_?E<5RRfsWM`Asi_nDR_aY z_}fBI3rNh^2Gz4u;q$L?VsI+5L3w*;E{X<7%pe6zfy8Xk2B!g%5N5E$IuQ@*RxEE& zS`pYtQT~1BNrGTX0T#!;KKOKPC8NraQ#@oo5_L;Kl4deU64*{fL?S+}Jsw>|{%O|R zsrF9O^+r9R1~Kp?q;t8F4gG}a$5wJeYw3pO@n)O9DV0axX`=@K$)+gXYd5S?E5B*Q z$1IOB3?dvO{fMhOL_bW%`O>G?rYu?<{?C=BmeNN9|95&+%KvwKcC?BAx0bS1=#_iD zb4v3W68>6@7)XWB6jA^|lA;Oz%*g#%3FZSWtjiN7A>mbmf^kP9s@67BT{y{3rczxk zqgpYM>O7V@`9Yz%@Gx$j?!&71M|nXY*~bD8H9%NATc_LpRt%ejs0j$JCb>cp3Nn&5 z-fd~l$EPJ#T=2C!QjTRs@^N3AUW>7PNYPQlB-LsOR-0AIs zHzeNke6;68_^f404bT)<`kJIjB-ms;{8(2SE7RHu$>UH^V4)agM>UMYkK6JOrI>^1 zE&aI7{#8#5BjJzR#t-#A!V?rc1`+zWt^d@z(UjaE`f*$QuN9HX0Q}>2;j31tLd^?H zt`oKHV`V)Q-~W`7*~e}9hk8E2pHcWSzW=zb{xZJcwT<7eFwOWg_J^T{^f38q)iCbX zT0vE;aH3|pcp_Gs;*X03SKJQTvpX_U4wO3(rQD4u77ZMUpT=vxhf5!2nQDmNIc#l# zix_9dncn^!Udbu!@2UOKypn^t`n1L-@@h`(MbB!hAN#!aVygizeTX+5TIR{wczoMH z&IMPd*Hh~g-HR{Yjt$Q?`?;(1<-0)Y%6Hhg@&mZalZ2$1xPuU6HYGFvEkA^L_6ye)9fRzI63ziTO5;AMROWyHT`T3u;n=olF;T{`R* zW}~ec;_^jAA!5b%9WYvJr)XH@c@(iIzTc)hT%Pjg1!%@8qbnco(4#-6gac}o##oxl zMUTP|N!ZEt`z4(*!^<6d+!t0;U5W+jK${)@1wFn)6CbFHVD%oRnBR|biL|k^E}#x# zH|ke|9^N$itH5eugjs5QAyDsJy3h!!jn!IEON}oCD*BwjIDE@fJn;}{4Hx7#sAI-r z@GxFY9Gf^8Uv+Dj>qB93BiK)@*Qj$>%a-`b!Gca)m7v)Ed-n%4_=KCGH;l^5z# z)~e{D^Fpl$)wh-wU#k+-t_!su)Y3w2Hs)CFT6HGC26ci_6xPwW#n!5BzVkY*237pQ zvp>6_F0uf4t0M3A9HjzOnBZSfN=tlD8Pr;=I-pjy+7{H_4~*f&DT!w&&h*?+GhNIW z#rI?FPelV5vloo*2y-4jJ`9JpXy8zK`W9I^`L!;?q69@=`r`?AbbEjz=w3i# z&i_M+!UBUJND&8<KIs*3xYrHY3)c;5ey=C;#p#M2$?@IdrqmBM&9fj+E0GsTmrvzG`L88-d zTkX&Kj1&E8A2w~xICKIXRoZU*^gXV2C+6kAN+mLSDOOwC{;-(4T4dX0J3UHppyTW{x!?!qsjjFb2QxW|LZ7%|7Vl^ z<@o=$kq0}l`6U*=rat1efKUL>p1K4@R%y=a*+F}o2r zrloFbOp_|QDPO&E?qMuD8tW9HYS>rL&tJXdX1VN1--vo*YK?zUTH}6Ob+YK~DX5fJ zd)V`Fep81%8ls?ra3j&IzqEZv`o4?v$> z&J5VmldJg`Uy%wM{~WwkS-B=^!O?k5$>bbpDrKfMZ{S)ghhRqey#71*y*v_Q2%%hU z*MDEu5X?kJ?T286CT&Q{#71NcfyZx?!w?n9BiTNe@mw<^>o7Kl|MltW<@Js|1T!_& zvWLLi=5tap1YV(j1gy#cyuW(+?$gDKUGVygujfk_$*MA@R z_UpDpnvgnp0N>bI4?OQ5$m0;D24Z%4dn(;Q*B!NZpKK?sx!;GUZjcR%Nx3NE6!x)ehjLk$4hPs!v%=Xx>wa3~HP4DmpM#eaDa||jog#k8C zm>_^2jv2r|GdO>K_xAlIhxlg(@ih^;?TM<+pio;fAtBg)iG?EF*uL_$kr7jvC(i?w zBn2S4g(3qDeXMA zl?JsaB0qjR;-?;yEknvrTt6A%&nsIY+`U1lY8zNr9JK8nhrGp@A{b@Ue|5abIFL6Pu5%oJc_?4H&TrH}Yf(Js z;s_kL&;t8p@Yb-YqPL1m61s}t*HX5?J2lr&;|g#QCs1CRZ}B?b-PK;l zt;pwdfsZ-7dIS6LYrA+>2ak}&>u_Q@NNRSqcwKjkWdS%y(LZxUGddT5erFinqyo~p z7m;r(Ve|ty2$Ebh);|13EqJ^^55sT0_X1e~;0(=3`q%-$2KZ!qB~6K2!5_4wXfVPv zoY9&!SnFEp2U50aI8|B~g#2aABJ=^MCfGB@H2~IuXUwn08$0L zY;yqqI>o`1-&8~hhD;RY)}uG<(8NK;;FXc_9+?mlaL{pDv`JEqAasvne)|*V5ehlv zss@LfBqHn$gInH<$l!DRJmxh~*atU{>}iJMTXB=ZQAEM^I7o6Ct6WUrc!x(j8?wXq z9lAxI!E2ZWQ!e;_cz*dFh=()w@Z&a@Qb+syDSLP@JQxIIwx905IQ}!qFZK_3D*i4X ztWx1nO#io|bI@aQ)edZdl!ALF`3Sfom6-JrIQSVmah>I{Sf+{Qn z7jvM3gV2l%UTqO%_;5i{5Rh4NnUV>%0wyeHkF>*v1B74O?NnNDmo($TFw-xkO6iV^ zc@QBW@F~`P^*muA-{ofCXJC9B55SLk z5fzgdfkJ014Ib}K*|(!kcSdIGzD-`sW9X#C*bz86{ZsiBm+Cz4yi$&*{VEZ_mw&Qg zk$rFN&F+t|@Tw|ag8Yb^9PVdiUp^T8gOb>)Ypz;y8%%5P|XY^UF_Tsj3|Gej+JAVjb^_cW+)^ ze>#8h`r?gF@pOa0xOh7F!`yWE_5T@4XE^37aS0Y+P5FNgj}Kh?ucO0_{nuK`7Pv0v z`e~^C+ggAv7VB@BR$X)I#5oMcRx9J7t(8nE#*)!!qd4F|F_P=KNnr*#Z}A)&ZM#Am+Vu zh$c;X{n@&g9H_TzbR_pguRGEgKi4^U&PHm9Jtr@+b;31=c;z05uIh$`ib$n^lKEWRqv2?Znt zFGQddT7k|^07mczMSiPiXNsF5XBue`WuuI9sRFMxfH00p#!q9qJOIr`E1_%&UVw$;T*)0L|gxJ;X)dATBz?`B~Cj49qfV#b90hmBa zA4nQ53qal8vH(Ogh$Brn76(wY*RTj%0+_+{7G+l`LP2&OMNOIEE8|94>ET757c)(^5I@??h<=b}mvYaD@#HU;=` zRmj!qY#4!m=J0WViGHJq@(9cxKd~SBjiQG94f~P3vwdGCDb8)I*&c)vnO-jHbKMEc+{(dW(E>z7x9tj>mAjb3cMDG%tKe$AjlggGJlFz%MNvQ)2S>ow^Yd3C5B>EN#&_V62)|z((+oxtGkfMa7nP3hsCIUpvDuSE*wqS5sOS>T9oEqTvL@)-J(j2KKi(7pUcc!tW2KJjo z3uC4khib2%uiymzx{G=KCn%+uW+)EO{=1jwFJ8Y~NB;kVlfwfy{>vu+!@9~AxGZLU zPR)NC8e4TauxM`o75U}OcgfI-+h}tSF$X`hBELKlRIykhOT%#El}B}|epPD1;kqG9 zHTa$jkq!{sxEOr6Cs95_6*nfGTCUe@FNh0q17o70=?($(LD~(PD@ofoAh>L22s6}yMK)3)(>TyByn>km-x^ST&TzpkD;X)aY&xwn= z%bx{lr^1DXa0$q0pq$}CjG6jLC^pstUUQdk6O=9>!O43OBxU3*-R zu1;O+;I$xUt;8KxLP9=Tb7c@Y_I40=z{TK0Lc-Qu*gA2+UqZKQ7n^Z5CreSIs5j!Z_&Xz=anPMUxeA zLcA=-JSbTjE=sJ(oczVu%i&bTj}d|XZCPqI`(roHG9NjF&05aM;nkb zWj1X<*oh_{zZUe0xJUSMtVE=@Y6Dn?9gGJs3u&y5V#o%@wTZ$mRa^zl(mcrW6b(8V zl2pT27?M;0sj6sTdq4Q+im>&NQ#8pV;jH{fa_|5}OX2{5fKDMpb;aZv?isxwz+1+< zJz$D+S z^)Z`~7>w`GBOPmQ{`>C@$iDxcVahP@WOa7|jwd9Y36jl5Ep12WE}#f8)|Rg-g`7Ja zb7MS{DDl{%TA}c9TmLzjg*?P4Ut%wC`f*$RrQRsj#7C{9P;Zo~;^VgZOT7_#ijUjk zfAv&oF+Ofnq<*ld5f;qxfav#1WB7&d8@41CsH^x6EHR=Ddzk)Q}r$$gF0x8ni0 zo(fNI5aP)MrTl2Z@_rvr04%pEwbop7jJUOV2JaAnhI4qpz2bI3gzu1!^G5R|i4Z^X zA|6nWmh{)!^KlnY0 z_%R~Eo!qfYIR&fezoBwnxQ{0Ke{_1{%Krz)8~VSNvQ?-K+nfL^jm_5PI9O?9wk9Jr zMr=H%LO1fvT6u+MI8(BazCi#j4vHBHao)v6%L{{Sg-nXhw_o#QU%Q~+-+3xxi~_Ei znA-YpKDrSQBjS%3(nsL%=S>XI5{=5_SSIPS=InhHM(QVJCtt;_E12@R_R$J^Yo(O{XHh-ui1@Pbl`?tZde$m7b z9M%Qn5%~bFj6t;gL=mkgw;o{S2-ys9{gNmEzCszb7DQDS^8p-0In7Y|R~({M0W7-! z53G;v=i=8p5}{pS{P+>aOs3dr0@zK-QGl@A)EwOxL#2_Vmuz&im@^&)c;NW(F;Qg)2h;Rl%dplue<+GQzlpe$!B@WNS- z;WUqskEWLaZlc2;fXBS`vGxnM;G1(v@FoW^!P2&Gxd7{S$3iAnkhdF28-NENc%Fuj z-BW+)zh1^hJ{J?@&ZP$66j73=0a`YOb-T;Pux@zi7&bs&CWh}(dQ+yui({C#I~R7_ z0IabKnl&Y@F)TrztN7_~&b19C%C;~a9;=oGF6$}o8~_h^a03(IB_s$MvqpvLr~qH2 zi&+@M14lu;9DrjUkYY6eD}uRHfK{XO0d0hpDYHCH*@YMbW3UJ37I#p|7Hp5Hr1Ka*E7j&5THy(SU=|2VHbr3!6*-Q1Ql>rjhyJRZ>Zqc5 zg#g|JOz_?<`&DFTYFsAHwkrUWFZQI^QrrtHYYGw)(k{qm1Zyd1ojn$VslnkN=i16YMktWol)Yt%&!-oKLRvWF zK>>vbA`>iA#9e(yV4OvC5Tx0dhY94r?$G17DK?^uhIRoG*#`}LwyILYXS;p#h#G1V z9A>Jpi;&E;ijZb<#p)RjN8mt2kNX?Rxev1lTj^|VsIXl`iJOopA`g7%F-{VcEex*! z#x*3_5~;ZOG@FsiomigxMX*lU*Sw}D8qf;E6V?jY0t#PbhBGecGQsdWYMN}xTxK$g zt~V0ien$5BvwhYrTb7E46qT%}TY#j(s-?cIO6wQ7@*UF_-A4nq&B&r(3A!~N&5`?~ z3|fg&3+CSrKwK41ux2Vn*(y&d*j8hbaa>ijK1rjEzzSIy#yCb!uK(BZCjP^Eijx1-v;#fw3nT-yg+ilf`OvPtVy6MKuetO3b;>rpdKUu= zG9@;Y_HLV*vTxUnVu}w%bl6o512*sQI@k`@3~NegR<|TelB_u_<0h|e zSQTE7y4zi_O%gFA9D|?VUx0)pdBkPdNlIqmH4eiFJ-`%!6v=p3bf<1uIDxZTjJR5Z zIfms?12uKqsx%C%E@$D2W{VF?WF8EIX|f9_TY|yPQimnlytsVMLtEylk$2DDTT-tR zJ&HsV;=2OIomP}kesysP?EYlKIGcJJUfQq*A1*FE7B$P6tzu}M2h(*}??|4N4Bl37 zZb|4<(cPMcH3$*SaIDthYG=#rtNZvm4eJ(W=m9=zuvR%N)z^Ge)-gYj?~F8)%q%DW zPrZr8ZegR5kkB>E@Ictg2%}A!pNi2t%E30O-O?heQSjo=d(Ykpb*@nJ;y6T~$6y#;+Jiwaxij4l3TE`@$* z&(;tvUnNtL|9`%Gzic0{M*sf<_x|_j_~dva|F5Gc`Tyt3_wx$;D~$;`zs$bUNRgJ< z{qyDfj`&i%OIN?|ma?@8S(mi2hQ!hcnUYNY%Jt{AS3@;IY9Omk;yMq`uBS*-PoAoc zcT|snR^XNMsy2iP@-i~lZVJ>|_$9w4~JM<_owiAfW9LG2= z47;irD9u8!-pibf;BVyk)g>oG<~H3il0+2Q3rj1k8{=Xx&N9!kZ)P97QmLyG5`HJI z=WbC3V3MFXM1lw6mSSLhd@OIa4~A#lwSQa=XU(H&Gd@u9isS*Lgk%w-)X9(xgMd9$ zV{E}m{e1a;+`#tyeED85I=4x#IEyWC5&uJslIuUNo}a&Z3Ep4q8;THd{roIN6Zuhm zk3$Rx0h#Tyra=Fo-~DoH&$-^(+%tW_V)1`VjQM1iM*eT;#{WAy8gA}?)>5{>Rr~l) z^BMcKV)(kn{_bGe*N(9h=WA1dn$Bi?UInh~#x>z9AQ*fw;<0>efS|$X%k{RGoqPT5 zs~}j4)nJYLe1Z2$2o^FC>|!HW3Bf}4fL#m%D}$Ug9Y;dnUf?a3<3s({#Q5;4?Q8-CeQU4^EGpHhka(q0uZXu)=UpLG zMgrTSc}6;)rr!;l22UH>m88XROHKTy89uIa1QCu4zl#ig&SWPW?(a($oB!i(Kl{>+ z@8WVvtYDM>$H{>k|LNrD=y1dTt)pxKJ=+Ty{5a>w7YYt4d!O6HXC7{IRhB*S5at__ zox;K)&kDP9aoKV<+6Tnce@P}mt_{$#tIGMP7zj>&f-@XFUXln0jSFwCfmjv>R&U!^ zIKGY0RR)8*U2w^bK3?Q7k`Lsv)lYU>3y5KJsVHKw9?Z>A%fD1|Jl@>Oz0D z54%}2kVmk6ae05d3ob72PrDd=)C`0oN->GgCtS{HT3d@QE!i7@s=Mvy5k_%#ak&fL zkhq=6K&yd>tHnVen;&F&hDe@Wp@7686?`_1E0q_*Apt>sD);s}q<+mc3u9y;e&f=tfoP{L6i7=hMA=x_w!^iV5OcAAsmP0XI zT#mrO+2P>ebZ|Hv93CCD{oX#tM!-16%=g%I)Mw;XI{fJMRlGeI4i1M5hT-7oSVji0 zh|WmU0^eIfl2mhwG8OuMn?#KOCmp_P1E6l$1S&{cc=fX%&NV`LI{Z`O>&Ur)&>xdD z8-YI!jn+s;0uqhDG|LjFxl395Ps6WRhV{vRZ%ByP;MU~-e>yxY`~MG5HuB#($`(+w zy%GN$0c<1wZN$Hg__q=NHsaqC5dS*tk!47Cs}s@M?2#o(U@Zo6owAt?8mRE1dqj^X z6WxJC(qVbX?1EP$fKlaEsTl~D6b2u(jPP*~OPgj(u99sCP4r6bJNeNvrCG+9e}!H2k`y*iD(Y z_~d_0R+iL9z5IW0bbR98{~jM7oNeU)b(Ae21FkM2{&%wr^c8I@=x=`6VIUSS3#b|9 zGh=L9RuEuf@nUjs-BI1y>e5%F^_jl|U&@ZTvnMU3RI|G+zU^!z>MOMfQ^uqMR|{ru zT1u%CbSe@-72kHWY4sIt=j!jE+V*w6O|f{XL0DCqq~hDo2C%+TyTYnWb-xt4Y7y2L zF=f37D_a(S5vcsMRR?c5J2;;2iqC;M+ zbke^jw(hk-<=Vz9sR6hW!o0fKo5wY-x=siybaZk&wf8tp2phX|QCevBtq<>9;BEU2 z;cnQW*r>Zq4$5?l;v2;1Sm-!oYyBjLKO=@q^OCOfJS$AE1FcTO>H!!%9 zItZ##LSCvae*b;!Sz#K2?P-=JyIki=cR>~;yC4sfodMWBk0=oclPjUJ?_h6XZ*H$-A&Qhp9Vn7koXo;(e>ggj4R zC>)K(U=y?80i)5YA1>d&{dD!_?Vm>@5TgK5>XhKO8I%1SR!C;MB}|E=!KE=w`JDD{ zL(_~w5`#?~qNI@AvI|iN;EddMZqgeP))tmxK!*U+YFr8)Py=pKa>(O@`=nh z40n*ujH`@0eJYEqgj3}?xLOj5*yNT!HF?`JTdKk+0;3V{%V^{soXZQ_?7A_)@th>9 zJdRy9VIsciIR+G=TKIgHo{`Lpahy?cT`ci#2C}zX*6VAr=DQh4hLFSm(Vek|{U4qW zY*+g~N2e!8)%f2pUcTJNf7nSW_J06>>`yTJlRUjXwLDPGdmJJorIxwvGeT8b({EYS z;d$2-w(KcbFL7&OCX~eI20H{gcr^|F_NlAd^zg9d$!Xz<&viRI{lhKcU81xZ52T>l ziZQ&ZI=}xMTYBy~;8m6950q_7gHa2w8f)HFA*)7`FIUg?B(_B`S*~q0hDVZ4%gKf} zw;{&hnuPV3Yi)CzZ3JDTu0MVpT`9qFfAMp5eYcFFtK7dssh_uKCj3hm4=Z+$Ka>jc zJRkQaB`g7vdg~SWf?~!dMT{mfS&G#{<;|uZ%dN&9R!RW6TSqv+X>`x-$9WZONM-y@8oncd0Acmo$cfQ?WR00qI5pI z|DUlnpeS0az@oL@j01P;I@o^Ds`P2^#~3I=CT~S$FE)F;Xm(1=8YJnp=z)_BpUgq^ z!*5qnFWbbt7;%uVy^HR^=r*TQFl}#HCyLgJrKq88fp0ymwH)Zy;&n{B=Ah6b z$ZvuT47n)TS4wIXf1DjN7kIF$+A7V#@mV-`PJ_VCy(sEtV z*l3kCNZ$pq6QsNugCEg4BKIp4r(^IsA@OfyHU__uS#>{9KOf`^LPHK7=er>E99vjx zn{Z$>FFfkI@PUNjt;OV3smg={lX+qH9Aq7T<&xa7R+SM48s$id$x>4;DIwM*e4nRu zY;G!z^QOLi^TB|9H-|X~-%((Ktq%^Cgr*lL&Ca%050q6-~!#EWDMTNKS3OA5`7Xq!*_w{*mY#~X_jUrAC&Jx7q+gdOgKnUvf?Qie@uJg*Nv4t^<+GGFcni>nGHIMw{8FP@wF41zZg-*4d3f}Iw+WJA}pc97V<%E`Je?}=im@rNbm;l;2k(Iu^o2jK>7{LbSMuZBeif~&~;Z1D1u3_Y?@l0 z#5lMV@YoJqU$OgrrUnk)x5Cp_<-~zkU!^>W zagcKWEZ0zu9OQa2JqNp4H#TulN4Gr(DTz>Gpigv@mD^U3Qlm^#y1p4UaByXSt!EBA zvd(_i{l9yC7fgUlz5k8^U*Ph=;LYDQFdBn5cbKLoevsB2d}%S(sBrL~fB)G>1z8A1M*B(%M3k4^#u=0<}x31~iV%pAS@m7~f*j?4E3 z7v#+y3N|UqRz;V=5`~)xiKxrvk>M5`l)tUDX+3KYR1Rvme9yQlBhB(APVox8jv%EM zEnnZBHOti&*|*`@v!PT2*DM=g>w^P|f=!Z#|73{;n>pAodK!9f!i%d!mzua_`hAg;#g$t~G`AAckyeTV4^ropnEhzbV^ zmSU?#t*lL0aN?kzjlO5Cs>SNL0m~r6!2%v<!a^v8h25Dut|Is*Tz+zdp;XqkG z?tbOy$INX+g#TffcF%zAN9?4p_05`CT6eCw;N=fr~&QU2iI9Qef!N8vcd3|?T00~kg3%m=Dv1Hvx$Y+J?+9Dz|7hV)-y|^*)qhy4Z#HQDX>is08nuDWb)Ro;dJzd=R5?jglE4M3oU1i7F>8oCZM4+NFUill_b)dN#-diH(wpsX{PR&)jBL#nNn|GJa% zT=+b>x_|$(^!C;!dljYT)9vcO?dYxD=#br>*0olg{jK$?3d*;@8W}D$R1FHMrhIiZ zMU)yfti7owj@$kI@CyB%#72-?a|Oy9D_4K1huYONVg)uJaj;1e6bH3*v*ut6c7Gzt z42OO*zxAdDucC;29fOZ(9l-#NL4N;G4|xu8gu>s*jQ)Z%k@Nm7Ug07>v@XqOLv~C6 z{E52BEJM~bWyLbx1OcLSzKLpeIYB;YhpcJJ4sr^U6vvAn5ey?7BWd^81#-1%1#){+ zR*(adN!ZzR`L3E}vSTdQAo~|2{xuHK9V$k1Wh^UA4fwUpxS9VRnn2DLF=Re(dOl7A zioAseNYEmWQ?uWaE3Ur8)m^j)7?wg-(@o>*4M zpxF^2o~RMWvL#6wYm5s8^`K-|LR=7+);`8lz&^(8Wb;GMp=b+rtagP9Js|1jX zF34L?!QGq#yKSp1XeoWgZ0lOtBrrvbP9t$^NyYz&f&{^|ISy52$-^nIYik=A^<;8`C_WrMiXx(4xHbIRQ+#Tt_&7ne@s3 zzQq)iSQV#FxHz3Zhba(~Lw<|=NQBU;4pC7%D4wr4B8!zh$+MLn@?G|<0Z`df7ss9w z2^HD8QU2?3@8|yvq`a`MC`SO`?4?lvM-M1zX1RM|NllYOws^42LOBz0we$c literal 0 HcmV?d00001 diff --git a/library/ix-dev/community/tautulli/ci/basic-values.yaml b/library/ix-dev/community/tautulli/ci/basic-values.yaml new file mode 100644 index 0000000000..ff7435ed0c --- /dev/null +++ b/library/ix-dev/community/tautulli/ci/basic-values.yaml @@ -0,0 +1,11 @@ +tautulliNetwork: + webPort: 31000 + +tautulliRunAs: + user: 1000 + group: 1000 + +tautulliStorage: + config: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/config diff --git a/library/ix-dev/community/tautulli/ci/hostNet-values.yaml b/library/ix-dev/community/tautulli/ci/hostNet-values.yaml new file mode 100644 index 0000000000..b81580d164 --- /dev/null +++ b/library/ix-dev/community/tautulli/ci/hostNet-values.yaml @@ -0,0 +1,8 @@ +tautulliNetwork: + webPort: 30000 + hostNetwork: true + +tautulliStorage: + config: + type: hostPath + hostPath: /mnt/{{ .Release.Namespace }}/config diff --git a/library/ix-dev/community/tautulli/item.yaml b/library/ix-dev/community/tautulli/item.yaml new file mode 100644 index 0000000000..3f619f676a --- /dev/null +++ b/library/ix-dev/community/tautulli/item.yaml @@ -0,0 +1,11 @@ +icon_url: https://avatars.githubusercontent.com/u/34385001 +categories: + - media +screenshots: + - https://tautulli.com/images/screenshots/activity.png + - https://tautulli.com/images/screenshots/library.png + - https://tautulli.com/images/screenshots/notifications.png + - https://tautulli.com/images/screenshots/users.png +tags: + - analytics + - notifications diff --git a/library/ix-dev/community/tautulli/metadata.yaml b/library/ix-dev/community/tautulli/metadata.yaml new file mode 100644 index 0000000000..9a7f2ec88a --- /dev/null +++ b/library/ix-dev/community/tautulli/metadata.yaml @@ -0,0 +1,8 @@ +runAsContext: + - userName: tautulli + groupName: tautulli + gid: 568 + uid: 568 + description: Tautulli can run as any non-root user. +capabilities: [] +hostMounts: [] diff --git a/library/ix-dev/community/tautulli/questions.yaml b/library/ix-dev/community/tautulli/questions.yaml new file mode 100644 index 0000000000..8292a56583 --- /dev/null +++ b/library/ix-dev/community/tautulli/questions.yaml @@ -0,0 +1,224 @@ +groups: + - name: Tautulli Configuration + description: Configure Tautulli + - name: User and Group Configuration + description: Configure User and Group for Tautulli + - name: Network Configuration + description: Configure Network for Tautulli + - name: Storage Configuration + description: Configure Storage for Tautulli + - name: Resources Configuration + description: Configure Resources for Tautulli + +portals: + web_portal: + protocols: + - "$kubernetes-resource_configmap_portal_protocol" + host: + - "$kubernetes-resource_configmap_portal_host" + ports: + - "$kubernetes-resource_configmap_portal_port" + path: "$kubernetes-resource_configmap_portal_path" + +questions: + - variable: tautulliConfig + label: "" + group: Tautulli Configuration + schema: + type: dict + attrs: + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for Tautulli. + schema: + type: list + default: [] + items: + - variable: env + label: Environment Variable + schema: + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + + - variable: tautulliRunAs + label: "" + group: User and Group Configuration + schema: + type: dict + attrs: + - variable: user + label: User ID + description: The user id that Tautulli will run as. + schema: + type: int + min: 2 + default: 568 + required: true + - variable: group + label: Group ID + description: The group id that Tautulli will run as. + schema: + type: int + min: 2 + default: 568 + required: true + + - variable: tautulliNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: webPort + label: Web Port + description: The port for the Tautulli Web UI. + schema: + type: int + default: 30047 + min: 9000 + max: 65535 + required: true + - variable: hostNetwork + label: Host Network + description: | + Bind to the host network. It's recommended to keep this disabled.
+ schema: + type: boolean + default: false + + - variable: tautulliStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: config + label: Tautulli Config Storage + description: The path to store Tautulli Configuration. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: "config" + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: additionalStorages + label: Additional Storage + description: Additional storage for Tautulli. + schema: + type: list + default: [] + items: + - variable: storageEntry + label: Storage Entry + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: mountPath + label: Mount Path + description: The path inside the container to mount the storage. + schema: + type: path + required: true + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + required: true + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + immutable: true + default: "storage_entry" + $ref: + - "normalize/ixVolume" + + - variable: resources + group: Resources Configuration + label: "" + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for Tautulli. + schema: + type: string + max_length: 6 + default: "4000m" + valid_chars: '^(0\\.[1-9]|[1-9][0-9]*)(\\.[0-9]|m?)$' + valid_chars_error: 'Valid CPU limit formats are (Plain Integer - eg. 1), (Float - eg. 0.5), (Milicpu - eg. 500m)' + required: true + - variable: memory + label: Memory + description: Memory limit for Tautulli. + schema: + type: string + max_length: 12 + valid_chars: '^[1-9][0-9]*([EPTGMK]i?|e[0-9]+)?$' + valid_chars_error: 'Valid Memory limit formats are (Suffixed with E/P/T/G/M/K - eg. 1G), (Suffixed with Ei/Pi/Ti/Gi/Mi/Ki - eg. 1Gi), (Plain Integer in bytes - eg. 1024), (Exponent - eg. 134e6)' + default: "8Gi" + required: true diff --git a/library/ix-dev/community/tautulli/templates/NOTES.txt b/library/ix-dev/community/tautulli/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/tautulli/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/tautulli/templates/_persistence.tpl b/library/ix-dev/community/tautulli/templates/_persistence.tpl new file mode 100644 index 0000000000..e301e414d4 --- /dev/null +++ b/library/ix-dev/community/tautulli/templates/_persistence.tpl @@ -0,0 +1,34 @@ +{{- define "tautulli.persistence" -}} +persistence: + config: + enabled: true + type: {{ .Values.tautulliStorage.config.type }} + datasetName: {{ .Values.tautulliStorage.config.datasetName | default "" }} + hostPath: {{ .Values.tautulliStorage.config.hostPath | default "" }} + targetSelector: + tautulli: + tautulli: + mountPath: /config + 01-permissions: + mountPath: /mnt/directories/config + tmp: + enabled: true + type: emptyDir + targetSelector: + tautulli: + tautulli: + mountPath: /tmp + {{- range $idx, $storage := .Values.tautulliStorage.additionalStorages }} + {{ printf "tautulli-%v" (int $idx) }}: + enabled: true + type: {{ $storage.type }} + datasetName: {{ $storage.datasetName | default "" }} + hostPath: {{ $storage.hostPath | default "" }} + targetSelector: + tautulli: + tautulli: + mountPath: {{ $storage.mountPath }} + 01-permissions: + mountPath: /mnt/directories{{ $storage.mountPath }} + {{- end }} +{{- end -}} diff --git a/library/ix-dev/community/tautulli/templates/_portal.tpl b/library/ix-dev/community/tautulli/templates/_portal.tpl new file mode 100644 index 0000000000..6868c71253 --- /dev/null +++ b/library/ix-dev/community/tautulli/templates/_portal.tpl @@ -0,0 +1,12 @@ +{{- define "tautulli.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + path: "/" + port: {{ .Values.tautulliNetwork.webPort | quote }} + protocol: http + host: $node_ip +{{- end -}} diff --git a/library/ix-dev/community/tautulli/templates/_service.tpl b/library/ix-dev/community/tautulli/templates/_service.tpl new file mode 100644 index 0000000000..e8e4fe8340 --- /dev/null +++ b/library/ix-dev/community/tautulli/templates/_service.tpl @@ -0,0 +1,15 @@ +{{- define "tautulli.service" -}} +service: + tautulli: + enabled: true + primary: true + type: NodePort + targetSelector: tautulli + ports: + webui: + enabled: true + primary: true + port: {{ .Values.tautulliNetwork.webPort }} + nodePort: {{ .Values.tautulliNetwork.webPort }} + targetSelector: tautulli +{{- end -}} diff --git a/library/ix-dev/community/tautulli/templates/_tautulli.tpl b/library/ix-dev/community/tautulli/templates/_tautulli.tpl new file mode 100644 index 0000000000..8e70105664 --- /dev/null +++ b/library/ix-dev/community/tautulli/templates/_tautulli.tpl @@ -0,0 +1,51 @@ +{{- define "tautulli.workload" -}} +workload: + tautulli: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.tautulliNetwork.hostNetwork }} + containers: + tautulli: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: {{ .Values.tautulliRunAs.user }} + runAsGroup: {{ .Values.tautulliRunAs.group }} + command: + - /entrypoint.sh + args: + - --port + - {{ .Values.tautulliNetwork.webPort | quote }} + {{ with .Values.tautulliConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: http + port: "{{ .Values.tautulliNetwork.webPort }}" + path: /status + readiness: + enabled: true + type: http + port: "{{ .Values.tautulliNetwork.webPort }}" + path: /status + startup: + enabled: true + type: http + port: "{{ .Values.tautulliNetwork.webPort }}" + path: /status + initContainers: + {{- include "ix.v1.common.app.permissions" (dict "containerName" "01-permissions" + "UID" .Values.tautulliRunAs.user + "GID" .Values.tautulliRunAs.group + "mode" "check" + "type" "init") | nindent 8 }} +{{- end -}} diff --git a/library/ix-dev/community/tautulli/templates/common.yaml b/library/ix-dev/community/tautulli/templates/common.yaml new file mode 100644 index 0000000000..071bbb6772 --- /dev/null +++ b/library/ix-dev/community/tautulli/templates/common.yaml @@ -0,0 +1,11 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "tautulli.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "tautulli.persistence" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "tautulli.service" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "tautulli.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/tautulli/upgrade_info.json b/library/ix-dev/community/tautulli/upgrade_info.json new file mode 100644 index 0000000000..767388094a --- /dev/null +++ b/library/ix-dev/community/tautulli/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image"]} diff --git a/library/ix-dev/community/tautulli/upgrade_strategy b/library/ix-dev/community/tautulli/upgrade_strategy new file mode 100755 index 0000000000..41e9448b21 --- /dev/null +++ b/library/ix-dev/community/tautulli/upgrade_strategy @@ -0,0 +1,31 @@ +#!/usr/bin/python3 +import json +import re +import sys + +from catalog_update.upgrade_strategy import semantic_versioning + + +RE_STABLE_VERSION = re.compile(r'[0-9]+\.[0-9]+\.[0-9]+') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + tags = {t: t for t in image_tags[key] if RE_STABLE_VERSION.fullmatch(t)} + version = semantic_versioning(list(tags)) + if not version: + return {} + + return { + 'tags': {key: tags[version]}, + 'app_version': version, + } + + +if __name__ == '__main__': + try: + versions_json = json.loads(sys.stdin.read()) + except ValueError: + raise ValueError('Invalid json specified') + + print(json.dumps(newer_mapping(versions_json))) diff --git a/library/ix-dev/community/tautulli/values.yaml b/library/ix-dev/community/tautulli/values.yaml new file mode 100644 index 0000000000..ae914895b4 --- /dev/null +++ b/library/ix-dev/community/tautulli/values.yaml @@ -0,0 +1,26 @@ +image: + repository: ghcr.io/onedr0p/tautulli + pullPolicy: IfNotPresent + tag: '2.12.4' + +resources: + limits: + cpu: 4000m + memory: 8Gi + +tautulliConfig: + additionalEnvs: [] + +tautulliNetwork: + webPort: 30047 + hostNetwork: false + +tautulliRunAs: + user: 568 + group: 568 + +tautulliStorage: + config: + type: ixVolume + datasetName: config + additionalStorages: []