From f52f82b867376f64a970987a8c2a221e7cbdda15 Mon Sep 17 00:00:00 2001 From: Forest <77603428+ForestOfLight@users.noreply.github.com> Date: Mon, 10 Mar 2025 19:24:48 -0700 Subject: [PATCH] Initial commit --- .gitignore | 2 + LICENSE | 21 + README.md | 73 ++++ example_help.png | Bin 0 -> 83916 bytes manifest.json | 40 ++ pack_icon.png | Bin 0 -> 65843 bytes scripts/lib/canopy/CanopyExtension.js | 166 +++++++ scripts/lib/canopy/Command.js | 103 +++++ scripts/lib/canopy/Rule.js | 76 ++++ scripts/lib/canopy/extension.ipc.js | 70 +++ scripts/lib/ipc/ipc.d.ts | 103 +++++ scripts/lib/ipc/ipc.js | 593 ++++++++++++++++++++++++++ scripts/main.js | 97 +++++ 13 files changed, 1344 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 example_help.png create mode 100644 manifest.json create mode 100644 pack_icon.png create mode 100644 scripts/lib/canopy/CanopyExtension.js create mode 100644 scripts/lib/canopy/Command.js create mode 100644 scripts/lib/canopy/Rule.js create mode 100644 scripts/lib/canopy/extension.ipc.js create mode 100644 scripts/lib/ipc/ipc.d.ts create mode 100644 scripts/lib/ipc/ipc.js create mode 100644 scripts/main.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..860f418 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +.vscode/ \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1e7eecb --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 ForestOfLight + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..36b2827 --- /dev/null +++ b/README.md @@ -0,0 +1,73 @@ +
+ + Canopy Extension Example Icon + +

Canopy Extension Example

+ +[![Codacy Quality](https://app.codacy.com/project/badge/Grade/10040a714ad84a2f912d4dae9d3f6e57)](https://app.codacy.com/gh/ForestOfLight/Canopy-Extension-Example/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade) +[![Minecraft - Version](https://img.shields.io/badge/Minecraft-v1.21.60_(Bedrock)-brightgreen)](https://feedback.minecraft.net/hc/en-us/sections/360001186971-Release-Changelogs) +[![GitHub License](https://img.shields.io/github/license/forestoflight/canopy-extension-example)](LICENSE) +[![Discord](https://badgen.net/discord/members/9KGche8fxm?icon=discord&label=Discord&list=what)](https://discord.gg/9KGche8fxm) +
+ +--- + +Extensions?! In a behavior pack?! Yep! This repo contains an example pack designed to teach you how to create your own extensions for **Canopy**. All extensions must be added to the same world as **Canopy** (the dependencies in the `manifest.json` should ensure that). + +## How this example pack functions ingame + +What **Canopy** handles: + +**`./canopy [true/false]`** +**Canopy** will automatically include the names of your rules in the `./canopy` command. + +**`./help`** +**Canopy** will automatically include a Rules and a Commands help page for your extension. + +![Help Page](./example_help.png) + +What the extension handles: + +**`./example [message]`** +This command sends a message to the chat. It also has a default message if no message is provided. (Alias: `./ex`) + +**`commandExample`** +This rule will enable the `./example` command. + +**`exampleRule`** +This rule will enable a message in chat when you push a button. + +## How to create an extension + +1. Clone this repo. + ```sh + git clone https://github.com/ForestOfLight/canopy-extension-example.git + ``` +2. Remove all files that are not the `pack_icon.png`, the `manifest.json` file, or in the `scripts/` folder. +3. Rename the folder to your extension's name. + ```sh + mv canopy-extension-example your-extension-name + ``` +4. Open the folder in your favorite code editor. +5. Edit the `manifest.json` file to match your extension's information. +6. Replace the `pack_icon.png` with your extension's icon. +7. Edit the `main.js` file to add your extension's functionality. + +> [!TIP] +> Most information about how to code a **Canopy Extension** can be found in the `main.js` file. + +## How to use an extension + +1. Add the extension pack to the same world as the **Canopy** RP & BP. +2. Profit. + +**Canopy** will automatically detect the extension and load it! + +## How does this work? + +**Canopy** and its extensions all communicate using scriptevents! The vanilla `/scriptevent` command allows for sending strings to Behavior Packs and the `ScriptEventCommandMessage` event allows for recieving them. **Canopy** uses [MCBE-IPC](https://https://github.com/OmniacDev/MCBE-IPC), a library that streamlines the process of sending and recieving scriptevents. +**Canopy Extensions** use these to communicate with **Canopy** when new rules and commands are added. **Canopy** uses these as well to get rule data, set rule data, and call command callbacks from extensions. + +## Issues & Suggestions + +If you have any issues or suggestions, please open an issue on this repo. Additionally, if you're interested in contributing to the project, feel free to open a pull request! diff --git a/example_help.png b/example_help.png new file mode 100644 index 0000000000000000000000000000000000000000..4889a69a03380dee0ed3ae42a78604125a518a69 GIT binary patch literal 83916 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

Pqb$$M$k(a2zIlMm8e7 zTWp+5HZhEtdE+_wDqTx_;rdGFpT@4asp<(^7ia?{LHPws*8`3=Xzi5q50SGLTE8w0 zw3U*fDiU=NS+KfoIJS@_s#2^R?&W*&)+x_pzNV5)wgT9xx~dBj={Tj?R|C)8R$C7C z|BYi`LDj8S@1*){hW$kJWE?8nBUI}eBD@^vjN0;%N5p#R6`|&jEdb&*AK<2VqzqO! zluXwQbqPJn7*Fu=fHEkd(;6KhH83Br)!eDFfs&DsI5b}P7+z^_$tPQqfBzdEvZcQR ze|+N?l}C~b96$6AMb@xQ})S=rh;hF0%ZhBkR2dd%mPFfPIpbA&vz#}MUN=NYdgvGr^ev*nysi&{j+l^NYVDhkhv3>QeKF| zx;*Vo4$nSfhTWo)ZVJZ(3k{&oU4Z;7O0E+slL}aDO!MY+lVM7=7fRcE3l#f{TvcvA zY-l(VD{|4sxW;qHf@52Ruz#5Bu#$j3()&?d2g_v8(93 zhI8G~f72(m@OeeBkmLEQ@1^Gd;A^RDDoJ}(8*ekHw53DFru}P|uI6+3a+f1l%@t;^ z?SA1z=Gq!0ZXWK?5&i+0>^KeT?z@e3PO6w-{?_FnZb#6UIV z(IJ8*R3$$P=%d-0ANK6rb=|b5qA$;hB_|$mqJHfuLqYGjy&x!6<*r}A4e2shw8~@=aqL`TZQ~Y zBXqlC*L%iL$wL{UQZsN@RgfG}y^+#YwN29!y z;$Ct=eP`&7551mk$Qj=?wzb8yP+j_-PZt#PEthpF-#3eWStZq?vRsPj&I^m8fmb!W ze`fa$P_DFoIuVTf>PgUY9#M3qjoZx-=!Vsxfr_AkBy;s0OmL8Z#A$9d5AOC_+0Tdh z%;5WOZZQczMoNTMs)NJ75_P~Ut?_g>xs1nOXs;(OTo@RdL!8XxBmV|ImTJA--kREO z>}!QuQgsDiomrZ2XMY@k4VcoE){(w$ZV^KOwfDX>iz7)fu7`s15&d{~jW|Zz7o>xL zIvU|&xAGPcwH4p8BR1%~n?ZVgup;vnDDip o6}{;qi#fx|%rDMHz~_DA|D?vL9hA!c3j7$HH~J<2-1WQv4GVNY?EnA( literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..c4b9575 --- /dev/null +++ b/manifest.json @@ -0,0 +1,40 @@ +{ + "format_version": 2, + "header": { + "name": "Canopy Extension Example", + "description": "Example extension for §l§aCanopy§r by §aForestOfLight§r.", + "uuid": "e4e844d5-f45b-4623-82a7-534d44bb4c6f", + "min_engine_version": [1, 21, 60], + "version": [1, 0, 0] + }, + "modules": [ + { + "description": "Behavior Pack Module", + "type": "data", + "uuid": "1ce9eab8-0d4a-4e40-a899-575791a1b40d", + "version": [1, 0, 0] + }, + { + "description": "Gametest Module", + "type": "script", + "language": "javascript", + "entry": "scripts/main.js", + "uuid": "839a937e-b4f9-4484-84a4-0db984822f25", + "version": [1, 0, 0] + } + ], + "dependencies": [ + { + "module_name": "@minecraft/server", + "version": "1.18.0-beta" + }, + { + "uuid": "bcf34368-ed0c-4cf7-938e-582cccf9950d", // Canopy RP + "version": [1, 0, 2] + }, + { + "uuid": "7f6b23df-a583-476b-b0e4-87457e65f7c0", // Canopy BP + "version": [1, 3, 8] + } + ] +} diff --git a/pack_icon.png b/pack_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..dfa91e7e32eca5986d20a1481d179160329e7001 GIT binary patch literal 65843 zcmdSAby!thzb-r%-7Vc90@5tHk&=+^lJ1ah7D_i#f}{vYH;ANkw;e;=1z&b1hGj4{Wr@83NmR9?wqqLHEj0D$>YPD%{`An}jCC`jNpur}Ty z@IO>%IbBx(K*xXlg#hUp!~lReZlj^&rlX`NXy)X=W@7GSYQg5^;0%ri0AVpNXA?6! z3pZ+03o9E(5!!>MHd<;Ma}io?9wiPX=NA^%HgY~L7V18)G|YVL%mmD7#YCxvy#&Dt z94y>SsJ$HQ9bE;zL}>q-R}j2@{F4%~_D0-P6;P&6AtW$;FDDQ$Rp~or8;=i;EQ;!RqSm=w{-@>gY=M?-`^lT+Li; zoZW1k9H}2?G%G7A-onAc(ajYc%lXe(XKN=nCs%8y|HIV({P{mE0G_Ur(m!kbw|jAL_-6@M zH)#*>G5$V~|8}&ihPSf?yPAcole>$Vg|r8_O}fXYaTa{xVqxOu{*oIf$8!!YK@N_84OMb7 zx3Tp8FGKk?xVQv)_yl?Q|I<)VZ_G{HO#WX7o0|z*I=MKQfRAkBU}9y#?(AqqOa0G5 z3chf%cX9z226xB(*DjQl1YbJ3x|ukdS-g}Ip#`6s&Bn%DkO#`kYsxRc%gW7bX~_!Z z;V@<8=MykxHHY$;SeSEiK%tf<|Gry0Ll$DH|I7nGlM?r^Is|=C}-me3eWp*3sJXt^Y@j#4fS7I zA!uUusO=)OW{+aFFsJ?dYn%V(JpM;3|9!uwwFNlo|3&!!THV#j(#_Mv#X`agJiGsa zda?hXw(n}<@qgd^|4f+w+SPyA{QpxO|G#bi@1rrZHgUAF06i!>?c?LHKRTL!35NZ@ z%IvSd{RgM?@8O`Qd%XO|%Yq;N@zWNL;M6Xl7Y-C^-35Rfl$TNx8eSQ@{+`X0nrROg zL(O;oPEJhppK<<7Xh}d+lPn<`l{s(YbDDNc4c+$~9PDP?@5)Nv2b)49#C76nC*ULF zfr#4p_%(*c#>Tt710mOdz@dyZ*O3hGo0i54L2N3Q%}jw7;ibY1NydB>#vB+N8e@*n zOQA8ue|@laR0F6Xhy*I)5FRNA4B_ztaS8_!ztW4BoZq+qerZeH2^_Rt;by;J{+p?AdytNgw z*%i8ZD~(_swr#fFKh&Mt+}7^Zlaq141Kb0&a3o_tC&`$g>LAgW^W~qu1Z*VxlE~Xq z?vLqyc$Gf&>*hp;J^Y#REUq_ii&&8TLX*XuEpL&sV^Ddr6>-$TTlU| zeJ3*33)tr-1;pdv9brlrnVl34Ap_&ntin-k$_UQSVM}oQpWLOf8FOY8K;406Zwmv; zYVvK^Ib;BJTA?sH{a34wkTch4=G&)E@Rf+|4UpQpVp<3yl#B_8hi%YNpe{4WZx08@ z=Rs1BwDpMSV8|CA(@H-gH_iCu=G?W-HJUMrogyP1?jL*%XOUeZtEVle? z@%0Rtt9Pg}V3Tz>EDSY??~Wo$O=Z!Q^zrpQJ3l|)y1e|#DYJ8P8ItSt1QBJ}+ zej>l^yLW6n`RN>7h@=n@hfB93$WID@v=^e#&;V?S8?kwZbOj{AohB?gm9T=z?IDqi zdG&7(_cz-c!yog^%*@ap*Ni6_v zGU@Og?2@I?u+|zESaWP#Pnmb0F)S20>cW31Z$nRjMnf2tTT+6aULdd%)otoGnkDkH z-a-HNJ2DkC@T|mm{n1E+`ub!jG`}t{y^jBsRP-!(E@if^y;oou6??dq3k(c&adyU8 zcbSDywHmm5yA2BA?P{iK7Xth!rsbVI^7Q1pzP_$i`p8=sc-cwy>VB^6PXB1uDm&Al%2c|srNvNgt_WV+ z1MN*BZG+2>9MA^uj1DuiW77bg69*zgDa?|rB~$I13c$Kx>9q*V#Pl^n9fd040Pyhe z;Zn4XLi=Co+5+x;99DZ`GFO~+$cTwyHtCcbizrpMH#aw`%*nKm3)5aK1qR+59{9{m zf%5-cX3$veaIwFj$Cmo8z~*gSk8)@7=XF;g;|0?l4Xgq}Z1Zgl3}2FH(0G_7ItBK! z7Mua{@}WHB4vN#sF*ZIPwEkQxDJ$^)>L@PocJ(SQ;54s4hK$eS^z6*W(9lqR*?Kx! zfk~Q?prgGV0J_S*{*D|`U~80W+eo)#nEUmMOCg0NsKAD!==g)z#q2W&$v#;V8?#hC z%`q69EhnNV4uWVr{4V@tLzRUS1I)0wt6_g`4ES&5X4@0_eVZp~CFS3W zz1EYpLp}EAXS3w!QMk29LRC`(^R(3R`v>M`W{@YLXJQXmqZENxgT`o^S-y?|XMcWN zfhHo@=(N;2*3}gZPapfxDc_!0-*sz*w9E^D@ugLc$-jR63Fu%+A6+>XLQ4c-T$n_O zE;p$6T+X2y`*T|xRlhlx=RwQG26&8Ud+dQ%3QYwz-*z{bCo81RN;`^WSjvKeAZsUA zTL*y;H(PfXOWFRTzKh&vBc83?&8FRvYs=+^pLLi8-dtV}meer{iyvd@$o2-3O;0Sj zDWFlRh`X!2?vQ-lkuHHhjf-$eiXyO7p|s|<)(jrGudmSc&CQ^)$eG6V!1IdFd`o_= zaN@NM4Kp>!X7%yqJH%8}vZC3A&$Y{k3_NBnx?LAf3y8;SyY?5R7bPHa5OEXv<6J|a z72!22&WFk*cT`24Nl6Hd8i*$W;(2W;#ExHzikhk22H>>ab7H`cTN6YPu@}5}@nYMq zqNUz#m}jPofq?;!f`THv+q4zSMXc--WlWyYUKhJC4Z_X&9z5*0s4y#Cx5bCY$bEpR zDx$xC>;CRWBHVuyMU`sslPz~FCBmUM+&mE=2T*fM1ff39*)9l#JCp{Zl8v9XA&Ci~ z(qJ)?yNyY3C~>hJXP5Ab(^9r5qE463;)6_L=k<+pI7T*ioZMR<&pZ$KH*eGBeX(D_j3NC$DN8saY z7=p!^Bgix+j$=(d`8g;9viux@U-wnnd#Ry9i6Zw~IbUDj70_7^mFYKNVT)eAMic+i z)@Gc%S*z0WOSbH@4Qcf(OF==w*xcO5mdoE!Q3qbVLXx1l^@9eHpjKqQN0l%~W{dx% zA`|FSm2bmZ)(?(%$q7Or?Q;V|2@3GJ8>ohB*9HteNA{-9RtOi^&?d{9e1D7B<2owB zR|mS0lO8fB#iYS?9c5)~H^Xe)<=0afuqji?Nhl^5+ZYL>HdJLPk{_+=&H1cV@4&i? zpSAUujpksFS`u2=Cd4m7?b=R25sX_fD45ECLe>IM@}Y3c+~*If0j9+t;)}7sRq-NT zAN}rjb8~~b-kr@5RkU9J={r1hE-ov>jF2+bJ9j;tl6T0~Gua24E0!uYuA!yR3KKhmLW-xA{TNpQRvGJprjl`tL#AxxotLz!mIdGQn7>ex9k zJT+FL$jXIXuNEaZe!i?>FD<9y3`w*ZGpKPFxb))Sy;A%LzT(;Z%^5R0%0N>1~01Eg3f+Mp10qV%~2r|fTk zic5x;?#~;PsA@#@zdW&E=+cX*4}1t94mBYUygf?$QKJ3PD$CoFC402@XVp=_>Hxb^ zIaM~&A)@@Y((cFj*s~W;Mo~9Y>u#!&dzPT|?Y`gjF{i@4kA#lxJ%5(L&K)Cf~Z!Jtc&${U|I^jt_bZVM3czCG%l zb2pqpMnV#2dXl+TZ@#6TrS-#3Z=#52Pp>^JgoKz_yh|)=u&G*m3 zK|n(*=t8IV7n_r32>)#jHd`M51Bp}=PVF>?PgTT(>_+xjSXk9&(`MUlf{QARUHb;%@Ha$;myR|S`_~xEVA>@J5TRMYCIShl5JEcP` zzI}&xPQw@Cy-$#(vc^d&D=9s?6I1oUV*JA%|_hCHFNC;|y; zKF?rF?ShdTS2h(I;;yl9mFtfn zQYqm|p0>7%<_^WEP2#m;!)n!BzdS9|>jaGUlo^yJ<3~3+IXQ#CoORcC>1Od(Xz6N1 z&dJFMOhMxb&=BJSyPVh#EozohQE47Pdq#p8Ji1MkJU|==K!J6>-b442WffmxLeA&- zYBrr6aJ@aGscmSn=r*bJM&72hp@HaId4n5~cg;`$!;oU#rrA{tY23l1a6fzy2cu(& zR+)T-QOh^K5rIu92>to)?CNLjDzTM8uLk%_E}Av@wy$7S18@~G0`Ua^J>uZV-Al>v z4ebMY3r;2c1Zx6hRwKo*u&_e#^p=t;8aL8^f@yWP+4Ls9rrGf%rpK}8blZ6q8JPMCZ>%0l&VpDx%hNbMSCOnxOoB?jO`!2xNAV4~j% zxR8{t%BE-x^@TCk-IAjdvH*x&51u<^A$4{$p~hgIt-(S_mzkN#fzhdcv0Wf@oZf#t zY`z$*bMYlQI+~gQZJqt=^4r_|R3mvTfwlOlED_&RMF#bg?@6(!n9CH$b|w@VjqkAY zBGC~5T6KWB1_lQdk%_;0=T10Llzd#26l#;cwYMiND=TZ#8H$HVVDYD^Uv=MT2GB^U{8 z`wVy}qP@yFE=cGkb8z2+aVAOr>B&}J+(_x8_@;HOnBrn8pjm#cVpbpP%1{94ib4|z916&9ulf;d zvETFg5&?bl`LC(^ZVNmimtciPQ}>GTUSw{(*?C1WSTc9sp zBj23*$ZzjJZV^(7+>Gz)(5=f=a)MqP*-}>^9BRsMlemy46EFoL&zns*H8n-WiJa?r zfIfe1zv-a->cg3q!uT+UVw>05XI-cJ;zPeVzF)j$j@tJ>FQuahEwn0(3st8N5n=0DCPGyVCDDIYBV&~JLeumNy2FcTI#{*HRi>-qLSr)><2e8~4Dl={~y4f*)NS|;wJlNYSLlJgq(l8C? zs{Dc9u;^U&dDh$|9d!bV86pW;U0tE@PGQBl!sGg)v7 z<}YvN92%YiQt1n$-zV*n!nRpD?Y}5sygep8u?3ta9cjUjjh}sI1=x zY27P0t)V6f!1!tKEj!gSAihx=0((6Ik>dmXj_5{eSoX&EKB$sZo+^l!{G6|`QU(w2 z-u+6u?OM~`)|PpEb~eHq`s*|x)~5qHU|kp^p-!DW^651JL>^}XO8@?4e5Db$oU#yS zZtlvKkxY@T!g;I^uc+^1#a|I{R$`{Eu3ojWVzTnninp~<*8U2V?HQw&{s$`8jQ^QoeW=ru29AZjL;gwl+X6|_U_xq z={tW9jr2HIE^mdoW=gtN`lbTXbCy?7`FekXalHc5DfVl@)aeVjzxDdlCa3mMEnXug*29uBZl<+}VjF_01(P_5& zsVi7dr}Hhisn0`)!HPq9IBffed>u!w)|#rqb#g})@4VGsU(fSVKOWKBqqyJmHA|5M zFcuhw3jjlr+!7}S4#%bo58IY*aLbJXpTB$>|0$tt+Yv}ob%^QLXf>_8vBKmedvK81A^)j8fz0??E= z3b~<4%1aCtVotF~++nM)FWhzL`sYubPc1DJM_zt+`Dz~@TqCaX`L-`P%$VY8G!Df!WQVw%JYp2eZ0jQC)!2Op(;?+$+7=To?+^W(g z9Z75!P}tc5!!a1ySHRS6`2IIh8}-G4r!gK6r5Klb*GwP-@NyEmHmR#D=MvPkeTKyI%u+B!U2&m8Riz3@?B_xAxR z8dkKfLAQQ{$3kE*3JMB3eVS^Z_HFqsIxT43{h)G#g>d?ip6Eg0>nljx9uWf&p9W&W z&g~F$CYEj67-q-(pwS5~CH#JKJTPP8sCQgQZ#^D(K1}A+%=y2;NXoKRaXb7oHM;eu z!8ryjCT@Nh;dlmLH}L!p&8WJWN@BYSFm`!Db5tpc%?+umfG%_vLK2RIsa2ieSG$s= zJApok0rz)QroAU~xY8(w=suZIb@xVclTa}6$}wR3*h}uJ=rf$o)1zyZ`Q$la)DZ|l zT%YH$X!MQp-eH0vlZFoga9L&oaL73TRLCWL{^<#V9Kb9vqx6C?jv_@ZQiU-XM90lc zO=(>_G5H9}n~w*!Ks|h4#&6l;n3y1f+frdgSc*cEV*%fJK2SW9;mRv|U8lUl+S^Kq z2sCZsyjH`($&D?&+!rDe*05yVsW>xNfnUgdbxIxN5MpwB`t0G|!_|EpC(l=^A|1H? z*!ob3W}}#4b_0i_k30l=T?2MhWX8fbyEU$$fiii602<{cm}Yg&uh)LQawW?@bp?0_ zR(^65@dEKSpFk0a18bR;vEM{BlCA0@x{z+)20?;5S9UW!7t@Rz91XYnpJgkCbefbk zHO*npuw20;pMN2Ft=dzU2HTtJ=B)62DtaFgx9Z^JMfMvo>fjg%gY{m5hStf|6AfS6d@~@=l;BaJBZVLm@)EofPNgF zb|3OFgsB#~{mR(>%n4>9X-7<-(RJO(g<;r!Yws>M2OkgzXj>Y*+hha z@&y5n`SlT(@_p0I5PTwP6cZc6T{!Ud{;26Fk=>u@V!;O)$Z2Ro*86fTnqj*)6X}tS zD)AO)Fi2Eb7-JF|ga3-3rp0oY)CWX+QG0u4(g`QEGP3B`Q02FYfLmh_`FjCI_+OAU zGhQz@?SVO`F;x(IthOGf1%cBcOuqT{SY73(c&N2?-VQr~*kCdvKPxO#$bb_m>pb38 z`aP`ml;qZ|S1md>9M=p1VSYmOreYx5B$L_>f_fBOAD}*>(fuw~&=A*8@dL_^33;^9 z8ekB3b9PyA@PHDxa7PW;brY&&u0Z9_u2l*?qEtCH&9?=L0R$sp2Wj3S)leo@@Xwbu z(Cj1=6B9vq>7*BbD*JroEI6JW@B&@Wc0L&T9RL?LSOvahtmPY99`>WwSkRAktsdQi zb0q3FIA)%Mm`OfVY4Ya!+HzQ?U28*^H894SF;$+pYP3}F!vCPBSM12iYuJSS1yVbu zSw)%Q*UuB=27zJfX!{Y)55-VCGI2iwD5atoYMP5e;Ir4D>op3a3Ov#G+AiA6eV5bF zMn%ASYNYY!HVTZ9ecnc%BI+?W#(Xc)sVmK{n}a|#zJ)-ly*w6fS{>x5b#=up{-o=HhKUS9yqcgLsrk$KK zQ;G?390iJlaWIFB-(H*;*V!v}cJTGG*^>tH8u>i$byCjU2J@3dd`0ps17R7QLuWd% z5*|D;s)$=@1a5q!Z)c9D)S;WzzDIXd_kec5&9gpb^D#nY+VQO8A6(eMZAFB@QCCr( z@Q|1!6Kl5108`o^TT^rvcyZMKFLa!O3Jra5VslkpKDiQWnFcVX51z*dA7T*ur9jitz8!pSGV3KW<0)+&(+o z$V02JAstxf0)dU39iRJKbhbXj!~N~`*-rlpY>^}coOH*{Vnt-h zV$FmCo4!{T9LY*_<4X}2fxll|E+ez|(i}lB=-$0C>oC$q498JXzk-h0!kE%K?Y=gU_&^2e1!Lk}-em=J*pe$b9W zfi)b!80nDGz4gZ(WvEFGn3IA{!5;2W;Y6dhfEMr77`|6?oI5cSit^1;lPYWkWqGo{ zX$;)9eUHA6-U}JM88ac4MeXbfSQ%m_;R2l10-q|quvl9j+>wMk;<19bkQO($yy?E+ zy8KXCJ8toLNwD;&RsV3(>7Ho6ZPgJtH;K`+8-=RJ+-cd7#q^B-(;~o?B~LJF@u|BC zkMW4uz+?4cc0n_vH=CiN=?n z8U9@_`yj;7bG?<_htk?Fv}Lx@nd~8@hF^XkW7O#xPNj!5_!U=sPZn_OJ<%8G1HPV5 z+a0wW1Q6-(`(lWjDFoVCEZ3#;TFG-;ob-zl=Kqz0pR``Ij0&#=##H#pt;T8 zwsP9D(4}{N19p_oK!oWFi8x!mL*esF{^a(z%26S8ak`@mZ+a;jAJH=qb#K!Yw)AHh zmYv)~PDsnI3vV~nJ&WWvj=>JRrQ?6tJ;4pFs~+IMth^(?*OTGFe-gNnT-x+ya`ih* z&`E<73B3e(il)*Lmh?;3tB^O1Bu8$GlSSrPXng1Bj8V|@)-!nfz)z<3&c*!3aV%C(B+y8KCz$f|@$EXbU zK>O}pF$-+RRds!D6Z;5W;;IaSPvJv$ozS7seRp}K91xm)I}^v*>d*duoL?>T$$pJ? zy!?ct$8K$ht}(hzdZ;49J2$}?M0CQ>+JD1GbYP3L(f7hJY0yG~uE_FLiZxvO3<}Ls z@+uPW8w{Mw=+p{;Uj&YeF3(&sdA7*M&>$(U2(UXs%HDcudR<&n&gJxVB{Z_P^kgdX z<>D9Aj+0@_>0z*{=UP?oBXHR=tU`IXUcp|e4)hmG3H8lT$aMP>S95q`@kPn3d1QHy zd)#gPEcJ3-HZw4}F0p+?DZ*#qd*SZA=6BQw`wpqN#TZAaqpmKj+sltjJrxf(XlvZw zZuE0F3Quj}-fvUtb4!3Z*~2~9S?m?h5Ui6+wnA8e60r6=|h!Q*uN2j+m5F%b&9Wn4x^tBE7->~Bp_ycA(Dtc`J{%&BO z?rCo+760*xsm8NUHXO&&(TdSD@55In!0HJ*aCgaBgRE)Fh9KQPp_Gcls|A0b{a*O_ z6L`-KfqRSu>8KHV(ZHkGSz>FVR|v$)WtqZX@X6*Aivy}xjYVgi15<6v}4I+20!vnsBnOE=HF>YxcfID{wEu_k2~Z zr$(ek6wv?5T~%Kt+hM&ck09wXt>zYrFIFadwkUEOj9tpCzPHxHEg=ELL{10*i}s~N z?B$*88!p~?AM9U=OkH#D&tuPff&zKtBTWXosK~Mv8C*efMbj~np<6<$_4uc$<>j1| z(arojx-OEE0Q%tzDm=+nwAWAoWHkX*TV6VzXw4DGh(apeOd}m13nIX#7}z09%JTXh zF$4yp?Y)L2qYKWRx^h?%VMD?}8MOemBnsNBFvCRR<>_c!gj4ImBqO|6f8*3k{EV^t zRyet(mR4NO=C;{^gkynL<{QCVlIEGywG?A(6!Z*6ewyzClW?pg#6K)7z138nu{JIu z@!(Fp(0O&O0vr}S+@l4Y=CbGIl~Ig)DGKcC2@qOF9m0Vni{h(Sv>%5j-eHUKyKd*F zrYzlV@X3NTzA1@KY-TXU%IwUXnOXw+WfzsX+6u&DWP7EvU=cpSO?W`kQfYg!1N;oBM3 zDQ!^T^{;1#C+vRM{w@AblH+Ww?s*u+in*Yx@63*N%~Yecn}0vq=CPX|n`z$QIZ|Z6 zUubZmLZKOXNZx2Zo9mRNeCJ-aPjz`ba0QlX$X`%_D-^~%a>VPOzDxD-c%~lOhBH+l zz)ld=Jru*YsAB*cmi6XHW|0)F#Jy3R?q-BFLg$Mc=gaM9zxg~LsIVmQ)aCN*KeYDH zK3G(<(9>xeU)^A6Y_K}FNyjHlmf8y@Dr~S~Q`=$QMkrPHE3hRRV5vUfzIb{@%(V`8 z9#VaIXtxy8w%7#mhrd%YG}6R>mmMO75@eE2Ts1PzoB=j5uE3|sNibXWpJ+=_yOx&h za}BHj)aLeBPohTPDihSMUm#J!0XQUBRbgG&HJ{sOpi4#*Oj`jS^qqlVj@fEP}yuSAmZZ<(&5Dw?y7WQcJ!ama94WK zlqFt}(F-rcM}rLiaN3Cdf(}8ZsQ0bDcVHz&!!mY!DG_M`emM+ad#|LLoU(nq z+YMC$DJpqwZEd%wlgd^gq9K1$@X;|6KD;Paw?f8MBC;fkJ}2{+SY(hkWdzld`xC)v zj-JWH@GTRJ&)>#BZUHo;kuon$GXh#ME3QxuNdvk%(IeX5(gdFbdOUm!WhT+NJT5kk z3d`+N@crSFfbp){80GzwFgTFhF_XvG*&Z7~BP{j}{YnjYVJ}l$uD5VR?_I7EJN4|O z0BcF!1|HbPqH^h@*?z3ON5Sfik%qnsj9-QOb=LG~ljrDwDCTmgIDA^58#Ao1JqQ_y z)0JoHZ#PV7GVMmQCGMH}i*lvF-U9WTRN`}YcXR7PLPGkZ_U_6#VDxOP77cRtnUyn3 zn5Xj3Sn`(gId$qFO=*}4bnvHWE754&eup_t%oj=-DRgfr7MtoyOMXn>hzD(z(VxmU zf$FJ@4??N}D7088US{8(;<;l{Qlk(J#3+eytdy197&3~i*r9ZtqWtzD@U6-7GM}-u zpTB{V2SX} zO(VWpRV98zj+)-A68^~HGupq;bb#AdeCsHBOW@ZwrADGqEeA5xV@#XyHv51KQT#F$Hc$@LAx+YujQavOfufJ z$F}J%2t2+wuCvvAtY7p5Gqv;yirH`OJONpFuhm*D^OUh>Bpl%2bJBgNw!-=yd4MI$ zBoySjM#aX)cEDo`$AhIm#bXzb*SWWJG&r%DQpM&fxYRW}GIC%FhB|J81&pf@GvxnF zCF%4MeRpsE?D~CX_#ah*VZ1M>zCrJ8JJgJE4sAJD5YA9n3+U6E%-a*(5wlkGLzycA zRvh(`Qkn4~ESDF*MTw1i$0I_&5=t+!n4WC$+EXn>88pJY7$f5gd|{L3s|%BqM#V2x zR9i|+jMZ30lhU|8R{8yOSp>-#<~6fF>t>9|nm}q?H5ewxr-T-du>7x%*GH<3Ze^qd zDDn}5Ciqk&_uslNbT$`UVNg4P&7x3w($MUOcaLPeA`P@hnDwvL?SbE>(5YwJjbXC^ zTd$9g4-Q(0<&QtbdhNl;a6d#bjcwOI*9*|F58EMxhkRmGhi_uIFcIbpx!2(H!P|q$ zs6s)-9@8-47AD`8czf|nDVWFuN3WM1$A)9A2x(xmvUR|$cIAb zhEJbcQcmDvXh!R2<9*U3Zn;^F-c@r;###42}O}{K^k0$?TGu9iIKFDR4oB_Cw#VcTJrc z&hEI+|J*Ye$lrQ?XW5KEgsDlrFbT%(aCRhTkKXH8JY|G_64+pVCZY*PxudX?=JI@~ zfO%MVT|EPfo2Vke&D}jnt=M6)x$$n5>cMOKe9mbUWNQ^XvYxwSWn^f<+Gz}>YN$$$ zl*_nksVz&*2N5=?r?;gm_?@Wi(+s{sr zL`c=j+>xJQozGSu=dX(r^wxGxq}Bp|(u+HMP?F%x8krOcxwe$tK8gJZ`ARAMon`ji zEa~OW-e(CNiwkT!PXZ4?pe52ogp=u}a2et5%Ob}*eEG=`g{7Tb7Ytw3O80A3A z-Ja8^f!|U0)e9^E`tI168MlR_us$t}h?!EFU}4NFA*)_oq$* z?xe}$pA&BH{8Gyn3p;pGu`w{HGhg*qfDE$BM=lk}vpnm%A~L|)-rjx*A{0Ki!tycw zKDVOzr+PpW8QT;~z5q70T4AOPjIZfe2$_slqS9oS1TsZ%QBhHUMd01e`eP3H2JBff z65!S1KjGmL*Z)56eW;Q~PpZ`RqkXkL)4GF}m#8=;`4x047iGYbM2O+sltnB8v53;G zM=dAmlXdm*8(MrK5+31KHmw}xuS~doI(k=0e4pmvta^QqCiA3Rt~|D2>ON&eLGj4H zFx%OpKHp@(8SmWx!%P_@QZ$!OYw%RBva~*(Hy5phMLA}rWL!~jNof+K+DS1dcRcn! zmM(kvOdA$F^f!(N*{Q_#YA4?}c^+U{)yzhE#&M|A!`y@8YYNLMk;6A`MR6?I>yRh( z>=so)XOz*kqySCi`B(p1~&$Mr( zPUDH1fEhwYONM}FMljWsIwXmgbz4$T>a#dC(5We`O*&gbLH5g<*izU|@eAnxI` zP)rGYwRCfC&aSm@hXpvn65mKfI%W@!UuX8E7gGTRd%Qk))JGSmXb^CQtLuVc*5LIRXP@^3!HJeb=x4QGuvczfbtu&`l%sJ6 z9p^_PjKmi7lB(8Ht`hPZx?Se}5hq1c;&taIZt1Z}Hku#ACOKtq&kHNtz~lg=*+m8% z_%5M?WNiQALF0QaP9^U2e)9}}y0=Bc#V9q_w;1g%K#diNRU&kg2S+A2ezZzSzq+>T zo-{NF?2oO2w0(-ZK3P$`5s-2Yq7RHuGkt0iz1zK^IX!-uUgWxDIi! zunj7|n)HT)NC*=kGFIA|5|17%MXc-+OG?RVV81wJKHQz(33FCI<3?(Hy7}O~bYgS- zD<&iH*HrS98HydLQO5kcFb~lftMdauJU+6E=G%k+dreI#5(Dy&%D0)gR+NG#x%ks|@O#kbD>&+B z06$9Q^@!7JP`G9w&**MEE&wXb$(cY7zCB<@56wc9^he*^V(ccPaC}XLO*-YntQZ{o4h8LL|fm$~OnDeaUEY(!ZxI#pPRK$?ppz8__jS-X^P0 zAZdwFgon^#swO_K|AR>tAvHEVEfa7QWlSFka^F4^fdoe`^iUqh{MFxvS1ikSQO&ZY^5kMjx8j^vAv}=&^y;lvn%FmQ-|v!# zI+X%_eoR0|dh8d<@1VhK%6hEiM~EmnR4+=|f~3yX7o)4=-&u)AV(Ca?=}3<$*O)6Loag$p8})y&vnTt$&(un{ zgTv30A?l*XL$yvPe5`7yKn3)zZ)iw;x>YCj^(sS_NonXu{d=1c_;5@-C#yCK)R>Q}v2uk=@rCe@>UJ%)K_YaGNcH@PFI{sMDGotVLrP^2 zc|OE~;~Ytp-L7;(RYEOP!8l-+P7NW>E*PlnzJdPKKBJ*?VflloFqe@&u?iq&kt_s- zd5Xq3toq`NzmN-E{WGOu8K{e|n$-2)OBeW!AGtn$`%`VNEPdy*Epl5uNJaGb_Xk^@ zQ5A+w({c=n(!EabAvSY9M9+dVxLHHQ0O%$JAt?(@9{czXqlAtwLGI{!rviLEAdVri zKaFsN^pj62OZ|M%cJ4q~0k28FiFsnu9VMH}Ap;9Q9eWjZUA{JfQWY!BiMg9W+~IoT zX-dx*5l$&7<@wYvi>Qx}XyBzfTaxTa4s%|zHKW3oYF90a$16;e&XK|@Z!a>8Nhy7L zM;kfj9x2G1n$PMwLdI1Zi(6CrxQLph`gLz3j0x+yvdi$iTF~Ktsx8eqHnDyKDNT~v z+NmeQHBZ{_m6-gSXp011f@uk(Gp+CW&KAg52HE(8RKB}aD#Dc7EKPPU9DIT#di)W8 z5;BN?{FzxXg&Gi|M1NF>z(4aYtRN4)V~}DA=^JB`1o7dItm{X=x2Wr5_hkx_WHsW% zXWRx6kcfm0@{$e2yrokb@S;cY%WDZLYtcnw$8QPln>U><2luTwb^AWC;x%~84Tfw+ zT>4jvY2(vogqA|2=}j>zEG0e%{RlY=Ua=8`6wcNr_S18vDcXaiNw8|>E2*QQS+h8i z(1+iEz}f}FsDNjgFEb|>7h`29y@Np#Ghe!VKEX@qc8RqcN9~yGC%q@?Hcxf)0zTTV zDWz&%cGG*ky0*}hVf8-R#yMi26z*}s_X>Ex+RY$;Ymy$mgKHJRauBClr9U1r*6(FwMc`#Cq#LRg-21!tI*@o1JKHk`Pbd%CiuJAiWh)r}J_&M-Htv zL&3%56k*}eIdF8bVI-6Fp2j5 zIRU0wY7l#CiMA%yBom&=#gy>gD*rj&YS)=^N!kSG#gY^`e97O- z2uqEMkNT4TdBRcGa3*1ReE{TeSzM7R*GL~1yQ5mL9+6!wx*5#Yk9?qX(mjg!^oQho zFh<2Y{a3vu(kkG~WIBv*!2>+667dQ!C+ayNkvc`OQadItLXcA>X$0z7_##EpaP5ib z-zxbUi+^YQ#QGjqzP%{;61CQJUcd%t+cT4aMNG}6o`-uADRL~F0lM&!v_ut3+I`t2 zkGzE0O83`7cn5o5NucO*nuUCnNk0)9hw$^t{$M)=D~*+vmBVtwCfaf9+VWt# zI^-FGSBm6}DdbS*)&HKm{tzM=PqUddQ9zuTWfAR5u`As=(Whd2hvHhB zGZwNlZN-PTF*cuVK16*h&jW3(r?FHzYi-u(ugJR&(QR3k zcAkkXg&Av-3vspa%BQqOXp_B3E4g9)Y=dHhyTjXcBtkq|I8LGf<^eR6Xmq6^uT|is z^MY4y`8^b|Oq_fO1jok+p9FPsHXVr<{K1!PI{rkF+@bUOH$UHJnYUvvtM|1N+w!qo zV{MIwtzzq8gsX@+qhu2;tCjK}Ch%oRnzz-0OFF6ezDvf;&^?kOx?vdC#)Y>9bMmGsDy( zrTCHVslBH|iwmlM)w{f0qgzB&dA+Ll#2AT*M9Pjc^9Ofp()f>~t2aC!#S8KShDlfT z?~n`2Ht|0Uc>|DTNSw`3&kJNzmnnzHWte!ZK4&J9lIx#ZYU*&Vq%Nzw+46^6+GY|3 z3jx!E-Ypwtf9X z6<;K*4v-FGsEd@K?u<8o%yg>jae!hgi_Bx6sL`d}40<(=e6gZ4Ecv3jta?!J{o9w= z{&|d|i@-kr<(SRu_wxtU9yAPlOIjM1i-&N?>jM&vK-aW^qC75k$awayl(uk)7k^|W zCEku?w`j@#;^`Z_v8Y3DN7*?Pe6#JT3ighliZtldY{o&yy^lFZC{J$b3 zc`x}xp_!3F$c^r5UFABLe_2Ur%C>8(e6FSA4gP65y}0L}=AG@h>Yo3Oje07wyFDd} zPC;xlb8nA~8)ZulIH#EF)OI#r9$-$5jv1iGPF3i)vQM7_IZ3`Hmb=|9VLtb_j@Z!} zu`Hi#)oH;YAv4N6D%ifyDF;9Cr) zSG=84Mzs9l&OMV0kAqYVs0Jfu1N(4$hVK$O6CMI8iew4Is?*=XxX?ldsV+dVYa{Y_ zltuebLT?V!sDBjD6CJG#(&xB}(E>o(#31&SJ+ga@;Kgkr8re1pms zes`|GNjKLB=5lL&%b;CMEie?f|JTs9)?}3riA=Gjt(>ej8=9C~iWNz}cfCt({G9(Y)YUy2WPP>#`T^}(GySj!-Pf$Oq-lk7W) zA!;fdp!f0wF8j1X0+*PY-6(lBYIL>EOj%N!`|>yEyTTsdD4XM+qav01#)%WAgP8Sy zFczMF#?p<|XwVh<(01AWaK6)aEiS1B#9L7Pyt3yJMKE~39x}iyZSl=*vu}3leW{9a zo&9P37&B9DH8b6QiXk>vFA7k{+SPmgY*E} z63+?{W@67bPDeFrIbHmk1U-6tU&t-AHL#^F|EYQP^_yuj7#{kGMWX6;ua+y<=txY= zx##-A##+N9ot?JItkw&z8V)=|W34h%ZL3T<9?xjh=EO6O=3Rzbc9lx+k{m}}yODM5 z`0PMq_aV)$9%dF$n>J3jlX&3v?B?!>PG``l(4=DOBxu`79NT&dh{o2<=V~J%=$R-S zv2Gq^mm2Ua`HrjBjOPG+XL2G9<$JVC_sWk1RKQ2sqr!7z$Wz^R&|t8gw#R!R^^;49 z%DjTA&zCGJkGE&q7-#m0go}uSDI^~80b8G8;2*mw5>;k|lo56{`gl%6cc>9WJ)!|L z()qIDV=Lg)o5z%((mGjr9GjLOFc-wJJSR(G~_piRW$XBwuHh;OwB}3}yuGZThrw$uc>u!*OygYWCJl66$AfB68`h&=iTzK>&A2 z(TeV4(M5lzCSnh&P8C*PjcmqqM%}#JfvKRFuu?pq#HGkHVUa{H<@)?v1 z^Zm>H)*YAzBkY|^N6He4<{+kZaNhK)1%Km3u=;B?ZOjEWJ~G8&ZRk`%C^6eSd+Acl z&T@-yzdN(8b0DaGF`%XMztFTS=O-cIPQjF{Rir0U?oNvvW<%R;zw6T=UKpbK7r)N+ z@2GSgqRx+p^hUO~Nut&G(4@7}-8W71R$fs?d=T1Hf5|btzj!5#hXM(w#&#E*v_Z(A2bEi+dOV%KtFy+(K=3VYnA zZpakjM}P`(U~LV}q=PheYAEj+-a)d}@gb-{aw{tzboTe>_;K=ij z)YAN3p{ZRcZZ3C3Kh`G6w$^B} z#){NATNh=JYeE7M+_!-9u1q#;tUFHah_f#HSQToHao2#t)kctG{AERZn^w1}bv$|P4J70E zy9?!aUfwq{fg%zArF|iEOuRt!L%;ANC>~q>ofn8dHA=ZV%kK=-Ml)~p2NW6k?sGp2 zMQ3Jmy0nh?eQ5B@urI$GuiagILw52&jg@Qtg$6L?GY&Qk|~~ zzT!&v)JZ(cSG4H(s*>A>h*uHq4}m{gXp(-5g!l#c5hWLypbsKUPZL#ky=0>c#L*|+ z6-4ccB=rdez@@j93aE`+OFPEPU`pk-EFa1GtfV5xNr)eW)Nm&6S4ByFA%Q89BYraR z5^_If9*U0A96Q~<|227UzoKxaoKaz&dpQ|!ctNqMmL&u(V2caR)lFLBrEbGiz z+vSm7W-0-shb5Q@LRJM5P3ffCf1gsf>10x{Ewqgtz3INH9gaBWGdmr!Vn-Qv@Jtry zVPp|I-P*q*AM!Jq+J!7j7F++PEWxl^hciiyBU?MI?QjMcQDTm-*JU9<8gL^1b`wLi zkmgtqO0}xqDu|)fF}qFGsM%3M{9X<5of=xixPhwru5!BJ{QB4OmujcX>Xx$ie*4dH z$E9b&|5%0~ycOe3hj+V~%oJsn`c>D2qHP)pK$LlibqsxO3-TzED)8nceBgt@mTEm_ zx=z2E7Xy>z5_DBCfXDWV|IGrE3AYx4L)n?qhX*FeLr!u;eDYoU8{`9PLYhziSyq~K zTt!30!sH)KrWFUmo2hv_GzD?`28$I1$Mt5CPtSF{BAeK#meF%Y-R8KNXqTK-2`pIK zEXrG^?j)bz6rlQ(h;$Zh((9Qv6zc@>sdc~$r)<|yk0|(Fn-69MHjiu)5_Hyxjkxw; z|KS_Rc56~Tes%8m@YK@>*}{c$p-SHD+W?oi&4gnYsn{s}muRI-h@q6J#W#zC3UVVL|MRO+#nUhr@jgk4ym?fenqVW2&N@N zrVwwk(1s*>=+~^|-`{kD04!U{eR3MC`6#*>1*b(hLyUyG92oqQtMOU*{2{TtXI%e> z9Md7Ks;I+QRB38rur7vlCoBl&QFR+x+mM1$_Rl*bvr}XBH=$r}9l@$M-li+bXQl(g zDzz9dVuPFS)`YZ}3-swEO_-9M^8V*brh|AYhM^NSCPUzT5`1%CQ4!I6#1V~(CJB2SvBCZX_zKVq=D{8UF-mMLLppovX&I_L(%Jrk6JDTy(LZ~HKi)EJ*pg<*qVyEPP(TR;lDe9|W6b`p^h zWlZTIk2H-R6%IG2nme&V{hl}*^4PzT;LI|u^K7TAOs{$xg9W+MVJ9+@0!B6BOkUkB zRSjV?VJxYk@v)_#6WKx|0Ml{+-ahT=n#Hveg%M{KAEkZFLLDka%||@PW5F38EZoB6 znChr}9yOM7aM>!ecQaH@kfM{jB(!Y>*hDjj=|3%*n{ZFPlK z6W7SmYjH8s*f_XwHo_%#AP1JBA`C(TG=wwb3j28DCk1>}^OxZJ-cej~{}1 zzvC`JZ145TD7ZH8jcIS5V_pmbi&jZ;ChL9d3lHrj-uU7hvB zjXqU8VyTdLDJ`wr+NP@KwsxUv6*1*oSqE1m@eA-j^djwXL7}xhU7O+!B6UV$Mq`Ft zDjFJQI`9uWr9{vI@>gZ(?=SAy38H|q?$3x5WmU=+8|)Sq*la*(cKHUaF;$h$LFKkO zgvdKIyP}nF!1;IYw*+|CS@`YvSkZrw#O)_?7dad8(N*%cU9)!7J=PN|3&VjpDQSL+ zrF?1G>2?ew@h9cGKL8eb-9ewryKb#Kg#0Ppqi*!`lNv_~4JK{JC+*cI*DT6QS%{p*`k&SDGk~OxZ z@oGF2^+_GI%xH5J)*21D&fpRc)seUVO#yZ(6m4czrPfcN!KoYvpDFzCsSw+84(47D z|0w5&kZ zZjM`sreSBsz4rb**?-e?1NzJ6)4$46k15c=Rbv(EMYMS!pF|D59qUs0-6}{qZ$*J5 z*+Ogyr}Im72kHi8=A#ZA2x*6^_~ABEGPeXm3IYy@I_@?M8;_dFM%G;f@hDOo{jQvI z@SZGA3MZzw7IV<97^V zzvr|SEB`2R7=%z7ZW;IjCr>s94Fe+X2b`v$MRc|h$>9MXD_Bs5b#gM-XRENDY0YJ% zGptLlR{<|}E}Vta8LzWG5LI3oHq9h_B?0lixh_4;S&;CDVP<}CLOp6!g(I+{t|4WkO>gk@QJ>FD)r%`U?U1<8GDWYKdI4ZF)u+%=0T6*o8BMiNwfxD$Dm ziO$s5+27TYc@7@CPH5tu*wjC283?^p+SY%*fDy6e+tBJn{%* zry_wj`EKi|ufNmMjAI3K?i=w*8u7VD($O2I$&b^J=X$7W_DjZZl}|aT0VScT81>08 z`$C|qdr&6rjsG_~-f{jSi~)9WxbY&Qpqo0Zq<>>Rp#ELk%yr6^qUepmI@pw?Y}yt% z061yUnJ|q$(>^1oRD{t!{buGc&d&y#!l#O`EI2fE*v3X+Y1wWaX<=)o4JR>??3K%) z{Kiq){B*hOvdW_q%fC!eOsQQ&{lOFaF!evu#@qk#>B-V1hYbGVpv1p5o>~=?`$_~` zrGOtt;7VKt-Y)``vB~~jP6K8^QMIMyM$rm4<~gOHK&y*h`6`;4tF(t$Pr}Uf7qD?Z z@t}_vIxT$tI;&JY8(+7Fsp6UToOc1;Fyw~`0R%SF*sgOFR-hdI$W6Gd(V=u7#sY}- zK~rN#tmlRG$1Ld?z9@4yJCd(vNkBQ_e>X=L>v>-4I6lj9yTKC;<1+Qcos|1xJ7B&A&#`s+)FStq7*hC%=y-km)zrLdJRH2R^@FcKr2oXx#sxOOn9qf0ZIhr*6VK5NE#U28b-+cYl>{+vY4bSP;v zOgI%@(S3ytMyC(f5F1KpxkllH+~_-18px$Jz1<|;)hwjgp^&UaYb?dfd4TS-1Jb6x z4+1an!<{(r`UYR|YV`S_!-F}ddSef5NFJnNwo6mR$f`@kM_NAlI$3yfaVBM`iblF~ z&mVACYx?KLbSD};D0o{`EpPcRxyvXNx&@h7GHYQ&DRfp!Mv?2ZM9lz|ewp=z1Mx@% z45Pm%JV|@T&ZD^Y-@v(UxHIpLho#3htxPdh<6 zd{jSVMYZv)tvjWD^*V<=U=viXh{ec zRcCHy22u8v)az{zZp-hE>?U8em+Y#`pC_F~5Zh1o8@Va7>r?>6vxN7Ht}*+I^ksYc z-NdZ{@@_L#dM6`Be38owrQ>EhlGwk+IoBt&z|ciYxLy+Dc?%44{l6_(6y#RWuim7G zv-IV&qS)(L=@3=;>`BlJn{>FY31CQHJnYdb1KN-?=p19OHe?y89z|W5PzlA&K)R2J z?HI$AJsS^fj?+6_oCFDi{mGL1gQX=cbj@7HBsQ3R6XDYkaX)L35OOl2^`e~xZof%0 zQOpPSo`{daeFtft!R)cj(P=RCi{V6@*(o=YLpJTb6b!TzQsOpWL~Fq_>c@4CVZ+hV zXAGaIE2J;P1py%pPn9PxR(+a4IaRw5{U2r@>zT23$XzN43?M!AQzW1EpnWL&LWB1@ zrcyTSoBKPP+g*Fzz=zGZVya}|v`M-mjzMI%SGhp2jJJ!2$9HC=YOGRKen8fLC8iQ9 zlQAgH5{TfI(2bEP_6uEWWk)!5O+`S}f9O8>s4A(E2WvyVOf+W+7cJokHVAa`7qHDk z8Bjv9MGtX(^Ok?Es1{(Zs+$%}w&gHL%4Xo4>%|-=6QnfQ1vV*VQz#Hd8mrMU7%z4t zfQcS6`!<%A+C}sFH7h%jvfH_`f47s+QQtv z+Ez`NfL=p}WOaacDt?q|MNhJdhK-WA+p#QG2N_v5+Xkoy0^LNShC@PeT0UL@BLKOmdif-$kYqKWJPeTt0X7AfEOHp%x|Q;R z#DVh6iB&LJhQ2g7zXdb=3!22sEKAhe2ZO`9iyxvjv(d}QI^siZxSnbA$6s*CQD@$5 z+}REvclp5DzAuV(J+1h}k^L{8$Kg5BniJgIvSTW7*suP=tc*O730@HWb0CD<*xZ;G zXn;`dZ-D(3Xu(4I{1Q)&eRA~|cIY+E8HTzGj>R;BH%rz|9Pu;-Rr;f26sQM3<{l(3 z9_{a*(UYKXZ7F9hJ`_*!Yy5yiTm8(3PjmK=z{6q_deB~#h`kh6>@N6dl+(nf(qrnK z@m2aL@m24N6Szv68VCuv%fIgL9dksR*TV`zk_DK74>1f8?qt&>Vv7$v_x0?X;VR5O zDFprn zG)59YrI`5-WO^QsmyNWwz=^3OF*^b^cJVQHD9)}X`1%z^*C`~HEhL3eueShvf@HAk zA2*%DOocwmAS9#VJOyu}(o^z5R=GfZaEFS3bR^Ro;a&Wih8i%ryi;IO$TQEzL^AlF zAq1(uYglbo10EqHORD&{1o11m!ngYRV7FU^Fqe%e5Y;BwXd_buVL^D+VvnxGE*lIj zG!{}t-;fMH-~8)~5~}M%$Ow3K&wYROfWU6>nsWwbk0iJPTyvnZ(m|ZnCU6R16G>3A zG`$SKx$nc;=(9lAY|gYmnkZUu%Du|+sK(i?nt0%sodcd>0SK}@`eFeo5!@ohS^Wl< z12}UVd35;tRxZ;LC@69fCjS}pTHUzAF9~K+OcVHuih>NzwwaYPeuMQMm8RgqadU?a60es_&#p&pZcf?V^CSJArH)C|GklPyC{OJ60Wci+o>ZY*@#| zNPVHk?j-Sv2tr90FT2E_&$)5Af3coS;Hwy_K`gT`{9cN;)TQGUexwihH^X#&aP<)e zFnbXIST7q%BNW;w&NoRPp#7CPN!7ezM7B4?9;v zoEyjpRy4*B86dTJQTH3-i!67j?;B8kk1#;}jtmOzV)3Bb9F|Wx8zNio z1HW2lDlIz?k`=%!9Gu!Lj_cKH&dqha*Z!NTQG}vc3mg+3S&YaRp`@wf+Pl{0F1d#k zF+nGJuv3!81dJ~p>qv8V`+kJW2O#im!jrvO`rh+fsMIj7>ohjl`mofJoI6RjiYZ~@ z*H7TzL&cxxmg64eLpM~yB{tTK$C+~CIfdw6?$_3gy#CZvbd`U;9s?!jb>IH=Ww|Xd zHdLj;ZT6fIg$2VN!)Gzf*q7VR{sVePOP5FBa<2dcm%iJ6S@C~)^T~lKV5y+tuSalG z*6x85-#QUiqj#9d>d$qMUpM{6JXz;>x0 z@VUcwou$b-X1vo0cWFH$7(o4#DdP|-ZCq6nv-&sLt1T{lYNDv!e@S2$smJ#jZwYjy z>+Fe6Hnlt#@eTXM8ilQ6b&5Ts>Cb_=FRS#+}e#wEEXH zvkXA44&Y=1sW%_JIIa?TQ=JCbxrP~1{R@R4Yxa!}f@a^^u65Q@90e=7j+c5NqG)FG z`ZtnTLievv)C~U{D*pY_r6j&F4sLG89lWdj8*04xms~j9N9bt$zi-38pDzPHpf>+* zMoFQxLvdD*(bufXt}Tfds^SD$5WEau8bazCv_n~}30i}5?gF6l+o&1GPd1$WV!~yq zK)6RQ=Fej47k03BB#M;u5{oOhVj3>@wJ;;t`AUNEPbG~b4|-LqOmFDw?lGdQxg^#= z!oK_*U(fxt9eR)JC4ZuoA54J^jnEHUw8r0nkzSM=t0}eT$Wi*8JLDlgX9?RUfZDDe zcA8U`JKyW&ncn)J>M+XUbewEqH zln$y3jXT;ZD^cTcTp!;py->HPy53YCUbLw4Jg2m&OU8S;eGyQFDy*_=%OhGz7BS2e z+kpSCjl8ybo{{r;_&Hm7q;%I@){0!|=%=+Z&-satxNlFh3iA}>??ArFWppk6&b%FL8ioScn!M`mH@Qg2zkHBz0mkz9} zkL7=EgJPy}lDMP^@*c=9{*Yj9MMhkb5<}9^5U=fOGuqSill0^IKO{mhI=@ZjB)anQ z_|KYac;nJnV*qdx`&9~8hA||X>%tInbAP~_wA84<1s1y)X!e%CF*)Z?qkwq9?>i@m zIH_b*%qGR_baUm6rAMQ~_|sBj{wqY>mhFMOnF#q73xHIh?`M{jzy7%CxdA$!-=4+n|pX&Hw5ylhm zNE?4#pde1CrepJ}q+t;TiM7jOMl<&iJ7YN5&a2208QKX!>5_DGPV`oJ%k#IB_pl$^ zfLQ+hkCXFL8G+(ZY-Hi?b6DY<0aMp296s}>CBp^Mm=cFUsLY7n^W)0!GxzF^%i%kB!9UTZhe$-qapBN7bq@DsOi%Ov6W!Mn(K z_d^LRuwK~-=S4&oZ9(|FDpIz+I+yV>MN@FXkXo{eL;hiAu@f+Y(Ufthkr|=Rb19P% z>>GuCl0})wQryr4f2zwOd3qgi9+2=(AnSBssKhPZNkU7;Pr28s;Ndg*(EqTg}L8^M-Uq$Ac_ z2?Po}l0NZ6`M()c(xMpMcUMk1v2gdvnpAbxDrF&?cKT3mRw9eN-!Sn5*Wy4dV53kH zr$P?5^{cOS&Lt3nudhIQHP8VE_bVoM=+H7kabu-t9&@9P*~-vM^@EGD=K?^k2>CnZ z4~sy|buQFKXV|!ipc`Sc>^3o&Yrz4U26P;S_S`KjoV{k>>jj#3Ejgt{bNVHrsDD{@ zl(iW*gypCBnxu+h55xOv1?Svs5Mgva(Wb34ay{DN+V^&D+9_zM*x7_JI(1oPpO5G;`pyYXun6Y2znx>25G4Ph zha8FqOa3yS`_em_W_r{qb-GVV^fPbJ%TI(8H}6T2Z%=B`n`pbV{xr{Rh%OE7K^Et>VEfcG$^zmoGIsqn3| zS}x3mjeO5|r_wR|E5z3hD`Vk+D`AA1NQ{tnjO6Yu5T_+mjge@CuraF+#uUoXdT|eR zYk>z|Ip_h7LfqeoEYc=)o!nOieGEH6#TbipwL;?_vJZyiKbWr|n`q3u5y`X7nszg0 zH2(5ASgv0U>h=B-o#O_yhepA`F6(e1-~`7qE(Pc1FxIcjKRnu%y_1k`kGy<`Lb1fv zXnj~oD|@1i@G3#=!4>$x7hoQqlOVUloMmLFUt@T)%ntjKzqh05GIhgQ{zXCayQST& zIRKKjX`aqwU_nt$*qtNhNi-IuoP)mJhsK=+qb&WMNr2>^7omIw1w)E!I~40B@V~)_ zxEEA?EVpX!u=h9HtJsY&#L+r=oo|QDU+|*F?;uKxyMqXk;c%KW-}M#`&bc^9^C~V! zrK&fpg^A^7Rm%j&e?=!`-q5NfA+UmH0-2Cxt=2+f%durV$#x3F_4X(Ro;=jX z1hNIXTY9fCcAv*0P+kYNoJ?@Eu-rO&`eBSQH6^E~M3mCzyFwV>^;_~>qx;g{U0Z&% z4G3g@FuXguxT3OTCy*&$GxGn0Z&3|Wr3UkeJA}XW*6i(b3EZ~Ae<1?KO)9;bYKo`a z^s^PJ)PV?mWN8dafDw`I1kXlCEviBq=#4rKa)R*2SIYwxli=(49Q4jBA6wc$B8&GF zcfr=A?2N-~>{svEE}ZL;&_n?rg6VLQ0j)v70I5#q40t54CC*Z{9zDOQQN-0Zg0#Na z)9z5dXDBP6g?wMq!MNj>ZmuRyA-lTn`yeA(wX~(&hsVo*nPcTC{UZGMYeeD#p29#U1K{dX$`?9E)&@piAxou;d$K-frerac* zkI5s(`W`l@9}hBLgZ_Dy%bJ(&sk!+D9jcIr5}$8PmiA7%dRL2qwV=%G}4I| z22XSD4Th>SX^k3`g=Y`7uI&_o2C{$lL@{tU?$%2&Qv7mr<+_Fpv+7bcDQ=3H1UVk5B9RDcqN6!!9?`?SwC2lkHsm1iBITgV(0q z>F(%R9VL%S%Rppa=;%$(um@~=$sE4|xnl{VK?lb8yXH}O4NQSJ!3q~jt)!(;45<83 zc$Qnp7v5YmClx-z&%s%mRt4-}yi_=-vITYMd&=-?&NuC9oKkE10dFUSvz?%9D%X)r zzAIrb{2mKbMjjOD{OWrM{#kA9g)OwUwoV(UA~5suGENn^H%R~a!65Z_4eC25(#8^8 zwF9xi3(i+xIRR$?B!|+;{^|`?O1*LPG*dd1u{`*;(r8K`b7S+ud_a8yVc;3*(PvHE zO&2tN6Q$|&)RxWEJH0;bs_A?duDlzg8H`q4C#u(S8#uToFi<$xZ!#Q}6~g;3A{74p z>DPW`si26g=~^87FuVe$PHo)-k4k-y#g9fvG0@enF`v?qu@PO}`qp=%^MV}R)kXeA zH!HlE?-<3#mc?UF&VP%8%tOE@^G0c^_$l=~Mu+~p0VTV9_(Hi8wmR5gLhGRAK3W*4 zY?+`RHO(+(#(W9INt5`#3U+y~9rigQoK@{S$d)ntpqyv_k}Of~`l<#;1t)cpA<>n7 zd!&H_k-%1B^f#+KT_3l4KGaFG$x-ccZHEGz|&@z zAh#Wl^pfxA=!tRzjw#NP_enrQh9u5oz6tE2!x(zvt?=oZ^dj#Ar~wF&9B$$AD*qPr zO0R5@W}TR20i<>hmKE%S(Vy?6j%wce{WUJ^C}E>kpIrtR_3KgOw%@T@F%>zpE*)Fe zXGT|a!e`;ZeAwP>?ODQC8z477yXBN@4bGo(ox7kfxIMVQ4tB6>{4-qI(4fOh(o<}M zY*}Z_l2jO+h8^)miY=a7>{M&J5gFwgka;B>SyjKCBHs-LkxdBya5G=#;4@#w+m_hc zMxg_xG0kju!3?1gNBIOxAk`Nu)Athbz~pEf5is16aTt^Kt<3Yr_G_R{jRsq<+*N=l z57cCtcrM#5OPB?#gh2H1Ac7J}>qI=;A2By&2d)_%!?RyMIYi68xhOC-9sTbN{=e#3 zKc7xDoEF&OB7Ao!E~B*kjw*`0tA|xzcHI*LPpIuKw_Cb_3bz-lp zqF?EN4!yilXj;(nv)%x^&OlgqEUSQU0?fruUXWZ#??Zfdy5tkXKgBQ5ReykC2#;x-IRXMlLm zqyK*YHC5F(`Wl4@W4&Xk3#E~1ms_Xg`^kNl@!xq%NO~eLPkg?On8}7P{xkM9qRe+< zfczZ2di9#qyUs`h)jeU)Mcv_s^zkn&E1aD_fu&sP)bKEFK@5)x|DWc~<^7C2)VL)}0| z@sWteH6Kgj#_F@{3t@~}&sj@CCSng*c)~-DaRQX>*?*Wu?5W49f9!KbZM{)Tbjt*3 zErPpygQypQwc4QYP{Bme7c=Z1CIDMO_Uyy4a6^GdwzN#nhn_Oj6ZErDMGle1)2uMI zzqn7;0d=yW@LVQL?mT!ap6$Y!m6{oOk6MH!oW{a;q3u9QP$70A;@V*?2xLD|@AT#zD!P$K`0WkzuCs}<i0FAKOW zs@khnBP^aBSKc=LS?_tc6}%PBnkxC=ObYp5Ms#wG*l-vzk=VxbKN~bwOZLjgqsfK& z$RD_hZo~jMW8SPTgIw)AD64FC08bY|F_eLbfN~xtly*#JV~RNXbi+Uxv#;lemNgjU zd6DU?L9AD@r#o{YZj%aO&i+tIHjmHS5um0;Fbn&_dCTOND0*m?ib@7CNz4ATOGSs5 zBKoJcW%1r5{l|pM9a&&LHn!Vg)7@!9kI#CLDpCGZT{=Z>-XZa2-8R)8iNY-^4yr0bxtGn`L{o8h>K5Ha|q2ZJBQW z9jIV=H;eoA+vw<>#RhhOhhz}vz{hNFU%+e#n&fZ~^pJ7R6iV^{M{A^}zT6H>zbI%* zkQVSv18+2uX#bZazWF%KbXy9NOQh~@=qp(h(+zyzRKw&^s2N;K0zGqcF zB&b=#h)cR%QTtL)q}mskZW?l4A2V^{ZTYDbTd^wi{t_t9lgcaqdcd1$Ik*dU<+KKygcLHNzVBoq?f67f&z z$nB5B-~03X81r7aK||3~N&S}$Cx(yY$xNZC47O5|oh4YKGvx z{E}&@mGQz@awRLaay_&mj;sFV(}c{!feoTC~U! z49aTtvKOjZ_4@QxfOcLzOXgfKf4Q z>)rKRtSLJCg_0f`l0l@(+XNVFNJ@uR_a>3m+2d`~nbJ3%NuN6 z6=6u-{$x}V>BYh)ZcmUxz$#>clNtuD-g-1dV4lgAz6QDY$wPVJchEohwMxG9Fyz~D z6`FU&X<%SU#F+Qi)E{IbFIxuCWf(K(Ws;^rug}dmQ)9Crmzr;jlH4s5X0Vc7`=fCu zu8TJ<@nvL*kU73MXQtrq&H(on{p@@1Ex6V0Vh(pNsfSxAyP{PxM_ccd2Vu3xF+e? zQ;y4ICX&`N`^Tx_uuC?|;dEsU;V<8o$n#zNCvUw1<#T-rgZVk0lm7*0*T}o}ck+JY z!Rx!oP062pN@z)VE0<%rv!Trt;0jzIoZ{A%13yV>OM|gpiOO?Zv)@9wa~fS?fO|rb z7lf@ak4Q70xKgH+qLx`nlNdBYUdpb8yicC|bG0%k!nesBVg!&Bn zQ{C0zU4u+<(^;keWT5oi4K0a|33B0MXU+(}>jwRL${V zJS-a#V4Ny_eUiK5=zRt32+%GuMX?drn{co?tTnd#43xBce~fO{Q981Zv$ zB8Z$bpmD3Xl%isKFG|Hn)g;wmXjTff)K-saPmdHns1bAce)_jB3&M&@f8y|MkG<%B z(te29X%{2y+FmY(O<8jd@Krc1g>M}NESQ#LBD^gs=aPgWPYrS0M#-c-UJj33xZO{8 z*XSNl>L9~T_6bsOvqA}%J`_m$DSv%+c+HrYvXtJf$X*h4<>NG(oF1)-YT{Sq4~-u5 zpY{U3=#k&7a!us(XQDx;;0?!UC`L4T{xABDVsAM;8KjI$&A&PA+{FQVL-A`k*r`k< zMx;Wh4}aZ?H27B<?cIgiw#=W3BJlfZjudug z+FBG$)S6Y2hc3Q#VM8IjmZqJ=+@ulfS>Ra;2VdaHw)BSqL^7L1!SpY!HwB-SGSYDg zuofvS@WDn+LVRPt&KfT2(VCtcDXn9Q8!kLzmo7js&PYX(rekwXNpmlD*OCG01yhcH zl!6t@ayPSW&_PedsQ=aV4}_Cp4yji9J9c?^Ys{4{aN4#nbv0 zTi=X~Y2nA8ovVdsvP4M>t1KPtkKpv=49fvQSk0b(j{g+k22rl84~u9M16&9C`ryf! zxUn}yJ`O8M0l%1+qFu>0vLM!4YRy!TYFwJzjZKRZ{Wm=#-WdKC&xbVPHUCQUb3KJM z=pbf557*iTO4EioVS$e{{A~{vJbc)8Y8YGBM$BDtFxa{fQU16B9*jQ?+5Uj&b%Khz z&INr*Z~Clw6Z&AoQ~IOL`IHEhZ~YAU?vbn(weMIT1wmLYD!}Z*_%Mx;z zwqzkJohGis5b5WM_0e9*?lU-^5`LdEC}|ay_&|~Ia5r!k;HD@Z##i^ammcgOOMxAR z6KL^I|BSi};xY!BBII#LB>W`74gXSo5LtgoolN_vWzh>VM6C!}L|4k0JbVEw-QsL* zlzktA+!!Lp%HeMWcj`tl*U{8H)0I)FfXk3YsUTGaDS1_mq|=f03(+4|rWtHV2{nV& z(3{b`s81(0%p5ojf{6h+X>qEeYOErLMTm{x5g-ynAe{$&odAKQ9a>9LTx;MUE}phE zNn1wfaneve9AyBsu1lm|cV%|+m&L@;HMiVKEsJa^%Ti_xNbE}qL`CmI!D^F#wi>fG z!3#bLsBnf&(XupY-MhPSL`C^pmY1T^8mZ!~n|be;JOJHLO4R#krirMfc7J{jtFzV6 ze>6ZUSac-lOLbeJ@r7^WTynx*kz$Wt0cV5;P1K!!3;f25IISkpbRQ`m zMpQ=H|H5;l$Z%3B-J~bYsLuqWhSA*uYW)CZ@NLEZAC2rP#;`LmE$?=^-xHg>&IW@* z>r^0{Wvq|4g7io4mu;S7^-L>&jZnG%xrA-m3#mgDGC|_Q6$h>d zFGpmcuk#=@iy)Q=?N%GH(DJH2I3i#Jt>xi4nS9N^js}OAXVqLZ)-4Mg3d0h-klhLf z@?wHjpO8IY7PGc_iv6jw5mVYyttgBt{SivlLKc2SME@cS-$MGA=xc#j>_=-pHVoG8 zCp5m0E$c<6nkykTi@>!=W2_5?T(@6I+!W!d3xD!w%CfZOzF`R{5fKe3vJBu8`lO4bovROhZ2K!vy`jkaiQ#@yvGbvW4BvXcc;&%d-|%E*vAf zXS^#0!~M!5b`%epErg&k<4u>-TL`^A4Uk&%~ zEE$_E!HLXOTKpB3G_0Uh<&#cK1t)bS((TBtWLEN0=od<}f5TSh;=fa3R&8|@)q=+T zIgL5~TiFtvc;)IPDYXcKS#B)zr4jd==M=TcCg0bemjiTSp~{#`qa_o;V+2~W4e8sz z$Z{9&VMDEae@vH$G!7M*hh))|+8Y~J5BMq+<048pb}9=zR{#>_L-8nG38=Q|P-cd0 z=>tR?#)-8c(Zk#~%}Emfh)4aHtgy*xv6StbY@7@9FkyJrNL7=Lm!yxx&U-IU&|<2O zOs=^a|JkeJfTu+s=CyR6t`LEVC=f`n@%BT@?R<76Y-rI)2oqQr^xVrv{&IpECVR&& zXu+1IRa4|Eo^rLu3qtQzv z%eHC*0De|Nm2A)towkj$2Z4;DHBuC23&el}p>kAejP>5Na?sl2{zaY3MbIXhdDD)zz z{^L^!fX|J%wHn|~GM1=skG0a2|iY3dD-UGFiUF|MWcPr@agbeMgapz zGTdUgVZNyA?MOw=XpO_5r=G~nI{%EQ3*FtoW_Qp^T5K&nrLZV04a_w;^_9}`11v_W z9*OowR8F&_`z)8N3uNvmO|Wr2^>#X}Ivr;xl&=6hL3$O0lbUt`H;T{iXX4Zzul~>}|A7t5 zL%u@Q1UVI7#v?`8aWv2lP0*n>jiiDngwYq1#OyI{6}yxCefg4AuYyJYkEeHFue0mA zhIee+w(VrcW@B58ZQHhO+qN4wc4M?bgTDK^pYQm7!ilx!oMR4Tg#Yqngy(U2lhxvY zW&bw?B#!0{taw2H3=M@uJ!t?G*G@`GGRTjc zDo^})1qROh!ONjkOy{()3>kAG|8?#66&-|@F7RYj$bpr{IISCHZV42T+gJ-;Pi4_- z%C3{{sHm%cJMAY=3yE+q;y{ioOYXaaqWsr`;8S7##^>g1$8Iu^+&q=3?V_ta>k>;l zDLzHW7j!*ru>OVatHVsiOkuU=JhR9JeY)cI)MCiFu)we}Z{yh@WNUQD$72mDiU&|A zTA%eI^|~-Zr&3jjsO(Qod(Q7=aF7$?a6v65Z_=hF=AeDoM~opQ&#lDK+a~}(f#p6+ zlU{zfdlh7{4u8c8!(Xh7mGrt+sJhdHRNhGl^VB8|GTAowlFKX3JG*0WXTLYj$*POq zydmXE$?D+Oxe|h4p&OttfVc=C8vplO5)G}qFNpLzt_x$b|5LHo{1B09%V>e;R_t~x zCAT*`%N66^3wzRLP!U=Y2Uyxnl>KJJ$$ynFH)5H%wGCNLC?sAGJJ(q%vV|%OQifzF zdM<`IiwF)hip%1Jf6D+3CAA51O+`CNso{mtQ>|W7E>mdlje?42vDoY&7n)8kb{Eg! zm_ys-I9uXtg|zmkmwTED3t-NfAc^H17I#z-Ae=pkW%NSUqdT8})4iV#{Rv&9D~3igB&r%8)^x}VMVDh;60-+8Foo#X z9%uh{I1XHY0P6UP9t~o;=@uJZ9RV%{{>b93_+#-+l+Ykal%&e7JY6t^N@A<+WUjAg z9)#`yq8fMdl`?s23r_hLcacJ{!m#Jp{oru_`D9*`bJF*G&6G*_5?GGHIqm-h<eMF;*lAkKU6YzwztNM9F1Idx-$-j8~UAO#q^j znp+!ulT*fL7LWXt@nLO+)4q4S*zesYQ(cdIQ#BST+K*td ze?Owa{+ST97O)g=5{p|(qCCp;GcnQXwN0Xc!D=*CfrBO6`^N~|ML5pB^V>Gil-aN= z5B<+J#0!Qw*DIaBMzz`iFHsBt8}Nkh&RZ##L)p+VVw57GBb*kJU=<9inSp}1Zx;PB z!rchbgGgj~Oe5B@A-44b+ECB3}gYb)M-50vjMYKBvAQ8v1%O&lEM0( znt|SDz!Y>W;{#h%5F;W8rfV?I@`%=p5Vsk0c9LhPSawh6{yzJXf0)YN*X0k^#dr-o ztYI3QiXn%^>y0o8bQp(h81C3MHA=ivC&HpoobIc@hjGp>vZYIZBrcM_T_}aoz=J9! zZKQjpXif8+6elt+X0bjRs9jzy_LpI~f=)pr)oQslH4y_v#t?uf@%BJsy(js5I%UP) zg;CtsXRTBll^3}D89NOOhGxH-@^#7%ab1&Ln==sn;Q~$jqLki?D#i8{MPDZcoPoa3 zhUP>Q{mT_e?kPi}rhF~-G5#6UFe)Qu+n{9t;xSpnx)mW5M+^RDAeQ(AY9;yq@#4}n z1{qci$xPT&VDZWrkXb`8;=0pxwYET^D*v=F@kWAH<3Q(O8c81oBc(xOQ~cuCuT;V# zd^X6oxgR2x$rEPt25lp0AaXGl>H+EWqsFs$KxyGJ--2|34jU`*BI=UFJF!Pl!MM!} zN{%Vn$!*JY@RfF@(CwqID_{s#Bkcvz&#?MgeNuqUb2sFkkr*t--hWleP*r~AvUYTN zRFBc;ID6FAk=M(3a{q^8HA3v(G-iXK615f4IIU?Q~%*_kUweMZ;Zga%tI+8$b*e!9LCQhxI>3p)K%%oxveQ@fj1l z03q1yD7KCvn1p972MZitzl2Dn(YYn3Q`pe)2(?{W@P{%b)vO?Ysb5k+J0R9b{4#7O z%wVYd9lt?Rg}G466@{fzU_jNO6wc~b4T}pvlM6P7>&H<^asjFcP|PB zl&v7zx&^2Le5QjmIaMxXN&8D+#-VQ3VHOt20Bom!v2H!PM4;xwaG0ww6aVmRw9n7v z5>6{`gjO1vXq(?}&H)Gcr<+wZ*?+EBTwh6z+sa{T~=8IA>BAvx@XG6FVg;QV` zf!y!le779E7$HiT91PZf424x`2L^08P6Mxl&q1m2G%=2X@MnCJ0QsIGBxRjgz%@L= z&{V-&^dcKnaHA`FDTWa(!i!8<$1yMlhKN}GB;Ae}^=Rdo3zOc@4Q%9Y%8l4-%#l&? zpG8;0R*X|O8!9ToFYNq4nw-A8%WpwaZdb3#hn#AjB9X7hp-YbzxcSaN#~n&tcVskh zHEy&SELAy4*6tdd?($urL}wVqx1*039g1oDfuN%ymRvIh+QW%l2vUujpRl7^aLqNR zeXjW+MMGCj4d*5%k;V%fsm3E{ek1$%EANbslj>DOL(7sn!WsO)hzdvXK7(~@Gq`vY zY6&i-w`!VU=`Ud8KiHgYt)^non(=8FBcuOP-m(nQZ=ynlh;; zr})zfZyts+Mq@Cof7qmMh>@I{Dxjb$lg!nt9C zK?qHVxx}@U0GY%>{&f&5Bm9UyGO9DXm>jqHRlALsD=6i6jtXWBUTlX}p_F8}Y{oQe zAFDg-!U5Xm-_p~`(;Le_5J@fmJI#^VF_$$6j*lmj@xP^DYzz6=7Kcs)%}!M6cg%~H z0tkZNm-bjXwZso6m6dHe-rFycDI+6I4pK00ExmxLx+Cc6r7B~w|*`h|DPlimLGkz^woHy*1Slb7Q~YU)mk zuE9E7HZezi!v>^*b=(SF9sP;s>x^hAc+EKbN8oo8`Wn68#T&Z{cd}lRn2!a^jK4i_ z86b;ekBX|7Z4`U629S)yfMl2nj{M2%K;rzl!2PgZ6tucV9U$E`d-p#kmd5>kqRvBY zQbcKlOA2(jZxQ+At4_gM!CT9;8u}^t)YTrClGrRJ*nAI?vz;@jeMThfw!tBPZ)H_W z#@>yfZBL$Go^PNuR+Avv4_`{{RrT2|rXBplYb-hFPhdK%n=pOUG~>D*{w>h(I4OGo z-aZ;v*?|Rx_Q4{EAmV=Qsm=9Ihtqqi2yz%#@|FL=V0RHk#V;7bbsq9?53q52T>&CF zQ4sKj6*1sSIQ`$D|80mWr*dn;0}%tR%@DQ8fZCPs!<^ZL?W5NVKjS12N;{dmIVhsmp%{SQLxbOfH1zPcidn{?F_Qg`#0e^vgigTQb^ZzE{W( z?ixer4cr;eCxKTrZ9g6VFrRe{iKcSgN|FJgPmLO z6V;yC4!JG#L_TV_8}D@R8u-vxYSOnifaDyd_gp(u$Yw99tEIkL%?hbFek^}j`c~Xd zD8(2vTXX`rcjI{3TZ60moj{WzO$9dE__}AsgAKtL=Dw7G%UU4*m{2eCWr6d%nmlfS z7xAa`dQ59=-8JR644Zv;Tm&+I2@!S}Pl3tAp|XV*9r{0ojA3vU@(oyiP;A}}4+mrY zPkuT!y zRdNFhMgc9T;A*s?XS28VQFs;oH%PP7~MNOd8+SJLt9P+4kz1-H-wIp7Aq9NyD9~e((>xf_VbyQjXBK| zHtG?CvVI;H-z+wszDcK3%%y&jnCG_aT@`gaU* z8g?6m#gFYpQ9udXO_UP@uED(C9;J2qe1K^6H)$}yEAr`3W-v4XM@SM>x1!$S+}pUo zUMkz!B0M9AZ~Fe*NDmD~OC2uujSLdV zk5U6_a`A^QQkchhTFq41S=HFC+SW8tY<;P7{ppfgqBkROOaz-T#y3c!K@BcYZ^fQy zC5u7l3nTzcbY+J^qY5m3M8`-T?je3?Ns*nr>6JTW#$-nV&2x+hnLm2YLeU**@yM&SG#W>Id^4zbnID7xY1JL}O3Ww90rDUKPWm zX|Uw(cxuRfY`^nl@Xzj+bzs-yv}EN-YHp~P4167=+dMxL&o|(Q@^gKVnKuZ>Py2Z- ziIL*nxlG{)Ne*bvJjFM;)g0=;m1%&~rS1K-1vtpqvqyqahZG(DS-Fsv6vjl>@QK2* z0rw{)P((Qt-86G?zmwl+PWuTQXzu1o?HnJqF9Rc>%eylT>`p|KVdOx<8hk3D7Gb-7 z2`Q2o28;HhPAUC*vH&0QwV=(!CcD;7W3;A^soo$yBaB7=$!$t>RS*}YuLuP{5MP2U zz4?`_4a>P4e{YRkT(}3qd{~Oyh97AAO`*h~AaLhp;(ppw915kEx#J<4J0(*pcYltL z$eDC!`n~tesnoURQbM56k6ER3UQW2N3ByPzeMU2YVqL(%CAg8u|J-{>7~w}|$7%EY zmK{<>SsU5>o#)PA>|i2Lq4|60LQ&^sLIE3qRKSh-Hy$S@suO~c1eK?nuu?!GfCUiE z0lNc0Kk0GS)+>4NsF8~M_xe!$RuT_#F?i6sQ6Uq%QCMby8#+{a{OfA9gq{q>ik=rd zCNP!%`-W2+@OEM2{kI!%(v#XxL$hVlLbaq1cPeRsYqS}B(JC%uk1t_v4KKwGj*rw? zmM>_o2BORdO`vWGhAr)X1&!F$8u$ItK3IZUl5z!7JA$!fwpY@wAb3mjr|Ra%h<{AT zaDV4r3=5?CUGt_m}MP2p!w1EwTkvZ#*> z-(0U#z$jaMo=2hvUQgYdG`A?N0aXYCvT2bphkhO_vz1Q2`u!d3n_E`0XFT5lmP`F0 zeewp<9Xq@XmMcWJtzf!{cbS_oQfB713)4GyHjEfP{J$pH@KE0*FI&{=${UNpYFgAB z=6|rpzdJ=4@S;HCn3=?zCXj#x|D=f7`n{q~{0}TzcAVna*}am0uS!boz)`MpvfvqO zbGkS6_@HaBD7S&EJariEbvEoF*fMCJg-Xu9ga+|kncQ>dP5H$RE2I^%j2Bvr=Gc9u ze{)PwFw~F5iZ-!I_Bq9T18qu1I!h!n63WaoN9WGv6dd@75lV-WC!`9%&mercHb7dK zXAU1SK2A5MrbvjcKYOl9_9|YdZ=CW4H7yxQv-+4sCHLRk_{|DvG*-z;r_z)F<%OZS z`XBKqkC2#Z$M7T6Srm)>HqF5xmZLFIEPDo2iHW(gVf4sRdZbii*of zfEBcfL2@g?@ac&fYb24h8Rec8dE6c?`UN+;?BFs*7aZ&tk+p*z2ZwfxSLY82Ji}F1LB2kX!2rTwdVZpOX zs~%(G<6Y8~v>m2bES0YAdn>IQe&oR<$yL<)^i~hdI<4|eU2=Bqr+YPh?B!dhz{R|l z&4)(jQ6D~@O>mJ!pqhdvbK21hB~uX0L--_e5~ zPES~vfRUrN)Pak-jvC-VqK4uiejSdsQxIZf z7owoEF^#Uc0w1**z%E`{M9h@D`2f86E08JKJUjmi?L7Jjp${N{Mt}4=pFQ%kYK_&r z?(^ZnMc4;eP4<3E_wK;|{{N{PbH3>uW`jgDiGp!PR0ecMujw;rEvM0A{HrH0bxd-KYj6Ct$J z!EArES#U4wBa>MpYN+JEAblM%oIV=Re;lHp-vR3Uc*#kOeknx0P#USw@4>&`dr%ha zK$wp7MCKKdp~BdLA%m;Yi!WxXUPqC&=Iz2;v&?dpKa2&lTbQXVd2~BZmj;8v=5pY! z5C`f(tH_ts1D>$gq0n%UENsD^TUlDeA=UPLT*D26z3JeCw7$>Ql>5KttpLn>G2e!{ zf94R7i8M5Nx(%UWMiMym{oK$nRy`pD}fAqHAOTC z`DP&`Bg_{ymeCJu5t|VxVb!odG3_c5CsaKj>|x!FZu;+q^0#znsox$OZU2{yb*w-! ziefN+#BtFH!$pgCr>^>1mY*Of(hlR`XCh1GrY#n0ECW7?w0XGZpz7@YDjo#&lg!Q^ z#+1OV=p_j-DJw+FseY^`bS}sXNK)u<%YArWZ)+0v*! zP_B5UFMDm~3nb@~F9xuv)6H&8J+K^(MA@R!bwiVQc}$>4gYL%M@QPnPm;=hQh9F^g zECwG~R~ik&cV-OBxNkxHxn(Zg>MS*Khrd(MsUvX_Ko&XVD9k{-~9=$r8UA zxeE(;_LK*8HNgsTYX=rt#H9PV@lNB8b>NQeH@b|S^@9LVZ?&_=m+uS;BKp_!qX)}r zgHqvL6PVszQ}7A3_IIQk>%PdtT=VzHg%Us#BC7>?_&4uh_a#4YxB@Ua7S1M1)|Q=1 zjWyuQD97&b%{RftZ2e8*jTIesm?^b$Ust+4Z%E+(kWBR*WQD!~h_~|> z(C#DCouK4MJ596d0uprL$AR0cN)!@EUF3R}cwNe+Es7xXx}dd16S5|EB1flD_)3^Y z-OR#`rri-!HT5!GY|pQ~1l)(;2e^txsM+p*5}}Ci_mEUac9IQP;KE*MWS(;SU-OeK z!CP35vp)*Snj8jfUnf*hIeMl8pcCe#;lR!P$yi3ayj7%PK@+6 z$vgnOy+p>xYZc*Bro0m7osgg=I0=~%ficLU-1k)sGsA=8;kQFs!FK$THnx-=CTCe_ zj^*f0EwbGw-Ag%e2IRRuaV((fH=0aa=*l^j0;+y1z+%W6v|#7g+Xk(96J!Z0FdV~g zL}m@9cQG&wHM)fBSy2%|&$v@dlqsG<--$%jSdHDN7)ci0*zmxU*ux7Lv^&9xdr-T} z^MRC*CvxjTEHT4J%fEF{e?H9Th7z(`+AD*3R|_=4O@+=+XGGoQSq#9}i_7H3Y%*A1 zB^@E)`Aky%%Qe!`crqpE1q4j?EV_gIHo)(Rn2ZJ5N(ua^ZzqGHL(QiDM@d8{LH$bW~W9|G3LZzQy2skwq-)wrR`j ztzxU(JN+~#*gLlbXaV~1cXH<^s?O9B( z6W~87_tv)vD?ed`B{-KL3{0>DgEiY4UE1PkT!Y1r%;jFZ@Gf$xnSkWeHj547x0$x& zSX?>@@bYspq=C64D`(~TKlu8HZ$biW zWx^Qh^pOBv3Fb=N+y!#oUYR7BRS2OMIX5wZ_sgz7P;Ika2Nn5&!b*nfl-e;(iDh=e50PdWV2ygAm zITBOS*}2NSN^fI2C3NAa|r@y>qQmqzQJBen=OxGy^z zTcXr`G>C~7nY}OYltd)4MNAX7F;VenP^9@Insm7u2&GgBbEQf%BU2z+PP}e$xY~Tt zhhw!1j!e8AjUp;KXhY%l$nLm{(~||btf*jp0|(bZZK3Z7ma8LY38RN!r^8{obmXFNNt$J zY^t@6i~Q{93e;TE=*2mYb|Pd-P0S4~b|bR^*C_IoxT}`Otk_~SLybg0S z|2t@D^Io<6*Y;m9sq?n(Q~{r$*&jjI>d@I>t@7~4;Wb!D`S{NR1$dL8_wy?{cASLF zrt!CHVQ*kk)rhz?e!$ zG(O*VsD=%?^2DInN&c#z1e;_I=1zy9cER3s29n9oBuGs;t2oD}YZIGhVpP*wt4m*W zo3shF5iOs;gi6ux!(Y^g1seD#E|3Npg4jGWQ!nL7hFhU(fw}F{bOugsumN$+x@=B> zu4X!S&c&%MV)8`j<2F2+Fcm;p53*eeuE=#~YG!ZbtVP%TZU7TN2X66V` z3&Rm#Gi%6Q@ic4NHycc|yK;Pk)tJ5bQLOP}B7d8?$?_b5==N_Xq$6fJvm)s0HSB9W zitrwy){gLFtZ4q`1S15V#ZK#Jw1u9GQz;JC@0B1&GSBu5a=vEaO9DY$r==?YkEuO4 zN}j&3SB&0bJnFcHF5hCU)UrArFqth0S}n0^p@?aUzsY(lHaE75>0K07yucFyHE`qt zJYPsyCwsA-TJYEVbt@&W9cZ|yxTVT!b&F#vS5eb=HQmvL(ns1MZVRgtJx?UX+BfYpMrPu|I_t&V`-FslB63~G%Ni< z)1!)pNn_K1>P^QLP8UZ#EzJ`C*E=zNRNKu_t(Z&_TeezLv@~(R&L9S8GE+rYEmIai zd`tJ2vEK>b>`)~w8B>bCI0n#?6L^ySxtEW+C5+5=a)hdrys}Qq4tumvkxMq%1hG|!afM`GUeN*s zok@>YWmOqPUtfOclO?ELWy2%xyYe$vDt6&>AL1vEpTkR*xoo0&TMZan9>Y(3#|zn- zpZ+N=V@viRIOQAX>-zq~lHfmyr39+UD!fK>N!t)K7o}`;RBAGca`cgmu#G7{TC^8d zLk%YVkSg1tt~O>e@kxt-0?<+d{71P9CRG)g7UXp1?oZUhpOLE*22qHL!wOO+QsP|S z)49+lonL>V{$cVg`kj-`y5}P}H;Mx!nFagi4I%+*vCO12Q=R-DKZii{au~$V!2@^O z)y+UyZNnHOBZt&&My$6kTEdd{u|SDI5U6w9Y0=j?KEPwhOp8S0xEZT%;k*xHBe#KP zG?Kd2KVZ=?<%kG(Mwme0U+6ju$1?nW1O)PJMB#2!M+owjJ+{Ss5I*!p@cf^dJbitr z)BZ`*pNbplRpMm3k}6zg1_YKZ{@RLbr;#u$dY}+`GYRSa0Y#+AzB-2DM}@X4OPVy( zJlr8=#Aqe8Tu{fSA3aRX6)j;mYIrC}C7lBDQm}Z}#*~g}Y_n^}r(3Vcfv^YRQl>A$ zk&i~6Tb*QI5K}A67Zi9P(2O*Q7^&1er>Mf_=G;0KWY@CyE{L9Z6H>sTavP^-<*bO| zS_I%s6{b$CH zq)`n)`B}6-eW}<7f%0-KpFf%f-h-o*3vQzuYWmXn_)Si>qwf4%URDz|hL{8zZSF~{ z6Bf%s{@OMn2|q!a)Hd)ptbQ4xW`u|H=U|mvZi%SRADF2XO>?>*_ECdx9CC?v;=guE zRfV1LKqM$wvZY>hQnp?G9t-lw*U(TI!5)a@;x>N>aoJq9Hhfyo?tAn${U5_qD zbUHu|(BgN=WaWp*t)j^wy?IzkrJUaizrRGRk)6nte^5%0EALXMaea&Vcc7(cIJ^Tq z!EbtjY%>O-9s(Fyf=^EG+++DsH~5iwaKj2=e80M;=e7O(Qnx2d+{grZqn8rz#BJ8F zvm%j(aIHf#V#u=Tg8F#l?h)S6@bVx{4{JKX*IjHG4!he;$1dO4t+#*yMT%WmsK3B7 zVRtF!a7(MgXd^cZC-)RW7FOmS{JSXmkL zI{3NQOFonQpQyed?gPey)iZgsO{V*SF+Dtf^9RLzPPE`dwL2p`E$S9XS|Wn@<9Q5y z6NZ7BeBA&~iKe+~evgHsM3^pn>4^$c;CQO;LMp(y5`<@W&~lf+2V$;(S%@KoPsQm3 z=)0Rw+~E;0)*VYcWCTCLiSBGlcQ=nB;Hgm_+JfN>B^4Z@aevhb@p0CO z=hBn1YcwgrI9+b`47BDT`;Qp^F}y1yXt5u`TOi&oWXq;b(rU3gxzfbz;bQ5F30$?%hGb2H>bTOP z8qD!v#|Xj&HFBUD=H&$faD0NiHu;%4^*!d*1Y6H%$aBlQexwY!mEV7Og?!Gv!1>Yy zA;Az|rfd3r?yz0zgbklh|1~P0T=5F!TzEYYyoVcGBoMx7O4wXVTf5z%ACej#ZMB;I zWM$z>0kId;epuD!ckiz##fByM*rL9r_ZL;;%J4T5y3q%#7QkMsN($muuXuc+I|}=e z3-Z3c8F)pUSa6pNgAR}|R8pqLBcdp6C}}ZzksZKHXGt3}TdT1p<5Rd9;{it+5U)L1 zIICfAeDpq1osuR!V@K)e`!BYjJ?}Z2iU{;wgO}4GzXE;lh%Ka@_hP>WZujnl?(l3V z;~5#j&X~X=Afw2*H(P=?n^-3_5mO@ac2aw9yU%yh)Ab82j%gnFg_Rr@__`Swc$zs= zEJB8He+C}_33E|Xg5pVn9w16-ax%|^TK9cDH$F>AdTV-o77Oa}Y@{0Ybyt4hHvGL@ z-ra8;Xsj8e-`HuK5-osJZ_EUqfr$fERvznzP4mha;)OOUx7?6U;lChm75iHle14+>Cb8gOTBQ>J76147ZIP6 zdIN6Fx+|9N(+!UNb!Xz+zp;&3%3BBCA`MYCxs`mav0S2bnUa+l@CmO1&1=!y8ZY(mZi3xk zTh?=P36_=_>4+;o4u~xNtSn`n)!=3OmR$Sb?>}Xiln8$M5V-? z!Od?RSG-;zaW;jyJ@|>QQXA}UHH1iEt~2#zp=0t0A#5o6)DUAFRK2p$CrE7wk12ki zE5Ub=CNctFAd+$VXu(z-#!5EDUR@vv3jL9!O2>lLrv-b1r+2)X{QcfIw1f2XU<^^4 z11jkz%AqyAO;{NRGU=+d!m?pEWG2F+NF72><0X`@F*W>M^3Oo6a@Yn1 zIbg+X5shD&UUZK3m!Pco$#7WHQOw#C+-cB|NX5~UiioM`<^6$_SAyRW`b_m8A=tmE zMdsRn2mu6;<`_jTSVSUT7}e2&*HmK`sbsZ8-dr@t3;EyIVVsb=ng9FpP= z!vuzF+o@B1Y;fOuf_Bz&RlA*p0N^fECIcb+Y0_SzlFqlyfy_1VAF*S8ZvhaOf$AHf zQRQQSqWV0U=CkB2Z~8h%#Xbo8MSg?%l;$`mkbj`Zx-lHrFf9>o9ilc0B3IUl%>#~Z zBXAjbtLQw$^|?xgz^B0G#GpDXj7{`92?ENP;4u5FyOC<>8Ozh5;YaS0)G$(@WM4(2 z@2_PcF;TNvK^BT%?~4}q%r%#z*_Z()ViuR|Vozjy&Id}Tu#BYm3HP{0o~TLDU>%_+ z%d+Mu%48XhCDhU)yozBv7d5WusL6HS;K_~=UW^srsm@e5Y;1|>#?Iw0e9mxaNeUz! z-T}6`y*uUA<2C2ASVov%<-bXur4rSf^hg^KyE6INSwu_`>4)k^j#jEJi|H=@DKowzO4TQVInW7?CyNauDWp}m_iy+` zCcxTr0?7+AY+MB8;{)GuIw< zm2ttnCayE6BA^}1G1BNhSHJNT~KTq^9CE%pf5&UW< zo z^7c}xB#3BAT-=bN_BabHM#O|$o8Qga-HcvgnGD%Q%~t^T2y-OR&aqgr#e{$!s+;Kr z_vo>C#2RvSg_J5%$ol{bCxIYS#Pm8{C{Le`?!*-vyWM5LPHG7>R6py}9|li?7A6}> zBbEzPp%PgY{pVy(F`50O^~m-EGKCHINzyz)f$Z~)aVq$|;V)KlZ%wcv>EI9*qSU9~ zY_YE<#kycHAZSpcLAZIHx2hz!`~fMhXFB=3k4(9p0Pa9vTCWAI&PaL~LeJqnnf&8%>DEjo+4}rDy;EuwZNHL|NgGt>6 zw7HL}a_#RojCdnA&ZafEy^G+DoBLiGHIJn_+vA(ud3o*t2bnZ)j8)t84f~AQFmlA( z0LYFVMuH}Fo#KM1V@ym@TL5Dy`}7j5OzT#=0ZPii*pZ%?Mz+9&VY z?}^W&Lf94O;1bAjVsiYbmt?Iu)OQ8Vm0}M__U<UHoRFwx&ehlez@rmJcIk?wEao9u?JA4o%Voq2ufSZ1dj)X0mL=>d`d~qu1(7~^ zvS3Z(5~(j0Qzy?o`H3W4J>U^ZK*Goy#*|Svo=0G>06f#$&W+?}53qRuHB}64PZtMz zn5&FDtSVCtPN|mDtQ?j?VZ5F8l`0#ggq`L9FWbdhA@H zGC7~%`Ar0_cp6tpU#2`MN~v9F4R?$`-bv?kQP03G5htU1NI>{~T!_HIbGKEW_BdCA zh?pE_iNgrTaA&qaQa$p-Ckbkj)_^Yx>=&gJYvahS`WK!mlHKcLlyk8HIkYIdH{{?k zHY$&a;wk8`N3ULh8{<}4Vl-6!Xy(rV8+ea3v4Fj@GnvPLMPchm%6Th&VwCQ--L#hl zRh*~UZ!!aXu{-6TwE6>Z7jj_T?Ar6t#RCmO)=<%t!aF$X`ZtsqaCgK>yJE@f2oG|F z;VVx3LFW|*+osrwbwlQlsMHbV*8#uH20RADQm=55w#A@W;nMB>tL$#YF56Yj4e>(&Q!M$1qb*hA#ZQ-kGqu#pC@QRW*KZL`E+28|bz)u;b z280tzJguoHV`62%u>U#kY*Xn1%LcGp08kno+M6G*; z=qWz`Kp=Q^>9;APX1Ma$zrk*Vj9SoqCM2FJA`;rP1K_9VurV6^D62-M-djy9tc06H zU}$hNVkzZ$p2??-QkE+hJh&D<_^PCe%=J4gh)!5hqe0!|+H>$8;&TJ+ajT0H##r=D z+bIsH{X-%3BJzqt7zqRcW6`E@-+zgZ4#Ks zvhpk?8GRd8JG6X+di!!_hsF(i-R$dS^khe&u`J1n@BMU!c7HMzAzXQVEi2oq}<`7E>GtPKSI#Zfo0d3hGbEXrhsOS-GKP>7I%PW zl80E`Agbm3hkBsF7&r%xPCd6p&K_BrL|gy?c=1KH&F9T{~5=N>NA-wxKL2{WEdJf*y8I4z}fPX^bQFw!`mc;4bm{1>Lm3$!g?6 zV~m7uNS}>Ki%Lrm)r_V;+#+_EB2DM>wtKR%TZ~}Te>p^*yHk8#!nTOGdy2QU!jZLkCN-W#=rmd!O&KiR-NNH`>U*XiqZsa> zYqKtsCUf$%JWJ0a>c5}9Pgy-pYm3g%Lx#-^lB+I4bqOEWC93Fvk^Lp$?amRXasZ%0{vx^i;oV_B>rSvjpde6FK|MGtvgnHQU zYzkAGQ%O$*1^I@-#Z5$))2!qaNv_1l1!kQZQpKpT9<*&XFMU3p=Z|W9h|}3%bWECI zZ~3wYTqsYp17;n`e0`xmaNr0GZUgmbaaA#Rr~9ov8Y;@te*Jtau#6ye0%Jxd$qsom z<`}oI-?C-bJvcb1 z$(*Ty9cdSzr@aoJM+F)b$Vx^`1yCnUn^$|>uV%iwPYuDE(+*pw|HT$yUGu9L_qZU;xOd8xz5IOMm^cvD+Wm?YSt4ooQ`tEw)lU{j$9T z`|ga1(XPwbW*Q3SF(*+k0Ks7-I@#)2bTzGoCcq8XMis2Eqk-Kw0-Mm4Ow5wn7`cgg zn3KoM`FIWq8KZ(9{|*x(rZJ^OCuyW3m5kFUWFRT)ju$iBuYw%@KF$&j@D$6N+O=81 zku%K=Devy%I?{@Nlj~{#9x_-oen|aseUB5f5o0LsLr(RM=xS5A)HgE0K=ordOvMUB z8PEU2n{pt-Awl0KT8v-B%1p2y2vYL4p^{{azr;>1zis2j<%HUD6Dy=NT6#4+Y`bq5 zoM%02(=zvMRFBc*Kl6qGpm)*l0M3yXsDc$6eQ0=r;yEf!Vi1;7Ly1tMKni8 z?F1rw&M(sFP=d3m^@~h>%K>GFhA<9%{`pGh-<}m4kR#htUAY zw(s(Qi^on~y<=Omc&}{_yNUoa#{jNLomHA$ct7y280N7HoGQ&q^=nnW4{!-weCN(T zM{nHq-1qk|GAg_pFb&vY|3e5H6q%`gqw(KMASMRGM8P?anK^a2xV=^SH%#&&3I%M} zW@L^fal;b<+Om@Y9Jg2qBc20AV*a}m#ulZ5%;$D@kq^QA?r&3n=VHwMOTrR<81)JN z01h|ZbKUDuVUxe9tMkDAspuh2n@$+HQA5*mDv))r@R=85C{nrO@lGI58chbtNZE(0 zwx>npK4v&lW{yrDLp1Wpu>qpl?{B!CA(@95sLBqah4L6qBXWEVf`bjWCxYE3hKyp5 z7nDARya~@n-4xHd+{0MdYF+w+jEx2@o4y+tJ)lotP%shCvzIma`TR4Lf`Wo_RaudE zkhG+*;EzV(Y#8XN_rhMx0NU2fr2#|{CI=_eslNwa`dNCd77Io`J_K#sbMAo!>ladN zXoHxHZ^5RBj1I-?`BHWrQ4M!}2@8&c(BI9W>nKhme3R0Z#*Bh~KowXbZxq0lI_!b0 z<>5>XE%@@z;4zsRqp<$`F(7%wf_@XsBoDccnmtY&fbxu|(N2J#s6;@6@f6~v!I^Q7 zU=^KDTo9)m4*5c4ME)vN?=a#SH24rYG82D*#ACdY%&+otIJg5-&SBrGp2~3kr9A?^ z!ZxPFRCEPHvjl=|>(sE?x$jC9m4T}fPLJ*7f0G^Lx9|5L6={SQRA#Sqjtq6Weu>Qd3i#MLtGF6#DM`?{W(Y3M|)b zxty%>*Q2?8#zDqnZj5Za7TAxpbLwr!x)sOilvx|c}VZ60mTXsN1e*R zt3a}xMCZcoptsg*9ir8h|#g2R7L8i zvQo+UyCXT9PEdaIXtZ9jlKt;J#?$;5c(N8kRz(amGqWkn*0;ge*ug5hy*@tQ%T+qu z2r_K~u;AEO7i1iwDigYDv@m2tYfO^!>ovmjEtm(i!>tt-WDhC`kofLv$OGh zEiIudemVH}?4;Vwm+06qwhgr2YF4?I1!aYI6e5#-o@vAzvGU3|AxB_=P^$Kz2jKY{ogepEH^X8LU_c5!G=IL>W20Ym`e z^)k?iyLw$5F;ogJ*{aX6xoY#zSw z6;v*hJ&Av-7~=~+6sc(Vkb1-bshk}#@u5sIh~i^~CerXmz{Qr1+QEzV0L|I_4@2~Y zSa|p!g^q%ya*$)RW(*o|n?#PaKl)ijbo9^0_1-kS>!VoT!Aeh$gd?Wq5sezxkxTG) z#pcGGV>$MX1-_lGR(FAI>^m3LERj(2T3z3rm#e~$JAn^7O=}-8L{|Jxl}|Y0WYie* zGCq}Tj4U?TFQ%0|M1J@!LLhz`T|>u-mLgvVfp^t-pd)mebzmYuvzu$04ER?+>vDVX z&q7t~T$5a~t-6}a1>aFvAVv6@o?>Vk8-gjb-Cya4VYoR8k)^f3!uPu}SpH-OZ1N_h z*ZIb;6UxshqOK}MwDIEDLuCqgEMK`BX`D#u|B6|EJ;2v#jq&w5kK(6l*oP%Q8FF-v z?#47*3*1_rLOFGub6SEZlSk7ah9tc2s?4O5Sp&bcwoN-YC6|YfZ@=8B?vQnE0KUmo zdHcr^{XtcbM_qjo$uQg$Sr{mnIXQB*x|Rlw4n}jWo{s+zsIMgJ^ec-71_lr&LibML z&;li)fqgk%m#wQm6161gbx#pb;vTQ!PDqpU}j(@@6|dHAs4O<(9@Sj{97qo*{RssGGA>CO{!mtnR-=#G4; zrXOj3ccy-Q{aw8(Pwj#E0=Ad0nH@D06VGJ$0;`iAmpSirm>8k@CjwHrP54qy8&b*p zZyDonW?aO)yEP0kEC;vpcM;9vJ4s?&eyQv1m8dotAjd}syI5Jqs?hnH6I+kH8e1f) z5!b0}I}By6?)o?dkJ%$xs@c7?M7glIh|%itkM-X|{fK@?fWL>A*Bo=o2)FVJs0$v# z?;M_f&ZH5q3E!1(cIRRSLL_L25NzK5gH2Vw2t|YeXVY{>fH~tQc248OE_7jQT_2Ap zCnuE{Kfe;l2;B_H=aTDNTOZNofOZcq4|I;bU5Gl!`G%BXxC$PRg@%irWTQg3{`Mb?kZM&zy=3G^*t?{ zVguDxKq6`gzew?(P*n}HA{*||FC2{@n)i5hx+R=F_sR!4TUr#Qf^S2N;L@xV7=I3L zxUKMuS4&Lr2n(Y@V2h3&KWaP=jaxP%*?5apvLeSOCfGV?-*~e}pkgwAtc_X^@aL2y z7-S8Klx!2Ye}T75stMv>q3*uE+Mh#@HA!Q6c{!rb zT$y0V#cbY+z?8U5vM_8anRBapDS9uN>Z^Hc7h>swF&r+gyjo66>QSxeaIzu0dI)}W z@83RwvVi#4$s;hjCa`(gMC^k^w)FJ`zj zcCH%fpmZ7%p~GKpW%fwZ=JMpzQaIxE!1_wr*-_2YzmZqk?lRxrpl~s>T20X&IoWy6 z$i!r}*l>T**df*k9)4##!%>A8J#?n@O);oB)L6KKQn2=o;WoU^j*{US&I+v{R1C!E zT2ef*3DQ<=ew2+u^=)@b6!4t8dwXSmkGHE_*jQMT68F;*g^*s&Q~L70DI4(`dI+*E z#&aRY+@pr`!9&uZ=|$u%Hp#*wO*Ki~SGPK3socWUbSU_7g=I5w&t)jTkG<@X^Mox6 zvL<4%oJa6(1$(FoI$$FvjX;J^8A#V$Kpo{Wh@ zme!V*hz<4_1Xl`*AIl{?@3HA_v^AU4CAHzmaZw?N3>!Hqjwj}yVfXj<+?e@SXVa=F zVPRpTv&Oz06mbJFRaKmY{B@bSvCT=c-lUKo4^z%BYWAvmPS=ctoQsfx4ImuG5=@D+ z7V2;*<|=80mZ3rujAdwoix@)O>MQcS8QADFLxz<7zYLl1q>^>}%&ODc%lxe}9G+18H9EMvzynYGpnW@S62i9j|N zYIKc`V)CXbt!MilupEGFUTE`nUEJL*QD;q}Tg@8WsjN~xV90Y6U^M|D-ARWCPZ#NJ zQr6LtkXbT`WPzD%1TFIt00w)TTd z;7ga6$ZE}|S-u=P#CI!o6Pb^>nI-2@@u%`TQi@U6e2JfMPZm$DSlLPEyVdk4TqsC! zn`-WaaZf^6bp)M}hR1L(yx(dx<9|d#k03nXB5Lvc%Ame27=rc>zif;kQmtLd5;3_B z5>D&wLYzhq=%1uD1`eUfP$WrLgsejBu;gi}<6AFtb9hMEVZddp>*Z>oL{V zi;%<$N${Bot#R34`h)~~{W)s?D76A)nhf;WW#*WCK7;7Vz270!>aGr@YV z9LTx(r|HVr&9BA9C|OxqNjo`#?KOdq0X`4cJ1-y= zfHDi+;vlNyau=3+r#wUtPl@u|kIbVR`lPQ`&25FnOlSp_-Ku9D#lX*?ldU+;yAv?d zK0I>slzy@Q0&l#ppWhNj$ocpz!iu?)H0VuBm$%9>R1Y8TfPPyK=b`A$s~?2Dq?B^} zOA`}K578$-g6Odw^{RMGpf|gOypH2tHDvEu&ihr$t*~qG?r2?g?r-jXT&@^2 zgBjK0-@kwJ>+5Dmv@!af@OWaKq_;VDua#+RA&LyRk5>VZ9J;)*VLW6Mt$_ZewP*?f zyP!>>P^KKOyt+V}K@qYz8E6 zoN~{w&N7;dqM3leM`Uf&c<8ZG*f__e{^cuZ$*=cdkdtL6X7fM#NX>q*@?&wX!QQ~b z&246M=ahB>)qo0LJ!%eRZ5ryPQTUSl6-Z~vC`5P&86*dCGysV%8FJ&wKSE5nTr|Tx z_M*%Xus7e_+`N{f_W$m)`!lz9Y00o9KObSp@?U-88ZO0^qPU(fz!`NCmr=`m!qiEH~_r64x*{}$=bnvJm>S~a(4zT&DES;YWYAlL=s=k^mU)nqR z>j7pGNXf&6J_c!PDIwt=79Uzh~dI?kuAPhdfzGkGzq#b$hh`tgbnQjl8 zLLy13qyq+mC``)L;D&$QL=6_|?D7>Z$`1~FLoKebO17~~8>IVkO0N#Xz}nuHWT)3; zY9Ck6*L=s>da!4X$QY+MO~I0>lY6euDw1|oCZhu!55l$^+&ukf`B?TK z%uW?f{39o#R{_b&)4iY^55ss{kGe5PkWo;|8&?B-r<^lK=jKQ$2i^(I;<=B%49w)Y zV1b~JOml!|gd_)pXN-$@2;uQ~9>_ZtLlWD-|hICWuW zss8@{!M9P>oA0UmLM0K)nnwa`=bI>qVRg!q2JpJffD=nC6Kl(O-hHC`-KM{}ylGQ5 zgs|69V-UVNo_>kF;08bIO{bqnhh6Y@Tt?#6u|82YnQgdZNx0I=u`e9HA3*yqq6lCx zk=@=UoMN&z)3g&@%dHK|evKVw_EneNJRpEdOib+BsMRCsuz4q2*Tlr+0`Li26RvzW zvC_tBJ%y#b{SPnk{Ihwq*G`89+LmO0BG#eTL?dpPJW4=BA*M!}+6vmIK16omxt8lK?_dA2!e;TQh_t+?_&HSPtZx| z-(|OE4S6=%%9cbUZC2*#A^Eg5%6W;u;Z?iOLGV2GW4Pf^Y0(c(2P9;bv5Ks^~kJ%WfeXjjh>XMS#9qsr_*$ znbm&{ftvZ>a%&1_^Hw5Q!qobjnxDO*a&9H`{d4qA%gc_?A@F#zweXS`biUq7z7-ab}?~qcCep`Z26s+nbPIqQUKCT)-CzucNQ0 zGjCL_YUJmxWNo&sY%fCXQmfLExDY#?d-CRZ5c;BK=>z*9nc3{|TnI_&e--j-4mM>V zSW7o$v;iR)iYmlO95b4S67YL)ctnVKbu@Pl=)bfy_PeFvhos&Nt)qok+eFwkogg-Y z0|wC;I8t9AJ(+3vMRCkWvvyF2jfdo$M{uV3cmxH*&1(l6?B)}xDJd)39`6rTd(CS{ z2M6W3C%QWFC0!MAcm%N5zCj-9CT~m8pac;?$l^a+*TmIQ2J?%Ug&*AE*S!AR+}`5F z4Ma_do+^3U*hClyT*CxL>Y@Qx^t|%-hRJx5v1Tl)_I@8@P#N~9A=V1r;ow(c&wvYqE7+7Q{cu+M?g{#_{#vqXE@!@z{}KuxlEjUdt5Is| z;Xyoa*U)4;TeVST)LMZ>Az&#dD;w?7TroNwoqc+8FKn^z3b7_0DgW;gWk1_cJ)j=k z$!CD`&84odPou$PDqz15V#t}|yI(s{hJsBQ5f>LHh)EI1=)8a^9i(2?#jLHiFcW+i zJ62-%*B#*)HqyuGcHLZHIFn zahLShrkeuOJZU~x&M{8>>Vxzu(>Qde57PQtz8`9Z=L`>BusN_Oh21)ofSxw#m}~e1@=fD6h|=GsCn4V7~lUBu{-xQ{BgAr%9<vxanE58OilVf4{=}?XmC0hPF zDtRjAnC^4GY}qPKtAIyy#Nehe{7s`!L)Xm2O9H4Km(&Yyx`c6zPidDEG@d%0=)kK| z1^<%hqlM3wANi#R%kN%|kxvS$nm7`P3WbqC8}R(I;(N#s3d59uh{$`ws6Lqyy%5|7 z^v<^tHcG!_m1)ML2~fj{0q21aJu`vxi{?qTVT?268gRyq>f`3-?kp-Qx~n+`h^6!_ z4V9uJ(~?jRxw(~=Jc&Hg@sAWByfhon;I$U-^Rhfwod{qK_f2?Bf!LFlG_94E_kTw) zu}ZzC)<3e`eBN#28~T8{cW8t$M6#sYZlO?@j7Yb!d_*rYr_39k{ z2(x)zu6@E}7I8|1FW5;43;vioxiY$TqO)FsIH}wx=-I$40|ScR)h3RQCn+7H&xD+U z#2&6TSq7Z(L6hfJ{zi7{H(#^#xuENAPzr5y4On1-QB1cC9+~B}6fI*Ns)VDL6@jNc zPZ~HFemnHFn=$SiRM?NG5A4J$JJcBFgbrM^5*7|u2_a~%EfJ&ZuM6b1Ax~%+!^Y~U zW{J4`UHTK`E!1%4Y~8O574y9i0yMlYkR>_9#Ko&ddnVim-4j<5Wb zP^3!=u_FXuS#@9>)U8sa53!9Lam1{w7=N#?PkMxzJQRKhknpB4@U}7Rl>RM+q6RDU zYdV%|ZnVAu{Pl?7SEoOWGz2Kb3N(wyOKv4`XGE3&2%Y1vGDktNzoLp$KR!ck^iHJ7 zp#S)_YGsuf0Z}7hlJymH{;EeRV!_7O4~^`Xz@OnVmbGI;cPIbtvUpy&9!7&FKI-G> z==jindr-dQIw7VlCnxs=j5N!CNu5##%-=Of1nZ%7euO-L)6CS-jS1xcf@C)%L+h2e z^o59zkuJ_?S}Kd)H>9RL5=DgwWwB@32TEtw$PV6~1g8Ns1MEn9Nxcohy48qa69Qz3C3XoL$mRmhD zNDQ4`;aV^AEz5V-g%VozDGH$qj^5Okc#l*zGr~IjD-lT)U7tPQkXwPDw`US&61Zcz!Q`h z>2A2aa>7TAJA18!b07lO#n5u}Odg@*%W%uu1VM_4o^gB*NKkx0Pp1LKE+-RdJ}4{p z7eRKvDXrzRs-O4UX6cO9Z{GqUXAX(PFn$q`)#nY14vOSq2~=ccdYV)q&S9=Qs+~r9 z^(J6L+aUU@r{!P-W3hnCrtLr7NV|u&9@5|E=d@WWDebq*hsmJwMyDA2u-KA@0mQ~O zlZ%&J#iyxKLIlApdEaBmoV$=E8*s}=$hEK*+fSm9yNrwEUzIAchKFdT$>L%%bjwr` zVH(NWLF&o5RQTZf{Fl0n>{3}+Ik8|=dz~+`3)Q@bv->jnx&eO&;$h`FQ$85nK|fLF{n@Q%+UBK#(1I+jJViu zBP8!uADLX~A1=x)TMw`fJ-OY87T=~bK0y|#T(zry!FF{q06M)-wuS%!ovYoG#~w~$ zH*fe3${netR{G&YlF3B}`)f;mbvp$e-ICnHV9uul4!uJZXjgMVh+8C9A>s$Ta&mol zA|LIon<4YIwXjbK-j>*^G(1KjpKI27QySO>qqieWvTcQoaPjOG`)6hdAzxM>A1+A_ zJ01fJU51{|zbRJHJ3T$k^~U}xESNvr7>7TJ05OhBXPQK;s{@(7j!A$DIqQn4JkRO% zqca(_?4C#yil&8y#sr>j4J}EVTu0s?_24i?^_er<-MK`oko35)<(kerR$)Sz4d=q| zF5u?wpGoGzv+77^=%O9a$nfV?okm7^nk8J)nla!V_kM87!yQ6%H$A9ZYC>{l4c}j9 zDd;DL|4S)G+uD}|A@xF;#!ycO?us(Vz+115pKhdj1m14()mt4BpO)5giMw?i z3;-HURVD7-$TjA!rqwBxVKGj&-x*R;WDsZUbennKzjGAq9T9}LAG&dfxP!JbKE^ zw2&S>Kou=5JAK-+N4M=Gq0)Ba>_JSH4Gfe3Qdk!Tg=724Fx$K?yS1CAXLTA)OajdZ z^{QZWE6v+F2i-3iv#rBkxeTms&;%KOGA>80qty_Ilaa0~QjKtqq#ql%66(35#1dOu zB&I;@$rR5=Lr<+S*}W}HUO8*r(~VH!-+%t0H)--o)0FX@2fo_Dy7A`DU=GB~p>!QJ9KjI4V3r9e01u-l z%z9>J3QN=O>)HWY7tY1qpoFhg`Md3{A?HF7LW`Y%&#sq_D zp&)U~LqOspK+nkf=S)i~TH?e0Ia8v{D)j!Idyv99S;yBDLntRyo@zc zm+q6B(f_VVLqAcugzL7xZ5g-mw3T+jU50DS9b#sl@Mu0# z_xDReyQfY{gt3enQ!aL*YvT~EkaKhh2KSx{PI51d!+}6o&fZsTsVom-l zP8t^MCmv_W8UCbWA1t@Bc`m!_h-QpggQ<=toEk1Y@PW+Y)Tt-VPko%L5zv71;ZJ|| z7s)&JRye=Nphf}T0Y5=(UH=omo-i!aXrhk$e~u|QltQL=8zdcrjQD7vp}8uL#g%-a zrSD|_WlG4(?6@!KFaTjCsX(Aa-WtiRo`iKAwc`ap8bpRZ*X68(92%PX<1QTvQ#$H& z=7WZ%LWj)cAU{f^{A)zHJrX{>f&9~+*>8eR(Bp$v3C)(vmAI+jl?IElva+L6xwz;T z&Ct-h+0pxK3tg=S10!XcaT5FeVW1J29q!>N3j zg~i0O&_iQPUZ>2U_l)X52G%{K_YvD16*TP=m(^$@5I6K_PO?&#wGo5*IB2Xp)7?^F zj042LJDFwUpwp?gOiYXSJdKn7_-Z17+WH=7UQab+Bi**@^~C6CZ*g()-&0E5+rg|~ zQ2}q;P9IU%K10u>@-I~!QW)dE;V9Ek{)Pm5?Kq2DTw&t<(-<~=@Dgb`h~1>g7|ZME zSbeyj2+aPE@Q88rqyHnMQU^HpWGjw&x=$MVY~qpHNirY?YADQ~xOA>n#NTNi`S-sw zO@C6KefGrF)T*aOMGO33*SqE*k`&#g%M8%KN@l3pix~~=t-7V8{R~*VJt?xawY6HQ zW~L(74?fgy2SO@7c6KxLs*TYlZ}rX{yo98nIhN643_B^gXqN6$pjy{U(PTy&kXqot zUt#Gnaxuk^bt^tWeG?Pvg@px$39(DVcdPCG{TN(r@w9Z`fN0O~wy<^|J?U;4cckRP zx~+!!UUC#CYNN@4tQWGM_tsxL+y@OBhEaOyqhP6zKH%yb$g~pMW+L7{> ztV98425gzYP2}U_bJFU0$mzc;O&tl~o@}_@PBz!CZ==8RG1pEZ?UGQKb+#u60fMIx zcm;oq^C;LqR}8UR<3u;95Y*r8(G|1v10#UwaW4T3q+4GswM09e*`^juE=D&+hS9LR z`^ZyzY5!lCmobi-tK_vpjfNtuo6doV_!Q~pUE)erQ2yy4RT|X1tY$j}cJm*cUH0C| zdV;eQB*tE59)5mHqc9h4OzCSoITrOl*AM7HsyzL%B~`ZYdInFp9E$*z)FKNa4!4Fw zQvOC$47|Q6j3{0ak@UyKj(daK^>AtxV4EqpsyVjBdi7FFFtHh&v;Ea+Qp9uqu*Jhu zaan`NQq7H>y^|hi8`&e;fV=o~kTM(k-VF}%dmGzV!_^nClhgH-olw0-$ENkLrTfd( z!~Zbq_4W1E))qqqGvTo}&(zvcwbPDpI|lpx{S0EA$Wt#PX9B&f&?)8B3Z9D@+%PYU zmvZ2hoE*x{&CUDjwiAT_u(n=%rN#Q#6sxS-N(uPE@1J<7dOOPN5rJH%d1RW;5aQt= z`&P!N%jY827%TnCCE?U8UlPPcVn#oaky=rxEEpxXQfkY+_-8!c&Vz{n$a&@@1v_90 zY3}Ok+Ouz5PUcg7L1_JB@|5~mG{^ElV8Uc${2hESklf&uY1VmvtR6B6+TFp%8dSw6 zNP7U%i&rRASiK(i9F~@rzIvhw`IV>l|NXPKiD7R%anv%-_v>D}qD-}F5S?%?TA)Ir6I>bt%eNM$H*vV!I@`2gH&R#3$XIdR zEDRG3H}QP*gn5OXJ** zlTnUfaN#59DLdT3SF=@S(f+X!9-PU>LaK=72l&bZ&Od+s3I+V<9!|i~$L@#w+vBW5 zKPD`ihPgXb1Uiy<0Y&V$=4UFHl4D`&u8{CxyiW6?zh(M#;|=xeA2Ghg1_uW(t*x1! z$G$v>c#i*Re{c}hZV_4COQ*9h`xVz1L(l|}5I#)oNE1YmKPmHk!674CfpRnVRFE7b zCo|1uM6!0@5qi8wKY-xCs49McHeHyTOZ&H2;{Kg1kw5@{LQh&n&wHCVGtv@G*3`7L zSB#%o0iAjSPVFtq>(oaNu&d-m_ zUk@0AB*I$H1ecY(>nQt4*+;rTuz->5)Z}(ymNgvv*?Up}<3ddXt?z8PUv)lCIihD< zks{HVW#_lJ?u_59tt`WWgP(B{KUr$=~pK2|M`Olzt0i=LHrq+Z8y1o2qp1HGg7J4 z^RBK}x5)+$ueHj5&CJc|#xp9I-6S&x#wwmFHr=|4{@zWSM$ALARF))=Z&G^jeBplS zM8C9*>xemvcR=Nfwbw0LI6b`_17655Xb5U^jgHh}mrJfufGWjQRNsE9aa=86D}(+m zyW_C^mX-Q$4aLGQ)%~M9s$kvRw|+5I4ComXqDgXBp_o|zEBbBl?^%%`PYY3Uddt=3w|tsg!<9J=0K9ty5{ZN}K~ zrWK5jk3SEW(Tf~W)HaMU-k5$KWNlT=H;LP9_M3^35f`xW|5=yjzYPchzv2SO*fBt~ zrWWbt{9UVf)!dFZe5we5Cxl6-0*~Ale*u2|$krkFNWKSy0;kii;fHAICQY`y>2#5@ zow+&PsdCtJxpD~u4?SC=90g`l##KezB8oCXtaVM#P#*mI+ABoH(k#s^oqHQWaUeUc6w$1$Z zlNc4nKDY#?Sl3EsfdjeXsvJb535lU5BO8)9`zd{)({b|)%9*0*?(R-Y993DtPxsl# z>1H$lI;TYb*aA=>aDGfYXU>I%yRCoF1VKTlAX6Uc{mm@sxxiBZBxhTR>!G+)X=#+XH>zSuvIJ(E zsyg%4oSw-(9^p9O9)35r^Mit`d!My>{md%WohtXOq&rT8Z0FpL4H*!xI$0h@9Q0tpU1_4H^qHfFFlC? zqF1{)jtk7JWgh|MK`((OrhFvpc@gN?Fc&fqqBgd+Z2K!eTEE-Qa@v9(lEtK&%?C`; zM?}r&%JIK*y6(5%Rt;I(*f8g!K{wrwl_9H^(f71LC=fRYs&bwn`4CxH@bR&8YEhaG zZ~}gA0b2`BO&)J%cfhT2sVOMlgvIE@$ZK`z&~K@K4^-L;qb8%KMhQCk*SKmt_w6l? z{c8IUdyrusS4U=~VQ|x~dNT8gcQy-LJw1YOe(=!hO0{XefU&Pex|H8B6gdLX&KKpO zU`gX*mf&O7gj8?^9_DH-nx(_B=bsAhxXs*^wv$M&%$CZLs)|Z?gZ=GZdG$CDR_Zbw z+lAGc2{nM758smO0+TiSo6e`*O-Q!s%3WORuzn`S6es(?Zhcn3ga1U#OYZn`PqA^eUzwYMnCAbhMhb~`$H;$Ob zP6UK^{YrBmAM!M%BB#q`&y;{m&%oJ*Ix9sFOG_x3wb-6_q?f~EVuUz`spuCuf(VTw z#`r?%iC~)w(uiF%NF3Z%HS~-JQYza^9FOWr1p!kTsG)D3oCzmS$slpFo9~JvcBba% z=O_A%NWeIG6>}VM^2+{vTloKUTJ6uwXfEaKsBw(JZaMczJ6}M=vDXTT>?6XEza!B} z8qmDIuGFXTTaIv|lFTuSUT&PT(WvU+nr`?YTnKJu?enE?Ch%7bL2};0RivQ8Vpv*zMGFDg zr2fu|4p-G=^5uH}>>4!XN-`dynM!%Krg3 zyiHuxSwCj_rwv}ZB;Ppk1)LY618Iyz*jp??^5f77NWas`)@ug*PiJ7GOIFLDqKuO` z(UZYZ;N43E8vx!3+xeC2)}61%90BuleTG8|OUIMr6D+mr#Ms#L6|YS!tEDpQO4r1MCW~#YZ@^h z`BRwkKQ@>scJvrRKl(wl-+_;pfgOHeuw0Uk6~~2 zkDJ`@>1d1RfJQ2nX>3VbY&Ol^tC=`dc-{H;k z_gmjC^B1VZ{pJ9-W%oEYAg=8@;p;(+O(m-KG$&-i;coWi@nJ|rIz74N8|;R_K+|{< zjN?ax7uCl*5Jw%pDU{a-he*2*D;!>TnHK`wTj0D~C?DTAK7a`o9(RbH|DbLuf|CI} zYb2xu4G=@;q2dqb4WkeX>C=_ucd3*SjYGqa8EhYf(##OKZa&k5_Wg2o@ zBon6YS-3kqNgRkxdEDP?dc2den%Y_(-Q=W&X4kiS3%1o9qF`pg0G^KMV=z8)>y>J< zdpQ`5)OC`6+!PYW=W6rqU0ir6t&JY4`l_QenPQ<2u{;;f z5DB9LmFb_luXnB5D9?C}>+fFFL<`PfYl*3?HaiCKT)f7;M_ISEM-Tk*OiQj+TbecN ziFP*71)ps=n^GKK?+IrEZ&EcnHdcFQXNREZ9UWDij);gzbYmNg!w$H>E@Gd(tT>&J zkl>M!pw7w6#QbGqbT|m?rf^q6c>d*+_|qjG%;+;CUgx|kFVI1WtdPk>Ji0Zti)eoN zcNtUu^PlVyX7sRk099^+W@@RYeIponD(F0|EGS&BKQ<0?8HBkMnUO{eY}VQd*!FH7 zBSO;C(z+7p<=`*h(DUgI@nfvLYI=$A-ljqiU_afFD^Exx?&J?JF23k*z!xG(keEuQ zi4(G4yyzeogpl%#L_Wtyg9ODpA&InH0yy_zoFHeF%O4wp-9hH2Y%~tgSz28~~{81~!1ODnkgQ76E zHvI|XWWrnQa|ii;+9ht{12Dn4 zY9l9N*9SfT_=GlcH2c!wzcL_PH%e6FC&eiS#z%0%9Wg=P7q1dx#r%4Tyd9ATg z8Jae?&yT5b;rr3>70gxE^)5QU5B#;WjWEH_%c>2}kQ${~s-x0xc e{=a{s2qYTrqmUhOA { + IPC.send('canopyExtension:registerExtension', RegisterExtension, { + name: this.name, + version: this.version, + author: this.author, + description: this.description + }); + }); + IPC.once(`canopyExtension:${this.id}:ready`, Ready, () => { + this.#isRegistrationReady = true; + for (const rule of Object.values(this.#rules)) + this.#registerRule(rule); + for (const command of Object.values(this.#commands)) + this.#registerCommand(command); + }); + } + + #registerCommand(command) { + IPC.send(`canopyExtension:${this.id}:registerCommand`, RegisterCommand, { + name: command.getName(), + description: command.getDescription(), + usage: command.getUsage(), + callback: false, + args: command.getArgs(), + contingentRules: command.getContingentRules(), + adminOnly: command.isAdminOnly(), + helpEntries: command.getHelpEntries(), + helpHidden: command.isHelpHidden(), + extensionName: this.name + }); + } + + #handleCommandCallbacks() { + IPC.on(`canopyExtension:${this.id}:commandCallbackRequest`, CommandCallbackRequest, (cmdData) => { + if (cmdData.senderName === undefined) + return; + const sender = world.getPlayers({ name: cmdData.senderName })[0]; + if (!sender) + throw new Error(`Sender ${cmdData.senderName} of ${cmdData.commandName} not found.`); + const parsedArgs = JSON.parse(cmdData.args); + this.#commands[cmdData.commandName].runCallback(sender, parsedArgs); + }); + } + + #registerRule(rule) { + IPC.send(`canopyExtension:${this.id}:registerRule`, RegisterRule, { + identifier: rule.getID(), + description: rule.getDescription(), + contingentRules: rule.getContigentRules(), + independentRules: rule.getIndependentRules(), + extensionName: this.name + }); + if (rule.getValue() === true) + rule.onEnable(); + } + + #handleRuleValueRequests() { + IPC.handle(`canopyExtension:${this.id}:ruleValueRequest`, RuleValueRequest, RuleValueResponse, (data) => { + const rule = this.#rules[data.ruleID]; + if (!rule) + throw new Error(`Rule ${data.ruleID} not found.`); + const value = rule.getValue(); + return { value }; + }); + } + + #handleRuleValueSetters() { + IPC.on(`canopyExtension:${this.id}:ruleValueSet`, RuleValueSet, (data) => { + const rule = this.#rules[data.ruleID]; + if (!rule) + throw new Error(`Rule ${data.ruleID} not found.`); + rule.setValue(data.value); + }); + } + + #setupCommandPrefix() { + const prefix = IPC.invoke(`canopyExtension:commandPrefixRequest`, CommandPrefixRequest, void 0, CommandPrefixResponse).then(result => { + Command.setPrefix(result.prefix); + }); + } +} + +export { CanopyExtension, Command, Rule }; \ No newline at end of file diff --git a/scripts/lib/canopy/Command.js b/scripts/lib/canopy/Command.js new file mode 100644 index 0000000..9d0651d --- /dev/null +++ b/scripts/lib/canopy/Command.js @@ -0,0 +1,103 @@ +/** + * @license + * MIT License + * + * Copyright (c) 2024 ForestOfLight + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +class Command { + #name; + #description; + #usage; + #callback; + #args; + #contingentRules; + #adminOnly; + #helpEntries; + #helpHidden; + static #prefix = ''; + + constructor({ name, description = '', usage, callback, args = [], contingentRules = [], adminOnly = false, helpEntries = [], helpHidden = false }) { + this.#name = name; + this.#description = description; + this.#usage = usage; + this.#callback = callback; + this.#args = args; + this.#contingentRules = contingentRules; + this.#adminOnly = adminOnly; + this.#helpEntries = helpEntries; + this.#helpHidden = helpHidden; + } + + getName() { + return this.#name; + } + + getDescription() { + return this.#description; + } + + getUsage() { + return this.#usage; + } + + getCallback() { + return this.#callback; + } + + getArgs() { + return this.#args; + } + + getContingentRules() { + return this.#contingentRules; + } + + isAdminOnly() { + return this.#adminOnly; + } + + getHelpEntries() { + return this.#helpEntries; + } + + isHelpHidden() { + return this.#helpHidden; + } + + runCallback(sender, args) { + this.#callback(sender, args); + } + + sendUsage(sender) { + sender.sendMessage(`§cUsage: ${Command.#prefix}${this.#usage}`); + } + + static setPrefix(prefix) { + Command.#prefix = prefix; + } + + static getPrefix() { + return Command.#prefix; + } +} + +export default Command; \ No newline at end of file diff --git a/scripts/lib/canopy/Rule.js b/scripts/lib/canopy/Rule.js new file mode 100644 index 0000000..cafae2f --- /dev/null +++ b/scripts/lib/canopy/Rule.js @@ -0,0 +1,76 @@ +/** + * @license + * MIT License + * + * Copyright (c) 2024 ForestOfLight + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +import { world } from '@minecraft/server'; + +class Rule { + #identifier; + #description; + #contingentRules; + #independentRules; + + constructor({ identifier, description, contingentRules = [], independentRules = [], onEnableCallback = () => {}, onDisableCallback = () => {} }) { + this.#identifier = identifier; + this.#description = description; + this.#contingentRules = contingentRules; + this.#independentRules = independentRules; + this.onEnable = onEnableCallback; + this.onDisable = onDisableCallback; + } + + getID() { + return this.#identifier; + } + + getDescription() { + return this.#description; + } + + getContigentRules() { + return this.#contingentRules; + } + + getIndependentRules() { + return this.#independentRules; + } + + getValue() { + const value = world.getDynamicProperty(this.#identifier); + if (String(value) === 'true') + return true; + if (['false', 'undefined'].includes(String(value))) + return false; + throw new Error(`Rule ${this.#identifier} has an invalid value: ${value} (${typeof value})`); + } + + setValue(value) { + if (value === true) + this.onEnable(); + else + this.onDisable(); + world.setDynamicProperty(this.#identifier, value); + } +} + +export default Rule; \ No newline at end of file diff --git a/scripts/lib/canopy/extension.ipc.js b/scripts/lib/canopy/extension.ipc.js new file mode 100644 index 0000000..5e00ab3 --- /dev/null +++ b/scripts/lib/canopy/extension.ipc.js @@ -0,0 +1,70 @@ +/* eslint-disable new-cap */ +import { PROTO } from '../ipc/ipc' + +const description = PROTO.Object({ + text: PROTO.Optional(PROTO.String), + translate: PROTO.Optional(PROTO.String), + with: PROTO.Optional(PROTO.Array(PROTO.String)) +}); + +export const Ready = PROTO.Void; + +export const RegisterExtension = PROTO.Object({ + name: PROTO.String, + version: PROTO.String, + author: PROTO.String, + description: description, + isEndstone: PROTO.Boolean +}); + +export const RegisterCommand = PROTO.Object({ + name: PROTO.String, + description: description, + usage: PROTO.String, + callback: PROTO.Optional(PROTO.Undefined), + args: PROTO.Optional(PROTO.Array(PROTO.Object({ + type: PROTO.String, + name: PROTO.String + }))), + contingentRules: PROTO.Optional(PROTO.Array(PROTO.String)), + adminOnly: PROTO.Optional(PROTO.Boolean), + helpEntries: PROTO.Optional(PROTO.Array(PROTO.Object({ + usage: PROTO.String, + description: description + }))), + helpHidden: PROTO.Optional(PROTO.Boolean), + extensionName: PROTO.Optional(PROTO.String) +}); + +export const RegisterRule = PROTO.Object({ + identifier: PROTO.String, + description: description, + contingentRules: PROTO.Optional(PROTO.Array(PROTO.String)), + independentRules: PROTO.Optional(PROTO.Array(PROTO.String)), + extensionName: PROTO.Optional(PROTO.String) +}); + +export const RuleValueRequest = PROTO.Object({ + ruleID: PROTO.String +}); + +export const RuleValueResponse = PROTO.Object({ + value: PROTO.Boolean +}); + +export const RuleValueSet = PROTO.Object({ + ruleID: PROTO.String, + value: PROTO.Boolean +}); + +export const CommandCallbackRequest = PROTO.Object({ + commandName: PROTO.String, + senderName: PROTO.Optional(PROTO.String), + args: PROTO.String +}); + +export const CommandPrefixRequest = PROTO.Void; + +export const CommandPrefixResponse = PROTO.Object({ + prefix: PROTO.String +}); \ No newline at end of file diff --git a/scripts/lib/ipc/ipc.d.ts b/scripts/lib/ipc/ipc.d.ts new file mode 100644 index 0000000..dc6ef67 --- /dev/null +++ b/scripts/lib/ipc/ipc.d.ts @@ -0,0 +1,103 @@ +/** + * @license + * MIT License + * + * Copyright (c) 2025 OmniacDev + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +export declare namespace PROTO { + interface Serializable { + serialize(value: T, stream: ByteQueue): Generator; + deserialize(stream: ByteQueue): Generator; + } + class ByteQueue { + private _buffer; + private _data_view; + private _length; + private _offset; + get end(): number; + get front(): number; + get data_view(): DataView; + constructor(size?: number); + write(...values: number[]): void; + read(amount?: number): number[]; + ensure_capacity(size: number): void; + static from_uint8array(array: Uint8Array): ByteQueue; + to_uint8array(): Uint8Array; + } + namespace MIPS { + function serialize(byte_queue: PROTO.ByteQueue): Generator; + function deserialize(str: string): Generator; + } + const Void: PROTO.Serializable; + const Null: PROTO.Serializable; + const Undefined: PROTO.Serializable; + const Int8: PROTO.Serializable; + const Int16: PROTO.Serializable; + const Int32: PROTO.Serializable; + const UInt8: PROTO.Serializable; + const UInt16: PROTO.Serializable; + const UInt32: PROTO.Serializable; + const UVarInt32: PROTO.Serializable; + const Float32: PROTO.Serializable; + const Float64: PROTO.Serializable; + const String: PROTO.Serializable; + const Boolean: PROTO.Serializable; + const UInt8Array: PROTO.Serializable; + const Date: PROTO.Serializable; + function Object(obj: { + [K in keyof T]: PROTO.Serializable; + }): PROTO.Serializable; + function Array(value: PROTO.Serializable): PROTO.Serializable; + function Tuple(...values: { + [K in keyof T]: PROTO.Serializable; + }): PROTO.Serializable; + function Optional(value: PROTO.Serializable): PROTO.Serializable; + function Map(key: PROTO.Serializable, value: PROTO.Serializable): PROTO.Serializable>; + function Set(value: PROTO.Serializable): PROTO.Serializable>; + type Endpoint = string; + type Header = { + guid: string; + encoding: string; + index: number; + final: boolean; + }; + const Endpoint: PROTO.Serializable; + const Header: PROTO.Serializable

; +} +export declare namespace NET { + function serialize(byte_queue: PROTO.ByteQueue, max_size?: number): Generator; + function deserialize(strings: string[]): Generator; + function emit, T>(endpoint: string, serializer: S & PROTO.Serializable, value: T): Generator; + function listen>(endpoint: string, serializer: S & PROTO.Serializable, callback: (value: T) => Generator): () => void; +} +export declare namespace IPC { + /** Sends a message with `args` to `channel` */ + function send, T>(channel: string, serializer: S & PROTO.Serializable, value: T): void; + /** Sends an `invoke` message through IPC, and expects a result asynchronously. */ + function invoke, T, RS extends PROTO.Serializable, R>(channel: string, serializer: TS & PROTO.Serializable, value: T, deserializer: RS & PROTO.Serializable): Promise; + /** Listens to `channel`. When a new message arrives, `listener` will be called with `listener(args)`. */ + function on, T>(channel: string, deserializer: S & PROTO.Serializable, listener: (value: T) => void): () => void; + /** Listens to `channel` once. When a new message arrives, `listener` will be called with `listener(args)`, and then removed. */ + function once, T>(channel: string, deserializer: S & PROTO.Serializable, listener: (value: T) => void): () => void; + /** Adds a handler for an `invoke` IPC. This handler will be called whenever `invoke(channel, ...args)` is called */ + function handle, T, RS extends PROTO.Serializable, R>(channel: string, deserializer: TS & PROTO.Serializable, serializer: RS & PROTO.Serializable, listener: (value: T) => R): () => void; +} +export default IPC; diff --git a/scripts/lib/ipc/ipc.js b/scripts/lib/ipc/ipc.js new file mode 100644 index 0000000..8b24afe --- /dev/null +++ b/scripts/lib/ipc/ipc.js @@ -0,0 +1,593 @@ +/** + * @license + * MIT License + * + * Copyright (c) 2025 OmniacDev + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +import { ScriptEventSource, system, world } from '@minecraft/server'; +export var PROTO; +(function (PROTO) { + class ByteQueue { + get end() { + return this._length + this._offset; + } + get front() { + return this._offset; + } + get data_view() { + return this._data_view; + } + constructor(size = 256) { + this._buffer = new Uint8Array(size); + this._data_view = new DataView(this._buffer.buffer); + this._length = 0; + this._offset = 0; + } + write(...values) { + this.ensure_capacity(values.length); + this._buffer.set(values, this.end); + this._length += values.length; + } + read(amount = 1) { + if (this._length > 0) { + const max_amount = amount > this._length ? this._length : amount; + const values = this._buffer.subarray(this._offset, this._offset + max_amount); + this._length -= max_amount; + this._offset += max_amount; + return globalThis.Array.from(values); + } + return []; + } + ensure_capacity(size) { + if (this.end + size > this._buffer.length) { + const larger_buffer = new Uint8Array((this.end + size) * 2); + larger_buffer.set(this._buffer.subarray(this._offset, this.end), 0); + this._buffer = larger_buffer; + this._offset = 0; + this._data_view = new DataView(this._buffer.buffer); + } + } + static from_uint8array(array) { + const byte_queue = new ByteQueue(); + byte_queue._buffer = array; + byte_queue._length = array.length; + byte_queue._offset = 0; + byte_queue._data_view = new DataView(array.buffer); + return byte_queue; + } + to_uint8array() { + return this._buffer.subarray(this._offset, this.end); + } + } + PROTO.ByteQueue = ByteQueue; + let MIPS; + (function (MIPS) { + function* serialize(byte_queue) { + const uint8array = byte_queue.to_uint8array(); + let str = '(0x'; + for (let i = 0; i < uint8array.length; i++) { + const hex = uint8array[i].toString(16).padStart(2, '0').toUpperCase(); + str += hex; + yield; + } + str += ')'; + return str; + } + MIPS.serialize = serialize; + function* deserialize(str) { + if (str.startsWith('(0x') && str.endsWith(')')) { + const result = []; + const hex_str = str.slice(3, str.length - 1); + for (let i = 0; i < hex_str.length; i++) { + const hex = hex_str[i] + hex_str[++i]; + result.push(parseInt(hex, 16)); + yield; + } + return ByteQueue.from_uint8array(new Uint8Array(result)); + } + return new ByteQueue(); + } + MIPS.deserialize = deserialize; + })(MIPS = PROTO.MIPS || (PROTO.MIPS = {})); + PROTO.Void = { + *serialize() { }, + *deserialize() { } + }; + PROTO.Null = { + *serialize() { }, + *deserialize() { + return null; + } + }; + PROTO.Undefined = { + *serialize() { }, + *deserialize() { + return undefined; + } + }; + PROTO.Int8 = { + *serialize(value, stream) { + const length = 1; + stream.write(...globalThis.Array(length).fill(0)); + stream.data_view.setInt8(stream.end - length, value); + }, + *deserialize(stream) { + const value = stream.data_view.getInt8(stream.front); + stream.read(1); + return value; + } + }; + PROTO.Int16 = { + *serialize(value, stream) { + const length = 2; + stream.write(...globalThis.Array(length).fill(0)); + stream.data_view.setInt16(stream.end - length, value); + }, + *deserialize(stream) { + const value = stream.data_view.getInt16(stream.front); + stream.read(2); + return value; + } + }; + PROTO.Int32 = { + *serialize(value, stream) { + const length = 4; + stream.write(...globalThis.Array(length).fill(0)); + stream.data_view.setInt32(stream.end - length, value); + }, + *deserialize(stream) { + const value = stream.data_view.getInt32(stream.front); + stream.read(4); + return value; + } + }; + PROTO.UInt8 = { + *serialize(value, stream) { + const length = 1; + stream.write(...globalThis.Array(length).fill(0)); + stream.data_view.setUint8(stream.end - length, value); + }, + *deserialize(stream) { + const value = stream.data_view.getUint8(stream.front); + stream.read(1); + return value; + } + }; + PROTO.UInt16 = { + *serialize(value, stream) { + const length = 2; + stream.write(...globalThis.Array(length).fill(0)); + stream.data_view.setUint16(stream.end - length, value); + }, + *deserialize(stream) { + const value = stream.data_view.getUint16(stream.front); + stream.read(2); + return value; + } + }; + PROTO.UInt32 = { + *serialize(value, stream) { + const length = 4; + stream.write(...globalThis.Array(length).fill(0)); + stream.data_view.setUint32(stream.end - length, value); + }, + *deserialize(stream) { + const value = stream.data_view.getUint32(stream.front); + stream.read(4); + return value; + } + }; + PROTO.UVarInt32 = { + *serialize(value, stream) { + while (value >= 0x80) { + stream.write((value & 0x7f) | 0x80); + value >>= 7; + yield; + } + stream.write(value); + }, + *deserialize(stream) { + let value = 0; + let size = 0; + let byte; + do { + byte = stream.read()[0]; + value |= (byte & 0x7f) << (size * 7); + size += 1; + yield; + } while ((byte & 0x80) !== 0 && size < 10); + return value; + } + }; + PROTO.Float32 = { + *serialize(value, stream) { + const length = 4; + stream.write(...globalThis.Array(length).fill(0)); + stream.data_view.setFloat32(stream.end - length, value); + }, + *deserialize(stream) { + const value = stream.data_view.getFloat32(stream.front); + stream.read(4); + return value; + } + }; + PROTO.Float64 = { + *serialize(value, stream) { + const length = 8; + stream.write(...globalThis.Array(length).fill(0)); + stream.data_view.setFloat64(stream.end - length, value); + }, + *deserialize(stream) { + const value = stream.data_view.getFloat64(stream.front); + stream.read(8); + return value; + } + }; + PROTO.String = { + *serialize(value, stream) { + yield* PROTO.UVarInt32.serialize(value.length, stream); + for (let i = 0; i < value.length; i++) { + const code = value.charCodeAt(i); + yield* PROTO.UVarInt32.serialize(code, stream); + } + }, + *deserialize(stream) { + const length = yield* PROTO.UVarInt32.deserialize(stream); + let value = ''; + for (let i = 0; i < length; i++) { + const code = yield* PROTO.UVarInt32.deserialize(stream); + value += globalThis.String.fromCharCode(code); + } + return value; + } + }; + PROTO.Boolean = { + *serialize(value, stream) { + stream.write(value ? 1 : 0); + }, + *deserialize(stream) { + const value = stream.read()[0]; + return value === 1; + } + }; + PROTO.UInt8Array = { + *serialize(value, stream) { + yield* PROTO.UVarInt32.serialize(value.length, stream); + stream.write(...value); + }, + *deserialize(stream) { + const length = yield* PROTO.UVarInt32.deserialize(stream); + return new Uint8Array(stream.read(length)); + } + }; + PROTO.Date = { + *serialize(value, stream) { + yield* PROTO.Float64.serialize(value.getTime(), stream); + }, + *deserialize(stream) { + return new globalThis.Date(yield* PROTO.Float64.deserialize(stream)); + } + }; + function Object(obj) { + return { + *serialize(value, stream) { + for (const key in obj) { + yield* obj[key].serialize(value[key], stream); + } + }, + *deserialize(stream) { + const result = {}; + for (const key in obj) { + result[key] = yield* obj[key].deserialize(stream); + } + return result; + } + }; + } + PROTO.Object = Object; + function Array(value) { + return { + *serialize(array, stream) { + yield* PROTO.UVarInt32.serialize(array.length, stream); + for (const item of array) { + yield* value.serialize(item, stream); + } + }, + *deserialize(stream) { + const result = []; + const length = yield* PROTO.UVarInt32.deserialize(stream); + for (let i = 0; i < length; i++) { + result[i] = yield* value.deserialize(stream); + } + return result; + } + }; + } + PROTO.Array = Array; + function Tuple(...values) { + return { + *serialize(tuple, stream) { + for (let i = 0; i < values.length; i++) { + yield* values[i].serialize(tuple[i], stream); + } + }, + *deserialize(stream) { + const result = []; + for (let i = 0; i < values.length; i++) { + result[i] = yield* values[i].deserialize(stream); + } + return result; + } + }; + } + PROTO.Tuple = Tuple; + function Optional(value) { + return { + *serialize(optional, stream) { + yield* PROTO.Boolean.serialize(optional !== undefined, stream); + if (optional !== undefined) { + yield* value.serialize(optional, stream); + } + }, + *deserialize(stream) { + const defined = yield* PROTO.Boolean.deserialize(stream); + if (defined) { + return yield* value.deserialize(stream); + } + return undefined; + } + }; + } + PROTO.Optional = Optional; + function Map(key, value) { + return { + *serialize(map, stream) { + yield* PROTO.UVarInt32.serialize(map.size, stream); + for (const [k, v] of map.entries()) { + yield* key.serialize(k, stream); + yield* value.serialize(v, stream); + } + }, + *deserialize(stream) { + const size = yield* PROTO.UVarInt32.deserialize(stream); + const result = new globalThis.Map(); + for (let i = 0; i < size; i++) { + const k = yield* key.deserialize(stream); + const v = yield* value.deserialize(stream); + result.set(k, v); + } + return result; + } + }; + } + PROTO.Map = Map; + function Set(value) { + return { + *serialize(set, stream) { + yield* PROTO.UVarInt32.serialize(set.size, stream); + for (const [_, v] of set.entries()) { + yield* value.serialize(v, stream); + } + }, + *deserialize(stream) { + const size = yield* PROTO.UVarInt32.deserialize(stream); + const result = new globalThis.Set(); + for (let i = 0; i < size; i++) { + const v = yield* value.deserialize(stream); + result.add(v); + } + return result; + } + }; + } + PROTO.Set = Set; + PROTO.Endpoint = PROTO.String; + PROTO.Header = PROTO.Object({ + guid: PROTO.String, + encoding: PROTO.String, + index: PROTO.UVarInt32, + final: PROTO.Boolean + }); +})(PROTO || (PROTO = {})); +export var NET; +(function (NET) { + const FRAG_MAX = 2048; + const ENCODING = 'mcbe-ipc:v3'; + const ENDPOINTS = new Map(); + function* serialize(byte_queue, max_size = Infinity) { + const uint8array = byte_queue.to_uint8array(); + const result = []; + let acc_str = ''; + let acc_size = 0; + for (let i = 0; i < uint8array.length; i++) { + const char_code = uint8array[i] | (uint8array[++i] << 8); + const utf16_size = char_code <= 0x7f ? 1 : char_code <= 0x7ff ? 2 : char_code <= 0xffff ? 3 : 4; + const char_size = char_code > 0xff ? utf16_size : 2; + if (acc_size + char_size > max_size) { + result.push(acc_str); + acc_str = ''; + acc_size = 0; + } + if (char_code > 0xff) { + acc_str += String.fromCharCode(char_code); + acc_size += utf16_size; + } + else { + acc_str += char_code.toString(16).padStart(2, '0').toUpperCase(); + acc_size += 2; + } + yield; + } + result.push(acc_str); + return result; + } + NET.serialize = serialize; + function* deserialize(strings) { + const result = []; + for (let i = 0; i < strings.length; i++) { + const str = strings[i]; + for (let j = 0; j < str.length; j++) { + const char_code = str.charCodeAt(j); + if (char_code <= 0xff) { + const hex = str[j] + str[++j]; + const hex_code = parseInt(hex, 16); + result.push(hex_code & 0xff); + result.push(hex_code >> 8); + } + else { + result.push(char_code & 0xff); + result.push(char_code >> 8); + } + yield; + } + yield; + } + return PROTO.ByteQueue.from_uint8array(new Uint8Array(result)); + } + NET.deserialize = deserialize; + system.afterEvents.scriptEventReceive.subscribe(event => { + system.runJob((function* () { + const [serialized_endpoint, serialized_header] = event.id.split(':'); + const endpoint_stream = yield* PROTO.MIPS.deserialize(serialized_endpoint); + const endpoint = yield* PROTO.Endpoint.deserialize(endpoint_stream); + const listeners = ENDPOINTS.get(endpoint); + if (event.sourceType === ScriptEventSource.Server && listeners) { + const header_stream = yield* PROTO.MIPS.deserialize(serialized_header); + const header = yield* PROTO.Header.deserialize(header_stream); + for (let i = 0; i < listeners.length; i++) { + yield* listeners[i](header, event.message); + } + } + })()); + }); + function create_listener(endpoint, listener) { + let listeners = ENDPOINTS.get(endpoint); + if (!listeners) { + listeners = new Array(); + ENDPOINTS.set(endpoint, listeners); + } + listeners.push(listener); + return () => { + const idx = listeners.indexOf(listener); + if (idx !== -1) + listeners.splice(idx, 1); + if (listeners.length === 0) { + ENDPOINTS.delete(endpoint); + } + }; + } + function generate_id() { + const r = (Math.random() * 0x100000000) >>> 0; + return ((r & 0xff).toString(16).padStart(2, '0') + + ((r >> 8) & 0xff).toString(16).padStart(2, '0') + + ((r >> 16) & 0xff).toString(16).padStart(2, '0') + + ((r >> 24) & 0xff).toString(16).padStart(2, '0')).toUpperCase(); + } + function* emit(endpoint, serializer, value) { + const guid = generate_id(); + const endpoint_stream = new PROTO.ByteQueue(); + yield* PROTO.Endpoint.serialize(endpoint, endpoint_stream); + const serialized_endpoint = yield* PROTO.MIPS.serialize(endpoint_stream); + const RUN = function* (header, serialized_packet) { + const header_stream = new PROTO.ByteQueue(); + yield* PROTO.Header.serialize(header, header_stream); + const serialized_header = yield* PROTO.MIPS.serialize(header_stream); + world + .getDimension('overworld') + .runCommand(`scriptevent ${serialized_endpoint}:${serialized_header} ${serialized_packet}`); + }; + const packet_stream = new PROTO.ByteQueue(); + yield* serializer.serialize(value, packet_stream); + const serialized_packets = yield* serialize(packet_stream, FRAG_MAX); + for (let i = 0; i < serialized_packets.length; i++) { + const serialized_packet = serialized_packets[i]; + yield* RUN({ guid, encoding: ENCODING, index: i, final: i === serialized_packets.length - 1 }, serialized_packet); + } + } + NET.emit = emit; + function listen(endpoint, serializer, callback) { + const buffer = new Map(); + const listener = function* (payload, serialized_packet) { + let fragment = buffer.get(payload.guid); + if (!fragment) { + fragment = { size: -1, serialized_packets: [], data_size: 0 }; + buffer.set(payload.guid, fragment); + } + if (payload.final) { + fragment.size = payload.index + 1; + } + fragment.serialized_packets[payload.index] = serialized_packet; + fragment.data_size += payload.index + 1; + if (fragment.size !== -1 && fragment.data_size === (fragment.size * (fragment.size + 1)) / 2) { + const stream = yield* deserialize(fragment.serialized_packets); + const value = yield* serializer.deserialize(stream); + yield* callback(value); + buffer.delete(payload.guid); + } + }; + return create_listener(endpoint, listener); + } + NET.listen = listen; +})(NET || (NET = {})); +export var IPC; +(function (IPC) { + /** Sends a message with `args` to `channel` */ + function send(channel, serializer, value) { + system.runJob(NET.emit(`ipc:${channel}:send`, serializer, value)); + } + IPC.send = send; + /** Sends an `invoke` message through IPC, and expects a result asynchronously. */ + function invoke(channel, serializer, value, deserializer) { + system.runJob(NET.emit(`ipc:${channel}:invoke`, serializer, value)); + return new Promise(resolve => { + const terminate = NET.listen(`ipc:${channel}:handle`, deserializer, function* (value) { + resolve(value); + terminate(); + }); + }); + } + IPC.invoke = invoke; + /** Listens to `channel`. When a new message arrives, `listener` will be called with `listener(args)`. */ + function on(channel, deserializer, listener) { + return NET.listen(`ipc:${channel}:send`, deserializer, function* (value) { + listener(value); + }); + } + IPC.on = on; + /** Listens to `channel` once. When a new message arrives, `listener` will be called with `listener(args)`, and then removed. */ + function once(channel, deserializer, listener) { + const terminate = NET.listen(`ipc:${channel}:send`, deserializer, function* (value) { + listener(value); + terminate(); + }); + return terminate; + } + IPC.once = once; + /** Adds a handler for an `invoke` IPC. This handler will be called whenever `invoke(channel, ...args)` is called */ + function handle(channel, deserializer, serializer, listener) { + return NET.listen(`ipc:${channel}:invoke`, deserializer, function* (value) { + const result = listener(value); + yield* NET.emit(`ipc:${channel}:handle`, serializer, result); + }); + } + IPC.handle = handle; +})(IPC || (IPC = {})); +export default IPC; diff --git a/scripts/main.js b/scripts/main.js new file mode 100644 index 0000000..9646470 --- /dev/null +++ b/scripts/main.js @@ -0,0 +1,97 @@ +import { CanopyExtension, Command, Rule } from './lib/canopy/CanopyExtension'; +import { world } from '@minecraft/server'; + +/** + * Create a new CanopyExtension instance to define your extension. + */ +const extension = new CanopyExtension({ + author: 'YourName', + name: 'ExampleExtension', + description: 'Example extension for §l§aCanopy§r!', + version: '1.0.0' +}); + +// -------------------------------------------- + +/** + * Adding a new Rule: + */ +const exampleRule = new Rule({ + identifier: 'exampleRule', // The name of the rule + description: { text: 'An example rule that prints a message in chat when you hit a button.' }, // Shows up in the help command. Must be a RawMessage type (translatable!). + // Optional: + contingentRules: [], // Rules that will be enabled when this rule is enabled + independentRules: [], // Rules that will be disabled when this rule is enabled + onEnableCallback: () => world.afterEvents.buttonPush.subscribe(onButtonPush), // Function to run when the rule is enabled (also runs when the extension is loaded, if the rule is already enabled) + onDisableCallback: () => world.afterEvents.buttonPush.unsubscribe(onButtonPush) // Function to run when the rule is disabled +}); +extension.addRule(exampleRule); + +// use the rule to control your code flow +function onButtonPush(event) { + if (!exampleRule.getValue()) + return; + if (event.source === undefined) // Always check for undefined entities and players. Simulated players always show up as undefined in events. + return; + event.source.sendMessage('§aYou pushed a button!'); +} + +// -------------------------------------------- + +/** + * Making a second new rule which we can use to enable the example command: + * (This is not required to make a new command, but it is helpful to allow admins to disable your commands.) + */ +const commandExampleRule = new Rule({ + identifier: 'commandExample', + description: { text: 'Enables the example command.' } // Shows up in the help command. RawMessage type. +}); +extension.addRule(commandExampleRule); + +/** + * Adding a new Command: + */ +const exampleCommand = new Command({ + name: 'example', // The name of the command + description: { text: 'An example command that prints your message in chat.' }, // Shows up in the help command. RawMessage type. + usage: 'example [message]', // The usage of the command that shows up in the help command & when used incorrectly + callback: exampleCommandCallback, // The function to run when the command is executed + // Optional: + args: [ + { type: 'string|number', name: 'message' } // The arguments that the command takes. 'string|number' means it can be either a string or a number + ], + contingentRules: ['commandExample'], // Rules that must be true for the command to be enabled + adminOnly: false, // Whether the command can only be run by admins (users with the 'CanopyAdmin' tag) + helpEntries: [ // Additional help entries that show up in the help command + { usage: `example`, description: { text: `Run the example command with the default message.` } } // Description is a RawMessage type. + ], + helpHidden: false // Whether the command should be hidden from the help command. +}); +extension.addCommand(exampleCommand); + +/** + * Adding a command alias: + * This is essentially just adding a new command that runs the same function as the original command and hiding its help. + */ +const exampleCommandAlias = new Command({ + name: 'ex', + description: { text: 'An alias for the example command.' }, + usage: 'ex [message]', + callback: exampleCommandCallback, + args: [ + { type: 'string|number', name: 'message' } + ], + contingentRules: ['commandExample'], + helpHidden: true +}); +extension.addCommand(exampleCommandAlias); + +// now you can define the function that will be called when the command is executed +function exampleCommandCallback(sender, args) { + let { message } = args; + if (message === null) + message = 'Hello, world!'; + if (!isNaN(parseFloat(message)) && isFinite(message)) + message = message.toString(); + sender.sendMessage(`§aYou ran the example command with the message: §7${message}`); +}