From 1535ed975ad5296fad21d657ad720ba37a9e4e71 Mon Sep 17 00:00:00 2001 From: Samantha Date: Wed, 6 May 2026 10:01:40 +0900 Subject: [PATCH] save progress --- package-lock.json | 77 ++++------ package.json | 6 +- public/assets/Fragment.png | Bin 0 -> 1115 bytes public/assets/enemy.png | Bin 0 -> 769 bytes public/assets/heart_empty.png | Bin 0 -> 726 bytes public/assets/heart_full.png | Bin 0 -> 739 bytes public/assets/monster.png | Bin 32212 -> 0 bytes public/assets/player.png | Bin 0 -> 1679 bytes public/assets/player_jump.png | Bin 0 -> 1644 bytes public/assets/splat.png | Bin 0 -> 2014 bytes public/assets/tar.png | Bin 0 -> 477 bytes public/assets/tile.png | Bin 0 -> 687 bytes public/backgrounds/temp-background.png | Bin 0 -> 2557 bytes public/index.html | 28 ++-- src/App.svelte | 5 +- src/components/GameCanvas.svelte | 203 +++++++++++++++++++++++++ src/components/HUD.svelte | 54 +++++++ src/game/Enemy.js | 33 ++++ src/game/Fragment.js | 62 ++++++++ src/game/Player.js | 118 ++++++++++++++ src/game/TarPuddle.js | 14 ++ src/game/levelData.js | 81 ++++++++++ src/routes/Game.svelte | 30 +++- src/routes/GameOver.svelte | 72 ++++++++- src/routes/Home.svelte | 77 +++++++++- src/routes/LevelSelect.svelte | 105 ++++++++++++- src/stores/colorStore.js | 10 +- 27 files changed, 879 insertions(+), 96 deletions(-) create mode 100644 public/assets/Fragment.png create mode 100644 public/assets/enemy.png create mode 100644 public/assets/heart_empty.png create mode 100644 public/assets/heart_full.png delete mode 100644 public/assets/monster.png create mode 100644 public/assets/player.png create mode 100644 public/assets/player_jump.png create mode 100644 public/assets/splat.png create mode 100644 public/assets/tar.png create mode 100644 public/assets/tile.png create mode 100644 public/backgrounds/temp-background.png diff --git a/package-lock.json b/package-lock.json index 8fc3d40..43faa12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,8 @@ "name": "svelte-app", "version": "1.0.0", "dependencies": { - "p5": "^1.6.0", - "p5-svelte": "^3.1.2", - "p5play": "^3.8.14", + "p5": "^1.11.4", + "p5play": "^3.22.0", "sirv-cli": "^2.0.0", "svelte-spa-router": "^3.3.0" }, @@ -194,12 +193,6 @@ "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, - "node_modules/@types/p5": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@types/p5/-/p5-1.6.2.tgz", - "integrity": "sha512-iy1B7DBMc9e5j0DrWnIjSJh+Ro9UkKxPHspbx/GvIeGFTOIJF0H2lICnIN4go1OZEAQSHBinLd7t+oe8lrrLvA==", - "peer": true - }, "node_modules/@types/resolve": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", @@ -641,26 +634,30 @@ "dev": true }, "node_modules/p5": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/p5/-/p5-1.6.0.tgz", - "integrity": "sha512-RowF+RxfVUhJm/YKXL5TCFzTqnwAIwK6W1VGs9LAqSf3PCmLz9Igbxzlf0Ry5IMV71L42wipCdH/bDiNsqAstA==" - }, - "node_modules/p5-svelte": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/p5-svelte/-/p5-svelte-3.1.2.tgz", - "integrity": "sha512-lcfWh+cJ1/wRdIXHnjpYmDgj2h3TCy1QJVQnf/cBcFWS8CSkvyAN5F8u8H2U8qBUtZ4XaD3nd+1NoYUMHaMExQ==", - "dependencies": { - "p5": "^1.4.1" - }, - "peerDependencies": { - "@types/p5": "^1.4.2", - "p5": "^1.4.0" - } + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/p5/-/p5-1.11.4.tgz", + "integrity": "sha512-N7tM2XYSmuNX8S295RvgHoJS7kpYLYxLjVFeySkwkbxwVrGnrwY8yAwciTxlonBjP422W7WW9pihpUVP8bAVgg==", + "license": "LGPL-2.1" }, "node_modules/p5play": { - "version": "3.8.14", - "resolved": "https://registry.npmjs.org/p5play/-/p5play-3.8.14.tgz", - "integrity": "sha512-z2TjIIJ4td9KGIubsyftaJJsh9FXxI+Wl/JDXWfshwJyErYl9wjQpMHdeWxlC+zrg40PHXeYzxG6Gq939bVe4A==" + "version": "3.35.4", + "resolved": "https://registry.npmjs.org/p5play/-/p5play-3.35.4.tgz", + "integrity": "sha512-5C0QobV0a36JhFacV0rrMvgeJNFWYtIpS1EcvHYptmzGXFRt6x9/mvEegiWPqNq5LqRf30XeD3g1JJLfoHYzwQ==", + "funding": [ + { + "type": "patreon", + "url": "https://www.patreon.com/q5play" + }, + { + "type": "ko-fi", + "url": "https://ko-fi.com/q5play" + }, + { + "type": "github", + "url": "https://github.com/sponsors/quinton-ashley" + } + ], + "license": "p5play Personal License" }, "node_modules/path-parse": { "version": "1.0.7", @@ -1142,12 +1139,6 @@ "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, - "@types/p5": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@types/p5/-/p5-1.6.2.tgz", - "integrity": "sha512-iy1B7DBMc9e5j0DrWnIjSJh+Ro9UkKxPHspbx/GvIeGFTOIJF0H2lICnIN4go1OZEAQSHBinLd7t+oe8lrrLvA==", - "peer": true - }, "@types/resolve": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", @@ -1478,22 +1469,14 @@ "dev": true }, "p5": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/p5/-/p5-1.6.0.tgz", - "integrity": "sha512-RowF+RxfVUhJm/YKXL5TCFzTqnwAIwK6W1VGs9LAqSf3PCmLz9Igbxzlf0Ry5IMV71L42wipCdH/bDiNsqAstA==" - }, - "p5-svelte": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/p5-svelte/-/p5-svelte-3.1.2.tgz", - "integrity": "sha512-lcfWh+cJ1/wRdIXHnjpYmDgj2h3TCy1QJVQnf/cBcFWS8CSkvyAN5F8u8H2U8qBUtZ4XaD3nd+1NoYUMHaMExQ==", - "requires": { - "p5": "^1.4.1" - } + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/p5/-/p5-1.11.4.tgz", + "integrity": "sha512-N7tM2XYSmuNX8S295RvgHoJS7kpYLYxLjVFeySkwkbxwVrGnrwY8yAwciTxlonBjP422W7WW9pihpUVP8bAVgg==" }, "p5play": { - "version": "3.8.14", - "resolved": "https://registry.npmjs.org/p5play/-/p5play-3.8.14.tgz", - "integrity": "sha512-z2TjIIJ4td9KGIubsyftaJJsh9FXxI+Wl/JDXWfshwJyErYl9wjQpMHdeWxlC+zrg40PHXeYzxG6Gq939bVe4A==" + "version": "3.35.4", + "resolved": "https://registry.npmjs.org/p5play/-/p5play-3.35.4.tgz", + "integrity": "sha512-5C0QobV0a36JhFacV0rrMvgeJNFWYtIpS1EcvHYptmzGXFRt6x9/mvEegiWPqNq5LqRf30XeD3g1JJLfoHYzwQ==" }, "path-parse": { "version": "1.0.7", diff --git a/package.json b/package.json index d6581bf..8df3fed 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,9 @@ "svelte": "^3.55.0" }, "dependencies": { - "p5": "^1.6.0", - "p5-svelte": "^3.1.2", - "p5play": "^3.8.14", + "p5": "^1.11.4", + + "p5play": "^3.22.0", "sirv-cli": "^2.0.0", "svelte-spa-router": "^3.3.0" } diff --git a/public/assets/Fragment.png b/public/assets/Fragment.png new file mode 100644 index 0000000000000000000000000000000000000000..9953864f9ab720140e4dbaf999deae60eea5b38c GIT binary patch literal 1115 zcmV-h1f=_kP)UAi@eNUU5fG%A`!i$##6QB(MciVqMqi=sh%?D+;~h?B|AWX*2n z2bW1E_uli}@0|PH8=^P-1K4af6PljB21+v=4u`;x<*ckM;qLBkj6aXg&CNxU^*56C zgu|7Ul^?6CtHayd+fmXHyrH2%Xl`yMqtR$NJw0_*RaO1su_3iF28{{7@!)=54Q+02 zM);NePpj$Z=m=V^RtrOZcYS?LJch2WuBHqI!;o@(hE{N_gjYoT6qv{!2XU+QcRHP) zYiny?1P4IArly9nv$I|Nbx%3Ys1+Pw8O3&SaY2udj}A_WX=i80AJ>1lprGJWYiq0A zpCzYIC`7?vkO~V6$!@pP!NCEQm6dtpQ~54gaBj4=wkA%*lT%(^9%W=?(BR-8t*)-R zSx&6Tj%Q|O<_K0P_0P@CC02vFySs_W%5$%;uhaSYIV6gx5!$UBNIT|f%BnVua}odD7R6crVz=KZyR3J(ttCRGB+IaZE6eRz0CySuxT zZa`6-5eWpiIHJfq%Oj=%ZDC=7(g|!?c2Kyf?1ZuvvxEJ7&tOxrl$V!__PMpSMeK57 z^}ZHR)9dwu#Hioz_aqPi>gwtOXJ=;)679e&*2Db#JT*2pibVbvD=RBBF){x$u2WVFC^0KhKmvR0GwhpFfc%R0Ll5Fg5*O=$(2ZY zA$h*J*x8gKIPFluTH6wm4(PfSOC-1na7U#>ZftCj&*vjZ&iVdADM0g944{B`M||gxu9K4!6HH1{L6V%! z1yw#pDI%r+1yF(=GgwhkVe0AWp~=ZfINJ}F+@)9YR}la@J3B3Wq%QL<*TjMGr(=Zv hH$Z~bu+baRfZwL=&@i;)iv<7x002ovPDHLkV1lCO{wV+e literal 0 HcmV?d00001 diff --git a/public/assets/enemy.png b/public/assets/enemy.png new file mode 100644 index 0000000000000000000000000000000000000000..4f1cc7840e06e0b260d8790045cd395443943bf4 GIT binary patch literal 769 zcmV+c1OEJpP)wECg2V#zo)Y)2pJWZJ8(P)!bQ>SmuW4P z;VnW$#ajVn_l&g)UeAx&9uOib>;+I(oia&dFOs!n0{@U3#vBT;<1kK#UAZzIN-3$3 zXOVV6v03xQVNK|zq+SW)$uhqKUhqMclF;lMPUZUGMSwYoJGcwpPgfE+CC}=w<3+#^ z$U9EZr6eSQ8>V^@V4R1e4-@bg_=NyY7qa5FqdZD{2)urZ3o!8_z%L3;-OE70L*ND< z5e;+zQ<{B(&+ZhJ0OB(OAc_(Slte((Bm$x)_5#>#v`{FZ)oS5zIAAy&Vz=8ND5}*e zN~MzSv)}K#TFVlU%jGZ{jr2#NR;yt$nfMk$fw$Z3zkUfLL0niRL~mq%6M{s{=W{({ z)-jGhT00mF-mGmj8pvcaY+oz^l}bfA=0=E9;0D=j7UgmoTv!6~`TW&6BxE|BN(1Y5 zyN-dIakHZ=0o*#L?9pMg!%bG#>ot2WO8^~MF3aW8_BuBSG;g!nfXfHda{qw{5kc}@E3-o$DtX3=AIV5bq-y@Yu={qI!H6D*Ko6W%ByJpWR(*+fmUotJZ>YN5%OQS2{Qfw{oRz6$`uLb00000NkvXXu0mjf8r4B- literal 0 HcmV?d00001 diff --git a/public/assets/heart_empty.png b/public/assets/heart_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..af423eea58cfedb71431766ec741b5ed715e0c3b GIT binary patch literal 726 zcmV;{0xA88P)t@rY&OR%1pFXOr_-jc>lVm9LDZl*L41$#4APRHqii;7Kontj z1)CV;6q04SltBAmnww;5{kq-Y|1FEu3wn$`43KXJ9BytP8 zR~0e>aX`fRdcB^)L5wMaq5%CA29Z6oBjJQ}u~>{yU6+1&I2EEOM@YjtZ!{WoUMdJt zk^K@74Js_>xHwgc;XL?W>m4u>BSGHQ!AolfT~ z$e+d(Aqt|3aY4Tty0g&E>HdScylQt+CiD`!7bOj8yVeAY2H353jhEB07*qo IM6N<$f^Qo#SpWb4 literal 0 HcmV?d00001 diff --git a/public/assets/heart_full.png b/public/assets/heart_full.png new file mode 100644 index 0000000000000000000000000000000000000000..0f8c7ee115ce8a9a059a521f456879460ec55b1a GIT binary patch literal 739 zcmV<90v!E`P)*75daFB|Gfl_`%Peo^d*7Sg zdG8G&U$`=Krv|^@&l!zIL6RiTZh=nMgQ4AMG{)o#I1&s7gMwbKe{#FsoX_Xm*+!!g zX|-DT`T(NhIY;4e*bhS%0`x$z9E@`q>tGWVgGE9jk&ycRzI2MoWFp~QC=|LsBbLSa zYPBjY7K=Adv)SD7U_Nn5;NkhBBqkS)Mx#<75b(&kkx1koogRd!cpz3Pm&=kGYPA~f z@BNC&x7+P}xm*%j zU|_jij&!?SPdpwcTERlj&1bV2igFM+6$zu=M@)t3bV>$;0a>k9JqErl=F5*tr9wUm zpn*fF-EPkre1ly+f^oc0@T-fVZ`j@UqY2t0t_A1|eWGv0Xkg;*QW9$c`nXh`-T;;3 zQ4~e#f057UG1(so4M6k-tHXN%2k@vO$-yWYfpc3d7RPv$wE{UHIEHR~uN=ivDk~-_c&Os0HQ1hl>)q;%)Bp;4etD VMwT#}1R?+c002ovPDHLkV1k97LP!7r literal 0 HcmV?d00001 diff --git a/public/assets/monster.png b/public/assets/monster.png deleted file mode 100644 index 9cb1c466922b0f672ceb38ac061ff241e87c2343..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32212 zcmZU)1y~$GlK{FbyRf*sdmzXLch}%fAjm>+ch{f^PSD`)ZUKTPI0TpA?(X`?fA{Y0 zdvCt4rh2-xyL!53x@IC&lw{D5iID*S0Ggbvq}nU)eT4-G!t43Y>nPwA!8xnRhyyA| zN%vkal1z2v%oG&?Os{1K00c)20RLlo1z|Xn|0zquy#c`gryd9ZgjoVW|IMTHivJz4 zukcUizc4616oB}8h5ZV_*>L|Y`AW|Q{*PpDHvIpT7hd@QV(Joda<5q3#L3ju&e_7= z1ysiIPYaTR><4E60H5w3z{#o6p1#_evDDCU(NR?3H?g;6g?+L&Hf8m&b@-5 zZ2u^1?^vO1|D*d=RPbLdzlx=Ysm%vTOWW5zd$l3V{*G7hKm7kc%KuvYKax8CEBTI( z`~OP*AIkq%Qq$SgNy6Ut)ufB?|AyjWsO(-I^h0u*uI|Myuv^H3X((U-iRUqfG9vtQcS}G?l42Hyy(M+ zmlc7P{Wx+0uLz`Hr0?;q?4<8Ro-D$K zp&T6O!@QX2!y_Q$&|o6OMm{J`xUIo(rWq-r8Sou^S0p?R`Y_12J92&_5}qS41!nX+ z5DD>>1p9sH_&YFFbQlWV=nVcxf|^|OZgeV8nh~Zr8g;*t6jI)Kr#l+aV{)Jl^Fr5N zN%X@hLZiH|CWsKsNK+hMNjPT137 z={8HxfOLCQXXGhGN*Lu9?_cY*KaIb|ywrWJ<`Om%X&bkCsR!1BD!2kH${J9SyB$OW zb?oacsVwkt!zYu%ek2yaSffD6R?J__V0I~abVT?TinnNA7k!&F$4Bvhx1O-XYRf(j z-^spuye=F4n0o>cGAf!`@j70uzUt0dJEiJG-@Wh&FxP|kUw8|#uE&Nb1^3^AngG{` zDd5&@^y)lgtgsX0AtsUIi-)8zPd(ffyuxWOL+NJxw9dy|&(!g;#@Kc%R8UGI5a5}S zWJDI=-SnH_5F(BPvGNbB3J{EOAl>}1U{{m{OPJ}_&3XZ3=q~s5d~ZI(gcYZef34@g zey0U!7w_`*TX~NI0nuC|_wSYUJX*f(S>*^~XQm>Qzg0Do&heh+6Q)BlXX!0tzAk*I zg1?vO*{(wjttc`i-c4Ex;UWja)<{9?iyWcg z<*h^%e8WNwcZe5ibBFi+q?ewvNpj)gIh!sw`OL0L&uc$Ve&Ea+u zX8hL7PIbo`B&p(8P`BgSykHhL>b1yW_}Fm&>p;bQ3o`AT(*sZEGGvl)lP|=G3gQQ1 zK8{j+Lxy+R5a^t)0*bwe5>w8Dft|Wv5u0Nlb_M9`gZR1};zE;=MXC%Q*JSYCH(g4| zzDMcP`i1|?9i*ZT#O`Qw&XRaTjk%M>$4rfRQBR5-Q87UJ6n)9Tl!3H4)iw;u9b8)Y zzJecAeKyC@v)%I$78RC7%$?=I{e&Pe`nNF9ZD^djrj(rRmL5pe53f`HS@{@?G*G|u zGySS|e}2K!IPqhUVY*L+$I z+pE1$sTj48=x}RShH>D8qgO{F3wc9V5#;ZML?GT@E+6DEb+& zsWF9x3_ww|=JT;xjiQ{|ja#!om3NTOBkTC%%CjN7DCa!|=b5Jr!6Y12YB`<&i6^3O zgsW@t_Bd}w%)r)sK3t{9EGrI*eKP~d0-t7{Gl@S|h41XuUHSD%Rj z#rWcu>K6X-6l2Hx?O4pUhAA48HC*oz^~EpvDIx@Alo+2)$X=&ym#at6N;A|R=b*%u z&lTLAmJa))s2jq##v&#+vIGD@SXTr_QcyCUX9-Yy{MN}? zjd+GO0-SgecXLP1aICm_j=+a=vlfbvKDNKqTjdrOxZYSqV8LL}_~{(6 z+Wi^whH0gH9`fs8ln9?q*j%SMT*)16dLf>6>8yAsVIjR1h=phQf^v!DRg{X~t<`lG zJYxyY)`UkI1sqS3t3Gg@6T zguekKj;VTK&zIGipH?BJ8~Tvd-zFZAE-WhHfCC7i@B9^=jVbz!3kj4@>C!k9$dijkA`f`xI^K>dwg9xVt!UXnKustjqyzy7Y5rbM0PL)>E;t`BGv zAU5KB#wDFRA_bG#=zU4#G3oxuMuT>S zm=77AP+I?k(Kl7X3HDWTPCaK6#A4kcxa^icq?(itC=S04R6*410eX>V2+bq80E+DQ zMuP2>kl$ooQ~WGpSf}y}KQ>wUTo$n_FK`jY!MXE1_VJuDc8;ACYb?3KEHs$%+8<-1 zn|c}|`W%$RohMKvJN+C!{{Vy5DrF|vNzD*iv)?W__<`s5|#TzDm}5SACY`c0OJ>bCa}`6RzdaXjmAU z23-gZ$0!^zFi+HI!V>`#F3M=1%SVH*^PAFJ0An`ibg4>pRCs9vJhRv?e3#TTbty!& z^9!B(UPE2hyHabQI$V_D?&HqvE|TO`6&sFyfX!LV6Pe*gphHV(a%8ICh8nPxPD1lA zKZ0$~E;*Brn%nl0aeK_DD?7nsSd-b%*>S2U;dNcz1Bv4e2toA5pg(@UnYjO~{BG@f zxBAD+9j;TL9<8KIpBpZuD?c)SYn9aj7ed}(A8-=z%TI#@WP@mnSx6!}2rW)ggR}r> zeKw+@gvI$n3hN{UhkMx_AVuW(WqM4@we|RKztFPetaq;pjXt!ZIOxg8iPXfnhm=i( zgfJQGUgeF)jD;5HO38SiqA0mD5KQm$cdC%G)?6QmD}q?xembkB`M7ISqh?8o zd!eveBFr*Tq~rA@wP#3Mov`WT1PKl~dIUaTvp03N1s%lILSr&)z-`5>z^?AMn0L%p zkE*9)5{N1m^%IJ<5IOiXSoG>wq2t{PMGs<~jiGu*$Q@Sz19`VigJaNWL4#;$LMNP) zwb+;COIigs!I*}22zMsgUTE>`Eloy^QHBSa`2D?Q)hd=dip;uM{1YqghQr~n9ka^; z*gT)xNd|LI4MV#q1Oa*a3HiWXBrT#50(3^1|3zP1I?0C*4LPo}OX2RGuwErM0MMU` zsw5*;01Krtvdga;mP3!S(#NJ&)B&FlBV_pKV_v?KIPi)&E_El zWmfjuKVw2J;%^<4p8GfE*uQ15dYqXHB854;Rix#hcM;^PGIxPAF$6Pzba2xeWc|6f zepu7rYZzSmAOL62P${b8@j8=ljGHN!aOE6I0C1dD#GI|RTLk3?E?|4|uo&Fpg}VTJ9NDOm zxbFETSa%PvK}qO*u&9c`IGpHEoEF;PNA7%?0LTmUD@qiNj{rM=Tm9uhXI+NP_8WZ7 zjLHt?JY|NSA8HJlqAEr~LfP&*S2+w}67GWEDl++=y5-*T9P3mUFd^~EtCOC7^}+z1i_W~!&z()jkqp`lT(qUHeA^o$`u1>b9Wm|7QZH{%zUMN&%0 zkus)qLm)Rt`_E8tc^7;#>U5H*5rqSaDOna#r9uW zYqVrKS8EgaA}9A%dj2zpiwPpZU5f9g=C&J zn|15*;#6{F#3COfW7=r9f{$`VWHOQ}TcABP$7Q^6BM~&1KOKbDjK4~GlDzuu*Y$(~ z7zo03PSObO4r;I|0>b3wxe4zstOk6 zKtD#4{E3$W5b1>S9@e7=;Iyo9cj!uYdawk(fn&YT9y7W%4Jlo{0l@hS@APq8fQUqQ zJ(GQKAvcOdJAZ8Q=v3#s`6EW7r_|rODroMTh%TD zKcZq9M;WsDU?5`~BAtZI;kusEO0@>{jG)B3pV>g;(=_a@v~etCb^y*TtD~FX(j>zi zgu^`)N5Pjy!3Yt0S*be5Ydc1@#B%@UyRz_iKlytmFcTan@YjO#Wd^0omsWfJMCctk z3Z%Mffe$EdFi{egt4Pni(Ac;;Z1YslooP-a)#!75lp}P9&0|ssZUJ_!e)g>_zpT)j zj#6nxOD%-Ctis_S`x_W_iGBoJ}|;$#RFRVhw25mj99SRH_U z9?vI5p{XtqJ5 zIW!v-%{stIz*PL6L8v3otpb>uJ1#sLeUcuasE1T-`AeY|8;*bR?L1!yiCCtgR4kT} zKrKq)(j-SZi<|b}w^RM8MUG>2mAVWnZg{xSDvN zMvgZZDPRlSua|ubYf+M{y8(-T15l$l9L+q0q48W)PqOrsCTQ^~dLv3%Euh!Z6X7ay zw^x%yj$FC{2tFhyq-jE>G}A!bEOP709;`@?HI%LUf@N}DA3F|eY&emt83;>@8`5-m zIunwM-vzgt)XOUml<^px5>CrmYjEH2veh=ISM$lYbt*MNYVw4TXEb&T_o~b{xG<1; zDx|JsSL7&ArzhuqV%8OeOXN096_ym0C#DX474A!&D@9|4LpXhr@Znf%yLKfxz4a(p zeYS}R6?J7WXY78mg#qdpP~8NqOmePB`XK@v6>Ya+3EB2gDHzY!x?R-?{Z76 z=;7m=onH0(urctNymVFg{K}g*Jj(BbdWKE(r!u5nB$^R9p_4?!r9u{`dy~V&*rqaj zZ(k3g=ySSWoQ+y{usBp5ll#nC#Jpi2UO7LpTD?L}RWs*qovmP+;;QO-Y$V8W zLpI#^nkIXBoSpgSbHfMIv@IOSK$Y?E=ZbFrRzwWnmrPiO4{AMWMeRE~LuETwS%2Cwoh~^$Udt{JNaZ;Din6-#WX4lr=$XJi;Qyp(blwNGq za9y$a$Fek?)|R26>C_>fk8xDpmLm;~jogAai_SgIPY+>z6#hOQYas-vmYl!2Vyqml z=gl#a4ZJLm+fnEz>m4arX2*^u1^@C76|T`~q;xCkLMM~8LW(W+e$RBLph=W_HmAtb z7P}I#Z5+}n^;UP}&5K)b6CUxq?5a%I2-nNcHM6m>pcQ4fEmXI(@H4YgP+q6%U#bhuTpUJFVKutV~y@CX3oS>0C>)dn;2iL-Y`$ z<32hwBJdyM8(mBtMRKkg0M~xvC2^I8&>Z|cT^Feb%EGF*ohIA*D(c0*xe;dioDZy- zi#*Jq{yg!uzunjF;9vAU`8kqf2##NESqmiz#qhuF`GHdH*(2kt=E{Hh)LIwHv{#1{ zy+RA_lCv6Ce?rv;u1qVnC7;!New$}-Y`I($KI$2YaEQIxNAAsR$xX3f+oBE30~q?< zZS_bI=yRrfAOGlS_mw%>TwqvmhZEE?>K0EzpRRU`Ei>Eqsn{fV8Zy#qI$wO!-K^o9lGC6CFJ(w z&Q1zBN00on=j&s3xVUPljPsFbK%PNqVVQl$m!zXMZjUqMJR`heyOo=CQQrC=Viy_0 z@J7yUB3uats&uro%qW@!D5dTenjvb^RKLiLymWi_|5ip1zMKA8AqW1`)bVt*X862i zNR5gibouA>u&!7b$7HRHTHk4auIKN{^Yz-(iT}&#-;SrhJtQl)zg0{VS$s)d&x&2A zn)l>Wv~bi#*5U%c}8LL3K(%$9v zIbri^iZWsvz}bPMsIV+P9!6HSU!-ZNe~@<-*xkexu}N=V6VO&I=yLn-SR5+w-@Pt-XBp|xHj8 zj;tuOyjHqnBphm(+Z2UYeKn-WCXi#P+L$RpsmVr^ zMrTgw>ROsYaKo8c;gKia>9qGY!Ck2u$qqfIg;j;9#PTSor|oGci(qp4jlH1gn@F#= zi>N)BZ%|ni`P0?U7}A>ew|yd+NyfT8?>V@>e*LBQAg%0lTM9^ z-ZSwIO(k9$Yh|+7D5dZ$?DN>%jM1NvKZ!-KyC2e1Ao37GRKiCV^4nyRyU9?|Elr46KOtBVcgx6pCTl7a8 zdYS?P*>!2?2f&XD6`(2$!hLxjM_EUx=pQwOsJ!>?E57dc7%%r#FKJ3wQ&0WoV5R9j ze9(H;^L|w>zg*s*d&`PQ?x)*lg@w58Bqb{?MI>8;Hj6Al2lwM(7pn!q06&X)g`27l zMjC}l)pwft{`W=x?^`H5H{*)mpFLs|AOe&`o-QG$S&su*sEydsf{d%`8-l(3IIhUS zG)k6xy5}TBZHgRZo)shnxK1*sUo+Watp6(`um?|2X<9e0idww}iCy z`W#zFv8cw5Zs6_Lj@z#;l{ngC**X? z#k^Tci(JHCAL3g$ODS%@ib8Lo$db+@)0fX9E02mGW8B{1+|NHYX&DtnWl%XbREl~wCiA=L18vOWOf4*H|lA&xy<3%0ci&ZZo$L-T!sAk zF=U}g5MGXdC6p(5>#Ij6up|xRRaKuFkE0THp;NA<(&~JleMHVH8X?-(^V|sG5 zfxme_q^EpTtoZX^eqPkFGhD~M)7cYSaa;1=E(nB$J%-wRvdeSgAkpSjzoU^V7v`=RF`EWtmVD`pEbql;OSAXbr?t z`Skcuvi1k#n4H^^>~~#)+N}dKS8U{#=U^vLcgOfG)Q}lZq5o&~w}8}%Eo-87NypdALU&+vE0^2p4+deZD_527rq62?_Pz(vsfJ*$qiaNJOxBhD(Vy6# zCXM6cF$|%TKC(OhW6Gv~wQOwWr+(_keWx0MIW%9LygZ-KV6yQnE>P!uPZF5v1RAN!6TUE9AXn^ZQ!06% zxc0CQ^-R9MNotw+p?%!SfXOQ17JBLDa$;$&L61PR=xsH-pFQz-8YV*e z{Iv4oo3816#t^TCfW(w-T5x|ZAY2l_w`5Wi@l`{@ro zu5+~N>ehp&#!SF2e)2n#P=ctBziLbHJkR2*QG4bsc|e}BRr0*)r)k7po6PnVNM4uY zG90iX(PGwl@i!n=U*4C;i@HauE{>Lb-8G}m1zXf6_MF}B9veok5o8BLl_q#f-o5gO zkGE=fN(P>NRbMxg1VjDOQ}o7%R#gr#{7yfw`M=!wPrhIDI;iMTR~EvfLhr&#ep}g0 zT@eI4Bk4FJ>Cx2IcLhm#yB6MeHu+_00_RBrt7CvvV=Nfj7~ZogA8hAKuE}n+K8!cX z7SeXMPm&iJJF-3&X7I#tYObm5Sh< z_nI$dgcur$b|xLQKO7ICa*x6lviuz!9E@&{v94J@4dtO_n@Eg9{E**Yy7YPF2ghfU zy}Z=I@p?`(sD#(u!4keW|D=syMqah1!tZMN_H510if?l%1)|LQQ7TZG8iJ8Zq+qTI zD&)>65yk+hSF2QP5gISFo`x>FDg94EP!)7Js8~FlO^Dn5QHs(clVH@$Hdc?#k_z-! zbcdfp+l8By%lrc14gcr+ELJ31lEWKXuF#IQsbpo6CRLr?+ks5G8CKJa_ENP#Sz;vT zo$*Tx6aEB0)}Z(I_jD4NSZ))Mx>&9lFdfHvFN%zkE`TN-1AfMj=K*EEczpDgJ&w6r zeTObE7Cb9wDnS!lJG#554|~G1a7i z?ki#PllXeMS@nWW(h&{fR?I`p@IfqCk*Syw*@|HsA*K{%3Qu*z0qk4p&1nyY`L6?< zdg61lxasntq6&0^+T%g|wICEW!X!%;d`MY?j*u-QV!QedYJ)R|0y96~K6cvaT={8P z8(oD^7T2ME&wyOZrO>WJ){Pb%ZEXFZ^XUq{@$@)70^fBm-!U-mBJg%M#~Fi_e(3x- zc|8)9)#gJ$r4^n6nFC|~G0!l;wJS9X>T`{?t(^dm(W{t_8D$ z#SX_IxNX-lg%JMk;cNhlTl72<8-JD}56q6vkR^(q6Q0OyOwf(kUQ2iYK3^a*DEMsKVsek7SvaWX zvsp|VsbOFM&7MNt) zIO+qftj9#kPNQ0~Sm0lZbv@#-dP=bW7EKou;HZhF10;YKo}Zum87^wzLX5oVv5{TY zVS!~9eaODKcnpOLjtj-Ri&P}A8WZ;AA!b%57Z&yHb;B&&`p_CoIO=72sZJ06qoad~ z`KNd@G?ohq(+djyl^sOWgD zNGkJbg>fmAD!T4VGlgc#{0#A3_WG5h*G)qb2K&~0Bk z=U%8sY)T>L36!O(ZK4ub^K-FJ^4LMuvd&v?SxhW~!$tizjzgndkVrdbz}$w5+StxR zZHFs)W61SkB47oOq9P5m=)z`yK2y(=5(s#!sQjI0L(wVHFrC{ z@^U`H7hd*D5dm%Nv0qtJvPaFKRdkn>hlXe}FIhTah6?8mC|`ukie$IiouGlEff9mR#cAHj$e-f zv(WH#yafq=@94~EdJ)bs_+y|$eo+%M7WDkk@k%&s`Ej2-b1%z3&_-TDo+{())_KTc z>i1>D>Es4o@G1KqJ6bw==Iz<{%l9&wCObl@?@EtZGp>Ij29e*$@xF%SMvjyx(80t0 z>lOQ+Krb2Hki2CD+09pv7(rm(*W5PLGY5UC)V_UeyiM4FubHa9CLcv+UPUk;&KydI!VZR60e4aU_e>V$mJa ziLUWv&dm4YXLtUmUWyyivW)8uouJW1TCWwe-Zi7fNdh#AZ9@%*qiIqr<& zp&nJxO|X#{t@pP6kVSRdzkc5*Ql($l5=~(NG*}0;cxwnV!fT~wvlB6DJr&KE@_mj5;|0FxcHhl0DwXcXX5-0*?%n*bd zXz~F`Qeu}yY|^);nwF9XZVts(kMME|`3=@(ynG;$5fVPEHUV%Ck3-wZ~m`e=^n{c^taqZFPS;+Nw&|p-U7Egf#<6$Y}*D&tSJCa~6!=UQiRC zZ7F|ZP1!xn@HqE2Go3^a<7D@68=*s#l;h0Vn)pC^LG9{zX%>0}Ht9)JWm^A;qk^&y zKQxwKA@#)GJ0z}sij<2CM~*B?{b(+mz(Q22ZsseP7)u=&dqcpKL3M1|*0Np@)1jTd z4MwV4hA?=i&ItPPg!nK`yE3Ow2^-~O+BV_DAB1WhH_7Nxu0vWVLly)Xp+e<@uyY%qh=hk=);q-)anT-%Ct~F>3L=|5 zC2+uZJk{6d|KoEf!2v?$cL+ zBr>{a34oLq)!6n!)t^rFyx>oF!yqXAf zzt9W%-ezKZ+iPl=jX-KV`yhSh9xPgq{-g7ERgZ=Abe=2WsDEufeC}Z-WAhvm`u6_?hTpvP9_=pr;!Voxb>HsP{j`$O1CqDa#h^yNaKn!;Y zC+MCRsfXQDhi~HHsEFuhQzLFacYiTqQ9o)DsMIO10mFm$Y8OBG1*Nqmpa70KiYH(d zHa@~5<`M4|^j_Y^<96xiIW=yUYW`-6dc66NaN8_Z;It_pN+ft3FUpgYRS&XzCVRee z{)pVWALU)->^lt3jZQwJWSbq1+`%7cU~)jw`fW-|Zda5|yg`f7|3gMTX^fqijj?%j zbsN#U+ePPH2xZPmH2>M6F0zpLESL`XIe*IzMqIq+EyvGqOFijloS(pqw7-nn+Wp7x zac{Z%8!abz_X`91eV6{90g9t9tgyB6!Jwx(Y*B2S7s0)bqS*znFws?>bIu$&QiMM} zF|(?a)s1vafdSj6ybYB_X4qrAHr6WA0cX;|Ed1EA25RV|>CV)xB%xaVQ9W_^5kED?&_$JIOrX%WoFs@ju6;7 zrJfV%>y-fah%;$?VgePvY@~3Ac#gfN%QlK{(4ZU>|20}OW@Lad1Im? zvxY*mFt|&q={^-h4|DRX{<#%li*?aipRuY)FM06t5wGls281Zlzv^nK=#M-)G+KX|4F0hJ}$lEqZ)15`aQ z_KtN~0)h*2Pcsd%emT@whcbB@fDhhlyR~dVO;3iCKaso%nlLjvGom8O@+Et^2^w-> z7(*bq0rV%^x%4Z)2$F>2-_Mr*RfV7hgtAFV$9VkFhquja?c@|-d3R3vjL9tHiQ2j@ z%WsQSU1$0yqp#Q6I{dWg%7GVeXnPrH*y>kSxX0e3lC?^7tUG$WOK2kOg$e+*q{UPew^p;aL0<&kCmThTlE0xqBxg!UcBt z-L9BBsm}BB;{g{Oa{lX23!wY^?+73_`;|3r z1Ngb^12X}NNj<8^?8DfxKb*w94SH6wzv%R7ezBb-N>5l9q)btK!zVu#C0dVJ<#tjD zz| zA>TEytK2124-X=pp6izXo8~XRS;}-L2lu?`%5=`?GnTyPO>QZr$%p;Jn~~RCj-vqT z(ALVe8d63_s_8V|SYog(lmM1XEapY}4i%fsb&aw4ia~ zQMqE8`|T*(m)e`T4YS2`icoivv;KlcgP9M~(`~cdsxjV|JNe%#x)DkZq<;y9EN+cA z;s(h|h%+mIC-iV2ef3 z7p4lK`vs5NOL?Pfwkv%JXd_N|FPgL32?BQ`P1Q#WjltEO8B60;))r)lo3@v?G0R)f zV78Pb4di9o-{Be%8SIR7gUN+E2mCInwuwToHlkWBqfwCkT5ZsE!RzcxVITSs%)L>eE!b1E_R3pBgU; z&N&?kZizzezMa_QMGA^o)fzcBy|rCePKov zy^W}7pE674tumUOVEA%)0kdSL9N(4fG;@5_LYQ$o@2zfEsb)=*ai*r-oD7(9)ju7n3|5eS+lE?;gR$b*k zIpl4f@0&4-STg4m4g9&@Q92m+1+X?Yp6>2I-1-^C4WvNw0w_cQAsqp~!%PCRe2nd% zsVbE`F23$?h8@xSmqVRy;e%F}As1`zbpIK#4!j9y2S+Kl-gW9qr;t;vgh72wsyqQB zbQBQU`BIGon-z*yS}sy<%coqEv%a4y5}f7VC6AsLRihl^`@&-Bp)F{oW6Qm@A|3vgmw8=N6kCQ(TmV zhldhmPBaAGD;$K~=igNuI4aC?n3zo1vy_HYWiKp}PV-_P7~Iw1*1!1>hUWVvj85Wx zc-mKL;n$~)Zgt>m1O^%q2cCWsa5*Q0GqUX#!i;D8IfHY%ZiE{?$|+D=gOXzO1{lZo zb%Gy+sqHu#!(gePknw(v!0mA&T1Hf9jEzaH>*NLpH$28?lZLO=^?r|$0o#^NP=Td1 zp=g1zGX(&oB2TtU@i0`f*Zmdzhc$D#>G$J!8iSJupsNm1 zAX|}iuf9B*9#g2wtOyBW8Wp4AqCpOev%`*!VP2zTBNwi|Z!F8bR*ZLCq=@+}`X}sE z1928QKtz;-)YryiJ!ELc6?+@tYc*OMqj?ccp)JpG;dz z*vqh`JNc)>9~J7aX%OIGFMp8Mkw=sGG234AxIhntdO1_EkJn^&nYu zE06(ONu)d%aBB%wX1lRaiYb*_+3UYZD~AXMM^RbC+^v)%v(z|Hv8a;C`M@{bS@{;= zzDq78TnD#U9#nn58wv;rOUYmd!o{LfV}AD&#iEBqg!&w>i~r^vB0vgeK^)Df9=|W_ z@WHri8Cp<{aT!hzPb0=)xt2U(b7)!G5x)6BY9;6@a{eR0X^2IjgDQC@@;R2Jx6A&K zlWb(XN|yVmaNIj~L_bir#TAEeM1O~O&dGwIxx^ISrQ$xiz8GJPScwR(z<(CN*E<*= z=ChTcrIwfd_EhBgEGFzWMkBtG7eBm(=!-tYWjc-4~Z*zWa4owMoV-o3BUH7JL z;!_Kr_(gy||CE-I@OM~3Cg>u%L5?l4rl;_ zm4hkoLd?Z(s%EuVmD4NB8?#gzCH-Sg>6GxSx7nKmlSn_o^U17d7j!8tTOY>6fyu|m z<&cVAM3LJr)HfR6exTS``8;4E@?E%+b@dOB&PDCNWzo!Q=&3#uxTDLmgsX}EVrejv za+j5IHmQf&TDjPd6jFcvy5v-ec5dP}wwNQ1y}<+)Du{kwl?{s!z4Qz1JWnAMFy>p2 zt8tfMicVj(1oU-rxIN($5fqxu=zuB#t3BE5GTr3MV^3&LpoqPEaNfS* z$huQ#hh<#0^%m$#YWBwX9-3G(M$aTyJCg-wvz_H8BGA?*8nP?Sy!XuwfbtEC3fvZe^O%(*%t%}?16*U20!!VoTM62Jyr)uiSl@!v+vIcq7YkC5~US3&x(to zv-E~2+?wOi}Ix-#VAwAy&#;k+20r;yrID zqpjT&-zimjF-^driLqegFWY2!$mh3G`mF_LG{>dyUo+=c$o)g9R#;Df;eTIb6czC5 z8X9jn=jKfwnC4LLLQ1)5Jf$KkNS`ij}<}Do^ zO4Y)X(PE}PbA2ZQ&ytEBsJarRLMaHCU)$0)c_fYp!rF`ao|0F5UV<{B zu^_WyZiid^q;Z+*8HkXKj&`{RZ>p1--EwSZ|QMA)LC2WVIX5Q%4(hZN?7lHYxeiuI#y5 z=XZ(gFRZMv^8pl;`Z3vJjvtb1MJ0&;vhsYi5^uO;@MzXs_Rik>@85G*wF}?9f@CvZ zw|zF?nLa4URi70$V2;vXxM%;F3dibb7?Gei8wKu!ag3GliLX81c^*l885D%1HDi2K z$cOF=0R^#5ZmO7ob0Z^h2ut2qCnvzY$8r&PeKVxz!pW|soDjb)DL?y6J+$@C-Mp~l zBI5)Vy_J9P(_6=SnD#We9%2V{zo>5c<@pAq<3gZ=W6_}p4XH1>V5oEU#M_4V(pLCQ zce@8Z+K4?6qybJhrV#q$w;KiOoTK8a=d3{uV7brP;>`Gu#&q&x+5 z&6&p`wgqafcEi2D&Z#A@GaDPum~Po-#mR{NaqIP+_O(>mb}c)2-DlSGuQLc>jF)x(VPh6~ojBk3EMmT3yzial)gXX+~=m z`1*yo`b{xzf_q>P5je=FP~ca(cxV1Gi*kNVZa6x+B2y?rF7NrST_+eFN$Z!+UYWOR z8UERj;q&>a$jgPuzyW90naGc}^`;#K^gS&p!P}@Tu0V%}*Nm_Q+;ACfVGUBR+iK!* z5{;$!TvBsCN@x-XpIqi-NqfKt_d#f$LUH%&+^vi<4yHzprxJFc5J+}XI6(iB=1MmE zTOnExsZL1JDC?o1gk_#=2La~+SKZ`jD~(PMSztzPDbb*QJYURFPZ>uKwq}B|yc28(_y6uObEG-e^ zCZuUUuZjqsDQKoI>ZV07pW6;KJ6&9>g;`-8vGJuCeZ76_>m6NN-B3%-d&_mNG^``Q zo2?HxenXk37){-v!LV0y_}l4_Me1i52JFL)7-`ZPa3xEgVts_5W0xdAXllbvU>g`m zhw)QA!iZC@WpB za$D~?HrfKTr1xN>Lqc0^`2RF_mR)f)-5Q=5Tml4w2MHS7U4y$j!69gHcbDKYNN{&| zcX#*T?l8C=p7&Rruf0}RSM`=!t7>2Ou3IhiBl7Ue`o#xn_W+dvC}jM67>l)h6-|z1 zMs3OUCD&<)tqh$4mfcZfzJDO_ino4$`|%uFhGc7SUZGCw5A<*{d<@@h^#$}+-R>R@ z0@ghc*G8`G#njXuXC`>vW#+HLFz}vHQ)#t_u2QkejtGDJuz;=)9%HjK^Sn)baRglc zef+XWQ;cpPH6L0c!FXm1B-BFFI2OD&+9HvD)o-Z@La95-DslA!H8)HE(wv7 zdm5&T^n!(XQ}ywfxYgcW?Fg_;`FV;R?-=uCwDA7OP|tj#y)#*NhR`qg`(Bz_0QRHU z$u@c#*mA`?(e1t#BKilx0h@kMoVX)euh8 zL@YG%wQZ}OBlt>F$Fcut?6bRWKqGum)KpYVO?elQS&t_|(6!3apae!8 zzpQ0>gC)&!LE0`tYY^tkdi%`Q!VsaT1Y!&s)sesXxNZ(22RlW}G%HA#n%|F>@i#zi zCBo@fHk2)NT}TR64s?Nd{6qX6At5nog0Ib6nU^9@j)eq+j#=}KE;wpc7xVAcs)KVd z0jENh2G!SWz*I%kcwxgKOZmpF1iSMdQn~M{6w$?NO)+&CLFjE@eO_C z-CIe+nWHRY*(mU@MOd!9BG=zc0B>D9Jd|KBDITKwW#EMP#;Z9xkqG*C#wF8VYCec6 zpstK}+VgnbEYOpNQ0Ap8OIcrb>Rld-M>s+FVkDzs%VJ))=?)c-E0gIgS^JykWDy3Y zFER7RfDN}yrI((bt$M0D^7alv38Sn1*w4Xb1+=YwKjK|GPC;?AJ%xKP+Sj3%z38m-wBlB zbD)N>oaOm9@IX^UJiOJ974~T?ncBhpZ4Nne#ZTLcw%du9SLi%DpC36R@AgNHZ(nv+ zkiFw6{Wfm!GL9BEBT9QXKH<&&1bwDqcvGhE7^~EcatCB>Brtnh2&lvGucB`$aarKz3R7p2Klqn=HhP{%&kr~%T$fFht)ygl)S%#%m*I%t%rjT z@qyT<`IUv=UXf~DQ^Hic$6bYHzTVx`vi-&&pZxd7*`1Mahl74R1~%H2Y9?EgV?qp- zDUjcs!h0vhyc^>a_67$BhtjziHz~o>eF*NzB0%f0){LVm=5lPi?VpsUX0I+!Mr6GE zoYfuz+%{v!w@$4eHlV&5{(_%E`uT%xDT66NkIWAJhMG-YE}EY2=_YT9mNeyjWeB<; z7Kd)YG;{4;Pj<~qSG>t>820GE=-}x7@VwR(vr6gG7tfbQyrR!|CsY4$q97P=GDpGQJ5aXh zD86x&H@QBfECRJTS$_dN4{kw?mVcSayrJMnyXBMt zBXK$tJ0pko5g!o&66()*_>M zqo-i?grLSX1*{7wG>!|YlB6g5EnxMM)<$xfdX;%r2rKb?6>uTl+6 zzZJD;S(X}`9V!O!)uvi?|n#d}rGNR%{j{pay`kE{*Y4^R_e&2NJ*-L=e{w`XK7d-<(L z?Xaj56ewuoe()iHbU!b7uB1mF703yLR;pcIAX8ASPdCL#ev$so(MH#C!|I%+{1%B6 z&$_zN_ep-bki>S_Be|I(!IGLvCP43^AYjq=&x1Sp0L%GN?4kB_B{fII8Ia=fyL>~`=*-ZU|}dkZXwCv{ChZix!{ z*E=ZTV+12S{<}=n!otAt}cuYA#dY)HUUrG16e*>d-9&dpBAlZCRHZ$w_qm}s1`NYxrqy%y39 zumB?(0sg><1tK084Z5h|3D4~Wxd0@z(V}Uv#b!NLE9#XR11HL!7N5dfpOMDwQHEW3 zZCvnM?@Re&;_r)Ani+#%tDr1VZdtz%OD%EQlL%K@LcXbGEUB}jv@6yA_H&}BhG~eg z^n%1~P-o2gO;cOWz6IE6JS8??Xew%%Lk5$ey%l zrn8C~tOP?04Hn~`Vg}^ot7|Jrn7K(IRkRo($+p!;XBlzKtY*q4nWoR8);JAJ*wPJQ zvFt>?b)DXcikUTlQ%W0VeYA=UgtNC?f4eRJBu9-nUbb1~>_}^M9yX1m^vjT#3DK-3 zdcx5OB9}XogwkJogA`4OJrr4MHM$p<6dF9p;>Fhr#BVK}j5It0`sfx__zxXro;sl? zKkTQ{H{fSfB=bBvB9KXC$v`M~0{#;ZBzdFLiGVp~2s$qZ7X`s!sP88kP{WC0GMd2& z*`&DVZ;=6h>1Q-sRvMdKtT2bTW;BB+xZ6c7B!AOaiv2+_7Vlrs^CpMbWc)0~luyG% zJL8YVk^@gTwz#3BueqU`Ifm$JtQT4g*^HygG3x`Ol*85cBjo6-8tD?7Pb#UyUC!wp zI8KcdU=?Vc1?wKP_}w2qsm$F94~}r}5h8dc!y-sx6g1*Q>Y0npw4-7kf4_k&N3h39 z`feNE_6gi(mz1Pm1?uu)WKJ#(u0Q=AxSZfCBB5LJ*3oo*E;so%QD-L;_F-xX>E{u9 zO|M@*n%T{7v?!vKJJ? zFmN8Aok^(H-+VQxm66PObrWEP%IYf z&iCDJQm38IExGVw)5dxc#V8fep&R(EmXoQz;a-qyIO29i`MLDaS#7cBLICmi)VlT+ zG$Su6of5!T)bz{iuts}EQ3$URZmqhWB2e()_uGJuiF49%kf51xU4aM1?BTdEUdar1 zoMC$N7fPJP6sHZ&o?XM45dGPP8WVV;U`{U^nQEaM4L=}^QEs@vraAv zv(XteL3w2m_UE*}SyQhU5x;Ow-#?)>WN{BE-gb7l6kC~OA&&pl)SeCEvH9*G1vAh( z*{}&lJb`#D=mNgTx5JZ8_w;Be8VT``1zMkjKrJ)b`|OT2z+=HG#}hbZd}yNUztSUJ z-N2o|N01eF7E+O9xJ^4%$wuPE;uV=N6pCsg*ymJK>y+U{>JNrvn0v$vZOFhTl+h=!aCWd}851F1Z+;H^!r+!A(wr8>6O!}X*M13_z?K9= zl}Il9_&>S!IT_iqs%D(E-;@A|aijD&Qj z=w7gStJ|wKlHU6`r5p^VCUJMa=6?Jz;46DOd8`RW#GI#!kQtkqRhg7v@4Z5!BIYDh zS1rE(L`#$p>a9KTXuA98woy@xamYjEO-AxLIgNH1!VLg;< zelC)C)`ANB0)$CN+#$bzo8S}d>R^eYQ^FrV&EfuH*C8;uNbSgxHxjPGbsEV zODZnp^GUVx=H@2*b%dspw$=G;I&qTEJHb4g2Aas9|bH-SFv}=V_hP zPdd^Y)pcP8;xPAOpL{Vm#2?zupy2X)X^EEmf4K8DaTVrn9cI3^OEyOD(=t=#FAg@` zE>uiNarV0wvANclX5lnO!xB#Z(}Q?XwlR5|v75VMEcQ z1YL5dUsGp$Mb?#>0HC`=<@CVB%MKwM0>^wP7xz^7JuxmIkkq)=G3(ajVQA|bGAkc) z*ZKZ>k=@y!kSZ8+*Lu;>y7oapx@91KjwR9xU`+J2JnK5b@(JFxj_sbiP4HyIKFQozmf zqmGxEDV*+zo-qsZN*;jCVp6(}j`vj{uuIk;rfo;k&vi&;$RA!=(dxSVplT~#J}54F zpXb#Lp$}b}S>V+Ny4dKs&yq=H^YL)>?re3mr>D3i5hKqM&^_HbFRrI=_IL;goiZ_z zAo`^c@frUdawYf5Txz8DWuY z@5cOUUIqu1KmR#$6!bt6`KC6TOoiNAd(M4}B_n?|vsM(U`Rli7Wj3aNEY^lI&Ccy_ zPo6jU6|&v{RDO+)4+0bX->vK3RJO39z(gMNy4yke9!BPa$bY2?j#AR4?ptUD;h5?~ z-t@gS2EJ320bTII4v6V1sSG!9FM`~V{d(yyPQO#ee6E=qJxm>~#KB`B)-lfZGk1q!Tdi*b2s7XBMO}VFQ&9xrG>#!qjOGz4U zH#@QD24=%wmJ*z_?&lB^sl@5afy{9~NJ^-ezazl^Fv3mdzz0Qq>f^mZk$!(J9}}2z zNj?qe8-)C%CnVO&_zkZ4nzprA^i?KM(SN=k+x=X70m?_S!+s_&HWoTiI9>t<$$P5; zp9RQqB-`%s{`R_;)cIoaxX;mv8>|&H++v&zIjOY>DL?)1Mn7TF`>xj9+@t}Qdf5$; ze7z>ldLw%T8aB?&AK^S*=3-{;2e7%swV}rVFOAuhiOPbK;I97D~ny$t9LJzpTbOWOOeKP9t3uR%WQMDfK^mII6Dq zLoX55?S%=A#^jKLMb*k+Gl)bjn7VfSTi<|{1($znq<{LQkWx!`oUmeTiO8@m(7 zR(e`LFUWq}ma|LEX=KJT$yq|%Av&)rpVG#Bc|7;lFND@-OBErJ=(Vy5o&uIyzhdg5 ztYuTT={^zJ9hp^Tt5+0GWMLlQKlYOax%CZ{%T^+XWg=qENl^)e4#Eqrx#T9Mb$WGy z-L)Q^l}q)l!n7}+%yZjMF&(k-zDZ@AkM?=lxn44gmgVj|zWMK_{rUr`r;BiUyFVNΜE~xPnSNobiUnI!YyG;^yc2sjQY4Sllppje>W*b9aR^E zYnn0*$k)kT%_r#il|biv?rZA{;y9koXTI_8?gm~vySF0;$_)Q+snY;oRgv54%v0&F zzOA%^$^MBQ%u+N28*B!QYdlcql)|z&PQQ~dOu4#nDYi4*kBhHAgds?fZ$Ih^>UgjE zFfg+9Uavl65`4(|Uhg;btXt0-ko%8UA4B6i-_-%t!@Fw91$1vG=(KIQrt>IH_FA&C zV*UDAfS=(AfbsRFTH5wjpg+GNT%cFxf0-*=kCBJ-QfnaFNR{{KZGfZW^ZbR(8yF3D z*A@m?l4aTK4mB52uY9VT7cY}vIfX~Lqk^6%WQE2U?2C47iW zk4=OY2`_F2g6A$&Re}05u}ig~cDa<_W74ETJe-P73ZQMA!0$FY;04o9~1K0Ro-uxss(} zLvLTLz8WSB408|Ov2cBvNRoHo(puqnAWF_0958d5*1WxFNrn+KDFg5<7KZQFs;2N? z`k^LNdf%1;`{)|ilqy@jik=Q_WF<%0d#gol}}&k={B)G_&7v=lZKh_5F`woJ&6L zk$d*0q{nt)(J;a{(s&*}fJSui(PHPD(>^I}xH`*3&Bh143cObDxCZAOyHLa{E4ml9 zjBBVreZ$_Aa_`a~{L4!ruw;5JqMw?XJ>64VS&MAX35|j_<5DFLCrA(HFbvqr;fl_; z6DFZ=>w7vITeP4`wyjwl9#Se0AW zecoSj**ot4c}yP8=HuhiVJziUI>wOQFp;_~{q7@VLp<3PbBF1VqgKWE40{|0)5TMh zK$pWVSJ7<|042sZzCQ!(!2+j@MX>XAx$>vC&IJaoJRun{O4;ZW-)hLhiFjZ$R=lR< z8OO#KK3>PU~r&UIYYRr#-DqZ9tCz}ed& zdUvI0jQCzoj)b8KmV3*%^59;~#)m}|mLz#WC!7?Hvq?J65@A$$!h(e*W9r)~$b8gJ zkv4ED&HWXXfxBF-9tHl849Nc2xqXJJsvm82_rU5J)rjluWly%%EOVJJyOb$OxMKwFcKkKYuvqks7f_>!i3&&LW10%s!?i`RLu*`-&6~kXXSS4c43JR2nx)? z&B*WOE0d7Xu(H5$6KrrPn%`268|STjCAvp>L4rooL6SjslV(xiom!q9eF|Xp?zQ35 z=XkM#*dqcR`?_IVy(DYi=hIr;>d!cGj>QyQVSBbG|JAA)7P{Lvsos7+@x=jaKDNf4 zRkg+GfzjCJ0VEN6>pdFd8(2CTo7K_#hm^T2Mc7g;qKn4$m@QmbbVBW zyT0K-i!p~|m{@Jl#XU7N0EfI|l=2>zN1h$|b+`rVu4A(8so^kpI-qbX8dU623)Dj= z%kwShRXv}#tzIX)4ZZiL#YN~qr7fAbY=4({9Y>!|7^ZN4^8qJ@qa3vC807A-9440UH>vGoXykfFmP|0$#mo5eTE(NKC`-E{4%85K4-85c44teg#}XS z*S%c`)swZvMIF!Ev^=bcckgt_ft(Vfjjera9pRkStT~V(-HIQ=^RBke6;kp=wQkzv zmlLYf&m5Fbbqx=ponrIbeVs~H=fOHo2@E$V5HEURhhgAnSd)G3@V6yO13i+REt;|9 zyX*UN=}K1`3D}y>AA7s-qS{O}aY4UQzSzG;NOPGL8&`C!HQ7LhzkvuTHh+1Dw`riX z`vn$_N@(@yi~hq4mV`m8!xKLzWHIs)hmws&gT*=Q({0J7DRkwD>GHTWC616WC6c7* z)zjl43q8{>jc*097d`_^#+*^F7VBoF2P;@?){6qP8CYKN8wExuVEt=Os4d_$iQ0yk zG0gtv>tVeQ#1G+hccc`Gg=|)MO-UDVd!hFhQZ(y40g+;;hJzMk{8314Ol!(tpoi z5>3Q4^;@FR+PA*Kb@{y~DP}+_T-VXP;0-YEf<&2n$g)E=#QXi3`GhJbXXvx6(t#R$ zcBqs*t|@8QVXG$USQ*pNe{=a|@9O1>U=SMq#Dd|kdA~5q zU^37bt{jITm!nku9>(NngggWebCljKN||6C9K2^jyKOeT0?{;lKzm4%-?)#-X5!+M zpjl5J8C?b*25i#OPB@CJ>)!+!6 zV0$GAUHkH=ax0^lhZ8m$hfQ$>E7v#lUkg_b+ejNjaLmF+@SefVN{`HjGgjw-@>vUB zAoO|d>8BVl1uzyhZK=~YYPn(Ei8RiaGcNFxkdf3sqhjG#jwipXc!ooV0c~zozqohg zXms(s?+CY5!x}lE?wMNjE3j;JMH-r^a0mk$LmJn{Q91o3!EjG-L4Qj38iTED4h zl!@)}0!@jV)rIPZ5c~6biVn4+%hmYodlNGj8AYIksqM`^+r`I{;%ae{BKs(9L46M$ zkV?w7OH7&h@?_|Wo1`rm(-bLOQ2YiG44Zwoy}#W!yPQrg^%EaZF8Qo?O<7)$1Z~&r ztw4}peE{R34VhY=E0z$T1%*n;CMS9Hq%LP{$>sKGz*Z+M=ninR#_Rud4505;h#oQs z$-%HK>y{E2XKwvad<5iR8tU!r#`&kgZ)KR!NE0i3uHOUiFs@h{FC-7Rx(z7)n(rgv zNQqj^zD04c63tx%kW9OEyM&Xx`U61E5E@(f_@1uFZtmYsujp^+(bJoaOiG3IJV(W| z@kZw!?)w~q9DFGr{@J}l^uigg zZ3a6vOxj53+Q$+p=R6jKgXzCX!`pl(5A|bnK$2XJBKD~0%1a#tRZ7kRW^o?qCUt#2 z!cJy4W?V6Iwxe={C_@fGSjjW{q#uvn_SZ%xe*)QLpa?I7!~fiNO+Cfi=x1qa>!n1! zi;xEd4VS!6SQ(I%8*f&~eJ(gY5}`=fAvqjmMaM>AE}_odh(Qa@)_ETYYB}U9V0KvW zl8k=@Prp*fcwrFks9(6>5+d}idqOkLmnTKr^?i5Cl1Jb<`5937ZN}yjtx2XsR_5yh zAnC&C7%-jkji(tpu(sQ=iA8{zMKM;##O|(+zxVrG_f*c4&}&e!XG4#XdP-qq-}G5M zBF4>B1_tVa0er9dIW6+|=EeQ$lP{N&24(Rb41`bo4{LumG zeroI^y5=YC=%}*exvso8%a?(J^uy9Wa5~J)nsU9_#^x3>44Grx(pncDqW(AlBSi$> zZn7#y0*Ms_fIM0q24AGOV(_LzlME5D5|qqWw*u-^+coIS`0G=7$U=Mz;?41*lzrP* zj9~v*i{4<$6lzRMfG$4N9^Dx3iGgNM)-fbealjhkgIQ+mi-R|=DI$5O$H$1T+y1Hr zc5dJJrfA?jn_u}wurBxX*^Z7bF@_GoKx)?9tq2|IkCyurLecM|aTVW5VGklQh3F-Z z>%MlVVV7-GGmnA=|hk2o%>#mO%h{>8`nE zz{)%`!idE%jLI51EdMq8mrV=@@C`~9j|)y&o11#^lDQyauifoJTVR&??t7ftC+*op zO?XNSCs-NYhv^JG9MxclZ8^L5^*XmWO&AIX(UQBg1|O9y;cUis=$;!7u;2DbD8+#>3^AG9@^S&LIGaE zyv;7dj9+8Td%qXGTf_}RH60d-AnN;_rQDcdz_}dgnC;MDv2ieE;!2y+v};Z%h0&BfN1ZZ!#5HRmRjN{! z_u*=`vY9b0l1WqxWZGQC+hR`|4!VvD<}Bo`!-Su++J?PXgy3F%=IU~L5+>pTKWQhC zTRJsI|7hCG@A79G>KWc)8*kX7TNt$0(z}tvJWvgn2%NY!v`vQ$-rqzvC5Y4-Pg^Qp zGWqTkS1X%4tWx*-c)X<=M5ecyEM(T_xpeG7?6{|kB)w#psHQvpbPEX4+RL7`DDO$EY!z(8GE@}x&;6=Hu%=h6F~7q4 zF0-k1z{(+ZHrz9Mq2li|+Oi!bRiz0R*nQsGiXR+}_ub0$$fWmiyPm#&`Iab;k=Z@b z?+RE^Jzea04%QwSyzo+Ac3A%uBua^ic4XN##b|#R91AwY$6zh&zwnBZlikKhVHTr00R8g7d{Px?gs)p;E5tIkCqNmtrj zw|`rae0edlau2lmx^b|Et+}g2|LxPRZVFHvcSR4UY#D#;QkQ$jps}q%D=Ljsm+;@S z%;Vz*;dlAd9ekuBS^O){yE40VuzHe*bz6Pg_=apF_=BOgAeu49qR3o7ciD|Wcb>`a zW>ZVyIAkRS77x)$Vh|6VP6a@?VBj_Kfnh2=!Xsf-Ze$S-ShRs-$Es1#P8|lY!!eWl z6g{<*J9}u?H9!&5F$u&Dp}IE`e8(E&)XK*uF-h|uLHQHM`CtL?xX+&T#f$M5*$+Qw zNm>X#(5w8rPs;7tkkeBn|Bc-H`BHdKZ<0?Lg@ETTe}4-`Xe9*(`E zTj5&!^M1|qNV>`3njt}kQ=qtD(MjXm@Z~q>FpRPik56M-{mF3Tf^Z@u0PNFeTdV8k zYXSr#qHz8IB2h>#OZXjbg^`{xoP79Gq-U!qz<^G}jj^Lt?M9PkpLzi&O2_2Oh?D%* zPuv-lnzwQZS(`1VaN+t2^%uve#ms^G323_;!zF6b1TqF9pL|}2&Hn2{B#%*Hc>%=? zfuZ94(_hM3ZG^Q(=Gx6y$Ce}O9P3*A0AlOhiz?3E&oR#CUkxeNkvmH$Br&=qXeJ!M zf$o0nuhIgYjvY=H=}ync#?)~?*c2OC@ib0|1QF2hb$7q2QT|Jgyjya|=3G#N?X&?o zxB(4wgh)Owjc!IbV?nh@{%ijvg(z;b3&fScAlBdFyBP0a5fztoS=40+zVJro?%Vm* zTyJl6YrO2C?*q7kgg=jTt4Ado6)97~!0J75DQ_4iKJ04-SBqpC@aQY3qCXHN zAKlrnN0s(u;c`jyOK89b$FcxZyyf$403yuuHKs=ToDUr~X@AXqZE**w^v$-$jKt!9 zrix^KGZk{1`Dgsry20`AS_31Z#ZJv14g`v_zp=2UV%9Vyq`N8m5x}<%9U43=Y=eTw zgmTZ*n7Q*ie`y_-6h8M%@$H;5*`PlkAVNBZlTxpN>=d z-qvBvQ+)x8P#1AXF}pr0gXo1oP&c|^lM1B@_HVrCJ9sGMyzXy#0k3}!6w>bq_*GCG zqGk~GsnmX#Gf5`mG%$5mIXp+%?@U;Z5G<~1Sc7mDnJ;Yn+X_87{+1jBmWIXE(D5J7 zT+$PKi-1G0^bI`@EXjA!ftvS=zDFV3!PbxXYcfwgLyTc#b$L~H&XH?e6eOF{jVz4m zGCF!ZVGM3@=5Lr7c)v}0nBvB8%Shi%5?W_SH@d~24fLQO4;`C^9B0qZ>*S7X8l@(e zO0(!|t%Kp41)Jc@@Yoy zg7RxvIrOlq??t+N=UBrS%<&bTWQ6M}j|@x%a%O{XD4>M*EiDHKI)k-~u2ei;Sp&46 zkWLM3Cm+AoPCZ5uqIK#F-gNeT5W@Z?o7V2Wnc@$VDnesoN&052gTl!g2+pIJ;^-HZkI& zf$uOB_4(6&4p2LVl^$vonIC)$BsrUG9i2orJ=3PRC z(hoCQFgWSKMHfiVfnD6D$n?hJw0pk)a4qWX4O}e61{$P+c$Er(E3Tm$3?(Ar6AVp) z(Wc$8s-;B=x!Di@7<~`x&C7ca&%^(5j-lJ5&|H4a|0IWf-%C;N^MfcifMjczBr!pRP7|^xeBnmqbKfpM{OglW4>m3OflXnv#a+#ZuV!PUr-0u-@*S4Iw;p$r@W~35zxK_r5xEDgiah>b4Rn5v6Q|^Gn zVqnn2Xl*2htMI%KMkwZCXioA%!?f}!0raOsA27#Q2*rpliD2Lj9b%b^qh>NgDsDu7i_pl?O~NO2QZ|N9h{mjdqhp?p z*T0)C&HqBSfJg~bLBzSB^=pJ7PH-Us7yo7?tq9-1Li=u{mFo1e8o4C>&B$-DZqAu$y;kQ(aR~IotM3OGZ##0cI*5L7kLQg5KwTt6QCMLKOG6sxbSwA)x!Dp(ZxA_O9>jYV|#=J#2uqjB^3X_5KL8@1nhs%u6L4nO|EkmZaS#yqyxcJWMEN$r28uZI9sMK9 zWnqR;N(*RIiZuvC6!BqJZXpY4*QdzKe#E`c$N_3-n?K(1aJjOsG^@I|9!A}yB*?py zs?w`rBHmif<7gsmjOjXj)i5Oy3W!c&dO#i-I%$Q0wvxfbVNZFPS;gYK|KvX`PDCt6 z<0pZvlET)Z9D6}d%w>OAebDjLtOI!kbf@TqsOMV9FqU53F2aTaX+NRXGfeS*G^La4 zknw~?)!_bKb?7_wkMr*zR^PrNTck69)50`K^eH41haE!8Sav*!Z#tkzhIo9N!of!j z8`e#=$#tCJhO{VZ(h0LsB2l=Ss47@jFJdt8@9${Zmi2kV0>4obR%ax|r}CP(VcYSc z6E<3TSW9b`V+CeU74|Npr(_9eBIrmbMUYK|l9# zlAIBg16E9qPC4-PcSC9{TbUe6a^h{nQ6`6$L1kGfDKxR!I)PU_<5?Q6@HHFTz~P1q z4>~e213e-8J{4gy4e--OsHxs7G;(Tj17nU;?XENBHJYIVE@sA&;5#L;8~bL2Bk$j9 zpv43s{uVOUK0Ooll%8de!&HJ>jK2vo`fHKb@_o~7dV+52N>N`I=4j~fm5~6m!|j^* zW$78Qj|l5$A}57#szJ=&`3bMMIJ)M0^bMzamr&#!Pl{kWI&^XuxnIzIrC&B|2TmPs z@vTlu*z#F?jI7Cn3)XuE&2LR~U!4W})NhwwE%Kvr=yIuX^`QJ*U=oOJRYpjk zxUeX~ZyvbgEMxZ{11m|TbGh!(ae!CUCQGKxI%J16_Nqlri9Qeg*<(CI{ps;0#_zv} zA5mf3SnDZVX1nRFy-)z1njjGTc9~CZ)kT&L`X6c4*ksKHpDYzy@zhrs)jUswA%v#s zGzWwT-v?CDCGwz+F6}*yaVu4)0!_4`E+*d6eO5u0&)7?pJ&5DdX*9{%-i%zDuN;Q%ijqKLWs zwe5~&I#L~X4>wMwCHR4Jw@kROvXpZ-^6Z`*^%KmcXdugrlQi`}N zUNw8_f^!_j-jL$HU_llwfj9n0@Anz)-6Tv5uZnR}c}Sg8iN%99ZTwd<`*>SqdxS+i z0}kGI|38}n(k$<=@aZ686|x<`cTN8*EdCX5Bz(7@;ejixf06V+q{MHl%+@mJV!3Q6 zQa2te-jJX3!wdY!3UEK3V6RA=YDC-ddQsda$#eVxEs7@B5K@4|6RO5h zo>6kA{8B%P<-b?6t(P+i=tYt%UXQ(|#bxx?rH=s6Onl%jHBx_5d`3^bBj?Q!$nn?q z1va+UK~<&YP*Z(6l@b553CCFUp`F{{IyugT{_AJHdm`AL&_B|bb5zK&$9ny9VFTI} zR1y!d9ME?&>w*!&1j!Gq(#vky4JHg$y$>#WR1lsQU>XJPeyuvG%bZhzy;6uGzTtzMmx}W zn9#4}zy2wf&b!>(A+oVi1p`kGLQplH`vQX`5Tb#-(aj|(5sI5+Y%4TiMz8Y`ZJdKO zE_w|c?W2seNB|DEN@=dY3B+#_P+g3)_#Cp`eq<@8M7=$&=R*;YDvqbG=6C^_UjM!J zTq8ZSlC%l2+b2&X`lrnvgH!MG(Q4a1_g{XfubC2w2Y$sS&Qt0mVK0w$>4q(jxYoet z!GBILQIG7Q=RaKlhRYl?FblhO#FUhdod$MW%$MoIpdHCX<9kljQ%p!de5@xQCnYsk zxt*3cxoVV&U56I(KwxgaFoD8>@3ns_Q|mszwV;Xm8HzZ!8S-C5^3MB(P!~Ex<{c9G z$;<&rZ_wKyK^`fgtK%YRHz>%>*O*}Uh8edUlZgFOX?^Iv<)n40Zy{maSTFPO1L`Gz zSOGo!qUoUytmY_!v}@I^=Rs-~tg6Qe5`#(M|C_pUtf^`G!GOI`NW5b#`fuim^T6H; z3)x!7JU+vjTd8HF@tVlb$Opyf6T++?D;54mf%uF(L3ioZIwtNaX9Xu>`AXoO{)6wY z(PFB$;PZ9ljc50i;={HU(=xrQ z@S)~KL9xNbR3Cw@tc*$eZC2sqe->n8iQyF#d}I$9S=ER@8Q~A>BnNBZm?!`J$k9w} zs!Zt2pFaMMA)bXno`Hqb$GYcK`Xz=~6F$EB|7gI=cObDo-7v7iBt&b G`~M&Jn`wCf diff --git a/public/assets/player.png b/public/assets/player.png new file mode 100644 index 0000000000000000000000000000000000000000..c7f52d156dd3f9d6d5602d4825855948539caffd GIT binary patch literal 1679 zcmV;A25|X_P)0GK_A3vUyvt*xCW2_o?cSf+nLirnAdzY!e|B4GhMqWcbbL8z&z5q?fo zK7l^cKvh-MI}#)k3cx&18sKSB_&JeK0Gu4sgYa|yqL4T~KF0SM=kGnnXLxgKJa;E? z4<4Q-B?vo2p;!Qq@>4A2swF(=XS4rucz9?JTKl8{R$`U}2}J=sIK{pG{`~y>H)#NI z0tpg|0z3w%82;huD?u7SfJB0XrGS52ZkavS+S;1u#;=juJJw|4fv{!)$DYAJXkS-X zR~vlFksLXW3JsDV6a{p3btPEXPkd<(Qm_a4fXizpJj$A(A;^LzD z>FLQ}1;zc!!tBxWJcji1Clu$IWw;=5lCeIEjMp=?D*$0B8pJREzzup!|4(_%_B?OR z`8huFR%R#d)JOzKR*Zo9eFcJ{PKE=Y1bY4S^mNrLd4i+~Ti}e_eQgTh1|xL^M`u{l zsY$YMDZd^o#7}q|FC{1|0D`m7^AMc$kYm4Krl+STO+N3n5-5SNvPPNWze^8-Fj01I zzo8Ktg$FTqkiMRroP5DM+zN??&~D|W6aejWBlk25Ud$Af%kJ_Ar<;6FDD>sFI+hn! z0D>AcOk)J+g>4PLq`M^E?^s?)0cZ$<8VVnySP7UBNDRmFffZndvj&w9qab?3pe7VR zvBfx+52OH|Zu-mA^FP6#!z#ufTw`hzsq0qWR{LdQq$^)v3JM(?%PE2~-q|iQzIiT_P>Kck!AXAb zBt;O!18f2BNfB2C$n^g5@-kgrUD4Rsn0fe-&1PwHbCVhx8ptpV62;BE6~QYjY>)sO z8ymE>wPjvIFeqYteB84!J@71#2nBwj8HAF628qJKvB3jtU48Y0b{g(!s%jR}oVXC_!i4VpKl^$7zrU z7~dr(KLNn``MLJG#mFp&72@Ux43iHSxcs=iz13c~81@d87FHbC0BeAxfZG`G+bBS_vs|YSPK16}&HZ0qUefOFE`lq%zP>j9Z`0D! zVje?7L&U)hH8wVq1Ua4pTS)=ed;k_IvE)pG+}zwyDwU$0ogGtnKi1dR&GX2}2rVrw z2`K_uAyULu0o?m(5e3+SCzDC@8bFxA!9nwAYHBij+y>UbYYnD#KvCP<+awAP)(fPF zrw7HK0hYjqDFBO$i)NMwK;Y@=Y16!eP^hq=aOWgBC-{jJ@!Tj04P(~@1pvaLS0^VY z0}E~=^Zo1Secli45!>3R%%BZy`dXc|z~M0V`teDd=}E9)wLvSwi3CoT7<`iYfs!of`BDfEq%tY2 z1gywlzd(#i2o^bc!277W{N;sIMu`3Iw6(1@MI{2OyDa=bDTN2h`vi4c0|e*8D7D}= zx_63B@ul!`y0rxsf+xZf{Kvbg1X#OAVHwz4gbfRC3-=1Mu>T^CxAqLDA0Hq0Rek`i Z!hh}47u;1KIHdpp002ovPDHLkV1lBo@Z10Z literal 0 HcmV?d00001 diff --git a/public/assets/player_jump.png b/public/assets/player_jump.png new file mode 100644 index 0000000000000000000000000000000000000000..016753436cce8caab0739c278fa2ad8a47676f4d GIT binary patch literal 1644 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 TBPAfh00000NkvXXu0mjfkc`8v literal 0 HcmV?d00001 diff --git a/public/assets/tile.png b/public/assets/tile.png new file mode 100644 index 0000000000000000000000000000000000000000..3070c86784819c9666929577eafa08d980d6b635 GIT binary patch literal 687 zcmV;g0#N;lP)G%gtm>8uf1MxfUdwF z-}leC^TOS0+6@C0hIhTIt2g0!USASD5P!Lpk{Zn>ZIdVrX*Qe1eg5c2@#*^tFZFtz zI^8bo5VUQA@t7u)N!)kzKf6aq^gEr>n157CC4=FW2m-8002ovPDHLkV1f}SD!Kpw literal 0 HcmV?d00001 diff --git a/public/backgrounds/temp-background.png b/public/backgrounds/temp-background.png new file mode 100644 index 0000000000000000000000000000000000000000..3117dcc2d14d895fb164cb15b46279557ee495b4 GIT binary patch literal 2557 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYU_8XZ1{4ubUV8#aaTa()7Bet#3xhBt!>l*8o|0J>k`Ftg=5hcO-X(i=}MX3yKnd!NS^EOUP z1{zi2>Eakt!T9#3_e5qxkpl^Nbu*8Ds%t=R9EK?eQ<+OMGGz`)SZ z!@$VEV8q12z;J>?04S(D^aT4E85+z>&Pm2aXP;eOIP}~X( literal 0 HcmV?d00001 diff --git a/public/index.html b/public/index.html index 632be3a..c9dc30e 100644 --- a/public/index.html +++ b/public/index.html @@ -2,24 +2,22 @@ - - + + - Svelte app + ColorQuest - - - - - - - - - - + + + + + + + - - \ No newline at end of file + + + \ No newline at end of file diff --git a/src/App.svelte b/src/App.svelte index 6b045c3..d1e44be 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -7,6 +7,8 @@ import LevelSelect from './routes/LevelSelect.svelte'; import Game from './routes/Game.svelte'; import GameOver from './routes/GameOver.svelte'; + + // this is the application of the svelte-spa-router // e.g. /#/game will show the Game component // this is kind of like switching between HTML pages but we switch components instead @@ -18,8 +20,7 @@ const routes = { }; - - + \ No newline at end of file diff --git a/src/components/GameCanvas.svelte b/src/components/GameCanvas.svelte index e69de29..da0d4a1 100644 --- a/src/components/GameCanvas.svelte +++ b/src/components/GameCanvas.svelte @@ -0,0 +1,203 @@ + + +
+ + \ No newline at end of file diff --git a/src/components/HUD.svelte b/src/components/HUD.svelte index e69de29..6bf8b7d 100644 --- a/src/components/HUD.svelte +++ b/src/components/HUD.svelte @@ -0,0 +1,54 @@ + + +
+ +
+ {#each {length: 3} as _, i} + life + {/each} +
+ + +
+ {$fragmentsCollected} / {totalFragments} +
+
+ + \ No newline at end of file diff --git a/src/game/Enemy.js b/src/game/Enemy.js index e69de29..f303c44 100644 --- a/src/game/Enemy.js +++ b/src/game/Enemy.js @@ -0,0 +1,33 @@ +export class Enemy{ + constructor(p5, x, y) { + this.sprite = new p5.Sprite(x,y,36,36); + this.sprite.image = '/assets/enemy.png'; + this.sprite.collider = 'dynamic'; + this.sprite.rotationLock = true; + this.sprite.bounciness = 0; + + this.speed = 1.5; + this.direction = 1 // 1 is right, -1 is left + this.startX = x; + this.patrolDisctance = 100; // how far it can walk + } + + update(){ + // move in current direction + this.sprite.vel.x = this.speed * this.direction; + + // flip direction once it reaches patrol distance + if (this.sprite.x > this.startX + this.patrolDistance){ + this.direction = -1; + this.sprite.mirror.x = -1; // we flip the image + } + if (this.sprite.x < this.startX - this.patrolDistance){ + this.direction = 1; + this.sprite.mirror.x = 1; // flip image back + } + } + + overlapsPlayer(playerSprite){ + return playerSprite.overlaps(this.sprite); + } +} \ No newline at end of file diff --git a/src/game/Fragment.js b/src/game/Fragment.js index e69de29..e045468 100644 --- a/src/game/Fragment.js +++ b/src/game/Fragment.js @@ -0,0 +1,62 @@ +export class Fragment { + constructor(p5, x, y, hexColor){ + this.p5 = p5; + this.hexColor = hexColor; + this.collected = false; + this.baseY = y // this Y will be used for bobbing math + this.bobAngle = p5.random(0, 360); // so they are not all in sync + + // not a solid body so player can pass through + this.sprite = new p5.Sprite(x,y,20,20); + this.sprite.image = '/assets/Fragment.png'; + this.sprite.collider = 'none'; + this.sprite.rotationLock = true; + } + + // call it every frame + // callback function when picked up + update(playerSprite, onCollect){ + if (this.collected) return; + + // bob up and down based on sine wave + this.bobAngle += 2; + this.sprite.y = this.baseY + Math.sin(this.bobAngle * 0.04) * 7; + + // slow spin for funsies + this.sprite.rotation += 1; + + // check if player overlap with fragment + if (playerSprite.overlaps(this.sprite)){ + this.collect(onCollect); + } + } + + collect(onCollect) { + this.collected = true; + // save position BEFORE removing the sprite + const x = this.sprite.x; + const y = this.sprite.y; + this.sprite.remove(); + onCollect(this.hexColor, x, y); + } + // draw color glow around fragment + // before drawing the sprite + drawGlow(){ + if (this.collected) return; + + this.p5.push(); + this.p5.noStroke(); + + // glow pulsates based on sine wave + const pulse = Math.sin(this.bobAngle * 0.08) * 8; + const glowSize = 45 + pulse; + + const col = this.p5.color(this.hexColor); + col.setAlpha(60); + this.p5.fill(col); + this.p5.circle(this.sprite.x, this.sprite.y, glowSize); + + this.p5.pop(); + + } +} \ No newline at end of file diff --git a/src/game/Player.js b/src/game/Player.js index e69de29..983b528 100644 --- a/src/game/Player.js +++ b/src/game/Player.js @@ -0,0 +1,118 @@ +export class Player { + // p5 = the instance, x and y are start position + constructor(p5, x, y){ + this.p5 = p5; + this.spawnX = x; + this.spawnY = y; + + // p5play sprite - this is the body with physics + this.sprite = new p5.Sprite(x,y,28,28); + + // get the character image + this.sprite.image = '/assets/player.png'; + + // we dont want player to tip over + // lock rotation + this.sprite.rotationLock = true; + + // how slidey the movement is + // 0 is not friction 1 is very high friction + this.sprite.friction = 0; // we change later based on vibes + + // we dont want the player to be bouncy... for now at least + this.sprite.bounciness = 0; + + // game state + this.lives = 3; + this.collectedColors = []; // hex color strings + this.isInvincible = false; + this.invincibleTimer = 0; + } + + // this will be called every frame from the game loop + // KeysDwon is an object we can use it is {left, right, jump} + update(keysDown){ + const SPEED = 4; // we can change this later + + if (keysDown.left) this.sprite.vel.x = -SPEED; + if (keysDown.right) this.sprite.vel.x = SPEED; + + // If no key is pressed, slow down + if (!keysDown.left && !keysDown.right){ + this.sprite.vel.x *= 0.7; + } + + // jump but only if the character is on the ground + // p5play built in = sprite.touching.bottom + if (keysDown.jump && this.sprite.touching && this.sprite.touching.bottom){ + this.sprite.vel.y = -11; // negative is up in p5 + keysDown.jump = false; + } + + // for when the player is invincible + if (this.isInvincible){ + this.invincibleTimer--; + if (this.invincibleTimer <= 0){ + this.isInvincible = false; + } + } + } + + // if player hits tar or enemym they lose a life + /// if no lives left, game over + loseLife(){ + if (this.isInvincible) return false; + + this.lives--; + this.isInvincible = true; // wont gain damage a little bit after losign a life + this.invincibleTimer = 90; // 1.5 seconds if we are at 60fps + this.respawn(); + + return this.lives <=0; // if true = game over + } + + // respawn at level start spawn point and be static + respawn(){ + this.sprite.x = this.spawnX; + this.sprite.y = this.spawnY; + this.sprite.vel.x = 0; + this.sprite.vel.y = 0; + } + + // player walks into a frament + collectFragment(hexColor){ + this.collectedColors.push(hexColor); + // we start getting color! + } + + //glow effect around the player + // this should be called before drawing character so its under it + drawGlow(){ + if (this.collectedColors.length === 0) return; + + // we want the last collected color to be the glow + const c = this.collectedColors[this.collectedColors.length -1]; + + this.p5.push(); + this.p5.noStroke(); + + // draw a gradiet with circles that lessen in opacity + // fake flow effect lol + // measurements based on 64 by 64 character + for (let radius = 60; radius > 0; radius -= 8){ + const alpha = (radius / 60) * 40; // max is 40 + const col = this.p5.color(c); + col.setAlpha(alpha); + this.p5.fill(col); + this.p5.circle(this.sprite.x, this.sprite.y, radius*2); + } + this.p5.pop(); + } + + // flickery effect for invincibility + isVisible(){ + if (!this.isInvincible) return true; + // show/hide every 6 frames so it blinks + return Math.floor(this.invincibleTimer / 6) % 2 === 0; + } +} \ No newline at end of file diff --git a/src/game/TarPuddle.js b/src/game/TarPuddle.js index e69de29..93f7463 100644 --- a/src/game/TarPuddle.js +++ b/src/game/TarPuddle.js @@ -0,0 +1,14 @@ +// the tar puddle is like an enemy + +export class TarPuddle { + constructor(p5, x, y) { + this.sprite = new p5.Sprite(x, y, 64, 16); + this.sprite.image = '/assets/tar.png'; + this.sprite.collider = 'none'; // no physics needed just check for overlap + this.sprite.rotationLock = true; + } + + overlapsPlayer(playerSprite){ + return playerSprite.overlaps(this.sprite); + } +} \ No newline at end of file diff --git a/src/game/levelData.js b/src/game/levelData.js index e69de29..226cc25 100644 --- a/src/game/levelData.js +++ b/src/game/levelData.js @@ -0,0 +1,81 @@ +// level config will be in one array +// index 0 = level 1, etc +// edit level change calculations here +// x,y = center position. w, h = width and height of the platform + +export const LEVELS = [ + { + id: 1, + name: 'The Gray Beginning', + color: '#FF4136', + //bgFar: '/backgrounds/level1_far/png', + //bgMid: '/backgrounds/level1_mid.png', + spawnX: 80, + spawnY: 380, + + // each platform: {x,y,w,h} + platforms: [ + {x: 400, y: 440, w: 800, h: 20}, // ground + {x: 220, y: 360, w: 160, h: 16}, + {x: 430, y: 300, w: 140, h: 16 }, + {x: 640, y: 240, w: 160, h: 16 }, + {x: 320, y: 210, w: 120, h: 16 }, + ], + + // each fragment: {x,y,color} + fragments: [ + {x: 220, y: 330, color: '#FF4136'}, + {x: 430, y: 270, color: '#FF4136'}, + {x: 640, y: 210, color: '#FF4136'}, + ], + + // each enemy: {x,y, patrol} + enemies: [ + {x: 430, y: 280, patrol: 50}, + ], + + // each puddle: {x, y} + tar: [], + }, + { + id: 2, + name: 'Warmer skies', + color: '#FF851B', + bgFar: '/backgrounds/level2_far.png', + bgMid: '/backgrounds/level2_mid.png', + spawnX: 80, + spawnY: 380, + + platforms: [ + { x: 400, y: 440, w: 800, h: 20 }, + { x: 180, y: 370, w: 140, h: 16 }, + { x: 380, y: 310, w: 120, h: 16 }, + { x: 560, y: 250, w: 120, h: 16 }, + { x: 700, y: 330, w: 100, h: 16 }, + { x: 300, y: 200, w: 100, h: 16 }, + ], + + fragments: [ + { x: 180, y: 340, color: '#FF851B' }, + { x: 380, y: 280, color: '#FF851B' }, + { x: 300, y: 170, color: '#FF851B' }, + { x: 700, y: 300, color: '#FF851B' }, + ], + + enemies: [ + { x: 380, y: 290, patrol: 45 }, + { x: 560, y: 230, patrol: 40 }, + ], + + tar: [ + { x: 150, y: 432 }, + ], + }, + // Levels 3–5 will follow the same pattern +]; + + +// get level by ID (indexed) +export function getLevel(id){ + return LEVELS.find(level => level.id === id) +} \ No newline at end of file diff --git a/src/routes/Game.svelte b/src/routes/Game.svelte index 4432b31..e5e7ea2 100644 --- a/src/routes/Game.svelte +++ b/src/routes/Game.svelte @@ -1,7 +1,25 @@ -

- ColorQuest - Game (this is a placeholder) -

+ + +
+ + +
+ + \ No newline at end of file diff --git a/src/routes/GameOver.svelte b/src/routes/GameOver.svelte index 120c191..8b4cd16 100644 --- a/src/routes/GameOver.svelte +++ b/src/routes/GameOver.svelte @@ -1,7 +1,67 @@ -

- ColorQuest - Game Over (this is a placeholder) -

+ + +
+

the light faded...

+

the world stays gray a little longer

+
+ + +
+
+ + \ No newline at end of file diff --git a/src/routes/Home.svelte b/src/routes/Home.svelte index 146fdd9..e910fa6 100644 --- a/src/routes/Home.svelte +++ b/src/routes/Home.svelte @@ -1,7 +1,72 @@ -

- ColorQuest - Home (this is a placeholder) -

+ + +
+ + +
+

ColorQuest

+

Bring color back to your world

+ +
+
+ + \ No newline at end of file diff --git a/src/routes/LevelSelect.svelte b/src/routes/LevelSelect.svelte index 2d40e80..1c9e948 100644 --- a/src/routes/LevelSelect.svelte +++ b/src/routes/LevelSelect.svelte @@ -1,7 +1,100 @@ -

- ColorQuest - Level Select (this is a placeholder) -

+ + +
+

Choose a level

+ +
+ {#each LEVELS as level} + + {/each} +
+ + +
+ + \ No newline at end of file diff --git a/src/stores/colorStore.js b/src/stores/colorStore.js index ced6a95..42d1b1a 100644 --- a/src/stores/colorStore.js +++ b/src/stores/colorStore.js @@ -5,17 +5,17 @@ // so I can place my color states here so they are updated everywhere -// a writebale is a box that holds a value -// any svelte comonent can read from within it -//autupdated when value changes +// a writable is a box that holds a value +// any svelte component can read from within it +// autoupdated when value changes // its like the dollar sign notation // -- so these are the global variables ---- -import {writeable} from 'svelte/store'; +import { writable } from 'svelte/store'; // world starts gray so unlockedColors start as an empty array (there is none) -export const unlockedColors = writable({}); +export const unlockedColors = writable([]); // the current level number export const currentLevel = writable(1);