From 655cd8b69c7275db04d4b188f4cdb36918c4e46e Mon Sep 17 00:00:00 2001 From: Erik Onarheim Date: Thu, 5 Dec 2024 22:42:26 -0600 Subject: [PATCH] fix: gpu particles size is fixed and tolerant of non-integer values --- sandbox/tests/gpu-particles/index.ts | 46 ++++++++---------- .../particle-renderer/particle-vertex.glsl | 4 +- src/engine/Particles/GpuParticleEmitter.ts | 5 +- src/engine/Particles/ParticleEmitter.ts | 4 ++ .../GpuParticlesSpec/particles-wrapped.png | Bin 9570 -> 10310 bytes .../images/GpuParticlesSpec/particles.png | Bin 6498 -> 7533 bytes 6 files changed, 31 insertions(+), 28 deletions(-) diff --git a/sandbox/tests/gpu-particles/index.ts b/sandbox/tests/gpu-particles/index.ts index 55d9054f7..7ea00e7b4 100644 --- a/sandbox/tests/gpu-particles/index.ts +++ b/sandbox/tests/gpu-particles/index.ts @@ -7,31 +7,27 @@ var game = new ex.Engine({ var swordImg = new ex.ImageSource('https://cdn.rawgit.com/excaliburjs/Excalibur/7dd48128/assets/sword.png'); var particles = new ex.GpuParticleEmitter({ - pos: ex.vec(300, 500), - maxParticles: 10_000, - emitRate: 1000, - radius: 100, - width: 200, - height: 100, - emitterType: ex.EmitterType.Rectangle, + pos: ex.vec(500, 500), + z: 1, + emitterType: ex.EmitterType.Circle, + maxParticles: 1000, particle: { - acc: ex.vec(0, -100), - // opacity: 0.1, - beginColor: ex.Color.Orange, - endColor: ex.Color.Purple, - // fade: true, - focus: ex.vec(0, -400), - focusAccel: 1000, - startSize: 100, - endSize: 0, - life: 3000, - minSpeed: -100, - maxSpeed: 100, - angularVelocity: 2, - randomRotation: true, - transform: ex.ParticleTransform.Local - // graphic: swordImg.toSprite() - } + minSpeed: 1, + maxSpeed: 10, + minAngle: 3.4, + maxAngle: 6, + opacity: 0.7, + life: 2000, + maxSize: 5, + minSize: 5, + startSize: 5, + endSize: 1, + beginColor: ex.Color.fromRGB(23, 106, 170, 0.1), + endColor: ex.Color.Transparent + }, + radius: 1, + emitRate: 1, + isEmitting: true }); game.input.pointers.primary.on('move', (evt) => { @@ -44,7 +40,7 @@ game.add(particles); game.add( new ex.Actor({ - width: 200, + width: 100, height: 100, color: ex.Color.Red, pos: ex.vec(400, 400) diff --git a/src/engine/Graphics/Context/particle-renderer/particle-vertex.glsl b/src/engine/Graphics/Context/particle-renderer/particle-vertex.glsl index 05946c6cd..f01a0bc5a 100644 --- a/src/engine/Graphics/Context/particle-renderer/particle-vertex.glsl +++ b/src/engine/Graphics/Context/particle-renderer/particle-vertex.glsl @@ -51,7 +51,7 @@ void main(){ float lifePercent = finalLifeMs / maxLifeMs; vec2 transformedPos = (u_matrix * u_transform * vec4(finalPosition,0.,1.)).xy; - + float scale = sqrt(u_transform[0][0] * u_transform[0][0] + u_transform[1][1] * u_transform[1][1]); gl_Position = vec4(transformedPos, 1.0 - lifePercent, 1.); // use life percent to sort z - gl_PointSize = mix(startSize, endSize, 1.0 - lifePercent); + gl_PointSize = mix(startSize, endSize, 1.0 - lifePercent) * scale; } \ No newline at end of file diff --git a/src/engine/Particles/GpuParticleEmitter.ts b/src/engine/Particles/GpuParticleEmitter.ts index 407bb1e21..f37912813 100644 --- a/src/engine/Particles/GpuParticleEmitter.ts +++ b/src/engine/Particles/GpuParticleEmitter.ts @@ -92,7 +92,10 @@ export class GpuParticleEmitter extends Actor { } public emitParticles(particleCount: number) { - this.renderer.emitParticles(particleCount); + if (particleCount <= 0) { + return; + } + this.renderer.emitParticles(particleCount | 0); // coerce to integer } public clearParticles() { diff --git a/src/engine/Particles/ParticleEmitter.ts b/src/engine/Particles/ParticleEmitter.ts index 71c991425..98e2ffc21 100644 --- a/src/engine/Particles/ParticleEmitter.ts +++ b/src/engine/Particles/ParticleEmitter.ts @@ -103,6 +103,10 @@ export class ParticleEmitter extends Actor { * @param particleCount Number of particles to emit right now */ public emitParticles(particleCount: number) { + if (particleCount <= 0) { + return; + } + particleCount = particleCount | 0; // coerce to int for (let i = 0; i < particleCount; i++) { const p = this._createParticle(); if (this?.scene?.world) { diff --git a/src/spec/images/GpuParticlesSpec/particles-wrapped.png b/src/spec/images/GpuParticlesSpec/particles-wrapped.png index 05467eccf7b4a4ff745da93b8801112a44ac7bc3..7c7761942a4ed0592ffbd5bf99e23dbcbf94fff3 100644 GIT binary patch literal 10310 zcmeHt`8(AA`|pe_lVuFvl8TwJBzq~@w~<};F=R_fg!3Hlb3WhBb)CQ9T%TX2Fbgfgh0ohaz(|m9O38h;5TJ$ zd4q=6Dz;yVe7jcrE1b|c>yer@e|a^cEO#z@sq1I3i>p1;3DG>?I#-O3g~|LrF#8ki(XG!{3x-U)uRabd?5>B^iav4#NN4+K7_F$RA< za%6#XOPQ+cXMHGb%CnE>O1xEjrnE!S_wEaaFz^B}q`?(oj^S4HGfMEP0OfVM|VWgFpGPPZ``;_pph`RT@1<{)(?E!WD;@=3)7 z$wp(urLO0#@nSKrzkvbc(-iSR$`DL~cZa{2ChkelZ||lsPEOZ3XIZ4DC_KcgCZj!u z1vKu}Y|wfGPxZZ#$&s^%wwhJ^!VMA|vC30?jOmJ!LF%@|u z(8SaS=`+-UkEbai7EgOTGPKRP#r!-8(MbmfkhVIkcOnL<`tHg0Zi+p920`-7qB_hE z0{-|xw~+xjkD=fqzieWvWof~|dx=j&Qq3AhFAsYY@{%4<#|~DR_4N$!YItcK$T-ha zhVJ4Ow$Gr7gZX`snX|6cJZ8$yD1NCGQIY8{8T_bmZ#LMZ@?+$XPNa|B+Lfm9T&h`R zZu$9yQ8)SSWjQ`fNBM*anHQu)LKkwWe{AYGGZ-HG0(uws)i;+oFJO%>oIDaaAU!HH zS&N1v3Ah!^XsM`v5{EE;H*AG`sF=dQZ*t%my5ek_4vPX5h7%>Esj477HPF98<8@Y- zM*CRRzVu6}RY#vK>i)*Vq*wI?-NS}*pV`{$bcxb-Y0Ldv5U8gTxnVbip-@Z3=w|#@ zEWXiX{o|W!cavdv!>FMG8-qtqDZWyFY+hf~D>SK>kXtpMA3t72oyf!TolmZbjjCKC z+~H-CnXX)5?$`WY9Fw-0yS$E83mt0zes5Nv-l1{!^!az~p4W{;@CZy{D`je&w}*4d z&vCO%^iF2Wuf`}Xfh*lIdy>E32-rQ~ElW^q+GgW>LHAv}{n{i=yUaPdFh#+>xOOCX zWht^F_>D&q!sbZ-wdKnX#xa{k2=!bZ!8Ckd-5!dEOp8RwTGBH)Z%sljK@X(nKNPG& zAmGRE;~}f)>1CVpC9F=dfTles+9hPbwpgD&`}U|}VFd^28K1W(hoshH3~y=gaT(0Z zxPKwQ18}?B>r4I2n9s7Rr(Jc-+O`WCQ5&MSueKU(ofo7G+Dh4JP+Y1g2>u8?&C_Ge z3r}V&OM9d8ts7y2{P10P`Urre;PcX5rWIK>&9$$VCrWybAZ-`geb`b%`$q-(Y!x{8 zkZ>_Sb;3$*riWIMn4O_BTcB#7;UOapOE9-8T zEvk=bsLw^N!j5fNT4Z-Z+i0zBf$y>0=y8!wy|#LHtr9VxPxY34TJ#wy8H{Saa#SB7 zY0U@{`-&5xI}(0j-I>`JNh}N2#m&7rWUFF%o0qY3NBmFL(+XVK0u_y;66H8<`eAtj z7Z-gHirvfe4%^$lj8!d0%Lm6p;JXl(RxX5Yg34DZCKTIqMcRvO<*Tb(rfupO-sCIT z8aQ#b(-nc!W2gQcPj%o~I@th6!w-$ich;X9%O^Kgxc=b%w=(xzfc)nORs7pni{I%# z`sqIgWMa5?Vjl=-|M_Hp=En2{0g^n3ur!)*;gJf4)jDZK8MurIxW4@t9hjxPU*7d5 zC`BKZ*yw>A?Q-YOWpjkY&5mwP5eKGLd@4WkL167=pE|m>Gd;;Wn(G@27LT!S4ywVM) zUA8L1^W7i*TQO0fVi;;mGRy&D3+po5DEk)jQo_Go!#QXF{NQu;1K+O=MCehXuhew3 z?5G#Yl_6iz7&*lD0qPt*A(wbz;O?fup9}xSl?1#ARo{ir6waE3uUERgF9_-mS@!>2 zr1dy{U|Txdf>$us%wSJbiVMw@BSeQDp(&W?@Mw61Fo@ydn8s(PIt7N*b`7{Hg2m;@ zE&`~^1SBhs70cIM6ktb)t40PZS6_xmUpE!T0O&#C9cq6i(Bk7oars6A{abXpH3Rc? z!~Gg;CxN-Wm@yj*v72@yw(&A^w}E{wM=s4;DRfuF+@rM&-maB&S{{-`G0Ku;QE)LZ zVx_qn(TaBc{aagC8NsP_?iXp=>_TwHiKTO(&8s2M!m+hX%S4beZpi==ek)ylHWxXEm`0&~jo%wOw#C%aB*IN)4 zc|lani`93_mCQP{X1!`st6h>p9%+Mm7HJa)^^-EsrMtn!=l3q9IKWXHc5#vpmRR(Z zHlsx+;?q73Fj1amfku6>KELvbnSU>q=6vToYa0vmkv-<08>h^|6 zm8Q6ag-vRI|K{?Q#tJ*MXXZw@v&&c!dHyK|mQF0z^#_G}ubwBqAvl8`GrKL*N z%Cb;!aZ%^rIhut>DFJsBGBUj5%+tX)Huyh>D z`v<3O|KQO)r;+d}%3L@vR>M=Pl~$7Xbe*;J_c$j_7_;`M+lbdr9NY=wu+Yl5#NML)|Cvbma$E_73VBD9eezHvqnlZ)dkE(>A;#{+{H zNR{LKi9BX}91>qArYEwmT9y?A6?q+hgA2djUC%0e`CcoRhS~YVHl3U3!cj7{5uHn% zXJ=GNOF3Ov*XMLD zFh_Dh3k8bv{n0UpY@g-iy4vg7=VoieK#2WJqn~o3>+OC(L#7u}aXWtsZy>Cg^y&YG zSQv}Oy_w?_#<7s#JB91Yo4O;8&_JDbQ@wMNANH${a@hF2t*1s)*@s@91tHE5K6@T1cZ`7(-iV84%Igoq-Ym8XUcFvJsEF} z=eSUCKG$o?K9J<@AKvm~H_(Lu$X99~^fqc$5Zac98s|A`ja;J?uY9-$tVn>? zk(mDG$;_n>SIzfUjk8;1yvq~w_KHs&ePoDDLXuJpcTij2P4tulP4Z-6eG9F~VV*5{ z3z;i4IaW3L=qf>3`QasW>nINseoq5+=LAh5@HR6q7^upl2;m_fN=Qp~6bg9Pdh*fc zt8#*{{noyBG5{tv2dQ`I@zXfPQrH-hi$3cb(h7In{J~-Jdo>6EsWBR8KKWft9E)Y& z+u&4t)wXur>9oF%-=H?}7c23N-3mjo`9}4L?VsTp?mSnEb9g2t?a9|vV?sH~O9uLB zbb|=&4FsO>Jb|GCd_X%@-VSAB_Wcu9Kf7W#YlR+GHC)y!ave8G3tE_S z(e)}%M4KdTdSBCQG%rq1^I+Rx%6Geq)tp*|<7qb%GtWoiZqj;o{dxs9kP*DpI(_ihq>Rf9T ztcrcnF-KOfhpKO&;!Xq!4;j816CpqXPkU5yqTr%EaoI+0ieOTI3kjK$6s&W(>0a;3 zBnR^uT{paK&Ar0xrG8?M>K=8LaD>OZZel8gY0JuLRc%fa8OI1g9so$j5e^zg{c zR2e@$yXta932j?HLQF`b?ZLZ8hzK1z&y;>c_YFl6JM54SmqgPY5^8>Jaq*252{Jjc zk|xWMc3q~0zZ{9sJsJMscNi<;J`{8S_b96ZQ>ndg09CAC=9lwtk1%;DQbB0J!_?fe zEbg38ncC^s>F#mNa}eFsc^9U|F!@oyeInRb`~yoe*Hh>9#o$#f`t0X3+@F_r*Ob#j zp!2uj_$_85#IgPnYBQh&>ko3_n+p3$bD>%}y<4b~_;pm)ALPXLgrinQV(RbNKv)0T z^a{e$15GTGvx_Yx+yJj2f)}+Ku^!#X-5G_3qX_)E@4`Am6@jN|faIAj=IjGrU%d7@ zFiinhTrEw-x*N&O*m=>7@p&Eblwf=k%4|=ET>PDXXa(E|ILh(I&i*2n$=88aeJe7- zx(35()Wnj)2ya)#H(~&(CJvDKpsXp9x)8MtM05)1IUhV!v3B`Xuwwi2tA-1><9eD4 zn|3Cd7jJ%RjSk=3sZ_jf{3rXQi&o@-ev1T|Bvf2@kLEFaIM^+9Pm+Ejp<&rZZXs#f z%hAsQjQX7?@kfb7=HR_p2a-EOAkH$A%MZ&@n30*Tv&d4w7C)DG_}H9GbS_qVXs296 z)i++xqxCywq$@@K-lrPVHlAjk{aOB{m3(WsV^rgz?4Cvgf45XpN%Y{I|F`Miid<{a z&U{ziQd;1SaLI9=S<~*Bw#&xuKRK2p-^wHb|3j{sX`P9dCUG*tyQZ%EJiwaz#-`j| z$2*5(a+?>Y^Jf~>hjr7jwR9VBAL}_pbaxEX0t??G5Px=m&P?XQ*Hspi={#pwtP+1T zZI;_a#rx(fX)Z1FiaUB}*>T2;yEHK^5NAjiOx!R}nZ^=LYTrSWF7Fr#XHa6}a(8H7 zXue@CY-$oS&=3ZjNT01aCT~D~DvA%_2T{0Qnx7%DeqUZ&$<`V8)+X z4E|bG@7_uq*ps!yTjICm+`hfASxf@<>o-Rkk`4tqitGr*T0C!3^<)TQ>4Srg9WJ^= z-`xVnWO=>8V0`v3ps1(7R*4;rLhbz5;)=wPGh!vcfqoIYkEy_HL;4~D2^ zDdj^>l?{Ezl6|jG&!wcN)(8w8scwU|iHJ^X62&6d4iPg4s3K>2g@PT7iid5FQ!Y$i zV2-MECQ}vyZ2(~r=c?Jem8x8^f>D;>?W}rbk0n;|E2+|H?oS_9(V?DN?w&=9$Cfz` z&^W%XyFi7#HpfCK_yl8aRFu43{n#Oo%a#h@MJkG1^+Acb5Oz7)Vb^_cP1c`e<7+ax3)3 z0~}m*)$h!7pR9lLtnQ>RYUfewM#VFuT`Jrg34*k;fX)L6K-@2T-Tu-b^9WaZYM!l> z4>cn4K9P(##hy-lKZj914FSWK=5cS1Fe^xOU`y6;ua(}?W2{!Imm;6BEu8Q_{@oA~ zdkk!w?~>j-G5OR3>n~B+{UH?n-r*-Hes-c8`iHd7L8J?eHd#7q%8*{lC4caPts3r) zGV#ej)}EB~%svu5&o$otyFw^WIMyCmIuqu^T!&+H)nltm3kYQbV2Sc`pppvA?#;%5 zjWOfgOU0O)?;Zt>NLj3I!!U*B;Xe%ZwvK+PKk^ptFe7^T11Mhszd=^D=hxZ7R?PeE`8eKYKMmnR!lewktB!&x3nc zbe-9jG8!^T1#>q0EgbAI6i8o!dJ;)AaD7nK|Nfq&>WQe+oSJOt}YX|G}X~}yuY`qfX)^OTgu$&bJRw9mI-OMyq6Nxj+Cz4 z2z++=)Ea+z^hft76C=YKo2#tMdN>UxhtIeWnUjfVIWga3LWPH>DXrWHOT#stJgj`{ z2s!c-+2QtPl8jU?0rPcT0={;&hT3ZO>`zn$=hoen9}_Ut-7nv?_;k;jf+;WkCg=>a zlzmxNY+#3|PXrDZAS=u>WvE4z;2TO0%QWSB&eSRU2mM27N_8GXRJ@C>c{>ViYed44 z90OEs!HqQd?8yW~3NnXq3KIJS1g_YyCz(0qf9(yG9(r(Z_RO@qdR_D!0)I#8A(F-T zFo)od)F02wu&*leYq>J5iL%Ip!Y6Bn2H!%KO|k2XCxUUh&Rf5ESvr3E0~`l269A=h zJ6C`y0M7lhh`=NwEKjZJ_~VLilAeZ%7$4Gg-kZFlci!=hyZF`gM&w=Ze8QeOSrj?E z0g>S@I8xNqR4%^33H8iC3XplAtO@_1Vz~Fd>jXZ6xg-DOFc>s-HnkthWzZ_60vi~M zGN2bKzC94fYk5SmwOxXQ3}o5xV=%7WILfmn4JZiLhCkr1NOf1BeB1`g;E8Ycf%(iz z31a<|d2>^H+)DXz9!bupJ0f0PT|aC%mzqx8k2ybg_pKVzH5?0v<@hkf6`Ju2i5H?n zS?XlbmZaW?XL?2QPqr|%lovqv?MvD0C}H|{-sbgnn4;Cb;(~~q<0_`@v&FeO3wMakR=qK4R+vS{E6_|;>$4z<=;cdfZ0U+K!2dU0# zRCeCaL}56TgIlo`&-iNJ9gmoV;Ir|*cUy=pRnm<+#3u{SKge>|lCsNx|Ez&An zQm$Tx@Fx6}mR1R76C1a<6ctkPwk3?2<4PctytAMj6a%?|l}kLs_TA3zuYW0NZn8E? z#Fxma6kW*H7@2?gN{qiX{z2EQ(Tzn~$29FaTx5H>qH$%gk^WvE<|4RWwl6q3RB(4h zzybPc%!}tSueC46y`BMreD}=Z?)bT|MvaUJjD>35aeKFiy@A&6u9+xw-*_W#uMLQd z9t>3k6usWLSmy4pRAP|mK z=Cc5!%~#%j1y~z^U0PhL@J6r3?@Fn@pdemMTP*LcCJC_6gX1J+p$rd~Cn*a3&i94z zIaNoIZD=n9hT>K)R%Mf#v{riHWCphklKtR-17(cN9;9>l{Y+48F^!T)Xu6S(u+)jx z9Xrb5X}#6ExuhQw5(iOw|M^XXc#Q5j5UFzk7EJvH_2`+v(97)pZmi@KCgjD-lgKth z^3|?RvnmQ?(uzOREB(P&IHBByVSG@VLN}`Yn*O;H&^tX(x51cs=^qhg?7=F9ySjic zKk$FXZ`qNFrU@`ryU>}zkdenuFAQ+l6}{10qM7H`6^}G4eBca(NVj&J6JjU24%145p=vHX)4j8=L(VPJ5J-gi~| zkTTFVW7(OPRRMQvPB9VhDGU6-_a_3czC|^E3rSw?t+27(b zt5;{w_e8L~``Fjiq+!D=TDe?lQ{kUyg#;Qk%K4Mo&9RVl0 z^jTzjg$egO0s*g8abcy`8WiJ*77hv1h{D?E3kX*22tBxA>Rl zTOaJnyq8^@ABDLTIs<7pzm?V+Tj-p@*pTUX^zN93YoPW0Jqepy&WwQ6M8Yfl^IAgv zauq4GhGR-tF#Oc6Zf2|4kg`jW3jjsFO-S!y63i2JU%0*UrMJe^6}V+I4YE=y#9No+N^B{aV^EOMopPB)?_d<)8ORbGXDs{(_@ z1vFmBu_ZAOc1Y|$EZb)9?|!Tx6&FQZ%r7a)E0^=>ug7v~iA`HLl8NTg(nGVEXVM4Z z9I1YSn&*xN7KvMErRHv8e*`ix{p*c%dYEAF)xywWRnW)gr-90+9Bu(LNFXL;zs{nB z)T-AR2Dz&ZUBW7RK2Y+#8+>l~m>D+2Gt4&p0Ci*B$?JNUu;%Dj8ohn_SK!VzX)v$7 zcT(ip=@hGo!>Di^TMycW@l`0%gw8!b{_B;pM?6Z3#S0?ACURdON)(ny%AE0_th9-SSN6D zq^{gceE9ss6Bg52U;kQ7@0Yq&``S&PP8_>fzPjZ=YaJx+*FN_;KzRyK`tIJ~rqad} zIV!7rrUbF=7=U?hRHPU14fi|TXKdp=| zU^}b6kxY#n4@^>r2qc+IpY+e0@9gNvEe#OhCs zoK&fSf{E)=qEOb8MPMhg9lxS|f;riop^1A{3jBGyXB>yisP&$;ifvkA7o>Uh+9t+~ zCS&+7B>led6@G?H9H?IE_C9V%hrT`d?VVf1UhJqn_4D^%-ftumgm4CM?B}_ralbCHeL?M1Kj z;Qf=`zLq6Rk=x5Umf3%)){9#lOKm(v_LI{&r0I%v+a&2-cfB$_?dYcvZ5p3zXW5fD zeTI8~&eM{3k{%>>0QAeiWDdBo1bR+#%+9r--hlMB&X<3{4{Ukkto~eZZ3)3&^iw2I zm(!kZ#I)9Y9z2`2-e*SOX>)IT)3&1Zhmp-GLR@{!Iak)?YE|j^`z$}if+;t4m4bK~ z`g3Q-Gdt#}HWUaUZ(Czq&8peWUj38dt9C1NvW`RKT@zpQTA%z*Q)b|L55>zVtKko2 zkVo;Q`lGA&{hDy`t~PF)c0b!atkdH=n@i3N|ImHhwu=-J}V#V+^EBec0k;K4wM NiGjr_GUn{H{{_iVnzO%(0ZyW}}%<^rYliYmSvnDkO9elJllbJUtP$SfBpV={<-biUiW=n*XQ&8yx;HZtSt#N>O{XsnNE*a z^NcrfK6}P|XvPF_Ai1Y3dBW)0kkOG#X((lDoN2tY4qW-=nwz+|4azq5mXa4GT{qw? zt+cF6aUWB+=rlfj5HIQI8}Nm8%`au>#0$TafEh=BZa;DCJo9yUn>f2V`un-uN#Tln z*YiXAL~&^aJ9aVmr}5na*V8hnI0*FL7aa8Bbx0cSuGfEk2}i{RYya0b1`<$vgHz|? z|MyM^R1!WZAqmGp{(Z6Eii0@Vwk7}VD_k6;!R&9-L7*=sWl%3m-YflQ1;7*GxGL$t z--Nmgkk9U2M z`S%jRA7xN|YyN&ys$(1^?fN}U^xxMh5g+;Y$tBa)!EtFWmD+#bFAyZyKSBCiME(iV zKS=tg-2UOD{}04{%opnApmwOn>h8|l;dc$rWQ6A!=s93?G>N78X-6DtP^R7qJzi`_ zwS&DnrQQ~?ltM*&x=rD^Lv)8iYUUjCpq|qg-GyTyyIl;Ch2vh7z6<~rLT=|keaOuM zQTq7S6LgkA{{zPlPSUVa?U%7pwZ`OyNQP3~eo~QZheL+R&T;aOO+R0Ayx6=}r!AW9 zrQEa};zopiw`C*84-d-A9WM!J%NOeAWO-n4@G@1}Vw3eu^55$Yl3!A&~uc&b}zblSJluGzGh0t3@;C0#GOTS6WHvQ{quluC8# zUf2t8K$bFX6i&3xp@(ZYiiq0>L#Gq-wB1c@--pQSC?aDPM%Aq~_9U0cS=VRjzlPvrqs4&O9bQ@9FjCpdXBPPRVL3K0e7wW^MWKf;r zfGOZJ4lC6+H8|*A$EKXe^kmXo_yrgQ4`rM($MkS@C2^)^F1S6#~RdKB@F9Zy@U z2jkI8-bxD~6_r8G-XcR90<<8<41hqqtom9CZiXUD(HdXhDt;!6k1)Sy=+)M{F0zD3 zT--kQK*#Arq;tn*OoO9G4*Hq`cq@tvcp|QGq%|p>xP|L2(+4OZ{Md?5-6@uOH0N3){PCEaZ?JqV3iWV)SH1Xf~mU zM2w$)?48ylXH3?28!H#YRUEP*A2^NB?DdH%#NWEI_D;dN<|~$P3U4m4pr}mwanHlIfT4XqEKB_(mu@n%K`o0 zU{bd0AZ}_ z#gVl0+Mp#Y1KseURih`rWqP(%tR@uRqYL}r4)MmOG=#YJuMhoYW>T@za`UlO5iT#<62e6yvxpYC%x7 z^p>=3Pa(;IRC&C*XQ*I917q{s`I0W53=^Gkv{?LLiGDYa92OfJc1Z@6dIazqukV?G zob*U_0Ut59F`}V$H2*O70C!qxjlGK1SGesxbR(}q!#cT3MX5b00#`^Sl>T(}hLvoa zXOyqn-P05R&mnko2>@bbnTvIYN;E?ex99``L{X(B$a7ajvuQMw zk3BjQ1n+s4+NMrcY4rP5-@Z=^2YH`}n6d%DscJo7>JZCfn;W=7?%tT*Eu+D|PHw{_ z=3cXGL^lo&Wza*coZ7!17K``mw3~QlP-_cT=ghpn8Y5b#hV9zWYL$N zFZs0mi=mbP1dH|$X@UjburA8EI_7Zoq#Jtz@5DQh#fN#f|2^j|y*IX^0Fe8(!$=KtAD^CXEm2k(bfdwT7*Mh4f>s-twvQw}O^|UvYClt$Sj?YZK*7J!X4Y>6<%qUA)_wU7dLb9dbU6SY~DDQt$b- z8~}Drs;D^KZ{pD}V2R~P#vG}hbWycxdDLn(acttuxiyI?KhpPQi#Gts`E-DG-`OrY z!)K;pC{Ig(61;H{Zc(ATnwfc$Y&5LZA3ph}*?Tyw~C%1DkYqKyo$&B zI{-3CUL_N<+W>WVDb*mFTs=uBlIxCYKFvt6gtfePI(`D;;l542>FWp_KxH#Q=&XrL z?#5SA2^R6G&HSEOp`lJ-TjUirAO{aYHJnHadk!W<26}$G+%FgwrnZp=z`-^f38|nDkq#As)A!g3PvzsTp zf>7EAT8jUiX6sX-)TlSS@)$c!ZoVQafUW)f>t+7~akMSr(n&u1rQw|WAJ6Ji-^rsD zQIqqDDmQtUIZFSXmBZPxq6CeAnFgQg3z|@wzp5cBsm68n_Yt7nDoV7|hX-c12@}xd zNs00MvzG(*$H^xU6x49O`u1V!?xtdYnGmN$#tGxZ`z4WhDj`q$Nm(qvBF8z!q{S%6 z)_e^hGWs~kZ$Gwt2A6wr5A;LEI7>LTrWFrssV){|Pe23*6Idu-(C*)>WR>gYBQ?#}lITVxD{OoI`CPLt6_Wg!L zqqm=o$Kr~S2G-pc;D9@md#y}$Mb+iLH9R|S3zs}(58%yyt^-Ab0cE*vIZ!E#S9$yCq2q@wXI#!@9!V1akX}(& zJkypEJgmJob+31=K&s7lE=+-!#7|k^b5YdY{R%=(sSKV&k+`t84DFhbi*#{nFF!U& z*I&o6gIrXVgX27-W{ko?&+w%FY)SsJ48W?^9PHTJ8ot8hqAFEzzG6SK8>5Fm_(P0) zc9j`^auZ*oJqd^X`PI3sUnm-;XT$Z6jd@h&xGQzb&M?Py$#<5L{bK=ODFA`q)AfEE zXyaTjI$?Sk8L#BlQ!(S74x}=Z4S|0^TS~ad8H2rR5@Sc-mnW<~9>XT-5o*$LN>7s9a|B~hgC z%5QWpz11|10EW$=opd`4#NP|u;K~YTiE8{^HY=c^#=1lCM6cG~Zq?iv$kjZwyG6I* z#AL5T!Ksr-|Jhx-78<&W3FGIz){Tp~tW<|9K6rFEPA!)BxA}PS+;O$~070!2BmjH;y;h%z>|T4J zS`i)7?CX(fhdk~miIV7t;jp?;zZ!<0*Uq0; zOZ~5XjjcN0#nFCw9HWKh*_~EJZnFwQiq@gb*Y1D#Oct1D$W;bGeGtq^nx6JVBkqYK zveie?vmPM1{{@h<|72P)4jg=uTS#GGH5JiQWt%(nZ~y*ea$ShcXa9)s7)^5~2Dew^ z6|7nL>`+NkqcePdkTb-NYQ!qf4>!p$&RC^Pi8mgIuX?#$E<3?u6kU+%Mu>S+W~QP* zbk3@4n#BUi`4sr-E+|>+Rf3N`#kc6S&iw%xoBjE~owA|VOnQqclJcr01EC*1Jg^_%%q&-II~ z9;Nrt$6d`s$hUcobS#QLL&WA!{YJnoN46)6FD?0;fkRsg*ofR~0LlQ{b~gk2X9$Qg zJ=J#GTh-Q&@yUq}3A1(dn@(>syh zu=CN4Hqu^F7c8$J+?-+oZ79&!&P{=>!zIpn4 zS>3j{>kX}uaNGkM08y%5x{4|Q-JiTwKlR(KAcepy$7>E}?;^YsB`(063=N|7xY;D{J1>e1o^k7!fiREE_lEj|1Ace=G0O6-5+#^B%l?7BmrWR~B=f-p7uknWg%rDe{SMr`kx$l@-@*4X4IdA7lzp z@5rJsGzfgq1}SsaVV~`pJ!`6+vdj0`%cFM36Bti>>&tc^7Cg>rMjoL^Y<#k$q^2_$ zUdxWE5)S&1V~nmZ-%K8F_NkzPF5y@VV60{%&lnqm112=L+f@cNitUu{dYhH;%1mp8 z=XSX5L(cS|_6@gb`Ztyf3%NUv*22G9j<7GiCGPPOie^nVCHSvet65zj*Q2ag)gWly zHY}uPhWqu?Rum)Vf+E6Q`lSujllaL(#zrskJ9}}y>~6kqd<;!Jla~-X>hbtFC+B%V zesNYuF>U6F9f8MGUpWpG-9LV5Jh(v*n+BG~Vw7ojP#U|+RD&b?B zyFsLF1nZqLftLxq@;f-~-c~*Xwa0l&E3FWLS`%Hv>B0dqx(sMRy z3rpd#TWe;b?l&uc$C-Z5h_pzyr#nPPTiWs3SHV{cg71fHSj;c*QKUi!s@$sCu0_|< z$8Cpw$lY5aq&_PT--t=wfjI5g!!Ku@>Sl$URYW0ThCinC5QK5EW~Dji#eRAJ3ga^% zj2}6>Mpwh=ag1fa^}2AI4lN-j=kE{}f*XTb z)jbk3R`Ed9Y758bBf>q4+hRajF96E6pzjOV>LQy;{LBjx^W>CX41z*PO$`)r4n^eC zDJ8)}VTT`mGG>QQayDlN%~K-h<;g%1#?dt4oVbSOrPy<;yGMlUmpKWIignSGMn zC(+1yXWKB#yL6^L;NqLX(4)Ij_E4#q_Y^cKj4o_E^8 zmJ!?tUoQu*fmY-rE{T2g##M)XnAD%Iz4c4fF!w(@mt_p{q&H%bx0o?TadQQ4<_9-& zeDzy~grY+P+`@h-@N^B>Qk2>~;KVE;>3{f`TYu_GOhg1H)5@?0s~zMxKUCqouJqLU z5L}lL)InY?XP8;7Q1nr=nM&n&5lN=Y2lJMciu?MDtt?!;V;!ZAcL%v71HO5y4ghYr zE)q}$pt|qJWxbv1Ogk4Zwlb+PAy^t*C@O2i@QI~I$cp7cg;K$v$7*{0DP&ftQm*%6 zje{aL$!-%1nX}l6=X_(za8de98ByGFbuvu)1q(bsWCG~)jFB*o0@F4DWuNOS3_59B zcO?7GW&tGhvWZVqILVR;7jSmRm#OT1P1v~S-uL+cccXi4qqjV-@LtI+RhrFatVv`6 zO*ws%1(hApup}!{F!9u&8BiNMz~Bk-f)fDrfp9BLBeh88lkTLm?xY@UkLqxZW%cU= zT=N!G9KlWO4x9nJkvrTIQvBPF!_5T;wiyo*O_iln-O~D^CYg-b7&6yc%9z4PtJ@mq zII?!g4LF650I)DT?_h)iVKF0Fi&^^6#gFXb>j_Uj3-#h8@07o`!99!NU9DUJ92oCb zl)EoJ&{F2RE57#Bdq}{u*LF@GaW!Q}O%h+HFw=_%Ber}#;HijzygYjdGY8At`HQ&f zfQnn;><&l-a`3y=0A{!b@72GaiOPms?{q;x6B*PCv&ctAho?~K1i*_acs#-v7|V

gFCSRUoU(6y@rFDc_l9Eul_Zm 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