XHH o`M_ri7X ( @ (//(  0/80@0?/8 0( ?G@POWOXOP?H0@/7@O_``h_hPX 0(P_oppxow_g@O/8'' 7p`o?G/7 0??H/8`/o?GOX@H0?/pOW?H/8 7OP?G/7( P0@PX@O0@ 0O @H/@' 00@@P0?'_OP@H( 7/7' ^^^^^^^^^^^^^^^^^^^^^^^^^^TeeBBBBeTT^^^^^^^eBDJ33333JJDBeZ^^^^TD33==#####==3JDBT^^^^eJ=###=3DeZ^^TB3# #=3JBZ^^T3#  #=JBT^^J# Sll #=JBZ^T# %,68??86,/@A*< ##45('.6787-9%:;*<=#$+&,--.,/01)2 3 $%&&'%($!)* ##  !"#     ??d`̙@7spr_FPS_horwall  Hxs5cf3 b bF TL)JTq*@s9Pn- G:|4M:2spr_FPS_vertwall  Fxs5cf3 b VbF T!4.T TEI !*5*>*N qDDēnsspr_FPS_camera  xs]f@P /ʣ2ѠKā<#> S  T *ahۈK# 4ͩŝ06AK!h$(#FDH4 @Wn$Z/?YJuspr_FPS_pillar  ]xs]f@P /ʣt`U 4K zш ^#v 9FG@ 3Kz&b spr_FPS_logo  {xs]f@P /ʣ2ѠKAa?$$HXo=.dS/F\!` b(D%h) qՎW#f"VjG8 u z;6spr_FPS_bullet Pxsf@P ?48C Y@  a $] Q`SPųֵd^3 spr_FPS_ball  axs]f@P /ʣtt M/DX zqB3S/1ѴCY;zI>nz*mP)G_ c back_rainbow@@ &xMzy\SWCI10TQ)UTKR8[pBD@DDAhI !Pjujy:UBp2o~>ϳCk_(m/y6κgeXeb, 0~B̊/x|ukdI/Oo4.0F4Fg2F0D5.g0~fX_]Fa6st\}[y/y !sjc>1~ vr?ZmtL"qIj¦kA 11".pwxiypg]i]mĜ F翙K0LeT;%J9fD|qTüIƨ&Kb b~uid2fi;Ht|{`ͮ/u㭈̛h^:tӢ0cLEɱĤ&fĄe$[@,$Vu3;} ǼӲgyifyNBn 7LM 3IWb<+<ͱ֕f1Xznf&x\RdyAԋR4 ݇WKq5O#C(M nJS3}x*'H4ЗIӦL`=꿙F|5eCkxnmnF؄lX^9/w"I*wNOzr4eZ@?z ֣}t}$&|۽mF8Yk2|tY u^>(8=udhsrC4Y|4!eJFL"AA_3`7c촗fs&eᏋ^ 8GUA)ID[:7mt>2x6lFBxKdokM?Զk鍛_T|q]g2(l+C^p?a[md`q/?w^[GْEK=ŏ_EETď~ֲodG]_p}oجm]žO~~s|Iߣ`5 {TL~p :[ӣ5﮹{?}= AG d>$۾mﲅ ]Gt.xs+H/vhyg5]wb=1`Gq3ȕ3/rPpowo,ugx]-wnk^ٳѺk'@ׂyOjf>?7 #Hcy^dK&$^qc+=sٯʯna^q{yϱ!oqןK@uBۄQ>Z~wE/T,kg xq—<77!m/vW;зGvw*Q׎gPUo~٣XB{z# =ڰڊl"ݵ=>Xm=;ŋW5%owU)|jXŝĹ-erz |+Ʋwt󏯶(^nҥKVd$zog=Bһ]tu7Q#m,aq}/zyo z`kŧkE?p.⋍ןW"yX1x])W+K,)x xAdg7bo_ӾaST.( y{孇kvhN:N\>Ј} v4B8 Vy{_VݹwgwXֻ]4^ ;oC*A^o}.R'5 /ÁIbMJfVHvYBmǛZv Ǖ _ӍxCҷ? hVU`(5Wku)-DQߎMv_% n(k7_K^+>`0z^r]a xEݮKm&Rk@jC}I'`PyrZF> T%7%Oo/n_|o=l{MP\9xNZ0ZI.P'jWi hhQ£U]Kn ȭG~o{ KBCH֪ODO/$Iޘq8xYZJ912xp [rʐZGiD*C"y:g$b;ى; ן[[Qӷb@I5XuB=t:{<ԧK9K epgxQOeʻ+:/vH}HnR561hA6IVE$ׂ.^T bƴR]i]FPzzߡM@LU<I6N|8GSS3xEXޟ8šDV}si'P)GOW+XxxC5+V~_ɻ]}{ J4.i*2qpTsp.+K!=fUciCI(:P:zYr1c<:>Ne4iLJH*]Ї/* G/!&H ԚڴڌӪ3Ө]}59J4Ⱥ#/'$:6ꌩycDZ:- Jƺ[_'AuJP&#Id ¦3 ykע}vRgWDJG˽Hhz @/3h6uq_HmʳP.6 >ӎVU ț:Zy(sĎ6 +xnY4:&9K}8u[jN?Xk]i_GlEحCI(2T»A%ڣaJJOe%KH9_'6q_бMV,U.E CIa6VKO X/pKl *Fov)$2Zv,HdqsǑyq!w#kr~81aaJxTGuY>7~0#A

x_%^GU8XWJVGpQ2Hj =PRsr.385pME l TR燩΄ wBn%"E j~PL)tC4p(fd89)ERO}VzK=Q2R/]ߟ>=RBéP 9# '!0t>Tw!H>Ƌ"3A<{.zZʓ0Duy@s>&#\0 QF/pdهMDǕl!NP_Էv_/{_>{aIgV֣9qoѦd 5%A!eJV%KuCd)SUʓ^_| OY}w<<d?LQ~ Fd|6o?{x8J2wyg{ln]?{-^ձ/Y1ya{g(⻋pM di)w䖗.K*U+.^vhJܞ^qC!\zPUWחwb>s:[\oI{nVlx^tATs򢄑zP΋A/} .<,w}TA_+0ޯ~X >x=<ϻ]U Yjjxe3 U_FrTyA1H (~t>ΐlקH}J8w+X+\h)ōqE\XCBuN?:/WKWȓ]sҋkU$T5V7^e3cWI5=u,gXehP,ry"5?8$弪znv9i`bd\P;\㊰Ava/5\yf]X)RGasxQ- 0]u+5.P)WçcLj`6\wa[U{E Dk;dqyWky*^Ui>fRssHJo9 N!J }Ť5M5M<] 52j476;}'hdى"Vvr8l@T!LpN ʩqD=[s ] E|.Ƞ"){5,όЦ I,niv&n@C8Ot2.qƫzVbk5 [D6V:z{{3fHW]j5ӍÍHf.3RQmgo8Ǵ0fi"*dR*RZ8(@^" D r洱$EvN8N8l5';Mݾ^Σȣ(H4F*w2Fɶ#FQ۬UPQȆmì Td9272"[HGvmkhU6jljg(fD,5ZH!LR:Lv;>k޴z?#;_8s?η E#Mi`=FVW0U9}lW"ql9ãFS > ;?UH샹tE>oLE3_}CH7:ʒțG&oW;hN{Q-UEߢ/zVwe")~۪T*i& ]#V%Mvm4y]vNɐnˎ3U4uGS(CmZ-t0Mh YŎh* Г${⼱4QM,AvA*O>b=fJ_0% AkԌPU 96iz&_*=)QCo{Bk┛h bbн4Ldc.lo47:~:..#Ⱦ.]Ani5FLjHP-͐ Fq~(~F ìfma A F0lGr3: -*lNjT[WJ+ YMC^ףſ3iMJjmt3h2#+r- pNynVmԍ&yZW| 'GhqpoW_Tl&Uw9o'Gn[bTWf:j??#+NSovԙXMX׏X}3ݣ#'-gzUdj Zs$Ф|Dp&3@ob4j~aWUv% FUbbZ[s%Zf`"E5y@ TLF e º V/aJj">)ao?11E:FSf D6NHL30sTerKķg [gNwb 1!Oel-<1Ds6swMEذMddc&ÄM:/{G8%ьi9.1-z _aZb"z13bz.4#L lZ;ql{..br4+8]o0q o K,z1wh6:P8;vxjU'C3)3JJ4OGeYx|c5Ata 5ŒB 8h:y6ɴ&F4B3!KjBbi"sT)zaf9[ 9 RM׆E#>@1#B9]Fd $3ZA/ e>څS ѡSg$:e8v{2pZ}e@hA`ny֗I@("SSlC-|Yekm%}{ЌML]L'h#"us G"ߕ;hIT:^cwc̹W?ߟ~?|~??S_6?=l?hlov;[iۗ˥o_÷ڧmO;lNҎo*Z bWr?~tv\_}}o\m'{""=jĘxI#_Xr0W@Ɩ~#sz>y&mg8`ˀMѾ!vhj?G{#v;GvV(d@W.+ vg#HuE9ʖl3Fd8rmT#|l!gDS7wF0bG=S{QĈڙ%څ( ]m[V>OQ\5F2Ha<N|"\VT=jwcd~7·^EODr9-CȦ FPZh[&9a;M(>q3=0m\Ƅ+~ʅp{$=Q?_Es-YY}1Ov\ AdhlϙgD,m\n2fdp}C<++ OxN|N!X11*#؍Oʽ!v t ~06e(@SOAI۰>hZDz: |F7,$o9h{%wsۉh[9Q2/n'}F$nsùgm0&>*6Clz1h#'3TTH;mwUb^f "hA8CC$GrP<x(sZ;ZڏOS@.ʑ6&#ʝ VfT^+Chд;t,&k9|f0l_eZO].awTS$ 2ϥ,bDϏn禟8mW 2 _Bخ[{ n)8l?pkTѦ|ipijS7qNqJ8bXA9^%)!n"(uAXɜgqoX.G} T4o!0%4];\ 6ќ9$E HjO|#⍗Xe\S^FB-͠`B#uDb 0jo$ weipf< @GXE}mJ|?{Oq"0!@G' ,|"_|\[y|TyL| 'cDQ#K;jN\VlA@ؠ931%,52AR:VC>2q (哀82"j=}pb(Iy!C,{΃XsEAWكl=/5c_fb3̈́ u?t8G4uDI9"ՙm;acݖn';j3p!3LWΰaiLx^YS}\{:ɏ/ GFԸ&gl?_tCC3PGbuL)6Xe@ylcgiIed 77ZY!:v*jI! @𛑶[->?o|il&5%©K0Q1cw,3 yW?/( (Ó G_|>P*Zgb0?Wt%ܭ#^mNhy>,Pǎ:feP@| D˭;Z<Ĉy7ꖈ` ^w!m<-*́ ywY=mA'mFִ^r}\: \vAAsg9dD2^б =(%D;7sEY#%=sdkaWH=#8R,+͔uWr~ e=wTrh#d)Zձt<-}yRs)#|ZmO_!#hE ?$L$⿘dX$f,cx}[}|Y' eO&Cn =V8sKξk1\A%#_c8JVxv@,+g0(G!, 2SڀRzgT)vcؐ0jiET$[Lxm̧Jb u^`$vpW@Ñs:6qdfUY?zRP͡AB"/Ծ _P76EN)5\Ц$Lυ\̿,9\/H, dC&wQȜzĽw˸ogmk k5&bKh"T9pp9{+׎A>୧N#N]Ű8Ƕs,eDL}g,^lSb{v:@gVW$-8풋 Y6.;@_FVB6tK?P B8?F-сxqu5U- ӹjbYqǎT@{R ~`tN=9Cjw)_{sMUH? Ծ2tƈ.>_M\ˊ7;WL el69ǎ"UM('pAxxKÚCX|ιE\Pأg멜!~6Rl`ΆU8I*nſSǚ95?zԬQ/SXmkq2[?}P Y^a58gO:Deb8鏝O=?׿ z %3 eVfVRiA;zHyRf?vwiKp0͙9i(KP2> T -<3(KIM4*h'OgqVm䄸tu͈>C,?Gt6[4I8v_#S\PȜ1iZM4j|K }m$Xt;߀(}*4 ϰ68!XPN-B"F`)$G}!Ăc\tW3__eG,>N^픘k\B>LjWlm"z \Oug :|5GdA1/3BuN eX, Ob̷Z-sp5:Gո##V^;N cH.v)qMݒ3eg0S:O:V|1S3" #59ýZ$~ATfLe1E#j gy>R3!(b>|Yg/Z̉՜S*5#~j1Hs6WnRJv&$ˡ֝x3.j|jNKfsl>):*X1_D/}瀯cs| dir$m ӆ}~0E1#zGXѾk|ҌZ4z G0x$|$yX#[we9{f&xwEZWyAV؊4#cP(zU"m[ _?`veCmtW ǜ{#!~3WU "wJ=>@;)ֺcA"^FvW*uN2"P-{` eߕ<=lLRN~>y\~x_ldydѱq'yŭYn v%nR9&cљONǟxSY3{rohS!r"q3MUsFx׾R(5@=&uӲ-;WO]A!+HωYnxW;./N%Iq={] ZZ_W/c'ͤZn^}=o7))^bT"qN礀 -,jto<>ҤA 6~uKKhK8vy=kd{g0IWonێN%+3rrd^1vif?rK̚#oUد2}Ab^qwX(8ОnwmҪi8+{g.KMi>R*E3\B͒m} *dxs#+Q,T߹ DvKES$s8N ]ع}h6HP$S_^w[&\8LG;Wkj}l];:rM ~ <K8f"y\>M[vZEmveʔ4-!cQjd s{ a|Ҙpfa#%<'qWԄ"IHSS Z7.)J˃Z]0*1^a$م:5D#{k>Skǥtl-(}͋>D X6v:&O8^\Kᢢ3ܔ6L$ݩJFeul+GԡpPq11Xpg"=5`F+jRC[_'j ϚG|"_@ͧ /y<n<0#@WW88n1 ]y=e\q2]$b#ŋBlMn5k"M_&ǃ읒o+Ndl;1:4];-B8IȾzsJ !Oy}x;M+*VEG!.tL kᐭp\=fyY-Dl?1aAgXG(zlYLr{\, K@,j! 0gX)Y{"=T0ae5L65-ϊw^ͷqa9+nFpk_&uJ{@{ogf2}':H +>MF3ojFI8emS{m#2ѩXpJ/WP՗^Y-Ƴ/ C:'\yD3@ӽ8"8b} >c=U}D1g p:sF]'l #pC+ªW+v|vM_GrUwAcae Jc1p?4Qd'0qc(i{=UqqT*Cӡ8}j},R*ۊ5  tv;levѐkud9 M?G/! 7MՔ"ģq(̽˖.H˴2Hކ` O+,Vyw9819{> nbUsd 3 ݽ,ɬgzUK_YqΧJgZzm?2 .ș^Ѓp*&c nqO_}^Ml,!ٯ2SíCci۹˂Be܄|6Eg^!,'aE]taaEy"(8ViyAh NCcԸe&^9E:w]`͟@c@Fw1^ / rQPKv 8{Ȗ>7ORtn;( X{ ^{C `w}G1/3!0fu"`:.<<׈sc'27B[nxQ zv8&FQrtj AvOoE`I WlPۘ5jANM0 ADIֲ'J=:$sgKXbGX1 ;I69NwEOyfJ0n|SҨrW5yI E,1Zgb2‰.ppZ !n}MvG܀?°lS`JVn`9rϏbo})8ُ9XC3! *~gھv-u/ c(7IüyZO:%C*y!S5txۀ[go msHl{v|">?X`9 } #0͸tQ੎ F"%6. ߦ6s;h@ |Ko}ZP$X%1tm:⬊󁗾9L؋uIJĿIBco[ T, I]joHuӯ<w5dW% n~[(y^5Ue^?_s/^xka^n@|m7:~ɛ6 w忻XiF}M+t%<0>?GڱojLUq4BaiwԾfO u❪Y2 lO5H5b3K[Fֲ.(B~bh>Pz 7uжcSՋ/cx tr9"gL>20Th{φ3+~cb"! DR6*!9=+h6_ _2sE4deVl,%_|Wʑ| E/۸ay_Ҭs]Wqe_\K JE#fgA@e,kAAoZ*}K{j,Q + X so,ףVMØQ8ãRN_ nǝ[0yd(1r]zM(x7 _Ln#%JT=#s:F,oV&e(~[s|VmOoS6vŕmSuZ?0WDJ۴Yq"sw|ASofPIl>)& go^%s}J1pDO?jC w>pfs ./ {*>쳁8#t @"<> 4am+lW#Y(;Lk2oqfGN!NBH/՟@8-g%ʯ1avʚK8  ic簕$#scGQ֮z{ahx PE+snZܿPY{5xfZ[1IJrhR5VOq<:2FzfEtnh{?<>3am0}ǞˈK3be _ePucݵ!xG3KU";Y(Ӹ*6NG3F`*ݧjҜZ^{;_9aQ&2 As (db#ȿ ^ha]hǢlP md7lVk\J,rWB}8⮦ұ.oQ]d~iidY<2# b}RRc`EHxuKۘI޷ 3oOzr9ۋwlבxhq EieL^Gqϙ| mz>?Fo6"*uޞq_eS}>?蠏I8:~6xw~M;'KƦzgIWW:r2xqN&WGޏO#?iEK꠮sv50:wq}<;~n mol}NMgAП'nT O|_+ lH|@5L8Wtep[ a h2u^.~ܢooNNK&x~ +beE~o|jk ~j=}y/~ NNqDbntu$wޜ]h{{oi'$hܺYꢊ?MBouOy'i*r$2kpu >rIZ?yGYثcD'pBtWK.0Pß֐O姎ތM\y#73/z :u"xڍ+[D'>[8[MW K$Pk'py$t$Vmuݸos.'FN/NFWڴs:9iS\DҦΗ*dS'Hx\vråKϲ^m'WSm ɓeU0?!h<ߥ0䮮|>z$b:b:q];Mop qt=}5{3֟f["s7/Z5! 4}3y.Wڴk_3Bڑx#~W$}G9rm@5ntyz/z ddAjO=ѣ.Fo~ҭV~W-n~m7^NJ[Aou>?>}ҫNiǏz[63j:sthcGoKu6Gç'ι]Gt\'?>nw?j<=lϟ}ӶIoW:w᠓Oz]6:tBwwj>>nom$zz LOn'廫ٻtuIŢ6j|u>]^nNG.ztq۳tk?:itP'1F @XudmR^^uKΧ aCPGEa [8b^y8S;/NuiGwm[X{ul՚;s;hݺzzIro'p:;q4A/C: D¦XLJwմ?י:B-jgϟ'}D߮+Rҁdŧ%_,~"lURµ$~~Apl67}//v; FTxZP| Bidv6_Vci,h\HJ#eKX0ZmGRiGoA~;ս:M6;vO0Zz}7?uwuWn>}?#ma>0BdBuбB NGK|W[Jm&Kޢ{mlWkzs8u׽@xk_;ۧϛOÃzBAqx;H-H?!YK)MѫMGw}4۩.__۵۴ǯ:?ݱhg9tޖ^B:8A *DĴmW[zZ5v;{ݷ_ 9hU:Voorv2lno۷l! ţgݷݮԑ/Zz_>#%&Z#{X¿~{3Z.6|0]^iJϦ5-abswt[_HJ&[mz'm^oon {2q13ᓶY%l:_GfXT= . @ Xr}@oub tZT9׫ f_OAL -1xIߎodbI)Ӿ#3C2QڑֆjR}^~!^C=\Uv{Rb~ӴiOxBn5/#)96l-p|EVG۲šϏo oBouY)7gf/MZ((Wˋdv88ecV,ގflwy, #B H韴魞&k^.WVX-voZ{}K6[Bҽ>Q\>K|^>+#,=ڼhdEߩ%{Cx, $KrLtu-;,Dp9ZjB#uL,,@_v0ڱ11cY@.zL%m> 0s񳐏ݎ!z@WzN6_߱O{9z}S°&Kt2W>M? ^Xr{+XyI%#s1 oFfޥۅ|Y:~/kG8׫DA #WE 1T*Pa衃[F2a hi&(ϲr]綅tAR'}/"\ʟ ֲMDVjdK Q i;Nu0¿-:7^_ë>X8#U8Mgx'u{rՃ9//)׫p./oY,z :M4;<u[ԨT1Z7(5AצAA?h)؄-5N.2u) O:_OŠFT B^q o~^a!t^j=ddd7LH;WbREXeOj_2uj (lV? -,@!\3R {[[)mAw;jQ,kgQjľt\r,-*/[.ׯ#OR)ww0dᪿՆc+xk~j_;WNT{"  zd=c@>?~׎UccUB.m<,U\j8-hvp_z(`5lZ*02m) SWbOu8+ž.Nd8¶~~6:~~mFM:x5 Bpaɦ8|+9?~i-`f sª-.|D}^ZUo#0UM}q$BL77?8?ٜ ޽eh-9F; (bͩ41*Λ[mIUe)]%Ñ"i~*gAᚈ6YGHꀾB]U9=LT&Ҕ>H8K"wW7tsGj=p ߃m&ꠃ'!^%U 9m`c{Ը0cEBCƏ7,%Wfl yUi stM"_sA?O4b>^,vͤeZ)pڭڗ/=/a\־ ,uMF>}ᄕ˗$v Y9aEO ?,%y V ,"?8]I4;l-%\+w=v`iG%'2JTcېaj@K;:Kp؉>r5o¿ۯ?"e_3MH{}6",HHjU6Xf\l}9 Ќ ^ODHbI鳎 ip sp[LWa|/ L΅s Scҳؘ4|Ì`h g$69=@ SY*:H ˠO`lr2!Mn3d%/3B!/b " d?7T?YTq=$[+R:ŕ dwˬ]ۯ{]do΃}>%kjyK7n>. q(b}qY_?كo9}\LVn??"MOo/¼$,F@qC1o!U&mĂV- c02|㰒XG(bpkq$s ~%lA'ڗd:9<]`f/|Ծp1ېmߜ&'10b~86L}y$)|JP@%(CLZaHi)m @vEDj+:\`ڗT "ξt'w|2 ϧHh.w-b* +@Dž|mBB9mkbz"bNby(kr`&?:Nc39qGR88z"CL5IG@C!P kl6EfqG7':&8-kʢ?"$W_D͉i< V=h{fO31|d |VԢJcmi*ӫB rXB!wXKz$ko2Nc?UI. 1-1y"๾=dW,+Ix8z#.C6}~h@t5`FQ ;> yv:8fFg`1Ul*;X#J"uLs'4L,6q'::g4|=x-B-D rBf"-FG@][u u+ya7A8&V? u_pPy~ĺiΩGn9/bGPb 8mcEEHRW(|"6942VOPL^GCo e\b!-f#"MX OH/ȟ6O^#l8sJa ; %!Uzge f6Σ싂'&9ć T쟰]pwyjz6_WLa4ԩ:Hpleo#ԣFLH[z/NE[h !C2#G*ɢqF",y@ed8o3~=$ +/!\ϟaV?Z6nw:,pv\G8<6p~x6#a4ZtTD[l`~`}y^>`b9\_ $c741rx ?6iwjUq] dGo?2?V9~Z}vߌ!Ο&vȦ(vG2Acu|2-\c 6f^uD;mq$w|JN GvpkAme_OX-ˊy¿ 7׆砍'E BgY5&8j.>B`%Ϸ`H''7ִ2BD&n#l Zȼۨiw!p./I>6(4 ׆2F{mhn@'PHFV[b6` !ËSNŲނkh J6CpOݧ'>'rS^ؤX < .奾4>2戡yk*'c!P]Ҵm\NV xڑ7q+R᠙BTUf9~- ME;z /*N?oۯ?*Ш1*N{'?Fq[3V` WKl4co7!u. j[>_?~ź}m_ɟi-k h3-,ί:K]LAg"pu`m( A}¢8G9)#/CtBw;Z.HG#YG- IQ|~NreQ%>mu_'Uw@f[5yк~fl,Z/HhGpD_ B#|.ԑ_9?CqY?^#њDSIZjW;:f&&ocx G!xvn)`iȺ3uM9O:Sfv|dhVXA#~ZW:wBe b89r"\r|F?PccπydaX%Dޡ$;+}.c9XAkAu "6#v4j,@ #Yw΃hn|'gTqp/$c&;fSB2־ (MF9:)-5dHA1N.="1`,&B!潐ylG&׏nCuL?֒N\]OՉ]D؛-c. ̶rINZ $YCT13IݱGZxg\\+sJ#zP>F&&C)>K%NFv$b,49VSaY ,K•3ԃo%]$1#;o"/6m5*gWS:GC]FhD*6A"!wiY%nIUG`)So7"N5-I ,g!쟇_+qrYUtxulf:!+ .rЛI^ձZyN: t?JYGD2S)!'1ABJ'G a&=^n}` :6ed-r١} ^%]9KvjG/qzͅAo`Y@, ZBSPbOjV°.#R4$OךI՗- dotI1PǏC(%43+%HW0iU0l'B $'xbh~Wr uȮ##zk"QC[TϟϟfL,TPk~,37БWBDE8آ+[|'.j|!KLx$X(4d4 UU[EQ_l l8 ' 󨼀؆Mx号 ;\-Y\I&YmޮX8}|Pxд@A6\;N&'QEXLE\Zh?#EQPͦZ̘0)~ɴr6 ȲPWr-PiaB@Eۛ/|"p",؈r(S lFCIZ˻:>͓paÿvN'7$'ÒG٬){!OG^@YReX2.]f0q +T]a?Τ~]ȳ/`-!D'I TU5qj[ I^/wlvY>SK>yζ_VlI\ NlL˙Yl g==XdK.(շq _K.[zo:[L9Dͱ4ĎvuYHkԕ\=IajI <;q#H1V7z{zGx&].$_2lF iȅmf)>eM&ϡ#f8c8h\N/9חꃾu8|B\wטB^((a,")D o á3vi&WGhOSb@<(t'q ';&d4^ ;5(]ECtʬFWF?JR@57x Y lx-ٖK>9k?ˬ+a4~Gl{:^jC}V/}&{O'V ϫDZ3yw:_j?yi <GQw`V3 N隒||_] }-#~z/'׫pmßmd^R- i0^Lm %Z|Pg!#ՌmVqƆ<P@Ǿu*9%:܄8 t6!1kZ?er=~֗a bE6u(7ƍbzycD}am9xF5/^s51M~]@cۋs?F?VIYn 'mTRED/d^d~^}v sq{xI|V 8ۨ5*ٝ;Dnhe#]īigĥs,OuRt j@WW)B͘-_#b8m튃]i)33"|>ơTJWێĦL u.S6bEi;'aŭl60a &HntfZG؇@!-^oQXU"Y]NFnYD$$ۤSE0O@5!@50[A;S<o/;(Y^g-ON,-= 賺S}gVI2䞛ތE 4?Ƥ(oX$ۥ! !}uF*\9ڇd(fG=NqKnr|tv'uw>ݬz!B ]Ϩwą-^ya]h[Opn,`TXt(=<)QܟEeSfZ  sYMZO Ċ6:g-UJse {2 L~B n]I,DjXz[jxt$sq'.PqL܉Ԇ05 h{ξ< H F#ւ4Q>=zؼe{ ~Cd^yٍȹjG.n2X෱4xpeLAfLDeV ı 8dnwS5|gZ>V?O/3{=+s]F]|]V7u&g>ڨ,`h|"—VevCgғi2yB.ebf4NJ,SJ]XXoG_gIulUw_80 ant<&kݒg:'so ↴ȏn_Yltf/nu#h(j;Xy+.0Fl@~f ?~K>P\tKk>j" @guDv]S'"m/k ;MŒA[]ZrP%{x kIWm\&,Z!8O \Ma򨖧w ߔV W:{^XMZc9`e>R΂ӱ/P- 6~=hUkSjw [0Y=)ˉa?v)l{9A'O@h0ffD ##?2RxhUx&?Cf5YL9F_z#X*V׊[*Q>õˡW,K]֟À|3afNqGσBX;EȾ64WYNtVrz6[amctɗ=jHy٭mEݙ3?$a;h.v~.cvv 0 aD/5U*Yj_7h6mHdm'ncv)(SNc9kʁPz Dc U!E0? zU6p#oAHī6IK-"ɨ4tGK&pڗ zCαq=*pdxOX.qZ(hR [2w9ԒR .[/{ ]ޢ:gֶ,$8,^/pyvgvpq첼΋ȺZ}NeݑX C炾QwhsH7ak3ڱfËxq3ä-v%G-(QhEp:qٷ^Liur߂@7&f"OE֕%eomd`0j,?l$a:ArJ趚@El M*Ho<_tY)%}?m^UƓ'. Bk]1QdaاCRPœVvlkݞ8DSݹƔ4Jj9=>4 c )B@E 8_?\&`5y=uյN?Ӵex[C06SfM[iǐeq}&k!jQvH_o}<4R[`C r !kmv1w_s&e"h_r^5iЦPsfU|csv&k6YRgZW PwSlJƭttΑq0*FT;*m3KF1 ݼuv=tzzs7g_{ֶ"GyTI(GtI~>rنx~ͧ(>ɣ(:y^.\ͦƤIJr<Dx34"?y:j=ܟI?$ 趬jt{if{~Q"or2V,ˬaϚA pQy"C;^ _n.q{JmPWsP}ia ̙X`~r$q< `1V׺5:ʁ4j}8Qhy#:DwUr۫qu"< {`q?R`1MAq XlAj&\HJ >a]\e/ʕ_DYXYe+ẹ}0f96C]עfVui,<[X%Yچ G'<nFD,SXwm[tHÄ|?|CK cE;C>UPf/rsFr'y *{1-Z69^zu CJ'-"4([z]EŒYWM17Ė?Yõ E41]k\,;Tݲ6㌉:c׆5{]ɍ]d_Zۿ.IƗW,{t@z`ɀR˜uNrdVaNHjVsJfub{[7xw$)]?jxԆwC0-`ƍ}rYvZ I90udo&g鷡Ify;Ptz &d$H׃Lycmsb_<.ձN="j?z%ԱI8;*|-Z2~(w?b #J0&G~rwf֥l|5tl]R>LѡE7 Z%۰Q<u;.-ĵN]].%{>i1AH WWDRs\( FC>Ԣ"XQF*UY߲#1:caXOвE~c C_S87 [M[tWIYTw_u!dM 6]/ kojc:|54 u[ je1kO7S 4 @dSjFA5U2GWؼ9-OwKAO|^C![ vk1`Cj9ft՞̿$/GKvyw&pF .d7:#E}Y$3r} m {*Tͻ^%h?+EsۡT0uabOOk 0OxG[_"_@kC׈({Újg[4سêy+Y^j֓r{lz*3Vxs0㯿Q7mZQi];ҌaJ?-cI:C" \MqG%c6O_rmt])ڔy2iWBUH ښ)W#\8]WK=*p%@7/B?]ƿey04QUib禴I_"í@KS9%$$iD6bOrE3+He28#SCƿeOb}eȪpa{^u]M9\KW,pWGҡqELNvB)63Mr{+mr}` >:Klju' ]F[)(ܕ,|w #T"Mɝ8kzH]4Aԗigֵ` e ` Oo9b%ǀP]hjMJ,&(β'F Mk̡Ԫp(?#y/ܵn u]cUo} kK؁3)?&u?VwWCXAuߛo7aq̔Mj/=y]s9oes e͊lbۏCPG~^!o͢(a읁62ߣهdGgnKmQtݥ*p8Tjei1+D}҂j?6l;3cVf1l2)쀪jǬ2.K wϡN$w-A@BnÏbvL=FxL 9 {y]SFY8EvUts Mw9w_J/p1ӯiCL pAJ7}x,WX f#K>_Eqdt^GhwǴ)3(g0 p_Y󮳇Qm^d- nW Do[݄ 8^%=/VUCV> 4v.j?xW2Grp}W ~h|wKiZasX-B~^d#z }UV9}ջ<4\bM((2m3ԃ&p a 6SjV]gěru5Fp&ˋ.'3mǢ@gW:\U 8_dqWι ?X]) Q7TD;~z~mhIP^4ɠX c=-yз{CТ?F\Yfhz[-N{9)Z9~uH}4,a[gJrehc`spkC bbj޶Q3Ͱ+ SB1pMf.;ѹft6 LM9Cvl9eqW6Guc{%[)o3Þy/fSRy5Bj?o;n S>(0s2&|R30ً6osr>`S˘%mR7ٳ&8܅[$X]Cu? =6Z fakɡnHR|G W># 'V{Aϕ,z<,4 Tׇ[g:gGri$(LԂrj_3j<]ihͳ(i3(̖2jK57']u2t Bv7)\J^g 'R\jR?]2+{{t#K "Z4Gj:QcŃMYRp xZzueKV:JeɪPJٔ/Gh;κ0hQt{|ϲ<jCLJA+.Oph|i8(E^.m5Ye<(]¬m/_W H 8ݖRaJXAA B;"oKDe DuЂ F[ެwsk k /oęE:wH±fXeuiB~phZ\ ō]ضӴ !acmZI^;R CxmR%e sޏ^nz *ڎ:; }|JTGVU wATZ;ϊ2íBo zyӗFV*6_Bk2 J_ szx9qGTף)CwFۿN/h>3kPfuMܵ-39k53.lte-]gwi`;pdގ}y Pv%?ХJp5˨!^z|1ߜ7g'ty}lǻ3jILC.cpU`%5O;);+[7ʾ=z(~6ۗe8Su&]n 6hòɃgxI".$V#gҭD !Z]896a\Q8>bY}%QkjN:z@c ]`չ=9"YԒT|.5o@Oˮ6h};2 'jy oRKJzc˪/gGπXUu[z,qssmNVmfzqYUhH/ad"Ə?\vyEhf{c}S w7~Ϳ|R W% 'ዤn8fC+ *(gD635J4@v EpE[?9'ApXtGbx@.0T$FKѲשUISk*hsMj`&a[us_5kd"uvF L4({i_ALY=>&ku\Dk~EtmA."/7yo=zNo?ј%Gp\n^|./lv!$f.zq q9Nkp%c/f[†e =`gþw%K{w:/qzŊ[ ;g5\ ,8(jbS ^pUH, ޙW9vmj<&ǂ3m^vm|D1 NhYĄ(&DvVS>:;/rnvq\Nkῦyv05Y~o=*8&v9e2buw)b]AeLi6 -,Gk+#ُ[{,,Di$!#7vy6rq^ W.iq˃cgFpx SE.B17y h^&Zz=m峌Zevpcޜo.ƣ| [٥iWjY==xXIeSW©YTw6fbX:)|N~ۛl*Ÿ`Ssx̛%ŤY^R\A5̪`|u%ӽ*|mVǯK!u$"0 _Ʊwru0ـs]#Ϗ }qeG25~?Z\/Jy;CSӵsOLdc.\j̳K [oW5#~:k Q *;n6A38UtZbz40qFImdv(I_5lW߻ʚ K7xMyڽf8JH"Nׅh7Ġ& p'= 7FVXDMaا撸n("Z$;n2\Y"5^OOnt[<Ŀ@ n]DJ:ϝnG2YŔ Q)47_{;Q}R*}j5:y$6t^Gx}gxMmsQ$*wUik0|x~O 6|'4*/o|uV)zІ]`/ǛWizb]ez|f;}ۜtihȎ04Ɠa١d/ #qy4?ɒgtOm!#6-Z)<_NtdQJHCo]'KMt~n w^ED> FƉqCSA]?BmGtI18 2ff^|L:;lJ~g͡tvhbh[&M A/%)M&g[ycQ 6|(8?UmjzAjl[_yqeB=ܜp,GQAχIL{rg 8:P6a }]QW1$@АhO?>5^Kഗ\ ?}Ǡ5haWͳR9VXf&`Ӈ |v_˶VN+ 9Aq|7$!u )3V-a*UB_"98_D?p %%4?w1wr$_.HD$Q/GfLPIRC ^U/V}`/뻌#nu] +7Ϥp[6OH?O;4'r1+^kfw]X/^k}ҷi k`\K_m 9noM"kK5LED pT*`P}!HP\bGm8JR~t :Jc!.^X_q>_A%Gok'ϗ'FڰY&5%b\DvTH iG;{X;|Y #> ^_pSD+i3%ywY4!}|2$<gwlI?7Eſ2s=!5mZuUkӪʤfi$nǨwbBqqcHqfbE4h8f<`S>jDcG(+AOVm 6oljab#:'hF J[4cnnIm59𴆹^Ty<Ҕx"sHiw"ٮ1snڗB2żl{PXo, hzd*̪_9z%+yh><?m7%T=bRUa n*ާ1S^%d1/e@KB]i l{"bօ2=RP[Qpr} kW">YUr|4k sڪ'!)9w/"3o4%a[Z9]:%c3#D ٯDJ/x>mĚyQ%RB&׎%<#8=N;aܷ w_~r2?x34mt Zpu"Թ$X&-UR('M̒s?ETQ_`/K:g` ]Mh*K篍'-*b\-roZ!Dm$ދbuv k UKr<*!ۼtPZ6ӯa{-MS4~=B@+P + (uf].0{\Luf:/m[)?ډy@=-(u6<( hgX8Rk^l&okLk6%V*Ī`Yp\tݞo/ UB>}5 YjMT`c 9>-v4=.@ Ю U/67i6fec3,r.ҕP-IMKNM(I"tÉ֑/ wx&gq‚hGhJx#?;)--cFA?¿^6P4(@{Fvjpyw͞x.b!ۘrREif: }-u祀P֯Eׅ}~< o81ckjXP1Yd!|~kaf,Tu}h/j7F;oy=[ӫhQ"}\ tcӕeGv&8orc&X qUy^bɹHErqwIdKjw4gLl?VP|y\YUT;er7؉$'>(mMnV"?؈s5?*wz-?W=Zi `:؝V8?jslN;GE)48Bm,dʭTȑ =gk"$WA ݀s^_ܕ{cˇvɝT͛Lr+{>hr!.Jɮ0'?g 󚗲-݁ X~&d7WÏ@f&խ_TkG #݀~A>cS0׏Dt볛x% j!?xvAcPCXs0B ¡Jg!j9(|=hDRtGw}$=NAX>|5*wָ SrwKCw柶N҈ۡu|ܭs.ݕI}KŊdvt>HkN^&'x1L|w+ "F4kAX?@o) x14fSmI ji!Н\\f_mtDin bi0OrsX8j6G8?q95r~k :`qKۄWʡʢ\Hб׆*W$s櫣jsLr6 W{uۑL/d^IM>8\nBQ&\6poX^ x, @~s\u^ M8̮Z2PbM&48+ٝY ?,*P=_zJ r ڱ[3Ň$)l{r\7qyj'XW:o; P[Ft9e RZ;#:O?~Pb cZ06F<px lGv46 ;V戆aoI\8FDԽj]G!vQg٤G3OIt&-Ɛ]V_RA9?X0A~Ժ`jQj *6ZZ4WsRjZ_؀f]R0pkZ51Luw0b;0p+pE0 lkGˁ/#_7RK/:d8h~Lf[pu^{NW i'O/5#[*=L. Iߗq0%~f+ɟqH%h?Ujdk p(p.bXt2AYwVKlZ毼i&Z2C@LMpH|5,w.xD;W)J-{xǷ\h>nObhywyS)׺ta.+|kGGj>s⥉Ηe2sX؉TZ0|(עB3JDȥ<>̹}+bf9ʅ`j-͐PwI+g(C "dva|,|;n#WCH% ɯ vϣ `2R/D3Yq {bXIٺì.CB!mfq5ˍңsg6k<9tZ]JOՌ0Sm<-_]@smOK.8_76PqR$̺3F )wi;Mά1.fHܙ:?%qL.p0q!7,M{rwxx{3@/6JpJOX:K'gW[F[CgV><U*:/l;h\Wncf{$GYw3JAdw[xQ=јLp􌺓\D۔i0/==? UQflrvuD8MH\sҐ"`o~~ 7ZPzZKg*_PXvBW:jR7Q{IÙ?\l Ť?ޮ צL.ԞF pub;&cU< PXZOR̻LխtRES Z\+u_T"ey{@ zxGolg%c/TPܷ9Rˡʢ 1B`6ژaQMRBu K*ޔbg%y#ʱ+ݖqH|y-;XF"ۼ$.|ٿ[mon8vy~'_i͟lc1yCU`GUm LxtU|1;.HMˌ\>B6tG=%O2U.S@w/ c+)ZZf* ruf jNX"/ðengٯDs_W .پ'_h4&HI7j%©XܘڗdKWZ_juz(XV0s9O}u[k2+9+'[4by{uьߎݧE[i]sSV/ٹiͻt}:N'ݿ1@tpju,\̷糍5R\fŵםELϳ]'b%Ybzͩ՜92xq`o^GĤc\c9h2BM9 2{;͇A~ue4lu«d|v)O{|QBV\ |i΂oԕӶ 3|(C͛@hj"\&o3Es,{9ۇO?>aA|-mkMֈݹ(PX%^U۫{vu gv NYfvgZގ:41띓7{mg!F=2flncf:o2;w1EC 嗀sn]JLiH,9{|ٟӈJ:дRw~\wov927~bzZ ײB] 3;\kpڢf2Ի&x-:ϊ(ʎ{h8NJsYpnhP73s}[QPOff?ж2n}|Pt,<ݺŻӳ?.ߜO|. ؘջlSX>nn?}X6\GJDp :1#̪Ͷ۪B-qV]"uWW91J`AZMuzAjck|cwOcnXAqx>ߘ#|O>[\.db|eOlLw ǻ[u԰<ޟǶbG-^?Q <E `"'3x8l-Bww[ v{v{ wZ,Ooglq_ =nϹ6o;L~I~p=; {?kziswm3EDpnl g.կ׃WBy[%ɯgy=۟? rowrg;lo˃i̭Fo(T^<*&r5(o18ǑbuE,+>I|E;3x/v!ѕV# pa73?-6GvO ldԩZ'\w,J :ȓ~LByv|kGi%NxυYiv%P907Z&ī>-!ɮ 9x>CcZ> tClC|z:ȞٙtqK=K_cA{QV##rrɬ,JʻF2dv'dE˼}ho!r˲mgm>}l+}dm77p̿kv.=vvbf>\zZnAsxfKM\=KhW|mbs48c{7KgXywف}e&L폡fLޙybNex=>lnk;{Ц=r\^,vJ-²kbD>^=btބCO |1CoLaOon[@~ȮN1F;\}Bph*9X2/:;/?~`˗aӷ6v6çOMȎL{ϟ|d`gێɕgE+]OOOnP73;A.P`-JknW7]'pǞ_)}t^#O/;kO"TՈ6|,fQ.뙝U;g73;th{,oQ'#wx} sRktߘ>3JpZ ΃LcbJԋh缞v%37!9:vy?@e?3iKǰ֎:77v9dh6[UsQoÒlvrkzĞ`vd:co||uzhhAGkeTqOANAꋊFܹԓJ?d>r .eO6 Z])=_ߟ|ycgգ]NTx~@v 8fueUSʲnځǐDUk 7`Y/ zzup}yt- ӻ'otM;vH驮LތE\Yd81o.l 0 Ҿ?yWV<}3>ޭ~U=F~ 8oڧ\O&uvUl #Ɵ"ى]4r;faw8Cph7#}oNW#r#k5rquظ3x,&xg'uw0af`ip"}M8DkåoW{Dvz8t߿V+F5hOa BT;E<?X7P[!FU6'f'J4?Aڊ1/l7Dv$BGAR V@؀Ӷa! !86*g|Brv>|wǗGKWNO`9?D(+4+vS/ڃ0ڡxCHU[ٻqp^-t|]LߞqzݵfUBoϏG4͝j=^b[0n? =J~Y~d}l)v<|F}ڨD? x5$SyVo:$BQ)Dvk/^d.}#UzϦ|5Y,.nn1Wp3kye*dK;n/;άޮ;V}Azvbv]*@Vy!h'NR$8Jj 'st ):Z$$>'$(V$5vz/[;s͌b;j|h`#^և|Ylv%Zb6'dRm2Q"\/A#].boǥp6_I i1f33<ݚ;#}`*(^cB?D x/nB^r^\: v˟v=F(;]݂]|9+p!u#/E%lX ѵg_UFd*1RODeB_{HC'^HRBʣ~Wm!iP]3{ù //GK]j{+Ma'/t}#N(yOFV:_ٜy{{EPA1hH%φk:Ha?.&r3MكԈ Q_{e+UHE*h},ll=cԞGQz?3¹b" ASi#Zff٢)TN%e@ImLTm#P\h_>_%ZV(9Wz|J%Qå="I2~'`|-ߞv;>UoLJegǻ[7un0".<fw<=vXJOs@SIZ;ۀ//١(b(БB$GD-@d cf[M~ Ivdk\*p3+6=0(֕ mjbrG9ӻǸ{PKUkj=YFըH _TO[*PS'_@=Rq!BīƸ4Fh?ԡgғE[㴷-ݕy |, #Va6fN-l|dKv=LrIC#Bl?-d${.ѯv$W[Ox+/&h'iur9*|Ҳt#^YFDaޥkqZ dWϯZXUeQkTt䘼etf)vF,- Qz fEL>>k;? ??ٻN Z`$8{[UJJQs>LE‹a^޺ã6,aj [!5(KhΟ.E;{>` 0_Nľj+(vH>³q{9IhDƆ{[K Z@Vdzi Bۓ?5enGYf,Yz6습 B4HyLrr HejjfR2ߧhj5iV0Q%YZ2*K@rgᰫ:V/{UlmtOyfvyu1Ik3Z $sjcm9X (h"ϟT h|_ի\)u,FWxx7D6F 2'y{3}leKEr0{_'%=L%JF Qa$2zpc\^cOf Q1ꨒkY UdNnV'3|3P}c[^Ќ#'_{*g'#<]j(jj_fY~QhZ3Q4ـEԂ@rDRͪ:?2Iz6KeORV 8Cۃu!@qKmΒaOR$ F) yɈ&T4zU/ERyQGn%k/KTJjV4WS oU!f^ t ^*) RHS":@ԥ_=Dw=Mm E*3I,"D"-AȇOl t#5DQ50>n^~ſp䯰C`0<[b'77X>Rf չYrBC\I2e4LUxSghWJs~>w.2UItHoG҂ #jVfPy>+l:"ghh}4a8|WOƯ]' |^zpW3* k;A.cr:)Ѿw⛈ 1?=5߶·4)Qy0F@"/$Y {CoB va-?or<4ji$~f\|)X^CX}]tE26jhx:lQ_E FU5%`?D܏/Ԩ ?Cѩd̼5C\$ha:9j4y>p]힢 -0yH_W*ϰ䋖EyGD}'1K"饼\me?\?4Bo/XEQVH1:i-؄sLc*;Χ-CuykHk}^h` ŹRW.6_ח-%l |o slzy;LKTѧNORȣy/p$3̇U߮+E=K͘B.٘v9X=@iK]+ R-kzQmBLYȿAk͋JT쵶>DQ\yd5L{H#ϛߦ,GU 2M,TŌYLsl Ηh;G5@7ޮ 1v{F9'^EN &p3<`')&ycig! h@h Ƴ(^f9}(ђmJ "QvM`!wc64rB-x $QURVd 둎S``e[TJ`UzJc;PNK9KZA1?~\rh79Wb2#;_p "OGǬ^vY!?W4^i!XkQB>s,V,H7K#I(aH,2l W DP6Ar)?0VCsVv؇\r=ςPoLt-Y4#"עRcME4;_Dyif(.̆R@ys O_sԚ/'&ɠë˙CE @<lg%EV@*򪤥Dh ATߦT^[;'Epfvg!`'3(B͉jFհ@X2YPnbv$$]#5կEpiV[Jy 3=Mү-4=hݐ'ZCfk0 zDX^4`۵%zi~:0at͊<,8ObYhq= _~8|J9b$H`F8d|3E@)`Ͽиe5s kM7isCbEb:W!Xuɀ;,Q$q<"-ltW; !&3:jr 4V)ѽ M ß_θ(<퇳Īda;`_ :sCmA |CV+H>ul\]+_:=[;OOB(4еAx &?<lOg5 R#zTOAf@z}$WЎ bqM5wf/5?8gCܰpf5|aj5-#y$jA<05Rޱ݋$'f{p4OϋSWF@§-gFEDf >h{oA~#$в 䣲 ͚7;vv (>/cTo4edŝ,T7%~n4E:QAWjc2(QBXAA,n\egP]h2GGFW(q?-q7GlI;G &U-0?_15&Mig]_~6m4Ԣ ÛGjH=0[ 'r|A_vQ^mh4V: ZL#n JBPݾE ?Mr80*i䷨#J&l:)iCQ+*PQX ڿT*:|_I!V[1?Y3HB3)r7xdYDQY rZ#5`jF2ջTE*SVZT=h!۴q B-ʋ0* "*%1}`9J1]Z8Öe*_X}Pצ)r6[{>&|# A? ۭ rըX{:_q6WcI9??EQqn'Q\X潻hB&^i[{[DrW%fygVWFJώ@' KoqIÖ>JwAK"H]9ZJ[-Y pBB!`U"KE *RX [oO5S D 7kBMwv?cMڜbl99Z_!!%*f?1̮=O[ PaZ(q]@# g@*L l哯Iu/vhHTIAN01/!A:Sےnzɑ5pX/Vxrb@[9XO=&׈Tu:T im%MԥLRۊx?[~.C_]bU-};xuYn;"u/K~Rȅ*>[Lk:ndX>H"HѴO]4 wpx'HUbvi7*3[PcD=,[mXCkBю@YuaտTlm[2]Fޘ9Bkg %^T ,!(LV_eSEEЬ߬ >֞`ЍeW, )LB)M)oϻ(ħ?emZ&|J8RqeTAaoq}W_> 2Re[,_cY lgsG57V_-Đ:; Yʋ.DʊQ m"0WU6B"f؆bK ь8EZqSy"XJ.=t|s"i%?e)WNH|=9*uhN]WZfVD ??;Vz͆y 1sfLB?9'D䋜S[Ρ4%[{ LzTIi1wxAJ0$GMnG\.)>p9@.B6.ǨdP)2Ea^8c4wo1 fL$ 6hDp|Z̈*(@$dΏRӴvfr+S;kP_oUZg4NS Zr#VDz/sP]8ϗ6lspؐ*TW_y_QS7WnɰI{ ҈/\2T0{s( yK?6h"(~Uf..qlCUJkʯ|"%*kNuL 9ߟ2/}{?ݫ<} ):^ m!J#-oIZ9EpsNBO Q̧T[r&iLYZϊ"5N.44H+ ) D2N8+k\&j@fEWcd8TT4fi16:mJ&eQ5UN[ˬk IKl-MMˤ/*|J~ XuWM ۱d>j0KE&.'.*%`迸XTd$A?{5re3F 꽹iONMr%? f<#p8sۺi>-c %JCVp@vƦ.kd&ߔQ%6]>"Gٲm*b$ PsB2}aHw`21]Â'N~EEӪ>J-ؤTkV_Mۧy5kU%b}LUa iE("WTĥ.y0Qͤky~,D@K"ƨqA)"੽Qg:XM1sVkF®^?8>dZw~}QiO#FC \\QPțtMS$nK>?O-SJڬ'ĄEUJgVla4 꿗FY.[ 'WYrs4]]2rXj┵&2.], EO$ T d.0/|ۮ*}IA\>ajTsi?g X1jeYů^y.FvUr;fVA&5ڣy dN^wo 9:X FAk|ż5Hq*",@"&r9K, PJ)ٿwhR+ۏ篩{rM|ְydڻE˯5&uXg슜FoYQN._z7cXoi` ( =tOjn[ jt`B#Ty -=?XB/:K0%|[uLlVN͖s.>cnx&<Ϭ(iQw>=:z[Dܦb?bfҶ-Ajĭ`2D;d}䣼=.'WC ^snTF ,򌰐_UE0_ K1X Ds=_֞q,y>8mvi\H"ՃTn+1 d* s5+G=:{lHTUf M]`~ɝ-ݼඏ7(ɟL/-3fvB4'HZ|3j~h RC4WUvWnGET#Pc]%d*Q#*Ślfw̿#$on0AQdR Pշ۽o/(FUЅ. UBb"K8l=Ny]}1hn͑&A@nM]/?5čJn*0i cg,xbQzC#eJ(OJ3%@o#o$-.PU0b sy{Y#L%n= 뉥R@D3`n6?By~]]^N& ?v>D`'*˪ 9ϗ]-OQSy~iܮ-6Wxٞ.kSZKӢ"n<9`9N,%`AgKk]BQ4/s |kלk!OA݇Ūspڌjɧ b++w%jSN_i@l@HؿtZ-0ټm;T JWPpn\\r Ĺ:"L7\D% x}(|\|`q/]R&BT`Q}7 IchG. _cy` vZAS6UiTǓԁvWѵ49J3KgS"m"TUQl+45[Tf55oCͳקS+Ҧ%! J nTs+ ,ޚ)A F<XeAy %jH9N7^P+yeyL3t63gޠz ye~umgs,0&1B˔Xv|?W˃hlQ,S` rkڿ ~]X+'ia#LVnS%irЪr}bVYg^th^GY[/nFδ5ĴC~#S@6rj1CG0dٱpJZkb Sl4,O#̋ fZT+(ϳwH>m"Kp}W*cǬYJ0j-ThYFRn'Żٟu?ݔ~"N5Ok6#s>m[+5)J8$}X&uQ9 d|Nfݽ9s 89riR*Y]ZZ#uJH_]b6 ɶ4ךopY}\e*QP(My5G _?GakAlB.g^lu<3U0 l6f39$9߀:*?V*Pr\h:&1.IJ荲yqH 8 jݛZeeͩKGH:ZjRHOg gYgmk_݈VYm Ji.J?5ݥt~uYq$ >__+kg&j!3ao' !!?ytSo>DAGaN "iAX!֞5~}cΫl,vuo7#<'_ 0-:6S9eu}7!#bgU_kyxcwTAnѺEW?wJ/{!5djƌOW.}mў$ItɵޥRձҼ(fjOQVFyP^ef<QG2C@ B&D>/z4O DUR&^ i]x+ٷ_fQs OOm:"\k]zlPt̀Cfe{ bu_ ?Bp騡rjЛW4NJj)k.E8P,%-&UDb: Wu=)x-5$ -`1G% IZA}v(AW:3iԄ:f_sb$n14{ !E%n3;)BsiLQUӣ )P\ ]!AG aFe7opC  2Ю&Q@DwM-y@8T*U%r*^Im뤎-|BYx]G wD,&/RlbBզ.#Rqzm$T|nm \]!P=r9 <ߛ:ݑ}D` {Tef-!}'m6 }:nP\%TPUҋMkȜ§B6.a//SN! ];Rث34aRB_?uz늎DՑqnX>wϒ&Y寬*QTy +/ZsQ蘯.>M]c2ilF K"]f>7\r(%ϧN4K:5$&Ԝ{Rfc6+gCv(H|r-8.1ZVnmz\*I2" bʆdaؿ&MtugRjűjΟpXQRqikv|C']%|q-rꟛ2JЅ\NrtнhiяjwUA&!'&9u"rzoD@u$%ëj5e-!RenJbs!qzF9,S [uN9,"%,g99.GBÁjॷ5F+8mդ[HAHԀqGt! `/fEuZgL3UP&+_d|~/h9o-N3]>bOewZOFQj?(Up(LJN+G~UΟ)qqA,oPhY~% :'"g\UG!H^0+ "ƟSH~†B*MLC4Жb$ ,3H!Pl)NC"aծR[Sxt%hRϋXļq}^L7ΗoP_-M /Ɓ2w5})au:M>PgK-Yzn#nV$eUm<ƒ6ifx/3? m?b󟖛XM)'(+uغlM سQ/?y7ہt$cm]r \k >ճW@)ޣNQ0Ks%ĸh~ZrAvBź8[?ߗFj|؃0ـCDįc)7kQ |Fp_lSTK`VP~Vgٿ."nML?{S>LL LQb_>)2.6ő9T92ݪYdT\1=%0ҫ6%ENaWzVDzS&Q[)QjۋZ{yy7UxgmS/C4XM)v'>Jḓ]Q= @P~v3A =6ٙk%eT4 39am!xXеBQ+mhϲv/l[lgK@iq3F1ЫRbGF6/[L">ݺX9K=U_e?Vк̠u9\&}W |2>u.6=nWP[gxw^+UF/FUGqPfmQPBc B2d8 ɱU֥ylv^h㪟|mpqzj_q :ȎF}L g}ј0ч4~qd?A*)AQּ"4&wzjoG  a!*ËSGY>^_c\j]tZ5F  [sx;n,N)j}[8vIdž9?,!Ƃ'|ĒmvR ٷ#E'SOMV]k4 T"(\f)qFfOXl&+Gh< vlxw>QUQYe--LB;;c"':ۜR@Ҏg#s˹RȬLʫB].ٞb3ephe^5Arć4›" ocigB?k&i4SaL9^a<1|pd+t)R+KVa.d*[U0Zö+  'GJ#IE v9G" ѳm$!S1©AxH@.u3s^S@ڂ7Pp,Ag/&`< 4{Ԯݥ~u۵}ݟvḻrxu~U:)Ft!;y*(f r= &SsIX3oAjRQAםkJ0l~ZIE%9*h_wY*GS xG#ɇ'l`稺ѥ桔֡t/JQ×b@%j_T8+o2UO57SE9 [_ձzgcobٜ='nY ʤy']f = 5o:v.YS*iuRΛƞ֦ZiRJ]2g$VX2UZG .Fy!^g? ;O $2<Β :gm[j~'_/%Rm+zM{*K -'Tsisح2% bԩYm2dq 0 C4/G7E=sہvƯQ?+D*4o"5~鋖]l`~f©K;;:zUc8d-X_`*V٥b̆O{s8'v{$hZ|uƨB&Gql7p]\D6#e)Vj βm`y[ 46E;N-Qrؠv-O]B(yvΙ#ĽCw8 Ǟ9 0zW>0* (26SmͿGRI(3MķR YGGdձغHʐ?  i?m?w w| h-m B&i8R%{_<A;Crw}3X[/׹ի vh)/e)˷,''>` =C*oA&+IJ P^`oN+.mʶ|UBl[ ,g%/l}Y%RdL`c="VH W#EtロɅެ}}*Zi@ 7DUizԼ.C I?CF%ZZ'JL\~ݥ* x%VKHAM7c߰ bЖJ {Ŵxz>ھ<ED}JeB_B~2vHeqaS^C)>g;\u[_ſ]hq1FXxr-e{ b|^F=)U51?QsRus!pS 0i˃˼mꁃF)ԥHEaٛ5c㜱;[z)3* ٌ"of鍏uY9Gr67@ D , <56\+q@8@>ӃTf\)ʌ [99 V)85?hU-yV".2&p3ch$sá0؝f69s* Tvh3פ9vڔ$ ]_29ؼnCrtBܘ!GT 1m]?˚(3U@1Ώ0n[WS VNa#vs8=.$w͗/m}Jg(ѱ,%s%V" I)e[s9Eݣz}W?FG]ɍw?@$e5ܑ0$H¹_[js& %&-\@VJA3ڳ S+UcY2b*`*/ tq 㔒ݝo?4/ ʠ=.}a H( fσBqLE,A^PhUPЙnEj,:֥[1XmC4yVGi(<ho.Νw'$$ mQ]5[V3:kۺr!}Mvu;꾲 5:Jx[a^]Z$vJ5%ZbTQj_.eO_v??.Gr2hL})̞vGWSKCS$BGiz}DG'9 QY4R綖 aXekkٗXτ/p y_Ry^.'"\ӢpPD̮,vMT#8r+y0su򍼛ç;_Erfe*k B^U!6E"ʜjd*U^!/5a>B8\]_?`RIFU K3>&n'jbg~U_ez;3*o H< VsVSoC WCfL =P!ʏvgm(<'&~lsza1p.Ǯ ,%P}gª'[uY"S0QTiSV}[Lj5nm2B@U|]*nr\i]墐<~:@njiU<^Zvx{L#`I]~~x+GqY"@8쟼(됓Uv)T>3"TUxK]$J@*S5:9puk8b&ir@2| N?;LK ?~'Dž1zJHJ,Gk L/$pӛܶS^Sҗ*"AM 9L~kĘH?9.VsKv\~C ~%O /߅g+낻`@jEm0\];( UйRz^&T] OZ|W Eg+WuU:|M^,Z%xB>K}Ba˜2f_@"#0ORN5ބX14}>$e&`ҿ%ޥؐ."%f֭K?韓C}Y&Ua][#(egG&Hł=14GR 6bdn`(<ȫ>p8UNZd&PGě`wv[1a"-⋶#󭓂z s|7/&bI'Îÿ|f17KJoYd~rL@*E* +H9zvaӪ遇~!#W:`iOyc~t:8ދpخIcD [ޞn)!*PR-Wp;[3 -jg(2*@LwC[z ċ/mn]X5Յ@2lf_?fJy"Z.46Y0է_0exE( 9W46FUًa_QU *fСMYtrfb\yxa˴Jf,"r{]}I Yiq?;X vVCns}7)) '8m?]vEsdEUo 4T]M:db[3`xR#GG\8ʾf4 E!`s1_ʇfx|33O.@;&  $#0ct~a42FѪòHܛ]$LW5ϣm+tG?2Z@ ,FnXaQT#MIWT nr< o,[MRIQ?mAmGOEOQ\ppP/!RS*%{{<]كZQUKy1|dB*Ruw`UYvE, ^(@;'K0 sfrfOlEa;E2`i-)t4p08B>;rzNkfF@ڍQ;'n)ly_rr1=>GH )= W9 \eZMeTS%k6t;دמ۹c" ء4HM<>ߞiO (?9I),gZm17,<* +BC =,Jc]Gy/s[ ^9$N/L;:=ݎQg򹳉la= 3|flEhwְ`A ɯ8 /rв98[gA-iiGPA[`B!dMm]ky$ %ΐ]nrxR[-S.c ?'Nd5^s(|[k;H ?8fν.O;0~!-"v @_LPl9*3#ҭ>$ad)҅y9j_u>lcHdCCiU  ;*v@lr^Ono??dDD^xׅ-Ơ8o{^sdy<~},8ϾQ}\%]ꂂU"$^?ˬO+8TӘOH1;f=q ȞDhb> emUɁC@)$ "pK/ݩ5mCA\jR}V٘Mp( )~B^c1K{`e[+Y$EbWl\|ߑeח*$H@|U(@}~cW~iS]uENᨓҫVzݤ.?_U:S('6as o:F ί_,sRBUY@lKsF$afcO>D/"sB l;x72TJ+Q[S%uhDz SqacK^~7W;#RٿÎEa v |(y a$`*^0'.sJ XZd{#y@_akfWٵ* p@pȌV&$G)U~~"3FSʱ>'"4ZFt@2+wMsiB2֓@RI7µiLS)T.%BY ~~3jJ:"%L4o٦Y;-WfL{?^\N&& ⠜YGATliF 2Ab(#ո߾f}SZS1OrĈVeJJ)Ӡ`O_6Z\y1|{s%W.ޙl' ٿsJ z>g WQcWcN +[f_r[f7.1C3@8wQPXhAU+\"h#Ob,A=5 xvŲ ݚIܺow%mQ<:Qݚ0unUY>Bljy\o>xч0{?.ma)lX G}){O ҉D8^V-hy 0ow =/(Ӕ^6!>&# A?Ѷ?F!I>_9fؿ6˅// [@789-Dc?BF мN['? :W8R"aȩ$} FKwaWiK'*TVy38q>)xEG|}z;\seյٿ6~HL#)9a+c}P;ClbR ҋl1F3Fe$r?-#m$ؙw`s=M"P_W^%]݈D`ߓ?- ٿ濷LΓݟ=<_bjr{@ y=s8J_(hdк_>/2!a6a8y2ՆUq˴Q)YN^9HQۗr>Z̛Vo3g'c 0_QzxO{ʴI@{ ԈRaQyEEX%!2$9`[K5z!0]][ U{4UY!0VA_wsq@ǰ?o_^6vZ0?E5{52`ljaHF"N3J"z[ Qeɩ6FU*w#F|sf,.q_j8f??*Yg17s~umw|t2O€i᳭]DSazS0`:e`b7e|Qċ.+"u?cWvŲ{%?-/p>OE~Erz }݀|a5>~ 9<ݷp%:l?g)\BaYmhPXRղ=-ul~ɜUo?p=M"\} A?m`w̼%J"?Xb{fff/_p@F/M&R86(-J (#Jt,ޔ&RR.}*ayDZ{m{xUI‹G)WEp)V<7{Ďxh9鸷7g;xem?0ٺ~r&&o}}PV掴$43l^ؿQS+Ծ?V]qBqOFd1Mhkv(6][.S?"DJ1#Iq{mm;<"D]V`0p NHj!]r٫A+*eُCmwEwWcDrbXY+V×P !I'OgbUBr~AҘ{wgeW4[n}:!R)gr!{sr`B *lPkek(}*ZB _=Ѵ4?-Zao7Cj>T`m^xC,J.I29P2,Ku> Vf'eͷc?FN: #vPA b!wcMQ9+c"Zȑ2> ^4D .8"K;p'Ia^0l.z f&m )[EMW[pZ+6E:GA8ߢ׾ҵr]*ڦ)χUlΏ. P$۫ -ȏE{>IpU0Y_j "G_x:tE L6;؀ʵ^8'+&78),AI</jWFK ^.D/%d 4.Ù/Z2=] 3:]pNף/`4"@ȡenl]ɥ+3>Tu!G-S'&[(:>>K kVxO_ս>r o:0Qgi:/؋k_ltE,Mn996@C e뿰}+׏z=cA<&T4ב,A.W⇥6'ce#z+1К`,E?KK8JVf=k79q'p'm/C|acv6`/,k^.A&}ʮRMpѾϙ\3BXSӜ  PgVM ງpb5a=k}Z+Ms>Wp^$sBnY;lw< EmnXRS@"t.-L4'taM~@*vm/ _0;+FYD?}럞/)#(J@41T'{VHi+ŎsA-X wqKkF.0- ~IO 2̢ .KU}+4(d^#*m } !*" 3i*>:UGK?90ED0K14*l uCK @@_9®2mKn/m iWF-E#uhA|!><-xd1 ku )ИmHG~{zD۳?_?Ih3]t |wߐv6dE= '_Uw@D >Wf:Җy2Ɗ0?阤ژ(׃ΒV@;{2HM4<5llDBmLIMJnw0.J¹*!gr7`e@L=rizMR,"̈́`r]t@Ku9'wbKnm0>]BwFƕ~TF1 v!x@@zr3d=ׇZJURu'¿pn@Ј %s!\5|ESn"PBZPK*1u1} I%AQ]# J(CΔP7X|]IEpCi ˲y> $edK" jsWw8D_`BE""=PD,Ðr g3 2 fGZx&舨{Qx=+?vsO1^¿&ڊ,Tp^6Ѕdc &:ה D\BftnH2sOk%J]AA/EHŢ \hTz&"rDVc`n"FoPS<) W0,KueA=ŖuBXJ{I+AòjBre ohpdHb?(M}=(z|lꍔ_d^[Y] B ~Wo4{_âM"T~ X\a[ FьS[X,;C Qp&hhȮ} ?n[&}ɭOEz-Xj*!_/"e_NEQ6Rc_T?U%4DRIi>R7hg4XtM}*[vrhhv@)::,fwGؤ/ Cܺκ??Hx{ _PGGD$?nwHDW V;QPo[BFsuLس K8FKvp}p`rc97*&&}7H/_*ﮈ|,88ŴQ6_8;_hp_U:.0O^g D<7ݪΜHOZ0s&~3alrO`)]+|a"thlw#Ut:a_@;$d! $ݲC" fU@TV6?ZVT_.᰻^lZ}1PQ*)2P!7yqܡ9׏ aϚQϡ ;{: &ٚ.iR\OĚsF?'8c!x :&Tm{0et~鿒OJ )T(Ux:N Ƕ$+@ .QژVӬZ_}-DmlyUu9 1ٞ$K?Td;==؆0 W/a|$LVVCPݳ8rފ^tڧdqiA.ws>k }!~+6+~(XیIJemQ!5;mǏ<1BܖN<axyw b5rd7lqZŎhʖ9ykvnaks< 6"H,x4mQqf3lAU~ZB~?JbRP`v!nm03;a+_i}'t{q5_} ^EbјmA\qKdlm j+?,-`սdB%q~IJ>ww󴺋% Bpag-O aXHW5]p4tf"I?Nv smr]>r:uq.W^Ȩ4V8<3=6΃ l[ۭ1_?-f`s855 Q)f4N#:Ni2o R9 6OtPA(WbVEppM&:~'$-&~͋Q#Ir* L@ζk!C>2펒8Fmt]{ ͅfvj,)-QbD 3z#W& mq-_! vi~III@~M,^:He{9d; K:D5\G"1UӶEEKט7kQ:,O5FW6qISW%Z2qtm4&*lP%s9&^BiQ7S?#0nE**#S}$%h*:%L$PHCsD:IyБzviЁUtp?w4%C~kE8V[YR>}zBFo%@᫕u'2(Ԉ 6d?2D/ M@#VpP5x;[Ux}U,6lհS G70!TH 2..#Oh.Я›-WɏiHфrM425ERZ&:saXv5Ȑ'.^E9N fZ"'|?7!|]aN\ 6r>urUK/q ˳dy ~oo~DH{w>o.ZCsƼ M*!B_*^a'ή*#\оG@>Xr+ __n,uӫk\_86E ,]tz㚚`#Ia`sr5hz>k58?|I?`/_ȗ"{ZEr"d="K:<ϳw):Zzh\?%љDWvA£ԧާqc>ݨ[>]_PRG Pv"uPhxt|>En۽;4L?3~)wI.H@/Eˤ<oMzJ$!fn)Xbu,>w9 ˕ԝEYׅOU&2 I-5jcyZDPxJp`4ipxK}]9/ D9z^ѓz)Av%7TrO%OnN󜋌NC?ʡM>W _sR8o.Ӹ+L{;%ǣ,Ŀ'P%i-b T*^$M7O)vQHۣx8j\-HGodڳ=arK~-N*3FB~deǩM#9)y_7tsfwQ#O@&s^8F/0A,ƏN*dcxU;]x_/ VƳo%FBy'|D ~EfS=j1YVRq.B0o` }է? LI!/ugZ` C^ FH= Smn_^ ?s#L~,t;$c pۿp1(~1aóI=OR[Yw*c*)CBF2| 7G0>W&<g]gc;|"%ndeK ytցwS׉k{g擗*t$c ȍ;]#oXpj[ CI2oz]*Hqj͛>y@}q@~srwfImjJg3i;XaWmW3.-1棽7Cz<>Б^Y?.Ā6+N/A6Ѝ1汱 =pUrVBAM|'gEהv—r_t$c VyoimM3K]Oqhe./-՛v:zn,c/St$c VO[]Tf}QASv)QKoSnvڴ?͵> CO2ou]Ge!PF2qg*niq ~)! 1wԗ̙ԫwWTNݥ~]*7şymS@7Q2o_<Q_ֱ2T M`'gJz|W@M1Y:+QAЫlŬbZő g8V^^@R2kuv|F sVUeGM ?)pDQ^΂[)cp{:o\}֨Q9Yh.3|aى^6ӭ1S\AoT+W]WIM7=)|Dq >Ϗ1S{m/Ǎ)?ܨ7R^X^Æ4t+%c ~R;7Wgg5n~ 7}u^s8VJ[F^R>.hpbGUDm߇B\{(1rA^@+>pӚm:"Lccp{Bq~ ֭?s3}nژ1w|:37&0䛖*L%&߁1w|~ 腪nN,NVꛖl/(߽m?c\1w|?{SSd_76;WucT^_>8![޲^[S>xC}j3'lb ~8ۅNՌS?=SBLqѬk|B 8ykfYOo8pLK>ڿd|gio pKi(I:/kZitX4p&8_Y\6&9C61w<4C\_4@QLq} NN+No]eN넊9z<3(cp7ɟIХ7ƏV:7.0Mˍ7~ß~ʠvgbk7Q2o5q{G>OoˋmՕ`-=q}1wW&MRq0j7e|Du'鯽l?vAO2oG&*s|i_~+?7]r<2ؽ8a. {{/_}_=/;ʙɄz} S7=< t$c y&zL7(Ho%GKK6/NJK/, Wod=M0b$8@ px-sVN>huq3qYoMˡI5wwxhd^>8ןlZN˱{pl] }ճkϜE# Gh⼕^SW_( }فc ^$U4 =C s[Ϧ0]zwk1{l+OO_~$6ty^I)3[߀|w3; p1w/W Μ4lxh8~H*/Iynf~wb ^$3/i=Lfɧ8˫x_–25Eb ^$Swo?O}:v}ކINo7x$Ӿ3BK9]}zJTUcp"iN]z%x4٥]xkC,ko:1w/F:g.=ۃ]2s 3_+iy|'8Ujp1w/:U׽3v3be T ܽHʴv}_8s Y.ZHy򷱈&\݋FkD1C޿dNOb>|WvYp1w/-Ż,qJX \:wtL%@0ۑ wwܽH1_蔘[.ĎiS;'/-}n wwz)x c ^$L[+8y %L^nk@E[ cp"̄-WFڻ0m G3yQc?['=#(ܽH.0a}"Ӗt슛 +s;Y0i^[^ww/sLj(Z{o62q̈́)^wYG%(M݋W˹F^q3cu;|U}݋o&LuJb|Hꊛ]~eƜ%}-P[&Xo<\ 1iqgw/@^$|~6ec'3i4 =a-%w( ݋֑jH78V{|{ 4~Cp" 3Wף^S?tn3fzL}-PO7-^-\n,bA^ !{|S\Z92TU9*i|6okcoo`݋䛷rGS_%`;4ٿ-1{0~_-u&M ]o{~=/o3Ϝ \]\"rP_ʈז 7| _ϻ_˾{OOï/wvѡ_}T oq1w/cp"ןEb ^$SyܽH݋\*O1{xO p"1w/op<^$E ?'݋ܽH{7Tw/cp"ןEb ^$SyܽH݋\*O1{xO p"1w/op<^$E ?'݋ܽH{7Tw/cp"ןEb ^$SyܽH݋\*O1{xO p"1w/op<^$E ?'݋ܽH{7Tw/cp"ןEb ^$SyܽH݋\*O1{xO p"1w/op<^$E ?'݋ܽH{7Tw/cp"ןEb ^$SyܽH݋\*O1{xO p"1w/op<^$E ?'݋ܽH{7Tw/cp"ןEb ^$SyܽH݋\*O1{xO p"1w/op<^$E ?'݋ܽH{7Tw/cp"ןEb ^$SyܽH݋\*O1{xO p"1w/op<^$E ?'݋ܽH{7Tw/cp"ןEb ^$SyܽH݋\*O1{xO p"1w/op<^$E ?'݋ܽH{7Tw/cp"ןEb ^$SyܽH݋\*O1{xO p"1w/op<^$E ?'݋ܽH{7Tw/cp"ןEb ^$SyܽH݋\*O1{xO p"1w/opXB!B~ !B!B!B!B!B!u- back_tube xM$@=p&X!l"#ͻx=?/_w}OMAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOtGLAGLtOrir back_dice Jx흱Ek6 BG O\mSoX Ľn ӿNo/!2Ǣ(,Ǣ(,Ǣ(,Ǣ(,Ǣ(,Ǣ(,Ǣ(,Ǣ(,Ǣ(,Ǣ(,Ǣ(,Ǣ(,Ǣ(,Ǣ(,Ǣ(,Ǣ(,Ǣ(,Ǣ(,Ǣ(,^Х a]4|u\ ]@_˚5?|}}||ky oMvc ^` Oό9܄oVOm#vA dյ)֌׺=a</b뮼ԧ؉?c)B-NzD8 @GަNG(q:CB.3XS1v;<Wd?'2)J8%t2Cz.on}iB?q@UЁʟpr-m5]s!uN ]o2_Ը Qc+؟Π5 ʟm5#lsenۅ qxѡI]lM9cwB*[3X>vD^B":dM׺inYw{iTkqOv.^kN ]&,.5qZɮ>H)z><\t߳`/d<IŢKa/N)?;]ٌ9~mhz.0pE.3$/ORr_%f悤{x#2]'A_% ' i辟w=CY _/|m 7YOӶn?9^waIg~RWKGY>JAw?Y{P6?dO{_.j9lCS-A/7M.([RR&*?U ke([W`G-31 G2=ò&`#ē_SHlC]w _n$ ƻ;.T H"}(&yw3y;eҀ+NޤR4'HO}4eҀg~ W|V-2"L~?WExq+0"L~']F?p"L~Ku 1eCu8_AdaIo~ϓ) هJ(f\RA_Lӡpy0gR5R(O=fO*1v{UG_Ns ?I4v΂ڳ!1+9aP>0vp !QpO5h ΂槀(oƒ>bAYi050Q󙟼|E0L?kgȿ!(̏'p{̟jSʐ{/-=!bf~dn??$Xǖp3GP<9 uX_aPHZ}"wLo眢߽~Ky_\v`dǢzz9g~l[\$mAP`j${,.N*@8ԣy3?lO?D ڸ5e \Co$FĄM=7sD߁0HO°n* u`w.O#3Gt(oLt,О_LK5%`:v9-07" aSLAJp''?rkA'?as!R%|בqf`;?r Oнhi矤30̏yHGٚ!by/:K{we'!?t@4ï N>Ϩ o̱ž/z-7vOI.d;"Sm$x/ ߏOiXh _8͐Hw;h;YHIv~xSЧ R?N$d]o|0e?մyeoȐfm8O~s^/{8O$΂{b I ށj$Gr,tH??%'È5/<*NL; x?pm#'Y?qTh?8@%#n;Gky66`?(=#=b-"q7foB(f0=O0{7jx>?hړy;֋.Q?>4y1p?b7eo叅9hDg?s Gl,p^S/ wQE T{d?~bӣG,aٮf~n廨+PX?EcQX?EcQX?EcQX?EcQX?EcQX?EcQX?EcQX?EcQX?EcQX?EcQX?EcQX?EcQX?EcQX?EcQX?EcQX?EcQX?EcQX?/!BHz_8Х_tD"ΑX9/:G"cE?@,E#s ?_tD"ΑX9/:G"cE?@,E#s ?_tD"ΑTא.sst}~}}Ň|>|>@柣닮?MӶBWb_t~~n֓ܡCswtma 1k/:?J ǃv\ֺ}:.ዅ:ks8i'Fk<gxa/:?I.]  WtxQ(^/:TA. ): ΑtwG#?U3 o*Α~B#=;/:GBa6?W$?Z_WG^*Α~xGks ?Jks ?b hfv1[9?Ny7(Α@/?8nȿI 7E@P|#;c;/!J"A?r*u#_6 (S@q=w/:G*S!@sY@b>N$?c8< Az%`?;.49S2V-_t!z`N R W]4oVۯ%Gn44R 'puХKCW#)S = I"\t 2Eﰫ~Oo(D>n\tiH.,O$Kkq޽"EgpuХK7s4HM9 tipaWߐÿX ?/?k.]w^/ٛ:wxzlǣXs3'\tlN~_tNu W]4O#Ω?KFߜ9sO:ҥѼ7((_tNu W]4+fASA.(?{O:ҥѰ7w_tOu W]4 <9'\th>˿e_tNu W]4Zx|>~ti4͙_ti4$3?_tNu W]4 k~sO:ҥј7oo_tNu Wb$?[3LK/.!_tOu W&}rAp_tNu WX Y/:z>@TKET @,"Ω?5ZXjb>| ?12Ϗ7MuդDlﳉ/::SY?o5ϫ[NsvϾjQm$rAStsQgn]܃/:WZ<*3%Rw~9u=m7GC9b~_z ,Ous9 V`[++Bwsü 5߁ܾ3޺TգsYETz?m|||إ%Is*wPlomD@1sK/:G"cE?@,E#s ?_tD"ΑX9/:G"cE?@,E#s ?_tD"ΑX9/:G"cE?@,E>@Ϣ [scr_draw_messagef// // Draws a text that is in argument0 // { var ww,hh; ww = room_width - 40; draw_set_font(fnt_message); draw_set_halign(fa_center); draw_set_valign(fa_top); hh = string_height_ext(argument0,-1,ww) + string_height('A'); draw_set_alpha(0.7); draw_set_color(11135725); draw_roundrect(15,15,15+ww+10,15+hh+10,false); draw_set_color(0); draw_roundrect(15,15,15+ww+10,15+hh+10,true); draw_text_ext(room_width div 2, 20,argument0,-1,ww); // draw_set_color(c_red); // draw_text(room_width div 2, 20+hh-string_height('A'),'Press to Continue'); } add_rotation_quaternion_c //obsolete var q0,q1,q2,q3,phi,theta,psi,temp1,temp2; q0=argument0; q1=argument1; q2=argument2; q3=argument3; // Try to convert quaternion q0,q1,q2,q3 into angles; // Conversion fails in some cases but will work if system is rotated 90 // degrees about y so we try both cases and use the one that shows // the least "stress". // Formula from Wikipedia: http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles // Coordinate ordering is x,y,z using gamemaker orientation. // The following code rotates the quaternion by 90 degrees about the y // axis. 90 degrees is a special case that yields a relatively simple // result. This is a simplification of the more general formula for // rotation around an axis. The code is redundant, it has been eliminated // by substituting for qq0,qq1,qq2,qq3 in later formulae. // sq=sqrt(0.5); // qq0=(q0*sq+q2*sq); // qq1=(q1*sq+q3*sq); // qq2=(q2*sq-q0*sq); // qq3=(q3*sq-q1*sq); // the formula for Euler angles fails when the value of sin(theta) // approaches 1 or -1 so we calculate this part of the formula beforehand temp1=-2*(q1 *q3 -q0 *q2 ); // temp2=-2*(qq1*qq3-qq0*qq2); //we also calculate the same variable for the 90 degree rotated case // must check this temp2=sqr(q1)+sqr(q2)-sqr(q0)-sqr(q3); //the one that is nearest to zero is most valid if abs(temp1)0 and d>0 { b=a*2/(sqr(d)*(mass+other.mass)); hspeed-=dx*b*other.mass; vspeed-=dy*b*other.mass; zspeed-=dz*b*other.mass; other.hspeed+=dx*b*mass; other.vspeed+=dy*b*mass; other.zspeed+=dz*b*mass; } } rebound_2d-var d,a,b,dx,dy; dx=other.x-x; dy=other.y-y; d=point_distance(0,0,dx,dy); a=((hspeed-other.hspeed)*dx+(vspeed-other.vspeed)*dy)*0.8+d; if a>0 and d>0 { b=a*2/(sqr(d)*(mass+other.mass)); hspeed-=dx*b*other.mass; vspeed-=dy*b*other.mass; other.hspeed+=dx*b*mass; other.vspeed+=dy*b*mass; } hit_wall_slided// Simple platform movement code // Oliver Broad 2004 // This code goes in the End_Step event // // First test if a collision occured // Note this version should be more reliable in games where // collision events can modify speed and direction // however it may lead to slightly inconsistant collision handling // /* x=xprevious y=yprevious if place_free(x+hspeed,y+vspeed) { x+=hspeed y+=vspeed } else { */ //Move horizontally, testing for contact if hspeed<>0 { move_contact_solid(180*(hspeed<0),abs(hspeed)) if not place_free(x+sign(hspeed),y) { hspeed=0 } } //Move vertically, testing for contact if vspeed<>0 { move_contact_solid(90+180*(vspeed>0),abs(vspeed)) if not place_free(x,y+sign(vspeed)) { vspeed=0 } } /* } */  rebound_weakvar d,a,b,dx,dy,dz; dx=other.x-x; dy=other.y-y; dz=other.z-z; //d=point_distance(0,0,dx,dy); d=sqrt(sqr(dx)+sqr(dy)+sqr(dz)); if d<=(radius+other.radius) { a=((hspeed-other.hspeed)*dx+(vspeed-other.vspeed)*dy+(zspeed-other.zspeed)*dz)*0.4+d; if a>0 and d>0 { b=a*2/(sqr(d)*(mass+other.mass)); hspeed-=dx*b*other.mass; vspeed-=dy*b*other.mass; zspeed-=dz*b*other.mass; other.hspeed+=dx*b*mass; other.vspeed+=dy*b*mass; other.zspeed+=dz*b*mass; } }$quaternion_documentation_placeholderb/* Placeholder script, does nothing * 22 July 2006 */ /** \file Quaternions.gml * * A collection of Gamemaker scripts for rotation using simplified * quaternion algebra. * * Quaternions are derived from complex numbers, and whereas a unit * complex number can describe an orientation in a 2D space a * quaternion can describe any orientation in a 3D space and * provides a code-efficient means to transform orientations * particularly in Gamemaker where the more usual matrix algebra * would require a larger number of operations for the same result * * Quaternions have many of the characteristics of rotation matrices * and indeed the same results could be obtained from matrices, however * as Gamemaker does not have vectorised math functions (matrix functions) * quaternions appear preferable due to requiring less operations. * */ !d3d_quaternion_set_projection_neg /** \def d3d_quaternion_set_projection_neg(x,y,z,q0,q1,q2,q3) * d3d_quaternion_set_projection_neg(x,y,z,q0,q1,q2,q3) * * Set a camera orientation from a quaternion * This script treats -x as the base direction, eg looking LEFT on the map, * which is inconsistant with the rest of Gamemaker but was convenient in * d3d as on a textured sphere the middle of the texture faces left. * This function will be replaced, for consistancy with 2D games where * zero degrees means looking right. * * */ //Optimised vectorisation for camera? //Formulae obtained by expanding out q.v.q* formula to give formulae //for the object's x and z vectors //precalculate common expressions var t1,t2; t1=sqr(argument3)-sqr(argument5) t2=sqr(argument4)-sqr(argument6) d3d_set_projection(argument0,argument1,argument2,argument0-(t1+t2),argument1-2*(argument4*argument5+argument3*argument6),argument2-2*(argument4*argument6-argument3*argument5),2*(argument4*argument6+argument3*argument5),2*(argument5*argument6-argument3*argument4),t1-t2); "d3d_quaternion_light_direction_neg:/** \def d3d_quaternion_light_direction_neg(ind,q0,q1,q2,q3,color) * d3d_quaternion_light_direction_neg(ind,q0,q1,q2,q3,color) * * Arguments are ind,q0,q1,q2,q3,color * * Applies a directional light according to a quaternion * * Script treats -x as the base direction. */ //vectorisation of -x direction //Formulae obtained by expanding out q.v.q* formula; d3d_light_define_direction(argument0,-(sqr(argument1)+sqr(argument2)-sqr(argument3)-sqr(argument4)),-2*(argument2*argument3+argument1*argument4),-2*(argument2*argument4-argument1*argument3),argument5); quaternion_ball_roll_simple"/** \def quaternion_ball_roll_simple(radius) * quaternion_ball_roll_simple(radius) * * This function implements a simple rolling motion * by converting the object's hspeed,vspeed into * a rotation and applying that to the object's * orientation (q0,q1,q2,q3). */ var t0,t1,t2,t3,vx,vy,vz,radius,temp,temp1; radius=argument0; // ang=degtorad(-5)/2; // note that this function takes advantage of the fact that // the angle in radians that the object has rolled is // equal to the linear distance divided by the radius // also note that the factor of 2 that turns up repeatedly // is because quaternion rotations require the angle to be halved // sinc(x)=sin(x)/x but fiddled such that sinc(0)=1 // it is used to prevent division-by-zero errors /*if speed*100>radius { temp=sin(speed/(radius*2))/speed; } else { temp=1/(radius*2); } */ /* movement vector is (hspeed,vspeed,0) the cross-product of this and the vector pointing to the point of contact: (0,0,-1) yields (-vspeed,hspeed,0) */ vx=-vspeed/(radius*2); vy=hspeed/(radius*2); vz=0; temp=sqrt(sqr(vx)+sqr(vy)+sqr(vz)); temp1=sinc(temp); t0=cos(temp); t1=vx*temp1; t2=vy*temp1; t3=vz; // We use a LEFT multiply to carry out the rotation relative to the games // reference not the object's reference multiply_quaternion_left(t0,t1,t2,t3); d3d_add_rotation_quaternion/** \def d3d_add_rotation_quaternion(q0,q1,q2,q3) * d3d_add_rotation_quaternion(q0,q1,q2,q3) * * Function to apply quaternion q0,q1,q2,q3 to the current drawing state * using a rotation about an axis. * The function uses d3d_transform_add_rotation_axis * * note that although I do not have mathematical proof it appears * as though any orientation may be expressed as a single rotation about * an axis, and therefore that any combination of rotations about multiple * axes may be combined into one rotation about new axis */ // The commented version is the code written out in full for clarity //var q0,q1,q2,q3,mag,theta; //q0=argument0; //q1=argument1; //q2=argument2; //q3=argument3; //mag=sqrt(sqr(q1)+sqr(q2)+sqr(q3)); //theta=radtodeg(arctan2(mag,q0))*2; //d3d_transform_add_rotation_axis(q1,q2,q3,theta); d3d_transform_add_rotation_axis(argument1,argument2,argument3,-radtodeg(arctan2(sqrt(sqr(argument1)+sqr(argument2)+sqr(argument3)),argument0))*2); init_quaternion/** \def init_quaternion() * init_quaternion() * * Sets the variables q0,q1,q2,q3 to the basic unit * quaternion (1,0,0,0); */ q0=1; q1=0; q2=0; q3=0; init_quaternion_random~/** \def init_quaternion_random() * init_quaternion_random() * * Sets the variables q0,q1,q2,q3 to a random orientation * quaternion. This is done by generating random angles * and converting the result to a quaternion * note the special distribution of "theta" needed to * prevent bias towards certain orientations * * Picture a globe, phi is longitude, theta is latitude and psi is which way * you are facing. Phi and Psi can be simply random but if theta is a simple * random number then if you are near the poles the lines of longitude are * closer together. This skews things * * Starting from the equator on a radius 1 globe the area of the northen * hemisphere is 2*pi and the length of a line of latitude is 2*pi*cos(theta). * The area between the equator is 2*pi*sin(theta) (basic integral, only works * in radians otherwise it gets ugly) and from this I infer that sin(theta) * should have a flat distribution and so if theta=arcsin(random) then * sin(theta)=sin(arcsin(random)) so sin(theta)=random (provided random lies * in the range -1 to +1. */ var phi,theta,psi; phi=pi*(random(2)-1); theta=arcsin(random(2)-1); psi=pi*(random(2)-1); //it should give an even spread and not favour the "poles" //as a flat spread of angles would multiply_quaternion(cos(phi/2),sin(phi/2),0,0,cos(theta/2),0,sin(theta/2),0); multiply_quaternion_right(cos(psi/2),0,0,sin(phi/2)); normalise_quaternion/** \def normalise_quaternion() * normalise_quaternion() * * Normalises (q0,q1,q2,q3) * Ensures that math errors have not shifted the absolute value * away from 1. Note that this function uses slow math functions * but the optimised math form uses more code and so would * run slower in Gamemaker. */ var temp; temp=1/sqrt(sqr(q0)+sqr(q1)+sqr(q2)+sqr(q3)); q0*=temp; q1*=temp; q2*=temp; q3*=temp; quaternion_fly_rollT/** \def quaternion_fly_roll(angle) * quaternion_fly_roll(angle) * * roll manouver script for aircraft-like movement * * causes an object to roll by an amount angle * * using multiply_quaternion_right() causes the rotation to be carried out * in the object's reference frame instead of the room's frame */ /* this is old code left in for reference ang=degtorad(argument0)/2; vx=1; vy=0; vz=0; t0=cos(ang); t1=vx*sin(ang); t2=vy*sin(ang); t3=vz*sin(ang); multiply_quaternion_right(t0,t1,t2,t3); */ var ang; ang=degtorad(argument0)/2; multiply_quaternion_right(cos(ang),sin(ang),0,0); quaternion_fly_pitch4/** \def quaternion_fly_pitch(angle) * quaternion_fly_pitch(angle) * * pitch manouver script for aircraft-like movement * * causes an object to pitch by an amount angle * * see quaternion_fly_roll() for details */ var ang; ang=degtorad(argument0)/2; multiply_quaternion_right(cos(ang),0,sin(ang),0); quaternion_fly_yaw-/** \def quaternion_fly_yaw(angle) * quaternion_fly_yaw(angle) * * yaw manouver script for aircraft-like movement * * causes an object to yaw by an amount angle * * see quaternion_fly_roll() for details */ var ang; ang=degtorad(argument0)/2; multiply_quaternion_right(cos(ang),0,0,sin(ang)); quaternion_rotate_vector\/** \def quaternion_rotate_vector(x,y,z) * quaternion_rotate_vector(x,y,z) * * script to rotate a vector by an object's quaternion * * arguments are the x,y,z components of the vector * the result is put into variables vx,vy,vz * * this can be called with (1,0,0) to obtain a vector * pointing the way the object is facing. Use (-1,0,0) * if you are using the _neg functions */ var qq0,qq1,qq2,qq3; qq0=q0; qq1=q1; qq2=q2; qq3=q3; multiply_quaternion_right(0,argument0,argument1,argument2); multiply_quaternion_right(qq0,-qq1,-qq2,-qq3); vx=q1; vy=q2; vz=q3; q0=qq0; q1=qq1; q2=qq2; q3=qq3; sinc/** \def sinc(x) * sinc(x) * * This function is defined as sin(x)/x * It is used by the quaternion_ball_roll_simple() function as part of the * formula for converting a vector into a rotation axis * because it is valid for x=0 and so it won't cause * divide by zero errors * * note that for very small x sinc(x) is close to 1-sqr(x)/6 */ if abs(argument0)>0.0000001 { return sin(argument0)/argument0; }; return 1-sqr(argument0)*0.16666666666666666666666666666667; multiply_quaternion/** \def multiply_quaternion(r0,r1,r2,r3,s0,s1,s2,s3) * multiply_quaternion(r0,r1,r2,r3,s0,s1,s2,s3) * * multiply two quaternions r and s * arguments are real,i,j,k,real2,i2,j2,k2 * result is returned in variables q0,q1,q2,q3 * * note that the order of the two quaternions is very * important. multiply_quaternion(s,r) is not the same as * multiply_quaternion(r,s) */ q0=argument0*argument4-argument1*argument5-argument2*argument6-argument3*argument7; q1=argument0*argument5+argument1*argument4+argument2*argument7-argument3*argument6; q2=argument0*argument6+argument2*argument4+argument3*argument5-argument1*argument7; q3=argument0*argument7+argument3*argument4+argument1*argument6-argument2*argument5; multiply_quaternion_left/** \def multiply_quaternion_left(l0,l1,l2,l3) * multiply_quaternion_left(l0,l1,l2,l3) * * multiply two quaternions l (from arguments) and q (from object) * arguments are real,i,j,k parts of quaternion * * note that the order of the two quaternions is very * important. multiply_quaternion_left will apply a rotation in the * room's reference frame not the object's frame. */ var qq0,qq1,qq2,qq3; qq0=q0; qq1=q1; qq2=q2; qq3=q3; q0=argument0*qq0-argument1*qq1-argument2*qq2-argument3*qq3; q1=argument0*qq1+argument1*qq0+argument2*qq3-argument3*qq2; q2=argument0*qq2+argument2*qq0+argument3*qq1-argument1*qq3; q3=argument0*qq3+argument3*qq0+argument1*qq2-argument2*qq1; multiply_quaternion_rightv/** \def multiply_quaternion_right(r0,r1,r2,r3) * multiply_quaternion_right(r0,r1,r2,r3) * * multiply two quaternions q (from object) and r (from arguments) * arguments are real,i,j,k parts of quaternion * result is returned in variables q0,q1,q2,q3 * * note that the order of the two quaternions is very * important. multiply_quaternion_right will apply a rotation in the * object's reference frame * */ // multiply q0,q1,q2,q3 by a quaternion argument // argument is on the right (the order is important with quaternions) // arguments are real,i,j,k // multiplies q*argument var qq0,qq1,qq2,qq3; qq0=q0; qq1=q1; qq2=q2; qq3=q3; q0=qq0*argument0-qq1*argument1-qq2*argument2-qq3*argument3; q1=qq0*argument1+qq1*argument0+qq2*argument3-qq3*argument2; q2=qq0*argument2+qq2*argument0+qq3*argument1-qq1*argument3; q3=qq0*argument3+qq3*argument0+qq1*argument2-qq2*argument1; %d3d_quaternion_set_projection_neg_extt/** \def d3d_quaternion_set_projection_neg_ext(x,y,z,q0,q1,q2,q3,angle,aspect,znear ,zfar) ) * d3d_quaternion_set_projection_neg_ext(x,y,z,q0,q1,q2,q3,angle,aspect,znear ,zfar) * * angle is width of camera view, 45 degrees default, * aspect is (horizontal/vertical) * eg (view_wport[view_current]/view_hport[view_current]) * znear is the near clipping plane, objects closer than znear are not drawn * znear must be greater than zero, try 1 * zfar is the far clipping plane, objects further than zfar will not be drawn * zfar should be further than the longest line of sight distance in the game * * Set a camera orientation from a quaternion using the extended form * This script treats -x as the base direction, eg looking LEFT on the map, * which is inconsistant with the rest of Gamemaker but was convenient in * d3d as on a textured sphere the middle of the texture faces left. * This function will be replaced, for consistancy with 2D games where * zero degrees means looking right. * * Derived from d3d_quaternion_set_projection_neg(); */ //Optimised vectorisation for camera? //Formulae obtained by expanding out q.v.q* formula to give formulae //for the object's x and z vectors //precalculate common expressions var t1,t2; t1=sqr(argument3)-sqr(argument5) t2=sqr(argument4)-sqr(argument6) d3d_set_projection_ext(argument0,argument1,argument2,argument0-(t1+t2),argument1-2*(argument4*argument5+argument3*argument6),argument2-2*(argument4*argument6-argument3*argument5),2*(argument4*argument6+argument3*argument5),2*(argument5*argument6-argument3*argument4),t1-t2,argument7,argument8,argument9,argument10); d3d_quaternion_light_direction./** \def d3d_quaternion_light_direction(ind,q0,q1,q2,q3,color) * d3d_quaternion_light_direction(ind,q0,q1,q2,q3,color) * * Arguments are ind,q0,q1,q2,q3,color * * Applies a directional light according to a quaternion * * Script treats x as the base direction. */ //vectorisation of +x direction //Formulae obtained by expanding out q.v.q* formula; d3d_light_define_direction(argument0,(sqr(argument1)+sqr(argument2)-sqr(argument3)-sqr(argument4)),2*(argument2*argument3+argument1*argument4),2*(argument2*argument4-argument1*argument3),argument5); d3d_quaternion_set_projection7/** \def d3d_quaternion_set_projection(x,y,z,q0,q1,q2,q3) * d3d_quaternion_set_projection(x,y,z,q0,q1,q2,q3) * * Set a camera orientation from a quaternion * This script treats +x as the base direction, eg looking RIGHT on the map, * to be consistant with the rest of Gamemaker * * */ //Optimised vectorisation for camera? //Formulae obtained by expanding out q.v.q* formula to give formulae //for the object's x and z vectors //precalculate common expressions var t1,t2; t1=sqr(argument3)-sqr(argument5) t2=sqr(argument4)-sqr(argument6) d3d_set_projection(argument0,argument1,argument2,argument0+(t1+t2),argument1+2*(argument4*argument5+argument3*argument6),argument2+2*(argument4*argument6-argument3*argument5),2*(argument4*argument6+argument3*argument5),2*(argument5*argument6-argument3*argument4),t1-t2); !d3d_quaternion_set_projection_ext/** \def d3d_quaternion_set_projection_ext(x,y,z,q0,q1,q2,q3,angle,aspect,znear ,zfar) ) * d3d_quaternion_set_projection_ext(x,y,z,q0,q1,q2,q3,angle,aspect,znear ,zfar) * * Set a camera orientation from a quaternion using the extended form * This script treats +x as the base direction, eg looking RIGHT on the map, * to be consistant with the rest of Gamemaker * * Derived from d3d_quaternion_set_projection_neg(); */ //Optimised vectorisation for camera? //Formulae obtained by expanding out q.v.q* formula to give formulae //for the object's x and z vectors //precalculate common expressions var t1,t2; t1=sqr(argument3)-sqr(argument5) t2=sqr(argument4)-sqr(argument6) d3d_set_projection_ext(argument0,argument1,argument2,argument0+(t1+t2),argument1+2*(argument4*argument5+argument3*argument6),argument2+2*(argument4*argument6-argument3*argument5),2*(argument4*argument6+argument3*argument5),2*(argument5*argument6-argument3*argument4),t1-t2,argument7,argument8,argument9,argument10); d3d_set_rotation_quaternion/** \def d3d_set_rotation_quaternion(q0,q1,q2,q3) * d3d_set_rotation_quaternion(q0,q1,q2,q3) * * Function to apply quaternion q0,q1,q2,q3 to the current drawing state * using a rotation about an axis. * The function uses d3d_transform_set_rotation_axis * * Derived from d3d_add_rotation_quaternion() script * */ d3d_transform_set_rotation_axis(argument1,argument2,argument3,-radtodeg(arctan2(sqrt(sqr(argument1)+sqr(argument2)+sqr(argument3)),argument0))*2); make_donut_model/** \file donut.gml * A script to generate a horizontal ring torus model * with normals and a texture * 22 July 2006 */ /** \def make_donut_model(radius,radius2,steps,steps2) * make_donut_model(radius,radius2,steps,steps2) * * radius is the radius of the torus * radius2 is the radius of the cross-section * so that the total outside radius=radius+radius2 * and the radius of the hole=radius-radius2 * steps=the number of segments round the torus (try 20) * steps2=the number of steps through the hole (try 10) * * returns a model ID * * Model is generated as a series of triangle_strips so the vertex * count is almost half that of a triangle_list form * Model has been tweaked so the texture wraps onto the torus in * a similar way to the basic sphere. * */ var donut_ID0,dx,dx2,dy,xs,ys,r,r2,tx,ty,tz,tx2,ty2,tz2,tx3,ty3,tz3,tx4,ty4,tz4; donut_ID0 = d3d_model_create(); r=argument0; r2=argument1; xs=floor(argument2); ys=floor(argument3); for(dx=0;dxroof-radius { if zspeed>0 { zspeed=min(-zspeed*0.9-min(zgravity,0),0); }; z=roof-radius; }; if z=radius { friction=rollfriction; } else { friction=0; hspeed*=0.99; vspeed*=0.99; zspeed*=0.99; }; 0000000s action_bounce10000000W[var ang,vx,vy,vz,t0,t1,t2,t3,qq0,qq1,qq2,t; ang=degtorad(-5)/2; vx=0; vy=1; vz=0; /* t=sqrt(sqr(vx)+sqr(vy)+sqr(vz)); vx=vx/t; vy=vy/t; vz=vz/t; */ t0=cos(ang); t1=vx*sin(ang); t2=vy*sin(ang); t3=vz*sin(ang); multiply_quaternion_right(t0,t1,t2,t3); 0000000S[var ang,vx,vy,vz,t0,t1,t2,t3,qq0,qq1,qq2,t; ang=degtorad(5)/2; vx=0; vy=1; vz=0; /* t=sqrt(sqr(vx)+sqr(vy)+sqr(vz)); vx=vx/t; vy=vy/t; vz=vz/t; */ t0=cos(ang); t1=vx*sin(ang); t2=vy*sin(ang); t3=vz*sin(ang); multiply_quaternion_right(t0,t1,t2,t3); 0000000Q[ var qq0,qq1,qq2,qq3,vx,vy,vz; qq0=q0; qq1=q1; qq2=q2; qq3=q3; multiply_quaternion(q0,q1,q2,q3,0,-1,0,0); multiply_quaternion_right(qq0,-qq1,-qq2,-qq3); vx=q1; vy=q2; vz=q3; q0=qq0; q1=qq1; q2=qq2; q3=qq3; hspeed+=vx*0.4; vspeed+=vy*0.4; zspeed+=vz*0.4; 0000000D[var ang,vx,vy,vz,t0,t1,t2,t3,qq0,qq1,qq2,t; ang=degtorad(5)/2; vx=1; vy=0; vz=0; /* t=sqrt(sqr(vx)+sqr(vy)+sqr(vz)); vx=vx/t; vy=vy/t; vz=vz/t; */ t0=cos(ang); t1=vx*sin(ang); t2=vy*sin(ang); t3=vz*sin(ang); multiply_quaternion_right(t0,t1,t2,t3); 0000000A[var ang,vx,vy,vz,t0,t1,t2,t3,qq0,qq1,qq2,t; ang=degtorad(-5)/2; vx=1; vy=0; vz=0; /* t=sqrt(sqr(vx)+sqr(vy)+sqr(vz)); vx=vx/t; vy=vy/t; vz=vz/t; */ t0=cos(ang); t1=vx*sin(ang); t2=vy*sin(ang); t3=vz*sin(ang); multiply_quaternion_right(t0,t1,t2,t3); 0000000[&{ // End 3D mode d3d_end(); } 0000000[I{ d3d_set_hidden(true); // set the projection /* var qq0,qq1,qq2,qq3,vx,vy,vz;//,zx,zy,zz; qq0=q0; qq1=q1; qq2=q2; qq3=q3; multiply_quaternion(q0,q1,q2,q3,0,-1,0,0); multiply_quaternion_right(qq0,-qq1,-qq2,-qq3); vx=q1; vy=q2; vz=q3; multiply_quaternion(qq0,qq1,qq2,qq3,0,0,0,1); multiply_quaternion_right(qq0,-qq1,-qq2,-qq3); zx=q1; zy=q2; zz=q3; q0=qq0; q1=qq1; q2=qq2; q3=qq3; d3d_set_projection(x,y,z, x+vx,y+vy,z+vz, zx,zy,zz); */ d3d_quaternion_set_projection_neg(x,y,z,q0,q1,q2,q3); d3d_quaternion_light_direction_neg(0,q0,q1,q2,q3,c_gray); d3d_light_enable(0,true); // d3d_light_define_direction(0,vx,vy,vz,c_gray); // draw floor and ceiling d3d_set_lighting(true); draw_set_alpha(1); draw_set_color(c_white); d3d_draw_floor(800,0,0,0,600,0,background_get_texture(back_floortex),16,12); d3d_draw_floor(0,0,global.roof,800,600,global.roof,background_get_texture(back_ceilingtex),8,6); // Set the window caption room_caption := 'First Person Shooter (' + string(instance_number(obj_FPS_logo)) + ' logos left)'; } 0000000obj_fps_q_model" cradius14000000czradius000000[(/* * This object would create a model for every instance. * This would be a waste of resources in a game with multiple * instances of the object, in which case we would need a way to * make the model once and share it. * * make_donut_model(radius,radius2,steps,steps2) * * radius is the radius of the torus * radius2 is the radius of the cross-section * so that the total outside radius=radius+radius2 * and the radius of the hole=radius-radius2 * steps=the number of segments round the torus (try 20) * steps2=the number of steps through the hole (try 10) */ modelID[0]=d3d_model_create(); d3d_model_ellipsoid(modelID[0],-14,-14,-14,14,14,14,1,1,24); modeltex[0]=background_get_texture(back_ball); modelID[1]=make_donut_model(9,5,20,10); modeltex[1]=background_get_texture(back_tube); modelID[2]=d3d_model_create(); d3d_model_block(modelID[2],-8,-8,-8,8,8,8,1,1); modeltex[2]=background_get_texture(back_rainbow); modelID[3]=make_dice_model(8); modeltex[3]=background_get_texture(back_dice); model_count=4; model_no=0;0000000[init_quaternion();0000000Y[var ang,vx,vy,vz,t0,t1,t2,t3,qq0,qq1,qq2,t; ang=degtorad(-5)/2; vx=0; vy=0; vz=1; /* t=sqrt(sqr(vx)+sqr(vy)+sqr(vz)); vx=vx/t; vy=vy/t; vz=vz/t; */ t0=cos(ang); t1=vx*sin(ang); t2=vy*sin(ang); t3=vz*sin(ang); multiply_quaternion(t0,t1,t2,t3,q0,q1,q2,q3); 0000000W[var ang,vx,vy,vz,t0,t1,t2,t3,qq0,qq1,qq2,t; ang=degtorad(-5)/2; vx=0; vy=1; vz=0; /* t=sqrt(sqr(vx)+sqr(vy)+sqr(vz)); vx=vx/t; vy=vy/t; vz=vz/t; */ t0=cos(ang); t1=vx*sin(ang); t2=vy*sin(ang); t3=vz*sin(ang); multiply_quaternion_right(t0,t1,t2,t3); 0000000T[var ang,vx,vy,vz,t0,t1,t2,t3,qq0,qq1,qq2,t; ang=degtorad(-5)/2; vx=0; vy=1; vz=0; /* t=sqrt(sqr(vx)+sqr(vy)+sqr(vz)); vx=vx/t; vy=vy/t; vz=vz/t; */ t0=cos(ang); t1=vx*sin(ang); t2=vy*sin(ang); t3=vz*sin(ang); multiply_quaternion(t0,t1,t2,t3,q0,q1,q2,q3); 0000000S[var ang,vx,vy,vz,t0,t1,t2,t3,qq0,qq1,qq2,t; ang=degtorad(5)/2; vx=0; vy=1; vz=0; /* t=sqrt(sqr(vx)+sqr(vy)+sqr(vz)); vx=vx/t; vy=vy/t; vz=vz/t; */ t0=cos(ang); t1=vx*sin(ang); t2=vy*sin(ang); t3=vz*sin(ang); multiply_quaternion_right(t0,t1,t2,t3); 0000000R[var ang,vx,vy,vz,t0,t1,t2,t3,qq0,qq1,qq2,t; ang=degtorad(-5)/2; vx=1; vy=0; vz=0; /* t=sqrt(sqr(vx)+sqr(vy)+sqr(vz)); vx=vx/t; vy=vy/t; vz=vz/t; */ t0=cos(ang); t1=vx*sin(ang); t2=vy*sin(ang); t3=vz*sin(ang); multiply_quaternion(t0,t1,t2,t3,q0,q1,q2,q3); 0000000Q[var ang,vx,vy,vz,t0,t1,t2,t3,qq0,qq1,qq2,t; ang=degtorad(-5)/2; vx=1; vy=0; vz=0; /* t=sqrt(sqr(vx)+sqr(vy)+sqr(vz)); vx=vx/t; vy=vy/t; vz=vz/t; */ t0=cos(ang); t1=vx*sin(ang); t2=vy*sin(ang); t3=vz*sin(ang); multiply_quaternion_right(t0,t1,t2,t3); 0000000H[var ang,vx,vy,vz,t0,t1,t2,t3,qq0,qq1,qq2,t; ang=degtorad(5)/2; vx=0; vy=0; vz=1; /* t=sqrt(sqr(vx)+sqr(vy)+sqr(vz)); vx=vx/t; vy=vy/t; vz=vz/t; */ t0=cos(ang); t1=vx*sin(ang); t2=vy*sin(ang); t3=vz*sin(ang); multiply_quaternion(t0,t1,t2,t3,q0,q1,q2,q3); 0000000G[var ang,vx,vy,vz,t0,t1,t2,t3,qq0,qq1,qq2,t; ang=degtorad(5)/2; vx=0; vy=1; vz=0; /* t=sqrt(sqr(vx)+sqr(vy)+sqr(vz)); vx=vx/t; vy=vy/t; vz=vz/t; */ t0=cos(ang); t1=vx*sin(ang); t2=vy*sin(ang); t3=vz*sin(ang); multiply_quaternion(t0,t1,t2,t3,q0,q1,q2,q3); 0000000F[var ang,vx,vy,vz,t0,t1,t2,t3,qq0,qq1,qq2,t; ang=degtorad(5)/2; vx=1; vy=0; vz=0; /* t=sqrt(sqr(vx)+sqr(vy)+sqr(vz)); vx=vx/t; vy=vy/t; vz=vz/t; */ t0=cos(ang); t1=vx*sin(ang); t2=vy*sin(ang); t3=vz*sin(ang); multiply_quaternion(t0,t1,t2,t3,q0,q1,q2,q3); 0000000E[var ang,vx,vy,vz,t0,t1,t2,t3,qq0,qq1,qq2,t; ang=degtorad(-5)/2; vx=0; vy=0; vz=1; /* t=sqrt(sqr(vx)+sqr(vy)+sqr(vz)); vx=vx/t; vy=vy/t; vz=vz/t; */ t0=cos(ang); t1=vx*sin(ang); t2=vy*sin(ang); t3=vz*sin(ang); multiply_quaternion_right(t0,t1,t2,t3); 0000000D[var ang,vx,vy,vz,t0,t1,t2,t3,qq0,qq1,qq2,t; ang=degtorad(5)/2; vx=0; vy=0; vz=1; /* t=sqrt(sqr(vx)+sqr(vy)+sqr(vz)); vx=vx/t; vy=vy/t; vz=vz/t; */ t0=cos(ang); t1=vx*sin(ang); t2=vy*sin(ang); t3=vz*sin(ang); multiply_quaternion_right(t0,t1,t2,t3); 0000000A[ var ang,vx,vy,vz,t0,t1,t2,t3,qq0,qq1,qq2,t; ang=degtorad(5)/2; vx=1; vy=0; vz=0; /* t=sqrt(sqr(vx)+sqr(vy)+sqr(vz)); vx=vx/t; vy=vy/t; vz=vz/t; */ t0=cos(ang); t1=vx*sin(ang); t2=vy*sin(ang); t3=vz*sin(ang); multiply_quaternion_right(t0,t1,t2,t3); 0000000[Ovar a; for (a=0;a=model_count then model_no=0; 0000000 [init_quaternion();0000000obj_FPS_fix_cam  [ { d3d_start(); d3d_set_fog(false,c_gray,0,400); d3d_set_lighting(true); d3d_set_culling(true); d3d_light_define_direction(0,1,1,1,c_dkgray); d3d_light_enable(0,true); d3d_light_define_direction(1,-1,1,-1,c_white); d3d_light_enable(1,true); }0000000[Pmass = 1; radius = 8; global.roof=64; facing=0; z=radius; zspeed=0; 0000000[&{ // End 3D mode d3d_end(); } 0000000[ { d3d_set_hidden(true); // set the projection d3d_set_projection(x,y,z+radius, x+cos(facing*pi/180),y-sin(facing*pi/180),z+radius, 0,0,1); d3d_light_define_direction(0,cos(facing*pi/180),-sin(facing*pi/180),0,c_gray); // draw floor and ceiling d3d_set_lighting(true); draw_set_alpha(1); draw_set_color(c_white); d3d_draw_floor(800,0,0,0,600,0,background_get_texture(back_floortex),16,12); d3d_draw_floor(0,0,global.roof,800,600,global.roof,background_get_texture(back_ceilingtex),8,6); }0000000room_FPS Rotation demo        @@:Չ @``0@1 2 ˉ@̉`͉pΉpωpЉpщ`p҉@pӉ pԉ@9؉` -themessage='Torus/Donut model generator and Quaternion Rotation demo.#Keys Q-A, W-S, E-D rotate the object in its own frame e.g. Roll, Pitch, Yaw#Keys R-F,T-G,Y-H rotate the object around the rooms X,Y,Z axes#space toggles model, Enter resets orientation';؉XDemo InformationX{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Arial;}} {\colortbl ;\red255\green0\blue0;\red0\green0\blue0;} \viewkind4\uc1\pard\cf1\fs48 Rotating a model demo \par \cf2\fs24 \par Basic FPS code by Mark Overmars. \par \par Quaternion math and almost-Newtonian rebounds by Oliver Broad. \par \par This program uses the code of the registered features demo as a template, as I wasn't sure I could get 3D working from scratch. \par \par \par }  SpritesFPSspr_FPS_horwall spr_FPS_vertwall spr_FPS_camera spr_FPS_logospr_FPS_bulletspr_FPS_pillar" spr_FPS_ballSounds Backgrounds back_rainbow back_floortex back_ceilingtex back_ball back_tube back_dicePathsScripts scr_draw_messageadd_rotation_quaternion_cadd_rotation_quaternion_b rebound_3d3 rebound_weak* rebound_2d1hit_wall_slideZmake_dice_modelYmake_donut_model quaternionsD$quaternion_documentation_placeholderE!d3d_quaternion_set_projection_negVd3d_quaternion_set_projectionT%d3d_quaternion_set_projection_neg_extW!d3d_quaternion_set_projection_extF"d3d_quaternion_light_direction_negUd3d_quaternion_light_directionHd3d_add_rotation_quaternionXd3d_set_rotation_quaternionGquaternion_ball_roll_simpleIinit_quaternionJinit_quaternion_randomKnormalise_quaternionLquaternion_fly_rollMquaternion_fly_pitchNquaternion_fly_yawOquaternion_rotate_vectorPsincQmultiply_quaternionRmultiply_quaternion_leftSmultiply_quaternion_right Fonts fnt_message Time LinesObjectsobj_message_3DFPS:obj_FPS_fix_cam2 obj_FPS_q_camobj_FPS_horwallobj_FPS_vertwall9obj_fps_q_modelRooms room_FPS Game Information Global Game Settings