From 56a469a999774c8b8683adeb59b243fdf85b14c9 Mon Sep 17 00:00:00 2001 From: Max Isom Date: Sat, 5 Feb 2022 16:16:17 -0600 Subject: [PATCH] Migrate to slash commands (#431) Co-authored-by: Federico fuji97 Rapetti --- .github/hero.png | Bin 0 -> 230274 bytes CHANGELOG.md | 4 + Dockerfile | 5 + README.md | 24 +- .../migration.sql | 10 + .../migration.sql | 10 + .../migration.sql | 8 + .../migration.sql | 11 + .../migration.sql | 21 ++ .../migration.sql | 19 ++ .../migration.sql | 2 + package.json | 10 +- schema.prisma | 15 +- src/bot.ts | 218 +++++++------ src/commands/clear.ts | 17 +- src/commands/config.ts | 178 +++++------ src/commands/disconnect.ts | 21 +- src/commands/favorites.ts | 195 ++++++++++++ src/commands/fseek.ts | 52 ++-- src/commands/help.ts | 70 ----- src/commands/index.ts | 14 +- src/commands/pause.ts | 21 +- src/commands/play.ts | 268 +++++----------- src/commands/queue.ts | 24 +- src/commands/remove.ts | 79 ++--- src/commands/seek.ts | 52 ++-- src/commands/shortcuts.ts | 128 -------- src/commands/shuffle.ts | 21 +- src/commands/skip.ts | 52 ++-- src/commands/unskip.ts | 28 +- src/events/guild-create.ts | 101 ++---- src/events/guild-update.ts | 10 + src/index.ts | 2 +- src/inversify.config.ts | 14 +- src/managers/player.ts | 7 +- src/scripts/run-with-database-url.ts | 6 +- src/services/add-query-to-queue.ts | 155 ++++++++++ src/services/config.ts | 4 + src/services/get-songs.ts | 4 +- src/services/natural-language-commands.ts | 131 -------- src/services/player.ts | 41 ++- src/types.ts | 3 +- src/utils/constants.ts | 2 + src/utils/error-msg.ts | 2 +- ...get-youtube-and-spotify-suggestions-for.ts | 70 +++++ src/utils/get-youtube-suggestions-for.ts | 15 + src/utils/loading-message.ts | 81 ----- src/utils/log-banner.ts | 1 + src/utils/update-permissions-for-guild.ts | 44 +++ tsconfig.json | 2 +- yarn.lock | 292 +++++++++--------- 51 files changed, 1270 insertions(+), 1294 deletions(-) create mode 100644 .github/hero.png create mode 100644 migrations/20220128000207_add_favorite_query_model/migration.sql create mode 100644 migrations/20220128000623_remove_shortcut_model/migration.sql create mode 100644 migrations/20220128003935_make_favorite_query_name_unqiue/migration.sql create mode 100644 migrations/20220128012347_fix_unique_constraint/migration.sql create mode 100644 migrations/20220128020826_remove_prefix_from_setting/migration.sql create mode 100644 migrations/20220129010359_remove_channel/migration.sql create mode 100644 migrations/20220129012310_add_role_id_column/migration.sql create mode 100644 src/commands/favorites.ts delete mode 100644 src/commands/help.ts delete mode 100644 src/commands/shortcuts.ts create mode 100644 src/events/guild-update.ts create mode 100644 src/services/add-query-to-queue.ts delete mode 100644 src/services/natural-language-commands.ts create mode 100644 src/utils/constants.ts create mode 100644 src/utils/get-youtube-and-spotify-suggestions-for.ts create mode 100644 src/utils/get-youtube-suggestions-for.ts delete mode 100644 src/utils/loading-message.ts create mode 100644 src/utils/update-permissions-for-guild.ts diff --git a/.github/hero.png b/.github/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..0599c670c9dc047b20ec81e4ad75ee0a0e7c7836 GIT binary patch literal 230274 zcmb@sg;Sl)4=9YgyThRecXvCu6?b=cr&w_)?oK(lyIXN7?yfEFUi9+*=HBlw_+~QC zW|M4Y_t|8Vl_=$}(x^y8NDvSZsIoE=st^#+p%4&oq6pBR6uenKl+OajN=#7<0-`=1 z`PBsWvkvK|Dh-0DnIbv<#0!)a)Fq{z74AGaKLNWc_b!u%i&x|miSm@w)lnD(tN&m6 z|G1y5yCtFjOZi0pAAHLH$MWR-{Qd`g|AYSz;S*tD<6>du;^zHCxOw>gQz9ZE&&4PD z*@Tsi>$5op0La41!^11W%*x5hEy%+s%FQdv$jr{f#>L9P%f%-|&&bNo#SaAuxwEy! z!p6zW&Q1D5K|s_=Mox*?uat>PNJ&M5hL-V*b)1&Ao{*>nL0I$K+Z&&t7`?0>g=+?# zvIVtqKt^VE0k~*oW%Ub?hCy6K-^h$s+XW3B)6Bv$At9-vqN=N_$HvZyiBAG2e$d&~ z1G47k@ZbQ4kd#SS_U7hxeEfHPeFJ*tLR8d`fq}u6*0$N%IdAW8pFM*w+}F0a@(&0K z2?@hu;3wk!I=%WJ6xqMfCCVtI%c3k+n*-_}J&p1MQTfR;8%wBYCeu4g7nLtq*{0OC z@A!W&Pf72RmiN_>;b}7z{Gq`2{m0|3)mK~av@Rnxa#LFL=gd*KtA163ka1|IA=-gP z!cIsywBbmok+SUE6{As^aE_hpEWZ6yJyIF=DGDJgA*SxVc4n|1x8H)rDaxn^(+A;a zl3>L-wr<0?mYn4Vea?kC#7WBO#sP0RmL|Iz)!h82qlWg2-X zNn{F>L+C|pZ~t=o!4zd17AGF{$sEW@kcWZTVMfd>c&|epZyH57;DreHmKc(Lo=AL~ z={R9^pdS+o7cz&-B#lUkPo{IWEHoJ!s>#mjhm2wfEI>b%Il9zrfI-cVfAB=v?#CD| zM4|CR{Adi>tF#sh>V9qN3&X zJMA?42~B~u2x>TK0;|;F#t^c*JR0R5Arhl}B*JiYq%2Jec`zCpJ8sM;bK55L_OTV%=lJJ90GrNqTE5WJH8b(5V#9pz<8QbP+SqUrzx;| zR>$Z+WEZ2pcZPA5w#_DpxN9CYoK)};6ml90^_x?!$p?E#ThQhuCGrl}!o+$oZHnj> z-#=U*YL(r-C1@qh8A|oBoq#lx>s59-7mNa%v$%O33z9l&eWNiXUi>GZ|~$Ht~#z z3DxT}Au%8OQg?PMlR=QqRv`sVA&og)xU^8UIR*zZf?K1o-=7AUsIDYe`8MXUX{0(Z zoTm3d?~)#BpT&d^$+X2vtEAl!@%)<7UW*AWqBOB2J+Mhh-+6O43XfBT7ZIHM!l=+H zd{Ao$G1`sU`2DuuZz2rMy*zt91%nk)Ae)v|n4{)S5Sqv&aA6WD#9bJC0v`IwkNdng zUc3l)*@_f7^o~w+cGAf-6Iut$MuInZ{DDAJ#N#pohXG7lMq)`9vu76_g-OP&>k?bftCYqPAkojTf?Hq}6JcwLlvtpD5BMREa`Q`q28b}?8>F^PU zmL=00XdDp_lENgv)2)7O5oP)-z$!K-QID_CCqCU*mNINUmse^ykmQ7hHJ1@{tKeK) zv0+6gnzeJkb>!0PO-@2vQR)%O!^>q*Lmy)jCu}++tbKvN1Kus5EB~NcKoIecVGB+S5c1FJ&Xs zd;FpuxS_#Z#yJ=ZD96!boD7!whl^8lT9-(*kU}lMQKf+k958Y>Y|xkcS~g>d+mRMN zI`XCY5ua1VnjP*kldKyK_E`5-VqK8(zDz$Phe&pp&e$e!8@o}lIP|t*Cl}nD z8AE{BzRc1^=L?DW==UGK&^$xsRUYBbP4=!piLvCbcsW&bFMJ zF@NCv-UN&@W-ahm@)b0tkKvNuB2sbB4-k~=OG6qO}sRm#e^+%LqFCMSTp-_!fPt0baZDwr(T z-z*rY=d5e1d$sZ*s%HqWi$heDs`IVXMPae`;FUzb zUsfl-5cet3M3|GXsE;e=;&%6gn($U5LZr4*tmxLf`Jp))?oSWC2S;bM(k_)wG6LkG zJn8O1tE;Q(h~d}SZPvK(G=G&9xsR&=o3k=nS+9rAnRVa7 zr4?bbAC}W z_6Rx8rPsO0ID&>pcXzaW;?7vmiZy(1EBS~nIq@m36>St3A32*jxCJsN=ASp}z!hK=_Zn-i%;?S;kOk!VQ zjLAQPnEB#9I2PfeyI`m0F3AVKYX+eMj~YA0!%olXf22DsEEU(c2?`Xpb8x9Xzs5~M z+&K$#C##IIJ4N*0-5Ll2Q-ymo>#K|Z)vT|@-~!Dr;9R!dK_oah)61x2%QM;z$IC6Z z0%ZgW
fm%Hw?T{5ur662G}*59ZUKrQ+0qQ8@TxoQTvO?ix^rJ&)97r3saUb&vfKT(Fa1+Fl2dgt6pgrLEE@L5i;>rwFofTG?>Ui}(lVPFhqc znmWz+O=LjQZH3;L`IPtyiwAZF0w2UAloG*Q9>wS}`oug)Qo)`_kwUd}3+ zeIgE!$%0yK83#>ef+Sa~QF;>D$iJE>knYDcn2G6lC8|Y#*PYteOv3=~E|}uIyO}^F zHbezeUa1NZ{^oAX`oVdJXlNP~CTXTXUShhG4N11VuK`I~^cO`h5yKIj(E^EaIwBy6 zCs1KjF7Qv?gu7+x!hJm{qLprroXbS==7%|+9Ea8kOIu3O;U1}>1uTz>cPgsE-BHdH z%()d+N~qeTeU>!7b2h{=e`a{c@t!A?`Z#l^q}e`!>!?|qaNN@9NnTMGyLX12|0|!{ zPX=AzrYO*mGA!aybm{OF84)T5KH*MSl6P%fTxhw&Rnk-uk#E1uNqbw`!` znm&BtGX|i*ulS4LKU{k-#Sky*7?#vx!Kea&04G@wWxDus!!7599iFpsRjbL|ti{A1 zJ4`T+d~x~v^Enu>t5V;i;|AoPva2t<`eCxk2yWx6 zk6hno|Ng1Zad@f4)7Jb)T04GOHF;4*0igbZZS{o1>488rQA7#2zm;nz`O1d(>niwe z%7pgtHSQfxad+p@lwzJ`He5zqOFr6o0vYeL8Y9kzADU~qPsU=x8urC&^uqnQQNa_w z&7~?olvEK1**pyX7KXJigQqDp>(m&$!({b4KA^J>i#?=5IBH^b2gb)8d3$fxR_++E zdtailO^Cf0wIFw=4D~HiTlq=R`Up$C?d&r7$Qqo%m*au0bHTaF)PRN`5qQSJ#J7pN za+HEHSx4EcoY|F1JuMy*6Z&n$TQ4(E=HllZq+vvZ3-*x4>Z36!iD3)0tV}WH&FuX) zjTD&UjgvYLB_R%eioZ`u11%0wK_32g`I1 z%SNUQNisI{o6^;ht6&vD%<06bHQ4(sFJ|i0HtR|eXZ;@4=5BpV#`&9);-q{kL6mbF=)XHX^lq`;d_up`3 zp7y8nduyH!Yehbu*b<_SwkCkTeBGeYrQY+63G{lN$2Ni$5%pu!e>- zMdTuZZ!ed%0s$ZIPapY#@hK!RNlu`N7vX`s^?x%LFA2Pn+Y&096#CPo8Y{A&dAGXA zor|l=xk?VKU@bM^?Q$6!TIcoSvNtBlXd8reR{YoV3RueKa-$BuMnsozQUmD%|k(RO-#PqMU+wvhR(?J{cK%eDT`;r2mTb57ME!0~V z`*G^cgTI>=QK%goIwt`*B2koH+E2*YmpN}uD5sNIn_X37aJ@#YVm=wC z5Tc%qBCHvIQ2Jdv*6mwypW<4#T#6($1wR(P+T`@Q?EU?hjo9`3zQ5nrO3Lf$Hzt46 zul9hdhefa<8N|z+BLjPkUv@v`dPh$~;537ww}4Q``h$LNw$y&tIRC%Dq)?Tnt^*yQ zAgk#w3G{B1%e8uQl_15?SMfAMv9eX){fw&LZiZ-L;D-W%et{o%gYT@(>q(qeNl`q& z)-?(vieGBJK&^8^l*yb;FCwiWEzLh)FE{XVM{V>Cwk-wLIeGaDoF{)S3=8N2d_KIw zi}bO^BB1fd7=J-e-3x8HvRbs&zfJKCfORZ&A8K$y(?2%lzukzF%U53ie8mpold)8= zl#vsp21gm+MGe^o}tV&n3Xp zL;BvCU8Auv+^fw_+j9M`4t*Hy%Lkb^Z+sI?O#YDF*wwoH%E99tJN(=@Hz7QP>1Y<{E`g8k$X_ET^9>l|B3C9&-~VjiTZfS71eN-D zb-NG^+T<*5+4qE->~}oBJX`1>pu?FM5{J4S`sP69`QWw-W{QKe+ZXFxCI`fiPN6_L z?;;1Hr|kcDTBmTK1i8p09CJ}!J-mj8{Po&Zgej_IiT|8Kpi4~uV|ur;s$M^HPSA_< zdm4{rrbtm=ZlY3AgO%M&9MgsM?!egD#gXbEOJ?Aq?~Xxic2673!WuEO)=lGEv}Y73 zpf^ceXCJ#a#)1<3Ifp?#kCr!RYYUTBRUF5SiprokFWNA%<)xKgTJsiDZxZAd27!KL zMvCjOt|XR(zj ziWDsQcgL)+XVg$F-O{t}Sjc7ojd`G^*=B>gCX6J9hxYdcel-!cF3t!0Nkzp0m%1w1 zj#V2rVE9u>@iAHtFLUZI7OP~pBesLDIa0>RPVtm@mC z0*BgSon?J!E==XI1hR%#IBadYf`?u3VkU5XUUbB7y4{sz=R5akd0BJtl?|p|GFg~( z6|Y;!aa+T#O?=F_JEd<&a+Z)-&LC;kpy!!wJ-AqR!tWSo`d~&*lXAsoI*T@de`Lj? z_pm1RWYBle@5@-NTNtVLSD1dSo+5U<;HddD#eaza3$_N<7B#AS-@Lr1JdwV6#IFZ+ zvh|0>Jp}L-7L)y%x;;ELR;yGzFv#68>zqgMvyg zI#!RBQ<5jbBjRw@+OSLNsfviu1lbnPGVPzg6P?P9QlONX%&Oqbteh%+iH(aOqVo3; z%-GE;FM%WzO>%py55D42vzx9GJ)zWuTGhxwZ1G=rHv5g9=~cX2CPKE?!&S5&Fjtz# zSxDVjg|nRjQ4nXyWv=hg>@fgD& zB26_*=>L5DS2q5qloX-yv|Oe3M^{h7`$BLv-Sh6JMkI%X$Bb7`PRP82LqUX27a+{w zy7z;E^#Xa!WEJ;Gn%j(xgLTN~0Nd6nI%j7kcMG>zRTH?8@fVeyErDPA&$f{=3y@$T z$((DX@pi@{X08xC5{NL_m8GfKBPPID;XlFV7~%i&^$Tz*5dV|%K)?DUJ}T;l=~`}^ zYLP{O$O?l;BKKwB@L#>UzrEOPH7gILPG(I^5zkw@@K}woO^XB&O&vw;pnNSnESj9F6fF1#`7DAW1{RE*k9U$9JRNG|%bG{m9)n4)`1__Y3&wtdySv+X_cgEni}G6bQ|} zH0y%6MlpiFbNr@57fRj`Y1&81QRBD=-p7OSJ~`2ErLA&~ZfgEU5)&i3qpvjFUgNYu z6NjflVlT8S3;2wy>)fL!h8hUF>0Q-<0?4&*5CmdDht|-7d)(o;&$G3#58D9&KGA{@ z$rwT+B};$ax`8!xRdwzRXTWy>sc5s_t-&(ox;sIWfO1v zMlt~^{4NR0*kKujYUYTi@ofd2MruhXYGl!n=RfCPWeGKH#@PC!6la^V2=Y;&%kA(t zI2PF-30xKETy9Hbj22;9E%is`5NKQ#ko__mQVmGdiWL1Wx_2T;k8xBeildL{&n5Hm zv7XjpCP3yDj=JAmx&9~`Jbw|iY0%qKT5(ZsYX?#4EaV*VEYO>fXSAbXemI^y*4w~; z^1_0)yFUNzz9t7NQklwi)LefDZSN;k1~ldg2n!bK#vOM@FoRn4I=2Sq(I@e<8LHq% zVL&59KaWUYsR{MbLqc-UPqOuFLIY=aq&hekF}dHu8I)>N>*nm}zH+B?5!O>|f^XUU zV&$rju!ei+XZr2m52ulLt&r(=J1<3L!kM*}>C!x2>Nzlw_LU0qyWm#ddBaHbq8NfOYA}Fow~4~9vb2!6{$#DBlz1e z&~azi0psbG0OL8~3r6@6E!1@t82X!kgdSJ*FzRpZ&rx5)Lx3_81P%Coq3i*$s z>)PEp-nW?&R7zQs1c`m&)E-;;BaDH(gAyF)Ez?6^zNtlKgkC|D$o}5yM6gP?8U5~` zuM85};xT=+g}>KqKShR71s^eVF~C>7=iBchV^Muh!`$*a!9!E`Rn*Ck7;6~dww{1I zu@j%G=s{G$G@h#saqDRhRz}Ai9}QGNZqcV)4A>tu$+ZLR0SyrSfr8tJ9G|>;C*nWz z%hO`W;y8?3aP8`c&(4Z_YfuP*mI$B2W)_mU)emfe=r>W$eu!E-M4E2->QWBvXXc(#F;C`%UTr%uoo;KYi-Q01h}hM0N&@}J z=F{s@Zz^(6Up~#dC5*O9^QGA{ZZ|T79|ZJ|q2Oa0@CGE0X&vhud;|DlfHPbMVJWKB zM&et@`SFBsPrM17YkZy>+`4%Yj07d>4d8Eo2I}o4coQmWBj<*2&JPUzY|R$O;F;7y zAaABnPlCT0;#>YLJ|}{@o1Gqhr4ng6jFDq}r^QGsLPDcUbQfx9LaVi)9bDD{*MGJC z5K{2B;P*NO%C1@%?b7*Am2u&kHd7cJDDyr~!+8`nqdnEcdE2OptQHIPsALG0hYslY z2nMGRZRShP(1$QuRnC0;=-S5*puGi*smIzD;Dqa89U*<8W*Aa212%72(W%toGChep$(pF-a?v9K* z(jv_0P1VRa%3}hl)PMtVawHM$iC7~#^9SaSimCL5Di(*f5fAYIzYlQg)p^qRRLzl^Py@>4j(IPuF70|o4NcCrgaf@78r=Ma5du4f zFEPRb^?vWQ=e!k_1WA~8*{z?%EuqcRf*H3Q6US`mXJ;07Vhb3-8q1E+1!OpxrIv|e z?AT)Rb8L7^Z1=40WK36)bcdLJF3LcsMutx%e^#n4WR=(3IS@{($C(+es~TjkZfg@$dy{hb1t0X=u4bm7$h?=1i@*-M}3p2Qh1(so~$ zZ4^1W#gQaOZ4)OGEV!gtp$Osq1idKQFba;EA2s_+>LzsFgpC{0$d@+F;6qqKRo z+oNj4D1>o_pDXfBDT1}2OI=M7C9EU1@K+LH&urqAFd2)AcnNWdeeB6TVUML4fJnD> zF6c`;r#(faPF@P5y#Tx#uhtj7*mm4jXTMUpd3)Ete@^D*D%`GrZxiNx74$` zNUG=p!UTle>r;jN{fb%QdaC99T;i+m)ng+Gkum_7hmWs)uv`Ci&+i$3&tGt9RT1$V zRmGc%h$CyBg3ey8Y)vRs8-kM~Qf7y3<&oBt7^}Cu%1u9=4Wq-!Aq2y71)^vzR%MJV zyf4IB;J%I+kW0D1OJzvi$m`f+&_$Q9t-h2AvNnq}6^NlMG>DO84LN%#VIwL3PQ|{G}#l~e3*J5YNPGGmsZ=iq) z4Hl<5bKf#qQI$vdGJ8}bp`%?~xh9~++&f*>7&H@(F_a#W>WqxjZYT67AY8ZBlD`bn zQ8!c7gZHOtL4nTFfSQHX`=%LsCNnFl&62oolrJb#20WEA+*bMGuPs3$Y04HVLImcu zd_hA~vzG@8*<{ksaem%)`sOgGA+96J=_>m)>(@J!HcMp=Xh@#)p5<=aZOCAaTsmxD zc&wgT#D5h;c->iaCCs^9V*Hfa@Kk0KRjua6-L&{Kb6Wg@m0ZlQ?R%LNoAKI|m#lI(FonTOi>J@2}&5LP-s<~Ow4$2jA zY_d8MSgT^HL#5(kTmm0=rQgz&iyXJzGD>=|m=#S@hj+DpVV&@QFIf7a;l3;O42NOZ z;(j;cH0O~b`SMcoui`o%c}f?DP0sRF*^$~f9aNb$w}xl2BLFo$ei_+>o0O-nSGFB+ z??BO&zN6puaY2u^IvB6KCoIWl1FKjXHW(~sQ$?#ezLb!c(#Q0VcWCLampH-;mM zS2K*WjPytV zVF~kQ8un@<$QGggu@DRu!3+h?SpfX5lWAp&ejoM10HT_35n6Z5pK~dI-R1}^j^L|( z<1$E|V=D2dfnvbxF9{W^m|}5xc?n7c77OsGXdTkj3z25#rGOl>&zu+X?veryR0B@w zQMZnb5iv~Yd|AWB+*)D}w!@IbH71Q(Ni|ZYaz>+R8!Bw)*BIQJQS*fi>41WuXSd`$ zs?c;&_}j=R&{NWsdOV*cp%O5hu^HP;G8gD(ob@FpVj!Y7!Kqz}Qi#T(AmF7mUc61q zY*a30GrwC=ugxNAicrs+qW*8tN;q^yT6NF!a{(nWlCJt(<6O2EanO}fyn3~X|2d_2 zqUm>rVn z7IH0sLUo(8I*lu=S4z`Nn^f-iO?_!8M9`u%zDSka;}_+C(!=!7qpyqTDzDU*xu)4y zwL=8Wm4N!;v4^JDtG0X6G`c0Q5^qNxepCy@nby<=QK?i6*N~#+m7_>jl&FM37HOt; zkZYt%+SL|tm9>BS@u#_ZtpL?)kisU!C-dt3+^Mz&vEXpVKW8)w$!jWxSlG3XG))qD z?Pz5hi&PnD;=IiXu+-($@b$&teVCp;dWgnOx3191g;wiJ9ZAa1AsPqd{#GX*Hnan$ z)VK>J{D@WoY0WJb)fZWuVKG8ZR$G}i%myY2*nYNAteV(-1`a!wog7eN=8W}3nFXwk z8-}nN_Rv7}&x9V_E8c$xie*~GI4EV6?L(&5Y72OIEffTU?Iu*Ty1sLoO@CcjjeZUs zQ;S$Gi}9qpvg=BdH21a;_z91QwdD^hL(bWxGzlTJetOvnU5LzL>s^VbABwFo0uNJ8bG`BLvW#eE3zL#I=)cuo9&K5cv8= z*01$x@9yng6P5}%hZr^UZLjw->}*yZLW507MVAo$)tR&~cYJvQdusJo788G5HGN5^ z_BS^TL{EJuaaiQ9;@M`#vEUws;IQfkksn|ZwQSJ|4E5Vo3U9$C1gX}HJ=dRL?cVs}+3 z%_6rM6RzAbCKgHC6+2Z~t~;5vj5-V3(_q;n57pj<_2GW%qZ*R>&PW0Q+YEPww3;o7 z;z}^Lt1vQi(xHirnJk&(IV~orIq=-E^P!ba~;XC1>ZQJSA>KRisZ$;SLbHQ z$yqY!u2UQl<1>m>NQN7~;o@lq880J49X-d3pnz}OP{bW?3}2*d8}az}|Mf!)OLnIz zcNQMQSilhp^r3RHMF=`yc8TQ&zKQm^lgUS`s#?qX(mV7^T%TZT*pd4@1y26+FY=m) z$a=qUY~X$FnmGAZ#uN}_Qj&ziW~jXL3(kI5>Zh}jTX#i$n7t^U*g2re9iEC|l9M^E zWsh?Z{Od72MFlpf#TcB~(EnzooWkByEFE#z+=TeKO62SC>n@_R<<+&+US6Ek^BH2N zRbE!WRsMJ!9+gab!Nn3v(`3SsQvlYK-3Vs`6j-(6M`k5>60=C!HO2S}mRw4yhYDo3 zE{7G_>^cRcN-iv5%OZF=e6X|z=2FL2C1|mZZvlQ8V|TwBtG3^j1poZo+}y;-=_be% zE^ai=jY5KXe4fHq&n?8j}Al7VZ+W*u!AFo9^in-K}h6W?oHHV<0p z?(Ep}Ssm8YYDpd*DiW4fk537u@^_JWG6s9UDJbGZaHb8>)c*O>s{#9Ab?K+KFO|gl zezG!M_pS4r9xx;raf^@n2GNB=If1s@1`$S8p2D{rFG&~fm^gG__@8GyjadY*J@Z$4 zMSb*@l}thole@zAvQxS%Jegr$&9ZQPSVS>LY>ky;C{Ko#<`#_uqKa@$F|q}7Bb-0` z<~C%ThK`4MN&+jD$K#}bAibbrm_2R43btk}H>Rpf1KEWl!s)UlcUP%X37mz$4VZ)l zu=pOrn9!Ef4tfwM&>h%_+&##&5jG7k2!3x>dlHSvsH}*GBqR42T7S%@RwA(%q`|EH4;!37S_wFu+Cny7?ZlOBl>Rg~efuyGZ`6H~PX@$;?&la^fS+ zbNUi=C87kk`@5!_MUG6b&VysENCQAWZ{S`gmC1b@G!PWmN5QBdhHa!!6#;tsBaY*k zWK#*ZK||@FL4eGc@Bn^2Qcp0?#tm-}6o-qE-=kD^kNf=ocAO-+-MBWXBQjls^?r^Xi>;1#QxJ^PYVJU4rPA?k&G zTGJEkEHf<2jSy$4h}eWRoHf#mrdnQ$;v^(?p6Yr3ewuOZLx|la>P&uvN9}SFR~+r{ zWDJab3uHAj8AOE@euz^?byFecSluZXwD-X(EJe;C0m%=c+4gmk7DagPMLOAwo)NTI zdY6meDJ9uK#pQM`W6@mwXmIL0lZ3M|zC@kA<4mDb0!>m%iGar=UMaq`0O1;Z4zzqh zH9SNIIAYe$mb(?!{QD*hM+ef0Nkp5hLf)W?Wrj15?EoJb%M^%C;_g*-#QUiJal%GKdhDu>;rA+JzQsoW=*Z|9yeuYBoo{}*bv7t>5=_@k z;cN=Lq_p=GF_1?Q-RjvX=y>qc#2L^s!5b;6GH*#>O{0}`f~x~7Uh7(QBu!FGMMCs|LQSIl zd;~H=h$6sZ-?f)eF4qK5zX|Jqwp<(J&oClee17~Q$*h@HiP4B06RFOx_v$%llkpn? zp5=Iv%80(o36JbE^w%mO?@Hek+Sa)4riwyX%;po_5QG@0zvdBbi0N{erpf9Vz`4V=Wc zf7g7xJ)GM;Xq&Nxq7#DKoJbXB60CYhS^;0VXDWaN*U$*HMgnhr7!6aJdOGm8E^h8r z8e$4aihsC@3M*JOPX4()^}V161ip;RH=ZGw%rKt~PV&nmnn&KuSkQ zH$*Jf0te9YgVbbbEt)RSHnYz(jFCsagmwla)CxbLUzk3SSvcrs6M&zNg%KX>(JixF z&?_{#7U)S~5t9E(g6}oVI*3DN-(nTt>l1ZNh&%aj{+@5!q^^TI6-r4wNAmgY)Yd-N zP?3ue)&i+H-NJNZ+ye^nZIlE%Bip0VLSQvo-=(A{1ar4d;jp$5lso(7>*J7ltS|b{ zEAvRUhX=2|!kel|(I;wN(9`K~TwF=B=G=6mGm@`*#^nUg7_~LgXv(ZJBUGROFdKg) zWgg#JHzOLV+a+`jLjO^M5G8W)MMQx&q*j;@w~v%;$t*pz^z&4v#VcU_h7~un7v3p> zvRQPgd&36tTP*3qjq%|(i|bn>^HOsTG!6AJI4dhrTkP3fvc3AU7v|e(yd82@y6=c{D%CBK zSS=Ex7#ZU?0R{GkUK70iSbtiJaw--g&~tKkrCqF^ELiFH#e9#U=VQ;^FzC1O8KOiF z*sGvjS2x8_mlWn1YPLXE#uoMSipZgp>z&AKJ3G`|XzE-%1CXe4CN`pBpmB(!j$DVe zj>TVWb*M4Uy4@UU1{RBuSiqI{a8uCJQ9&zHlCMOu`atk`)ds#!<44ni|7b(|vzrjX z*8H|Ek|+1c9WIPx-@tC?;(~I|MX?rh=2EX?!Lc#ftXkR#3&Sw5!mi0MQVy|%>}r)J zNu(()P!_~7ICl!FvC(|dboJcNXN<3<*d>gl-9ukCdO8n$x|&N3nJYbQ^pfD#y8}Ns z^U;-*1s7|&l*&X@3sHAGjq_kdr$F_4t1aSi&^bQx8Qed_tj3tDFictiZU8{KJM@o% z$Vr4|D)tJOE%K!vJSthep7@7%vD+sSth^!W=+n!`WOjNbxHau%)G_5`og|%lqM~&+ zY!!KRj!^a67F=!ltl4|+E~NBto&?tO-z)I5Z;(J)5di*g2S69tt^tqKnG0zWMU9m& zR#QcU*;~UC&eu~>WW8ejjToQjxdQKHt4Oo;8-$QiRt znX+}mj#6Y6V9m8yC~e;~s`yP+v8UIE13808=3O(4a~au*31d?I3I%rIF*UXW%2iWk zO~LBN#gWv4)I+38iQNdX`LI{s(YLrNU07i0{jHZ+Hl1ILLp4NJu=?1oZQoeUBRW)3 z5nHcDv6i1P76N>b-KfsLp%ttL6X4@8{2o(}eP~YPy8l-;atrj^oSn_zirY0AlrnRh za@51DI#JDx$U+_wMnGXVk(o%btmDP%HkWjQJEzfVi_Kpg@?EZM*k)G%`9bInwOo$TNP8e>Laz~C6 zuL4LXrt?C#g&aH5*T|8C@+yDxV&&yVQhr^D=e2IQMb90P2MYf1V2#(s5vX2xdQog1 z=v?SK{Ufx+c=7H2gP(^=4f3}ixLWZhC33GWBiSQY$NA~+{z!ZP@BIFG^3|CH&gOyi ztnerv{~w-xtp2AbWe?22j#qadpJTlpG7$(wBLj)ur9Q!|Z8WYwgesA3a8NF2Tn9Fp zc-lGUh1Y?BiUXXTcDQGUwh!gyBg9m@`9|5HN|HEz(TYL;wg|q9$5u<}R15`G90O)# zdte7?zu}YHtNIGq4WrQiRLX)7J4)6-SL(0DPyrH_+l0qh|6qu#WEK0)q&0@3U#8wn zj5z;xZSJi#L8sFi>n7YU_m}tS>d56CD9C{+$ytF}O0W)fBDIEXnjT*i238h;gK|x> zKl|Y%`*cBo0N8GqWY5f4zA&KgJK*qrpR=7xN zIt;Ne&?LuA92Pr0Blt`C-W{zwFLh2B@iGvqomiO;Im&T{BMZ2SdNDraKk|i$I=iI; zc4S2P1}pJ%m%Hq!a1Uv_w_$ zK!gtFNzc%?mm6mV&RXQ?amyN%^L(*bI-}e??(Gbl_CcUbx75~tHcY=8#qJ9W(8RS>gYxa~yv4~9Pkm>X3%=)~ ztGFs5)y!mB&a5?p)WXbQiIO_`Jy!f=z{npM!U#x3hEhn-Io`;ES-qs(nHWqFLuWtR zb&3;g+_#!kTi!9-`i__SnQRhYKPtpaNt_SwACySLSm`x}UCw;WK1c3tIFnh!-Ka@? zI=ci2wS9jJ#>+SR?i3A!o#DsJY;+GtaiC*rB#;pnnWd`;&t-;cj^(rM1zs(SrR~We`Pylkv?&x?AphQTQZB3MFo3X~$si!}P9B$eJRF7t8MPm@S z3KeAPce0f}2#=>axn!JwGd4e?RU}G|bpzLPSIhSwpHORQ+{XnL zb$oz4p)Rz8ZI)Rl9DpC<1-SRlJ~i%vrwpTE8ff|dCoiY4}TkjSM`jTj!9$~Osahd}h-VeWq_*wrxxy^an0 ziH}Zz1|9Xk_?+A96D|HdiO*D6T^ia;AJ<^;VgYOzQ0Tj{Z;k}+4vUMpguidZ-gG5s zc;IBYnKB{3^I$B{a*MxVCn!%xvc3 z_ZfuGi*!(#YuMR=wQ#$@(VejmPywp7bg^5Dy5lsDX_8dlcjBJ}MeUt_jSXoh9*bp| zjiu=c(H|I2&Bo4{Cj4tZ8Mr})KEDA(QA$=%%anHAiJ@|mP_CyfM-~loMrI6>uDWu_ z=eNbYL=D{}hBt%#vyb&K(D?GNcNsd+f1>sadV+Np7!rp&cVvR61eX0b2o98@w4T(F zkSO~Oj8G_IW~h{ilwjKXR`WH3HlPg&RA{WQv5^F>UC**ypL**uny=jDPi8mtEl~K& z86h@K4aE05s&Bb8!)m7TfXo&>NO6R&goD`)tcrWrYoiR~tBxbY{{G_yNHiw9dFl33J zdm#fCsGdijyJ+xqV4TTrPm8w%EP>K-_cvEDnoqw>Q16-edp@j@*E!DB6ti(xepe)RS ztu|5vQj@>9gz!>Is0stgnDZz8XIGQtEH3A_RP!!`bNzrlT1*R2HVka}o z-H$0Uqe(1c(qLmVfe>yJ_lAV%S89V6(O1fg}`97jXgQvFysx4vSm z^v;mc+TA^D%MohPic%24Sq32Dm|2LKq}`6{?d&F;8fYMLL)J^jESO?1Jw{ym-qCR`U3(PhBvNZb zX-n$DIGE2jQ8?PQCEjf@scvbAWVVwa!d7)QXCaH~g2gtoQ82-FUbN{`k}|_+8AJ)z zB2aZGN?V1nlO~G0lPj2rbxWpegoTnx7Sk$571O-d<{mI11O#evC~ZewsNeo}+YlOq zHq6ES~7 zhg~|Ej+Yb~DikU`JaxlFaS;lQqh}{4&l(*a9gWn-qog3*;&yZaVMAg6>1fmtcqB z6c>j=38BQW0kP5OlCDQm?Oc`i0K#3GC^kZ216#juJeMH0UB-HiMpxhRu3y@ShSEUZ9_p}2Let)o{u=i`ZmybabJ>T59 zjy^9;DkPP*7YMr$2@eid6#h!o`Wz&ms-3G+_m6}t6UBEshp?egzhV3MB}|TPdFQGY zkJ4=?N59=Yga-%u$3yYuVe+GPuIezUv^5BKYNEJ+5M730kq_MhlE1QZeX4e@N?VD9 zzwH8q%jUi-1fCtvPRHZ%>Fi|mDH)dC?p##?kJ2ZpBTlAE5H3kPnvGYQ9gS|*orTH% zb5+2jboUVcrV9{m^bkEc9k1#1)rZSIpx5E}=uQulw^_iW!lZ(*6Hcb9AncutFX`2K zl$0x)JsgFKMyS)Zc1w0DEPC_^u zU!hm)k8TSW4KS3Q-QvE}8xU>KH*W;-@r$>wrQW{%&x;pt zj4fY-sGaLWzoK}wb0^aW5FR$n{q5hUr{mfC_lK)cxE2crWsVRLm6_)Rh^28>yVyt< zV+D;i&1(9w~gQHc?!H zuqRK1|N7(Xm!D@p{q*1Q;rNh93NIRT8=jzYgjrzZxeqiFm{mShVliOXY$3E`4e6Xx zuKR)EbB)Bd7V|hBXq+PA8_1%1&$gF~{mtuZ^+FZ!DBYQQU8vvw;R*;Fv#C;OS z4h;;4$F_WZp%>Rf`1a-FZ67980ndX`CrlK-UorUT;*L-v_m@AP{_^+P;rsFXcjLeM z|7Y*~d)vm%IKF>|?Hv@iyKP}>nSkIl>Rcu2(i<@b)FNPzuOLD>JP0uoL-k3Bgc%+j zAG#nweRXlKdZc70l4IwR)Q)La4_e2TXrrz5>GOSlQN{eI`*-Q=!o#0_aHIGTpPZZ? z67c@8k)1X4%oAc0N<~VE38eG$#Vg@HnGmOhQXTn>$m6MPf1D5D`SwZ^JY@sVW9ZU5Ptvj(V#jMq2T9FZ(s^x?Ro)CW4|Q5rKeP<7%>gFr{l9(UPe&HeQGfx zkrenLU-JntImJv9{6&lrU-!qK06v_bkGkFN=yG&^H9Eh%EI^oD`j)=4gBW#IopUW4 zcs42|e5=+FMG?Y({rqN7?Hvh0`socKx6-2$MbF9A4bKiIw-nSSks~xr0HJ*9BY^!E z*yr4bSdbZF#~0@KD076{0>bX)`Nins^1M5`=w4l%ce__7=jRs!!tsAu)CMMjnA}xv zSV0-2Y~a~|yo`X*c%~SHGBNZ0{{)29;jfnXEi-M5ArKg$5D}(Z zLZC8|VwgfW62H=i)9%H|=wx($GP;s3ac^IKsLh}Sbl@;~mr)}hT0b1gvVo_xX$X}X zqL6sYX9c)UR-VmIM(%4iL47h6(g-&ar@!nsYMHo2Oh$ zB$orBYC{zDqZu7D%e;?oJ5L%Uky%E!N+xA|YoO0L%bJI<-WU$Pu@7N(iwZ zQKwZSm@FH3)PPWlA&MyPnQnD(ALVZ#$~0gSeUS`qZ_D35{`VgrKYaL*bB4lx%&mK! zC4p=a3F^dzKBpFU0AUu^zPxurCFNQ+@H{z$zf%FiVhwXjkRBB#nK(BCcI}?xBus1W zw)Mp<>Vm}Wf7a`|SussVAo=m*-|kp%3h!-2z`~SR3;uG}M7fp?JR1Pv@8>``35^LyHUnl;Hz|O2fF_l~#0G|M#J;ajVl@X@_s6h+45k;xE80bL44E8PS^rc6xmwk zYesV28h8fPob}iG+frhP;@ihT2!yzVA=PQSfq)eQtBIPp?Jz&&w$P;FAPJEtez+NH znj2dz@R%7k8EP}zM#-3F4k}H@^<%@Pn;7?RVgpZon1`^p-Vk2jlj$#N4N*MA^lN>} z?9lZs&GUqlWQpw|9AejS$1!0g3`0ljkic$g#}1*~!yE|rNGZ@eb^{~?@vk5kw-L&9 zC(1)ut*>(#)}kyN9Br*c4D#^S{O}&$-pVSq#DY#pNDX;&J8?@4N*AG zs~3i4F8=R{#y=Yp^NM2tLa;*+5I71K>0!@@3G!YtluBFI)?FHkGckv@i(H3>oOm&A zxQ-Wd@ewBYI!xgPo_aAev(61X*R^^>i6IIb=FGMoM_VwGQyLSc`y-l|QPXCCq(oTQ;=K63M4muEosEIydkrHpx_g zuxJv=S1&A6UnrBeTdrkTXz@@>m1!J?Mq(3}$U#C73)sTQ7oISVe9bo*3ULg5j|aL3 z!PjQ1R;~wy%#6LpJMbtrL~#d%x0zgya&-#MGO{AX5%v60j=A(kY07R^>@|Ufk&|+3b=e*MlflXWIerd-6@vqhf{yC2$-k^Gy^&*9K;Hm6P9HAPwgPCT8a!%0GGPxz( zWK_bi21xGDEZ1jH+|8g^tItc&p-8=|c^SE=|X@m%_#+FtFDQy8v?(frr zbIXws^{c;SgH`Xqvp3PLJEj5<=4$n?3Jk=Z<{|W zsZz4?9e4zSAY*Xs2zS3x4MN;J7Gl(e^07_sNk*+zwA#Cax@jyQ$x^wl#EO}j>szQg0vQ&(EFm;9D^hNJxSfaRa)M(vl z2lf*x*R2xCrQ6IcE~a1`f_ir8M?1r7ESa z!$Mfsmvj}kxY!*pEJS|!7;<02QGYGox4(o2o<|{B-^nq!^+(kp3{xG-$&CCc>I9Iy ze}C3Q%!Og2!7$HG9IOL`Wia^|W4C(HB!-29Y~t?n-f_P`;Sw8o9**QVMS8>FmU2TB zIE@J@OCj`&Vzenj#xn%ZSm+_oYaWv`f;wW&yH=}4Vz%3=-vdG)DT(B=ThG_h>N7jB zhqE#>h2e@X-U{&vh9=D{AY3hk^M)wAG$Rwp$991i`X0*y2811&B+zemI_Q}CKZ!H7 zR*RpxO}Ey5S8F@9p?#<0a^SkB{%8{33nk$JMP#5hGPw; zLj&0V9e@RdH@%xa_8yJ?ug=|M(i<4|;I6Mb4;`q&1%z-s9(DmXCOsEm%MXEsG6tj5 z1`$MPK_aRNg<#(kc(yZbHHUuBqj&GlXBIr&R2sT-OjbjtpVWCJI~c4fQE6 z8*y*(wYA8L+6Wo0p#v}(Eg|gcrt37jeK5EkJDU1!s)rKQ^@efnKJ=gy1jmlyI-@Rh zUAG5A)oVd_&@-SjT0T|CoUa>(1${rn(Iz2{HH;r+4LpYnCb<@ry^et_(}cDO3Kf2@ zZ&VbVt4DZ++5*WHg2#mL!%jPyEGy}{>;aA;>;rc)FqPhL*n6A~Y|9yqLiRcxxT+Ic zJpg;7u?>hpI{Ij0_NEX4(;4V+U@ZINLf?lR!!fa85a?OHRZCZRT;(duOFqY%nSn1U z%U~Q7D($?E(P-2RWAhp@`NxmV`ad3opPs*+&|bFG#Mu`gM#nhK`oA2@dKgW^D@N!D z_3-K=0L~bb$#mcVPj@=b)PuI$vjOZH5ZEJQxDE+z9YcR)d7(EX26|x(?!STOF{tP~ zmKkP?3VamcF_QLKib`cH1u}`ckj2VFnf7gV4DZM%c>ee!{3NPt)&auL8Jj3}u((d> z{SXQh55s1^4}bOht?)j^c&vl&K<`+jj3v62m+t2&-t|Q50^# z%k^#wRO-$II9kGeD87mhY@R)|7?oybZfW@tvIf>(um9ib03pAXX?N2a?c3Jl%}okN z>Gu!ap6OYJg9n|lzV?KeK*xc|vMpUdEl*fUFsUdsz51Wq1GB;~DHTQVG(6nnu<3L;boNgzxGB;qw*g_BKyJsRFpJ57xF$ zc;p72+4D}y#krC(K_SgmkUv>EGZRv%uwx2RO@~)s?a~?JyY=F~s0oBi6z?@n4efyI zi(hQ&llt_e{(sZKrk)WL{$OnPlX4Y>l=V@q>)fZg72>~k%wVfUO2vhAFEt!scvouI z-yXuZwSrJ&Qd=;2z*qc)g*bvI^$cOkc$v7>1fF?mrTDYRa}i0D7h245p1Q*KgCn(=5TqvJq6xkKq)B zcZF;X;X|u6Ult$>pQU26k^jy679HC)y&Gu&c^=BU`(|MuZxcnbZEXiTfO1vOVpL{) zW=6af5ylvi=Ujty?LA$sU}>L8Wy)3>n?^ea|N84;Hk-BQm@vXj7X6zZ_te@0guZI( zCa@v7^V+rtt&x>`#(EuU^~nbAXWQX}$yaNTU;W9O@Mf*kfaO0hyvJe+%;+dg!-s~j0MU9t_~!Dy zadi8BR<6&=%mflwCZ!N_T2zb|Ik1I$UsG8F&jTyW-7FR9l19Am?C7rj+sB3Q%|)YT zc7H~)*wVT(r%?sV&<*mxClLckX#)?>Y0*3$MX7WURFx2ZJ}!ipwWIK?T#I8uEM{i% z`d}!Ms8KVWbEN{KR7!I4$3VHIM2+7$D5z0ZCkQ{iIkLU|(s(g;R<5$35DQ=2!^gLwdj$U98C+*6okCyrA4B6Sqv$BLCB0S4}OGJ z9X3%ELn$En@l=R>Aq_kx%?j`2nV4WbCKgf2!%7bkUHPiuI%l_rgg2I7uq7R+c{^?e|V4NQq3s7E?%Z1%I4Mj?g+G z2p7KbaurXWsB+zZ29z!`pqmA1Ug!3qku05>L19n=!te*MA%J-xCx7NNYcTVc#O&Wa zY!Th@2(8nCFju+03zci*tXy-_FUkBpWjR4#vi2@Zz2rq~`CT=U14Kah#ZvB;B^@=* z7Q`^fM(_X{qU=EguLQ!Bay_XsNHuPf6&CfRPLCEiLeY=0%)DjDpPAvFXqJ@3L3UF> z*0w4dkYmXD> z70GL>iH6-oM=?de>eKczea{nT)iZ>JrO9I}*Y9%{%=dxhvQI4XU24W*)Jgv+X*dZ| z&C|5lk0EhBR4#qyB1fu{!irzsUJEsbZ%4iE54$Ende_`LgukD`t6>9=O5!18tm5wr z5=t%zk<5zx=sJ-R2Z&UnM~fkZLQ<6#b!3BNGh3O`J1w)uQZW zhhSJCgdfhZ)vAG~sU;hlgKA?&emq&DiOY7DJO!y#s9M-m2A%{!VBsTxz4_%)W`-rZ z`WRH1H11lSYq^9B`Rl`8&+V;jXxPt(@c#W7t|}UMLgiXf0}tOCU9rOD1E@wp4~w0X z>MXI-D1Dcp$ZN4QqUh`(UOqfUfB6A_%)9-*DHEZf;wT!JyDx%o zklC!)x%`}^0D*lPGVQ5v>D>r6mxIv7$U#Go^g;*eCn5A=YNP)x{_g>;@nkXx-+d{B zmuEC;*1*FuNho2M+oVSW!cz!ji1f#Px>MW5j%6ghJ2^*{8+f-9PMI zO>5)G7Hu95vNt1;EQaZRuUk;mq*fx*Lfepl4c<5n0msh6JRUKLokh(oBEYk!82h(K+{=drQ}x+m>@Jz+Bx=HrJEodcC>i!gHkr7<0jdx05CR z%UXHO4Y1%2xbSXwUjf1%2On-5>lUVU2KZbzK3Au81=O-d7FeNsrqC!rOPFi+arHfb zC5!EFPuRA0xp;1x$;g+&czSwzd5aD-1mWbiQ1+dk-md27H_OZA?c?%teY09A2)z0Z_@W9<{fCRtP!v7^ zH<~buuPJlondMMng%bS#>GbsS^vyP*EFVRcr#Uv;_37ngyZCi=4%BzAC5Y(cEN_0T z7s^My0_a^n-0ddk{I_)v!cVZd>gniJN!M}=GBrki&(+)nSRyLf8EV2J=4jE!eQxrY z#13ax^YyPY?l6rBfq#fqPAJfaWuE5CK*6_JZdX^!&0iop9~InQJ#Lqr4&mvQk}f`Q zCcM4oQWTMR)r0U8Y=L?@`c@4*gK1TJaf5rDr7u zk3Tdy)Lu<%0jdy;-ZzgCT>y%x1;^*!Cd& z1lveGAICPY82XKC4pyd+MGbjvtny0P$;+Q+DtxH|JZqec-~dmLImbK=DM>>FAmjgW zC{n_#j(2`KxqZC9*F^9<3lC*bc&#ef?P~kiVsW+F%vTDTZ|@#%ALpCxc5}7e?KV9K z-wH^9=lZ^P1ZQT{wu&^@g*tnsCdD}m&Dlw@^|a7fKno)pml+$+8rFchJl+aCQ<25d zgb_+vNC1h9rIfSctRti+H_NR`g_B}Kn~d?5=jV5;%Ow<3rR*dvx+w3RT5gTJP?z&#!*|Z?|0B z?0#OCK=`%C%#nk?z;CG~%WX9pP~7HsEWphhaKH_`0zJy(474YU4Lqi9o%F0&0$!9R zoYa)?xwibAO>3>(=gT7uO-^SKf{w$D6JQweztM=mWBx=)89*|k>Fn6X&*J{(YAG?O z)sfrX!}av^d^+VsI4@5!^+OcL-8|hP8Fe~{r885hUdKV+O&;iC|45rfn5klw*1+)j?{Joe2W|-m8(@%8j=qpY9C!dg`3nm}{zMYn*fZUm-n2S$ zvbwvwznrI2>p@bo{luY`G`%&H+?>hC&z`>^NS)+ zUQ~6H0ocyV5PQ-?N6uI;#nmnrGXziPjpGgBC6AII_z=@1L0<-FP}!ZZHwzsnOY}!~ zKb854*+;w+#V4xyJg*X6<)EOWGot}z&|+s_??Tj3=owQ;Gf!gc`M-*&I=5d_dr=zM z;^o`~mpg@K^OwKjsqQRDKy;?~7o=JtM`?(Fq?`gH!Wb_KspLX|!r9v`v3$F{yW7my zmE(l{5JhXPD9+*v=d&WL^Sd#j+XBb~6JUdKRcO|_MxNBO6KLRhvc=$Y<>+J@UR;oH zmRy|um%-z%2qahl3fDz|F#j!#S(pceDeTEoz-W?i*rxA!BZ9C8Vb^Vsw4!6;R0QVZ zZg0}YnQ@J~YM^qOQ^*!PIk3w{s%8_j((vH=5064ZLK(|I2b`CNge4g(@*fdJ<`Vg? zX&8}ry@ggkMA5bCQ`ydI2nxo&>$UlQoxt-d*v+@MWd>%R44P9&BTqV|?8LJK;c;h^ z_27`}OoDVsIo=q-`~kUx!`fD7Dm8Qlq0l!^PNX z*1GL@($O&+R6@`ns4>W)Ye&*B5oQa=Q4|r(|MnpuP+!QBIO|di#op48p-h&CB#an~ zk8ok=ehaOB>EF&V;GeZ;u-6fTm4LH%X6iu5wXIt!QiEn^#`wDl!;1^h$c~nUX18h17*tOj-W*uFCCA}&u#7vGV4Kj6cGCM zmWHLXB46lO$Msrwji+nd3OqC_PII@8Q_N0EKJK9S#=d=2YFL4Xgre+2aKZmcK7&Og z6r5mpDj{G*U_(Jlge?PFG$D{BLZV2qEF>&^#m%T(Ri~=Q)vJJT*!7sMO=(v5wjKyj z*RLOI@~b^gYiFi>!6<)t6^3JPU|$xOFe&GllTgdpL+HeoPcSOthXgH9f{_D5h~`NJ z%uFPiaRXFJ(l8|9J8Y_Qooa4zkE?b8MSV@^TXngNM&@G*z&ZAV6x!Rm4P%Alwu;kf zx?oiKxI>sAaa|7(c*vJM{QUVuXMrW292Z5mc2yc2;Tv{NzG6KEAYlpF z8!cRWX8A*yb0Y<6129UkF<8NZ?zxU-RF@E;NQFpcd$0A~x3q5^?T$iMzt(&8+@)4& z7p%@|37+*}|kHLg}*IIiN`qFbSDK$4Mj(oquQ!L8V z3cy)AGiDHuT`zE~sMl1Y8k`ya;U&o)*n2hn?Hh)D0IwK2(S*S%ffR+=5K_2TpIG8C z5dt#wYiO1~U>94=4}l|vgt9Eg5I>_(DnOy^BhXxyV%U(kvqVWA0@D5TLnLW175M|` zQ5=zwb`4M=6Zu3GDvC6V2*okj2T`MaNod}r-(Qqj&X=m|zEfk71kD9r72s@R$ALkB z)}8c$eHK`_0y!g%WDoy}hkwL!nt_PS0sPKLfFp$vP(Y5!at?_PQ3m|S6=t5)V*`yS z1*z-}6*EjU@ADSRt#N{s%m~6Z4BzzTue};=b#ibeIc_(ZTVs)U&HdQ!0nUtLB|r~R zoaGCKfn?hWP!6XU`&jly3ElHk3=hSWJcfWw5be zsaKr(H)AAOTl}5;N0JqKEOE|NPz^GYHDp5qAE!B!MWQb|<>W}x%sZ9&LyRlRfi4m4@H5kaTzdoM=q?2d*L(P`*YX?A8R0cRW64=i-+ zzL{-Qre5nME{>2u{MhFSfDc3l@LeK@Bd})6@`o^Qb0JL3AjNxUB}>|Izl4IV1A9}* zA2(KVn9)q@()~L?l@LWSNsGQ_Ysh@v< zGt-P2W!1H@jpDSQqiXSmLJJIz8BrMmMrf1}AroZ=h-;vMBZHimFlByep9pfEi)G0e z!Y~ufsz53ilo6h4l9{Oy6}g0TZJ1bn4Uo;Szvc*Y?N&E`t=PWx7&LvWO($X|Ku1Mh zsTy5y8Wdh-mrA#u8Q1)8vFZ=^RF~&)CUj1|axzL#JEn3CG@%U(YoL)#o8n_JgM_GI zS-nRvbcd&7;g=>c-N*G&#*$HjFO(h+5kvQ!`*;mW(1=Y_`Ex+z@f%heZ=uz%H`?Br zaci`l#Ajgc7xS9g%4=GscWf)2D-K@OY1ceRk+;Ac*n|BY*B!*MB1T0sb(9&Qi3swv z%v`J!Di#S90fd-`m#=~-0^8E${Jb({4-6Z{neBqh{)S>L3o4PHQmionk&sgmk^aBV z`q!pgXo+gDhhR5nW*Ag@nf3i*fn7iLpfRo=+3Hc>sTZR;-pmc6!~N$zIDw$r5RzE< zO!jW36c?mt`CP6tghVkSq+;PvF}aItQZS;}o0vc3#wx=;wHR;+x-`Q4fe7)-lul8C z!6U~pW{7Z%x7AoclP4#`esQPftvoIuT3|+11y!Xp>J4y>8OKUnj{jlr%6i-o$Y!`AHV7pz}%EIFr&UfwD%narJ?FztQ zan{{Sfsr62n}U!OqI$Y;A|#w1pa>IrE-r0j;K#Y&#VZK}jL+i)OSGQxM3ywg4QR*L z=?Ek`F@Mtd5UGA&l7HZ|bClq!UsGwDD+t7W>Ogg_FlDk8&X&y#Ub(Qs%dlG?w-rBTzFKq@aE>$ZDDTaju-g%FZVst3I(9-RG zu2~UpGTL81fc`9u2(ut0G$PD2NQl%!O?pQ3bU&f8S78963t8BcP^n~k;&^Jo=LrT? z-0$?y=?DZ=T8jgXW&9Dr4{st%Tw`p-5e4zT*vypg<59&l#MhjG_!s!tyMz>jBOb0b z&tsd5T!ehhd8YeYLHqT6RS=RP9t;8!vQh!qos9^S1_?`2M}4kB5U{h>c-(u&OLRp0 z5<)@rwZ0`fV~t5q(f_nVS$#l)jfVTu7+djvyxTwKk??Y@^IygXD&lLl^|E=TkYboQ zF#}kZ_p^p)y5a!%eL4sUKtMMLLQ-;4v*fo#9%wjFLX|Q8pd-WD3PIbVXLp<`(>U3G z(HUz&+Y3AxjSg%qUb3=^v5-;-3Jo`KtU2EAAMG)3l@yC%+_u=kuPz+iw3#_g^tb!^ zW$ua^Z0~?T?5)7JZ~xYUkbETw$*bgn2Ge23g~JEC*e0<&yWG5 zfrnG(E^2A7Do4OT8yN%AC%C=XFzxZC|3Hto`+f2Kd>=v*?W%s)Y~RdmN~E}Ks=@sW z(Eb4UJ|Bbxp%BrRz6?UbQP4>{LJu^@erP;E8pQb+#1Ft{>rj(xL981IX#h&F`p^Jz z8$dv<^Wslm#8(d-5Mz-K*Z(FUT@@d=yCC4>A4Jyoc)mx1cb=_ zgu|kMfLOu(H##R!1TTwx&KNfUg22ptz~&!g08KMwyI|Nd*YIZg-EJYpQf16m;k9|v z@9OPahgt`X^1jtUNP&Zp3<@Z)7Mv3N0i+T*NP1g}j!OM|Ade^Dj{0~?jQU&)5o z9QdjDq@62bD{yaw%HY0Eaaq(q(IF@LSbNaRoQWV?mem_xz27~snQ1p=g$~oPi#GTS zC@fN7@GzDIA)&3rR1lIL1tGa)L})S*QqbMd%>qgVPzTV~3s~6yair}HR@xvLbZY_* zZD-^(iIXuf#vPI2v=lWs*0{sv-}!&fcI;Ukb+<1_M#GOL4*qo zG6NixtwBhg9tR=C&gbKv2AWs^{6UCr!26`^mRQz~#S{+6Fh-bcB&bjPZyi4xK-z@h zJvr78TpvzC3=_AV6b)z~V8arjJk5-k5J;nh6Ki~U!%fW- z?lhH^s;Yu>LmoN%KQmccIlrDpiXgi{DThmeICvw^xZDLHGXpg|V#Q_%IU&aQQ6MkxfR~&Cv*3W;mq&wClJ-}1IeFT?nHd~4 z+j)Rtb5`in5Qu-*1R<#ugcL?WNV*<`q_QBSemwMOZeddfp+Sd25iiAUD7lM5gXPkT zSVUT-B2KSW3g-o-BHX1F#~SU3F&_Vy<=6_m>=07?UJzoXq;^tGi;}^BKsFVHZ!m9gxiUmquMR`FSW9s6As>HD(XJD z2WnsIK9~=n^5!HnPk5hu4nhif5R%i@VJK(bQEEX*UY4-TiY^$*Ug^NNN`@ ztCsa?rI4cRtRoe~W{Zm*2!sV2`lTSGt{Q}-FbK)kf{@fG2#G;Ji{2Fm5?gS<1xWNG_k~iG492&CLo4+AcfC*obH!P42Zoq z3n0YGPTABiTe+F33n_~JIl*<=nicxk0QxfvLQ<=Pkdy==sX-7@Uxv;Nf{+{<4hEG4 zAp!gli8PiRw@oaJ*uwmI<^JUV+YCM^@>VT@I<2$5OF0dREJWUK&UJFYcDR1+0QwIGAz2DS(&Hc` z(HdY!@vKXyAS7x;vq4CBR@9>)BpMJ6j*yP+n;0Lo6tI+OA+%r$tUS!@OT zrAo&dWco;#j4zqTRvbc#y^qU;2lnk=JHoA$)Xr{Zsj;$r98r9xcJD3gz5lg(dNE$g)h$uTEq>dLpw zzVtasxLHSGTZqLVBs~s7l8&+vgk%RnNJf(pp=A*u?^CpFKSvrQajapdZbbZVjjqWCN)EZnu_pa(qQeZtR`j>QjB&3pw&EzI$9FN;SruJ7+3MCwYDcHI z(;94Xc9(LV*C|f*<4a**x)XuGAS5*xgrs){A(=HnNbGvSv==7ES;7ut9bs$*8pMcW zjp1gfIksYun$7zfajfaT>^dZROKgSQ3&mCdWBk)rNb~AfxZhSn@b%wW*%?ZvOMY^-u$tc+O*)j>#VO%RfKRuGcG)})~@ybx@3klHmiWF}E@+v9XX-tlEXrmOXY zV~rX))?|~hCWS`F4cNtRd@_rREHU%+%GYV{%MN3=U2uInV#%!~h2O$

)Uw&-jaah7IUnU%nHqL`?@FIii)QA*}>y(Y$4u4nk5}gOJo@5R%e)Yl`0u zi7_5modF{zl4Ff29c!r2)yT2Nu+&$&q4sI>8^_;}%R_WxjDIT3?uqbn+uZM$+8eVS z!EV>V)@4d~CUK}c#b2+8YVM@cIfQwu^;3qeSw z&jtD-qQNh6J~_Qb9BaI2kl3-tB*z+;;rSs*Y=xuY+M;8P8aUSAZ$yz}P4}6E6wiW} zo6Lf@KO;2@2STxNIGrcw(MPh$<}Z6-GgGO;^E0wyzrHKpAI=0Jg+UOKL0XA$SX35- z6qbUJGBw{~5R%G*kW}G;CXDg^?tBDHw0QTzrv)#Gl>7q82uZS;jNZLba{mTwOL59(&FN}glzVo9=i{K zKSb6FV_P1Cq;*0h`eT%zq?K?-;r0VVW0(#?3bR2-L4uIXFbF9dfVl<$eh|iZ?pRZR zfVODt#_)bt6^=EUnKk%AabxRz08&8iScA+Tym0{b9l-* zZ`xXUtW@SzO6u}lAqAHqHTm0a8z%6f$2Vit@lg;`u;U;kJq|+h8-tL{bP$rM1R?ox z5R&2`B(kS~jSO#zT;_pBn@|!3+eyb7fIO39jZtN6MMNrX$XIZZv=bs{hp7q3o*_QM z=Tg`2M!U}I6HTT&+bsWU+h(Sz!}X5{DX0kXxZAw#ItIRd{d*jQq_ZF-tFj;@JqkkV zOjsX;q{cx=n)_Q8gd}?w2|`jFgrtigB&HM@qe{*DQ#4Q()Ev zA&IA%NwkuMAS5#xgk;MgBrQQm`k^2su*nxl0#>Z35-uETFlH&PdzjN>6sPRU@HvjH z=rYE*vfydKm|?ywf(TP<45@+jr-JL-X4husvYZ4ls*daIY)PBPX9y|QMGm&F(jQ^% zfA6*iA?YFrY0yyyK}e<=grp=0DX{8rM-UQkNTD7>5XN}sSQC;6$!C8jpF7szCkNj5 zz_A8yA+iBzX7!Y1R=pwQAe2!Lb7u~NJyFC8Uh;S_!0u7Iz~MNT5v;XlTa(^Js@@M(mDF*27MckJLfm%C zjgHQ#bH4Na%pD|pxkPq%c{HQo$151rO!w=TbVirEH3E2QF42r0K-^VC)am|x%ur+ z(7Sg*5E9QQEmEz-7lV*MfsnulLTZg2Bnmw1j8|MS-eAMA zhFy(PZ5xVlA;AIVSW~kJJgbOV?c2zlt`y_4hlLpgk&jCL?ac7}a)AcsSlk4*dv0u0 zd$uh>XImC2tg8rzb*8s=uS3EOfRIoegrv+m9a#xBK}cNGtwf`(4MJ*{Af$$+)eAsK zSc8y2fsnk8HCQ^wbHwAr$jP|brFX~!C+Mc~KF zig^`_HqAe!GjpK31tqdY8SKEnvd6a#gcQq%}6)(zekb^-*l`|igB4q*|$?ZA#iUBDQbHW)Kot10jiw z;((C!{<_qgUIIcQ+d)Y5Cy`cki>P9p$W{w){qU2h+bv=rL#s9zk)dWqLg+0VYnWmj zq+*<}E%TKoW98V!R_tn#!r$Xq?%$?%M81g4R)5*Mu}IvUJNA_zhP4MM^~R)V<2LNX->#7U$RsHu{te7y3++y;ZfW-Vrumkg!aP!sCdVKNtyu5OTyF{20U>FQ3T`d| zA&HD4KuE9#LgI%bkx^nGBv^uwuor}c)U;HCYJ7Abs%U%EbhH{&c%qJ5LYW{FMENY{A>w=bKo z%IJSVv8A57FRu|-aO?EknC6# zYl{@tsnb&|n`ctbn{bQomu}(834{lPgd-p%R%W)cSxMV8U3FO0&)20{dMRnxrMpo= zVOeTH=>`#LkZweprE6*F77ZaIOZEj2f}*=)@ngV7Eh8oyL_S5u%Q56DjdSv z$;=ovBI_vM?}ehZGK;*C+0IW^gUfREjyRE;MT~vP{p4y+wGhOXXJXDHxRfA#k9{rT z)VFp^Dfh{tz_vQ{xB*eSK*xN@nxhy|wSCT~)pWz3Ct_V-6C>n7ITl=p`G!?iz5Gz*#{};+lE6LEQSi zpp%KGr`c4*Y>i0m>aVm)zBP7%XTfIVps1O740vZ23?YsMH>Xi}C4nzO@;~_K@1;K*DrNLx) zAt)mO5FRg>jCp389|NAWv=M^3u5ba?QW)-WO45^e|(Jx!W(1X~P!)ru78AI!sUvD0T07yk^9VS9O~{JH;V zy~pjex1F)57++%dI)uIGaQbb~D-0kb^*;e?4IL?wBiF4{RIDfjh4JYQ3(!D#Pav!m zfK(?4!n*-bKnMzg4`=Q_B-}~FPil5`I#_g(^Z!gM^w!KE%8q$WH0?*gXIF{r+}pB4 z#`H%FfL5&t zvxIQ19ECa>q)spphyu7!<(?+a)f5X=KwYDTuyU6{>!T_KVF+Pj?(Q>i0$JL0iTP{E zna|bj^jd?Q%$B>&UylaO0(P<=o9!N@&dFaTlpIrymAtU)xS$&QgKs$J9vHmnW&M1* za8KUEp=Q$SGBiF>I{FM}Wl#9qwx|v|juZR~8z?I+iTCrFD5*(eS+7g#?fsCUj zi$pB3rSTshG34(E#N);MXnKyR@)J@P`L(XUNGTO0wY{%p1N8)G)Wm)kouQq0FKjF4 zTs&icGZtfPw9I9t2*oi{A5!@NVddwkmPJ$=MFFf90)#6*oUF(N7dgcbL-Z2>p}T<( zVI7088v351vHRiXAw~mE{3q12PV9D_$a+ioRQ)%`UJzSIoIiY*x@dZy;3<;=d2n1u zl%$$>l(fTo?C(^(V!W(e6LF{Q{&Eg<&DVO*^{&2+>Pm|2W*@*Tap@1w4Gi>RWAbIw zIS)lup+OTJA*^6dZvff|8J80TqqyJ)-cTZ7W*spw^UT4m5GL^@q?hcOcqW_RkT9B83G`ac{cV0r!M>}sC)EakA^)_Bi z-X9WpP{ug&{9*J@b+rrq)*?oV?Cn!K+aESsa=cDH1}jl10=5 zdE*6y6%>TZj@5D(3qps($&grdvi~jcFZU4EVp+r=G$?czUD`Bb$DnJjxU)LE)#~Q_ z=I-onvOgeV(r=e1;!NY0tHh=MGmi&6b$3xOcbN3Af4?tSzC1i)@Pbk;RC}anjU*aR zY^-Wcd1JkAwwK!=BvknU?>+t)3K9)dVrqUg2`&2g<6#W|(v&z*S!yIQ6vDa>05BYo z@;(F`hWLXC$6x}L)r$<`gUSp;P@qHv$UzM%gj1PbWU_L*Wf7sC$Jpi<@aSTl+)==y z{X4z1O=cw3W@%)r)BV{*)&3{oh~0OY+bd$r0vcvfmEcE=x7@uqMeo#Q4dm64Lx_Pi z+TH1ge2e^(HRE!@i$A}tExi2furu#3O=;Z2HH7ftUkV|t-N1w~0Lu*!Ww1eb832ol zbb%pKagjPovIt9HMy0`8ganzp!^fN4Hosqf?tkgR zC&xxSxrjQ=Xw^1E)spolx%@Fd1u&(x2N?t@V$}X*u&>%Ns4Z2%Pgias{M2n1!MLA4 zoUn&sw`DM(?yj8J`xe-f>hOc`tCQ0y^N$*WP!0vmLvUZ*9Sm?%lRpudY~p{oWvmBM z%#H#7@)Zw`u^By@uBZbdr&d=lCHplhqxkW#J!dE);mTC{Mc_X{z0aAU;NzVs?+t`p zVp@UwA?Av}TM@PTb~J$lzCiR0!s`7eW}5;V^)uAu0PyKDeVP6;WlU2dHp}^5{wRKt`Sf5%90O3`7lHaph4@?gHZ3V;mmW@ zIFSXTPin~ANdHUcTCEuHiD=hZKK{UfhsTS_gtEKqHs{^atfer@yDR9+BB^9}`+5WW~WyLAgA4eN@)4&1OEaOtLT87_P zf_+Wnwn;yV@yIct1%Pr+Oa4DvGak4^42J`-wiX*H-vES_q2$amFthsM!Kznh1g}b+ zm)aI&o@alGAmPxt`gb?p`tR}PWGY>IV58tc+|yl5a^$xrK!Oeg(8$<|?y>)@l_W*G z7S(NGlBYfyKMXl;V$}KyV>9lOUExegmoDKBB!CzsK+36bh7g8%HW$!x_L6e-4#OiSe%mi;6vStuB>{Rp4nqWmpj28je_#U7FN+ANkpC(J zK}YUY@sO5f9%4oBgGH9)(SLbW|ioUVvrqc5Gq9&RMyWaepz;btq<6W8 zC>dZyE%iL=%k7-k3|S6+*iRMxzJRKkhD2-G-&eX^s!y96)EYLQepK|LR+*xPS^0jq z4n&_TIi=*Pg(|*EN8J$QlMY|_dngU4#wagx*B&zVnR)H6S#pSs&_&E~pESR~7chne z6Ma8kbB)I!1FjWSl)wPtZR&FEtl2U%K?G&3m~XGAZ0K&v+U=O!Ki$II7ft{dNGUy`nZHDpJGC-NPgfVi#y0b zc!!wKIC(JHLpuYzJ;>vOq_GrFU)b2ooEyp9-Sz3-sc}V@c)1B82mPy0ON9B($sJ3y z9=GPfgb{u`cNN{8h%?3>05~lvB;}Bpe&&~uoRPZaSd+RoS2kReE*@P%=E@FJFtu>W)^%QdeD7G97@sxyoEVJ4>dQ0%KoSs)=JQ0AR_lE{GI3&)#GALzKRU4qe~Y50g0T>J z48+qfKop@mYy-s%Z(XPGPRm@Bh2qza9=|RzT^<{^C;a<O;2djp<0iU>w&uz>KUfN>>;(>@DDX#o7+ z-nNwt6ovh=fSQWl9?JpyIT})DfKvh#HK3wG6K3Ks4jPzX{aGDu$?Zs^T4Z31yLA7( zB^th{RwNpkgUXJsy6+buw8^2ESd&+cYZg2-h#~8x7@VA#lD&~>?>+jRhf#pdXoQd4~WSY z7y`qH1P|WB4T>V5B*BDg)&ZsTpTxkZ@&Tg?kOE>z@$9Q2le6Khjl(H?Gk=HuwNp8$zKKh~DvlP4TfPt2dI*ON|TUd?|}f=P&*3FIngji|qYrmI}$x zCWO@mAZuR%ISnAPUf5788YO9JWN||<>g_XdQVjtzWk?0W9gK3YQS5rp;M1)>FZ{Hj z{gbQ}?Hk(F!_lZ$G%^Q>tSK+Pp+BoOq+^?!tIh}AX*;_Vo5J2HsT4Xvzs~)+3o)r_ z-!FX#Wh8*zLx~5z?Gtx_lOE&>sP*l-2mF5YzP#HvO1vXD79;rn!XzeUuKI6G8e}n@ zAi?eW+aK6Hmvssm$Zi;hIOPYEZR5j32$98+5Y{OmN$*06h5CU4hq+%0-+rbn;&TmF zio2omC1y1605x8Z2QFA^(_jtTzBxGWo4EyhuuJMS`d87N^3J!ILDr@GYALSfH02$+ zJ6@|s#jJv2$|7CejnQj^gr?{KhQ6&-M!yZkSw67wJEKwhdwf^*jGEB5@tXgT5Vz}Z zIw5xQ4MEVbX;5sBkDciy6_}SZ!(fO=Drd(_E=YpCNh@5f&~q z4jWA7O8^@1_2UjjRVbAMXdj=lF9#S`fVKS>uo%$b#$XhT2ZXl{Va?Pmb|LQDh%Hoi z)sX!xH9nPV=ahtKT6$^T{914yEin0Jus2X!DpStRT42j4-T_)5^NiQY{FRhpMyRGC zdh{7XPDlWI@)$Y~+}Rau%>Y#kf0z&KU;OZ9Zph<4X*$chv<(6ws7S2dyj%X83zxk{R_M;2u#0|~{GfxQ6p@(y=C@;# z_Dk#TvaS@~Ljg2`K=kkH0Rqv(L8gWaE4b~+?8o+LPwqt7E{}R?8bap9 z2N!J7MDGYhNq3HwIEL`~ur*%{{^H^3_N5MB{T#LC0D&oiwZw`jY_K=XBb`-U##Ula zPn!&WsO4IEc7_0AX7N6de*YU`au8ReE;$U5PXMwbGz_4CA#UfaAgqfS?`S{+TCU4I z%Jik>5;>xd7<8YlS6k5R(48<((rXu3y`DC2WwDF_LQF|((j5WhFWTt}2UEuw?;jg) zJ8632Z5%8aTwQLmLO@qPFg6#rz!apNM2AF zIb%VSj{z?pD>0}O_GeNK`nOD0JKCEodU;z+Y~>F*c&rIP zS;^jBqh8G3B}vTWKM6!PxS;AkI8>opoqU0)rsC5ye$XU|_RiACez?tQ1~ApxaR0aA zFpX-U9>dGes7W=NOx1wZy|eFm>hMC9F_$CxchA}A@6rg|?|4X2AnT#f;LL+g?-IrV zHRTuQxRF)txc+%vzckl(H_dg|)m5>KWv6f<4Fseyoe1ZtD zAW+HVxiU5R_yzd*C%U2yCa9~clgKbtD3QgIxB(kxeK6{A<8UEhzWY@CQMhQQZC_T`i)HBqc9I*Va6c4r6T)4zX{xpXeaCBH;x{atiQPT0IM zPo>)Lu2_Ilpl_-N46zIdzc*+|(fttAyPnK52=%3P_sBIej~znI}v zd!mAs@9giN&8w%I4zM=J&MeMqQ$>;}JXoJXJ7RIZ6IVk^)r^q&!fAq3jbT2YR z$0oAi@(r<%hRFrSJ}NWreURr8edvbK`3ugrd#Jlcpe zAZC%9NMz(!C$}O7Nck`XrO2Jocv5|uCeGqHH+aV*d~NK8@E;M?nSiM^2FT8b z0*Unt5Ivh&>qy`jCcth&1gDJxws|Zh7BD>*XviraiV@z$9|&$;<>bKxmeIPxLd0qR z38pt?vY(*j|OBlkWht`tz8fuej&O?}bF(WHS!EV3Am%S)iMNxFF-tBz>>=}BHIY^vP8$KvhRxlPV8F%UP*x$h7f z!g7mox}8Tg|FvB*p4h*d^rOB577hS5-ZLRt^Dk(@Ni#G$#WBSu3GlYx$KIL)r#zk# zCh*hu#OS|>sjg#)E~C$OJmSfF@OCr=fw4!2Cm93D;ywSfQ5@)r9e8450T(&|yq!5B z{R#;z=t76%87%Hx+uyYM0Dd{^%VaPFU-f zCaIRCz!RPfx~I}iJT=RAhSjxw4B4#H?n3LoWak^VH5>mNDZ>TUiqOV`dXXs`~k7wVo(`p-0bDT72J=8Vmq=iq0?V7>n}a2kRI-Y$nF>TT2@l=%pCYMpr~oZ zpAM2VWwj@Mp$sg)u={{(0fgq3Ka5L&lNPX{_2fw!{cM=b@(n140B-#q+iF}Q`gH;6{LQCG--rvckk?bn^;gj_ouNM6_!RL@RG>QxCYiE_5!urwh~0;Rz>sI^fzPb!hA$rTgQs*!Zg(%smOtoY0jC~hs@Y? zB(3je*7Mr2|Lu3lzjEaJF7pV^k97r<{mv>?1(Tqrs*e4-h`s*rpoi@2s0`>ng|^JcXs z6=sZAv)~>(ct$!k$SUVVR=LJ`!kb@FYZ7aK=l%KVEyghz$ttIZZiPMahCym32PApL zJWUX?ZXea8@RU)GebTq}Z~myoFKOqomp{V9^HXUrB`rse9raCN&m+y!5#FB#AoSho zEr@ZS*1WG@18ye;MhRj6Jh6bZlTr&Qwti&=N~Fnu0Zww9Z%b||3Gs?|wn{XWtj2lu zEdMda(!aZCxNmYc6b)YZFUu%&M(XM3YoM6+o&@Q^5`--jW^nYtxDJKEy{dUo?I1}pk~ z&fEwCo}8hR_sFY=l0XN+PXc1KcAn7@d_P|V!P8G6Uvxy?^LTov{`2m> zZvbP}ck?*F)SuOr#|OPJqu~CNp2`POZtzkAZ~ehEznhF%n7klM6tQbGIk>OT7`EN( zwp#t(_AboOZec$Zb*(&w4Lu=7R)r!*HsZfmNHfXOO>sfI?fiGQod$Nvj%23diDk~z zn4ih`1)N=9r~3H?^i9B@G)x@5UqW7qIhMH0G^k9s z!i+_5p_1rU^^5n=){7{Ae`fx#OH)S0OHs1s|N5BqGLMvp^;PP!pnwbfy5I45Z_U}< zIkc_+LqLVc1@`BuB5pUdKfk&^Lw^eP+Py4pVP*M2=CPeujv*%n*6CL|=d=MBD6pC= zyJ^!ju_>0cA`Sm&+QIzhhNSvjb2^BNV3V=bR!(UvAC5N~Gt`-=L3XvTnbDEmxReUu zB=P^n@neD{4!n?UTCp0(Ll)8N8!pApXF+oA&xmr=qJ(>URG)q7B@yn z@S;TVBU^!1W%RCMR2O$uiv=4H#vSL_+hm8HiwacFp#5_a_JOHfEyL(JIhi5m7mP@~qJ_4a&`X zrI)%x@Op|FyKhA11J~-{aAfN{;x{Y=DN9hMJFQ=1A?pbEAQ~$;|L+B$TtR9yP_o7Q zSsciJZ_yJ)I><{c*oI<($*`6fbdbO<&p~OQ3-F(V&m=)DaAc^O#?-cH3nOzC_7r1m5<=C%O z`XLpbC5nfhc`S8wbyp1Dt~75*Zgcats|ih5ZjKp>GX~eV>lZIJ+mkphs%ANuq_dS1 z>NM6b+3^T50lZBNuGu;H40slA~(jn)%s3JZJ|bJGP>)F<<+ zkVX+l8I%lXN+~%dO#44&9b#^Fi|hjz1jg7Vq9iC6lh420k25(03;kPyu*!v^PzhZP z`K~ENpE>>8xo8_o61uxV^PFAp(@M&YAn^M!A1**uXwy6a_Fc*EoO{?1RvG7H*1ryz zxq*#vm#05T_*UqnJ3xg*2$$O6QF(jsoUVv+cH@?EtiD5j`1GJ7{IMgUDm4sy@|yC?QJDJQXqg`=F5@)v=AU9)J{N*M-_{CH#q==plYA(F^UIpymGIrO z67mIZpD0EM))Pv?IVIltN|q-c-(qW9pGZZjH}H-Rm%vJu&EM|2jlIv{?<_ zGB54&1Sy&<7v#`RK(eQp6aMQa>}z2HdpgUF04j_3$^<0f$*ZToeH$tmde*ZV@J)b( zgaFzV&y}LNLU&{9cWM4rM5OfrBPX<}#S{$#M@(eaB71H%`>{{m2`$j9{Li-p2&)YU zE)1j(2Jff_vT_1=Cm(gwF9Um65}J7%VM&#mrS+ zfXf&s3xP9nqSAjK3r|5<*PMe;`v8ji4NPYd30$&M7NAPTRkos_f!$CP#y-cJ{BRUu z+9qKKZk+rxwKh-hN7|I%v_F3>ib*sTNsH%ai7r*IKF11ca&mW&CWhB|8sj}bBJm?y zK`1&~?7V49ec*ZagYLkVT0t_UK3J`3tt=eHFFC>wSt-AB_Vym?a(ge{G5^5u`bL2U zzLDtlg`(*1wLn&l569~dUC+&VJV=k5TTDA9CQS+xXM`$$1q7Q0s^OmNV=vMIsKK>c z{1+q#9h%XsNg6^utG9~9s`QDpR+px}gl8VV z5qUDGO#UpLc8r|pwdtAbvstc|O3zs9QP-1EjCttK@?vOik2nfdFd9p3d(qr_U;oucP8Umm*l2haW9?R_c~oBmKzMoYlUr80YG z2^n3q>m}f&iB#kDY}dDyvkRVt(1)Nh#r1)boWANI&{?G^TZ^1%E>MU&E96CJS6!yF ze-h%G>p0V-R(r28ExVT!g8GDyv?PQfLKPK!zV>%P@0ET$?^2{fvf^gFTC)Qu6~GXm z90{M!fC9BwSbX;PYh6Z79Br+`rHN}7zrwzd$r{{3Bbz1%kop@E3llN0M7lX&=sl?G z*yw<&iVaj&Yue#Mh-5v>;9br-?vBZf-5P932@R;&vYOzT6{!aKc3)e&1~#VbS~xqU zvSAT162pU*;|`_B{KnpAe0$DG!M7w_KlrpZqro$vJ;>{zG!yar;Arg*`|CzPaK_DO zUKjcXpJ2l}nNW-{z%(7gWCDXZM#6*W@lT?5MLvuH@m=Xh{@(%#{l3*jbOhuxprBcN<`@w$B= z2y1cSz8pqx)nJI^H$1OQtsP!tu)Y_uey{b$YkBE8%?=j+XwY9-!q3xJTc?-mE2t3S zBVz9eivSO(?w@+3spn{Hfc0~(JGDpnS8PI^eTp%8$(Q6iqHp_V5(B;4JKEm_qFo;m z167*8H%|ZCn^Gt=mwlFlJ_RIAhutBd223#xb z>Ie-g^uZB_5o&mdEk30DHcUAUg|hJgR*WZa)*=mSTxC_yfaN>j-vV_Nx+1?;d!b3! zKTeQeT{!rYaW6?j48G~5Mt)o*ik2^}!7zasUgXOKmZ6TzF` zGFY>S>G0%CsyzfdBgboB)=;~?cV*!YT6PJ+NuNOD-)QOL``G!gcW+z#cZ3^<_V zYLekjcWK`sSKqJZU@Er%cO8IUf2S*1p50mm0ixh4@ApB_<5M(fhUB?;2Z}_|?{UFPrWJSrr8bY-x8ZFWlLy-N%E-ghU*S7+S6BXR71oUN* zAT5buh+ZzB%$oQtgEb?9JVa9s7R?C_2$zhDj>mz{E&*9Y3c`A+u`w9u_qcd5x2S9P z`gWvu5i(BE#Z9{LYf(6rEv!XlWeg92e^~vFZ=yw?2_0IEkL1kH1Kh#7dGEwN8<4XA zO{Oa6%V8m)CB}61$k^fgs~h;-voQ!(;7hAJVy)m;p}5!he>z)F5m!0+$1eqV@4ItX z@57}A%`HY!r#%lM?yz-6`4VvA6=Lf%+e5K>Hiovmcd^nP*@E*Lu_PF&rNT>*f`SiB-dmSh z;z?mAeY2(S84eCBX5LoRXuwxJGS8Fr(wlA5*VD|Cr@Eik*T@qPU{r>$2R9~O7W_M@ z)TUYz{9bX1XEQZ{MQe?fH(KU?6Hw4EJx*%`ey$#V$!ww>SUrG1hu4^*!?_vE30Xe@ z%L&33AJok;g^%DB1(DoTCs>?>CHOO+e>9`71^Us>aKK6PAv1D9>Sl}{VG5mJctpxk zuQC;kzckVTc?(u-4Xx4694oh+a44`;oo9PId}m zJ=a#c1l1_*m&eL`E?4!BELxfuXRJuBX#=&d)8txWBJOk3Uj#n&cxtY|HY)w;`ZkSztQ=Ci6#+LB+BL>*b# z!OtRG7|2JXisX@nuUSj{)KS=Z6NkY5e9 zBFq6fOU4;2ns&^9GJ+j}t`7oC_--oDYTP=Z6@>CgV3g-Xa*tYmxeCCmEn>O|ar|8| z&{g~Et6KgL?(dT4D;a(|oP?dZgvhZ^5$}f8I0~e0g7CsVq-NASf9C*>3%z>3BcL(T zyx-j35%v`O^9?~t-15)mMwZEC({e>5&@gBZJQgF!Iw^cXNyMwAR`@+HL5=Wt!v;IkzXB5_(JShR9FGM?}zbP zs}vlNj)Y||5~HJ)?1u7JftIgqHcilicc1u-5Bf{_1_{G(3ZsMMh&a#(Qtj*!TvtNm zE`Ch6+@w{mAmC1&#X(vE+x0IVNU<6vvbfJE6H@F%gk)uW`VjGTR#q6BwoLwd-U13| zz$3tW!kywqE}24OJD#S&RYqp%nZ8>6XK$L>Pc&Yv=U~l08Nm@VaM*)JZI~pi@tst^ zdbTIdAV4#I(C<8biSAMV8!mL#+DD$PsPA?`Q`2i7TgS?ft3RnyB%n!uEJi)w6zV6;@@k)79dyx7`UON+JTz?n6 z1UeC5TKKsqi^u@ECu8dcf2?tAg2~n(**eCN9q_{t$-Ry3U~Ta!q3stP4G_wVj*tTV zYl0@d?^x})@Meb~)EB2S>`I_CY+^zG>rR z<{zPdK>D5qt0&b$V(wab)De#CkO|61j5J1ht?KcGNZi!6Dib@bA!R%qGDKs!@D=A+X~2H6c&~V<#aqISKr-^rVJ}l!b!l|`fF?gmNO1vWg&EMW zYN!T|$^L+MCg_t`N_YLj6hulky81mbkcO<02V)3aomr7Abvzn^awtcKOa2$;fE}}u z7*4j;23UQK_2gpF>wcaK|{1gi%rsf;rDLrW-Zvb`J+Y)o-#iV<=uY zE-v12Qib)fjmUJE!g2{$q%;;Hb2{B$e$Q>0d-82WazFA3S3spw3Jz$1TNV-8ndL-M zdG*Gs$l{vQBk_FLl|E^mwd%!h^)oS&Nzb4snl;u2nm#{IJz!wlBHf4Hsj(M4Xxm{?Fkq1V=pc`}&Ccn96yLHZt?fj;=(NBDJl=*!SnHbN zdHrZjtB>r1KS>?YUxKlGjs;`Vu;D)QqAUIHNs(BShVQUc@ei6AkW=NsDE^r1nR%dB znxXj3Ps07oHpQK4FJG}_9>lJWfdqM4pw72%>dh9_B9jZJV+P4)vtRQv4D~`Q#rN{` zpJ@!yRnOu~TP@d+zK(s-Jm}D^NnokejsH+e!}A_UNc?>&f6KSMTSCdde?i5Esf|5d z67FpD$ojRIY0H$PY1<^jr>la=3|iFb$%zd_ z$aPU!#M0g7!j&RetCR>?OkZvGbW=yZO}qX@pvijWDZ^h~mV&4VZu*%R(H5=Xd>OHs zN}G3w-7;E84vwB>+WzA~otRhR;TbgLnRCXOh-YJu2C5<|wpcvOIdfW?X{kzeCjaci z+E?^s5nW`+bwDInsmsNJ+L7kI$+0EAwmz zWt&KKO6hfATB{L&dx1Sllb-^0pq{lpYosHhp9(Qjm z9JLN0qWAbNqNb<+&&C z{X4Z#w{IBT-tO*QPSj`q%)~cK-4{3b%qz-0uBwKwQ~pH1IjXS<%_#n{M$4R&9Wn8J zRO8H*J~g?4bSK60Pj%g1;5c;{&)ZYKjVO&qvDq|{LQt@#rP=1=`eOc)KKGBK z0ZkEB>1?z)dhWvKxbPZ65ZCp283w%hb1-V1>ji`ms8uMu36h{>ra0;r&LiVj0Ff7J zFkkrN^N@c7IEk#n9t4C}K;)A@LjF;&_Qs)bPaT09Umy z6IlEKQlPRkLg0f8RQ7tgmDj+k)Hl=EN$lcWsCFAAZ)$a1h z#4nHN-g*_mH2Sr7!oLm$S;({z>!XeQy?ACsU9k|^%AM$xpWQr2=UOe6|9~CvBGciV z2ApIPf?6O$7B6lmjxmXLDCoF3%%%qoX!gS_V^$aREZ7?KmG)i`z)z(g?$7!Xm;xW~ zH}`?Q6Z=Y5_6AjjfT(+FY-uc+XC1>^gaxr!mmNQ6jc{P4l*skne?)f>kTMZBko4qh z1QV#QN7X+?{YdVZDqZNzdG(Xj1MgxSSy5VK)fAste(yl=Y~*(kN)j-;nMf1BC8vQR z-ea==dyB`}$?9_*&s(Ty{06C7B_=mbu1@`D(WVw2IHV=2{aC=TS0Vul9@IdLwznsf zO?@i5Iwd&ycK4N*_-M~g|0M6G;6m{^C*4m4;0y|X664CQ_%O;_W1saOySURii zjHb&}W#XPb2u@07)~ z^Txp?Y><@{ncqRIRbo4>m`ICfCv%bOo*To2sjPhFvWXaPRmV z6MX4F$_zR>vIvbA;VT|~{-F`attaNoyq^L<`U!$1Y_E;FTK7mM1g7 z6GaIrTfWyAbBlt6P+DWx#`j9Mc`3@M#fhCo-`(kOUYxcqGnekKLnbd0Dmf>fYU?_L zp3+#XC>9QUjpLj;QHegPJh&mC?kyv%V8DjD*5#hVcup|Ge4qTQ0)f_{?F&Y&XUVQQepxl-ddn&NB7?esK1M)_f8$Wn4G-{;z}+U_w;!z#=ZEs9?TygClP0+GQne55&0oWMbn9)!_n!zz}&wttZl^4^H{WkYy_3QlQ3Y&N_n@rKIQSzNve1Sri zFY{M%m4F6^y2u-XY=rXl-p_pV-X&XVZX*?KfJ0H0h&bA zcXtUO#VEFX+-HCtVUOuEcdi->Q~JT{1+lBu{+Kni!;UaD;i0>H%Y* z9w6Y~{R4WSJS??BH=B4K&_P_a8Pz>Qx*VflZQvRLm@*VN~O!~B~}S25-#M| zyoEO$x%Gy`PR{9SG8y8bqOc;3y0$}g|K~~jQlUb6Lz=s(7#f!5Wsu?tz#74W7PDa5 z2)LYdG=bwHNMMLzwolAgp017hO(RrpM0A6u##H;5G0ZQ~$www6B@a1|`UfYq}x#(-XVE}=htn~1s6ZBT0)9k{Jr!TQ;n^0RM=KGlGvL|Kf z8B{Ns8Jy>VPxHJl5*4CNuk#C=Sw1U2;`l~kKZyy@Kx-y!W>c?AttRv7)Qza1=k)%? z2C{QLH?g;b6q7_?EF9!E=+86o;D67fXm}~>or$LlIeZL0{lezp_lfcIM3=6@kY%sa z0xWXVo_3B7hB#ULv9*aq`65u{O)U9-$k&Hzkw^#{|1I@)1(EYl-fzw$;hR_KYht(N zC_7`f7u&`(M(WtmL))j^e7hlXsxa>Cuj7F<=TvuXSA;@Ump@i-8LG*B zg{q#eCRTGj!FSw!BD5qIz%MW|WS5#wy7NkpG7am8p;}!QneorIu7BdGEck0+WXkx2 z5Pu|A-LH89+B|nlRr14N#ign<>rz80G^p4v2u^lskAXbj*vozNYPl;vnBG!)L-7SD z2wpDF9`>cJ{3MaCcX|0&g(WhUk?Y(M!kSFOX6uu^(zQ{{SU|L*BR+%WY5&4-^>Vz! z5MJ^-A)oLyKQ1aN=|YSqOpTPL`dk&EkJ-~Er8*P9`Tak6pSpB7YzGLw=ZANA;G`T% zuXOAkUY1|a+#tn6Poxq%Cht`O&QnHLQDTkTwn>pb)ZK|+R~CdlR_(zbT2f!e#9g+vC#p8DKzqw0gGuKhfmf(P%L=t7x5_2 z^y4M{S|;P*_60bpcieY)szit6_5O>9ADVXWItx?TBd(*ZbhVY1mT=(j0{fL+?oM{k zF#C_AdSodI0I%GRY$~k+|F3Z0vV;%cJ)1=Hla`$zvWPh#=V>$O)D?;~w^relCd0z0 zoeEl<@A~$(Mr!xL~R0=e-QwJOG;VTU;~0^4<_J+ z=HdEtijtK9JZOOvXVPH`CiJhzxZ1wjxZ5j`KAr8HY{9qRTwj>Q7b*Dp8ghRynJ4R` z)&s(;5;(u2$8mAJe3%|1459q|_4!_|{-|UZ|NW;09f>mPU5%yHzqruMXwOxBeDph5 zu^Js+r)pCz6iVdl|F@}sPJS=Sn8a=Lrz3`W7ISb<#FcTep5);L)vtQ0zi(K;_!DP> zM*{g=z=&e1X5;!v{H=TdY3kbY!VsXxdECbx+0 z+~kzdg9bKdztAgFmTr0s|D4G^H{&N;C0#jQ%CRmbzny$9F#GCZYkJVhD?*%9KL^`DzIvl!tln|st5Rew>knRu=>F(#;zvuIR%ZuT}-fOM1 z*R{S^GPLrlsKsy_87^;X4!ff5BD5AkOu26@n6w&Jz8Q0d3|7LWDfiVnE<*U|`E5D0Aojz@fjZkQ?g6(IB?p|zElj{r#n@LoX6<70KA+a+9VoD4HW+@4O zE5}ZAj75Ra^&v#`h}`4x+_Qs}OG@|-Ag=|DV$$N+RlMxGOOVBaSi3LWp_7J2BdIa# zU^C+r;?kj7IXnj9$P5D_Ny;zyDgwPudIw+q17_>b4KuMGn zkXx=aDiDXU^^Fo(*rKlRHTR!Yc9-jpMGf?MnGi^yFzb7z1u^AjDsnW9WJTTS!lu2Bk>r?uKs`D zA`NlepIH*H6#4t$Dk6@X*A)(O8Z!{6wdn{>qyW_;sl)h52;n>pQ^ezMQGppjA2fb{ zyQ0cDc;$E*t~b>*Cd9%!Q&wKpo{#>+bpF?uI)!lwNBh(}EEXn{wL9j-tCaav58DU1 zhIoMNL-{Q}i?@v;abt%Sqzurae51XFr33Q27scN%wDt z{tghgR!{}K1Pypezg({(HhWz!?`oG2OUTmJKN3iso8cpE)(yn30lN}ufG37^AoVkk6#R-q#tag^mb7HS!6hY1&N8i9ZAvP+v0x9!j*dQW+Kk!%zNenTl{J?95%t_AdmHu+WJQU6R|TiOU<2Vw z8t{C=K*(#CmYD@3e?0inMed5BA3EfE*$Tc23<|h8+xj@Mdc@VNn*vm!z?2_gBo|*2 z!mkqiagHHc$%@g`U36A_Pkbuu*fvG-_)m3oXCXg>@1PW8YohXpZaaVgs%@L|&>;h# ziffVzd@ERlx#w2YR?0ff&0kLNG+AvrDpeMq^rECJwMAjwJ4=LH4bRtemi>yCTM9bO zrswz@uVv|AV?zmz(E}$pas<jXM)_N2*H^=YRafPASVvxt#RGcL@RCzn zfivA>MSuEO@|OTO3`eyV+`hEu_cf{tIIq^nfF4U`S*m}G#6VyMk*R4c$O|ZClG)AG z;U6s5vk%oC4VtB|H_VKltmEZ50WYHw6NYEpVhdUbKs_W2`KSoRZ1_JhCEqdFNEmoS zKAn`a-HSbxl>mCOsKz`QU{q>=1*@I?^kNkd+5k<~*BDSjYhoca?)8gfW#9c-+Z$ok zEoSe=LhBk|#mvC4LGnnK8#?vSmgJd?j+r3!9h9_&q%y8`DA zWxgZ505bBpkBrVmkd`3G8&|jkd?@lu()Jq871ggc<9FoeKMB>DCUAq${oagI%$zm` z6o$?i`9}mfZTS7!^Bz1R&G3P184$uIzR18sl=JOdMzuRW^Y_!}K+^*<#GfyX)@li= z=01_i!d_#fAicWXn=x}r7~ly*8oq|0K;Lr# zXN%v?;W9Knp`Z72yxAD{qL~`K$8s3*z6!#G6?F&80t)j+`vU{9C9U|Z@Uka$s9wQ} z^3>;eWQF8})Uz3O5SG|5q)=mug-c0E*XMeUoAU2bM#|gT3@Tj5moD@EE+$Q`hqt`n z6p|S`hr5yTYu(l4h+f~b?#ajqJ+b96zM%lMu9%%EW!dzvUG7XKYW4dRY1Br|jNZbs zKgaz3aRWLo&y$EJ2J->LplIE&L~pUeZdD<|?tj6pkuh!thehGZeS1q#L+f4J4aDwK z8F+`Dlg8b{&CR*H@c$wLR^xgorY(-mN`^mUvbaP(EBe>38$F(`4bV`mQf!;KQ}`)c(0b4ukS`MEgvApIA{3 zxrRAvodNY3FOQ4|P9Rv&vhA2-&VCwG@~3LrBCY)xRh^U2zmvu*!Z_a5uhLjv^sOR$ zSLM|a;XY^GG1eA~fENX*@N~Bj0BCbn=sq-$}jR)B9p$Q+b zf}XVMk7btS8Wkj})&U9`hDj1F^G+y!_i?4KA)nfPhD3u_%S+BY`+PWTaWr2EKY41l z<8`kYH8649*#O)}NQcy`5{4|pV)V6yyE^8dW{_V;x#ov6OT~EPil_LkpR!A&If&C8 zlb#F&HZEzOfelI)ggf(gtalC?+5xBAI|Fi_P+S%sq193Wp=;y(AE0NENm~j zmVoCVq{bD3oE=Rg4{83xB{_}OSR~GoRm?=EyhA9-$0wa551de{GX$K~$v9@N297bn z2#D;78+r;!vctbW?-pfU+gcox<)D>I(8Aqiug#XF-N|sCjmhfNdXgzH15oLW5(xva~ryA@xHg z#GG?fowx~4HO+&UGyVu-Zuuv!N z_g`+DrzPVhxFAY`Ky#c1**blK(B137v?ve%OeK=t9WlKo)iCoDrsB7qqk4L%e_25pILbz z0!15RqR@<6{(#BM@90<-Hr8bla%!CS{v^^#H*FHTkN%mBkyBUCE8ZaQDNq7W4kXd( z&Fz>yK8pJ0?Y9AZGJfvuhzhMWh83O>BCx3o`lRdSx6@W>g?o~x3{#gdwt z%U6k%QIx@R=7CIn5N~KV%*=4)l!!aH0h>SYr}4@CjXHh1u0oar+Y`MUi^~*35wM3> zk%wx0!6E#(VOS$xcF`k7+-E@Lm-!%SmJK)hmCr%9yN}#qm&qChC3nr)s7+@ zX#KHpFlRd1@BsuGD93=7*^nd|zW;LcE1m^^%F4*eek+>JAX~9BaZIyaO_<+- zEHc=^_0@qY3Rf-|S#4&>-Y49hv|l8HA!C~U)1udOjVuij-*!KG$k&d?K3p!Y+Yv_<{vb z2_GBQ;`^Nk2ydbQjqU5Rkd0A$^bEeAQ1_SWcRjtehvHs;@WJw=bPDcB+bUv_*KsrI zo5Wu&XG~sdw*U&Qh8R|vxQtFLkn$}c^SXZuQr={X&z5k_H6*h{w`L7^{p#{fvmAfp z?!QiC8q$0w4`;_jhYTe6<+}*FYd9NNaH8;PFGL|e0aD#fuQtS{UxDpoC zZdx}P#;Vg4ZnKJlevaO{BGVA|Mc&HRJ7GDaOJ}h%nW!2oiD7fbfZt9gSG<*5U?7w~ z>#BM)Q)QjFz5?iC4GN@IeY_^9mM{Glvp%6gIg%<^qPusc7FdE@}3-Jiot6l;wl@PY9|N9{_|14WTu7*|#{K zQ9mm5NP4NvU2Abe2@MoU*EI^M_^c(4@*6(g9Cj?`&N(ovf+JSU4>2xqOQ-YgLt?$nUZq$bUL^QrfOTNEs`|HRWGs?U~F zslP2*qzx0we@VanhL%WF(fuPGKf%GBmRyBWgJFulyO}aJw!&q>{peunZAr@6?`lE*oqBgVDtYL0_i$hzJCQ+YEsT9Livdz4w_h1~qf?{fYbv$$x2I75)Xp3w0_F>%(hQ2luMaFaU(HFS`y zF^l(EUtII~lfH9SsN9FQ(+mcc%lP7@8i{mxuKh?CE)t6D{D|IUaSbj=zCkr(!rT~C_6I*6|J9GTW(8N4 z*swB=D*xk|8LcuJee+c`x#gX)A23sb0juQ=MPg@cOSC$*^_$V12wDg2RFt^!M5l){ z-gRSZamKMn7#%xr2?ctq{0Z%}4I#|BI`l_}`SnY=(*vTjXAl;zCy1WKD^= znOahUL!r0wcQ<|>oNEH{ZC@ZPgU@B)WA<2zCDS3NSEQcif`pT0tILW;4=STIMNkdT zP@I<2f~u8^)(b(FnKIT0tSApoFfYh zn%a3H8=)n$r>yy4fe-R{PXy)uD-un12KjDe@xhvFBq)05Lyu%{sE7OZ>vi8)Zq;(`B2>mTvQPExTe2-tL zDz(saHkUkHfo7!8-Mn(;VSU`$!s9jPW)SPw;DzK_ZJ2n5S4G*>s0=&}9j0BahYkyk zqJNh(61e93ByUGVi8K*^5WIRB(6VLWJ>O1X_99{|BQyNmMxq%F28aW-j~}sN6Q>~r zpaDf^Dhfhh5^%=bY%MHFc)Qx0iJ$ByY|*@Kk;;E8ucbB#sTvWjlB23J?%|5Gbl;2Q}~zAfU*Ie z{V@k`jpxs}dRZ+|7+BG7Zh1+BOtY>dK^7goH?(DKHLJ3m)BfQINQ4^eFSI(9AuMxW z=is6+`{>4}nY?pP+ww{uyA&`qYtIM!dFO^d$1;gkAKi@Qr8eR_gH&BFuE}fs_4#e9l**qHp zwy7mu0IjRotMTUUTe3n-&{O*4j$^U+LGAQ^YD#KBC$bS3H%7Jxa7Zb72_#|UP$2pa_po_FX$j?xu=8fq9AbdcB zod~vVuLa_kRaH|lOz#bY$v5u)_-=kXm~#KiL98fimDqjL&AnyzmPxt!7Z3ftIqHQjOw_A{U6q(BbF>(Ic5^O*(y}w%sU)d0%3vp+ccX8E(0y&CJMT?y@TGQc zV;y2u$$8WW?CS^@F68TVjVRLUiCWW(#-7yY-Q8C$zmMa@m@nTd7<$V6f)?Bz2#BZ% z`e_Der)Kf`#rGT6+$3@h+V=f@XbvKD1N%cUYs5dr`cBND!f@jVA_tq_F1qCAhay9P z9-tRBVycY@_RFUrI`dIbRwowDXWOF;r5tHq@iQ+WT6P5g6K|`72zP@ z!;#ag*qvJ%>yD@ zDh5@9Fl!Z`(tdjR!L@#u zqd!YlN}OQ3b?LnU75B$+^V+%H5ZQ>?k<`8VAiRds)%l5u8GzP^ zc37q|coj%wBpXZr#r1&c7g>RZrMt_hjDEn&L%!AgYy9epj$rj0A68eBSHTRwGOOuT z6fYG>ZYJ2!Uv6|tR9GyiEETN%w9^>#3wc# zyefnPBr~1a_pY1sCv~1)5F<*q7ZZCgQZnf`(9wXkYoJ5$ z@?yY`nT=#U=Z*-py9U%$pJm|a87(mQJ@rHEd6SF-g|H=_YsqFSiX&zYy!l)L^n#Q^?M-^Er`| zUHNKh>N9e0@@b~6@ZaqOmoWwtS8BPOR~voy%#eGlx%f5Bw6WZYua(GjQm~Vvp3qOU zLUTUFdCR$YV{|3x?sz-DV_|=ERQtoC>ZHuT%o%v1}?Nr?a^tV==BsBe; z60p7qX(rMaP;W@kke>M9=%hHrh_@=tS>N`P_~Zo;qy06bpLNhG@z@;5=`-cwTjY1lAI%y0xXkQtOca(&(U zGP@@%@XHe8(D!9GDKJeo%|A#RHcX=T3NSj64?~9LV?z^x$*6HNH0V~8bR9L;XkZJw zEwqajVMRDjt*}}8^XWT5M>)A6#m?mfe^DK^<8HQn zi%8CS9r4JkR182oY)K_T=0IbsIc(Uc)BB1C$0LTm<=5PlFDLa9~zgp&C z&?%P0kCkK5sw)n3>wy+Zf0}buTt9jK{y9^*Q$NjQv>Sl1A2oyY*L)5+q0(J=-AKMc zf&G9HGSwB?{AxhmRj4xD!Pa}=GRH=9{Kacg%l*kdM=jFI-z!8LudXyq6;$@vJX!9F zjUU_%9zDEgN@qSY_9nXgB#w|`Jb`?#-9A^jIk;AlHH58sldOYvJe{ zFkfUCzUfNf$o2cZ&VFDT_UgluLqjYWHfvh-n~2BcAw;-1GOvC3flu9= z%0m+_TYcBsC0iZ9+}D9a{S`-$<4zy<9en_WdH&!QasHnErP<;8BcZFijeh1w2QG$P z<+WqnESBjrF!-lMxvLWAm`ZG?&-1yX*}bX>ArsTlh1`dvj*$UNk*#Olo{sGqCyd;F zt6zB%eB0hPu+WdY;tXIxb7@Jy!@AUF&u1F{K)xk1B4m%wWNhXybw9vjb`<`FhkU; zehDRegcPV_%2`oKiRs?t81BC=`_t;UsH{ZGgM%#H zEbv|0?{CS^c6;^>81}Db^O7U8X61H~XoLD;Oa|EBT{492HuxD&>|3lchvnf zZ}Z{tqFOiYaWjMiSNNEQZUqveddzya0GTRp|BQ0={Cj8?Z8x6+iVV+59HiI&yvymc z`I{dLvoT>7;aw18V)RGu^p0b>wV7hcj1k6D2zg{z>gu=DvEMK~pa_gU34zMYW#9mlAy)!Wz5)z~Pf-0* zkf=32g4}utZw|QElRXGZ1sfqBJ;{RyxLEZOUMC2nv-i1vGvMlb^CJgW+>$E}D05@+ zms%Vqz^Zx|}y*R%68FplE(6JT?`}Cz5O(lHV zO8fy`&`F`3h_0{~I&BWeCdb-Z|7Pr@z3I7LHk_isDd7LIG zV6^rWK(7M_cfo8khCIw&JS5uk??}MH)L63c)VK{bJYT z(D98D=IS4ENWt{dndsFkumY?u&r*d=T`CIa%^Fn|RK(f%ZzA@u8g zh7`f~{^1|sopNMn@InC`D75RnW-G2=Z_Eb^PgzvM9*>1eqlIk<4X!A z47fGV$v(dLa=;EVlFC{8IUndcM_L@|sg;q_gq^+*<5DhZ8+a#RN|5F{vxi5NiGA=c z1nG~1Na54Hy9FF{>cUdcp^0=PU|)dl$yF?m{uh@DpUQLbG7NA@;t5M#PmiMMrxAF3 zCsFVLo9FcpoWWeueFM3&V|2PAXX6OBo6Nt3oMyh z{MG+TNcqczU&*S;2%BkHI-AoqXF~d zZhjWMLYsR5VX+PS-zIAz1`P~Br+(#j>CGxS-9!zbu$9C;Pn{zqRjn4glCZs!tCSNPQCz7=PysX=EORpLc3KVCdfBlK}1&DgpWR&FtT7Q}Psb zfKSCWUc6?u@X9eJICa1;iGMCnIX1s&j=Nn2hDV_MA{^cGxYLL1r%~A$?{t^A1$@s++(B77b>xXGS9vg#u^u z_HK-j6@3Jx5C{-3UOL0v%){E}%tc2bjJS-9`FRPIOM5r*e1~!)Z~M89tjud9-|#94 zR+P-7pDGUmQ$6%7bAd11fwSN*>?k9cLavqpTQPu+-D)9ir$)#FCD@R59GRT&8nulm zP>jFVQt)l(52)7ea+A(r&d@5&TpX;RGR$SRRqdmm++#|xl-l462G1k^olq9M2@3hl zDZge47A*cb+HfeTx^wnP>|fNRKCe*EBM1+W=uxzZ=GoS*N-MGFYF(J zv7VA};0i>kw8#CUN(}3ZpY(Cto8I%VbxU+?dOz9scKHNZ^mrSy3H605w_Dp@bYlIP z2*GEe*4jqiCwU^~CnUUZPXTxmq~F#nXV>I%)c{4 z&h?@?>^g=mfe24U6k)_Olb&94<-5#63`(cOxUZx{W zXD)PwtE=5jjZ{1M8pE@kSV=Wn71_cHT`xm}Da*7x3x{itp+9<`S(@*s z5|g}9;;qlUS7AQI_G1>S#CYH0lyAbU)91C^%$$ur?*(Z;#9zcVtai|IxJSF51*C$? zoMMp=@|v#SK*}EVubEJ9nMt)t3e!~dQ-tN=_1cJ(pA1rhMk+cM=QA7;PYwLcD%d3i zOrd}ZffTI8#PTL=O++(Lq3pY6+|(9pamK=6r_4D5?0Y}fIr_n*5{zZ{)V z4t!T+0<2Au650seI(c~KBk)c+!(x&`Y?)bI6gZ-g2EZSXAP&eCb_=j6zR1I;NF4u0 z8EkmqoG6f5SQ08w*f5hO(b2CzQ!F#km5$_t7=0)*{4neKxwJvQP1|+VQTSCg4iu)# zw~B~OBPN!Wr_fz&k8hyp3RV~suuI2**XrpL{KRw7lmwa>uK?#1Xg5Y6qJ^V#evK6e zOBX$+ta(hTDZqh^gC?s&TBFF)mq~(`Jjj(=b?lqZbuvPuVR62B~M<1eT7l2xu)^!k(gj?++S8X!DD!Ghu>u;wmV!e))BWClasE~JC3-jQ6Y?+ zvnMaeD85^ptM|71>v#TehC(*7#u}ni-{Xys_xJZRT=MV=2#m=w2APIQkxS43;`}=< zs*fN~i9*7oLAcTneNnZEAdW}=y(U?NeC87-6ljQr<6S}{Mi5qZ3=+c#q1#DG5**K7 zeTAV*PeR)+V_r`oVis)RACh+$tw*)19l(z!5E&8Z)-{IXK{bP;ysfWx8@35gE?HlK zMjfRzTB?#zz8sWq^*{FLI%=;b;4{0M2-eqNCv&8y3jhE?^BX$tAjaH+A}|ySrGl8M z3yn!-Ld{gsHiDvqN*4&eb_ZR^k&Afy*SVC(dIdyyKC!}*g_QAksh zfVSCIycuAPH^{?L#)zJ@Xk_Sv=Ldev2%o-g-bn?lMk#;qAY>VXYhdly1JJxRZm%7coR@wtv7f5#K zxnbIeoMZvp_yYfqRIcg`5xQVqV;nd!f}g^<@uoaN@B^%T=r9pw=|fyGBm zY;dFTG$-Am^jtb>@(zi4HriWTR9=%2SYDURsccLyiuQrWE!>Yr9P~g44P}o)N)2~7 zbiRH6_RpSG`?JME2_}~H7^J2GZbbppnu9b8ET$T?d(r(*E$6Y$_3Y@+r0T^%_d91n z+T}Lu9|jy`(CC8o&rGO19vBm_dJu6$wb{wp|I9ht^T&M_Uz&0Eg()j*2&;(64DBHZ3_b2*_0mWMdD6OHqy& z!9OMjSgAy^8>&+~O50BruA(I9u?*l8v?e$dgTO+8A$p45ZZByy9sg}w;bZGw+blfg z&oODcvARn9#)Rs53axP?)ow`yMZaNU@u~bcqS1f-iyuY>35`D7@%S8@-P0Ir5<^-B)9=K%mhxm{famrQ zHgFmHV%z$*hH9&8{PM2jq%)?kc%J+#2aE}*;mo%$)=D9;d0)@l@&BkD&QOIRj&cG$j8*x{e4)*g`^jV$GY)!HGMQmDKY;4IB~rcD~yb^+rH@h1w+ zVh7Kx`OWC!PJ>3hgGHbD()#7;|L}cj7G-xGB%S|f>u8e?3}pq<((d2yFogUN$48EH zAXbp{P>xl$J#ZNI(8ThY8-4&XIieARH%UIy@)&F0g`D}25pRb-T6U`cLi_$x#y$hd z_okheb{GP2PwQ}4QG6)iQDHH;4P{PPKED2Zgv*Hsd;kEE*fmh`a6wY(@axz29rWQH zYPO7@K+%eq`;nvG`upj1YbCJ*|9J0^O+`!I-D@-H&bHkHOTS0dnIVZlaW1QHY*5Jo zTc_yN-h+}R`SjdwbYA%-=Bg_wP;bZb8^u)(0BA<3;ijOHlDTz%;8&jcY7ISReJpwN zkllIbfhR0afSyI06E6>cTBEqU_v8MF5gTkGT&eMbV_GkT)DeTqxXT}X!PVgu3ok*Z zS-)%(pTru4&rOzGQtB@lzBMCJ=rnvlWgOPrKw`@O@Z)_f*ICeFuA}q13OM3&@FDg$ z?-ErAw=6FPIjNp;&!@;%H1suF3s`Uu-pa_~N_qP?r++NZm2Sfm6Fjitiot`gP0pup zjYE*S-|_~_+H9vz$|eE#S38fMq8z?wMB%;spy&roM9MsO0&DuW{$bmm5gr(4cITk# z{mhuBM!0hHaQczU&2P^?^;@;FHaeCgJKq_HfF?XsgjGD9?Xg57_qZP$C>m&Bea@Sq zw<;TOx`uAcQZ;_SBr|j7NeEhcaYvkk+jQSI?Km~RzgzwkAI3BeLAhmO%fdyXfkQn$ zS$HQs3fUn;Wn^K$&)Gyme2b5n^h|il{!E>8cc|zNjnCdsbIix`%CnfhSGBy1j3uLcV(3cI!+Kcgn3}pIT6yqd7KVt_yG`L zt@)76(YB4dZLzWqQR*{yGrJ>Ez5Mi?CJ8C2Fz#;<>rvA^vIon)3oQtWtI(3FQt8al zkq)H%Ma2ORG1ckLZ~^n3Bq^%!p7mRrCrUD9eAxT9dL_DV8Hn(hbJUl_+Is{%e5p#% zA+hX_-4GULOQ#?Q_0R-izYH4oedar?cZt4L(H@NgsywvOSu_AwY9e`gk9w84M0=Ih zpyxtPdxR1EOK-B8=)-2bu7x;r1XWWf-hKZ|tRQBJ;T6sIPce)-f7f$#KjPu)GjVG)35!D?!QAV}sNpd$nbn>KF}IML*_efz<|B7w(vhDWvOIcs@u*d27pL1WOAg%Hq~>JTM=qZ%Z(Cp? z3Xc07o!`$lzsvjjUEm^`C*#b)&JF+nC3puT5PkGhy0f4Apx3`(E**P5t*_`ul5KP-WY} z$=&9EqjV3znC}eOBkV7rt$im2;-I~tJQ@(x=7rZOdQ*7|=XIP>f=G7XHJsQRv2>Y1 z;Hd5qG`sNiHahXQ{`29z85Z6#RX&OV_wagMnl|J+5s z?F{-Td@Sbt2P6=-_#?Q)*RBtcb`KEYQP?rF3uf~TEqza2O#gVcJ>Y5bXKMEuIqIG6 zGfJP?7cJYY_G)ftsp59<)Z2Kq2NHxeAaU$DEbEjd`dTf}lj;3d)T_a?O5~hq5*sD; zZzyg}pRyT(?Kt{CJ`&Q}xLw)WMx)!hCD=g%3|sYtA}f4Iz=5!>|009{Xu!JyT9Y6Q z4MNYNn18Q^8l;hzC@O{MI)w%9@~zHXH16`rRHE!fvL>c26ncrZ+ipO6{A5P1%o{h4 zQc=gN#X)1;SAJ*SSgFr)&pN=bLncbLqied?x}LFo1(O+(q|4)^O75 zLr2d)Y^eV>A`=fegjqLA9yxnV8&%Ek$kx8QTq|@f(cwyo-XBy61l+_0fPHg|KPE<^ z{Q#(&`^*z*Ak9d?rFYuioK`n^`)jlZqg$Jn#B>jM7yiQx;?LZ!fAa2C^r8fJ@>zNY zYP+hMXpnl^LVUb&W;VviBHR{im|UrPSoGGw23#(iygKPO6k~Y9Tkgq@kBCI=3;_X> zbI?YDMfX+5X!fPMNa$YrROI(@!4|34BNg@E#SRM2|F*b0G$_Um=kHX#Su(g+62Y91FR`HG&i7c{PY|ektY5kk53w37kKr9?ZFN@nSSd2EN!tKz40xZ>p3ei{8I1zZ@k6wtbkd|9zAPjpl7to zcSO3uC-W6}0{eWBCb`pgAd!60uDZi|fgx%sxx;7f-nX0FICQoUT=cq_m*<6~&a?&Y z`!2TYdS(0eh}jrgaq@Br@&nl0b~go`n>>;U?>i6RnE`HRm4hy` zh>w9?vqm&~dDHLST>E%0S$h3ald=-xC`vKf79vBqG%#eF8E9k zf{cQ42?)mQ@sLQB&jq5*yhZEag|e&d6nk=G`4o|) z%6SCgXC_Qvz_`+qzhlYSKxJEk7cGeSZj0`g-z{`&+)W14^rhlBao@tgw4aY@Gjn`} z)_tos84kB^H(W9!oZYUw7Oh$e08F-~04*`BNDIPZX+I$?Y|W~Y^zHBY?Y?k&m&ckz z!G*Vh-^KKTQ^%q2((kn~GoZ%=5af3#AuN)B5k!~oOW+kV%ffZf4bFy4uJEbi zbZBs3>kxwO8b#0OdvqybU}(1+$T0lT9zr_?a!(#GWcz7U=SDN+C2&{ZoB@p+$)2wp4PRn2!jSj*;`3K_M%R&p!46u`n}Oge2x!VNa8kVWa()f z#?g$Wi95H*7l$n3%}oMtdg?=qm;5Sn9$4z40$g8 zeN9DMQ;m z=`DBNcQCbpjGMfxyP&MjN5=GtdVcdX=qu@9i49Hs)3h(#vRu`wyYR5mWa$d+C*}}i z+JNath(=y>DvbNA7;9(Cjf$Ujz(^AZgw$CA@AbL0Ghn^=l&H3MFEU$|8RyzFLk&GN zALZBPo|XT`7QeeOI{c(_%3)f11tdvhfMhQib2n-4?An1ISj&IlIrDo2Pdy+HNBG(Q zqv@=pqWIspPqXyW4ZBD;igd2T(jn5_9Rea73BBgXb^Z7pK z_op1so|$>qJ@;JK>ypwroYKZ>9kO=7iE_@;xe4;?!G(T$UkCy+!5FShAgpBAFnpS4 z4^*JRr*4XW)&{CsC+t4?hs^+GM?C0}cxo>;M%h38WLgcczA z)#BMc%5J?aVdGsP?|iK{cKFV@?k!IYENK-PcsB80~Zeb75^B-_w z&EM2SQ#3ySG=+uSfi%SWeci-EY_S=T%coQv=GFuDNhI9#B*2^-;Cw@(?=oR#e~o6g*4iVpKmzQ7C;()`ocqi5hdZF2l_e`ekex!q+1JK-PbZ4#n#${7Wsz7M6KNJ;(Ox0i#EH{`A=<|^{7M*E^@dF0zBt%xw{nTCt# zZUsy%HPL-t9J)C|Dk{C>#{H-vC_^FlAF4}p?Oc=y1r0En5gyQ$M}r;$Xvh&;(351Tx^PgD5-u*WzoS7Yyacev02U!gyLk+tBZ*iO!d@Q=12>2P zO&tMjCe&X=TRNNd6eOBhBGiofekZR{x$eA zAV>Ht$z(S>i2fnIy0!aL;e_YSI;H`?RXkszxn z9q;Trhy7=&=Ld7mo^808{l3Sr^TcVG?rL=+cYso%c$c<_JlvKD6bAtc;s=aAEGXB& z{*eV1bR6LK86@s*bj5~CwiF*+x25FRB&`dq?KoC+g?Z|#ebetl&{mnSx-neOsOorE z3dQ=^LE#xQRv80^+S^pIa6aN+O3y#-W#f}RYdmZM2u~1!miR8HCWN`KMa^efiM+`PR@q9v<69Lvw+0K)1VhI~B)VGYCv#bv=1 zTM1!w*JcgHXok7ehm${V!U}?b845ot~bYoYWRr@ubC{0)rPy zitzD>K*j?M%)rnc{r^Air-vgCcU!$J4i9K`r>*ppuQTF&F5J~olcqVDG-Y={TI4pk zWs;APz}D$FF4tVeFh-tQIP!&D1F`qkt((PF#R*>2JH;}0kXmhM6CV{dUFehIQ_=31 z6vj`nI~_=Ecr4wG<4cbJGW06q14B3Ee))OIrH1p*ar$QmN#*2Rc0E>?sQA~fd;mP# zFlR^^ed70JH2&Z}OnVE(a=dcG(YzE6ybr(4J*0@E83piQfAMJm1#{NRo%ME|ET76$ z`V$Njt4UOaf*XMcz)y?$W`PUUNrEe@`W#3$-N4B0wz6UF#Ux_8TNapD6c%G0bVNfb+SaRB>4Cz0Fg!bsa-M;7sv9Gt(Y70Ntz1 zdpjqEi_kL#B0ozy(4g{n`JHc1H_pz^)z0fgnISm4P4DuDQasw(Sn~G`Z3sA7#bcB5 z)MpTC2|cv~C$iMD>u(vHgcE=V;5Rnm5lZ~s-h|ePk=;dSrE#phQTn?+$XO)tu94BN zCzKYGRwk5FC52>km9wx;fLv|Ww~03f6Z`4wR2VMw6{B^$s5)3TM|+$dz>MPp0jd}D z7i}FYVQf;r3cebGm0r+DCtBiSq|M7I*znQ3aj_BxY(y)%clTFkDl^4>9jjOX`Nob7 zfaNX8tA-)Vk?-de{5{}c-6JDlvke1>Zg}0`|6^&xS07!KC**f$YTq&2)JTJKaNBX$ zQUZvUA{yldit#v~HA9<406(!VU`ZVDZ39N5mOEqR|5nzn-hYX%NlfbH>T+%RHM7T} z$7HjNjRgM5J-h7>t5DVX^-UdHyhk2r@M>lu&#*F4;f5*@7!T|V3<`4X+t!6F=cOG5 z-@k;`cULRxbX!-BT6=*;GIjXk?W)3+@4EEZ<)s{zJ!72cCelcPmyHOif2U(Ju2cM+ zIU&rFKNRPKtLTeG`+$K{@_ifUW(EI1P#kLu`xCa?t&{{>f`(+=-lkOgT_cuNyTFF! zz#{c!yKdo{7;qO>8vHesbHnQqbQgau9R^GQ0qV$VE`E;>c*0!*gctJJy}yYI^vfQz zedZ6@*g>PQd~8*Q=T5z9eZT5B8bci}FTtCD0zyW;9|g}!irhARBUdQW_Tw=qB0W#f zW8VI*0)n4t?QFng-76FFaLNwiUE1wk2&+*TzqID5+8g%!kjH$z9L!mP+@_q}OA(3mn^mVGw@}>iNiN$Oq4emXKU9oGT zSmoiUtm0yweu2tF*`Od}soH=uTr6vOze?b>%MTBskhWYz2|<-4zAhkr0e$Nwd_CpL*^E^_d#SvfeYTc!zGoUa(0u!AA@&7#Qy)!6U7lyJW@F~kb-Fi3*HPo{^!w!G?wFR=sv(8U zK;k661}5Mrgs}eL6g=_41OB0d2aB(QKL<8mTqqlVSRIDlxL<(ZgD2u+N5qt|jO1}> zmt`i5D!R$f{CsmX7(X>xa>lWQEdxz~fVIj9>_4D=bWJPw< ze|4?CSsTx5McIOWzB0ZWF-#-4_``VhvC0TlgP)z%^(}>M2o0;?&B$3-#Ay;m!#BPh z0o}XonnvJ?vSIx!72KhKg;27CnED<1HD@A5=k3bhvS(Bge^|t_qQ1II6XGs=8Aj?p zk1txN(LYGKV+G;i|2jXt+#Jg6?Hx<#pPcQFkPf_)l!x0ZsYD=O=SCnW_``Uwa*~Dy zX#@Xy{yR#JVNJH8C%J#P^aC8St9R=i9j-;ooHwio3KA=+T)NJj18#$(WR2Rm6&|)^ z`)hD`z}fW?*h4~qDT z^yzm*fAsMV7#moqi=N{;iRo?}oh-=3CI1adWdS6{c$C0X7m|m+!9cLS#D^FqZmSkphpGT&_`96TIQ3tX(2=lz59 z9ZTQ*h&Txd>3O;yv$=z+EV@1}%dSGC?5!^j)8o`X2IiF0d|K{Q83C+J9ka`h(3p_PZ|E=RaZB{bM~E1j<}X zVc`p#{Oi~cD zkxl#?3e59NKsM&plPCWoHo>)ujj>Nv<=Avy-nDCI-e7Dvr^m5QI0eS~m?r5@M<(%e zN7bDOf6EPf5OabWHfo(Zq#i5u-mwELWEJN(ydO6VP#79qzg)Vn=*6_sGv!+Hm>Uwt z{pP>lBLI+TfRJ4v z40$ofe0y{6a&b5Dxs)VCn(>#na|e_yO8JVw8%beqPMpn?x4h;qv`>K4aAGq%f)pN7 zp09jg{Gs_WjeEe%Yckz zB&MtUX)iB}|0_3B({rY7%48~vg?H9OLz!`Kzk+B=m%G$V8~+w7;8y23=Ru`@r(q>j zot^?cFX`X?()d6r5q2qgUr3s_LSG-aGam-{+@1&@x8uzp_nFA+Qdw=K*=F}V7} zYxy*9>FJ>L#qbs=>*3Y#Y!~;5V!Si}p)P}<_Rsz6rAHixFMYoYm&Xo~>~cz4d}I8# z^Y=?4)QR?U;j+GW+|wu}yP9X^&9dmGk>psL8%oW!!|yl4PmNsQ*nEC=i^R5w3$6gA zAzwqyt4_dK6$Dt!umEcs&>!dPr_*zes|+i>O|m%erStZGF7f*0;w(qgVwlN3ok%m< zqy6a{oB_ zzRY@8aJTl{JvR46aRYcG09FN1rJqLfKjUY8eD!6YI9N*OmXMZjgeo9iM84v9DE~ql z@sUq29FLG&*R)v@qrTSeY`@C%%744%3pUP9PO@FZ;xmoer&U0HkIPuYTJC1+=V|<- z4e@MXaUW{Q!M`s;SSL~mxMxm+v7M8Za0#^cSqMkZnBZkEdgF;FJ|Wu1Lru$ z_W2}GaLV<=b$GR~m>q&$D#lAYw0l1#m`eT51+Zq{^ zy+a^Ha^zpQj;<;t9~uyF?E{%f-leuSZK(Y^*twKcUnk|V?J70trA}WtDjjufnMF)f zn$K!jQti8(?O9b7vS87W5O4v%-V{%=-aq{*(g;g;OZKC5 zxhhDyXz2_aU2#jQ@y*UB@XD(yd%7>E?`}zJEzcg&a#$yA#j`bo7Oc=k#3QVE+Vba? z4a*>p;mIeGHR6{rW60NMuZ21(s8VpLxZcRYD+Mc<5CBu!%Wl{>bY#@`-`$9x`{yI9Qtl$Td5ZeZ?{H(2_ zqyq-FmpF@cD;oScC&L9-Gqf7`=^KEu`iVIlNdZIw&Dn%1ze@;dU7=43aQMpX(ebW$ zXqQ{871p6tyx`zbtkOlYyE6LQbItaL`wFN_; zzJj1;?+r$PoP`|e4F0&zjhWiuqX2AV$B#Qq&iCTw=Ieb$Y#`bg>(hAw|!|auHyfB zTw#oz2p(_RrpndB^ls-VE>__CHD%WFic6l5O%6`zb8!ty#2oN-4$QE#p$7MkyvJ46 zIEi4tY8%11|A@O2gISzAqL2IJ*rgMA8*2r8rJaN@Ydl?65LYXvyz)(y5oMyMkAL{L z-3>1PnZUPpr=@Ras(1Zc^*@d=t(y8Hax9 zs{RJojv?prl3<%t%9x{iI0(o)xOC};=ax4iuFWpnOK5*K6J=X)6Qo+1TSc+2(}@Gq?Qd+|b2_FC7jHGzBbh(VohQP|E?!jXnyJq3kRtrZ9Pl@8K<6)2 z)zOYGtSU~$V;mU55S^!}aHWa=QW^8UlHXwH)+!Nzc?|JCzuPM!Yexu9D>0jpj)-k5 zNZcqY!6kV6Cz+L4`W`Tu@l_~o=RX815mai81+lqMhA_twq-PB|CWLv@Zewhv|h&7U}m5X3+z(T*s<6Z8aigs z=R=qxH60d~rCJqFA`e#u0mV-^vWUEUb?)@Q;@rMi&0galld*w^2ty|$YVy3v+~X`! z>5Yz}#oK3h;wCh2aRf4%&ZB5QN5GZstDXBTdAV@LrmW>GAeDwsVj?k|MGK9mYxU4~ zt48t(YBwxmeKk>&n?ZgYn&~Bm>L4-8aPX)3ka=^~7)OMj$jJCn|7D^5<3U&7>e^2Y zS7olzcpaLU+o7`tp;Yofs=MjJalf<3I0lEPqX?v9C01ICa-wwZtTB#NZvM3rzP&KK z?DJ(?e99*<@i0Jn2!MVph|`BUf-1Lwvm#IeyzgW6R5?>Wmx#mTNu@W8E;iCBVd(nK z$t(TK{g-^{bImo{bEvUZ@q$?FlHE<=ZNRo(&&U;s(TvENr@2#ZO@Nmh+E4cpj(hE? zV`^`xA*PNR0zo;=o@zch$0q)S2QP`m(!$&f(iQ%gpmLaQIsf7L#72+wR%g=aa41&j z6SX@cYwMReS!#AVkKAJx$*>Hyzo2yz843JT7&p|g&;)`~cUt-_$17fdLD1T)N?SCt z@9VIzfwR@!9#g0mGT*Sq%2 zS{}nuvb4kg@H%PV>Z0jc&xOn=eJC+(q7f(Vi)?}#Gis6o6;2?^GeU)gl=blV~KJbm_?o7Sl;Sg@x!yMAgQ z>9%+b`^HfF_--3H6J~A8L9Uw$#(0_7WdP^oC1}Cw&RNUBt9fI76`1T?F0g+YPY3>2-D%Dh%p2Ccs;yBCGZ;a z>NAJY%x{{DCa=d!za=fKoepRF?_5{S2>;{zD0;xgIi@do8Mu5nlS|ZIv+Qc%(zT_6 z|0|E(wEI-)r9AvUOCvr8v=%bVgTiaa#LV=(Rv!0?pWZKDU~E*ozsSnN>D}aa2Pp}d zN;2dN!$(a`H|8T08;ve_8;?iTUY?sTo?Nxo0c!<~fb~SpZGh z*{QcZ@DZqJl<&%h=j}XxCr1+O>R^)T7ilv*o5=Or5In|A^U}MwkDD%xWf6X; zyLMKcfJd$4oP4ZMQ;XG=?!fm#CwqV+dT_#8TEySbO?2z5iS62rzy=p=S?wqI7I&ML z0Sh=D>jRcULX4_JLWpQM<$Ng-SoYj85Y~G%1jQmIbQ@C+{x;<|btl=M5SLL_!L4n3 z2cPMhm@3upw1j`wSr#~n_xcJ`e~2!Zecn?H9M8MO73^DW>C^Z0<@Ti;pm48Q`Vk$5 zt-qjlS_X~v$>|xfv}6)U9ks;MIj0sBYlM*}Kfg_U8R=)g_ihD6rt-;ZU^yQ-m7J4j z3^G7bxb~kGz_bkUoZ0&qKKex_F9VX}NU>^y7%w#jL6!UX)b|S0lqQrAtsCCO<+xnO zKg!erFB!_*p1w3)X?(n_#aa*DU_XAYSnwn=K-j6{oqEpFUvA0`+4z_4qTP!Ir@tQC z6DUp!hSB`~6dHuG?siHF-cIok6^Pw>JsO6*Eni)lu)-E6%BUVXUkTS9XGWlmbsfqH zqp=ulTh0Sie4PsPimNiWpT%`-<3~rbs){}^{z?SiU6=t*#K|8L*n|{>H3OZmV+AHX9*IA4uZyxx~RN8~V(lmVEO8{A&LH!l9cP9=kP zvSCVs10D30**7faasL*hAdx?wN}D>01Ufo}U189GidNt^`5C6a)kYJ{PR4=ji4)+K z<%5kJ5K^RaAh*g9Tx(Hg@VzV4b+Jn_19DgMeRZu~_WT`h>tmT=`#`E!N{8;d`#F^T zPU4fR&d7n#-<4M*NGgLy%3rI$m?En8iheKjJ+YDv_^;ldv!PzZ@3cpTV|~CsIH!M2^{jjDhgLa!s8t9j1BnZ`#?VfnW(#RJx(I`xm#@(SuA1cl1+ofl^2xBE`wtLQ z1CTZuN(lR#16}{QBA)cYGw_#eioM%y&B@|1df| zQ1IhxZ;HypCw4VgSLIb*tmBj2W8@WDUxcEwPRMUke#|ouMVBs(`%pe>0pY6=JnM^T zLuWb=3}8`J+S36Cg&FZ+5P8+QX??l6-HMGsvIWs0NZ(z2u(WeZ=_0kNvdPl!CQ12# zy9xeGllr_7E>F-e75pfdc(FaO_f7t!F!5cF!0Mox2@nzFkBFC84V-SMIiMJvRqG}G zr0nhGZBPAm!I8#&-l{-3?4>~BnnlLg;vqgx_*enS{U1^EyX@Ay1MY;BqH{t%Fhb!G zx*xQFi(uuX3Wu;RAMkdQVG)(}O->#DKe1uE#FcZ$_{d5)5MV^(Xr_`1_J-}h{ zb|QMEf%r+8>}%YC%jHi|=h*&i*R!P9>s@c(tI!u1(e##is&NhZ7EL^IBSMEisP0Qz z;Og`86K3cf!OyR^3m-NgPKh%hN1q5@S}`M75A9IeI$_A27fmWM)h+q`KYUGE6w5yH zEWA@7e#r)}w_>nInsQ4`^i0s84Jumi`_1 zagRGr(~51Tx_x}#`TW`L6Y4tKRrhZP>%Z@~YtZhc!DQUS;^m8xRRz0Jbox;d$^7U! zJJ1OsiFIfyF*Z%>8TGIGJ8V5Cog5jK_Bs5kGJ7&d#!?09qay^uUZL@KHYta5QyO%t zp+m9=*a&bVgkzg*Ro6YV=jnDmPNd10A9)B>wdbR=`=cnhC-guB5h+d5hkr9D3UZFH zp+ch4TzXR-Fh#PO3$SLWaiA29#HQ1yjpi!r7?iv*M`>se!de;k%tb%sD2M|**ZvMD z1OP3kfbkeJqVJh%jt3=89)$qxUGAF!VdQ&D*XJ?yj%P*EOe3wunrGH~dhyLMi+NGS z9&k%yIe2Z89K5JOcJXE6uJ5uMsvf12SEKVv$Rp#;nt&xIzy3rmJHXVhw&eNI#7VK! zg6Q%!G}SBN+ObcSDhWIbt3r~xu%~e2Xsy^RcN~Y7{1w#Kha_4 zav?rFx#b@Xu&0s2J&? zWd3Q`5st{02zIaofXqI#h(Jm$7YWnx*B+Wi&N431CXwz>RH6^lmdW_gD51zrbXtXG zeM^sDIHd;MY|Y`*egDTWrO)Ng$bP7YmYj5S#N{#cA%>g(Ip8xK^a}n}VDn(GrIWsa zulv5sDxijvtI;a_4x=)dhN#*cMJmb^x`TlsFX`R|>ZgEPl@!{Fz;K`{TZf&u|8=gN7L+VAA z0<3B_%@{C*iG|U>sles zEsYM013pfvU}8QBSH-9PH>bUWwZTDpSM+80p}mA$*FvzvYV8{)>RyI-$Km0Rl>E93 zw&}xcHtHxvrCJ0PO|{xHTvIik#u)JPuQNSIx!Fg3hZkj4av6zPC_q6xBK1L2sS(L2DulJfzQYdRA8lYjcv6I@7%$T$Zq<< zZJa}r2-^@qcj~-_QPm<&5-Lr#zIwZ-`G6R8D7(Zlh#)Lnre-n0 zohVT`Vs;k|6X#D@3H5wTlV8{B`M0zmTD^~|C!(B1PN+&h-rB#yy5-sz>~V_tx11(-BvrxF( z7&nInoXO^3;S4@sqK-gLRr#aCo$nDIImF=2vO01Ub+3Cz8W&2;?kT_c zn(!5J-sw|SqLa5J2#l#%ZpB%LA=?4c$B#}RfTx;tzx!Y@Wa6SucpH6cz}u`6%bx9n z1M1?J?*yaET%_SO!7n9Y0&}`hiqJPCpCyNhERgJ$oEqB(!E!QEKO#vxwN!#f%Px

GCm-bpOXQ1qseDx6&W%?OnoA7BZO+7%#;#?Ua@OQG+8b7h?Zq4$+=O?%iDjUtyOh zx4IpbzaGklUYTubxy}+i4A4Lv)d#*@I$Ih=+**7~6UZM^J7DA_E`0Wa;@zu@3*Uwn zxpGd^W_>&3CZnvcl73WED!#wtd5v&ID&iSC+JhjnNT$n-+M5H}1scJm`VjHEJ z{+633?!yKRK9hrcj|&$~QWd#<=lQ`fo-X?f`<)sb{A@U?M=A0eb6v5X??!#;tGSTo zIMOSi*8+{Fk}L2rR$b0$D_psMuSddFCb2erwL4XeS1V*;`k|`#x>qy(t+zx!r+V&h(|(;Cq|MTdZze;}%V7K^ z*ZhI|F?`K7?z7u?mLCTbKo7lI08Pk>$bcjm7l9xIlW8rv1DVdm9XrUgOrogIAl*b44i%r?qYp;TrO^hP<{*<;Mz5{bm<$0fdVu|_fS90S+i zd17Tnimz<{isr=#1+sfR48X1|2H#f~o-w}Bsl;=L`dvq6GPc!s2 z(reV%N;9&+9Zk&@HQ9(+)G%f>(kVk%mVKub5ri3O@alO4x8dOdD(&SrS`}T5N!8oyp9|!9!|V(P1zH zIru+dA#Ez8LRbM&=_f{3lY;Z+iaR)gg$$`l9Y&3o-0hV~0@@OFFvjn?#!`m}hD|*%R&d$E%~G_h!fJujQ?Km<(!4u~fMG|LK0TXgpWTEw#Zk`S!qg z*=0>d9qQ#T^T*`H<7iT*ZaMsz$gke0|9t-I5PLpb|0nf@JS?Les%zKDjAybx53E<2 zHWb?vGX=1r{{KxZ0Zb^ZB>eTO_bbERUPUK(eHX|Q#(cTT>uZDEwx@XqU+g77`$MAA z=p9&4=(gdL%58HXi5{>P(mVm;_VB%<41{BS6t)Tnz({%1dCc&zuI}O^fo|n8RU!U1 z#RfFftUJho74*HKvk0`Rmz_aY!HiL_|HRW52Nt4E&pGs^`X~JY{Rl=5_(amR0qc-^k zRGXcrj4OjkZ4bazrhSf2%}p05mSU*U)Ih#10aA%hPJeH?%#HVXbJnX6%{39DX0XDs z=$P{t-2@s`Lr3xBu8JQA2Dv6mkqR9R28uaVlYRk}O?=5_bD5NN1*9 zUxnwE4ZEvlizi*Y4p`e`@7CvJi6TrfGAU~dTD`jGpwut>b@`dSir8Z4Rhq{M_i<6B z=8M(1h`om8QjOT3s7C{kfWt#IAdJq1up-|NM_p{e^jT=j?nzoC!VRehoyaZ3b+Y*N zaiQZF+Q9z;NT;c}5LD;Uq#Ru73o*wd!_3Yk(o%yvY=!4U*pNl} zh-*yBP}KuLO)}#!vGg(KIqHo1g0dZ1+4i=;#LdhIwvjPq}B@R8xOH{Om%w zLy7-;v_5^nQqRHfZ#Hy!PQ7t{pmHaV9OD2(!uOwP%Y@Ip|Hd%iT50>!;d$R5Drvm$ zIe>|0{0F_wi@xPr6Y;*y#%?S8JZN{9SU;n@B;W2sV48 z_Ep?`&3=-Nm0(`8d_!gnCkzQw6nHc4RJwdJ{c##2;CXQzJF4W~UgKtTI%Eb!#dQ@o z!6EkVA$rc2^6%uEgkpZ8x;F;CW{+N_D&Xm|S4*K!;J@4FcXOvjd^kiA@jxISkXau= z-v0uaSucaEUGq3|KG8_WNbw?xPB_D*CB<~~h0&k03Le~lU@usoVD~o9qlK_SJKKT1 zL;wdG7uC6+AP3*01K}~$Ql=8~zMPK3??RTNHX6IS8C0Nx8gdTCi!VzvoJV;(--yXN z4jW_{8r)CbHdTu}G7xiRrIt73(I2>^6FdkP?{pK#V0+@ip}{d|j3yD3&Xr#?4#msk z?KhPVCNF+%#}s+G`8fC7HqN`|iu7N${b|qFQR%FX6Hy0~0Xj=~81lzh7!o`u^ev7B zQd+d?tagDXt-~&qFPArh*Vn2>tix-|W_gDD(+C?zre;)O$CC&G)F4@8Xf8Wt0C>-E zRA~1G*6#)=FVrWoG}R9AguaHn_)cf51sLG|j9+cmDGrj<&CTPO6Gkv^!RZOWUE1@; z%rze^f-wS&DC!Eit}KMs=@R(m4@!z*1b5X(xD$TnDm^ST7N~AG9%W?kJD+8%#-%AU zo!#9Ur=eHKnQ_vO%5sO2FOV}iXB!`D|k$60O7N8%CqE9}Y_cIA)LeRSEk2!dK4 z6-nXX(+;#;g&d!n(P8{S2#VQheAo35U7B$ri2T;dlmGAUrI0Fpc_Ss9MvMfvBXkhn zJqwr&C=b-t8&-5aOI=I51uAGlY%yBP$g<36nNq8c+^j$2C*LsxQ-utH04`bmH-N`S z@Q@F*<`Z5K6aehVESE{CZ(=1zT}OtKk0i!ubWDzQDei-8tOR+J2wxgTB{5#_oOU|A z;l~fjA=;DIwLw8Dj(J-ig8g)sJhnEpsAJ;8PZB>bkwdEG+CqoKuNK|%G#1jIaa0w( zY&(8)IC>~MMhl|+xFzSosiy#(80*x4E$0KLa`u{6!v{=k%a36pjH;IEMtG!*j4OBP zKpZ?bXkP~tIuA^$AHdVbQIJT95vQM=<8Jm1MK2n$-r~UtMK{zM&_+{jaj+<_!4*1; zm@o-juVD<)#g?bW(A-Jq%`F_Z($VTEye zw>i}DM)9<9<~`JpB;U)xPzPulDMDB&cM0|Y`2;b9b<~H9i50UhKS>Uby+gox+V#m% zv+$L6;!q!*e&QsEN&4$A^tGg{$hmRERB&(B@8sIP(#8 zL|3Z(JD!iAWTEKE=MIxVHle*EDmE%!w)46~pE=~=x_9%RL-i=h5^hKJ)cn5=mfxZj z^byD(sUPtvxyD4=`?x?VdH3;s+jO>UwO9jzkQ~fC^y2fY(nj6aSzxXK6QFbjLYyAd z1VEn_C=slUd4MH&m%#C(0GLdm{d;2ag;GpVc<_v+%_^}ko%g{%_9YWC5$kUxJ<-UT|wgLHp^azFI6$%9EMh;F1Prz@SXjLHo_|&@Si9))-ukb2R=8qlqplxY569N(2 z?f9gzopjTL^h*BmJNwe&+XvOL z@d_G3?+8%b07~44<`!PDR(wC{OM1?C02!@Y4p$f*Y6rzkiVhQ(SP84beIchOluVYz zm`EWQy5>W0_df7pz$d&=N>eFkHe{!FT(SqZpOiYWxcjnU%F9KeAEqdc2Gh-luukGY z_uau{jNSy!aWwAE!*CI@Y|oa5jub-*uxUwG~g-OHsV67 z%8x51g3zzn_<6Dg&_vA)Lzf|_{wa^XWM(~+_3(dp1v(h@xv4#7#xA0&`*WG( zf`tm6F)r{L`;TxWUw4(5NaXA7gx}^(+jxogiKy74Gwj-6zNnEG7x7G%SqEBNfOERQ z!1DKTL-eS!lTbF{@xo zhtrQt^LQ%k{^s$|H4sq@C}k1H6cAtC0YsfW0jK@Of$~Ai0Ovs>@cfM9y#&#TBang@ z*xs?8PfEoou2!Vm(UKE9FBQc;f)8pIaYc3a z+gr|-sPAQHdp!Z`_U|lWAy6{_oL;DVNHtw>U5Ue4Z#? zIvF-#K1M6V!^^XPE)E@-Y-<+^8uS4gcNnmVNC+$YuRy%vTtf`+hhIJGL_GM4!hKLT zO-G{(_8G^ocpw$>#vWgm!s<^Iz<$cLZ6^dQ05f@bt@RS0MMgK^Fh*^Kqnwd~(I=$m?8l6Vu9>OTrsaS#Y5 z)J{JQNkP+WcKDpI;~Ou_#X9o;(*m50GBiX`Xdl^w2@Yy0^HKpMagYpjU-XTAJPm>Z zk5ZNdlCBTE}E`}rbs>0)StrGt06v?6qan==Kfps--e|;>$S=4}- z%UJi@&*NLWa?H@+uO6a9_koQC^|G613!mJD8wgDCAcRc_fmANTka8H2cypLQf*e59 z5dv}LCIfqaXy+ha7ka7`67EpQ@#0?$!)!um2JLV^Fv z_ZlPKS`HKB6dt)22c(xTLs&0sQ`naTq`&x`1-Rr+4{$dwXzf`Q=Yd7&WjJW|jk7u9 zlz?oZ`0;?FgaAO>FsSghXgjMrqVj&{G1t1Q?`(%aAM5Q;+Ix@x=t|+SytI=<_KF@WfLb zs8f1(K~*C&LJt@XcGn)p*){5*qZX3Ecs+1@`HKbQ{U7mU0H}u!kVO)K(`W(bJ@Cv}J_O;z@R?ZYu*d;p1%#De4*v4#dNTHji&UtO zbPZne(z0`J!*kxqPBi{sQaehmh^j1A*C>_tUC_8atm1i$G8y4DFc{KRKSN@ zBG^+51ci_$Ian9?libVoNWVig5ErvXv)|73Xm&5VrWVN0S2@^7y-tO7|Esu7z4sBy zj)jd>=H$`ys8Ewz70^_fGB7f4cnA5^YK5f}gLO0UX8j>~c(Z{>?&cTfDq!80N)B|p z0n!kZ9lUZM=>7rINI`mHj09#q-~^n8^uTe$gb?1xgq}j0TVBlpx83wXHe9YJy1=5+ z4`~vEEkJ_LJ`Aa<(ze|CdOPp>yH^>g#d2)fcD^M{_MR|U{2>P*@5me$V*>J{K^5U} zLx9-x#KeW*zuHB&TR+{HcyWXdtQ#KpoEtFL(IB?IH0gA91F8nVYq!h{^sl5rPNd;T zARhQAiMqS(@(vnT@9D#i92Vn?dJ<*te|YfW)+W_~K(@9fv8rIHmkCVPp`mdac#4*( z*nmSqq9t%)XZT|LNjN&Wdp~7A32Cbw+!+_}Bm(iA*6lz*;TtUIh%p596dfA1uS5+R z3}%@Ju4hM!@9J_#CY*h#7PK-rnn)wdE7;o|>?2-ZD;^PDOWD9au8~?lMwdhp3_;xu z?yt*!sjmLW6kfT-VjdY2qfE_&XjmOB^uztN>oFGM`H~R$mIH(a)&V*ntpA;`iGbdm z27#qiF`W!y?T4^V=L(?JYS2yizd?sS_v@xW2&-Biojub~Qk^0DH0VG47ds7`m#sT3 zYrw_P^kY&DWjN(eAQGC=?y-OTbkZe+c$qucQ^947Pt7<=TL*!6$vRrtln)%}>W73d z-NdOQK-dkS;D2L4vrTZJcJG+Lx-$f@96^xNaADW&SQB{PVWpzcfuYdmTYbm0v2hAP-1Bl%3ddBDAVy?{BKLK6=tJ?c(8G_T_qBl7Z9cFraaX zvLvvIMl>k4E4HcDtvtN>4*+XZBtR%^WLklBPatdn{K^D8Ar^kc>~GrFUvxq1N03O< zfBhoq|Izf7VNrI`+DJD;i{#KP-8l%-Ez;86(jYm2^pMis-Q5UCr*tDFE#2pN&-Wd! ziy!b~&+NU|UcK&nR?;pMuZen8u6hvHz5)Bz_cRv;+$okcdUm^K{gT2jehxpnS^Q<~ z@{#xHr29B?!*)fRXlUR3KxF)gtNpmD%FigaC&J#uR92gzh)*d^HW$08AcmM88RP!+K5XcDh*5AR{fMrq6;!dyV{$z}DK60%l(mDsr(A1#X}c9*6I3-`Rp zKFL02Bb`bj_|@Q%)L7_*tK!nIt5X%sHp{*7Ykl?gd8B)}(6lGZo+%UdZW*|SlfL^R z7mP)_T13kNW&*rDKs143ksT5^&Jh3z0sw73DKQP!-@~&;=>335>vTz&@`K{l5Fve% z>b!w>*hAO)1f~V0OEq-!M`PY==I+GjM0IN_Z|2|oNSj*9AcHgOu+GKUdvGW>I_^Cw z{kt@O?;_Sf`kzq>$J6~#tct$U_8{r9KdY` zC@7ivTkui^J3p#Z(TZY0)Xf3hrX2}cu0K3L7l&d?2vtFqRj(5$J|3VxqF=SFwR)iq z)&4b-D)c9|MzcywrUX?>E%_4@G=kMv6X3l(J$N1}08Z0WX0Cie&T@~!_WTKm-L8NG z(?x|)0}N4GQNV}N0-Dq%M~NNvFd!J_O5jBt2pfws@fAjuTO)y**`a_N{Yw9yExB6! ztq^1m4dBt!`=jp8iOBr1q{P`H&G>hFM5qipJ!|eWUV^&?g_x`!n62-t!C8*c-ofeU zGeY`&Hu-)qOhC69%=sSZn)*u#gzBS`vSo;nye`u;?fm2b7=U325P0q;fer;w(el3m z`XL$EB4^H|?K9Gvl~GC9p@^=87k&W6$I1^SjOGT~kP_5rkwNq%_e4`&XtO%*%*2@9 zGQTv+z)CZu@A*_UIY}01@%cA9=zo|sfi!bZRUidZBee$MEs;PI^~FB{bmTxgh``QO zI8}i~eR;um*ApP_pbm!B;A@aeWN$r?(6nG;V5bg)I9N0_T|y#CZi_q!j0->>G~CtP zUl(%Q8ZV>Vuig$!gGzxVo*9B+GB`E0$O}mnIH|L;!Hli{q$-BrL8f@ku3?9vVQ;aChCLm82ddC!Nw*^+gW%d8g@4UQWCO( zTU4~N$(tXi0Iu6e-~l53_udT$y{|3JrAkWZAkyXgB*K7QQ z%{T8eYCAFao9KdJ?~tfy1y41Fv;Z1PA3OX3newh5@L)+3tgq9>lCn;^MuzzR4HpE# zn9;@}SI}EkIpq}2AT8k80&{3YNk!hi=AjF!4_(yJKn!Fuaw@geAB6O_I)8QtU}gFP z@QDHNq=H#$>G&vMHwR?f4II%0tSZZOUsr)_m4_~Twr{~efB*r-XCXjr0G$hSM&Ef7 z6~%$hDLya{P!(Xt0o`F&-8SZZ-%=wd$z~wZ12z{x`ks&kGG1a!mabI%s427>^gLA( z97pZEJQx{s3K;Lauwm#fl|W%>@wa({jxfZeQFieX1DA*x|8Ig zZt@V-zO`I;!w1htd=(3iU?T-=2*-=g4BzFycrWva7#vk z^pQRM)$y%8B4#4bl`Z*>Zx$hxb31frJyTO%d|_%^UP-s(jSb=YQvV<<-p-5!K8$?> zzR%KV7i>LbgDiBOe~jTi5FYKqA6I^gl=S7yKEx}6gIxIhMCpv81w=QB(N%(wWJx>tz zskbll;hQ}6$q67;^+1vmc-XXdNSA9HsCbq@N?a}&2DqYSv>d2N=PnBx2@!<20bJK&DWRfNBrvXnEnS|-CBW8eFN@r-JEL^? z$o*jbCyZF(cKLRX;p&0kuqy0w*91>seEB+O=`b2dO7>MT<_UiiSwDq`Z~+%DN(ub{ z~DGeqwii0%7e`V}1-I4(WAuRkH5|0!F%3 zYi)pIY8TLP2#~x>^n(DPV<8>|qF(nPmi0w-AV7=7@j0`&aQ1^ev!E`c`j11KHWV4I8bI&j(r~9$^s%s{meT2#_%WrpcI8P{5Md&*jW0?YgPge=X%o zeqra?&&zY1$MhRrr%|ib^FG;UHZJa1#=2S1f@a>xjmiUBL8!5%s%Rk?SyYt09p^fx#+tu$g-0PghV zSy9t@pE+o`@j2l_NLPs0Q7nah?c&(P#D}G`yJ1Jv@!-Q{5BbeQu&xSFIXmeUrvpNp zy+GI%uuwbPJCQFvc#5WIP=fB}C8qS?LYh?Tj9ybg__CHZNS%2gzyh|q#8avv zq-xCdnnDIxf$0h?$)E-G9khTk2h^oDO7xyM%}RCj+U~=j<;&HcS^dfEklFOWX5Ejc zJvdb=viW?C#0j`a;57muXD_`mWRcKeeXj#(;uir)0~>PGG|zh+U+_3}SOsmT8otK?@~icTO}yJ6 zCj@AL1MNKUm0UAzYbs4Z>hZulGy;=+WJ8md5>;8_W8rzV?@Lc?rXr6N;qx^S-wHUX z5-HQ8Kubc@CCiFD?ONTEK4g9c2}&S-`TCetS$#R>z7Jj8vLjlS5ultWQadrj{X!%R zl!tx+tq>pJ!Qk&vUNCe?*^*K~=O9zUYoScph&nv~YCkqAA*OlXX7pjv;WfMS(npDQ zboA?PKHWG2IMMmYQzF!7$F#j=DGs&CsB6ENI&20Aix6)_g zStoh$h0~tmH1`Y79*PqAY3qK*+3gNo0d>T83%1}?m_${_Vd0M_VmS3|sf zv?UYAVwScgbKPSfN3;oZ)&Ozbro53A1>EXqN{VV-nvTZ@I3AzSAQ1AdTuEjGu%I+3 zo<>5J)wmL;Gy1&%nhKeNd7nj)VU{h$#49{Q3=$fu7I@kx-IQgqm^?Nc|NI#Zo$0Nv zN+4`i9TaaD$)4W7vSc)K7`woXc62HIdST7wO-8q)_P9q6M073y#KXqtbyYwucrc(I z3MEq&r~;qq69}t7T^J-r!F;o|xpN4`A-tX|(J4vIk^MyRA)xa7ygtq-L<|9fhyAv3 zbolwi+>zsGa`0q0GdcL$nj>SJvN*W-$o&#@9F@G}fh^8Q(-WwZ?WN58X2!MXqNC5pwCg`&!-8`E;Ik-05FXjL8NIiT- z+Yy=GKTz`-_}0xqFke9z%Vc6C0MN?=s!tC6Ne`+$eJ_DdMa$rl*d0(0KpnAg@O6p3 zSR`s08hUt{e2o5-5tsi2%H_eJ#_0?~TP$)4R-_IgFnNI+p0?R=P2+8(-ut2)Up#$h z%$ac$=JCU0c1Z2DX@xt!W^GKNe-R+}Jnzwy_xQ0dAzK9x<{gogt%2{47(f3iAsYig zY~of$JN`~ZOUxmLp-$bK?HeFE=6v=ksUb9Rj`t)$=W*ET2_X;ys;hrjCu9uJ!_T{x z3|2V?rk|grUM((i6a0_&oV!|dRQ&SWO19pi>_8kZi z)e*sRqE*3su{ZEmJ9%wpPY$NJLQ!XWUrvnk(y87+&J6w6t zjL$dGc5gbDF(466Zu_sUQ3no;t9~xAvwP16!i#XS$FsP@$C*kHE$n1^?jvaCH(;n|_m*$75x@q!N;cAB2=|BJKyhSNCzGaLr$L1@y zi~o%($`pA|xfgqxUN9@Ci@88m$6@abQt#Cx7M&^(pCbar=lpCrJD>zfIX+EOWzs zx&G1c@#Vth#);oI<>uis{K#;9ZB2D?5?bJW$*!<)5H}z~?Je2Vsp6;(S z_e09=c~=f&Ahk>M%0LJc0D~9imT$s-P3xSnd%1G?)xRp0<;Fu0)$ z*P0rq2OhPwO&s_Iyt-X$z}#d2u}DQQ>^p#c1RMZ1NL<04?z={>aDu|;T%F#(e9Tkc zP;2*wM!cI&&Z;EYOSR){4$#cFm568A51BS^WaytWM6dx+r+b1&9bQ6${BshPK>;rj zz9mID8uN_nSHheo9vH?;b*e<1;pSPsb*Y4k9=&ewJn*{+Wa;zGJ~aJ81d3`F z#6lg z-{)}m56vc05-AUdZ(A**?|cYHYgzF&4*1chjRL-J=wbnMh;^9xNR>zVr%AvUU#%^w z#fL(nXOr;Y=Mg{4-R-C2gWoDQf;G-PcOfbjG>R=fahE7T1{m_YKMhB;OPxD7X4S>2 z_$6cyCuql5)aPY?({_@q;49s?rc?q)6;6`|MSaordIO~B7Xhky@Ca5bZkWC#3ht@O z@`g$M)Zm+)kB~(WOdX-Jc$HP;zAKCY{r9|lN~b;C^7>m=b}>NnWqFeMg;e7E4D^!snBT?>F*C**L%}w&rK@HwXR@JWyzutedh}SAFS6qEpU$iNa zL(<)h0Q~^J_FXjqHiq^y?m>z8zhjtE$kk!~>yu*N=F0R^iR#=^s^T;M3f{G;b zVm^VM1VF?2t@K|L^Zl68;6AU`S{^Mr>iYc!<@eu4wHb>!+`G+9Zb?~zK#nvH%fBeu zD?>elV46QxoxeoXM2Z9E0T?V-%)yyNFUZdfoX`qY0RJo78Zb2GgBjG^1f9GzA2(W9 z>isIKKLbibH4xT;1>_JAzWjKc$}Z3Lv7kgC4P*WI)l;HR!A2gDI}x&K z^|eQD5**!4|3J`}i*i2nQaEF6T__=Zcswk2uuOin=`KYTpG z6?uVJdw;JvPC+*DRe@qh6tbf;(MDC|-UV@(~+FE(6;Q-I|KE* z8KDFKShD!E5k6mqG3G?WXs0HVB=#Vk4$+qt^7Vuyhp~oRD%@(w$={Q6MFK3X0l48G zhJAr-ivfB?g9!2GLFd%k!c({BR&B3_=KE3tX)0^)m%pCf2&r&|yNmNgH z6a1`E>#2)ds>E$2Izc0g3foheGwnI~uBU$mfNko&Q?Rw(19a6teawbfT04}-C9;ZQ zW%cAzCSz)SR!(D#z105mKS`OYi=Lbp^$cMF6yBdXe$Y(+K`jkS5CHHhU6>M3I~eP~ zZ)cJeO6pcc(&Zxq$-T+6b#G%94xnt7X0B7q{G9KLALb^YBA)-V0Uw?8eK~jkw6{qm zA`yfp&rEXFDKtD4r1xgNfFm_wEe%nK8-TjfcQ|$|)`?_dn2Lj!iSXv;dBycl*@(Y^ zFvyi0O4O8w{9i8sj{b&L?VgTDMW@KX062+fCF(lP3dzl+On8I>gw?!Nh5n|R(5%rWW?gmx!Ixa5aS)B0dZ}y@X$#8W&$=< z5b57JyTD4PIcg@My`4g!Cz?&6+VSXE_dDzg4aq0-oxSRZuiPN@YFL1(J_V)0+cS#8 z+m3olJ{Q=x4;24@z2Vr+YmhNQBC-({s&aP+Ap%=!zzR)o26gr4xU^_P`^2S&X}I`v zeD9p_y|H8n*N%z!b7jhmr-1;8ltYh7v|X3P?)32RVX987&22}19hv4rH~#a3m0Kqt zc2-E-qI=QEEIdv}iYZ2%24WCHQ1U979vEASuL8C8%vegbUgsTOy}gcXkc9ZA*71YR zn1;T|HRE(bP2QY8gEx`k0o|T-p~$oJp-zj~a*gvM)oLHS;I!{;{K`Omvf|J8!N^V2 z?tC?b`m$S=y}p=3vu?gQL?o2 z-T&T-^#RUA2l~EO=3V#zpR1wEAoFex1nc{zT;yhEsuF0XZ0wHXRpuK+G6;4c_tyD8 z$8WNEc(c*gc-J$VwjzTd;r#X3V9jAg2oD7YK*YHj*C`Kv%$w&UI-97L^t&`_Nx^@e(-d?`$M+IDif zQjd?JZJ3<{%fYn4gQWbotwfW_!^5{N(FTa@DBdXBO}o;Jhm6;|TTj%%v`Q;v zMXfky$iFo2yqyU0(5$tM2$7}O>w5J%2cb`q*|Yri(#ZrN5$H3pir|>+W&gl>;`Hv- zm7%tb)0nlZHio@*TCh%>I=y)pTHrU$tVtmtyvtKrpwdYvm~L>p;!k*g073YR2EP6x zI`you4<_hWv5P=L0oH>~%(GIA3F7;GdQ0N8Bi-?XhAS%NgmCQBxEAi@jf}^T_1{LG zZ;l$X#&MvpW-L4z3y1baYt3gH-Q=-SucM$Ma{5u362VK$+vhjLuEyLA9>l0y1Q=ca zHs{^BkYx~G4ZHCq8Q(QTCEi2L+FLud<+&=K1pgjbH2bo>6^{zb)VVm(UqTmcn!m-^ zXtemEk#DgA9i7Y;=K~k43AEOpqew8$;jt&X;<4a3*ze2K5e4}>6ftii4KPuT^%pJ~ z_EIGI96t9TAvQ#|wKr<)u+QNrs9Bk_U|Rc$>wpVtJyx>Bb3yT>Pkx?TsFv^pZ;%!o zZ|?{&iO=iNUxNlpTj%VS9Bh&f!`QRm zJi1_7xS`j7eYjG^+EYm=#P7^Bk(c05b}1meOK3(rb5Z=&I-GjQymbb405sExMR|wo z9Ghx?Z)bhkQl#C06;dqb#?s;d6y_(ToAP4x)^-)t>VLDNr#pjY$cW2;nZ`utJKb)C zQTsN=33mv-KCl<8LUT0xQqDq(`M%!8!n+B z^#yYHiK&fl|3|3|Ki~d%W#8RE8dPcRKIhG?b#%XA+PYH|np_yMHd?E1o>e;a(4ZYd zH0i&)s;{Av!uk0obZM+QFMWRG=-?9(aDm3kxe{thzA5M3Nbr#-TWb-92$|s&7BuUT zs5mhly(1Gnn@Ndfza<4@(9Tn>B_(y8?^hQ58@3k??C*g3eJu!qA%8@*ei5vUn%8dE0>W(w~+Ttiv%z&anIeN&>gBnhKs1 zc3eo>tKvXk>p%2uy;L3|giN#SV<@~q@6dZ3h&^Uu3DN`XLTys9IPL^0%5-+bR^EhV ze&o;@mrDhOxtD{~yV1a+;)!hD9~88em_Fq7B}~-gMsOS*+(594^sV*0SfxQ8RYN_ zeXgDa$ww6SExBw}?lU{${SQlY$znC( z*Z?wuSBv!g^+lZ777p8T@(90#@g^k=(H~8unuG^vU?vzY^OnPfiGkMV;`9roFa>GG zQzvzLeouLq5yduVv`{)srT-}t-?lHau$Zv521MURoejiDlt^dC5JnQ%rkR6U(# zy>stbTBRC5hwxiqIzhxfe*5ieL}vx z5PbMOrgKR}7Y*eaJ3a`fU5Quk{q@b-xvT#Lx31hla>W!G2QwTsWS=mAYx%#>q=e zI!RagPM^8v74u-_atP3Fg4+&%8f{V9axzp#d!~^!wF9ctf zp8cFlIC|f5#0Lx7hbLY6gS~?tt%b@l(~IOA2K6`^9WVLRsTwq| zE5DoKeJw6r*lB1zz2o~X@ttfe)RGXGqPWG5#tK$g@W0VDaajp`dw0YGn|&Grr`(eG zbqNy0Q*s9Fhve%g5ma9_JU^liyN*-$Gdv@cX-O_Nm=kM|H^Uzt|FH&}juX^Qwcs=kN{x28;mnn03GAA_06!V@q3 zL{$5F8x`yp99Q-E{_yVK9m>M?$T;q~Nv$(>;m)VrfOi;u@gHzSqTbHl!5@HaS(N{;bsCy!C^of zylcaX#K?$>3zvWipSCXCNyYT+^#-kT=Gf~zjgjjTv`UH-nk`iMljmS zCg4Ohv4J9rIC;@rKIA866fv5DW7rP%XenuRB{Qb664K&*Bo+2!ciD53QpV^&vo($i z<>T7E3eKkriN~+XZ|~Kj1;Byb+~ScT18XF6p&70aL&NW?zYah#kH+)_^fA5W3}f!5 zL;5{_-&GqtzvfR*99M5**cJcaNt+2Z2vu!yOcbH;P^riOWiG1Ma!n+2|F-*lwpx>S zj&1InG(F|=Rh*0H=M>WmVoqj_tTdw$EYZ0D-#5cgUG^z!N3za+LD(!#VbJa~|EsDN zo}MXYzd9WZUo_jdV;C&Qkoe_c+;h`Tukwz)(wy;I>a zbr;r_Y$4ikxa`}dTf%TuBz@f6zlstKy_0FuyNYJ5rFQ(y=c@l^)*M{^i1jC6Co+HN zcZ~|D3&l!u3I$1rpQ^%!X#fPP?|gq7lyNR8=~IgYR>oP~83jL+dY#xg;WDBsh`{nt zIs9;|ekT}pGJFfH=j@Y~;(vcrJPkK30}rVk&ugOH&}y>#{C8Z{$KTMOu1QEULp#^# z>ZAO2YR;);cA^N8Tgy^6VL_qZa8{tIlUL9+yIxcI+e)de0SeqbUxp5j8LzDjZ3erZ z8zjN??Y-$=N~kB1bal9g8|k0_{R^cC9+fp|Iugzmc|IjHGMjDy*_LlN{s?2>$k-iz zPx%HiO?!Ix!;*?%AY8G%uoj)Wj~zO3$XyW^&Ed5^hp}+#!PU|Z1{;?z<2m1!~3 z&gfp2F1A!zyBK&(c9ORl0tlF%ci70)og3j++*NT{jkc^en&YKPx_Rd-&6we(NUoom zy%L9&Q=(LP&WY?AblyBNHo5VGzQr;XD$mJFa^gbh9Z^ork? zr?~4?O}hEUFCxC~DcHiC?)IwRwb%T?r3v{9Y3Q0>_!}JfQ2pJgm2ItrC{@)w$AWbN z;zx}hYiaE3%xZi?!}5Y(7MA#TVlknLl0`%j?k!cGIIKID8tH4rkCxcgLS&o*^^83P7W%h={QKbnYb8Z0pgPv^wviY-)*iog^N!=KQj?kAw4DFFVx52&+`MEHGhiy8&O`=>|!~4*B!l zg=OMd`;KiQej66~Z7?adKcdo?6E$AY`0^#QJcn%b=mLAog>o46D4|z zS`m7O4G9+o%UZUQk#U1IW=EQDLjJ~R;^|rV9rS0FMN^m0^s;#K1~q^ zW2&gFm&z{%7JNG_H)c^VN5`2dNm~)O$Udv)?+!S+zda7u6cx^j{L8z3DWPyNM_aH`Eys z@d1=ZpqcAdOMD7D##vL-V*?MB1*lG(%sih4wIUIkxYWb*7y@ z^zZ?~Qcci4F!erXY!>+k-LsOY-{5jXk)HAEuQPT226*F!%Il(b5m7D1uHy&EEXrVt zhqqVf-x+E-6B)?2CA;-AIf9QvncZn(Dd{5CHqR8{$^XrE5%R8rscSa)VA}kSO?@4=93POZ&#mG9MwadAHwAp>@<@5+~ybclK!&RP6dN!h$dJO`=1#3P?}@G5%* zl;k=dY& z5!jNWa4&K9>#->raM)C!YmajV`R&H9SsA#DJ22;Ngnco(N?TVz3&3j1V0LfSv{M65 z&>)FDrcb?m`1}43ITk5fkse&dU}}F>X8wE7va03%!jlO6+Yn-yg`Ba&DIVz=@A6`}W zWT$7{SrK;ipm4K5K}J(LL@v!}RlUN3Qd3%0k{D9)0S6b7y?`~<$hAMB$1?N{IHf&r z{frT`$jrXYHhhd(_K!DaO!jyOqDI zIeE>UxSu2=Uv?X)A6^}R!;MS)6)X!}j6q$ACIKO{MSKwmN6}B&Bl6PY-{50CYt9FHENyH; zA!O1DYW=tEzb4&jp6(cJNClC}x$r&y;!E<7=6yF2TC4Wp!qP8teveX=pS9x0Rz|3L z)Z0;<2|?)?F|pg(u1Ru#$+;py_L4Gq>hdG+eY@byi4x~8fV(y~>=hTlMgMuU{Qw1o zfj9Z9YE9%CC~{4edMO%Nw1$|_X7J^cQPZvNT+7)fZNw5a<|}#nllmCd4QB>v${Teiu zqRZ?YDeKwzR;9>EiGJt8Hy6#4eRim=yTRyBbUf9_d9)e-_-P#s`CT1hz!ADx=Z}h| z=!~Bw#e5mZ^h5t%{Zwv_KH|LFIBmnKBIaz1pYFNU`PhPPpD9otG%=q(Z&7*l*_54P zUT4?&AWS7c?$yW6IIG{jU9z;tj6LSuh8n_>QA%9>1d(?V>i?26F#L9hx>B+<@t3&U z+l~Nn{R~<6{M`Z9eWmm@)r7SveSWmX<02SHYgh}OtW+uaY>THhDfh34fI^=iY+1?? z;Y+_t#uY4ej!4;Nonwi)KV~$6iIJ@9aV0=i93qC8qM)*tgJoJWvL!;Y`oQ8MiV{Z zjB6L4Lv^xdh#hyo;8)fqM0afQm?$DELN{ec>U9%Tx$)ql9y%WO6(T1#nH{XLnq*_^ zb8IB~#N~Z+bF%Vk*q^=5IN#^gE@v!LX2eKR_L6WMdY-nXsc2r^Va%^zOWH~q^2mvr zuPqYzSFDC~b)rwcXISO2TAGfs7@f;QhA4LRecAm*8;LOY6^Ox5!?Af^^Ae7H7|VN= zA9=obIbSt=k%j@lke;6K>H%vq{(;5svIArUAK(R2m5JOSC5MNU@{!Dp6GYUTr4n~T z#VW6RaeovB){PMnv5_y@gxDI*S~jT zr`WZ=7l|W(Vi)#q7m*{BY~aKhK&ZAJ4675o$1+y91E~H(2e%J*v)TTB573|v&n0ty zmp>*^uR-$aBiCJc5c)Z3+IF={7ov7+TC`r+tVK_Lzk?Aju1d?<{Fd5mOq)6Dd;4hY z!1Vm$mbdTPMjw=$1C(3m7=j)0g#YP@3A3&BA!ZL~jp&UAQrzls z(Rc$6sCct&qUl;(9)+%N5UyoS*(XL~7bxS#I=VdHH0wkSC6*2fz~>WnY@V?%zzXxU zOSb6E>qub?tnh{CkuEUwdAMN*t8s@Cigxv5nc_L*_9fe+bI-R()AOal_MOb3G*0+o zK~^hQCaX7a?gOGpz7~E*=UStGe*trN12*h}JrTxgJ2D1DJy6xJqb5R`8o8nqtnM^o znt(g_k+Fne>ta~kP`}(}3(5D{#JyRtvxE7Unc`e1EFPyEr|qmrn-yw8pCH}u@OM5S zXew>%*L)LEd++>L`ZdQ*PIL)*zV^U4rr){slk;279R_8>#Kfem@eXLv(=~8tUzM6I zj=daL`gQ>YcbvQV2gFxKoA>Z2Ei7h6yBJ%F-Fwt~|7^1UvrDIHgf_8qXBxzduK6d5Xw0YSMz-5^^=fM^m zEcm_H8%yD{QD@D6tbr88ljI0x{Yh?eEc<8dCXaf`0?4 zf0G1-)u=m&ZjGDEZ};oVS?0EF1Zfh=XLr|Zu9XM)y}LTdXAdm|hum_;9SZJB(5KVZ zWItkww}aW-r7+$5flXp7M!NefUS_$E&50^U$tPP3RHl|LifswFYBAzhaMs3;}C}9mIA1(3hm&<(3Oy229~%`VioTYOtF{sm^ZvUL=9tNXC`a0M zFnv4N4MU(Plkl>Z)TWNq{4~~->e1l1nLT?5nI}Rx(mk`lY0(U3>`zyxk-KOBjcZPh z^QJaDf5JHVNZ}a**~Y#9*SCu3NFRaPGaatextTN~@oARNVF<1n_VoM0w%&B_`l9=% z68#zfK8Ew`^r5(bw*xrNHVowF=tMmEnV~_ z7K!Zqfl1$KuBgint+yptX|$QtQpsln4xw2grZi(eI$!-%_ZM5jZO86F%5C4y)(oZM z$o6qI@-J(?EqZIpzwRxDmHB^ACYJ-ToLIL#sSa5)5^)^@rLW$ZxyRID0ILyWQP7lg zEo!IYuW@ZI6h88aL^xa~sut!zLKUCU%GbLIm54;yB{v{>lPJi;WF?1oceU=j?z3^m zMUSC=_eq&r*E=Tq8pY|iLw>3M5Xk3^7RwX$l#Tn&{INwr*p`{?jG1g_o>e(9;qjo` z*kUxngtLu%K8D`oy-&)k@RP+!=qlXO#Js=DKu#tz<=Sz0bAjpX-0a-5w{I@Js$=G+&RO z7RY6-{KtdH#L_W9%`Dq>6)6%e)n){R&7rYSM2cZc6&Af$PkTUiddjP#GgCW8wo;2C zYLBaBG#-;Bf8txh(mb}%tS2QLX?hS-`^wKXHht-ELwVfo3D)BM;GYv*!ATRH^?$tp z4##X6u0P7gFP9}BUvc;qMykO7*hyZW*`Lk6T~iQwEXQ0qF53@Jj|=W3MmK0QEg9k+ z4=Nh)E1BeU;iJ3Xw;|_SzUOVP-Daka+r89|`u9tLSbFob9SQ5dpm>pMjK0YXsJZh1 zdgPwkhh#$;ydi~etiejDdbF(SU-|0{bTC*V3%p>Mvdudio~-?`nKqM-7Aw5v(i{fs3kYPM#?zpv`{Wb2M#4`qw0wJ%KM z7{tr2qt;P>{~dku;_??f;pmJsg<5hX73Q7Jv~C?Mqg>W3=u<`A6>!cBFS+x3PU!V6mz0Rif_iNr(8~ zniijL5UL+*>B>t_xsO|R^Q)7h?VdE0GUEVbEPxQB<{f`5v#VKvTsx$ztwjG>4>1&9 zHn{-Bu}o-pVfKH3uY(CpugOW4X`nD`V=O{#2){ zI#I4ro~m+T@bepgsSH;wC`&-GR9)z>{5f5_5a2qxB3^fJ3@cbE#13)Ndq*0BI+Y%| zWIpM3^UkIt*Ck9(*qo-2pl#S8z=FTZm_LTBqH2E}YQsM`qY#ZkgIfQcO*XubnL%>! zAH1Gmt+Gw_GLoFHoMxiKBS6Avv=$dR{blMs! z4(Yh@2Z#@Bt>lu+stvz?TBzMiX8gsy=x9~`t;iqFMnTH2z7KiCEys=e=>9%o+x#gO zqWwo_Ia*|diWlQ2L!;}q?#^8j7xNcgvm`91{gsM%A7YM`0=>pd6|cU$S{YybT}@qP{_m7bq#I95G&L^%GCE z?fua204iG`6<&;XVIaC21cZqvxpSuWLGprlA6LxKlHc3Irb6BTv3m`9Cr({j-oO@--`Bbg;t!8QN{8oNdG)t70{@*b8~d!&h?w{aUN9GWp$4D&gcWsaD(g1$ zfZ?LkNN9xL0bkI?d&HHc=t{&}=L2o)ztK*8+LF?<)aZC^jBI|k5R-*UE0F5D#aw)t zIV_G9lN$1G08iE(0WP-JX9{EhM0%xsg~GK&Ec6>xx8I0%q`%dUIFGy+T6AiOgAC!+kXi<>RVYV1 zT}IP=AmZ>OZO7#*-B7Rh7x3(G&@^a45Bt7jY93fCzPf(lh!ZkGu`@kAEvZK%Wt1r{ zOmH&lAYh)|-R^sk_T29jz*;^~db+EJc$c)=Lt%I|D|Ex4m>9aZt&f213_x zH$5FuA3+o-B5I*#Q5Y3!_-hhYNW6S;MmOE);zGkuUWo=dR@$_ZS&)c#bT?e0J z3CX~ef6#t}>~q|@g60?gh&2JdC8e)J3bpCAV)rA=x9L_KSt64Ba+9mBemDII;|oGw zA7U>iu?LpB^W8n;&=-g)DKQ~T>vO8!I;BWHbg>xsAX64i^3x&>zA5(iX=^#i?P@Lk zbLD_$Sr6jWO2NB#QEKTKh5pD9L6C{r9a`s#0Amwnm046*(~I0xInr;prEjS0gC@s) zP~B-X-JnA0`7hWs;|}jme>UAavACP^FGY`Bu(>1X9V0g^Mn{c{yQa5jNS+_fj4Zca zB4vg_)cQGkzWq`GD!o?IVEvUc3u`2qKLR))zDn_Pp5A=(BCZMIYe` zkQt@0GA;U8L;ATsU6-sZeT|C3);XR&`MY$QCtdjc{d8HLwmTy%MP?tR&z6FdKjHTF zHlh69*M%Epc9>vsVfLt1#2r1Kl=d;-X~02o1;UGy^fn`o&pk0O#*CkaZTM{QFGG$X zQh%HoKU)}SJ!|1&wEFU$smVpl*Wu@*uAh1{`2C$>d8$O+DvUxNtx}v%7+e?FYip>C-0=7m9#6NI?d6YxE!m0}u3W9#TVDK~^Q+Q+ z+&yYEt^M@vI&y>x?!kPEST^;fjq$98z0$nxlJRRL8_|0EyBp2Do{Ppbudkj<-)2)` zoxxjty-dG14%mdkzDe&pH478$k&yOYejLbwT_rt2mhG)+%Y_ZOX0pY6wZDI4Bbr_` z;paNzT}}2J`MTbfS-ltyxC7o>24B>B+aXEz=$PS%>`nGLI9VZinOQ~r&gXkwzw6?!bFS+=$2}kS@+!n>n2-&T~F=3qw%=sp6HiC|zcnP2WUi^Mqa5*~sZGUr|?a^HY zU0jm)5V+A1`iHWkJ^0V@PFO0xM|kyf9-}yZ2l019Sor3`vj1uD;5vKGTX(G4zUQ>r1 zo8-6p`YmwE&5sg|nHI5oS5Z0rI+EG+*9~EdmNWeFy?K1e1uea{M`U!)I$=Bst!scL#c)hxXj3EzpX3L#n2W-$sIh0h?yW_d@lf*fsqmz+m6AE{*DuL z7@xxQ`Bex!$zxS<2P4-2v|C>)PXxZG&ld4AZzGA$Q<;KP=mXirpMI~``#}|hA|LzF ze^S(7D0R-&c=84R?}G6>{I2Tv|LUqf8a8>aFvOls6&}b&n$kgi3=r|CE&O8FeFP{I z@~1xXrb?h#6snn#Nw;0f>@`b^Hgm=D*MVr$?`{kUy+O6oKW2V8wG4b{{BB1=BlQB^ z79{KxM~v~hfng`cuqU;8Iipe7l^A>OuLhhT&n!etTYcB2nN}MwaQWvG+$JjFiQ?rE zQR3)TUoWcNB&+_y=EUHO@52k`Ez7@ZdwQ=8?kf@i=c<3NxPObzwL6Fgz8ba4`YisO zodM8xk)u0Q=Q`3_n5ePF#j6$Gbx1z3rt@rMJ9`4T|8{uk`nkBiTSoYe>aDF|YAG!= z%p^({7!kPnImZzmRs1<7Wy!|Ov)a_5_+_OjkUp0ye-_iImXN+JX;P92A9k%)Yr(Ek zbkB2SytY#GICm?uHsLRSf>P6OzPLI5V9o~q;f!!v|6$lkz_iBAI@llPL4Gi@J=gcl z``7kdoH9eKHh2A>txvKy6b*eti)cw3`yx_Iod13mUwQ96KZdueE%>ux{-&?t*)uK$ zcSX7{Y0aTR5h*7{--@b zZ*jWURsn7NQPczN^%)CeuxU>0Y3OkEyLSyf?yOPIgw37@EsQA$)4eO_yE)LTXSxci zQh2pafQ@_Z{#L5n|AJr2$O+sZR7(G}3q;wb?>#8>l-MO%kxIP3STeP>C=yI6+Owrd zxS@eZ&LB~-gfaJ0?IJlfJvU3!Yz$rP#oSBD6lc(5dc&z%4k$ARw}mt*cMRGUh#*IPldK zco%N>>1~LTYyn|?eM2)cnlV^49;NQ;C z(OkBrQ>xi}t3ky>X4wYh=1-)*4+5TV@z*|wn~2^i)G>tAW_~|#Rq1d;B~Z=#Jtlp( z)|)~Rb}h6ltn8=dPm*562E;!V`X~>v9G=Le+ivD?8yl(4bL|lJA)PKGgL>O3@dx!Kxu(l34?|g@&7~6cya9T#1u}QL(*CQXlWBIIy zH#%YTQOSrx$+KUZ-H!yTUVU$mPChKs_23{2?sA!O2~#{&qwj#npHxl8%zdgeB=+>Z zXQk7X;LNC7nzkP-D|6EJ^SYSrJfFoLp3wr3CM?eGPG<8EjL2o44%6vvk1`nZA4GTB zp|=wBUYIF71kCmoV`S@?dJIMg&ZEf&PLaa&;ZX^W5S6P9MTt7W-;CA4ZgKjohUOI8 zT6{1MaC;dGvuLF?LvEfj_3{!}BVRtrn%+Tmb_J(E68Jk7KjYMImTIVccG3Z$SCy z-DR<|5fd&Yh* z6X!Mvn6~>80CDj#0BSG0AMcPnj?f5kM;}{BPg-r?>D1 z3u(B>2ubg`CF*?FC@8+O+Hcwy$3|>mgu*sf2mu?Wve$8s5eyi&E3y?y~F~)aS{g zTMx6Sg~=0Gm#*bIiISKJ8jiR4>oBvkf5{0IH8im*VB9(P`=kqf%GH9Eh z2fXTz@Jz9&_T|6#{(;W%Yh1=zN`aqHPO_flPt(g?HM;1+XIK(-e6`5ZwyJFh-O)K0 z$Ph-a#8~IR8~F{z+^2MAgnz#;SZRK&-}ZomBu?-Ic*|c-5QtjXc>>g@yMy=4Fp4nd z?aA7w9TpZEe{4EbUp{U-Rn;xk(2*fmI|$s?C+w{J> zg?EKX>;Wd8k_TU?=TT+I2*Y){9F27QA%T_@M#NR^pHKbn*9 zXBd<(+dEEj-mMYM-A-2+2EOHefkpnHsvvwHcvZ$B^stZl7pG_ zOjuIL+j>};`br;hcx-{n$hBwx7wHf_p2Seh=VSdOFiLy`_j4<;+&BV*$YXF&X18_; zd6hCKzd}pO5T%!V$oNC)EU_4_(EI+0us3N`p_aiV7b@DuH`wcO#h0R8;Fg8DenTqd zsq971u;_}+_6O%Mb#|~5SKx=OdoO@?g7?_KC-bvITm{5L+Lvm}(9Ttb9RalQVFpMRXN#x2 zkM>D!Qg)>&?VgZEP;t|BY#ilLX_vY^$givYL0)%N_#_v0D6iibAWc)*(SG`CCcO81 z$P3+@W~_O6Dw;v;OM%tQbvUMqBdusM2u0Y9jSGIM{)mk zd?e4+m5){ZYKY>uo=KE3gyzz`&!r}o}2O+w|D+_a#RFT0trgvn6;tw>m zKYhKjy>^?kFpBav5eK16u*6T@wMU%l@AG+fI&WXcTd93;?Uq6Us<7dEoq?`XtI4aY?ek8N!Y zYTk;UKs|g^_|w+}>G~z2x5xZ!AnFaVYPfx6RdsmmzIEIA$nMV-rj3O86kmc8|GC}0 zgTH=B`D*hJ*5cK(VtB0}c$8h_oA{_2Em0f|Uz|Rg@;aTy>;9Xf@*<3nTb#ym-9xX; zH{W*19{;)CgS3@`Oj%m* zY~epWjZNRHIddpdyA!O@Iu^MQOz-!#rVjO%L!EswvDaP3 z0#(B^NkPXy$)5|tF8@Svg_=x;UKi?2;$Uufx`!!;#enZN%US-i8(5e>BU}f9^BFZ2 z@e<1_0_F;-F$_;UOwAago#1~)P>Vyg5ujl>OPi%0)cMz4Aq3>93wI0{cE zYrvz6BbVI&fxUJAPhBRf)H;sb!Nsu$D4XkCFc|{$%!!cvcJNSzDp>-UGdiwWw#kX% z`@^joR=)QUdxbRNbxcgq$56jP{Q@{l47Yz5Hu_7qYyq zz-acgZ!*FTW8kE+R<>LmeEz5Yvud8h;rbQ$t6{ga_8A_FG*nDXYeXy{+{0dKEl8!D zr%QJJbE>mZBwjFjMNg0g9HRW#fDe}ZVx2)ii@cy)W*l(HpcoYu$CS%s^po%!EJ|WC zH!-3POhOXH#VpV(F6$(z+}8YMDC*!`V>{ftGM@Y{pAIz^p+sSR6#h3%vG5RCG z?K@MXN%8$gp7=TI%ZpMrtHf1T#n42r-1d%u+4!7)L`?-L22C&)gQx$SPuS3c2hM7V zEZRC4L+kFRNmwDRddEytZfns4j5`2*~^?u8HS^MmXaA$EB+&|-70C>-lQPB zSuda^hp-oaU-{(4oSlAA;ccAx0;S{6)2i8wy8LhEh~FB%O9MU!Fj+fzU!}1|F9#at z7lG#;2PR1!GqewNpqK!$-uEOJ(LVR^G*Uzlz%17XEI*l6 zLw@x#bO6y^YZ9byfOm~sTdQMtOok7tUZIsllmp%~IUV(Z^$WGuM|V;V9oyIQqrqrJ zX5^vZLr?kKv3rsdhI6Cj4lyC(h;9i#4n|vehEFVe+0Iw>`CU&&n6wVEarx1$>*Xn0 zQW6g}kn*V?KQJH5EA|7;v(M6s%GYmfCWOGl@y&bu5b>9icn03t_y*^$kz3mXnx4O~ zh@bkx751RY(%5Ybb>(6AU71m?56{N$WYod_xq(F-;P2;jj2$G>xt28l^73QPAW3ge}H9=)nAj0BP$HM}?{v z@E@K8l16X_p6(8~=8#hyDQO3=lWrT$5d zLiaO7TVFXUMP&HIf(+{83XNW^&#r?B3WV3y()c$@u>6&J^N5|<{r+wq_XR@}te<3r zI8&C} zS1}eB`;Hrjy{A9#emYP~c%hF)yj0|?5UCi0VyZGICSG4X*1B!-!cTl0iAI&6c06C+ z`u=)ptZ1imQ5LQ0`IY)QXa0Ga%%XPZ*zCzj#&Ma5Ph0*Va`ZQlpGn-0- zv>!vhjr+8ZOg>7&PX|&DicM9V+_kv)@{rE!A)WPG;o|7Kr?TywRq4;=3#n%p1kLW} zT7i6C&V5Z;j-O=g+k7D>pMH`ek*LK2)xp+}{l(r;%rI5_?;@IUa?W_7I@lZ81?M`3 zJa%2R*E`4%v*Qp-DSyWE{|?pV^z`fV%{`N6bz&*H4E9qHIXAM-VA;_IP5QO6qV+I_ zQr^aG*137a2w}BPAZ|e=m(L9nS_bx@q1-4l*XU0Y%t6VU$LZxj51?#XZ}Y!>I^3RO zu1BF+8Lme7Fe}ICbm6NbyM&IZwb)_haA`dJX0W2iuB5E0HyO%z4&+i4HBP-;X^U9e4*EOf{j-x# z3M4*-e>OGW<|eaSU|lS{NlDVwT$1k20QK#e$r)Iz2Go9ag46z7BgGV&ho6kU_auB! z^5N+PKUkE3MlJdsiD1f~pO%|f(DFci0)c|ZvUv{h`O)&9rt`Pl4vN2?b;x$Ht-rnP z@B#w;y!wb0zLuqFA8IC2+3AV&R42&8nG=RkR4Kdi7+fuNd*-+prUkqmIsPFP^t6S` z4?HB0`)u#ea)N1;FFiu!KtFdi5$S|I@{r`l?lD$b*M90#ZRGFU#0%K&0QCAdmJOjT z%*2cII=?Q!uCaIuD$yMeZ0`ajYGD+j`b~@VsKuXOfwEAhdQ{iLI|L6g>tIwYELNvR zw`)yk0h*{5KocAh(hDNKQa3YZu7~YpJyL_zI_S>B&ewS0jJcMCiM^(Kmj|}%Z@)b> z=50dl>=_gIRW22zqHvGP%Af(N%xHO zP`|BQT9R|lkVrkHeA_VA%k5|EqtyS;1xVlOCz=tsU70y5@ibqZ(c1?;Umc?VA>Eze z0zalBW@6|Yx$^$NKim+oS~v~=jS$+ru24?99fkj)5gXF}X1w9Oa%*953y73!#J zio#u?7_GR)|5k2sKfKJ>`i${I;>*O)s4{xEBit&VF-%Qhrzk%yluzVRN~k`5%H)77 z`op$#wHin8b<_e$b_?FpUH%RGtDYy+R)j06Mx&ri<{vS45^ozgZ{I2CeJyffc9hSR z$A7@CY;ld}C8ls)|B2jFg_sI09Ce$`C$cBSQ>IC4Z;;pG48V4yq0IW1Iu+^F5%ZI> z820mwpAD;JlPo?a&FtVB9gvOx0W662Glt`%f?M=9u}DJn5(cM>wFA@2Xnib_12Fe@ zh#0J;Kc?5g5Rh6RxYqMLYuncA`9Xr2`%C+&78H-zRTitzFsUyBYcHkj;AYbSX=s%1wl=*xmg-5JxmqGp%rC!l?S&lhpiWK5Y9(CGYF?0!9 z`&-yiAxHSx*6`>(%mK;TT^v#qhcs#u6dDjQ8vdHRz;x%|n!JQh8n2@|Mlnzj>}5X{ z$0DuJFqVgow6kT!wD&1F43jMF+)L;Jo1^dpt$l`2pWb3zA6MXg|Bb)D-hjvN2pdW3 zrZSlo#V9$m4QcaEiym0FJ{rm*-yBxD_gD~%=!7xYR!*g!HETMi>sz4b31&amezY?}FVCx(f`6~RNO;2pqxvGjX%J{Y!(!b+ znt6#3DFOysQ*Z`x0S%gAkXYM|LV?G?xFVfJxbT3bNH^aU9IfJY+@2zMK*g7Kesjb z0-SLO;26C>_6*PtoVzD9{zJ^XS8~2gnBbW z%kU-@#)}@aGPu|S5yvv9>=)I+2n6|3<_5e?&kh@*SS zF`AmYPlDf3XtEIWF2D&c{Z>Ax8(8+2fVku3p=48ms|(IsTJ@ZTR&Q6$7p-W@^q`=` zYzhrBu3&cpy9Ul|oQn56P}XJ&NkZ7dZ@UHsdxkO>$KiEx2$fom_%B=-ubUY5&s+p5 zqN#MH9{IR%jnP4Bex2iX0=Ko4E-nV2f+d9ggbZbWEe9XaE^70F=m8ls{02*QaE}AH z7KMMZt;;-c&6`Yih5Wpm3R9Hq-HU_ z!hK3$AuI>aBs<&v{as~FK|tHVnFaNmD*9J<2zwB5*rT}^a_6(TZuw(avr#-7 zzf8{`;?R#&&Yo!e z>$Vm&Dty!<9j|kAV+06(uu1OCBL(%{T)0Q~nAHS_c>IZ?E#&K~tD>*Gy0}}O=B#mn zWTiI=HT=Q>ucjLOzU!`tD#3oPD{ge0r%u$QkLPG=HyOoQq*P^__|$qM^QzStWDf(PUNf zRfOce>(i2lexxdCB^RH0;dSH041AT>d~uUUfz}P7Fu9c;z1$bAU+PdL#u||e)~Mf_ zXHdI!J!%Y%A|7w}gL`EM|0A;KM`=1u1*&{weo zrL$o9VD@r#rTc4;+DGa;p!fq!4nIh%4XUX671R%0bd`6%!6HYqcJ3$+0D79&un3BV zxA-SQxi(o;ZJx=(%tx7Nv>*p!XWIV8-|D>mx-$|OJ;6;iU z&9Zy%lWnK7@PFo-;ZKY zN5NMh&laAFLy&!V`oh?NLu)#vq{E9Kek@|562<8RwM8JF|dJm8ndRx;tx|M~h2AED znmP}SOrE`GB8_iovWRf}^XhvmuYVD;oE_{ATxE*=@s5KpODtCs<9r94x{cYA!XZA} z!Q~be%Si~rfZGocc)|jZf+}={zC#rB7^Pk-Teve-DI|$G;H(x7dg=;x7o7$0^AYef zJGe|LirW@Wb=_+f`6l*P;A64<kk!aK@|@Kep;6?ekPSYLvL3~|+jAx`5Iv9?$hn@= zI`^Mf;^+5Yk7PO94VE8C_C?@5A3lzHve-&{?l#K{aZ_R9Gz9{t=hc&j?0bRGN0ay4 zCb_)oI9Ho|Z8WvONRJ0byxu~Y@JgWqfo^>4m8DSDznMSV&tC9&j<}stB5mQ*L{n0P z>^?Wh5srC_zpam-=!n8o)ym+tv&b)xsW4lQ+38E;R_?KAgKHW1_xI>A1c00=1wXBe z19sB$d-xX6sMjUmZ5jDXA+FJ*!gdCv+`)3+Tl|e-z~F(QkptYyy`;=F_Ijjl7B1iP z2VunEk%cSU=T0C`__5N=_A+6n1QsCz#aPs4<9lA}PPy&SuFNV5!oSwq!7u052=yL5 zREZ6Z#%e;Jmj-5dial0!j&r?{;?sUzlmf4Ah2j;9nUii z!Ih>T^*HtnJh7LBx9upvy<5xuZ4e^Xy+i}y^pS-3X2G8 z_K|K7ON1gp+tDad1Q#Y;jbkK>V3cQ|7$7j!{CeBLes-wb5U)d?nzoqxN`w47>COk3 z_FIoXOoWIw0<2|bEZ7KafAw90FoeqWN0vg~gSaW1$az}aXpPFfDO)Oj%mj;fTywob zE$WMrQf>_aJg^134Lm(N*__}&8vd-5fGsy+5v%R6JvcryPu7v6O9ar4YtShD3CE6R zb|W7y#_{y?7d<6-I^Y{29FhFLzr3Dbo+L-K6Q+4S#_g6z3fC}Z*Z*a4RO@j*TWz@V z(7au08y)d#@ES7IDq?@*uj+5d%Ycc77Y(C1_eUV&3bHN$WKn0~4Ca0mPdNZe7cXu$ zPrm%q`(CF8A-x&On9NA@-5kw$E`bs|o4P_k9bMbDnj<>d(B$n3(-OHWe zV`$iqM74)n#@0Wt-eVIi>Kx(iDg7K4PKAxObRcai{>)wPwV-;D={d6v{HHD%#7&AJ z=>b02!soZ|?WSmeq5sFGk>$1}XNsG(Bja3-E*XU&(4=52}uiS&sp8+Merf zWEeAmgdW45BD)c1+f4HYuM?YJr)~=`S)-+UHOMD-5A0Sr=w!2jH*A*~g6RLLI_YOF z;9togdrF!SNc(OKI7Evz^)vaerpmSq&i9*HICTRCy}&-6QNNxBha}sHrJAu73yW>I zR?%}C4U^f$tO%={6`BghEtu2%+|bM8c8_b|3>&&X)c zLPFy~x#3h`y(RSN>il>L^Beu7YnY*OuLl5cVzxw8AZhk09D?U&;un7H9Sz-zbwgeg zO%teOM*vg!;r5t$zQWN1#f)Xal;9jYO;}OBBOGeF(Z&4mf0re!RH2Kr{Z@NC0<^UX z%6JVWwcrhczAO&$y`st|3$3%n6p1^`dJ*!{hra@=o>hf-t`d02R&F`YMG-HVvhjK} z+aD#ZaO5FUh#34w-apnld{v8awM8UrNkWYiY4Xqki$+)tAsnrm`dG8WrR%f)mNAc5 z>5Rwvx2fmV=EeHj&JO;Md{}#1==r()QdsDOwY7DlN!w~K+vm^lQ|s^69nF7(PX7en zQdRaL?zP#@$sxq7oCP1#wzdujbMXy?L&zrP$C$lywys5S{XCzlN}V?crwW!eTe7Zm zGzL7;obR$Ng)$ZlOz3oG`CwW=ODhY(9<&I?6=yue$7z>B=~K7HA*U{q^3-G3D7>^2 z{2dO-0j^2mkd?U6<<%l6#)B>9e~CjU6G+>cFCAmE7zaOGfBZ+R7S+k}yk(y)*2`S} z^%Os-;z41=tMhBdcLfaneH_{zCO%#uvZv|g%89zc<1&3bM1b&rnyJ*cb%MuQ0 zYd)LX>9F>1U^=b>3Zas_;FJYe54Ve-@9u;8OyKudPhM%kPW84$AmYP1$ei;tSMw}#!Jw1ifKdDG(vGk}ZdJyqd$t4<{%7kB7}@eNaaA|Z zziXe|f7P@eWrP*GyW0b!;phS^r-RLKNa@8WrQN5tlM-I*x;l7(+ASx!#=Oi2``)sX zd!&S()GPO#SQqp5#GSP;U_fs9_vg>rZ}1mhq2gf|N0(uX`J)Mk0}Qdxx}n_@A)%3K zEiT6EwV25GvirBSj{9ztR|{&~kGCdoWy`(_G4T6kl&@viu{YmKChnnqdemcYtl&4c z$CR;onz}fiTy!XsS94PDLNsqS?A_9)(Xv?cBlOKa=av^_Lj-oG;-fP0*OnWOl|Egp zY$xG=9yj&@zSO$h%u=1UKZX9flNrM>qWv=@yZU?>cF?W>9}xGY_UrwiWPHzVe9<8A zzDW0HkCp3?6QvGrq!-_SMh(=#Hn50p-MpOrXHHEceY$Q~@clzcgLnOv2TJ5DCW-7%2< zcY@Wm%Jp6G+>pVkqx%VeveIL>3^J!U5ieSpMTuEGiE~d z%<7A{wbk{X&Lqj+4R^RvE}sJDYlYJFU^_RO6%H*0VKr-^%S-$t2f45&7ocXpP!BUO_*Si5_8@Mnz7`g3k z^GU<973l$%eQnIvLTFbv|2Ma&zw?F=XFBC|cTKki?q_}jfRia){Q|V1> z)VoRH6ouz((w=7i)#qt`gd?{^mVKS_vh$Vv<>B1uvK@CNf)K=rVhrlpcZyRsJwhuh zeopDtqrTO_Oyv=tug&f%fE>9Hu?{W~4O^*&VgC7-KthR_wGX$~RGvQ!o`9UF8tY(o zLnaR$pSWx1;u*J-fcS1Jzm-hU0(^FwRbp^668}aDBvMp01*hC!z*9;X9ltHcLNVC5 z%HM}+&u6Y|*+?S4vL7r+3rZPq2goey9bKP%^JPI`GcUo9FKfy|e>cmzxUKy=Dc`W4 zS*G`te%j{(4pp~`q2Mci^|>7@rQC`B?StUF!_b~TM@`?krB+G)0?Q>L6Blag0`m|V z*0Q8?uNKC9M^|SwX>@qTB(uNRQa>5`FU0dnwS4p;{tUl5f*BvlH9TaPO*9i~ zuNr0GXBPF!7J7^?Yq8II;TU1#Y9YB;@5b|Y)h4G4|9nKF!g)TcKZ(GtF_bkw$}Yen z4qZW7Dv;<{q4S*&VRfx&!|!8&(MXIVoVs!$&dh0bi8Z%wbRp!cxeiWe>dAk%yK7-i zSn`Sxv6DzXITuHGRUgorj79!+_Q=Hduwn+6za3`d%aVPMxvEcUCt(T#u_PBU_}fFk zH09PK3+l@b_OEtER#vY#spV;AgE?0{meN^rPd^}_d_3j(aN!iCoORvECWjwS;dk^N zobS_K{+|ZLj)9p5jD_{w3}I@n@bIhS#?`;ZR*yVNM~_4E)$JL}H690)Whxx2R5b3Z z(%aH_!)eGu7Sr)Jz5>d_fTssahYUl)iCq;6`CSmPX@q<*H|c@o1LPTI)554Mm!7GaOoE6X^&l zwXlh;j+07dvl?AYpm7|=-;dD{PRI7iC9)jgCGI!WcQ;yZzcL$GIN?04kk|~=uhKFT zTI${cPbb1V;KfY7C32{rtz`6hf zY2&wd)Z8tUhj)?(ZTZ~VQF>7=<|;Q8e(1LJ^`Gd$qNuc@_o4lBScEbTVS__lgNTVv6+qe>SeN*T ze}q{C4)Ab$IR6d$*^4YX8&A8>U9G2*keOVqkoGXpoRb@$+f*!N2)d~UBJA=c9Wf`g z8W4R?6Q`S<$DB~g-y53?nU=p29N`2XIhLD?FY~|Q2q$j*DMLaqwO)BG7B^q;0Cli4 zom)Hy$q;u0g8^N+8e__to8V%^z%Wy4mi-1Mg!4w}mO9P3G&#Uq#s~Y#-fF9tjVw}G z>TV}hAv^OmgI-iPb^GaWuo-O36r{@(>^e4{xo=>M1Apx~dgTdLy5KVo4FogRUE&|= zQ|Zv?a)-|FGtA=11+kovJ{TF62oclB{QOVE7vlZ~aZd<86;P2pQu`t>Be$F)l%l{& zrON;PRoi=>#UL*QLn)s=>wyuexnDg^H;}et>4If^m_EQW`q*9jZ~FWgK-|#@Oovj- zG8hZ?>C0i*2~RTOdukK-)i9dV4sfsOA>i`21Dx(%+r^x;VCa#?evGnLPi-J9#_D_! zd!Hf!x%WoYXJ_toMq%#f_g!DG8k}SZ3Datag(PG1gB+2?^Ef~5RJL@by*iAHd8r_?AuKl1v|KN z^BH#3DbP4N>sK2i_p_O&^DDz2OhXfYl+)&||M_i7zY@Zk9G4(5gHb!}?vwtgNJ5*8 z&!)Y1Gw)YHd#ywY{suYNt+_;=C+P}tqaigOch6xULJG7ePn3RW;O^`vP*kBh1nl$H zAaEYlC2j&K42B?a2s}0GM$)QW<%u()g}DnzY~D}@?PIp{ohqX7JxO?xCEbx=uqgk* zhe5!y#)W(J^X9#ptKS_vhu#zX!Y}&fzn^Ga{%6=!FNn}n!A2rEG@%Wg3 zXJ==Yn^Rd?+ZsttOTmT=r_c4@oe!$wkM7nn4i57;^?s~*N}#P7e{Cm)>H3}%yv_XM zA~5aSrPP)_Xs^Y8fFr*JMi$WgozqCg+ZcJ#%o~vYDv)EvkgOEFMx(yj!%ynMutUJn zi+piMl<+hHx35n0YE&18+>$xKA`@^8y-mMUast&!anb-Xp3o{v4DeV3a? zE9rO+#r(e18b`?wJ&IMQcgt^Cv7>f0Se!b@fK zLizs%*2|D$ds38k^bN3Uo60xW*z(Fd6VI7;?J<%eq_hyBDGBw_37}D5foMYqcwQY0 zzMLTq7j=Z|N8%kM4V(56gepgy<4X${Tlh#V%+4ZS9;97?#2RkAWJ$xnj_4W0WhM&3 z&YK8Rb81XoKVi^%`We8nkvc=(rtdLtDJi$B0>LyddAth(O}z{n;p z*0T~wBtXHEw57vDQf2{P@_G0ri%xMHg3^GY^!S2)u7jj+J56o;@y<!szNe1e| zWVWPAZdn&}Xc>%i;*DJbZ6Uc9HN%Kmi5BbN-=1_ca)O&K^VfS`^*xh#u#RRc2peiL zLi1sC5I7pjN-TMQd$dL;Va`^D$@vq|a07CBIb;&|#h9tOdp$e9Ia}lC%Qe$KkC;8w zA;OefBCQ!^TpZ87<)5`^a^d?||DOxcarf#1UmEuB{8a&AKmptL%bhh!#gKsWv57>n47ORDRG!BgLQ^qp*=U%Y z16)M5Yb;faG3`L1n2F-qL=R9xpg@?QnrI2df=fSskG4@P^2n`>vEnkhlE7Y6a=LQ2 z5fB=R!h6OMYTyrS;hOSpqY(Ferfxmz5^L_D0*psQSD{&ZOL>5NZ`O>{NKzSM_Fx}`H0Le?gYtPr5&N%IovpvL5Q6WuB} z?m(j$v7>DUP>B)2n4Zu)t9EL;8pn};?(&&Iz0A35-^4|ssf|S_07LJ>-ASY(nJ_uF z#Y#4CA9o%n(2y52q3KX_|AP?hNK*Ztm+_HfhU5C^#cI9 z2~%7jJief21NZXJLe+UFwqNf5-P>Dgzq&1+`XV;5*qt?uOXn4tObR|~B_JNp*%JTH zvh_zb?)Cq+XF}78?b%Z~u3S-?ron_SO9}mOPG2Er(?9D|#~~-67>0J5F&{s!nH46? zgnn<~-lue{Ld^zRLprHyhDx(I1;`#M>2q8T1iPDxWpe6hL6z`7T#Yi+m~ySRS3(22 zdG#Ws8-hM#O;5bz2LL0{ z68CiXtzV<1Y+<4QE<3IQi<}437dE&~aA`B3^5 zc5os?sT$G2CZjk$3j;kub(f+28ivo+y_wxmD*DPU|0DuS{?1fG-M)eLt{qQ}@Ltq| zerIbhO*OAvF-O-ZTLdt~Y7d|7GYz(bI}HFo5`ZNE2Z+y5ih^G#z^kpwNVtShMeBI` zKX~fV2H1bd^fTf*Xs=Ev4{ifG2L9q`+5$)Tuqe1jj|mS`wn>W^^aN&P@nx(|*Djy4A?H@FVUEwXNr$xWx*-uJgb91+@EH3WL zh%RUCoQmBi7Ewn-hDTIP?iPos97(k(`Z;_GAFRD5f6{VoV4A?h(Zn2>_*>P(Hrrf9 zjYwN=!+@7xT%w*6gTK4B*8{%qcX7;pmN!$EtBns%Q_t*g6o#_sOIG&U+yZ%W3G*^= z2%;!$igT4II-~Hyd;%KR`^MdwVdjx>6l$H*?3>yW!Uo=Eh!PZW(^$x?=t)NkhK~Rh ziTH0k>5X>qmBD1GALwcXcCHJ{cO^0$2A1uFKULnoB?5eq3B*1QubD{B3bi z$t)B@^J-hU7A1_!WTboJ&i4ZD#v>GkPsC<+^=l8|stiC{Vm5w(Uj$iqI#>=mLJi-G z>=520$}^$TwQ!IYB=UGn+C57u1Xs~F>7(phJBzCE(UvKZjY@H8Ofy{?^LcRm=>i+jd7l|1BUzg zb>0zrq%zPjNYnBFU03&y?2|DT$%004J{*JB*~+J3EuKW;vfbm9{+mUsExf%USKjko zO9ywH%_rw-Znt1C1Z*tImEp+SE41Yb88Mt%uZWyFvg2iX*7(SJHPslJz+kXlaNvtVHgnpZG$^7)TugtI~1jx&TxGW2X@1750O zkuv>2mAsC?x^G!8^w+o6*I=fqAilP_ot!5lP7xfT|ub_4Wr=AomBKMq@!&i_3rpn!CF|&4GkO;32|T0b6=IWr6=Nb z_=te=zxB=ZfnR|xD`xt{u&(YFlAOBXmqRsoq*@beVNp`kz#a8)pP{%)?)fGo3IuLl zlVH&X14SH#V@li{;3){Af0iE+BXC{77^<$cs^?KBa6$9TGab7PW%Df*@xfjQXQ!g; zN{~?B0qy%iEYcW?x!&n+$1_IY--34KL81-j>VID8PMKLoT{ITK>G zse%2uOsBu0sS(04_#Rq2xVQ__{G+*3*^5d;J-s}_6dZ$|COQP}PAx5=u97jIj@Y)5 za=a_>m_W7zSGCu~B=1s81}<@SI;$9-FzP;Rj#b7dIDOe^{RcL_vhrYMeP?Lcw8VM} zcdZYd=Zj)*;@WsKE!$J#21g6#a4RvMaWLoBu{3Z!F_iK((`aRXXZ*K3nkaezNXa9; z@F4tt3=S!=Pl+RJs_!MpLC#2ESvg8zMENkz?`Lgoc*g!mEh?J-Y{RFcUfly&68eHC ztv~LU2&D7LrFJ<%B^RWi;S*52TX$N2VNw~F>FfG<^a~NBk)!m2SSR}~R)zYP%clLI zcb~K8qG3Ugb7AS0Nlu++RvqrtqHB9}X6oMxmZb?Z3fB8b$BZES+x$12m+*?U?prRO zEeOwYBSosvEWJRmoy8CqIq0rElwUOV(A1=&%V{Wi8nmJ>heNUvgqJb#R=&(~m0}gGCDF zGk;iFhIXb`Ya$aO6(|y8D!y`HQtQ8XwzDg|O~p%#3Y=V>ct_yBQOOJfVsc*0p7D6o z;n{sETJH@E-!+-F*mYPrMq|7g0(pfP$z&$?*?afw-95W! z^O!8eYwoqVE5x1x)@1Djcl;|v0ZBt-(q}^rx$GXhxatZ$mW6->@bg1e@2gdJtVRP=wK6~LN)--UT=miMBTo-PCO5y0u3+kS=qMIoUSR#;_(>8ELEO?HVUiyp>1U}I z`U;)p;=Nu{KrKEV^er5XOT}hI>N(b?tW`qlx>2%GVYfoMG(@b8IC|Uoic2JgR~R;~ zjqnA-UyY|T$Q=#naNi~8LAl=h>4)Ou7U`b6@b~X#Pndg+TdH`FxbM{etM|S~*5@WK zxcwvgqr4^4v(LA!R)b~Bw<9RTZCfJ!!+%Y|T^DWKUoGoiggz);X2vOHwRvg78o{K| zk5%{{Su#ZeX!*3&tzaQ7#ZNKlDg~z(&cxPo0Wn z%fzAd(=y+HrW2Ot;@jf{wt%l-0|v2JpkEz#IFzn==<#x5b~7C}E*F|Jzllz^5=wQ- zE`|u;K3^uaRjW{s^I*sILiF{rq8&v*0A)Tgdw@i-Upa|Pfxq0^!&E`^cI|((6FOMx z$pCbw59uKzVsQR>d;)No{)dhbdKOu|p6V@L20f(v-Ny)e&S*~)!F7e+5q{uHPf}?X zoStDX2~l~^{l?!Oh^V+NW0tl+UazrSk3UuT*o7Y{FNaZddi`#bP%M4(r-?3gB5D%Ld2gfx{Nli7 zycHqMYk7eMSZctvE1AHJ?8+&W|?b`A2 z!hAY$&0-8sUXxM?JnrjX0~$BWEXToYap>X1*88tufn(t`Cx?vj^cL#T+SHGmwHYtW z85(bux6>0(TlFiM`(b&d88j ze%$qHM3f4@o8h0_e+his&lP%SvG&_vX|W!Olsjs+(6=;vah+uB0Ni+TUT_4Wt>?*}*(dOtcN$ zzd3$q2S4B1@>625Zhgp1bVW4k%{q~Amkt_b;f-plGSqx&{lpYdaa89q=d4 zj$YWG_GMB4sg#F^n!3Q7F|!eMfr$y#Wxu(>W8MRuCIKm64)e{ znWVxCTyqD2`v5q?9uSwk*Tf&38kB`vmsCLzpDYts%yYIsFpE^WWdQ+Xy!^$vEL9ID zqP$e>mlHWm=_zskywLhLe0GCx3wZHwGc5A~u4+vWR0Pu8kEw`2)!GVu#pcGv``b=e zo5`@TZv`4_$40T&<Z_zT-h8AxF{c|c>5#t#jhG}cXS@hr8#mYw8Z3{3cq1A=3IY!aV{YmRM_h0UJH~NhI9+VRAwW`$q z4ct;dUHeECL-sAw!^Zx_>(E_C(KZfOF4dJ;$5sby;gGMM52mo*n3o3?_!~8l3vGz) zwvdgH2AP|g`%4Oeuv91<6Jd@Sg$}a$^ty(DS`HUaS1MCPH6^h>+OVs2GMJ7v+77!~2nlRQuK&q>=r_+IvWF0Pq&hac|+XA>~ zM?|^@@(uR7qN9E0D@CDdAl}5knHA-4u4LK-x%Jq6+w#Ul!sSW9{Iq{vEw7S1%odt-iXU-4 zn^MHz{@;>Rqm}WJ73vDbr2_j4+poM!9U1W0%j-pU{=7^Z?P=8C+t$@Fz1w_UEeRfs+99`5|xiiEmIoKL&Lm-f2I@v zN8DJ&CK_6?2eGp;_3#HTT2hKlzmCgzk|P!{ zw8eF=w0HhFt;^WQdFGiW>CD{q1XMLo&0AGlYetH`@!u?_aA@Naj6p&}-PUxXcrlBX zFElt})lI&*jic8FKEmiB4gmdFPW0r0v>zhdo_sjxd;4mH|EW8KNS=tqitgWDMF9~7 z5+^0ze+QF#*p(Ef)ix(pnPadtb8tu1GG zuc>(scP>;6=17(W-`ce01YshL5ShmM-q#Oq|#@!QiEsv>`Kb(sRsyy@pvO0+Fk zpx-B2uza8FakySa7Aku&*k6B6FA6pG-nUBWM>+#`KCDQMGqw*+M_l$m2{Bc|BTXoj zkvN@R_djG10;Q2s8drGh>}}x>j${1=B2jF0Ifusq@SMN5V0ogllbKg_HNeDtH&PB3 z%1XHy&jy=;*oB@X=AWbfwAVVkNi^!h3dxK5*XHxAa9AzL!Dc>%;4N%`BP-Bnd$i9c z`z(<}I6PsNXaCZ90>x|ryiV{t)gscP4f*@a3wb82n%}zU2Pduv6r_;HR|X9q99l9G zI+_?^_A~G_y%026O3m+9-nS+UIvD2CL-v#Tb8gf(>+;z^yv07PW; zawFXmJ*8g6#!6-wXeE_d>3mxkzXw!|O>8bFe!*<*9ZDDrNMn;bu#No7PJ&0n)QO}M z;I`?0RmXD_Gv!mOzOIk=$A~&56FDt z7=hBM>!hH*0XpyIB2l`luPYzbD*ePd&>AfLrl$b-#AMATDr~)_p{O?~M#4XEeIse8@(Y*&L7~!+00> z0uBbx9G8s4kx9R)4bC&fKn*x~&7GYsba5GJSu2awPH;}G^kDzaQSjT- z0U|64ERS0MwO;#pebx%dtY70(%D22&{x9NSL#zH--0k?Dr&;*U-uP^|ic;NBm@`_) zP~dBqZa6J%amDc;8Af4Lj?`DTA%m0!V1tX&8l<}LNMNK`=G4~{h%gyp!RsHIY|69g zPw(+Xk9Y)oqa7XL5OaMtX-QEh0DY1v>g}ja%18n#0vp9?uVxoKN=f>`wLFCyL@oVj z_-nP+^Uv%4Y+|LIsV^ktUf)A3>r8m3af&>E;Sn7CWqrl2CDK7H3AJ(1lxMzTeg(Bd5R`e;)MXsE}9q+|QoC zVXNC?H_<_tdSZ0+GEjXP_%0@`3$5}>$(!$M6R*BV1h;*o`c@I#f}3$6sTwVjWI6_t zNdk$}zX>)Pe?!$n3;5o}@+1CKG-vKtY%~80NNKdtbovw)Lrl2R^q#4`H)v}F>rQ|j zE8KV9M(Bv3)S`Px0%34LWk~o%Qb5@nE%=c;?&e}f)%}vk>k$@m*wx|D$=dzd$&aEC z|BJ1=h34D+tb+rl-tORwqxR@$0tY{}5kO`>SU>2434M{?&2#>f`wr)IZz0`-WRW86d4K*a(Ntkt!z^iNCy7gQJz;oO8p<686 zhE;k?>OG;%76&PFcAc39f49C|Z3YFxzQOj~d*lyi9XUJ%+9eJ8w(T*hso(Xtmd$~Z zjd_Gm)TPO{k@;0oTLz~yfc7;C(t4V zIx}JZKI+l^dGx`AsQT)1lf;bonZ%yZ)0)E!D{~#UsZWwo|NDKbDJ^G=LdR&BuH7|m z^b~}Rh@<5ynD=50Oq#pr$->L{_7D9`%1ds8Vu^y{ve=A8*@%N6oY;5q1nLV)gGKFG zXGtmFofHO$_YE*n!4)VO4$#wqPY`U&d2~AD#7g$}0q|d|I^yFzIJ*sE5FXWOBnUtP zTM>^uO9rCWZ(g(DduQV+taBz6vLhB6}9Ztdi(jsCKYNLmkul({(yaT0g!uCzvARs$wfZSSOnu|9cCecK(2cI z=UPR+Wq*d~aaYsFy&lN674FYf+Xhib35nUMMQb&e%1ku#XlbiXh31951 zQ(XL4K*;MGqCFuex(SQY;EwjSH0ZeBAtot3(GgVMjKcylF8J+~r;FWr6y4qbKw@R? zny_6NXMiZrO;KjPNO7wZHzWTm$re+)`pX0>;v5fK770G!I48Oj!pU4 zA1q6h3-i2;OffUwVfWeRz~>u-_ka>tDQ+p26LvKl)un{v}~dzf61gy3+ef z+<(oKpo;G9bMlFJLQ8BSOQ60SBEpU&R%*#pYk77pvDTl|gL+lWzrjXX8mJH1>4b=k z{2?lNoFumr5ylE)t99*@6Z-f};G=&;78z#StxtrNEN(l~A$DzwxWSF1o(wN^Ylw2t zuU0Dd>~IC9><%GpM$7PMrw$G#6H&3S&N*9 zPDt>Hi@d?-(X_bqC*;X$=@)IzlTBf%KF>PAyV}~t}>Z%@Z063pdy~@Y$QJDYuIrKZqbGk zpAPc=NFP=`EjL`8Mg0FZp0H4dyU={cs(@GZy3SzJ?azOge|W!rN#mlv8A z4;#K7!kXVoo*O;;$E#)=QWNL?&4_jDi%LhaIwAw2q>kWU$x=h6>Usv>E5NQ6&3v8R z02Bq;w&~Mh!sMeiwG<#yWrb{|na#kQ2BjR@C%7+7P!b8p+(H&=yfPrk7Zh_p*nppf zWo&9KG;%&C%wRbeh(hamk=w7%_~7LKb|@5~OSeIBK* z;{t^*7pl`;=S6~6o+>j1Mx{$id(o#?ygYVWWz^m6TC)Jt{j*SL4Ycs4;4x2T51D3l zTXg{tdk_#@dtfTiKd6gSgqtAY_<-<0OjMvIoYQCXA&@KN9m@c*%U6~WepCaQEv@SF zx55S62 zlFSTrbRj%Qf+UO9Nmk}uhBwa0z^!XcQ68*MXb$dGVYW0Ss7CjR_TD<|u$$lj=a^v8 zJ+|wqoGUzxqdF!t^D2eHWVQa|;CHE+1_Tas9+xRdh%L2OBgH>xFR+)B(5+Md{8IR3iwtrjc zw5gpC+|ZgK$H3l(7^vL=7^VuNJ%^2HyGT-QP}six2q zJBL?8;5Xv8wPQmXAXS-f@zPb!EaYveZEp!m->4&Q^eg*J6`$^{K-)BJgJedS~11(cWZ1IL%@%54%^3x=6PS?HH8lE6(aEnsN zenQfKb7jX8pC+IsLIj+FQ1?>3b}8%3DRQl#;AE5uw&e0snlgt_Jtk!7|0jo^XA&`T zXa!@5CXSpkvuw~M{|OHCiKF(2IZ^ukL*U4%h4}8{-|uLEH{a7=Z%(8RP|xa?sc}q! ziX|O!CE4s1CghZP1bI`b5zwPY_*&|+iu@6#cSn*tRyWAkF% z6|cGa%%^T)Ho$Aamnk(p9jFX3xw+fOYVqT(e7tiSlg>ZkuTwAX`gz!iVAgQ8liSA7 zd%1pK-0L!7MWkbATx*La3$Z?l`#1k<_gh>HyivdA+4>5;^>5}Lj^KyG<7Kl+0x|Gt z*+rs%Q&BI3xPKM|0GwJlG=G=Zt4Vz!yBFq>&J9_=%>M9LGIH^Qt^v?~{_HLO$DjDK zGle)iif(&nHH(Cy2d%CsVyuz zQ!+D+n?LBK(x^7@8^?GwD&)R!0%w09BT5y~KhOE__&(&ui}fE1k2HxuA3oP^+Cv`c zDqE~^l_TD$m7$YsNPE~#q(z?|qKJ?y9}u%Gm1a0&+7t_~WSosuT|4I{E2C%C4K||b zTOa)3$#LA66{)~6#381eOF@qEQ4P2L!~j+nAkDpf_ro3dW-=GxC#EF0ZZ*_P5ekW~ z@QPYAtm&+ax@9)OBX;&lUG9LfuX$JW7ZmN$%Pcx^bY7|X;}X})_|iQ?$s5Yud8a}i zv1coXO?57hq!BZxK9tj$VOxEpKY_~dq#2dDO&$-PLolm3?ywoeOgz!OqMELaxFJ*w z^Wo;yWclQJ(Wls1v-qU^#K_2+xH%_~qiMQH6zEO7(toV-T}*UvfgB|^_G_&mWt39l zI7sd@fu8smevZ#xT1|mv1ivR?8u3p>=y z)*ViZF#BQ#V3N6|`?n$Oz4Dhgx6(6*UVg^$`U&X_zIGaz@$QkQ_7?PV4WbU{f8diZ zL%H*XeWI>kL|g=!>1c}R#3XnZkA(gaJ5-fMEhJ`Ti8EZ6{w1>br{603J-VfQdGw6n z#dda^j}Cm>e#&L$UE8|n-PtnC7Nf$-^q5RJ$-CcO%rvKwfJ<89m%?ic6GmK>2EZBl zoX5*I)>0pPE%$+V1CD7`y3LdMd4ayZDjYaO+6LB5_r$z$k_%9E*mEZH(fsnWt*3Dx zbXYxNi+dFV1(-oxiu#b_$};pbqvA^{k7t^C4~+8DgO5mfr2DbBtaz|(@EU%X*ED&E zrMTCz5s5|JxH++|jOs9TQHp2;S=mbQr&9q3y(w`PcI8c?!u0zIBTuJK;hBg7>9}OR zj14pTPebQrKppX0aCJ`{y^^Ug?TR|$c2J_PD5MQhgzWU`{xZ&OKRas1uGXtL3 z?|$mjWkxFA&q}pdKX!;aT0nNCi(h|h`O3shoxOAZNmOLttf!cpn3Nv~@J8zYMtKS8 zLvp3hz#T>YfYBBX^sdI!5^6(kW;S1K!_e0fmL^`Lr<5j1?J^#F%eV4bJ32CmkLcnJK}wPy=FZsHkv0-#FO@IMU>S5{gZTYg3OkxE#>C4G%S^x z$`NR$6sUni@89r#n-DG1Yc975n5Mp;zcPHpXy)xIOp*g+a1gb=w{hITX`1yMq_jbz zeVrQPJwzo$^;cQ0WiHiJW1X?9)P+SFYAJDU{%=XfNpfy-@KI8#<>cx!=gvvzsw>TW32*P<6=+k(mO}ImcMOobR@RM znLXwuU$!8;*u!63zuezp0jrif?oD)v``0QWrAY4DO-N}Pp*e5MWfCvC=``Uab4xKg zlXxv0+o(fyJ{NA8`>XHk%ze3W<}vC?yWg+_Ppp!HZ6LecPbDbKyhxu&2FNy?*3BIY z7YKM3Ic7b-CrbDLTxul-0_ahZu=>5t!$`V2N;Hl&x1}8I4=VMKI#EyBsClG)RpGrr zXi6+QzaBgHb+QqFl&5RrCJcfI5`BOA`T1A!mVJgar~y@z>4YFvqC{=+hj8M`k0SaI zdM03A;PCTmx>EjN*$eO=4t5aKk3Vxp;9%3&2?4Ki$~IO+Eat0-n-JeG-P*QGqO)KO z+*50e|0u@1_nH0y%Z3MqrT7^S^X_g^QYdd!C{>?qqjc|8>z5c0j zDB`XibkwT1zf5|AM_LLJd!`6oY};R1Zgb`WLA?JN~XIMLZwaVj%$(&%Wi=krr;Ft+jJ+#@&8uxdWH zqWVn6a8COsP{b*(ty+I@J0roqTl~h1$JvVT8G}p~{@w&vOF6m6@uf0XE~(l+Kdb&Z z|2~GZ%zY0P)J;RE2~V=w*eOFRC#2tEQPYt1$VU}UN#n!4`7oA|KKG=fJsnikJP=nI7 z>@~hO?h_@7RQ(3SKj&(wza?jjSC2^1K5}mgEDYxK${V7tQfYZD_py@=Bb7h zOZP3JJilJ86Mujx!bw(~p6h16ro`|E$IG*Ttl87XOFh0}2O^(rOzO31aRvF3(u@O*$g&Uk7guVd;(*O6~4quIx=o@5F{Mhz4i3`+8I-=v%%NU?Qn?iTE@qBBbW6I=915AnP%>N=WlQQz4Rd zn$+KuQ-wbOvq^0(wcdhXyGCeL>Lwmc)js#c3>}9l@7wM~gRJM8MS5)#og?jfjy}{Z zIJTY!ceJj4@%zU=M)btL&l-I3Wf1jHj=#OPFPcfZwmr|9oMlY63#MeBk^;^7KxQ!p z2YEZR>KzhcI47d`q1Ke@qTyA_Nj>fhX%Y;xzx*`d z=Phn|oS=K@j-s!R-v3sjiE}05|NM&beay)Czt8d?|6Lw!-H>0*f4P79W!YWPN$|ku z-^TMF&-L;MeC=ZuByz<%qDH37#J3ycIk6*YIA=*u$LZ1}&yqs6^Cwb}Q{W$w{m zdcSk!>yEj-av4cu2bGGVe-Hnh@efO{+t_jnQaVzx@T2=J@QX)JL(dJs;hV4nhoPSE zz?gkxgSLvkht2eq@gqQE0WfC<55f5_dqep#K&GGpbql3QOUvOJ=cfp-#~D~184H#D zg}>_ElC-X4(Ivcg^{=UvRwkrm;*;SEM^a zpw#buV*T5tWCDIFrjq>xqcf6{zk{Oy^)Xg9BY(%KV1QKNM>wcB|`f6LDzG0nxmoMzBmBa}uD&WzFXr@8S_dd-9s2(02 zJ-BBq@=)wYHF1I}Q`&}>EaKW6lA-Sj^v_LI`zJnfsv`XTFP+n+IEnHB%aK zGdTl>5u0visnBML;uy%vSwP>KokbmB0@xk9IQ`7-HP~3I7WhH0+hRDGqWw@7si>?U z8%O*LuL-{|=Th&@bmnhM_g($joK$2Y?}bBbze&AfuG@*^5wK3b6VvP$zVF%kt|sBd z>~`BxlTm%b4d&hcIi(wx9$vQI+;qO8N?P)R7zSzxe7A4wC3_UnC8#0)dd_rWNDCdj7cxhFLNKs3sQzJmLn_kbjwo9+`Bz8*I%lbOR<8UF6jmT%Fs_dVtYmd78d7FQ`Cvn zZoj-gPHqC9HbhRy(tli!Jfcn<45VcLCVmyg##HZX>|#7&w{F#ewyny%oYi$7_xt;T z2UeB^A}vFgVfm1x*gsz^$VE;r@6&d=_R#g!S%A~*F5lh>_(RgtMYyA1D9*mh+^DIl zV8khnl_(z7oYR$cvxG?Y5={K3cIRv~lj7aH3GR5)9@oig=ezR^ByoB~+3thAZ zBFyEIKm*a2Q|5kIB9fzoB$a(vg({0A3sJ3;Q_tf1mA{h;BaP{)t<-Tx|7Rv7P=kzI z#=dT18f;OGayaoMk34d0j~`xsSmK?SMmXl{rk(ISlMcV#xhJutW=c5Bnk2=qwWNjm zKv4hJ8FnzX(zQWxhuOHc2`AmlgJYGtpa5JC4JrL}ZOllfj~%^B3$m5+@BHb3;M2_O z&kcZ#b21m{bna2H36&Q+ncQzbQ?#`DGc3g!oz*9*6F)=IOESzQEWGo5s(x=Bp6-#m zztT4kF5_JZ<0OB~@Tub;sSaJ*75dI9Uu=QvSu@_pPYM!dmxEq0Ft?5QBJF>iA3iBm z*=5T^ZX3>73YLY`5j^2->DVXVoKV7Fu*I+l9wNSim7(XI*g?{`JS!R;E?POy)DcNY zQD6KFAX!||W&$u7YV96*{!77V(I|JI31Xiz`TAY%JQ!*Q3;pP8s_qQv`SmKP?@05* z6N2Y~D)=M(nb~xIUR+GGSz(G_p%k7EJPu46>A|lOpUD?57Sl!17DXLV zgK>=AoFduuY7cj%41fbC$$~SA4O563oK)bixFcF_Qm4UBc+92FGcQ9+R@_R-=*2=h zq6i6Qq2@7!2TBqp{Cn9^^!7fp-}X+&1G@VCSwZVsrdk1TcBR?O)1QgF&r3{K(v;o( zmtq<0#EVf?1UN>Swt~lW1;cg<(Psrx;5y)8p`G`A&x14D zr#*97@b9%@r3S>;pvQ}wSSTB12UUL7Ksc2pmskZ_`^3g)!fksCSM{kD1VZ!vi?@Zl`NHy+fk{1hMjbV=Jh(>y$kEO*#VA3U^y`@7!_Uw$m~ zje0Qe(;X`yT<*vr{_6*Z7RWCKXF%BfAG5eNWtnWxcZ#7CMW_Rm3a`q)N*Q@2&_e;tx(K;fiWU)v=3lILp}7qdI`t%m?MPjP)L$74?Z zHWP9#QiX~7mF@GnZEXo$^?=u1lu8dPfmQjT*JvlKrpM<-I^fCL-A zT>9MbK}EC}Iur6D?C`O^IRCM;ejESiLzKOK8%G_=2Xi#~2bO&(HaJo%y)R1Zs~$=o zoc&lYlVD)uedWW45(Okm`COY{2CTKCN|S$2S3|VZiWjx&*~VY z6zWCV-}_~>lMRv|uwl2Gi&k3+87#Lg-S3B9Qcq0Eh(Nb7_UOplRe)XFoi&5r;~g1? zYD?5Rx-?9+svMGfj4!lsTq9!jyOeKvH4sJvcE3$vSARd8ZT}I(k2>_2x6w=2oc*q( z{+%LZ%s2vw-}yXIy@*9rY1M}ANobP1Uh-_jfPKrG(5KcHiFVb*NZ64nSo znkHbL0&WI97XVJcL#-QUFu9>VpYG(YA$Kv#PxP!^M^jOQAK&}QvE6~O${y{F3cmX4 zrPW5}2O=ijjede*sS#%Mu9jRsMN2d5LH^ho*?usl!lsaTbOm=WMznB{M07D^r5 zWP8GV8q*NWtr0j3zdYI=H;RsBXPhG*lEwmk!LqPA!VLCePt*+oF6hxzah)g7P_%+C&lnZ>RM(2&aJj#qj$jgCHPOW#%yM?5F@)RHH;y%%Nun105Vd zI0QqbQFKV!8QntnhT(}wJ&NLiAVGp07N2o4)|c#>@(*siR8fB~j$Gq6I^s%Ej(vk3 zUS>-C@9T>{5NDxTMS1cJN#B?z(E4ohy$Wcy_f$xMn$DB6CDcxR5y6_Id(0@R2WeTZ znDav5Tnj&=ix>HJHt^k&LYxtYp-HArLi-~n*wHDgY$aUF0A}hVwN0SXOjBY_b{Za! zC`pQ&RQ@|~c=_lZ#|TYbHF4Mrl|p%K?$XQM{(HDF-2fxy&DQ<<4p1-p5d--_ssI<48wVGTPDq5GTQOVcYG;8PLd1FlrLr}^W z#hm<;(_5e<##j})wELS`dab^@<+9<1qDEq|tox%+=`YS{hS-S;wI4|}C-pcCm0=GG zY+RIQg)Z*m&(NnY1bCG@&*Qmv`fiU`5TM!*EI{+)zY{m=2pd7$8$1z4t|6ugBkp8X zp_iExK(eS4{y1SE>pwvhdG=p!@){nJWAIm+AZ|D9z&X45xPeE!q#caf^boe@*qpT>z`Mhn{M1M>Jw1sUwP0=gwUK5!EgEEd{L-EFUbCUem%TX_TKiHLKYl{g5xl`MXc`$1Oad z=ViS^;Uaq(n&1}So)a{9s)Q#P@NG%;N)zn{FvTmN4qnx12)Q~K#tiKZ<)|c|DBO)% zX>*Y-7DDD!;7Lk4$ghe`KD&*%#hj1ty9GdF1Zw`33k(#(s*ZS5I&7)FVrD z%*xz-{NDi?gZEnOkg2rO8g+G#+XC@?wDwp*cxy~1&mZyJ_+_PIW-`@b8Xq(e3i0W; zcAM%5#6oyLp&lP;`;Sy8mk~@dKpD1C=Ax|y)8l99Y^N;nZEZji2`V?2{u?j7P{CKF zE}8!Jr?L5VNGh@m*}VYPURHrakcmD>pA_gg$JsG%&vVcJ=K^e=5zJ*CyFVvs*;R3d zsAH{b+v~!uVmJ>Legl&vv|bceDpvGvE)2gBpv1S0NM`eDsf7~;%&)VlTK9y~cji*& zrBIDeT;HOrdTO}UJq5M-ZiQbXN!zMikg4PX)bWYPL=MoeazPB!I+03CRvWu3j~gIJ z>ho$}K4egYJT5)>d^*G{?AvU~uQmu-05Y+Z9~*IYwbIponRzEKyy!?oc)zJ%l(IwW z41m6RryL}Qu%7?K?9;*lx*4EeOExKblrW-LQcfn~;j*5y;D+HO$Bd*2ih2+X?EDs` z(px^4a@L2`EQQJfck9sXAUDkR?)8=9d_bIGqEE{%`I}NwGZnJ@^`0I+aSn;EV%8SL zy9X8dsD4Q!+KxQ#0*@Um1lnF^hA&W2WFk|1dnc(~zLYH<5g z4}D09vsMX8mn%?U7D;Rn@OWfl2mSr$KVWx&-{tw0`AG+NkT381UrX)nOO?G4vTI}_ z`by|kyR|(wCO0XdNk5!oz;L1$!SAeL8*)32O&_Slu4P2FKFyTCxb@p+!BXl7MnS1I zU}J~&Xk6P6=gQ_MPlLW$aD)#1PBG(gYZ*Fp&sVTcl7bx+hy-T#>Dz#MZk3?Uj|D$cdE)2TcftI&xR_QC}WUas9|;{ui^= zAs|lq*?UyJQ?{?GOF|mv7wj(!p37v04P8@zO^8Rj&2(MTNcdppz>4K4hbGM148&>z zLzY?7euBN~`cuyoXm$CVj|-r95iGHGM~sR3Bto_!eRX~{SX`X<#k`nFgsxn)C(K2NKVpO`OLJj~*TC;W~x+2m>c*JzbGSG-ElK1at2 zs_`bq62@fpA=s)g<8`?bj6g>Jyx%t|WM?ij^^=R14_N-E68!Hpn4Bk%{#ip__D$PA znnD=I5UVoFcS@`9OSK=vS7#3N*Kd7_YV0%+NweLhC>z!sFI?&qa<+%1iLIdGLO22A zx0dhr-+J4;V2c zct5BO)2FdU{B03mAyAurCpUb+M-}hdnw=<~{P$(mbN$AC zL7bpVL4o`pqM&Y`wdKIC)L>;SJzugJ!=Nv|nOWPE;0%C2qr%Bm;s8lkbI=UvePaX7 zSc&_3tc@e?qW&!#N^BGJtalOSzk61>HwNN{2Yksu#eD zm8cf_z(^hUR=S@r60{@4vfL|C-}1Iw=+^8VNPn~&=tTID@$G*Fmo$P)nhM3Ly?RFi zf0kU$y0?8(+WlH9IsaERzH2;WV(L$bxtRYU2^(qJR^FL`|Ar#``*|`nJoEjFR4Br5 zgbfsK+^Ytc>mXFIvu;m@e$GiRFhP>`czkvNC=D#Ue@K_Lv2XNTkyFO){Je=O+{wv! z$xMgt&pDY{JR=1kql8V%8~FB&N*D=<-=+oo?6qM{;)TUxz9q$Xd=5=a8VF7w{2^H+ zu)`X5q=9&>1L6Olm!aIba0V!L2$hTvVLv#on`(;zJ}TT?&eXD z!FRJCpDR5ifhJsbDLL&L2r@1T#S5xh75b&IY_5JX%34&mCC2evrP}77ZBp1#-n%WfKoitu#)3hIcgnDMmLROqiBa(U>is1;UG@^Vc4!hs&&an5G7iXXPHvJCGT|$UA-<*A}gp!%vg~j!aA3^JFa=3H=*138S_H-K;TCC!Yg&1r>H9e zb|UTA$GrSrH?eXqwB|NGzZ>{YRo@l&3=`QM+4@8eB(&1mKK+%;_;i$|89!r{LCgc0 zt364=V~&)GOfTTYILdJ9L$qK`S%XKVW$wF}W@0x{DgKVi>>m|~Pwlu5{0H~PTPfsH zpuY}xuQ9l1(`V${f7W_?SO_O;-IFRnl53(LdQ^HI5pRP<-<1&U$Ry}A`hRuwE$&it zTIu8fX<2D7&sLkb~-XOC&D+WRL;m3$ym+JAs9zR6JgqBi9+_rbqk>Ys48l(#|H zFkIMeMK6uipJC45@oM0Gm9FTn2jMA|pk&ZT`GWA>KiwK}K)az(6dYm2rzxh` z_v8tY>aPk5u<6{gLHVHbtG6 z=EbkWIh)(vOsO&uV{eH!!EeferA*~87EgH4eTAvMj9vTvm5>EFrR)MA>(*zW*&Qin zdtVq0ue>~P0gSi+;?g}1Qb(A~S`>x)zF8pM(y{V7NMKbfojul_wdCy_cybSmA)Z$` z*8m?b3Nig$Q{v3ed>}IzCPU6_A@wz5n7GmC*on&{&ncF@J; zcdFvxKmZS2u8XK3p9*GsT^+IZ>~mm>n)$mj^!C&Pr2Z%5l%RworsDJbNDQ4P!J5LW zHyBPrCFa(zEl&P2Ztn)Urm%NSDFtCzVPILi?qm-AAt=B%jk=-@~!Y-*Ni|*O4qOAe7rr>w zXaY2jz(<~UPDuUe=*udoHRtj`#V&~vz&(-d3e9=$w z@dm4h?$w22PI_LQ9Ss1LNaR!B$=bh>kt4+?XqJ`6gj~Iism8!2lazyOJ z;LC1q3C~qIw5YVuIOY#?w8FS?9^w*|)zPZB@}`X5Hc0QligJVyPF(sWs3(I1L2^4c z!C6J7z^@f(z`qv;_VAINGXu5fy;;ov7H~IiZf|=~iQ)Vvqd+awLx$DBG*kw6f~r9q zz~CWAGhLQUyu`z0?Bq3Qp2Hr)cRmo{6?TN4?x%vPG=>TA`j%Et#BS3tx?_mJkiSje82lWTuG zD$KQl7R|{G>(8s`esESfqx$oa^(*#v7nw6&dpJoK5!?UKbnf9y{{J7Zq@s{xn22&% z&c`{coDy?LN#tyf+nh4wP!SSxT26CFm_rG}9OisB=bSb(gu|8zmLz?^YwhdAkM_SMB#F0$hJ;l|IUwnGSk1QM&{;N(YIY)qbIvQ4FS8}!NDiq zs2BLG9mPKvJ`ODH6&f+kKHJ&)wnC*IXYZC#J5oi10)YJg6XhPIktarE9`{ToYb>1M_43pm)G9~+gS$*snvkx_+tC{Pg!Z2DL;hMD1r{pe@l2=WBBSMt5dVsc27Lc z7;gAh=0@EwGmGz*x-F|N5PFsYIYJWJgv=D;^4$@V(urTRT33jo{^cTUOa7PABtg4V zU!`#H+xUmZd6I)pZow}vT9?14Xtb!wwb@!}evIW8k zZ(6lQ(L~m?BZa(6IWDSb_5bP|=8m<@yYwVimeH>H-(k4y--B9V#@~2ht_5NDN|wrW zU!6PLeR@ z@fxJPmVtv2xvc{9Mm92ctHIpUx_#`b#Q?{KHIxjrnr&XJ0NJq;w%d`jla<`VT`82G zU5+mU8iF5vw=_YTY%Zsv98Q+@;KpW<7WFJiX`c7C{Ii;d!}e##2Ix1`2BJRwW?QkB zP%Q?liA3gSxjeF_xrouQCoG3j|K`KUz=S0E+BB0=T*z|0glPLJ(gdjOF&~;CP`q-@>CPUpsQgy-X`?VoM^m7b${3E!1?20uZI2K%T-^jugZDH%GOg0Vdd6GKz@nb?0!F#>5+x7W6Dah88r%KM3%kfo@nra;6{|9nrJfrXc2;f??{3);54K8{9Ab+j*w zPS<@Hy6hAi-#NcS$EhfV^x8-bq%ZTkx0)97r?YD?XR&|$x%CKZT9Q>;I?mx))<1T) z0tih*7WQ)z-Gsc$z2HTvmW;nq{RIrFf9xb^;X)d$rl6Tjd{{3#d97Oh+hTVS+YD21 zopV)q?VxSY>An>!8P`Qvu2*i+REsoZ>zr>>=B$h@&vq4KLvBM0=@sBpRDc=}T z3j}iflq9LyX!*;z&}-)qp+GE|DTre+>4x!hIkUgtP0VyDt?qZHO+KdjbN9GUSKepQmhgyU2XhNvA(K82&wu1V<(pq< z5PqBsuS;WUMQ3Zqz8*GlfE2u}E|!KZqPe64x*fe81Y%J0X5l6<6D{pV^5oJHK!_t$oriMP zaq{0~3o+6)E=DI}s(`^&bJW4cYDdw+!oo|tCQv`d+mU#|_u-u3qXf{=PZ2KQ$ID0p z`4q*DrgHTCl~9kJ#5whUQUs)&c+noC==3KZm@B#TV5jn0B}*Q&j#=eI|8{=MPzS0(H$HiCvewI;@eDk+ zV`<+QuUHt{HM_BZyrok6lch~<;qIHqp2q`9;kyntB$tl=+TTq`P=V-iZyxdk>JYsTDD zQ(TCisQk;}b;n&|s8*J%o^)zKf`S~BUvPrH&+Tz)LSGq0sA}O`wuXP0Si+l=7*a!+7-nP5W7U4B_sOa zK$a?9J{pMCg-*4E#{y7E(&SS&56HPs?Te~3<%i2M!U z8qD!HjG`gKX^F9{?D2ML;cCQ3+h$7Z>TS%HE>4Q*$EEX*SV3fd-dLdS@lO0A1% z>gwpDoxA`iDVxL|j|5h^vn!NG1QU_B!Lbk$vt@BQrCR%D#B2kHbI?vN%AY$a2x#Cx?SupsuyJj|!;()kxL= zQGAj?<-?A`v~F?2(?1udAbIu@-7uitdMlOMDyOUnGeJ|89U#CwM|uEnynxo-)QxnW zD0mFG^Pi@N@N9H&qD(j%`MIQ+c~aZ-rgNE~{Qisn>A*_0HNpO0GTtN!O}$BZ$b31# z7HELChsbHqeLnkLjJ`-^gMacUdpfnzbFLZ>wyuo;4zlS!djSa_NiEMr_-f2(!#%#d zjQ}$yg_>x{kRwalww8_LyJX@3WSGn+^6$f}To*%vUgegVHd;?FkG28Sz-U$wMdKenrQgZ7z0zB)j?IJ&efMz6iMC@s~7G z>I;SZs;5779(DZ^C-k|UwcadWL$NJ~di3`@pbVj8ANB%(JU}R+QyiM?p)*YtbBYwI zThza2!@j5QcvTMuB{LX%!f9n6DWipDrkQk{vv(M$#P-(Olv|o1^xYwF5|r$w<$#JP z`LO@+@io)}8|C3OLJ6AM`uRBz^4?85Aj&@Ul)=OLlhfz>M!+{G0(|Qo$X{iNedb^t;KZZuf9)i2ZU zhNsmooQzgV##nep@CK9nKitU$MJU-D;+2W3yvN#1UjzlNC*>J9hmIs1$chI@wyDJT zIBHc}4yMJQ%a8AhkkmB%)RU4d>kR3}I~xIqN`^i7zPjM<5f*;T{}^vi>Ouw@uD+Kl zcQ{*|Qg}Fk1Tv4)q0$jtt5*(DmzM80l{+@m?2WqAD$j@$Sk)?5{O_P5+FHzo*Bokr z=YPfx)tns!(&Um9VL-~dg|8mxa>HXWAem00j#wRGV?-{m0u`I8qmJ)e%vHak7AQlN zW_EZEfW{(hk&pA`jsU;f04+@YS6^MrLS>O^_N#kh4^0zESFf_!v3=Hoj@_@oblu-? zu_LU8Jg#T6ycj>O;n*PG2_~$n{A^4h`8kM>BT)+p@0w#~xW!}`<6fkQ?d3AT4OQ>c zYHB!XdKc@t3LPlP&X8))e18iz!iv_C%>75xs)NV}ZAe~6NE9i)eFx_XA)U7c^PU!h zbj+VxQGgG1lXrv(f@(ekNEx9CWyvbw*czD#CD+Tq7P4kW(4q5WD4v4O-lr}9xXsbL zN#6wEq$(ua%rb$1Cju+yI}PPQ8Dnue)R<|hA;R7OOO7|9MY7Z;(W2zO8;l^u9LmPS zB=>aVYm2ujqojKivQEq4M1ZY3gl}Ba_#I+Af0%On^9)Jmg_< z2Q5NL{bw*zBg0NG$izA1qTD#&y#W){ejW7881M(KWKf-f|AO#jW^99~pMV&6PfEuuPye zmaYSdFtM5dzbb%oUJgb_@WIlA{MhZ=(d$E_r?0@)&)80%KB@#;UsRO*(CVH9rqC2& z`3zGZ4nYbq>;F$ifBA#(Z1$!4m)!ZN@xaXVgf9cE6F`9bI>L~|3&i$L$0+uBeLQ2w zKuO+bjiN0FV`-E3QDf!Pok2WCWD#ZYGaBPPwWgm*bT93G%`{ zQ=X2HA!C|ew9tRZZ94XPFe*QM0Mue@nB!X@TB%EUIEaOdlc8n5u737UJQUhnNv4v3 z5n7eZg_ru>?q260<{%2BD=NVV)dT0?hC34f-BF+-Bq$KVc%ojR8+Z?22(LvjkOy_* zUcj<$WaNR5HUZ?~AEvAev}c`NX9z*AgCE(p_;sHpQ}5J&KRpPLgPE_!{^q?4(N=iy zrAz1a=!PrAcTe-n)mIn53b38VPf0ON!a)8wkfoxOopzM=73xgXqp+d3tWJIHiAqUe zYln(@k2Z_1;zJJ=b)E%OflL`JlQNA~gdXS#4$CQIagswig**5V!1pplMrTLT^fGZK z%;opm@P!gEYu>xVgcjENt6wC5fLgn}kpg`8y~l;03~`r>4mxdJAWcuXP8%*jG~H3= zn-!AvPpuZ%f3aTK z>YXWsFqsLhtWX6qs2*1SOf73qX+_(-0ta`}x`oRJ0Xl95wXSCYP?RfnQ=nvackA0C zX9+4kG!Y=76#_d|bTZ%DN=`p-3`)lt0xQj4DNPF@5r_QCVD9_zc`s7E9r6xJmfXVu z5E&o>T7wXSjq&w9*hSIbbHIK zL&;xWNY*6Go0HLjxYyF~TtD}%dcY#R5m^O@)@`l=@-2^F<&~R; z{7hEPvgoKZny=3E;f1=SF`!cZN!-g}r~qZVKqenaRZd-&0w(*@X?F+yPp*(ET`g#1 z{M=x?v`m<(Sp>o`hpI4=v_XRIzbLA>uzh*b@#a;LxOI9OHfjf3E7|2AC-CooUH~lI z9?}4xur-i0)4-VQ zdkrm`x9`p?Twkab>2&uMxi~BhPzD9B4AvVmIpn;ew(|63;Hb5p>J<&kudWJ%%>@aS z9;XVjU7XRhZqdC4fq#x!|9m~SclDjEJ;=rYu6tb(<~hmy*-~)`OFK&#?M42xS^80qiu(b9?!=rTBeKFrV4(?eCg$*C!AB;gt#Qi|OOk=J1>RU1 zJPi!meEj6}BUmkd%;;QE35PMAS1zLw`Ip#bgdr<14-p#Gk_M=;d!J+CjmVn-HLM-~ zhK4=87<=p$JT*esS~2AK`?Lu+Yc?zm zEtA>9wpR(_1cLRYv}9lek#N;4k>!$-K~GbfD9T*C7SyENV3!@%#8vadqT=S#jvP4# zfM0qBm#Oo4G6v1Sh!*2(rl|^nmw*(dV1zZ0L0bsm*?0JJsAyS&&lbpteDXd!cB{JY z65JM0U4^PQ*!|B9pB+ZF&aIUg)$XWPGj`qTcz?rzxB=Qd;{xPSS7JhG=>X7pVYq^1Xt?oP4o#K1=9(1zd;b zUOyH)5k?rQ2ydUq(!%P(NrR7Yz~<-_IseWlQ?WmHE#YRNtMb&^ucl6SRcFXIbeRUh zNA2D)vLfUBw8?qGsGRtFp5~z*MnX>QQ`xssJ}t`B7OuSF*WQur!8cL)b1nexUY91)TmSJ#s3U}F z=%kkU)(0u49$+V;gR-iTn2h975#G}ytME)E*sy$DS8ig?N&)va|HRAMbTtD&5Iz{ z8q%!(HEm(xJEdoB>7>Kabex1BTF_A*hEvha^>IBh87J(z!*cGGU8-&qhs)Dw;(gd$CA#XhGJmIXvb1*5M5lXh& zOJgQO*P;u0@#DAe?_W^ct{}D8wh1+U*G%ZiA08xk^^fiRMG{W_{t4{+ydGLvVfR(n zov5UZVo%5Q8B2WpU>)6wwD&{aXJvlNONJWe!@{W~b+J$9V*>B2nup^;k4nQ%; z!0ET+b+EK^ysqyA2`bf$^ytH_bur^}=BQ=hPPQFnd&P(h9B~$IjGZnD2c43#%F_;! zeqny@Eiq%IK<*t2!QIU&e^O|>-VtRU3T&gmp+onGVermtFu`Ib?2{uZzf$8pDPC+( zOCs*&tcF%u_rlWQ%0}3qhSIRFX<8e@}wc*c4C|_;i%EXCk zP9>H`0K6hVzY*vQve$1vZEtK0Ry#B+UwMl#WOpZ`Y9(EXLvN{ZA^)E3iw~GyGT)o{ zIe5^~-V7hI`z~GP={6HR_Az6CR|&ROOfT;iDL13ZMC(3J6Zv&j-yENcg+uX$0Yh>f z?`oYP@vacGH`XRJ7pJfIo?EdKsa{;I|2b`b zYp;OM8v~Xa@UOL)4Ko$O>0gx&&iyW{U0M{v(4UCcu}0BF8~}=M#Ex$-az3>56SU%O zG*fYnJ!Ff(^_j2ftELR>XP5vZmZrkn_KNxuOyE{QncoM{VgCl{0I}c=m?FCUBSe0K z;|EEZrvfA}8>%P+6VS-YeQ8@dT)VSAy7%XBZU-j2CLP1JGD?>nXoi>4Z{<<33w>p(X^a*Z z+CCo|C2$#t zqz-h`T!u)4ta_yf9(Rk;OQV%^j|{pV+;5SA-K@XpA$1oES6wpro2^KtGoC81srGyI zUHR>knK}Hf^9KX(t4n<6i`vRn=_iwx-0~k514*oE%S_h1TtxC<8eSNBEut`!EkT&|Qfv|NWX9AveP2y5Sb<}Ci>WOdDPajjxGaFCXciR~*{FIcAfL#tRoG6lH zsQkg-eyvg83U1JQ{6K;cC66E~ohKY{cg@w(^aMyT+w%zl&41?s-eik?eg&v;p8waC zo8~k2IB>8OFm-8B1DI};mwo8t@@tpx^#M`3cZ;~HVb}daPkz2XW)i^ zUt%l~YRz$kjNygf%UtQhJE!C=EdCmrjKb2GH1f{;>eM`MF^b(*d>{onBf({ppt|0! zPH2~bYO`4-e6j1E!V)q3x^rFPN-eEsOROa~Q4vPuqb3=cA#FJ}-$`c5K-|LMrsAlL(+uaPy2YI_PabN5bvW`tYoiz9jkwbT3#V}r$PP0WAF1B(T)`!#@`&3o20ro>CE?5 zT16>_sQ=QPA-lmTWF{(Ni^ynQ9D1IhvRN|is?8q=?=G)=cm)#Ncrix-HXM1AW0W@q zH4J<)h#@0#&o$t-K(}6%AOdoIt0=9kg+;yMk%tZI(OfhE>W5+Y!a1bQ=L(cPt9wN%(A*w6X4l5&qrWz!*Nv7ZzZ2z6j>}^GuIqIfKXd6M{pOC?}glXEZs_e~+X-i+< z{=V>${oQ94`4$-W;gp=ooU5(PyijfMMwg-Vz`TuFeLsnX;3E2IoeiyfHGvHM_x_2m z>Yt^Gy$#r%)Xrmoa|yPaEY7y%W$^@3nO)6m0cOf|7I7o;VyHDRw0zC?c(t0Qs#!M> z_Qagwn49sLIQNFYEXfMf-7X+MzwdUqv$@j2-Aj~j&(d)RSCbEowKrjCJL|JJV;y){Vrk%sAE&X!z0GxKT97Zc?Wm9KJ#wyRMxeaJ5n zVEf(f!<~?+g9pq2cB|x7%|l+1pt1zP&9?n^W4O^`zd*s8M=8ra?hzq8FBb%OYuPWO z@(}=3b>R&n2GGvV6IikENB#ejv9!~nUo>&RuV9Walm~_|T7M|rd5c#b*1tdBwt1IY zef-DtX0Y>kVt4dT^@_=6z3+vuf>`_!zYJX^eyNp$|%4O`{=jGK2N5`U$RaQklB zwv}~1w#W^0AOZ`@G=PxrU>c?)^PS4mjf?>}FuUQtUTg;3I&&^^{bH5mAcr{~0BsH% zkv%<#w)e5{nYZ;aoTwe`be!woH}k`S#z$Ae>w_k~@O5X5owXZdMlKbEtu6}x6L^|h z%X0baYcroeKS~2%PMSUXf(EZQQbSD{3&*KI)zyQT;{v&9ju!+B4AiVYW?NvIi^-%u zFarD8gQKx<^*=CG#*rB_XV`TTZj5jvd9|@pw}|hNeBiEj>(ZY3lB8k0&>{jE>Bb< zVg}2}O)YlKmvz$z=F&`R^)m}|T>^VJ5k=S;VL@-oC3TGGr~Jy8S=8_kldlXc+<$Lm zuDS$D6XLc_B<~Z2z`vzdPuy}EB-s?ITS4El&Mm7|>y9ZX!q%b?;_>wWBQLn3#TC+h z;%UA&Q&2Wn5SgV(d2FtyQ-q!V>Q#gecS#hGTK$(M@b%6eG{v#OsM3fup!2( zR6YwC7rX)kJKrUox2*C}{vbpf+H_bDx}5+Fn}t zrGFw7MKODJXDs|Dd$pSY?;CDf$oQ`~*08gO-TNo(uVfNN9#~#82DJ2my+kfK}$*^iOe=yaG(%px6jbT;|THz#N3X4&2ovBDvmB6IIIr03ej*cA_QilBw_U9c_k=ndgdppnpaWtHbAKMFWb!UqpPT zzm&9&pe6OL`cT*af(%$pW93_pkks9*jk()E|B$axpWAIjek`Y z85Thsy(V=Lxmd_{&&G5D~2*(-@i<^0YK5alP}`LB1CmZgqaFuVAI?o)S#@ z4Z{6>E1d(xD~@V!u2jO2M_ZmS7IVv1s**fTgd56tp%J&W(Np8-CVMR0_nzQ_Le}EQ zKFwbUD~C;EJ&78YB&x z$-)*4E0es$A3iL62_xdoDnj|oTE%l9=}G^fv*dr(NzP~gRcBIc_bZ*cEUUh5 zM7ir>Sjm3zGCalJ`t>WGKHhYLa}Nqs;!%YfG{ouJdg;Ddc`4;h{R@+;I#=olhmVhE zdsx^RzjEAmqHmWnM-7=jkLdyxE`VP(V>8K2C$|C36U-Z_{vZxuZr8C9zzy%d6gyk{ z?hC0aWRjrWQJ|x|;J@gaUt2>5+e>LIXYX&vY9M6U?1a9I;nqeLZf9pRvxr&{mBh)l3Jd}~v!HO>w{o0lCbNG9+ zrOnCjxmx+7COc`b8`=(b3xBazZ)zum{vCG+Tzk-R^!J&D3vsW8`E|CX_{o=?hbDzj#37APu{})T9LGER`OumYc;)w`*T9SW?^C@c=RhU1{djUjWa7p zj2iVKU#xTCKzyBaJd818wu)&=-B@_H`-2#U>bCJ~PZ%GsYee6Qo8-&e&8Kz$^>Ebo z(ZBXA>YYzj9GU5Tg*UC6McU6iP6##TOzeIX+V=Cl4D1>5wdc>XJsGn?-}}w{QFG_@PA&VDrk<93eKZ5$Gbw*hjMS9J`e4@lsyrf zNELI0$bss|(D6WD-Y?lCEbUFP-S7n5-0V^YE@e+^56Rl_AQJ5vHG+2@ezo3;*0^6G zScoKI!6rSwlg}7yJs6I-og_M^V6kukDBwrRMQvOKz>}tbDs?h-@j`dYN`g#5!^mG1 z@|{TrPXTJzv&%l^$2E#y>Krc;Mg<9T*v~F%J~5J)>2Jmj7(PEw2y%S(?__0iX?579 zQ=?f`P3;H{$!~dinAv!+*JxKv#S2FbsO&Q{*ME5U&*DnigGT2d3m2fAbEZ{Bn-zo0 zM)vjXdpoBm4o*+LY5*VIu!jVv=KW;==@lTr2Ig;LV<0e!-)?Iq#u@OMtgO~Nd!zs4 zyY%~TLS$}>tZ}RndD?_FC{QE068viwD5*Nx%LD8_ZtL|P<0;?({PKcmxGO6`aLgL0 z_+6>(LEgS*+XN=m{WP-5$pCl?bf|@9E0jPqL^Lh;<@Fyz&wnnZOntr#V$hngZE8NW zJbt-1RfPbnN{@l=(4sUuI>M{j1G+FC_d4QbVB!yt_}WOOHzd|G5hbEV3!azxu|8?sCFnxQGKN5e*ahxPOkMyllI!hW!>Fds_m@g*fAHF}m zpe(5bOA*rm5PKuX0OTd7@aYzs`#KH;2#+PILMHC7FVPj&zV*>&$);Y2AwRM|8A_^3}w=M|VjU(i}3P{)XU{}!(7nMgIA*wvo<9}P;wJ0o2P+<@Q zlpURkQ5#y$kXdwmh2C`PBS5F7U1$hfr$wGa0;27sql8HJ7xyo0w4&GLQ{1d?XTcf( zSisptA&GRHEL##7M2cr1Ln9C+8C06_UJJ24{YDcmaQE1A8l;qoTlsWRY#1FFwd_it`5B2u2^2f8esnx0Pm(W;R7xCTS5gFSJDgh;UIJ)Sf7^!Zp|({(uI1o2v8^!%6kXsW z`kQ*FDiA<~jTwZJ>j~ z;1^+;`~RfuAy45a$q=;H_m4hPk)!SCV`V}K2G{jwNUIO|CS@AXX>a`bxBgk`Lq!8> zs0tWlf#!Q7h@$nlge<%J)2WuFq)udk{~h*=6S$&6fPplwA-K<#jvHN5+#1tKVg%OE zVWg@-FLF;3N^%i)vlbh+k|Ym2hQLHktCpeU9%mwUS=CKct4GPF<-TzlFA%k% zN9Eg&8ny|O{6z<*dfx;kwCeW@P5&t%?IA&QguZGHJ#A~G)aJnq3mcOHM#}}lKR-!g zYHF^Qe7dV+Zij0?l)T%pS?`CV$T6V_YVQ~DTg!<<{aZZ(WwYPI`Wvc$FiJ)jx~Pj@ zPI9H9<5?B$A+Nz05)&y#m@t|{y>G50T>r86W|zY!ybi}(_vCjO-`rEc6dcC&XsUNn zHD`8}!$hO)>8PwuLs_Db;~FpbQ1~RsO_st+m(omfs#qCEc<4nE9bFr7f6Xcpd|C4w+S-ceAx^g)wL18|nMBE73DfLDJLZa9F9bA`+f{ot}*Au%E1lc>c2 zQriVmnn6VmAbau8zY8z3SAaa2X90+vZt6;fi7@DpDKt&#-7MPX%}*G+zcGhDDnA>n z<_H-VT&fx9L>4zLUy@PdTYG^&N9aQ{jk5maO9nE+faw;zDaV1AD0d+mQ_x_jb=Lbc z=BR!Qj=c?eB5XwVHjt1C+&|cf2C3a&T3TbzX)?7bJfO~~{)w6@ijDSvDQo2=idkEy zA>}g-%~1?=Ve(2arvn47@3AUIutZw70#GqsyAmIfd*k|V;A%b3{StizC~%ONSOXus zLWJ*Tf*KaX!Xi#uf&Y( zfQ3I1EmPsRW z83~>JAA@|#ndrh2dGSiU`EP1@vu$I`ua-a`e-wS}2sLiuPY3SBUujXyDDCHM#`nwp z6IT*cnNt?f#C{O|7tOS8B^@=z=0yYE>ys+Ev!b>S7fBzQ44q^a9U>yeV zPQyy#TW_!uWPv)qw$jY=3FLqLaxLIRi84t|_M+oaj(K}?RRtkyc_q4vIccHac3`V= zp@6OAKHxD;cU|1T?b|!4Ud6)WFh}mhux?n8^4h{jGMc&r7`ah9CPwUsbXJKOf&0fd z)2=-^8tKxu!)&{$J{{mUKB^+GtiUZoeVR0=LhauBoq^5VE};^Uw}};q^64wEV??gN zH&q#!XMH~hEo#zz17VmL(;O`V9!Azpe%rb{L1s#@Uc)6xxBf6di$*%g<*ZOZnecb3qwKWK%Mk)v>LxQuFQXR1>83O>o8$?+8S-QwVI zDEWG7+m^73I*Vv*o5Ic7%e8hHy8rV6+{RZy{nws(xlq=+sB*bOsXL>cS;mm6u}YiZ z{;tNu&h%|Z`Jv@8b9q}SpJgMN%G#E!c=^eWZ-0h$=;HvcA^RhP%yeo6!T?0Ix0WMP zQiV|Yp<3sT$CKAPGuJzR74Q3+M8&aPHoFy3fM@TmLu;70&>cd6(xPP3aWv(JGA4&t%nWkk?eP;&BI5 ziUDA9f^%lzpb=oua6f?rbs#g5Q=@>PE?3zytWMzZjVxgxF+CD!Q2DhHw2bErO;1c7 zhmtFHU&N8E-H6D1z?on~=8!*a_KKDHkgs>Kx`|eu!jY>L0ZdRQNS%$VO;cK0i-%?8 z>B2_H3%=Sx@fk_RbcJ}{a|*K=R`O@R&`rR!U$KpSwYVSgfalJgH++t}=^b3h z8%w!qi-u3-8AdSs$&pQJRXiy|2V48i!#x9NYE3f6y{MqLn)U)V*)=swlm2Y$IZ81r zJs6R6dC#ahpiRl->8}nl`8>TIpeJkda4_VNw7tWw%HAbrERDo0!Ns-&6u;?A!(GlX z9=zMA?Jg?Q%SRtxSD=@@F_^O8i;Aj6t(h#ss9 zDM$Gx47fS7m4Tv3*hNegrv3CFP}=SWo?84dmYg>GuUB+Tl6##W=%gyb&3&qhM*(MC5eL z9N|k9vx5-ss=XnnmZ>1^Je$rx_=m?!zV*){@Oj~p!eOGGXEDc=j_dur>w$X}8K1__TYWH^{Wl7Zz%X^uD*yrmaf zx=7MfrF;Wko8Y3u6J?N9uo3OT2$LhkB!)TzI0H@cjQTaAmEeX6Ik7@Ozb+O|`PY#$ zCVe9!1~o8NWbHq@!scTII0D4R8HCKG!sdrO;_H|P?U(u8Q&C?PHpdml_lk=}2Uky~ z70dWIa(RVRYS)~^8$_t~DQ1Q$Pdt)Kk*| zGjIzH=FtWr+W>(QfHIou@eyJKjqD+FjYiiA4ka$c9+URtsEa!GqP7`06ZfL0Q6+Jt zK`fY}TOOdZiJ~18-g!m40U;b?S3|*E=MTkp_6966%4@ zD@-sU&pYO$_Xbq~29yAg0Jq8Bv%pJgkw0zf^4<#cS)>&uY-HrlDP(%{GAJ{BGDS&P zG;u$b9%QXZD_a$rW%3pC6nreM_U(Cjm0UTvGH$V93pttGZ!kfXxsqL$Wq;3C*G1}2 z+<4=FNqaAH^#d3)VvS0{N9k5bez@fXQH+d~MNZD^>dpnj?NLsy9ZCeSBMZa+H2GK! z(CLdtc_#ZVt12P+E+=Jk+bn(0#CcjWN%x{d`;j4uqQHUp_GQ`y3=Vj2GR3a~b?8;2 zL6l@Ch*~EyEAiakGgGIQfSc(fzOv*;$4<*kn;XUz9zQw;=K z7_hWgW3#Kjb>vW02y0wPwf9&1)ZsWkL~8X?g9Ji4FhKURotJ#kpf{{TF2fF&Yxl@w=tI54Y~@{MU`Omkeky=Wr%s|A?R#h(IgY@? zhFrqZj{S_jG&vDxMgKEVa}o{~sL*zsRhYl0^$YdRS~-7S2DYZvW%&gxWFOK}=Ck{eLUn?qE`RYLH zholcGyX`)nC`gH=5gUe7_x3#Ydh{O2a{>-*k~gzF6Y^4%j4BS(FZ@VsVs5rlEVdPS zPkTtgfW$=b5qGWhc>L^*r!ipt?wRfPvWMhhc;BXsyyzM7w*AUVaHwQkM3|!_oNp@` zk#nf6qtCmL_c;-UR|)M{TC~0OZ=m#RzQ>$_+gy)o4@ldI`DkxFEo_dLr+3EEM4!y^ zwHE&@Ty8muI@i~aVCq`gN%;Qqh}!SLrkXYRX!A$)_~UC`e+3zrc&C&+Zsa#g`Oeie z;9clxg9UuU1vUj)BAPoT0d_b@w5|&(zyB8Rj?gCWblvjbaXxY2A;W(9Q{R zOCCl^WraCIko8cL^f)T|H8ty=HLkrQS158`9q0n{Qr^nGSNW*#lPfpe5P#<8F!gG8 zVqoblag;V2p>MtOJgsw)k7A*M@^i9gq;-2b0Hv-BcRkmoWfe+3I{KXVcNHuT+e`!>aTBwF)B#Pxfr$*PC!sTQS2N^f?kLw=cr2EH zLOvI-_PDQ@AR+uv>8hR!QOdv>B4ziiB#+%i?%i7FfehaFR=njS>Tc+8y||F*JHO94 z?gu03*`>?RWI^4m@*rz@2JKIJy|ZPnVBaBKx5L;-gDM1v{E-a>a;n>q{3PuH#JK=` zB`tgDL2@N16R^^EcO!Jw*Z7bPmAsl=`Ou7Bg7jxMe(OnIAi*KWbl&?gJQ zf#+Wi{&+Bd(5%>#uMIfe6A*l3g~82@ntG+j0{t$#01ZMWs+i$3cz zvkBuDU-a@^G1us`EEL5UBVS~e8IdbR+9erfxI8JJu@zfU1M6#YK8oIRQwd2sQK|9p zqa^8Pm*jVPY~B0T!jfEE+Uw+c3{TfAkymQ?mju*i(!3Od`IR=K7w}% z68G%(16T6Th%0xj zVxa@WCj)N~32Jpu>cnw8PM1q=A(i?u?iu4jeF)3H^G|tB^kd)NKJ`NR4SCW5jvK&@ z(TNl*mPZ2KZh|2AFr^AqcY>1)3xHtZY85}G`*Y6%qw}f}Il2{aEjK6nISx+|9kdy}JY(m7U8xnS*3-|MpR z%1Z8ZI_;5sOiHzUds9WFhY?ghqUs`6qQbNF+q6?v?8G07iK8v{>EuH8D*A_e1q?y! zF1|sIs88Y5n6gnMAHw~mygMZ2ma03XBwJY{i_F8KZQbw=$fnIfhi(adj5SiM$sMO+*x%vT-~da&}msloz)0AT+x(E zueawZxIuU#TB>A5|Guu(6Oxi$`u;&qGH&qJBX!0PIUbM|Hn24pEPLWpeQ#{DY0YF8 z30CTrE>%A1l zL|oa_`xLV#)WUr-R-08b*;?$(X7lO4*E2aAbj)3z#r*?@ybo&5))1TFeU-J6dfCFr zJ5I0BgTJ%%r=j<)?>$t)B>f*vXBijO_l5hP0n#9n64H_a5<^ON57M9r49(D^w4`(n z-i5K1$Ebj-jgh$sj{ci!{A_j6yvi#hx3z4kh5Jy%{yCWyv3ZWg*1*a67jMb4lG1(L6>!I9 z=+CH*3SJuP#+Qz@B5;*gkkhFwQgT{~s|U6Pd+9K3Kl>IVi&rH&$S%FMb2Sj;vDfqNOiX z-)NL?9j&;5k8uV`9Vn_;UdSV=fgt-M1%V4;F3957W_dbLWP#@J&iNHv%4lfVXBw+h zoN>yO0!PPXiVt`H86y>=))fD{Ql(Vur`Vd6NrY6sZ8h201EtW*WLT3jrt$|Gjx}~< zxv`ur{UAy%ZY&yYmM*<{y^u9XT+3<8No+GTXJ!@Xrn1Ao3~!lFyiMAov5RjBbDBFW1oi!lTqM6dVkL~? zL=QKnp^S0<&Lx#@!RECQRlYFekk3qg_(K_8!uxR^prahAV+JY@h{qX;tgG?*<(}#X z%!C1bN$(d6UWeJd5Ej;LW84}9FW@k%(RWmn(VPEKIsX5@$mJL0F9?yL}4>DU4! z8N1AY#D5>OrW8(4r_<6RQd3sTg3AsWA`>}nk0Fckeo4r5#xc;3JlavF2SEI|&_aNx zC4C2^8HP1+W8ov*j73KBRX|OZpjmIOiEa#VsKV2H#AF~X$ji5~ z33e0L_4Cl=$V5&^@ztYrq$n`M`8vB!QDCv7@izE);BXzZt_7NgF1th|X=8V_ou3%N zx{J1xk<2RrNtLlk{cM`_1(o&pCiV)=J}l4AtIPSDHFKffX_{jx#6twQ;V zH%1}6n#OR#&BdvyO|{}cryZ_L5S1x2j%Rz6|Nui zsa1?Vq48s&h3==r$5;grM*kZWs)gb;!cf&O214F3Db+9{*U}@63FSVU-oJl(zNCamSgL2`$a zu)tz76lRDnp&TUz277En-*NeDg*Ew5c;i2mZ9QduX=?W(_h+i3_)HiU%v|o%rmvQx zkox-;(FwA|EkMY3yDdsocgZcv1uToQX90<=%7rtO3siJ}!$GpClfZ2G|1$ zKTE!HrZqqA_~5OkjOkL~gzP8?AfjF~rXvlSuKNS|M}Lm+rK?*E=>2i0U&p{I&fExb zQM+pC!Mn0W_QJjhAHJ$auT&51bmgweKK;d%(lH#&wM(Fa1@GIoXQnFY8nckV4W&x# zGLkSmhDhv|@bmtQv^_}-SLBx*sWEBKzVTN5cFa|J27YP_kmmk4kgqwH$d5jcUiYxt zyp;tthm#4JeoSL?(ll4*@*b@8_z)a3ZZ^`v-z=K&GvbW#n@_!Wae~IS4z|cgVjil^ zp>r8Z?gnBsM3cJe0Y|y1OcQOz0cp|zAM2xENdRHX28YgxNAQqr^ck}|IP-yzUvWWR z5|OW%r;@tqp^ecc+bB**2!XiXMU=wg=AK^uXCMXuvpb8!T7hI|^DSJ_4J2fQx%P*? z>~{9QIzJBoa}W@5HE=4|W*rZHsj62~K&{J2<7p+4V>U~1zA#ir@QYI<$EVwp_UAzp zRg<|)2Wjh3)~auxO3&1kC6ly*BiEb-;s)(O7+|`sF`Bd?YycQbK2^E*V3WjRm8Fz< z`RORShSld@jnF^`+opPaYHQdesY$QVY=_ra=@4MwiT1FUv?lx)3tI>FXsQ$bu#VhDwV5W5AuAmFxAT+AInqG#s z;=JPF0K)WJ=1X8xJ*dIwj=6uaI(d-8Y2*6N*`dsb)EwyNu}fH{izjp$_mZ zfIr)uYUde6RuTvIiqBlwN0T9bA>;^D@Rv2?HfFA4)OAX4F=u{KP87 zjO)23*{+{5;IVxylD6>X8r|%D^^}ME+052ACrS}v5#cxI2PXi60(-WyStaUS)KP5M z*!BT`w^XYdPg9s@M0vLszg4Ipfe8GHU;XrVX>`4h9A}`90ScrDhC&K~#eM!yu-@AQ zzS!KMO`&el?RN?a0wEgGWh3RD!3R4G+SvbX3PBDCVjmi&Yon_7TaPi=>j5qF`% zShQ4J)ZpQ~CYkhsk}pq9RwRQtlbk*gUU-UngM(Q5Q;%Hx&Z+X?>e+M~G@i;-O;$c6@IFH^mJz_~{7qwV0 zspDB~TQ3&x)l$4UJV75E42s^oIhh_zQ!4x!7XIe+?EJDlVtuMetP4nJM{p^m7LSrk zU`_g%7VI;Cyp;Pt;1fdU&hG4WLgzw%?*|T{_&)5&@&#`r*j%IfUUFeI|0IYy4f+^x6$pLL+8S8a6?*nS&#Z*2PT7lSw&!N` zowH4*9mp=cwNMPwIKji~IF*sbvPN^b!vj(VN#SyVbDx1WU=dq0CSv63ibE zbT%nqG#}w)(^E=9=7ei|+Q|5nZs-Fjbd;{FZ>)q_km|Ohwmp>tb${LVnDno&0FqSu z=Y$AeJ-RR9Wy>u)RB4}HVKuyRTmWm(4^Qy`s`p%^lonY_yHtBL-{RQ1enT}sFeu1< zZC!I8!0z7;SQ!}}I}ZyDa^OOYe#gZBl#x*>&}Dbxi2)SMNUMEIGqoIYWt>3S$yL2g2vXzs}Cw zT^<9?lzi_0>PbBgk+XKIT~5^;x7@HfFif(-2Uv+s$ze>S+NAk$mJmm%I|=%B}k3 zJ3zlbmn*T$y#nY=gva97fx%{h1p~qSbK^;vtZ;{sjY-OaImdrbUI8uDI6xQlNv+a! zB6hB9P+8&dj*`EB(2(h97> zXiH@Fz*3UmK5VR7i-q$D}NjcUMBa0TNAlzd#gVCG9hM^oLZ#+Qy*h9;Hk*13L-5R0qC7F2CMHp-s z{<`>oj#SE$ai#H386OvO=vBm~9eL93jFOOz+1|m!DP1B}x`(0a)cs|t)AnCSdpDg= zE{&xi(?%o-_8|9QlnDJ)4obuq7F|>6*$+)*H!QnMe|-0_YfqZ%V>jhW($}cFy`DYp zHe|Hy4l*w$9|$=gi51oL&unXiduq7jM7sl}0Ly>sd!S`s!bh&8Z5BDy32QM{-PnrADctNS$k(fE;u zwkWl18_|-o+77>AQ+ikwei>NDoAe0-N(zq!AI?Cgav#ySpx-K$X+`F0AXUxt+blea z6;sU#iVs_2`+VacseFIwN}R$&M&GlWcv~puRUYsY1aypc?~lP1ll|t?qQ3g$Y5s+O z9x@hITG=}5>S`}GSh=$7P>PlarHWkX4LClOyl&4EmM-4He<`uy_I?Xc+N_SLaGGU7 zw}lc*7YzChZ6zSRgKScbCxCMSn{X1xApP7+PZJ1qgub|amWQdI9{{3$r*lniz)bzG zh4)Rx&q=^Mo+xkun53H66C<>lO+&tdE~YEDp0=3-$Hut2sHd;(|7!u7ov1YuriHs6 zj6N!2F)eacf6c$FI@Kwx7&q-Hh1xkjsq~Z@k~SzEIwC)vDM36gVmx0QC6B(#yeAzi zPoAi3uqc1G9zk=Sg6Ggpk=(mV{`{S^#Z=icOLH+V*5=3OD!$`6zRnNs_sNplI)oEL zmDnqHla*;x!@cGXtGbKE7^Y|6YxW&%(z7a^HK4}=z972l|4yH@iYqlYbUh04eUy}o zef_H)ZVD9Iu#{Jiwq}VFYW{ax|0M?|HLZiwVY5NG?_RM>eP;Qk zy5XXHGANU_u_r0|VNfwrkl}II-YYC5ve@}uGX3X2UCdqw{IQLq44r4cmX~|4*G~g> zV&ra7Ct_GCJVDZ1ankT>Fq- z$h5_-QA7%B;IH7BjbC4VwWfJpCQ58R@n8C5zH)((=dB_eTa}*{QY0a*@u)=y?Qy^eDIfN1l1ckz48tf#^8VYR2PXGfKOBBBA%o25mUwp3 zCFUCYdZ1&=#jKNwexH;wPEk^6UQQX%lnn9K`HEL1`7k|-cYDKw)3kzp*mGhUfEp@^ zQvU*`1VO%iJNmrxW-+%(xy{MO?+d_LFHw4&=m^$!})dE$o$3LcG8n>^!&>QX0HH|W?o6zV^6&}l*lc~ z7CrgKhd=lzL6orGA4aBtz845q1JKc%cmLDc-CUc&rn~-8f3Y}UxR@jH)boPa{Cmxd z-VlTJ@^tPizyf)tdo%F`Hq;tg*c@xKMX(+&XPt|XTe+noON5+e7BD?7dnm>&O8S%Z zI0^3wmVgXG>4=J6ovRq8MSeH_B{}(`UZMFHa+^8bX-ku;_(yJ?QNaLQ03pO@uSyI{ zj0tB1arvA?8c;8RZ}y_Ca(^nsF09f3zL~D&ASN)ZfC?pIur>^cKOra7EhdRF%Ix=*S6X zhYj);5~%`W=ESqHu?~qs{6>oYVX(`S&QGTLEzk6OpR9+m$FkG%7AlsRkOc}o@g0Uz z)as|0VGV$5|BDpG)>)9uq5WHcaK2HxnStVf7TvQk4xCmrD)^@GMs-3i>D%4AdlmI0@~Cj7PIMh?E(lLCNCg616))JBzMu`MolbZczM>( z$_+rC)grY>i%z(Hi%;hHUko7<9r4(#^n4ayV8P&P+QOu23P}E?VBGpxqPZue`a!|x zUv9#0%I{4Nznu5OWF>@w^lj5a818rWmo26Iw-b`E$tS>o|BvJY1v;H4$&!%#JdyLL z{N@47^jg=yb+?p6(8R!X++bDgSzl4EnxT?Je>+9okGEIprz$Neisz5@t2l#rmDp<^6Q-Fp&2usc7fG=+xVVImyrvqEevn;2PVIK5y{YbOqAMJuS4tV+fQaS#VPid~zsH;M6y zeJ7$N+&|=w39t~n^rDFWIabp7Oz(1LPX->N!eC-=pSc!(f1n6ii-0)%>s~6vLl?Da zV;hJsNJ7LdmCLO^D_iD3l8*o56T=HRKXl8KH>PgX(bxPhV?xI{9)Hhr6zy$xla=|a zoxv}okBUO$pMzOpyeBPC=Ykw@*k31I+Wm1ZP4sf<6mlZDW)h|AoQWlRcOUOB0o@?EE~^c8|80 zvV$i5k^CDwntU7c6N>k`ebN(}Na!)7%cNMjz(q7k<ADKY-Q3!~ z`(wHLYP^auOwBhF&gQIfP$#biFo-B)@`2yJc>XEdm{zZd424kdEantgy#2+Zk?fg6 zdbd=gy^3{df`M}S0wxipI=}3ai5cB`Y7k?OGYI`RiPG7ioWd?aeDZF%; zFS`tZGKf9~CdL#pwCx?3PgKlfy{)P7(?Wnp)|@&@owwqMW14Bda5?OW506NdY;O?c zTT-U#7Yq{VIXaqHs3?6$$e6f(>t}Lg#RhA%%tRx>2vg%Dy|O@OJPC zYj8?tY{k5cjYA4ipBtK@W?MW38uA{(^_Zi#6nCG$BNa+|VtVD;*68%Qz3WjDI-=`l zx8sbO2GrFp-n|ut>(n zu?jC^v`hHJ4H+LO_gwROl!=_>nTvkm|Fqn5k$jAO^mH8p&&fCnK;}Q?Bu_BFuyg z1L+8k5+0TvG_&G*Z;Vd(1allOorjLLt*N6E3|&EF55J^*0mIDhH+)D~2`USvVp&Rl zi!+_=r%5(Y6w4M|AyRdS8H}@??R>s4PV3iNBGQN)JGvF2u;b#($8d6@)NQqX`!@Aw zD>@wX!6HEpEZxYC=LR23GjYX_XCaLaN1)nsGRN#0NCHv%9F)#$_;z>JC+cS|$&B}K zW0!A+R`XiQQ3#;$TZbR*fccjIhaxX-^`whJAO!Xve)R#x5;{0T*?*(yhZFG5?o>1^ z|Msyll_CFkM}0_Q{enR4IkJ@giH^^EHELpB6Lac&+J?K4PlpV-L!znVoMN3KMvjo@AxdMpmpC-#lA#@Ka|CQ)`dfJIG z;(;aAdB9y~et$A{@qK-Tqq@4fYVT+}NbTeX!{{y)x&6xV$=X;g+}LqKGJs(r3^8o$JDZJ!0t~8Fy*P6;*0X+#E9+fugOTE9VPAU1=__fr8Sf4y<6GU6$Zgq&+UY3v z{hAL$q{&uNsIUawTlEL(x+ON7t_l94!ikQpVOhT_?CGMqXc3~xum`}dF-Kbw;S3zU za|wC07zjO?==$tr@Pm<752BE?ORKwXS(a?7{hRGYII6=rLpY9|%tiCVJG0{t=Tld? z#V-zm66duV+ai*+P!&UyIi=!WI{ldU1w%f;`;n*aQ*NO8m*ItQFH#U^;Tu)V94@8g zK^ltXpsFt&xp%mPy{|)`<1RKZnUe}o76*!TRKEQx)osvpNsEYlX07T2Y58Um`)E{d* zqQrgf7cVarDc3iFLDK4rgT4pN_Nl*op`4JH!jlZ__Ulqu*{ME5`aB?ANoYvdc%elhSD((y!QHL_FJ`6oD1W_4 z`?9o+UCAUkb}?5BHwK3rd;ycH+BkXs4V0pLYP!h0YaLfJ>@+#2E{~dJRoo*DNNUV~ z`7`V?rgcY2vAg5Ki}8g{K}x?=->=R{Wu_+As>K6)N9KW-uNA1y&yoXXs)i<4?&?{7oEfmSa~1%VkP>x>A=+^69JfCs+IT@G?gu+6Lt`g*m4*~;Co9O z42FHcFMaoxe&2$UJQ)G7pl^Oe;omwEoHtO25p;>AFdtx2mwzU4a?pa{PWN5M-tpco z&VhSTt0I+rJGMHqx?ISPr|Js+=wOqj3jgih9beVoH>c$%Tk$BZurndyGSP^2RgRWW zvEh{AF&gBO5NZsPpSUmfKEwX9@8Z8K0k7dX8%G?i2h%q@6%+XGxSZT_htZGq0o0#Z z2mBzb0lIk}w{2nT6nwFEKjIf3G>dzPEp zBB`Wh$UR6S`r1*kswHx^-&M1aV*yc|5RdseV{|@1@1p?bmn&_&KvDiijSjh) zh>=xXso?eF<(TcNkW>(_+1d7(xw@5Dp2W)Mt-OXse*)GgK0Ir()V=y@$RjG_-Qll0 zS~E~24*9MA-4#^Z2zwAj7}$tk*U*K`Q+HHjs9wCX;b0+VXEH9wu_O*QxL#iTnI62j zx`?o|Yq+^0O#kik_%Ocn?1^EQ5s;7GC$7?2wunemVo>-H4M8Oh{qR~67@|v;+-1%z}Prx8M$H?K^tp`ZcI0p$v;4> zjb0o8*#CU;$H04`kTPi<|+tQpM(LSv#LOZoQety<%%?xM0 zRehcl`6m3G;zf;dGf0)U3JvK8EN;|WFa89VumR)Tluc(<(^@NnY)WmsN99(zt$(R2 zZ@s2sJsSxjN^NG53J2hddl;+9TB|Hn-Ao@v_GNl5ZFt^jNCMfUVZ|433(U<4QFv!J zPOcnBF8t-RIZxw719!g^a7D7bP~{6L7_0x#@SBTU zRnlNqS3bOy_FxwxE{`s1$rnzIi0;HATq;JLxYA=0s*crkdPjGAtHU`{ z8nvS+Gc|70(X>aHU*KPV?+6+og@_&tcD{wTNb)>;=5qbF;KoQ+*bSH2aK&l@Ks`YQ zS!%+SL=CB?xAnrgNT|cVjjj8NN4$Sx@iIb~9VGO*KsLDG#Sm|A?%LSaI=q;f@pXfi z64X1wHHN#zO^@$EpsU_{foGC9N?#O965QbKfius2oQPL~Wx3~6Q7+MB?`u{MITY{8 z<%&C~YYqzd<3o!gJr5ET?R@=}p513RRD1`=yMykixq+SEJ-&(rdQf)nRNs#r9npa% zatzBU)Aql(>tKTgn#%C3@2UDLu5yMb-ZX}``93WnnW`g^_j@l-7K_HEv{$_I>mx!T zxP;z(6`%TCt-oK8dx@iIxH|S?6p5E0R5)RRGzL)<4^Dt--!wls{jWF){tQ;uykbU)FK}w>Cfej4qAnc zpy{;u)eprs2Zr8IlH(doN>pJKEIDyX+`R@;7QyK8a7>SZ*^x_ z6UP5_XLsEr|syOy)iI;2M-gAcyk$s^+g?tZ?RkYJ>0;!1vl8Z zgNF1sUpKRe^u-yNK9@=O7vMRa^WQ{fwzv%=e+n(rO?f$Sor_(rKsU9M8=12aCt2&; z$yG0crXYPPj5~BB8O9xRUtK8sx7j;~^Q@mKPl~G$8<(5A=g@=05MR9c->m*={MNeP z(d8TNEluxo`XLG-3)QW}GPTafu31PCfL}-DHS9sk06Y`71$ytbD~J$;l^DQT){E{( ztYdMMQ=fEaGLZ><5IqD_E?gw{w)(WybdLI=fMU-ql(+@f^qP%K=4pi6;65vE>VtQb z{w)Pz!k?rm==rpOA$ey->WKYyY<*8%c(EMBaoQ;+w zy25nPk#jNsL>%-&vj^@+!BgJ(?P=*US+gn@H*AOR8-WfsLT{_reES!4J0wTxCFCF4 zvhKTcu2JoVgbdsF7?WqLg&M9G1fw)X6W(C92v6!X$>n(oEp>yo#%2}=6v9~U_zQ6U zwXs9{qd<04fu{&mc?vcf@JF${g!&5B>hf1#HQ=;HJx4rnQ;j)J=L4_MUOE&MnJYBH zva_qJ(^s3um$NMV;NwOfh&=vVq$)Te(JTW=r1#&8tOvXqiCiz+6s`vOAZl9Yu@?3R z*{l0J-_O_NIK{fyhK@|$v|>YeA%5S!*6)bk^&^J(A{;IisN%+jo=k(gAChdD-%kPZ6 zCtztD7lZ{jl>_6p6};<3Dum127{j4>OU#BJ*@CFV{}trY3$OrGTtL~E@$;t+hJ6Up zJ!K#K9{!1z^Nn&?Ii7XfhDH}RrK}=tXp77IEqas;JLsQ;T0elW7x=yF3D^7Z(B>-G zTG-;AP5D;GllOr-I?OJwvPpl0VjhM)AGXBXZ+bEaf~Ehtf}V)s9x~3BZ+*CrkLPkw zI9rpg^?!7H^Y!~}(BAvH_{@9Yh1{<-164K7*83lV{fau?b8k99%8?HU;3+^XnJ^hWPA znk{Ck<~{xJ7mBxX_}@q8B2nZDWnjayjm0lBJt~&GI`?Vnw4R=#>MOiPTu z!=^h3VA-~ndwOOeCjl)eR0msX>gEP=7#*IMW@ZB)Cm3M10h}-!E^`KIXhQ(XYH2C3 zgL!sh&T5l)Y`_jk@jnp(AKO>KxL-aYjc#0%M zM_xYb01zA1Nq7>7ZEz{AYG~$vF?yamlnA(i0(F!za68oCfFcqTz2cUK!YCE^xTLQ0 z!}AB?Ld}SmMMYt)ZfML#;Nb$}? z4UHbl+w!sAL8hd#DeA&^E>S*dPdM(;%L;v*ZDY(Dwnp!HIe!|}E(Nn}d}^JrWpp^? z`#>239>eH*s_rJ+YSfVk4!i-=-T7Ej+*mM>d^^~{(|6{Qoo0TsdX(b@J!MwqZH+d? z*WB<#V>eK7@Cg66fBVbwmZ&FA*blD_tii|HlR0rya$_=^a^;=~pXg4udeI-%W%wbP zIgegV=yeusIuq$d7&zz$s;&4_UG!P~J0&0i$O1U>?^?(PV@9{s_3Bu_&t_j9K z_3b6o)ycj0BokCKWDV41_(PaG=w>?;X{WvO?b75me^k0lPO|FwTNk#6zdc;BQYWPJ z9wjQi#TGu6(O;7K0-58=F`3HQAyXknv&B!IPJm6k_H$iuoBP&u1|GV-|4G9yIYRV$ z3M#Bdo7g@JAo&OGPDzd@W97=&3rx7L*~p2{4z7#nOD;tdUF@4bar}jn6>;e3 z`DfwAc1?>PpZdsWXHiOwtZlz&TDG%!q+5n0WBpOxdgZ2OU|T`Y9+UzR%gC z%rPnVitdG}ZmCd^CKHo3FT_!8oM*jZzg9+zqj-<>1=4o-)_A>fZ^t>Gl(9~S+MV)R z{zpCp8TPZ>g}ABeg+HlV=9g5}!PGhd?tEw!)`un<^tl#qKRtHiC|u-aZYrxKp(zd1 z=L@L|{RGQEhCyZ|&-36Zqg;Ot0R`+G0r}^P6Aj!OCpF8iA_5`Fq#K#Y6xeDe@?sy> zZGgG9L~jse1ukAb-baNji2vH~z-87fD@{N-?2Te!(=h(>Pb3ewm+YncmJ_Z!V5j}v?QM4SSO6#CVkZ(YLHqyQ5c&k7_NCn~rS5?}1H>`a z%R!M5F3PGJ{XEiA7|i$k6AZo)CKc#=Le485pw!O6qu{;EX@E5;XH(h>SOZc$yKC{M zocXPgu*^nSv0FK@SN&ePHga20Hkj{9gBvSp zxG`yW5aL7|yQu7S$L;@X0WP>9k8B;(y#54f+TcdDvDD%3A1wW}f>6N`ZpZc{+mJ=^Yu$pg!`w)z8?0wjU{eGwD$WXROeKHKFnNOE;OCv2! zMBlq1Ew$0{?db~MxO>_TTfMO4)J+qAy^pzXcBw3AYrpv zW<1)ZG)d9ycW1p#o zm|EO>PLfYB|98KtiGb@HRU>o&j*{w1=YUfd(h$UEbQ2{KE=Fa*q}>s+fU)N?CbhM0uCbmh6{ps`XrM<$Obp=V17H1MO4(KmDUA!CysV z?w0fPeVv#+OJ-q8vm8ur@BlRq?9;|ENfu;(N+ltxRjm3`$^6(nhyM~%r+FjQru^c? z`;X|B;3-DW1GVocHipw}XTjySb|;F~_P>3e$376H`oXisw?mutNT)-#cwDqNEnmq& zR2%E50!U9OwnOuhO&+Iq#!?oTu5GTl))xbr;X+C^3&B|j^9=Z4p5YM`R)=T%gIg>h zKxUEfNliJP7!0eyFX5>)I3O3VCZeN{G9Oc4kJk%_;(#4776rcwSt{{)G_15Syxj@W zPJ44!FyxlgLboO<)A&lIB969}eMZ$dY{ObajHLV_DTGf?@>TR*(gyxlx$l=>3|y$B z8kiYY!tHYDKRRB@<0z@ix1RUx;!-9>N*A|4hIaDL!>W8@+dy~VsC@bq%e40?k^0!V zOvH7wY5E3nfI>|2l-eiqja{6MDHWbSBYmNV`!1((-;B?Bxwn7YtLRm6LYoG-rOK$T zz3X>=Z{i{dW@w{}LL@c?%taDUf(Zjg!|FKj9#FGlzO{=p*ltGHn|bPB5mGqX&V3XI z#FWf(7TOWz|B@~7QTSoFJS=78d+oTJ9#hOu9*ENQcm~q$$;VVIMPyXk>%;p=aa%33 z19RF~6m>bBMpX>0$;Wg0vq<8ptYr({H`G?|NL=z7e>>e9c2ab3M)j9=GOm8PUlG@n z`0upsucvf)raS06k=n+`{WBG9+h+UQWZ2-DD~$}-nI8I$7J(C5!x2kqLrVH+*_q}% zVJp0QPX4uA32&q4rv4#Kg3KF2ycJA{JNtBh$L_rbfzRk6Z!OM1dK$`67qMTy^?y~{VOj9blyXn^j11U; zk9XU-l883eMh|oBa!gq9{i}oRi$?&Jduj>rafHjG;Y8sBztPfyfj?!&!WcL26_U6g z_wjGS*yQ;pqAc7cI#gu>d{}x*9*_%7x8}td^KXc9mm8=*np%PFLn&3zuL_)P4IjU6 z6KsE(v@0pbb+xBZc-K%ZVb_xplX~-Yc$!-RX4(uL28GaKE(8S-f9p^7o(RZ)Z+fDG z{qErO$W_lj1C{3n`cW_SFrzLD8B~LBn}2o|9?H7!V_WifqWSa0mK4D`%N2B@gSlQ2 z?F-=~BGc>E+UKC`lK?y*d~T%3>G~&%_ci z@xQczR~UNlMe#IL6|0Ri$Y`v_f7qG=rNc$zrx*@BzmgU_5IUxGXy?=w58`g^slxdh!#66?@EexnL&?gw-Y%A@q{qNJu~Kj$`S^f>>tda%8 zR#-z!!N3)3EY!29!JEylOIbD1+QQ-knn;8#=|^pAK%dJ~EzrMJtDAAOpbR9(-rr9J zgC{aR|J4d188cW!=!}>V;(&eHJqf)nfEFbBO&QNBB_1mMdv|lCOX!}H*WZx7_#Ab3 zY2^6rC)S)fja@Ukfr`g^QnuMle5Zrt1?a}iOb_rTGtkiL*03L=RaH6;@MZ=;1w)zEFT(5uvXl_!bZ6}rEJ4}i~6k;A!rN{_1 zD|iDs^$;}-)mR^}7~Og{Q6!l<0y4fS?yC3k3d2kbMc> z$*L6pxf-vIGRiolI@pSXUzNZdfk+qwzxv!*x!9)?atZ~*^3Z3Cg+wJ)B81ysZdsYg zR&=lbhu;4wIMAHjMbVqaJda2T#+S!O^AY2=MY}Jc)~F51HG9FG)|?@?jFtdDoI&FR zbSdjcx`bjZe;~p@>6Lef%A9o=v*@bjNaJk0f8<^42n5ejc}}P zWcC*Q@%~aI_e_!W*(|hRGYQf2`}#4*X-F-kl;X~yo3QiV{_@vE_LN=qAsV$r+O)}( z4LMTk6!OF_9)UgO@a5|;ThQpczC2(JV_M+jI#|G^)5va_j{FN4)KqMuxbSYEW14jT zi}7(_M*s?xO`7alR7Ld8SKxma@inj}18po~Q0b@5I|mia4?JMiii8siEs6<$)HxvB ze|us4J^Jyykek&J?;E*sX=_fB_UeoTN)wY!%!u34E=SE8=?Vv1ti#6N6p)UNl+z2D z`P`Cv1p963sf3LuSsA+jgkpXz2rgAK{xi$3pSx4e?HTA}=TXvd=Lf%O1FgIK(TpLA zI^BQ1r#8=jQ3m-&RFk)C$d1)Kq;fg;z5t6CgGaQQcXQv_!jlosypsgD#UsLLQnh>tScL14W)^wBe=9YHpZ4{x zzO%#X@ic*SKXZzg6k!}gMXla)p3xs4613XFFM(7^X$lH^-J-U)`e#Le6QX1y#)qol z6<|rx^loPHZieZvp_-ZtuO%NDSGJ>IVgn>mvTY3c8zX%|xkLo#9V!DYT*7c3ODs}W z$Q^V@U$!z~Ma^6OVDe=%jm)DT2o<;AlRNDlf+nw#w9yZLH-ij5=|_C*d$d$&XSz5< z8y7Js%UG4JP;V?4bH|d;Y)*hj*jVEctgiaA3YnRy{nlHdB|`u8IiaYCImIcfz<<-0 z;Ed(?y8+8m3ZxPzuG;%RV=cODQA15bjia<=I6@N4n7x zj}_1fEY3hvVJO5MA<~N&R1?qp6-qTCdaF%^(9M_h3~C- zM!yQ**?Zi*kG-GDCkpvSs!9%-@B@}pODz0zy-}wXxBH@z2FAG~d8&iVv@LRKNpF=W zh6jEiS7XVbe5(bsVlHf4oqRCy4oPwC-_f&zy6upmS(YJU(wp*dc>wIO?JQhXmR*>E z6y(dZD#KGSFEtLmAXW37J!gG7OA!v$*6FK{j>YB&R^-H3T8>qopL8-X}h6g$#LLHP5!-1D+R8(T)@wNWi= zG3fH;sv`}KpM_EhlZ>ZYO9Y94VQI=GS9XNBnMp@3$ccLEuD1rp{LwIx_`ko@C-Vav zU(=fC-Y2|U9e2H?-t_8N5 z4s&d6W}(*Lt<`M}WaTx!$52~c<9hvd`!oj|L;FUhYHE0F`l8`tqbh3?>vtaJw_o)# zYh-R|tS#`0;0n4MYyt?owrC#WQl=~^2?H63)8w{qhGqDPydWddcRN5<;g=bC^RF4j z(iyd|Aji5)MKqa10fu!yZWEQ01@;IfAx_Y1NXJ{gd<&#Pgl;ReHE=1GE8kKu9O*y_ zdm{RM6Sr(0Qz9iKdhLY&rPV_RZGsrcj{qaQl`(;>||I;rag^G3$SN_=HUu-A! zke5EF)vedFLGlV9GG3Mnz7x?2$SC)01-_;!1r{|31JW*R1#?I^aN6+}z-$K`ZA@MX z{t$;7Yp8yvA#^M0m3#aPJu6#@mMGL`LuM)z9nnd0^0b)m$)^&f=l)~$tif}pX{zW( zg9Amy*I7g#xy?P)o*TwGC3+=Yiqsx(@DnqorL&@qx#CRhWbVIsyKA>e$9CMB7RV<} zkKhe>@uwU=!TR^>aj3HgVIUJn>4<5ZpMeT1zP_`=O7TOCBK8Hs?_qFkY0G{PuMYOt zj@M}{~Koj82aU48FR&ZdiB#{4m z8jk?FK^t53w@1_7DIFQ&r03!ez&X&7KdY!>&obhBr@PVUGp@Vu^T||K2r)s%v|2@9 zRn!CNpH;qLqtht}kv$gW5@+Rhxr)79`SNV(tt@rx>q3JBcqUzpo{~Dx} zlG30cNar9RNOv~~NDMg)J*1#g(kUGRL-!B@gCH&4F~HEx(9(7G|D5Z5S^BesfKg7a#W_|n6raC*+iHg3MR8rWVragxp6>1au&e#?^` zx+PftJSd`DMet89!|f~WhGUZPoB`qb42#I5p{P4K86@8>*uW8#415^a{oqO{{4YMN z_9~{@4GZ~_OEUcu)LJ$$JGuzTIK&Q*f*pvpo20}J3CBG6a%l^*Z~apaK>CeRT+Zg= z%EY$!^%62ti$>Sy%<=YSZknJXC(!%qnSphX~QwRD@tk0lZ6?RKB>-oN&0uA ztW@_!Z`HXVzt%(?urA!2)LziGu*0*SiQC4|M`$^Q#*}2SPftU8`j;TH<4~&S&~$uC zcU^0-_&WbzvTc9&&d|3GHC@QVnd`gA@9K3VKA!`qqH-v5G+JA4KWb>Hm@X~tFfJ(c zC*M;4764z>_3%S!{pilc_HBxp)%tRwj?<46=u&Tmb4r%?)<{m$X7larR7wd0TMUpW zmHtp~@#=&lb8L3x8!xQ*BsKppTJCq@$m8+~Gzr`w4iVeupw>odI)D9l15e@yJZkwv zq?u2aZTs7cyhbtVlI|mdhi$PX7B$lp-P7et_eOJob*z*i*KU1Ql`4i#jF?w< zKOzj#r%1eS5F&ajjkKrr1DfDRu8Whz07r`_7GP?ba&&UPak{rjcN*Duicy|_t!_JU zh6(U-ZSr0ef95sQt?e?siSP104pXcjIO?KA=TJoGt*?W$-|l+If#m}Z7OdcBOs1R~ zsf+u){DkClLsylsd?nP@9O3S=BI;o$4zXdQ9obN4fCQ>M6IDJe|6_J~Y*#jB*ks5_ zM*Y+~go1NkZ{{_knR1(D?M)&M{WQAVFS?t0FFx=_q{y$D$g9^U(p*AzM%D`6tslbYX z9fElE)5E>6ZUOl{>xSFcLn=T!UA0DPLp$O>Oew3*ZP=0U}&J)4UC5#5$ zdb!e3jm1A^_!g8_zlViytt}J2+V5d~Q`px8i3?y>0{}fTpg%Tu|AH9@y8MWzp=tN)Lbw$5+y|wpr zzVMy%6IscYe`&PGgtx{d%Gphb&EW*1?NP?vmqUE>I<=~6L3b(x>GOJ?ztF;=*5)`B zb@)uwRLu)|OQqKV!AVXz>6K|pvZfN0M8b1c`#rD8+7>@*|2jk8Tx=ClMdmoifxXYp zpDrzpP`=@zmym3^^td|de1A|5IdHZM#0cV-&sr*>Y)~Vnb~YLz?pw11Pb8g*^Lpph zMjb(e6VQYrCDcL!0&mlDd;sv&2~jXfpMZ)3O@&*>8BsE9f=>hleG@KC9&kv0It(g>b+2eLKl#vF7K7*-kp9Q0&ceEn}JNY!Q?HxLvK4qy`9B-z7UsL8` z!q}&(EOI3j-I(MW707^M*XdDi)HSkrR%dn4@Ly~+qPj4@6Z>P`Z~AH2<9G3LT5vTc z+J-{aQnD=Q�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 literal 0 HcmV?d00001 diff --git a/CHANGELOG.md b/CHANGELOG.md index 3269aef..1eb1216 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Changed +- Migrated to [Slash Commands](https://support.discord.com/hc/en-us/articles/1500000368501-Slash-Commands-FAQ) +- Upgrading **will cause unavoidable data loss**. Because slash commands work differently, **all shortcuts will be lost**. Functionality similar to shortcuts is provided by the `/favorites` command. +- Because slash commands require different permissions, **you must kick Muse and re-add Muse to your server** before you can use the bot. ## [0.5.4] - 2022-02-01 ### Fixed diff --git a/Dockerfile b/Dockerfile index d1310ca..47a3592 100644 --- a/Dockerfile +++ b/Dockerfile @@ -35,6 +35,11 @@ COPY --from=builder /usr/app/migrations migrations RUN yarn prisma generate +ARG COMMIT_HASH=unknown + ENV DATA_DIR /data +ENV NODE_ENV production +ENV BUILD_DATE $(date) +ENV COMMIT_HASH $COMMIT_HASH CMD ["yarn", "start"] diff --git a/README.md b/README.md index 069f41d..f5f07cf 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,9 @@ Muse is a **highly-opinionated midwestern self-hosted** Discord music bot **that doesn't suck**. It's made for small to medium-sized Discord servers/guilds (think about a group the size of you, your friends, and your friend's friends). -### Features +![Hero graphic](.github/hero.png) + +## Features - 🎥 Livestreams - ⏩ Seeking within a song/video @@ -16,11 +18,7 @@ Muse is a **highly-opinionated midwestern self-hosted** Discord music bot **that - ✍️ Written in TypeScript, easily extendable - ❤️ Loyal Packers fan -### Design Philosophy - -I believe it makes much more sense to let Discord handle user permissions (whenever possible) rather than building them into a bot and adding additional complexity. Instead of only allowing users with a certain role to control Muse, Muse allows anyone who has access to its bound channel to control it. Instead of specifying the owner as a user ID in the config, Muse simply looks at the guild owner. - -### Running +## Running Muse is written in TypeScript. You can either run Muse with Docker (recommended) or directly with Node.js. Both methods require API keys passed in as environment variables: @@ -30,14 +28,14 @@ Muse is written in TypeScript. You can either run Muse with Docker (recommended) Muse will log a URL when run. Open this URL in a browser to invite Muse to your server. Muse will DM the server owner after it's added with setup instructions. -#### Versioning +### Versioning The `master` branch acts as the developing / bleeding edge branch and is not guaranteed to be stable. When running a production instance, I recommend that you use the [latest release](https://github.com/codetheweb/muse/releases/). -#### Docker +### 🐳 Docker There are a variety of image tags available: - `:2`: versions >= 2.0.0 @@ -71,7 +69,7 @@ services: - SPOTIFY_CLIENT_SECRET= ``` -#### Node.js +### Node.js **Prerequisites**: Node.js, ffmpeg @@ -84,6 +82,12 @@ services: **Note**: if you're on Windows, you may need to manually set the ffmpeg path. See [#345](https://github.com/codetheweb/muse/issues/345) for details. -#### Advanced +## ⚙️ Additional configuration (advanced) + +### Cache By default, Muse limits the total cache size to around 2 GB. If you want to change this, set the environment variable `CACHE_LIMIT`. For example, `CACHE_LIMIT=512MB` or `CACHE_LIMIT=10GB`. + +### Bot-wide commands + +If you have Muse running in a lot of guilds (10+) you may want to switch to registering commands bot-wide rather than for each guild. (The downside to this is that command updates can take up to an hour to propagate.) To do this, set the environment variable `REGISTER_COMMANDS_ON_BOT` to `true`. diff --git a/migrations/20220128000207_add_favorite_query_model/migration.sql b/migrations/20220128000207_add_favorite_query_model/migration.sql new file mode 100644 index 0000000..ec69910 --- /dev/null +++ b/migrations/20220128000207_add_favorite_query_model/migration.sql @@ -0,0 +1,10 @@ +-- CreateTable +CREATE TABLE "FavoriteQuery" ( + "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + "guildId" TEXT NOT NULL, + "authorId" TEXT NOT NULL, + "name" TEXT NOT NULL, + "query" TEXT NOT NULL, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL +); diff --git a/migrations/20220128000623_remove_shortcut_model/migration.sql b/migrations/20220128000623_remove_shortcut_model/migration.sql new file mode 100644 index 0000000..469b453 --- /dev/null +++ b/migrations/20220128000623_remove_shortcut_model/migration.sql @@ -0,0 +1,10 @@ +/* + Warnings: + + - You are about to drop the `Shortcut` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropTable +PRAGMA foreign_keys=off; +DROP TABLE "Shortcut"; +PRAGMA foreign_keys=on; diff --git a/migrations/20220128003935_make_favorite_query_name_unqiue/migration.sql b/migrations/20220128003935_make_favorite_query_name_unqiue/migration.sql new file mode 100644 index 0000000..39fb6f7 --- /dev/null +++ b/migrations/20220128003935_make_favorite_query_name_unqiue/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - A unique constraint covering the columns `[name]` on the table `FavoriteQuery` will be added. If there are existing duplicate values, this will fail. + +*/ +-- CreateIndex +CREATE UNIQUE INDEX "FavoriteQuery_name_key" ON "FavoriteQuery"("name"); diff --git a/migrations/20220128012347_fix_unique_constraint/migration.sql b/migrations/20220128012347_fix_unique_constraint/migration.sql new file mode 100644 index 0000000..f777d06 --- /dev/null +++ b/migrations/20220128012347_fix_unique_constraint/migration.sql @@ -0,0 +1,11 @@ +/* + Warnings: + + - A unique constraint covering the columns `[guildId,name]` on the table `FavoriteQuery` will be added. If there are existing duplicate values, this will fail. + +*/ +-- DropIndex +DROP INDEX "FavoriteQuery_name_key"; + +-- CreateIndex +CREATE UNIQUE INDEX "FavoriteQuery_guildId_name_key" ON "FavoriteQuery"("guildId", "name"); diff --git a/migrations/20220128020826_remove_prefix_from_setting/migration.sql b/migrations/20220128020826_remove_prefix_from_setting/migration.sql new file mode 100644 index 0000000..c06286b --- /dev/null +++ b/migrations/20220128020826_remove_prefix_from_setting/migration.sql @@ -0,0 +1,21 @@ +/* + Warnings: + + - You are about to drop the column `finishedSetup` on the `Setting` table. All the data in the column will be lost. + - You are about to drop the column `prefix` on the `Setting` table. All the data in the column will be lost. + +*/ +-- RedefineTables +PRAGMA foreign_keys=OFF; +CREATE TABLE "new_Setting" ( + "guildId" TEXT NOT NULL PRIMARY KEY, + "channel" TEXT, + "playlistLimit" INTEGER NOT NULL DEFAULT 50, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL +); +INSERT INTO "new_Setting" ("channel", "createdAt", "guildId", "playlistLimit", "updatedAt") SELECT "channel", "createdAt", "guildId", "playlistLimit", "updatedAt" FROM "Setting"; +DROP TABLE "Setting"; +ALTER TABLE "new_Setting" RENAME TO "Setting"; +PRAGMA foreign_key_check; +PRAGMA foreign_keys=ON; diff --git a/migrations/20220129010359_remove_channel/migration.sql b/migrations/20220129010359_remove_channel/migration.sql new file mode 100644 index 0000000..38a5336 --- /dev/null +++ b/migrations/20220129010359_remove_channel/migration.sql @@ -0,0 +1,19 @@ +/* + Warnings: + + - You are about to drop the column `channel` on the `Setting` table. All the data in the column will be lost. + +*/ +-- RedefineTables +PRAGMA foreign_keys=OFF; +CREATE TABLE "new_Setting" ( + "guildId" TEXT NOT NULL PRIMARY KEY, + "playlistLimit" INTEGER NOT NULL DEFAULT 50, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL +); +INSERT INTO "new_Setting" ("createdAt", "guildId", "playlistLimit", "updatedAt") SELECT "createdAt", "guildId", "playlistLimit", "updatedAt" FROM "Setting"; +DROP TABLE "Setting"; +ALTER TABLE "new_Setting" RENAME TO "Setting"; +PRAGMA foreign_key_check; +PRAGMA foreign_keys=ON; diff --git a/migrations/20220129012310_add_role_id_column/migration.sql b/migrations/20220129012310_add_role_id_column/migration.sql new file mode 100644 index 0000000..d46c94c --- /dev/null +++ b/migrations/20220129012310_add_role_id_column/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Setting" ADD COLUMN "roleId" TEXT; diff --git a/package.json b/package.json index 708be51..8b45124 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,8 @@ "dts" ], "scripts": { - "lint": "eslint 'src/**/*.ts'", - "lint:fix": "eslint 'src/**/*.ts' --fix", + "lint": "eslint \"src/**/*.{ts,tsx}\"", + "lint:fix": "eslint \"src/**/*.{ts,tsx}\" --fix", "clean": "rm -rf dist dts", "test": "npm run lint", "build": "tsc", @@ -52,7 +52,7 @@ "eslint-config-xo-typescript": "^0.44.0", "husky": "^4.3.8", "nodemon": "^2.0.7", - "prisma": "^3.7.0", + "prisma": "^3.8.1", "release-it": "^14.11.8", "ts-node": "^10.4.0", "type-fest": "^2.8.0", @@ -81,9 +81,11 @@ } }, "dependencies": { + "@discordjs/builders": "^0.12.0", "@discordjs/opus": "^0.7.0", + "@discordjs/rest": "^0.3.0", "@discordjs/voice": "^0.8.0", - "@prisma/client": "^3.7.0", + "@prisma/client": "^3.8.1", "@types/libsodium-wrappers": "^0.7.9", "array-shuffle": "^3.0.0", "debug": "^4.3.3", diff --git a/schema.prisma b/schema.prisma index 95ce596..66ea3b7 100644 --- a/schema.prisma +++ b/schema.prisma @@ -25,25 +25,20 @@ model KeyValueCache { model Setting { guildId String @id - prefix String - channel String? - finishedSetup Boolean @default(false) playlistLimit Int @default(50) + roleId String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } -model Shortcut { +model FavoriteQuery { id Int @id @default(autoincrement()) guildId String authorId String - shortcut String - command String + name String + query String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt - - @@index([shortcut], map: "shortcuts_shortcut") - @@index([guildId], map: "shortcuts_guild_id") - @@index([guildId, shortcut]) + @@unique([guildId, name]) } diff --git a/src/bot.ts b/src/bot.ts index 4a97f6e..0a041ec 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -1,147 +1,167 @@ -import {Client, Message, Collection} from 'discord.js'; +import {Client, Collection, User} from 'discord.js'; import {inject, injectable} from 'inversify'; import ora from 'ora'; import {TYPES} from './types.js'; -import {prisma} from './utils/db.js'; import container from './inversify.config.js'; import Command from './commands/index.js'; import debug from './utils/debug.js'; -import NaturalLanguage from './services/natural-language-commands.js'; import handleGuildCreate from './events/guild-create.js'; import handleVoiceStateUpdate from './events/voice-state-update.js'; +import handleGuildUpdate from './events/guild-update.js'; import errorMsg from './utils/error-msg.js'; import {isUserInVoice} from './utils/channels.js'; import Config from './services/config.js'; import {generateDependencyReport} from '@discordjs/voice'; +import {REST} from '@discordjs/rest'; +import {Routes} from 'discord-api-types/v9'; +import updatePermissionsForGuild from './utils/update-permissions-for-guild.js'; @injectable() export default class { private readonly client: Client; - private readonly naturalLanguage: NaturalLanguage; private readonly token: string; - private readonly commands!: Collection; + private readonly shouldRegisterCommandsOnBot: boolean; + private readonly commandsByName!: Collection; + private readonly commandsByButtonId!: Collection; constructor( @inject(TYPES.Client) client: Client, - @inject(TYPES.Services.NaturalLanguage) naturalLanguage: NaturalLanguage, @inject(TYPES.Config) config: Config, ) { this.client = client; - this.naturalLanguage = naturalLanguage; this.token = config.DISCORD_TOKEN; - this.commands = new Collection(); + this.shouldRegisterCommandsOnBot = config.REGISTER_COMMANDS_ON_BOT; + this.commandsByName = new Collection(); + this.commandsByButtonId = new Collection(); } - public async listen(): Promise { + public async register(): Promise { // Load in commands - container.getAll(TYPES.Command).forEach(command => { - const commandNames = [command.name, ...command.aliases]; - - commandNames.forEach(commandName => - this.commands.set(commandName, command), - ); - }); - - this.client.on('messageCreate', async (msg: Message) => { - // Get guild settings - if (!msg.guild) { - return; - } - - const settings = await prisma.setting.findUnique({ - where: { - guildId: msg.guild.id, - }, - }); - - if (!settings) { - // Got into a bad state, send owner welcome message - this.client.emit('guildCreate', msg.guild); - return; - } - - const {prefix, channel} = settings; - - if ( - !msg.content.startsWith(prefix) - && !msg.author.bot - && msg.channel.id === channel - && (await this.naturalLanguage.execute(msg)) - ) { - // Natural language command handled message - return; - } - - if ( - !msg.content.startsWith(prefix) - || msg.author.bot - || msg.channel.id !== channel - ) { - return; - } - - let args = msg.content.slice(prefix.length).split(/ +/); - const command = args.shift()!.toLowerCase(); - - const shortcut = await prisma.shortcut.findFirst({ - where: { - guildId: msg.guild.id, - shortcut: command, - }, - }); - - let handler: Command; - - if (this.commands.has(command)) { - handler = this.commands.get(command)!; - } else if (shortcut) { - const possibleHandler = this.commands.get( - shortcut.command.split(' ')[0], - ); - - if (possibleHandler) { - handler = possibleHandler; - args = shortcut.command.split(/ +/).slice(1); - } else { - return; - } - } else { - return; - } - + for (const command of container.getAll(TYPES.Command)) { + // Make sure we can serialize to JSON without errors try { - if (handler.requiresVC && !isUserInVoice(msg.guild, msg.author)) { - await msg.channel.send(errorMsg('gotta be in a voice channel')); - return; - } + command.slashCommand.toJSON(); + } catch (error) { + console.error(error); + throw new Error(`Could not serialize /${command.slashCommand.name ?? ''} to JSON`); + } - await handler.execute(msg, args); + if (command.slashCommand.name) { + this.commandsByName.set(command.slashCommand.name, command); + } + + if (command.handledButtonIds) { + for (const buttonId of command.handledButtonIds) { + this.commandsByButtonId.set(buttonId, command); + } + } + } + + // Register event handlers + this.client.on('interactionCreate', async interaction => { + try { + if (interaction.isCommand()) { + const command = this.commandsByName.get(interaction.commandName); + + if (!command) { + return; + } + + if (!interaction.guild) { + await interaction.reply(errorMsg('you can\'t use this bot in a DM')); + return; + } + + const requiresVC = command.requiresVC instanceof Function ? command.requiresVC(interaction) : command.requiresVC; + + if (requiresVC && interaction.member && !isUserInVoice(interaction.guild, interaction.member.user as User)) { + await interaction.reply({content: errorMsg('gotta be in a voice channel'), ephemeral: true}); + return; + } + + if (command.execute) { + await command.execute(interaction); + } + } else if (interaction.isButton()) { + const command = this.commandsByButtonId.get(interaction.customId); + + if (!command) { + return; + } + + if (command.handleButtonInteraction) { + await command.handleButtonInteraction(interaction); + } + } else if (interaction.isAutocomplete()) { + const command = this.commandsByName.get(interaction.commandName); + + if (!command) { + return; + } + + if (command.handleAutocompleteInteraction) { + await command.handleAutocompleteInteraction(interaction); + } + } } catch (error: unknown) { debug(error); - await msg.channel.send( - errorMsg((error as Error).message.toLowerCase()), - ); + + // This can fail if the message was deleted, and we don't want to crash the whole bot + try { + if ((interaction.isApplicationCommand() || interaction.isButton()) && (interaction.replied || interaction.deferred)) { + await interaction.editReply(errorMsg(error as Error)); + } else if (interaction.isApplicationCommand() || interaction.isButton()) { + await interaction.reply({content: errorMsg(error as Error), ephemeral: true}); + } + } catch {} } }); const spinner = ora('📡 connecting to Discord...').start(); - this.client.on('ready', () => { + this.client.once('ready', async () => { debug(generateDependencyReport()); - spinner.succeed( - `Ready! Invite the bot with https://discordapp.com/oauth2/authorize?client_id=${this.client.user?.id ?? '' - }&scope=bot&permissions=36752448`, - ); + // Update commands + const rest = new REST({version: '9'}).setToken(this.token); + + if (this.shouldRegisterCommandsOnBot) { + spinner.text = '📡 updating commands on bot...'; + + await rest.put( + Routes.applicationCommands(this.client.user!.id), + {body: this.commandsByName.map(command => command.slashCommand.toJSON())}, + ); + } else { + spinner.text = '📡 updating commands in all guilds...'; + + await Promise.all([ + ...this.client.guilds.cache.map(async guild => { + await rest.put( + Routes.applicationGuildCommands(this.client.user!.id, guild.id), + {body: this.commandsByName.map(command => command.slashCommand.toJSON())}, + ); + }), + // Remove commands registered on bot (if they exist) + rest.put(Routes.applicationCommands(this.client.user!.id), {body: []}), + ], + ); + } + + // Update permissions + spinner.text = '📡 updating permissions...'; + await Promise.all(this.client.guilds.cache.map(async guild => updatePermissionsForGuild(guild))); + + spinner.succeed(`Ready! Invite the bot with https://discordapp.com/oauth2/authorize?client_id=${this.client.user?.id ?? ''}&scope=bot%20applications.commands&permissions=36700160`); }); this.client.on('error', console.error); this.client.on('debug', debug); - // Register event handlers this.client.on('guildCreate', handleGuildCreate); this.client.on('voiceStateUpdate', handleVoiceStateUpdate); + this.client.on('guildUpdate', handleGuildUpdate); - return this.client.login(this.token); + await this.client.login(this.token); } } diff --git a/src/commands/clear.ts b/src/commands/clear.ts index 9906dab..2b258cb 100644 --- a/src/commands/clear.ts +++ b/src/commands/clear.ts @@ -1,16 +1,15 @@ import {inject, injectable} from 'inversify'; -import {Message} from 'discord.js'; +import {CommandInteraction} from 'discord.js'; +import {SlashCommandBuilder} from '@discordjs/builders'; import {TYPES} from '../types.js'; import PlayerManager from '../managers/player.js'; import Command from '.'; @injectable() export default class implements Command { - public name = 'clear'; - public aliases = ['c']; - public examples = [ - ['clear', 'clears all songs in queue except currently playing'], - ]; + public readonly slashCommand = new SlashCommandBuilder() + .setName('clear') + .setDescription('clears all songs in queue except currently playing song'); public requiresVC = true; @@ -20,9 +19,9 @@ export default class implements Command { this.playerManager = playerManager; } - public async execute(msg: Message, _: string []): Promise { - this.playerManager.get(msg.guild!.id).clear(); + public async execute(interaction: CommandInteraction) { + this.playerManager.get(interaction.guild!.id).clear(); - await msg.channel.send('clearer than a field after a fresh harvest'); + await interaction.reply('clearer than a field after a fresh harvest'); } } diff --git a/src/commands/config.ts b/src/commands/config.ts index 20dafed..65aa36b 100644 --- a/src/commands/config.ts +++ b/src/commands/config.ts @@ -1,121 +1,103 @@ -import {TextChannel, Message, GuildChannel, ThreadChannel} from 'discord.js'; +import {SlashCommandBuilder} from '@discordjs/builders'; +import {CommandInteraction, MessageEmbed} from 'discord.js'; import {injectable} from 'inversify'; -import errorMsg from '../utils/error-msg.js'; -import Command from '.'; import {prisma} from '../utils/db.js'; +import updatePermissionsForGuild from '../utils/update-permissions-for-guild.js'; +import Command from './index.js'; @injectable() export default class implements Command { - public name = 'config'; - public aliases = []; - public examples = [ - ['config prefix !', 'set the prefix to !'], - ['config channel music-commands', 'bind the bot to the music-commands channel'], - ['config playlist-limit 30', 'set the playlist song limit to 30'], - ]; + public readonly slashCommand = new SlashCommandBuilder() + .setName('config') + .setDescription('configure bot settings') + .addSubcommand(subcommand => subcommand + .setName('set-playlist-limit') + .setDescription('set the maximum number of tracks that can be added from a playlist') + .addIntegerOption(option => option + .setName('limit') + .setDescription('maximum number of tracks') + .setRequired(true))) + .addSubcommand(subcommand => subcommand + .setName('set-role') + .setDescription('set the role that is allowed to use the bot') + .addRoleOption(option => option + .setName('role') + .setDescription('allowed role') + .setRequired(true))) + .addSubcommand(subcommand => subcommand + .setName('get') + .setDescription('show all settings')); - public async execute(msg: Message, args: string []): Promise { - if (args.length === 0) { - // Show current settings - const settings = await prisma.setting.findUnique({ - where: { - guildId: msg.guild!.id, - }, - }); + async execute(interaction: CommandInteraction) { + switch (interaction.options.getSubcommand()) { + case 'set-playlist-limit': { + const limit = interaction.options.getInteger('limit')!; - if (settings?.channel) { - let response = `prefix: \`${settings.prefix}\`\n`; - // eslint-disable-next-line @typescript-eslint/no-base-to-string - response += `channel: ${msg.guild!.channels.cache.get(settings.channel)!.toString()}\n`; - response += `playlist-limit: ${settings.playlistLimit}`; - - await msg.channel.send(response); - } - - return; - } - - const setting = args[0]; - - if (args.length !== 2) { - await msg.channel.send(errorMsg('incorrect number of arguments')); - return; - } - - if (msg.author.id !== msg.guild!.ownerId) { - await msg.channel.send(errorMsg('not authorized')); - return; - } - - switch (setting) { - case 'prefix': { - const newPrefix = args[1]; - - await prisma.setting.update({ - where: { - guildId: msg.guild!.id, - }, - data: { - prefix: newPrefix, - }, - }); - - await msg.channel.send(`👍 prefix updated to \`${newPrefix}\``); - break; - } - - case 'channel': { - let channel: GuildChannel | ThreadChannel | undefined; - - if (args[1].includes('<#') && args[1].includes('>')) { - channel = msg.guild!.channels.cache.find(c => c.id === args[1].slice(2, args[1].indexOf('>'))); - } else { - channel = msg.guild!.channels.cache.find(c => c.name === args[1]); - } - - if (channel && channel.type === 'GUILD_TEXT') { - await prisma.setting.update({ - where: { - guildId: msg.guild!.id, - }, - data: { - channel: channel.id, - }, - }); - - await Promise.all([ - (channel as TextChannel).send('hey apparently I\'m bound to this channel now'), - msg.react('👍'), - ]); - } else { - await msg.channel.send(errorMsg('either that channel doesn\'t exist or you want me to become sentient and listen to a voice channel')); - } - - break; - } - - case 'playlist-limit': { - const playlistLimit = parseInt(args[1], 10); - if (playlistLimit <= 0) { - await msg.channel.send(errorMsg('please enter a valid number')); - return; + if (limit < 1) { + throw new Error('invalid limit'); } await prisma.setting.update({ where: { - guildId: msg.guild!.id, + guildId: interaction.guild!.id, }, data: { - playlistLimit, + playlistLimit: limit, }, }); - await msg.channel.send(`👍 playlist-limit updated to ${playlistLimit}`); + await interaction.reply('👍 limit updated'); + + break; + } + + case 'set-role': { + const role = interaction.options.getRole('role')!; + + await prisma.setting.update({ + where: { + guildId: interaction.guild!.id, + }, + data: { + roleId: role.id, + }, + }); + + await updatePermissionsForGuild(interaction.guild!); + + await interaction.reply('👍 role updated'); + + break; + } + + case 'get': { + const embed = new MessageEmbed().setTitle('Config'); + + const config = await prisma.setting.findUnique({where: {guildId: interaction.guild!.id}}); + + if (!config) { + throw new Error('no config found'); + } + + const settingsToShow = { + 'Playlist Limit': config.playlistLimit, + Role: config.roleId ? `<@&${config.roleId}>` : 'not set', + }; + + let description = ''; + for (const [key, value] of Object.entries(settingsToShow)) { + description += `**${key}**: ${value}\n`; + } + + embed.setDescription(description); + + await interaction.reply({embeds: [embed]}); + break; } default: - await msg.channel.send(errorMsg('I\'ve never met this setting in my life')); + throw new Error('unknown subcommand'); } } } diff --git a/src/commands/disconnect.ts b/src/commands/disconnect.ts index 89b0b85..4df76db 100644 --- a/src/commands/disconnect.ts +++ b/src/commands/disconnect.ts @@ -1,17 +1,15 @@ -import {Message} from 'discord.js'; +import {CommandInteraction} from 'discord.js'; +import {SlashCommandBuilder} from '@discordjs/builders'; import {TYPES} from '../types.js'; import {inject, injectable} from 'inversify'; import PlayerManager from '../managers/player.js'; -import errorMsg from '../utils/error-msg.js'; import Command from '.'; @injectable() export default class implements Command { - public name = 'disconnect'; - public aliases = ['dc']; - public examples = [ - ['disconnect', 'pauses and disconnects player'], - ]; + public readonly slashCommand = new SlashCommandBuilder() + .setName('disconnect') + .setDescription('pauses and disconnects player'); public requiresVC = true; @@ -21,16 +19,15 @@ export default class implements Command { this.playerManager = playerManager; } - public async execute(msg: Message, _: string []): Promise { - const player = this.playerManager.get(msg.guild!.id); + public async execute(interaction: CommandInteraction) { + const player = this.playerManager.get(interaction.guild!.id); if (!player.voiceConnection) { - await msg.channel.send(errorMsg('not connected')); - return; + throw new Error('not connected'); } player.disconnect(); - await msg.channel.send('u betcha'); + await interaction.reply('u betcha'); } } diff --git a/src/commands/favorites.ts b/src/commands/favorites.ts new file mode 100644 index 0000000..98f1ba9 --- /dev/null +++ b/src/commands/favorites.ts @@ -0,0 +1,195 @@ +import {SlashCommandBuilder} from '@discordjs/builders'; +import {AutocompleteInteraction, CommandInteraction, MessageEmbed} from 'discord.js'; +import {inject, injectable} from 'inversify'; +import Command from '.'; +import AddQueryToQueue from '../services/add-query-to-queue.js'; +import {TYPES} from '../types.js'; +import {prisma} from '../utils/db.js'; + +@injectable() +export default class implements Command { + public readonly slashCommand = new SlashCommandBuilder() + .setName('favorites') + .setDescription('adds a song to your favorites') + .addSubcommand(subcommand => subcommand + .setName('use') + .setDescription('use a favorite') + .addStringOption(option => option + .setName('name') + .setDescription('name of favorite') + .setRequired(true) + .setAutocomplete(true)) + .addBooleanOption(option => option + .setName('immediate') + .setDescription('add track to the front of the queue')) + .addBooleanOption(option => option + .setName('shuffle') + .setDescription('shuffle the input if you\'re adding multiple tracks'))) + .addSubcommand(subcommand => subcommand + .setName('list') + .setDescription('list all favorites')) + .addSubcommand(subcommand => subcommand + .setName('create') + .setDescription('create a new favorite') + .addStringOption(option => option + .setName('name') + .setDescription('you\'ll type this when using this favorite') + .setRequired(true)) + .addStringOption(option => option + .setName('query') + .setDescription('any input you\'d normally give to the play command') + .setRequired(true), + )) + .addSubcommand(subcommand => subcommand + .setName('remove') + .setDescription('remove a favorite') + .addStringOption(option => option + .setName('name') + .setDescription('name of favorite') + .setAutocomplete(true) + .setRequired(true), + ), + ); + + constructor(@inject(TYPES.Services.AddQueryToQueue) private readonly addQueryToQueue: AddQueryToQueue) {} + + requiresVC = (interaction: CommandInteraction) => interaction.options.getSubcommand() === 'use'; + + async execute(interaction: CommandInteraction) { + switch (interaction.options.getSubcommand()) { + case 'use': + await this.use(interaction); + break; + case 'list': + await this.list(interaction); + break; + case 'create': + await this.create(interaction); + break; + case 'remove': + await this.remove(interaction); + break; + default: + throw new Error('unknown subcommand'); + } + } + + async handleAutocompleteInteraction(interaction: AutocompleteInteraction) { + const subcommand = interaction.options.getSubcommand(); + const query = interaction.options.getString('name')!.trim(); + + const favorites = await prisma.favoriteQuery.findMany({ + where: { + guildId: interaction.guild!.id, + }, + }); + + let results = query === '' ? favorites : favorites.filter(f => f.name.startsWith(query)); + + if (subcommand === 'remove') { + // Only show favorites that user is allowed to remove + results = interaction.member?.user.id === interaction.guild?.ownerId ? results : results.filter(r => r.authorId === interaction.member!.user.id); + } + + await interaction.respond(results.map(r => ({ + name: r.name, + value: r.name, + }))); + } + + private async use(interaction: CommandInteraction) { + const name = interaction.options.getString('name')!.trim(); + + const favorite = await prisma.favoriteQuery.findFirst({ + where: { + name, + guildId: interaction.guild!.id, + }, + }); + + if (!favorite) { + throw new Error('no favorite with that name exists'); + } + + await this.addQueryToQueue.addToQueue({ + interaction, + query: favorite.query, + shuffleAdditions: interaction.options.getBoolean('shuffle') ?? false, + addToFrontOfQueue: interaction.options.getBoolean('immediate') ?? false, + }); + } + + private async list(interaction: CommandInteraction) { + const favorites = await prisma.favoriteQuery.findMany({ + where: { + guildId: interaction.guild!.id, + }, + }); + + if (favorites.length === 0) { + await interaction.reply('there aren\'t any favorites yet'); + return; + } + + const embed = new MessageEmbed().setTitle('Favorites'); + + let description = ''; + for (const favorite of favorites) { + description += `**${favorite.name}**: ${favorite.query} (<@${favorite.authorId}>)\n`; + } + + embed.setDescription(description); + + await interaction.reply({ + embeds: [embed], + }); + } + + private async create(interaction: CommandInteraction) { + const name = interaction.options.getString('name')!.trim(); + const query = interaction.options.getString('query')!.trim(); + + const existingFavorite = await prisma.favoriteQuery.findFirst({where: { + guildId: interaction.guild!.id, + name, + }}); + + if (existingFavorite) { + throw new Error('a favorite with that name already exists'); + } + + await prisma.favoriteQuery.create({ + data: { + authorId: interaction.member!.user.id, + guildId: interaction.guild!.id, + name, + query, + }, + }); + + await interaction.reply('👍 favorite created'); + } + + private async remove(interaction: CommandInteraction) { + const name = interaction.options.getString('name')!.trim(); + + const favorite = await prisma.favoriteQuery.findFirst({where: { + name, + guildId: interaction.guild!.id, + }}); + + if (!favorite) { + throw new Error('no favorite with that name exists'); + } + + const isUserGuildOwner = interaction.member!.user.id === interaction.guild!.ownerId; + + if (favorite.authorId !== interaction.member!.user.id && !isUserGuildOwner) { + throw new Error('you can only remove your own favorites'); + } + + await prisma.favoriteQuery.delete({where: {id: favorite.id}}); + + await interaction.reply('👍 favorite removed'); + } +} diff --git a/src/commands/fseek.ts b/src/commands/fseek.ts index 16d1430..985a7c4 100644 --- a/src/commands/fseek.ts +++ b/src/commands/fseek.ts @@ -1,18 +1,20 @@ -import {Message, TextChannel} from 'discord.js'; +import {CommandInteraction} from 'discord.js'; +import {SlashCommandBuilder} from '@discordjs/builders'; import {TYPES} from '../types.js'; import {inject, injectable} from 'inversify'; import PlayerManager from '../managers/player.js'; -import LoadingMessage from '../utils/loading-message.js'; -import errorMsg from '../utils/error-msg.js'; import Command from '.'; +import {prettyTime} from '../utils/time.js'; @injectable() export default class implements Command { - public name = 'fseek'; - public aliases = []; - public examples = [ - ['fseek 10', 'skips forward in current song by 10 seconds'], - ]; + public readonly slashCommand = new SlashCommandBuilder() + .setName('fseek') + .setDescription('seek forward in the current song') + .addNumberOption(option => option + .setName('seconds') + .setDescription('the number of seconds to skip forward') + .setRequired(true)); public requiresVC = true; @@ -22,38 +24,34 @@ export default class implements Command { this.playerManager = playerManager; } - public async execute(msg: Message, args: string []): Promise { - const player = this.playerManager.get(msg.guild!.id); + public async execute(interaction: CommandInteraction): Promise { + const player = this.playerManager.get(interaction.guild!.id); const currentSong = player.getCurrent(); if (!currentSong) { - await msg.channel.send(errorMsg('nothing is playing')); - return; + throw new Error('nothing is playing'); } if (currentSong.isLive) { - await msg.channel.send(errorMsg('can\'t seek in a livestream')); - return; + throw new Error('can\'t seek in a livestream'); } - const seekTime = parseInt(args[0], 10); + const seekTime = interaction.options.getNumber('seconds'); + + if (!seekTime) { + throw new Error('missing number of seconds to seek'); + } if (seekTime + player.getPosition() > currentSong.length) { - await msg.channel.send(errorMsg('can\'t seek past the end of the song')); - return; + throw new Error('can\'t seek past the end of the song'); } - const loading = new LoadingMessage(msg.channel as TextChannel); + await Promise.all([ + player.forwardSeek(seekTime), + interaction.deferReply(), + ]); - await loading.start(); - - try { - await player.forwardSeek(seekTime); - - await loading.stop(); - } catch (error: unknown) { - await loading.stop(errorMsg(error as Error)); - } + await interaction.editReply(`👍 seeked to ${prettyTime(player.getPosition())}`); } } diff --git a/src/commands/help.ts b/src/commands/help.ts deleted file mode 100644 index ebac00b..0000000 --- a/src/commands/help.ts +++ /dev/null @@ -1,70 +0,0 @@ -import {Message, Util} from 'discord.js'; -import {injectable} from 'inversify'; -import Command from '.'; -import {TYPES} from '../types.js'; -import container from '../inversify.config.js'; -import {prisma} from '../utils/db.js'; - -@injectable() -export default class implements Command { - public name = 'help'; - public aliases = ['h']; - public examples = [ - ['help', 'you don\'t need a description'], - ]; - - private commands: Command[] = []; - - public async execute(msg: Message, _: string []): Promise { - if (this.commands.length === 0) { - // Lazy load to avoid circular dependencies - this.commands = container.getAll(TYPES.Command); - } - - const settings = await prisma.setting.findUnique({ - where: { - guildId: msg.guild!.id, - }, - }); - - if (!settings) { - return; - } - - const {prefix} = settings; - - const res = Util.splitMessage(this.commands.sort((a, b) => a.name.localeCompare(b.name)).reduce((content, command) => { - const aliases = command.aliases.reduce((str, alias, i) => { - str += alias; - - if (i !== command.aliases.length - 1) { - str += ', '; - } - - return str; - }, ''); - - if (aliases === '') { - content += `**${command.name}**:\n`; - } else { - content += `**${command.name}** (${aliases}):\n`; - } - - command.examples.forEach(example => { - content += `- \`${prefix}${example[0]}\`: ${example[1]}\n`; - }); - - content += '\n'; - - return content; - }, '')); - - for (const r of res) { - // eslint-disable-next-line no-await-in-loop - await msg.author.send(r); - } - - await msg.react('🇩'); - await msg.react('🇲'); - } -} diff --git a/src/commands/index.ts b/src/commands/index.ts index a945072..02349d2 100644 --- a/src/commands/index.ts +++ b/src/commands/index.ts @@ -1,9 +1,11 @@ -import {Message} from 'discord.js'; +import {SlashCommandBuilder, SlashCommandSubcommandsOnlyBuilder} from '@discordjs/builders'; +import {AutocompleteInteraction, ButtonInteraction, CommandInteraction} from 'discord.js'; export default interface Command { - name: string; - aliases: string[]; - examples: string[][]; - requiresVC?: boolean; - execute: (msg: Message, args: string[]) => Promise; + readonly slashCommand: Partial & Pick; + readonly handledButtonIds?: readonly string[]; + readonly requiresVC?: boolean | ((interaction: CommandInteraction) => boolean); + execute: (interaction: CommandInteraction) => Promise; + handleButtonInteraction?: (interaction: ButtonInteraction) => Promise; + handleAutocompleteInteraction?: (interaction: AutocompleteInteraction) => Promise; } diff --git a/src/commands/pause.ts b/src/commands/pause.ts index 1dee95d..fc98bdf 100644 --- a/src/commands/pause.ts +++ b/src/commands/pause.ts @@ -1,18 +1,16 @@ -import {Message} from 'discord.js'; +import {CommandInteraction} from 'discord.js'; +import {SlashCommandBuilder} from '@discordjs/builders'; import {TYPES} from '../types.js'; import {inject, injectable} from 'inversify'; import PlayerManager from '../managers/player.js'; import {STATUS} from '../services/player.js'; -import errorMsg from '../utils/error-msg.js'; import Command from '.'; @injectable() export default class implements Command { - public name = 'pause'; - public aliases = []; - public examples = [ - ['pause', 'pauses currently playing song'], - ]; + public readonly slashCommand = new SlashCommandBuilder() + .setName('pause') + .setDescription('pauses the current song'); public requiresVC = true; @@ -22,15 +20,14 @@ export default class implements Command { this.playerManager = playerManager; } - public async execute(msg: Message, _: string []): Promise { - const player = this.playerManager.get(msg.guild!.id); + public async execute(interaction: CommandInteraction) { + const player = this.playerManager.get(interaction.guild!.id); if (player.status !== STATUS.PLAYING) { - await msg.channel.send(errorMsg('not currently playing')); - return; + throw new Error('not currently playing'); } player.pause(); - await msg.channel.send('the stop-and-go light is now red'); + await interaction.reply('the stop-and-go light is now red'); } } diff --git a/src/commands/play.ts b/src/commands/play.ts index 16d16dd..2d2fc6d 100644 --- a/src/commands/play.ts +++ b/src/commands/play.ts @@ -1,211 +1,113 @@ -import {TextChannel, Message} from 'discord.js'; +import {AutocompleteInteraction, CommandInteraction, GuildMember} from 'discord.js'; import {URL} from 'url'; -import {Except} from 'type-fest'; -import shuffle from 'array-shuffle'; -import {TYPES} from '../types.js'; +import {SlashCommandBuilder} from '@discordjs/builders'; import {inject, injectable} from 'inversify'; -import {QueuedSong, STATUS} from '../services/player.js'; -import PlayerManager from '../managers/player.js'; -import {getMostPopularVoiceChannel, getMemberVoiceChannel} from '../utils/channels.js'; -import LoadingMessage from '../utils/loading-message.js'; -import errorMsg from '../utils/error-msg.js'; +import Spotify from 'spotify-web-api-node'; import Command from '.'; -import GetSongs from '../services/get-songs.js'; -import {prisma} from '../utils/db.js'; +import {TYPES} from '../types.js'; +import ThirdParty from '../services/third-party.js'; +import getYouTubeAndSpotifySuggestionsFor from '../utils/get-youtube-and-spotify-suggestions-for.js'; +import KeyValueCacheProvider from '../services/key-value-cache.js'; +import {ONE_HOUR_IN_SECONDS} from '../utils/constants.js'; +import AddQueryToQueue from '../services/add-query-to-queue.js'; +import PlayerManager from '../managers/player.js'; +import {STATUS} from '../services/player.js'; import {buildPlayingMessageEmbed} from '../utils/build-embed.js'; +import {getMemberVoiceChannel, getMostPopularVoiceChannel} from '../utils/channels.js'; @injectable() export default class implements Command { - public name = 'play'; - public aliases = ['p']; - public examples = [ - ['play', 'resume paused playback'], - ['play https://www.youtube.com/watch?v=dQw4w9WgXcQ', 'plays a YouTube video'], - ['play cool music', 'plays the first search result for "cool music" from YouTube'], - ['play https://www.youtube.com/watch?list=PLi9drqWffJ9FWBo7ZVOiaVy0UQQEm4IbP', 'adds the playlist to the queue'], - ['play https://open.spotify.com/track/3ebXMykcMXOcLeJ9xZ17XH?si=tioqSuyMRBWxhThhAW51Ig', 'plays a song from Spotify'], - ['play https://open.spotify.com/album/5dv1oLETxdsYOkS2Sic00z?si=bDa7PaloRx6bMIfKdnvYQw', 'adds all songs from album to the queue'], - ['play https://open.spotify.com/playlist/37i9dQZF1DX94qaYRnkufr?si=r2fOVL_QQjGxFM5MWb84Xw', 'adds all songs from playlist to the queue'], - ['play cool music immediate', 'adds the first search result for "cool music" to the front of the queue'], - ['play cool music i', 'adds the first search result for "cool music" to the front of the queue'], - ['play https://www.youtube.com/watch?list=PLi9drqWffJ9FWBo7ZVOiaVy0UQQEm4IbP shuffle', 'adds the shuffled playlist to the queue'], - ['play https://www.youtube.com/watch?list=PLi9drqWffJ9FWBo7ZVOiaVy0UQQEm4IbP s', 'adds the shuffled playlist to the queue'], - ]; + public readonly slashCommand = new SlashCommandBuilder() + .setName('play') + // TODO: make sure verb tense is consistent between all command descriptions + .setDescription('play a song or resume playback') + .addStringOption(option => option + .setName('query') + .setDescription('YouTube URL, Spotify URL, or search query') + .setAutocomplete(true)) + .addBooleanOption(option => option + .setName('immediate') + .setDescription('add track to the front of the queue')) + .addBooleanOption(option => option + .setName('shuffle') + .setDescription('shuffle the input if you\'re adding multiple tracks')); public requiresVC = true; + private readonly spotify: Spotify; + private readonly cache: KeyValueCacheProvider; + private readonly addQueryToQueue: AddQueryToQueue; private readonly playerManager: PlayerManager; - private readonly getSongs: GetSongs; - constructor(@inject(TYPES.Managers.Player) playerManager: PlayerManager, @inject(TYPES.Services.GetSongs) getSongs: GetSongs) { + constructor(@inject(TYPES.ThirdParty) thirdParty: ThirdParty, @inject(TYPES.KeyValueCache) cache: KeyValueCacheProvider, @inject(TYPES.Services.AddQueryToQueue) addQueryToQueue: AddQueryToQueue, @inject(TYPES.Managers.Player) playerManager: PlayerManager) { + this.spotify = thirdParty.spotify; + this.cache = cache; + this.addQueryToQueue = addQueryToQueue; this.playerManager = playerManager; - this.getSongs = getSongs; } // eslint-disable-next-line complexity - public async execute(msg: Message, args: string[]): Promise { - const [targetVoiceChannel] = getMemberVoiceChannel(msg.member!) ?? getMostPopularVoiceChannel(msg.guild!); - const setting = await prisma.setting.findUnique({ - where: { - guildId: msg.guild!.id, - }}); - if (!setting) { - throw new Error(`Couldn't find settings for guild ${msg.guild!.id}`); - } + public async execute(interaction: CommandInteraction): Promise { + const query = interaction.options.getString('query'); - const {playlistLimit} = setting; + const player = this.playerManager.get(interaction.guild!.id); + const [targetVoiceChannel] = getMemberVoiceChannel(interaction.member as GuildMember) ?? getMostPopularVoiceChannel(interaction.guild!); - const res = new LoadingMessage(msg.channel as TextChannel); - await res.start(); - - try { - const player = this.playerManager.get(msg.guild!.id); - - const wasPlayingSong = player.getCurrent() !== null; - - if (args.length === 0) { - if (player.status === STATUS.PLAYING) { - await res.stop(errorMsg('already playing, give me a song name')); - return; - } - - // Must be resuming play - if (!wasPlayingSong) { - await res.stop(errorMsg('nothing to play')); - return; - } - - await player.connect(targetVoiceChannel); - await player.play(); - - await Promise.all([ - res.stop('the stop-and-go light is now green'), - msg.channel.send({embeds: [buildPlayingMessageEmbed(player)]}), - ]); - - return; + if (!query) { + if (player.status === STATUS.PLAYING) { + throw new Error('already playing, give me a song name'); } - const addToFrontOfQueue = args[args.length - 1] === 'i' || args[args.length - 1] === 'immediate'; - const shuffleAdditions = args[args.length - 1] === 's' || args[args.length - 1] === 'shuffle'; - - let newSongs: Array> = []; - let extraMsg = ''; - - // Test if it's a complete URL - try { - const url = new URL(args[0]); - - const YOUTUBE_HOSTS = [ - 'www.youtube.com', - 'youtu.be', - 'youtube.com', - 'music.youtube.com', - 'www.music.youtube.com', - ]; - - if (YOUTUBE_HOSTS.includes(url.host)) { - // YouTube source - if (url.searchParams.get('list')) { - // YouTube playlist - newSongs.push(...await this.getSongs.youtubePlaylist(url.searchParams.get('list')!)); - } else { - // Single video - const song = await this.getSongs.youtubeVideo(url.href); - - if (song) { - newSongs.push(song); - } else { - await res.stop(errorMsg('that doesn\'t exist')); - return; - } - } - } else if (url.protocol === 'spotify:' || url.host === 'open.spotify.com') { - const [convertedSongs, nSongsNotFound, totalSongs] = await this.getSongs.spotifySource(args[0], playlistLimit); - - if (totalSongs > playlistLimit) { - extraMsg = `a random sample of ${playlistLimit} songs was taken`; - } - - if (totalSongs > playlistLimit && nSongsNotFound !== 0) { - extraMsg += ' and '; - } - - if (nSongsNotFound !== 0) { - if (nSongsNotFound === 1) { - extraMsg += '1 song was not found'; - } else { - extraMsg += `${nSongsNotFound.toString()} songs were not found`; - } - } - - newSongs.push(...convertedSongs); - } - } catch (_: unknown) { - // Not a URL, must search YouTube - const query = addToFrontOfQueue ? args.slice(0, args.length - 1).join(' ') : args.join(' '); - - const song = await this.getSongs.youtubeVideoSearch(query); - - if (song) { - newSongs.push(song); - } else { - await res.stop(errorMsg('that doesn\'t exist')); - return; - } + // Must be resuming play + if (!player.getCurrent()) { + throw new Error('nothing to play'); } - if (newSongs.length === 0) { - await res.stop(errorMsg('no songs found')); - return; - } + await player.connect(targetVoiceChannel); + await player.play(); - if (shuffleAdditions) { - newSongs = shuffle(newSongs); - } - - newSongs.forEach(song => { - player.add({...song, addedInChannelId: msg.channel.id, requestedBy: msg.author.id}, {immediate: addToFrontOfQueue}); + await interaction.reply({ + content: 'the stop-and-go light is now green', + embeds: [buildPlayingMessageEmbed(player)], }); - const firstSong = newSongs[0]; - - let statusMsg = ''; - - if (player.voiceConnection === null) { - await player.connect(targetVoiceChannel); - - // Resume / start playback - await player.play(); - - if (wasPlayingSong) { - statusMsg = 'resuming playback'; - } - - await msg.channel.send({embeds: [buildPlayingMessageEmbed(player)]}); - } - - // Build response message - if (statusMsg !== '') { - if (extraMsg === '') { - extraMsg = statusMsg; - } else { - extraMsg = `${statusMsg}, ${extraMsg}`; - } - } - - if (extraMsg !== '') { - extraMsg = ` (${extraMsg})`; - } - - if (newSongs.length === 1) { - await res.stop(`u betcha, **${firstSong.title}** added to the${addToFrontOfQueue ? ' front of the' : ''} queue${extraMsg}`); - } else { - await res.stop(`u betcha, **${firstSong.title}** and ${newSongs.length - 1} other songs were added to the queue${extraMsg}`); - } - } catch (error) { - await res.stop(); - throw error; + return; } + + await this.addQueryToQueue.addToQueue({ + interaction, + query: query.trim(), + addToFrontOfQueue: interaction.options.getBoolean('immediate') ?? false, + shuffleAdditions: interaction.options.getBoolean('shuffle') ?? false, + }); + } + + public async handleAutocompleteInteraction(interaction: AutocompleteInteraction): Promise { + const query = interaction.options.getString('query')?.trim(); + + if (!query || query.length === 0) { + await interaction.respond([]); + return; + } + + try { + // Don't return suggestions for URLs + // eslint-disable-next-line no-new + new URL(query); + await interaction.respond([]); + return; + } catch {} + + const suggestions = await this.cache.wrap( + getYouTubeAndSpotifySuggestionsFor, + query, + this.spotify, + 10, + { + expiresIn: ONE_HOUR_IN_SECONDS, + key: `autocomplete:${query}`, + }); + + await interaction.respond(suggestions); } } diff --git a/src/commands/queue.ts b/src/commands/queue.ts index 79285b1..4d75d42 100644 --- a/src/commands/queue.ts +++ b/src/commands/queue.ts @@ -1,4 +1,5 @@ -import {Message} from 'discord.js'; +import {CommandInteraction} from 'discord.js'; +import {SlashCommandBuilder} from '@discordjs/builders'; import {inject, injectable} from 'inversify'; import {TYPES} from '../types.js'; import PlayerManager from '../managers/player.js'; @@ -7,12 +8,13 @@ import {buildQueueEmbed} from '../utils/build-embed.js'; @injectable() export default class implements Command { - public name = 'queue'; - public aliases = ['q']; - public examples = [ - ['queue', 'shows current queue'], - ['queue 2', 'shows second page of queue'], - ]; + public readonly slashCommand = new SlashCommandBuilder() + .setName('queue') + .setDescription('show the current queue') + .addIntegerOption(option => option + .setName('page') + .setDescription('page of queue to show [default: 1]') + .setRequired(false)); private readonly playerManager: PlayerManager; @@ -20,11 +22,11 @@ export default class implements Command { this.playerManager = playerManager; } - public async execute(msg: Message, args: string []): Promise { - const player = this.playerManager.get(msg.guild!.id); + public async execute(interaction: CommandInteraction) { + const player = this.playerManager.get(interaction.guild!.id); - const embed = buildQueueEmbed(player, args[0] ? parseInt(args[0], 10) : 1); + const embed = buildQueueEmbed(player, interaction.options.getInteger('page') ?? 1); - await msg.channel.send({embeds: [embed]}); + await interaction.reply({embeds: [embed]}); } } diff --git a/src/commands/remove.ts b/src/commands/remove.ts index 9c40a71..55c416f 100644 --- a/src/commands/remove.ts +++ b/src/commands/remove.ts @@ -1,18 +1,24 @@ -import {Message} from 'discord.js'; +import {CommandInteraction} from 'discord.js'; import {inject, injectable} from 'inversify'; import {TYPES} from '../types.js'; import PlayerManager from '../managers/player.js'; import Command from '.'; -import errorMsg from '../utils/error-msg.js'; +import {SlashCommandBuilder} from '@discordjs/builders'; @injectable() export default class implements Command { - public name = 'remove'; - public aliases = ['rm']; - public examples = [ - ['remove 1', 'removes the next song in the queue'], - ['rm 5-7', 'remove every song in range 5 - 7 (inclusive) from the queue'], - ]; + public readonly slashCommand = new SlashCommandBuilder() + .setName('remove') + .setDescription('remove songs from the queue') + .addIntegerOption(option => + option.setName('position') + .setDescription('position of the song to remove [default: 1]') + .setRequired(false), + ) + .addIntegerOption(option => + option.setName('range') + .setDescription('number of songs to remove [default: 1]') + .setRequired(false)); private readonly playerManager: PlayerManager; @@ -20,57 +26,22 @@ export default class implements Command { this.playerManager = playerManager; } - public async execute(msg: Message, args: string []): Promise { - const player = this.playerManager.get(msg.guild!.id); + public async execute(interaction: CommandInteraction): Promise { + const player = this.playerManager.get(interaction.guild!.id); - if (args.length === 0) { - await msg.channel.send(errorMsg('missing song position or range')); - return; + const position = interaction.options.getInteger('position') ?? 1; + const range = interaction.options.getInteger('range') ?? 1; + + if (position < 1) { + throw new Error('position must be at least 1'); } - const reg = /^(\d+)-(\d+)$|^(\d+)$/g; // Expression has 3 groups: x-y or z. x-y is range, z is a single digit. - const match = reg.exec(args[0]); - - if (match === null) { - await msg.channel.send(errorMsg('incorrect format')); - return; + if (range < 1) { + throw new Error('range must be at least 1'); } - if (match[3] === undefined) { // 3rd group (z) doesn't exist -> a range - const range = [parseInt(match[1], 10), parseInt(match[2], 10)]; + player.removeFromQueue(position, range); - if (range[0] < 1) { - await msg.channel.send(errorMsg('position must be greater than 0')); - return; - } - - if (range[1] > player.queueSize()) { - await msg.channel.send(errorMsg('position is outside of the queue\'s range')); - return; - } - - if (range[0] < range[1]) { - player.removeFromQueue(range[0], range[1] - range[0] + 1); - } else { - await msg.channel.send(errorMsg('range is backwards')); - return; - } - } else { // 3rd group exists -> just one song - const index = parseInt(match[3], 10); - - if (index < 1) { - await msg.channel.send(errorMsg('position must be greater than 0')); - return; - } - - if (index > player.queueSize()) { - await msg.channel.send(errorMsg('position is outside of the queue\'s range')); - return; - } - - player.removeFromQueue(index, 1); - } - - await msg.channel.send(':wastebasket: removed'); + await interaction.reply(':wastebasket: removed'); } } diff --git a/src/commands/seek.ts b/src/commands/seek.ts index 5578aca..07f6590 100644 --- a/src/commands/seek.ts +++ b/src/commands/seek.ts @@ -1,21 +1,21 @@ -import {Message, TextChannel} from 'discord.js'; +import {CommandInteraction} from 'discord.js'; import {TYPES} from '../types.js'; import {inject, injectable} from 'inversify'; import PlayerManager from '../managers/player.js'; -import LoadingMessage from '../utils/loading-message.js'; -import errorMsg from '../utils/error-msg.js'; import Command from '.'; -import {parseTime} from '../utils/time.js'; +import {parseTime, prettyTime} from '../utils/time.js'; +import {SlashCommandBuilder} from '@discordjs/builders'; @injectable() export default class implements Command { - public name = 'seek'; - public aliases = []; - public examples = [ - ['seek 10', 'seeks to 10 seconds from beginning of song'], - ['seek 1:30', 'seeks to 1 minute and 30 seconds from beginning of song'], - ['seek 1:00:00', 'seeks to 1 hour from beginning of song'], - ]; + public readonly slashCommand = new SlashCommandBuilder() + .setName('seek') + .setDescription('seek to a position from beginning of song') + .addStringOption(option => + option.setName('time') + .setDescription('time to seek') + .setRequired(true), + ); public requiresVC = true; @@ -25,22 +25,20 @@ export default class implements Command { this.playerManager = playerManager; } - public async execute(msg: Message, args: string []): Promise { - const player = this.playerManager.get(msg.guild!.id); + public async execute(interaction: CommandInteraction): Promise { + const player = this.playerManager.get(interaction.guild!.id); const currentSong = player.getCurrent(); if (!currentSong) { - await msg.channel.send(errorMsg('nothing is playing')); - return; + throw new Error('nothing is playing'); } if (currentSong.isLive) { - await msg.channel.send(errorMsg('can\'t seek in a livestream')); - return; + throw new Error('can\'t seek in a livestream'); } - const time = args[0]; + const time = interaction.options.getString('time')!; let seekTime = 0; @@ -51,20 +49,14 @@ export default class implements Command { } if (seekTime > currentSong.length) { - await msg.channel.send(errorMsg('can\'t seek past the end of the song')); - return; + throw new Error('can\'t seek past the end of the song'); } - const loading = new LoadingMessage(msg.channel as TextChannel); + await Promise.all([ + player.seek(seekTime), + interaction.deferReply(), + ]); - await loading.start(); - - try { - await player.seek(seekTime); - - await loading.stop(); - } catch (error: unknown) { - await loading.stop(errorMsg(error as Error)); - } + await interaction.editReply(`👍 seeked to ${prettyTime(player.getPosition())}`); } } diff --git a/src/commands/shortcuts.ts b/src/commands/shortcuts.ts deleted file mode 100644 index e40d10a..0000000 --- a/src/commands/shortcuts.ts +++ /dev/null @@ -1,128 +0,0 @@ -import {Message} from 'discord.js'; -import {injectable} from 'inversify'; -import errorMsg from '../utils/error-msg.js'; -import Command from '.'; -import {prisma} from '../utils/db.js'; - -@injectable() -export default class implements Command { - public name = 'shortcuts'; - public aliases = []; - public examples = [ - ['shortcuts', 'show all shortcuts'], - ['shortcuts set s skip', 'aliases `s` to `skip`'], - ['shortcuts set party play https://www.youtube.com/watch?v=zK6oOJ1wz8k', 'aliases `party` to a specific play command'], - ['shortcuts delete party', 'removes the `party` shortcut'], - ]; - - public async execute(msg: Message, args: string []): Promise { - if (args.length === 0) { - // Get shortcuts for guild - const shortcuts = await prisma.shortcut.findMany({ - where: { - guildId: msg.guild!.id, - }, - }); - - if (shortcuts.length === 0) { - await msg.channel.send('no shortcuts exist'); - return; - } - - // Get prefix for guild - const settings = await prisma.setting.findUnique({ - where: { - guildId: msg.guild!.id, - }, - }); - - if (!settings) { - return; - } - - const {prefix} = settings; - - const res = shortcuts.reduce((accum, shortcut) => { - accum += `${prefix}${shortcut.shortcut}: ${shortcut.command}\n`; - - return accum; - }, ''); - - await msg.channel.send(res); - } else { - const action = args[0]; - - const shortcutName = args[1]; - - switch (action) { - case 'set': { - const shortcut = await prisma.shortcut.findFirst({ - where: { - guildId: msg.guild!.id, - shortcut: shortcutName, - }, - }); - - const command = args.slice(2).join(' '); - - const newShortcut = {shortcut: shortcutName, command, guildId: msg.guild!.id, authorId: msg.author.id}; - - if (shortcut) { - if (shortcut.authorId !== msg.author.id && msg.author.id !== msg.guild!.ownerId) { - await msg.channel.send(errorMsg('you do\'nt have permission to do that')); - return; - } - - await prisma.shortcut.update({ - where: { - id: shortcut.id, - }, - data: newShortcut, - }); - await msg.channel.send('shortcut updated'); - } else { - await prisma.shortcut.create({data: newShortcut}); - await msg.channel.send('shortcut created'); - } - - break; - } - - case 'delete': { - // Check if shortcut exists - const shortcut = await prisma.shortcut.findFirst({ - where: { - guildId: msg.guild!.id, - shortcut: shortcutName, - }, - }); - - if (!shortcut) { - await msg.channel.send(errorMsg('shortcut doesn\'t exist')); - return; - } - - // Check permissions - if (shortcut.authorId !== msg.author.id && msg.author.id !== msg.guild!.ownerId) { - await msg.channel.send(errorMsg('you don\'t have permission to do that')); - return; - } - - await prisma.shortcut.delete({ - where: { - id: shortcut.id, - }, - }); - - await msg.channel.send('shortcut deleted'); - - break; - } - - default: { - await msg.channel.send(errorMsg('unknown command')); - } - } - } - } -} diff --git a/src/commands/shuffle.ts b/src/commands/shuffle.ts index d50f0b3..e27f1e2 100644 --- a/src/commands/shuffle.ts +++ b/src/commands/shuffle.ts @@ -1,17 +1,15 @@ -import {Message} from 'discord.js'; +import {CommandInteraction} from 'discord.js'; import {TYPES} from '../types.js'; import {inject, injectable} from 'inversify'; import PlayerManager from '../managers/player.js'; -import errorMsg from '../utils/error-msg.js'; import Command from '.'; +import {SlashCommandBuilder} from '@discordjs/builders'; @injectable() export default class implements Command { - public name = 'shuffle'; - public aliases = []; - public examples = [ - ['shuffle', 'shuffles the current queue'], - ]; + public readonly slashCommand = new SlashCommandBuilder() + .setName('shuffle') + .setDescription('shuffles the current queue'); public requiresVC = true; @@ -21,16 +19,15 @@ export default class implements Command { this.playerManager = playerManager; } - public async execute(msg: Message, _: string []): Promise { - const player = this.playerManager.get(msg.guild!.id); + public async execute(interaction: CommandInteraction): Promise { + const player = this.playerManager.get(interaction.guild!.id); if (player.isQueueEmpty()) { - await msg.channel.send(errorMsg('not enough songs to shuffle')); - return; + throw new Error('not enough songs to shuffle'); } player.shuffle(); - await msg.channel.send('shuffled'); + await interaction.reply('shuffled'); } } diff --git a/src/commands/skip.ts b/src/commands/skip.ts index ad9d4dc..4c51e77 100644 --- a/src/commands/skip.ts +++ b/src/commands/skip.ts @@ -1,20 +1,20 @@ -import {Message, TextChannel} from 'discord.js'; +import {CommandInteraction} from 'discord.js'; import {TYPES} from '../types.js'; import {inject, injectable} from 'inversify'; import PlayerManager from '../managers/player.js'; import Command from '.'; -import LoadingMessage from '../utils/loading-message.js'; -import errorMsg from '../utils/error-msg.js'; +import {SlashCommandBuilder} from '@discordjs/builders'; import {buildPlayingMessageEmbed} from '../utils/build-embed.js'; @injectable() export default class implements Command { - public name = 'skip'; - public aliases = ['s']; - public examples = [ - ['skip', 'skips the current song'], - ['skip 2', 'skips the next 2 songs'], - ]; + public readonly slashCommand = new SlashCommandBuilder() + .setName('skip') + .setDescription('skips the next songs') + .addIntegerOption(option => option + .setName('number') + .setDescription('number of songs to skip [default: 1]') + .setRequired(false)); public requiresVC = true; @@ -24,37 +24,23 @@ export default class implements Command { this.playerManager = playerManager; } - public async execute(msg: Message, args: string []): Promise { - let numToSkip = 1; + public async execute(interaction: CommandInteraction): Promise { + const numToSkip = interaction.options.getInteger('skip') ?? 1; - if (args.length === 1) { - if (!Number.isNaN(parseInt(args[0], 10))) { - numToSkip = parseInt(args[0], 10); - } + if (numToSkip < 1) { + throw new Error('invalid number of songs to skip'); } - const player = this.playerManager.get(msg.guild!.id); - - const loader = new LoadingMessage(msg.channel as TextChannel); + const player = this.playerManager.get(interaction.guild!.id); try { - await loader.start(); await player.forward(numToSkip); + await interaction.reply({ + content: 'keep \'er movin\'', + embeds: player.getCurrent() ? [buildPlayingMessageEmbed(player)] : [], + }); } catch (_: unknown) { - await loader.stop(errorMsg('no song to skip to')); - return; + throw new Error('no song to skip to'); } - - const promises = [ - loader.stop('keep \'er movin\''), - ]; - - if (player.getCurrent()) { - promises.push(msg.channel.send({ - embeds: [buildPlayingMessageEmbed(player)], - })); - } - - await Promise.all(promises); } } diff --git a/src/commands/unskip.ts b/src/commands/unskip.ts index adc44e7..17d6489 100644 --- a/src/commands/unskip.ts +++ b/src/commands/unskip.ts @@ -1,18 +1,16 @@ -import {Message} from 'discord.js'; +import {CommandInteraction} from 'discord.js'; import {TYPES} from '../types.js'; import {inject, injectable} from 'inversify'; import PlayerManager from '../managers/player.js'; -import errorMsg from '../utils/error-msg.js'; import Command from '.'; +import {SlashCommandBuilder} from '@discordjs/builders'; import {buildPlayingMessageEmbed} from '../utils/build-embed.js'; @injectable() export default class implements Command { - public name = 'unskip'; - public aliases = ['back']; - public examples = [ - ['unskip', 'goes back in the queue by one song'], - ]; + public readonly slashCommand = new SlashCommandBuilder() + .setName('unskip') + .setDescription('goes back in the queue by one song'); public requiresVC = true; @@ -22,19 +20,17 @@ export default class implements Command { this.playerManager = playerManager; } - public async execute(msg: Message, _: string []): Promise { - const player = this.playerManager.get(msg.guild!.id); + public async execute(interaction: CommandInteraction): Promise { + const player = this.playerManager.get(interaction.guild!.id); try { await player.back(); + await interaction.reply({ + content: 'back \'er up\'', + embeds: player.getCurrent() ? [buildPlayingMessageEmbed(player)] : [], + }); } catch (_: unknown) { - await msg.channel.send(errorMsg('no song to go back to')); - return; + throw new Error('no song to go back to'); } - - await msg.channel.send({ - content: 'back \'er up\'', - embeds: [buildPlayingMessageEmbed(player)], - }); } } diff --git a/src/events/guild-create.ts b/src/events/guild-create.ts index 9a26b2a..630d6cb 100644 --- a/src/events/guild-create.ts +++ b/src/events/guild-create.ts @@ -1,10 +1,11 @@ -import {Guild, TextChannel, Message, MessageReaction, User} from 'discord.js'; -import emoji from 'node-emoji'; -import pEvent from 'p-event'; -import {chunk} from '../utils/arrays.js'; +import {Guild, Client} from 'discord.js'; +import container from '../inversify.config.js'; +import Command from '../commands'; +import {TYPES} from '../types.js'; +import Config from '../services/config.js'; import {prisma} from '../utils/db.js'; - -const DEFAULT_PREFIX = '!'; +import {REST} from '@discordjs/rest'; +import {Routes} from 'discord-api-types/v9'; export default async (guild: Guild): Promise => { await prisma.setting.upsert({ @@ -13,88 +14,26 @@ export default async (guild: Guild): Promise => { }, create: { guildId: guild.id, - prefix: DEFAULT_PREFIX, - }, - update: { - prefix: DEFAULT_PREFIX, }, + update: {}, }); - const owner = await guild.client.users.fetch(guild.ownerId); + const config = container.get(TYPES.Config); - let firstStep = '👋 Hi!\n'; - firstStep += 'I just need to ask a few questions before you start listening to music.\n\n'; - firstStep += 'First, what channel should I listen to for music commands?\n\n'; + // Setup slash commands + if (!config.REGISTER_COMMANDS_ON_BOT) { + const token = container.get(TYPES.Config).DISCORD_TOKEN; + const client = container.get(TYPES.Client); - const firstStepMsg = await owner.send(firstStep); + const rest = new REST({version: '9'}).setToken(token); - // Show emoji selector - interface EmojiChannel { - name: string; - id: string; - emoji: string; + await rest.put( + Routes.applicationGuildCommands(client.user!.id, guild.id), + {body: container.getAll(TYPES.Command).map(command => command.slashCommand.toJSON())}, + ); } - const emojiChannels: EmojiChannel[] = []; + const owner = await guild.fetchOwner(); - for (const [channelId, channel] of guild.channels.cache) { - if (channel.type === 'GUILD_TEXT') { - emojiChannels.push({ - name: channel.name, - id: channelId, - emoji: emoji.random().emoji, - }); - } - } - - const sentMessageIds: string[] = []; - - chunk(emojiChannels, 10).map(async chunk => { - let str = ''; - for (const channel of chunk) { - str += `${channel.emoji}: #${channel.name}\n`; - } - - const msg = await owner.send(str); - - sentMessageIds.push(msg.id); - - await Promise.all(chunk.map(async channel => msg.react(channel.emoji))); - }); - - // Wait for response from user - const [choice] = await pEvent(guild.client, 'messageReactionAdd', { - multiArgs: true, - filter: ([reaction, user]: [MessageReaction, User]) => sentMessageIds.includes(reaction.message.id) && user.id === owner.id, - }); - - const chosenChannel = emojiChannels.find(e => e.emoji === (choice as unknown as MessageReaction).emoji.name)!; - - // Second setup step (get prefix) - let secondStep = `👍 Cool, I'll listen to **#${chosenChannel.name}** \n\n`; - secondStep += 'Last question: what character should I use for a prefix? Type a single character and hit enter.'; - - await owner.send(secondStep); - - const prefixResponses = await firstStepMsg.channel.awaitMessages({filter: (r: Message) => r.content.length === 1, max: 1}); - - const prefixCharacter = prefixResponses.first()!.content; - - // Save settings - await prisma.setting.update({ - where: { - guildId: guild.id, - }, - data: { - channel: chosenChannel.id, - prefix: prefixCharacter, - }, - }); - - // Send welcome - const boundChannel = guild.client.channels.cache.get(chosenChannel.id) as TextChannel; - - await boundChannel.send(`hey <@${owner.id}> try \`${prefixCharacter}play https://www.youtube.com/watch?v=dQw4w9WgXcQ\``); - - await firstStepMsg.channel.send(`Sounds good. Check out **#${chosenChannel.name}** to get started.`); + await owner.send('👋 Hi! Someone (probably you) just invited me to a server you own. I can\'t be used by your server members until you complete setup by running /config set-role in your server.'); }; diff --git a/src/events/guild-update.ts b/src/events/guild-update.ts new file mode 100644 index 0000000..837bbbe --- /dev/null +++ b/src/events/guild-update.ts @@ -0,0 +1,10 @@ +import {Guild} from 'discord.js'; +import updatePermissionsForGuild from '../utils/update-permissions-for-guild.js'; + +const handleGuildUpdate = async (oldGuild: Guild, newGuild: Guild) => { + if (oldGuild.ownerId !== newGuild.ownerId) { + await updatePermissionsForGuild(newGuild); + } +}; + +export default handleGuildUpdate; diff --git a/src/index.ts b/src/index.ts index e6df09d..08a7152 100644 --- a/src/index.ts +++ b/src/index.ts @@ -18,7 +18,7 @@ const startBot = async () => { await container.get(TYPES.FileCache).cleanup(); - await bot.listen(); + await bot.register(); }; export {startBot}; diff --git a/src/inversify.config.ts b/src/inversify.config.ts index 6ec1ba2..d29d3de 100644 --- a/src/inversify.config.ts +++ b/src/inversify.config.ts @@ -8,23 +8,22 @@ import ConfigProvider from './services/config.js'; // Managers import PlayerManager from './managers/player.js'; -// Helpers +// Services +import AddQueryToQueue from './services/add-query-to-queue.js'; import GetSongs from './services/get-songs.js'; -import NaturalLanguage from './services/natural-language-commands.js'; // Comands import Command from './commands'; import Clear from './commands/clear.js'; import Config from './commands/config.js'; import Disconnect from './commands/disconnect.js'; +import Favorites from './commands/favorites.js'; import ForwardSeek from './commands/fseek.js'; -import Help from './commands/help.js'; import Pause from './commands/pause.js'; import Play from './commands/play.js'; import QueueCommand from './commands/queue.js'; import Remove from './commands/remove.js'; import Seek from './commands/seek.js'; -import Shortcuts from './commands/shortcuts.js'; import Shuffle from './commands/shuffle.js'; import Skip from './commands/skip.js'; import Unskip from './commands/unskip.js'; @@ -49,23 +48,22 @@ container.bind(TYPES.Client).toConstantValue(new Client({intents})); // Managers container.bind(TYPES.Managers.Player).to(PlayerManager).inSingletonScope(); -// Helpers +// Services container.bind(TYPES.Services.GetSongs).to(GetSongs).inSingletonScope(); -container.bind(TYPES.Services.NaturalLanguage).to(NaturalLanguage).inSingletonScope(); +container.bind(TYPES.Services.AddQueryToQueue).to(AddQueryToQueue).inSingletonScope(); // Commands [ Clear, Config, Disconnect, + Favorites, ForwardSeek, - Help, Pause, Play, QueueCommand, Remove, Seek, - Shortcuts, Shuffle, Skip, Unskip, diff --git a/src/managers/player.ts b/src/managers/player.ts index 5d816b8..420cf48 100644 --- a/src/managers/player.ts +++ b/src/managers/player.ts @@ -1,5 +1,4 @@ import {inject, injectable} from 'inversify'; -import {Client} from 'discord.js'; import {TYPES} from '../types.js'; import Player from '../services/player.js'; import FileCacheProvider from '../services/file-cache.js'; @@ -7,12 +6,10 @@ import FileCacheProvider from '../services/file-cache.js'; @injectable() export default class { private readonly guildPlayers: Map; - private readonly discordClient: Client; private readonly fileCache: FileCacheProvider; - constructor(@inject(TYPES.FileCache) fileCache: FileCacheProvider, @inject(TYPES.Client) client: Client) { + constructor(@inject(TYPES.FileCache) fileCache: FileCacheProvider) { this.guildPlayers = new Map(); - this.discordClient = client; this.fileCache = fileCache; } @@ -20,7 +17,7 @@ export default class { let player = this.guildPlayers.get(guildId); if (!player) { - player = new Player(this.discordClient, this.fileCache); + player = new Player(this.fileCache, guildId); this.guildPlayers.set(guildId, player); } diff --git a/src/scripts/run-with-database-url.ts b/src/scripts/run-with-database-url.ts index b7ae3a7..e4ab39a 100644 --- a/src/scripts/run-with-database-url.ts +++ b/src/scripts/run-with-database-url.ts @@ -2,12 +2,14 @@ import {DATA_DIR} from '../services/config.js'; import createDatabaseUrl from '../utils/create-database-url.js'; import {execa} from 'execa'; -process.env.DATABASE_URL = createDatabaseUrl(DATA_DIR); - (async () => { await execa(process.argv[2], process.argv.slice(3), { preferLocal: true, stderr: process.stderr, stdout: process.stdout, + stdin: process.stdin, + env: { + DATABASE_URL: createDatabaseUrl(DATA_DIR), + }, }); })(); diff --git a/src/services/add-query-to-queue.ts b/src/services/add-query-to-queue.ts new file mode 100644 index 0000000..bb512c6 --- /dev/null +++ b/src/services/add-query-to-queue.ts @@ -0,0 +1,155 @@ +import {CommandInteraction, GuildMember} from 'discord.js'; +import {inject, injectable} from 'inversify'; +import {Except} from 'type-fest'; +import shuffle from 'array-shuffle'; +import {TYPES} from '../types.js'; +import GetSongs from '../services/get-songs.js'; +import {QueuedSong} from './player.js'; +import PlayerManager from '../managers/player.js'; +import {prisma} from '../utils/db.js'; +import {buildPlayingMessageEmbed} from '../utils/build-embed.js'; +import {getMemberVoiceChannel, getMostPopularVoiceChannel} from '../utils/channels.js'; + +@injectable() +export default class AddQueryToQueue { + constructor(@inject(TYPES.Services.GetSongs) private readonly getSongs: GetSongs, @inject(TYPES.Managers.Player) private readonly playerManager: PlayerManager) {} + + public async addToQueue({ + query, + addToFrontOfQueue, + shuffleAdditions, + interaction, + }: { + query: string; + addToFrontOfQueue: boolean; + shuffleAdditions: boolean; + interaction: CommandInteraction; + }): Promise { + const guildId = interaction.guild!.id; + const player = this.playerManager.get(guildId); + const wasPlayingSong = player.getCurrent() !== null; + + const [targetVoiceChannel] = getMemberVoiceChannel(interaction.member as GuildMember) ?? getMostPopularVoiceChannel(interaction.guild!); + + const settings = await prisma.setting.findUnique({where: {guildId}}); + + if (!settings) { + throw new Error('Could not find settings for guild'); + } + + const {playlistLimit} = settings; + + await interaction.deferReply(); + + let newSongs: Array> = []; + let extraMsg = ''; + + // Test if it's a complete URL + try { + const url = new URL(query); + + const YOUTUBE_HOSTS = [ + 'www.youtube.com', + 'youtu.be', + 'youtube.com', + 'music.youtube.com', + 'www.music.youtube.com', + ]; + + if (YOUTUBE_HOSTS.includes(url.host)) { + // YouTube source + if (url.searchParams.get('list')) { + // YouTube playlist + newSongs.push(...await this.getSongs.youtubePlaylist(url.searchParams.get('list')!)); + } else { + const song = await this.getSongs.youtubeVideo(url.href); + + if (song) { + newSongs.push(song); + } else { + throw new Error('that doesn\'t exist'); + } + } + } else if (url.protocol === 'spotify:' || url.host === 'open.spotify.com') { + const [convertedSongs, nSongsNotFound, totalSongs] = await this.getSongs.spotifySource(query, playlistLimit); + + if (totalSongs > playlistLimit) { + extraMsg = `a random sample of ${playlistLimit} songs was taken`; + } + + if (totalSongs > playlistLimit && nSongsNotFound !== 0) { + extraMsg += ' and '; + } + + if (nSongsNotFound !== 0) { + if (nSongsNotFound === 1) { + extraMsg += '1 song was not found'; + } else { + extraMsg += `${nSongsNotFound.toString()} songs were not found`; + } + } + + newSongs.push(...convertedSongs); + } + } catch (_: unknown) { + // Not a URL, must search YouTube + const song = await this.getSongs.youtubeVideoSearch(query); + + if (song) { + newSongs.push(song); + } else { + throw new Error('that doesn\'t exist'); + } + } + + if (newSongs.length === 0) { + throw new Error('no songs found'); + } + + if (shuffleAdditions) { + newSongs = shuffle(newSongs); + } + + newSongs.forEach(song => { + player.add({...song, addedInChannelId: interaction.channel!.id, requestedBy: interaction.member!.user.id}, {immediate: addToFrontOfQueue ?? false}); + }); + + const firstSong = newSongs[0]; + + let statusMsg = ''; + + if (player.voiceConnection === null) { + await player.connect(targetVoiceChannel); + + // Resume / start playback + await player.play(); + + if (wasPlayingSong) { + statusMsg = 'resuming playback'; + } + + await interaction.editReply({ + embeds: [buildPlayingMessageEmbed(player)], + }); + } + + // Build response message + if (statusMsg !== '') { + if (extraMsg === '') { + extraMsg = statusMsg; + } else { + extraMsg = `${statusMsg}, ${extraMsg}`; + } + } + + if (extraMsg !== '') { + extraMsg = ` (${extraMsg})`; + } + + if (newSongs.length === 1) { + await interaction.editReply(`u betcha, **${firstSong.title}** added to the${addToFrontOfQueue ? ' front of the' : ''} queue${extraMsg}`); + } else { + await interaction.editReply(`u betcha, **${firstSong.title}** and ${newSongs.length - 1} other songs were added to the queue${extraMsg}`); + } + } +} diff --git a/src/services/config.ts b/src/services/config.ts index 0720c2c..cd56915 100644 --- a/src/services/config.ts +++ b/src/services/config.ts @@ -13,6 +13,7 @@ const CONFIG_MAP = { YOUTUBE_API_KEY: process.env.YOUTUBE_API_KEY, SPOTIFY_CLIENT_ID: process.env.SPOTIFY_CLIENT_ID, SPOTIFY_CLIENT_SECRET: process.env.SPOTIFY_CLIENT_SECRET, + REGISTER_COMMANDS_ON_BOT: process.env.REGISTER_COMMANDS_ON_BOT === 'true', DATA_DIR, CACHE_DIR: path.join(DATA_DIR, 'cache'), CACHE_LIMIT_IN_BYTES: xbytes.parseSize(process.env.CACHE_LIMIT ?? '2GB'), @@ -24,6 +25,7 @@ export default class Config { readonly YOUTUBE_API_KEY!: string; readonly SPOTIFY_CLIENT_ID!: string; readonly SPOTIFY_CLIENT_SECRET!: string; + readonly REGISTER_COMMANDS_ON_BOT!: boolean; readonly DATA_DIR!: string; readonly CACHE_DIR!: string; readonly CACHE_LIMIT_IN_BYTES!: number; @@ -39,6 +41,8 @@ export default class Config { this[key as ConditionalKeys] = value; } else if (typeof value === 'string') { this[key as ConditionalKeys] = value.trim(); + } else if (typeof value === 'boolean') { + this[key as ConditionalKeys] = value; } else { throw new Error(`Unsupported type for ${key}`); } diff --git a/src/services/get-songs.ts b/src/services/get-songs.ts index e132d7b..33c3173 100644 --- a/src/services/get-songs.ts +++ b/src/services/get-songs.ts @@ -15,12 +15,10 @@ import {cleanUrl} from '../utils/url.js'; import ThirdParty from './third-party.js'; import Config from './config.js'; import KeyValueCacheProvider from './key-value-cache.js'; +import {ONE_HOUR_IN_SECONDS, ONE_MINUTE_IN_SECONDS} from '../utils/constants.js'; type SongMetadata = Except; -const ONE_HOUR_IN_SECONDS = 60 * 60; -const ONE_MINUTE_IN_SECONDS = 1 * 60; - @injectable() export default class { private readonly youtube: YouTube; diff --git a/src/services/natural-language-commands.ts b/src/services/natural-language-commands.ts deleted file mode 100644 index 4ce8ea3..0000000 --- a/src/services/natural-language-commands.ts +++ /dev/null @@ -1,131 +0,0 @@ -import {inject, injectable} from 'inversify'; -import {Message, Guild, GuildMember} from 'discord.js'; -import {TYPES} from '../types.js'; -import PlayerManager from '../managers/player.js'; -import {QueuedSong} from '../services/player.js'; -import {getMostPopularVoiceChannel, getMemberVoiceChannel} from '../utils/channels.js'; - -@injectable() -export default class { - private readonly playerManager: PlayerManager; - - constructor(@inject(TYPES.Managers.Player) playerManager: PlayerManager) { - this.playerManager = playerManager; - } - - async execute(msg: Message): Promise { - if (msg.content.startsWith('say') && msg.content.endsWith('muse')) { - const res = msg.content.slice(3, msg.content.indexOf('muse')).trim(); - - await msg.channel.send(res); - return true; - } - - if (msg.content.toLowerCase().includes('packers')) { - await Promise.all([ - msg.channel.send('GO PACKERS GO!!!'), - this.playClip(msg.guild!, msg.member!, { - title: 'GO PACKERS!', - artist: 'Unknown', - url: 'https://www.youtube.com/watch?v=qkdtID7mY3E', - length: 204, - playlist: null, - isLive: false, - addedInChannelId: msg.channel.id, - thumbnailUrl: null, - requestedBy: msg.author.id, - }, 8, 10), - ]); - - return true; - } - - if (msg.content.toLowerCase().includes('bears')) { - await Promise.all([ - msg.channel.send('F*** THE BEARS'), - this.playClip(msg.guild!, msg.member!, { - title: 'GO PACKERS!', - artist: 'Charlie Berens', - url: 'https://www.youtube.com/watch?v=UaqlE9Pyy_Q', - length: 385, - playlist: null, - isLive: false, - addedInChannelId: msg.channel.id, - thumbnailUrl: null, - requestedBy: msg.author.id, - }, 358, 5.5), - ]); - - return true; - } - - if (msg.content.toLowerCase().includes('bitconnect')) { - await Promise.all([ - msg.channel.send('🌊 🌊 🌊 🌊'), - this.playClip(msg.guild!, msg.member!, { - title: 'BITCONNEEECCT', - artist: 'Carlos Matos', - url: 'https://www.youtube.com/watch?v=lCcwn6bGUtU', - length: 227, - playlist: null, - isLive: false, - addedInChannelId: msg.channel.id, - thumbnailUrl: null, - requestedBy: msg.author.id, - }, 50, 13), - ]); - - return true; - } - - return false; - } - - private async playClip(guild: Guild, member: GuildMember, song: QueuedSong, position: number, duration: number): Promise { - const player = this.playerManager.get(guild.id); - - const [channel, n] = getMemberVoiceChannel(member) ?? getMostPopularVoiceChannel(guild); - - if (!player.voiceConnection && n === 0) { - return; - } - - if (!player.voiceConnection) { - await player.connect(channel); - } - - const isPlaying = player.getCurrent() !== null; - let oldPosition = 0; - - player.add(song, {immediate: true}); - - if (isPlaying) { - oldPosition = player.getPosition(); - - player.manualForward(1); - } - - await player.seek(position); - - return new Promise((resolve, reject) => { - try { - setTimeout(async () => { - if (player.getCurrent()?.title === song.title) { - player.removeCurrent(); - - if (isPlaying) { - await player.back(); - await player.seek(oldPosition); - } else { - player.disconnect(); - } - } - - resolve(); - }, duration * 1000); - } catch (error: unknown) { - reject(error); - } - }); - } -} diff --git a/src/services/player.ts b/src/services/player.ts index f46240a..ce611e8 100644 --- a/src/services/player.ts +++ b/src/services/player.ts @@ -1,13 +1,13 @@ -import {VoiceChannel, Snowflake, Client, TextChannel} from 'discord.js'; +import {VoiceChannel, Snowflake} from 'discord.js'; import {Readable} from 'stream'; import hasha from 'hasha'; import ytdl from 'ytdl-core'; import {WriteStream} from 'fs-capacitor'; import ffmpeg from 'fluent-ffmpeg'; import shuffle from 'array-shuffle'; -import errorMsg from '../utils/error-msg.js'; import {AudioPlayer, AudioPlayerStatus, createAudioPlayer, createAudioResource, joinVoiceChannel, StreamType, VoiceConnection, VoiceConnectionStatus} from '@discordjs/voice'; import FileCacheProvider from './file-cache.js'; +import debug from '../utils/debug.js'; export interface QueuedPlaylist { title: string; @@ -31,9 +31,15 @@ export enum STATUS { PAUSED, } +export interface PlayerEvents { + statusChange: (oldStatus: STATUS, newStatus: STATUS) => void; +} + export default class { - public status = STATUS.PAUSED; public voiceConnection: VoiceConnection | null = null; + public status = STATUS.PAUSED; + public guildId: string; + private queue: QueuedSong[] = []; private queuePosition = 0; private audioPlayer: AudioPlayer | null = null; @@ -43,12 +49,11 @@ export default class { private positionInSeconds = 0; - private readonly discordClient: Client; private readonly fileCache: FileCacheProvider; - constructor(client: Client, fileCache: FileCacheProvider) { - this.discordClient = client; + constructor(fileCache: FileCacheProvider, guildId: string) { this.fileCache = fileCache; + this.guildId = guildId; } async connect(channel: VoiceChannel): Promise { @@ -150,9 +155,11 @@ export default class { }, }); this.voiceConnection.subscribe(this.audioPlayer); - this.audioPlayer.play(createAudioResource(stream, { + const resource = createAudioResource(stream, { inputType: StreamType.WebmOpus, - })); + }); + + this.audioPlayer.play(resource); this.attachListeners(); @@ -167,14 +174,13 @@ export default class { this.lastSongURL = currentSong.url; } } catch (error: unknown) { - const currentSong = this.getCurrent(); await this.forward(1); if ((error as {statusCode: number}).statusCode === 410 && currentSong) { const channelId = currentSong.addedInChannelId; if (channelId) { - await (this.discordClient.channels.cache.get(channelId) as TextChannel).send(errorMsg(`${currentSong.title} is unavailable`)); + debug(`${currentSong.title} is unavailable`); return; } } @@ -213,8 +219,12 @@ export default class { } } + canGoForward(skip: number) { + return (this.queuePosition + skip - 1) < this.queue.length; + } + manualForward(skip: number): void { - if ((this.queuePosition + skip - 1) < this.queue.length) { + if (this.canGoForward(skip)) { this.queuePosition += skip; this.positionInSeconds = 0; this.stopTrackingPosition(); @@ -223,8 +233,12 @@ export default class { } } + canGoBack() { + return this.queuePosition - 1 >= 0; + } + async back(): Promise { - if (this.queuePosition - 1 >= 0) { + if (this.canGoBack()) { this.queuePosition--; this.positionInSeconds = 0; this.stopTrackingPosition(); @@ -397,6 +411,9 @@ export default class { .on('error', error => { console.error(error); reject(error); + }) + .on('start', command => { + debug(`Spawned ffmpeg with ${command as string}`); }); youtubeStream.pipe(capacitor); diff --git a/src/types.ts b/src/types.ts index e6edd14..47108b9 100644 --- a/src/types.ts +++ b/src/types.ts @@ -8,9 +8,10 @@ export const TYPES = { ThirdParty: Symbol('ThirdParty'), Managers: { Player: Symbol('PlayerManager'), + UpdatingQueueEmbed: Symbol('UpdatingQueueEmbed'), }, Services: { + AddQueryToQueue: Symbol('AddQueryToQueue'), GetSongs: Symbol('GetSongs'), - NaturalLanguage: Symbol('NaturalLanguage'), }, }; diff --git a/src/utils/constants.ts b/src/utils/constants.ts new file mode 100644 index 0000000..70d9e2c --- /dev/null +++ b/src/utils/constants.ts @@ -0,0 +1,2 @@ +export const ONE_HOUR_IN_SECONDS = 60 * 60; +export const ONE_MINUTE_IN_SECONDS = 1 * 60; diff --git a/src/utils/error-msg.ts b/src/utils/error-msg.ts index 832de3c..0f4e0b2 100644 --- a/src/utils/error-msg.ts +++ b/src/utils/error-msg.ts @@ -5,7 +5,7 @@ export default (error?: string | Error): string => { if (typeof error === 'string') { str = `🚫 ${error}`; } else if (error instanceof Error) { - str = `🚫 ope: ${error.name}`; + str = `🚫 ope: ${error.message}`; } } diff --git a/src/utils/get-youtube-and-spotify-suggestions-for.ts b/src/utils/get-youtube-and-spotify-suggestions-for.ts new file mode 100644 index 0000000..10f9394 --- /dev/null +++ b/src/utils/get-youtube-and-spotify-suggestions-for.ts @@ -0,0 +1,70 @@ +import {ApplicationCommandOptionChoice} from 'discord.js'; +import SpotifyWebApi from 'spotify-web-api-node'; +import getYouTubeSuggestionsFor from './get-youtube-suggestions-for.js'; + +const filterDuplicates = (items: T[]) => { + const results: T[] = []; + + for (const item of items) { + if (!results.some(result => result.name === item.name)) { + results.push(item); + } + } + + return results; +}; + +const getYouTubeAndSpotifySuggestionsFor = async (query: string, spotify: SpotifyWebApi, limit = 10): Promise => { + const [youtubeSuggestions, spotifyResults] = await Promise.all([ + getYouTubeSuggestionsFor(query), + spotify.search(query, ['track', 'album'], {limit: 5}), + ]); + + const totalYouTubeResults = youtubeSuggestions.length; + + const spotifyAlbums = filterDuplicates(spotifyResults.body.albums?.items ?? []); + const spotifyTracks = filterDuplicates(spotifyResults.body.tracks?.items ?? []); + + const totalSpotifyResults = spotifyAlbums.length + spotifyTracks.length; + + // Number of results for each source should be roughly the same. + // If we don't have enough Spotify suggestions, prioritize YouTube results. + const maxSpotifySuggestions = Math.floor(limit / 2); + const numOfSpotifySuggestions = Math.min(maxSpotifySuggestions, totalSpotifyResults); + + const maxYouTubeSuggestions = limit - numOfSpotifySuggestions; + const numOfYouTubeSuggestions = Math.min(maxYouTubeSuggestions, totalYouTubeResults); + + const suggestions: ApplicationCommandOptionChoice[] = []; + + suggestions.push( + ...youtubeSuggestions + .slice(0, numOfYouTubeSuggestions) + .map(suggestion => ({ + name: `YouTube: ${suggestion}`, + value: suggestion, + }), + )); + + const maxSpotifyAlbums = Math.floor(numOfSpotifySuggestions / 2); + const numOfSpotifyAlbums = Math.min(maxSpotifyAlbums, spotifyResults.body.albums?.items.length ?? 0); + const maxSpotifyTracks = numOfSpotifySuggestions - numOfSpotifyAlbums; + + suggestions.push( + ...spotifyAlbums.slice(0, maxSpotifyAlbums).map(album => ({ + name: `Spotify: 💿 ${album.name}${album.artists.length > 0 ? ` - ${album.artists[0].name}` : ''}`, + value: `spotify:album:${album.id}`, + })), + ); + + suggestions.push( + ...spotifyTracks.slice(0, maxSpotifyTracks).map(track => ({ + name: `Spotify: 🎵 ${track.name}${track.artists.length > 0 ? ` - ${track.artists[0].name}` : ''}`, + value: `spotify:track:${track.id}`, + })), + ); + + return suggestions; +}; + +export default getYouTubeAndSpotifySuggestionsFor; diff --git a/src/utils/get-youtube-suggestions-for.ts b/src/utils/get-youtube-suggestions-for.ts new file mode 100644 index 0000000..11977e4 --- /dev/null +++ b/src/utils/get-youtube-suggestions-for.ts @@ -0,0 +1,15 @@ +import got from 'got'; + +const getYouTubeSuggestionsFor = async (query: string): Promise => { + const [_, suggestions] = await got('https://suggestqueries.google.com/complete/search?client=firefox&ds=yt&q=', { + searchParams: { + client: 'firefox', + ds: 'yt', + q: query, + }, + }).json<[string, string[]]>(); + + return suggestions; +}; + +export default getYouTubeSuggestionsFor; diff --git a/src/utils/loading-message.ts b/src/utils/loading-message.ts deleted file mode 100644 index 53a2aed..0000000 --- a/src/utils/loading-message.ts +++ /dev/null @@ -1,81 +0,0 @@ -import {TextChannel, Message, MessageReaction} from 'discord.js'; -import delay from 'delay'; - -const INITAL_DELAY = 500; -const PERIOD = 500; - -export default class { - public isStopped = true; - private readonly channel: TextChannel; - private readonly text: string; - private msg!: Message; - - constructor(channel: TextChannel, text = 'cows! count \'em') { - this.channel = channel; - this.text = text; - } - - async start(): Promise { - this.msg = await this.channel.send(this.text); - - const icons = ['🐮', '🐴', '🐄']; - - const reactions: MessageReaction[] = []; - - let i = 0; - let isRemoving = false; - - this.isStopped = false; - - (async () => { - await delay(INITAL_DELAY); - - while (!this.isStopped) { - if (reactions.length === icons.length) { - isRemoving = true; - } - - // eslint-disable-next-line no-await-in-loop - await delay(PERIOD); - - if (isRemoving) { - const reactionToRemove = reactions.shift(); - - if (reactionToRemove) { - // eslint-disable-next-line no-await-in-loop - await reactionToRemove.users.remove(this.msg.client.user!.id); - } else { - isRemoving = false; - } - } else { - if (!this.isStopped) { - // eslint-disable-next-line no-await-in-loop - reactions.push(await this.msg.react(icons[i % icons.length])); - } - - i++; - } - } - })(); - } - - async stop(str = 'u betcha'): Promise { - const wasAlreadyStopped = this.isStopped; - - this.isStopped = true; - - const editPromise = str ? this.msg.edit(str) : null; - const reactPromise = str && !wasAlreadyStopped ? (async () => { - await this.msg.fetch(); - await Promise.all(this.msg.reactions.cache.map(async react => { - if (react.me) { - await react.users.remove(this.msg.client.user!.id); - } - })); - })() : null; - - await Promise.all([editPromise, reactPromise]); - - return this.msg; - } -} diff --git a/src/utils/log-banner.ts b/src/utils/log-banner.ts index 0ad6466..9cde988 100644 --- a/src/utils/log-banner.ts +++ b/src/utils/log-banner.ts @@ -9,6 +9,7 @@ const logBanner = () => { paypalUser: 'codetheweb', githubSponsor: 'codetheweb', madeByPrefix: 'Made with 🎶 by ', + buildDate: process.env.BUILD_DATE ? new Date(process.env.BUILD_DATE) : undefined, }).join('\n')); console.log('\n'); }; diff --git a/src/utils/update-permissions-for-guild.ts b/src/utils/update-permissions-for-guild.ts new file mode 100644 index 0000000..ca7c427 --- /dev/null +++ b/src/utils/update-permissions-for-guild.ts @@ -0,0 +1,44 @@ +import {ApplicationCommandPermissionData, Guild} from 'discord.js'; +import {prisma} from './db.js'; + +const COMMANDS_TO_LIMIT_TO_GUILD_OWNER = ['config']; + +const updatePermissionsForGuild = async (guild: Guild) => { + const settings = await prisma.setting.findUnique({ + where: { + guildId: guild.id, + }, + }); + + if (!settings) { + throw new Error('could not find settings for guild'); + } + + const permissions: ApplicationCommandPermissionData[] = [ + { + id: guild.ownerId, + type: 'USER', + permission: true, + }, + { + id: guild.roles.everyone.id, + type: 'ROLE', + permission: false, + }, + ]; + const commands = await guild.commands.fetch(); + + await guild.commands.permissions.set({fullPermissions: commands.map(command => ({ + id: command.id, + permissions: COMMANDS_TO_LIMIT_TO_GUILD_OWNER.includes(command.name) ? permissions : [ + ...permissions, + ...(settings.roleId ? [{ + id: settings.roleId, + type: 'ROLE' as const, + permission: true, + }] : []), + ], + }))}); +}; + +export default updatePermissionsForGuild; diff --git a/tsconfig.json b/tsconfig.json index c5bf780..2970aa3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "lib": ["ES2019"], + "lib": ["ES2019", "DOM"], "target": "es2018", "module": "ES2020", "moduleResolution": "node", diff --git a/yarn.lock b/yarn.lock index c7afc71..31ebd1f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22,9 +22,9 @@ integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== "@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.7.tgz#81a01d7d675046f0d96f82450d9d9578bdfd6b0b" - integrity sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw== + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" + integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== dependencies: "@babel/helper-validator-identifier" "^7.16.7" chalk "^2.0.0" @@ -53,6 +53,17 @@ tslib "^2.3.1" zod "^3.11.6" +"@discordjs/builders@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-0.12.0.tgz#5f6d95d1b231fa975a7e28ca3f8098e517676887" + integrity sha512-Vx2MjUZd6QVo1uS2uWt708Fd6cHWGFblAvbpL5EBO+kLl0BADmPwwvts+YJ/VfSywed6Vsk6K2cEooR/Ytjhjw== + dependencies: + "@sindresorhus/is" "^4.3.0" + discord-api-types "^0.26.1" + ts-mixer "^6.0.0" + tslib "^2.3.1" + zod "^3.11.6" + "@discordjs/collection@^0.4.0": version "0.4.0" resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.4.0.tgz#b6488286a1cc7b41b644d7e6086f25a1c1e6f837" @@ -81,6 +92,19 @@ "@discordjs/node-pre-gyp" "^0.4.2" node-addon-api "^4.2.0" +"@discordjs/rest@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-0.3.0.tgz#89e06a42b168c91598891d6bf860353e28fba5d2" + integrity sha512-F9aeP3odlAlllM1ciBZLdd+adiAyBj4VaZBejj4UMj4afE2wfCkNTGvYYiRxrXUE9fN7e/BuDP2ePl0tVA2m7Q== + dependencies: + "@discordjs/collection" "^0.4.0" + "@sapphire/async-queue" "^1.1.9" + "@sapphire/snowflake" "^3.0.1" + discord-api-types "^0.26.1" + form-data "^4.0.0" + node-fetch "^2.6.5" + tslib "^2.3.1" + "@discordjs/voice@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.8.0.tgz#5d790fc25b883698f6eb7762efe1af00b6440947" @@ -221,15 +245,15 @@ once "^1.4.0" "@octokit/request@^5.6.0": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.2.tgz#1aa74d5da7b9e04ac60ef232edd9a7438dcf32d8" - integrity sha512-je66CvSEVf0jCpRISxkUcCa0UkxmFs6eGDRSbfJtAVwbLH5ceqF+YEyC8lj8ystKyZTy8adWr0qmkY52EfOeLA== + version "5.6.3" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.3.tgz#19a022515a5bba965ac06c9d1334514eb50c48b0" + integrity sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A== dependencies: "@octokit/endpoint" "^6.0.1" "@octokit/request-error" "^2.1.0" "@octokit/types" "^6.16.1" is-plain-object "^5.0.0" - node-fetch "^2.6.1" + node-fetch "^2.6.7" universal-user-agent "^6.0.0" "@octokit/rest@18.12.0": @@ -249,22 +273,22 @@ dependencies: "@octokit/openapi-types" "^11.2.0" -"@prisma/client@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-3.7.0.tgz#9cafc105f12635c95e9b7e7b18e8fbf52cf3f18a" - integrity sha512-fUJMvBOX5C7JPc0e3CJD6Gbelbu4dMJB4ScYpiht8HMUnRShw20ULOipTopjNtl6ekHQJ4muI7pXlQxWS9nMbw== +"@prisma/client@^3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-3.8.1.tgz#c11eda8e84760867552ffde4de7b48fb2cf1e1c0" + integrity sha512-NxD1Xbkx1eT1mxSwo1RwZe665mqBETs0VxohuwNfFIxMqcp0g6d4TgugPxwZ4Jb4e5wCu8mQ9quMedhNWIWcZQ== dependencies: - "@prisma/engines-version" "3.7.0-31.8746e055198f517658c08a0c426c7eec87f5a85f" + "@prisma/engines-version" "3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f" -"@prisma/engines-version@3.7.0-31.8746e055198f517658c08a0c426c7eec87f5a85f": - version "3.7.0-31.8746e055198f517658c08a0c426c7eec87f5a85f" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-3.7.0-31.8746e055198f517658c08a0c426c7eec87f5a85f.tgz#055f36ac8b06c301332c14963cd0d6c795942c90" - integrity sha512-+qx2b+HK7BKF4VCa0LZ/t1QCXsu6SmvhUQyJkOD2aPpmOzket4fEnSKQZSB0i5tl7rwCDsvAiSeK8o7rf+yvwg== +"@prisma/engines-version@3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f": + version "3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f.tgz#4c8d9744b5e54650a8ba5fde0a711399d6adba24" + integrity sha512-G2JH6yWt6ixGKmsRmVgaQYahfwMopim0u/XLIZUo2o/mZ5jdu7+BL+2V5lZr7XiG1axhyrpvlyqE/c0OgYSl3g== -"@prisma/engines@3.7.0-31.8746e055198f517658c08a0c426c7eec87f5a85f": - version "3.7.0-31.8746e055198f517658c08a0c426c7eec87f5a85f" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-3.7.0-31.8746e055198f517658c08a0c426c7eec87f5a85f.tgz#12f28d5b78519fbd84c89a5bdff457ff5095e7a2" - integrity sha512-W549ub5NlgexNhR8EFstA/UwAWq3Zq0w9aNkraqsozVCt2CsX+lK4TK7IW5OZVSnxHwRjrgEAt3r9yPy8nZQRg== +"@prisma/engines@3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f": + version "3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f.tgz#4479099b99f6a082ce5843ee7208943ccedd127f" + integrity sha512-bHYubuItSN/DGYo36aDu7xJiJmK52JOSHs4MK+KbceAtwS20BCWadRgtpQ3iZ2EXfN/B1T0iCXlNraaNwnpU2w== "@release-it/keep-a-changelog@^2.3.0": version "2.3.0" @@ -274,19 +298,24 @@ detect-newline "^3.1.0" "@sapphire/async-queue@^1.1.9": - version "1.1.9" - resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.1.9.tgz#ce69611c8753c4affd905a7ef43061c7eb95c01b" - integrity sha512-CbXaGwwlEMq+l1TRu01FJCvySJ1CEFKFclHT48nIfNeZXaAAmmwwy7scUKmYHPUa3GhoMp6Qr1B3eAJux6XgOQ== + version "1.2.0" + resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.2.0.tgz#7a56afd318101d338433d7180ebd6af349243268" + integrity sha512-O5ND5Ljpef86X5oy8zXorQ754TMjWALcPSAgPBu4+76HLtDTrNoDyzU2uGE2G4A8Wv51u0MXHzGQ0WZ4GMtpIw== + +"@sapphire/snowflake@^3.0.1": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.1.0.tgz#1c2d9781d3b1de0bcb02b7079898947ce754d394" + integrity sha512-K+OiqXSx4clIaXcoaghrCV56zsm3bZZ5SBpgJkgvAKegFFdETMntHviUfypjt8xVleIuDaNyQA4APOIl3BMcxg== "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.2.0": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.2.1.tgz#b88b5724283db80b507cd612caee9a1947412a20" - integrity sha512-BrzrgtaqEre0qfvI8sMTaEvx+bayuhPmfe2rfeUGPPHYr/PLxCOqkOe4TQTDPb+qcqgNcsAtXV/Ew74mcDIE8w== +"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.2.0", "@sindresorhus/is@^4.3.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.4.0.tgz#e277e5bdbdf7cb1e20d320f02f5e2ed113cd3185" + integrity sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ== "@szmarczak/http-timer@^1.1.2": version "1.1.2" @@ -406,9 +435,9 @@ form-data "^3.0.0" "@types/node@*", "@types/node@^17.0.0": - version "17.0.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.8.tgz#50d680c8a8a78fe30abe6906453b21ad8ab0ad7b" - integrity sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg== + version "17.0.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.13.tgz#5ed7ed7c662948335fcad6c412bb42d99ea754e3" + integrity sha512-Y86MAxASe25hNzlDbsviXl8jQHb0RDvKt4c40ZJQ1Don0AAL0STLZSs4N+6gLEO55pedy7r2cLwS+ZDxPm/2Bw== "@types/parse-json@^4.0.0": version "4.0.0" @@ -428,9 +457,9 @@ integrity sha512-rHmG4soR13N3jDCu0QL9cv6q3jMM/AU/0w5w7ukTt89e23rv5Vz86BNqXP/34wEzYWgiTNSG+f+xGT1rjABj4g== "@types/spotify-web-api-node@^5.0.2": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@types/spotify-web-api-node/-/spotify-web-api-node-5.0.4.tgz#457f3a82d08aa0a561f98ebc1d5f78228e3b0c5d" - integrity sha512-t2a0wqe/9ydzqPTvL6CKys8v3mS3jR942BqSlg2e9lOtskUFSim9pXwathV0A9MTout5dpeWC3jW1yNUzJhovg== + version "5.0.7" + resolved "https://registry.yarnpkg.com/@types/spotify-web-api-node/-/spotify-web-api-node-5.0.7.tgz#de5cb576781e0aaa38568744dfb891c86a7938ee" + integrity sha512-8ajd4xS3+l4Zau1OyggPv7DjeSFEIGYvG5Q8PbbBMKiaRFD53IkcvU4Bx4Ijyzw+l+Kc09L5L+MXRj0wyVLx9Q== dependencies: "@types/spotify-api" "*" @@ -559,9 +588,9 @@ ajv@^6.10.0, ajv@^6.12.4: uri-js "^4.2.2" ajv@^8.0.1: - version "8.8.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" - integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== + version "8.9.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.9.0.tgz#738019146638824dea25edcf299dcba1b0e7eb18" + integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -667,9 +696,9 @@ async-retry@1.3.3: retry "0.13.1" async@>=0.2.9: - version "3.2.2" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.2.tgz#2eb7671034bb2194d45d30e31e24ec7e7f9670cd" - integrity sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g== + version "3.2.3" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" + integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== asynckit@^0.4.0: version "0.4.0" @@ -848,9 +877,9 @@ chardet@^0.7.0: integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== chokidar@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -1054,20 +1083,13 @@ date-fns@^2.16.1: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== -debug@4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3: +debug@4, debug@4.3.3, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3: version "4.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== dependencies: ms "2.1.2" -debug@4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - debug@=3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -1143,14 +1165,6 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -deprecated-obj@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/deprecated-obj/-/deprecated-obj-2.0.0.tgz#e6ba93a3989f6ed18d685e7d99fb8d469b4beffc" - integrity sha512-CkdywZC2rJ8RGh+y3MM1fw1EJ4oO/oNExGbRFv0AQoMS+faTd3nO7slYjkj/6t8OnIMUE+wxh6G97YHhK1ytrw== - dependencies: - flat "^5.0.2" - lodash "^4.17.20" - deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" @@ -1467,10 +1481,10 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.1.1: - version "3.2.8" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.8.tgz#b4c563b4750cee1cbe8d8d41d3abf5cd6e211923" - integrity sha512-UsiHHXoDbC3iS7vBOFvld7Q9XqBu318xztdHiL10Fjov3AK5GI5bek2ZJkxZcjPguOYH39UL1W4A6w+l7tpNtw== +fast-glob@^3.1.1, fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -1549,15 +1563,10 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - flatted@^3.1.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" - integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== + version "3.2.5" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== fluent-ffmpeg@^2.1.2: version "2.1.2" @@ -1735,7 +1744,7 @@ globals@^13.6.0, globals@^13.9.0: dependencies: type-fest "^0.20.2" -globby@11.0.4, globby@^11.0.3: +globby@11.0.4: version "11.0.4" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== @@ -1747,6 +1756,18 @@ globby@11.0.4, globby@^11.0.3: merge2 "^1.3.0" slash "^3.0.0" +globby@^11.0.3: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + got@11.8.3: version "11.8.3" resolved "https://registry.yarnpkg.com/got/-/got-11.8.3.tgz#f496c8fdda5d729a90b4905d2b07dbd148170770" @@ -1765,9 +1786,9 @@ got@11.8.3: responselike "^2.0.0" got@^12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/got/-/got-12.0.0.tgz#2ee3d5ff25eabc47dae975d376ddcee1d450bec1" - integrity sha512-gNNNghQ1yw0hyzie1FLK6gY90BQlXU9zSByyRygnbomHPruKQ6hAKKbpO1RfNZp8b+qNzNipGeRG3tUelKcVsA== + version "12.0.1" + resolved "https://registry.yarnpkg.com/got/-/got-12.0.1.tgz#78747f1c5bc7069bbd739636ed8b70c7f2140a39" + integrity sha512-1Zhoh+lDej3t7Ks1BP/Jufn+rNqdiHQgUOcTxHzg2Dao1LQfp5S4Iq0T3iBxN4Zdo7QqCJL+WJUNzDX6rCP2Ew== dependencies: "@sindresorhus/is" "^4.2.0" "@szmarczak/http-timer" "^5.0.1" @@ -1932,7 +1953,7 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.4, ignore@^5.1.8: +ignore@^5.1.4, ignore@^5.1.8, ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== @@ -2048,7 +2069,7 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.8.0: +is-core-module@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== @@ -2225,9 +2246,9 @@ keyv@^3.0.0: json-buffer "3.0.0" keyv@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.4.tgz#f040b236ea2b06ed15ed86fbef8407e1a1c8e376" - integrity sha512-vqNHbAc8BBsxk+7QBYLW0Y219rWcClspR6WSeoHYKG5mnsSoOH+BL1pWq02DDCVdvvuUny5rkBlzMRzoqc+GIg== + version "4.0.5" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.5.tgz#bb12b467aba372fab2a44d4420c00d3c4ebd484c" + integrity sha512-531pkGLqV3BMg0eDqqJFI0R1mkK1Nm5xIP2mM6keP5P8WfFtCkg2IOwplTUmlGoTgIg9yQYZ/kdihhz89XH3vA== dependencies: json-buffer "3.0.1" @@ -2280,7 +2301,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= -lodash@4.17.21, lodash@^4.17.20, lodash@^4.17.21: +lodash@4.17.21, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -2324,11 +2345,11 @@ lru-cache@^6.0.0: yallist "^4.0.0" m3u8stream@^0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/m3u8stream/-/m3u8stream-0.8.4.tgz#15b49d0c2b510755ea43c1e53f85d7aaa4dc65c2" - integrity sha512-sco80Db+30RvcaIOndenX6E6oQNgTiBKeJbFPc+yDXwPQIkryfboEbCvXPlBRq3mQTCVPQO93TDVlfRwqpD35w== + version "0.8.6" + resolved "https://registry.yarnpkg.com/m3u8stream/-/m3u8stream-0.8.6.tgz#0d6de4ce8ee69731734e6b616e7b05dd9d9a55b1" + integrity sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA== dependencies: - miniget "^4.0.0" + miniget "^4.2.2" sax "^1.2.4" macos-release@^2.5.0: @@ -2353,7 +2374,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -2408,10 +2429,10 @@ mimic-response@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== -miniget@^4.0.0, miniget@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/miniget/-/miniget-4.2.1.tgz#11a1c24817a059e292378eb9cff4328d9240c665" - integrity sha512-O/DduzDR6f+oDtVype9S/Qu5hhnx73EDYGyZKwU/qN82lehFZdfhoa4DT51SpsO+8epYrB3gcRmws56ROfTIoQ== +miniget@^4.0.0, miniget@^4.2.1, miniget@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/miniget/-/miniget-4.2.2.tgz#db20320f265efdc4c1826a0be431d56753074475" + integrity sha512-a7voNL1N5lDMxvTMExOkg+Fq89jM2vY8pAi9ZEWzZtfNmdfP6RXkvUtFnCAXoCv2T9k1v/fUJVaAEuepGcvLYA== minimatch@^3.0.4: version "3.0.4" @@ -2478,9 +2499,9 @@ new-github-release-url@1.0.0: type-fest "^0.4.1" node-addon-api@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.2.0.tgz#117cbb5a959dff0992e1c586ae0393573e4d2a87" - integrity sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q== + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" + integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== node-emoji@^1.10.0: version "1.11.0" @@ -2489,10 +2510,10 @@ node-emoji@^1.10.0: dependencies: lodash "^4.17.21" -node-fetch@^2.6.1, node-fetch@^2.6.5: - version "2.6.6" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" - integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== +node-fetch@^2.6.1, node-fetch@^2.6.5, node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" @@ -2850,12 +2871,12 @@ prism-media@^1.3.2: resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.3.2.tgz#a1f04423ec15d22f3d62b1987b6a25dc49aad13b" integrity sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g== -prisma@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-3.7.0.tgz#9c73eeb2f16f767fdf523d0f4cc4c749734d62e2" - integrity sha512-pzgc95msPLcCHqOli7Hnabu/GRfSGSUWl5s2P6N13T/rgMB+NNeKbxCmzQiZT2yLOeLEPivV6YrW1oeQIwJxcg== +prisma@^3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-3.8.1.tgz#44395cef7cbb1ea86216cb84ee02f856c08a7873" + integrity sha512-Q8zHwS9m70TaD7qI8u+8hTAmiTpK+IpvRYF3Rgb/OeWGQJOMgZCFFvNCiSfoLEQ95wilK7ctW3KOpc9AuYnRUA== dependencies: - "@prisma/engines" "3.7.0-31.8746e055198f517658c08a0c426c7eec87f5a85f" + "@prisma/engines" "3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f" progress@^2.0.0: version "2.0.3" @@ -2893,9 +2914,9 @@ pupa@^2.1.1: escape-goat "^2.0.0" qs@^6.9.4: - version "6.10.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.2.tgz#c1431bea37fc5b24c5bdbafa20f16bdf2a4b9ffe" - integrity sha512-mSIdjzqznWgfd4pMii7sHtaYF8rx8861hBO80SraY5GT0XQibWZWJSid0avzHGkDIZLImux2S5mXO0Hfct2QCw== + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== dependencies: side-channel "^1.0.4" @@ -2977,17 +2998,16 @@ registry-url@^5.0.0: rc "^1.2.8" release-it@^14.11.8: - version "14.11.8" - resolved "https://registry.yarnpkg.com/release-it/-/release-it-14.11.8.tgz#6da25daa93286d832cae4f10008a3bf0c08c2725" - integrity sha512-951DJ0kwjwU7CwGU3BCvRBgLxuJsOPRrZkqx0AsugJdSyPpUdwY9nlU0RAoSKqgh+VTerzecXLIIwgsGIpNxlA== + version "14.12.4" + resolved "https://registry.yarnpkg.com/release-it/-/release-it-14.12.4.tgz#0fd13de85e382323c634a0697a601437e042123a" + integrity sha512-lqf9PMsj7ycCqFHGag8Uv7cE1hNsKa+yKUMe+Fkh9fdOfxu2F01On+YUefRCP0DuQthmr/WyLCYdrjThMEkWFQ== dependencies: "@iarna/toml" "2.2.5" "@octokit/rest" "18.12.0" async-retry "1.3.3" chalk "4.1.2" cosmiconfig "7.0.1" - debug "4.3.2" - deprecated-obj "2.0.0" + debug "4.3.3" execa "5.1.1" form-data "4.0.0" git-url-parse "11.6.0" @@ -3004,7 +3024,7 @@ release-it@^14.11.8: os-name "4.0.1" parse-json "5.2.0" semver "7.3.5" - shelljs "0.8.4" + shelljs "0.8.5" update-notifier "5.1.0" url-join "4.0.1" uuid "8.3.2" @@ -3037,11 +3057,11 @@ resolve-from@^5.0.0: integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve@^1.1.6: - version "1.21.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.21.0.tgz#b51adc97f3472e6a5cf4444d34bc9d6b9037591f" - integrity sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA== + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== dependencies: - is-core-module "^2.8.0" + is-core-module "^2.8.1" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -3112,9 +3132,9 @@ rxjs@^6.6.3: tslib "^1.9.0" rxjs@^7.2.0: - version "7.5.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.1.tgz#af73df343cbcab37628197f43ea0c8256f54b157" - integrity sha512-KExVEeZWxMZnZhUZtsJcFwz8IvPvgu4G2Z2QyqjZQzUGr32KDYuSxrEYO4w3tFFNbfLozcrKUTvTPi+E9ywJkQ== + version "7.5.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.2.tgz#11e4a3a1dfad85dbf7fb6e33cbba17668497490b" + integrity sha512-PwDt186XaL3QN5qXj/H9DGyHhP3/RYYgZZwqBv9Tv8rsAaiwFH1IsJJlcgD37J7UW5a6O67qX0KWKS3/pu0m4w== dependencies: tslib "^2.1.0" @@ -3184,10 +3204,10 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shelljs@0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" - integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== +shelljs@0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== dependencies: glob "^7.0.0" interpret "^1.0.0" @@ -3488,9 +3508,9 @@ type-fest@^0.8.0: integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== type-fest@^2.8.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.9.0.tgz#7a2d430dd966f52b6bc723da2aaa2c9867530551" - integrity sha512-uC0hJKi7eAGXUJ/YKk53RhnKxMwzHWgzf4t92oz8Qez28EBgVTfpDTB59y9hMYLzc/Wl85cD7Tv1hLZZoEJtrg== + version "2.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.11.0.tgz#732ffaf73e4d17d1f762a539876a791b45ed273b" + integrity sha512-GwRKR1jZMAQP/hVR929DWB5Z2lwSIM/nNcHEfDj2E0vOMhcYbqFxGKE5JaSzMdzmEtWJiamEn6VwHs/YVXVhEQ== typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -3500,9 +3520,9 @@ typedarray-to-buffer@^3.1.5: is-typedarray "^1.0.0" typescript@>=4.3, typescript@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.4.tgz#a17d3a0263bf5c8723b9c52f43c5084edf13c2e8" - integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg== + version "4.5.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" + integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== undefsafe@^2.0.5: version "2.0.5" @@ -3664,12 +3684,7 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.0.tgz#f05e982a0a88c604080e8581576e2a063802bed6" - integrity sha512-IHVsKe2pjajSUIl4KYMQOdlyliovpEPquKkqbwswulszzI7r0SfQrxnXdWAEqOlDCLrVSJzo+O1hAwdog2sKSQ== - -ws@^8.4.2: +ws@^8.4.0, ws@^8.4.2: version "8.4.2" resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.2.tgz#18e749868d8439f2268368829042894b6907aa0b" integrity sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA== @@ -3740,7 +3755,7 @@ youtube.ts@^0.2.5: axios "^0.19.0" ytdl-core "^4.9.1" -ytdl-core@^4.10.0: +ytdl-core@^4.10.0, ytdl-core@^4.9.1: version "4.10.0" resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.10.0.tgz#0835cb411677684539fac2bcc10553f6f58db3e1" integrity sha512-RCCoSVTmMeBPH5NFR1fh3nkDU9okvWM0ZdN6plw6I5+vBBZVUEpOt8vjbSgprLRMmGUsmrQZJhvG1CHOat4mLA== @@ -3749,15 +3764,6 @@ ytdl-core@^4.10.0: miniget "^4.0.0" sax "^1.1.3" -ytdl-core@^4.9.1: - version "4.9.2" - resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.9.2.tgz#c2d1ec44ee3cabff35e5843c6831755e69ffacf0" - integrity sha512-aTlsvsN++03MuOtyVD4DRF9Z/9UAeeuiNbjs+LjQBAiw4Hrdp48T3U9vAmRPyvREzupraY8pqRoBfKGqpq+eHA== - dependencies: - m3u8stream "^0.8.4" - miniget "^4.0.0" - sax "^1.1.3" - ytsr@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/ytsr/-/ytsr-3.6.0.tgz#bc55e8957dcc293e49e18cc3b3e6d2890d15a15e"