From 53558f5c1d5980823668abb5fa4d500f055be780 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Thu, 28 Nov 2024 23:31:01 +0100 Subject: [PATCH] add zmskit example for zsmkit v2 --- compiler/test/TestCompilerOnExamples.kt | 5 +- docs/source/todo.rst | 8 +-- examples/cx16/zsmkit/lib/zsmkit-0830.bin | Bin 6122 -> 0 bytes examples/cx16/zsmkit/lib/zsmkit-8c00.bin | Bin 4643 -> 0 bytes .../cx16/{zsmkit => zsmkit_v1}/README.txt | 19 ++--- examples/cx16/{zsmkit => zsmkit_v1}/demo1.p8 | 0 examples/cx16/{zsmkit => zsmkit_v1}/demo2.p8 | 0 .../{zsmkit => zsmkit_v1}/music/MUSIC.ZSM | Bin .../{zsmkit => zsmkit_v1}/music/PAUSE.ZSM | Bin .../cx16/{zsmkit => zsmkit_v1}/zsmkit_high.p8 | 0 .../cx16/{zsmkit => zsmkit_v1}/zsmkit_low.p8 | 0 examples/cx16/zsmkit_v2/MUSIC.ZSM | Bin 0 -> 112583 bytes examples/cx16/zsmkit_v2/README.txt | 14 ++++ examples/cx16/zsmkit_v2/SONG1.ZSM | Bin 0 -> 26280 bytes examples/cx16/zsmkit_v2/SONG2.ZSM | Bin 0 -> 2931 bytes examples/cx16/zsmkit_v2/ZSMKIT-A000.BIN | Bin 0 -> 4563 bytes examples/cx16/zsmkit_v2/demo.p8 | 66 ++++++++++++++++++ examples/cx16/zsmkit_v2/zsmkit.p8 | 37 ++++++++++ 18 files changed, 134 insertions(+), 15 deletions(-) delete mode 100644 examples/cx16/zsmkit/lib/zsmkit-0830.bin delete mode 100644 examples/cx16/zsmkit/lib/zsmkit-8c00.bin rename examples/cx16/{zsmkit => zsmkit_v1}/README.txt (74%) rename examples/cx16/{zsmkit => zsmkit_v1}/demo1.p8 (100%) rename examples/cx16/{zsmkit => zsmkit_v1}/demo2.p8 (100%) rename examples/cx16/{zsmkit => zsmkit_v1}/music/MUSIC.ZSM (100%) rename examples/cx16/{zsmkit => zsmkit_v1}/music/PAUSE.ZSM (100%) rename examples/cx16/{zsmkit => zsmkit_v1}/zsmkit_high.p8 (100%) rename examples/cx16/{zsmkit => zsmkit_v1}/zsmkit_low.p8 (100%) create mode 100644 examples/cx16/zsmkit_v2/MUSIC.ZSM create mode 100644 examples/cx16/zsmkit_v2/README.txt create mode 100644 examples/cx16/zsmkit_v2/SONG1.ZSM create mode 100644 examples/cx16/zsmkit_v2/SONG2.ZSM create mode 100644 examples/cx16/zsmkit_v2/ZSMKIT-A000.BIN create mode 100644 examples/cx16/zsmkit_v2/demo.p8 create mode 100644 examples/cx16/zsmkit_v2/zsmkit.p8 diff --git a/compiler/test/TestCompilerOnExamples.kt b/compiler/test/TestCompilerOnExamples.kt index 81bea10e6..ba33343c3 100644 --- a/compiler/test/TestCompilerOnExamples.kt +++ b/compiler/test/TestCompilerOnExamples.kt @@ -114,8 +114,9 @@ class TestCompilerOnExamplesCx16: FunSpec({ "pcmaudio/vumeter", "sprites/dragon", "sprites/dragons", - "zsmkit/demo1", - "zsmkit/demo2", + "zsmkit_v1/demo1", + "zsmkit_v1/demo2", + "zsmkit_v2/demo", "banking/program", "amiga", "audioroutines", diff --git a/docs/source/todo.rst b/docs/source/todo.rst index df7dbbeca..6bde558f6 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -5,13 +5,11 @@ document the @R0 - @R15 register support for normal subroutine parameters (footg make a compiler switch to disable footgun warnings -upgrade zmskit example to use zsmkit v2 - what to do with bankof(): keep it? add another syntax like \`value or ^value to get the bank byte? --> added unary ^ operator as alternative to bankof() --> added unary << operator as alternative to addr() / lsb(x>>16) / lsw() -> added msw() and lsw() . note: msw() on a 24 bits constant can ALSO be used to get the bank byte because the value, while a word type, will be <=255 --> TODO document whatever remains of those! (and add to syntax files) +-> added unary ^ operator as alternative to bankof() +-> added unary << operator as alternative to lsw() / lsb(x>>16) +-> TODO document whatever remains of these! (and add to syntax files) ... diff --git a/examples/cx16/zsmkit/lib/zsmkit-0830.bin b/examples/cx16/zsmkit/lib/zsmkit-0830.bin deleted file mode 100644 index 7a4a97221eaeabacb3091f2186567bfb7781c448..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6122 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 diff --git a/examples/cx16/zsmkit/README.txt b/examples/cx16/zsmkit_v1/README.txt similarity index 74% rename from examples/cx16/zsmkit/README.txt rename to examples/cx16/zsmkit_v1/README.txt index ae8ae2252..768985bcd 100644 --- a/examples/cx16/zsmkit/README.txt +++ b/examples/cx16/zsmkit_v1/README.txt @@ -1,8 +1,9 @@ -Prog8 ZSMKIT music player library integration ---------------------------------------------- +Prog8 ZSMKIT (v1) music player library integration +-------------------------------------------------- -ZSMKIT: https://github.com/mooinglemur/zsmkit +ZSMKIT V1: https://github.com/mooinglemur/zsmkit/tree/v1 (evolution of Zerobyte's ZSOUND, by MooingLemur). Read the README there! +Note: the current version of Zsmkit is V2. See below. DEMO1: LOW-RAM ZSMKIT + STREAMING @@ -37,8 +38,10 @@ streaming support or change the load address you'll have to build one yourself. See the "alternative builds" chapter. -FUTURE: ZSMKIT V2 ------------------ -If all goes well, there will be a zsmkit v2 in the future that has some important changes -that will make it much easier to integrate it into prog8 programs. Less RAM usage and -a fixed jump table location, among other changes. +ZSMKIT V2 +--------- +Zsmkit v2 is current and has some important changes that will make it much easier +to integrate it into prog8 programs. Less RAM usage and a fixed jump table location, +among other changes. However, it requires the ZSM to be loaded in Ram completely +because it has no streaming support anymore. So Zsmkit v1 might still have some uses. + diff --git a/examples/cx16/zsmkit/demo1.p8 b/examples/cx16/zsmkit_v1/demo1.p8 similarity index 100% rename from examples/cx16/zsmkit/demo1.p8 rename to examples/cx16/zsmkit_v1/demo1.p8 diff --git a/examples/cx16/zsmkit/demo2.p8 b/examples/cx16/zsmkit_v1/demo2.p8 similarity index 100% rename from examples/cx16/zsmkit/demo2.p8 rename to examples/cx16/zsmkit_v1/demo2.p8 diff --git a/examples/cx16/zsmkit/music/MUSIC.ZSM b/examples/cx16/zsmkit_v1/music/MUSIC.ZSM similarity index 100% rename from examples/cx16/zsmkit/music/MUSIC.ZSM rename to examples/cx16/zsmkit_v1/music/MUSIC.ZSM diff --git a/examples/cx16/zsmkit/music/PAUSE.ZSM b/examples/cx16/zsmkit_v1/music/PAUSE.ZSM similarity index 100% rename from examples/cx16/zsmkit/music/PAUSE.ZSM rename to examples/cx16/zsmkit_v1/music/PAUSE.ZSM diff --git a/examples/cx16/zsmkit/zsmkit_high.p8 b/examples/cx16/zsmkit_v1/zsmkit_high.p8 similarity index 100% rename from examples/cx16/zsmkit/zsmkit_high.p8 rename to examples/cx16/zsmkit_v1/zsmkit_high.p8 diff --git a/examples/cx16/zsmkit/zsmkit_low.p8 b/examples/cx16/zsmkit_v1/zsmkit_low.p8 similarity index 100% rename from examples/cx16/zsmkit/zsmkit_low.p8 rename to examples/cx16/zsmkit_v1/zsmkit_low.p8 diff --git a/examples/cx16/zsmkit_v2/MUSIC.ZSM b/examples/cx16/zsmkit_v2/MUSIC.ZSM new file mode 100644 index 0000000000000000000000000000000000000000..8f5eb427239efa10ba953b2b3c36d3a847cfb423 GIT binary patch literal 112583 zcmeEvd3aRS`Tw2CWHKZ-lbK{Xxih($NCE-UBrJ(A3Bytl6cPGFmv+sluuY!YJ&Zqv`-v&I1|$E$@s(- z{!xN^dgdqGYaYhCF6)!&R^}el7&8-0xjXIdjJq@M&bs@d8{seJhm+5;|1tfK?z6m`A5K2o{-^XmxzF}~34cj= zIQd-r!|4yZ&-HG7IC-x9&*^`5&-HGDzgQklKHvUm`lIgiy%i59Uub_U{W152-ktE5 z#D|$NCabwVVPf({_Q%s7cVFb)6*M0Wn(Kn*BlnuaLGz)YxhiP>I%wV-Vv0?P<_61{ zM60zvX=3sv_9xPxa9`rx6Eq*Q!dL38@TEE{eC@Cmz8JQ`R}Wg@%LlCR^{=h)17TBw zxzSRbm}qTCzRdnq`cv-9y!(RYZ>`6I<_2p${*8OhwbsKy;Wxgq9t@hRtq1ULgz!?E zEaAiiYh&_H?f*#shx@1A{Xz3_>$gF3qqPD5#=YjF*4m)(8#UH%;03JJ_&0>*x8UVB zC0}8GHvL)m6<%0gv-Nn;++=OUzj3edF8DW&SZl=BfZq@n--Z|8l6;l@`Sj=AS9uS@ z9$JIuR%>(6++uCQzjLqfK6p=HJH%Ik?GRp|1HV99^40bi(_eI7?S&<_TU&$XHfsz1 zjeCXn!Fz(YRN4;V1-`>C(2;zNeOdZ4_cdNvVyCq|XzsAK;orDdcptnccuS@25MH1g zzrc6N*V$i5f5m;B7nav$?F^c~vv%O$xL0@=yeD`|@oT_u2#fEIHfJFPQ3?xy&HY~JM{H-^z~Ns^(OT7Z_(F}p|2zKcZ)A@ ztNrctx81jT;l#Vp;^CWU`@Tcl2j6T)2il160N(_8k{16RUVOLh@#Lkf)BdhwY5Kda zgYKo=t6n&~PHUI#F*eO{s|zpjRd06b{{*KYIa=V`kZ?SFU1yO`y7|M zKIL9SVsg}WH{0#F*tJ%P&hKn@vEMl^bp4xq0c~Zc?M}AcG0*j(u#jJ~Esk?t|KgrU zJKSdb6?@z<$F&L`I4Wqno&DA^+qHswE`%4el&yEnbS>we#T#i`!qz&byIw^-RU?^C|HSBIjvFkC!G%dEP*-FQcU4P-83Yz!Wu3{@3qg@YiPln99tjBE& z*lmt{*B^uCO6#|_%h@fCJl7w%CxYgk)_U8e>=%yHTp@VK$e?*UEaYN#qa)k(d+zT+ z>tWk`c7wy~x-(>6XFX)Qfc?~w>H0PIc+gsHo5!woxLkJxtyQ*j*^eAf*HZ3pLF?DH zv)R>-G}o;`>mJ)#?1v84wU~P>WZh+(&Hl?V%(V!fGa_iMw4K4e>#(}6=l&YB?zGKd zS2_}0*Km&pt=nzW*%c0xYhlnfm3`AO=rp^o;QkV_uCoQ$HynMg%Y(LZ_Ekr>>tgQD zL7Sg_+3}t0Lio|Vplu@ilB3-=CFN`toH?1PSduJPO-gSOMy`yIPo#UY!Iz0XnU`Z4!F(8jYNM}=#2(B@_D zc5HLybN2^r9DA2ziz^R)b9m6^X76--;W~}`L&)Z0f9=@l$`0Dn*$;^Lda%fuW_t!nYep`w#YCOd$r?D*Wi!LLE8X(mE#Rp zA9r`q*2gYzyz1%>+Irc`9WT4S<9;8qb+eZ`UUId=@8$$;-?0}vo_DnbZ5`}<$Fr{E z++9Ii8+(D{Y1g+wTPr)y@uaJs`(4P^%%1Cb+*KR29cRyWJmxyg-5Iof%bw+U)b&l! zc8s0vc*IrB{WfT;XU}jv5ltdyMwkGcBGA<}M&M(7iORzrbVxt$!CNZTL{UntnOf z^a~O#NG->!-_b&vEX$F8k6){!<+b4D0o}%{%hB@MENFQ^@$qVJw7d?yJYeg1bv9bw zcX)ZAVB^))XnEaud7xI~)z4^oy?A+`i{jPFXnFm3d7%H|)x&6c{djr(@oV4c^59GH z>RhzEZfSY(YFf0s@9^@v!M;esniXqQtiF(e1lk!?C037EC1MQ}!h#?iFl;-v13>R$ zC5MbM_&hcSKzHHKV@(xe&=T9E1IF4Plp;1BkRd1-56CVC;Q`Ht49deHb2VNbeCz;P z%YKByy~teH6#_K`7Q+r?5mz9C`YSMot>KXQOJv4wMyBvaE7%7ctb2o?hIWOlJA>98 zL2E_O`qjPGFN4<2LF>k#bwkj)?!{!uN*N3+n_`-}ZrZfzHpavRO_R;0VBn5m;M`zf z^wjmifGregoWcZ?Z?UgPU*W#RI}q48^|R>~(|EHv82EQE@Om)t_o*90fjS7`hu{&{ULFEH`-rMf8Bkfw+q%+CH>aeV4xrb>pLi|PqK5r!|VG7 z)|bHCEAC$i@1L}~AV$ws3Ew4OZ+|uYRrmGY&cIILcSGi9U>D7o!akZ82L2v2KMOl) zzAW&oka?kOh<5~T7S{@Yz6$;MqM-Tez&SzlbAg#5^X0Io=BtyhwZEMHvin+Zd*F0& z&G6^3LHKh)(EPJNe#rbh?5z2xu(#%)$v#3GT0N}Y!rX_~4j;M$edyef`I^A!p!o&Z zVe%R`I|0URQ^Ob=>$b4P$<@Tr3pLSpFJr-U6OKAO9qV-=N0LyM!AU9;b3a$V82}t=VcbdDKQo18-57q{jg3ytkaM7@Rj8A?2n{B;yw@U<<-gO*dI!N$bAm%DboO7 zxD1~A6g>ASc~HT|#d z3xxCD1YfxdR`5Km;CWcVRm#(TJ$V5<`x$ulGw|#M!f9U%3o3>M6~lsxVL@=(LFNim zvUxEq$`6b3!=n7KC^+ws`Hkd@?SD`IyZd5v-q*<6Z#L z%~Zk{ZiXkn2~U0#o_w=>;z`T{=)^(GrOj$@pTE6TWgQJo{~U_S^96Ta~B&&*a7M?6=_AZ^5${3#Yya7E}xiDux9W z!-BAs-)>4b-v*2F!=n7KC_gL;PCaB^A?YD>>Nm*?fm46PlmTB^3eSEQp8YO7d#Uo& zS0pciXRm~3uY_kWL8p#>;1+oH3V8Mkc=j#m)I&_0=||>Yz)JnFQa`NJ4=cr|{`>eEe`@ReV|vp;}me*n+^m3;0t=8uA;zn%O`SiyU+g7;trzeMLAf}i;X ztl%A3!8@>mUkK;E%*2_O!g~F%UO%kY59`I}zEZMf(77*`j1fW7Jti-F=@wYS3RuGm zSi>#Ra}SwU0xa_YmU#fnJb)!;_QlDI;OTF`)8BxnFA~oEbyJr4mmofV5FbB?j~~Pb zpZh9Ft0P(exuk|c-!tc$vf(S*XUpuqO80D#_MhvX4eXw5$}!)rdp5B9JMy!^YPdyy zHk^Bn=`{F?=Gol)o{8R7SrLin(GO_epYwTdLm0S4yAJL_&*|P(i1GKDa?N*WSHpFB zO5vMele{afiMtj)516=BS{GO8DS^)bG8#;bc`zZtaz`R#9Y`v$EgzPUJcn&aWdse) zo#9%p#(b;N+RpZmZw!F!v3O`r_L1bet2dsq2i z3uK0vZz0ClB~c;wqGvpO>hVAi*u4*O-wbN2-fB0r&>d(<-y{`#xH#-Mr7I-uLL zWccjg%2t-wPL2fL5p7mvE1Ti@y4}0qGuC@sc{uQV2(3rAhY8+Q<%a?fqX=Y|ZU=*& zV)$-V;4ZvIc^6Iaov#D8;kC*;8S)gtXZHlI3o?65CfG}drGc<^3+&_W(@o{=fy>36 z1N%KhT=^e8h472bfq8f*bt_MWRU8kTNnZKmo*%<^8v@hRE9c=mM+1KK%3t*qz-NyH zCcq&f6j<&ctb43*{^hlSqF6irZ_gO`y)e@Fq#ZvC@AwGvy7zcS!*{C!r>WO{J>GFX zgwP@H_;;RB@Yy{94+I$#rdg5_P1aqKMaliqyK3Te|H3kpgj8|23(XdY_;Fc)uQI@> zwSrse$p<`T1~P-zZ8AR3fWP;YF$kX_>sIc7XC!>)AmG#bCASp*wh?0!&KS#!4xuUV z^d<3Q^i|IYykpOkcWgS|v4=xMj8=K_@Q!IP`Ww7s8jNP*{Q`uRV}$aSX9*|$fhQNv zx=f2vvUFVvzX%8=%T~8%IIMz-(SN{qbqJjb-_Rkn#&a5c77!W~5Q_Glu<{2;7$wUV zl4~kLcYAX1j#Dst7kpQTP{0sy0MTD`^Lk=UlE%|<=ZwBVV2#2 zbg-icX<^q=q=&gj;hS-D>kPb$6x4QjvhXfaxb=0si+6<(`^(JwQ@o2B)TZG*lu=uN zP-|O`*WZBGzZ9>3Enfd;9xp<#nqSG-y%TX9-uO$kf_h#^9Yj)z4-`y3L|m{w)qMyiwJAI6xO=qbS55sp9{Z7<bUhf7*iMBti_s(QG$cI+9LhC$oPaE_NwLgu9|Pia z4Eiv9LcyR5;4`v43bqv88twNu;IjnIBx|0p@NQA?_yXQ53Lbxf_ez6Du*>zfsHo>9 ztwXj%8$4;SZ#r9)EJvTfv#DJ9H&_Ez%P)d&>X=g0@@gqUGNfQi@I?r?Z1C98X~&1m zPvIA-$b1U#HH9f}gKq*Z)!GSJt~wn*96m|0L3=%5qZ?VFm4GXeDOUi7fGI-?8}yIx zR|QXA1D_CiatizNA4zX+cMT#DWi#rC`>epFr!zeh#oPw-At zP>GmU$Cl_l0hMZ5s`VtpXE9$2-l)Rz1iN#SAo)g|xg0Pid+}gZ=oxbfd;&8jmJ;ql z_>9b$6X9R<8h z>1@s=DH9>oH4zGjR%T3et%Y#cMDBkGcuf%2E+zoEE8*7wr-H>MX8E|8@LU<6V!Dn) zp0k8X4)jVCjbd7j>+;y(GYX!>7Nu>$FblSbN2QwZ9N^ zqVsLMyA*Uj0pHZ2^Y?gnHM;yp_$2a*lzuy#DMp&+Q909uJohp{mdKg80%t1yc93c% zXLfqPUPP=J0>Awb{7qy{nsxalg*7R$rGMeQq9D;wm;VXxmB#zI1MigviHI$5;l1IUB>k=cDFoc6hJ+Jc=45jr{U0lU|qd>1^I7m=9520T{y#!(a_X_qQtxd!;;5#)Iq*_wM{y@IV7Gn)4q{2n!y_YORt8q0eDzNw4k zA#X_+$@?vQ67M*UhLK~Uj-^g>`h%{uu;X*MnVtl1Br8CUkK(Mq7$LPJE6x= z_cN|}_6h&E9EbGn6%o(HLSdt~0<;=;8(+2zMQPJhy>^oo9+)_LX;YuY93QUphNbfq|SvpjaV;fXN zAv_VI>%MysnpEf~V~HHCL=sB07@@=qM=E7rL#!tF`(k|3H(kMHGLI20M14#$ZZ1Q} zB1Xli$ih3Kwg-v0k|O5DvB$L@Gu8u|=p#`IfGVjhHieF|R-pH_*=As}fDUayj9T9X zQ@Fx+Ax0m)4O!*B3v#CEa7VU!VC6LX5R*L(eOVKHf66J>@fjv`t^b0FoXl$6azWeX zOfXJANW9x>Pe$Br z$nWT*lF>aT$0h~VR9S;y*6HGs3&0)}cT&Njl0AsE3t9y=J_#?hz;_4HA|&e-c+C^E z2z~DhHla$xz(MFR8jnrL@!onkZ@pb;rAQa7o6e|$T}YEJ-gnl}_*BY65@VDYrP>H3 zd9MYO5_J}a7L`k<`TjUGgc9sSZh^o7G#-Uq4xm%;wK2prnViFb%mqpog=`MSrJ6@k zHiu$40yYmLYz~1%Pad7B$^rqMDjO~8u^2@udCW%TaoUq;TVkS>DBxrui+P=^r)F^r{@Wtm*YOCwSHZLMOzqJh8TyvO9p( zF*+8-B#88VG{Zyir*-*pZL|{3T--f^O=_TrC|Y0GLvmDI-b1x@Dq2hG7?HS#viBod zsibHnk7a%W4Yy*%676UduVTa!?QGOC6(g1ypGs>~z@;EjV$2d#+0Y`E(VbRhAWs;l zWZ9B&s*)_pA|>OL7_*FJlO{pr5~EaRQ*4tevOTbm8k-c@bSO5duwz4DQmlK({*q|N zpE_g)8AV<^M)XqjqH-n>Vwg!GeGF5?Dk+93A{HvU^f62@E)<@WI+h7PiP%*c$rLfX zF=Q0UghQ-H`b-ziB;ytya*~!-{JLxn&YE8dl{57)BVi7^Ak|`j(6PqJKooO1WC`Zr z7~GnPzc%pjkzmL^J|Z1G&*B)Hz_M7TP;^c9_fb?$v{MrtgvcdC)JVKaw)cdX8kt#f zOpTla5@Tv=R>d(jHKz(O%R5Y{l9RWr(XY1jc1F_Bu^3 z#F5sB^&4=iS`V*ujV41*)=pGUo*qMbQ|G}GV@M$;2O9HsCzPq{G7Vyq%wgyotgu#M zi<6lJop(ZX5=xWJ(0(V^W~yS8%v0t~)~z_h!<-LYd0*mKB_r%ig5^q7&78c%zA}BK zdkKzH{+fy~Sr+AJkra2tNS3`A0U15ms{NgQ=W&#=TUCEXM+VWhLdYO`D%2RGN>hp0 zz_=wK14kIw#GzFYHps}Oc_l)8QN>9_Yy=rWt_rYRiB&vEp2*yT<7YDO=s1TSTMP*} zun=|u$p;k)+W3cz3~ddzj1+CCm`SwY1a87#N0CJhKWTeHkOhSI6ST2Dk4I*5!J0GLRf;ty#FK{@ zT?{b?G5;;m^B)(DdsWB5f`;e?A5*T7&}d26ab=1}N(KjjMrU55Otd1VqguHE_llWK%d^;` z(J%(aEUKCNPhu8gIw%7{;$D?ri{h1N0mh0tYM3_|gLye!6fz_*FY@7VMn}uNLR2q- zvXfFolE}P7PXrDvmKR5~=1v5?FJso-f%+ey0tj_**l~<%2l#QQhocDUQJ~%naEvM{ zmZ?!pTs;nU(0mjeSfVm;9>gVaJ%tLxG3qH0hvB{>u>++Dtsku&tsB==l&Minmc7^& z6-4IcmV#;p&mXX?udD#X=xZyoQ1uGrcQ9`N`wGkz%HCiAXP=RmlbYUO*d!dMBugC#xFRp9w;NQx6y`E)Hvn#l-EzoQ zs}}fIja&Lolf5eZD4J&lxIkI|q2_!j*6#u-`%AHYlR|3iHx>sYg)i)>lur*DSie$@ z4uyfa!-5S)wteZlN{$4HyGpfv4~tq&6AvQPu^|f*=hZVY2c!NTi3Nn1I^@!UZn9B?R^y$bNzDR?oDH!8L9U;~{d!_Ixl}m`5l6IY+*5AInaK0UwjtU*0%PI~q?Rq^ zy`$#EMQd*wi6zN8$ABdfIH*=CI$yzdBB4yrH@J??pjtBOz3OTv$&sd$@Ug_4gf1c} zSgLxvFPh~c)=Zw#+#^xLL*DF7A@`{AtK!e;2vz7=dB*icD6B2!a!^oP-MN$H1We}1 zTnJflFjvItqMXba)s#8TA>?qtU>SPN8;annk*M>R1g0~{e|tOi8APJgP(387XYXx^ zHv(?hk>jn6Gs}(QoW!^ZH3klWWO5W-B@f7Mlx9IFx^Gb5w|94pjCRJ|2Jz0D75No8 zw-RS9B?L4;i_67^IuoDx}5o*MZvx=wCQ4>y_F5W0wQ11h?F({)@% z$*u_6i&!zKM;00TLq=A-5p-4OjKEkFTMkXT5SdC-1qo1yb{FCdikLkCJA=|6GX!Qb zL=Ta<1@x#`o5D+qT(Z`Sh^w9vbCSNA5n%>(yJ#YfB4VNyj2JJ``b8nGXi&ST>!T*y zW{8K#Sf+Ue@uG#$GfnB2PQo}g;2vrnH?bGx)NlbQMTqUIC5CURE__$%TjQKEtRl~XFYA$o$=YrtG$_QhI(ZGUzBA*@4+l|*?=jQLr= z#9xTfBP~Q6C^g(fM#m9FIsmYAwileXE?O=6nv$nXp3@_EeY#F*qAouP z4*-YqbviS){ZH<1LB7kW#VBpRk>?`px4Pp6?>D)Mn_#U$Rz*Zf42vyhRt19{qX1-H zQHO}*)KcFxMr~Yu(_*d)i2$$_xr3UlXK-;7&1(=PpBgVgyE;T)R@*y6s!9~&s6yOQ z9kmwZP_9divTd{~QNgm&szi|+WaKJYRa2KJ`4Mq+Qj7V)p;UJpGAsqX;vUDJYav!8 z0&;P+Cyil+szk|;MbQ- zBoex+G223SrLLzMOBag&5$X}K^5!dq=s%z~?utai-fHgwL0yw-5{ViP#3WWWi;UTF z-~H5%V6{acc7KEzs3rkR#-JvVlX#)LG)842O7=<9DqxrOm5E#h7L}m zD8j3^uV5!DurS2yL7&844!M)Ypi&X%0^_Szl(Kl2P9+xg;)+TpG~t~YDR5;0{mOCDsw2r71IM6=j3MJs7gM=k#-ZFR zul0fuCPOfteUMlmDZ2l0V$lGJ)JUPAIK|AIdX6rftG2Trt9I<60}e^MdMZ&!6{xN}_g%)$1bcr#fE}qr!n&8|fXy@~x?hBuW)7qoMLA8c#y2%kd6C z{^_QiJlXS+Bn*!s(e@02as>6-1EDSwD#jN9C&X71i8E3|%%@P|n5qb#fK;f$ zFsgtoHL81*?L!@3N)_Zd3a8GfkS6S$ny4nxiXucabbNCYGLVNtMp&%*6GPV0lr9#; zjRyH)1uqI&Vwo3(Nfblk#n6!I7g6!<2{0p3d&i0e$rT~m=(Sdp;~&DPjkA6c@9(rY zE5QtOI{**mbVzg40l`=o=~&Vj!Pv$`^QVRR+3M;=Tz98NFiqxYxgJ9VbH&IEmo&WE z)-=}el5FmvkXpBhB@jEw3h$a!g~Q*a@vOllkStDg{>bJuu3`SZsut0>HhC8{ zdR^E>%>*;SP6E!QRW6Dn+rTr5tKt?tgsRyQS<*B+V0O7=k7{L3tJkCUDCkU5$KtK@$+&f#BGmqGx?ctwzS+2H;JDFeg&AA`o9 zTsz-RBK5oXAhq zRPS-N=pPN9yYv$!F{1eF%+24~ld1ZaNz6yj_pRBtA)x#)!wnN3uU;;O{t()cutMtwCVm%^uD?$lRga)=~R z)m*eDlS|+eFb<=2nHs8r;+ynH zY~UL(5(zUUkMc)pm77>{xFh@##Fki6xNrDx^lS;{j*>0+^ZR8#o!iUrrQ4dj_+2D^ zBx{!){0=%2f%oZ1+`@0sBXKjoSd;Pw33}G5;}L zlY<7*GvkN+hX|2s>3N@jU&)N*I?i|bcjINoRs1SC9#`-y=*;*Q{}#fdS`UE^)Z_6r z{xupizRbT&V@7mW0~o3jGrqvTfGkVJ#53ebDVgyf{68dSe2RZ6mSqWQbSTXDIR7}p zBUyty#y>{KBY1IoJc327$Kyl%LkN#jw18Z-`5^zG-m)ai&;$GfbUgln{{tP5U<~N- z2p*_jQ{ThigYYO-z>%%W-}AqZ7mvT=e@DmTZ~5QS@rXQ*~ z%{E}9#IPx`MGQL=8ip1)p?QLwM{7`>LiR*6x`rXb9;w30rF(6_14IZFq)M#E zx(zC;XVLKG2Jexn8j>0+o9E3t*yp21HKMSEytx>>s)}s))@|Ym zoHHPChN zJ>&{Y^4&G$N_NPjoM^4;o77rWm9D|*IE>WqvA&WhT_<*XjX{0o2~<}Sb3j6MB~dRy z?EPe`E90CODdu}HZ)&saFfa0EnLUMyBW!2JF)xx_VT5HtMxHF6FfB6LSuM*Ul0RI< z2K_LEIe*@YxGLDFc3@P~YAQ5fRwQ|js0!bL#zpKvteo_&D~+dalB!v$T2<(uR%r^I zK1I58h?63*bs|R#5km>Mly0FBJEw8RO19_(YmQnCNvnk<+HeRJL?1&&iLMediW#Yf zM#heG)4jmqv`R>EUa}TPL^}xT;Aoi>XpyAlouMrC1aF-IWRYqiy@$jbXW~H@uH8Ga zdLJQMs*Y4klOR-bAZAMeZ{++l>b64nrO@x3If0rVakhrUP2$`#$o`@G6SP%70+UM< zZ8g=9T#Sj4M6BX{rDUN|6#~uM5V0`CiIKrmJTa0eWw_{phGJN^@x(}#H6N{?FsO{g zlUUHqz-jvGNSgdnYuAK5C+7jhTsD0IpMLE)?*g?SM)i^>J~2|TQKT&P0(ozhxojbi zjpYn>lb*%SDj(v!NU4L7Xph9I=OuR56zMn@7(tx(glnfLm6kl7{Y97dT`#bbIYK-bF5oU)nF_JECwA^*p(C?_Buy3q;YNFhWeQ3Gbl02&yiVIP<;LT8X zVO)n^inBA~je?ZgAHc3~gH8PNB2NW+HT6FTy;^-HqBq`(OKJA$sicL`Rl0RuoMvq8lrU3*b1h8T5g!hJxRYD?p~HCnZ$bc0QtNLAcpLzxpv_O}sI z=@ss3X+x@8sBkCOT1tBzcWtmCO3CXzk-Katd@FU`(yU#5y=AoXN0^1C^}&I0rQTa( z&YgmznZ}$e>?YYar|4a(Ulz++7&2~yjK1Dd_8#;Vmsrk_yyJ+ax!2l*H*H5L~1 zc1bq`q0Sz;?$U?jljaU#8ESHHV4I#aNJDImbfcfUE?dn1(aDZtzRf2FU}0O z5FMacderEEh)b9fA!m4`NCv=%UY9PMH)Jgco%TpG>1J%ub<&AN2ZY(hL(uB#ZlHtG z{8z(Sk)mx{jk|W`9?AXqDkL;*LuAT*$A(m6Z-s*8v1$SJASHnp;g*zNC?at zb}UPO5N1bi_B~3^aAO&f`A?UlL6`q1s((~5P_YI8$)niav_m+^R@+ zY}O-j9^9dG07sH^yhlVHj^0stPmClHWdzoJlDFu{yoaM-u+Ih)++_B{{oz8EWTf%i9rebI?SWfX}quJyLg>Fhgt5l1aHw2Vr1B zX;HlQ>70zOE=HA9Yd2tGQT8kk>1-!-4+)BnX8zaSr-SYwiL&qlfh8!_MHZ zDR}C14u>o6ez?-F>VFa+QQ;(O5Lf9(&ojJ(|`x! zuHnRBqglR~G-=gyP~Y=D%umzS&*3pJI`&0y5~`9Q-UxTo%5{=Ri@|+LSdWQ!D&f&z zNR#E2-X0H*{SdXF*9bt|g64ezYn;%{IuI`-AsO3mI|U|IBbqFKcq#~4`b2w}WMl*{Z7z`bA(z`bB_uc2rMpF`|dPd+0h&wgK8Uiy6*dDxc|I@gnDq!imjX~pTG zjACr~$uZUQQ~dTv)BNd=X87Hg!wySveu$|G7UW#}pVR-0ZHI$GcIRCC!|4x;mM>I( z_TYJZJgJ^bn7>lmjc;H6@4Af#Re2fKfZ__5X{BonSXih4#Zrd0Ll<9woUgk2lWgUZ zYCr$W@8dD3|5V(^6X%poqbe+8Pfe^D(nYxhOPAuQ8C8LzNNb!kHZj8**=3a4l@qy< zhn$&;C(>G}jH2wK|7#%MM}=a(!s+f2clmC^zho=4kGYF+-CcA%$9DJU0_-0#$r8 zNWV=SVxy<*K5?RNLy3*5Y7Yd9kWwY8MG;ZkQ~ehzisHXb2QWmc1l8h)=&hhAJCS#& zQFh8iLG6Ble?qMHq*!mVFD=}tBh(oYYt9vS>qINg#Yt{LhFi@jn%LhEEVL7iv#Vld zy7-QOCF&f@Qq2TQDw@crM)M%zN0UKKroIxByt*N0ZsNrh^nU_h8r;)On^GAgcOy-y z)K{yIywVS)iC0HLU->NR8yhrh_J6Zl$uJSbYM4wHbnru zmHUMYigYm;9Hmuf5%EvqcsG&dP)G%>IVRf)k;CXrHF8}gtPR!pC~k`|x&>D1lBU#E zO1G|%nUJU@a7OF|eO2(W--r4I?QAQ&r|OyuaZjPAC*I0RJdrcb$$(Tl4nNi)gL4A6 z^dOd^R#nRP^qlO3z!ZY;MWbi~8S>z6iXRET@@CM+i1%P2@#{&LW{&hsMMIfqBA24+mC#0yp^RYc1uQdWf+?AwDR_ufVU-)LD{l;X(5) zv9W9nFkOqTC45Ze$OTd+wo)Zs@n}NVkbV-k^S%Ie8Atr&=H{ zb9=PX5?KZ~8VL99KqPY~sm>BjvE3HE*Sxg+OYL4NZrmx~C|9iFo%~eF#vuM#2Rn)4 zANo2100q8rC+5B8IetpD5uyspyaL!es8Q9-E6DN(H2NO$MQEmrLHtj;Ung++bQ@!3 z?l;XalW(g<*`dHZ@+m{(0Hvx8GDC2)PC$JF1qyNn{AyN&tWaP=P`o#xfaGmQ@6-tt z!CK8s$TZ$e?yX0GFiLG(P9|kqCAv*VlNrphYbx7NPcP9Loj6^AvO=>(zCTC4S0Y+1 zxlO8;^qr4!CGeZvHHm7V)&8{@v77j79g;-ch!~N`*!QS-LpH*LkT=9ApvLJ0TRM6} zPHZfI{Lrv~FncB~TZQx_#MpIrhHBA(egvU`7Q4gUA8TUcz)y+2phPNV)|qezy9Nmu z{2KoRfu7vs9lZ%hfeJ;9cab>b3`KV}yaUzUaQjV^ZxE0L-Ui?TXJcfLq(iv(Mu`wI zSKBFEL*W_U{hHg>H4GEiEjMxCiHasVmXI%rv81V*(M&DFBr0Huv~Q;dNkqIy@3hfO zDnnXC!z{2$j3y$xC~vb-APRU!s*kC}KUo&-WSIif0|%ck=D!R30grQs; zv9<^@E(9LZ-&jMLB!K0PVh!L-iw132?ld|L$sOo4YJ5++r$&i7qAXxFMA2wSGRZ6^ z-B6>|X-HDlIt?T?-n(gHG8w2Mauk`S&F;}Km}U+cVlHi@uMAfa&U7ZA3YXF{1=1w$ z5-lbTXZfZhMB$jM$W_=T(pyAIb|OZ_sN6)fx_$R((4ym}IB%L!B89jvP^6UFC<9%G ztI#wk0eMqnL}DicPh9GBRAPjTXJc(g18@ZJQ=MLi)5&Qrrq$Z`R8lH+T-%4l@^4#Xqk!W`M!#ugS) zB9Qk?(TQqnTePp_D4KSa0_K#6qsaxigG8{eh=_~c1EXOm1Ffi!nF+NucPa0HQJ@d_ z3QLGkRRf14RMkk;G)n%G>S*u{FtXi+DriJ56KZFWRUVIw#;%&7VGmiPWX%}8^F_mV zc*iuo^T>`6@MqbfXJAfo+e;h>giWC6M~p$@`2q&?Hv5D-X~l2d2llWj75 zVIi8SqrhDu^l?V#Ie?Q}7R@_QSWm2wGq%YLc~82*Mag?K{XpS8I`%+6z#Jki?ocQ| z!+Y2&gBm^*3n5lS%J;Tt_KVyNg7%JluFzpD$**Q=7-m1X*+rJ(XeXx_v5{s{VXbQv z0h2QbNy=TNaUf+^k&KWf8p()oyGy+KMD7+sePdAXJBMw6YTpMPOL5P~+8>#r((u_I z?sh@ZPU+NtxZ5SB{{G=^mzCwUlOr)@{D-?;uEWa-t8!{cyJn_ru*T zKiuu2pV;uj-7e$~Anu2|U4FRR<^S)yT~51yxHb29-n0=jM<(P~kD}F7$9LCDZcF|* za=$O!893zoUUED0YrnTUUvdZXkL&u@xl?%WOKv2;`G>n-{Px$NXZbbgS%z6zoW53_ zdiTq>5KqSU%)zuQhf_+t5ub&;;Q@*78W0dW%Anees(E(_po1zZ-yIgt;pY!VP!AfGR} z>Vumszb&oXhMTBBZvj4E_1qI~y!^J>SyLbqB9h^JJwd{)+#r442)ya?;R)io?#5W= zsr@)`PuLus^^ngJ)q{tu6@vUBtZHu#6Xb6>C?$MeO0A-lKU5bEw~0li56xG@c_{L| zv>F*i5=hoJWDoLxPX<*ve6m5!VFdpNuiEsqnwosvxw3k z%=kpmgIY{!pv9gj7~=pjutP)(c-9V zBKBMeZ&EOH?HFax=W(}0vSxPrP_?7Lp6Y%iwRSX+OsQ%~x~&qrrNNFtbB>fzazR4* z;TCMq)Qz@dEeR5;o_a)Pq$T)n7;M*^BKhP;S_GRXhJ32uTP2^;t*qqx(~*24-4V%~ z2UlV z<9$u}jbH(3?r|;3?FQqo$yh&rds-2;_4xc_qcf3I8f(WQ%sOD{fOU$dEz7#Gj;0%n zu=NJEjHDYw;Bm#H8)^4#V)+9M%F;*HjKoR^WSs(QDx{BC!J(EuVjUYN+NOZPlaxKh z9i0@dxB$x>vP_Fa%M{H{Y*$rB>F1S#PDGVEvMqzBPY~{bS6iio+u#M8bODw((IyQl zY8X`7FsQg6UL|Wm#^{!KkhR>l{JMgA{XOwyKKY5S7QFZ)1$9P}bvU;PBHZ|0m5WM}8mZyXxHf`~w9C zY5pF@CpX7;Ah$06>w+q!ulIFsZT`N310-*6U+&@jJq2HD{k%Q7HTk;=_Q_NDz|!2E z`%Qjj!5%z|k2Lob{JcupJKZ69r$fvf_4AN#EBJYi zq564}XB(f5NoEhFpNBkK@bgqXB5E5`jX#ZCDeA6t{1LS=5qk)}JRiRf6KqV$ucb}& zPU?o;W`=eI`g@^o+=rerkbyGa+t@WeolXwXNs;s+*&_Kwj6i(sDq=gc$Xb z%!y*;MeyqocM5)80WI=!tNrctx81jb9HQGkqqejxhqu^Qq_1$_LW*`Sw!fABmV2=n zTpcagE&_v( zOvCpd%!FEan77OBfNFS{xeKu*=nQf#g?jiiq4rSFhRa2Nc6UMZj|)h-xDfbviaEUQ zGcxl)0+;&+MPIfFygTs5dz4do-7_+aK?(Tg zs)EC!cNePziTjDK4ZOSk;C#_$ePhkn1YXi1diH3duL-=ny#)vLd86@=c=$GdcR`gt zZ&U;+hX(MR4hVT8)ZcG7)mQZP8o=AzS@3n~8knd>zda57y?XHXDhl>0{k=Ny_qKzp z2C+=7)~f}7@2i4cg1*CSfnz6!!Qb0bP^rx8)qubEWx)>7-y==?0BiG`({9K4NJsvT z(Q9x%awwTS@OuYf?M690{&q-Tc0ls4H(&Jl$X3aVzIMo4-j4H@l+0d>kh?@Dq?NTM zA%`iPkip~-EM1L+%wBwRgt;ZY29Z@jyOCMt2AursfaIT$%QVRBp*L1#_Ou?K^u~nD zp7h2zvnR~nAWk5GtU{w0(L?rFrjWhWPar1SFh7ysmu_+LCAcbgDpX;kL-4C9wl*Bi*7c&b?22~$S7BAob>&yhHF6to{Y zLw&YSn2&-bQ+y{h2}m=DEPv;XNN1sS&#uWmxltIoey7$nfNuS7qG*{zkyTxok1NLpY2>3(nEWwqxUI6><$ky%=c*rX=e#%peL`ist6{3K*dil_Y{zLujm! zY8C6=%xIAmzFxzCgtWE zSE6U8t6tGcA@Mc@K?e1eE2mBl(KsaeEU9y!BLnT%cc4v}pPs#VZC;`kUjf*CzcUB)1KnlRPGSf2^`IED76_-_`u zk6R&ys9r_ZXev!@q|sz8Eyp#<8cm$TqmW2^PoR1hm}b^CmP#C5fOEsK1+rEnTO@id zr_Yq*Kt%NP45bmr9LT<1^z@AE%@BR6k7#W!0F8)qb;uftYm&Fx&Lm^>1{mKMw;V12 zjVNX6G}U9$TY?m-Be-*Ay^n27g9+eB62)xYIdR?LhBaZ#Y+ZfqY+YS6Tc>81@xCMU zY~A5#woX4$s6N#U6`N&vHsefL6NbgyT^U*TNx8dk^tro((cGP2vqU49Rpi{=foSed z(sy6S&fV>kEBK_`-B7Afe0!pv9NDi~DR3f$7i3S49MuwROCf7O$%IRoi{;7T87dZZ z2zwW5n<#w(TboG3ii1J#DvasFh7 zlfiNJB8X(7E^0wS1z!o*=3x7~Ag;;mY7Izcq#HzE2{97#Zev7R1Yb#+U67}4#BYnr z)2GB6yNl49qqi0_3yp%V$C_R<4V%nE@yMn^&l}W)fh{U(`4jd9LyUfERWy?zMOI|F zEH$3|uCPKCz91@tll@y#gcI4+LPUj-*OO#Xx?NHsi7}_cqlk)14u>=$o;wjqjHw|7 z%TsN;=wmR_3?OYRhBiZ9kUV_`Z`mn}#-LPR2et)7$uo+_=<|9fCV8aE^HHs+>`s9i z)S>D{GRI8*Ux>#TdxJtY5Amtkr$Nz<^39jf!yv^l)bUNMHKa2%@&;vFPSTFzJtNxq zCea&|GS0Ml_ed&nrVpPV&h>de=lf{=MG7scws16Y(&$t% zDW)b!C1m#C?4T|J?hS4y%oS5k?Npf5yPmg5X1&ejQ$T%}GE<7P^a z&Tx`g)SuJL(kI&}NQX(@93@6J8PZ%*?Ip!Nndpmpa~j)3>CI_;@giT;n}g`IqV`Sb zzEe&di+Xc%oui@)?{o%o%to2IXh(_AiH8|Os8KoPop_KNC-^+kP6MQa4Lb42w#I*H z7f`$vnka_y-_?ny_4353Bgl;FVkuH@+J9ds9@$1AbmFP4loP5=(Nw0KY$sl{+d%a1 z^pz?4+*}+Lnx~`_kIa<>86;aCr@R|hn=_XXiEkr{U7sn~9jIbTusaBycx2Z3-|NIv zzp<)bOzQOczt@SU<{Xt2s_hYVKdio9^ZV$;(^jvb-t?$MM(=%9_5UdHe2U(5UCk!D z14kYHlbv|vxS&ch$$pQrPn{A2m2?Fm21<}jsb2G>I`PPiB-L#u#H?(Q`?n1uE$D<# zK_{MM$(>Xu9+{7Rf(tvo?@l~57b!aNLe&0+@4pj|P_-E%b*URwZLSq77jYl#(5g0v z-ib%HU38szYRg46BSL*Hs#fk2o5|p` zN!}ne({R$Ac)%gJRulEwOFnp9op_ixAZl`|JMl2qAY!TL#G_4I`ETyTQ(GV^X;NDt z8fl8x&qKcL_tJ?+W)DIqo|-?@{jKPJLODLGvN0tchGzlk_#@hdfc)B%@5Ce9Dsj(T z5wauy+nsnpawlHg6Ia02l4F#oz|RwW9&|p2op@wB` zUL7H0_q}%Fku4H}B$DkCm1jpjv!V6Gs?SZM4~3YEr@$cbE}k_S?z*JVWob!;L(Hc!s7?za8%FG@7j9>xKB7s>@Dgb@;k9-9M6NRb1~yWH=oZk7|y zQRq!3-$f|DBdy*GzoT5GubZACzoWMIM}9|o6(+o$A}@z3*(enz(Hp~YL{&aHMU{#4 z9>nSr{0`AAIL(20xZsEA#2uy(1RHJ+Y1g;Xgg(@LwB z>qPWYgXLdZquetrtx)JgrFP1}Du>=B2Mut8XbLdyX{Ytc$t$Nt=<%B<`s2vbA44)| zy>akfC)OEy>qL9`R(x1)9B;J2gq#3{~8-H)RVcD1E%$aytHqt&^zJuUbKJdeL|u>D+LWh4uI-WDNR}4u)Mor< z^sYDQ{p5~QlFkXCzEe`i8@%O-b-SH_wjp|i`0e7;HY&eCIz^b4K)>l7-cDVy8c&}o zu2UKmnS$20tvEGu1RlRvv|3y}nM84BMv_FVWQ2FpX-}GlkvrPddXu7IbhpRjcaXKD z92pdP*`#-%Xqccz!)UtL;4R|lVI$iBsCYJdKID0?it{1&uiGfaZ;e(26aH39=M$RW~hBkmI(h?%ES;!()|U2Gvm-O z{*ju=kn)=i5BOF7vixQ~q+xKh(ef;5>L9!sw%epU6z+@23KWs095srG>;>0ij5f5? z{67j9Xcw`M%%7pTRb74~r)JWs{6=YL&MHm22;Pev^9J3L8gNH732H!*tr|ZYaEbk5 z@;Rgg(u3MQF^sNgSIV$}L+hv50(Nn}hqTH-sx(KNQu_}3uF~#M^_~<+A!7+kiJ;T{ z)zZu38v>{;6CXi_O zW^{jF?(XuN0~S^6Rzef`tr7%=#rZH&PZ#J5+`TPybP?YmD&xegf{ZIuz)U?Ap>r$# zb&E^|^V5XxSh2nVc3y*i)T0$JVM!LfbaBce-e+lT!n(xHWHr`Rp02?EVl2qd81}1b z(T!MzxPMA})$sJGyC=ZzL-qp$2n@+~Fj% zca~p3i?rwBY>TWZGLp5-4focg=ATz`0ucF>JDEiG&hZQJPO)<-Yf8=(Ah~1Q=YGyDooS!Mfsg z6V{=buc$8wb!y#n{><}|81%o##xeI4rsDrJp?};q4F5O!KQm)4XU@0E|4v{ooX(tY zk^gOBmYu;YOJ(k95Pm9A{JivUtN3~8-$~-{OaHc5EGCBO>x(dh{e4M^W|N7DFs6iI zW+s8@?C2b1OeS-0PfsM%lb)9DOiLM-V(IJZ8Hn`vMSA-piHYzzn<>(7wpcAJpK4BE z`Um^FySsV@O-y%NB#B9|FrD2kNp2@=x1}-tk?#7V4Gm50UFM|7V3N&YOLC?4_jX4T zOuZ2^Jg}{;8J5yD*xS|L+L6TcMA%_WYfF#SmBnRb*)u&U=Kk*1o=93M{3#(d)s~XN zv^O7bYL5(aI6W44cqDCDcMH5sUwcoay|=liySculv!Bg&X6I(xE!~~XM~@t;>TYdl zYHYHy9?qT0bRO@rvFYZ-G^VBDNNsz=v6}GlhNh1G0a)yS$H{az_c?P53-gM2o29$G zrKPLOlVXar4rcp&Znxdidh|$BdqSUuF?Y1}4y0MF%(0{t(_niWEVZ|_w>i8cd_0ns zJ1);>vvf9f9S?^O9BykqR@cO`E-t~+Ti2K9$RD0z8(^A`hQl>2b>Ty>f`e7z##Yvw znd>trrQ}ZYPZ{aVbTciDy{$)D8(W%TlU!rVCZ9ga*WJ?F-IioCx5A%}H8mXT=ry+` zxV%hXQtE)o)?F7qT-)N{JyNCTaUGN^w)>O^+%g)2OQbC#a^cFNI1ee6RoC%#P*}rTfg1|zu!1$ zb){rjB9+cpcmoYS=nQzjGbUJ+ak6Udzy_2R~@R2^fXk5ndZj2rtV0(B`rIhcje}> zt(CPcgO-M^A6L~M3Gb*1H+3J4WMq%ZpEY|N6K;X^HrI!n`#S2v2da+MZ4Wa81H;BR zxVnfZKR<7{)8kEXq*?lsnEEYU3B&BJ5gZflGP5}a;{sRA9+%o4uB?r;w^LUCm^DwVudE7J@9*kw>x=XccnXRqm6zqEb{=W1 z*}8q-!QRe>nf*KOHy zh1aa!S6S883u2Z#b`)1Kb;iXPoHh57`FS-P-hO%YwyH>bUv@@9qHQ37b!84`?7n>7 z?cpq)bsw*<`nsyNqpb^Mxw&J|+}xI7>phy#+uj~wvkMBC#&A`2)iJx(Qjo{6sogc< zzTWmDwMn_-CyXsFDlfJ5bk%$F4>b6yG+w#Ts+T7D8jhzsfb@BZ9b1t}GwzKuv z(XH#&?bx<2ysy@pWHCATJa^8>g0aPc;&FjOX3dI!zxCo%uWt`q)0lz&j;_R%%#3V4 zcf?3OwX-*=6<(`i+pelwV7G$2oSY21C#%rsv#_4j-j0?CpJr>Vsj1k$V{cW*@t)qE z?)t9INY=Hnom6w|3bJ#kYx2|3N(VMHbhr5z;atn(BlM4K$ zg`;OpE_Jfb?%Mjg4ez}8@+<#X4GT<4wK84Sq}*AvOU92HlQ()?UJ4U&u})i0dtFms zZ%@RPl9ra*-yMPTPqH;9*|jDXs#}$+>c8mHD!r-Qlfk zKKS6pSKe6t@!GZPV2`ay&g@y|&zpDUqQz5+^F2;S25afAUb}Kj7!Yb@OZ*5h?gaRe zaU7RgU;Xi?D?WVZ_4l`gBiYVGXI7r2vnwIZ>PSn?WNNhZmHdUOLumZm!r-b+Dph^Nuy|e;z&(-cy@9s-U>YY3YwJ z3GEIiQ&+ub&({@IO%35D&!ov?OXkj-ea4h=&WO{M>a?-unly8i&6R3_r-uiuDUJ+BDiB1tsV}#D>a0>r^Wm+Z ze!h0?mhh3LzRuR>aAmlyv%`_*DH#Vl%k+mgtgfu>8DOne>tG~>wd5|i^^RZ78|Slh z^)?@Ei!kA}Z@l!}GyizuxmTatH^>%@^YTt>qLt~h`%j-bcg|U*PIGTdO_gh`|AN`$ z@>09IOp!>$(tfkM^0F@S11-^5;iZzWd&aRqM8g>kl{ews}TR zm^Hhs(3d@WTuEt3sW**jZtqC4vDt+MB}IYh<%O2ILz}*;8qDMz!&>V$eYEz2_2KGp zA6qheLPm3V+s1w2qrLs0w!q_>C;NRj$B`E{)q82XHCoF(oF4btsTwB zB0!0o*1WXr&ksNG()w_JS9@FgagcjQj@L8u;u~(iY5t@_3%p%VZ>rl-STL^8>vlMp z-lUXti^FN_ZLF)S-nf4Kjy-#}A3D_J$o6&(3`-nl8Z@uYxH2b!=s z?Im-syYm-UoK@^*T~14Ti>dht@Wj`f-g)JT7e4%aVkt{+Xq-COKQ{!gbYOSAV|Y?N=UO zw(`A?-rrcUsWR-yOtpY+4)+f_MogbkS~7X&88b`A7v`jRjW5k}cegh*bkzWf zrmqobp}`S8ImunoeSw}hLz5|Dk>*V~d9v7~^#&=j$IMvNL8Sh)0x z%Vtj);cjm{+-2!)t@-@JSD$_E#V23-=Q|&QuIyrxEDhCF`@$)iV<${Md-9~QlZx}R z3j-5M&Y4y?hR<*~9l2hRfTO@Q;RG<$4mUR;JzduZ+ffxh(l{(Ft-X3{#aC6~x(Jt* z>rI7a0Pi&ovpYtQ3rxx{Ip?yn;$q(Ea;AbIS@+Sa&;0qdH(y<~di#bq-`}!hYh_bg z#00Q+WV;>wnEdJGQ_CjLnKEkn%+p7WEzB(#L zdTS~+uKje)i~o4$u_s=7Z+*Dw$c~DtzPcu}WBj<1>2uGYH#-mPO;2F%oP|G~GAf15 z=#H?NdA9zx0g%0hhOKKp-WQHIIE%SGVmsd37U^#}-j&$ju<7G9AAhjEDJk2>XBPNM z3dfd?Eia!?FlJm~UZTTlZEfo5%XENc9^U)j>Mi^BS8T7`x@ql-*I#+@nP*n*3p-M5 z_RQh@n81Y>U39@EmtT3&<+G>cxh)-$q;x0K8%gM|YfDUVy4B7 zN`G@h1F%3>Qc6z`h}DsXx@y3nXVRouXHP4eRqD*l&L3Y~IA%ims1(bg&$e#ePzlOn z$APLN)$2BF-??k^p06wS!d|S}ymN0=lc%7(bn@K!(-vO6__kYrx%8%=&i1C(ZQ8Kr zt@Ty?NtqdJy0dMNwe?0az%+6)$G2|(e9Z@Nd|)XiIYBKqbus-Z8QEh46Y^Y6_;mJ| z>}>DwQF)f6Y=7z4k?H1v-ujAno_yh@WvjOA`?_LJ#oi4ct>3Zh>z(1QVHwWewj+)0 z9nFrwbwB^b-M_!{=F4up;(}72%hp-9b>nB-_JeJL)QCMX(_&%s^GERZv|&u$rZrFh z{aH|(T?wF~niw#43g%vL{=yrtzhFwCn`zjw=TNw%%aLC)Id6osrvVt}@UgnBn?L{H zo!6fJ>(i^&tgiZcMYpvc~Y7|jB5utAM0SM zD-Ts{+z0k$g-@hmTZ$zUITK#;)Ay=bd%QqN}gC;o7s$D06mo zH&<_1zh!@ui_6H)=x=SWJ5o~}ZfvMOvg?aAZ#?txqkn$n1<>kA`FWY1YpIF{qmQKuf1Yk=}246hIdx1+7fn@6pkF8JA7zbCadHaey6P?k}4%W9r=bWn)J(ZO!%Q z(6Yz4nd1#z?VC2dxB82(_JQf&&``5={_eZ) z{>`0BZ@O&qIA{H?&7c1J<1OJn@IYM!fkGdj?#W0=N_Daz0lPN*^SM`^ef_QXt0L*V z&*@HcTN4~(0<&hEbK$%*&n(TeG>6x2-&qOBEEwx^CMKi+T=(wWw`<47k5_-Z=KYUX zzWdR}s;Yzg!|e`t3Rv6DqzspT`rJz{x@6H!zg+tBd8Ix}!=XLfzNic*rdZhwmotfJ zN=RZoS^2p>H`97(!>8}Oyz2e;S65c`F_GTm-5p8!{#h4Ze%X~*F1X^n!Yo^N&8B~U z`0;zI_Z%8X${&%-X95>D*B-Ci@cG6KtKWO;r4^4o`ogNucZ8EX6a2+_pdU*{70kSF z;gy$NzHol&NVmyi9_SowZtRLgJQGIQQ`}xBGZ0C!G}j$#YH95OLu1dTtsA%P-@gBt z!<`0R7V9>pc*f7YVA1bxoquMT*VfapX4MC)zu2;~YM6tmIo8t0w6V?2Y zd(|s1zxv$Ut1EYH*>@}@H!pMgoD0sMbFmBHYYi(Oncq-{f8<(U-SCA>$iv7zzViH#^u=(93EGiJ$vl*8RK|9XLxR57I1KQ z^S)hMDi4GQI=T`P8F0_5_g8P*zI|`Fxo+o%4QoDlb9F@p98e@JE61Da$u78X(Qog* zd-0VQ%`P70G=pgXc&!4&HX}PdHm=*UWlvSu?k<@# zd+PMEyqxT@(@ObF4nX4WIC^Nuu8rF&s=6DRyR7ycrxoml!%cM?{{7+VPv76N>Eq4o zD)&`|TaO$*d@PbXzR;VKn?HTl+zZZ}JA3Ao)6bYXCePB}(%9Hs8{QcnU~|CK<~`Zo z94`cHz_e-&Z~E*jVDE4kexuEnT{5AhY(n1jIdjVj!MNeFGR)xISA4$q!_}KV{iw3m z;VGF=>`v@&298+2VZ)}48`iCPciq~x8+TOI)F$Q@1g1?G4aV#lv(B34KYe^*{)D_t z8eplL4_STW?LcuC}f&ylc}(8!Ice?mHB&s%`CR@9>Nblok4?mlus1m6esA;~P;v zXY$BAOT-+35LahMR|Y>~c(xDRi2BB^L|ga&E96bU+BmO;;X!CcJILA)NESN*Bm<7Y z2Bcu)*iLM)lQ>SZKpLlUn#I0pv)Zwgx~;q2I=%O{Nt?8gI;q{n4%mqo@FE#7;DFg< zFqSNh7_A767KDU^nC~b_zxLkyf6qSy(u_2E=bZDN{hW7DAbx@pb9sU!5)&*TE32?f znw77X@yX#JxCd00l*FPTwxO$6dyIouyG;umCX-1CVVKVw4ESKu924WWhmA&X)d*&6 zg{CabEv~LDm#NgbYg9$bfo9;bsvv@=K^^Yj$zoHc`GbIrOFQAi~Dao;>@a(clWMB=Vl zU|h%-p|rd;Ys(>DMkTWHR27>xZmTVj6&6Uj^o1Y=p~OMr=`k8$A7`;SEF=^Rdm)QJ z&e|!qtQ}gxTSY&6pb%KI?;jl z_nAT=cQ}$rL1Gj-n;J&EcO{DOIa%pi6DM3J1g~sC1mt*rTbZUIY=kW)ej?tlOS4{DAHa#`E zu#muAwz1o{C+zbT`rVI?$F-Zm8Q)3szk$FI}(Mpq6r}qnOqJv=CSo(y*!QD=LrbdOc7pLA=q3%y(A|;I|r;xW^P5*jz=n` zOg_L&kT`rEpB)8*4O%b`H(#%2lOi0Ybaj>pSxVvZC3M1LzSK94E<_jzMCJq}hJ}0{ zl32lq&YnEpVZ3GX1%p(`Oxh{n2WE;mR3z$}9qzew`P{%XnAB1!GsY6mwfXC9) z-8DEpeFtK|3`TS%Mx!DNUUU-NNl3&Dbr0UUb=N15Ni$eI_gpm>WaEftU>f zXDX!}dP>0IBVw+p@yTiU26ID}Cg?YhOi!YCERmW5D%0c(`=bj%$eD!*4&sk2`1}jF z4=2dvWhCryI=r;3{B>2$2VZV!e&UhuHP+@ZqUf1Z?dQ(*jiA0zkfPkNXM4l0$9F%n zxvC(GAF$0pX76fO=K%N?3@J0}rh>ZU2p}uqpPjW$Uhlbl@%$&JLGdnyh-|S)qRcPJ zVbb_an4z(;(f%%okX@0$5`!g^t4gwwzzQJ}N-Ds@)vvGEx_xJDd5$m?c20~iABm22v?jazqb+fY|2WwF6Dj`d%?*xA*MI);0vL6NX3)|Qmy%EU}+3>_KnI@!_o z$M^qyqI1YZ@QQ01wr*+IwRvp;J?ylZ`@2q@Ir+({?i&+sf~VS6SyonDy0&KPwr$($ zlY-1ABLoiNZDa{Nj|fE|;W9Z&bqD#nJ`}&97H3r z$O=u&%g*OBmqX~So~|#>cXV9n>NcT?1d+97>-KHCAA$@X5_JrBojHH8<4VuvD_0;? zW(bP%D)zngqgP*f<@rY%H4tZlhV8#T+z-?pLBm-M+bU`ro@;ryadWLYN5;nOKF`4A zu?ZAX2g@$Vo{%B^63aL)Ae4M;L{!F&vv5;iMmM2W^u?Q5)uphY~v#XJ*Pi8mjpdPP*Vd5o-j*U zTCrALCPb*=5PH3@w+HglE64(h&J3A+Op!9LqOz{Gy1J_2fi0UiYHGGrvOR9!ynEI> zH3Xgo6k+6r>l+?;z6ZTTvq8rcy}D9+;NDescW6CGhv{gdj_qTcoPlykqm$ zUAuSIYf9KqR*CvzF6*61;sU6AFfmj$#}@? z01K4>sjbT4@gVJ^s;t|(xg?uIUS0~=%tJj_jh8OT$K7T@4RadaOusmDLhjIiCY7zCgMtjbmK5_C?9~cW>;rjaOf{KO*?%%Sd zzIsh*Nl~s`%;r#elmzZ0kc6Nd99c>J+S;}2vbhW<5~QRHIY=^|=^h*y?w_znm~2wW z9tdEVci!P}!uVzs#q4(U4!HAV37Z8uQeI|>Oj(o+>cJI=I4omVyUrO0&h&xU(^L(O zja#=g*4ETlS5=om8(yWVHV1(j1=7&c3oF)D7UUMMsi-WK@gNN&A}>ch=H4^sd#9)G z-WeS?g=rEt5(JT>hC%4AT^SgiL4!!h8-iGKiAN?_a(Qumi3lve%VjZvsgFaR6coZ} z7dV|kn!KoLedW5MJZY}7s$uiSdd<$wwN(Xt1_OzJO(93)Ogb-nO+iIvjyPM&lZn{r z#SiWXsWlpY?MWu&q zV}sL^yy(@$(xRTr0UsNLAGrM5r`1=E0! zLCegAFep#T0>OiF78%OEfj|O^117HzJQ=Sy4250@AR&R_aDz6x-gS8ZB`ADGIur#{ zlV$Q$E{B=U;8O^6;BpsSfVv%C)NBioh@}v?ju=k(yrv;Eng|3^i6t^gT2Nl3WJ&Y# zmGaz78p9W$XXhvjYPU3OtldyvT&>#t#M4`Aa+M+i9lUtO_A!?&kLP@5gK;Rp@t$jf9}WC_w7$-Ja3h~66P85#$|-3Ed!C)@$LEH6hw zqXmP$C^-YPL^_L;Q^=Dr_=qs4wp!Crr&Sd~yq?Y^7gTR+d9p#JI&yPpthf7A zSMTKX;Fv8$2S-0Qr*h*OIe4Tr2H`XHjZWT0r>0Td2g2rZdA-0O^bDbhF!dUZSFW5t zGXx2C_X0VcEt2u1+2Wkaih?yznPSGHWLk_KK^P2vK~?SMotpZMn;WW>xzfC%b(QO@ zisZB)I@aAaI(QjIz~d2g#$<81qENRisV|nxSp=E46hTp7eiR8P?th@6qM*8deIYNhfcBj_dE)f>o>34s@bGYi&f<%+%L`W*)Io!e z-)HI>HoHwD6Sqxw?v8^62_R%nhLY!-#aCkJ;MKlMmyB0?hJX*3mdTv#lFeJ|DnYdt z^LRN`#XKSroVPo?A)G8!S3bP8rnsQ8Ub9KNxuK@8tXf+Lr0KkHsplprZ_D%;{M$ST zJtK2rAMz1}l81ctzdN2Bp@7|L=%M5^N1yHA73IN#Z0cKX8z zm%|VjRjO;ZY-`zDQwmu>8ags%3kQ7jA%sd2t}ZU9-S*6DKi>OT!>096QO^{ROxJq{ zy3c~)x;l*FbQvUxQ`lhCgrbZL&=O)|WE^!^CMK}ZlHCXX_UJf7m?4BhXC+`pL%xZw z9yH)Kqqn9^<0u{`rI%#M&p$BmCa|Kj5t z*B5e7WBaM3#U6k{OV6Y&6h@dinum8iut6yi5V449x*x^u(*swpT_5N-d&3z5HjlOx z#C_g?54VLPrhyA*yLtw0n*B&d1~?ELQC@CIB{)3wn^Z-aya>1%I6pg&7K{0!B!tW^ z(bVtUy=yBtB{iy|TxFJku-i@Dmo6Ot~&^lvJ*)1YDZ>ZI5p(=9z8`4|aE6 zywdqa|G?x3ip>VX33|@DimcU=cmN%{(fR4wj;{Wp$;pWsTX2~!+uZVlr=EV~frj;k za*2o&L`_3e=2`c=&+TDXZmH31+`Q$1hAMD)>MASplp?0jG&BPVQ)I<7(cRMv+AI{N zBEmBD+KN&olqnK{R4M`1ccAm!C#QP`Ksq319ta-{U*hD;Z=`Y7m_sxH0pM zvpP8H;0Or1P{g57rK|JhaxNu>gie4$xQou>2w_6!?WVy=hkMo$O+Z5gnENQ12s&NM zgd1GBvC9J zkyj*OfY@KTa=GV9$Hnt!x`rK5M5?ZQX!o}5Ti0X}i3Dou?z+&?aUQ1S78+V+^7FHK zV%iD>0_fo26|>3aH{G}b9J{nkkRfv<;Xpw~EY2xex2;C43)XJl)v#r2Lk&o+X{htW zpWpvuTgS;RkoXvtDVF7yl&q~_fvuSC9d@AIU7Z)N_K%@B!e&V;>o#oLy|qzWzeXvS z5I#>JfI@gRHsK71ggNE4JGXDGfbgrPra}S=dnJHmm#E}27Go(8aiP8)YS_MKhmsNu`OuNRbLZMmok63FoZ80kJ@Q0z%gYCwtJdXb(Yz3nh9Qqa zCLl;%@Ix@>M>s@?PDu?eMEzl(379D*H39k5$>|ZZKj;W8eG~XjL&)ul5k5yC1tM)F z*p%R`#|^bPH|Br|R#y~PR@H9ZSX`iFGI*5m5<1v%x~m@z@pG!Ro16AL*Sx!FXU)1b zGHE7!ONsktruzm!?FFLo6@&(%JDmmQQsBFL>(*fR5cu0B2)R-30z#$5R-%jyRvf)E zJw4df-DB|t*g4s9i8wVe?_WUD^F-o|3M$LX@ntSmlH zDl7rh3pH0L6XlCpF{ZS%SU^kjl-St35gjyj@Lu-&Fx#*X7B&ko@$ z353TNvdB~dxE^7Eu^8{WWcCnr37?y?gov_MOO>1miLG9*)pzBKCahf`AdOg5cP#2j|hgbfkO@(O7_6J$^QoSgjfZ<0nlS~L=(v$JTV zpxt72fQg8cs9dRfgJylHTrA2isohbxK}q<0Av#Z(Q(vXZ;-!MApE8>vVFeay;`Z$^ zn+s0>%&ByCdfas7+R&)O8Ss02GviaJYd*G2=dozXTv&pXQ!JGWc`1b39`)gjIC!L4 zG6|bWNd&zfoX%s*q#Q73s3*qEE8YA+T{ZN%s0xbIfVw2BK$PH%AdgFlAt{MS*c}R) z`ub5vAiBI9M@PqcEjYB+&|-eqEVu%lS1t1~1o9{e)aG*Aaj%Dz6y&uP`8+S4ATy|Z zNESkW9W=0n5Eh5ciX;4N;7lHk6o&+3aDmR178J@rF>c&cp~}l5sM$H{^0jO7Xkh3a zsA+oE1rCqd;dO$J^WlCU9*QR1vmlfc=2<7WTV@Z5VRs-5NPTh^95ysW7Ury3S68g$ zlK4DoeAXF4=u6;JQ6QbmSuk~99W?e_y*gw=Xe<&q`rt(b!=S~~ z`B~Dk!Yo#d&SH{CL60j&N%(-&Q932!bvXe0tkt=)jL1TG8Tls3oRha<>-yYmd3t7M zK|$$yZB0%z2 zM#M=ebOt3mC$FHs@sTQU2;I(D&||mbD+^v5hPm*d-LoKtG`c*WMKt|b)`p7W8l|*gU9Gl4M%W#}1#mihFZYash4GojhkJWaoSees(N+*@!Za~( z{p{(hC>|xVSOkz5vLMh@#F47kS66SW5G)~38i=Fj@!{E!+X=DC7;rpfjsU(K71-xE zWKSL5DD)=?1$=2vc|}=uU3sl$`?jr(nhh#iDwHK$=-|08x~>fk3`|W;^bNs8(v}hn z2!|t-#6j_PoayTC9d&r3;I$X6QKn}wgxRvf!ZqtkD+>ke2oy$=4W9l$1c(n#5vWXZ z2A3<$E6vGQvLZ7q*VGg%DR!G_tPgsj&UP7l z`ucl%y04ote3>FFE3c67>=T!-4S+*-eH214Qbs0}e87?2u~nN>UJa$7EIN1=P->kR z8NJ!tj|S{cFO-d-c$6i9KCu!xD*;6%5EZX~nVeHpw`pzd#?3qK-?^hf3t^D7WQ~$= z&(2~27-PaXaHW6n+_j_w>hR5aV{|HC&Y?zdPt-Iz+&4L9aV`iY=`yiMR;f{C$w86V zZQfcT0}c+Jqo6g#4jk@{P2@6=yY%G z+f|$;VN2ziTyW>dM@Kt9J>S*SGw#6AsS)rGXUvdKMJTC}g#<+TgOk$(Xq26v3F=ZV zld0>qsw@syAmOFbbJRR45nTqCxclshuIrWe*WiAj(^d#0ws{xW#R?@)np0L)E}@}g*E?F@{g2ZhefC9X zPv7+($Gja6B770FGv?D0mRp@)TuH_=QF>;{_9q^H5^A=)8mjVX3(@%)fy7M{o#)PV z96xid#}Yt<(DsxmVF6DgG`=7MtPBO6xG{Xo;vr{OHoo}EkDlKLCFdR5DnSN~&mdw< zAuoi^+%=i{E}w0`a;^)C)qP`=)8kV^^9VDQ!p~L})4;bF9|7qj=TzQ*f8(wP>Kkf` zc&SthCR=} za_~*?IuGxwQpOofuRE}e(A*Q(Z$P}(dbMxJ<^c!d&h*V2onQ3yha#SNL|Bvsv8D_3 z2~w!4erQKseQkBs`ZcVC7bp8b$b^|7o)c4pS30_St`8+6@|46fDK&*m$xuNHL0(A( zFX?xj>9NuCDjT18=7k^q=)kM5?$)jWn=9vmaRq<>RD0)z<9}_x4B-^`^lmWNkT3;) zy@|Sz3_%dgLBJPA_$8b7?0ey@H-GTGO`?cta-wh4HXo&kc?(b+9_TgOqAV7JP6@dk zkbv+9mJ@Vgrd%SE(Yz+JCrpM;o5F(H&08LN?uUCHd$OSn?wy?_fvg`59qerV_uszz zn-5NQ-I&B&o@4?8bA$rR(7+)U_+|#Xd(3z=!mr-6?U^4u(Xwy%mhD<)#A~|H1v&yX zn+Ci4hs+K~C`M+3RbN+3M19kJqm~IX0=Ez+?9fhvGbII$FTA?{nY|C+UkB|bl2mTC zQkJtCTvIPtwz1o$&aMt9;r>Uvp)L5pUv7lfCg)HtyW&yt_B8w0!QFQ5=%{6Je_;vSrLVr)Lo~rv) zuVcX5DvRE!+gqd4$8~kZy5pC1I`3iIf9Rh0s7?3!hWpR!Fs82RbK=!|cd>N(VK=US z_Qtiy%b)-1OZ`_wyY zhBUF|LE%F!InNdAwr|_}%J%(xbgw+UZ=deaVcqw1x>t2C=$_xFdqsEn&HcJV&2PT_ z#Ou1JpWXj`-S@u#1JRSK3$xcLrKF{lkBd&bz8X98n`;KgM zyZ)&D=lY+0vnStws{hG<>3^mFrT!Q2MRI@V!(Zr+{p_8eUHHBJ_aFS~FC8Cro%y0i zbl$~w-%u5?*KVqBs@}5x``>?a&&%58$8~S&-q8J6_iwrgSogN>knW&vzwWu$ z-Z=b*?ls+yf4D`b*}ZjCX26L^?-n~#(d9hF9nrcqJK=LW8IP{`)g@ToDEzMSQWlX7{fLX#53GP`XyN~WJmXUVh_pGd1 z*&rirOuL6x&Q+Ai3K;jqH!POYrI~VSk$|(zq{)`D61)kKT@bKP67!3e1-rE$x%>6_ z^*i26UwHm>yW`8jvlq{N^~ZA^fB)=HAOGdj>5iYC)_?x1FOD7m`|tnyr%!%={4X7U z{PNVtXRn-v)bFJ$Ukw^&%-1lZb9!p!E9EF1pQo+N7l-*$T9F{LkXtHTn|fbPxvDy+ zsbJgYCpSL(;Nvep^Zbji?|b`|y{`g655tz!w($Bd|8Vln>D$RGzT0)Lz5Uu-FYJHn ziD&B{s;w_6&gW-S*#zW?Y%_!XJvX{OZ$H)6_J@D}%{xbb@^gK1&VLU3QT>1FKi9we z&DqcNM_~WScl$f~Z+AVsC;yYL-yZ9a{Pw56{X^S(pPz1rP<7Zb?})7|@_4Iq3d_n% zYw90-uz5@KQ!P)uc;Mv&Z~XY+L1@ha2;Y87_d4)Kl0V)&^cL{VLEUQyU(xN;J*Ly> zcE5Sx`IlbZ`@#!9diLd)U;6P2FTVu8eC73nuf6fgp*M7I!L_fy_159H550N#P2Hil z-#YZ;w+`%o<%JhtdS>t5r<$JJ@#v0?8*8f9uPM)y=g6fQJVqkE81gvX=+{$y0|T9x zzWDsZ&pvqX*s*th0qmZ{F}eQ~nExp7{RjFE!2g#(i*LXC7XN?X{teRKz5Ig)K!u<_y39i>wtf9rvHh568Gf(4+c-ZA3XH>t3N)l z|AptCZT|k_k3IVE&Icc;ufMOR3X0MtdHD*7D1*ypkYIfp4u0R=JCl=N4P5KKaN*SF zfBWm7|MXwK`^~S8Bys!6Hyn_h|9{2*|7-rg<@*0l12}u<=fD2le|*?_{KV-YV_=Tet7p{lpW`?t5YXYp)zS_#Hm~#Q$~B=KnhX z|HS{>ng0jX{*?m%a(wXhw_Z80|A)^%+w#;?yC2)NWBay-`nnBkE6R$X-!NM!U@@RO zI^xG2nAJ2jadWWu`lU->cAWh5`0)=v{I5U!>UUra{{Qg*Uzq=|4~`uD z!IyLg0RM;K^|k*t`~So{Is5;e1HQu_-oDum9enGp*I(Pe|D_*3|J*arv^@Fvqq}$R zx*rIksi}r4dSPCUJX8VqvPk;V-dwWO6*|T4K@#UB2&YeGh@nUCZSJ$OWmoHzv zYA_g$*RDZ|yXX4#zP|qcuLg%l#>T(Cb^Er-Y_ZN_c9+}jg$ArZaA7eVU5YO!2n1GZ zrlwNJG%B5z#z;$JrLmbDMmn9tMw`@i^Qx zxR9B~Co?H5Y8oSjPG6#?!h%rJG7?`QFU1ql<)vsiC6oyJ7Z%~R-h}|}4|?Wtw|6dx z&3kY!?s54X9t^kPo_VLoYID1tUbpYA-{J9lESSfJJADwgc{veFK7`T#7}OA{-|zfGiQV{;fUHnbDHKX7bn#PZY$lZ?B1x7@ zzS`|feE;JnsjEaJ3~ZP~ci7U@ivB0j$Hwo&@4xZtM|)-}X@at4d8$wkX+jds}s0+1&jXb&-ja(BAJuL7ob_n z;gW?C&wSxvBs6pH*Gj*=1dfakjn&_P!w~R+-KPJZFlGYXRMfTssU)pZkKFBgn_c-rl439+@ucjLArs)M& z`aKEJnWFZGf1Zk=-t-T|U+~B8dTx(*rT^j?eYNF|_}%sA3EzBKD{YDr?TyGjY58-C z$Mcn{zp^{k9pPdnbko9O!pk_@GF%#AdK6gY`Av~vfsdX!CJW>eSp*|ZL@=uSMR&iq zxSA=aR^0gES54^|lDz18qG@^?IW@qHM|sP&5W;~Ri!d$2|h`JFiL#%#gv8YV1bjBLMY~Wcj>+YA3yHS z$nec7?DI>~Nl9>V(eGR$1#Y=a!^qOT@2l}SHfLe!Ywul|mA1ePb6GAdJmuqi?MskO zcDbXmv4#1&vH2Bj0e6K>0SAA^PQRIEpQQAcoT&P&;9BambZB95!A$WYv&>ls19OWk zp_D+_!L>y*Z;I#dD!!JOg!8Gi1)(e3thQuh=~U868l4?grg2$Zd1{J)!&KuH2uDKA z5T;i6He-)e1n-TPBf04ccClC~$zzl-^Hz%_>&Ru9;xbw#JQqb#AS_~+Gt`{IRXGK$ zHI#c-iZdkaoK>sD(p8!11?)n0KKY)wlD{fL$bg1)ekM)8N~cN)dKQ_^X46t&T?RI(OSYJ&(D}p*uco z-a3!j{d2Q^@0`aw=MK$5C#G*c;#iyy_@dtE!eS^C4=o^ZSjoKry^PeQ73gvc3*ac7ox#iC^E3ExB;*L0tGMYr zK0h74%izM|9WI~4;j(#5HV3p4E2)+kX|yyNokpX9YD#6K(BdQ_xwdR2v66uG*zs5# z^xR@38eLorhhee!LI@U@1fcEMhx=gjf-0GVHhwqkc9+xcLY+_mhRr?;J=GXGYeQ{T zh}uz$)dJgH>)pGSyXajwx@$4Pq4loCY_(XesCCwAhab4D0kg~Mo^`_JcDO;`dSHXQ zfX4F8(7YHuVmXf42q#-P)wfF+X& z%OpS-gGOd^Io#yNIKd>)4#+#%3|ukk*G` z=nUBCR0cJv$7vJ_8UDzrBv^t^0z&|6EmsI2+X`gJmzQI)SW=$?c#&{&Pp;1j1%t4V z8xO#0azMuGoA<)z0euWiHRqUj&N~8@5bDJ|PM5>!awh*ANlLif@BzGdpt;uLc7LP6 zz212*EW@8q&H~(eg~%Sayx6wx`eQe!h>eW2^XABlv%CB0g(KOM&^%3q?@&z}E#xWn zter|==8fSGo(Z(K{60}KLPrRFCNg)=5^+1Iy})X^W2c&^g?im(D$-sxD~@$NH54Qh zw>J&a3nK(FM=l(ZP2}Br6epVgz(dZ$^5>grgz3>C)hwAX9q2iDZTC=!bXz@(my9q9 zPVk6~uQ#Rtoi_*fAqp?C3U3FXw-ABhZjq7v@l2i*PH$6*JBjW3=K=Kc&dSJbDl&KP zIPC#Az4_?P*@qp3Sv8A4Ja*rxYI%AO4#164h}(35)4XX^6`ixv3Qs^X&*Z8?Y5V_YSzIXxU_@i-g2&ReyUbFtuq22!Wuxf4z6kyLy5;CtjW-11NLkl_Wsa zJJj2I$noSyXc<5>2RbfEIg{#c=}7)8z#k_Z=thg3ngq;CLQLBOGpf51XDU)SK?RtT zw3(7Ex3`Q19`2{jl1-`zVk%oQsbYSZgev^(APSOH3;pzLrHnIuZ{?+;^sx8;f zv62P19vuLx0~{u*0PZ?<-x!UUCj(ZQaT878Tw2D;MmCMoP%4oTH*Gh&$jlW08A0Ys z08~U^E}NtwM3x!w4hzk31@5ARD@VVju3r?u$w>As8Zl>06ej`o!Q9BqT!JXP4ZkvF zt}@>D`DS{m(bP0InaKOPcqvQ^@|Q!a5`;w>hdU>4kCjel zI>})YF~{)~O(iKGOCtmUdSVei0z}jBlrRZdLGGAv|dj)D*l$$SdI01b%< zoa8xiJeC5qajdi9;y5wSSwPa98HuG_8-Il$MR+c;Gs$5{nwzo2T!EVbSp`cOb}_6K zqQLVyh>Qf0=1x!21A%UOSk;?+7D!r17+@ukv_wc453}ak2_!~efl~%tmK+1#`17f- z{ud#*^XZW^BE}9S6_CVF@{8i|6p>gO-IpGLaY%x=Klv*HS>y*vlm!wI24eyj@Pd&f zFpKF4xFcnSpe)b{BFzWS1A)t7gPZ(wTUlOO4Eeoo7rqc65NI;fC?3^nYciX)&4-P| z0mC7Jb~s5>ZBI&zo@ zPN#ZIt4nRx!Ys7lO-Pl{IxB9CwobPJ*rP{J>fe3;+i`!c|4?t$zkB2&jN9te8?bg* zGDfKFB8sX-{#0p!Ms-MaSo3spjzn)jhstxh7NF<>LbG1g0?`(Zv}%p*7NY?$eUwzb6t zBv?6$Bgd@oINN^F-qv9_rnl*jT3d}4{W0X2{+RWsQU6|>zFpsHGyrSi##ZDA{KkJ2 z@5ii!6-O+Hp-FCq`#dqLLGWg+T-TyK-1xfokgl1lJJ1Yd(rOMK)*ft;H!0)_BBU@{ zkRu}>|9U|Gr*Fyf({Cp7+hf20wv%wPR%X zX^#Vqz;uMJ`2eEP!r(|hZZjBxi*0(`c+9Gw{dUy<{dz1p#cc*7aDv~W#nc+D<^ZnK z98%~GJbC~a`S7~u;BN5gA({>$4#~BTw)hF{EF2>>$gCJ%rW8(?66=)JXt5q^Ycl}I zr;-!!z5zJ$s8v6$KXx`Li6ipzmydj`*B><=8)<91V7DH#ARl3tWxFQ|qromx$i+kxu}Q6JB6M19b4&AcP0fc? zx|WAm1Dk6thu5{pt8B#T8Y`|KFj(4-80|>A(`v99j}S%!$P%DwJ=Ss5di3%KhPL)& za5~yxdn}!LZ=k{wgbh5eVkTO5nbjg|J!>i^7t*tG$}r72_U z6lQESwk{v(Xf4!`wh`^2Q*C*%|-=Uf_;H>{f!PTjUTD`Kgi1j)0g;-U z_iZWEynaC2d|>bWdzufZnwvCD1&vybI!B`gdni``IWd@gtlxUU`n#@+ZS8HxPX0o# ze@}np=f4AMq1S)@Zfo07Sn>c;dJH=Op!MVM)GPxL;YBoRnnJ8<+1NsoYwp{}lW%BT z*A!6kC@QT}Wd)u+=F@G3Ya6abbQnYCgB9go_9*9k<1&=9%{ z7qi7&xx!haD1>zvDufHZYz^Ya@C-RU3go536RSi>Bqp>9PpcXCs(Xj z&=7f(AXlW(B66)*16AG3vZ^|sTzn5tRE5YDD)?MMJSfp9<}~FnyLCmGswx3Z42(up z0-7|o9Kk_`K~uV{w~TkJ{nM?}MnlKZj@COC<9i*3(f14^7zo(s77V14?pnt1R0Yf? zj0!(rrzYU}Rlq!2LJ=Ui1-unPks{}oDa4|}>{Kp~R>>2j!Ftv?F;hw>M06Ks#X;u% z7n~#nn&TC~l(^VxM;1IzY-$eLBH?LSBTi`5!7M%}&xH+HtTrch+<4LetZcksG7fYY zEUt4G4O7-pWABvJfP<{SWWW!>gC@8lkvtQ@H40ItI#pgM-^C-U^0uf|joK~1&W&36 zp2uI;BASQxsJW_YfP>AHxqzS+#5e=?)i4TN*V&O2@}q6PYwtRFq_qv0_?-&_tzGZF zck!6v%aPF$Yx~HkT@3Q(1bpO$2vM$iy$RH8v#w=}M)%CVt@~RVn_C`jl56&Bw7iV=Q4NbbDxn9B(|l(&dE)oNspB^AmGfV|u~IybkV zLZRZ#$yE<(dGg9t@_X;85(uSoZYH?42m!G_nFNm~NQDg=4w7f2q)VHU$(2imf~tG& zm9MIl^Ry4D=6v!zAX+@w-By{;*TfJrVQ=uS{Z zV*BVwyA_D_rQz7c_ulPl9k}q0-q_yOdgNqR`|sM0jsl50I*m>sxE1T4F(MW#SZNuP zO(5!O6<59IAq}E^{qa3=Fwo5~b&V?Zmb@y0w+p5;Rh=nPXmBJ`E)sF!fk#ePQaJ5c z6vqwLsa^nm%5d?V%VOvlFq*({S~0^(<8jPsvs#8Q7tiUlV6e#AIRcCZ3;*V(FsEk$ zv0KGB;%vXTyQy!pkNG$<>b%> zzoi#*PFQXZV`3+6832XkM+gh%^%GztT=e8IC@vB1bkUO}rpq&MxS|H)F)pHlzWhQ( zjZ-1#f&#?hY8og+0)xqj;&cMD&Vstct%{^@R)G>l>WD3%ViE8+6fkkw^J+U#&WRBQ gglKnR#0dBomdSQgtI>GlIA&;@yf!^$wYN|IADWVH{Qv*} literal 0 HcmV?d00001 diff --git a/examples/cx16/zsmkit_v2/README.txt b/examples/cx16/zsmkit_v2/README.txt new file mode 100644 index 000000000..26f05d97b --- /dev/null +++ b/examples/cx16/zsmkit_v2/README.txt @@ -0,0 +1,14 @@ +Prog8 ZSMKIT (v2) music player library integration +-------------------------------------------------- + +ZSMKIT V2: https://github.com/mooinglemur/zsmkit +Advanced music and sound effects engine for the Commander X16 +Evolution of Zerobyte's ZSOUND, by MooingLemur. Read the README there! + + +DEMO PROGRAM +------------ +The demo program loads the zsmkit player program in HiRAM bank 1. +The ZSM music file is read into memory too starting from bank 2. +The zmskit library routines are defined in zsmkit.p8 as extsubs, +using prog8's automatic ram banking mechanism. diff --git a/examples/cx16/zsmkit_v2/SONG1.ZSM b/examples/cx16/zsmkit_v2/SONG1.ZSM new file mode 100644 index 0000000000000000000000000000000000000000..c37db7f7e878ee127b64246c4fcff79d977ff0e7 GIT binary patch literal 26280 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 aff>)&@3)+^qyA}=e)B$$H|wX)TmOGnB-9cB literal 0 HcmV?d00001 diff --git a/examples/cx16/zsmkit_v2/SONG2.ZSM b/examples/cx16/zsmkit_v2/SONG2.ZSM new file mode 100644 index 0000000000000000000000000000000000000000..37cc196d82ff62b3eeaf0ef6acddb44c14e77db2 GIT binary patch literal 2931 zcmb_eNo-qH6n#Yg|35`hb`f;-6$yhPdDt*S5eahQq^4jaSFVX75`@ICp&(0OB=l|5 zG)=s4AyjVa1=Au7LTT9;*f1?hyJ6TcY+BebY?!2g*%->X_r9O+-#C$|h!pwz{rlcM z_uO;O^D{@UyI#@X?@Ep1W99~RpmyL&-P4g9yRoTT)Ez1vy=Sygy1(?$*kk!8hrNLn zx8XM37v0T~ExT>KKX`uVQ}v~~q`oiz-2S7}-PWGAqTP7zRyC<+quJ3TrNz?2V@LB( z4Oa$ExF_Ay?n~}#BWLY*tPci18Tw3pr7o)<%D=S#?EJm0D=SOdzNwoi+@_|~Tr@XY zEG?BD8GAfm9#O4v3LjE*PvtwE95sLMcjv#9!Hle*^)7sLNV}vEAtEUJjJr{JfNzaTI-xtky zK?VHroXLd9oeC(66)SKSu9veEwb$S`{m^|ZdosbEhL7%$_JBc<0(nbvPxZ;YxQmfq zo~N}PFvry`=;|i3U8i?W57$Lh6~sTd>s-M=OkdrVdBjRB!m{++$4~XmXe&NpSOeGV z)c1m}p+<-M<0MfB`on6$+ej>jU32J<9Z%^>NGp_ycLOcnQ&+hQ&_Y^K*|nAPmW^4eQA72wlOWOVhsze_l@ zF=^5lu+DuZMCeHCAWaH7bd738J|~G@bN&Tg!Hh>(w+`v&Dm@c6D4x;(uZrgE@ByxV z0uIs3x6g!VT9}X?1?~s$;7Z_rZ~5_<2-FZ#wBZ|S_7%f^HLt7ZC?mLS5zj$~!TuIj zT6ZzaHnUv71Yzp1lNGSWlP|Ll55xrQzp~6RtFjCFB~OtxOp#@{XB~%5%NPVkY5pE_ z&hB_#@j2OGk7{tv235xnp1?h@JWJ|{PwEP$ncqt#A(V1fFK%85;p17NT0*P4clvdZ z^W~A%)V_c2oSStfmL>6S@o3z&5=XVY;!f3-4`Uncqp&pmOY!MjwHu{jk;zx z)8sV?nhLp7o#dqP9iDn}q0s!$JxVGLaQ1uJivik6?;K{9?{sK^?!EAtR6C}vMG6L9 z;*s6fAwNzo8BB-GOw+HE@c#dbN%{@d=o-&1w6hjI(afWdXoK#CBXCx^_h!L8etYml zz`J_&hFb$lI3eBOT0nYFDf=n6cOO`bAUk!_?yvLSXqh_J0Ju9TSjdYR wJ!=Z6MQNxZvU6wPHpX{5kv6qK4aURGZGMWP51ShXze=Q=%mXroW9!fU3v>^NhyVZp literal 0 HcmV?d00001 diff --git a/examples/cx16/zsmkit_v2/ZSMKIT-A000.BIN b/examples/cx16/zsmkit_v2/ZSMKIT-A000.BIN new file mode 100644 index 0000000000000000000000000000000000000000..eacb09bbb1392ce7152d26487d217f8d4cc6fa92 GIT binary patch literal 4563 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 bool { + ubyte savebank + + savebank = cx16.getrambank() + cx16.rambank(zsmkit.ZSMKitBank) + zsmkit.zsm_tick_isr(0) ; NOTE that zsm_tick() is not allowed in a handler + cx16.rambank(savebank) + + return true + } +} diff --git a/examples/cx16/zsmkit_v2/zsmkit.p8 b/examples/cx16/zsmkit_v2/zsmkit.p8 new file mode 100644 index 000000000..59952fca6 --- /dev/null +++ b/examples/cx16/zsmkit_v2/zsmkit.p8 @@ -0,0 +1,37 @@ +zsmkit { + const ubyte ZSMKitBank = 1 + extsub @bank ZSMKitBank $A000 = zsm_init_engine(uword lowram @XY) clobbers(A, X, Y) + extsub @bank ZSMKitBank $A003 = zsm_tick(ubyte type @A) clobbers(A, X, Y) + extsub $A003 = zsm_tick_isr(ubyte type @A) clobbers(A, X, Y) + + extsub @bank ZSMKitBank $A006 = zsm_play(ubyte prio @X) clobbers(A, X, Y) + extsub @bank ZSMKitBank $A009 = zsm_stop(ubyte prio @X) clobbers(A, X, Y) + extsub @bank ZSMKitBank $A00C = zsm_rewind(ubyte prio @X) clobbers(A, X, Y) + extsub @bank ZSMKitBank $A00F = zsm_close(ubyte prio @X) clobbers(A, X, Y) + extsub @bank ZSMKitBank $A012 = zsm_getloop(ubyte prio @X) -> bool @Pc, uword @XY, ubyte @A + extsub @bank ZSMKitBank $A015 = zsm_getptr(ubyte prio @X) -> bool @Pc, uword @XY, ubyte @A + extsub @bank ZSMKitBank $A018 = zsm_getksptr(ubyte prio @X) clobbers(A) -> uword @XY + extsub @bank ZSMKitBank $A01B = zsm_setbank(ubyte prio @X, ubyte bank @A) + extsub @bank ZSMKitBank $A01E = zsm_setmem(ubyte prio @X, uword data_ptr @AY) clobbers(A, X, Y) + extsub @bank ZSMKitBank $A021 = zsm_setatten(ubyte prio @X, ubyte value @A) clobbers(A, X, Y) + extsub @bank ZSMKitBank $A024 = zsm_setcb(ubyte prio @X, uword func_ptr @AY) clobbers(A, X, Y) + extsub @bank ZSMKitBank $A027 = zsm_clearcb(ubyte prio @X) clobbers(A, X, Y) + extsub @bank ZSMKitBank $A02A = zsm_getstate(ubyte prio @X) clobbers(X) -> bool @Pc, bool @Pz, uword @AY + extsub @bank ZSMKitBank $A02D = zsm_setrate(ubyte prio @X, uword rate @AY) clobbers(A, X, Y) + extsub @bank ZSMKitBank $A030 = zsm_getrate(ubyte prio @X) clobbers() -> uword @AY + extsub @bank ZSMKitBank $A033 = zsm_setloop(ubyte prio @X, bool loop @Pc) clobbers(A, X, Y) + extsub @bank ZSMKitBank $A036 = zsm_opmatten(ubyte prio @X, ubyte channel @Y, ubyte value @A) clobbers(A, X, Y) + extsub @bank ZSMKitBank $A039 = zsm_psgatten(ubyte prio @X, ubyte channel @Y, ubyte value @A) clobbers(A, X, Y) + extsub @bank ZSMKitBank $A03C = zsm_pcmatten(ubyte prio @X, ubyte value @A) clobbers(A, X, Y) + extsub @bank ZSMKitBank $A03F = zsm_set_int_rate(ubyte value @A, ubyte frac @Y) clobbers(A, X, Y) + extsub @bank ZSMKitBank $A042 = zsm_getosptr(ubyte prio @X) clobbers(A) -> uword @XY + extsub @bank ZSMKitBank $A045 = zsm_getpsptr(ubyte prio @X) clobbers(A) -> uword @XY + extsub @bank ZSMKitBank $A048 = zcm_setbank(ubyte slot @X, ubyte bank @A) + extsub @bank ZSMKitBank $A04B = zcm_setmem(ubyte slot @X, uword data_ptr @AY) clobbers(A) + extsub @bank ZSMKitBank $A04E = zcm_play(ubyte slot @X, ubyte volume @A) clobbers(A, X) + extsub @bank ZSMKitBank $A051 = zcm_stop() clobbers(A) + + extsub @bank ZSMKitBank $A054 = zsmkit_setisr() clobbers(A) + extsub @bank ZSMKitBank $A057 = zsmkit_clearisr() clobbers(A) + extsub @bank ZSMKitBank $A05A = zsmkit_version() -> ubyte @A, ubyte @X +}