From 09fc72b08113fa157a3abb2ded6086babedd10cf Mon Sep 17 00:00:00 2001 From: hgn Date: Tue, 18 Jul 2023 01:13:31 +0100 Subject: [PATCH] seperate gamestate and animator memory (BREAKS: SMOOTHED UPPER YAW) --- blender_export.py | 27 ++ ent_skateshop.c | 2 +- models_src/ch_none.mdl | Bin 778688 -> 778688 bytes player.c | 5 + player.h | 14 +- player_api.h | 25 +- player_dead.c | 31 +- player_dead.h | 4 +- player_drive.c | 14 +- player_drive.h | 5 +- player_render.c | 56 +-- player_render.h | 6 +- player_replay.c | 12 +- player_replay.h | 3 +- player_skate.c | 827 +++++++++++++++++++---------------------- player_skate.h | 112 ++++-- player_walk.c | 297 +++++++-------- player_walk.h | 35 +- skeleton.h | 8 +- workshop.c | 12 +- 20 files changed, 775 insertions(+), 720 deletions(-) diff --git a/blender_export.py b/blender_export.py index ae8b641..3f1b04f 100644 --- a/blender_export.py +++ b/blender_export.py @@ -476,6 +476,31 @@ def sr_filter_ent_type( obj, ent_types ): return False #} +def v4_dot( a, b ):#{ + return a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3] +#} + +def q_identity( q ):#{ + q[0] = 0.0 + q[1] = 0.0 + q[2] = 0.0 + q[3] = 1.0 +#} + +def q_normalize( q ):#{ + l2 = v4_dot(q,q) + if( l2 < 0.00001 ):#{ + q_identity( q ) + #} + else:#{ + s = 1.0/math.sqrt(l2) + q[0] *= s + q[1] *= s + q[2] *= s + q[3] *= s + #} +#} + def compile_obj_transform( obj, transform ): #{ co = obj.matrix_world @ Vector((0,0,0)) @@ -483,6 +508,7 @@ def compile_obj_transform( obj, transform ): # This was changed from matrix_local on 09.05.23 q = obj.matrix_world.to_quaternion() s = obj.scale + q_normalize( q ) # Setup transform # @@ -1397,6 +1423,7 @@ def sr_compile_armature( obj ): lc_m = smtx.inverted() @ lc_m #} rq = lc_m.to_quaternion() + q_normalize( rq ) kf = mdl_transform() kf.co[0] = loc[0] diff --git a/ent_skateshop.c b/ent_skateshop.c index 7cb0e9a..42eefa2 100644 --- a/ent_skateshop.c +++ b/ent_skateshop.c @@ -430,7 +430,7 @@ VG_STATIC void skateshop_render_boardshop(void){ q_nlerp( xform.q, mark_display->transform.q, t, xform.q ); v3_lerp( xform.s, mark_display->transform.s, t, xform.s ); - struct board_pose pose = {0}; + struct player_board_pose pose = {0}; m4x3f mmdl; mdl_transform_m4x3( &xform, mmdl ); render_board( &skaterift.cam, world, board, mmdl, diff --git a/models_src/ch_none.mdl b/models_src/ch_none.mdl index f08ed10dd85ba15f6112dde58f7b335f43bce568..ff975bc7dbe06e64c8e912ed397254daf6f8283a 100644 GIT binary patch delta 79552 zcmd43d0b838b5ya;ox9rNRlKZLa9!jQk}g{ITDgNWrz$BNk|eRks+dNSx5saW7Ija zan4@5kU4W1GbMz~nbYste)rz*<=)rpe*gIW@$-7E*S>eP_j;b^{fz5b>wJn%*%zI% z&+lVGyUtq7I~J@#k$HOrLHRi^?Z09V8%1I$wx+{b zs*o+T(9qTqGY!Ev<@}7)Riu`cb!7kIC8r~H%$^oS0@@vB5=RbIOIn5T{io~`9*xLg z8o;{LKgJ)3>cTCXQ8K;aveuG~?PNvI9^X~?HP-``*H)uGY+k1@<;972N#LRh3|(eS zu5_OYY)cdpNtUxj@<8_%SpEqEP*oq@{mCgqb{dW7@M1Rl|onrZ}8hZW7jn1J90|bfraNT8=w#M>)WltE_)Q5Z_n`f<| zEBE$C#?&%2>)13jhOM*KD`iK2piSc{4F?zx!7AxJ7*4WiIPfpoNe)sz0Xia>=t6|^ zmVoQpqcbAaGPb7M--c1x{V!>Bu{JFzYB`(KV;NP<(mgfwqoX&RekJPBwvB5YZP}on z=CtR+P{b^aK*y3BqEI%WXLrh#&4V`;np>(u$wt0t;TywpwytL--D)}JxlMPN!-FpS4+`u(I{Fw-K3|nXax6CCDe-lk|)YD-B-}%HiA5vSn z1&w9>6+VG!3CW-Xk2{F@U|{A8EG)C9J|#hiXR zz8bZ*@<5?YiajptWUkF9dg_YBsFRZ!s+>HFx7AtnF{LO6R_XS)m6o~vwX!bV9UN%O zs>=#nHqYY<)tHS{nbRTnr=gRkH<>XXxA9xp9F?A~8F&Z%d=^A%moUOGHk|pJ-QH6v&2n z`Z!7?lSp8wBN^u;I!nA(Qe^EU$;!}5L5X675l3755E4>S&eTx?U(Qx|YUscK2efmb z4b#&-nh#{{yu#>%Wflh8-45i?x=zPeu{mCEskUrt-@k3Gs_);N=V@5_e%~DCsb(hn zanX-y$@=wsF2CXyOrqV*$!M1G?oO>|L%j8L?Zf~>s^yw;97HijEBfC54CYs7d z^-rTmpWVzC_|`KfTUn+JYvJ=Z-Eg13>559uAJC2tNiJfHR!%{MH4T|HY}o*o&N(@c ztV~~p%02X`0UI??Lz_2S$26&%K-SIr#@nzZ16k!3&^*FhRvq^)xQ_gJRAeMeMxmdNnrax1>Z4a+v{e1z^ zy7m0L1y0C=PGj8J9GLkt$JP4&Edf6mkjuEiSb7E_qfh>-M{JN^7~Rg?(P{j}4#M!t zdAe!3GCwDZ9x`m=k&ioXI?U`eT|JgH85$--g_qGyHesk0eeA^=-JC($iWifD)dE{M zG(vtab~18J*vT|x?S}o$MC`D?nGj(t8tzFKr_3PD^BR$}yVjzaEImR`JB?3f?1gb; z#qfFjJhp5^cPfXi8(~g&ym&)*VfqAhM)_J@E^9qfL%%ed%)e*MN%f@Z!aX($W&*W$ z4c-C!R0%nmj2T-3Guk$nki5i|R4#B4K!#Bodi0Q5_gfpBnWJ=~p@Iz=^|$xQ{Qu^) z)L$>liisxvY|>~e+PCyFdKI;Ul%MHFITx_K~!{!BqDc2u#Jkl{QNI`i`R}W0T2k~zUD88jQ6puma!$Ij0@GQCT%P?f? zY{u8<1T&uX3#|N)LgsI5lg9kbuZZo{vF((96fxD2;HE8g5=k)7-0CD|RB?!TZ9w=3 zo;vM7t`z7QPu60bhMu@HM%y&zD!G5hQa7Fr9~VaFjhVt2Ewv&`P&`_~R*lmr+pq4X zu=$XLF7=TWwEiLn0Z&-{7z~NxGps6>8e$e3`N$f5H#?1XJZpotu|ea_mBUjOtHP#+ zGh;5;3)#_bYDruY@H7?18tp;&qVm_W--U$iOue>i;YEeQ%|*SN%^M#^w>B|RAJ-N0 zcxwZ}h_w!4|1Z$##d=QoyTq%Qz|!e{R^;HFcywS`mTCRFcl-P8vk-y0nBp*q}92^+8T1vvrd+ z|C6os$yolcI*MhcnE#gw@6nWY^g?7tB7n)V5yw=StZZtUZ2PNahFCUd>RIZtE<9u$ z^*>38MeeZae<7f&nI0*n=bpQ!%2R(aC{`FV?bz^{kRD$(Q|Ci`3On_KjAMD2iCq@L z_kUTXnm?=^(Xw>d|CTK;?7tc0yIG!eqnFqD7ma+#HIGkBILn0V=>q^c{V&L6v%6C} zS-aUosaiI6wmEG&dYU1$b7LmO!A3}8b7pJk^9wGi=+~bOTOzKilG)nXVf0Sr8Rv0J zHM-d;Dzz^g9uf9`1xWCmzX7S6qo%0dEHf{Rjxn<#-t}`(IkHF1*}{2YR2^sKmbydB;XAVE=M7 zlV}Y+JFCEPSkMF1?d3D=CN?BmqrBqc&9B+*rF!VlRj`%x1J~;U&eIWG&smoZ4)hcp zNObJnZr%4UYW7+2;ZqOwX0{@_JN1Q?EexYuyi(}KywW;q9w^kk*jSkPd$;tTK?e3u zF@Isk(u*>wbT)61Iqjdeitisaj_j#7M$g!?MPYOo%W-^Jpk~}%3V3ii{G>+h|FHw7M){*mUX9W*@R`R@(+(cEk?-AP?1gpFyr#YG%Ut1 zaoY6jPaV#of^H!SEvy6KY z_r1;0{IzO+99y>1N1l*5ho4#5f$U_h6Ew?Z|F_wR0W^8t-|Dkl4*~SGaSO(f z*qt9|de37oo40|bBMTJ#!+cX!j*$bYX8kt)@8xSY{tcg)za3KA(dF~jGR^MHLURtl z=9=|SVQF35WfGS1mdVLqi(cqzQw~t_y4u^?kQBQD2X-GD@jrDX%96GDZ&{esW|UID zFZW1bql=_w;2~{DgRp;qELIB+IvIc~`hmC?4>)w6Y>=O0${Ho09c=6tJ)QRICgB2` zplrKDvYGY9dU|SbA(~dSmPl_l77$BsHK&wpkFC-FlfAmF{|yVz?Omz)Y{+(&?rmO0 zEWaFKj&F}g>8vbGPai&5LxkucggdMw1KH9vbH~M+VI)AA%+Gk;UwA&t6!^Xhrv6j` zCZ-dsiw_VSMZezB`mR$&$5Dy`)@+9*-O^3NByS(dM>?ETMe4kF{D9qBW*M0#yGI(E zwGm8NzYKGE|E=FiX1s&ijGdby(07NLscXjWWLoK(p;(s597@UAq|7j7^Z;ui_Fw>S z+cu6#p3oN=UmaL$NXY5t;hfl* zTw`OieB`}bbufIol4NM3E6p;dsBP@you}kQk&NJ9n!r5Mq`b6L zJzKksjm)rgKF4>J$icI4P$j$>pZf|_#?lK_1g>e&u%r5IaQO0XW#g> zZ2I0XdSLS!GMk-D^j(@VvsjaT5cYlbhIJdg4Hpj?kxgvUKG-@Y4ATWVE^;vK)m3fE z7Q#Cr-*59RzD!UJ(j6tRTiCCm6BcGNn?|PaT>CuIhK+@p8y1)hv2G}oSzyGorTd@D z8dr}NX0pc*_|UNy2gvhLw(3Ia8G?=aL6)8|ImYl!zs@lAv^yHi<{i}2y-wfNenp zF+{UL1z~i4v$*^nMp^kU_uVz*vSkGtWgp8hVxF2sUL?;aD=tqFjZz_r(}PXy)zyG4 zh^-|tk~wYP>~u8EMJ;@j9NEJ9X|1UC>|Cvn%l0b=bWJozw9a16>W62Q@ckjMsUk4y z4LZ@7y|;qmW=el5O`#%u{U6iN$|V-fPijW5VPm+todx};;^L%wC3wZ}HoLKWko z>&2#?&?xza`HnTR@mjnw+|c2h*w$MEQi$!oFHRx?|4iH4hGZMI_G>|=OgZII&C+@w z`Q?!V)pIUR)LvtQ^enx?-wUP0wMBL1Cy0iv(`)G0eZ0t+9U*+zYN>FD^)qN_S_$ol!;KEB@^eAqL0~4RdQBF1bOHDSpLm& zfAp0tB}1t_tc4IMd(z^yM}aO?7)Qy?r=QjZOf}lymi<-~LAQ1`=M~3R^JdQGOo}e5 z*n^^$vIQqGohfYcNRLkD*GU4_Y8hK`RzvTc@YpHu#81+rH(RirwL51{zq+uBlo?M|UAfwW zF=hSFX^a;4uQd#Q;7`=$tyJ}HZ0@<4w6^Ie!>Hlk4N+67(Jt2Fd>CzEn1D)-7@>Al zIvK#Go@ePbvBUUxfjjxOdA_7jr@R1BNZmrF{_xpSxUSiZ?z2%B-vSIFm-O_H=+TC$ z56|-C&}h{?)~?i2zIyT-{&aBxlfwF!`p8jTAwPS`IsPP@Q>szcJ(U(XR>eDP?K&F0 zAH4{yBOdJhSOHi_fmjdufV}hIX__6txIK44hl{KD?X1P+Fgg{twok*G>?a&mBWGRe zWgS%Wx`9`JNU8p;_YIBF*VtSS^9}8U4y}jr&wH>&R~E4?ZyuA)33&$IUV1ZGr?wz9GqRX$Hl$obn{8v63wvJjX;Za)I9ph* zQOf&X%fBC`-+LwPB5F}7w%s=X+csd-o{pkXy8+t?@I2VHUNy$b7PX!i2kmvcTW=|( zv$zeGvFPpra!h6-B-=I=>{;a56x-63>(3>k%ruPHHPWSMm^NipZ0fBDaKf!Css#@rH*-I zC8Zy9E#enT{nhS4@Fy(YZ`Drsb@o$E90}yzftgAl`TO;1QvYz5){YITga~5Q zOBhoJP07$!Ob@oM($X=+;su%#dP^J9TkP~_LB&1*kb2}Ky1p0)#Zs=~tB$#MegrX* z^yQzkeoxO*8+0aBHz--1*ERQ@Y|XPs`pSa?hOS;+h3=*X)lfG4xrVMj@&Jw5{(*ND zj7dKo|9m1v?PV>ht!V4YmWIvFMrir=`y`01wK1Q1l@Of5v>mK(&2I2lZ(- z_Enhjy4e#$Xq2U}mo#A-fAIkZPD>WT_zR4=De#^9%Y<_Cbdb#{l_N*t+4?~@^uo)CdfH% zN5s}o?LXkYnTU1LL=&}ciLEY+<=<=Qx98#vEsq@H`>a1nB3Sx^hW;@B2(!rl19QI3 zd2)~q`VgkPE$yKA@I0j8nQj^~3yXm!P8^v0cr9e5g1fM?2`Evdkl(D4v}+g z4$KUmrxZ%_Su*Q=5dT1D@%aGNVp`jYDAS7)@_dHy)#3hZiz_kgu&<#_&jeJUPM8+z z59&^Soj}oD%UcSsm=;JIc8C<{?7l;&3Jg%8CY@@S;`lr=oDKg`Nq@^)g@!b%CA(90 z8aC*HejcFcR{U^2)T6mj-6Wa8tjRBy?$zE@@JSzs(5V8_gf09PNxf!!)JM>-nN1!x zlLWr(S0Mr9>!B#kv(-)sEXf}y%tF%(!zm~dQXWt8sDJ6E-(kB)zZ929siD+BY|?;Y z=~gCvghg{P*-$4T2XSEoDvV|V{8h)aCA?zbezFDIHH4Qt;Mj&#m@;+K3N4%Jr(Gur zN2{9y>Jkxkanl>;a0}2j1=PhF^H+5kv#o6g-$v1pjNvR~z=FIquN*x&*;wd_=Qf5F zKjY%Y6qYA!yR4lx*-qUTPijJqr0(IuCX|M*U%M71erk?B?pQ^JW0@S7GQ0l5(ILgh zaq-r5$c&4XQ{yNqi@Vd5GNt5AydR(uE7}Mu{H+<~LpS?mA*9rAN5vfl@)7$rr_yAf z7W?Upa7}Z{QXbg)4armXW-ekAnu?|#;v^a5XZ9nLeM z%<0+>4nk71wWQX?fz05_OeiNxxyvC>+wT&i?Quk|R$K`H*AWknJwb^@1$tnjo5%z_ zCq8p!hF*Bfx9HE2&KzS(K|ysZaxQ;5T_R)-%w@8$w;838XHWc&oOam@N}OUwVfs5H z+$sMI>{!_z5L%v@!4w>NPfDG$RcCQtdqAiyE^AM*$|ZJh_3_>kl62-LDe@f;m?VpM zC?t|Vr{=)MI$%Q#$4|~!=z`o_wFd`vRCmPb<{;UF_ioJRb(Q>E4p@XN`UzYls0jzVEiY*6&rc=DE0cBP;^SZ}c$tsT%_a7$m%f`Ba)Ftx~bB~!eA zrG8A5nXsG-SBPdcbk`d+!?lsH!gwd~zo@i8U?`?fkK~lb+VPbF@ zLse4w_&B15(w2c4%;xVuIy*@9Nib}f;PE37WI9uXDWxy76@kg!KXL9&+3z99;o%< zTSSAC`cYvmRz7%-{QTFG!#@Ja_k}}oge$cZ@Aala>1iXQRa-xe5oVXlgj?96Kb1*c z<@o-hUU%M|q%xKrAvUWr$yHqE17Z3zwjKbF3)pV}$oxV&7i}H#h?(?amT(f63;^0^ z6SwJg8B5WYt7k|QXEIP^`^v6pKJh~{VZzS>rX9BM1y?k=a6{EI?-3KidHaf_vPL~R z-pDAM967d|WZ{ItKtqD_27_l^j{jKT_|{I5bmbgs7z-inndl;~P+fyzq zJb#MxD0r;eg85;X?v2}K7-U?<#15fuYiT< z`t?*Mm!2wQ;j-cIVRp?L=6XUontgsHiRG+Eh^jHWWXGq-pQ&DU>yF-I|4~3Pp}<8r z-E|C_wrUSwgiA-kVzXog1?$Y+)DQay>3ZUDe^_k6-u+DO-7aKA*%qjFcz<~7&XXvV zHhVZTH)4XY2M3J?#+v(%aT1a>ihgk_^$#v#v>2>sE`5f)OBxI5yK=|?ToXW<%R3fv zB>iY3VFPXzNMYsYNB#Jj%Nh#vyyBS79maxhh+Uha0_X~A#ZI@F62;-E?#)j_$5da6 z+|fQ<5eUqu%k724sWVY{^kKdu=RZbN+$?B&1bAdKkBtVP&H}~X~dO`7n8`Fv~EI2VKEYz<2=C?K~#hshZGU5Yg;B2 z`%i$7H0o9_6zK6lUkA1F6>KpP(%*QdMEiM!y<)&KcXjjky@7r4kRl62Snsq4*q#pN zunL~`-gg+A86{}a%4nj({6xx!+Ja@lR4?iTb_}KjY5fKKA(-k$FHb0k&0#9(ckc{o zi>)U?Z8kho~baft(GjQGh>?JiphY)z-~H5J+?8^`RyUH0Q*k? zsdwtFQSrvL{Io4;WFyWIrz}z=VfyEW8&(BXk}+G2^{24kG|=+9&M+wRPDA3>ZVRBog|(fP!$|;5Mc=cSXRK(@~tDX^GW7^ zFzbjtwhN^+)Lc9_6r$4gg^!v1ttlw*cnm4xN<&3!s(*Hmycv6wX>-tuOvcKYV27^r zADzhAdXw0Eyk~IW%4Uj+v|H3!xRA7l%-wigwU4U_6X&|zQX$=s0;VY>ntUt^2id(O zCz+Xc!DzbWBGLu>i&IUU{m>rQD!%;4I%XD^6Hajy)fopxz@NfGKccnv!Q|6`y?g-9 zivZeUIS~q}SpPc}`^|x=_x7O%Q)GfR)%lSxxMmInjN;&Nj$J%PXxrv~LC0GJgN1B_ zfFW*40<{<*2nQ(E!}DOppokfDriqY^lf)@AeKONW zVTSh4Sx9Db6?4US=04((YWSezBuSaVf5ugjuxt5d?TvOlU1ivU6Xt_`B()jJidm;xis=}5Yv*Ze;n1>rK6qrYn+;Bg z0duIv=VPeu^p+)$_y_*ynZ)e}cpa{b0bm<;`&#gtanybFy^rRbP6uE!#7GRlI%q}P ziU(lB;d!|%45i$4MXl0Dkei&}BI=Zsj*a-~5oMpo`!RvYpR5++`Rz0%Ikjd3Gk^~BrYKV{%REX zRnO1rK`|!D8_Dj4xc5408g9OtTB01(t%CO$s7A$nZ^1!O08IG+QzAsDEL|c%^yPO! z5~sdbS62}8+O!~pL)XIn230GG+ zF2Il1Lk#T3(Mf+IXuSc)y#N{Q~@R`uEQnqfuv$%2$CO{FIO+baJbYZQY6Dbtj$XINW0RWM`6zcEVhv0~f4D2E@Kn(Ly zYgC$Fd-zX=Ndko{GGI&BimS_jrT-5p?41Q4hvxh7Gp5f~x9PYSRdak6psO@Z>aKh0 ztyZrM(CW;)^#o%HhM4`k5Ad%G17dYwH+UOzs$D~7?+qaCIDHpYDR1BWj+XB@v)~lzEN&lFw#YOdd|(0}$LS z?#5gkYD5B)rwHS4%^ui1#&XQwKMaiX-zT=67CsF{eIKphueIAs%5mNSfI0b^oLFdV zQQzbJg>PKh0jmDrk*ml9pSy7uiU zG$#BHDNX|Sb}+=P(X#2SNV7?8QB|`c!f70o4?I#hFCVy%YAI*tY#K%eb($c=;5zXy zV>!QqKe-Rlinh{?%h8E0_|@8!Jg9rhXlDfo0l4Z2B;dlXOFXV;&mrwL_zQ=_>ft_J z2dGOV;Q4XRmOwuS0;5=76;xquJ{{w3*n%oQZ{N7hYlD|G7KHDk_6qE{fFd-fg-eVez%XN zaVDfgNd`0aYOv55haZPNR9Tl8a9sX404RSmej41>cN3=LYbXAQc2RoDijr~L^ne6C z2#rMPp{%T$KM=!p0u>?qc5Q+>5YH{5UdcpFhUAg^2MW;uF=p5&L>Q5Z$S5i~F<1{s%YQlXxO|7PA z>{Q9SU1oT-R}#6xC7l7$>4I(5{Oo-*$+#O`gezRm**_u>N1vzQM#a;QwS4YOKW3}{ z3<37e7s1n3V(Uwk747%FiEgd0p&;x>A==9MU;2}S)KXwF{qP;$Z^mRb&VPb7bM$2( z+Tz9DDa6)g70UULNuCu>#`f!|894b0wNTl2o`kTaDU9R9U?I!tm3R#w9MS za|a|2vA5K>cA55lioW36Dy4cOX08IxwGTZ>FI;dH8m1YX?Ajli;4H3FQz)6~)u;J= zxP%*`;I91|kkv6)nX=-M!bF^Y6TmO@tY>6hn-Z^UFH|aAa}&H=UeTVU1`igNa7@{s z(BzbhWl*y?V@A6(5NVHYA~SK`ZCK@-Z8i#uPauH}&51v*yA9SnHM5@A7dA(Ie7%LE z*!m6>)a5O2Ya{R2I?md}s88dXJMh-Lfo+&)(NCE(XA+5)Gr22PpZ~wQ@4(enfX&Na zXMHD=_Buel(&G{Jk?M~v9#eXy5Y$`yZGS5IR=Hg}>)L#9#bD4{C#~3<5f6~Wo`cxQ zy_^-pXWxIrf7-f*Z_Ck7L_PJ#PxLV}?MYK?T?q)Dh#y3D&E~*m3jr{hF z?}Vit)w#IfDKu1Xo;NbQ*m~UUWUJkJE$3e)>Slk?CHHTG788Q`XV8{>b2m^exf%@7 z=N+`6<~WKi_&&e@3r~NSW*!-~2lbD$_wo}l{Tzty+|kNVvvs=1xF9R&?+1xfo-X}8 z{ATac_j%Brc;me1&_lRmjCs>0&O*5{W{jISvlG*I;&U%3PshE}63IznJ$dZXQ;?sr zQnzh9iBNrm)vJpG8S&Pwm_A;vG11K+-(zH)*haO8y3vz@@&U z)={$Qot1(mXZ-;xAS!?>`v`@ha!>X&)rgEt{pi6HRN4<>^C=KE*JfZ03kx2=(wAX~ z#t>G&RNLw0!R{NU%|ij4MJ=o$n|{Da?aN*JOr4d|A6CrMW`;}iy$|+7l{n`c#kT0w zWd~_B!b-60vI8|AVf9-BFTPWqsO4DxgA(Y|ord%E>zsu%3(l)v;IbbeaEZ62`h)Hv z)AizOW*GxlGvkbP63O%<5LBGRYieR{6!VgQY>ncW*?zJ#Hrz2D`~3u;-28C^uU(%( z&X~0z)i~-Wc&_QNEW@7YdCZKZbBP+m?%HRrp9dgPPVXuf|d zG$u7qYEIW&TcUWo;3DyO-9g*DuuKXeFQAnP^KQy|!`;-qWH7Fw;JamxwuaGzPN`P( zh*Rk?BbBoBwJD$U-L79!g*o3~y5b6{)JJYERSKsjN>uGRy9Ux56m5{7Rek(vY)IOb zre`oMlbS0{5-ikgtquB++Yx2?c>(ugB^3o2cQ_)pQpC$uV&GmeWKJJ+{w|rTYwY5I zgWywoZf*>JR1r^FE&Iyf!3i>H7=3ZRL>OtCkD9nX<)P~)zGXAU*J+878@l6iO7R9; zHv&#W4r&aCIzCeE>g1v#xTKNv`EO3o|K_x?vB+t`vTBtqwYy>I!R>k%oGOR4-_9M$ zAG;GrZgBVcnV4=WjgUWlphJowUtuGg&=f%FpX)R3nbb-)XxeF%gGx_%qsnbcc5y#R}*67!0DKkv&YPegyO<#WpcQlf=r<<(rsJ{Kc4dvQ)MDwt> z5pWO`>BMg=Tt@aTKFxz9M!>v+6Bv61F#aWW{jt;mq9vn zoBkHgX$|D1$!2}f=UXJ)KUXQ>TJf!-uckuNUS4S1uGxk-F4b5Hk^Bw4#Bk$%9`D8F zwUI(Ir=e>{_32sm!s99pYKED%prXE4`xzRjw&|a9@PkLN%FnHKI|iNhMw*jL6kV}* zJ0NzfeG1d6)mnq~oH^tfP8Fw?kLCq9e93gu_A?7^#4ZW_h6OA2iow_ z3s#W9dk*q&xZ6RRNxi_O9l)-ypWDn29J_{j{;UbPIClvg%+zZouf4=z=`2>5E-;$H z_;`FHvwmi>A+DPjoKjg>0Lwl1=?#a*eo=Lf4JOODa0}@@ih7L)T1qYHVLd((uI@XT zR^3S0hodZ|X|ijEekutz=>()-;lfVRNNN`D(OK#%H}ZR+TC@8pUxQ;iOD*N}Xl&T_ zQ%)}7oX%45#JILI&{9PvG7fiq3>i7gi3RrV0_w?24C3u$orMF5K}>J1s*BW^l3f!% zlODLvN~)*x|KS*#C}I`ftXOmOEjC{**-ek&@bqks@*kTGL?(%CWYF_TWBUUeBMI%`Mrt^!wEJ( z^f&~L4-hyKe+Le~9^ls&9-Y<2BkP%G1MV?JTvQJ!>@C_#0+=9&&4!EtCk^v)VNYPh zBiEIw$0XSj*h@hcj1jTuFz(~-6WwX- z#GI;LVTjt7t=fzkdjPzKA8lB4a+k^@_bji#N%rt|9Ig-_TRA%iDP-P1sirzgt*9t` z+))}q7ylzgo&24mlnQX=AhuEd*0ves$7M_HIh>~eelDku;Xhv8O^Rkz^G9%*LW<=L zpS?nP!-ncs<0vNxEJLD48oGC6nANz%N$M;6-t~ha7n?XkKnwH!nm=2m=GWjPXK|?~ zc7|4qlT@e1J!IB!h0g!Uo`s933T*=+-r%HmJ#hp5z}_z4tc%wclI|h)T6e5;1^u~< zpj<)~U(m47)4E(-=L$%kZ@N{#e*Q?+Ub%vKiqrc@!<0Q+glpY%lkI0rDQ0@!TMD{L z2VIQ;k89{u4!RPrp@>IMibtjTtFwow3TLcmd^pDKKiSH02OeC9ePPDWZHMx>R1Z;| z?Z#K0a8@@|1>z@gb^_DhXcTgU-7g zJvtaVq7*LA>))wQ5e zW`NXOz98l&nJIBpKf#j*NF(KaN}YvsFS;{QTmgTjuRw*|eA{t1UaXL@Y#>ky-d)6d z_gqJGF*am37duci?J4zLbZt8RvcK};Jxa%^gMj)idbajW`-_Jn`|LrMoYGfR%ivB{ zYI>_u@H8!9=Hv9i0H)sb2QkieP`7VTg`itB7{H7o?bIQDg$&ATgUoQDpR_y0a20;y z0`gx5ckk?$hF_)$suS3IDA;RA;Vg0&rw#>6ZWdpoH^0-86yqxK|E4D|Bk>b@s8cxQ zFcHg-H#`i(+dOpN8Po+uW0Mge%g2@@4TVN7=qSGwMc||nfM+@<8!1MQb9G}Ja*r)5 z7~{ST4aeT2q-+b{&x`qf{?0=G&x@J9{?2&fFzHUb#$Ot0^!~&JqIxq@-TqsWs-D5W z{G})85rwpR!-(DPy6D?{dt5RaocaQ15+K5*Sv6e|RqN#V(Qk(O1hxwVpc&8k`okkO z8ZsVSWuSr>u4XoIsF$GA<1SR?&`1GPtC<;JKp`4dT4VNDn}S8weMRY#ao1p*1>& z>&C)5??K3MAmnaQNX~kk6t*K#+%41S#a18TZ>N6EoePU4SL zl3<86-O?Uy9G~ViE-3I&^J{U%B(R~7%2#CQ2)O`H)E~!A1`96R)qt#Nwt^XV=n<*J z;Zvk~r6}?!5P6pP66AHxMr6{Enm zlDT@wF&hFPY&Tw`SFU$4+{)LW2#%R1g`RA}{3nb}Y%QEe)=rn2Hjv+M zIb7AX^%m5WGYOL#H=u8A{zWVobwq9T*7SWx(2k7@)_q+ zT|p*a-ch&;Tg(GpDV!hkGSi=`v=lR>;=JdHwNpF}iiAIH>D0?`|Jry}CpbV~fD(h#!L)+hTWt!aa?2NjobZLF(Pw4$Mo;EP}6I0XhGF zqKhjQ!P@Nj3w+nW6HJF5Qt)>F#Q@rkhK>646O25z-iinJ%UKL=T$>c9*f45=W98my z$biF_fK*M;1jBd#6{>~S&lrE4x&+pm^8RGOkMp#Bk>zxCSB{PqC0r%5RHyAH5xyKaV;zYq+G_%nyfh1CV}7|btmPxhO!yL2Oe!cd^}DEIgoB4kv+(VBX*>F4 zzujmP#|TQt6KFnH7caG!QU|bI0xWbQB3KbElsO7}kASnqCIDA2)J}#TcN0~6S`Sd2 z!8zhv)~y1Vc-O9~paZ5tJXf0_x~XbRszJ4+2ePtmBvj+P)$rw4yBFlC#dvjoucpi( zT(%k#MzchF!E>_=@z`&T)Q9@SrLK`qp_Gp=Em3S7)!gwz@Denp{X(#A@vLYexX?@O z8L;XRVBN{^v|9U1f9cY4)kLSS%syE($o||_DIeb)eYh7v_T!o) z@QJoJE~C#T0gM(i8^EHWuGj!Cu6}t!W#p2iuP%2Kg0O5OEa%LDr;`m%DqVcU7?_;Xu`7$yH1b1&&jiR-sfYU7>TRnKs22H@CFThABU zIS9Q}#^?#Ig(-Rbl1ir^p_al-JR=iSdnKw5|Le{xX78C5Xai2ogpUgSWrAyyF{)n| zx`|b77I2q+*-qDOLJitSW$0F5WtKFI67bF}X(s(Ss@8tH{e%2D?t9=U%5NvUEV1kD zaRo)`ITFo`;G%YdjZwSswOx>Bmf*R&rQPXjfV1B};lw$+p@ccQ+Q!4>OF4fDm+ppw zb~Antv-IMeV}{G7UC^*iPDZDY zci4X~EOs4w*oVQo=L$KX`Y1&_FmhG3G zl{(hzU+S4-8_B{L*ww@}I3jtp9`cTZllUKc5jPWJzw%*Xn0E1IH}$n|^*Rq+3T+kT zWv_$C>ud;7&AZGWKN1Q~-9!P$8wyF$1Lq^~*)ka74?t$L|H?N#=fzywGE*3hEe?UO zOOqvNrGvmPYCezohQr0F4q=!0UnWz?pqD)bTg;17yKUw$1uZL?7ab1sshBnAsO_}QvBb?3UTc1M?0hYwG5ReR%7E!cK2t`+|> zD=C=|G8#xOZF3h~u(uAT^HT&M?j_n-O2TaNRj@mxE2WA%FAD>E}U`V|(KGE_J5JbmU%W z%rO`KmV`^XAccz-73D8HdYBF(2H&kD1_zbGm&e=fFBnmrsC|063PC6@1%GMad5GUS z+ZhdBvXiXDC71tR44Yg5Sem4sQgzl!JuH5#fvXp?tMJzPMUmvtat9&YcBFWR=PIl< z_DB}mV{{T(+?A0T*y0+zb$i)N(lWt=IZ_!<>TviqSS#RQLn8m|j>0?i75d?z>+n|e zAPL%>HIM`^KLnf9yz9Vfg*C?~%pHJQ4&O{3VZR%H^Tnm#ka|$md+yFnvFo(~4u8M+ z9#HLr!{3IOFNffe0O!07;GDMx&UugFs&XLhUzW)a+~tdcDp$a{V%e?#Sk(Hqw6T=B zg6-~t+c(1gcY%{LhwkxS&EJsqUDpAQwRgdfUhHf~DnrYe@*QJ@DLDKdq=YfIk7-+d z?yjDWQ||#3TMtg=y%SYvV*F$>5C`4=n-b2u4=lcOf6N!X((@1X=gCg4?7lQpDz8qs zN8bKe371J@9|EcQ7uyn*WCJrhWQs5z*FJ=`Z=FA=8=uj|G5Upt8ZNXwf`x`$duE`s ztk9&kF61Gudh{RUl#iuv;V9nvi5P#fd+jFeckM(a4OWtSIH?kl8Lpzqh7wPP%$_ME z;n=58>^Q`f@(=hl<|rE*7(>G<42oG5H1s^9>3d8 z9M>fveXIS%inD$%)?7Jxkw#rR!C>$MK z%=Gi_C*Q_)Y{*x~$jfbY!_*aM2(I}7J;o3BU-BO%+sO@_^b^S5 zeK^sOJyL>h{@AOs#Dza0sVBw65PzzYB;cGnupkzv{*qc!J#gVKX?Mqmt@>%dia)V_ zA)c#E1*+l!ey#4`b7gIVQk8S`awcrSI{qQ1>%rOIEuDp0p1rSHd0{f@h7-i8I8PIP zQKMVTM4uE@4z8<*eE+jx5m}T?A&=C74KQ60J)I0}SHx_qNFpe;ra^aV12&-=R4NU1 z{%B6;a;C~*G$}BNRHqhWa{hp$x-RMr{|YoB{*Fh?+5Zn~Zys0U_6CZ#+k2PDxS86het)&YU?yks&0tGDIPAD7AO>(tg+4kxa=P86rc*GG~tatj_m* zfA`$q{oMP{J)h6}*~jW#Yd!ON*0Y}Vyw}hD5ni9RAp36Z0c4zX#ZWJ-=&NFJtErxU z%}a(2a;2_#maJsSM3T1GSQ)x*s227aVsR&fT>VVfJa$1FM~lVaNjF?j4FA!W^N4** z-s4oUI7QA)$)*`DO5|1Rsy#ly5=e1C4a5ghbSSI_!XE_&Fk_$_NmQ4I?spqK-d72y z&JsWZ@d*+!ROef~y^`Fsw;|$wdpP6rSf$;YkKCwzRWu>(2&6^)eTKt+m%w|M;5{jO z4|95AKZC|CQE1)4@$7z!o>(Ib9%RSaMXE~{y6;8paYze5>gtm*O{mS`YTstH`s~9%!o?_of2Wo?@^nngWrw34SCXvDsmA;rozEkzZ zU}ev&51N=#HvxaWP#8m7fJ61fAe48pksagGqJC?NpAkD^A z2`!f#BQJ>^3B&R>@YcZJyU4EIlToCRH*&@aZN#?Hr%so-RyddaH3ROa#rce+64`ss^BfA~UfB8y2 zda$+^oi@@|`v^C-1Ho)PDiw7cHxh2O__i0%HQ1w^LS~Hi&*=$C6)@@xKCFW{Sl8g} z#6~XjrH3rs;|62ZEZf=ZRDeuFyI0T-Nr z1CGasBGcD#D0c34II?%L01OJP%EZ)x&U==qu*#=T>Dto{T znKMSBuy>Z)TNf;}$8lp1m|=n0d_|NDNXfQ*7@fUMLlc7Z4wu z;l$)>a9MtSNO_*#q1mW~DL50`Hv_LD;BtAWYc9}&t>f&{^fRO9{i`H{G&>A>(vN%t zjG`;E+Azq)&0{T$T#O#~tCBO(KcKG7o@GJRw_UIL0MPzLk{Xr#CjPi%f3crz;fEmZwfqnn{_Y-}mq+)9kt6nARCH{AMDQ<(Av2~k ziw^gbbUFZ_rfxd`NEwXE4CQ#=aFwPh*rh%7gFE2_y2_@yx+^BnlpzGcrg||=fgb3-~@i2F%2b5v(fG!(q3DH%{Z|B&(@T??Cd;`PJFUhwG~T|_`IkR zS0W(e_n}7>xM-G;n-faXv6T{s_$Yxrw^KF)hvnYHHdXUyxyC%;}dmCpA5Ni!;21hA6SAF0rag;ZV zo*GdlXievnnLj1;J1+7Dshx3C>e6}^q{9jRs@^!n2b%Ee2!+>^wkW#WbI_hf)--#k zt)^>(x95}Wc62(QIuO=<*~^d^xWLs#+tjkHHUQfX62oPj+mq>C?{zMf*vt?78}erd zcgMS!WF0V})xruO>v5*R&g`P)IVKPA=)<$B*AzvSf0;&e+m`6@PX1y@K6V&juC93gj{DJ1&BO|hu=Z1^ne5c3fY|X~FG>sz;8wI#s zGfx!;KRB*fr@xSc?7|R`o5g|06?cc2q4xt{lI_@Rw0Ma~#3zkr#OZy~UvX&VBh9Yy z8#O<1-B?)SdTjl{-N3R?@gAww${5ZR=Z1>sy6}IUB)&PH$bqr!(8>;cr5q6SuWpwB zzv=L>j1a#oqZDgjZ4pdgb|7XrXdK{4OGhi#citd;43-l&+%OJAr}G9c&m?uKrfqj~ z+J)!FgXISCIt=dDxaVG;%e>bB~&u;EoZvSTVC zOK@Entih+Fx@lWy=+alVS2-6P77k5GJ7y~G)?XB2YP*nixGEgRnxuPE@jKKQm6*OH zzSw>uSi_D#Mxr@<#zgUIT?qMEO$Jay+j|S50Y^OP!xdaSCX<2BBe5(JCVtd^D>vlu zQDQMsOEzJ7BoL|E--+D8VeGH>`mXIY;&l%f$9M(0hZ7>jdwP{F8;^ilkUFy%@(gzY zv91;5gD|iw^-Ra!#s2innBQMWooY+}6!1f*h{HuLv*SK0+=sNINrv7^y#-x33*#wD ziw$0gbzoG72K8ynyJ=JQ7->J@nkWGKd8Z4C&*C9Mv7?v93CB)_ML@vWQvvO^ z31afJ{)|xGsQ`|q8d+1~tTw`#-TO-(hpgtRuL_fdI<2lZ3TLH04RS)fY0U!@CQA`X#OICd65H2uLDO+);9&6v?^ zI4@i|3q0r8(G$3rZd*u}T`E~TmMz!pcEn|P(%mis2s7bfAO)@2srXshhjdVI#Ey@i zEuJQViL0X7#H;$&EA(?`3S$DgXl~%7xuDYRM=cSWX0%7U`J%bZXWwWK*Gsqf6!;JI zMxoehKFE%#^$@Og;$_Xdo4d#coH`#2><=8a0DkUZ`-MQPr9&iS^U{sngT$@E58SX2 zuur-4UUBm39O3Xu#O10G6n=SXWo1?82c^;wpQZk#f-MN zZZRlzoVTMk>1hL(+1&-Ua#c&fo3z0(OJU%p&N;5r_HCpMPvceIxM3;y@;4H8s>Tl{ z=tB4oRrLdQUxMw7jUbNy!HxOwOtzSRf?i%xsM0OT>~9-MCtR}(MpKGq+^Y4u==Y#H zvImDO7yHOZbQ;Xs7F`NKBQw9Gpwh(PtY~9e8e) zm}f%KxS9#Y1;b~G6@HPzt5y!0HaK?;kT?6rGocT*UkfY1*zfs*a5zbt`HeUQj^d8ShfIk10 zdii=7EeVIN2QNams4ZD^G)H*U@uJWf=dKqogq)bp8(?eikm~0;J5<-XfBOMw6fWNY zjD}R(L@+{wa8hEkN=Y}eP4f1@*TT2T1>7i-C}^9#jyQ1KO5v$hF*g1ap5HLDMp5Ax zCVbe^OH+->CXh@2+2a)|PnGax=2~tGPS^}^>ENTAfodlYkb;zh6itpg4%W76vltr` zI(_BtdsLGLIA#lo!Nuo=1)DE!cDW?XhU2(~EsU2qDG5eB8fT%5i#4FSo893uX2@2c z(8`hpC^NH*c4}~2?H-)H75Zm(e=O`=IF~!Re7yiwG`0aF^}QY{e(Hw{P7jp6#8dW!sEC&E}fTcXG>p$yg!#0^6Jz^!#(6H4oZe;e%iMpCeweD z-%V{GT{|PWnM!6m7_0Zk)G7r12%)}(qoyUUOo8d33ZL?G{aUVH9|CDxjVTbbSghEj z_|Qi!+?%?Ri=4@%P)DVsXazy7_WzBlv3g(8KYMByC(a-ei9Wc~WGBqMU0v!~DqUV; z^W_79!_!niu^?ca!lJm2TP0j1S8+lr80U^3O~}*Vzev|BZRiecpVq9t8EN28nFKeH z>eE3K<0uT;JoD}oMS$yMVY#e_W-1PW!qNt7_Nj$24of&V>)QoG&3yY*@%YdIf&SV} zj$*P47NHS}V8{`#+XZvKIMj#xe4@6bVCH@TSzNoDWzv2Ru;a`YhQ4cc5GN0V! zYqA)89zXjl!fc*$AE#XN)6q6!%*x@^TLS^ zr2mkw#E64}WSAUmCcgX-xRaaC_tuW?KSSSP?3+MDOcML>?w!E$I&%Pj_YvyqCx#*bqjne~zMW|>$P%v{oP;e#~ z@lqAr0QLaf84Zp-j1v}5k0;MlyU?wC<#D!b#!Pn7rZ3S&ch)1ss(RvJn^YnhVLkNmBWu zeAv3luT@wmmz=02v%}_4+RaO;u=F5PVmfL+h8s0+&RNWi3CXqkp4zkBUvP7KI@1hH zR50PQGZxCadEXU>Ha_F7<6Jc~-F`B$;LvP>!iS61H*iKF;BS(dq6*Atbk52RMYhV`V=qs0z=KIRmtA@|$a zMa_$QeP1~rfp(O@bb)=a=cj--nk~bes3{*+!onfs&{^SO;R-IG%L-u)juv1#hX#l( z44I@TE!9C=FcAQ|gMs;~*-td6>(na+A8{@L-HP<_=IXPSky6`^)G(C!=y9-+b_bT` zH(w)TJ~}%jIFMt;ZLbuO6z>9~mir1$qME2#K22Bl(q3Pkz#*Cc|DFDCP4hxMhI;WZ<-O;u2ZIt0G07 zjtN>kx)H(#VdsIqFZ=oCJ$pVAjpwV*GgTc?bd@@6v`~&np8>)WbrEcZ#wbBCEl)?W zeWN$p7XaJcMF)Xu;2HI``B(KnmQ6ST(pCP>5_P%+(7W9-RDMc();~h_fE>ahmw-J7 zGKLG6f5_40r>oFsoP7xpDlE~}RxK+OcDT2K0~o6c5TIKl%-y2*OO!{l&D`F9Wfel$ zf7f7M9XGZH{u9FT$O<99-=?F@A4i}UIGT0U#C9RS22B$l&%`t@n4Oj%0-OGz0QL}W zCxOXL5UXT+hc*M3t9Sk}b{Rfow(=NHDwtg_Tp4$0=oNpJsE3N%jGHcls$>tmhCZ$@ zqpx~~!hvLYrPxnY57#KcJrIRpr>kI2difktEmY_#({tMvEWwpm0VCI+IRz(QUd#`I zG}T?$_Zqylsq|C9Mf02!k;WNlEnjzyMFj7U8?J~yYN+_N#v6UdW;cO6C*HSKs&!wN zto6UiY&C0I5YU|{rFzI}T^u^Y7u{qs-+j+#jZ=>qn*F%(7R_o*qIV@w1 zcVVRKzQ1#PQ%oR5775-mE--+cr-A(?00L(;zDkLSTjf#^FQ^q39N@$zj= zN9PL9pr^%bO@0EX9$Tfau-up^7>c+TYcV3B^eu~D4*dj4GH2JG|_IC|Ri z3({L0NYCg@_rvaeYiW zRQyyt%;<<7@?o!86!EcRx+-#xr1zDGc(f14ya89|7SGi)?lOId_^&=hzXd%Vr+iL* zWg#d_cN67t*gKGmu+c+Q1}Bp9A9l5Xw8AFVwCqEQTB2L(Z0;MPyvt|2XRLZWZVx(@ z&S~9^d6t6p5$HX0Zy%vg_87$$g*OCn|w%gqDnR<}m*~pp>&3-`VUJ65NA~w+wKKdK8 z!n=;udm0U?rqgi3cOWNqr;6FiaBlUoOtb=5eTQDMx$ScXJ^7^GHhHYlmJj;DIJl=; zU%0Vns3KyJH|l_EenL-oxwZ25I&a0MgDXi8cKQXBy*X`!T4k)KT)B3W8cIktfqSKg zQ=5PtM{(G1=ySn;eu-B_qV2~C%F&qU!UU%#_ZQ~>s8B3R3PL~mI$a5a}fs(A{&JLCJ*VJvp`zdE) z(n4a3#Y0g2%83sVZ2QNk1fp(9$?gf*emRnLw0IEyvYBKA< zEp(_)4VQpxS^{kjdvxyqeCINu$4?JPXOtSkTm6TdYR;s#Q5fsJMI&&CA%Gs!a7VLZ zO15X%&j#)cZZrfk!4DA}M(yQRP?R>P61cXev|BmODp`8@Z7I>o{xJf3lXikog z1odsc573+(U#Ql3&)j5*nk6@|HH1aOW{>NrG$}qWq!&LXmN>{*5+EgG=EMDq3}ax; z*)I`fVsRC!t+Pf)a8xUpKjzq?er=9!^wb@86O45YG|86;zg60*y8NkwzM*kXCn|Mp z*q4xofWNe%zPw+G-> zdGsZLDku(HwGK_=bK5gf;)ZHejE3$3!afU2;lfKptq;$2WHkKp z=_+dDdY0}x7s`e4mF5zNfR$jmrR0s&Z}c$O6Wdz>ZMy!|6J_u*RuXV$J^hq|CBL`7 zVaY+wG3;w2d125!Zw%?I8^?{u^3D=JgO)iV#F|@8CgFt6k|hvRYU&KQ2q&islkOFG z&OSK=(pH1Iz>5~^erO(^ccuY+MiO^g1u^DuKMhBRHm;C`yhP}_E>{@-Vq00nbrZhq;l9kW=D%Jv7+OE{@J2+wRonIN&A z)_5btjsw;l%GccLp!h3_&GHVX2G2$_ilugSa$@mEEH=#3Bg{g4` ziMxv{-GEHrgK|r@|CV}gebA2PVk>t^ui%87RTBfAxHIu7 zUS+{mPU@vSchNyRf)DawlJ{cIesbjJQTnsJB@{-B>I3lG_c7MaH(ZWR^@W28T+@f~ zWA!6ph4iH7ARRASft~t7Q~!I53-Zm2^CSCNpkp|;FHr6m&h87w#qYtFZgV=ea7)z8 zrGz`^qp3CN| zlx(Wm55-#jggxlt?KX5DZtwz(0_yK7f)}h6+HA|9`*G9&0RPzAu0o-5w_>BM85|oF zv8F({&>ojITiEvb7NlcJy`kx0$w$rYMahcay^q39GsGJd!Oxe!Oavl<~=B4IG#d1kAQw&Kz;v}{}*X@{Ez0|o*1xq|Im2@0IH z2?!rF1e#hn+)|nCf9+g$bUSb^V+d&CL7oecM2ej1Vh+S?=)TQqON zS+Ig>knFXEc6&hy^4B>_7vjo5$$5w6kJ(P|0Z6SkWQS+N@85|#tjj)XrEI^z3F)or z%uYgsz~(=bnY#9}yH6d-8P&-!R$i<-*x^z*NHr~F5oxw?vG7RuE+dI)%qmKw??SON z*-*f4Ym=TfKQkB2*wqM^uo8w!IvI4?JB5QKFRmKr4h8aO&F)VYIt8O^jf>$va@9}? zxYqN&n<&3cTusH(GwB=bG#m&}n_I{A-RY=R{;=21$FajD*kG<{gl2g5K@Ef|M}P>g zleE%~xxWv&U3oxsuxuoBvNBI3vRRAKQ=L)p)!wj?Anzk_!blK8f5k2?|5%m~nC0DE5R|NBy$Z$b$O{i>C=FsalI*LuqJnJ zweSr2F^&`C*wKK;l^?A+SNFLZg98UOmN=XECKyIXqVZ{xUMSUMhPzV6^6 z&AH5jaQNgj9&l7nT0zf_%OQ{w!~Pk)cQyBWeKMzmttJ48&ST#RV4>48k8r71tOa7x zn}&{M=eZ2NLU>lWod?)hSb!Y?oLf>~VDw?53z}=Dti@qr;MsKkvRYZTXg%8X!3~xb zFF@_@QWoqNZBOWyc*db{s^<>mh?~MB8hN9?sZyw4MbCTep@S3qDs750xWV5$X^%Y8 zYhDZfk>rW9-L*?v=W%Cy)RM8dAsndg^Z6&|rE%0oJK4isAG3)-pc}xOJHVTf&AdsP z2ya~j-Z=f2H$@Xc#RIWZ1jvDP?=01{D{*M|{AsFwxH1C7Du2XR#r;JQ^c#+z1jB7h zAFbYhb%V3J)n5 zN5t7npI5pLJF=JiqvW4Yl{^%QmhwzI#+MHL715q4_9X@XM&*Y;Tva4Am3!- zCmW?l=@)Lsg2&uI91{)7G@UPxW~;p;md*u`KWF#he!)HY@Z@-?{1?KS=1p8KxQxE4 zc-4NM<`thkR|1LNUO0C?P@@Peau8VL56u?2YQCfsl!$AbFF9}UzV;YRSdtIBxbg)s zhNF&_WKGj0I-!dpWNEe#VA_hgg%VpQyObCdw}IVmdkWS~r+~$s?*l8m0l75z^`fJN z0jCcr24o2LUDZ*Y-p~U;TNe*ED z7)b|N>rF<=e()VB-|$?TjH6?~_xRVchUJSvbON@WcCmZ2k2);DjO&(zR-az?lSGZu2?IA|r1!^<#TqgpUh z@yXJayMr@Ug4Jq#do6#%zLo`F#-HW}+-GNsEZ1!!NKdUZ3q>=@Ve5b=+@SZ09;zsx zvxQUeT&%=XBwbox3{;I>1%|rh{zlIsb&pSN6%J~4;po+pPA=eQbwCUy#7BQEK84mxOn_YXDUZHEfy;RFESuMe$eK;ge5+M7wp^T)Rcqa5sbtKDi zZX7_L-e{o;JkoF?%HSC43DqZoJfY!FOAaH6Vt(cm&X>1eBYC4Md-1q~(&5t&F4d+x zT86FSfsgOM>1l(*FVde<4LXDC;$g7fb2Vh)+6kn8byoszYy#usr%hW*%>BRiPkGn_ z9FL&&lDRFH9nu!e*YCltJ^#0)Oy2;KvSY2DvTA%9{rrd0etgmf@WN$hbO@Og7f&A@ zvZZi`AQ7}{e#ik;=*cG3@S;dHicj6hbSDm1ZGzd4pSS5Ac&A#u__eum5pTa)az|uf z4DN3PbANeh5*smXUQglkdLPfir+RREFM2DWd*rO1T7QT9#Masm=q66x3X|A7?o-jG z+4;5ZM-buV+rYn+r^5F#jJ8^H4Xf7>33gLv>2~4jv=fzfo`3HM80Fcevvt?LD{gml z(OOdnts!pM4&p6`-GT8xy8}KdnYpV6Pc9X{xAXGsUXcgce2qH*{u({fKOx&hcpR3X zD8Rlc0LTvWc+bq$4VqO|CiDqkmm+~M$l%N#%Bl~8g&w$RCy055=}O4-Y)FLxW_sO2 z@1-#$`R)eV7jtRQbgb|`*<2+GP4lJ+8*bHZq3f`4+doJ{10NjlK)mpUB{ zYx!Q2_Gl}L!FA~{faOm&vR7oOH20k??8jld;H{g#-ALmP3uTJSGNBA7>;mzwHNQ(H z4ed%A6{EN^K4v$QmaTI?Q-!D+swj;VlsIV*(4cJ6a@Dho8rATj1C?#D(_Vo0aPAlpQ_RRp;96s98 zN}SF;>Z9OzOyE+0!H2JZ`ZslNhm!b&eQejc9yjcV&K5eo3(GnTP==};;HC$c2~Fi6 z$I!aVr@5rumRh((n+b@ik{1^iD=iC3P7PNc=8G~J77houq0LPc4f%Y4n}92`VA^3* zjOky=BJ{jz4OfAE4*-n4aq0m;rbDW^)@zdWIV^>emc7 zBGJn1&0EmSM+51ktG|U>EXx6u4gIaSMV;CU<`eQD%SN69(`}5e(CnS9r`_mVMIv!7 zYf|X=5IW>M@^!xi)ynOU0{PC}EJW?TZxB4rs3CDA<|xD;DkpYU_Is3%x||+Ibtdp{ zk4lh8vPa&Z znA^k%u{lDYJb2B~*IuKj9Zos{t7H-`Isr2HBD)UR_#dZ3QpQ37o{)Sne_=XZ=&Kg{ z$SK7<(hXY`NV+-fb%PR?aX-~MI(Na`2f8trhM5HB;%w}H4fPwdnd@BAk~-n&0*E>I zyuLrJF3^pqU`RiF}jrx8!N9VS=f$8-vhOv@6yx_zr zihds9O6_rKG0b>yV=C=!CXf_I?*q+ZMm0oVj+##sRSVU z;QJf>G(15sNf68ME2f3E-n8w~_R=HIXtQLx_UtbUOR zI9n_6k-wg(QFpp*tGt-GNF7Yr7l>K04-=3k9anaa&+uoP$i-r|mPl+&g) zb2-zG+rSE0l>=mx#(E=PbsEve57A!1(dA%i?&9Qfc)9fFA}X0T1YJ3G1j>eya+vpD zAmiL~V0`{Xe_VA=GD~V2)<`X|?|I3>{{_(U^WfSQNavRL86{GSPPa&4I7`%E`>bp5 z*toJYcov9dOw${=m+q)4qlx{?;l^jp1<=sqvJ&d~vfLkU2DJJNHQ1c4!01V%{WM2AY@joOEZ~x1>=j_>&~~@z zEPEL#mKf4`yzf=XACYJs_Ps9IBb$9>JRS8$qJ0+fj!wi4*8!HSpf+w^XV0M|4_()n z*z5+#@%|kzNtZbp+|0xXt%aJ^fMqgV3r5UR4H+`cxgktJN=^5>XW!OysSqtxX5pk8 zFq+G;>Gb!GIK}-Z%`bf?TqaWXT7v&-0|3k9xquge!_NxzSt3z)m&wA;3K(Zc zvmvJR2@a|SFsH8xrX8NQrubYOU5OiN!E)-ooS^c-QICP~E1I%U$S7m&YDXuu5j#DB z(Hj$n)1EK8D03|__X>wRVK(e>2Vn_7I<^^7tEUpJ%jvtJ=<~QEnhrnNRnD>S(S~QR zClQ*npqO&8eG~6-l{!}6B4IkeI0Gzu#$@m2I;0B~U1o1|;{tHlGvMrYoWTAv?C=(D zd5;V(Hn1hV$5%aLF4fXgaa}b(s=2$aF6yp)LmgwzL4YOZzp!M#0CBPQyGKLZib&+c z%iJ)W`Vt74IO2|c2jqf_FxEjaS12M+@HI(a^R7xHMv{kOe+4UgmUovNNo3;m_tkQF& zZC{3cCYTjwULw^0m=*SWukty)m6=FVEK|9$*s4LY(8(TOrrmx`{f{-82O3hUIs_Je z8obWBL@jUSa>%Sez0CauT8T*m1K{9&?#;ItE^}xBvE=I-7+DhDukB`eW(?Zwmao?0 zrni!(qM!WZcOV8LA1wL+R&~e6zc|zuE+$7?DdDo$2N-Dh%u^aN!-$&`K9ba+IRF(Y2Q3R!5vwzC4d;~u7v8@Q%Xq6K-#_yWF2OPwlJyW^YG&vR>_`bp&%7}NCWG;TedVhwYx z09VKND@e^w7e_j1lt0}Yuoo&yq<)nIJDe_FqI4}5aTh+fK;-58=JlB^p^U))hD!F0 zL3LrJAzJik57O2zL0&lHJB(`ot%Gv*<6k8$_nm~goeivM&Cp>eSQ|+ngm+hdz}ydj zJ@`}sij6VhY&`mN!C3lJ65zC@>>bi^WhE0f0o{y%!I`SzK(nzh_ec1>GWQjCXMVPz zmpL3#Kx3hcG`sU}IviL2ggMsQ_NM1AFQz^g8Gww{FKBW!iSIT-wh~P^9$EMoAN@=6 z2+|dC&~J!Kju<_I`pJ4I`{MH70L@>kROq|Cy<%r&AXIxx`U5QYwrESMOg50)o%(1^ zaM2%F+&Y>@l9WR`$&FO06r$@Bqg_qxa@?ee?Uc__W1%JDr?}hD1Itj_iOGd!sf|+j z_!uy8qnmS~mbVf~fn42gyP+MC7^TeI4V%JTU8${fGMI%QxJnoL-&E~F`%jLdr|&o@ z>v51+3KDGCPpIm=h1>S-4rzg7#8R!ul$T4SN~o&ZX*HVDFr{!NA1jqMV;0sz8Vrfc zxhg_I1oh! z(9!N#e76et5@o4sW?>bUwuHCJ)7vXkA!~J6?F2N5Z)_vj?h0?A{q@A#SIs`*v zTLFOgioMXe;hE?wmj(&rz9ul{ssSU4HzK6XIA~lLj){rXLjJnv z5yT}9#HAMEa1rqP_xI44=QkR_xeXNf8ys0{80~W58~0BK`YIa=->6M+LTl+<*ts^g zmM)a-EBWf#;$%;>!_Zax0mqn1JBe2Esix9nx*}gZz)b2VpYfmJnhE-u#Wzb~I`&_t z8=H=8iP*NKvE(HeQPc@-Fv+Gyn3zfTi#qaQ?Eqyc%CM$`bec$7>v9uuxS^xeR+jJ| zn*GftD|29gW&C}bV~|FkpMS@-z|rOacTY2GT7C8bA$1YjQ@D=3Wpm*cXR6nq9Mk^+ z7D;X)O_3S>cuj^2dURy$9lC+9vXHuoT>7NxD|rYIo!Pk)nYOZ4c5~ZBPqZ4Ro#;2H z*)?VaW3jce=ci~wTWh5?-_J_g2M($Y9-;@yfu6dyZIokhtToV`5rB!}|3`p)P*HYu zI>L=1&WOPFZr_0b6M+Ehn+Z^94Zt4Mw~&wbo2Hz(;H4U}i#vf}3!|r@>IucP+e9Sr-5NMod0V(yqtRoj{OJVbV!DOCIsGNd5TGD%S*;Ny>^fpTIe?fv~F$n_86t z)3J|@n!w`=pKq48c|>}<*3h4Pn2j`2Br3zFJ4><5+t?Q&RD?7(lMuyGU8E^;FQ=Pm zbnz0!@|`V}*Ee`FZi2h@3r2QU|FgMew3+%pa~(U`0$k-d))sIYJK6|s@YdB1C|gT) zaHTD%a!2zB?Ks>B|0{CB9qpu@WFk0PQbWz2bMa3|JodE%UY@=)G{jVUExHe4Zk42a@4x7J=tctmA5q&v_fHE681GmeG78aU1WSa3VIoBArB1^*O5l}zFQX2f9DW`Ryj zu~vHE>pi3|WM55^(9D;c=p*lyusV0kuL>{W#f%H9k&vQG8o7_QAnOVLL;;^B4x*$0;4H@S`wNFiz$4B*qQ{W8N zlzZX|QIBq*UG{XMt#N}K;5=TsoydRwMUpQXYiD6I4}kM?zZZ(P_l6^nYdJIv7kPkj zo(LGhxG$#+TA5TpUkx3hFO}p{f9=tI#6A&K5mRYOpY0i zG7YZNpP&2En;~tKt#K~v%DBm7xEbhX8D^|2g%iR>D%Oq3FMEo{in*nWYq<`2NC9=z zp{s27`fc?03I}CD^#Hi=Y2P0#%bS@tB++7v`XmnO54g^|??^_Zrx44)YHETr`ZET6 z8Ov4g9gl8Y9zxwQ=PC6w$nEAu9ZvVBt8tPiqdi~a32c!jq*Ox+OoKw&8>%f@anRT6 zrXzRL$&>3b@-nv?6AobLx8yoH-YSC*x2}Zj@;VMUqO~t|J&9!q{_6d$rB?jbmnMI? zfugV+!C%)jGbfDw_0sjLik>-lxZgFFaQiX=fz8;}bu7AMe2hAmb%EUdCM4|!MI!8# zfQtW_om|QnYpz|JRPF;Gqhx}!`qv25diqJ!b51OZ=aalxoA~=#a%(&)Or2-v)*ELJ z_z&230Bpx*uzkIy0n({mdV|!Yvj1J%3{agnEX#qNJ_)sDMx^L$9#kC4^?|;rZ{~1z z+oqw-#m>~74;sjPn_a)>(yq$xoL-3nipbXZf}jon%GAIVJ)5Vf90Z17dB3;Fx<4Uy z_`@JrReN=H(3YM%M(s{qBU4{EfSNKs$HC*JVz!DsY;g$ydAI}ekkAZPv>%9w^2Sxg zexTFHhnAelPN}xiyhKo3 zZfgiJ2)RFCbfUE@_iAMv8d;o5+v6&Kpl!odM|y6;7~=n_J#pvl2TS2JM0)Nv%`LH4 zc6aXxca@WdNHy{vJG*nHulsTLc3$ zwC%82FbKqpHJ03fVIJJN^jgjd*8~G5TVCBqH`fh7Cl>Wa2hWDVq%3@aAO%G1&h|Zw z87!A0Fw(b3Q(;X%g?hWXVW(lzxdxi7>zq%_eMKhD9tMIv7FP}f;=ijOt1O*mggQ=W zAU@b?IEaqjHy8T!?j-sKQcd?4qRA5C0XOUudfED4hLS|e>sYlzcMDD z;Py`_mXCnpT3}~7)%qb??3X~t^9duEPW%fqK4T=b$@gU5EShhqp&JvLRNPSZeWjJa z5muW|U~<`v2U~Wxxr((5*Ib})+~es%Tr&y?b?BLcus$b_8!_M<*@dMc0LbJveU!s5 zcSBsbIfTcvLx6VEp`?ZN<1`drHoYXk|E*N8bJ9Dpc#YA*EUDxm|0{3v-{#N)MiV66liA$_RndY^t?U# z#iHVD-LwPQa&*gr*LX;RWj8|RpSfJ%a^|wj9Ncj{cr1?%X3;pESm9uzD~0d0j%Pyu zFGAtm31Cq(_f#rk(%*V2aMc9B>e$$HWIpr(vNrJ{5jZ0Z-k1~DK=V%N%QxZjFyL~} z>LTuA_I1G?bK%kygWuZ}^ttUMq>t~0OZ{X)M=H55^IFm)>RC|J&1oWVEO^B^u6F5m zG?mPzt8nZ@pzy0KAGPCbT{j!sK;=!GJrOh+%~((GpDIV!hQ6Y&c&mv2m9HJJd=f0$ z##67L%{}jvdDwn3jBWTOgSx#tLennEq0UwRP?2;lhf8(~gq!N+lcgBSu!KcQ z17xZ>H#occ)->SeBHE5Gie!u3|4fk%m_&gEADOnK#0S?!0o(0yh^K#JOU}BtKkQ=? zrUEs*juxX$_uIhIn#=xKI_x3!-0V@ji?5o>Kz<_WO=GKvp>&(xT3g&O4KynBnUCw^ zFVEGFoj#%7{*!=zU4VC9AceIB=D;^^co0b9rs_MK{G}azuyZMWh`H&2%U7WjD*ok% zGIMu9Q_^(Mov&BtsxKWEyN2O{>A>a21;Mn&x-T~ws?SZwHPeBTWS18*6P6>rtw&KY zA2Ndp=9L#`HK!7OEBty*gvtf7S)iWDSUwA;khI!E-M=PLlW(511x{dpIf--GUvfWH z(x?}n$V&Abmd>VGps8nY=h?vIFY>OG8h9h?zINIQ95Wjz^~g62ImNa|1yfH@`080S zth2jtR5T1Txx*+r?&5ybzs*S~+*1?{I$;|QA1Mud$+gZJ2%nhDp2Hw4a%kJ{POrtB zX zG~LQ)%!h&G*H@jR?|dDU_slwIV;?U=SB_P?ynhyqI<`7Sm}dQ>{HJHOKw%Bz6kiW* z(0t-!7c$>Vy=n?=@bROwaq1%QSl@cD*L)v3n!Df8o*D-*CweC+>2cuRb~PJ{JuIGb zr|&*`-}MJ)#(x1C%3?sm7fE)Vtj+JNY~1bbF^iYSz!pw+FmEdLJMV+4W?iAj`IyC0 zxL0y;`w%)u8$jVSV;Ss`*4wV7UFTX z*;3kBX*zA7M*~lmN#TQ+?eO*GAQ9L4Or%q66=>kO>vRNeS`I8&-|sH5U8O|N)+^{c z9JB&hP+c>E?uZNG@&{ejB(HIHK!jbD2z?_Q#p=a1$-_T{*c>Xd6Xu*dO)+=es#WWpGm(Hh4aO_$TSt#YR7O*&BmB{7k zeN+6P>6F8bYhg)VhbOI*9+7VB{F26FS-f-!?5C;>*f zhBFd?mwodNa}U46m5DKC!n^$}BNCQwoodkgwB{=I?1n7ksa;V7c{eu>YOo%I_z|}r z08lsWzIwca5lci9~_9qTYms;TWDbiuGIY)*m zsv)@F8G`$|IA|w~W{NX*fuvkC{Y^}3Rzdw*E){Uu4pIDh5XCPZY)Tt&5^Fkpl0(t6 za!KD&cZ3tThBdA751^-h=u)oJT6zdOrAe3Q&Zy_DcSwsx|Cv^{WXyf^;bK3!dUZNn z!b(Vou*m;)u0A+$w{(K+$3uVm=l5r_r&)d8aqp4pZRes5xG4j`9aC?mxCD4w0G>y2&^}-`RhqgT zYTWPo;;*l;iHO+;LPZuUX@H-aH02~P?c6V&)k>ItPJL|8FYeZu#f8a+tN2bkq(y)s zADzV(_GvKeWf-=W58?&VoMN;;vD-JyZ zwtO>Cc{xy73skPhxkmuT2rGnM-#tb`W?K;WB?7x`7y9ZF+fT;!nREKfhF(AneKZI)J@KNGN z&g2+QI1bY(uY4h6^;#kc+6ls5#hT*vuB)v_Wul6zH-(MZJ{O#(Ei3n--32YR7pr@q zA@h8cvCf;QQS^JNd$4V@4Q4veJnj8)Luo)SJEg_q6u274<-weZm6n8Gl7m9mUn6I6 zO&)CahqEJ``Rvq!g&M!Xu(V9p~jUn1B68`sC6|7~Hu2KY@scp8eSj7Anu(${Ym^ego%|BZ9S`jXnbno2 zq&~*CxgH1wFD8B$6Um>+*t$gOE%S~FBb^mnk;Rll5bujFVQ$&*g&YYmzk-$@xJck` zpa5>!h~`tb3;|dnnbgtkf3S5WU^O=FzvL|8l#n7VmPCoRW2y7Zi6m6^vPPEd3CSKM z*|TSC$x`-EryS}$bFyTQEZHMV_Uzf?|C{4|-|zFif7kU~=Q2Id%)QS&_uO+&hl%$3 zDtV!rGqhYMnbzE;oF^Z5@-&*Bh{>{!2VbZ0H6xz_ntZ>-)@*wr9vwAUxJ{Ep5OhIe zkofWBLRF>10<6O&44q~*3l^LcdI%w*f!MnaVIV=>2P$!9vjrsL`d+qITfu&F#PJxk z>&WtZY-Yo&V)_SvRVcMQE(vhA&MXmM6*VWeD^VoU5N_isr5&_r<>n7I#6wtzZMjfXBipIG%S|67;=%=d83;+Q`(m_=#k0l)7TS| zadhGtNmbMOUli)gbIP+VXvGQ0!tgeUB>(Dtan_-WLV#90$rpgWi|t91<{!nVjRC}% zmY)LBlRC^7YTg|nl(g=}me7dP!0>|qJh9qD1#$k2lu)hY45xkW-m&7*md5H;Lqr@l zP@KaA`&)G65F5T*7njLHbv$UpU6Hb%w@6rqC{~PZfE>cGbMSb_%GzdyRQzCB<2P$= ztsV?&@VPk-D25xtMf@{9`)Rijwyi;ukhJ;`@uL~%;BmaV@LpW%5>DRGnDYQR^w}0c zw|l+tsiZBB)tpB(Cu~xXkd<-@Rpx{Xa8?)7hzmfZM*0;Er^-bGRV0O=%DAnA$ZV^- zg01^Zq_`IrO5VU$i5D?-*P_Zx_{Llv>{)U9A<40`(R`%Emk=!3*e(c;ienMvVOV9h zFmU`e;puh@=0ao8q?~bJov;r_Np&IDM70;+Iatr}0+(xQ4gnv&KIUBZ+n1r~^x0R_ z0`+S@(efgUB?o-<0N;7QS4*38S)wtP7>p40zY16zrS|q2uRkTcxOO+M7H0!u=AJ5o1DAk3quFV$^JcO#Sygf8Wif)x;etcZaN|A&VBLMecG*9VrRTW z8(ECq3DYz6BT2EuQgEXs*D;2b$$asYM=f=uXbl1l={G<;WQN}Ws#D8mdhAmtvv;+B zWnG}QH(|~lCiY}s-S+tSbj>GKssBxAe`lI}6W&uNnsXE0)76KK*f5r-F91YUvV#Q3)|DrOzpA11+J4yx&!6-EqGjV8bI)j3~^$WF_Z{#J)7A)If@o zQsBMS={&K{cqo*+O9&EYA4rf$t1$g2G@KpBifGwGp!r9KH1UyynlAO~tc$J^*V2YM zK87Q+1pfuJaW*vgF$g!9raZ=Xj~dwvxla3-tz{9iXoWJvpb=%@s|k);C_6Bfd&+1* zNlVIrNvE`Tx=~$2*&5MQg}D3^d_VWwd0pBbgb~8Ch?*8Yk=VO`_Uw@rbww$T)bqd$ z4>$FI6_#rrK@f+7M10fr(FmDv`Q}&AOWG4P-)*15c>RHaR`HB)I)10+&w;xZMQb&wPb~{@dzq;3!HO`ELC#`HWu23F2hY9*{4Ibs~tEj!HYXwm4PD3jG1z>swm#q0gYGHz^i0$+^E54>-pD}U$Mn3T~ zCr-;nZ#3nz&5;`>N+iG%09G^`zUDf4`6%#wiz+sut8jVuzSg>iZ)Ex(j~+lHFta2+dNTu`Sn5h%=HSrGJqjIa&Hhp`3D& zwb^lB8251wrlv$=DemoY8X=s%JB;)SO(#ESrLoirTH{znI?Z@BO{pTq5_att)%vK- zI2_;t#U9SurBIU7eAnrf!3Q?-5hM0d@|3Cr#nG%5dpx#moD z54)b^Ua<{X+~38Jj>{BC*Q(Jw_%}<)0pye{)Q=ZtFy@KKdP`@0?S{{A5KK@=`IPEv zhHm^E-;0MePlc09$B|hy-Aww_ohEi7{Z98Hp@w@m++e@Ca;?tdC$f35R_+DVJmQ{J zlxVBDR?CbuqoO%zJ3qFKSZ{(od6l>jr$NiirQaZM>T&EGbaJ$#Vh zmQQ0WK$PGAH93?|Q!IeN(}=#Td9A7}sOA`<5iPfn{ym|5_cSVXgf~+Y0R3JzaKd+e zafcKtuc(q{SzuGJq?Q!7b_X8F%e1>C?wOsFmrG-71HOsXpRl3#bi(IO{(_vQ*OsnP zF0Es#3GnKj6@S>BB--*g5jVw0AW7j_+tBe|3{n-px>7%J;uSv<{Bs$LqLFnl0PWUV zoPPF{ING=&BuQcUFS>_WN^MMMz3SNX+vHw)y*A!bn#YZ`U@RVXLr*I@~d;nIGSUHA?!cD$-KHH~sSGd+pV=pOn}ufGe) zw79-OAPQ_C>B@`yJUr&-veT1HJ#?da{5=lD=I&#u2e%zOlEr<%tw(ai$!42{Mb-%@ zLnAZ*4*k5oT~*9>wR? z1Pt;N)yyOKdn#(h(`L!Eg!gu*WwGF`Xi37)n2}A?)fP>C_jMD~Kg}RJgH|I^F_t%3 z6MIspt{-a^;e}g93T=V?AG)fIv;&dMox6Io$+f1kExQy#(3@zw;*Mm-ItOXzzl?ma z1E*vcAu;Q!^K#O3?xd_oG@>C0p8BA+XTu(8?x)PhAeFTQP0Gv-4M{!X$9yxYvD6KG z{^Sk|Id+ho_`fG~sPsU4Q8AJsik# zc!s1l#gUss(`SP`{AjEbj9s35)}ci--3h>G>-Ex^cv}0|*7Q+1Q`=^sZ!VhpMO*vO zTyK>t4rYeGTEyC3_{g?CuBGSP;%dStL+yl~+xGhb<6Qg)04(Hb3t0{$#QL%3$t4`7bmphtGufCIvm2};Aw*|pMy@^Oh*YPvTT1Q zdFYM!^(N%$qs8n5jc}0$m@?xn;^iz;RMgLL0o##UnV$O%#SuN+ zJ)2TV3$T6sTwk%)l1SjTJ8ZkYJ$Xc52j@PV; z&gfDPrZKDfH&h#`zX!M+VgNMKLz<_2zjeI0Xk{SVhy+bbLxLs`bgS7Viwq(j zpLj_~$f=_aq#5{B(Q(^*arO8kx+0jQAX@AR8c+1{BEzoT7Cx)ivMbclOByJ7d;Toj zM`OHzdd}v!Bl2LMgGHRSsU=qVp^)0_r5XN zR~I6Q=nA8Q;lPNfZdwNN}qt2YO$jsN7PmYVn3UjBdT4L zZ1B;c>@xLN0nTOXPIx^XTVK6y+9r()P3BFb+C+)8=XY`P?9<3BFH@nf0|zY0SIIBo zPO6#y4NVka*h@1%WsaytC+dOiK>DNi-I+LDf39ra0GWR}GeQqm!n&7%IDq>s%1 z=*)K}z0^l)tL+mY)fqQ82&sW8d;;W;ks;2*SpBR3A$t1Eo(*BbE#ho@`!3a9wTC ze~e#BFsSbZz>qok8!#$#LqETA{~LygZV;t8S2A_8dPt${N!_GT?!BDUY(sQY{q6-S zu5rL3AM#!!o0s;S1LV2!Za#I0NA`&<_e&ZN^?K^s9m2I>m<{QbF;6fZ5UAgxP46zn z>dMQ`O5aPYs=nG{5V=LedP4ty^U1Ln+%Tk;sICFJ|D+mmk{SMKc*+8Q_+T95q5qJr zycY;`Z|WPbXC~h2&1v@88C2*E!!)*rCu>l@rTz&`>Ww!%UA#!+r z8){}d0N&-Y9ogihvz@*wZ9hP2uSluiKp#5SNF6$4Dlw;#1EAH0X~iJF*$_krE{s_` zorP1B#{r*9ACden!-W&Az6q^q*g#-VzIfo_Ztc42M`c{ol+nb2Fu%?I!qbp0XGjIh z&jNSABL_p7G~Sy*wEqyP%7L6jCjE7LU94C_ky76cHRgf*!HZvoopmh8!ti2b8k7&h zTLZdZ7ANRC3;j<05WCQ%FzGn+%i4ua&w1=+U+dTLw4OAH4hfKk&_RQx%go0FTI!vq z{v?*Y7ZS-^%ipY-GUOlDh(pjL`EQVESUAkh9|BLf34iX1tv%4Bm*FTn*JrNRmx|^3 z9oEr0+g*8S=2hq}D($Pwj&|K2(m#x0N{}?ji zd^5G~%mblE&GC9MP)GRsoD-GLDvkS8(O=v0os3$v0Y`#khXX+$Gk>NgIZSWJsI?s- zZS49VWAz0{t;Ca`^>@sTJEXCab;P3YDPe)oOPE0;M*!qDAQLjQe`_8s8-dx;e)$VF zWxNH-pSwpusE&N9rQ9v{S4$3Ku*HA~(#0cp)vl}<_g@E~m z!q3tN?3aZ8jF3K5{DHf+e54fjUp(q@Rao7-y6$_IUE;PAJP->9%xFD)o0S?K@qhi7 zTv|s?Iechagg$ILHYlm>81SImUmX3NL>V~-Hq(4odv$?r7fpX{*%+z0G44347%Oe8 zsBz+<`09c!DiS_NSsKT2`1ns)V#eWZ(*a)|kY?#RR6I=@FHJQ@ur3l5*|T=Q;p4_Z zdYbBxT}sm+X-+a7IZ-^ zUFtsp^V12chyo<)t_t$K?k{1RCP06IhDCvue*i}-qcFees)>ZWwbO?s3?ZXw`9yq= z@a-hn%6r?j0@a(T_YK_7UOe>0z^?!ZH_jcsIJ3F9a9}vl+~WTxSL|er!|v86$2P^0 zXUCeWuTk4*u+nrvQ{7CZz#Iz8*m~+84FF^EQia+lY)JgpY=+2jG(OD!Tp%iDbWv45 z^HemY$|?U#P?|VJ`qJ2pPKuH06|Dkmi|%Lg*u~=`h1FD;3jZ0q{Zk>I$2*2;+R|wp zJTRS?i;m0Ujx47iXZ*ZN7llj|=Q*&~o*!nM3i!Bu@(J~KqON2b%=@ppH%X@pp==oq znI_Fs>^eJLuLmF((Ebf^}^2r)I2X=v$%)%_aiArVz6pNt)#OUOK%wk4YrlBFT z0dU3(7a{)h8o?v@CJqKw@V8_i(nL>_Bf3d8`MR;xKlXod&?d+76>CXIOY*vQP10Bw zjjJy*<{+{n3Cm?}DO*(~GPvXns5BbFXve438#v8lv#+6 z?a&F|SG_S|t$6>my;#jYS*W8ejF)0ZIze7W=B#O>k9ii)^i+``)w}$vKLZpV&+3beqe+S2bzi?j!qAA?ewN3pP{A`{-9{3vbzQ)nBbKs+$eX9BZhlJl`9RAS z0?2=GqhX6M;GbwDE|QKj&GRApfWf1%nE$#+>hu>Hj*B71L%Vs34HM$ntzF58$d@k$ z526Q$3K1n%Vh$CSK$3(j{RCM^p6-BUb-fi$S_0v$q0PZhmH#0spW+eN@U8mK8ix~i ztgN{hS;JdgQ2nxi<8nz@Tf|GRi&$MHN&U=TAA8M~c$DevH+>g=Hl;t4q+=CV`v-`h zcP?ffO(?_Jp5>7Fgqh_+lEnbg_=Qrh)LO3Kk&pn(%LIw8dW9j;HGQR2|6hcNT!pW0 zRO_$*wAP%BY587Ep^DX5E?+}Ag-$b&_!ynW`gdyx%9lb6Aeue2o|gfw6P_2~K#l&> zMXyUM+5N7G>^iMnjo#{7xsypwd1B9`0DViEvIeA?u+>s*iD^TmK5QydrP-`1D^>Rc7#oLqPD9sM8-ptkE^5oWmeV3E%LWGeMvC-sv|EpMZr zi~=XpKxJ8j9NnOo=fyg4^He3=Iy5!YCxU&Xo~_t$44>Osm88(_#u-S4+o=t->k=dCCLSZi!hBK{<2y z!O=$c+r9g=Uhe&j3LEg@pQz?+_=5wn8zG9rmzL{>8M%o2(`3X%o4%1-q2zsQy}A^X zkmpT;G|j2F39oJ2eS`G*a-3`o?$3s6%Qo?qS$}0$R)tn>#$>ySrljC4`TRk--G|%x zJa|*hX9q1v`CkaM!WKSL$Jc)^{`?-u;%G=Jr1|;15cX2m9A~@IQ-OcOOG|WLTOAeI z+$}nkJ55C=Qi+BXEjmJe5^ogbkKD?&tTgdr-jw(wD&t2sDs1;{$L7K11CeU`(of`Z zK>{;Tco+!GiOg+c<5i2;yw!HX;rsK*Wty@b(EdrB0`!20z2y#2vLfLZaWc1HFK(wX zOKr&xPLxAq)5y5b`$_-iEm${gMH+AG+4zb$Yp(?vvwk}AY7{%MXj6{*sG6BLjohG> zJ7KQR&QD|nO>w-*F-l!p^&8VI-NkMPk$>WO9K=6i3El-D`h8(O13ejY86K}{MlE;4 zY^VA5V4;ztn2RcieVf6}q#+grthyxj2f-dZ*NNlyFpc5oi*&{ zojvSmu{n+=x$Xf~XZEpRZ(81mhpuiWKq<2-BxuByxbS5YGaul@YJc91x+Sg$0Oa~Qy-05EYH@nC&A1pcmN!lAZ%Zra|_eiL(?j$?L@zyN3VSPQkDGhK5 zsQt>l&*qCnL1Q(*cI?i2tURD0yXCi#T%#2l&|X3#v+)`8f%Wx^XjwM6 z?CE$-x7_M9`{`ZcgNvzh(4B|$u1?)K4!hpPInb6W)bTJj8d_0HExPDfFo48)HDdAN zDKIukD~&cjOO20U&C##L3#k2NGS?c&&}Vare}G5rX}8x{s1 zxn?W{Pc-r~c}Pp(#{D;#MdUZ$122U)8;pQrV^in|@$0D)s3bm{&DEvxsWrs`Uk2P`VP7uOqD zXCpj6G+f#?Bb%Qaj&1ShJo^qG=wYdytiDgn^U&KMyKZFHX4vZx!JWv{USjS|W8z%+NN7c4MG&FpxBcYBl-BxM zCf^upj*D0om{O79<>h{}Ntn8p*s)&)N@gkacsb79*M}`#rE3~cs=G)N^%yku+hTGt zKbXwC=*Lb{$9y=n*|bZ(G(eGY#g~K@%UOBbD=6Wek`MnldhlxTy2E7Ei`z!z2~9eN zE*&!ZiZRdYlfXwZf{PiBqswHUu4HqcI-*g{b~vt*ejFeL(Z~~0KLk!QPhex<#ll>1 zy_rPpn7WF6qGczzp_(y^gx_sL&i4#LEs%_p=(&5clB{^36`Scwkhtqu0F*YZ@FP>7 z#HxB-@kOXJhBs|E|3n;iJcB$@OHu5!pa3GJqL!!NzO19dDQwO72Kutdgq33dS387; z6*JVGhe_2Af!6w+Vc!Vn4Yzgt;qQ&bd!hV2T5<|@nosuQe&l-lZB*!Xcn;9* zr^#m^#mBpT(w!YRmEES|88{q0A1=)vr+c2+zF&-btm|qVhwTBe!gP%bKaM~MzF~lF z80_t4SCTDhATINGh1BDWvp~SC#Gl-&NEJq`?W`X~D|u7N0^suSF!^=kDlVc7J_iEs zqn77k@Z^Ehgdi%MhX8%lw`P4W?iOnrnj+4FVvDT%iHGku_h}Mse{>!#IS*cZ>NrBU z95h=O?Ytj1SjAqzhc`E$6m*L>2pyK6!I8l93y|Z-d)KSZt-q-2b|-;ZsrYJaE5LWa zv(kfms60}@f9D)nCk8BzWH8S-a~4^MkX^;hZ?G`Ri=6Kbny}~2I^uLV9fviFdDFM7 zQgIGDLxfGu$zvLG32Z6Xrd&eMRk_F|MhHn7satB3NfZb8b>}?)ssYAa|HqYCH_s&r zubyldo*dSqf`IE~;CavPe7k{H>gBn~BJ+^^bQvUTTSE|w<6_vJohgu?ip${MbQ*aD ze|hqwDPfm;p#rUm{*hL^!WkM*pNoAC6_JfS-AHR%c@?ic_jhI|zn>O;T9^yYH24~Z z*}21tCb2T%)R4Un|Q`7vy3j!5c^o*~ZHmfhe1>??=5qEJO6 zbqDM9!U-CD3w-&VLST6tLbLVK7oi&!ZsX%oeRrr%90jQmTT1Y4)C8> z`r2oIaiGv|OCRJn#NLsnR{3?3+TE4bS1y^m&C~4rfGnRgE!9(M_^6G1*Mm#x?ne2O z4W~Z&o-LnKVoT)%?ygFp8^&{&g6KPk|j$9(Yt4vrf}_ zqEszX*HS3?y_y$=?q%D>v);>?!h~OTatNR1W9DqDQR0(*e|@^p`ID!Y;-Dta%?E=Q zmVz%Q$`I9t;!&N5)B#u1->BB+#6Cizm1L?~jVVnu` z29RFZsY#Et6SvWb$7sr%ez9HnwM`_bQ#uYjmOKV$0-UZ1XJ_pdJ$IaAfm+uxDe|tS zQ}K!Pi7)v+XtB;tI-qt{Qxk|gYVG)ed_N+*mHL7 z=pFI-rR8D-Q zg7=fYqc7{~(U@{Hot|4;XI?&^7)5NrIg;{nVBODHCA=EAQHZTkOJ78V*HRl~Ecbtn z*+a6q3hS9WpPV0hkZsi_z5b7wiEqKr$2cIcqqBs)@VSI?$7OFJU!AG)ok7eJ-(j%z z0aeM&CI`s)M-5biXyrSg{yF4{_xIb?Nz6<;y`{F`JzscooD+fbI|I%kA3^TlS54^Bb|?Z6FTlSA2!G^`P~>NoN7T-F!C@gDSs+xNnyx zAZ3^vV)Nv@PV`iBE=4LFw@%U=Fv)k>S3M3jR%)QK5g;*anH6FSp(NLD0QgD0hB@$**HZ* z+jU~N%`jnb#XRvU^{*;(GDZpLs_47tm~Y-+&og0QOfDNtldA&QU*nF7#fR6Dv?UID zEiJ1m(@Vnkd#lIMJrbE-VSIWMOUnEvUfa-7h@~-7+27{juBXwFDA3XlAp81p0wOj zc0w|z>th^U%c%<(2ULC#%@dZA)eV2Kd@8X*)0l3atmn)FK9@7qY>YO6WE^qCG39;{xbyZod~5hD)?FKvryr{_1`is#^KsF465w(JrKp_7If?rw(VHmAR-rX^K6% z3h7cu6}oh#_%84Z?g1&_Z&+`B@7q517;&fz!fa@vr?8n0zgq)P>{b^-m87eAt|H=B%;3oL1 zN7UoIP7z&++U^dHXs0v*5Z~8S_0*?c@~m;9o;p)o&_p)eSaQ0<$6Ryj+7t>nc~k;v zJFmLBvbq~Ct*U4$dxP=IoS@D>w324B`^KhoYcx|k81Eo$XnAvduz7VnF?nsw)Vqpx zx!N3OE>0h4WD5YY0Rn^3)KifTMDsgSZQ+7H)v`TUAWLmZ#Sk?uP zIi3Se+OkuFuLxbeJaKea;R+nK++3~_25%81#;@RIhViC_Q+29dQ<{>1ynL3b&2W{? z`r9pYb(5XO@D*<0%QEWk4!9T52zOayMOM>5w&&VLVPNl0`lmG69o@7{d!*V>uvVPg z`W%yM%iLw>|L!Ko%g{}%5(HbLx6voPG*Ocawb*oRx{|BaBfF{YInQ(+74z+pSya~A zAi0V*kld!7j*-F4+yIMwUOyfrOkbbNqM?XM}ymfoJfvrC$llWNc*>wbys{T ze8o1cnIt51w-y`7@L<4Uom-tWmQ6!Cf|&99hYL4fEG3Up8j4F#U5{5Cq=MqB+3;ZgRB)q_cT_^;GKG4GgY+W`x@3(I`~iuE2jKTVH<0A@-x) zW%h~#uqTWDu_tBS(W`xzZ1!W?N+RuNt1qKrJs@Gl!dG3>Q7crY0~#W_kk|vr`Lxay zcfM|{p3uq#w|Eryz=wywjb$^8UBr)sQ$72OeS_3wk}@wbx~*$4gZ?^-SA!@`ejMbJA<3>Eue^d(I{FfZu|(k-(( zl5fiT$fAwIX#Wtn0GD^A2(zuX3d&{9Y!r12#rF-4H6W{$lk-AShv7JJ3~!3M`o ziwy%BpSP=Wrnhs~|4{eLo=FRN)9QLUUESz@s>mfD#3E`t7}8mv`VR&#G;592kG|Qk zGxHkYP6Kf;$auTOXm-xMQfKpBrB9`0gE3mm_g@9S746w+svLsuMr^G`x;#!6y4H3? zTqlt?Eswe{mba=(PS@58R@&kr|A9#|47_ygzC+jQm5*xLq^nqQqz{9}Xf_OCop*27 zEj#a~H=&Wk(Mi{jsX}UaE#h;xCySsWZ|ZZh28ldMvOG*TGB|_8nYL>7V8>~vQusL&Jurpqb*0tIw-zOF=s`!ZjJS_iDdeBJFX+Wy zG-P?|hK=<>jR`o%R}wtX;AW^)z!PP;>r=gBgl1Efgsh{UE!F3#?P$=oOUh=!LgGY5 z^%#N3n*V5E*SA7KHu_cyp3-aLP?|iN+j?!;Xc-O%hFs`K!cSf#Z%~XACH}`k`u_?W zj04-I6+B@DFBIw%{+|&fNg4+dOr|;GFje*c@{kx)$#}f9uWEZ%^Jp_wufRHb6^$K_ z0gK$IaJCK`}#FdUrMwB_&nv?4QNd?#7($i;V4aY zXsP=!_>7N9^ic5#6()j*VX-dku=jmc4SiMpcq*BM5mu+K5SoqYMoNqqu=(1MNiy8s zWn58}=)W=I81l_KhgL@ar=m&Tw>!(YXe~bSufld|W2egad2O089V{wZ|AajLDHF}ok)S|} zr$hAhy}t^lPr0dQP{$cyk0*`6Pjkxy-2fQhzK8>0ah`k;#wCXv;8aZ$vZ+Tep?Jnf z5>3lz$ZRBUmcJ4EQN>JIpknO1DMF1a(L`Rj9;F>3W&)tx_C-R~r52=Jm%F-fn!}r% zdv{^WLIT7WnN8UVtz?$0jWJ3R3$tY>6xof^g=#-D$+{nII9jfVHAufQ79W}H`I_DR zc|Cp2OsDK}niwlXN`Tu1@ffY-e~p(dQN5w2C_ta9MG$Qc&@~$9N7~n4EGTb;0@9c{ z=&HFkWsVGo`L<22Phtb!vDM}4k*Qi32k+Q#?nH4TO^$~Lw;VIUZ(A(J!vmN_Z^gp{ zxLg05IB0*eczdv?8bwd$K|nsXLn5DXrqF&zTXL9I&cg^O!<7JVu9XpC+UTXEUa#G3 zyf!A`KQ4>^0vL=N4GWImxjd|0ocFKX`?PEUKI}sk3jy?1+)MWqoA4Qvw5nHBxe%6E zJH#P#@q}!TS?c=g@7;sInfVYIBhH;eZ^037h|5O&dVFXk=;PLqbHxW(0j*pJ9Z8Se z;CUC1GSOaLPaCsHhKSvRdlqE=J!5?*#VTAqP_h_vupdod@{a}ktTfhZhx&C5!ru4_TU0Ym4q`11ZN z!#YVQq#zorq%5W6A6w7N+}+u5ydxZG8% zTnDZB`=C3lg(qAQBMqPJ{Flp_blj`ZJv2Rb7qZ?`g7}+VBjGza4S^HH|q*I?G6Sm!tc>fw~ksx1+aBZ z*RU;G+l|~%);QXTTzZ&w$3uyBFQoX$K=TcZ>)2&zorf&f;YE3+=OI!=&NLr%psj9oC+k$7h})OQ?l zLvWyqbO=s@^Ect%T^{69rb8Wn&jyw0u=y{VmU=9s!8?J*sWrCjSK&U^zh03JwrZz= zwFNst_Aa81G^ako=EDut!Bp6VmtVSjig$uqiG{DK> zoLxZ0V}4x~QzWvdBQ{_W8nW8}cgpVn4{jGaagWUUe}GTk^9S(a9#9FZ=QwBsJ0RqUHMl-6);XQ{Ur#*1a2DF@;+02M$X+DO4_7a4x*hO7Rs< z+K;#HUQ5)BP^4wGO35cXY0iE~tUU@@{0q9mjDJzp_P`&2`5!O3rPV^Hh6_ER@Dmzo!{Tfm6rq$)tGrc-@F20}*a3J_>+}&V&ll0ef`o zQpSr)>X<8|kPI>RU(g$PurlvoJjluW1BH@20}AOnpzwTTzPRbOmbD#GOK_*Qq5*|S z5fVM0mWg=5U%!ZS+t^W1H4J0<+At?wRSqShlJ!S$G!J=;iaNh?kP;^H33*#WIfvVJyir#994pO)cL0n=VTg(llu z3ZrSv*?$a^a1LB4ss4<7Djr5O+oWtHjW~x67R1zI-YLtO5N#_=qdDi`O#R*q2?wiN z0Ud)=Wr%7UT=9b&SV86;VQrs{yz0<-81I8VONqY22_dC@RW_SeoJXf}i5-dEtYFWg znqY&>{{os6_q}wjPxMzEesz;grO6jyfW6Or5)=VC=B;P5G9Cy)rWsEJaBD^2)7)aV)2CPG$xG>EPW2+%gT++T##T9hEI&^~&wboX@P4pt|Y1kD2 z7jQ0^-27xr<|inGWi;^$OxBI1ota{useXbX6zO=?z|`QYSnKz{`%Mh_I#Jhv7F;#R zl;t%HRC~WKDKZzmWBV$^-BePHfljXJKuEMbn^L?PdxaszTzGTOIg;C(Ovszz?^MI6 z;s*HqyQ)U<4THR-+ypoza|VlD_(Q1uB7q&&7Tkn$qI8SAt6B2E%F{*Rq8>aA3#K?n z(7@oExw`;=Ue1FbDxDH(p=)|=h46Cl7dDf+-bRdKIJLcluulQPyoe;~=hHEF5JA$> z)oH zaJ?{|X5NzpC^p}p$L_6Yrhk8LD>7ar_hnBd6RP_l!|&aFnUiE?PaaCNE&WHL%SsL7 zWjp|;JzjTY+D?9iwQYb?ti=y7Ug@6Yq)vEdp5^G}#F;ui00_O@9oA-VIpH zLh`EVTX$+pCR6`114ARrFk;&1WY2f!>+6#rcFx>E#WI+y4^0P=YOkUZX(=l+@L2f- zgtVfLPcgq%Y)BE-)qcfRY73sqklki9q#ZwTY&2!#^Bq34cD~-g8PjQJFCO5oo3gIEqTJ#3jo#7wYI)?%}7%J;9P{2BVQPx z5MKbde03Yr^W1Kq-m@q3?V|UvfWcA{ENdJYoot;X+GI&){>wW{cFPr{%=4kyIZc}LF@10{L;gap)xcn zt%vs|9q0Inr+W0!kFGQUr2 z5^cddPN&h~`&rC%slIsq01`?|-Wxa|`GC22u)eNG>$Mj8W9A1v3fAx(Bfhm=6HmBd zF6O)M+$m0MVWMx>F`YQDn>sTZ`$0BNa?z{;hXl(%$f6bB+Q*AdgZGL9TBS0O>?8Q7 ztuY|;WMeCJPn!G@C>PicBKc&MZuy!p{YI^#!ayf&@Fy9n5#FIgKSP)o1=S@F7Q5-s zS|;kOY0hU*B}Xgy!gcp`_@eAB)0%4BUIeJksQ4A~+pb`=n3wieRnev^O7fL`1?!)+ zD`LLpHtHT!`3-LEL~ZdmZXgX>uC@HZ7aHQ*Yr^^!QQ{Q426{UhQVGbG<*CKi4lCKU zslJG^7gmA`TO8(!KK2f({iD3FR~`8ikl1L&pOAQCbJVQB{M&ifakhP?k-iZRmL|u@ z;hra_$Wx7*QNbAh38WFm@@d9(Xo;~L=bM}?n6$c1nCQ}-*;7dsIf6||b49^uJ1ck+ zPDaoWG%0(|8b<6+{8IV;4A+NTzJVm4E#N{v=9ImfbKn54dC$W-S4OnVZsc3nLtRYN zIO$jg1B`F7Sj_$Ett%eYoW*D>s>s3mM6IGK|NTxKCGr5&MTkUtkFtNTi7?5E>e7sy zSuKB_1fk->gn!|Nv>486t{(Dw^K{3PC2R{1)zWeaKsL>t=rO`1RroS?Nmg?zNYUii zzA>{~|4}fy(+YXONm5k&AAcmq(~I^x)OFew@^$bS48XH2j69)lnOs_1?9N77)TDW^TnFqMx}cKn>hhMx-{y9Rz2FV7r}u{&d2-zwh=Ret4(p&E$v|iX(Kb+?9ru)(B#UXb_ zh%=lWk-R9WArFw0-b`ovXwMq*9nCGGqSe#qw-U}QKgpJ?{sQUw9rEJ8NzpBG}t9lLs1)*X}WsLKh?;Y#lqLFf_P29aXoJq`b>E?C@ybW{I{+Qo0LoVLWs+{iWfS&;s#xV1 zE^`+kZ|$JbzFB-q;1Azmuc#x_mo;c5hO~S^DyY~%-q^T5eb7Meg3L*Ut$duK&s`fF zwayeD=#QX6V4^LEH1rFPU_07@h2Q%L><6i0{iUCnRzfZ9@xjq?tJoXmUiNFzePT_M z?B#!#OPL4&zTjD};llnmb~QE|leZ1;vF>kPkZLs6K|ao`eAi-?!zer5y5E8BPY&`e z&3#a&h=-w}GoD69+ch%*dqX_j%WPwA&2~O{CFZ#qA)P{O2)G`FZWgDvcVasxj$o~| z8I9za=|-O4ChA5SSQ9XW~z7n_}?5MvXN0 z-tEuKZQ4RD*D9RkeR&KvqB&$FDE(M=Mqn%bOZT-|U1<()n(5F|RXX@g-q*=I@+@%% zKRt)+AbCHE*{9(R)CXz0GXxu@x}5Ry(q(duh20AA9<_A=y=}64dOgY=>e>5n zb9H^1>>`gcowq%f-Kf-{Mu?&Xy8CtNfcRCDZ>5AbzR+g0kmD4C_>Hkup*&(;;L7zz zTkgtfl=3Dw+sM7GdR)rKtT9y53PY}H^+|l*s~(#kkdTLi^{pTP_KjZPve1fF_%M>% zx`OWduFD))FY4+AaPEG3Ej)cO zL417oJoXS{c~jVcDdO{5Q`nqa>ycMl$eR}K3t|0-PGm#Itie5jwn|W;q(wDxPpvqs zKF#vdG+I%~HUFRBqIVE*4k1tWauQd1rAa3wL;D46=H|_huAo+ zq@5gYAa+Q+@h7Y3`V4VsGQ|*w7QO#g72oF?BkMURmap^RGp->K2ERocYN`ixvnFmP z$5an#h7a&uQf(~LOwJH*O>akV`Lqu@edhTNiRr5Z-^3?E7>!ZM^Av^4nvllZy@bLZ z196j`Ab|A!Xp#Uk(dKQf?4Pd(XN_oVtFBeAD^Sgadht_mM?AP!QHo)C{#eZbB7R@I zl*JF+&75h8fT3f0xU@v@d9vdUM#(-iGLR2LDSRTI>tzg=n z0Ck)qI^g?}+kAyuw-@JXU7qXi(GoN%b7#7+p<@!5#rKsyuQH<5%P*U#<3Balw_V)W zU}*lH@WKX#CZyH=57epU5_G`JHGh^iIH((=!d3AxL}C~bKs z`KBsnBMW0y8w)Jih+Cc6&sN%XUF7qSKq4Pae6I~7o|U2cO6nLWKaH!}$^!vU_dAYc zU!DHqw=T9Qu2m8Q>PV?17}QN1-&9z9FI;s$B^@V63WMRB)S5ptt7;v7dYoT{!k?9f zL)Khs_}Y7eZ57om*LPyV%^+SIyc`q?sZ+p^Q_$?0Ua^A_Kood}NS!L?cE$=#X1 zg>84AhniWhZPa)AH_)7=VmHvGbVM_9>~&QlzZHuZZy9=1r1_>0`~1Zuqjx21MZ>xS zfd)y=!i*ImXd%ZM4Y)l7Lk#et^|!lIEX;rq;$y0bK?C%Smn{;XJf zYbD#PKIolGCB5J(m(lcI_)F=vEn@JzB4*NSE!#zHdqe0}e)J%g{muyScVpQW8rd6f zIlM_GXFA7|mv!ENc)2MIQW^^2On-JPzXsr-N~|qw|Ut7>LY(@ z8hE~?{%*i+@fIxz!5f#~ONCtn8VSz__SQ|HmZ9jnQTiEiqBN4dn{&g5(xgz#7_L>{ z2*>JeW0Pq~DAZ^#b?u7*_ry=kZn)B2{VBYm#!Xw;mzz?1^&U;*?IxP8Mg7&qw5*>z z8Vb4je9IP{#psKl3)bzX5lS+-kSF$m(Q7#UO`*77)^^x=&FL-eSb&?P{%G>Cp9$a``n>xk6j^h)M0uQOq}NIOwkXWTx7oY_HlFv?}+R zHe)!a-F3}v)s)M9m?k|GCqN2DV8P@^g$Q||#CO09&^{>wG-&-^D!$K9iZN#X`l&Q0 z0)0t0j36zt9LVR`E$kANj6{>9^Fv~5)mXST(_cSS8!}Rk#I~neag-b>Td%aiW4Jl) zPm{)C+U!34wnyIgaP>ec8HW+8)7Wv~Z2$^)Pc6Ae6!uSr$JBN_Mh-&LOf*@b>5AJ zZApT529Q-Q^Prz86XeknhqBoK-7*S)?f*!kZe>@YJN2%$-jhb~rr_a9CSAIpWIp&V zwxl^x_#mS9|26g{a5Zh;k_TFo+m88fqrD@z5e1ZT(gWK(G44-E_$&tAa*=fUT5cn4e<3~=7we1Kj0@GQHoF&pCb z1%%L@M!Y{7mUR%Gk;R8VpS4}@@<%qtv&xY!@Q}VT1laKad#`|rFs-6DYN+1`Z~jtN zK*cpGIIDBdHyMRD7swCbmKC7k9@c8h_kKzyKWci4aqm8Z+1ML)%B}yx>C5ikfGyQ> z*X|f*cK@Q4kz?g6pMn!s0*efz9`l~_-mqV59`P^}R)IPzbTE`1t@dQcXj#C0f_f-S zj>A*ZiHh+k^gYa(E#eA8DZ+zFhOo~Mg$r*p_X>`^j?Ty!6do_JKi1G7Kk#X^2est1|hy7z31zeb>Um5rw1I0=!4v zQpxPfc_=+{4EvVzT1VHjo>8G$2M?LZmHDzvpm{jd-iApy2=|gXBUmk;FGPRkRIv$H zhC>HA>#S_6x)oSET$v}=#3}26g@adEkS%SLgxq{7d4t_HXe?y*9}FOY6GzAo2 zHj06w#G;H#UiZvVMfiuo9vq1QzP67H+=HC9UO@xZ%7t?soLfWnVUL{}`qHumX%{uK zAMnaI5`-Q&cqcID=b>@JPN3os-2-G|SulFs;s;LC`8zdS)HgjZf#;plT^fl@`x&f! zW>7|^FV5ZtM5v$8OK2R|nH3ig5_@3vI4HU{I+7oC`LJy2@B1M~p%*Q(i0**qI3<&Z zcLu_N>#;b1SjFXxVkfplU6;IagoqitK`Jyp7bx7DT+lZ2Q!==2-3_oDJUfjYI|C#0 zkM_cJu5vfEe1C#!wucJ6!xN!x@@zDrD2Hy+AibDqRn~fZie_pWc87|xlWAL>LWK$3BBkq2cvZuIluSTM|_JctAnRkxz zk3KGQ!%fn+$ljtx+W{it33> z%{P$2#7R8HWgn!1JFC+d*^amSAcvANxX(5w00PSkJ&_Q|qpe1H5W^?nkjAh3W4lE7 zwb}TM(B+~dayTo2b zd4GNM1`4=80Kw^HGC;Dyu39jkZ-6!pR)v>(c1HoLz^#MX$~L!z7hj@Tdz^9<49G_~ z_?QM}YIl8OZ8l6p$2i^N8j#%twm&DqRBY}2=d&5G?zO?*i_Q22ALYvNJPj64C`Y-F zerGohI0?hfMoy%CAYoFlgmYmeU%KNd`DKG*etkwz(OgHlFdbo)9aLOql;LYAk z(5;b~GIVH^_z}CE2338>r;(jMvMaiW6HY^SOM=FbkY{0N*pw}-53V^4M;<@QLgkCz zDx)t4jYyrcf9uiIFQ7i<-X`ldT}SdgG6dNx&cJS^Y3?d=?(=O5smz)0`@1gn!8{8J58{@e)i8!b znwqm3wd!Xsdq4=Y@)V8X(%yYz1amV3qPapQUcq*$VCX@XiB!PB>dq!~_thS@9Xm{% zfs1L;o{kgAtV`9bNl+}SjLpsgEzYn0PE?LwL#UfSoCM`VkzE9&V-lWf3tPHe6+WJy zCC|0FitJChi|5vDYYnbM!KTY_oWD8A$vc4Z1WzFYN2mST68;QL1O~pp6(vyXaUoQX z7}dgB+N;T{My0V3gESq^C)Pb%Ve=tilspR0&(JWoyJ?(@9A8DT1zo!f`Wp1qwHkUk znXaUCIb$L80G9==tB}_ALqbf@R8qElfC%2;8GweB!ER)6u9;n%H&{g2I}?z-wZ53B zl$5bulRLrdt&~iV#5hlpjdd9$biF$mE}G1;pw^2Q+2poj47y~v2ZCq@XKBQ>Pfx5M z`ra|sY*2O+bvK&1WPXfbA33w3she? zhb|Yk<(Lci-eCdb;EOQ#`leJUp7D1sok)1kFURbqzs!!4U@HuT+2I6K`g#6FxBF`s zK*q%Z?dAL32gr1A^d*4xiqQ)pw4|+2d^Hiy!OJdzFLOAk<%rL|=<&-X(h9 zyB&H9x2CRIzq}XT>WUeG4{YR_+&Y_8I7|U5>Cn7GC~s*;G)2)tT!#aA7~r62E&O12 zuo>TX2%k8@Q*7ouSSo1uw-MU-ZV(i>g#b3Anp+fxmDdLQ4XAP)it_~xQ=C)RO41qu z1Xq(|MJoRn?w%1=O{(K9a^4FFd*uLW)wbDr+P zbQY6bm~<1(#|sk&=Ado+bI`B}p7NDGSILNt5kjoNT!D(>FEZWC{7%3}6PeiGLvdJo z88CPhT}?_06CeiQI5ZM_Uj{sDqa?h8xZSa#z!;7b-LCwp_kyngAARQE6F%_k1l2jK z;DoW}3P`{20{W{<(n;A^ z2TY=ej(F83b{Q_d)~Y93t^siIo`qn5V42DFw%~hVf~_GEV&_Jr69$-UWY=JCX?zR=_q4xB4}= z>G$YOiKyAEqdXA3A}eu90rWQM$_-)u@27;`+uej1+)|*i#A>4QbU`+*0~&Lb-qO{9 zm3ahYF3qMEdZ3YH>1Slubv8i}HAvp!L?#5bE(HD`9Up~$UmVR&eD+-UfZ5y7`P}#* zG&f)=J7!#ha0y4>2L5-?nUk5I6s_jM9%z7v=-y1j0HHQ1nBUvr?PyZ<*nHR>EJ9P*BVuv4y&VRl1yuE&6TYIr@VzV{CK-9IdV z{(AzI>m8NlrLv9WS-X+w4)%TmwQSveP;lEzyrY7@b=pw zzD(gW0QWUEdJaQa2F(;MPoF3V5$OVi@OTa)oHaa_$WM$xA-a^Z-9c@JL+BI_>)C%$ zmTps5-(D{q`7R^-ru&GGu=EA=RB&Y$s+)hAn2r5HreSYdG^4)@dNY3wxzlB__zb7e zqGRn+NNA^_BvB8^ZsV30|A7gd?n@0w@KsddFXWuxB)P zHw+UWXGCJxS1?3$$vR=)Ybz4f>?0QAcv>`Z@HDh?Wf57RQ%4MNB`snWj6@nuexxZi zKs?0RRZ=qjD>V~d|KB-k_8VZwu8X(WAybbd*!8~!q9$=+Z)rycGsmIV+uev!*8p(} zChtJB`{4PREZOv|1s@5)uaqYCcd#=~Y+aJ!_sGzeY=>sJ4%pV?}lnqsDw@NC8t z6k(YN!452HKskabT%%E8b!g92loQdP9G|mD%&9yKT4E7s3Hn^$vh|9Z2EL*b_Xlrp zvwnHJ)f{gA2iR!*J2WY^Fz)g45qy`;yLtCxK?n@?I;xbp{5ra|D;gajy!80W`)Bz< zkX4J1Fzqw<`=D`?HOYd=g|KZX{P>@!Z1?G>qH=2lK7D>MEd9hZ2hnDaTGsD4p%F+q zMp;L!(@f_T83M$*%5Q{u&}mgSA*lE+IvAJ$4+YuZL7&fhc*0t9!blL|3!t-p-fvTX zMXI~#Rn^uqRk>4O8zJ`XG6b2Me%CN$=GgcO$09Z?JhrV>jJTU z!f_zvQL1V|&7`#wlKON|L-F7bo6MCz+S|+xnl9gk!#=~>7ujW$z#Z+IS%;0j{FiA; zzG#4>oR*)Oe6*k=D9sCl@XNZ*&@y3GKcw=}NKmXkNeXauGf-r{+bUGGa4Vk{JYOuq zWwdDf02AS(=|SG$#cdv5AAEx|o@<9jXWHUp-~P+!t}XQFZ7GiY4t9rUa(`it&kba! zeo%OT-F^VUi?UZ`OiMMD@6@r+)WN|&fU&1zdmxJueT11H-UacxOq}%M7)!zL`UKv} zp&gkRpUwQcg2#o*OqKfAPeJH6OjMX(+pbC#W}#HuP+xr4fCT40xoAE1R)wM|TK2-i zx_o4_72MKsF)g|~ag?y}M6)6wb)l$^-P9OErecG0=H4+gtV6k_YRtKRmuk+d4FiX1 zBwb(BeY0H1l@c&TD%&#PH}TetMIlSk`FE$_c-2k=a6Gzui14USSH;1wMdEy1tic$o zS8uJi*1%sim?cv6iQ7<7(_Kfi&hx|_IGBMx`g9v9_*7(HvQzaWyKz4AAE?5WNf=Ne zQFYJJVXp00cyJ{^u_kf2_d6T20F+!cA%id_HAZ|*o+tU zyAL8|*sc@c<(wCb4xfsW^|SL4$Kyy^q~|nEXdkO4+n2kE#Ny&k%nIel*iHMtKv1I% z5d7ig?+r%A7|>OnTCb+*^nxiTSLj!xxG~v8BV8HZU|Q%>YNYk3W8KzF5qc~)BTATb zW)|A*z2TO{A5_c8t(qyn3V1Jn11>~d4)er33861judgm9Qd_j&vE}Q%g#n|xkXzW*5Q^f4??#^?J^L2DxgzAZp+zB#uh86W zmTXGIUUHbLG-OJ(lzVcd4-=;@?H_7$v0>UnHtqd82RIJ4Wc*Z_RTobQV4sBta)mYw z94poCznx))rFM*A`*m3!7v0C{Ap5+Ei*Lt-aWUPPuPU77AZ9Y0@0X-nA5G8_+fRFv zF^7wHV4iC*CNCe5;@CWguQ<#ZAlZ|(`XaL`nT<()c=07y=*++opKfYbk&f1pt8rzL z)&82m0w;`O{(q;wI$(eSsLnKMOSGy?YMoU>x-V@=_m$I{?kjpU5Niaaym$dAFLGK_ zURaEwY~CpgBUST{kOa09gsmiQOs%pqPH|^?nJWV)FC5z}1e(+dMWmDXOIYY27d_pP z({HBYkL_F7y|~4lxuX6g_%6xA`D6c7G&N&^i?gTSLSJvbVBJrvBNMFa@&7?VC=@u` z14Q^;g9jhk(w1yks*^FkPKWr`4=Kw%VY+YU$wbT!f&%rvi@mGVjq1P}nC$0%4y`=Y+vw*Qm@JY5=0kk)P z58V^m*EkEqB`NGpt7U}4H8X(PF)w#m1st%pUca>h5v)5Cs9orunpu#uEA9G$CODzU zp2_r5?vBf5f+8yk>Vt|aCs{+Do>{b_zZ0ai>?xib?!_l!quH$#mCm8PhE||HZ)@56 z4u@HY^D>8tvm5q@B;`^fzoJezFF+GeH@X+rR0~i6qz`BJe|;&qy|P6r#=DUYZlS$R znCFmTDeoaSuvw9DADhi(j3wuSXOTBS&FDuIcAv`_NLyYE6SVI0Z1d0rG6@II1-jZ7 z^+SW-MWK58jdagLi+;2l&hEPUN|x7gvEYGqeHdfLX6$?OeovdxdXDvBzyf@CQaSCU zrzxV}TG-1Ms{HY%CHQapLMJOL;)Q$K#_~(QZA9_7&=&}?A^)`O?e%^_-m%9-fdl3N z#hP*aJP^~RHbKJLjD4gwYXXYIQa@-Pv+5?lWc(muoVJQgioN}q(dsvkjt0M}6#DD9 zkz<5q9iFmBjjw`8wfI5rS0mQ28v-+A+aAq@5O)dwP^6}k&z}&Jkgr)s@|hVZ|r;{;}o`A1hs~2^%U3#>S$E=j}R{;auG9}IUO_=Ts}P^NJ=sN zvu5cJ*_akDh(BW%01Z+{RFGjxCc^fsgM`OiZ~z03lz$%I9$Nx1^&aIW%fp3BV6<7M zR?7;9jb+PU_PaO=2Lv+9ET(;IKv|P!fpnY#tIi``Y302?-I=I_jO;&I*lA&kV!E{# zlCg9th}>e_vJ_uGvDs0HaU_91bO?t5MiXU7IMJvYJ`K47SflT;?{*Y1nKH2=C(hKH~T&FYpm? zTLTMErOQTP)lh4B)2z#=uZ(?-PQcEdT=xvQ)W8;6x(tdcW7KuoVfXeyPS_hE!j!XIo;FgrkRdMzYR-u<)>=3kXO2R=>V=-4|Ll-qo?S-(=U_9x*M1` zOu*;>67=dhVzGJzkOTI25x_v1yBnKV+7a<;?+DyoM1Zig9b0DAZd+Ws&f)LqI@cHh ztY>QSRtuTe?d9coeI#=WRD;_lsJTH+PoC3Nie5~Lcl?5bHvv{NS05v1qceorg-6h8 zoWBW%aPKlF_IXYfBC})RYW3I_So=De z>^!GEp&l7#PDx+L#c!q6Jnk;%AF(FL{Pa^Y7N=}$RZzv-ptI)J=CWa2%Qm_~zBL>u zq~5bfrZE%YeGR)EI-Bp)K`6A<6W&ZYAT)Cp(G1+?OJ{sRJ!kE*1WRcLRH?Gt!e42y zLi>9^C9kku%%6he9RsV=4tzL*QdYBSHk1y^}7js!nHxV<|eKYn7^) zg^l816?a^6U3O{oD1JhfTw%af#xbye>y-GCpK|3EsXL`7yyDnBfTh-qb(-?k-Au*p z-ihePA-ond&eGv}I^v@qu5zu-OW;zX5QDr9=y^lo+P$B+t-PAInaomAw`@K6-XgK3 zGDA-w=@IX@!D+I-zP9|uhVhDxIAAZx>-Z^we7AS8r0IlQScxn50&qzh9QY>{k-d$H zV6ms{15B^Y+#;L2Oq)zQYeQi7v=8`yJil7zBQogzhPOaUv;9ys$k>p*cdJpcKcj`z;rio{B4NbUHJxzsASN4vJjIKAeS|vk^IL)4&>G0PVk`L z`{duD!YL`A8J__Hu}5TJkY5A@$+yA)7S7kLx$i^(Af zUtpHXj8<;PElp)+DoayeC-I-&6v`5XKo;I3p99Vxd1)f{nVV0B4gJ7A#Oi4?%KA=nF0(QXYt! z9d+8Vf4jvBH0ZFR0;llM@AlC}{P-4ca_Dp+$;V~{Mg-3u`UPIN0u%R7!259FB9o=8 zJQ&;M!q5g*zlq8|Ma1O9dv**qy9``4t>UF1rH4G94G@L8FIVM#yH>JW~X& z-l|Z?Bp-Nod{b9>fMM6c?=_p*4P0eDovj{q96@&)hy!l93RM*1MA#u}f#IN2{9#%cWY8G>WB!;HrAqf@x2I^KCcU@B2DjY$2eE4kKyK{D2A&hv z_GiSm`z7M$98LM$6(fb{K0Xk$!GNWT^w&nQL|;c-cy*ZkTe2Ivg)MF~3cJuWL%GtS zNPgm0E%aNP5uoAVY9Txc9DuvnQtd{YQhh9aJeBLRVTqtLwo`U*Y*Ylyo2uu`H#nVe zyz*={yAj71flyeDzs%mkqzHt`(P;-eE$bBNw^$^7vGfj5@T|^yS;$5;QZ&^9WYz8t z)CzQXBU7YG(3p2`$N(I9hpDjoD^1A>!oVJjHgkUU5ZFJ@Kj%CPvCMrVD%On}z<79Yk=`EQQ`Qdp(z_KAypU z?P>v0dCN*c{#3BnL%_`c>19RJ#yZ8MiR)P>eC#2x&Red=T9>Gy;_t7?6&(KvhE~b^ zJ^jYir1W!Y0cZr4KK=(ZY!hRMlO8h<%&*x!M;XO_C`WD}7Fe*YXFHS@)NXI+mMLUx zt`!EwXp7Tv!V_Su1FDvd$ymUTo6$pYw~Q`bkc4C98MvHV*}8Q7YU&~}lJD?e%_r^9 z19$c4rvUoAot;QK6v_{Lyc0ZB%bqf0l|fp{U<%t-L(F6qSCTZt2^Q7DGN|0fkzvQV ztD;wvUlVt1^bCp$j7PEF0}B+|jr)i_4tNI3%kz>SLV6q?kmIGE0KffI8qx5FP*o^b*EcrQam4GykkjFla6d?jNl%?xNe zDA;VP@F*n3&H(3Ef-v|Vnc`?We=q-RO9cBFv#(*8)22BW?7RqCdppE_4UT>dwW8y8 zSnc29VtMt}5b(WGe?!-jzmm8WnoWN|Gock4*SAcwvb15P`JgRHQGz1zkzFHpdk;X{ z%rzt%Kd<3~7=3aZ2fv3grIEKBzfC&MFUpBv19AR)7}M`*l&t;CSNw?|yFf_TDrmTI z?=G3eS!dGUg@vd*zE#jLAytzdeqIIXn^%%EIJ@fa3Jm`fFkDy-6YHgihJ5ZOGcm;L zIMU~$x67;@2NP8@8S%t5 z(3^BY=^?A<6E;|y-FJeRb-Hzcc*YPH)}h=@(Wh=NfqRrXm=^z}b^8r}(Ax74B{DN% z96njk#Hx>4bY2+5u^#~;Y4-QogV=j9!h~fV?Z;y81{m<>6CJWW?Ids5;|AXrM>a4n zc6#j{WX?F9A6gQ@2KmsL+`(GOp9bEf7d=0Bg>*It6~ zAlwuyB*u5M&%u?SLDwC|-d|vExN295qV(lelF1c+p=$Rp^x&WiSdNcC1T&-Zq4MBI zD5~0eq-tTrLl^8fMR=Z;c;? z(r`)(;C!NKj;zhxH|&&d*NHbSZu#FhzxdARD@(s+X^YMShRXMJ-hiIOt4kI#{jPmb z^Z~%f#;=kLmuiz9a{p)R+59hrt%@&{h*m1w7n3y77KJo9P}u{Z!hut3Z9js{(G3m# zjMDya;Y2w>C*1ehhhd^DF|>>A_1LjK^7l)-)9Xo)?OJF`&ln*B$%_QrBEX{yd}!pl zv1V^%U0hE?f;CKXuv7&`WcIsRt(_czMz^KMerv&y=m$+bGU&m-E;OMbuun8}AbV6= zNZJc+;XZCrk^Ef;x6Z?Le+aDy6H~`Iw91 zdIuFaWC&;jD9_Y=CFAOk@?U!&ASGQX3%kRi)E;oPNo`HaLQ~jN`EJn~nl|pndCQKI z$D-w!KvU_nuO70c_OIA&Nw+|)RJM_fRlbAm+DiUD663{YUcuCaWf=^6ZrT1;VP&SPqEtkXg z=D1J-wU)0RCNmvU!Ky_Ul0_I|B>c?=#@?Dx6lv30j`|phLEX2*DUF*HNZ0Wj(_JF_Ym%*|&-7DC0i;6%~HPTu>=k>{z5ueG&(K>=Ij_>df4pUm3?N)^PKTDQH3-2iQ_d8DfaG?%>|D5|o z+>Yo7SFw@qKl%^Ql^8N1zl<`xQ&%EN^SkKF(_a{hcjs(DRoJ_;#8ADeFdN?Ihjo@* zk={=zktKJZ#4qVzp&S6#`2r#-}g4MIn=h8;9laT=~(+4@syQ#*We^$#o_uNBXW3Mhy z>o2Mahjo(}avcmLZ2A&DgKQ@ADf>3YwZo1$OHS#Hhco#EvS}AacE~ z@F+mnNaA9*;8cNSY4e72Q^!p~z4}5Hx7Mk*25k5oOKQWr0hn}an-wo4x z*?^;s{vj*?L@nem2`~o6&Uu_AJS%=Ev^lRY4#M%qk~d7!gC<#0K?VCAM|KAU%1el> za@-ky@MupKW3wIrNk@h5#i9KPlJ3i~cYH~oWQ7A1Lt)vQ(VCZ$dI3UVh$r6U?Rm=K)yiXv%s|ob9{PZbVUB*N*G$xGHb)n?fhn_mXXH4dE=!L%0 zqVEQdhQ3aJZ0nF-phrD~qD_F-|AVmIO(n2wydN4gNaw>A!NIkwJy`u_P**uIM;70d z$n(3#u+dzKndJW8*No_15-^q4G+kGG2san!|v8%acxN;vHZ7vzhSPmRQytZ}{ zTyUj1prKlmPn=>q!c~=bA7EgQ-Og;9`6_a-XBR*;g%&kkonU2e=9_MGeG&xmXz3$? zfN{=EY{skmWG*)A3%HwY&X=k8oK1dP6G}d5QQY0(>17m{mjg5DTSQ7lDuT|H_tITI zrlq+r4n);Bp)YW4Mf^0!X9H3d@~VDtOrH7^Wk1NuWRY7_EgKKn!Y>zp$?2b2CFi4El&(yo@P zSWe3JLN9UT0Ewx3Ma4aG6sHXMyJT?*mXb_mh!8x^T7sojM^gBb9wUe%Ru{shHd;#( zl?!pajpTs3WLYEWh3#x%K)2@)Wd+J}$;BrDWCf121;q+U(CIJ#-qjER+j0i{6xr=obmRK#qZU=?I3#_K;z`Rs#a%AikrF<%vi3sp)l_sgcE7zp zJ|+X9aJEb(19i25LWMHWc+-^+Sx(I#hC;9r3xc~JT>TcxCy*}Pr+_^b&;D*l$q{Et@?p5e1!`AZF_O0}Z&qY~ zP@+fNLjeV^TXRTFvkJUe&~*hAbk>-N^=IqJ)kV#$2aa|H`PsK{qTiiJ8AB<^LoU?{YE?GaYtd+wB za%qeC=&#VpL%)MrIB{mxmAblCVK=x>z zKR@(}4q1*9#zU?5$7(D!7eBXD<*gB<))^0dg~yhsdwnuZzZEeA8DZZEf5(L@n?U8X z*!QduVFgZL_G;ob+~_4SR&VR#D!0I0CQ6prIpupfHhi)X&79WpX>IL++J>O8Jq9Rs z|Iqr(;@1o~;PZ6wwK#Q!X|EIoge0B_cwaSEwp(2>Q|P@*+j=&ZPLeFM*mHCdJ0+B= zKM!lASeq=kf3l*x3##_1VO_-c5K~Gri6pB9a7~#6683TFMbdjzXQ3LmOaeS_)#6=Lh!RMK5M-ZG~5*YfY$*`q?XrmbGtZvm%WS=>~y zdhRT>_rVe*kz_kbBoZx*=%@87)k7uG>V@#kW+pIq@eJx~jIDa4gvyUA^@l*|Rns zSY?|xBl0iozKoLV!?k@5&r(YykF=8LK;SD;@eO$S4x<6^)w`_}`5EGni-w?8Y)yxA z)G@ZeLPOhz&oWHDDd%S;#gQ+ptRwpuFBu)NW5)Cd;@|ElvtiUQwWMVzKVa%X;nB!c z#t7D>{xSYQR2OF1l#&?~SF~1al$A9dKB0?HKhGWAuB}F{Y_?UX^75o|60me4)4a@t zl-f=Mwj~OQB;8ped7yg>EdPW7sH(YrpPW)PKxz>Cj zThj^4EtGYJ;2SH*S2m&Z-|X92|2HV-c4?=a^7b8Hc`F88ebS6M9UTGGx`>Jte-yuf zx;TEo$aH+k`5;Z0}FZPhW!X1-|g8^db0u16)^Y8B>BY`x3GTuNlR zur)n3f7t@l>o4-)Im_5+JFv@@wPdiS1$1dI!{%|TYtVH(17tkp1QcVea$&W5X(vUT=<%Uta6H_-$~Jssx%o!=PkO+Hs{ zM-x~-g*VleO;K3W%REboQA}fWukkVDz?LX9v}pupgkytA$bBg>W-Xk&<#%%Kqm*-_ zbr0AuCm-3_=F1edOBq`Z>O{9+m@mnS*7dWR$Auz*UGvSH*g>v zcST{xX1iad8naOF7+`o6NY6$@~sBL#3zR47!Wzo&}Q6%Nbz=8^-+2av=I^ z;olldS9{Q*-%UxtU=6tyv>zR2Yt-Iy_CY@(tTU_I%rYM4G~Tq0tk}n(9>a7ffDQKW zcBCYeNkE7rncyTkON>@hXyYVFPt{66iDHBiM?3pqGNbqwQ%?!}9k#+lLkIXfpgn`S zF+JTP`2g0=GnCFQvoP50b09}ISe;nMW_Z4(+OkRg{KsrV2cN_$|TUd#HuxEJv~G)o^%dL3QvL?^mUX- z7+n+~HW}PNL~yWsv;6IiVzr&#OjoyN69(H-O15AyOFy4-N|jJEfGJAO+`n+{18Ac^#;?)BM=#X@>4xw1ARkjGjm6$z)Ky3QI+#` zGjwIXP82}TFp?8XHAEN%G3o{P#GIL%$h#&Vx4Z@;Qfl1lY`W!*n(l< z^7~O!P~X@+jEuD#{x=g*!~bSNgt2gh2VJyfCTW)4keu7Q9)+^>NImU5A(3$q#*^3) z^ZA8r*+^UJ09!ZGoVL1jLw9+`M0MJ&^|~z9W|W40)qD#7fiWj9C(jV>vk@>8pe;8H z@IR=E%SdC)*0+xujGfAd=6 zrR>qf9uWAyaBae{Wn zsUWrHQcK-AHrqc`nQ+80-zqy$VdObO?UQm3;@@^qd<$_X9)r?HfYQU^dG_Kj!>}E5 zm?6ziGJ&k`*vkJXWd6oBA>eO*MQlsQwNw64#8fW;H*KMlNP>Xo4kt0AibKq6gTg-W z)ENhIHBZlYvKHetbkLq9+NMiN$^E;Qx(7_@?|8n02BukEVn z{viRC^p)kAd=Z0y2dsV^hD7lhRuxMPF^i3UWP^U1ok1zjTBBWT-~@B!$SuoMv!{hI z<1X3@8Ii7PNpu46G!4c&?GgB*^4H4Wg+#-%^;(;POA05~KI;8!_JmN{#MD%MQg@2q zvBO9(W^Dr5{|j__vK|xvF7YZRvUIAiHOamkgN_VOSH-hYlPc+hAR`SjE(aN-*svf= zxlP70ecj~|hKFoYkcReiaY1()oJ607OVJIsDoBvl?`9879!&4MyqrH`)QYM4ASYAV zy2+aV$yUk~EdN&>#WGXP|4W7UXlgrp2{I#dfyrAVkE`~uvT3_yyI!p{tY9;youjVm z!h*+B|C5whG4%lbsog0*{6Sy2`mpY zD^>>c-Y=_E3x~HOI+hOo-?C+g{x^esH`{}5{PH?q-O!udaR0=FvrL$t&IZVv|I4go zb8IPy&~t`SpV_E6=5)I;(+we=8ZlcPx(S=uj5!+m;-br{=C3~+aCoU|3tKxUl-{d6 z>pWqFMi;(Cr5?hDg@^uM0TML#Z$Rqiswv8zW#)&{OU=5G0rhjyZDfyVwqSlJwTkVu zAdR+={6rJ8h7q%QHKaRRvcQ~Lz*aACqTaC<3;#DP{KEeN%hpA+<*#SYM`!)|lJ{)H zBK9vwGmX^H;pusfBLg3xZZDr{x3R&I8s)VHK)hyisQW_#*?gi6ZD)dTN+Atu^i9$cy<^i_X|WzbiT`0 zQ}WD`dnol?G+!de@2Xu+n^$y4q!&- zifLGkU*f*ww%b=e#xVq?jg4WvSl{SK>Kj`eeU4JG39J6^z>ALg3p}00Y7@$?bLW+L zi!(h$#(}UDHas4RMnLc@F#icg@1K!mdxr?*mcpW`Y~UIVy(h$lacyTo_TeZ5sb!5h z9cI##xMwv(5$o0b1h#CAw>&OwE+1Oif$U{%Vl~Q7iG^BPlKw}utn+eZz+n=b$STyAmkFR!T*_2ox%7U$q#sAYbD&qcDOU17EBZ zt5W+cLFVO~7&q2yU8VB+hIo~GKr^C`2u1O!i-4DE;6+S>>wZ^`;ub(u+NLEV$j%Tm zX1jxuB(Q<&Egh#^>!ohpa)~ayLIq!mKdp6Q@~nfm#htCV^URAp!5?b3gm?aEMpm=g z>qF@#Yk#Wp__loMn?(0MtW7*ie{t)^-)_Cr-Lh*h63!OK|8KJs18Cxgztv~A5dvt9 zi7~^++wv3I-g7_5W^ZEYg?S48VQyR1f#we6CF{HSe=lFN`EU5d{Oz!%9esQLdWOC` z8_heM3RRWg7M9MBzCvbidCO$vu1D3n+AW7E`LEhL+TbmAd5-KsHvE6;N|Ysi+uyP< zNlhuG;oyP%aSbn#H-mDtGmJw20kT*vIOt>muILBiUVLoMeX?18o+)b>i&EIA?Rt9m ztDA%y+ZgS)izi8}7uM6kK?P_=;d)|pvyq@?=^f@&AGZ6B$p6V+-H!i;g~!e=R0JEm zlcnv=tBBQ?eCEW?7?jG&cIoNdBQ>NjG7#y%dIP7gYcR%ltX-IjDqR}Hge=O})mLy>Bs&TID%ik_ZU zMnYuwNMp0sLOa$s)m-kq<2y-Z zfi}X5BmR7^Hqp$MiT!|qT>zpEeEYT2M*vXtZE$>%;2} zaT#6RmGOTW;U7gW=QF1cRxrB;ACfcCwH6oR*(jzzBXNvCMN__FgE{7vE{9 zC^Ftd7Tk%;{lwPn3#H$+n{sltO|ky=oH*A@Z1Da{I$`c@_nQmiU88Qg^BFq7jN6nv ztkg%?^3qaO$tp9Ua(;83@Jo8CuMK>I-mtNmdiu}}6ZP&^*(BQJBfpdN&C<|g_NhrD zr)o0q**AUzo01hu`!uT|bJ;1x(76dShc!JIN?ZHr4I4Lm87}8ECoG$A5Vnr7!*v0U zOC8$v?4oYR7Qj2xzu)0oe3_{7(H$eOTR5bl;})ke?5HjL@%Guol#PO!n--W1vuPmQ zvcQP2C5N8N8dr}ILfI3Cz3CMehslf4z0}93XULhQk3dy2Wr^XteuE+Sj2jxtW*^bh zz0Q>DzZN3ClZn)QC>xQjp`XO$IGye3q23p}S2vt3&i0m1==I9*w9J@PvZgs2`q_i2 z%z?fum_xn;NDUhdGuQQMGQGFXuv~YS++quIEU5-;S&pqdc4-Zt*zXkCs*@e{kiFr~wsZLx-)?Aq?8l^%K ztp}UP($#=1h^-|tk~#0(=EUvlqb~d=$;Yg()|xVB=V`tB?7DhbC)ea_m7dP(N9UCA zeGb@EAsF>0ooLKnFlNB_p~EgS{wJ<7P42EClJ)Ex?Gt(eJ&^QxmqXx*hUhAEO)1J! zSDinDqVpPCDW*1?rr38P%g~+;Jf@+`--nTQg*k*?BO_PY>|-qb#4ShjBjXXN>-QZ>Xg*0Z1xnWRRm>v(8Z`k~T9PDFjKSq~u9DHa<**5Ko zZM5)=ao5?gNhdW*(jeFIjckH8d2^Vd<2SLbw+^Hb+kIc0LyfvB}TVFKX08R{n$FahOX)BNyhCC=54B_!co@O zprKn&vPY+NkN6M0wiA0c1!g9$KfwF!X-OupKfr9$)fk{DGf#bvOrBeUKJ9O!YRbxp zAn%+T#lKzUhrY2TWEhpjS_lhdmBz2#wYnr>JSFci8p6w28Ah?{s`E z-`?4rVRaFw+$m}$n^%PCbYZJ|YGfjxAn`}5bbhCS)G=_`?H@JjyPmhShz&c#Qde|T zu{qU5Wsyb-%ZJ%XMzLMbo}{-0jYl7PcM~RGU&{<&YtGts-x{e=S1)SM5BPSKId`ZV zFX~*Z6U0&2;F8{OeWg%m@zKzaWzMBh(QL&z4ZUyTW2d7hf07=(*}T=P-Fb8R^~E@H z+hm%mw6r_a`+ny&&7%g?8hju45szCfRg@ch;QTCF*JQN8Z^U=QqN&wrA8T*=47V+_F$&+$Ue7}b5&uEbKlZps_J_*5RVmGvv}maFRu`0(ZD`O|DhiAMSBsWeYf z72}ZHWeoZ_W+_-l4A}YcJg|^Fu^#dUdFR8k-F|<@?Rg)RcdClt&01UurMKf&_Pg;` z`$@;tsE;lQfTiqpgGzr$DR0*6hNk(qr~~dDHnkHhS`Fu4bZ47iUCOq&d0aLx_!)W4 zmfT!GEo42*hSBqVOx4q^oe&kgl)ulWl<8@o=UoK%BxCYsW;&C>2H(=q?UPyNQszs3 z_cSd(hb_3JQ8wv!E%$zeKC5)sCDfu)Y`bp)w!48*dpL?l?Fwwi!ZW8!y=t6wFJv-5 zntW#MZoj3}I*U7C8OzEKlM^yiVN0(Df&;6(%Tmd@3wJkDbkzCD28ZDT_#nSoWD6U7 zPeX5-o1sdjZP1T5yNDHAaF3<;Oug@Zf1ah`Y;tR|N9T9niITrIuSGLL>;xBfONFIu zZt`J5*n*0EGHL6j?*44xgUa7}nf@=m_&zkJho*KDhBVZW@>cK_C(-rAKq!`S z55DS{`xi!%Hj;k)3)c7PIcl@cwCV;W`{jAfZ7*B%Yyn;R;IP5Qvy0HJtwA-M4STMk zU*eUo|)WMJG zFmaIDp}2$kEF1MIRC&|viD71hrErimX5?SIfx+lpi6qxSBAKK6_xMyizQA?pynV;# zI>)*%Vl7^q(}rbtkbAh2kN%Qm#VjWjI`H-e>^RG6So-xy zIa4ekeo%!8X{3vI12XupiDL>pyw&%2SgISbvUh3JST^HbrIKTu1bJ-&asTnj&|K3E zB+1oDBwHcpxaNzkpW1)GT^5gZM)9WV{N=rLdszOxhJJTG+R!pThj-gpMCP&d2Mzsk zVLr3W?*ntO^#zj627U-t-j#Mxe0m<7_d+)vnTIZcCQdY%`~)pzrMz-j*%Xv0Qphv1 zVT^81Aw4mTulqEA7=_<+?TO-wV`xPKqDb$ z>KNwA&>V7s&43x-`AXqRE=$7R2l5Yf7M~AO#xvSXLTR3qkmEg+e;MY-8ed()4*wd` zG`p8}+SuaUKw&nTSrA4+k+AjgWOvCcSA9yaOno#i zmQus0!PwM@V(C_~pzK<&9GIW?Z5_HcKbP;Du>-0J}vxw^H$;BQSSZ@Sqh3t?;hPE^!U zAfK>rGisNtcA2lv7}qqTEad^M-jHl%Z{{*KrKw2j5l*0iBF=T-!;_nlHO*6qhO3|{ zu0IJsc0;yzfC_Z%=Qg(2qE z_k)ac7oZ*5=N+G+wK$;_=xEsXW6T5_2jNuDOMDWxGodQ!22r`>_8DWrvcFVV!CABx z`TZl;;cQdNoc{d5LDvfsY_Q;p3ov!+W>xc)(9-zd+ zJUuYc6_|Jj&!A^6%!rF``4$5>V$CsaDJZD!E||v`r$~hKK?j(<*vpL4$TKE=M^1a~ zg+6$T8HMQ|kZ`B{Gq7W2dq5~AEtS#byeC(j_p2`8?Dl|ATU^$jVwEfG-s)F-Nyz52 zKS`0#1i&Ow#6uyGjCE=TY-|8F#Bf}B)j`&dH^pkiO;tWrxpaI_$-q=aSI z&H|Qu`b5KT>N!ftiEJi}#C{f(p6)?Q)fasf!o`@)Dlcr&k+SX1+z>0q95~Z11ju^l zi77)IA7C_pVkz94JRbG;zekF2SVypyx_@ACQY=0&-;uJUa&QGKB%f+#skUvoO?M5` zmf#GDIM5Q_U*3N?+P%#honIVHvT(K~c-+(t#ya}-2Zh@L2lc}x(5#m92g(BhrRcn9 zpsE3J-oSG<=f&)7Si)x}{Uql(Un_uv_L)+PzO0rCu@g3uemJ2M5bB95I)Opm^kP+x z-Bua)KJL%2z)_vyHw;(O8GMRfb0q@Je$ovs9v4I2amp?flm`hGt5E#F_JU&9DzXv# z+JOC?-=!r}RkYB01SNdon69GziQ@h%r{fY^Q2i8UF0<_UbFzBz0-nKM-6)OnbLVb( z*^h%1Z~aqH=5AiV}?hiP&M`Xp^ir3LFqic4EF8u&pba#|$Z7 z#cz0IDzxGPyNfYkBRp0c_h&2l)i|LiXt;yk zSbgMmN1@)+m-&GUdIH}2&H4z=mcGdM^Z}4d)(fUY9}>;C__xaZdVvf>yv8w8CRUQF z0MiO;P)WXF(j(24}IbSteSU6nr&_`e4Hi*|cC5<9-%9jd4~ zmx|tC3p-%Lp~*}%^`-)i_FPZKVlO)o>qz6(j8X5l{O*$WLKs(NM_Egi$E$)>V=fLf zoNHssD=vsuXQhK81)S8%Nn9E9|J(A6PnoD&cWN!{`LUjvj2Q#Yfu?IGg zB{;zWL}Wy)8zV2s|k5SruKK2)geQ-^Yt!UelfI!gIR za)b5?XalhFf=VM@`_F?W@kl7?W_$I6H$TaiQ^%P!?CT0EN85M_4ojR-XUd5r;S^WE zYW9Lw!n^zh#1Ls?c!W*e;H`XVSLWNY8{~N3iR2Luc7wORIgUdMb~5N(=`Jx}xKVGV z@?Yu~Wb4uOgq^rR z4J0ZWe{vt>VuTD=s>vZv<{<{#$*t$|QtzgM>(xVyfus9@UC?dH$05ygJ@a(<96`WL zfB5v4*E#(bnLBEI^fvLr3H_;1rZm$2_Zkhxkq41luGr?{4OP$V zN6d82%SR-&XY`{JjhgQ#1;_W1y*PFV(4cVk5b&(hn2&jiw|0t6SI?t{QII8v$3k>S z%#}o^{?3v?VD}?Im)7b2NH&{6P0sLSA6Ew}NM${$rwBG&_hFPVMIU(YCgh&>KqrDW z@+sJBIIw@$LoO`6aGLbYd#u`l`QgC+**W74vM*c7`a!A0AJZeiA~zpB#5{f4o*ZbO zO5R}Q2vAqO|6+9GdJ>aKPZRdwvJvoMM$J0rX6!8#eqjw+$=Qq)Rnz{m9nZ?2sa|!p zMIW)>XdoGv*GDMs5`bpJW%8$R$!J(COqQ3o(cD%2Xh5K@Cl2$2#Uir~F`4C^$*8jJ zQ0?%3@K*Vg2()|72xflxL?H_YjseDKp8%)AM2*5LTBZKU#f}k!b?Ay`Xh3lzA$4yC z8H8*6DRa4HAxBb&rvW9OnWS;PBbS7!U6;BY8$lG0A1xsNWDr8RZ0=681&3dO~3CA?2CsK z=^(;Jr%Ygb2AD$}JRQ95GTmnuqbX}534{4blsAR3EQsn!>9J!FB}gTg@P{C(D;*ts zi~M?+L^Su#5>sq58EUhU3FF8Cd_pw|n@#~P((bht2Dj0Ys5&#I8LpTDNDS_(V?4$+ zVmiOgA&ar!RFHbF-Ugl8yq=%2eHTf@8RAsOq;NFzKsxhkBN8yK6{nUDe8G&d%0d0M zFC%5xYZ|pc_MtYwkj?Sa#DqEKK$u}|U?mCIVWK~SeW!z#--lEfjAjNK+7ygMn{mW+ zNVR>wb`XLar;#?SjLF2oGoWsYXb_`lS@}Twsex4O9tU-k)fy*>hdWdS`3@p1!2ru@ zcv`)6M7_Ne`Jc=N;(+Z!C=E3q&kKR5bYt;jCU3_U6mVh*ImMNPh}J|szenDUyUCay zu_n{7au(R3>%vDTGk4r1JwDzuD7dm&q9S`Q?Ic`ESV!h>KA}3q)r5+3*0)tC|3@Cv z6cSAymW6@r{Uk+9s9g{Wv0O^5v7b04clJeDE>-;P{0+<;E+dTMD5^6K42NHZg?vOC z?1M<{z$`uhXNLoAv7DF*so3y475mPGsSoxchPKEQu0;BhuefF|1dO7f@s8H+BeiW0 zd_gCTgTO*IL%-J*I}mDzFDL@X66CS)KXK_Ag_?|JKI>u zzzO11dwn9~sxU)G<}N0oT*W*wp1F_AQH>mYf^1T5;lJRj1+Z)RZsUdaK8-VA9J>(g zfr(C<^*d<^NFY$#Xlr6nu`6K?J-vwsF&cl2Gu3G}YHthN}uZD5defPPK7PXxL zz^00k7=U%qinbL4z=px|YFQ}SQtpCUrHmwHobOWVw3J>E{?mPt{VskeGZu~EETY8F zG1+?&u}kTV?l6w(dpK|f82jU2R^(^DMCQew3x*Fkb_K}lJShZa_p(I~296<-xNHUF zrzTv)N(kxlPYskp_eIG^KjDOEDx4aM>!PXCwB+Vqv~x%dIv;Nh5SFZhHHKK$^4gu5 z%*s27WHz>l0Ux^R@`g8bvqQyCU4%MJuco}^cXuht>2;f!L0sT!3Jy2U;dyJQUH?YK zG#02#;bLRqx6K2->iOB-DaJH$Gugiw_ufEF$IaGK%auM|D|po)H7eqJ3yy*UV9EuU z;vqt%>*4{TFTV?tXmv$hUEb2yF5O#BD@9E?ek}!OApeqxOIa^MB+WR0z63;}GxnXJ zP^yR*=fcT%5wYdb|~z?CFXlm2a$|Bp3_L8F&&=}zkDzd_9J zqTq@}1+Lo-_V6j*U3+qxwffACuX%lOO$wkIa3&4)yuFni6I{u7Y?=xH30V~KcIiuY zgl}eG7m*5LbQrx()&Ex}|Jg8EFv1n7u%&Co)uqDH|A!RzN{5eU=KAuXGv=vHJ7%Gm z9G?#8D%&O4>Z-id>Ue*xu0z)zU@Sopvw!yi{&itMtnPmeNk-1K>qvN(KXJz?d#Osf zd9%A((s5Sad%S)hg{gAfX+O2^-)NTX2b!Yg&X+5W;JkZfezdbC&|d<9Q7o^tRam=lhn*s{NTq(tWfzE{`(IvH3>F%6A zBtHrip^fvqeKdnJB^Jf0%=pqEp)(FU0ez@jotJ>)@+Sa5`P&K8;jX@`5Q49r{3F^$ z=qYQeA(yNNBHsyxGM4oVz^GA!e!sD zO;iWqd4<#~`PpwTiKDKgPKSd}K@4#p`jhwA(wl^tts`BrtO$fOI z_A3JNOYo8+=-+*Q)eyz&Pw-<;?PP**Nf8+Ks5gyuckCA{Iz1{t7dfxff8t2LlD5UW z&rlO6Irr@hwU(ljoho^^D-7@9nLw^_31`I`MVnmBhaa3pCfw*OlyVv8{)j*veSv}- z70*7_@|m-InVo(!1=u@Z0#A#@HkT=Ddg%Mcx_BQ$-s~R*XeZ})`A-g#N`T4Kqj&kC zGpDF`Z?p#vY%$cut0*nR^w6DMA!7ArOLC1hL47RG5(kg(V3 zm3R#w9MSXm6Ek9eVXga#oiDF@7v#qtXopb+&VQ%2*N2h0sLbg^-RMqO-R3MFH{V!xd~q0 zq@q399yCOV;+V2Op~<)-Q^cVLz8z4oJtF|j0|fjJq2>+XOx zPfx4o4F%1RtB;q!VVk>9P~UEGN4xNDFUPR0jJg=t+=aIm3~J3hk9^9UJsVGSoN2jO zeg6OIz5`cR0X8qMN&il!WH~^+()|(jk@ChCk14&fFtE4w`=KQCy>h2^&b5W$ib0?? zE3Md@5f6~Wo`cxQy_&v+&$$1F|FmN}-yU^TFz2k)I>6ZKS`J7*ssGGxqm)*V(UPc7W zKZCa9+w!q$Nof#7pLfuPn(HXG;QImtEIh~bY3iQV>xllz{w#hnrk?}Ry}Mf)-t3s+ zJ|WPW?7)HIlxLp-?nCG7)w@2hB?EBwbLb(In_#|OV`t&E31(V1c4jA~?7`<>P#%s4 zr^l1i!bb9>PYZ zV_|b`2F9>B?*S}*1%_x0v+GxAJH0$&n>c+w8p~PK!Wy!W!%pfU+_lftIVt^d^?Yr5 zm^635k^bl@&iF>L#+^FvCap$V3s#+XBYLFuZwHiB2M!kq<$|NxY^e=0-6ujftvJoG?2?Rz`(6 zuExGU!6%bGZsK(tQ^`3qWAX||`~=T!H$2^NFmgTqO1K6 zAUtsqnsD+KVM4Ny_=g%IS0YABZ$9I74=eeW-;~gRKPmS|j3w$z+{b8Wfe?V?M>{dET|T~H>4kTT;A+1(^<;!ubOd3jGUMLYp_sT_bm!~{*-Nd)L z2lzNeHFrhjeNHRhVVj1)>GUHS!_kh9RQs&@s03WxQ2P8grx$*6TF^-3RJ*cTB}=k3 ztT?h$?}C%$u=cxoqxj=@qsdL~J|BwdCem>EqX#Jl^$TKla0G%zxHw#dXH_I!a9dGuVWg%%QKj}x-&miz|%xC%;bO0BN|C!Kt zIIM6AnJt|rqDi}2{f(tk_Lerj}XxH93hE-gW zi4-FFTY9EkOa~3*t*UY51DY^l0tp={^XNp`Gm`fqly>H*Q(YdQ+Q)#C1>sPV9ZwH>=N~}mB z7X7~w`8`-=>%*=2#fw%G-^?TY4s6#!nnqRQk`7?kH_mV42aj9Fym;1_l+0TW2Q&3r z$!kwBSUQUpW*-<$V0=2UnMs(HXjs+NlN`hr7Qk}PgL*^mxGyT}s35Y63$u{kqo^7@ z$Wm%akL>=5oT&RwW>hy64&ew(=`PuILw^;8O|5|RYg}L@T|kB5?wzDQa%0~Is`dMx z@^5fdC#j{p`50_S{wXIVIHQwPJTb2A1hkk1@r>hLZ$nzfDq@MfI)i$0;sbeyC}-hF zd>~`bRdtq{P_pa7XVL@LSxfbF-akBJ)o;%z?jo(EhaEN%-pXf?st6WY;sP5fs|=sRPC?%km+1hS1Hs+1B9l6 z?76W}_q~dYz_Hzc=t&41A0TkVL*PKzw>$WCNB2(Z)1&H{7X$Axr?`mjQrKIxmH0D( z4%-ZA1B(n1xS$6xqB`KhyvfZlxUp*p`5<0Wo)3(a0wdnKJYYb~ui{1J4i$^E^8*Gu zj)^lz$GNDUq7i7(sEi9WXL+QktskgYWv2hTZx% zxXcc~y~Ww|7EN@oi4$|CdbMHE!TqWv%-93qZ}>5WWkq{cssrbEC!AmpZ?D1?;v<=} zbC5#j{gY~vqtu#Ogikn1!|9@bq^Q%sQu`h<1eRfuqYSnk8D+f`MCjfJDxuq447Uc@nu$k0#C2OS%{DQ$IM5SNsb#HoHRF5P zmp&(`4##?e4=VRMx_2;iL|eIR≀LEE*VBpb;}q3u{i>+4vVa-2AC_6HfAi&+e-( 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 b>;#o8FWRx%t+i0MPCiDel#lu2`1=0?-aks+ diff --git a/player.c b/player.c index b0888ea..52949ec 100644 --- a/player.c +++ b/player.c @@ -281,6 +281,11 @@ PLAYER_API void player__kill( player_instance *player ){ } +PLAYER_API void player__begin_holdout( player_instance *player ){ + memcpy( &player->holdout_pose, &player->pose, sizeof(player->pose) ); + player->holdout_time = 1.0f; +} + /* implementation */ #include "player_common.c" #include "player_walk.c" diff --git a/player.h b/player.h index 2ae0485..cb60d04 100644 --- a/player.h +++ b/player.h @@ -86,11 +86,10 @@ struct player_instance{ u16 board_view_slot, playermodel_view_slot; + player_pose pose; player_pose holdout_pose; float holdout_time; - struct board_pose board_pose; - /* * Subsystems * ------------------------------------------------- @@ -167,13 +166,21 @@ void( *_player_im_gui[])( player_instance *player ) = { }; VG_STATIC -void( *_player_animate[])( player_instance *player, player_animation *dest ) = { +void( *_player_animate[])( player_instance *player ) = { player__walk_animate, player__skate_animate, player__dead_animate, player__drive_animate }; +VG_STATIC +void( *_player_pose[] )( player_instance *player ) = { + player__walk_pose, + player__skate_pose, + player__dead_pose, + player__drive_pose, +}; + VG_STATIC void( *_player_post_animate[])( player_instance *player ) = { player__walk_post_animate, @@ -200,6 +207,7 @@ PLAYER_API void player__im_gui( player_instance *player ); PLAYER_API void player__setpos( player_instance *player, v3f pos ); PLAYER_API void player__spawn( player_instance *player, ent_spawn *rp ); PLAYER_API void player__kill( player_instance *player ); +PLAYER_API void player__begin_holdout( player_instance *player ); VG_STATIC int localplayer_cmd_respawn( int argc, const char *argv[] ); VG_STATIC void player_apply_transport_to_cam( m4x3f transport ); diff --git a/player_api.h b/player_api.h index a009d6d..0165841 100644 --- a/player_api.h +++ b/player_api.h @@ -7,19 +7,24 @@ #define PLAYER_API VG_STATIC typedef struct player_instance player_instance; -typedef mdl_keyframe player_pose[32]; -typedef struct player_animation player_animation; +typedef struct player_pose player_pose; -struct player_animation{ - player_pose pose; - v3f root_co; - v4f root_q; - - enum player_animation_type { - k_player_animation_type_fk, /* regular FK animation */ - k_player_animation_type_absolute /* decomposition of the final matrices */ +struct player_pose{ + enum player_pose_type { + k_player_pose_type_fk, /* regular FK animation */ + k_player_pose_type_absolute /* decomposition of the final matrices */ } type; + + v3f root_co; + v4f root_q; + + mdl_keyframe keyframes[32]; + + struct player_board_pose { + f32 lean; + } + board; }; #endif /* PLAYER_API_H */ diff --git a/player_dead.c b/player_dead.c index acb434a..b6312cb 100644 --- a/player_dead.c +++ b/player_dead.c @@ -8,21 +8,24 @@ VG_STATIC void player__dead_update ( player_instance *player ) player_ragdoll_iter( &player->ragdoll ); } -VG_STATIC void player__dead_animate ( player_instance *player, - player_animation *anim ) -{ - v3_zero( anim->root_co ); - q_identity( anim->root_q ); +VG_STATIC void player__dead_animate ( player_instance *player ){ + /* nothing here */ +} + +VG_STATIC void player__dead_pose ( player_instance *player ){ + player_pose *pose = &player->pose; + v3_zero( pose->root_co ); + q_identity( pose->root_q ); - for( int i=0; ipose ); i ++ ){ - v3_zero( anim->pose[i].co ); - v3_fill( anim->pose[i].s, 1.0f ); - q_identity( anim->pose[i].q ); + for( int i=0; ikeyframes); i ++ ){ + /* FUUUUTUUREEEE: squangle the rigidbodies back into OK keyframes */ + v3_zero( pose->keyframes[i].co ); + v3_fill( pose->keyframes[i].s, 1.0f ); + q_identity( pose->keyframes[i].q ); } } -VG_STATIC void player__dead_post_animate( player_instance *player ) -{ +VG_STATIC void player__dead_post_animate( player_instance *player ){ struct player_avatar *av = player->playeravatar; struct player_dead *d = &player->_dead; @@ -44,13 +47,11 @@ VG_STATIC void player__dead_post_animate( player_instance *player ) v3_zero( player->rb.w ); } -VG_STATIC void player__dead_im_gui ( player_instance *player ) -{ +VG_STATIC void player__dead_im_gui ( player_instance *player ){ } -VG_STATIC void player__dead_transition ( player_instance *player ) -{ +VG_STATIC void player__dead_transition ( player_instance *player ){ player->subsystem = k_player_subsystem_dead; copy_avatar_pose_to_ragdoll( player->playeravatar, &player->ragdoll, player->rb.v ); diff --git a/player_dead.h b/player_dead.h index fbdb47f..43f7574 100644 --- a/player_dead.h +++ b/player_dead.h @@ -8,8 +8,8 @@ struct player_dead{ }; VG_STATIC void player__dead_update ( player_instance *player ); -VG_STATIC void player__dead_animate ( player_instance *player, - player_animation *anim ); +VG_STATIC void player__dead_animate ( player_instance *player ); +VG_STATIC void player__dead_pose ( player_instance *player ); VG_STATIC void player__dead_post_animate( player_instance *player ); VG_STATIC void player__dead_im_gui ( player_instance *player ); diff --git a/player_drive.c b/player_drive.c index 216ec89..157ef40 100644 --- a/player_drive.c +++ b/player_drive.c @@ -29,14 +29,16 @@ VG_STATIC void player__drive_post_update( player_instance *player ) v3_copy( drive->vehicle->obj.rb.w, player->rb.w ); } -VG_STATIC void player__drive_animate( player_instance *player, - player_animation *dest ) -{ +VG_STATIC void player__drive_animate( player_instance *player ){} + +VG_STATIC void player__drive_pose( player_instance *player ){ struct player_drive *drive = &player->_drive; struct skeleton *sk = &player->playeravatar->sk; - skeleton_sample_anim( sk, drive->anim_drive, 0.0f, dest->pose ); - v3_copy( player->rb.co, dest->root_co ); - v4_copy( player->rb.q, dest->root_q ); + player_pose *pose = &player->pose; + + skeleton_sample_anim( sk, drive->anim_drive, 0.0f, pose->keyframes ); + v3_copy( player->rb.co, pose->root_co ); + v4_copy( player->rb.q, pose->root_q ); } VG_STATIC void player__drive_post_animate( player_instance *player ) diff --git a/player_drive.h b/player_drive.h index 4ce05ba..dcf689e 100644 --- a/player_drive.h +++ b/player_drive.h @@ -12,8 +12,9 @@ struct player_drive { VG_STATIC void player__drive_pre_update( player_instance *player ); VG_STATIC void player__drive_update( player_instance *player ); VG_STATIC void player__drive_post_update( player_instance *player ); -VG_STATIC void player__drive_animate( player_instance *player, - player_animation *dest ); +VG_STATIC void player__drive_animate( player_instance *player ); +VG_STATIC void player__drive_pose( player_instance *player ); + VG_STATIC void player__drive_post_animate( player_instance *player ); VG_STATIC void player__drive_im_gui( player_instance *player ); VG_STATIC void player__drive_bind( player_instance *player ); diff --git a/player_render.c b/player_render.c index ba50fc1..283b251 100644 --- a/player_render.c +++ b/player_render.c @@ -139,33 +139,35 @@ VG_STATIC void player_model_unload( struct player_model *board ){ } VG_STATIC void player__animate( player_instance *player ){ - if( _player_animate[ player->subsystem ] ){ - player_animation res; - res.type = k_player_animation_type_fk; + if( _player_animate[ player->subsystem ] && + _player_pose[ player->subsystem ] ){ + _player_animate[ player->subsystem ]( player ); + _player_pose[ player->subsystem ]( player ); - _player_animate[ player->subsystem ]( player, &res ); + player_pose *pose = &player->pose; m4x3f transform; - q_m3x3( res.root_q, transform ); - v3_copy( res.root_co, transform[3] ); + q_m3x3( pose->root_q, transform ); + v3_copy( pose->root_co, transform[3] ); struct skeleton *sk = &player->playeravatar->sk; if( player->holdout_time > 0.0f ){ - skeleton_lerp_pose( sk, res.pose, player->holdout_pose, - player->holdout_time, res.pose ); + skeleton_lerp_pose( sk, + pose->keyframes, player->holdout_pose.keyframes, + player->holdout_time, pose->keyframes ); player->holdout_time -= vg.time_frame_delta * 2.0f; } - if( res.type == k_player_animation_type_fk ){ - skeleton_apply_pose( sk, res.pose, k_anim_apply_defer_ik ); + if( pose->type == k_player_pose_type_fk ){ + skeleton_apply_pose( sk, pose->keyframes, k_anim_apply_defer_ik ); skeleton_apply_ik_pass( sk ); - skeleton_apply_pose( sk, res.pose, k_anim_apply_deffered_only ); + skeleton_apply_pose( sk, pose->keyframes, k_anim_apply_deffered_only ); skeleton_apply_inverses( sk ); skeleton_apply_transform( sk, transform ); } else { - skeleton_apply_pose( sk, res.pose, k_anim_apply_absolute ); + skeleton_apply_pose( sk, pose->keyframes, k_anim_apply_absolute ); } skeleton_debug( sk ); @@ -180,11 +182,11 @@ VG_STATIC void player__animate( player_instance *player ){ VG_STATIC void player__animate_from_replay( player_instance *player, replay_buffer *replay ){ /* TODO: holdout blending (from when the game has to slow down) */ - - player_animation res; replay_frame *frame = replay->cursor_frame, *next = NULL; + player_pose *pose = &player->pose; + if( frame ){ next = frame->r; @@ -192,23 +194,21 @@ VG_STATIC void player__animate_from_replay( player_instance *player, f32 t = replay_subframe_time( replay ); struct skeleton *sk = &player->playeravatar->sk; - skeleton_lerp_pose(sk, frame->anim.pose, next->anim.pose, t, res.pose); - v3_lerp( frame->anim.root_co, next->anim.root_co, t, res.root_co ); - q_nlerp( frame->anim.root_q, next->anim.root_q, t, res.root_q ); - res.type = k_player_animation_type_absolute; - player->board_pose.lean = vg_lerpf( frame->board_pose.lean, - next->board_pose.lean, t ); - } - else { - memcpy( &res, &frame->anim, sizeof(frame->anim) ); - memcpy( &frame->board_pose, &player->board_pose, - sizeof(player->board_pose) ); + skeleton_lerp_pose( sk, frame->pose.keyframes, next->pose.keyframes, + t, pose->keyframes ); + v3_lerp( frame->pose.root_co, next->pose.root_co, t, pose->root_co ); + q_nlerp( frame->pose.root_q, next->pose.root_q, t, pose->root_q ); + pose->type = k_player_pose_type_absolute; + pose->board.lean = vg_lerpf( frame->pose.board.lean, + next->pose.board.lean, t ); } + else + memcpy( pose, &frame->pose, sizeof(frame->pose) ); } else return; struct skeleton *sk = &player->playeravatar->sk; - skeleton_apply_pose( sk, res.pose, k_anim_apply_absolute ); + skeleton_apply_pose( sk, pose->keyframes, k_anim_apply_absolute ); } VG_STATIC void player__pre_render( player_instance *player ){ @@ -234,7 +234,7 @@ VG_STATIC void player__pre_render( player_instance *player ){ VG_STATIC void render_board( camera *cam, world_instance *world, struct player_board *board, m4x3f root, - struct board_pose *pose, + struct player_board_pose *pose, enum board_shader shader ) { if( !board ) return; @@ -425,7 +425,7 @@ PLAYER_API void player__render( camera *cam, player_instance *player ){ render_board( cam, world, board, player->playeravatar->sk.final_mtx[ player->playeravatar->id_board], - &player->board_pose, + &player->pose.board, k_board_shader_player ); SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); diff --git a/player_render.h b/player_render.h index f33e2db..5a11bea 100644 --- a/player_render.h +++ b/player_render.h @@ -57,10 +57,6 @@ struct player_board{ board; }; -struct board_pose { - f32 lean; -}; - struct player_model{ struct dynamic_model_1texture mdl; }; @@ -83,7 +79,7 @@ VG_STATIC void player_model_unload( struct player_model *board ); VG_STATIC void render_board( camera *cam, world_instance *world, struct player_board *board, m4x3f root, - struct board_pose *pose, + struct player_board_pose *pose, enum board_shader shader ); VG_STATIC void render_playermodel( camera *cam, world_instance *world, diff --git a/player_replay.c b/player_replay.c index 5313f93..319cf03 100644 --- a/player_replay.c +++ b/player_replay.c @@ -299,15 +299,15 @@ void skaterift_record_frame( replay_buffer *replay, int force_gamestate ){ replay->cursor = vg.time; replay->cursor_frame = frame; - player_animation *res = &frame->anim; + player_pose *res = &frame->pose; v3_zero( res->root_co ); q_identity( res->root_q ); - res->type = k_player_animation_type_absolute; + res->type = k_player_pose_type_absolute; struct skeleton *sk = &localplayer.playeravatar->sk; - memcpy( &frame->board_pose, &localplayer.board_pose, - sizeof(localplayer.board_pose) ); + memcpy( &frame->pose.board, &localplayer.pose.board, + sizeof(localplayer.pose.board) ); frame->time = vg.time; v3_copy( localplayer.cam.pos, frame->cam_pos ); @@ -317,14 +317,14 @@ void skaterift_record_frame( replay_buffer *replay, int force_gamestate ){ for( u32 i=1; ibone_count; i++ ){ struct skeleton_bone *sb = &sk->bones[i]; - mdl_keyframe *kf = &res->pose[i-1]; + mdl_keyframe *kf = &res->keyframes[i-1]; m4x3f mtx; m4x3_mul( localplayer.gate_waiting->transport, sk->final_mtx[i], mtx ); m4x3_decompose( mtx, kf->co, kf->q, kf->s ); } } else - skeleton_decompose_mtx_absolute( sk, res->pose ); + skeleton_decompose_mtx_absolute( sk, res->keyframes ); v3_copy( localplayer.cam.angles, frame->cam_angles ); frame->cam_fov = localplayer.cam.fov; diff --git a/player_replay.h b/player_replay.h index 9a3f2ab..73bbb22 100644 --- a/player_replay.h +++ b/player_replay.h @@ -20,8 +20,7 @@ struct replay_buffer { }; struct replay_frame { - player_animation anim; - struct board_pose board_pose; + player_pose pose; v3f cam_pos, cam_angles; f32 cam_fov; diff --git a/player_skate.c b/player_skate.c index 49cd6e7..fe34de2 100644 --- a/player_skate.c +++ b/player_skate.c @@ -722,15 +722,15 @@ VG_STATIC void skate_apply_trick_model( player_instance *player ) v3f Fd, Fs, F; v3f strength = { 3.7f, 3.6f, 8.0f }; - v3_muls( s->state.board_trick_residualv, -4.0f , Fd ); - v3_muls( s->state.board_trick_residuald, -10.0f, Fs ); + v3_muls( s->state.trick_residualv, -4.0f , Fd ); + v3_muls( s->state.trick_residuald, -10.0f, Fs ); v3_add( Fd, Fs, F ); v3_mul( strength, F, F ); - v3_muladds( s->state.board_trick_residualv, F, k_rb_delta, - s->state.board_trick_residualv ); - v3_muladds( s->state.board_trick_residuald, s->state.board_trick_residualv, - k_rb_delta, s->state.board_trick_residuald ); + v3_muladds( s->state.trick_residualv, F, k_rb_delta, + s->state.trick_residualv ); + v3_muladds( s->state.trick_residuald, s->state.trick_residualv, + k_rb_delta, s->state.trick_residuald ); if( s->state.activity <= k_skate_activity_air_to_grind ){ if( v3_length2( s->state.trick_vel ) < 0.0001f ) @@ -763,7 +763,7 @@ VG_STATIC void skate_apply_trick_model( player_instance *player ) s->state.trick_euler[0] = roundf( s->state.trick_euler[0] ); s->state.trick_euler[1] = roundf( s->state.trick_euler[1] ); s->state.trick_euler[2] = roundf( s->state.trick_euler[2] ); - v3_copy( s->state.trick_vel, s->state.board_trick_residualv ); + v3_copy( s->state.trick_vel, s->state.trick_residualv ); v3_zero( s->state.trick_vel ); } @@ -1096,28 +1096,14 @@ VG_STATIC void skate_integrate( player_instance *player ) rb_update_transform( &player->rb ); } -/* - * 1 2 or 3 - */ - -VG_STATIC void skate_copy_holdout( player_instance *player ) -{ - struct player_skate *s = &player->_skate; - struct player_avatar *av = player->playeravatar; - struct skeleton *sk = &av->sk; - skeleton_copy_pose( sk, s->holdout, player->holdout_pose ); -} - -VG_STATIC enum trick_type player_skate_trick_input( player_instance *player ) -{ +VG_STATIC enum trick_type player_skate_trick_input( player_instance *player ){ return (button_press( k_srbind_trick0 ) ) | (button_press( k_srbind_trick1 ) << 1) | (button_press( k_srbind_trick2 ) << 1) | (button_press( k_srbind_trick2 ) ); } -VG_STATIC void player__skate_pre_update( player_instance *player ) -{ +VG_STATIC void player__skate_pre_update( player_instance *player ){ struct player_skate *s = &player->_skate; if( button_down( k_srbind_use ) ){ @@ -1127,8 +1113,7 @@ VG_STATIC void player__skate_pre_update( player_instance *player ) v3_copy( player->cam.angles, angles ); angles[2] = 0.0f; - skate_copy_holdout( player ); - player->holdout_time = 0.34f; + player__begin_holdout( player ); player__skate_kill_audio( player ); player__walk_transition( player, angles ); return; @@ -1157,8 +1142,7 @@ VG_STATIC void player__skate_pre_update( player_instance *player ) } } -VG_STATIC void player__skate_post_update( player_instance *player ) -{ +VG_STATIC void player__skate_post_update( player_instance *player ){ struct player_skate *s = &player->_skate; for( int i=0; ipossible_jump_count; i++ ){ @@ -1320,8 +1304,7 @@ VG_STATIC void player__skate_post_update( player_instance *player ) VG_STATIC int skate_compute_surface_alignment( player_instance *player, v3f ra, u32 colour, - v3f surface_normal, v3f axel_dir ) -{ + v3f surface_normal, v3f axel_dir ){ struct player_skate *s = &player->_skate; world_instance *world = world_current_instance(); @@ -1341,8 +1324,7 @@ int skate_compute_surface_alignment( player_instance *player, int res_l = 0, res_r = 0; - for( int i=0; i<8; i++ ) - { + for( int i=0; i<8; i++ ){ float t = 1.0f - (float)i * (1.0f/8.0f); v3_muladds( truck, player->rb.to_world[0], -k_board_radius*t, left ); v3_muladds( left, player->rb.to_world[1], k_board_radius, left ); @@ -1354,8 +1336,7 @@ int skate_compute_surface_alignment( player_instance *player, break; } - for( int i=0; i<8; i++ ) - { + for( int i=0; i<8; i++ ){ float t = 1.0f - (float)i * (1.0f/8.0f); v3_muladds( truck, player->rb.to_world[0], k_board_radius*t, right ); v3_muladds( right, player->rb.to_world[1], k_board_radius, right ); @@ -1373,20 +1354,17 @@ int skate_compute_surface_alignment( player_instance *player, v3_muladds( truck, player->rb.to_world[1], -k_board_radius, midpoint ); v3_zero( tangent_average ); - if( res_l || res_r ) - { + if( res_l || res_r ){ v3f p0, p1, t; v3_copy( midpoint, p0 ); v3_copy( midpoint, p1 ); - if( res_l ) - { + if( res_l ){ v3_copy( ray_l.pos, p0 ); v3_cross( ray_l.normal, player->rb.to_world[0], t ); v3_add( t, tangent_average, tangent_average ); } - if( res_r ) - { + if( res_r ){ v3_copy( ray_r.pos, p1 ); v3_cross( ray_r.normal, player->rb.to_world[0], t ); v3_add( t, tangent_average, tangent_average ); @@ -1395,14 +1373,12 @@ int skate_compute_surface_alignment( player_instance *player, v3_sub( p1, p0, v0 ); v3_normalize( v0 ); } - else - { + else{ /* fallback: use the closes point to the trucks */ v3f closest; int idx = bh_closest_point( world->geo_bh, midpoint, closest, 0.1f ); - if( idx != -1 ) - { + if( idx != -1 ){ u32 *tri = &world->scene_geo.arrindices[ idx * 3 ]; v3f verts[3]; @@ -1443,8 +1419,7 @@ int skate_compute_surface_alignment( player_instance *player, return 1; } -VG_STATIC void skate_weight_distribute( player_instance *player ) -{ +VG_STATIC void skate_weight_distribute( player_instance *player ){ struct player_skate *s = &player->_skate; v3_zero( s->weight_distribution ); @@ -1502,8 +1477,7 @@ VG_STATIC void skate_weight_distribute( player_instance *player ) } } -VG_STATIC void skate_adjust_up_direction( player_instance *player ) -{ +VG_STATIC void skate_adjust_up_direction( player_instance *player ){ struct player_skate *s = &player->_skate; if( s->state.activity == k_skate_activity_ground ){ @@ -1526,8 +1500,7 @@ VG_STATIC void skate_adjust_up_direction( player_instance *player ) } } -VG_STATIC int skate_point_visible( v3f origin, v3f target ) -{ +VG_STATIC int skate_point_visible( v3f origin, v3f target ){ v3f dir; v3_sub( target, origin, dir ); @@ -1542,16 +1515,14 @@ VG_STATIC int skate_point_visible( v3f origin, v3f target ) return 1; } -VG_STATIC void skate_grind_orient( struct grind_info *inf, m3x3f mtx ) -{ +VG_STATIC void skate_grind_orient( struct grind_info *inf, m3x3f mtx ){ v3_copy( inf->dir, mtx[0] ); v3_copy( inf->n, mtx[1] ); v3_cross( mtx[0], mtx[1], mtx[2] ); } VG_STATIC void skate_grind_friction( player_instance *player, - struct grind_info *inf, float strength ) -{ + struct grind_info *inf, float strength ){ v3f v2; v3_muladds( player->rb.to_world[2], inf->n, -v3_dot( player->rb.to_world[2], inf->n ), v2 ); @@ -1564,8 +1535,7 @@ VG_STATIC void skate_grind_friction( player_instance *player, } VG_STATIC void skate_grind_decay( player_instance *player, - struct grind_info *inf, float strength ) -{ + struct grind_info *inf, float strength ){ m3x3f mtx, mtx_inv; skate_grind_orient( inf, mtx ); m3x3_transpose( mtx, mtx_inv ); @@ -1580,8 +1550,7 @@ VG_STATIC void skate_grind_decay( player_instance *player, VG_STATIC void skate_grind_truck_apply( player_instance *player, float sign, struct grind_info *inf, - float strength ) -{ + float strength ){ struct player_skate *s = &player->_skate; /* REFACTOR */ @@ -2669,20 +2638,16 @@ VG_STATIC void player__skate_im_gui( player_instance *player ){ s->state.trick_euler[2] ); } -VG_STATIC void player__skate_animate( player_instance *player, - player_animation *dest ) -{ +VG_STATIC void player__skate_animate( player_instance *player ){ struct player_skate *s = &player->_skate; struct player_skate_state *state = &player->_skate.state; - struct player_avatar *av = player->playeravatar; - struct skeleton *sk = &av->sk; + struct player_skate_animator *animator = &s->animator; /* Head */ float kheight = 2.0f, kleg = 0.6f; - v3f offset; - v3_zero( offset ); + v3_zero( animator->offset ); v3f cog_local, cog_ideal; m4x3_mulv( player->rb.to_local, s->state.cog, cog_local ); @@ -2691,33 +2656,35 @@ VG_STATIC void player__skate_animate( player_instance *player, v3_normalize( cog_ideal ); m3x3_mulv( player->rb.to_local, cog_ideal, cog_ideal ); - v3_sub( cog_ideal, cog_local, offset ); + v3_sub( cog_ideal, cog_local, animator->offset ); - - v3_muls( offset, 4.0f, offset ); - offset[1] *= -1.0f; + v3_muls( animator->offset, 4.0f, animator->offset ); + animator->offset[1] *= -1.0f; float curspeed = v3_length( player->rb.v ), kickspeed = vg_clampf( curspeed*(1.0f/40.0f), 0.0f, 1.0f ), kicks = (vg_randf64()-0.5f)*2.0f*kickspeed, sign = vg_signf( kicks ); - state->wobble[0] = vg_lerpf( state->wobble[0], kicks*kicks*sign, - 6.0f*vg.time_delta); - state->wobble[1] = vg_lerpf( state->wobble[1], state->wobble[0], - 2.4f*vg.time_delta); + animator->wobble[0] = vg_lerpf( animator->wobble[0], kicks*kicks*sign, + 6.0f*vg.time_delta); + animator->wobble[1] = vg_lerpf( animator->wobble[1], animator->wobble[0], + 2.4f*vg.time_delta); + + animator->offset[0] *= 0.26f; + animator->offset[0] += animator->wobble[1]*3.0f; - offset[0] *= 0.26f; - offset[0] += state->wobble[1]*3.0f; + animator->offset[1] *= -0.3f; + animator->offset[2] *= 0.01f; - offset[1] *= -0.3f; - offset[2] *= 0.01f; + animator->offset[0]=vg_clampf(animator->offset[0],-0.8f,0.8f)* + (1.0f-fabsf(animator->slide)*0.9f); + animator->offset[1]=vg_clampf(animator->offset[1],-0.5f,0.0f); - offset[0]=vg_clampf(offset[0],-0.8f,0.8f) - *(1.0f-fabsf(state->blend_slide)*0.9f); - offset[1]=vg_clampf(offset[1],-0.5f,0.0f); + v3_muls( animator->offset, 0.3f, player->cam_control.tpv_offset_extra ); - v3_muls( offset, 0.3f, player->cam_control.tpv_offset_extra ); + /* localized vectors */ + m4x3_mulv( player->rb.to_local, s->state.cog, animator->local_cog ); /* * Animation blending @@ -2730,387 +2697,404 @@ VG_STATIC void player__skate_animate( player_instance *player, if( s->state.activity == k_skate_activity_ground ) desired = vg_clampf( fabsf( s->state.slip ), 0.0f, 1.0f ); - state->blend_slide = - vg_lerpf( state->blend_slide, desired, 2.4f*vg.time_delta); + animator->slide = vg_lerpf( animator->slide, desired, 2.4f*vg.time_delta); } /* movement information */ - { - int iair = s->state.activity <= k_skate_activity_air_to_grind; + int iair = s->state.activity <= k_skate_activity_air_to_grind; + + float dirz = s->state.reverse > 0.0f? 0.0f: 1.0f, + dirx = s->state.slip < 0.0f? 0.0f: 1.0f, + fly = iair? 1.0f: 0.0f, + wdist= s->weight_distribution[2] / k_board_length; + + if( s->state.activity >= k_skate_activity_grind_any ) + wdist = 0.0f; + + animator->z = vg_lerpf( animator->z, dirz, 2.4f*vg.time_delta ); + animator->x = vg_lerpf( animator->x, dirx, 0.6f*vg.time_delta ); + animator->fly = vg_lerpf( animator->fly, fly, 3.4f*vg.time_delta ); + animator->weight = vg_lerpf( animator->weight, wdist, 9.0f*vg.time_delta ); + + float stand = 1.0f - vg_clampf( curspeed * 0.03f, 0.0f, 1.0f ); + animator->stand = vg_lerpf( animator->stand, stand, 6.0f*vg.time_delta ); + animator->reverse = s->state.reverse; + + if( fabsf(s->state.slip) > 0.3f ){ + f32 slide_dir = vg_signf(v3_dot(player->rb.v,player->rb.to_world[0])); + s->state.delayed_slip_dir = slide_dir; + } + + /* grinding */ + f32 grind=s->state.activity >= k_skate_activity_grind_any? 1.0f: 0.0f; + animator->grind = vg_lerpf( animator->grind, grind, 5.0f*vg.time_delta ); + + f32 grind_frame = 0.5f; - float dirz = s->state.reverse > 0.0f? 0.0f: 1.0f, - dirx = s->state.slip < 0.0f? 0.0f: 1.0f, - fly = iair? 1.0f: 0.0f, - wdist= s->weight_distribution[2] / k_board_length; + if( s->state.activity == k_skate_activity_grind_front50 ) + grind_frame = 0.0f; + else if( s->state.activity == k_skate_activity_grind_back50 ) + grind_frame = 1.0f; + + animator->grind_balance = vg_lerpf( animator->grind_balance, grind_frame, + 5.0f*vg.time_delta ); + + /* pushing */ + animator->push_time = vg.time - s->state.start_push; + animator->push = vg_lerpf( animator->push, + (vg.time - s->state.cur_push) < 0.125, + 6.0f*vg.time_delta ); + + /* jumping */ + animator->jump_charge = s->state.jump_charge; + animator->jump = vg_lerpf( animator->jump, animator->jump_charge, + 8.4f*vg.time_delta ); + + /* trick setup */ + animator->jump_dir = s->state.jump_dir; + f32 jump_start_frame = 14.0f/30.0f; + animator->jump_time = animator->jump_charge * jump_start_frame; + f32 jump_frame = (vg.time - s->state.jump_time) + jump_start_frame; + if( jump_frame >= jump_start_frame && jump_frame <= (40.0f/30.0f) ) + animator->jump_time = jump_frame; + + /* trick */ + float jump_t = vg.time-s->state.jump_time; + float k=17.0f; + float h = k*jump_t; + float extra = h*exp(1.0-h) * (s->state.jump_dir?1.0f:-1.0f); + extra *= s->state.slap * 4.0f; + + v3_add( s->state.trick_euler, s->state.trick_residuald, + animator->board_euler ); + v3_muls( animator->board_euler, VG_TAUf, animator->board_euler ); + + animator->board_euler[0] *= 0.5f; + animator->board_euler[1] += extra; + animator->trick_type = s->state.trick_type; + + /* feet placement */ + struct player_board *board = + addon_cache_item_if_loaded( k_addon_type_board, + player->board_view_slot ); + if( board ){ + if( animator->weight > 0.0f ){ + animator->foot_offset[0] = + board->truck_positions[k_board_truck_back][2]+0.3f; + } + else{ + animator->foot_offset[1] = + board->truck_positions[k_board_truck_front][2]-0.3f; + } + } + + f32 slapm = vg_maxf( 1.0f-v3_length2( s->state.trick_vel ), 0.0f ); + animator->slap = s->state.slap; + animator->subslap = vg_lerpf( animator->subslap, slapm, + vg.time_delta*10.0f ); + + f32 l = ((s->state.activity < k_skate_activity_ground) && + v3_length2(s->state.trick_vel) > 0.1f )? 1: 0; + animator->trick_foot = vg_lerpf( animator->trick_foot, l, + 8.4f*vg.time_delta ); + + /* grab */ + v2f grab_input; + joystick_state( k_srjoystick_grab, grab_input ); + v2_add( s->state.grab_mouse_delta, grab_input, grab_input ); + + if( v2_length2( grab_input ) <= 0.001f ) grab_input[0] = -1.0f; + else v2_normalize_clamp( grab_input ); + v2_lerp( animator->grab, grab_input, 2.4f*vg.time_delta, animator->grab ); + animator->grabbing = s->state.grabbing; + + /* steer */ + joystick_state( k_srjoystick_steer, animator->steer ); + + /* flip angle */ + if( (s->state.activity <= k_skate_activity_air_to_grind) && + (fabsf(s->state.flip_rate) > 0.01f) ){ + float substep = vg.time_fixed_extrapolate; + float t = s->state.flip_time+s->state.flip_rate*substep*k_rb_delta; + sign = vg_signf( t ); + + t = 1.0f - vg_minf( 1.0f, fabsf( t * 1.1f ) ); + t = sign * (1.0f-t*t); + + f32 angle = vg_clampf( t, -1.0f, 1.0f ) * VG_TAUf, + distm = s->state.land_dist * fabsf(s->state.flip_rate) * 3.0f, + blend = vg_clampf( 1.0f-distm, 0.0f, 1.0f ); + angle = vg_lerpf( angle, vg_signf(s->state.flip_rate)*VG_TAUf, blend ); + q_axis_angle( animator->qflip, s->state.flip_axis, angle ); + } + else + q_identity( animator->qflip ); + + /* counter-rotation */ + if( v3_length2( s->state.up_dir ) > 0.001f ){ + if( v4_length(s->state.smoothed_rotation) <= 0.1f || + v4_length(s->state.smoothed_rotation) >= 1.1f ){ + vg_warn( "FIX THIS! CARROT\n" ); /* this never happens anymore? */ + v4_copy( player->rb.q, s->state.smoothed_rotation ); + } + v4_lerp( s->state.smoothed_rotation, player->rb.q, + 2.0f*vg.time_frame_delta, + s->state.smoothed_rotation ); + q_normalize( s->state.smoothed_rotation ); + + v3f yaw_ref = {1.0f,0.0f,0.0f}, + yaw_smooth = {1.0f,0.0f,0.0f}; + q_mulv( player->rb.q, yaw_ref, yaw_ref ); + q_mulv( s->state.smoothed_rotation, yaw_smooth, yaw_smooth ); + m3x3_mulv( player->rb.to_local, yaw_smooth, yaw_smooth ); + m3x3_mulv( player->rb.to_local, yaw_ref, yaw_ref ); + + f32 yaw_counter_rotate = v3_dot(yaw_ref,yaw_smooth); + yaw_counter_rotate = vg_clampf(yaw_counter_rotate,-0.7f,0.7f); + yaw_counter_rotate = acosf( yaw_counter_rotate ); + yaw_counter_rotate *= 1.0f-animator->fly; - if( s->state.activity >= k_skate_activity_grind_any ) - wdist = 0.0f; + v3f ndir; + m3x3_mulv( player->rb.to_local, s->state.up_dir, ndir ); + v3_normalize( ndir ); + + v3f up = { 0.0f, 1.0f, 0.0f }; + + float a = v3_dot( ndir, up ); + a = acosf( vg_clampf( a, -1.0f, 1.0f ) ); + + v3f axis; + v4f qcounteryaw, qfixup; + + v3_cross( up, ndir, axis ); + q_axis_angle( qfixup, axis, a ); + + q_axis_angle( qcounteryaw, (v3f){0.0f,1.0f,0.0f}, yaw_counter_rotate ); + q_mul( qcounteryaw, qfixup, animator->qfixuptotal ); + q_normalize( animator->qfixuptotal ); + + v3f p1, p2; + m3x3_mulv( player->rb.to_world, up, p1 ); + m3x3_mulv( player->rb.to_world, ndir, p2 ); + + vg_line_arrow( player->rb.co, p1, 0.25f, VG__PINK ); + vg_line_arrow( player->rb.co, p2, 0.25f, VG__PINK ); - state->blend_z = - vg_lerpf( state->blend_z, dirz, 2.4f*vg.time_delta ); - state->blend_x = - vg_lerpf( state->blend_x, dirx, 0.6f*vg.time_delta ); - state->blend_fly = - vg_lerpf( state->blend_fly, fly, 3.4f*vg.time_delta ); - state->blend_weight = - vg_lerpf( state->blend_weight, wdist, 9.0f*vg.time_delta ); } + else q_identity( animator->qfixuptotal ); + q_identity( animator->qfixuptotal ); + rb_extrapolate( &player->rb, animator->root_co, animator->root_q ); +} + +VG_STATIC void player__skate_pose( player_instance *player ){ + struct player_avatar *av = player->playeravatar; + struct skeleton *sk = &av->sk; + struct player_skate *s = &player->_skate; + struct player_skate_animator *animator = &s->animator; + player_pose *pose = &player->pose; + pose->type = k_player_pose_type_fk; + v3_copy( animator->root_co, pose->root_co ); + v4_copy( animator->root_q, pose->root_q ); + + /* transform */ + v3f ext_up,ext_co; + q_mulv( pose->root_q, (v3f){0.0f,1.0f,0.0f}, ext_up ); + v3_copy( pose->root_co, ext_co ); + v3_muladds( pose->root_co, ext_up, -0.1f, pose->root_co ); + + /* apply flip rotation at midpoint */ + q_mul( animator->qflip, pose->root_q, pose->root_q ); + q_normalize( pose->root_q ); + + v3f rotation_point, rco; + v3_muladds( ext_co, ext_up, 0.5f, rotation_point ); + v3_sub( pose->root_co, rotation_point, rco ); + + q_mulv( animator->qflip, rco, rco ); + v3_add( rco, rotation_point, pose->root_co ); + + /* ANIMATIONS + * ---------------------------------------------------------------------- */ mdl_keyframe apose[32], bpose[32]; mdl_keyframe ground_pose[32]; { - /* when the player is moving fast he will crouch down a little bit */ - float stand = 1.0f - vg_clampf( curspeed * 0.03f, 0.0f, 1.0f ); - state->blend_stand = - vg_lerpf( state->blend_stand, stand, 6.0f*vg.time_delta ); - /* stand/crouch */ - float dir_frame = state->blend_z * (15.0f/30.0f), - stand_blend = offset[1]*-2.0f; + f32 dir_frame = animator->z * (15.0f/30.0f), + stand_blend = animator->offset[1]*-2.0f; - v2f steer; - joystick_state( k_srjoystick_steer, steer ); f32 lean1, - lean2 = steer[0] * s->state.reverse * -0.36f, + lean2 = animator->steer[0] * animator->reverse * -0.36f, lean; - if( fabsf(s->state.slip) > 0.3f ){ - f32 slide_dir = vg_signf(v3_dot(player->rb.v,player->rb.to_world[0])); - s->state.delayed_slip_dir = slide_dir; - } - lean1 = state->blend_slide * s->state.delayed_slip_dir; - + lean1 = animator->slide * animator->delayed_slip_dir; if( fabsf(lean1)>fabsf(lean2) ) lean = lean1; else lean = lean2; - if( ((int)roundf(s->state.trick_euler[0])) % 2 ) lean = -lean; + if( ((int)roundf(animator->board_euler[0])) % 2 ) lean = -lean; lean = vg_clampf( lean, -1.0f, 1.0f ); + pose->board.lean = vg_lerpf(pose->board.lean, lean, vg.time_delta*18.0f); - player->board_pose.lean = vg_lerpf( player->board_pose.lean, lean, - vg.time_delta * 18.0f ); - - v3f local_cog; - m4x3_mulv( player->rb.to_local, s->state.cog, local_cog ); - stand_blend = vg_clampf( 1.0f-local_cog[1], 0, 1 ); + stand_blend = vg_clampf( 1.0f-animator->local_cog[1], 0, 1 ); skeleton_sample_anim( sk, s->anim_stand, dir_frame, apose ); skeleton_sample_anim( sk, s->anim_highg, dir_frame, bpose ); skeleton_lerp_pose( sk, apose, bpose, stand_blend, apose ); /* sliding */ - float slide_frame = state->blend_x * (15.0f/30.0f); - skeleton_sample_anim( sk, s->anim_slide, slide_frame, bpose ); - skeleton_lerp_pose( sk, apose, bpose, state->blend_slide, apose ); - - /* pushing */ - double push_time = vg.time - s->state.start_push; - state->blend_push = vg_lerpf( state->blend_push, - (vg.time - s->state.cur_push) < 0.125, - 6.0f*vg.time_delta ); - - if( s->state.reverse > 0.0f ) - skeleton_sample_anim( sk, s->anim_push, push_time, bpose ); - else - skeleton_sample_anim( sk, s->anim_push_reverse, push_time, bpose ); - - skeleton_lerp_pose( sk, apose, bpose, state->blend_push, apose ); - - /* trick setup */ - float jump_start_frame = 14.0f/30.0f; + skeleton_sample_anim( sk, s->anim_slide, animator->x * 0.5f, bpose ); + skeleton_lerp_pose( sk, apose, bpose, animator->slide, apose ); - float charge = s->state.jump_charge; - state->blend_jump = - vg_lerpf( state->blend_jump, charge, 8.4f*vg.time_delta ); - - float setup_frame = charge * jump_start_frame, - setup_blend = vg_minf( state->blend_jump, 1.0f ); - - float jump_frame = (vg.time - s->state.jump_time) + jump_start_frame; - if( jump_frame >= jump_start_frame && jump_frame <= (40.0f/30.0f) ) - setup_frame = jump_frame; + if( animator->reverse > 0.0f ) + skeleton_sample_anim( sk, s->anim_push, animator->push_time, bpose ); + else{ + skeleton_sample_anim( sk, s->anim_push_reverse, animator->push_time, + bpose ); + } + skeleton_lerp_pose( sk, apose, bpose, animator->push, apose ); - struct skeleton_anim *jump_anim = s->state.jump_dir? + struct skeleton_anim *jump_anim = animator->jump_dir? s->anim_ollie: s->anim_ollie_reverse; - skeleton_sample_anim_clamped( sk, jump_anim, setup_frame, bpose ); + f32 setup_blend = vg_minf( animator->jump, 1.0f ); + skeleton_sample_anim_clamped( sk, jump_anim, animator->jump_time, bpose ); skeleton_lerp_pose( sk, apose, bpose, setup_blend, ground_pose ); } mdl_keyframe air_pose[32]; { - v2f steer; - joystick_state( k_srjoystick_steer, steer ); - - float target = -steer[1]; - - state->blend_airdir = - vg_lerpf( state->blend_airdir, target, 2.4f*vg.time_delta ); + float target = -animator->steer[1]; + animator->airdir = vg_lerpf( animator->airdir, target, + 2.4f*vg.time_delta ); - float air_frame = (state->blend_airdir*0.5f+0.5f) * (15.0f/30.0f); + float air_frame = (animator->airdir*0.5f+0.5f) * (15.0f/30.0f); skeleton_sample_anim( sk, s->anim_air, air_frame, apose ); - static v2f grab_choice; - - v2f grab_input; - joystick_state( k_srjoystick_grab, grab_input ); - v2_add( s->state.grab_mouse_delta, grab_input, grab_input ); - - if( v2_length2( grab_input ) <= 0.001f ) - grab_input[0] = -1.0f; - else - v2_normalize_clamp( grab_input ); - v2_lerp( grab_choice, grab_input, 2.4f*vg.time_delta, grab_choice ); - - float ang = atan2f( grab_choice[0], grab_choice[1] ), + float ang = atan2f( animator->grab[0], animator->grab[1] ), ang_unit = (ang+VG_PIf) * (1.0f/VG_TAUf), grab_frame = ang_unit * (15.0f/30.0f); skeleton_sample_anim( sk, s->anim_grabs, grab_frame, bpose ); - skeleton_lerp_pose( sk, apose, bpose, s->state.grabbing, air_pose ); + skeleton_lerp_pose( sk, apose, bpose, animator->grabbing, air_pose ); } - skeleton_lerp_pose( sk, ground_pose, air_pose, - state->blend_fly, dest->pose ); - + skeleton_lerp_pose( sk, ground_pose, air_pose, animator->fly, + pose->keyframes ); - mdl_keyframe *kf_board = &dest->pose[av->id_board-1], - *kf_foot_l = &dest->pose[av->id_ik_foot_l-1], - *kf_foot_r = &dest->pose[av->id_ik_foot_r-1], - *kf_knee_l = &dest->pose[av->id_ik_knee_l-1], - *kf_knee_r = &dest->pose[av->id_ik_knee_r-1], - *kf_hip = &dest->pose[av->id_hip-1], - *kf_wheels[] = { &dest->pose[av->id_wheel_r-1], - &dest->pose[av->id_wheel_l-1] }; + mdl_keyframe *kf_board = &pose->keyframes[av->id_board-1], + *kf_foot_l = &pose->keyframes[av->id_ik_foot_l-1], + *kf_foot_r = &pose->keyframes[av->id_ik_foot_r-1], + *kf_knee_l = &pose->keyframes[av->id_ik_knee_l-1], + *kf_knee_r = &pose->keyframes[av->id_ik_knee_r-1], + *kf_hip = &pose->keyframes[av->id_hip-1], + *kf_wheels[] = { &pose->keyframes[av->id_wheel_r-1], + &pose->keyframes[av->id_wheel_l-1] }; mdl_keyframe grind_pose[32]; { - float grind_frame = 0.5f; - - if( s->state.activity == k_skate_activity_grind_front50 ){ - grind_frame = 0.0f; - } else if( s->state.activity == k_skate_activity_grind_back50 ){ - grind_frame = 1.0f; - } - - float grind=s->state.activity >= k_skate_activity_grind_any? 1.0f: 0.0f; - state->blend_grind = - vg_lerpf( state->blend_grind, grind, 5.0f*vg.time_delta ); - state->blend_grind_balance = - vg_lerpf( state->blend_grind_balance, - grind_frame, 5.0f*vg.time_delta ); + f32 frame = animator->grind_balance * 0.5f; - grind_frame = state->blend_grind_balance * (15.0f/30.0f); - - skeleton_sample_anim( sk, s->anim_grind, grind_frame, apose ); - skeleton_sample_anim( sk, s->anim_grind_jump, grind_frame, bpose ); - skeleton_lerp_pose( sk, apose, bpose, state->blend_jump, grind_pose ); + skeleton_sample_anim( sk, s->anim_grind, frame, apose ); + skeleton_sample_anim( sk, s->anim_grind_jump, frame, bpose ); + skeleton_lerp_pose( sk, apose, bpose, animator->jump, grind_pose ); } - skeleton_lerp_pose( sk, dest->pose, grind_pose, - state->blend_grind, dest->pose ); - - float add_grab_mod = 1.0f - state->blend_fly; + skeleton_lerp_pose( sk, pose->keyframes, grind_pose, + animator->grind, pose->keyframes ); + float add_grab_mod = 1.0f - animator->fly; /* additive effects */ - { - u32 apply_to[] = { av->id_hip, - av->id_ik_hand_l, - av->id_ik_hand_r, - av->id_ik_elbow_l, - av->id_ik_elbow_r }; - - float apply_rates[] = { 1.0f, - 0.75f, - 0.75f, - 0.75f, - 0.75f }; - - for( int i=0; ipose[apply_to[i]-1].co[0] += offset[0]*add_grab_mod; - dest->pose[apply_to[i]-1].co[2] += offset[2]*add_grab_mod; - } - - /* angle correction */ - if( v3_length2( s->state.up_dir ) > 0.001f ){ - - if( v4_length(s->state.smoothed_rotation) <= 0.1f || - v4_length(s->state.smoothed_rotation) >= 1.1f ){ - vg_warn( "FIX THIS! CARROT\n" ); - v4_copy( player->rb.q, s->state.smoothed_rotation ); - } - v4_lerp( s->state.smoothed_rotation, player->rb.q, - 2.0f*vg.time_frame_delta, - s->state.smoothed_rotation ); - q_normalize( s->state.smoothed_rotation ); - - v3f yaw_ref = {1.0f,0.0f,0.0f}, - yaw_smooth = {1.0f,0.0f,0.0f}; - q_mulv( player->rb.q, yaw_ref, yaw_ref ); - q_mulv( s->state.smoothed_rotation, yaw_smooth, yaw_smooth ); - m3x3_mulv( player->rb.to_local, yaw_smooth, yaw_smooth ); - m3x3_mulv( player->rb.to_local, yaw_ref, yaw_ref ); - - float yaw_counter_rotate = v3_dot(yaw_ref,yaw_smooth); - yaw_counter_rotate = vg_clampf(yaw_counter_rotate,-1.0f,1.0f); - yaw_counter_rotate = acosf( yaw_counter_rotate ); - yaw_counter_rotate *= 1.0f-state->blend_fly; - - v3f ndir; - m3x3_mulv( player->rb.to_local, s->state.up_dir, ndir ); - v3_normalize( ndir ); - - v3f up = { 0.0f, 1.0f, 0.0f }; - - float a = v3_dot( ndir, up ); - a = acosf( vg_clampf( a, -1.0f, 1.0f ) ); - - v3f axis; - v4f qfixup, qcounteryaw, qtotal; - - v3_cross( up, ndir, axis ); - q_axis_angle( qfixup, axis, a ); - - q_axis_angle( qcounteryaw, (v3f){0.0f,1.0f,0.0f}, yaw_counter_rotate ); - q_mul( qcounteryaw, qfixup, qtotal ); - q_normalize( qtotal ); - - mdl_keyframe *kf_hip = &dest->pose[av->id_hip-1]; - v3f origin; - v3_add( av->sk.bones[av->id_hip].co, kf_hip->co, origin ); - - for( int i=0; ipose[apply_to[i]-1]; - - keyframe_rotate_around( kf, origin, av->sk.bones[apply_to[i]].co, - qtotal ); - } - - v3f p1, p2; - m3x3_mulv( player->rb.to_world, up, p1 ); - m3x3_mulv( player->rb.to_world, ndir, p2 ); - - vg_line_arrow( player->rb.co, p1, 0.25f, VG__PINK ); - vg_line_arrow( player->rb.co, p2, 0.25f, VG__PINK ); - - } - - v4f qtotal; - v4f qtrickr, qyawr, qpitchr, qrollr; - v3f eulerr; - - v3_muls( state->board_trick_residuald, VG_TAUf, eulerr ); - - q_axis_angle( qyawr, (v3f){0.0f,1.0f,0.0f}, eulerr[0] * 0.5f ); - q_axis_angle( qpitchr, (v3f){1.0f,0.0f,0.0f}, eulerr[1] ); - q_axis_angle( qrollr, (v3f){0.0f,0.0f,1.0f}, eulerr[2] ); - - q_mul( qpitchr, qrollr, qtrickr ); - q_mul( qyawr, qtrickr, qtotal ); - q_normalize( qtotal ); - - q_mul( qtotal, kf_board->q, kf_board->q ); + u32 apply_to[] = { av->id_hip, + av->id_ik_hand_l, + av->id_ik_hand_r, + av->id_ik_elbow_l, + av->id_ik_elbow_r }; - /* trick rotation */ - v4f qtrick, qyaw, qpitch, qroll; - v3f euler; - v3_muls( s->state.trick_euler, VG_TAUf, euler ); + float apply_rates[] = { 1.0f, + 0.75f, + 0.75f, + 0.75f, + 0.75f }; - float jump_t = vg.time-s->state.jump_time; - - float k=17.0f; - float h = k*jump_t; - float extra = h*exp(1.0-h) * (s->state.jump_dir?1.0f:-1.0f); - extra *= s->state.slap * 4.0f; - - q_axis_angle( qyaw, (v3f){0.0f,1.0f,0.0f}, euler[0] * 0.5f ); - q_axis_angle( qpitch, (v3f){1.0f,0.0f,0.0f}, euler[1] + extra ); - q_axis_angle( qroll, (v3f){0.0f,0.0f,1.0f}, euler[2] ); + for( int i=0; ikeyframes[apply_to[i]-1].co[0] += animator->offset[0]*add_grab_mod; + pose->keyframes[apply_to[i]-1].co[2] += animator->offset[2]*add_grab_mod; + } - q_mul( qyaw, qroll, qtrick ); - q_mul( qpitch, qtrick, qtrick ); - q_mul( kf_board->q, qtrick, kf_board->q ); - q_normalize( kf_board->q ); + /* angle 'correction' */ + v3f origin; + v3_add( av->sk.bones[av->id_hip].co, kf_hip->co, origin ); - struct player_board *board = - addon_cache_item_if_loaded( k_addon_type_board, - player->board_view_slot ); - - if( board ){ - /* foot weight distribution */ - if( state->blend_weight > 0.0f ){ - kf_foot_l->co[2] = - vg_lerpf( kf_foot_l->co[2], - board->truck_positions[k_board_truck_back][2]+0.3f, - 0.5f*state->blend_weight ); - } - else{ - kf_foot_r->co[2] = - vg_lerpf( kf_foot_r->co[2], - board->truck_positions[k_board_truck_front][2]-0.3f, - -0.5f*state->blend_weight ); - } - } - - float slapm = vg_maxf( 1.0f-v3_length2( s->state.trick_vel ), 0.0f ); - state->subslap = vg_lerpf( state->subslap, slapm, vg.time_delta*10.0f ); + for( int i=0; ikeyframes[apply_to[i]-1]; + keyframe_rotate_around( kf, origin, av->sk.bones[apply_to[i]].co, + animator->qfixuptotal ); + } - kf_foot_l->co[1] += s->state.slap; - kf_foot_r->co[1] += s->state.slap; - kf_knee_l->co[1] += s->state.slap; - kf_knee_r->co[1] += s->state.slap; - kf_board->co[1] += s->state.slap * state->subslap; - kf_hip->co[1] += s->state.slap * 0.25f; + /* trick rotation */ + v4f qtrick, qyaw, qpitch, qroll; + q_axis_angle( qyaw, (v3f){0.0f,1.0f,0.0f}, animator->board_euler[0] ); + q_axis_angle( qpitch, (v3f){1.0f,0.0f,0.0f}, animator->board_euler[1] ); + q_axis_angle( qroll, (v3f){0.0f,0.0f,1.0f}, animator->board_euler[2] ); + q_mul( qyaw, qroll, qtrick ); + q_mul( qpitch, qtrick, qtrick ); + q_mul( kf_board->q, qtrick, kf_board->q ); + q_normalize( kf_board->q ); - f32 l = ((s->state.activity < k_skate_activity_ground) && - v3_length2(s->state.trick_vel) > 0.1f )? 1: 0; - state->blend_trick_foot = vg_lerpf( state->blend_trick_foot, l, - 8.4f*vg.time_delta ); + kf_foot_l->co[2] = vg_lerpf( kf_foot_l->co[2], animator->foot_offset[0], + 0.5f * animator->weight ); + kf_foot_r->co[2] = vg_lerpf( kf_foot_r->co[2], animator->foot_offset[1], + -0.5f * animator->weight ); - if( s->state.trick_type == k_trick_type_kickflip ){ - kf_foot_l->co[0] += state->blend_trick_foot * 0.2f; - } - else if( s->state.trick_type == k_trick_type_shuvit ){ - kf_foot_l->co[0] += state->blend_trick_foot * 0.1f; - kf_foot_r->co[0] -= state->blend_trick_foot * 0.15f; - } - else if( s->state.trick_type == k_trick_type_treflip ){ - kf_foot_l->co[0] += state->blend_trick_foot * 0.2f; - kf_foot_r->co[0] -= state->blend_trick_foot * 0.15f; - } + kf_foot_l->co[1] += animator->slap; + kf_foot_r->co[1] += animator->slap; + kf_knee_l->co[1] += animator->slap; + kf_knee_r->co[1] += animator->slap; + kf_board->co[1] += animator->slap * animator->subslap; + kf_hip->co[1] += animator->slap * 0.25f; + if( animator->trick_type == k_trick_type_kickflip ){ + kf_foot_l->co[0] += animator->trick_foot * 0.2f; + } + else if( animator->trick_type == k_trick_type_shuvit ){ + kf_foot_l->co[0] += animator->trick_foot * 0.1f; + kf_foot_r->co[0] -= animator->trick_foot * 0.15f; + } + else if( animator->trick_type == k_trick_type_treflip ){ + kf_foot_l->co[0] += animator->trick_foot * 0.2f; + kf_foot_r->co[0] -= animator->trick_foot * 0.15f; + } - /* - * animation wishlist: - * boardslide/grind jump animations - * when tricking the slap should not appply or less apply - * not animations however DONT target grinds that are vertically down. - */ + /* + * animation wishlist: + * boardslide/grind jump animations + * when tricking the slap should not appply or less apply + * not animations however DONT target grinds that are vertically down. + */ - /* truck rotation */ - for( int i=0; i<2; i++ ){ - float a = vg_minf( s->truckv0[i][0], 1.0f ); - a = -acosf( a ) * vg_signf( s->truckv0[i][1] ); + /* truck rotation */ + for( int i=0; i<2; i++ ){ + float a = vg_minf( s->truckv0[i][0], 1.0f ); + a = -acosf( a ) * vg_signf( s->truckv0[i][1] ); - v4f q; - q_axis_angle( q, (v3f){0.0f,0.0f,1.0f}, a ); - q_mul( q, kf_wheels[i]->q, kf_wheels[i]->q ); - q_normalize( kf_wheels[i]->q ); - } + v4f q; + q_axis_angle( q, (v3f){0.0f,0.0f,1.0f}, a ); + q_mul( q, kf_wheels[i]->q, kf_wheels[i]->q ); + q_normalize( kf_wheels[i]->q ); } { mdl_keyframe - *kf_head = &dest->pose[av->id_head-1], - *kf_elbow_l = &dest->pose[av->id_ik_elbow_l-1], - *kf_elbow_r = &dest->pose[av->id_ik_elbow_r-1], - *kf_hand_l = &dest->pose[av->id_ik_hand_l-1], - *kf_hand_r = &dest->pose[av->id_ik_hand_r-1]; + *kf_head = &pose->keyframes[av->id_head-1], + *kf_elbow_l = &pose->keyframes[av->id_ik_elbow_l-1], + *kf_elbow_r = &pose->keyframes[av->id_ik_elbow_r-1], + *kf_hand_l = &pose->keyframes[av->id_ik_hand_l-1], + *kf_hand_r = &pose->keyframes[av->id_ik_hand_r-1]; float warble = perlin1d( vg.time, 2.0f, 2, 300 ); - warble *= vg_maxf(state->blend_grind, - fabsf(state->blend_weight)) * 0.3f; + warble *= vg_maxf(animator->grind, fabsf(animator->weight)) * 0.3f; v4f qrot; q_axis_angle( qrot, (v3f){0.8f,0.7f,0.6f}, warble ); @@ -3131,45 +3115,6 @@ VG_STATIC void player__skate_animate( player_instance *player, q_mul( qrot, kf_head->q, kf_head->q ); q_normalize( kf_head->q ); } - - /* transform */ - rb_extrapolate( &player->rb, dest->root_co, dest->root_q ); - - v3f ext_up,ext_co; - q_mulv( dest->root_q, (v3f){0.0f,1.0f,0.0f}, ext_up ); - v3_copy( dest->root_co, ext_co ); - v3_muladds( dest->root_co, ext_up, -0.1f, dest->root_co ); - - v4f qflip; - if( (s->state.activity <= k_skate_activity_air_to_grind) && - (fabsf(s->state.flip_rate) > 0.01f) ) - { - float substep = vg.time_fixed_extrapolate; - float t = s->state.flip_time+s->state.flip_rate*substep*k_rb_delta; - sign = vg_signf( t ); - - t = 1.0f - vg_minf( 1.0f, fabsf( t * 1.1f ) ); - t = sign * (1.0f-t*t); - - float angle = vg_clampf( t, -1.0f, 1.0f ) * VG_TAUf, - distm = s->state.land_dist * fabsf(s->state.flip_rate) * 3.0f, - blend = vg_clampf( 1.0f-distm, 0.0f, 1.0f ); - - angle = vg_lerpf( angle, vg_signf(s->state.flip_rate) * VG_TAUf, blend ); - - q_axis_angle( qflip, s->state.flip_axis, angle ); - q_mul( qflip, dest->root_q, dest->root_q ); - q_normalize( dest->root_q ); - - v3f rotation_point, rco; - v3_muladds( ext_co, ext_up, 0.5f, rotation_point ); - v3_sub( dest->root_co, rotation_point, rco ); - - q_mulv( qflip, rco, rco ); - v3_add( rco, rotation_point, dest->root_co ); - } - - skeleton_copy_pose( sk, dest->pose, s->holdout ); } VG_STATIC void player__skate_post_animate( player_instance *player ) @@ -3189,28 +3134,12 @@ VG_STATIC void player__skate_reset_animator( player_instance *player ){ struct player_skate *s = &player->_skate; struct player_skate_state *state = &s->state; - if( s->state.activity <= k_skate_activity_air_to_grind ) - state->blend_fly = 1.0f; - else - state->blend_fly = 0.0f; - - state->blend_slide = 0.0f; - state->blend_z = 0.0f; - state->blend_x = 0.0f; - state->blend_grind = 0.0f; - state->blend_grind_balance = 0.0f; - state->blend_stand = 0.0f; - state->blend_push = 0.0f; - state->blend_jump = 0.0f; - state->blend_airdir = 0.0f; - state->blend_weight = 0.0f; - state->subslap = 0.0f; - v2_zero( state->wobble ); - - v3_zero( state->board_trick_residuald ); - v3_zero( state->board_trick_residualv ); - v3_zero( s->truckv0[0] ); - v3_zero( s->truckv0[1] ); + memset( &s->animator, 0, sizeof(s->animator) ); + + if( s->state.activity <= k_skate_activity_air_to_grind ) + s->animator.fly = 1.0f; + else + s->animator.fly = 0.0f; } VG_STATIC void player__skate_clear_mechanics( player_instance *player ) diff --git a/player_skate.h b/player_skate.h index b09c68a..e5dde12 100644 --- a/player_skate.h +++ b/player_skate.h @@ -37,6 +37,9 @@ struct player_skate{ v3f trick_vel, /* measured in units of TAU/s */ trick_euler; /* measured in units of TAU */ + v3f trick_residualv, /* spring */ + trick_residuald; + float trick_time; enum trick_type{ k_trick_type_none, @@ -71,30 +74,54 @@ struct player_skate{ v3f air_init_v, air_init_co; - v4f smoothed_rotation; - float land_dist; v3f land_normal; + v4f smoothed_rotation; + } + state; + + struct player_skate_animator { + v3f root_co; + v4f root_q; + + v3f offset, + local_cog; + + f32 slide, + z, + x, + fly, + grind, + grind_balance, + stand, + push, + jump, + airdir, + weight, + trick_foot, + slap, + subslap, + reverse, + delayed_slip_dir, + grabbing; - /* animator controls which require persistence */ - v3f board_trick_residualv, - board_trick_residuald; - f32 blend_slide, - blend_z, - blend_x, - blend_fly, - blend_grind, - blend_grind_balance, - blend_stand, - blend_push, - blend_jump, - blend_airdir, - blend_weight, - blend_trick_foot, - subslap; v2f wobble; + f32 foot_offset[2]; + + v4f qfixuptotal; + v4f qflip; + + v3f board_euler; + v2f steer, grab; + + f32 jump_charge; + + /* linear anims */ + f32 push_time, jump_time; + u8 jump_dir; + u8 trick_type; } - state; + animator; /* animation /audio * --------------------------------------------------------------*/ @@ -121,7 +148,6 @@ struct player_skate{ k_skate_sample_metal_scrape_generic } main_sample_type; - player_pose holdout; /* * Physics @@ -169,6 +195,48 @@ struct player_skate{ u32 limit_count; }; +struct player_skate_animator_q { + v3f root_co; + v4f root_q; + + i8 offset[3]; + i8 local_cog[3]; + i8 slide, + z, + x, + fly, + grind, + grind_balance, + stand, + push, + jump, + airdir, + weight, + trick_foot, + slap, + subslap, + reverse, + delayed_slip_dir, + grabbing; + + i8 wobble[2]; + i8 foot_offset[2]; + + i16 qfixuptotal[4]; + i16 qflip; + + i16 board_euler[3]; + i8 steer[2], grab[2]; + + u8 jump_charge; + + /* linear anims */ + i8 push_time, jump_time; + u8 jump_dir; + u8 trick_type; +} +animator; + VG_STATIC float k_friction_lat = 12.0f, k_friction_resistance = 0.01f, @@ -256,8 +324,8 @@ VG_STATIC void player__skate_pre_update ( player_instance *player ); VG_STATIC void player__skate_update ( player_instance *player ); VG_STATIC void player__skate_post_update ( player_instance *player ); VG_STATIC void player__skate_im_gui ( player_instance *player ); -VG_STATIC void player__skate_animate ( player_instance *player, - player_animation *anim ); +VG_STATIC void player__skate_animate ( player_instance *player ); +VG_STATIC void player__skate_pose ( player_instance *player ); VG_STATIC void player__skate_post_animate ( player_instance *player ); VG_STATIC void player__skate_reset ( player_instance *player, ent_spawn *rp ); diff --git a/player_walk.c b/player_walk.c index e0cdbec..2c03843 100644 --- a/player_walk.c +++ b/player_walk.c @@ -59,6 +59,7 @@ VG_STATIC void player_walk_generic_to_skate( player_instance *player, v3_copy( v, s->state.cog_v ); v3_copy( v, player->rb.v ); + player__begin_holdout( player ); player__skate_reset_animator( player ); player__skate_clear_mechanics( player ); rb_update_transform( &player->rb ); @@ -78,6 +79,7 @@ VG_STATIC void player_walk_drop_in_to_skate( player_instance *player ) s->state.activity_prev = k_skate_activity_ground; s->state.activity = k_skate_activity_ground; + player__begin_holdout( player ); player__skate_clear_mechanics( player ); player__skate_reset_animator( player ); @@ -156,25 +158,21 @@ VG_STATIC int player_walk_scan_for_drop_in( player_instance *player ) float min_a = 0.70710678118654752f; ray_hit *candidate = NULL; - if( sample_count >= 2 ) - { - for( int i=0; i= 2 ){ + for( int i=0; inormal, s1->normal ); - if( (a < min_a) && (a >= -0.1f) && (s0->normal[1]>s1->normal[1]) ) - { + if( (a < min_a) && (a >= -0.1f) && (s0->normal[1]>s1->normal[1]) ){ min_a = a; candidate = s0; } } } - if( candidate ) - { + if( candidate ){ v4f pa, pb, pc; ray_hit *s0 = candidate, @@ -192,8 +190,7 @@ VG_STATIC int player_walk_scan_for_drop_in( player_instance *player ) pc[3] = v3_dot( pc, player->rb.co ); v3f edge; - if( plane_intersect3( pa, pb, pc, edge ) ) - { + if( plane_intersect3( pa, pb, pc, edge ) ){ v3_copy( edge, w->state.drop_in_target ); v3_copy( s1->normal, w->state.drop_in_normal ); v3_copy( player->rb.co, w->state.drop_in_start ); @@ -251,6 +248,19 @@ VG_STATIC int player_walk_scan_for_drop_in( player_instance *player ) return 0; } +VG_STATIC struct skeleton_anim *player_walk_outro_anim( player_instance *player, + enum walk_outro type ){ + struct player_walk *w = &player->_walk; + + return (struct skeleton_anim *[]){ + [k_walk_outro_none] = NULL, + [k_walk_outro_jump_to_air] = w->anim_jump_to_air, + [k_walk_outro_regular] = w->anim_intro, + [k_walk_outro_drop_in] = w->anim_drop_in + }[ type ]; +} + + VG_STATIC void player__walk_pre_update( player_instance *player ) { struct player_walk *w = &player->_walk; @@ -258,13 +268,14 @@ VG_STATIC void player__walk_pre_update( player_instance *player ) if( !player->immobile ) player_look( player->angles, skaterift.time_rate ); - if( w->state.outro_anim ){ - float outro_length = (float)w->state.outro_anim->length / - w->state.outro_anim->rate, - outro_time = vg.time - w->state.outro_start_time; + if( w->state.outro_type ){ + struct skeleton_anim *anim = + player_walk_outro_anim( player, w->state.outro_type ); + + f32 outro_length = (f32)anim->length / anim->rate, + outro_time = vg.time - w->state.outro_start_time; if( outro_time >= outro_length ){ - w->state.outro_anim = NULL; if( w->state.outro_type == k_walk_outro_drop_in ){ player_walk_drop_in_to_skate( player ); } @@ -276,6 +287,7 @@ VG_STATIC void player__walk_pre_update( player_instance *player ) k_skate_activity_ground, 1.0f ); } + w->state.outro_type = k_walk_outro_none; return; } } @@ -293,7 +305,6 @@ VG_STATIC void player__walk_pre_update( player_instance *player ) if( w->state.activity == k_walk_activity_ground ){ if( player_walk_scan_for_drop_in( player ) ){ w->state.outro_type = k_walk_outro_drop_in; - w->state.outro_anim = w->anim_drop_in; w->state.outro_start_time = vg.time; player->immobile = 1; @@ -304,7 +315,6 @@ VG_STATIC void player__walk_pre_update( player_instance *player ) } else{ w->state.outro_type = k_walk_outro_regular; - w->state.outro_anim = w->anim_intro; w->state.outro_start_time = vg.time; w->state.activity = k_walk_activity_lockedmove; @@ -314,7 +324,6 @@ VG_STATIC void player__walk_pre_update( player_instance *player ) } else{ w->state.outro_type = k_walk_outro_jump_to_air; - w->state.outro_anim = w->anim_jump_to_air; w->state.outro_start_time = vg.time; return; } @@ -326,13 +335,11 @@ VG_STATIC void player__walk_pre_update( player_instance *player ) } } -VG_STATIC int player_walk_normal_standable( player_instance *player, v3f n ) -{ +VG_STATIC int player_walk_normal_standable( player_instance *player, v3f n ){ return v3_dot( n, player->basis[1] ) > 0.70710678118f; } -VG_STATIC void player_accelerate( v3f v, v3f movedir, float speed, float accel ) -{ +VG_STATIC void player_accelerate( v3f v, v3f movedir, f32 speed, f32 accel ){ float currentspeed = v3_dot( v, movedir ), addspeed = speed - currentspeed; @@ -347,8 +354,7 @@ VG_STATIC void player_accelerate( v3f v, v3f movedir, float speed, float accel ) v3_muladds( v, movedir, accelspeed, v ); } -VG_STATIC void player_friction( v3f v ) -{ +VG_STATIC void player_friction( v3f v ){ float speed = v3_length( v ), drop = 0.0f, control = vg_maxf( speed, k_stopspeed ); @@ -364,8 +370,7 @@ VG_STATIC void player_friction( v3f v ) v3_muls( v, newspeed, v ); } -VG_STATIC void player__walk_update( player_instance *player ) -{ +VG_STATIC void player__walk_update( player_instance *player ){ struct player_walk *w = &player->_walk; v3_copy( player->rb.co, w->state.prev_pos ); v3_zero( player->rb.w ); @@ -603,21 +608,12 @@ VG_STATIC void player__walk_update( player_instance *player ) q_mul( transport_rotation, player->rb.q, player->rb.q ); rb_update_transform( &player->rb ); - - w->state_gate_storage = w->state; player__pass_gate( player, gate ); } rb_update_transform( &player->rb ); } -VG_STATIC void player__walk_restore( player_instance *player ) -{ - struct player_walk *w = &player->_walk; - w->state = w->state_gate_storage; -} - -VG_STATIC void player__walk_post_update( player_instance *player ) -{ +VG_STATIC void player__walk_post_update( player_instance *player ){ struct player_walk *w = &player->_walk; m4x3f mtx; @@ -681,13 +677,15 @@ VG_STATIC void player__walk_post_update( player_instance *player ) } else if( w->surface == k_surface_prop_grass ){ audio_oneshot_3d( - &audio_footsteps_grass[vg_randu32()%vg_list_size(audio_footsteps_grass)], + &audio_footsteps_grass[ vg_randu32()% + vg_list_size(audio_footsteps_grass)], player->rb.co, 40.0f, 1.0f ); } else if( w->surface == k_surface_prop_wood ){ audio_oneshot_3d( - &audio_footsteps_wood[vg_randu32()%vg_list_size(audio_footsteps_wood)], + &audio_footsteps_wood[ vg_randu32()% + vg_list_size(audio_footsteps_wood)], player->rb.co, 40.0f, 1.0f ); } @@ -697,27 +695,25 @@ VG_STATIC void player__walk_post_update( player_instance *player ) w->step_phase = walk_phase; } -VG_STATIC void player__walk_animate( player_instance *player, - player_animation *dest ) -{ +VG_STATIC void player__walk_animate( player_instance *player ){ struct player_walk *w = &player->_walk; - struct skeleton *sk = &player->playeravatar->sk; + player_pose *pose = &player->pose; + struct player_walk_animator *animator = &w->animator; + + animator->outro_type = w->state.outro_type; { - float fly = (w->state.activity == k_walk_activity_air)? 1.0f: 0.0f, - rate; + f32 fly = (w->state.activity == k_walk_activity_air)? 1.0f: 0.0f, + rate; - if( w->state.activity == k_walk_activity_air ) - rate = 2.4f; - else - rate = 9.0f; + if( w->state.activity == k_walk_activity_air ) rate = 2.4f; + else rate = 9.0f; - w->blend_fly = vg_lerpf( w->blend_fly, fly, rate*vg.time_delta ); - w->blend_run = vg_lerpf( w->blend_run, w->move_speed, 2.0f*vg.time_delta); + animator->fly = vg_lerpf( animator->fly, fly, rate*vg.time_delta ); + animator->run = vg_lerpf( animator->run, w->move_speed, + 2.0f*vg.time_delta); } - player_pose apose, bpose; - if( w->move_speed > 0.025f ){ /* TODO move */ float walk_norm = 30.0f/(float)w->anim_walk->length, @@ -730,126 +726,141 @@ VG_STATIC void player__walk_animate( player_instance *player, w->walk_timer = 0.0f; } - float walk_norm = (float)w->anim_walk->length/30.0f, - run_norm = (float)w->anim_run->length/30.0f, - t = w->walk_timer, - l = vg_clampf( w->blend_run*15.0f, 0.0f, 1.0f ), - idle_walk = vg_clampf( (w->blend_run-0.1f)/(1.0f-0.1f), 0.0f, 1.0f ); - - /* walk/run */ - skeleton_sample_anim( sk, w->anim_walk, t*walk_norm, apose ); - skeleton_sample_anim( sk, w->anim_run, t*run_norm, bpose ); - - skeleton_lerp_pose( sk, apose, bpose, l, apose ); - - /* idle */ - skeleton_sample_anim( sk, w->anim_idle, vg.time*0.1f, bpose ); - skeleton_lerp_pose( sk, apose, bpose, 1.0f-idle_walk, apose ); - - /* air */ - skeleton_sample_anim( sk, w->anim_jump, vg.time*0.6f, bpose ); - skeleton_lerp_pose( sk, apose, bpose, w->blend_fly, apose ); - - /* Create transform */ if( !player->immobile ) - rb_extrapolate( &player->rb, dest->root_co, dest->root_q ); + rb_extrapolate( &player->rb, animator->root_co, animator->root_q ); else{ - v3_copy( player->rb.co, dest->root_co ); - v4_copy( player->rb.q, dest->root_q ); + v3_copy( player->rb.co, animator->root_co ); + v4_copy( player->rb.q, animator->root_q ); } - float walk_yaw = player_get_heading_yaw( player ); - - if( w->state.outro_anim ){ + f32 walk_yaw = player_get_heading_yaw( player ); + if( w->state.outro_type ){ struct player_avatar *av = player->playeravatar; - float outro_length = (float)w->state.outro_anim->length / - w->state.outro_anim->rate, - outro_time = vg.time - w->state.outro_start_time, - outro_t = outro_time / outro_length; - - /* TODO: Compression */ - skeleton_sample_anim_clamped( sk, w->state.outro_anim, - outro_time, bpose ); - skeleton_lerp_pose( sk, apose, bpose, outro_t * 10.0f, dest->pose ); + struct skeleton_anim *anim = + player_walk_outro_anim( player, w->state.outro_type ); + f32 outro_length = (f32)anim->length / anim->rate, + outro_time = vg.time - w->state.outro_start_time; + animator->outro_t = outro_time / outro_length; if( w->state.outro_type == k_walk_outro_drop_in ){ - float inv_rate = 1.0f / w->state.outro_anim->rate, - anim_frames = w->state.outro_anim->length * inv_rate, + float inv_rate = 1.0f / anim->rate, + anim_frames = anim->length * inv_rate, step_frames = 12.0f * inv_rate, commit_frames = 6.0f * inv_rate, drop_frames = anim_frames - step_frames, step_t = vg_minf( 1.0f, outro_time / step_frames ), remaind_time = vg_maxf( 0.0f, outro_time - step_frames ), - dop_t = vg_minf( 1.0f, remaind_time / drop_frames ), - commit_t = vg_minf( 1.0f, remaind_time / commit_frames ); + dop_t = vg_minf( 1.0f, remaind_time / drop_frames ); + animator->commit_t = vg_minf( 1.0f, remaind_time / commit_frames ); walk_yaw = vg_alerpf( w->state.drop_in_start_angle, w->state.drop_in_angle, step_t ); v3_lerp( w->state.drop_in_start, w->state.drop_in_target, step_t, player->rb.co ); - q_axis_angle( dest->root_q, (v3f){0.0f,1.0f,0.0f}, walk_yaw + VG_PIf ); - - m4x3f transform, inverse; - q_m3x3( dest->root_q, transform ); - v3_copy( dest->root_co, transform[3] ); - m4x3_invert_affine( transform, inverse ); + q_axis_angle( animator->root_q, (v3f){0.0f,1.0f,0.0f}, + walk_yaw + VG_PIf ); - v3f anchored_pos; - m4x3_mulv( inverse, w->state.drop_in_foot_anchor, anchored_pos ); - - v3_lerp( dest->pose[ av->id_ik_foot_r-1 ].co, anchored_pos, - 1.0f-commit_t, - dest->pose[ av->id_ik_foot_r-1 ].co ); - + v3_copy( w->state.drop_in_foot_anchor, animator->foot_anchor ); /* the drop in bit */ if( step_t >= 1.0f ){ v4f final_q; player_walk_drop_in_overhang_transform( player, dop_t, player->rb.co, final_q ); - q_mul( final_q, dest->root_q, dest->root_q ); - - v4_copy( dest->root_q, player->rb.q ); - v3_muladds( dest->root_co, player->rb.to_world[1], - -0.1f * dop_t, dest->root_co ); + q_mul( final_q, animator->root_q, animator->root_q ); - skeleton_copy_pose( sk, dest->pose, player->holdout_pose ); - player->holdout_time = 1.0f; + v4_copy( animator->root_q, player->rb.q ); + v3_muladds( animator->root_co, player->rb.to_world[1], + -0.1f*dop_t, animator->root_co ); } return; } else{ - v3_muladds( dest->root_co, player->rb.to_world[1], - -0.1f * outro_t, dest->root_co ); - - skeleton_copy_pose( sk, dest->pose, player->holdout_pose ); - player->holdout_time = 1.0f; + v3_muladds( animator->root_co, player->rb.to_world[1], + -0.1f*animator->outro_t, animator->root_co ); } } - else{ - skeleton_copy_pose( sk, apose, dest->pose ); - } - q_axis_angle( dest->root_q, (v3f){0.0f,1.0f,0.0f}, walk_yaw + VG_PIf ); - q_mul( player->qbasis, dest->root_q, dest->root_q ); - q_normalize( dest->root_q ); + q_axis_angle( animator->root_q, (v3f){0.0f,1.0f,0.0f}, walk_yaw + VG_PIf ); + q_mul( player->qbasis, animator->root_q, animator->root_q ); + q_normalize( animator->root_q ); } -VG_STATIC void player__walk_post_animate( player_instance *player ) -{ +VG_STATIC void player__walk_pose( player_instance *player ){ + struct player_walk *w = &player->_walk; + struct player_walk_animator *animator = &w->animator; + struct skeleton *sk = &player->playeravatar->sk; + struct player_avatar *av = player->playeravatar; + + player_pose *pose = &player->pose; + v3_copy( animator->root_co, pose->root_co ); + v4_copy( animator->root_q, pose->root_q ); + + float walk_norm = (float)w->anim_walk->length/30.0f, + run_norm = (float)w->anim_run->length/30.0f, + t = w->walk_timer, + l = vg_clampf( animator->run*15.0f, 0.0f, 1.0f ), + idle_walk = vg_clampf( (animator->run-0.1f)/(1.0f-0.1f), 0.0f, 1.0f ); + + /* walk/run */ + mdl_keyframe apose[32], bpose[32]; + skeleton_sample_anim( sk, w->anim_walk, t*walk_norm, apose ); + skeleton_sample_anim( sk, w->anim_run, t*run_norm, bpose ); + + skeleton_lerp_pose( sk, apose, bpose, l, apose ); + + /* idle */ + skeleton_sample_anim( sk, w->anim_idle, vg.time*0.1f, bpose ); + skeleton_lerp_pose( sk, apose, bpose, 1.0f-idle_walk, apose ); + + /* air */ + skeleton_sample_anim( sk, w->anim_jump, vg.time*0.6f, bpose ); + skeleton_lerp_pose( sk, apose, bpose, animator->fly, apose ); + + if( animator->outro_type ){ + struct skeleton_anim *anim = + player_walk_outro_anim( player, animator->outro_type ); + + f32 outro_length = (f32)anim->length / anim->rate, + outro_time = animator->outro_t*outro_length; + + skeleton_sample_anim_clamped( sk, anim, outro_time, bpose ); + skeleton_lerp_pose( sk, apose, bpose, animator->outro_t*10.0f, + pose->keyframes ); + + if( animator->outro_type == k_walk_outro_drop_in ){ + m4x3f transform, inverse; + q_m3x3( pose->root_q, transform ); + v3_copy( pose->root_co, transform[3] ); + m4x3_invert_affine( transform, inverse ); + + v3f anchored_pos; + m4x3_mulv( inverse, animator->foot_anchor, anchored_pos ); + + v3_lerp( pose->keyframes[ av->id_ik_foot_r-1 ].co, anchored_pos, + 1.0f-animator->commit_t, + pose->keyframes[ av->id_ik_foot_r-1 ].co ); + } + } + else + skeleton_copy_pose( sk, apose, pose->keyframes ); +} + +VG_STATIC void player__walk_post_animate( player_instance *player ){ /* * Camera */ struct player_walk *w = &player->_walk; struct player_avatar *av = player->playeravatar; - if( w->state.outro_anim ) - { - float outro_length = (float)w->state.outro_anim->length / - w->state.outro_anim->rate, - outro_time = vg.time - w->state.outro_start_time, - outro_t = outro_time / outro_length; + if( w->state.outro_type ){ + struct skeleton_anim *anim = + player_walk_outro_anim( player, w->state.outro_type ); + + f32 outro_length = (f32)anim->length / anim->rate, + outro_time = vg.time - w->state.outro_start_time, + outro_t = outro_time / outro_length; player->cam_velocity_influence = outro_t; } @@ -857,9 +868,7 @@ VG_STATIC void player__walk_post_animate( player_instance *player ) player->cam_velocity_influence = 0.0f; } - -VG_STATIC void player__walk_im_gui( player_instance *player ) -{ +VG_STATIC void player__walk_im_gui( player_instance *player ){ struct player_walk *w = &player->_walk; player__debugtext( 1, "V: %5.2f %5.2f %5.2f",player->rb.v[0], player->rb.v[1], @@ -881,16 +890,17 @@ VG_STATIC void player__walk_im_gui( player_instance *player ) "metal" } [w->surface] ); - if( w->state.outro_anim ){ - float outro_length = (float)w->state.outro_anim->length / - w->state.outro_anim->rate, - outro_time = vg.time - w->state.outro_start_time; + if( w->state.outro_type ){ + struct skeleton_anim *anim = + player_walk_outro_anim( player, w->state.outro_type ); + + f32 outro_length = (f32)anim->length / anim->rate, + outro_time = vg.time - w->state.outro_start_time; player__debugtext( 1, "outro time: %f / %f", outro_time, outro_length ); } } -VG_STATIC void player__walk_bind( player_instance *player ) -{ +VG_STATIC void player__walk_bind( player_instance *player ){ struct player_walk *w = &player->_walk; struct player_avatar *av = player->playeravatar; struct skeleton *sk = &av->sk; @@ -904,8 +914,7 @@ VG_STATIC void player__walk_bind( player_instance *player ) w->anim_intro = skeleton_get_anim( sk, "into_skate" ); } -VG_STATIC void player__walk_transition( player_instance *player, v3f angles ) -{ +VG_STATIC void player__walk_transition( player_instance *player, v3f angles ){ struct player_walk *w = &player->_walk; w->state.activity = k_walk_activity_air; @@ -920,12 +929,10 @@ VG_STATIC void player__walk_transition( player_instance *player, v3f angles ) rb_update_transform( &player->rb ); } -VG_STATIC void player__walk_reset( player_instance *player, ent_spawn *rp ) -{ +VG_STATIC void player__walk_reset( player_instance *player, ent_spawn *rp ){ struct player_walk *w = &player->_walk; w->state.activity = k_walk_activity_air; w->state.outro_type = k_walk_outro_none; - w->state.outro_anim = NULL; w->state.outro_start_time = 0.0; } diff --git a/player_walk.h b/player_walk.h index 3e450bc..e1e0755 100644 --- a/player_walk.h +++ b/player_walk.h @@ -34,28 +34,35 @@ struct player_walk{ k_walk_outro_regular } outro_type; - - struct skeleton_anim *outro_anim; double outro_start_time; int jump_queued; f64 jump_input_time; } - state, - state_gate_storage; + state; + + f32 move_speed, + walk_timer; + + int step_phase; enum mdl_surface_prop surface; struct skeleton_anim *anim_walk, *anim_run, *anim_idle, *anim_jump, *anim_jump_to_air, *anim_drop_in, *anim_intro; - float blend_fly, - blend_run, - blend_walk, - - move_speed, - walk_timer; - - int step_phase; + struct player_walk_animator { + v3f root_co; + v4f root_q; + f32 fly, + run, + walk; + + v3f foot_anchor; + enum walk_outro outro_type; + f32 outro_t, + commit_t; + } + animator; }; VG_STATIC float @@ -80,8 +87,8 @@ VG_STATIC void player__walk_register(void) VG_STATIC void player__walk_pre_update ( player_instance *player ); VG_STATIC void player__walk_update ( player_instance *player ); VG_STATIC void player__walk_post_update ( player_instance *player ); -VG_STATIC void player__walk_animate ( player_instance *player, - player_animation *anim ); +VG_STATIC void player__walk_animate ( player_instance *player ); +VG_STATIC void player__walk_pose ( player_instance *player ); VG_STATIC void player__walk_post_animate( player_instance *player ); VG_STATIC void player__walk_im_gui ( player_instance *player ); VG_STATIC void player__walk_bind ( player_instance *player ); diff --git a/skeleton.h b/skeleton.h index dc506ab..2be9a9a 100644 --- a/skeleton.h +++ b/skeleton.h @@ -134,13 +134,13 @@ VG_STATIC void skeleton_sample_anim( struct skeleton *skele, float time, mdl_keyframe *output ) { - float animtime = time*anim->rate; + f32 animtime = fmodf( time*anim->rate, anim->length ), + animframe = floorf( animtime ), + t = animtime - animframe; - u32 frame = ((u32)animtime) % anim->length, + u32 frame = (u32)animframe % anim->length, next = (frame+1) % anim->length; - float t = vg_fractf( animtime ); - mdl_keyframe *base = anim->anim_data + (skele->bone_count-1)*frame, *nbase = anim->anim_data + (skele->bone_count-1)*next; diff --git a/workshop.c b/workshop.c index 5deb5c4..b048af9 100644 --- a/workshop.c +++ b/workshop.c @@ -899,11 +899,11 @@ VG_STATIC void workshop_render_player_preview(void){ struct skeleton *sk = &localplayer.playeravatar->sk; - player_animation res; - res.type = k_player_animation_type_fk; + player_pose res; + res.type = k_player_pose_type_fk; struct skeleton_anim *anim = skeleton_get_anim( sk, "idle_cycle+y" ); - skeleton_sample_anim( sk, anim, vg.time*0.1f, res.pose ); + skeleton_sample_anim( sk, anim, vg.time*0.1f, res.keyframes ); q_axis_angle( res.root_q, (v3f){0.0f,1.0f,0.0f}, VG_PIf ); v3_zero( res.root_co ); res.root_co[1] = 200.0f; @@ -913,9 +913,9 @@ VG_STATIC void workshop_render_player_preview(void){ v3_copy( res.root_co, transform[3] ); /* TODO: Function. */ - skeleton_apply_pose( sk, res.pose, k_anim_apply_defer_ik ); + skeleton_apply_pose( sk, res.keyframes, k_anim_apply_defer_ik ); skeleton_apply_ik_pass( sk ); - skeleton_apply_pose( sk, res.pose, k_anim_apply_deffered_only ); + skeleton_apply_pose( sk, res.keyframes, k_anim_apply_deffered_only ); skeleton_apply_inverses( sk ); skeleton_apply_transform( sk, transform ); @@ -1023,7 +1023,7 @@ VG_STATIC void workshop_render_board_preview(void){ sizeof(struct ub_world_lighting), &world->ub_lighting ); render_world( world, &cam, 1 ); - struct board_pose pose = {0}; + struct player_board_pose pose = {0}; render_board( &cam, world, board, mmdl, &pose, k_board_shader_entity ); render_board( &cam, world, board, mmdl1, &pose, k_board_shader_entity ); -- 2.25.1