alex4src/0000755000175000017500000000000010744433265012773 5ustar pdewachtpdewachtalex4src/alex4.ini0000666000175000017500000000472107710457036014522 0ustar pdewachtpdewacht############################################################## # # Configuration file for Alex 4 (v1.1) # ############################################################## # # If you lose control of the contents of this file # and wants to restore to the defaults, you will have # to reinstall the game. Conclusion: Handle with care! # ############################################################## [graphics] # controls the startup resolution # Setting lower resolutions than 160x120 might result in # weird undocumented side affects in the rendering. # start in full screen or not (1 = fullscreen, 0 = windowed) fullscreen = 0 # fullscreen width and height (used if fullscreen = 1) f_width = 640 f_height = 480 # window width and height (used if fullscreen = 0) w_width = 640 w_height = 480 # turns vertical sync on or off (1 = on, 0 = off) vsync = 0 [sound] # these options controls the sound and music # controls what sound and mixing device to use # 0 = no sound whatsoever # 1 = autodetect sound device # 2 = use DirectSound device with direct mixing # 3 = use DirectSound device with Allegro mixing sound_device = 3 # controls the volume of the samples (0-255 (0 = no sound)) sample_volume = 50 # controls the volume of the music (0-255 (0 = no music)) music_volume = 120 # use the sound datafile or not (0 = no, 1 = yes) use_sound_datafile = 1 # if use_sound_datafile is set to 0 # this should point to where the # sounds can be loaded from sfx_path = sfx/22KHz ############################################################## # DUMB (mod control) ############################################################## # You can edit this section to control the playback quality of # the music in Alex 4. # dumb_resampling_quality can range from 0 (fastest) to 4 (best). # dumb_it_max_to_mix is the maximum number of samples DUMB will render at a # time. # Increase buffer_size to combat stuttering. # The module will be rendered at a sampling frequency specified by sound_freq. # This variable is also used by Allegro for initialising the sound hardware. # You can ignore the quality variable. Allegro uses it when relaying the audio # stream to the sound card. 2 is the maximum, and is only comparable in quality # to dumb_resampling_quality = 1. Only a masochist would reduce it. [dumb] dumb_resampling_quality = 4 dumb_it_max_to_mix = 256 buffer_size = 4096 sound_freq = 44100 quality = 2 alex4src/data/0000777000175000017500000000000007710717036013710 5ustar pdewachtpdewachtalex4src/data/a45.dat0000666000175000017500000005025407700571200014767 0ustar pdewachtpdewachtk}uk1<%@T*. 7ZJnFAWQC]CKSDH1!y -/A#!'7*3:"S,-* N1I# 6 =/>5= NQY,  E : Tf, 3o>]290 :G (/71nkk ?:fGg2:?]AI7V)fcE~mlC2$>Glqmns_kpndcqgP{}qsj|xzfhOl@{m\v%o.|l'orLavLHxrx~Jjr|tmJc|`iauaGubMxcFof[tyDbt}W{a~cdq@kQob axw8bfGa1Ng!d{ DgoaYe'MESfM|PcqkEMhPqOq[fLTCsz{{BQOK}qsvZvmPJdyRynHvQG\dquFH_\YvXFJ^]ehf#4TI`_Kf;4aPcdflqXH`kc\A[qkY{QBamnB]b5-W}ipL?*/:,e0-?68/o teIf"V eNOT e)   e }qn/4e &eVr]QedeyvR=1.eݢ߭Ɓ^DeY2eІ͂ύa~_$e96ebmA?e֭ݶѸeiBM!>eooteIf"nޏČeِNOjT|e)`} fhj|e`}}vqxno/z4le p&movxozlepV]r_]FQH_J\e@]_FH_JdLeyPvMRO=V1X.OZLePMOVX^?*D e oteIf"-8eNOTe) e}qn/4e &Ȟ߿ʄeVr]Qe֡ؾϟdeyvR=1.e潢^DeY 2ίϺԬeſa~_$e96ebmA?e֍򏓶јEi`F}BMf\;c naPfaP4aa!ap~mZo5v9x6oza=jpmovxogJanJސ]:_FH_JaJ@]_FiXFOGZaNZ!P>MOVXOZaZPMj?e&I(f?'*a.* =?&(?*a* N-J/E6)8/:a:0-/68/:a~ qn*% & a Vwa^Q a uyvWa>1.a^zUY7aaa~Z596aݪߥƉȦganA:aЎ͊υCHFGaN!>תajeIf`a.ޭնٸaNJE)aڟa~qn*% &aVwja^jQ`} fhjaj`}uvyxvoWza>z1p.movxozazp^]z_UFYH_7JaJ@]_FH_JaJaP~MZO5V9X6OZaZPMOVXOg*an*A =:?&(** =?&i8F.oex,X1 6/13g˿a֠-/q}zlR: r02l !=fQ]l2 leBF1=:llbjEb&lmJlBJ%lκʵݖaMjϓ*. 7ppiaSrAZLAU^\sRPJ]V/>-(.šf- >%5$YV#7(453S,4 2 E;I#1=9 1.= I E )8ސ> D5 0   G&371#o\9?:f6()5x]C]80YֆqQ[hC2$7 KUmne,rm hd\r*&pfj"*j+}?g)?@ޢڍ)r\axX{B?R[ZW&;iOoo",,-~RrAq]TZƯnߣ4luCMATd_`ĽMjϼǍp͆ɲ楾pI ic@]"W}D-PXyWXU6DkW6wg'])%2*_"6*o\4Ŭ\iJmTNנxl[@cc-qTUW |g_t*pu,,Ž7`p7nmjڢaPSjnPfaw@RszWvjE-sW @rS}K {7PfahmmovkHH_EJe|c|j4AvoA EUE@av3mp>#ZŌF_J\nQr`]V1OeE WspXEQl[T*`2]t8f ,-'n p&d?O!_:#9.*lmE>C#F"yY fp, z`|kHea b?`)YIV8n5>n+*Q>5:605-Q /s]R/?b wTR\mkxpJnt_ƈ?ŁW@ *80= _.? lf]Bc' me^BԠ01_[iqr!?p#m<;nf5j]qc|^sj#%szw`rK'/?s\'1F#BHs2D0O? 0 S06sRvQ nBtoPpEe~p o: p|(,G /qjlcihTKciyBJ%iqItC3Ƞi^㹡pzxiH-ҍ9p׬iq;bWi盱qE'>ei"%gi.݆3s񤺶ki$ aL %ݍDATWSn<"cfMIv#O~[]|S *ZZqqmn}_gApf\avp\݈np`hy}p$lR|z @rhg vkekb(bu^Jr p҂iqݠrŻi|aCPZW _2Rg&V >-q#MorAzfoFrL.ɑ).p`JtuYE"K>x&H\n[KZZqZ`WVA<Pn|)[%b*HI(j*dQ9v;&b3if7T7%˵X im|ᅖ Ci:+ i%LB|+i1&6}&ШIi!!ñrG1i z`*=eE2<#Ȕ4 ݇eIx})20Hez4|=e}p' e]Mqeg)x9% eDA%we'^d [=eGɿU/]>eX, %ًea,͜mex-\F c})em-/=w;in[&?)>a:~,T1,'6/pSY^WwkJzUC|'[Ru8*phئ ppV YUEٿsp`܁5 P pL ,TD p oe p0lhC` 8p   pbgLH#phpzBG,( pPHpZ"' pTrͲ=6'0]546PmFwZPeD78\o͊υiFGEZ\C^ #[:VPK3pV Y1-2]4|7ph>R/Udv43&Up}'mh#-/70'%lAHVU\=pr_FHPOMZRN>$iҥ)V[BDf`_aiRs?E3Aa։-6*SgTcgavy Ss Ys$!a 'nxiƼKa{|c rdA6D}!Awc9N8$;h*:e2@6/13,XXP=sX_0CWhWDi maeoKp-M3eWcNQLServPXJet1m+ RB&deIױlfMe}jH7 eͼD_uk Q)mvRsZWs+E\-%Ӟsz_ U-CskjY:)sV*W:*}igTszK_y2ZCHsM,|~R\gMs BjئasdYX HEQ_Osåc"s*]R-JksRZ^z]IsM6>^L(x3`sˇⷜ+ Jsf+*MN\s_-^gS;sWQoccjss(NkaPDbs"a7S*aQϩsaPm qS/i~sqiqa{usDhHtSGmEs}@vWzxsAw0F_׆ mBsG' Qpg)esVFg{Q`;s|>@zQ`STs >Yp/>^s'!;{,-s/@&?!9.%s,p&|/w1WsBs+sP(0+s 0{ FɫQuQ|]QTUjl]Q*jaBFen{߆';tq e[ ov62"GecLvqeincc=s>6e㫎vM~x6Q0eZO3F'e긥VE2m䋐u 7;%q9d{ IQ "3m~NAW=CMAlʀQBfoRIt2h nIwIIJN~npԢNDx\ʇK݂!=Ad"1p~C~6@qZn3AUjHKz#9/$/*r.=1WVOQ[Z?{# ~0̙GVRnhw)pŬWlpUUCHi':@iy^GY,8\C-_Bc)NVt7-rev讨-rfa߁ccJe(`ij񙒯 ]O  ^RxqVPT}ix8)'!w𬱮. v꧟㬥)bc呈)zef_up*T{`;*ętߑ+n50+&*cJ@Q]}9Y@e훽lr lxtTLH#_ϭٯi͵" Йq~Pr \WeWTZUk|@-xU*4]?! ~, * J /$ZS-\㩘Da? UP:L J/ ,E &ZRi0&H0L XGkX E/;I=: \0I6 <  N+:3'g,NLE~.=_P-Qs>f]oڡl鋌# &}R-PKC 70zkFr@Pp&ڽt>٧V=t?: \IIA$ o˝c@e]>ҏЌeehBCj |=`:}fh,ce^l[wqvnhXimh{lddxpaq{}sJdrkZd~fhbjS}bjqLy@Zvz$@,q|xbuocH%oqqYEfos!xFγ6- s?-v/1eJ>s1-#F_1F{sUaVs-#V1V{s&*G+Q "st$q*-]%!#Me_P\gqAo>??e jk{A/8y{eR}klq<%$rl'6^4%fnB^g;~Zz5dp _*KwL go2EVÝ4B`2apERe՗Mo75:@6ShS&Gͮv1# s@p-ݭ=޷ΧڈH o3.n_d~V`/jq͆a=W뜂[{"`{Aܝe|'$nCe(<DPi׼oФﳱkqs[-_Ǥ_iƊi* _ ᐞ͚_yPtb__[ޣ`y[c`^نvjngIo$; qgaR-g JƲߝg_Jky2 g OĚ[LQѠF_QgYtKzs} ;cac<eJƤi].puQ`F~BI)5,Zq-`mMZ`q2#i}9xsi|XθnZ} ωu/UU$ydhN$!G4Ǎr8&N2'0i'\}S,4?m#,1n=-a5eFso.)xĐeg)tiao]hjG?7e̤RְD?v]e̟ѣwiR /e0ȣZ&}He܃|Fe)3 @ӀExH7lOm:5} XlҨfo0zcIhss.n lpNim(+rˡ/}Py{{|bRfmRW]JysFDrCroZRM7Lyyn[%!oXpFnTVf|DknYc_RnyJO`{0CNsq,uiĦ|p+ңi\(K1npK?\V< luiPSJ.%i;C%xF\M@/K؛Gik! LO" c0{@?Q` S,sT%DF6Xp<^K 1 wpUx(w,.6@ x>qepVSL1?0rd k'uRxpf_= Kl k}_"GlXA}5Ws:GfBgIZRld7kx}WwwU{ l5qV[~j3"VbT9EQ.?i(orL%X(&*ik.tH FDo$^}:܈hG@Q\țK Cq^p~ky 4WXgAWwX901~}2x@Unqu\J)|x6ׄn嚀ƓϜ4fKBnx;| 0o_xoyhvsȦw6A ?%ZgEj&uT7o-`hYZf_HpFDFX@Ip@' 5dn&Mlk3n]#n VqmLë,nF<ӸnMv-+n]濡Ѿênmf6 Kn&ܳ{cn-̀뎳nЖA}|[#:n ̃nVƏaa8nnͰFfa ns>]Vfo!h 63sa^vqP$cnsqE@nf~_)a@s~sqUpFo9ApCCNs}Ae`NF_6QpCS^sQp>VOQE`Sc.{Q%`}q*X:ZaHp =0V2(1?/$-E%v(mFzh$'Rl%/&%r]]3Pr%(<#R*"4=c1>$m&!4m*0] 6+>=)185_i)1W02 9 -+{'DwV 1W 6t}e"3s/SB:a08RA3ee,j 5u ##8E& i99H*t\t=:nYqt"Wghc[^rwza!O,ma)V#H5in]hC{/'%"ncߑf /W.")jͮ|7M%@5 uAZ/8?9(I}76*r^p(֫3(MρN;3lnB4{y"#bqIr*#Q2峂PΕ0!s,Bߑw o<=96 O_ب㳫fT `xw(eةe*ekМe-* 㚠ey[Xw]"e8[jecfkڼUgx2o8/4{<#4Gl틯hGlOO ]_lοʳ@]kdHl//[OVXNZ_1)wpN4$[sQpr-lr0SxWz_-&-z:?գ'4fCͪEJ^uf\&t)k}g\c':lk G/5P-!dn=6/hs7}>` 9%1SS:sWf)0M sVaj5@f4aP&9sV  LPdmw-Hy%]{3bS]aSOPwx1Om?M HXZ1 VN 1=>y:H/f:汽>HP3b!yGultAwc3i~Uq7 =4s)wz9C~]fdsRsLnLu8y}gw,3}Sry1Q>hz8hhAH\$bɕ 6paŻƄ+Jz:ڄinz<ǧ @koJ%w N{ӡٷxfM^R`,`j3iqQZЙ1pћ==fI"`[Mжȸߕ*pP|v C-Ѱ8ӿ{{bjS;m&D$jRqfqr]|ʭίI% ˊ)eγ揌ti.3/Բ.`cW7`7ӏMH|S\=HqvMbyqIvo:Ru%GN"{P hf_'>aE^FodMdN3Q)*vok]~Eaɐ&M&dbI{XxOJax=@:]O?FJ_+OyvW8<"2"gzcA{#iN;b]>!`U?#nG&)&#&& 2Jpj40kI~e^ wwo6 //4n´.>X<[E(Oy873#8*9`p<7/x1| &{A3< %5.f_NN: _##jNS_u//,10F5j 8| :eCyq&pJ(_rjEkf^(& m 7n]qmuoh`Wyfnh``Oc{c}{qHhuzysq@RHRSJByWDLKXBBq]YABZSjF[]XJ_TcOndW{|rk~NLwYYCQU'8'5 =5<!  +?!>'!NUSP]GI~lpfagnYsݳehcMkoTC^Pc2+*#041>' K# 1.6<8,OJ]HvRpspxaǐ ލƖϪn{ina֦®ޙemDbp\\ZY56+;+?4.6  96%1 )3PVCGNxRtvǏZHűֿegRkpYYZ[PLR&$9) >!<(*518>,5?)3RPVIKOD`d{pIzDEǫ͌Ȩ_{bdgwBv^YR!0"m%ߟ7 8*400?/*NSG^EGnuwqugl@XN"$;LȖ̱glOb{|AGKAqB\JLW:?64+? Ӷ܏٠0j >6,*16 #=9"+/LSJCZBKxxgweb[ppEʖVq_% [= ҥ̳޲ߡ_pm}~DPNBH]U\eEW0.=2%6?̽ݏ g Ƒ%&,-'aRY[IR[ZlY\\EKE}n~x~dT{e[AyN@LVK5<284أ°;2[t`}}Hiw{AS@Jx[E^@Y7GPY_3*m#:>'?`: d2tb"+,Y^EBNvWISpqDgd}|8M`|hlh`TiOfr@DIۡZǩ^f@Mm'ˡ>w7p;0/柃_r͕gzedRbٙw|kLEAQGIH[ڀ]RVّ/ۚ8%0YEQl@DOSRHrwQlCSt _bRJ&Alu"c;-*V1l"'-0a&X6UAl;ST ^sB\R0l_CBXUAlPt\CBZVClE T[$|14=C1l3 6<2 "\(A&RlP DT*B+47+$!7l<#G1,;01-%-3l% &+7<* )l0>-7m$y:b2L"lp4Wq<-AN$];l3M6,< #$?:<2#l>40_!+"_vlG7:e1$1+=3le Lk q|l{P llځXltB lXl|XSߔʣ_rԣnkpsxQAhGg f21>t:(O!r =_!!yK sn?I|MYΞɏyfՆں[״ZUqzi`]WgvOBհKDJ#thS|L&mj[CE,wLevAhulRl}R˰QmҬe›{~גo߅CКytrMH`pH\[~${K|}2`r]FPn+RTtqr{a|C|l~Ũqͯ񆔘v~qt@EOEuAylAWr"ANM|cZAwdJ`~k@f]rpgieJuhmeanxʬtچDqΙnrPwZgRIlt}gB}dDr,zZJRvWXiqesnicZnh~xܗZefdrMݥjyg^ay`qvJdiupu~`fylmvJeEMrxInhgaJ@k~`bB>0loeWfbrwnMq#lij[xdpPz{Af{RmtLZUhquz`mPymfvl`Zplgyamuiq{jdfdpdch`cIl{qbK}^kyW}}Lnx~Nxn}HIxalldjwrmc^rzsqwqr|iqqkldkpfxRm`x{}mqp~hddabxw~xqvbKnthzOimqwpFtfswksbjQxf`q``wyjuw`th~nken~a`b}fhedjZjrfc_qv}l`djbhl]de[jcuieiog^wmwxgoweygyq}hbWga p\fwklbqwaeqfjpcgspb]qhvdwudeXazvhQkYlb+Aomasqwkrqhpdlr`ilmenkɛl^deptAe_{e`ylWYu}`qdy`a{o^udw<\qkq`nZ]flgssifwk)rsjf\oaemgntt`kX`dzdZtkmf^wremno^i[tܟwcΒixhodbdje`jicshfmg\k{ϒ`XoMri_zs^ϑeph^lXpjpcd]o^siqln[u2!yژmZrmpi\semkk_trnm\rS~jjЃcorlnگpb_i΁Wo[#-dnpelEHǘmeibnqgmapkm>sNudm\kpkj[maPl]8xqq_mgƍϡkifem~};xjg^mamlfSb~osm:M~esoOQ]g8`U}NOrї? 2j\kY[qesqr wӥ|_xx_]orOP~^%rnNxQ~Qd egua%NLhaJGquc~W`JnN@G#Sbijx~xXS_7HRi}FbDMo=NHaiDaWR}xQiBHuQ4mdMaifxBG0Q|xBi0VfBSS˂YEnZUi}UCD8PLmxCiQDuTKi]CiM$VG[lCbiED{#G$'V\6iR5Q\FXZ!Di!DV@`:w,b)i!5q6,4i0aFS6-M_J7"Gy?()ovEk@zXuGxXK~AUQj|Ao ]7$kL@{ d`mdDFwB^dQXy2qxYnPacuf H/Yh^aIXbgit`P`}Kx\nkUVڏ6x*ɞ7D',#E5OhSxiiLthJpdxvḿhRx]e35O[=22NS6asn5 &("6!!ئ̿ToPRcsg\gChXrB9Zhgqe: h9 eneؤ'pʸ鯤/IC_Cw[[]}B:0-/6n3>:iFBMn(0 l3q ` vJ E952т'/,qٜ. 8)6wDEG$+ p;ٟ7CN+"<+$sY6SN)0P/g1E O= I_ G8ealex4src/data/a45.h0000666000175000017500000000456307662140312014453 0ustar pdewachtpdewacht/* Allegro datafile object indexes, produced by grabber v4.0.2, MSVC.s */ /* Datafile: c:\Documents and Settings\Johan\My Documents\game development\projects\alex4\data\a45.dat */ /* Date: Mon May 19 13:32:25 2003 */ /* Do not hand edit! */ #define aaa_F1SHIP 0 /* BMP */ #define BG1 1 /* BMP */ #define BULLET01 2 /* BMP */ #define BULLET02 3 /* BMP */ #define BULLET03 4 /* BMP */ #define BULLET04 5 /* BMP */ #define BULLET05 6 /* BMP */ #define BULLET06 7 /* BMP */ #define BULLET07 8 /* BMP */ #define BULLET08 9 /* BMP */ #define BULLET_HIT 10 /* BMP */ #define ENEMY01 11 /* BMP */ #define ENEMY02 12 /* BMP */ #define ENEMY03 13 /* BMP */ #define ENEMY04 14 /* BMP */ #define ENEMY05 15 /* BMP */ #define ENEMY06 16 /* BMP */ #define ENEMY07 17 /* BMP */ #define ENEMY08 18 /* BMP */ #define ENEMY09 19 /* BMP */ #define ENEMY10 20 /* BMP */ #define ENEMY11 21 /* BMP */ #define ENEMY12 22 /* BMP */ #define ENEMY13 23 /* BMP */ #define ENEMY14 24 /* BMP */ #define ENEMY15 25 /* BMP */ #define ENEMY16 26 /* BMP */ #define POWERUP 27 /* BMP */ #define SHIP 28 /* BMP */ #define SPACE_FONT 29 /* FONT */ #define SPACEMOD 30 /* MOD */ #define ST_LIFE 31 /* BMP */ #define ST_STAR_OFF 32 /* BMP */ #define ST_STAR_ON 33 /* BMP */ #define STATUSBAR 34 /* BMP */ alex4src/data/data.dat0000666000175000017500000015121007673120654015315 0ustar pdewachtpdewachtk}uk1<%@*. 7a_WrB^HSC^]sRX@J[_"$,h.3( 1%",& e.9 >L# ?0E7 >I#60(Ge:,0=!9"9=+4/\UQ] PiPpijtlnPOnlNridvgy]NeD^Zo_MVihj|ae@nv^oi.x ozlq@voixozg\}AEpNF>_iH-_J\ApF_iH]OxZGL]Q%`.VOiXOZLQ`VOi~(}?X*'<=!-1OAAW3U^l~kECzfc< 9Vm#^P1f%} :Xn0*9?#ekbn 9 ,4wC_7r FXI3P3,""pqo"5Wp|7#n^8-"4 9}#>sm/9p<"7 3!8;#9m\8jje]=(GH\ ?3Hye`13'&@f32-:A !  0/6_I5 2L 05=U ,~?3"906f"q5pQZ]A*jAP_K #C1m\*N$j_Uj8?#<5#Wrpm`> thf  p Nppd9d!бpJmdp(piȷnDp64qpeքȥ'M[<pڌ̫~pw)B_;pǨzo`p%WжpĶLg{p48ƟͰƆpuW~X4p(ɘ׏ΌnPafpFj]|4a Pfpfhj|aPwvp5v9xuoPzl q@vpvxozlqp!FpGF'H_J\ApFpFH_GZaLwQ`0Vp$VX$OZLQ`q&pVXf?q*N< !+$&p&(?* Gp7  pv-^/ pnpYDA %=pjp5Hg!pƉȗ߶ʎK.!pXTp֦؅Go{\7p3pIfb[?p縖򺍬pEwt_5ΰp䆹䟡l1pTX&3ʑpwj`|ta>PXjp\fPhjtaPfpfaj|tqPJvphvx;hjlq@#|pvxoAJkjArpvpFx)_:J\tHpF;x_JQ`OkCpVlCWXJn`fUpNAE_\>Pc]pZRL_\MQO|pm[G8,deJ#pK-~HV1F#Zp,NT/"Uu8NW p q?3_B91/pH3>5?e2f>p78*P%0pP b Kp;30  }p}BP(+pЛpc@]"0 p{pkC`=x|5nΙʒQiP[#&Ӭ iϫѳӝuiL'girqUViɿľi:joT0;8i ܃ێivqL+ۍiݠl`K}iVQa-P,cѦ }iaPcn\nviyaJF@s:~jp0mipyEsxozpmiofAGi|sfqx@kiDXqp@VNJI+tiUizzF}j]ie_AaP>FY`UiY2AGujSiZ=MVKifQsI}&kY{|MiOCp!&Q.zFci7}zyhV7*+&:@c=i/>M)x7?< iS<q3y iH#J0c8=i m B1 i 5icfMI"iip{CF-)!iýΙʒQiP[#& iϫѳӝyrqi0; iv}YRi;ɺiksV]921iðƃi`KS6=эiЏۑb`A}i@+a3Pcnj`}iaPcm~izBpami o q@s~zpmioqcpfCMNIJ"@]i_ApCNJ@]ipO{QC`FS-^)ZP!MiOQ`S^ZPQ=iP?[!#&# . * =i?!#.y:r0q-i0/;13>:0-i/1v}Y Ri0 iks V]921 i  i`KS6=iЦbAi@+3imiBai iߛcfMI"i޹ڲбip{CF-)!iˡӐQP[#rn+&,ppivn@AWR^W_o@EPA^TjA5/2(V(<511+7*8*<&= T;O2*6 $ # 3  0 Z3,:>58 2,U^_q0?"<g]*9?#\DXU6'2AI[7`DuCZF`arX]#>5N_rdNfg#ly+hnȎ̊ae\sn[T.`aepo5ߒϖsﰆBdqpdomjy"fw4s;jm6t(MEU\IeJr%r wq#Jmh{dkpt F /l](NBom-{kDXD=\mBv Pk` R\YsAܫ!YVmatn=&84dl(ٝÈl\IASl яdhl3jO`l}*fhlnj`}fhcol+~Rz[pm ovxol~zpmO_wFwHq_l%NJ@:]_FH_lNJLPkM`OiVWXOl^ZPMOVXOl^C*z y=?K&%(?l.* =?x6(?l[>l:_0+-1/68"/l>:0-6vlD@ <l { lgBal ( lS\Z~'llKaJ;9$lo߫clx\ lʿK͑z$@lT,ִسlޢL\|ZR#l̿Ǧl{CmJ771l徳ЯsluQ +.)ԟl[WxDlH:9Ϗ 㘃l؞|`a8fuhrln,j`}fhlnSzopLmAov8xol:~zpmovgHC_lKNpJ{@;],_'FH!_lNJ@]oOFHQOlE^ZPM0OVXOl^Zl K=OVw(t?l .!* =?&(?l.c: Y-//i6E8#/l8>:0-/68/l{: S:l  sld`  <l[bAl;+ls|g7l5lk΁jp:lݏƣCl|A:*0->/68/l>:0-O6'lX< #l k wZ`l4 Sl,t\:1ll[#Ej<lWDlU1 ȄlΡʊ{͞7sdl(ͯև؍lޜ\AAUl dl3Ol!lຌGKl+P] ∔lGwql%=疷lL`,ifWh$l8nj`}fhlnCzzpymoKvxol~zpmoxFxol[NlJ_@]_FH _lNJ@]_WVbXOlz^BZP2MOVXOl^ZPM\?g&B(4?l7. * *=?&(?lh>S: -p/G68/l>:0-/68Dl>a J;^3$l oGlx\* l Lz$@lT,ll|ZlTl/J\71lߧwؤluQ h)l޳ڪ[WDl8L 9Ͽ lخ|a8s4lZ٭ڶlhLA"ӟlܟglKb}l'l荼gfQl(nsj[`}>fhlnj`}LofwxolX~zpmovxol~zO@Y]/_iFHb_l8NJ|@]_FHTOlNbZ/PyM O:VX.Ol^YPMHVa(N*. 7ppiVo]^S^W^_m^IAYTUgD-+ (U.\0.AD(! 9+Y!=T3" * 2"6 +P3! =3 +5602< $5=8o@\K[**" U.fD'1<67.mG@+=.)-VPPZ. )-ZW/"qRX-"PpiKL"defeRSQ6E/.1( qo*>:0-3/68_3>p {xP63_7?_hl <L sg eAh[g]P)z>.g@FgbfigSHFg\Hg^G:[R]g4 cmg_˪ʹ\ѓtEg7֟8gPMR g gݪ{tgp-2ıg௽hk[Tg ۆ˟gbpHK;4g0ؠg}jB|Pa(P+fagj|aPfdqg@o]z"l0q@ voqgozlq@{Fk_DAg`_=J\ApF_Ag_J\`Qx`[VKO$QgOZLQ`VOQgOm*r<@!X;&+?!g ?*5 20 9 '.: "'3#3UQC@< (*<dVT> r^]@#%?O_Xo)\ݢ)Ub@]/5ڏr_W% LesFhziphVګЈ̀rerQ';p䨢ªpxtsͼ;pȸ篦\o`pTX6 pn]p1=: Rp^hjw|MaUP>fpnhj|aPfpfMoHzWl-q5@vpvxazƼq@vpvkHu_hbLJFv[Fp@ H_z\AmA?NpCH]I2? pmentphDcpg{pH$BpƴȳߒqG[4p(#ѫp֔SrQ';pÿªpxtsR1pĸ㯢kdpXT2ԆpȆawKDp843Ǒ۠pbjA|Wa+P$fpfhj|aPfpfdxCoBz!l7q @vpvxozlq@tFphFDHc_"J\ApFpFH_J\gQ{`TVpHV$XOZLQ`VpVXOZq>OʒYanapkde \ vnfǁrpؗ"Ձwx2@KC__]A&0;gGkfgwlbVqr0n[ƞƚ߉ Ɇ0XujCQX=xxEfƒl_{aXd~`zKp_Evel[X~.gR7j[{v]SvjmStfCozSmlھ3ПvcH@_]JH|k"z]KP7zM fkPXKBxieD_zvpXoaQp]m^RT[Bm5p~h~%mK)]_piV@mSJ^2Z=P]'ep]`-c=Z^Ӏp}J B9R},$bpf) f%D-K*$ _Ep!#.g,(GYwk_S9FU\yWYdAeU#nw!r9WfUXgn6(!3> nz/6"aCT+nx+/>9,O;V6T=6@DAE UeL)f[)+;+jBa< )\]F0!]Qi}f~o_tMbqnl[qkr[ngpT+9X]_elW~Țbgg`sHnsAlT"2Z)*0 7q4g^s]CMT]kzqe}WisI&ADQ_UJ0bk_ ޱں耒J`Droi@r ovxozlq@rouFyHv_WJ,\:Apr_FH_J\An`rzOUVYXO7Z LQ`rOVXOZLj!N \xaX^JmD)dA/m)='mv3!+` "5nj`}E,߰uoim nxpyR7/>:'o)L `8,)&or(vi#ͳ,&"o%E /<-82-EaaUrB(J_[] 8?9i7"Y~4p+)7)<" x" lyᷧCrhCem~˹#ut8fO=ZrEtW89i3ף&2i$Ҽ/ƕ ixWы4 iní/!iء!9`nP%i~nHi5ͪo4营iծҢqV}/i9 iNwwe>ʯiƟNJܜuiyb# l0I k_{pMnPkcHnLj?`<}paPcnj`}lop-N@,zpmpq@Gs7~zo@$p^AH JopZaaˑ3JW4pJݵpQz9ZW_pC.ڧ=a_p\`#P4B0=p!:0/p1V3MI w=ppB*W pC F ! p Gd$qZ21٠v]QrgP\: rzosr&+LQjr{&s(52h=j|aPrc@U#7 ]SYnvoq@scNkJnEpNF>_ ApCNJnFiApdSC^n%`.VBOA`SΆnV[ϸQEZnϥӑunwXL/.*n٦ͻ1>[:nJEl2 "кnڀ0Dnw ' Ԏn z_qUn 8,z!|nШA?!wRQ57 Pp|V^TY[C[JEYWw(74>&.vvfoAq]@i^&defs~K (S Z!d"DVlJYfsag<,=)X1W^AŬӱnYg'-3 ?4AmiTBS4Ś^͎~ np0C3k0B"%]k Gdej?!eLjQ?'|eGoen g>YZ's@ ]e">5 ;nvde<4:=1dcCt^OlnWsfSlݗlp{xP;30l):l>p{ ]P;30lNݠ@, ltP[0lګЈ̀ϋsl)68l<0/lM.Ϡ콬&lhlǍÏԯlܺgDlHL?<%Qi"lъڀ//Vl~$ Q xoleNaJJ@i]!_*FH!_lNJ@E EN>=^cX]@X EVUii Rq*@/s~_{ e[ToTPA Q)e0anG_qM]'Z DW?S"(_5#.Z* 01?&(_#>*P0m-J/6i8_3.:0-/6x_93_~ O-/_ !{X_? 1. *I_n {8_9^N_o~Zu_ )_hnOʁ7_>݊d֩_H/U_yӿ޾ڱD _(Naզ_pMj$_>گ5_Yoʯ _.ϊAx_ك_QJi jWȍtjg΃daNjmZm.aqnc$CanZ6rrriya9zl|a%P=eqi(WqeUaPvvfji,xzMtYsqLKbixaiclrkG\vGvoznZ+QkASsB]YbRZLQ`>OZlQbRPPW`M3hx'PdepcNeIrxܒ``mgc,_[n{X t~_^v#wbro\Xn^{LAk'qNWq2Tn\psw~"m leqfj(nrD]yuC%Vconr5IZߒA]vNpZ_Xg-}E3UP35A pF_AwDGaJ@]U^{Aea -0p2(%3&a}6.45j1#qIw @zOGBa[x88LBhuB_\yt 831l34k<@1,$4d^u*v%mT&H?#!;*[V==?r[KS4Dv&p&n0V@a2I(p10 po5s..88Z`Fu3 >e.7='&i ?3#i;g6b>:,E/p{C0F-07>sL2MmVnX*;pQ@&Bߓishg3f`gl[\9trn NMzpGVTc[Q.`].JEXmGvoTyȖOB^]B[_oJ&#Wf)6685(#">+fy]gGCUcKRkA3stxlzrʍ'pBe܉Ɯr̋}eKgvP*r'4Kv0*zr*oFVS)or(vEToNre)_y>ZZr@˞=4=Cr=EuHuřrd>TmUrȴ迟r;Vr4&]{w:B@q"uK߼/g#X=.?TqN܍Q:CdnE,V[,+T)m'9foۀMpa &ʑipplnju|CaWP8fp,(j|aP`p hdz{lIqQ@"vpjjI |p/o psguXzptzozlGA?pqpcFMP_CBXFpzpu1nhq>}AvxDpvRsgJXry`ZVpJVhP3V3ZNApVpFi)[W*7H~AXEp[F(?,6!spt(%l@:da6p68/:uap0Cp3;8:I0pMU > .^qqZ^QJCdy+l:!9 &چ҈?ㄎ ]Du qT^ġonf`_id=aOm_hs־p@El4ö7-l8 2(odc0F_DCH/_уA׵_]͟®gk_e~cۜ_ЯO r_lݤ_ʨ'уݤlx_ӬģSU_Gdۗҡ^gޙ؟Ɵur1gsƵ2@wלQmE4n4ִߔ-odZxݹ6ސi3XOi8*̥μi᣹ vP iه%ԉSi*fMRiJ瞊Sac/Y PܠĔ8ּmܫpp -jhcf`ۣUpܭRZ:hpN{Ppˁobɠpt^.".ʘpr-fqppE3sgi+pQJ H{pI?g{LNQ\8p@vlOZLQ`VȎVdQ AWT]PsRXDJY@m&&$<+n-ApU^K[Nk]/d?)'mv+fg^P%ydgi~b@h,ij?E!Y.+.* =u?*UmD* Mb'a`fhvajp a룣 e޶%baI♦0eu#CYa %#:0-/68_|{C /Jjz_rky e _{GUIfWs\P_  W[dpdOgg&yHBQUgKcgDҫdz#ӑvLgg?P4gavqguP/Kqg)rع9v3goϕv<}gqetg6{|b dPakoOV}z[(>o2͸꯫oFQ(;oҝv68,1o-F1=f^aor} o&&hj|lnWҧaPca~eznGJFo=@q^ʪn `Si.m*n_0&$?!#.*n&t/!j3I>M:n?6/S+3>n;tO:SnN >ސnӪޒnwg@==:n 7ӡLൣk> n00cs <ǹǶLL9Kj C cJvgBohDcMa@+ ݚa{fshp-ja j `(}fhjaj`XmR{Dx5a羢qanMMF&a Ha}NmݭrX%,Za*P)MߖJOpa}.q?Z&R(l*amPB&%*!- [++$kǰȆ\_pg{UzWoRwp%z6/i8obQi];inarP]f1i=h: |aPMvAoixl qoixzlq@iol{2pF_H,JpBUC]JQBMz`)| /= FpO{QC`lZZgV_ KDnjAZRr^8zp`6warqqm԰aɵ τدaͣ|PI=^Xo.xӆl3_y~ޝnM:ҤGS[C\GX:n5"&̭kͅqOj|XnbmA*2}n9*(Ln숶(?V Fn(+RºnebjnqPBf2׃܎n8(Tf2n(+_Ğnoq@sgNgJn:Pfyg>>4cmOUAVUlK`P9/.$-?Ap_`VLXoTPzn=`VHl,=Ini?"=ݮ?3"n lG**aJn^:&@ %>3s n;u\~)tN: ?6pC@{c-3&(?*Xk<cN1^rpQdfoVBUg2>0  "g 1  =g6 &!#qgv7Y)o(kgC}QC)W# &) &i }1F6Ni1s:,:K;<%i= v+ ʨܾDYBYTb&/4>5n: Ӥe\mc`o؁ϜaqzyQVh !$ǽ,<4]De#O7wIqh=e\$/ճ֬\h>?;#guP/qgmu6Nً5g庒U-&Տ$<;pfFC z%p^8ǃғpI4pPىoR泄ltmTo&q@ 'HPJԟ\ęCJ\.W9"`5$)aa}P^Vd"!5h0IfmUoAbWLjC*7c\AXRf%+Ixpnf'f N J@]_FnpCNyZrPqM)O"Vn`S^ZPMOVn`v#}.Y*R = ?&n#.* =?r6nsV3]>9:201-/6n3>:0-yRnS06= n0 bA Y2n3  n miBa9nncfMI"nibnCF-)!nýΙʒQIBn#& ϲnӝyrq)"n όnv}YR n;ɺrnsV]921nðƃyRnS6=эɏ–nb`A}Y2fn3Pcnj`}fnPcm~izBpam9ovn@s~zpmovncpfCMNIJ"@]_FnpCNJ@]iObVnC`FS-^)ZP!MOVn`S^ZPQ=I?B&n#&# . * =?&n#.y:r0q-)/"6n3>:0-/6nv}Y R n0 rns V]921 n  yRnS6=nЦbAY2n3nmiBa9n݉߂ncfMI"n޹ڲбibnCF-)!ҦnӐQIBn#& ٯnyrq)"n€᝹nv}YR n͞ɚrfnsPVc]n9j2`1}fnPcnj`}yoRvnS@6s=~zpmovn@s~zb@A]Y_2Gqd\shf#\Apr_FH_J,[6M|r_aVMXjO+Z8LQsrULPOZLQ`ri?b&>COSv<=!r?&(?J,UUr?{6s8p/-:2,(Her'&8/:,1rj3&If' < 0rH ~ rJEL.$  rI"G7brvA- Y{r$_murIR%rW4MA-murEZ>=K(r߼H WerS0SY)/yr@֝H>J<.r.ZZǼZrۦ8V<$r&Pۯeɬ?v,XmPpksr 3sɆH6?s0h0ߍ,%&s"!sӬɾ :zhk+sr&_?eic"oϏiapQeFtWi᨝M=^qre|asZn}KdI^eEbpArNorYse2gꔢZ+pmAFq`v:y_lgv:Fq_|xJVPMkQ~X-`p^\\z`:ߍoPWp^ZE4QEa_Q7@p7z8xaxP&?$5pM5Imb16.!p:B6pF-сD6Qp.'!Vtp ȯ[pAUwpR0q9|\WրpBKцgp{4,?N9pQnAg\NȠpkaYȆ?:apM'|aPf ?tPpj/aPLv oHq@pzly\foq@pgJfqYpUlʿ@pJlA@F`_|qppzZIL D`'VOQ'PpZLQVO`!`pdZ^<4! &?!pJ,16/1p:,d|0WG <0p 00p n D\ 7' p  lpqN$<pЇwpLpQ.plgWP,p1ߠpʞtLG70 p֧πќpa~T,'pμ`|A^4m/-/3pleqT^BmFDB@^UsPU_SF 3$o""$?".!=.$ ] 4 ; +R?3P??Ҡ<9k.5="%1$ :^oBG /71oW9?:\DX >'5^XF7nTPdmC_gc]D\',#No_~6an`p{%%`װrp|{Z)m\qmrԏΌSsmjc!p`_}+$fGh]dbLeS`<pTculYmdm9_w@gnmgrc[kwz[pzKxX1ni[v:u`r6sBHJz>fkgrSa*jbP#s]lg"r?y*klE$xbxgge^Hv[>qx{g~^at|ke&yg3C R>BH l_|g"p@SzzgNO]gYlhfSBC}KKrpkdJHZfq|@>EpZ^ux|yJ^cp{]JuFz]kpIBiv4)A/D/Dp\It ,U5Ulp {k{u+L~fUp{W*[i@+Zh'pVl&Z/ywI5FpdHk)EOR*6p$"n[8:pRLupJk ~@x4e%p{DQ%k$d_p'y={w 1s[Bp0 *?d-GPy>DjpHp.#&~A1@E06p Zm+;$$+p&$_rNw"p4ZN3NyP`A4p  fkim{pI 4 |pacnI"0 NHVmJ]~"* 7%3?$k7Ҡ)ֺٰ2SgLY3H^\%k{jn__ߨք؀l΍\?|7li,0ڽOlc~('WEd{ F]pP.%jZUրp{ ZP> ҰP,ss>_Zu<;_IL=3Wۉ_tcsnLAf' i_:cj`}@F+_+5Y#}[o4v8x_cY\y_[ i Jsx_s~z p(m5J _TB~J@]_vD__ *>AYnOiVEX_MSE]NC`W>Z_S^ZPh _H84XR=:?&(_w2gq(r<$(_#f>f:^#]_L0O? :0-/Q_[T4,u^._"_ jj_)w_yrq)" __v}YR _rz_V]9211_âΪʅf7_43QЎ f_7:ml_CNUY8w$6<\\snڦR!U6^.?n݀ǹFnG-U* of77>vn@IiT>9M.*ik%L_@jxFwJiѾt0@ u >uplfLNab]Äi쏸GԣD*pieI&fxf&ic_c,e)QȞiDo ;Қ۴^i,;P*!fz@NiqdJiӡ&~z`EmiV|S{d܃Җi9ČZsBL$pi I~曖?idAa?NQ fix6= [FTM}?P]iQ?B"B%~iK䊒CS`+xO 0i'(MLJm{Yoi?[B#,L?q$iq{__Q:U0i63veiՀMm)>:ui t iu:[iϟo  Z2XO 7/;My`AD_f]^UQ@INnASEC) !w)!#?;' ``![9>0N!6 => -G E<+ 5#&3]2992#7';:/@Y^I/=> MyrZ\u#%?{T[Y0g_ZIU#>5N/Ot'xznw0a4Y1a{a`VÏ_r[V S8].~_j?p@{fhn`No? _CVmWIPUa=#-8/+  ,LE= +; O5  5  /$"*`*]^=&*=[ 1 P N>E PO& A 1ڥIp0A&L_3DD E.1 I=) HƠP6   N+:'s,N^D=:P_;o~.bIouH1 d}AZC^n_YB.ȣK26t>KMKGN> N:yT?5-z@Gr@Zϛ7=~GADA\R<#TD֣5:-I_P}QPC\oʙp> c=NJ#_E\P>w&Omr{yGiihs`hQ`}s`wzrAȻl/sekRrb2ujYuawv`d\:zu=G;Gn/pn_LZr.\+b``fjGab^x,nm[p(j_u`8c19$ޕOպO|qRT#֋7,.e`)^odH9St]߄n/p9 jgTy4ion"]\/feeׇMB2pViQ n[|ݿu}Ɓgo>zlq@voqgozlcAwpXFM쏇vk?Ci/`odJ4kφt_r:C`zci="BZ?2m'u6Z`ΓO:tQ^c[Z0V䁌Gqa*rKȏVLz"Xe qan0u=U)lMU]w[mS855uRi+^#̇f/oz=>r-GW8'&Cw [^iRg/6: ,16/1'/:,kO0^ah"p3!v~ŗi83 0 k\(@ f |D @/!&zQ )(s3&\&m3ϑ:2 m&™_΢zr厺Ñ̇ <碒i0+0QWt-ĉIpi5i .e`%@}LiL'irqUWKk"H_2Y9ɒH{KހEnOzu;( sg.]!TjYm]Dib!K0) :#<N";;u2h нwOLlv;\\$ y;ۅ+_j5 _`j_uODz^AFI7@oUg @puL e%IyJ6;UUp \v`rFrbs{\U)sڶʯg{qIK@Q>F 4({T,O U6l GZlF:Xm"K|D[bV`"mPFxX%#\}s\sn[#ŃHMnhI^M_EZ Gn*`ylPip"J0Ȋe1^ZUy6aKNX'ROk=n )fg`j9jjs Wh;Zh@?6)z6lep$movxozlepT]t_@'ڑj e ӍߢʁaG٭4o`vLxsW:ΒN9C~Us7+E /KBə `̖PesPE3'`Sf,7?kݲfeI<L!ԩy?tOu?J/_"#a6]<-:/68_3>:0-/6iiINMwi%),SdGgo4"«9"Ua&GW3qāӜ#E Nt\khb 0j1XQ뼘l"t|ךڊeNjSksP $/l Hh]ckZyfos mVwf|w>QLf`xqcfcm$eF47Bр,npFOE0\ tevrW_Z0A]}[0_8,_wRPNX3x,J/L<C zDQ.R;eQNk"'`U6Yfpo!p ׆0[sp3iYʠGS`d|rhϯzO&XZJFe5] C4+. )e0b/pr$@'X54L',_HE%̛9xt\qHli?ݯiѸbv^ 6 Z+{-_[SC}6X0`őq`$u[k6 ZC_hfb@gTGrmQ2uP.o7yOIPTiFlŽ폶@a]=؁]ePƝRit=kgwr@Te_Mk{?ajkimJęn^O7n.p m ovn@s~zpmovFpZCX8JcHU=Ao%OE0ҙ6Ky":[P) yɫp}tFjѨNl[@W@`PJڥ>eE+b6 ][ u7Sj`AÁ.e\d*Г.MsLjU)^\_k_ge) fT-$n(pT\ɯ`SU[UMU8}{yF,aeCu)d6qa6:906-/68/::0-bm^I /;/xpV&DÔÁk㟢`=& 6h.X#܌kqVDl_Px: m;t w%,ϚŪ q{͹e !jLJ ^ &dO_o:dj Vz@[{}q cbq+C9p,0ﰼnn^qp&#m|temWR'e Ʒa+zqztݱ=o\pҕ;% &[+!2vcHxm/0%#qmn_3I^E~'fn8p+oSu:o4"EȔkyoq)" )ɡoόYtKYo ɯĺ۬rzyUpnlU6ٛ*PUɛC ,N;/B4neJ~eĒ|آ^E6#r|mrÉIm(hGp1O~%d8i$iʀt Rծli{pF*oXekxN/(r+mVLZV? azw C.4i4q=*{4^hsz87hs$xAeeB @olq)m _,`:xG;2ghgX/p]B_jwkb]k`CqpܰXoVМi`pzopmnOtS~za,mwpN߀^]lzpm{pZo^i}G{XT U"B:z  D3Bշ"ˎ*nUAZmJoY# -ƺͼgU*}ʊ!o ?i6PؼOƛW+8'%\UU8|[j[M @oH$Oע<|e"l \2w]W*> ioz&t/?); ZHx.mF:I/03,1g0h Vu-'moud;E7 9prscr_Q,-|v h1!F% i"UOplA%]I&6̾ gT# B8 50 >W LR( ' ~_ ԃA(J]2EUBzN}EYApri%LVzIM OdEH`XNCKLe>p OVY`M^G)OQm{VXK;XZdy-PQKN#TG-!17Gq:D(?.G3\=QMoj_#.)K.^-P_II_93>>:0-/68ߩ3>:a~_Iw? ?Lř=uY`LX4Ai$SrU,LaOY?iE"F B,,]?iO Hm\QPis O]Y@BIB+^oE@rDo_KcaLTrjataܟD67i74 a~NLea{j.v_Cd$½]ZqBȟ߾ʅ NoaMj+*o.Ojڹ̏ogP\: oӽooCAS oȭ˶bpxlP-Ppe#iyV#1 scL_ԄUk,փGr~pHԴ1>pݓŠm`.8fO2G|bavmw&eࡄj|aPtd|qd0cZoKu[.qomovxozlqmoaFMHuSn:UWr2P,G*Mߥ0Q.L`M`\tQq3H?.nljLDe.`^YpxXp]MkjZRYvXDuaveV\RsF/FsCMTUD Ea'^pYQJ[޿P]`U=J.:n6/13>:ncS_A/p*AW nxNi5x) MNZM|yLM:XR?Yee7Z]Ze e ohxdF? e;8e`kC`=eUkH@L[t|GwLd>錊(jUkfm]a/O`59{2&plcDpZ?]?bXH﫤z83_€dz_aJQ8?_ObrO1/v؋xmO~2ĀcpD~ e֦ρѝ  62"+"0PY_}Ig}ohȖɚ/XMǑҞϽr`}ipGvCYR]M&+>'!#<6=,3:2;!")0[[XsWIk{cl_d|ovո̍ŞʏӯpyesHnILOFZY/5#<'4<3:;+;>8,0LSPL{xauh]pmB((RBǖկV{|wv|NMz\G@ET[ /2 0+OŷՉ ͎. </54(960WJJZ]KsWjq|dRvkpxҢӑ]PZX6o) 1޵Ӓϳo]vdpuRKLOCVThL)":;26ȏ' 5 И۽ґ4 5*.YaL_[DP[\o^\\LLEAkuuedVࡸkimvTKMT2?=gݷ-(ì&޿agzhc.~IKBxYIOCU#hNUN)7&//+?86 rgя⒌rhf."UO_IGvULIpyDvgq|}Ob}}ա0in[qyg~{dEtʣ~PcN;x>X׹Ҡ(qu2'3la̤9c`{]u~N{熐MptcSc7fZSaP`{eFH~LqS{oJRPWqON\pEszNNiTPS A\[CN/[pI]QR@O~YpXWTD@cOTyyY^}REQr\`GyWwdbEPLJIJGADfKPGPDS-OSPO=OEiGdo347^*e6,OI1/O le B _n{q~O^b~l]@>rl.1%]CAXWAlST~OCBdH,'PlSV>j3I:Ql:1V.##;5#"l@9$"-3;2&(7&eal8# *" '&1l# $-31H$1l#&.1}!(#%ll0O# >l9S4M>!@@!X@20lS5H7P9%$"[=4"l90.1 =9!$:3+%l,665 15%l56n X`+}93l~R"B Xdl[0( &$ KlS5KB q#lF7a!檑Xlo|}H lcg l÷llNl3lΤʇdo_0֯_lfnapta_dV})f04+x: `?~1'T#|^ qb.@SSRΜc堐fГҠJ׼ZK`ybimxrgUBݰIH[ }X|bY7waSAT,Gc{zPr~eRn~^˸~aȧeʛxN߃ƈcΆJgacdDMc|HTEr5KIyh#lz]X\ b{qdcaatC~noraԫ^ܵt~yxQFjpThlAU~3MG}3br@IwfOq}g@Vr~a}blJw}ae{efۯӶD}ߚb{f@oR}LoxMH\l~tMr)oVJ}hsFSktpbbikZpd}sէutnulFԐhzk^uqkzfl`ay~hfg}n}vzJzP\rpIldvmC^zdkjB'5`~nWegrug}o"vbc[zaeSzsnsn|p[oq]ZUv}dykd`VxwllhZs`ngpdy`sjjzjoyavr`kI`j}RdcjO`qWx]bxNafblRIzdy`dbi~fjnlq\`t^hHldrgllDa|qPhqt{us}a}cmT㌀pxs|}`zRdberqOlaofrzeo\mcbnjafjqkkiu|yOxydebU}kkp`jcjyfmZuogwk_shliqhjnrg]hetphwlpxoo^iaf{lfrtcgqslkkgHt,{\dtglj^mjUdfZeykmex]smuhOid~lX}tyz`~g|gkqxpizuncrd_uepeelang[ g^qeneoeloT pqclW,d~`^zgscPDjo^wut$nsoqsunu[oiribeoXz]gbjn\qmtfnkaezkXluymuaqfn^uqi]bd^le[/wXrעlmdgzsocUApbkqmjmosgjihjlqhi_xbnpnpad^rwaarrhIwqme`vekw; ceZpaa~el\̘~d[naOvqfanlhJof—rp9Ol`uorVji_|`WK58qsid/ٜEa_ߥsiaw`~h`jna*o\dIudsnqqa[xtgl]RD`rskݰnsn`jE\LDkqa;Rf_rPsVHG_qh[akEzpyogDaz R>Mrvc͟i+gU7r% %++ -A5i!)p=78*3i3' g8. M%i&0'` ]/%i4I(#O$;{0_h_cBk[uwfTQuA@]ffHz ])5`cU{ hldKZWmJ^a]hV>ksYkSNooo%Y'GyUQXʚX`kjxPuvKzMbkzH's/?js^kg3`jkA\lqzmUl~`fzzZV|YpCfTRlrdNx~S~tO@UI}dcoxfz^qI|`Pe@Ejtt|n|~}E\UP`sxuy`gHbrlok`xlfpha@x}~NxuivdgldjqS~qipT`wRc{u@xjroxorudbfzcbctn~af`bccf~gnkfivSlzeSeggaunhfjsklZl|ib[fydthtzgxn_ohjS{lueoRemWM@emwjxkRlbenazjhlxbdcccXiz G|zcxjkhupmo~ciij~fo7{yymukcvOOPX`c~hsyoQf`\uigtd?剐tybmshz։qlb^Lpjwxsare]^ȏkceslYqkXe|cvOb]sјwgeukvt^΋g\ΐZjp,{$a/ŔoZivrl2sDOP%YoC̙F26^Zhs+\YĻ\4]NŐo]ɨPconБinBNiҖsՎѵĪ^wRl\E_ZSx1kF@Mm.~ɌH_WbB#Y_e-z ܑٗ_k1.P˴[rϼ,gҔg+L0gRzIgWAqqUg$&B^ǚ˴4g֢ƚȳ- +=5?Y~Vo]^U^W^_m^IHS]Tw"$, Jj<,% A"%".C( U.92L#39E73R# 0,! <,'D02< $5=8o@\KG*9?#9_TB·2:?>^nDX0ݳg@'"Rvo_|dFcRjN[\_wNne`pOR^cp y̏OAAUSJWe@Q4d>& 8,"? 1-9$ݽow XXSdjDinmstkab`xTV2g*lsxa_U)vk]rC\IZBXA^_SDqI}-%#=C`=9*" R vމpCuXxlccn3^x>r9qptjmkM_PeDlf#Z!&&,"tvxxoXs_~?z\C{.˓JɌrj>odYmfcqfk]^qrt^c\|~S}@amz~ZA@\[gsCh^|h+H@_ZdYzZJ YnV#/7>cE=gAQI*<O>P: + 9$79INi,  N : n,D.Z 5 P A+ 0YGRb1$B*LRx1PjUz:U700L#~o >~!dd> :^ :? I9HLSUS80H8&H\" 2NV , :1*1I87/ 7^ R]PK&&\LN0KPR>L" :  >^Qhd 3o0 E((- I: >15>AIR0 7\L= ^>.U5B8!1q,: A\Zb > 3:R[BP[iWA E!F6 TI =KOKN8RH >>S O&,P&? g TZ1 I5 i +2$"5W7[0K& 3#\0P f8-rjY]EPK\*! %SٹCE cT G^T:BPK"I"  8MF\VAB1^WQSVA\n-K*(V?O6P@P 6w-$-s1=?|R1/32OgDm ^VVo/ 60i vQDOt+ rC;[myo!]Vdz $DXi<8v5a*5fdHg 39ZP_?t‹VYZl}VD>Dw"O 5IuA=U? AI53 @\0 4 12Ym3U?o < 9Aq9Џ5s~-f`T~vży/{"@Zzk 07OZ QeDGJ*;`O{&s(p?-)#6'c^rQ'v(q*F\!o=?F(T/bFB((oFsXkR!`, W%D<*_U`2ZC^\اgE{=VCVԝŔʗnF]OaVCUS i* 69Pl &`bs0AXj,q>H$$6Fa gp Xp*)?@aWF O\^&I'D : ygymuqA+unYՓ 'io\I>l`?&ojOB_JPf=ܨA1 DVԃnԜG@n9S^ nrn}qrufaJ!i?҆P?$ry5MĚP4$pP(p $ep5-n`;_,~@!`>q?k=y [*’pCIGD|Ke85 e# h"-qelJrt|K]e3nkEָqUJlD/0naA[0o_no\Q=f6|FBWԙ#S<6dI::BSE[OK7~?,=٦K@ÃztPCD B^sfJX\kdO;9$=(>cbqzpmo~~, W~._iq&Dvf 7yԏߑlocb~裆']hq<{\}cs!~7BtpdJ|/\ljy"5m\f|"Ajnh^rixZn*`"q7~N 3u<~^ceue;%"`/4k|rk^fwo^Pnjo(kZ]AxnCVUP{tp`iR]!(IՍ2?:=]A:3vu^mgdnlOJOTJ~_2L;_4A:_J/cd1p-ftAxi`gfPprh7RH roz2r=>`JRYxyXWp[Um,nu:&.C!7q5P6 :0(,&E2 `Y~89 5<& 7:/0I{xt907NnsQB9!4`oSES] ;3>`"lSB5U\w7kXCD\kBZ'>5No^s2xi ~_fJBglDTAsjH 2h2.J'Ik\p?+l"/=4X.sk7k;'_( $-51)&Ol)'.^){.rs16/lp0Y$Mvw`k_XFUu|bUs voxo~ qVen_~Uriu*DZ_]Fbm]Zwbpk=z0ƏMpw~%u5Fp ٛ;p~{IġpI4pU)ZbpNR^܄pH.iߔ'~sD@G`ST^Y|o=*;)e0V wFT GPzٸO,KmcmnknUOmli+7# Ҋ݀ivqMLo;43iVվiN.;>!i-cnj`iY[_PmX_ȑ@rovZmDtzJdrxnlMQqoaxA0bOHl_Z*)^sZ1>~gcLdHVXTs\m<W Gs8.=c>lp0'# .sVOm&?!#b4rWİZ-~/Y6cL2aX`tg+ArNlCL74aU\ep?Pao+1Ol) c}Y000dUXIl8. \0slx$UDp,ulwxtF&d i mO]b$bk"77<C cP]lG0;iy=WjVHVW?1h2 ?0Fy 0@p"|g/X Z ?A 8%Z@0 ?+< im4 KRylm~ eoZiqjZl@ gprn);8^9H9 e7ln o4-V J"_,l`3H^_/:q= <8 bA i@+3  i< vyvKi͓ڦ9 oښ832?:yCD^KM,TUE~h ;%5/uPpJZYL/Q3jFOSgpLVϞ/1j.🇋LOp(n-e_,z!DQhG__ԡWG^Ze_cEݍdjF_Cd m1xdaSw@_gd!>v߰#Mc4kn_Z;Vn`DLސnl҂6n6vYnatmAۥϮnDϺ~qn*%n ǻFn70ݐVOnպNctnO,`ЉƑ!n׳ܾ]V}pnuT~;43؛nO3xnB_Q[n]N@8 .Qnq !ߛnp}nNJfn2bn@SؚӐn`gcLn\&`y1`nT dbKtUlndjt` Mz Snnde}siƇs]~N]Ls+~zYjvoyxoz`u]mopyAVGc(EߠupDLL=EsYp閬K'GhsgpCxZmYxPwMSG.`+S^ ZP`PpXO-j2pަ\pD{!G`pj̆u\O/:oj\qXAL8/Z4oo)92=o ouъD",o3Vt-o%[jqObmA^nn)n ^n|+]qUn!F2R~PV^mTDqML>sЊ^Y̰̓sv6lJ-ؓsU.omՒ薭1wUiCBe/iVe); e[v|eQV t{2L%x[K$V LĽTG1pkKI]LpQ.;J̱ЀpZt8!@pU*8ΰrwa -c#ĵJfOe[hqmGvftjZvulnZyyezpkxevJ}nXo`l/x`Ɖlfp-MyiuhrSj {>aP fi&3^>0iK1JH|B Ri$\H,0it,d0n:U]{ipTDX\@v8řozlqapNKCp!_p:Cx&^-QkNJMp w wA@]_pIyHGAI-_P`V3S^;[`V`VXOpCUkf E=i,U.A}iSiz:>  iRNoayi 2iIT M ih,28]iZ1"8CC:0-a/1 Fʹ,1rrz Ssfh+jk[ge*2(Y$rCsj@ef=PnA|elS-s"QdbAekPZhaGPߍxI=6gO/eıocۉeܝ[eikRAJej( (b$CWѿ[eA1vYM-g w MJJgǯэƍǃogBD{fniEE@}Kj~alEi$Rfp|o p}IeiIh7k)|?aP fkninjXfvpvFp xZ~۵x"hpfxyYU~zdy[oPqGs~sJ^lkFP[FSH_ JaRX]i_AaQ4NJlPKMiVK4Sj# ^ ZPMiQ`cZPQ=!P?[!qJ<5Vi_&x>;)ɶ ~_ <s_ '[ i!oo 7Xghzji7>3 Fe0-/68 &~e_<Y6e'9Uje6vW,e0>  e_q}zex|j$|K8zVeH{*3=z(3g\ 1גQ6zhC[R!%%keZ  uWWtۖl^Sݚls 2ԱYlmǖtt8&l.>yW ,l>YR %ipjaѲQp7bטt;p@^9L׋Opϥx SSU{tsWVgE盫jg>pőbDgRe_.^I_O8'<İ]CZ.s|>0PiRК=dinc LdiJdϐE(?sջi͢*}%.g|zF*ah!gPj`}ta'Aml{q!}pOtg&?dG p~ ݵH:jW4RPVp.TiOZ9|_A#pmpKH#_J\A|pFH_jYaV̜(~p\SXO ZL#1#6pVX/:b`br iO8 :0-iu k0nU1 :QhFZ\6cr/ZCbrvA- W\ DBYo}9C^}oƢȁߜcqoyQ xcK^NDGe-oDh$Em}Lcu"țm- s ֹBZΣktpp%9kdVϳNClކiFݦ!>lVZxl͚^ۈl|Xf0'ۯlVݰCyl"~ aufyhvl^nކ-dfhh*LWu^N9pȳՖkn#p;T'LFcaq~m]obi[AiFGvKIvC__a/Ja*Ne5J{}O:f_9&-?!z.* W&?L^l:s,љo9-t} vQoAp6 o ZRXz?fn n;`FN,rW~0eYf}Le('nueOA@G0<;d\!@ᑃA3|(+H{]{datEnށdd`>\q1:r?t:јaIZdo_l (ɴ0lˠ轠ltP[WڌЫohip*"0~H)0Q?%]{:hw]؅go?ug#Hz;dkGάY0dCKuWjp~h}Xh Q\p[3bXc@ilfp/f?hlj|jP#pN-͑ՠqqkm_ pmiz_uA&CCՂ=@yE<}HdB^xrxA$ BGFbU`vLx 7UZ~"z p_vo(s~zU_E_AsGLK7@_Y%J_ #.*[F>\uMOHZWL-QkMC`S~MnX˚O-*wzn^;6>:n6/1j0#."o^=?r6z8y/Se)0-/ 6j<Le)mdE$ eϬ+/, e " eXyvW, e@;xigi^sieey 7SuЛHvY}ɍlE pΎc_`µO!p_um\O&_!=7_oTΠ" [ÌJQFVgߌayZJ%gɀ Ϥ#jnU1:9Ai,8˿ʪhvͰƆioE]6&i%к$흀tyxwV-W|:p cnj`}paP}sz~Bz-pڍtGӚufr8ZFc-nR@mcuFpVsJ NULUIryjcFBJnpuViO@@s&Wg.@voq@otӗ n/[kE+3nCɳ۟ԁnn*wbǵqn$-Z~`&nIG1E,tb)Hzts|}CrdFxhwVji?j0` PFaPce\/ })e`Ozq@/J{Wet}(}{+VfܦH%U* vo PoL~uJv@u]'Ao?ppJ]z<=-˽bKpwܖR*ypgF6,ps㦆'cY_J)pFh.͑eVO 0ZLQ`V`3[_Y#^.OђU__] |@d !__yKes_ynqP,68X@Z\,16/kb kփ> GpEp(_>[p j2O>~| \rP)r4  `*XPOmnC(ckoc@tr a/@hrdsjNA5>mq^z^952`"`D#AexxՑϘ<8e@^DZe6rjv1cl@+Ǿql+L#_l,l"0Ȫ˿lI,UK4l޸Eֳǽÿj셔loLAj6suT<_ܚghOkc;hŁw៼\H=ennWj~ ;mnv@nzrn!˴fPP9cFaPfmhX>j`?_pAb`gSL^HZ#PMOpa\Iokn_ppA}Ȋ_N?J0@/]_rQJ\A&p&X?RJw1g^rpW)o:,Ka`VsG^h(G?F*]<+!r&(?*0rhm/y2rQp2V},1urR68/| C5P0r8Ҏz /d]=u_?=7aOI g  _PlK nPC/nA!Õ2n<ĥl@_ge_lȠ罣vuPP3"6 ѷD*aھNaݟ8՟a]*rq,i! _Jƀ٘bnl[vjstǬqϡsstjӑoP~{:yjdvwj,|:do^eOԈPqoxS[h&2a(i`t5q @s~sq@voq@`CGNsQA)p8Ia[ nSaPfvo]f]p!.p j\ST[\;Pe*NSnPUaWeNS_SBV^VEL1pF1\H_lNJ@oEcFkXHOl:SP/OT]Nl^^S#MM.U#ZcOlJ[_*P c2/&(?d.*-l?!Ղp>nat<^po'G~?.f1k' pGr<} <-pf9>Otc ]RBa9]*Q00 gGf6gOPgA ! k,(uVgr!PgPd|WG e2Z:n͝E§an/+場`m-hnjŊllIkd6hVp43'Lp}dΦ˨Ϳ7<ЇPpsϫڸ̎ZGz0jB?2nti3>- %1/:)69Yo]sm׀Ϗx.1Q`|&#BoݭֶָKgof]]ћo' a-vODnńhJ[najo՗.*%̟We֐vxozf\ew@t]T_?KRrG\KSc*RFaN`} KyxvoWzi>z1pa]Bq@seLQ`VOQ`#eWw pF_A Ce\%mF_dQx`ASg@SmMOR(=/l>:0 ]\?8&4(/lae3-&&(:P3:XOY2:OSL&^iB8gM}N /. E;G2*XP5^_Uo7[e<6?* ۥ ";9$ d07> 6]QPNoˁ9]i4(Ei?/i^o QVi*"ܪ32iU|1cEӐi' 6EiսpuirEj{i[H$+iiѵ٦ȿmh eo_p0RpVֳƽp򱜀ű][!bp'j9jH΀p݁fOWxC[>T9T]zK;]I/QT m]{nopapliW_uT߷`o^_Eh`Rc;z>C\nITIWlmWw$6,.КڠQR^mGngu"q\W!uFNjz{xpn gg1~G]iZ_UA)pzJ@]i_3INJ@QMi@zN=ZP-MiRG٫yMS^ZP{FiGZ`e#B.J*Sin!#.hsi!#.\i?*123%ҕ<=i/1%ٛ0WijEin;:!i[馭bӤ i(!d i=0zخ:"Ԫ i*~jIi9wߠtJ'i𝬭@iࢀK@iA* ڵвijc7ihMQ8ξtaiY.|5&pi*[8a+viM%͕Ϡ*i Si91us] i$di7T*xiXRݧ*6ʯi1 ˚ȸ5i]\ki'NҾ_e iwᮁTO.]iY¥맞i8?zi{ᯑ)&(i㓞dc:iid$fă j}ilP5nUmi3ŷ򂂏êQcuiokAA~3i_~@3|kUN3J*_i_gpC1Mw?]i@f^fPBGimIT\XZPiWUԼ^\Pp=iIy|8&_;mi?Q!YQ6i?!v63iu/=1J5gi">i#>:0%iW?! 04@NiS\k>57P.i6z0x iPLcJ2=: _U1 +&,Py]JA[HSCU]CRXCJZ\.>$,i:=+5(#.?>,&N"
~DQ1<6qZB@T4-6AqVV.++X ]U;VA+= IngV{erorspmngg\!ЫsP~Q.>sAhsz1%sƕDnksZ>sю[u~8K(sƿΡސs@na+^.sۀѶůQsj8A5 ˎsްt{6sJ.ˠȞsڑkfna(P[cXnsaPfaPcnspqPqv;oNq^@s8~c q@vokxgzcple||D[QONm~YO+Z$Lj4HWVr ]UST]i{u> {t1^$nB .X& rDVFeu[\g_2np`m"XOZLQoMOVXOl*s OFd  ->D[7"-@fov o(R~pI!0L 1 N` L E>shpalex4src/data/data.h0000666000175000017500000003143407651447026015002 0ustar pdewachtpdewacht/* Allegro datafile object indexes, produced by grabber v4.0.2, MSVC.s */ /* Datafile: c:\Documents and Settings\Johan\My Documents\game development\projects\alex4\data\data.dat */ /* Date: Wed Apr 23 10:25:57 2003 */ /* Do not hand edit! */ #define AAAPAL 0 /* PAL */ #define ALEX 1 /* BMP */ #define ALEX_BG 2 /* BMP */ #define ALEX_LOGO 3 /* BMP */ #define ALL100 4 /* BMP */ #define BG0 5 /* BMP */ #define BG1 6 /* BMP */ #define BG2 7 /* BMP */ #define BULB_BL 8 /* BMP */ #define BULB_BR 9 /* BMP */ #define BULB_TL 10 /* BMP */ #define BULB_TR 11 /* BMP */ #define BULBA_BL 12 /* BMP */ #define BULBA_BR 13 /* BMP */ #define BULBA_TL 14 /* BMP */ #define BULBA_TR 15 /* BMP */ #define BULLET_1 16 /* BMP */ #define BULLET_2 17 /* BMP */ #define CAGE_BIG 18 /* BMP */ #define CAGE_SML1 19 /* BMP */ #define CAGE_SML2 20 /* BMP */ #define CHAIN 21 /* BMP */ #define CHERRY 22 /* BMP */ #define CHOPPER1 23 /* BMP */ #define CHOPPER2 24 /* BMP */ #define CHOPPER3 25 /* BMP */ #define CHOPPER4 26 /* BMP */ #define DRUMCAN 27 /* BMP */ #define EGG 28 /* BMP */ #define EGG2 29 /* BMP */ #define ENEMY1_01 30 /* BMP */ #define ENEMY1_02 31 /* BMP */ #define ENEMY1_03 32 /* BMP */ #define ENEMY1_04 33 /* BMP */ #define ENEMY1_05 34 /* BMP */ #define ENEMY2_01 35 /* BMP */ #define ENEMY2_02 36 /* BMP */ #define ENEMY2_03 37 /* BMP */ #define ENEMY2_04 38 /* BMP */ #define ENEMY2_05 39 /* BMP */ #define ENEMY3 40 /* BMP */ #define ENEMY4 41 /* BMP */ #define ENEMY5_01 42 /* BMP */ #define ENEMY5_02 43 /* BMP */ #define ENEMY6 44 /* BMP */ #define FLD_HEAD 45 /* BMP */ #define FLD_LOGO 46 /* BMP */ #define GAME_OVER 47 /* BMP */ #define GUARD1_1 48 /* BMP */ #define GUARD1_2 49 /* BMP */ #define GUARD1_3 50 /* BMP */ #define GUARD1_4 51 /* BMP */ #define GUARD1_5 52 /* BMP */ #define GUARD1_6 53 /* BMP */ #define GUARD1_7 54 /* BMP */ #define GUARD1_8 55 /* BMP */ #define GUARD2_1a 56 /* BMP */ #define GUARD2_1b 57 /* BMP */ #define GUARD2_2 58 /* BMP */ #define GUARD2_3 59 /* BMP */ #define GUARD2_4 60 /* BMP */ #define GUARD2_5 61 /* BMP */ #define GUARD2_6 62 /* BMP */ #define HEART 63 /* BMP */ #define HEART2 64 /* BMP */ #define HERO000 65 /* BMP */ #define HERO001 66 /* BMP */ #define HERO002 67 /* BMP */ #define HERO003 68 /* BMP */ #define HERO_BALL 69 /* BMP */ #define HERO_EAT 70 /* BMP */ #define HERO_FULL 71 /* BMP */ #define HERO_JUMP 72 /* BMP */ #define HERO_NORM 73 /* BMP */ #define HERO_SPIT 74 /* BMP */ #define INTRO_BG 75 /* BMP */ #define LETSGO 76 /* BMP */ #define LEVELCOMPLETE 77 /* BMP */ #define LOLA 78 /* BMP */ #define MSC_GAME 79 /* MOD */ #define ONEUP 80 /* BMP */ #define PARTICLE_BOPP 81 /* BMP */ #define PARTICLE_DUST 82 /* BMP */ #define POINTER 83 /* BMP */ #define SCR_INTRO 84 /* SCR */ #define SCR_OUTRO 85 /* SCR */ #define SCRIPTMAP0 86 /* DATA */ #define SCRIPTMAP1 87 /* DATA */ #define SHIP0 88 /* BMP */ #define SHIP1 89 /* BMP */ #define SHIP100 90 /* BMP */ #define SMOKE1 91 /* BMP */ #define SMOKE2 92 /* BMP */ #define SMOKE3 93 /* BMP */ #define SMOKE4 94 /* BMP */ #define SMOKE5 95 /* BMP */ #define SMOKE6 96 /* BMP */ #define SMOKE7 97 /* BMP */ #define SMOKE8 98 /* BMP */ #define SPIN1 99 /* BMP */ #define SPIN2 100 /* BMP */ #define SPIN3 101 /* BMP */ #define SPIN4 102 /* BMP */ #define STAR 103 /* BMP */ #define THE_FONT 104 /* FONT */ #define TILE000 105 /* BMP */ #define TILE001 106 /* BMP */ #define TILE002 107 /* BMP */ #define TILE003 108 /* BMP */ #define TILE004 109 /* BMP */ #define TILE005 110 /* BMP */ #define TILE006 111 /* BMP */ #define TILE007 112 /* BMP */ #define TILE008 113 /* BMP */ #define TILE009 114 /* BMP */ #define TILE010 115 /* BMP */ #define TILE011 116 /* BMP */ #define TILE012 117 /* BMP */ #define TILE013 118 /* BMP */ #define TILE014 119 /* BMP */ #define TILE015 120 /* BMP */ #define TILE016 121 /* BMP */ #define TILE017 122 /* BMP */ #define TILE018 123 /* BMP */ #define TILE019 124 /* BMP */ #define TILE020 125 /* BMP */ #define TILE021 126 /* BMP */ #define TILE022 127 /* BMP */ #define TILE023 128 /* BMP */ #define TILE024 129 /* BMP */ #define TILE025 130 /* BMP */ #define TILE026 131 /* BMP */ #define TILE027 132 /* BMP */ #define TILE028 133 /* BMP */ #define TILE029 134 /* BMP */ #define TILE030 135 /* BMP */ #define TILE031 136 /* BMP */ #define TILE032 137 /* BMP */ #define TILE033 138 /* BMP */ #define TILE034 139 /* BMP */ #define TILE035 140 /* BMP */ #define TILE036 141 /* BMP */ #define TILE037 142 /* BMP */ #define TILE038 143 /* BMP */ #define TILE039 144 /* BMP */ #define TILE040 145 /* BMP */ #define TILE041 146 /* BMP */ #define TILE042 147 /* BMP */ #define TILE043 148 /* BMP */ #define TILE044 149 /* BMP */ #define TILE045 150 /* BMP */ #define TILE046 151 /* BMP */ #define TILE047 152 /* BMP */ #define TILE048 153 /* BMP */ #define TILE049 154 /* BMP */ #define TILE050 155 /* BMP */ #define TILE051 156 /* BMP */ #define TILE052 157 /* BMP */ #define TILE053 158 /* BMP */ #define TILE054 159 /* BMP */ #define TILE055 160 /* BMP */ #define TILE056 161 /* BMP */ #define TILE057 162 /* BMP */ #define TILE058 163 /* BMP */ #define TILE059 164 /* BMP */ #define TILE060 165 /* BMP */ #define TILE061 166 /* BMP */ #define TILE062 167 /* BMP */ #define TILE063 168 /* BMP */ #define TILE064 169 /* BMP */ #define TILE065 170 /* BMP */ #define TILE066 171 /* BMP */ #define TILE067 172 /* BMP */ #define TILE068 173 /* BMP */ #define TILE069 174 /* BMP */ #define TILE070 175 /* BMP */ #define TILE071 176 /* BMP */ #define TILE072 177 /* BMP */ #define TILE073 178 /* BMP */ #define TILE074 179 /* BMP */ #define TILE075 180 /* BMP */ #define TILE076 181 /* BMP */ #define TILE077 182 /* BMP */ #define TILE078 183 /* BMP */ #define TILE079 184 /* BMP */ #define TILE080 185 /* BMP */ #define TILE081 186 /* BMP */ #define TILE082 187 /* BMP */ #define TILE083 188 /* BMP */ #define TILE084 189 /* BMP */ #define TILE085 190 /* BMP */ #define TILE086 191 /* BMP */ #define TILE087 192 /* BMP */ #define TILE088 193 /* BMP */ #define TILE089 194 /* BMP */ #define TILE090 195 /* BMP */ #define TILE091 196 /* BMP */ #define TILE092 197 /* BMP */ #define TILE093 198 /* BMP */ #define TILE094 199 /* BMP */ #define TILE095 200 /* BMP */ #define UFO0 201 /* BMP */ #define UFO1 202 /* BMP */ #define UFO_BIG 203 /* BMP */ #define UFOBEAM 204 /* BMP */ #define WATER 205 /* BMP */ #define WATER_SURFACE 206 /* BMP */ alex4src/data/maps.dat0000666000175000017500000002037307670352434015351 0ustar pdewachtpdewachtk}uk1<%@}*. 7`\JmEAWQC]CCXJ@[>-(b^_B6=19",& e.-  :S !  80/ ?PDo;8A1:Hh2(e: D, >,2;sYAGg}pLea{^31DRi   E>hde`/tni\Հeowl|fVowzLlZqm o!C le`zzJvoq@sMlN cnb@pRJ1\A]J_AE|ureoA{yRqO_J'MdOmHX=ZJ P+MOpQ`Sv@PMm?ZZRE7X<*"v.Lhu0>OCMC. =?/>g:p'k$O 2`Z]$I!=9Z6F%.ef8#!uÍpagV&_b"qF6mgYl9<50n&-;q srwp?&p*$/: t&2- <= <7&[( 9.<*11g%?{tgp-2$3 j=Bck_P|XQf]h;j|a_mh:: L  O, F46 k]_rFdnwmpEgc"9UJxaAGy !4zQl^wȍt_HhmD#a8(^OR<2Vqy*h!A\7z!g2/8_ H.6Ϗ6oyoTi|i/RQ@>4- n/f#ZiYn%-EgZ c[nW^NЁTdZbbu36 :=?ӧVrAꟃzdeJEO4ae˃^]v m6~6;v$H"OԝFiuPp{ id`&<PPsgn3߀rx@3#Ͳ#p&C B@@]_FH_\QBdSS" 4WB _RWSk|brkG)An%lr̦%Q z4i(?zcshoa *=o^if28Vԯmĸ"}.'{9p[;^X;UqaMK5O?hp_jH?.hpn`z;qp-Qz7epn٘rST"ip;Ζ{1cɪLnRqjb7rOXos0ᷖbr/z(p$dan4*9۠g3Րnn~oqP7&.F=E^-)}eH~;yA^*DN]5`U;\ap 1GY0a06#Kp*6-(`{O{ Bn"EZ*W0^Jtltff~d6ZwD9t_9$ "3PK!I[iUujJ=a:3nRg[y"mFmR!c+"z))Ip fLdXsUaگPLl+eZ[,AeJüV)OFHa[t@y':'[#ri'>(ءsj([n˳hCgܿ2:9m)FymkȀpF^s!pop4QyixKo2Yd#OMzUPH/kfebE#H'Q󪂸̱.ftt#co*@qöd+.mob  \RLRfgLYjSuDi,~['O[_R4Qp)le2,WQ4feD^$і5hozle[u_CҸFjuB5L"u"@ V;I&\z4cFSY'zbBa! 1- Xf[O3y1m~cTb-W-DZkZsOp]vj]hl"BUa]z3C$:3A\wC5iZP_VFCra$]*jT8ݥ؛>=`l!o?=<6.9c*sig `k_XFzW]tAUsF@ j .0  6Ao1*=NOI6M<}d(>ѵ]PbrE#-?gor@ ˂W`YU|Bc[rafFLB~=MXnvÆK#y.Ϲ%nw~J@r`NCjUn:䯾{AI{€tp|PQ]qpZZvZ~$&'kqx|{blTh;ZIBVxwGZfQu}fkx!nFa\#DoHPt؉ܠѶeƇHu$T%n-xb CRs3:`Qk߆ȣkSEZ@l{})co`bZZX@KXe~T[ZGeŬ]^v ava]eC,W`xeHh*u]r-^Z$BIffwlwsW®bal vkz{lkv lv ~ƫɍh?b em:1GOm(ѲH_ׂ% jb_|yPZ1*uy$Agb|FkVsuvNh).j_WOWI|ٕ=2k\aC[YwA{v؅Ds {Q/rS_^fPe9RDoQe9i ` (SlpqZzKe(Or h9ACz,jmbf% '^P1;(r}$ po=ٝ #~]DA/7;|YMfoBJ9|zX?*V T$G@1L&?VSC_7ZTUnRexwS<0oG\8X 2 `=b g]yE OFSc  }@gwE ꌀa`{`)XkC5aI@VarK~JfȠ 쯉s?alK.^-a4yGo]-.zm ͸Р|no`T2מr| u%=f]Ps%7-0&s?0>轹cW3pd6PEdxu* ϙl^7<|%Ӱn`BGA6\bvȌn@|9zdd*nڐ/`0οJnq Y1e|n>%Cn čn#0Pִ_ul[0EQi蟥޼aXx,ia4YPcf`aavlTjf&qBMsy[e.{WtbgxܤӠoqEblNnC\TS*ɜ}\nkB?_ L@[TZw&eb 7^[uLn^gYFXd|Ge_T.$fs^ZpEiXoBktPVIEb Z<-HF5!=FTDm_BA We@Z ]eB\YBey?1-1WEO< ~c>  +~heXbe;!qf@3Eq3J:7!Ƙzk_ / _zi-ZNx&s  n a㰎llf-!N@^9>XXi %տ &Ÿ}6ؑ1e-qTh#'''yaKW#r8b708o2?Af{/i e,ߛi$;m!CL1Fcsʁt7r+ ۺOLnA=5g,l;&U|&pHи>,u AsNf}(+|gn˺vxHJgLJvC|fo\꟬ #0gn}\Ϥ9õnq s^IOX0Ve~.b*P[vTvuِO~@i}iS$hc}*U`}i@mJ{jdHS9_CWh)W[xU[K?t6x8w/_>?:^V?%yx 3DN y 8:l:oFrh:o))oiOp"8yN}616THalna<?],FHCCK~dh&F_)kX_O~Z1\r ~3vOp`V^ZPMOPvS.V^<ӎip^q*W Ap&Ey,\!*HYJC_kojDO!0X97<{J0EMnYOZ,e0U\wt/^ctii=E88w?:Jsz%QvOHJaR =@n*ok\j)?RnHCdd/0]Nk.,/ M8ֶ_ 1kPX)Np h% df!JCxYhJno_k lCQDА9+w*zlWl*`z8o h"xii_.eW̎MK)O*uk_PVaryZ( b&`?.?$ŏ61eS~$nRbR1~8c.`1ۣaiFriZ? d_:e*jjpq tqH@c:r5;~_~A ekZieDz}x}Jsv`})}r_}AApp*. `FCWh]^UQ@BOnCSEITO1!htU__-$1 TO( 9ĠT3  +LN<: : 2"&RV,2L0Q,TN :A k.;2/ NnBGPGplss(*]P= I8ROVa`ero^4x](iEl]p4XhoaʪE'-M@} 8$8[tʦ\?_ z+em6E/=fp'$t S7T?eWO,05&N* m5[=i(.G޸9Q9{i/:$=i&g/?_ {V|἞#pՖV" WKp4>.ZH #8!-r4:X,hlIj9p5ÏO(\rJz%_fdD^naԏ'x$-BK2w ޷$Ȃl/ W}@p 됕Ժ TM~UnY9vpJgxUi#eDԨ_j 1 M4mYg' r> Sap:)p|ɝX\foCTpP/),j3.# op*ߩTї/p@>ӷiP^p"ϔ+?,Vn1Xi% OJɟ SxP`Yjs,V]huıcfYwluHf7s9Fsl2N}q VHȺzdތ9 Lњy00_ɞ`nw x;n4&h0E_۰{n lXYwCUTjtxRgWUs|KxFWZ>[iCjy`Ijg`%eq@0i}-UgknL=nL ITOj.?w4vi/ϑ 2/3fHiOPzpLц^dFH2kn1)UvpFΙ6Ēp'L >:.W{syՐITG wDR%IFn3C +.hE Kp RHYH{M%Lx qQ`ho!R kC/ iF=5K8 A4Kꫨ/搴;{-1$9hk]TW^W^_l^PIS_^s"$>5hoCX/=/7s#7( -(c  ( 9" U61E O ,,& 3 ICv5> E 3Gq55 ;s 'F,;mB') 9plq:/*plNl Pipej*nzXꘋh  5堿Џ@ nˍ>  X 7@#>;AtWz ;m-#.0o26/J[(ؖÉښ=Ж)=| 8A16=>8䘺˺|ܐčSݠ_"b), 2_&V?"2<ƀ.`ΓpV3B.ixQETiL^,)Ի&LNUjQbHQJpT4/ʻϫԕ[jS$#DV)HSpIZN^DoX\C·AXAIx[)dD[UUNM*JDE" 7=GWbTLAQ^[9IAI܉{C {KNQ[HEPh[Zr(q,k¤ʲgbD_R1QTY STTYP:JW ]VDDKH[beC ܡ⠏ IfL[c>Y \pZ`GBTybqB[!Qb\rMXtLXǸٳU"ʤثYNX c]ITMhv>:@w8.?'_NRWe RQ:YBҪEਜ਼rPBJ[Hl[/D/!C契mР[ͫV8J@ZD}QEOR^&&WXݬ篠DPQr#h\nZ2^XH_\RJ1=upԏLC%\WQILSge?[%Ђɵ jC5oESO6UcUR[%Ij՘O[DѐӰ>/Qn]ZU)IV-lFϡ ϓU0]J/e-@I,fΏhKځɸkW(9[/d)LYp8Ӽ̚fϒՑ*֯sfh+LF.N[3Wn*2MF:1ֲU8e%%LPFM*PWiΖ]4Ӛ)T +zZ-3^ Yk+դѸߌ$;Җ]b5Y0XR1@MB-b`/@ؑ>fַƮhpYo4DM*Y.^%n"Vq䏃S@Z]4^e'.2A4UK>! *:=q6؞}0Q0|2q/Sd',T%ǖZvyȚϽ߱/S${Z7T8VHӐv˄qޠg a^(UVu6F.%86*/Lr҆̓ۙ-\+U..8.((*()-Ξ'Owʏ腪6+V0^%zNu D^jӚR͑yK=:R1 ^ *6 S *[(׍6m[t^@2F ܑϳ"֚ݏBZ]eSIE4;V+9qږ?$3#+[IV#G!q{ ۞ :HE/EYF"Y8XǨجޮ~נKSLV]cfQ=I/2K*#S.!HCRmPJzAQ~,XFL\a+^ьtW7GY#IBVt |ףLψ(TBJW6FRNE ĠɡCsNӡ2 o*_K[Cb]שv@颖ALd[E)RqN>wv:h_rRi-[ZA%kH>\,M*_gZWQzޫ[9Bx@LEP]6^|hN:ƭ.Փ LZhZ4II]d9^%[^$VREG?y}oR0eQfL)YFI9[h2 L-QDZFS3 uͨޯ-MBX`EP.3T-٘#}IGQ-jC.VGG 5UԨ0SWHNTXOYC~Č?Oc뾯?gESO;H(n6K=PRMRK]1[Gu׿kZGOTC6Γo˸ZWJO[.k?ˣ'W0aD/.d*Q^_X3[̖]} A2Sa_SV!ؔ јoϣkк\)6IG)*YG+g22UzZ#[ܑɖ./XW7&WhRE)o+ߞ.{͏(/{[U*e+4m><ɚЫY7ͳ .W%C_cW;И߫oא!VfZH([#W ɰF%=6NO[-d3+G,׏A8YT*3g2=S Zz5}gޘ> I-3N,hޑ h:_0L/M 5Q䠥{ۺѠve!3.~fJ*tɓ1߿J.W,2*Hdٞ:I72?!9OU֑|gsőg7!O7*3n[}- E۠Xӻ^'WA6/3UU-۶ݓ(49*6]0,5ŚՄNÏ2ӡ:99 -YeFG$/:N# pbёC!4 9\SL!%I,G ٠٠bRS^OT5,tҖѓȚd '1092=%1][TJ@#DF,E%@TGEJ_>h)=`֬&5 @tUEiWdgSIK_.M׬eإ\!#kTKXFe]qTI Lu.L9֌SeeC\BKSIL~VMCQwiͧ1ܜ')@NW3O{ZI DRw^޺` VݞF@b#DSR>IVlSM&>gӦfaeHK:S]WDKY^;ތD29[Y-JI_]dlYa_|J `-)KcRjY0FSvkOG ؽHx^Jj]$.kT\kZFBYXӬ޳H}ɯNI6LVeAS+ nx.WB3۞ AM/QWe$pU3SU{B̈́D{ 9WTcBg_>R/ CnՑf֍xܑ,K("3* 0 3+-X ;UuРщ1wT3ya?5+p$4 #bS:Ԛ,6ӏz*3?' 5.4q0&adݣ˖%,֚{._:0.g +!-BB/xטByҐ[ű\%!"R-/C3x+ ԆʬDH޻ڢij#e*2/#4#%4ŏ$׌cӸ@*&6 i6)1 9 W)CN1//ޠ#w,##+"!3F' 5.Nӻмȓ<~M1$%0'g#D,™7Ҟ]b֖ʏ_% Q5/6#u!PĿܑב+0$59-4(;=2 ڠnb+ՠ(ZSs<@6&v7 ";!.ٚ<پ%l#:!Q; .+?G0%ߴ֌y/޷Ö$>R*>O6"'d+ÑQ8k٘N!݄”Ґ1$!'g)/$&;!&쏣ҧWt@od")'(8:&Q(2Ӥяح|3Ҟ׏*8$;_%-)*e1lߑ R, -@!2>")x d&א CԠQNб#N* )-t= '>1ΩӌÓӆ4Ė "e)<'#% +9?$?۸#όz6k.>, 4^ӑ}΍ёpݛ:')8?V 9E?K#I6)Y<%iI #y7:1N/>[:1;ޚ¨މǏ5ު67/?9 #"yT?ƌߏƵ–Ɍ÷`˚C:!%!/*7|Øe#Ðh-%&&1+!&x=?iZ¶gޡ۪z“Ϲ9<=K><8<T&ʞQԦ}ď|O=*!? 8;x5o;ǚ,‘Ƒ>ב>;;g?<'55> '%ق֠]ܠ)ŝW4?!(V>p9-{Rܵߖ4Ðdq^& 't)?)4'j Ǐ!ӌz$ؖ3?(##o# ;;T׸ȑ[Ƹ[ߘރѬp$7 ;8,F=*4,"&æ=\ "*5#==I cǚۏě}Jݞ' #C=V!!1';8@ܞԔg>&>!F!*J Zw!k> 6%6;2L"\Ėߠ`ܚLa-!4;y7)>>!n>BΌ+KNj$K;2 lØĐ #5t#15L ;:58, xNݓ=t*?7# ?<48 9ÏȞ9˷V"|=?/o::;Q:6B%(cߏ(Aόlŧ5="5m$4o&?$=c1M6&v30=|'( ǚ“ď<| j*2='d$: d>qŒFؖ]MtԚ,'!? 846h9uޘ֧ɢԾŐ T$à0419:'r=&*tsٓ !(=2?+=K?:F4˸:̞8_7֏.<{;==|(2&9њ0JJÑ~ǂˑ(8 );'3%.6!qT Ʊ@ϼʠ%$ՂǷ:1 + 9H(k?@="UZؖ~,*Ěε1?>&G?04l žnjTږ$>c%5'$*?;c̑Q˘BؔE!D,?=;A; =7 #6ԝү$:=h5+(t5 dZʏƞ %'*t4^6%92 ږׁ՚˩D689>`5L'3]$A͐H+1;542'I2>$5X?Փ6"*ȌЖC 0$:530? ƞ[[׏('ʌ 2(B=y*=(:?ےȑ GƑ8Eԩ (<)6a)h(53 Ƞ^ ֙V5x(20o,F68wպ7;:9{->y-2)w̕Кo׷ϑ^1>&,6+m˚93T2<|*83Џ0nÌ2,<*9<)2+.?Mw%̘)0(N.(3R9T6?<xWT(Dס^>8$*?:>2)v-+Κ(ςɏD=.0)-k3c32;RԖqǍvŎКѧN2 19< ;6)Ј]Ơ&;p26,1v*%*1JOU~ѓ8g+F / 4aŞoя=;, z.s.;)+4VtJ+.t,\1_,(Ġ)ΠDѣ -:?/i99N='Т|! "q 28Vw: 1+I-u(Y\91/ v|ʼcǜ'4j=$?|YYDQ*2;4=% .  돩jG5eX ,ɑU\xY. f2qÏ3a)'Ag Y]I o & =bèL횱r ;k>~,^y Z K% >čQFꓩ]j <  E=又6cA폊}> <<K 隶3GDX>k W UIt*c={x :? wH ]zCN: sG-%Ŀ1) h" @$J } {99jɍ(hvgx어 92d o: j 2u菜6 :i pLtCŜ  ^`,[7 Ï[ < U7¬v B-Z^@ : =fKvL  |- mjÏyeƍ9  -z:Gk+>5?(lf:r9XflA9Rĵ3 9h%(0 Y$M[ 8  6䓻1^a]w6\珽U04τQN>f !4ᑡd1D|Nk #N9ˏj *Z:X<7DOF㏇) "5H :o뚥h d0r 7 Q`]4 5 I'G~6) }N,18=E5 X3dz2GH2 5h$D}㖀2MY18M O9Ꮴ3΁0PP0jlT qIkA+AD*."* ЏPs/bLM K YA}  mJ" t"Jza*/X %}c= %oGՏUc'Ѝ(aM Z/F4҇珣]" 4.sU/apCl- Fg' /E)cT頸 0/ ct{V^2+Q._2]7?}b/<pt+ s/ 12w/oM ta0zY  Qkz$й8lB !80c cYZяkHn.2V0^.i*kz38.@2 둝APL>S{X a ЏNDҍtMsxNᚰ y珂at/jt]#k]N.d.9wlt,Xy,N!B''SJqn _WeꌣDT+X bI,S,1<2u{n,m<7+H/잹u2S_Ե,팂,c/8 u쑹1W ;z+^֏p>)FP]9zQ9L6)XWא(@#-i B'(Ic"T:ئ +'0j+9HF ;k D  vݠV⑷ْqT  렸 ُCA؍]q  /ڽ^&'ىi%N0 p S쓤CH됡   Hjۏ.sۍ + $?Yផa 8$$Y*l)=푩 Ch$  xDۏ@?$4(V!۱ 3zᑸ  G@ 4㠐=ySPm݅Co#k(YW^GiYhxV$N+[N|8܏ ^ y  V ,6:i$i 0([=r!$C H;y~s}i$u  +|bVۯ\t*Hx# 3 7S `9ۇB\j $ )ۯ}8Y($Ǜ ]6ّ\{ Mw#/rc# f8$䷟Xaޤ#  Q ~NYnI;@B vY ݙ㔚ݘ uX:4 )"@-9%Y>1 ܍D~ttqxG_ ^k6!޷܎ƚB!"?  3#915]c  xK orkik L[Qq%Pޖ  ?/&YU]^CE p +&5pinwm]\X^W^_l^IA[TSg+ (X-*3:"ᯠ J,-*N1 P# 6//>,=N, N rӧ D5'0WS8-3^4=Uu= ;0U3O&@49-N r/Xg+ʟ mڅYY}A׷ Ȕ~p )% wI.O rx/d 5X& 3r嚫w66*e{&jڜ-$. F g3Ry҃/ Mˍf#'~8[{d#$ְᏙ6 a,3)1<}"nuhbȖF=$_*0oVNO@G蠽v׏ V ]'~  K.( +< ]b d Ȣ*6L \!px##<mhpv-F =Í4W%ѓ2֖ /D hz@H,O/Oܒ[ 2&6n0ҷL \:hĠ6H׏<)Nt g\/.>.NA d/q0|! m?$= RpCEV d }mP xԏeP?خo䖫a2ېp2blxA7.U(u[dun(;.됹JpC϶Ǡqۏ =TZ_)%8%/9ڝ:  &n9葓&+eT !=* 8I?8 5Zc703b z9v V(ߴU F)I6"!1+/kҕى< .3o!yc$~ OPBіXV%3> ^G 534 r }EpB}|葳!r&*'6/ul ,?F5/P6=?qU ύ8V#(1 y26bu0 HPe )3@oڴM,Ub-V,`O;G> ;g=;'"  f O+7i} _Ӎ+Hw 5)L5jM9D4@eMaœgDW# 0r-WY   >W 7nnԏ8iǍ964p <ז1z7P` qY5k+HƟ9,hȿŇ{3-O6#W.(JL, ]]-T(|ހd qӖڏ`u1w5?2+;;5or N:#R+&rc i?6986<3H6L0%g"+&>>26bO&'ZS *3B2{6)+5Y=aϝ,/#; ?xŒGua(`? ; G,6Z -\rÌ\[*DVLK:62S"BQxb<ٖH||ךߠϖZI?܏07U?S8-㖅|5% صvo~ewӸr1֠L4͆ըVxkʓo=M#l9¶˚݂Hُ_!= 8t90 n8;s o$(SCt,=?I*{D;ӌ+TԴ m ,܍]S6ܖ?4<њʹâ"!Jf&] 6,c"fyZX.R= <5y7.JMёѷH.Y!cRt,?. ;!%) ?㢧³> ${-/R۟%Q)=q9)0S3(m3myѿӑ-*5Ȣ61} =WN_ln%8ng(9 NЖ6288c!Yz@ZO{ UE7Q23,.7鑪ȁH<%QV s:G o =0DJ{xٓ|8pG% 01`⏈"*1;WFuٚ/:z鑞4\!M sY5A3K".?5[ѠLk_"W-UݏpWO%LJR-l:4>4jfcW;,@H  !.< u *!@ g>';$ uǑJ(Oax\vf6_.[#]"Eɏh)?^ -pn0c% ,a )}v=ۯJ1P%t7H=3d֑ӕߑI>:4fZ44X;-i;_{:c?'.>5%%F.R 9ؓޮ%DA4̠]՞i2d  ᖗ|ɁG tE'^t4+  :"#37ǠZ Z͏C&Lq eG, w|( 1,92>B(9S>]2- 10:ޏ+מՅ¿N":IJ3 K!=b x'Y = {1GאӏqWˢPˆލ*3+*OS_@v WG' a:U䏢/YfkK7#rŚlTݑyh=[ǑĮ2K[m)`fSMЍ +}J# +6Z$ ݂x.`:6' ]"MV/q%" 2 U,r0`8h)uMvrB4>},91/A<=.a '?,wW#`y YٯޖMp.$.c5qPP 6I-[Nf=1N0|T d!6mG M +#;nᑊ`yBr#= 6JE{fۏ Սa߬ʓsm >I, /7g3^[FG+e&`j*+*# t9 k2#Pv栶~"( _. 9@+u{'!S l&ȀN MA{ 6^9>w}ُˍ(^A] 4AQS"\"xew&=d'Bg,w%)#I1/(09`f#'J& b |B +n igh+d*@HHR 3g۬E^ =t:lVS;PG ߏc rR+`] R SCqÏHMɑ lTH3#Z?p'<]J RJ6ooՏCRk O t!8Ijt',{U㌵0hV5IG5|(lNĬtv;?'!'Ӎ : {-2Ry1 3d#1r9RLu 1)l\萑Kj@PuU+V'& Hst&$4, g@+a# "I'P [_UɏcjDZЍG]mOfvn}}FVvPI(@|N%0e  P:**8_V똗@&~4DOF v z) "u%,@⌈DP1 &:=-54"6xk3,Z蠂#яh6ʍ6?铿&Z2暈!M7[Co}'(>  ~8#Y⑃X蘺|  >KT f"%PjʍhP 0F& ( 2X 69-D+n'  :(q\(M @xo<3#/P֏29 [G&;*N"쏵|䞀,1 1=&hg( AjL  mټ] @L- 䠹ڏuBZ-o GVJs j V" 2OFM  wKs?ht˰k 2)Yk}bkgS 3# l Rx{ލUV z+L$Ѩ'60z9 .7Q a6)8U Wˮ֕N  & 5'NL)Uj*l*9l bÌ̷u n c4w$[阉Oj*)0栳o81 ύE kfiտT$l&[hD;l _Z.ҖRԃ,i9!Z=O(ߏ܏Չ0!Aޤi @ឮ|0ˌ18# :v$O8j萬mrPn#>ex؍O  Pp +E I4 (08k0 [XL )1c>  ((*#x ) `Ġx_' # э^4 7j"S.nKힽo{' Cb{yة41k=@ =F( %%;:C \tꠧq׏69cb{ U,= L*0P=S잱4{#C:?߃/FYR>IG.NEbx]3ۏ&|؍Gv * Lĺ#@N*" 7 P'%9r8ᐤ=pj/V^ 4$D\0a2ϚP#eU^ڏxϜ jY,78u6*+O*g:GOv#[:r"Nт C 58_mpэ1l蓘4p6Zz3r2 ?4!E+j;<5 3?c =f+<"=1]24? tNs 38C;?\2`3v)4' MPԖϷ}Z%Xl̞*Ω} A t}ޖ1.((CN30e/K,+<S*Ɛڱx$+0֏4BAM@: OԚiuXe3ȕ<Ėi.ƅšįgԑl9 lLZԲ+_"Äs> C3'Gf%p%/ĘLN 5ƗðᏏU]99(y횕MǑFQ+b'2, {;47 ))6Fr k d1ݍ̓XfF ?`2Bw\ 8I*#1KI8ZDϚvb {6{IU.M"w4Y| &6!/9Oߍ 瓈Hp儮nMx T? @+ }ɽA%yG3'^:&}- D3f*A yWc7 (Q;Ϡqoݏ:NU Y  M$4)&r YZ1̞@n>cHw''+=#K Y#++;{i13:>69Hƞ3ɏ,85!XB6k 3 " 48i y k%Ǡ ,O׏֩Z鍩 02f#5/>{?aR2Кu<$+YYޞ_9K+ ;*)-9(k[֚CĽܑZttݒ^DWpmܐuΠ: 32̅I ~>ᖏ Qc9̞yAN&8g :G0F\9 l͈d=f R->ql<Π̈X:*Տi /-7~/eǓ)`)V<; ƏYDꌿ?S%e]wH Ï#;ޡΚ|Я?̑Cǟ$l@ ' ":]C.Pm?14pz~Op/sNEIٚ/b !_59D?04 nΖ&T' cE;46((珚P=SӏɤyԌc xep,ϑQ-|( +#/06/.xv4'1L77 ~ ˍvөnh֓j#'70" 51 cˬNQl1=3 /#5<# )t S<<'^\..eӏƞ׭͍  _"w>,2?$H0D18;!%C5? n v> A閼{+T5"+FSYZRQ9N.\39F  #UJՏ ߍ  T$>2?8r& ,sXaяC/ -рĜ0&3$C"?- $ˑMUT}6 h0Ӡ `6;w-ӏ_1zø>瓧M C70>47T4S08 d;qĹWw)ꑌس@;!#h5n??&)h4b H : aT Ԯ %ƅg32 K2fύkjwO} 3m+)71- `o4 j瘾a3͐,EJ᠌!a[/4 >O4~o%$uaa;MXT={ JaBKE{1jbG/ЏO#d (mrI{^aϭz,A% %5+- 8e瘥d1_H+U) 'i  B' B G _#y(I,^ݪx:Y' pxO'p*I@|Q$xnڍ^#>P1 ɉfm_*{d {69  R uqm?ɼ<_: T3^~ʏj,u]xTLM/3p2fDAȏ lO)}LQAᑛ0 ?d&dg׏uʍ)o>Pi!2} e~wp(?GU*sW& =N5zb Wm  c4!"sߍI@w fd֊1$瞘<~='k<tQ> -.">q8-J)]=Gm rُnPڍ #,$@ Z!q%޲X*: x5(l) z0FP)O1oIk V #E>x/|)2}%">" B)~{1 LԊq( Ozj"S 6z |.rՏ>"# Pb*Jkծ:GTjagΓyo 0 ] Y/YZ/kG  2{z ."r52D-uL]۴* )w+Sc?* c,#u !  76Q Lࠞw>7*ԏ( M%5 704: F0sI7Dtϣ<fo<[5t=i[ x K\n8Ώ* `1 )H !)鏖UDe_*/:3D Qd ^&8md; 5 QU_ꠘ̏z9ȍ{s$"ꚑo}y[/]ni +4%عNv}jr aX% sR3F # SJ$s:=3< <C v?ӱ9䌩4߫Z[ Q\HC3D:a}P3J O~͠L"~Ǎo  *O62%k"`U^iJ@ 98Дw7n/ HxBta=K * CQ܏B0Wes) `I|75}ͺ8%&  :1 R4*MǞ_?@Fr 3 n>ڍi{2*Z c`;!yt m#!ϖYΑH/K*1\8\* -I E5 q"%Xp&M5 :3v*=. cJ:l 1'W䘼tꐎ  kR&{ (!1 *W,xOBzd @ N͏[d@ $*3Y9 CWd4Jt w>}=nuYdBd;I/1<39 2Z,3.>h) V.(P錷}od|35>/j;2:>ϤԦ瘎9 ._XrV=d. h!X5B+p%[1%;f .rɏM vtn4lzg@ڣg Q  Ѭ,%]T9&{KFG 5J˒jʵ;>1#]2*Rcٴ\9 RzR͔Џ)RQ"e_֓m=a2N($;Q*-K17 x3 D+'q0 )9 \C1Vęuo =ٙˠu]]Xw9Y-7d-(.43 1?@7+f:9-#!P& '{7k䌸͟5GMZ z k98?3 51!>(0J _\1ZՍ &5H ޖĬњ o<JYէמǿ?*o*@nR8V9;6e>FBg`͑%°֑y)5q;1R5v?p!N0d=(pSߏ) c62Bs6P9 W8'/zl+ 5 x3ĪE6m1Pv-E"o{0{  Ta;퓄SLe[V-? Տ O s&73q!w*UcV?0 ݾ q۝:.77Ǵ$ -vE@ͤœȴ6*#;ԧ,ZF|N=;6W&w=þKFGQ3撵zƨ6<*0i $DTw?8C d*Z&a=1=8YQ̣M E8sqB =,dի}Р} jߺ()S?:4?N3 +2Ԛh(u"7++YCkӞzJK e$=)!?l4?qO@($\L7z7+v 15疫u9ё #s=Y2n1׶ڏ/S y _6".,Clߚ]~;ё'7 올_K!/7(WSL׺;Sݍn<<6&-Cٚ.6=1@T9 j MxL 2COPAZ Y͠u۠ԠE{FĒ `ՍYYqWJAȚر6Y1W=WV CB,> u X%b (7?(/a\[NB~CsG,J?/>G" i>*Au2G .))Փ3?^@cP[|jJqPE$$uٮڏi9ŒmdՁ_ݽe3$|_$o␰!3e; 1A!%!;8I$UO!ד!MQKH5l$',69YfߤƌYWvx;葊.;*;H"?4Q 2:&(Z午Q6+, =X#'9>u<G6r:  ,(q j/2,/ > =>80(0/% ^  '͏?$_ݍU L<;G.\0f+jۊQd#K]G.=bb$ i +x"%Q CJ  {H⠁w2/x4*S =P}خ횑 [2z :C_K / )j=01+[G3C&r 1>C aj3Z Za<9/*/~`N&k zd% 2F<5 L5*f mt_n3<c b)I[`U'F+ 1܍I_#9O @ߤ&[JEď0}E9: %C dYB5\(Fy*Xk-ȍ({6*Xmo  isAs⌭Ic[ 0l=2Z=6WS,ЌYڠVhy,̠ڏ Ӎ40v 8a=*,*!A<2  3|ҚI}Ռ5 yuf+ (e r=R#b b$ݍ[#]$͏暉O#Luq iNiC0sOU.bu&Vo,r_ +%m $F~x*9Y j!Ӌ1, +Ff*b  5k8Dׁ RZD u+j-1 6N=؏ԍ~Ft哤j4i)$F"s}&#D&,%.aoϺ OXo$ wXvՏԍFktK  -n4 ?Pq &摨BVꑹ|a /71j %ɏL< ڍcQ+[(I疚dc2 W 1' G0k!m-t6e& - 蠜+ݏ w +'"-m $Qx1.5> cW\ 2_Y RYD m*Zzmvq3m:#6 vt(#n  xn)4u!so;Z  %%\ n f<TB2M08PݏT ,Q37k+5( 'ܱ{,+nIf .A(A(j uHkR^ 栘$ҏ7^5 P\G%O  P.)\ ; L (**H$r|  -)z+ؖ J&:n#;~9- bc @4a @ &w, * ){{dU>쑏E[}s{t#[>& Qs)4 3 斸ѧV!r=R"z  wO`y {&v-/O쑱f'H ʘ zTϏgЍ  5GUI2}%&h. ;iP@ ᑫ!,{'6#w =cխ: $M'W,g΄ ;^^q EC-K Gpo΍Px E +T7$⚑gמb랁 J )=K2. 8-.k۱i/\IzLi레" ׍c?8q!6 8^W͞aƇrя|ȟ'X &&nn.K呼YD L/Z!sEҴB#Z#X*cD .cq)3]/':fg/ N*lm~u@ڏ ]E؍$_Ɩ(!K./ @  ٝUfS!Bi 6 萜9+!Ơ@ϚTߏ <n9o*k ,"폊ទ]1C+ <M+}oSOv"kS&-{RN xH-, IcT$; X z Ř1yTPz?\z3kЍ/T u0?0R3Gn8]#-)(3`IPڊn6'R[ % !0k)1 ?B?+4 );[.Q.><5*1pN::"5EL\,{|CWZT3l,瑺 똠6琞, Rhs3C!rIN T1&7Q {D2{20\ a -ӑ#i* &EL  ̡ed| ' ^r>I? ';"7Pj2H l4c*ס‘ii阓Ġ3K 23+v4j+:+^ ~>0U*A:Y=E_#"i>&~)6:n2 @+;5=7>.l90@!(?;Vʠ}tďQ>0 h%(ؓ>WkYSkۏgpU3kX^]:[:$.כY0nٚ>TCɑTAXо' 3/&렖{#P h=b ͍.Z 9 ͚ZB-؏gκ ҞGbÏ@ =z7[Җkà k.OAZߑN U 4 .28`˼2GڏnƯlڍx- ,^8`rď>CYRe:^ <; SJ31b%T=ᑓҢ))%X!6ӦnA@>:2N/|}ލh!- K?%C-Ib= Z?6-ӞP'3ܝvŒX4ݖS|3FY+!SQ/} .N!{fcmNUΠĒ͟|ЪD+( ,,2 &>K▛>@ʫBL4|6,f }'aB+1[[S63O65uP ?R"2_9 ^*-[Տ4*<Փ 7>g Y1Mn &w,LU dQ-DgS= іh g"4 3JCmɹO9>.998- T8@΀Ɗĝ͏8=~rU Dq^S.w0'NļK@; 3U(ՌQa,14> 8A6_],H` #10 9'##i-YoZ?,ub1|՟z^G9 * D .#N}\ 03, X@zg.JU`on;.W/9+ɗ%ЎH5W$#&6h.߬tܹZƏ{"vfM:4`ϓsR]"I,<'"-5U< 'R6,b斊+՚ҹ#5gljH sȰ:co2я**,|*6sZĝ閶3 *3pܢkOnu0 .t\#$&{Gf푺cՑJsĩ݋˜:Q Qd:z68i:PO5 %{_ܖ 1 pIHQ ~/Q jh۬ތ+Ӛ3BS ?q4,޸F RV H&YL+K׎He';U?97&C 37T<9%>K4 '>, (L摕A+7S9T54f,k M \ g86 nWѥUϷύylZ0.\^֮鏨 "M)99, <=<ጾ%{  W5e&"ő j56+4&K1/.">ynÏ'01s+Z;6? ":X : >U"#..$h: %- /Pn S0,M421!j_6=*-RxF>.CϏ|#tl(˥ĚCBd?!e2,Q?.8*:Ck1&+׉ɑ'o6n*v''*$9:+*Mڏ&̍7uM$&3B `=e1<. r,by<.IW 9% 5!o[!+wϸj Z1+' mI0zo5JY tu2 #(ᚻѣj -?q@ ?!n$!q#$nl04G nR1i] ֏oB!<ȴP>ܖ"kY :z  uOB6 3)ʑp q8;]\GCY04N3ΏMݍZ 5&yívo܌돼\.sX'8\? 1{- u] 1ݐБqbBщq  :,Rq1e;w9*|[X'P2қ.GuPv `;, <K09a ].Rz7zލ?  &\n L0&.4'叕RVk% WU)a_i'(8Xҏ%ݍcwN*jB'% :@mK9|8b K>*w:a~ < frˍ | -mܞVQg l 3*^#6 2 _萩TC<s%׍q`xI &9r9: [ aN}ђ iSđ8b 제%DԏX^ a5ROZ I+L8P =K`6 [ Y$1.:O}W=4#B M.f :O꠯8:.5=FFVA 65$7 =>N. G; .   Q2,,B[%/ 0٣] (= in?Aq%Gnos?{맢(|6 |2.?QG  g*q<(\ɐӶvg 8&8-*ʮre<  n '/ 1! 5xZK+-Sଚ{6| ܑ<ů裑U-917+Z纐%&X.ƠN7 -0a‰.菖>%) tϠ8:e m9h:(,撖B+ߑ&:f{=,^?u2>I'ݹْ֖ZGQɶA㉞ꂭV7 L:wh60(>xJS&y$ 6Lgm3M27/Kms s:4 %ύ)C|/?y^nwL?م՞4r b7ؖɦu8JȮ#瑑!; QK9Vμƞ)} E=' ɎGb8[/ ;9<7(쏏DZ62|Sk>(< R*<$Ӗ2.":Ց  [L$<)Nb.6VReTB2(n9U8I+ w8i=>l i@H--ܚ`IXŒD:EJ®Ök2F?z`;7"x&.88oؔ5X393Zz8<*.ni2%೑("b}ޘ߆l:*  \>q,Ѿ,.W  o;LD { ˞I,蹏 # %NR-\-q)%O+oEC޾ 8ܠ6᭠,19j:1ͼ;- 5'mgB!]FnA>ZDTί](ܧ(ޏ 90G:%Y:(%<71$W SS7<@轏le^^Յh͠= q/qT >|?7=Ӗ&@  D~ <Ԗt (د)!)  =:1:t1a ʋ IQUύ” n=,n&3eR q 9< (S25%ⴌ!1 1%Kz! nf(G<];Iy*hqkꤠ/6ɏ_U3ŠK) 3ӒLsS0ˍзL 1V, &Y/'àǑEե3/Ok\ 8mߪ(?#c%F~ XE pĚ: <$/4ޖ Yl5$3Ōpf 3 x q9 #;96k!rb?) ӑqK(O7ڠP\Ah4XJm 3n)I2^]7)f?Lw,7X罚{ʑ:{x쩑}' S4 ɭeM5s]dgM#."$~{ o5#^=웏t :71: ԯ Z*k)+;9/QD;n2}JClfu U!=(~x?.N)7M%47U–*ɚ<T* _c׺2u-dHР im4qiT%g% ά T\9Z 2p!a quR`EÚ@:3qov(MɎѐ Z<7F*rs ÓV.[9:ih5*)Pp4s / x5{+;ӨLH#'(ޑr8:߁-K'I%l#M M]H,5Iy)؏2Ի*ѯF ۏs/V%D^ؖ7g   4 nɿ34<#o̐%հ#`mQnw R0;;07Ö0) ȗis?v8OߌL'Tkӈ~/b km,N;7Ow5=0 /: # cx ÍM*t"6'1+ K႞| Ќo ( Q,!>ߚ;䛑]熑[<ʇy> 5FE张֏i6BN 5%1 ;|Zvst6UX4i)tW  ^,Lx)[ /: >'E.'55棠 P`,č#* (,2b,[L'f |%,5 2IO=a"7o0iE 0>xųG[5peT&,$GDS;9*:?96~=ON}R딖 ,)(6t-i v7B0H07ޤdz$>A7Q9!橍 5"h}e+S] / =)37Aƚ=w ]}VB`J3Y,f==':g7xU%,M8{,ďH62X'!&YRp& ǐ0:AF\P# dd lˣs:DTe :; {gƛO勌?yC4@)5[m?2@2M6b+ v}a+$jM#=,V/nvyP }D: 3a> jۑ < ˘1 L`A` JI6 cH1ntAo V?xN@_Kjݬ<5 ϖh(z"70;>G)ձΘ A:a~2.Zx)H(=2h4 w:x1/e!Oa6dPӒ!/ f6Z{# NV D۠=M <џҏ5 -]l~8] ;Տߢ /' J7ȏͲzz*&ʖ =/P[[xիy052P;LN| ^ ;((~Pa2d-I|"i l2w4+T C% 'n y%v, Q /Z=~m~w G Pȏ+# ٪)Z<-(ۖ"cAoȏ3 2B*:ÀgHhFu'5k=; l)݅$/s-:V/ JG yp%3kpLj6ݥ  :)';Rӏ&$x$=՚Yۇ%i*Rtv:(_3) ' ,5岏j&qE"eC>5b"aޜ+簏"u֌>k !k.Pl0H SԐ.%#6,!Isdz1S;9ϓc%& z \?J5$%*'5MЏȶ""ڌV x*̏+Y5tT}f1/zGB +2,, 4!?& &RZ¿NMgٷ>lglS(mcS.c D </K:_,8i%à=Af>^mB x_ْ)w hhl2)-Ϗ79(f̠ !,ulB$䣚"F,X ݛ|m뭠w`я ˆ$pQv,*pmBwяKjD[9 d ~0sbmcdfKh  ⧠܏1ˍ)q<Qݩ EȚ>B%_K%](j 3}2r' 7+9J:}5/*R tQb&3%ˠ0onW)aiԚ)^ b4{~Cm"府_ƉT>a*  jT(d W w3#)h_ۈ-? <̚iie ϖF OjP1DnטX%.Ji=C o Ǐ%ƥVJ0a %P7%6{nE9ZiJxK9 :o ylZɌq9E ^*g(D^A> 68 .ږ'µ*.q"ցC1ƌOwr - N)`.Nd9pz&廘2 KJ*t;n$8 x .Sa뵓))141J4Mb(xh1~"qG\3ޘ ?+(3GB; 俠;̏u*u=:&2?:\u!A薞 tYyM Ɩ K"[2^:A>w71 3<6]-i₠ 6wtkuk7/쎚hd"ˏ9E6ID*2׹`>{)  1tøC;q$( O cʏ^**R1ׁOk̞ <& .Pi]jq,Νik 5[.7䍐޽+43 ܿTu Yz8:]hÁE;: D b10] 1jgF (5<G ܐ,@W ,_9]7j G( 6@/6c o95o l?tQ{z͖=0353< C #w#ߠv: >+鍏10> {%imЬ}5 P]ߏ G!4(M4 $9ٌ%ac]m."|Ր* X IcJޏ9`ϊ6 " a#U QA୞w:ఏ6av7ҖӃɚ#J { iEb˘(ǐ&G9Fq"fJ#X$;dmH̞h .ᡌE L Ֆ NHHN 20> b鴐Y jgNA~r懶Lβ>,ԖA _$Q0u*AUb A߹ٺ;Omcx5 d%j6xZ_2̖q[L * S:7m`3n(dvdاܚ݀Mm 1('h儠^R86pZ ꠏX\r“o 5~ ,8B&@.)c+eu傐6G1^cΠED  hI˼Ko_ ]2 Ȟ+ovMܤ4840U;* E <$ {'A B1^##nqB3K/:Dx < ul <Ϩq4'wSŒ 3e*Fvw ~'禘՗Hc"!3W%5m ]A $< ,K"EM/Hc}-fŚ[2; >+VY$ ݑqB:2UCd2F, X5WHSÖF>p2y52sО[p@ W" jҖwɚ0=4` f  ] ֏<넍& +JR&| &}c֍9 Χ>^Wb:3H&i s0  !]oKĠ2a 娍Mj`_TGచZяU͏%] `gs)X3)3N!3a },8"E=2?'09Qr*Kf՞BNʨV@|H )# {= v9  #4Sr3(s K. 94J UJ"3ykJ.OӚ@ ]ۏPKNF!i@sQ( *7L =e26E #B薘R/eɝlꋠvL, NI~^Ƌ:֚Ec+m| Mhi6HsP%v  P=K + ME  Zȍ{W[`*PB ]Ǟ яl /Jj e۝!u?!8÷l22, cK? [ &j $I, SԪi,}x]]/>КПha ?g{: dB 2 ['4Kf6!-Fqj%oX聍u,+΃P@ ~$5qլ1;d 㢌'2"2> *< $v  ő)JL[<ۇq ͏*x7"se/  ,ߍmd-x 089 fݐ^ຠW-a'Ǔ[`dO Ϡ<F#Í?`&f~r'֐%kK ߠl<&qlg"ܖ lޚ؏R/y hF -`| -y8/s l1*0G2 g fY6j1V%   +'##LOẌHC 62N /1h y - Aِ 깠FB[*Ѥ:ҚIZk)!f>> mՌh< >1FM8RߑbjܑBfݘG'B %vVE*-{xsX4 V5G1i'#]?,^(@7L#l8R} X6ߖyʚh͏mg 9 4! )J. +eJ)#y%!-v). &YZDZY^g߰ 1Ka\n8 dЏuG*+Xэ뫐mvFQAǠS @bLb 8'( J^>Q3kח#Jc .  1cבt %YLm,  8` /  l͞Hf笏`mx&֚"n 3 *< \c$ NC-/. ,r`R^4qE˓.zmњ 7^)6/ՏWA0lG HL7$7 =,7 5{o *ܠsN?h S8դ/ã:Q+C*) 9ߌx]j) O&4 IՑR&}ɐۘ9Ӡ  :'l@r3_аvA[89 V9'NK9D)ugt$,_7ejӐ޻ퟠ P *ཏfd&d5.L̏P)zƞ (!"BR "˖ A)%> !4  Ơ ] <j4čiٓ!)1׊oO Տ WW r ߖV䘚#2U  ! k#xi߯HoDя:]h$%?nJ-0ݏnIhEuI)ۚ$_[c!8 S+͍ttU|D.'q"0H&<#]ZڑKK $v4:+sUٖ*i&!7/tc5 q/dg sa K_Ϛ 6 7* gxx]l1 iS M'- !\ .'<'}AA@%P  mb<署cb&ۑC8`%Ԡ J_]\3ow(:&]^ vC}) 藏w-4ܚ.\?d>|q4cٖ e5iԠ3Jwލ5&Ė;rqx[6b3 w?=d*^/rB S.3fҗvӆs2y o`Y ݓL*P2;irG. 1guAcOŚf,FW]`K۝=YMΠ]`?l5 -c԰M/d&Dz;+" w Q%<} "o%/!NgL 6 n  厏C)rC*(+ݦK=jmx`ʌFU % 1 Ց M|a  w&& .4*4 >!Bb! j]~E:3ϊ0eM&\  V ј)cuÐ:>> xT.yUTK'#Y&bPu@Le( 2[  #t-oa@HF 5FfV4X k*ОL+[M XZuG,#CvtBQ6噐$56lOR+W93j#{0Mo54 1@"&`~ raҦ褠~ X Xʏ'꼍&}P">z]d"o  ƚB  Ξ=폏[cLE᭚u  lp=l;yYr~   VF K 6%e'Htov@P 8Ğ*lw~rx ^!!Np Б } (v$Vڠ\瓠P侍@ ߿QNI~ a$8l1 %9l"4"wF]V =@GIϚÏOK1$6qh&߁ UZ԰-5G5!$S# 4e]Pf 9!>h$ڠ -eޯq̀@8. *Zu# w,M)3# yP 8 ! 6ʑ1IwA.[= ڐ$qmHX %  ֍HN&|V,@~RAڶ!)$%'  :2͕Utp팠ꪠ<Dni=d+SwW%4j8!c B R(;tiKi  `ÍF%Sk+߽ m={FZ0"h0*%Qk'g3 %# M`xRԠ4 D%WLg ڂtڽN/8):g#ᎌ X!I Ⳛ H Ց < # f ʘ"o"Dg=(L{c{IN 쐊Zc  @ d՘(,&^   _^*֓;ޜ8 2I)L1aa c 51h=#-= j\riY ~$ Q( 9%7.>xo|v lmؒq5'($"ˋG墈9 $7 uG    +"t"% (/  N 8 f%& UeN: 6֌d  X&#!DޖJ禐>R͠7u`{Yt!8о"D%۲ IvE  I ["1^ }.9羋xC'sؚ֏ߎ*]K %AR  Iߑ 5 gwl&3!)L] n(KP% 7 .S~ mu ǖ'#uP+1yWCK캤`49~'hD2ьߖ :7!5_vJcb~py意ke $([ ["uh6ޗB$T9Ĥ!3]g夨,$/GV]pVY .J. $!. p` hcp1 H # w% ͏ۛ Uh{sDp >[ @taqGLfсPLW䬡!w]\ŏqE Um'2(NT  } ڌ/ x"A:#P ‘   4GsrĠ. 6k+$ Eh )#= G$.{Ux";!4Y6t! q @QZ u>  9[# ʚ0 6%1O+ڃ0C 1fWc= qV!K}! *^%gꢘ^!L9W-P- W Cp.W='qg c >~jK5>L_:C+_PSaIdAiU*88i&P悮/PapnSmݒ=ѿ _ ^fǿx-0gvu{řz.mH^{hˢnф䠐ސfOACO痎|  bO.P䫿Z 1,53oI~,:V9n kΣ sQ oЦ@D#եBs] !Ѝs o,4@柏Qt߀n,Xeqt%苜| Aáp$ SXi6fI^U1 6 M9β:gl`sF%7iQ˞:{K<̋ 10N&qZEjE"&t(_'m찧'a(!na[}eއ刕U@n3P92}2o}xE6}{Py[A^*u T<΢!`Y?~:~|:6} pWfp>q(9ްKk{!(*N`U_JeSU@&"FlxntUa c^N2-\-srL9%ùv~9)2pU ߣ fES+ @8oeTZY Y跶lZ)4ҠkTπ{.U$8P JeOeqBI&\FTG*2@Ueq7YDd҆rzL '/;uoɝ Fm"?biS'lr,毃8XϘYk-ߧs%b'܂llo= `="e &R@Y!aQ;CrP^gr̺ cW1 B)-a=;d![xz \34! ?N BQ}!"  zi &Y}2L9O%!Y?"8e/ō }_"K`2{BoY+)@F)AH6)вe/!aQhOw[[ 59, E{  N: w9 [?G99 5BB"&%,oO< 3$ pi+u7QenRqt~0C|/h^͌Tߖ .ov1o 3uiKĂaАx(c+3+%+D1>:619ٍ;`& {>(ًY¡j֘Rb2%3+`*Wo%-L%Ì\. @- 薠Wrj$ (g]V[cvBIIAx`B6UhDROh Ƞ菷ȲГHxSOaCVYEC`KT8SF&@&S j+¸y#韾\BKLzLKUBU@VJpTR\Θ +;q tU)GfD,BUBLODVBC,D$ܶ߆s|95nZOOwQNI#LwnKX#FZpx ޸"=f0}[/Z孓U+PH[{VcMASIF-FHPYsK: hhIVkUmM:PIdTK)kGzAhGvo&]ܥ ɼĦBȲ wBF RF}NPJ@tSBG!GSMZq@ڲ0_w혈V?zg[MTTLhBI&D@JMVLh54ζ<) ZløMB*LUSHI|=TV%H0[tsԠ)fۿ˼ϳGaOƀÓ /hD~IX{J/eKPH|}N׏JAiZU1`kϵzHGFL^T*U4LʘzsIDAHyMVMX{z4 +Jӏq~٫!q擶aAZ,HORFGHPWLwMҞY/pQڟhKfYϽ󧕳~wؐ TvXMӠVAHUJWiUd#ztCyPF[}ۖl漫Fb&?pCODVWFCLUUSIs|CD@D&D:irqѹ쩢ȒG8սxsvL%MIGH'J[WMqxӓFXTM,xX@ܸRV"<¶ɆZԇ9TnPRWCz@JWuUK{~JEH|DAo(ʑԧϳ˘5 pn>zYOZRNtGc[LwAQfBezh v* scc~:F6|O=ܘ{IE@IzLUMCMN]MH©ٚ\1GUMyJODVF0BKLBZQӖDD񚺸LҫʕL}+iEHSXK@O.FFNHJ^W MxADnIEm밹q~̵2GAOCU @|@JVx@bSCMRiDi󨍢ұayçK~{69;BnOR4F}ȖW@J@ SI}AIYչi y=$_t0dCkT"JlTwU)LBHUG?AI֍JWoL?uxEh֭WŬ7·eL=B@Q)ORBPHlQWiJxNIzG$W䲙rc0e ֏TIk{RJuV:KzMGO*CVFBJM^X;oq߿֪zѿnv=Oz[L"ɡV{Jy^oAIQWN{7DڨQSZxht]HXLWjFT'MWCMxGH[H^@޻zJ[(K̑EVAV;JWUgLzHpGAyJXpw+䳞Xu6Ml]{,J ECJKODWCB~MN=X/lyrў ľ=԰YA+aAr"JuZCY@ZJ[yV@Oy>FDoT?T!Чs٦c:,*oL XGt˖YEVN_^G- `[Tԇ~༿ \r#@>,1?7pSX_LvC@` ؂ޥ,?O̠o @IsB`_W]@QU_HYpB@lI\ԼH3я,F=jDFZI¹.p0)!⚠6vPʼnPPs;X)OWpX_ _(@gTC^l_I UAwݰצS?Ԛ^OUS}ƚN:[ƁT^13W6pm g~@m9JA@ l7\_&U#?/ҩ,+* .kKnY@g_0,TQTz_#X HANT@xCGWȁӞhAɋТ2GV 5Ր>BeCAA2UC^BxA%Y oT\_") Vw㞶c ;0dK3ͧpZ쐔BCKuAA_IdW@QZT^_g T[ICxH̠йՖpDۭͯ/zo^ܢ`]SK.]֙FqY/C]CBaEPɑV _SVX +gТNdF1^087OG0^;oիPBAJnFAuh\XP%Uu^߉YIWAL85wА-ǚk5;6{Qܨ+^TCd_@@QU_B@^BnJ\BAmG n%xAD~`}KrmD2e ZBml-JBv^)n/@`X\C^oYݏYW@qTIU^_?س TC}BN=ڐfT]3An_XkW%Aa3h^8AAnCPӚAn]}S쒭x2@ݣ(YH~2# #ȟG V׋LQ^oYMdsHT\_2X%HB9LE@+Ȩ/ç*Y8H'^zP;LW?@C_'k[sP^oY@YNAz]GkD&35բF[M(Ƴø\hО_+yFPT%-?.a> Z8h rd5Z+fB m h;aZɠ ug Q@b=ǜp X_WhHIWVeUٞIW1dP:U_eNeSᲥk&Э쥢nسw/+ΰӍ.FVɘfKR%[XeTJSJl[aIPߠE1$tЉޏaۤeэA5v:Jb__SI9LBRdPHfSeTPVX:H,ðᖪ|ϚbN3 s6/ENYSbV\_0bSMTàM?_MYT%ʯl34>D ݖ o[5NA[XUOJSeQ՞IS8e2W PXGI,ǷҰ8nɠѦZ)4HTGdPZYdDUPLyR.L^OUOcI <GT Wf؞BEk0m_rZVILJSeQ[SVJmWјfYSX ZsP̠~E+&OHL&QZ:H R{chUNU\3L^YFTOH4ߜdzc2mwc]`P=N.ÏV\_RSMTbx_MUǖ֬+e56Y yɬםzB6IGXdBUVLb[L^OTNJkWh3mˤBiL s5윉_ٕZJ#RdUR7Ps:T'3rC5䐞tȱסw^ԫp+%J/OyKDSrdDQcH.SeTSZIHZSz7;|⫋̛ ^RV[X|TUK;bLB]^S I|MT}aKW{ϩ OVުfN,Aڠ/\GWo]Q[XU5TJ6SeξYaQ; 3d8ܐJK)O͠[L:RI]LJ8cՒ^kRLIMTuaULwX%ѯֆ ;B(E _3Y^\Ka dS*ZCWw\6 dLR[Jך%ATӏT&sʷ=mq4ؐL/IJSS]KY"HmS_IJMR#ZV\_{QPO[6ȓ|ԥKJIĜTyʦ1qhVIrOQ^ZYdUK:RL^OUNNg?d쨗ڢݩ؏Ț0F]QHM͖TbV\TbSbWV_R_9;~Ű౽f!ٮ}L\R^SRU\2].UsHMPZ`"Tq䑭Y>,౥ohⲟٓOc2 _"XI\_RmRuZjKf^a|O1OI#xoJːeɮ{#ڪ[ӢWҮ,‘K0Rh^njYTN#KWgM\LȑZgo|; {ž՞y"HFأW ZVOՏJ>SkdRQKHuS[daTSe Q[Scոؽ&viԳfxcް` DPe4MLR[#Kۊ]^4UُR[KY^Tx1r``~;fo`ǣqܐFGМ W/OKU\ PZOY|SuUS+WyEjXV#g͚٫wHOH(Vc%^T4UKwG!LZY| -UybV._Y>_K߄IOrw"T.9QzS,@*?RoZrW]\le>O*_Cڡg7}[pi] 3Z̠WUϰOK|N c^JOQR:RKRdPyHS-ezV_ %(X̋B_젲eٱ3щOڦ_/^͉lT-\Ŝ]U6bLR4cvPy])^3OiI.53ܖ΁ypxGX*4 Jn%9!KoKqYdU[X_YHR`coK%u-%;aLBpp~aɫ4$KHMRA[PZYTUKRdY/HlSJdEMSoZ0'̣GIpu̧$@ƕ׌q3gYN_kNUNKX k(7O7)S.".%I ;^!:$o8Iޣ֗QRю ɠƦFלƍ%>&$-) !6m&p"-4).7.y 7+C~4,˼63obȗDؚ;)#8#2;ڑ)n:6[!F$'"-!k6'3.ð6躓ċRmȌ".vХK5c$ M%5C):,6Ŗ&!$U'&F 5a-4,,IǙ҈1b.ȸ*VҰ#+)# '/7A)*"4)Ǘ)$B5'HND^q;ЄǑŊWUڑ۞u!6W)D$'s-g(.Q7)\"?4)n7!y"ƊΧm?Tm>CgKx?_ ǝ Nג֌% /&/@"4~)a7. 7|w)m )?e6 ޶,ۊ;ґK~B|+Ogrޤ ؓ-5)47lO+4FWZ5b8(R*L)$ҽӑ߻O$ĸ%և_Cѓ,_85!7!'$'N-)B!6o&g"\(57(9(x`-ۏ<ҙ3y{KZ?Ӵטzrf"5p&7~. F{ z4)r.f. X7m- =!89s˩dD`-Ҙ+ ޘ8Ǣ>7"8s"͍.7 7#&"_.d7i&6>-554'1\5S|vx[kDMQzzM~%^1%'>/8(!8#f;cWBZ."߸+S4)U.5.Ȁ?*5j%>?޷ǙGц`<)")S:n &f{{ !O8'L-)::8:"/HpCc3 -Ĕ $ǂ4 tI$-fϔSˌ"(57 )+&%)K.7` C8#;7+ NzBTYLUEuhMP,ȭZZ!x$f&l5KN)Y"(y57!R!8?HАph ٴjkC:)"vn."{~(.6g8'-( %unNǔǗ'ğ?rOIUϰҶl8/w/R^4):)T"W6!#_tݾj5ޒ&SZ_mLwf.˵9eO8-5U&47}. JNCR/^.ν "ȐpʑȹjvLp- җ)IU@*?v)7"<4) 5)& P7ieF=)9/7#eL헾♝ϟ.ϨEj6ƓLۓ8 49 :7t)^ 775"45Kߊ1]w,ysCK༕ϖ.ަ/v~ޑt2rO jח7P&"V(5G[ ܳ&{]5x8/ !+ֲǠv%p:ɿ ҙbs 'v ?[8hM"4¹!ཉ"4(E~Җ8A+6oɳjӑ "7 b> ٵ7"/.nɀJ-6j0Ryyٛbb #cߦ8( &օѹ .ʉz(?늰";Bjun҇?:4852ޥAij/!.%f $5_ſ7! )nִl Ǽ آր2/9|MK?{ቓL7-:N$a9;k$*".5>;C#: 3&JғŕT7e%ߪÏUgҌ>#gC: [( g ?!11 >+= =>&)#.8|2isGcޓϘ3ߖ4"WF\Rŏ88#m278< {#< >3s= I:"4o"6"]; :Ƒʊɑb3˜00Wޔs̠ ˼eI8$? -74 0>37)Ȟ\O݇EpIؚZ?‘΃ ;"<"7e=;"< 7! 2&7 .;/9i4?>2\7<8'${>o4W 2 3lŏ4=ɞ! ީ܏W5533N?1)[Ig-W a# `0'@!->eyۺď2"'= /.-y4'A%)nk0,=[ %@Q20Z#abu j0i?Co=aȘد_1W3 GL͒V#W"%UM <{\R6s#<p3oT!@6<#7 0ٔ܁X^w@ClsTOP.Y wS˜ mPm3"Q=B2"< u4nR`/g>3r2Ns2K#=#w߽~ '\:9 #e<^L>Ж8 6~!_;6PG:'A6F5@ 2I< 86A>% _,K NPD8 1OJ%6Z6V_0F.2-LC/3P;l3 >enY 9;rQ~ <E̸5e.#'*: ULs<[.0@ Q7ah"1EW#;0R5ߖ۽CXU/1@3;bWQ@hnMDrx9̛02:r$7'9U5;4c5,:.;, p 1 9.40w 4M%<r[*tw)4ד^Q !D?5>)J?T?35(*46;a5} 5-WC͑(3Ƒ3Ҩ̘NǸ̐Q$sŠ̨M͠l.y1;.0.49-?81cɏ49-:9v"NYVӚQd*Gȑ/A(Xđ:RzϘ3Z0)/.491?814.38-3-76:,/=ҖѾ̚kkȏspĞx2ӖЏB.7O.A9 .H;;-N1,w..7{2|?;w(Ωg?$L&Uw1CОGjđi rϘ Ѭ2T--7bF;(-^0V ..^7<9z̚{- 0a7p79-5;gЏρ u:H]G(Ϙl"H<ϚD|{ٙѓa/|Y6-B1,Q.M7#B24?U;3e7.j0.8-<1X=j! /6WeJØO| цΘŀӜW-.49w->_4^zA;8ős7.3.8 ф"z{9I<´DEX';t߶ ɑ;G;9~Pj940_47L@*Xf-1/p/5}-Lęo w /7E&,$řW(Di<+(.FW<\;?;_9.ZDGTVGlږ-OeĎӗd1#f ^ o<ڇ  `(M21BX.&C$կ/:*=;F-3ߠE7Bt'a/6y+=䥻5Ȳ5C7<ѱqc./?o2;<|8'q0LEToΐN.j;2TZ%AtTtIN=4HW2B=ߪ/:̚_:$.O;8Ү,H70.PҟL]~vavON ;8q+  *J$ 5ZֈY*F=.HXێ3|o0|DAx]Y:AGwX Б @K7AX!I9|mhtPzmsWU ;D6|90j7L4^ (6ǤZ'ԌL<0-og7ѩffyqLfMR@pVro]kQv\V8oY܍v'eUf?mqm ZՂ>0@;.UNҖ{RndksU]jiipIPZ&rTgq$h>dEfJYhYq0.8alqMp9/FQuhGGk3Qb)Tw(4!B KNsĞ /93 8BEEAOJIuYܶQt-},8-j{ֹe UG{k,GfJdGrGocNI@pzhNB.ƒ6qҍ$8.G8u-кx3ʢEѣtLՑA;Mns-1/.F4x5x.%[`SPieUcNF{RMaZ5Y uӬtm:M2GfBuap)~.c79ӵI.@%&~/`+s\CMGS}qhPd]BimbɜɨLJūϧ\Q2o 6= a,0-/63>`Y e-W0,  2Ս-!8^N|{tԞ{TЏ5I_- = PF~ j3 5Hg؏߉]) %s < < _f Pi 2e < 2 #Ԙ1dXl;0 *3?/;']kh>r;b N #Y3_0ٰ0՞,ʔ.0l%q(n5 \ FD.l"ЏI 2>5ʅ,3L.\/Q )La>~R"z p N1I< 8WK%p0'!2Ȇ. Q#G <}F>0r %)<l QZ  _I 9ޮ#ҝ/!9 ĐI z% b0i <ۖs"=/ *1g  d'Y0K',2!0~?1b -'D}O#  _ .T ccn6B%w/"= /e9$. %džNqt x# 82 HA_)9&N.201,x *7]la,')X!;>c~%LV-3;3/g:0M \E0* lr"b@RJ9#9neٍؐ"У ׅ'-j%s%/ T! 0 4.6 LJ/b :ګ,2'i Ƿ937Ɗs%R%e ;ON z 00U )4r/ > )>|?2mМƤ %g3 KC3/Gޕr my7.! sFv60X! kq#? #$Ms%^۬2҇0'O^͓ Ў6.Q9R# > 1G)?t6Eέ?$8 6#OϢL0q74]S>cr"h9>9џ$. 2 <* 0@lr#07±>.3 \/Z?)1@wPAe k"[C k"'48p0~ !Ed w %ՍJiޛqE:Ȁɟ@1 s(CԿ s6ɀ_&HK[  /Z0LKf}Ǧ]0 Ϯozu7ЇSЯ-<#␊'6ztE184s!qwᝳӲu] D6 Dv'čR]LKl薧M *  :  : N~JG *;9 9N &9Ǐ:$YDǍIaf瓈 u6 7 g6Rva^ 8#,6/ B1s@Bj(hj  CtOT䚚6\嘎 u 0'P|j~x`Yz[!oiy=```dPY_E 3nM=b*jp͇ z R#@0z~]dC c*&b2[f |%e\}0a.Jƿe 蒜y6LK>hkΘ)]\xӓjƀFYYi%)xjfd)d6Q+~+d/k1Q&)"gثugm>~X煠 Ӊ3`ƿ^̌6j "ҿenceא'4goaqR~g?Rك?n p{'"YwdU? 稐Kpˉ^bnt5Q@$ZYyx *US9f>)=Eʑ'4>ssmAmkt&"p1EQ&L)!КhNl: e%LJ1jC7ǏwNDlJf\!/>Ӝ45-DɛD*6k$=dV2$BS)Mɯ{UG K\ Y2J1/w1c-]l"4MG3  4q 0<pݵwf̼ ,<^GgpΏ΍ᓵ11  jB%K[ S :Y:A1u9 -    =t0(,58/0?;):3302#/LL;$ 15s  Z*0 ?T/#?;.-+ 7 G%E$"ϩM@0H*߶k7/#"-K<=ɏ93 3,LJI=I-] n()]0VՖ8T p 2}%d'0T0Ȥ,!5f+7;ez*4ӕ 8M Cu)<<%&ƍ,R& ~L 8 /|c|К ."А ;O]% 3)@HѯV7$H+_E'g|!y#P/qC>UƪaѫV40o̗ԍNb6F{/C&4,:W-ߩ-%0% F几(Wà PqE7e,Ϗ/y0S/)Ĭ)^%-/r rk~_= 6 ^ ''˙- `7䉊%ax`CH8%gc% ?Q27P;7R+/nP*ZlӖ pW ]z S$80Ʒ&4Nh/98lXܴ1?]O0ȶ߾pF-xLL>r i{~ sh1Ny_NiSq6 469'I!Ŀ%?7T~^ ΁-b2kQ_Mgj>mv?{11TqZ$ R0/B^TH <8P?ibݝs١^$f oMDܢ㐔Np ՘RIr=K=26um[wGЏ:Sd-Nt[/ ϞC Ğ<: ԓ9:܄Șnv;͎ޒwfϏ, c.r}i+:*;M&L:/Wz_Q. *$[۝Sܝea64wf⠘dR|폩~|h-挴4G+N֩KUPSm*VHզEGZQLPFNգ8}Xq(+pWa_PKFq\S\I`^\OxPNRD+@KQ3CH>mE m*EEmVe@y_jl_PDmnrPsWg|ǓչNRP퍕XPVo@Ձ֞|.{m~_R+A#:A%T'TJId@`\*D\Ց!\nr(W%Ս] {0.RAHJsnZ-1U/t2C5-j]g3*]z\3-I^~p''_k1QO~IZ&IB&_)U ?6D&u710(FAEf j0>퓥^5k?JZ6!^X2P XSNNEkiBiUm7]^@L'jyU[Lb#e{ L$$ mѪoo/!CѹW?V -:8bP I+~#dp=TXVAOn~YkP;s_~ [Fw $uv?{?;+^Dൻb[w)jGCgQ'agR^SABBE#|2Źn-t17E"'PwO8V)9)`GxN0''R3   dtU ZfQrB \(,80ohğ`E8za5MޏڑQaٜߐ:#.BEGw꺍ښV e8 ɧ׬9 ުಹгί ʰ%l MJ,i*G,I _kuNV`Wp_{_S^#XZ,% ˏ8$ޱ1˼"ȍ % 19KE5-dpqoGQHWWyG`G^)ڮ$/֦ʡqݯǪDZƦi V۠}wOUǵ}zoۿ-a/V"难## a+!#- 鼐OC"lS^V|gHh BA ڦa (۠߫ݞٜ j+JgG[F ̴祲cSnW\; kd2,N кἬ,  hf߅2MmE].ZyQB5fK; n_gԖޠ#7wv7.O @V1|Q.f`\ڱR,8qo%dˠXkqIƖ́ 쨞%C9Ԣ/x_]WJg̺9kKޝVC[%eѼގ Z5p `ŀ$gpgy_кlJT<ھN dlQe.bݼ |ag n aEn-0wEΣ)K[C)fnw(dV[Ko~n(dsP$ZwmsuLiUsf+oZX0]8UA3gJ g*u|iёܠaթujޱ 41h=yzKx?G,Õp<hƹ؆y1;Ȩ&vGe +=Ġ !c5oRpujqIrjˣ1D9eA S)p ΅mlp↷0W{Sp(֛MԈ2p R MgO$Mecκ壆AMpqbe9$  ̑ ]z UV#:9#  }M E&J $$ ~ tv߉컞&72Bkz Α AAq~܉술컠3xtpAM*? ? "  ۙ    ? 位 `oc. BqPhEQ1pS[ !5,6,?*oY{͋ۅ kVTs{,V! 0 b) 1.KV/3-, pꭝOeK^0lA ز`_l{S ' tL )gGBY/ ,,] e, Vs. 15(hA qxzvH3eIV_^6 /dwt^o n+:+m Y[+ޖLJ 5e\en75J=&]I3nd?pPy,Tfm&/<sp uƂp  ]18,'?OEXtI@~Jyxj 7$:*rip`[CWfAWQCVBOn[JD^f1!rf +h?"' p2[/!<A +5$  =>NuI5 G;3 qN.p `  Z3,,B[, 0mq])!(= inLdwq%GnoJzrIUܱ>`яFP兀! uhB! 66 8% ^~ m+  Z0M6.39/5*3>)ܚ6:`ӊz= ޽ʈ’ǖw@ҒY8eH %- N֖8@,3-Р3&0-ұ I3G3S-**$3&̌&,13Җ-/"-*F4%8 a"ȶ˚ŘziPAGIDPERKSARx֎WR1 _3H!0,13*/"&*3-3&mU,*ZY$d\0-P3-@.&nҐI~ET^R6$-;B6  C:',9^-,.) + =o״87{/|Y{m&WUOo*"\@VmUuo@GJ^"-r-3p#b3!1p2.Ցf3wRLN@1=C\K2\.@ZsDAi.qIXFto˥ӓ ʓ%&=f2*v5((0G*}-*h#)\" -*)P#&,*3j*g!0}*5B40*>#W3%{' Y:} B@|0[4,U3B1"=o!Q;^,5BU˭W+\AWޑf˞ԘȁΐM?E+#]/L%&k+ *3G3C]13%GLSMHh9CoE&,)3L({#:4Z&^ԛ˦ߦȊkcȞZ%~OޘIy@,LSL`_ )c&R1I$f$iK@'"/ PQ1D_^DY_^BT0`_*SBW>E&,1P$]4&o7 ko8*74}-L: ʀՃP9i3FOp,YJY1' C/]$0%W(+8-U)<Y9A0AS.䍚ʧݘ̓<11(4VjW:3d! .BN -2J\SX_ IA,4!7c,/$?>z>^>2; N1)=K,8- ?!z*Q/̢~G q4& :%W #Ӎ#.ڹw{РxNƒݤ2uZۏd}' sOY@sDc\K[~IXDXZ`C0uEHM%v$AXI)XC[M;þʹ較 谏註r+vIEK{LzUBBU@MVJhWU0Lz7ID=@z=L U[KUFOf׳D/ ¨߿Ͷ屯}L^CcU@R-zL%UK=U1@ V7K'W,ULW/E@V|vWT^(s̫ש䪖ܫ }U6wK5KVJjyAVhKzHULEBUTDq@\KzXID;K{+F5«ܑ𩖱瘆师ũc HK{LwUQIAOKƌBzUKazL{KJ:G sհ円^r_ 꽞J۸/W-{Y^BL/@NVKBzzKtzIWK{OmK+;9 d4@;B02(HE.(ϳxؘ" DIB-KtTTK{Iw:NJWObEIaM~WΎBY8̷jCK K2Ld f#wtIoI OdK{BbŜ"ѠXΡDG@JbE1LB-VK&zL; *>@ V߷LSTY?7zڸ-r%5}A(Val堨 _PVM@WV +W?nIHAJ PDٻ#z':"(1ӒJjEU-KY˷2b~F~}>1~>xE9Gj^[TVIxDxHGRuC*[xK&\BH^)A\ _Fo\PkWmZ B(G꘬J% [Lv;,Isd!͓g"wӑȖ=̟?/+4(.!C.9=//$X>͐.Ң@Ơ}o4*Riv3Jgx Dbw w}lpI FOm@ VNz e 8 +; ] X d=Efe {}K֧K԰{ϟn gg ^r(&;ײҏf$8QZ/U.om4)G',2$Y?/>4/5)2+2=8u3g)Dc+M q)3x5h=28XE֚x`9ҧBNϲQl Õھ_^SDueɬÂ;]"= 2#;M4"z27c< a#d= ""ワo!W237 ;"<:l3nӐrehhO = Ȫج0L\!n]/& Cڅʌ8ߓ+ʗ, /OizΑIu !6=!=."X= KaR6=E!>"|fM0g{`1`q^pt: 96Ӑ>._a5bs724Pgv|^䩒܍[,rߚfÏްőfơZ=4 ;D#Tb)u= 4k5lq=yi5 ug-"NIqM?!!5 ͼλOظ`g_nYb2| r:mO`pE+_. Ī4&oLp;5ڿFSp4bpcc:v3naIF#g1"6R7 яa oNtyv1=0W] bgoEtߐŝۯĀ0>4<Py;RѯZ?sicg{qno%鿊EcEI": )r`w_Å}?#@rG'Lr;9Liptߢ½U'sGq&o膙g5uuLJ|~R.Po:h)5#0rŹؙQOm` HyT;}4_+77>sdwez.O]ޖϚ:%nu`CAn/c{h7u>xS5x&-U=!N"8+F͌S|Y]2g7{^1CkAڇ0.>1֙#Lm2׀'AĈg$mB?126 :#m:s$'1':&$uU`5(? ^@>}Z ^[= 7=R8Y%b)"$3:=87^ap[5= 1,=F`^]HuN j=ZhN o=VG7WkwJga *ywp0_F@5\M / ">Y¼t+ ;Mk\vnUve=AZ > JI3OD/@rI7"t/E=]Ƙ@2=I[ tzgs~gRI؞SLEXC ߏ W9#& $4 2%p" 5MhnO˝`ǰz zpiz|~ ~Ű~ձon/W1LέXn ; )JyHk1gMCgfIޥhL\5 v`>2=,?LZN 4#d F >ZRzO zܥ~NFqbNt *@/'  4ٲ: Gu۬tıɪNYgr†nЯMe8M"2Ց =IF >EAb}hw" 6= {P4 ! <<@@ #S?FzǏVVȍn !A68 6M g cX4= 4Ob  5BBu55wq࠲#ݏi.I;-' !#9"( 2!,F" .̿)ع'˾ LZ0.K3[?.2:?<"+;-:' 0ٍ989Ի& ĽĎIa +G[.$2 S"$=:Y=Z>Wl <ǾS6--Wz6\[ }?uo+Z"Ec$ԉ0i ; к#Ս F ]cY.*'J;?#5/Rc2_s <P'nૣؿ#=.@8&P gHT˭'9Xߗ7ٯ*4;J  ᭾opKHֿHшᕠ 8VEg7rχ/r<({_:":U1Ҁ:.r\.%/  3W я э6|3B 7 P`+5Й+1p[t.wF)ewáJwϴPǏ%9g 7Yi@?,;/1]DpNhp RbKƿ K>v.uK.v%[hlМQgUic/o4=oqZadL.(AkrяAҍ m,-q,nN/<|,X?]0xS䘌I{O*zsST)>/d(gE_((/| 'wء, f.tqgtؗx%a  IKL O PE1&.yIlEb蠆wa%ALhRnPe L:aGʑEE}HSt 聰yNyFAzNgg@NBOdAeApc b&S Q@QO~M'z ` boMS>cWVLoQCb}RNُ m&C'I@>]'UBx_O7مuANh؈tTa]B@2w%PZ{k]U@'cŐ s~⏷EC^C]VQAT`C萁bvZ%@OIQ~UUH kZDmCUdCo~RXaEtUw蠭VGd B|[}ERmC 8u P&/iPSTd%a.oq(w\Yvo WB4@; \C mP^'d2Ȁ+14#&W[|\C?BJ9F,!w@@Ea[3CdOWY#14`SOgY 3sPٍGA!_,)hJ&OHY5oGlGY"\᪏&*LW|\yW< 0H 7:99)k`qNd2|PC:b,+ܧ2<6 oEERB"1JD֏ِԞ [9ݔ& ߕ f%d xF KD 0 K aʏ:-04R7GR|Vze_a[b ~T$Q"Q9$79&H $ ‘ TOnx큘܌梐ܪ 奏  #҃ޏ #ߟV7ZM+OK'I.E!@"F2GF #ރʹ؃ /|Q^)O+VS!?3혃 W#ɗF  ./&@%P$].yZq #I/#c!%?!)9#4/J2G |WEF%1^;J @C b F/5$P.c߅V3W"܅0//ɽf:}.@r:9"41H6!öN"b$"jR*WcN ) gQ0wXIAQr lH7#;B:zQB_/D(F3: 6ޱ/ٵ ) cP-!10r$a2ɲwS ZP;5+DO߅LQ24PϝxR.#(H6Nd351`GXMʞ  Z> 3Hf(10IϹG# /MM:^Z&\vF:Yfs!0̙ÃΰFue즍ݨՖE 16  "d>  aMlzc냘q䢐ޚa> Y : %ɍ!ߓ0O\P6|vveߘ鐏 PU "&<   1"PBBTyfct#18 ase~Y_XC][^Wl@EPF_[Yʳ>1$Y=;97>V9%2I1L61,:0(S38I ) 3ʲ > U/ '.[B;!ͯK=?9pp+S|3CseO.V>3!w= ";5"37= " "77= $꼅U꼇΢зCܼң<̶g޿򇷽-䲡q::7= "< >!< ;;p47"2#p> ɌX!ܖ?ߚ? 珈 +!͇΄ԃʿeʎ䐪kԎ+ӏ4یȐ- ( 65ُ7TŞ"HP q6/<5T#*)M" 厈:ʺڱЍ㷩nF`}{m$㟬 "< d?39i="t&%98u #υeȎasj{1dwycw,}xy}jqzb|x^v]u e{1A8$|^vSaTut MGa>z^r#c>qN`aztat+Uͪjݑ} E 937mr՟nkm`nLvmGf{`l}|ttEzʴAjpw]OT! @LpMAb3o"n4 =1 ׍i4YʔiIUҏi\gaUN2})Rv:V2r`Ztmap JNr=GF\RetjYfr1Ezd+att@g͑e)ÞXɹ√/Y-A3"|r~CsqMq\zL&B7!= "=;V h>048!?>!.4K"k?" 97<1$5T?P9t !*/+!< >4 !Y"p=#$$*-=8(M(q"X?<" - "#G%g8!?; 5"8&̢1>:P>?2> "(!57V)+H%5J+= ? <Ou#q E ݻ B($  7""'!/(q =V 8=!? g'[8x;\ n{#!86<&=; ңՖ ɡ  ;1;b 78"4(57."4)57.?"`"/ .8 c;r{p[zC@mrAkzNIŬПGԗA AWJ3={Gjkb~RHccPQ]lR&cRNv). @ dUۮF𖰶$?hv`žaƋ܈эܕwȄpÇ ˓jZa˅\lǼ`"ɲޡc ?5hR)cuGYW4AbX2 AƃARMƂQLJwcOqRu}!gaxNO{p{NxU yvgtapژ+ahbс%x}nskNxpIFqwzHxLCRhD^ȎTy24?71Hj=l*nН!p|F9o%i9pQM8qG;0p"|qrdJ q,@]OI7L(KuvQT}FZS̱FEROV(~EČ\yȖ GX r * K[KPgUsX3WgfPH_H]KWmJZH^h[VRh^*GFYzGSEXDF_2Q?ZOWjSZ\E[jP7F"[NjyE]SDUQ[FLDrZ`k_@]lZZ(TlC~VW]@B\m^YSN\imXAVATB6^lCJAYo\Q8pB@4>  B =\:@^o\C^oYY?+]_>v=UzNq`~Sgmx{ dydpjW{xnDv-vgd`kv/juub`HDEEs.KD"Cpq1kkzse.sgc|o,qld/ onp 7faws|e?{KDD]š|N)  )ZUlnY@^@UC "YW ?PY  "  9b&9 _ $5  ,!֟V^Jۛ_`;9 UUkyڶ:ƣQDdeu`|..%.  mVl{nQxd`V|*`e>y`*pik,}.qrKE'Wۏ˝ f?oMA%exNʆ@!>>2 [1<ϫD̃  : / ϥ}YWAiZ*P@tDܥڠӒH \Px_gN#%dfc9jda{ !~Q9!`/6/}bW؄t?mV^Βo 8%' ΍(9=ZUo+YYW@U(ja~ȣ9_?Ȼڄ%i7Y<i Z܄>I%M𻱅 PZ 9 7릐Ǽ׽CQÒuO?8ƧpN>;떡ݐqpG#ؠݣlTR(ʐϸkD!?ٻaCޓe_%:ڻi{C5 ȏh@V ljϺiTJ21äzBNױ`TQ-Z5_(H"T%t8ݲWPT,%hOOL B9U1f-Kz)LU5jvc{h9ybh3XG.9f*NZ3+8:W- 9/K?K Ԇ w#œ9 , OX1C2R}} z)I n>JT=FM"\D"zJ7\ݰF(_gAl[Ϊ\Pbp^KpQ$]M_Zs_!mbTp$lRZ_mZ0q^*_jMaf sWcm5\*js5o\ i_eeaL}7rvo d'a(xrarfe8z;cgښK=©ZH^Na@AojF_iYT_GnRc3J+\HSO|UTCN\l|M tHj#^O]WM~JhS!XdWDTCLjK11 ~z_@]D_X64LIG8G8W&r=d᪚EБMK^V-Kb2 ~%!0aV?qz]Wc -N[3rPzapsh@CĐ`C|2XnRc}`U'LB UD>@JWUBKzHC)t7xvDXo@>hf_k7fd>lq uj|tib`j33MlcsfYons1whnz9"9fHSQvXU^DCe{BT'E<WF:ˇӯټlGkp<LI9`)*л׈qঔbϢշC^B@YWR]HQzS'30oۓ>RbY|lV'OŎiKio`EXaZp$ LńޜҲOLʬנ"Җ s$+3A @Y+-İp`3r֕Ыѳ,ujƣjĢfk]mdsE.΀Ͳۿِ٭\ܳ^o@YKV[@ǚVD/4^ټܠƲ_~⟀అx`g6 9gUR{ƣ%\ڰG&+l~i,-0>V]F1d<&*_F@Ԯ栠e?rw͑'anxneX`_=^,f&YY1W}D!0U* mKѹ6C;X1l=nEzyLgy_Gh]g:7ITs'\zM.3+e֖3{=tnJҖEIدKτ=9 >aXzT߭Y; 2otOo׵1)@m_znUT2B _nAXVAkS[W,]@B\m^A\xl\Z;Z T CVV\AmDtZ_k"X UZk]DSQEHP#F4Z*GE\jYVY# p꘰, ${lԙޣ".i~Ī!"'imíӭ0$HzZʜ+G`oÙ0ʑޜށёכtە˜od/}\six_Fg[dF]$nݱanQ;ېU(J/ON`RINMLnUI[BgDen#sOLPg@ lz]PnMeiTiM[~hhVGo@kqHgq(`dN]hqMc_mbfjqsjbm``nwH pkoedafDousjZoe}ONR~N+LR,XO!m: :i̮D*&&_Tm܁߈u[؃{ixO}x~Nx pHbDUS|uf}w`IEwQtbQO~CKrQ[OpTv-RoBNܖჀdN_~hc[oY\8g׏ѝŞÏ:4 LNRacIPh]FoN|L^Uyc_EMOEUYLpGELFcLwNrw@u_mxfCmJrOza]JFmogEFo\sI_H^6_`3PJ\_(Z0Co\@_`)V~^\TAmQhmT{VsˠRQkN~eEsNdcNUK5[K%p<ґ2= m˧8fn[9iQ-gqFdSp.KfukoqZڇe=54,:$АPe;HҔYsFTjnSwTAoxZaMdX_*pNh&O*n.pՌ:!;*$o HSI#LpNoLTYoOQRN[LdU_Z^YwGC}k&"['GuLtCTG]pgAkhNitiQ{:zciZFYV!M]zxHaHL}8OR JFhŲ*ܰѾ)p _9&bTMZMXaMKQhLNWaR_[a|VAO*QOZLQMOt)w'h,*!%/)0.{$C2Z/91(&1 $}-s0 2 ,.֞1,+k*Z$3&&,13-oU(^%**-4#4!q6H*7 5 ,)$ k/E6%( 6#5(46z.O a+3&"(!Lt. QG)tmAI&)7u79"-<^!:Y5]U| uL">ӏ٩*I^&aG1'57)+&K9'5? T+R5KUoy^G}*Iڲ~LqmYHwύVq Y\_]F# "7. +&#"(/=h27mo ۺ߬ cNPinފol͋ڿǕtipJU˩a"8ٗoM`>;`"L"3(5r.keяpmcdɹwpIepWܾBoӛpY[+'4)i+54)mq' 5  $Vׯ}їԦ͠oױ¦ؤeԪdz`~Ѳe_DZ|E`cE,ѳ9ЄXߑɑ̅&7)r9+1pSSR܁PÉph_iQpEI>U?*=/2. 7ܚ&L"!.`'Vŧs,ADitɋUhGMr\U~O[㠊,ѡ1ِ+ŧ߬ҠٴN/($56enoO[]@PCUo@VMST\UkD'/*j:?" [/!<GA 5$7 =>NlY. G; h^. up  Q3,,B[% 0]!(= inQ gq%GnoD{/ޝ]U0{0\&Y팄YDd;3^Ȥ Kl'EŲϠWң8l ΟؓYȑtٖn!ُ„מ]ۋŏtآjٌ5ʖ(ܱVΚJϻ֑ eҠ-o۪:͵R$d%9s3|3`&` M}p3~gJrЈד J~+"!b [(KYJg^iQPLHRc]XPy}HPQHRjKnWak`hVn+|rpzmgu`awakst~[hzoFavcKwWJmIPne V[^dULSM[M QM 0)1&-;#'9,*%4*6 /5(%76!/9(M/%d9Տ;\"C!Ӟ>J [&ߏ&I7 O4ƌ4p= r#Ж=p 8v4;b ?y'0[(=a*6+*37=9/=\Πm+ڠd}^hV75%0 ]Br@DmkjWkQsmWRWXGii]{Kfn[=C"UE V:@a7^NC*D[na_.Rch_rj^;A"S\A[VkI0eu{ +!C,S )7N  8!H [k: < _:v 0Af  8!"0!58!)54-=5#5 8"?5!У͐q7àş`ʠLkR3ϳ]דJ&ՖגM<ĚơR(-̞̂DTڏƆˌvYۖ̆fOߚ0 ܣőeV2 ȑčtݧ}: Ƞ΂eߠ1-՟$ ؀ִ([ޖ=$Y:;"-:/(/"%Q8K:e$G?s/p}lm#}=wr?i#d^rj}  ~}j7f gI  <Dxu:\#X) ,+9y"A=)$0%9*)k2V;=1?:u_ !:6&l…۞ȹbC/̵cE ؖӶA>׻ΚB+М̓fPȥ~G ߤb_0ĥU>$ճP(wӪxSw M`kw[cx,y%cv3q٨v΂y>21:RhG]D}Vb:ynOqdC`RclMlYwGX`w~~gQsI^IUA ^dQPTZR_ZP)0 /3'1?->4-="55'#"(578&#% 9O9P<"S!T/ B&Z 7{!4C!=A!#l= g94a3 b>'d6(k<*`4(i+2< E.3.687=2 T?g\ΌjyرuBJC'9-#& h5u# 1&9%(0~L0<; b p= p 1 gT*9& pL |_(ՒtIq]+ĔxGњ̄ևΑFrMБPq͔ѐ򫨷ʵ;ڤc Sb)CBGzBܓ`q(0B[25ziVEe`0bRDox[o pCvpmsH~_Hn\J߉U[QQ`0c+/e<*l6# 7%M,-#N;%eH],(\/ύG?&B7 M04K= T#=@ 8&u177}5ׇ".ӗњmbɑu}OWnVa5 >&ϥhDiCB"nwIt՛ t_p2EqbWVP:D[NhyXm^TG2Q +PPA#zp~ H| Lf4%v4i.55z6&u 7>SE <Fs2*%aI% r@ l!-1i=,36 bOUڃ?S%?g 301-.00.;-.0B,-4:1*h,( O?D{;68=K4.#FD8J#P!:Lz@&M'" Ĭu1 `.5g) A1Ή9$ɣ́V0٠̇zWé͆{U:q Ǯ(*? ?!04>b#\!><#.>\&&(?#*S*!<> 0G"d/#$)=S*Y=)?#>U<{%'*./}":$P: /"_ K0 M 0a"]$X6~-'13v$w-9&~ <Q M {&GI%\9X-9C=fzHVaf Ud[ TeRK[LXNQL OV ,8 $4+&3-64!-6+&462. b$)K,&o#:L%~)U=-2<}=ʒ0ӏVQ֌+%ٹ2<ƤՀ.ԃБ!ЗkkzlCLZJ?_)?兊 c_ c`J2smxspvWhspst"^{^w%5cԇ]%k oT >G YjCyS1FT`.Dh2U P OMdwɏ 0x 57{6'@|7=` `0BOv d~:+rm ;_ Vƒ GYm T^ sRe R@ /1 :Y,O1.7Myoѵ̗QS;G!FV 2M%lX"azQH'Bpm_~$w_M}JZOBFN"PđӓSS)֖ԥʽWɚ C / 0*(Y6w;69 I>'1&3%U9N$%< 9'4d0 =$:$p1 =!#9:s4>37=9;R"?4"4?K 97# 01Z5 vi&6(s?h*+!<5>Y `!,#0D$z=+<)?V#N>%:;P.r8$8:#SoP˴Ƣ޽ݼf y/|A152b 0o-h,o3:4xɒ`/y%`t%c0yIydQfsGDOJBNgSKڮV?FBAdsŏ)ԌaEƖƳgĚAޑO!ݑѾȞ֘~%אˆj,ݠ۳߇ՠ`Jށn\6ۇfY8#l9ԓ}>۞љ̑Ώ~)ތ+$ޖ_ih.ȑϱōvM/ĘۥɆup<ԠػԏLנ2㏥ؐuV; ?"<;) h bc!Y}gR8pC*T::Q;4s(?(<*5(+20$_.k#|PsFa!!0- pG~,,f|a"`B|Lbgv4(/pbqvF=pi`jPGf͆pB}οgD8ݏFڌl'ۚ5 | f&7>q~8`W 1D9p 6p~; <:]y{b[~y ?1eA:0-//1{2-0IRv.31^%81PGh![@SfR4KSOxOBFL xYkkwA`lYJS ,ò]oYF@˚L" ϭL̞7ۯُ~Mˌcۖ[;ؚUG-őwȑJ%Øݐ|5/ޱǛɠe,Ɵb#1ނi1>НԆY!̚?0Y8#!./$/#<){F70L%m.Tm(rc(rC]P|iє_ntx+ksvpzeh̠Hfv%vIYQQ}|Q@+E.7# ?ɏ>!z>B +: ?>?)q>V9 2",/>tS4 9  #HގҮeW2Ҹd9^P' ŨUB(񰽏iA"ͭl"/󡣌J/ȩ./őԶd☙t1 _"IZ?D5V`EKH^{՟ɭdm7a!zw9TA`7`z[YConm_RTZ AC \jj]cAYl \AwNH]bJVKJSkYOSONW XS!% .(/ 5$37%! *77;;"k)ӧ`W`dnQE^_+ڳ&7ɣ6/֋ ł̪ ixg|IvUΞKDu"ƻ(G1^t]Y5pZ9NƓY&$f*I1J SiaW'3T`Cf#Z3@s2nSw2J |\F$[84dbtT>MB1pL't  ; ] `ጛ 4# H7-@2iT1N^Ǡ̻x^Π)ϲmH1 ҿ˔}le6hPO+><'e6 %z̃8^ u8o.^"$1+f[5(,& K-:GA,GeeʐX*V5+5Ϡ+>5(O5m)*3=6I;v?60)37Tw<+6(D1e?'ۊ62 o?ˏ?16&Q3t3:fh{CGǶ6<-Yn:5H!/ 3_/v+",$V*W=)Ҍ)#>)B_>Z8!L5"H6 M;&&%67Ẑ(~ Ձ דѓ oݏo}˝i'KAQ[#!Ǣ'2)e$,P(xۊ8ԣ,ؑhʉ&‘&8ȍr4O4ׂPYE.? .*01A5_%E_ fx3 M> O|#54r?~f(8wA"^a a(X*/8 ]1he > ^+/::h6.9.n;Â-4>:P1=935$Dg_ZX]O_5o2{B0r=L94,58JVW_/R4'RoNkU? t;d(;en_ so o]h<:qz mߣ8Xӫ‡vg|_ pai7aðrCi_˜O%ϯO1ۥُyGĩnK$ ΞƔ哖= = 8!6!Q4W"?" 9%B<.*ϐ& ?Z!>+= 8<\>$*!,*(T"X%+Yri%V_mnrvtc|s:Ah}tee1Al{\a|7cz_ Hj\JgU&HJRdP]XbWN QO%38/332+;$/*%! *,86(%"];&X9A#-{;*b)#>"1;4ܞ.v+͍-T͌S-ϖ*1ɼ/ ֯3͙ҍZ3zl{^jӎ+- .( 1_)5H߂(F;HWu:7LsFZ>IǪ7Q}8i ~5.E"r!@i]@] Ћ7dc ;c9 "5"7 +ɷ>"Ǖ7K Dr>¡"1rl: pc ٘<F`<  [rРUH 0 Mt:,1VY/799.ۏxhmˇ3M !;ry,$t:r'$7@ <bc # 'ëϩЈOOÕԶDq ВSѦ466( ?p(|=  K>~1Ϟu%'302= m"7!.8Զ?6{#>@(?*6(#i <.&"9.5?V=7 2N1L61,#>0(EI: ! >G9 '.BB"& K<?9piC|3Csnyp^?i識ދx+~| y׍ Cn% 1&i0 2W_ װ䏞{.R &I)JYu,%A5Ee.7/gS)zWl4+XK50ŏ R3dgjk3|we Ut O3&% ziZ`nїa̲5rKwu r}3aishz1-5n1ϝ8jAҦ]R#hQ{id \ 0^f̍;*3^E   3 k3P/  )YhI.͍vAvX9xLz22v{ [D ` VW+a1kbE'hA:?0<z-qጟІпǠ  e-/2/ tї珰8т ..[!$%ҏ0Sҍ U6vuN- Ոr,Nd/,x6A!}<%%VfuEk^[W r5+DqTHO+HN(V+OU5Jj73 (7e&<05 BvŮČKKuR֖@Γյךq2 ."3 5R7I< 40>&7%b>!] Ĥʠ>*Ǖɋo=8&=3h0Z*Z6g?I8'(&5 6͏oמ ӏ?ž8v==9>*_?*M=(8 .$CZ1ʘm^Կ̐?9;4:z<<4J0+A7=/_8*Tׁ;ӓĹіKΚY550{;K*>K?l3t(',7[;YbӖr{Кˋ~Յȑy:95j+2f+9N(2(-s0N͠]n՟:f-:O8L3g/F,%3H1(P02bŲ҃ĞǂΞояe et -y:-I8.Z2/X-T72: ȥ1Ϙ+ĦKϐjхǠjϜl2F7.A0A;e1S,K/n39%;έɏɼмŞłϠяO;$2)>c1J\6W/$8v/:u,0 ,,@2l.6J,xHc^(?3 AE, N1>; mK{ 3;UE0}P} X>n%c9Ax 8e§s~ >~ e=q cL[ |l`9EV|l^QFVu  m  D<Í|Z.O8)j  ;" dT T ?Ej햬eBj4 =2d; S>" alԅ(2E" ܍WY6c4'%;w 8`6wƔ^ݺɞp<1A-<8<7 ?ҚRӧlȑZaj3#8#6X `!XMٓՠrե٠Dȍ7* #7-1.\ Uә\˖^pК0()/#'B7SZa,U꘱֥*׎یP>꫗']X9Z5/71m-c&ؑ*8#јPƤR41[-$'.]'\X aƢј菭3PȆ8&Q3%$l)s2-8Tz3Ėt:Տ)uÞ%(M62.j,!&#/|+ʗrґ dK(&0 2*$11o:Gޠ|N9ѠCπ㝏BM(N_4-%7Y\[?ǖP ԚG*Lr%,%D7$y-/8KznڌQǖ^9/:N2o!'+&(ɑ*Q՘ƊDž N $x+4$ ((+ycهiҔ~a(w"t") 7a8-RUҏ߄9ݞǾ59n*/K+X-))ڳn˚aב՚R2-&/Y,&9!(5747ؐk^IӠ7lrS(:(  -5$Eֽʓ+M˖F| +4p$V";,=*0`De%ŏؤی$<]$5H+g6.-5u#Y;ё:ٖ׈֑>qͿc2(h4% :R W)_inJU*99'F$>-)ՏU}«ӞuYWڏ>!B$S,)/?%@šڽܑ(W6k&w.G>&=,?>YzOՠNslQ&+,?%=.ȓӖǖL)ޚ)$(M$#)953 FjUߏ%Hӌe<(+:/*9 f8 L4בg?A6i.O>A)4BŸ–I0ܚguP80=>*7 ;?ʘ_ԯܐáР+ 4b & = z +.]\*ǚޓ{рȶ:=8]!;y =q͞ʱ4K1$< # ?Z rާǬБ| $ )T6+12"N_%ԙ5QP&Qv ˍJePjci, ǵX5PRTw@:+!^P/F%_KWGTkа 7BD WQ^[Q񇾴N$n1V+\UpIGwJ$MWB@7rXXW/`6PdTJtA$^ClHԹ@DV\_y^Z"zb:A@C8\{CL!n٫&]pv{_Q$^@mU :ɰ[HJk@w\\"y2iU-קSc[sCFSH "Mĩ>aƊQEEob^F0 E ڦMD\XVDO4UڼL~#ϳPY}sBBXM"񸹣5eJfK^BlYE (Ǧ&}v[MZo"G\<NĘEh`A(TBUpX [޺xʥZC_sA_oA(]l]H_KJIbͻh률 0WZvPsBRrά$PwRW@MaBpšOtO?@]]\7O[⧌) WI ]GWR^٨¤D3@7THPRNCWՠݵx1YnK>V0iRX]<7Y_IHfY2b/CHqUSJGS}o~QjT@NW3JMYkϠfE:ν]fAXK|WOA Gt_a}\JS)mB|),AsQTf VNb]^1 ݢGbCO/WYdQRD۵%_ů^2UIQUbX5⑬o7^F/-KM%KV44N٪0 T֐ EǠ<^"1ЁޗRbE4('!#ѽ%SŖKz'0S֏݆iǞR$OR6!=2$12&8d_Y/Ȭɢ5V)%9Vˤؘ 0L3,[,ǢqӠ>ќYca[5"zΫSmM%= .׮yiԠ/$'p 1vdS0E&'(?^2Ƌ׷ʖ14.:2'O֐:Ҟg-;=1%>aw،7%:!(#p5əۘצ!%~݌¹|ٕݖ7?2"!-xƛۑ+G3s#x%8v CĈYݯ"& />"M٠\ۭi܏#<"8tǓi՘;=9I=UޏN 7(/ ڏTz6! :5Ւݚ7I8!'ߑCܘg)*8=4NݖȠ›ԥ&'8">t"u*6&!%ď8m4& $+ ;AƚuDZ$Q?(7Bݘ {-'C#"W+>؊Π4ɷ ;$?o=)Ie o%-46ݖԚA#; fȞˈ7;=D9UBݹؖ ߶n(<=_8Aݑ¡Ӹ M&i pFƏ su7r3.<)!ُ^ Ŷ֌ 39"2-( _ߚ9 ,/: 0'o54~ėǘ?>* :hҠVGΠY5.&%a 5eß vH=&07$ wݚf)"g?(Ӆɞƚ#e ?*- EYm$9G)Li&ѱ˜[ͺ} |<":L*2pϨ >M'e)p+: ܌ϸÓ+UŚn"O0*((ô'؏3r# 5:g–Pݡ"+I>0V͑ɑ`!%1<I5S̠.o>iJdΑ[i12. ;ޘUUۅΐ'(*8 Ǒzn(&5* 1/>u1Y eD 6:541%l~zA-3R2-0NԖ$\ݝ?e(66 'rƞ1(B&3 bȌ-03+'<@$WbЭBf>yr78#:"LǐgH%/5>; ɲ_x=(>a+0I ӓn:U/%*65dMdRϏX <(;u09ӏV(730mtȃ+0i9!Ñ'׿嘓&;w(4T(43)/8яDa3>8>+: Vg׌H(5>WѲĞ%/T5 njQgؖ +k9 ,8ȑwa2J?3,_3 m3;;s3n9ɠ7G͏3:44b>̹ͭ֓(,0GV"̏1 ?8 yAȬœ 47D(iwњʊ& Mo2rǑ-χǘL?/0*NjƠ*ā9 )0>ōEM&@=,?=*ԖR`=%l7 Љ=B&*24dɸjՖCf&^*(0-ɑ m \5 .6 tӢ̐_%f?1L5>^;a y)2 (@ГÕ'6l?v1&_ )x8<;7 \׏κi8>}0Y;ךJe328q%ҏ͘k37+5+ƠZMu2.!1+#iA`(0ws;24h̏(ʚ5Y6S2;ęs ) @:nh9,L\.{̑0͹i + *Ӽΐ; 9 ά/C @3Г̔x-?1hʝɏi.9 '( cÌ0 9hWCϘm6;1?>kΠ%tS- ^(/Š 0M9K9&IS.f?Ҿ/aj ^:6n:}O*Ҍ 1';cZe/ -B2!{  ^zNp [)10Gŏc:O3 "Г'p ~= ,l\'%I @73DVA둌> _/2@꠬C :Vʍ jjY.d_(nWCYK Hww eç, u^ewC* r kEo1 w"s5s /RXoAC.ʏ.yэV= X$+y3AudK?4 } z1  I  eO,Cx7x2G͍(< 8lq 2]/KPAU1 ΐ{j}*e-\\Z~  uҏ*w0%d=fL.)!ӝpFHdFCR^0b9my-0 %"☰( ;L⠆hF+dӍ?L lEу,Xw +" h64LW~쑩--NL 琝>#hZAՏeK*9bD+ e*z6}F vik~w%5I+W<'^< Q栺!EpC4J %t+菠QL`(3 DP 9 ?0*\瘷)P \88+:,W(r) v L2+& a@J)+z7 ])%K5[d P> 3o}*؏8 ԍ Pc<F.GnC( (,l*wM C$3? $)c)]gVQ-6^FE$5* *IWP㏅i|Yd|zdE)b(^ G똹lFd4"#t#؍A(Jqh'NPC6➿[ /|%tC 0쑧R?%v 4w됚6*dnSۏ7 q$& +rc .%b{ڥ!O G,$5 9X N$V)E꘨>q 1 $l܍Z 9eVwZ~#|m,@t  k#^$ t7jꑱB周#%Y a7.0; [ݏI" [ah "(PEd  "Bn!JgY7!YCn3 / L ;'N^zI!  V.# !NGHH< sG "呻ߡ Q$L X+ ;-19J   ?7 aPIZNw gdj/4(3pleqAH_f_[@@ZBA^_UE?!$3$!j+=.!,), J5*<O> P# +/$7,=G&0N;01 Z;,9AW%'%. ^)#-(15yvy&Rinow`-Iݯ@D_ˆ/jxO>旞Sӑ@y>gٖ=́ŚuױM) 4m Ϙ= 7m?G6.3-9v/!5()0?j4)63:< $: 8ĉޡYT>׳BijSڦ `-З-ޕϧt3@Ѱ"R,IjWJG?Qh0TVE]hCQGDV`GG]DODxGZVhKTD,VhQ ^_wF.밭ֵzݙpé$ȳPKYgG$QPHVN]O/^EQ[/[Q[Q/JQP6TV$]XQGVj"+T7/.+ ^ۧ{۩Nܶu^.3ɓ+Z KIGVhTVVh'QG$_VL]hNQPIT=.&鏹^)_G?]RWEHXbe~ƌX%K|f*'ߦ擶zCoBJYsg[mKQJGfVR~xH^}_[pYRyW^iHYxgRBKYAM2_G]R=7##JiNݣn֨Q߶};i)ߙgus™TCZ̫>y64YXRI&RKY1JG)QP;TYQg%GJw]a[[YQSa i'/#QÏ^_G]RWsE(I[jJx-9޶Z=VЙiڶ} PtmݨfnըcKydϯvbgɪnyu HֶKJ bк#.\n{Z}GH^@GL]D~zhygQ߅f[zi`QvidҐYwgЅYFC]VNh"Vw2h}/>-ѱ.% o-zR2/Xg$3h]CYQP TTVQ]y%Gn xeYӌAVEgQHN^|I\JNUGHJS@dzWZ^VcRL"R9MX/֒$LРPᏞv⍖e̓hhɖeJ֚}KЏoVȭݞn%űǏx l֌۫~ܵƖƋ>b:$ 8;"r'-K)%=/#=(:=" <>!&$(#.?5(?9 !?#4"" ?@˚ɞä4܏o2}+͌v#d8ܶvwnɑ.n3v®3 1 j }7p;a a/ő jȑ:@#i6W٥]<{:_#e=J c6J t=FW#zK#JpO{=O+cٮa ^BY#1 ~ś6+ 3NàOSSBUGUFhY_^uXY^TG[Z" ;W]*[XL\s&J Ušr8Rܓ)Ġz.0D5#m6G6eӝU#~4{#u6@ <Թo#r·E?{2oӾrt:ʹpɏPڵȢD̿P:h#JIIɥBݟG:T ?3P%J([]E^KWSxKZKFQHeKNVLjD[tMexLPR~ZXvfޏ 6S< Q#xڧQ#FTJTO׿EϡaռwĠֿԼʀWŽlvۀW=m 01I*?_aE ^FCkA5GfrNtYpJ3 gUYH88ENGIT0};Ii#\Z̊opŌ܎ɽքؐ߆ڗ0Խ̬Βބ׾Eo:4>e|:+XDW.!luCJ=7ZpFRB܂(ۓ]ʉ"ؖOkĤŚ(nǣ?|Ϗž tȈ֏5DČDԖ(| L.,5iU1<8_7 .0.E:,1-@  CT = <j 0i6 19 v ?8c ea54 i4M Z^ M+O-s/~5`P:{8N{:pp!O)*q)M $q?ubɏfQT=1l &C/1\M~[1@_ۡw_O@IyY1CuUw[ODÖ`_wj|Sa]~Mxa}_GRtdR_O[HaJ1O H&K18j3 cs@=]OuSO ` U|%RYM`a6`(}K~ pHTS@~I Ώ{|) z? }NLbK[wxSvQZwF_}`DtE^gBAxv_}"PXT~cfWUZiF WMRuGNOTbUP+ M# NA Y-~avW|$cA)6atB]Ndpn_8rv~Ca1SZ1%tB(}`QE+L Se+ubU]"CPSFDETCeVXwwJ_oJkQfOl|^Rz@|[|oC\#zE"FF$]c1GH+ R0oTusL~ZAf7n_rssJz)c_h)>p3\yᖳTJ&SꑝѢC&O$H.,aO:+my3 I*))j7|a 'nS2& ] A5  A$=$m ,0 HT ~X!kN ? / 7$:*_rp`[CWf]^QCVBOn@SD_)1!+w-.?;'? :I9* S6 +2-0/(O5  57<  Z,[\,89K):1=9nglc3Lo_k֏}O`)i%\ ]U:t9FVAH k?832*K4X=$8 F%$=4"0{4T?;=>#m '8$!._ 6 !,02.X>\K괔ZDԠ6 f׿KҴ<ͦH屠E ذĨ+ף RO CVE@KWzUKrzIVKKzLWLBvU@[fGzL|zIvD@mzLTiHTCDP[Y1޲iװ伐淙𖽞 ߫﷊ðŨ$T{ϻY|,JE@{LfUKzU@QVKfWUNLB2ID5@J;L U#Kz'@V(WU;Kz%I NHt+ ݏ˷Ňﵐj69C:={;:%D*s)h vg̫2}Eh0JOCUAzhLUOByDYrWIEKV@xKzLLCUACLF>MЏYɆszv#A"D%KS"PO[2U4C>X83rfjϙT.}O T~AT@fzpLw/w@Ɗ"LlLBHU@c@JYWUJzHqGJyK1yhǢ1pߏD*K)%Z1PH^vJv9SDiCFUJ U{|U$K]UJLzMIKdJUKQzzM@Ӿj]ke Ǩqw dqn%垛̶媘݄Ѱ G{L[ZzI-+K,W:UL9ߏ6@ V;K zU;zI8VK>z L5KDANY|hô͸#,;`E?ઊΫc$OVAVCUI@UbWNUxK'FUMyGGd&ܻ/ΥS베?ٰDUj񧱺4ˤS-ضL<}Loޱ7DBeKP\SI5IC^\Bs@lLCCTr.D]J]H^jA_\V^AGq/BOKipG_CzGeK %Ρ[HMDZL[N ʨ\.Qڏ65Onr]Q^oY@Wix^U@^oUCB@^o\lB8^nFfR"(*VDLv~yr@2[C&^-B@Y3lUR@YȏʽњCyB@^or]2Q_qm'Ѩh؊ĒTmq~~djntmcoTag.JFXA_\QU_IY[WUS^rY^kQUW^FF2Ex>hYubd~ccEk>m"qXYWEQ ^oYCoQ!IYG@\qCX ӛvns}kg]oejaU3?"adݭ(_Xo\Q̾B9GX,^or@UC|zZq ͓'Wl}Y\Z8Q%E^o}AYdV C^z\fPBOA:Y7VCPJ (֠ʬFDhX(ͤ*̣$R BHdcTTŅW_cdv؆@Y.BK8Nѥ&ƨ4̫Ą&gX4[@tGB@C_1_*oR]Cl_1Wlq^=@^g@QS7ג6sV\U0%ݒ1þo\z[o\0rkpn@a㪎o@YhV*@P)U*^IBAn_O3=hsTn󩠣p^ͯv񦚿q.rlXUQk]DZBEQ0FT[G E\RYT^SZ_cFXaiRG=uKxɦj V䪚ٵ\=C]"! Y0d%PJ^J(_IUEIJ8Rcd WYZ^dRKqRK#YH)RONK-̮t @p`cɝh׫lapScnNnW#WL\-L^OT y>LUL^(O'OR=LU1c^OUcKU)Z~lǰcMGdЧitҲdSLeT,ڲ#9(RP[^Pi]HYiSNUyLPRlcVYkEfwU3U\ L^ YT{OI 8>إA六w[LࢇdbIaKXyHhS=dLR[K]^toUR['KY(^nRmILQ" E1>2BEPRòե4C{K~58J]^KSlNsL wL^YT&NKRdPZqSe|WXI ϘűJ \#%8W UU֏@^SN_gX TNKR @^ E4c`pUY[TPZYU 8ھDtP٣尞GDzwfN LK4:OU_dPZYdUKRLZY^]07CWyKtX[WtNc>,o8 4=ZֱwتKÝ'TRLUc^OUh2WY@;Q[P:h Jϖ۰ng몑m֯h4ۭ|RKLJT]1QrZQXIToTPKFSgdXISf3O_&TmﱆWp,l|"|QRO^M_NUiyYXMsUjMm^;NTOXJWl\mᗩ qg2󯊜 QЬYDZ- n FP!eQ`ZvS"dUK[#KYHS5)-KRG1R̮dѪC1S TENKP`+HSPJ@^OTo&Uva08K&HLV^8L^=ELR[K \^Q`KP-Oսsd¨>6d/"Oߞp])N'N%~L/M0VMS ZXW3Uq*ضrѐ@Bv٠kжܘҠ,F|˟("1s$'+W14;-A/6-*&/S$7'^Ҩ2ˏ~tیg֫ɖ2$ʚ˷šёX+.%+ */8(8#T;(h:68!! $9'-b&CPZˠ 獇7oeȓaNݒʖ>Oߚ -W/1!!7p""Z(5+7).+4&)/>[V˚wBvё!7֛ґ2ǭ٘үPĐ*5w!; +&'"(L.7E)z"4(E6!#m,4aܘFʖE`Sbԛ`ʃƏ)׌0XXzW 8#";)5Z7.+)E5o8//~*('q;ƥݔJFj!ް'ǓشŖnhjךg%\/"dN*l)(i2H..+&"{!4BcW{@|ǓrCfŖ6١ۚR-ץ=/ 7{""h(5j7)f"f4(G57.8jNܱX޹No\L0gbffҞm*f+&)4_7<7l"i;(x:6 `Kq.jzR2EUV铒ӫ7ؐ Ŀt*.f*)#l' l.7?)U)/7!!8$"Xd:ɯ;]ŚYD|Iޙ#Gِ@BЦè4|?)74 >$7.B#D;'&A0ޠNڪ ȣя48kŰޞ&o:6d&n+K&),$7.44.)5H7Q!";٢A:й?֖L΅#+l_݌Řr38%*9 ;(0=:6ObVW)#.'#ɏ //5,H&{>IǏR{$֎GςǠ1ϠޔLُ珱:-b+ 6e!l 캁4z)7f)*w)(#/8z/DfƚiȢ=!sX[( ?ֿ`˻,73|&"E3:7"|<#!bQ^nݞӫؕǏ>"֌Sǖƈ4f$h::!J%+, :'w;v/8M$99%h/,ܠ[ÖJ쏵׏9g“OӎԒޗÖKC v8!I'$)V>z*:++ <? "i1 'A!X(ޚ0ߋđȑ8;Ø@gfzܹmk5|37= ;"/27= 1;4=S55ÖiÈm߯wPӐߧzŏwō˳oȞI" ^:?03*n!"n: c?3z6 ;m5>Y24w G{"ð]CɾsÒ7ܖ tݚ}' #7;4&6N=F:SQ  :O"4$#ݚI߯ۅőDEɧ#^49B;;5"7r6F;k#5q#%7 88$'>!aߘ8ٌwmܠa~à 6D$~# T# U6!E= h#B >!s<_T5W^z͵dbߏ\?f#M"z< ;z ;\˔ V-:G5?s0uŷ׬Z dߩqq*ۈ˻7 "H:戏7C e#܍'Ɠc:73Vܓ_ɈVԍ29;Įnޮݧ?=j2f k"{ԁk=ƒ#7u y;k4"|Г{w!剐5#7!ߑ7]7wrƳ) $֞4$Yƀhce?ڱ##I3nf"< >ݛZR;#Ƒ5#!0Iv ǾŐ02O0k'ۡ>ˏ&ƭ|%=;P ^0'G; V%=B2I%T4M0*:6''%g%<0l3\:/$%_pĭȔ%فxٌ͟۱_,ۥiڃaS 829>n'9(2$9'>0'6m=8 *'665%[}n\քʠǯȻϘؑT:Ԃʺi7<492=b(%1?>49=7-1(6=+6T\)? D<ƫ^̋mw^ßɥMyߑÅըɓԑϒ2 1(6(=u71(ŧu1|+61ŏ10KE#-A֜ȮʰǣȴbַϋʃdzÅbA`wϔ*(1V?(6c}y(?(=DGrRb6=)1׆`OʙLuԚǂȕ`qݐ֔eD-y5hP۠c6`Ӻ6nPFu71( 6?=+C6I'a׹`SOM<ҊỌGEPOb֓XP 9xP=>=7?I=I3P=bUbo`uW(A6 fI*}yyD]uBu ^I֖÷՚Z>}^;u9+IOP1?(9~11?(bU6,#2&6qԞq~8Ծ@S|մȷb-wֲqT~[ֽ%2@9FN@W(q&g_k]y|m'=Uo@7*g.OԴBw_'D'\.G+(,ʭSǑ-]U+]dB,En{UBho@\NߒA=8&GvcUBXAW-//%0[/!ϴsc{f/IO`v( U1d&z\@Y@6( =+9uz_UX%O@WC&F1MݠN ] -601A>|)Q<%<86?+) 758š70)>)2",20=25p-e:C-J8R.&2/5-41<86 } ?9.b[OTRMGU]c] ^2Yt@/ȖͤU7m.;0W.%;T-&0V,(.L7Q9a2XT0S.+0P52Q?-0^=7V.79.뚉^4[-(V&'2J; $c',f 7X ~Ҭ/[7XS-"0\E &?9.1p,$.\7?X22?m;u7.3d! V;I;S-[7=*g,VMPj[1PQ\Ğ) ϏE31?u0 i7+.Lj/U20j70:v Z=-XVO,7g.9-;. Lp%E$]2TAc, j]A'OU o4.3cW;71x ?`/"kL-50tV}O9?.08%w6'C?FH"f; _^/]>M*k&N5~(<;7eq?TbtkY.=- ,6.`1=[ )uZRUoЖ`[К욳+H\ S0R3} {y>Uy!>Q=> i >\ 75gAÅ&MRS|~ĀCP M  u޿4JL菘ǥ )ҰX,li鰌fǏȍ j| 0 ?7 ` v}*H6*/ 6ӝ 0Si%vV_ɍQF擟fM4[oOAgVaV|s3l}a*k#P#~nA=6ʎ뜳6 6GCfLPb8kSvd{igͦawbVan+/( ɣI$IEm ^RNM6K,F6> 6і!kJQNuGct_Ј0USԍeܑUsz]}SxҒږ56w ;ٚሡ!wH¾^ 딿h86>#.:QLɗ@Ovtʏwgʍ49E*}[ʏlY䏉V@z,A& 4 k e3BU  =) qy2xXI;2,0  #<#*> 1+GDtbϮ$$n1=n(jϏ+p 9 TX 8'/ *0_h l,0MNm8ep)p7g1se^`d~s_a|tepI~x|cÔf0w|Xa7o) 5%o=y4^>|5063w0e~]h yt5a`roqa|vj`?oM%) *e>l,!iu^|`~tAbk{JZIaxfB*G|w}2yy*s#'D(O;g)6An^xso^A`f\@q8wSt$:|%0GEJ*a~ p9ob6c &%\Z7T3V%厍ճ[:FgS)''22_)E9H eP1X: _! :~-<=]0#0. ;XM[nYd}bTIED]hQ&`@dTà [i3(()/ ,ߋ#h-[~UO[|h_{J,v0l}`%UaC]$J,3HX %:͠-x ^  .g. uK3cBHy9D[b$M_CBikqۚ 38SCT~lF픍F## _ ekOoP !4""Џ  qi!hBAP!>( ,  !!vbvNU% 41 я  /61$,ng_`^LC\C]oBZ\I_UeDY+/"(o<.!,)'J5*<O>P: + 9$7,$G0 O;0 Z; =AW%'5G)#$,#enY}ۏ`?Lg_kpZFYFrvDaZFwAAOXMMGZXFwDIFwAXOXM)XAODbHMxF׍A]YF4vGMZFz_˚@0;RB}nنeVӦ租@䥃MI޴cKź|`}OưḩTJ ܞh&@뮴װ[4 O䥮᥿G⩧羱հ7ž ᳚GZXAwdEI LxU6*ٰŦrymEU bAz|MFocx|NPʻA"bˍ )O}Yyοߺ"ż۲ô&娥ⅾ)65鮣wMGZʹϦ֮eHMxv AYIDCk1̣va%eo~aWwwkH%xxJOQDھFrvcO/-1;AW@ MiZFZΠFwǮwF#MwFƵpdιAOՃǟAXjGƠXcL[Gu[lZ!@M~EZ$8/4x=θq`Ϗ('k~ة8#OcÚ :ĻWyѺ={լ䐖1UU)~R6u~ ͩ0=X`-N ~;`+d>qt&L#.*O9 > e4K" ?#!8V5/>37m .,;0* =,,Ӑ(|NWZIZY6%"#'4'6B8-7Q " g97*( ##|8u'66/0Ih42l<)=Ɍ29"'$==kI2- O-"(様՟((k7}!  N81 =J>f35-0̓ < xV <u f!OѬ}C]˄ʣά?C36piJWܑ2׾fXߙuƢ4C486V+r–QTHAZN9QAVO2|)<$&7 L _7yjtӮo<B kg8KD>? C; >'K:g6J( GmS{O vm2)ۚB b3_ ?H7q64r{ F1L2RM&+, ,5ޘ=fw#ЊI㬏} 2#$!6) /5"Qs4Ə\lgҼg&閪!2i}]ܰ5ˢWc䋘Lp8ϐ/3 -O<'!"9|6,+?:/ٞw-׼Ŝ֏ .} -5%!XKO*#57 ߑ 9Lbhn z8 aX;< VXc+*ȓ]+] x)% uz-NJ "; |8&/ y? f: K6>j ?<~ ,Nݐ2 { s3l0 G~e ֌˞ީ))y|6}#)Кs0,Ǒ  AΘƹa4 d/-3,L/6L * A 7#u0A9Y-AƔьͥ8~8n.zY !a3đ8)8&!J9 9?9}> jE +,g+>"3<,/":(3={ 7 (u %  & -+D9x (4*56%G  > rr16 jA`KY>X6} fL +vˏ * P W 7# E4:SD} 3ਫ਼i4ʤvʴE˖ZZ8.^b֕ˆqV"eaj@[4a5+O]I]/RJ(5'X7%4 ؖW $v!v룞UݘNV   O=f2;8nF Ñ< @͑ ƙVꡐ{ ea` CōWC1 AF+.! l ZA S9YўS"C̏|y)R}1/D+J6t<īE;ϥyJʳ=ߗSکؚ?;h̓ek88 ^ _2%?,%73 7@ ZB :׫*ÆQOϠ?쯏kh-j9˃o"D,&'X6D |F.4.    ^4iH  a' Ll&_1 `5q( Mi=$nÞ xi3|8oi0&B a}DO(FJ|47 쁠 \6]%`]S ^u }kJ684G  {r>*Wݚ6h洑#߁كe^IwFgl -" U [> 6D Yw ?$27/W1=1 6g T -w A8 v h;z*0 63M.| Lُen`6ߓ * iW";؏A1#f._H y ɖD|!ԷRSJI j)  +ct;`r;͊Q+͖g :%Y17:*+0>2j^$ 0v m{ ӑ\XבBG; (=NtPﳏf (KU/D_((<q-@D2Z#ґaZwv˜' ;ܠ+ p@1JƓsυSdrJ댏^#JL ;  a B3[;}͠ؼ-qt=+75 *7: LtH'\ W;ɚg.|5.̞@0ŏc(Uz[ %&;B L ,/ ܘ9}* ,C 㗠!OA@ӑGG mF3 QTqЪ̏6TF 4g~5~o l2. w2Ǡb$ԶZI&+ۍg+&#(g I ޚ`  5z [1 j u9-W$ȣw9f+ј\"b⎐ڛ`u+8   Vh柏;g㖍} "+WS R 9| F6״,!sh|90!q!', 2lummB搑W儘6R׋'J Lir" #qO軚c3ޢ,Nҁk)B?iqeG9M-` cڦV氐0MޠDH[r(%4N"   泏o[@ 9V"Tϑӑ'A4K z "v| -\7=-* f ~p.?-1xԇ3Qb;Š8A9b-;4+*z0?u3w wpvٖFݚ -}cZj:r(}%G9)iZ 71~*3+)6M& }p&5Lʖ,\]먑͘IIϠ Q蒍sݓ&Wކ]~ڰ2 c)p,q j b{;,#w d!Ɩp|wbEȴ8xë:/?&P,nM1))G)/I >mqKYΗ; [>䶞A#:Ro}`!&369 1 y L4Gftv*y/@)=C 4Z-d 06g@E: g +"6zT HxKO·"'M<[ YaϹ׫{Q*N ^ !G$ w3!VSpI"Θ~W+  9uT$0 7`ZbǩK[V|WPjZȑy/!C sV 2 $ I" }zPy) %%e#q!0D5%u͑m0[  'A0)m`j5BCO{޹]K߅ }洞@Γk&7cT4[Ч CR#+d  K Srx1Jy /f ϥ\ bcp^%4 ߀ o~_3[梘lx`8VDdj .y'~=` qi)( !W菏&b+GֲVo#ҵ*题!#8%f 3 t ; fS@9 jxg݄E!{ $8w.upN*RI w )F=ykkwuOHU9 & )A&~ ٚt  &f' z%8F9~ O+()zF . ;_`'(IV  Lj_ " nbjyda@ + u8 $ɚ$ h: %ё} Rx 6o X ]#ƓXm# O <k XEB0{# 吞5SbsQ ^.@%Bv׆&i O7 2H%!\L# N_sR  A c-D3Q=؎% d # S=@K#1?% f }  !^j䍑{2$㩏al % N(R &rN #/ pe dpXG7֑đ,c axѡI >L$| )Rޫ)PM'q6 ( R$U ܑ )*Zh/ʠ&I #2 \L{"98K㸚t  Vw g\f*|' E KZ 0Qo͓s $ܖ is{'{%"ۛ#Uop5 Zx $ 0W ZAb3E873! x"('D$ t,>?u  D vˏAD œ`ۙܚX:9(PPtٳďG=㻜vQ\E0u =Q3G\4UNcj f$~ y#ɏd 9 FaHwk%k$I1;~0d, I!q "ݏ cF (0BCsbݟkު+אl5ˌAT/>#%!HDU[$)"/fRG;! MKRN" :"x &!,;ߐW/h_1 o,u)F4 !:,_ZLb[[9GS ^ YQO k'жZޓ To! "Ό "s卐5I[* >#˫?tF RuXޗݴ2N%Տ~)e>L mLZnD9 я*Qy~ 7 26 g#B  YV 1nj G&Zn{#oÑ%+ ɠ "F^@e& -!z&g֌=3{䯚ھntL c#_m̧@E2)44ׇGy cK`. PDol 7lL?אܐ}\ p\ P>")Jd] !Hנ ̐# 1! @F) ]L?҉ Hɪ" ToR\[#w '\ 0"1W98 Cl ) `&q={̞Ri {I$[dQ%$Ymi@M DO?> r L?"u'Zi(![ S< V(pxqt o^)"/3BѦ"w A˒M $ݺr즩6F6l | ,2 ! m pɰ j<}'Ǔ  ::XFnBJ 2R 񠩿 T@d%ުB5ei-+hmОoޔ? TC=xj>{&B>,QBS/AYqM" U|,ܬ{"gSd;Gu:0fďX<|}Ѯߴ鼟Ydik$ }*F. ,Qt綔נ:r泏߰4g1aP2~̛͓` w ?zZr \2VxU;>:e lK  "ޕpl읰qڄ\֛ῠ]ɝ2~j u( 끞`k]XqcdIﵝNEU3 אޥc5A7+&9՞Mr{Q6EECYWMyqvE|Qqt~)-ޝ"<} +{v廀ߝwW ] DYJ,tC Άdr=#whAޟ+Lki利 cb`oe  np{^ƅW]faYON & 5?7s/b/q $PILySPECx_a|yl/ 7$:*_rp`[CWf]^QCVBOn@SD\v1!g@w2a?;'sL:I9* S6 +2-0/(OiT5  eS5`<-L Z,[\,89BRK):1=9ngiCc3Lo_igg4DדSr !Ro/jŏ8Ygѓsè ֖8FȯCĚЄ-20}:5!b4I51 <="k%'+'~!g7 !-5!0q,}01 )`RT_\XcRJWIZ]DXGD*],T^P`T@F;^CsN\0΍|U%V2VYRB+Z#@$MUE=V:|:C=B2h e}z誂ܰ˻SPVJzHVqKz[LLYBU/@@%J)W8UK1zI8DKN2 U,L z)g%5VKWU9LB5IDH@J@LUJKz@VJzT[O BK;i̵Idê冃 -\u_J @2:\F!^ B6:D BZQYW1@'w9zUd@{ΠV@FIMvVJzAVlKz{ULuBUzD@OJWUUK@z%@F(V)O0L@VyKİWUĬ.zAVJhyTOBDG!FVN۩i'N,x3CնY7['iϵ[JU20*WC!_ʷ"[0T.x\r^v .􆥴ОٶDı]RCAyIVUJzwIZ3ȅJBYT)IBċIOT3IKz\"5pzĖT.ODD: 2G;)V߰>t,J1ZRIP F^S@O#c_ߴᚶՇը<Ш^t4/'(# ݹˠMJܠZ]VjAAKGBHHN#W`FxkMTJFx7XN4OWIcMGtZ̏X.FwD[FwA`@OqYM*LG1[XGwEI3Dmw\ۑǦ˧Ø)MH+jTru޴ͺ  >,\rtI&DZ|י&6XBluGKEuBZ LZ;NY)DX,[CPtF_JOYtCD[DV[OOXDCYZ[&M@J4uB*DEu8KXcEA_(ؒ(͸Ƞк˴Ͽò/ߖ̣Ê/Ǻִף׶匶ߡ /!YDQΦ)Apg-L3soC[D[OXDYZBB/O>T4DX?[D2tEdu**N8[OXDYZBz/OXGDsӖXW2շWv\=̶:0Ԍݡ<+?lJqߐխ9ZE Zz NE9BaM_/XD(tC4Z&tF%Jͯr`D tCNt'FBM`GxdxSIR/0夼&Rrϱ o y T/w [H1߽3 8@JDD1[W[NJXEY[BL GJNύl\BqK[\M{I8C~^\SBs!@_BsEEKD]I&HC_[AW2 X}lKSȏŵ辘 Q)IZwgզᡧ μ%ɐeƦ!Z3y@_AqoCJCA/ogY'Y\W2@#UU_B@Wnj@UC* ҥ"ΰo0U_B@^o\C^nnY8XHH! ?fmuv~fpjnehcSeŐЈyDSڤ۠0G=^B@YW\QƌoйǩѽUҎ3ު@j޴ؓQU_BIɊW@UU_[%BO<亣@?IYQj}̙}l-`uisŴΓ֘Ўq ݣ,5B{6>T#^7Y^A ^pnUjB^ln @pXWECB\\ ^X}yV7@FP$UY^aB)Az^nC,AC!ZܷҼ`H&龏ݡ<ߣ 6ᄀY&ސ^XPBQMim HrY' Ú 7Ť. ]p#qXWż<_B@^o\C^oY%2Ӹ7о^oen)YXHI aJƿٖ2͡.WɢRufsL죅.ےYЏgӽ,>dW%;8J@ ^AA[Z@mV_S^VmIZB']B VA]{AC@ZT_RV\܍ZC]ikƓVIG]&kC]TDhUQg[F E4ۭ4  n ԥ⚧Ö 0<0\jHjgˠ렺0"‹Qꖀ|;GҚWoSYsDǏF^XiKZĞE$Xi0__-Z!$YD)RX FUSEVXߠDBF_LQZvWSZ_EFYjR@$T!vl0ǚclp@ЦCݡCįg˭[ͧb͸NƗO)%XR֡YBHPԒ ZBZMEoFXR%SE:YD5F_i ZW Si_FX00F̒FXiZ8<:Yʧ͹iY(] 5U@Ӧr¸FPP4Q2* ȭXFZܡ_ڦxҭ{YH̘VxEDYjSFEͿD6>FX=ؒXi(Ԋ֐S:E΍_:FXYiړSLEXaiF\ PDњ#w4Иwfh@EɤLOoAGIW6ZJ:g'۹Í^::44]EX`FXi=7 cW2OU9c `#w5| cUNI`[wK]H~dUR1=ޑ'qv֝}uw`guca``٘aߛyfO Z"퐜дh7JSXILR[W]^SRLU<`1],|:b9LU(cW+]iMNKތ^SILUcW]U IP?pj ́ڕ̢-ٷ0E<`.D23,_0h,|. w,01(- $(1S5C5%n-3g2/_j-M6چ؝V-)a6H0{>D3l6 4">/| wcӜ2| "/(1&1$2.31(- $(1/1X1$p28>R. 2),D+V3A#Њӄ x L!T'q4)Peo [.%-o!Y705njԖv#x0+Z&. R'>0ʱ7I< ?3ѻ /<#?9>%y1].J7~ߘ!иʀ)ڧsV? 73<yaP⭓`R?ԍ>#"/S0m2_+}<.W#'&+2,'2'1,02+u$.\"'5,+ 3f-v&0y-}2-&k&`YȖA֚Լӏߞ %ʏZQgDیcЈɖ޷ܻʺ֊F֘ʇ : 66,!)'w#)\/69(#5(6*s4i)D_.O.$ 7""(9579)*+eѽƖ_rǓ0Ě?ŵޑ۪ґ޺ِ ҩت ۚ ٲ+ޏAǴ4,& 57)+&).7/+&Xʱ7 ) "4?)?7. 7$&"F(564&4~y к j٤DzޑҳҨ/ޏ޴ǔҞRk;n@$n&)SƮ.< "4) .7)T)l7_o(!{ M/Ҷ0Y޳PtpǤ ֓9xG_Ѫ?2%476).t)"(_X800f#=/ȃǎ˄ԍާǵ_:S5$&7\./+-4)".?. 7"3`>ޖ0֠7%"4')5\w)# ;+pLdh5U3Iswām豖ƞрצ%ټČnY씞!)! /;9z,,T&;49'%(' 9.9`/s9D%n8^: ##&;+/#H:p#F;ݾ ݮUZÎ캓'^M҄%܆_AEo="~o!H,G#DE$X=R*|=Q(C>Zp0$n=,#~=%(u>*#a??=v$* ,)"_%'kr3ܾF•IհrӅyݡ|ivskbdzvc[~מxݥt‚B_ӰY/9;(?">=% q!9,{"c?;59#w},=(}"a$?*R7b,-#$<ڑ*< A|g|q`}`exՐjۛ~]׽#:i'>"%/2r>."I?!=e:pOr,90#`b)>#?;7+T*ӔL0sŒz9ӅiШ{wd&l{ܟ_ܹy)%b[<uǵ߽{30()">="'eFۄvbm`UȲzjmtvxK™Y˵ 1y<#<(?; خ!,'gˇP?:18!-(#$; !Ӽ߇Iӑĵߩ /7/!7)^ 7'/M77>l%(`U҂~Va?ŜǏwm .Nqɻ:ܐRG5"D0K\~恔"r 0x9侓5DzĹ޿%hފǔK ɝC>&oJ8CȚL8 F8e P!ִc'z֭݀Ŋ_׻?;E* ZeBLrqg47;`^)526>=i?b~Ѕ f6ɑc2}ׄ;8+&/-W ř3 σŁĘڒ&u4:)IgXɌZ1QбƔ>u>|?-:&E8o:#&+/l5"#;%;.8Q"><%+ OL# =$)<=–1DސÚ20ƏaƝɜ˞8xcޏ̌[OŢܖQ2ߚd 821 =${;O%30&;'%v?(1%:739?D',92$9IE(1&?,*"ԖwȌʚխȏϏϠ֡ØfJm~ϼִOʠǛԐ#C((D6֠*(1?Ï49=7Ǡ`TJ'~QE+7GI(6(=+#6Y+'-5ʬtSȷ֥L$VD]NVL~~A3'o7!4: +6ROR?(=+7*(NӧLS6((1?''r ԶrȂ`DN PQN~/ûյMiIYÞ(6P^A=VP6B9QM1I I46b-օb|xCq]~J~A<Euϔ֓Sn+MI4SONԿIK*o_ENMY(?(2A׀PWYARVLQUh^֪Ì =`E/J7[;n"4 XF]9֬N#(l4Ԛ?2RBGbc՝˃̢̫= ZKNT̅=.[5(*36;?id2R+Y5Y+'>7(5)+2<7:>42+5w>T- ЖӇMĤғÔǏ͐Ь,!YFuRjҀώ͢E-s :v.8E-|1j,Q.27U02_?M;RM7M;9<6 !,,!_0.K757Y&;3Қv+DY#_UOS,05_5>c9K>]4R ]"[іh.1C,:.@7 4 (13 <3 L?"T#7!.$15;^<7S.0?.l̐ W D#K- R"= j_!0WӉJ,Q2?y; S7&.@07<)#.?,[. !3J#I1 ,A.(7p*2s>m#7ad5"X?d; 9s #\6ΠsȝY-8-`0 8( >8?>7'W"=8_7#9r-I-00K=."6cR)Wj9=2DB.эɔ恚81/.t x.=:?60A%C$ V 1.Z+0E"@ 8e `pFOJps<=?," \ȑ9mö04.302.wUDA!  9 ?07.9.!4 .06UZPfaЙ.8; s>y OF(>L4#w ' .;OYUO~xԠُ#Y?įL=`   ݗ " ȖZ̺*fV p ;\@⼁ωw .*5$ďSLD{čnꓩi0:@ : ٿb H@^"96 -9Y <<\HǏsub ܚ}9] 8գ o6fC\ ,64/% RD{xcihɏmocdɥnyL`~i~lrpJrd 6 6 ך޵3폿nREara{ofSmIm@a,6Ǐ4  ۍ9آ6 6+'!SRkhvvhyzܰL󓍒M {  6$ 'ֵ96'<&@q$Ɇdl|pɝR澂xMzsy*+6',5瑞VxCr{̮bBhq|Բ|~BuCDT]15Q 4 /+ 4Zz{14%7܃6ӟ 29`5(U0_^07ȃ(י̞ye 9 K0HPλ6%760T[gd2A0hK~+

0e蚯r30|!ΨS`;0=682m-#?ps;"0&\1=yv5n2ʃso= /eELކn0 Ge J9] liVbu`x AhU1)< s;ohq-q0$;EROy?*X=p\eu_l:~wluy_} g5;c ~o^ b5 ~陵iiJ D]GFh?hrt-"e Ќpښ Y?ܞ&SI]g{{уﯚѵq$..cHs%D6M?uHtӹ G)YXmu_v#6+S+l*wxx _R}LաE吇I*+*P}kb{i[|o{Uv^+ckY*ձ䅿N@FNSյ˚I{jofaT^cYb][mcUwh^u*Tme IIM7YoSUޑ!LzFBnN+_iGL~_X_b^ YK$V\A㾩I >UYvmOWzZYsmp{+5f_(㰥I\Wf0[1 +Ap2 \rC_YZXPLt/\&BS _1Y%諸Ցm.O04+tUBd_\I%u&.oz@g!|.HYTW'-YZoU%՚072U&))*syHBE( 7))ۏ}Ȗ 1/8)nIxb]ث " , ߠ 5 d~&o XT` 5& u{$tH|؍h. =-WQ!ѐ% Ӡ   $?՗;$?v7T=C\zG*G3X0Z%(pt6 Vh  $ߵ H? 9[9#]? R]K Z^#O$(O' 5 3 &?  9"T%nm ^[AK=E T 6 J?L:>z 9  K KQcS [I/+ Kڏ9vMUE Q>}c) ;$wtWQ= )I: N7</>Đ=K7 /T\; @<:%+ N%e#rX_}yl۶ER $o#jCH#:"2#  Vzofd堋ݏݍ %aq nm!lD SQ!?' . !߇&*L_JIga0-1$,ngp|WLC\C]BYC\I_UeXP+/"m #7("S,4* E1I#6 =9 >5= I  E ) > D290WS8&^ 1!5as,@y&RinCbݍR=y2\Ce"P:Wi]YO,-56z;3<>&;r%81 <#c!G9(",)p#7":'"P4/(4*%52!2&ӖINsݪ-ktʬ'9l֣F,,㳨Y쥚|Άɴ<˹-?RCWAHVUMBvID`@JnLUIKzH@VCKzJU/zoIV|Kz}LLCUAvCKTIS+Y#-ºz䱲|踜톊 'mg2+ףܚ㷄㰏ȾਡCbiТ-\B H{LTB[@rD_ܐwWUZLB\ID^_YID KezLّ{ JB.qEOٶ©`7{w+z&M!V9@"I(Di;G+%^[DT6VNɝ7Cz@LUVKU(@V#KW U L$9@V"WBU@_@JfWUAzU@sVJVgVXMbt Jk٤ꪔߦse 礩١ǩ̶[Rh[օNKA)TxGAJV֏UeKzhI͋IK'UXLC_ َ&۔CUAmCKTRU7یeiұ̩uХ"dm 䆥Ѯk܍Kƒd#4D,sH{eUX@VY =LBUD @J WU1K z*IV9Kz-LL BU K=zL;xy;,phc`sjgRtzX ć}e Кս *ӞV}O7M,ATkCAJVUJzphVܑJRWU`Lð3@`_yULiB*ܩYյ1LTCA8TCdPZ d2Ǯyov:u(Pϰ:{=U>FaE6G-C)+U5גY4Zs I0D@;zL!!Bz-V#L-BD,RKzAWޚGdD@KcOTH}ZL3daۮ՞לgQdԆu`q`Ӽq ӂ h;1&6x^$B LLUTKϰDK@JjW4BqڼNGJB`egBIE@K}OTHQ|IQS\ј Re|'D1& @1P]pV_MDyμЫn\ߑ6m@B)C{LTK0Tim<"đڴctz٧Lz罇@IxIkVZ~ Է倍>Y\P_4[h!(QybfՈtp EmSOşAK_у,żͣKUM\/BJ~' W@aI;4ׁ B+w^٠༇ɩg樽qHX/ CC{xO(iZ@V^t!ʣ;@<8ŝ$-ؗgC#`JWT{nVG1KWPg~ګʷigة7 cih δ} %OU)ُ+Ia)M` "zܕվ埂渂EL}uV,WToH{JrPWYV$6u齯̼з՝h|C(c԰ǨE|CY2T/S FI GG"Ve੅_FQn@VKTR(1wbzrԍςy1|Ղyzehv՘uݨjuwM%N?ݞzDI5}]А.^ kWXרI=JyR#2d19srHV(H_EdnyX'S8o`gdžPB0%aE =+0KOb6cE`/0߫1NaWF`1 ݅5bʐd ?i/kz0bz1ɵbv ,[bABCK0Uķpü#ƪƔYLCIEC&L_<,^ӽ׶"Ωs jI(cte;bᩗn+EJEw~5Uw&vXSYٯLE2%R/S w]NWW=0؇ȉlB\_LS.&^ >E0 NQnv@ /AH KFn2T lqUy0ͱAnbӎBTlCd|gSѬN#3u=9+e9 YA3^%5Qg4KiY04ss5{,#&CB=uXe|^[=ATU=Fn1s_c퐍.LECSLQ]9ӲYcr&,S:O-Oޜ5b%^:VL̸͏2/0CVucKO"CeVA4N8 % eƷ'% X<—^LuUUE~CKTAT%rb,{@^,isz9'Y=G;?N&T\kRkMRiUQ?ZW^|Ѱos'C+CJTVoIyK(FIxEATXOXkL[F:[Y@!uFFKOLtsB[ E\\N_xB^7\DyK^:ҽ9|3(/4Z(5,7.!8+[%7֍ %"(p57q)x+֊ޓâ] 䀤âx٘?q˅ؐ>ˀІ , P4 )7. 7&"(ȉ׎ ؇4(57. 0W#$$腺sޏҴe_rٰ菹Rl֖\t ])‡׿+4).덾*-x njȔ󎆠r ;'{-^(.-7) i;*Ɖ7턩R+(Ќ׀.= 7ך'@+?=r!{ge¼ԙ䩒挲)ґdFSS/5)5Ψ) &"1.U?l ێ)ꅱ G'6Y\9|'㘇엓ٌir>BiO6378(P+&K1\˜685/ !ș"Ĥ4H)5i7@!\!<.֕]]ّpnoxNa,`v[i _O'ےFB1ώ 5U5U']57^'7"+E? #4p>P0p' 5H) mR&n/!",}ňǍNܷW&ҿŚaļߑ!lӑ^܋ۘ6ېwZ܇Ӡյ۠Lڞ, ;",;*y)F#>-<" ?"o|$E$/*4=(("?=g w6"$/ '>)>+*=>C{0ّ{ ʑoMƦjޠ7bDɠȬ T:kLޫ’ܠ9ܓLͺɟ ߖbD>= 5#33b6ٿ@S"7!ܞ \"W>3b?q&y3U.(0'@A^s 3) oy0w !?đU%͒"r.b >o ԦO g#)336:۹f!1C.3@9 "]@MBL:YsBe#Q^!Bd)f4"r67.<: 4#>:"#sn\fY(07Q^/ #@b˜#6<7(< K# WL3i.YY5E#386)=!;"*1{n¬ZS"W1/_3Y:pWis1ƒn NQ6=!l#=W ?= = :ݏ:4#6u1<5&#G;=ğ8JNϊ8ś$Q T#GR^ڳ9\زҠ,!%<2"9s70@9<3&;? 0 %|8 N&? 1&73N8/'n^=.z>φZ͡rhɁˠLC%7s*1(1549= 1-(439=<71#(6U=^Z֡ǼÌɝԄȐegbAx´Tӝ8;9;61(?(=+7$l?4*9=*71+;Aաȱ֭ȠÜđK';82wg1(F6(S=k71('695=7h x1'>%'J1ֹ֢úȬèՆ:֏NNXɌ9>( /N+6*T=1=$N r9hb֑ԫdžk⛂_I&ΤG(0\?4<9=71(6=+K14O%*I+¨}`_ 6̀eȐI k79=Ag%(1?7+6_y)A1 MƤǚ_ܕV| 2c_~ 0(폟HT('b(ŏeƠօëսȼԼ.ֻǡ̹ԣōǝKqƠ)=+66t݇f6U6=5ϓ1j1f t mԏl/ cػżsG75\dn˒<<Z6;4$&AwԹ[p˒$6w8$k껜(=2ե0Ȑ!<7__Lɠ}y֟˗˫Փ~w_)4s6*)4S46;43*iP(R4)>+2 7:%>NК͘$͐=5WĠ[{cj̠˜ҵ̶(ғ#ǟSіE1:.344ߟ1<3kj7R._9c.R;\P).K7-9E2,?];$1~6f4U* R0Sa]ZU_Uљ(PcE!fѕ! :Q-\e"]l-U1U,_.77\B;1-C0a.7:ZǍ1ӖQ;H:͒U"r\--r 5&lQ=' :.o;;N1 ,C.% ?K;+sZOZV]0)F7>ݾ<2? 3*8B:H5q%Y,]gC]+X b^\, _QƠ2 7~.70@9WۣS@N VۣK0 L.7h9.;< L  a@]Uo"pnICgȇ8d7'.E0,RO[)\W+8>--JT7-.z08fȍ[ҲƢгb ݿ/o4 )GѓJ߿WِSD7A9q h [͚#ˏa86;r#X_Ӿbk ]) %ϡ.\Y;8m7.3/EwÀw,ǜKځW;3p9!a%)lJRqebkҖ? .1S, .Q%:v(K?>$ |EY35mjBiF9.?3NIQ)\~PN-CU\nW@@Bd r\  <'m'KO2 {4y#n$I25N<A^k@AOIIhOA$E * 1/ qN@>fF TY8I1<u3v/ȁ j)}I/Y!0.,c <* .=N^֫bۮD+6, D}P]nE]OCr) W짚XC) {+@cY^YB@lW.%Ž#S_]@l @nz5o w\ oyaG6ߣC_ BDUoEمW}OX"EX֭o!]CO'ď;e3 ph~~;c@uG> 0TN\CSPE[SxOPYAS <K* 8RPYFkAjD;ORVPÎ|G_>I:[͜u0G ;QcUuo|yyR\0NQ>O b)+39%m(\)}w!NQg^+H,1N2,MAYԵ862\TTW\"Y\I="?ur]o%ʌ)%&,+%!}T(omQw^icRe t;U\k? } uQPP_įK9s_iţ3*\Kipoũ?  5 d95sk Ft<EP  8 b8RyS@ n @Rța?]>EFjiuqmSx操_i䖣 O-Z 6666ų 6 <6v8P8GSHe`d|l|ziy gikd2xdVjODZ*Xq<  6 6-ƛl >*6f sG6 64 K}ŗrup̒aӝ!j{FbΒMpj8ʏA 86'ǕBЈ#ͭvƷb6 #a5>>DuӂIMxg4g;`da" i)%k'tPgSkLɤQՈL6=ʐWFWϘ HD7DAh_gY}?itԎaڎc旄fC!(GAn@YٺкԋÙծQIy\ˊΝcDڢ6|)ź~vp`ũ씟uȖ2b6$jwzС؁nÁR WWl2!ő6,U o_fvb=fn T&y˻Ti34q^^9``jS`qRެҔYwe=< ijēf B^klsI7-h!v?fu%alޣQY#+}_Ģg=ȅxڷ\ ˏ R&ʍr^kO哉$8fPSMYa䏇̦ :U^B`pA?b ~xsT16 +  A c}H1^)A YY 1#romK Y"5*#?/ $8.+ #23ϯ ė  Ϗ Ϗk30U?;0N= $;01#,6076&*0'9,?{/?gl#WrlquhԚ?)72 20[0 N1fsx7 ̛J*e5e( mf l. l0^I 150M';8 %Ue* Y6^7Jg3 j6md Xh1Ms8_+M48/U<-  •3JxĒ #n_ہ&}ZL+}’:t[|Ax OO=TϒL.P A^a_4߾3rE~t`:m6z+hp5JQ+DpktzjmLf.h0+ Y\2MB^}Djddz^9qa:"fI*  *r @7m mxW4~9"zNXt$4w#/" ai% OOၷ_ ܳ , ꌹBÚ ̪9%AoSv]θ1quxG%"B 8c3 6 ΄ˠ ՅnǚDv@cǛwVB*L61<rbuK)[$7) )l|J(@0#   挝ح8& NCPbn阨萜) (_ُD}hlٍ6(RLKQNY%`SHRf df`to*ugwrT_gw[@S59  $$ጰ9G`/ZߺeLZRɹ̶WYncL=AK k>Pf}p|Xg.%~,0HZ1 N!]-$' WY'%fIeelq|wZR~nԌW9eF" =w<(ŀ"Kn(olҒ"D9n DIM%. !Xr]%ʻxp(V;o7>s½$1t:OHrmL^G& "o?#X2Y\eעʰT^s9veOHw5N}$e@6E ƒ!$ 2^u1 XdfnH1Ĺڲ2nЎehqv,ڂk(f K e{Tagd琲ݘfYۀA ٚ %a{=G!C*!LWWs܄ϑ $O@M~f솠ڍ %&Y_Whb_:PNJGcߖ὚^u   #18 ase~Y_XB][^Wl@EPJ_[VC>1$V[ _ ;.@6e,( ^+I N4382*&LW/:R 0T/^:@'D0 9]m9! ,_I 22(>orAH+~1}peu\pٖ"~iw ÏNNM]${ /W 9 XbB阑̂ T+\ V0mko+?)!d+:Zµh*"6+gm%4f˻7%0Z*J[K' = M\P>]@o=6 P ESAv7#DWt,n]=HZvD!ƼeU|h^f$6 oe@zҍYkV^Jrٺ 얩UUCRO=t# B>N?N'z>Čꌢ,=3CDEOa)C`Mw_nB~jX5D{ߠ@c~Cn{v򑭿aԤ~jA|t^~y/+O薡FPDWT2H~;3\[1=]s7x#N0t)͙<@X.uvOBYvάϑU{eW@n^%s֘g"|eYN|\"tzuVpFXpr/h͂-ԷMQDKwpH":䊳܎ >$x?B_Ho<:ܯ~5rZEVT_!zQ'y-nHP|UdAuVzLj;ӯt|OQ/CDȖZթl (SjXiDA#zr(o2OM-M(5U/~z}\C/GS=L\EA̙G'_VÐG˭(Z!wA?o&Zk}v&v+ZvCG]q5ݖ,u}*TM>Y[oLΰig:FI]LC-~upem6MM@dOMr3jDMT~pԟS]LQ Dt%p;MoDYu/JQז*5X0AB_Tv<׾V7d6JWF[O[lqݖ5~[Fz]S/ֻǵ?Run^ߘ|[`d,O/@IlGQ9[܏-ZC`n@$J뙚85g#G|Uj_cU"͞<5L[K^_㌧:営UcMY[HqfIڲ뽧ŒRIOf,M=ͦá*eCLVX[WϳLKr#B@\w1Я?3uYST2Djۚ.̝$p GHW7,ؔ۽gWJBKC!Ab7JdﴚʐȄWC*I+ &3 Ųɿ"%r>7MܑyD ACݑG[6_?W]TT\TCcO2!+֍YAiHmCgBfZ ۨU]U]ΏWf]Ey_X|y.!C[BHviOL隽r*HZC2CiX_@TiP)e #vB\A1X3EHNJ2[r ;yTK\qBkS¿żӨKmB^wZ{QG=dU!ZAq|CR H*Ϲ__WEDox_bIi7uJ>Ed]S[9UE6ܿuŻhRP_WgsEDQX|K#욺-ż|CJXIqEiGY.i匶?KGpTUJxVr]0,:󑾔^h@YIh%Q>U20*\ITMb__ Ǻ9Ӱ׿,̖BY_]e]L󿣏Ĩn^D:VpZo^rHPLBB떠꺒9Cci\UAc\yY2qV 'LR j[JDHࡴЧ´-@bXQH[PK\JIXaNK=JUPV_.弪ǞSE\BDSk\K@`Zx[B2MTH]C7ǡvëuEVBTnGV&}̓wj?JPXLN[h)œ!'ƅW[]O@DTwgޥ|[ٮN}XVQAMyS䶮?H rD J\PM7\MEp߮ إ?YFX9@}/\ڴZO"1ADWdQ"35Cɭ5ޜ2@J=TDiqS]ٓm(3j^I?InYmaCQ՚ǝz,:1CבS+JGZT3o䯿]HǠJNYJ&LHX̪QOp[EW dTB8 ?Ԛԡcc f@`YI#T$l0٢5\m/lPIY[ 㑬ZƑC03Zva}Z X.ĐwǠVGĺVeMCWSW""CZS3RRk͖NZRYKTFי $I[ a8Zz)Sd…یXʖl[@VSlE(]*4T1lUZ~PaDХ꠴ETѧ/[]nV W[A$\V볧O2ARW^eG\JM䟿珲H%oU,Q{_MMU쳐!x搚Ab^H^[ AZMtO[ːiPK\#AFѢ",B@!tSTSED7+▹4Ja2ԚUj[WE$cN̅=b]&DZR7T9˖ϖҌwR0R0SM0+LM{]^ۻyG}(Q,=\|җG즄㛓h?Rgg1_c$FݚJOPu~b8IjU.^-*VR1"*H[\aQf*B%+$ʻ QhS _V^h]䙩ΩD4D_'WR] 'Z1zϷ#Fc+ZMO#Sz޺$w i *T}X1B] RԱ4RsjXfT0&I@ʑt͖ΘUTm#cr+0&U,nɖ9KêY&^$+UVN8̟΄5[d7Z RU0?W*确:*p!L#:X+:@۞&Ԩa#4Z6_Xs4- 1L繭~ +O(M-O|56-<ٱ</(867PsR]g{ ҅?.i)a ]쿥>ռ/OX7}R$*!K}rčbz+!%V&%U ǜ4ȔϠTY/S(8%z-vQ%NSOM $5&/ZvՎ sTb#*!07%dًRc{*8!2pӱ~kpA_"(+#55+)vak0ʫL(-'$2-85=裓ןxݜJż -;ɚ"')i+I9=cKՔp8-4)&F"5mh߬>8!<4!=-ޘ֦s/8%5*L8]Źo8T*#e;,)$fG9G״0 !#880 :܂!X(%;H>Q* ʚڲQ 4<+9%?'5#ܻ=?.* ?R/h?#4\Q~Q4>d0(>)=9ʊ1#Q6!' : >D9yxHk) 8>6/ =؍Ӝ9>: A#:eMZŶ/!5 #0'q#9]9N6MO=޻ޑ ȓ+s9>!" $Ě6NoƜ5U'#& /i_H!x$J#( <7O42h8l'v&0" sʈuKʋ5>+$,u% &* ;ݨwgӖԎ)1% '7 q}˜L& =+P+}!j6,ݙi/=-5%".)y%4 U[C6;/ q*)4^g6 ȩ8!n6S:+0}nVT?B R!8.. W5 ؄)LW~ݹ7+^98?: ƯŹѶ0<-%. ?!"+~o|2uH9T,+& 4d\ݪáFӱ/d>(/8>17eݜ17)`=.#[)`t,~%.{ q#<5 4 ƠBۆ֕Y(C8<#9-u9£ٜIƨ "@=>>]>YƵӮ#"=6#l"?%:g\ʥ>_61`?>[=U= e} ɷ )$s%o)8 b w"H-ͦ ԗš͆?:C1><Ks՘ڨЪ!'## !'Y=:Ŏd%\4 >:u:/[&5 B?"$8'Q}'l/ǐix<|, ёĚ ݞ5ϓ+k'=Kܖ&%ؚ=S9 %< $ٵɺcq Ӗ A ?-28dؑϼΈNw'=+$3<àן_q!{1-#>; 5xMα3+U6j!&g8k  [˱A+Ό?=q*E%7::Dݚúo="?!36&& ǘCjz9{*6w)%:Ӡ*,aPʕ͂+17 ?)'4TԑYǦ0(;8(:ίڊi@ K%;'֖4_ 00D~m9:t+)?>Fj؁Vv &34+'54׏Qs)02(7,=YΚT}ڡ N0*71=20/WMb'w/0;j0l8P ՘Bw8#?)!7UÊ1>43.;!&A=^3:{ N.K̠Ƒ[7 9Ǐ0>2^$'4l9O=7H4Fm156g-Rz?P5=Ŭ /9qD>g/ #¬~9>~ /U z, 0F=*F c3"œǠ/Tvˈ,{\daݏ-K-ȏ; :},:ͮĊp +j`/^1ljzi@.7~MX~d: %,! 1> R0 T10.ږ R;Ԛ}ý.엑[t, , aǫMDhD!o:D0,-$C4iz\1?- ˖ (=w.>3K2{+ȏft /j2 =@9>7Y 25, =v1_džå*iH.  :ɏXƍWϲڷ9K~s>X4I]9ʞ,>K7 y׌c]ॖ5E;m3ESeԛжh쮑, > 58z7;-Հ1 .A>ăgrI} ,0=aaWQnF0?.Ö ? n|-xɋ6 >a' -5pΧS|8b : 59Tƒ062*g ϭ* 6 ;{뚖˜O  >:Ŷ:b:ր [ZmBٔ: d;l#{薏!h?  ;} 3Hl8a *< Gj.Jp\J# M7'/7// 2h|ip3e0b #,됌$ {/UNd+!Z`Ñ?81.i!8M=hn~OP)J2e,Ab,r|-.C4t蕌w.,Sukc+ K?U--ZUl0{ DAl3D,њuelU*S擌)xS,+{BC;X +^Qk!C8 7}[j.c?6 0D apqիke,Ek (XQqa)|iVРc 툏IrL=)~LnՖ]|N=U eތc} +ibi+9Hճ#镐'~Ug|zG0 *Cږ+)L;,,e@f  /T1뀚`ENI+Cq7m7wx_Լ%F.7洞D,''O #8PUGϘ+E쮐W7R`q4jdԜ2%lzg_ODgՖ`뼚]L8ԘV,%8W{Z7\_~'R^J)Kd20$]M $,q ؕLx Ñw ;vGZ i[  |o8Z O & P`" ,s| ُ %7 ٕ핏Z#Xk T s%O  =$O@ጐX*ޠ4  G&#D$ Eњ?w# d"{Rv 3Tr"J#+ & ͘"~~D))MhzɍƓ 4!cttIoKt쫞 !qO䓌i\lUߪj!yۑHd/醘!kg}y eﴠBPz m U PV T ϖ߽_P Z0Eg2בؘ(8[ <Fg8ˆז))T3H[LB0?1(/njƛV ;1"3   o  {5呍 <</t .><9(}Ï?1,&(9nߊx:\dGYJc  WUF@IF| kD$CuQlyR߹ i~fthdysh^嬞ß_/4-1$senO@D@ID\W@_IABWT[Fϱ>(#ʞu ɞ=;9.?V9% 2I1L61,:>0(S3I ) 3 g> U9 '.[B;&K<?9pp5|3Cse@Oޏx <U(]mRw7U2 $5 (0 6 1g͘WnȐNhΠk϶Ġjև [5 < $o=%,;(4/+':6)p0*0**󏫩9ڞ@Գ{G/ /ϭn ^vDSFoBNcJ/p.F^A^J]]^W\@(DVBױ[hYʡ됍rBدH:+!<@aA-CoPGhYI_KJ^@z]_@p%BQ:CNmC(W߼7wPHDIĭY/A9CoHCK@Go^FI_OJ_@N]_)@PnF. \<絞7E߮C>ʦoƵ7 \\AB^Yq\OUqYp_^v_"U \AB]#"ܠi4y῝萏鼻d Ζ5uaaERݤ륟f<߮츂8rXN]o[ACUAToA^?@A[dn_]QQGp+s߾R̾i~;38BS:a?mDYaS ART!\O@hC3\m^Ab]XmZ%X1R ]KBٕp/8q'!&TpU}WkC[+D\`DWIG\LFBZzT _R6V_6$?u(5/,ޥ<袏 Ưԩx:B]k _U]k/ZD1TDVG\\GC]l_ "ȑΤXfuO;W\V%h?OB|X[kD]SnEUP-[GSD[gk|Z@=Xl_Qؾ򢞨|]:omV+!UF1g_WQi6\E[EP'FTXWGF]tPqXxYQܥߘ"zW>w @:Zg ]^RRCGPSZD.F XikZW[h]VC~AiբMx/^^TT+]ZgQkFY2iREYiGs^VP)GW]\. k3GáGѣި%1^NG_F]eDWNEHP^gCE,DV$E%HeQQ ?N왍TB5O 7gH2EU\#]0WJtHbWfgCUV2Wh PG^GSQ/\aιɪ䶤mO2 9ħ`+ m2kK^^HX2\\VKpIWgbVKT#gS^\I2ح^yv#%أ1wത̯$Z?]>]EdhPJW=J\HIDTKJP]%U;Z]S_qЫ(.МGve?ﶖ|(˲ݧIRU_~L\^VI@J3Ue_W[TeS K^LS6\׫֥j$_z;뭐۱qѡTΆ ^U/UJ1Re!YI&ReQLxRF[rKl]^TbNIv;룯4?Ŧ!%6u"]/L0YHSILRcWm\^s2FMR^ZW>]T#ˠjǬ Dѱ}'tjW?њgKWa\U:T[L_XYRNMRb5P{_oRaRNvX ̚O(ݞ^[I`7^g,y][SLWMSbXNSUa?MWnZJO8]R%T,*㝸ӚY eاMl[<Ob)LX-M(ZNkPFLN*WaR _[}aV6Md/IАӠ܌5B-ΖBw.X2$/20)v=,X F% R)1a.1Z2Q34,𠦠мFрԥB ΓF̷̖4ӚsC2U*n'2%$/.311,'2,YQ2+&2 +&/6N֚n9ҏ\ԃܴtٞ,/̏IҢ܌'̟4-#1`!2,|03*+."'.+s3 -%2!L= 1]˿ՎݠМcԠn+Is#ȗ˻Ҽ͓݃),K134,1.97j-6R*'-[$ 4?&1!,V6z4, JA݌Gժʖ,ɚ;ӱ6)AՐ ɾވ3%(4%C!+v-4-&{6-Z 3 ,$7욑7}$eFԏ#Рh*ߞjȼɏ،=fcɖ-Y\t!.4[4,I)R$w -5*5!D56*43~."DnԠGXר!捡`ЖޚȓZ%ݭŖ*ʓ+7(I/,B!5 v#*45(1`+%y&Nʖ|ʵʚWfБԢݑ9=ɯ٘␘4T8Z, ) & T(@/c7(#5(67,/S3m d˖m{(Ԛя;ߟrݞҭ3ʣƏt &(H/k8!Q8#c;)5a7.I+ & "G,F. ØǾ҇g֐ėǶߝРڇӺؠǡ菞}%O(/K/8&-(:7&$4&!./7a-4bKƏحڞ׌'RkǖmwDŽRĚ1ޑ ;!v9&8z,;"':9!;,C;w$T:H"ɓ.Ղ Ėń۝ٚ~+;܏fў}u+6$+&o) 9.9,:|%;>:s $*-ؘĆې9awҠHٹ۠n,v, 'h9:".:(/v%8!:$4&9';< %!b֞wֶ5ŏGߌՌlĖ,ѿbڕE'e+.X":%:.9%8;|"<,,'+F)'p ys3w5OrēLaZܬ:mߚzc M""Y+;:)9. # 9<4%'-%"$<,a;<њ7۾ ڑ1>,Y,썶,“*:O,#)#> <"^|!M?N#O8$a%*;(. "7"}[Khӌ:;n –®ޕ ۑ}F߰ՑS0 >("=)>X# ?=_$*~!,)s!% >$"j7(ګµMy(Ö)FݚkۏƴՅE)*#<7= )",P Mb'*>*>(o<{"J";!=jӞʑE; ޘLՃސ¸x֠н>۠?!*>!A7?-'-(>L.+g <>#!MΌA޾UMȷ& <{ '"|1b*zW&d P!Q :*&9( *5 "?зV!l5#h9đϺˑKބCޗ˟nHXȠ( y!C;> 3?4w">+_!><">x ^9;B5ԞUbnޏ{̤O4Täm45&,0.##;$,*&;N- UޏBvTߞ>ܙ^S'g+x{:Ok*@Θ9°_ZSMpHR&S433W?=<:譮@,ר༖|2ڃF6D2@kGZ IBHWD F;V @]2H; ZȤ狼ҙFn9AQHoD@C@bH=A G"L5͢!P9̲ܽܐW;\G_AqC]AqFGW\$[li#LqN+ڐEC&,XH^_\D@GpBNKpG__[x꿐M2r'U4Pw}V__1r@DbV6]PI]^蘹啳޿󸏖UU[tw_M\xr[\#T"[PW(M״aZ;ż+KD[ZUJ^LWBZ8\[y l#lţ ]`QgK]\BzAmBSJ@k@x+OƾrDήbuG_-@TC_BAYSUf\SRH+UX(H`归!//V]Bo_Km*]lA_gmXXV@+^ғ^ҒvbriΘ>MnPLoZ@]@VC]BDuZOƠi]MbᕏZqDM4G$NP)__G@}['oYM\Yu㏺>έ˫^.vѠVZ"A\IIFDUjE_KDQ@_q)UIsҭRYi%[HrWY F_j޻qT$YB@HiB:X)8䩞UJhWiYS[fl:\XC:ROCPAY6]g ]2ssϹaݹأrO#ZSXUQ[]Dn[8kPA/ ܼΡޭ:2YֻV構b%oD^ZPQDeSQeY3FGF'ZGiUɬi􃐩pަh@`9KJ\EC^T[RR~\PA/=$;S5öS< yHBdF^6J]gZQTIUW^*CʢV>۫dĬ9e+>^LL[f_BX"QOf^]IZ]KyK꣐awt̺|FWkH\_EYPgVYGJ_ )XR&a[PVxVChWQBGV_|G]ESVF?7.ՑKnC'8ɭ63\^#[YRW^HWZHVZḖ+ =<`\IF#TPhUVlT&h.SFL\}HI&躉ZëJٜӡIGUN[IFRQWWRYZ$W@bX Rl)&W,Ah`YOX^cD^GUQLPlZ3_ jח\جX)/jVPSYJX_RHNW`5[פxᚬϖ?ѡ(}ԑ.oc< 3~;Iؠ*0 R T$NS%_XQO>OU]ٚok奞ͯdرWmW^S)`wWTOHY}OB[QLSQL94 wˠsڑEEs[јS'АD̺/P&P!X/T 0SYX2Sʍ2z<͓栜8ϖ-ךh*)UC%M$ X.O2]RZ~]奫9̖զϚƮpIJzӑS.V!c+M=,M4'N,N4xQ۵'Ӏ7Ϸ S=R1Pa]Vc+{X-2[ީ&Uf̖ج7BΚWG%ϽՑƑ(90/70$3/421c)%Q3)Ѡͅ⏃ Ν.Dؘ-Z,-314/-2/()."Yο͏܌'Ȗ>MX!3S,U3`3_(iS-&"%*IHɽ~NА:h*p٠qyߧѠrLH(`!3,*3*`*uN:䂜ޏ%Eߞ7y#ɏTV5'5%66/7O.eVyZґqPaט܊Bא8NQ.&%*(!5/5$6j/$RMȓ3ӯ˖̀՚V--"2J t&+z1c5}-7.3'i.ʖc5!ɚ n3ˊБHΑc*4*64!7*64B-".<. &Ӡпʔ}vtUӏ݄“5$)[65 *(6*-,D.i۞5ʳʏԧیf[pɖb0:-0N(@667-\('&&*d*јŋ+FՐşJܠbۉ bРNN$-0l&tp8*/2+?[,vZQךŇ}ҏRߒlȥQ853&:$%&!3-OΚۼ hӑ׋ܑ3ӜNИ0L ):O+":5O!"2$$--* "2 hʌخnѕȓhܥ)ɖғ%t+4i)f.w!d f8#-+&ߏ5Q ֌(D ǖzӰ˚ 5!$&9-;!7,&O8"=lɐŞpѠ /٠VP(8*6  $9&,(;07T$ݏyaОÏG /. -(J.: :U"Y8)>u3qݽ֑ǘر֯˼Ҡ1#.44%;.c+6,P'Ζ$|ۚI:ޏ[ڐޞ*>7% ')%"7N*4 !ŚPߑ٫xӑ\טaC) 8'99H".1'( . &%%2773Ѳ|ڹxĽoqߚq];.e;//%8|;$U&*' }Ɩy*oT;I^58:<#,+&z-/L##0<$ P+0h;“:g5 o$#.*:!(/"B8>&ӏΌ d*ѰÚhݒȃ=<(+"':3 :+:>7ɠSߠ4E[ Dۍ69--O?{*+1$<7;n!<@4(Ə`1՞N 4D"G">+/>)=#,(Z! $0>#6۠/(m U>(RܚXr؏mּuԞoۢ(="=!/p _'>Y)>>+=<cƑ^ЕʑqobU8i!$t7!.x+ $@ #4+1֎ޓ^б64ܖ==:<#8$h6=t4(>>M# '^ڍʌ"ؾݖS֗ 7ޚH`p"?^,}7`89>?v>r7>=;/ ݦ̠T PCԇڧԍ=;)!G.4> #N??{?o?XďȞ-ݏy[\=\9!=7!!5"4?#} ;=3FˑS;ރÐ޶2ʆQ5"Z?!85#f408%/B cמmñÏćŎE0>f8n,H9,;':7! EӕfԘVՐRɕҁ۠׳T-N,a$CM.b0U'J7lɖ՜Y2!LB͞ffYhAZW$X$j9_C[_3A'L/I0_˹e,fI`7M]EAtCQn7HuBCwn$](XKBtK.f#Da=a/L]_r#\OArpPF_IF@kKCC@Z_䑶#BȩEe54q=v{㾖A c➍OnY\Cf^m\S!_ymXA4U@*VAG9nH|᫑{"EYn,ʡ|l8DS@\FUUd[YPD^9kSUGAi[4>P,\С8/8ͦدsOR@G@Zn_JS]mSZ]CUCPz9jե YR=Ր]7_\V[YPRP^3\A[nqSCYsϭ7k:/=Z\\UYCE\&jC_U]k`]PDS H$y쥑0ݩax!.",5CFqZGQ\_KWRV5Y[F\)hT|JCk9ɭ˹`(w 촠?̹L JTRN\DCX#kEZU[k\zE]ߪɶLW5mૌ㢑.2ᨘ#A2C]9EDS^SK[ URU[^CVm_8]oIxEĩf|eB^D-\[C]%QBWFG7[hY'V[ph\M, lG3OJ^ۢ($G[VGIH\+_YYPWx\I]d"JZMPn֦PͶ즜8r-DFFU!SHJP.\rYJFViTWViy)+ҡ>kޭH'Z|X6RuVB^"IjYfSfI'XeLEU(Wڦ1A.A7y]9 _vOE^UiV V]ThuSG^G~_|D-sɺ`w_XM zدE X0!Vf]{IVe$HSn_{KV^ YuL1A í.2J9"ĚSxPi UG\3H^K"TJ(KQd[%ȑ]ƶxVodAN~Πn)ITqew^JUfK1P-[H{\ RPc@O"Q𫝝xPײ06TXv^QVbZPL^L\OVNIUg#+ &/ymq:EhgPRKU{cG^OTcJT^NY%=\$>Гɷlp5vߧ@wjx,XP1e`WJZJX`HRHN*P[ˤiﮐsm٠%Z!RULzScXYOSd N:R/XOJ PJ]4̈́쯚)ןxA ܤ﮹YV'[PIdOhU``PPB^^`XSh?<ۘZıѐ ؠٮގѠ2ʏ+Z`LSaMTYM_1X;PNS0UqDT@ɪ"KϲNjMա?hP1Y[0Y23GRj2!MK)#b,]V$ndI:4.T6Ꮶ̬krcX0P_ZQ>MOoQ`R^3UPDT+][Og!۟8u׮ϖHrD-U0M(Ma-_/$a(N/QN'H[9Ѱԏؠч޴ؑРC^岯W %WO4 Z/ 20.~[-L/a2*Tõ%ߞ^NȄu8#܌k ͖4ؒ> O,L2VS#ZV2JQ3YE("ؐHׂ۠͝Ӡl 2Ū,ԍN~-X2!G').31/}i-1;.c)i ɋڞuބΏIxИ܌҈Ζn)a[7(/10*^0.6^0],Z2 ~ӠTԟ" oX:[ȓŢcQ70Q*/^1\-+y*%3$!- ܌ b͖ݱ̽ߋϚՌ&•?`) !-2*W2!2>+36Wڇ]ޤԠӏ_?ρדLaM²[=(35,I/7- **#)3H | Ǐ3Ӵ-،OɖɇMʚb|$8(.$I&;*5P-u6n&5 ,5Okр=#Ʌ.˓ٵfׂΖR;,c*+/V#5! +=775*+(fǖ8n-˚ʡ4ё\ݨɑ +7&*^7!5*E54$.A#+"h,/cܐLљޔǓzwǖ1ϽA`L&07&.;,- 5l" ) 46(܌ۭmʖjЌHʚFcǨБ-w~4 !5`&5-6S&78,/(?+$hmc#/ѹSɓCsۀΖ .7(:+/!!8a"|-:(5<7`"WkՌљŖ^ݝƚ׎ǡ[ܑɁ1n#U9n.K.`++(#&/m:+'lIƓ׃>fŖ! Ԛ['z+9%u!:p"q/(;7'C-%<)-tc< ӑoґޯ3ِ٘ɑȦ7 +C+-x!]:%!-w8+")$V5<--yۚػRߏ67ОЖb ďSp-'.;=/o;-9h&8S9#:&)5ѳ¤ؘ \ؐG-Ѡנ #'s,8'&9".;o()X'X<4%ޚ EڏV=ўwѹŏ,H$ %95+9M)I9m#8;#s%3ő ܘ~bܐ]o^ՠ/C9:o"EK)e89"<#+:,,P 7آٚoSڏz}֞ݧ1y.*'.'#=y,=%.^>$c?;$85äБBݘ°ݐ ÕÏӠrܮ׌?%<"T#)>z";i',>+5)s (Cܚ]^߬؏ۣFמ~!4<$*s!'1<)1<+?!$>>" })՜ʑ,ޘ:Nސ&ڮɠي5"$=W +> M\?%(;0"&ĖY>LޚܥP؏ u՞} ߻ܝ'& U1L#$?*?(<"s"<0ޛԙ>WȠ`Jݼ`͏5< ]*?'(>.+/?V<܉5U:>䞖@tޏLܚό>Zfߖʧߚl?9R"$."e0+' ]F0*(3KfY%E[Gv2و"a%ÒOc?j##'>*9{97?R4*>~zߖ#óGqÓŏJ ˉBΞr##< 96u6)3<,?N1(& :),4X( j?؍cc#}3b}9 6e^"#a$(TVOTO\XCGiiFHGШ櫞-"S^JditFRDlC{E]A>2 f AU%üI/JLFfDC0NA>EAX/֬{? iJjZ[BKXBMNWEcM(W/ӼReAfP+Df@\S_r\#L}VyοϺ{;3'/zX{MTrY^AH@Utga+D[\7qU\&Aon]ZNObw}w:nlFY)H/AKWCGuVvuݫ+M`u=UHB,@^[fq_MSze(ȯǢUFؠ.JIQBZ]Z;s7RVEuF'`'v`ZJ^D[?r\lE#_UW$,נڡ嬌ޓa<]XP\P ^vY^sH N$R󓸥½楘g`THE QAyWHX@=9|kZK&(*oBW_#F@jBEB{o_ irf6"hDY@jiF0EWE)J 3ZfH-ÿFHJFl_FA(]VUӍĩԦӷDc͍lZHQW3EYSMQ8\xAD(]иW;Nj^GkCiZ%k^T_}g\E喸qᵚաڬ/XVmjmZE6\FUJD8Vb۪ڬMگwTE\ifB^W;JKg̓ūRԩCԏ.H"HTw]^J@TUuE\ﻖK߭󹚂<]CS&n[UP\opUZV̩8>'CRrAWn\vBUs*ѹchn3CXROn4S4[^@B_K!ù~䫌hf[YjAhU AIZf] )ޑNx鬐{SE=[^X-QgV]HfZWq.#hgBʠN_SL]fYK_Xh_R SħѬ)Ot}7C3TaGH_h[W\j:afq̹à[YRX? PXRLHN?ѬRNƏWQ4IS\3YHDSapaw)zB:7-EyRipWzW^k4W^ߺRu g)\UEORjYGGQqq?&h>B'PjmT\ZDZJ(?FN=Vc9!@Z%FRWDM\V`]|88,i?Kmj˴ؿF 'Yl_SR_ N]@>h٨WBi0Xb[HNYb_ xЖ Lޡ_`^M_L/\OWA6FbڡcZWͬWL6VOIU]W6ZO[?Šby̍⍍QNXY.TI;LTpaTT65֮=OqۉMR`cW]Tb"P 0T1Ϛ@Jd֑vũˑSMTIN_MEW3C|[!jʹIG 9lW%`JQVZ]OhXU'\6 wN Ӛq' R%Vb2I.gr/Rt$]ܥIϳ>j>.Xd$f>(OIN-DTА覠ѣ猪D-f$I/be2_0Γ뮨͖3ƜКAmk*uS&K#$[^l-J !l}t׺jF,H1VUPD A^~Әв߱JӐC!Z"^.dT0S1XY5#ʚagۡ'݌zcSYPD2FP\WVX0C{ˏjیU1Yb0Z4L/{L2Sf=Ьʐԇ,M0VO&Rp#X+hQc6揨 ˯Mҭܓ)*[m-LJ2Pg=Q%6kVcYбݥJJ܍P"PT?W3QZ[6~] 2gґUޫّWޫ$>UV5X/7vP6vM/j_$L΂҆عvӭeJ#/ZT5[_T R4I ךP͒rԏRi~ѧwV5M+aK)_"(dp1ɖ$/ذȚ:ѲёЛ:X"a ,On+O N<ΚA٠zРϴq\e"=L++4)#O,Q'˖ΠI՚yڛ;zR6 r0X $+X0y4K,Sޠ~ѝΖ8߉ ӢQIG7h(.h%&&]-=3𘯲[t֐̖LѠfH'_*Q*3I*zu 2@)b cᾪMQ͑8sޏn x8&!>, 72G(-$]=-Ζ^RΚةۤ$F1*#*#z. 1H'Lېϋߠvٺߠ:0)8"1)9Ual ɖȶJ֚Ƌ6 `o e+#/2-$%NX#(َe-ё3&_;/!2&Q20/M HX$ޠqۨ)ԠܴTbK.G17'a`9+.:0 8xʖښȬ$ZWN,2Z,&'B6@9, uڌVʖ{b^KL{;*{()L -?ǘ56ɥې(!ԠLZo$-8+X#4(Rlӭʓ%ɖ±Ϫ-9+/. 6-y# ̎`Z%ՌԓE얯 8"4'4 9,j-ڑxӗÂטgĔ7ҐT=K.p.N+(#+%,9<{/ڏUa덒ݡsēR=7:(*j8+U(feYܞRpǏT#6*/;!; >E.n>ۑ1R֍ёRƛܘ,&> (`>6%"W"  p[hwpX/ӆŖ4,L0*?(/$ $ў0ďG!Ќ,g+>!F="?('?/53~ڋ҇Бߓ٘ ,<7%4/ ))!(?).N2٭ܵ"+J'>A9?"F $:?я8ўӞ&ˏ")"ve%:,;(ӚK»ƊّCHʑg7#:8),8%F>:$/dʥ٠]:i.<",<+ (&5=5$š \ُܟƞd7n$?R;#?"(N>ɖ9ǚ*ܑ:(+':e!956qޑ1נߓqޠtܳ5*9!? 65JƖ U!ޚ$/.v6':C5/4?b8!(3Όjǚ4o"#_'1/9!|{ސgNڵʠC#=# x7;t0k/3ؖ#ªgÚ8*Pď,ޣ77.?>< "p 9p 4–;][ ! 1(@$?#.$ &ÐʠMߡFһ_ ";#+N>2M7͌ߣh۞ۖq7<$?= w&`"62f/q߇cܘVԻIߐ>ޯȫ1"0N*>'#"{ n K/%ۑ! Vݓ@јɞז;+# t#! f S'=(-c ўߏ@MKΌǦ%s$)%#+ M!;'>:gƯɑjސØ %&>s=)a8/L08$"hZo՞+00_r&:)$)-Eݏo͌)-%a * /&##-|Lƒ̠3?P|"x% *!d> .?0ŷhÕݖkؚ=% I&a:D7)"5U7?'<܄%ʌZZٖӴ.9' 86C=B374Eޘ`3WتސJػUR7>14>9"! )\ک`,ܚܺ=96 ?7:5==$%MؖȌƕۖQԖҚ7="S9 #=2+ o"Yژ8Ն8]źȠRʅ=A+<&##! +(&$&ÐܓhΔߖ.n> ' b&P=)%/Vݡ&ߏ.8̌4E,'%+ '8 *&>3!'1 "6ߌx;Cϕ̑)d =93)":e G$;4q?57 ߠ=z*ݸp퍻D&2c"5]6YFo͑?,(Ƙpߋ*+=K'#<.49 32!!Q.g3*,3G3"?I?ܚKȼ؇Ñ^nϑ 6@#25 9 +)&/ƪχǠ1T T==)A:$?#!96C6"ƺŚڠƒe5x56!(]:<A89<7<ٖ͢Cمoٚ4Ȋر2Ǒ$<8N1=K(A;*(Y1,ΐqגLwSʠi?b1+;E{&d12,ΗLؖ$eĚƚטø\;}32(3|=i8%'Z7g8ŌC Ւϐ1?"(9'D=w$]7'MàyNYʠԐɏ=;+E6(>$>&;16ޖǍĚG֙Ïg;&'*<26%j*8?%ԖWbr֚?3;$;2?z,= *Ɛ<@? <+79l28(8#5%ӓƨ9זO֧ˢȚ^;+>20+C29;mf؏B_ČryԖ31I.8z.'a504 |\Y˸ԓyc͠:2$76lɘ]ҒяːD֬Π,786 5*5/>(-2ˍfhȔ”~dB>Y-@>R94),4^5'і$'ӚRo-P57=>83.9+k5ːoà`ͱe$2-5>c-4&'ZVę'Ӗ6=4297<.?:H7"֧c7'Ǒ˲vM*:(m1)"/j2<4:å$z|ǖr0'+>>0)'7/Κy ȏȞҺi+5 0>S2?3_.їҚϦuˑ%5X2/l8\5'gk˒͇5)˗!X?72V?-6:/;<ЖzV͚~̏*=(8'"1-.1_5| b-C+. b>:6P1"ϐїƠef0ջ6t/;.ld͚mkȏB7:-1>272[얖, =5Uі:3:>61A9 ̐1-0=:,1=V/ ; >Cd,61=3K 1@;{4 lk_7n'=k8H;6 C:^r0Ubu1γ(W M;;3L¥Kas ,0; ,<G횝$őcߐ7`1KA vu.BƏŀ1\:B w a8~_ŝrpn l8 <   {RA%~8瑄<#;  )' ;a :Joa6 8 v=uĥ=떷& "<<  6>&h"9 no <'(Í}ꓰSP떪= M= ;%% (>Vƿt- 11_*P P "qCŏƍUp쓺]8 # 5L8r(揝AZ "w7KH ** zn & 9)ɏpҍE| q^ ۖ.@6Vd i6  Q5 >v:暌CYnj 6z  , 4vyA0[|,5J` EIɗDu)tR G9?tD E(l J]6cˏGs G3 3#^% e5c`ZW^7g 5X7b3Q5l l64  Q6=t5 V 77scY!u4 64M"[p\i cf14c kʍ|O,WOt4QC3 {T&vF͜Vg X ?2Bk$s.j7n  T.ΏDm͍&u{td0b2]+ CgRr"/$0B ?IM0ON%a gjЏ0vލ=:  &i`*L'009w}AInn#I0 ;n GIY.~b/82fT7⚌43⏉R\kO1q" 88/F/<j)s):=E9v/Q;0 }t53љ/Bc)с$C\<K6v`| _ꠋjFC.Ij.Dwan.S 4+%2S4Q!c ~,iBG+fFewPi9]_,.ҍC\7,,XBqcԢ:=D5-|PvYޗB)Pe1gAN \`"Ձ z,^d+=5~K i &?+L,{{8 s0<@K&aiUO[G.Nd,Ne-  S吝.XViDw皸V鏉]qM yO&D⑖jc{-kkBI#ԯؚKە?FOn,.? Һ~cW-+JOd+|=Cx<蠪;:+.pO+HB/5A6+^+,4WhQ;1[ +6 !_^+/Y*3P0swְsX-~k%=WvY,)ya{(? p!m -"#0T(#' x,D:)zᏇ|0%*yᑽ׃ qe |ysKp l(~  'J,;p9i& 6` C'b .阨鐼B w 7&_mٍRN, 1&5 _6 J猒ټ- g&Sbx%t阺y9wWGrkt,X T% ="Ym]9i!= % #& *|Qf X ;7 ]%g`"r$똵2됋 D :UlX ܏Gۍh   } H$'!$tqF{uv$  0ۦ oiwYj9 =ܬ9$ ) fߓsD ZER #v"pEtpjݏ&i"/ ~;T [>"f "#"(V7C3]Bx^yc!m M! sp ~ 7[!L}-!<  irQP@p@ޏbD] `욟 wh auZ喩ߙ}nr {Wz UE[K D^ߏL# UR QKR1X 1鯰*:?6<9Mߏߍ  05S    P 7 3 8ߍ  7::+?5#(ጯ   ;X3^$NLϓKIFYYBMF  c|Nwhy~u*.&,ppi~Qr]PLAU^\sIABS]U|" >Oj/M"%"J e.-:A ! 0/3?P/2>A 32D Ӛ: ],B^.) 9$\:/* leR Kpppm+byڤGG1^s,bߑ= 8/blT' `:^4X/5=,֟ȿdG8:8%w7;+!/f![:>F,"$pZ_ҀʑiGۛhg.[Z eT>IRG^FR]B3N:ݭV!KϦ3>ĖHP2Q.IWA\YkKՏFWAiVA;H ߏuƷCI򵙵kbҶ.XhQYHPaHR-KԑX/JGyP˘j)paL̠|۵dжډ%U\YQ;GVhՓ]DV9hH"T͒%٭Fa鞶 JҬ7V.KP\8YKFW7iUToU/j qS+PR,tFSM0ZgK PI[H9EWRuSԏQYO碿eٖJҦƱPX]StkTR!\]E_PUFwM{Au,ҡ o'S0#5jj5WT@_iPFWנF&_cEUV@.oڣkR:@qɰkbNhPJ_)IYY\/WK[HWhVF$㬯Ϡ⪡ A{ (i(SH^PI\LJבVKIPg{.4ӌ*aᠴ㷄 秶:UYaW8RHLUg\^KUgKSK<_9u^j*Ǟg 4UNRY WNHؖR*gLQfcVqL\Y(Li[OoQNDNUMa[- !߬^R͗:>pVT$ TVVLQ2cZPOQdY1=SK8Қ݃QΰaTfQX:Rn3_L$T2EL͖.d+-[-j !Q ؑͫ%⓯{lVǦKb){zyM/bu(hW'N%N[F.O2TcuH%Xf Oo葯P|S^%`)O.O%7L/O=+a>҄ pkh$?jN/`n-M3g/)s('n,$&=ć.]ڤ ع9҄_p@a˓8QO-*M2V4%W,#Z-ҍV/3.ē:e1bz_Wދ+e)ݞMv*`*V$O4![ )H :ѴC־ fE/ Ir.a(^ !q-O+Nt"FIUKkՍ`<>UP0-M&41 /!(.6ȏ0G(ubaϔׯ8ԭ~W ]ߖQ*m%,Cm,7ɑ 9m/[?U#z=i=1]iϙy@*EU<| <+Rm[3SbF"{dP<6xќ-[^MXOYYQI2NqUaW⛚f-е*c>Z5S$#\e#RHSICH7 Zۏ(aL(cI'HPfK|PR\:㚢*ԦR͏D=!. /i^lPIP_KZ IND–RlP`1cd'e__9UƘjLUVR?f\/LHA@wki"UeZL}Z]T]K[JdPIX_f2!K^Mmn !b[f.P^]FXYQsP\0jfAJb\QGK^e%U1YzYАm sƠyUy[M84]YYƍUFRph&YD(UˬEiYď64FUw2K}V~b9Ze!V^Oj*eW\i\n!S]bQKNTYJY&FM1XϏܠk뭍3}|YK';T_ M&Z5:ꖫ: IRM_SHSKM~Q]䅮oബQ^5?X&[_\RS^L~Sh=趭Ζ#Zdģ3S_eRJeQf9VP3XPNSՇ϶*;_<+bU28Sse[126QaL>r *=P`(W%M:&Y+ I붖vӼ{PƱ XKƑ+*L11)-_!Pf-ݠ sҳ́ͫgA*_u RP-N-T`'D3.V4ˑ^q!=L/b)ҏ*YX4Xό#U0ΖYiW{ \@5P1>1Y+,$_S.XzڕɟvU-$ZQ*V44.y$1%쁖ˈ ΔؠayFS/0--ݏ)"gO -s_-᮰-/#dz$LK"3O*r03 *-)#\ϵyθ]εԠɏ#)! /,1+ .!:x㬖fWߋ݁Q^3`'(0,+(,X58_fͭԌ0ہӜ[]Y8_%6.e6c3+A1R/ B֙@Ԡ#uϾh.T",$%*)5}/mƓ"݄q΀Ruw2'4!.7w0k&eM4uֱ_̔ܕVxTJ'!`) !"*4PQW/ۉĚКPr֥=\ 4:/x$6.Ȗ0,"v܃ϣKк%a26T؏,%3&s'-*127T8寥R7b5ݶiH8VEj-f$V'*@0~7ݠݩg,ɐ԰j$*1&+Fٓ 3g(/6<*#~~Үfα8c+/($3'!/*51K߈׾ ˁEɛ᱑T:OF/E) G!7z(#vIP˗ڐՑ(@,g +R5/l'%M()3tC0ώѯ[tČYU(N04-B) )cYΌy~ˀk._-m.14(ڠ2 0, -хoԅDݨb̶֣040f*sw3/%7 -/Ǐ nըA= 7X݌-B,44*[//)TP)Kđ%8٘".:( '=8*7-J7!v6X?iLO1גޠ̍҄ "!6|)7*/2+7%=jӏ׿UcɼӏQLOT/(!(767)%^oڔ˫6ʣ=ʃ4˵ʘl&i%,T |5&5F"#0boYER6"v;C(M55[#l#<^V҇Ƥu'#ԖƱׅ*';4 ,)j:]8(~.-Q ? ņk!ׇ!)+v#;/0:Mz#̰ӲSچ 0KՖ. , .8&V/)95#樞Tݺ4ѥYw17# x'&'v!S;#}jǁ_`Q2%;6);"8)ݠ97z"<)Nn|ۥ١I֎;s6<".9x*-T#t5>,ޞؖCY܃޹0>)$*u$ "6mb}ORW%{9"8);G#:<$Xӏgi`茓kʳZ=#*,XF/='<;?^%u ,.#yT5ʒHJ\!4(~&;!;*t8>>75݂|3h@Elé4k;>Ӗ>$*u?E-'4(&/|lQ:,J7$"J#-/l# ǾƑݏ;H4a/(f$. " ."%Kyܴ80) <'>!=;>_kԲ=6.=*>!9S=(=(+Α¶ǃ<4:=(+<'#/"<9,a>r+۠Yޟԍxݵ9/!-*H!<.?L#$4#6Ղ 섖"| 1"%t *&>2كBˁ U,%)#,W5#9;< =jߵm)؀ p8?#> mzrb!Q'-Ú)WޑQշ+"C.24ƚr`F9ݓt( UP#/# ґ+W݌ơ\l5%7 1) <:Rw -P.8pH. !}<8<FBԌտLE&+?#]$òŻo-Ն7##V#=;8*=,y4=؍͠~pԟ;"ԣޚ*842 = ! T''MŐa.ܩy[%Y5#< '!ɑ(( M4>Б œ?a;ƚPȺ%4U<=<<"'5"34DEhuڧ)?#8 !A X=(ˏ80H ܓɓ˱ٱOt*$Z07r:ˏ92<8ƙ_O#Țĉ.=1n k0D":;##;2G ÎijX+;5ݏ801>*<!\8 ݟ&sʋZϊs >#8 8 = 8;?) ԍǖS1"('8/ >4v6T :#|0RGH/Ȭ?1:F$; X3!8" '%8UWȣśۼ2>:2$10<%d 0J3zڏvb m;R53 *< -)˼ؕxLŀV۲9̞VɅ;<&:01h+=&!i ׷e̮ǭۤbf@ >L=>2 &307#Kzy&Ǧ00>4%7&(Z<9_90Z5eّáȜE|5"08>&6 ><'4Š´ư7ǏddV!4 1?u?'u2<<4ROʻɞS4ԑw<*9+&0И 5`6=ʐ3ׯɌ%Nו܏p7I<7P1)6983d/<&/ͦʚǤʹj7,?c/m9h1ۏ0?(6?0( ,6ˮ[,,ϕL+?$5_*h+~1gX4;9Wֲʪ1NԾѠ՘v :;<6׍3(;59',\ӧϢ×ěO= x1ٞ$530>*#2D״vVLMʑ:*=%(7)4(2(7":א̑-oСـ(1778<&5D0l+z6ړ1kq͜x̦xE:^;ɞ(6Z0E3R='F2եjv2 v/)=(I>+84*+15H61͗χLDŽŗ%5E?b)<79(53Rɚ˸R6G(;Oʼ ^70()6<;ȶHɋ"dԞ]ʗn?0R)4Ǡ(!>2+5%N,1ˑ,tȝͻֱ]H9:W.(45ʞ)6!c<Nɢՙ!8>+6?u+=)6*.vgwedԍǓ#7+*1Y<4:23>ÓֳŨgX0^3**76+A2S ^uזČî˴ߖS?622( <(i>*ɑ6ƀ ě-8O?v4(0+i7/#= .86'–>!Ԉѣ"~:%.733 <)l8Œ3E*‚nI<2*88*3+,j36:0+ʅP6Zcv6:B955*3;%<[Ӕǂˀtؙ?2)Q355<-=BCS'ͩ ̏*̀n:g.?H-Q4U, +4ߘH1jސѬ#m4Ӯl< 1X<922.x5M?y=<(C^(7Ʒ+E6p?7˞-2 4@49*{wYHcf&/u8,":/(0."/5 Ģ "|ǠoА&b2G82r?}:26,\@j֌o8{jaЊki*fS .17Ǐ6;,,ͶNw ur9&e;b1kA] ҎOpƙ5&1Si,\3-2ű~ Xq3 H7O/nʌ: .+ϱNVט|,?617:d^1Grm+Xeғ3=/HV:! X/Kvr%=$8l -!= ٚ%?pƑ «Z> y ޠ; 6wkufR- >˖) yO!-1_ tѧqN՟ձ3cF;{=oO3 5/l  VpB ݖh|!L T = /( G.NJA=  oƣ/wn8wK  u:,Z4-SZ [̏ vK ) >SH\$Pg1 t~& D '^cp镑G+hj 19e\K|9 ,>j9 _  ;T<[횚Vx:ݏ~>\ cR j|/"Rg뛑 RJ cb9s;J HT#; *Ϡ%ש\Ƿ8 :^  1ŕN¡# <@ ͑_jv 4W@ĽKVyzS Pܟz \lF D'9=t a : SXΜ YN=<0\/A &}* F9@{5 ^: G">;}6jp  i)2 ߍzSR[Ŵ0њFd r#G ; /A9 z+5;aS`9 [<7T _8?ū,ǘʠc rviЏ  dɷk  E"r7 ߞ( 9AbNB]\秖 G  R8! (m*"cVqpQ0b; ( ;3|˚^TϏ8UQ2%D|Mg 6/Jx7]=c " u[!mܓ\ [ _ҏU5s:B77䱖0Z ٚ6y H e'" {ʔfaH "}& _ u{l+ J R 2U5;Kˡ/`$GJT95 H*3  K>y$0#8K%\k f3ȍI;b5r> : ? j38VmȖY2  3Ñ @BW͘cyL | ;c HdѓFҖp K \,*0b-^q:1̖L1\m0 N㽑;OyEVkZ @@o'S, ω/ IuZΉ2C)# Q|͔xϭ# cُ2& >Dю Zu.LP. ktM ̚R.h2-BщCG_DWԏcVL/{s \|Pレ@ 9f'/ ΐ!fy۰qRU#v0V0|zV+Uьbϖ^/9ql.Bo1+ӡ\{zW3 "aA憏>ӖH.c/N\0Ҟ병B$l8y/n!  -2Unn ΄0>d3VG%DunA= C^o}A'Gߏ⏞o]aʍD>/G0 T\V^V8c%.ݲ20d=$y- 's///>AAiᐦtVQ[.F-qg{Ҥ㚀-T)I3 ql_\r+Y--&-렅#in -;}/}].&J-@U1 V}Ҡ파v GLDSW,BR_3+}&f+U~L+rߍ!Wk*m0N%Oucg!* Vz=lfUR+D*+od~9SxK⏴A<sn*59*_>v\)t)A8x L()M';rב䚘"Z[g(WRTOq_Y  (3%({GRa\GM, ?r栴(E` aU'E~ 9"l'^/'Ga'%nG ( c؏K ' d  T ?آiPTyD g&y~㚮 3쑼lmh}n# g}q%ڏڍWK$Ϲ v_ 8ںP䌲zڕHk, %%u1$( N|",$  bp'yYWuCI$a$  5 4w dC>d  N*\I}#eۍ9 $@Hk J"Gi@| y q l$$ p0j9a[cR>cw[ɓ|fl(Bz95 J9$FЏr#Y<"c_|iSŊH l  t;sЍbo Y: ЅǢIŎj8Z#x3d fp x gHK"m{œ^¶Q vЍ /NWۀ'řՙo#6Ou 0,wV?$$ŭ bR$'ݼ2"LNUǢ 2&Iwلx{WɛHqqKZ "yd젾܏Qۍ>s 8=!3N $eR$ -8#   "q;i0pR퐧^ҡ o#zM#* (H~#@6 #(y = . DMD2}N~Ev[ޏm " g |^xޒ횷菭rl ;/7!'(@!  bIVMޏPSyލF~u l z Vq𵎱o'X $ '!4 /  !   Z V'/JJ^mEYM}  0($56no_b_]A\Jm@\VMST\eFY'/*a  ="9.V97 2N1L61,:>0(SI : Ə3 > G9 '.[B"&K<?9ppE|3c>^jwepnK Y]MK    V zl>𖂾| !,s0*CZ QNkE8 ) #ġ>]b ь|G#E6 79 ۑ"J>砎Nm@ޏQ "  tKj > ڤD௱کHeD5g栉pg 4"b` !#>$ޔE 6!nѪNΔ$y R[#W" {4: ݨfU25}DܴSFnNe B >, H% g z E#O 7I W&};% %^% l 4ӊ[= #0E ,u 5f<ߏ4  ! #O<Ge ##g^ $= C j2/8 b܏C7ڏpB  lZBKhS*LkcXd#t f(uKH% O_Wb/f \鑑 H!FWmE~2$ yqKR޶>Fw mK kX/ &0|?x6 B  t$t5? # % > ;RXzO۠mi_65= u/ۡbCu!$M"J  6&QOr4duJ4u ;e<y!2(N ב `8t5 *LDc uB e9" y  s"I| dޏ]ݍKq$iefZHo񘓑O 9 GDr` [ % 26 *C!~$V@^⑲$ 8. ɯ5P[0Z <,{a)<<|猪uo>f;5m瑗9wגp p`QS#h 6ߍ|c(#%:v-\%f,B0 eS kPꑘk5o@܇u(g:d# o:䖐U'w1r푩WI᥁ajm̸;'62$$3OLX͙!Zc?Bޝޏn E#  tW,٥R5$`Epi. Lp$'#&P !\ J/G:,E ߍUp0Dz%}SЖ{fB[ p]HF;w,6?2, :m~n#wbg܎쏅)i;@ؒQՁok| d㑝d%  fnp |w G蚖g# bq鞌Q_г%d OrЛh#2?@B݁Z$KT^Kr' u"L 6[&D&! 6+~@؏u5ٍ7V!Ꮮ p_!MJtEE"* x E . qxeI׏;W-7f QZ{*sE֏q-hL6lp +НY݄ u@ J؏bEDۍ>7], H'mHuvJ!GQ"f(" , ^찵p>ۏtu܍rnӖ ol95\ / >4+gn I (鑓uxoPm8 [ Zpf q8ޏCf{گenPbp@瞁DH ((| ZNN+jaw$x_>hK/kJ194 [vw2\Z<B S{f rG2* d3  kp( "^iӭim9@Dud^+o  #_  yxx OR]E 9 _^c}{s鐕)mB[']"]Ѝ :  U4G a#< gnQˣaG|o1 wZ[]}}{=ۏ?8 "~/ T) s?8叞( -fl/4 m^1Z4fQ,!`s둕m> + ` :0 :44W4 F<"8 Q C MYLꌓY:x'?y> I 91SQBWqDm"` 6}$syUJ GhR᏿ e89 ;0&dr "<7 "&吒{~=Qmlʏ?ʍVtMGk B un庾+ADW'-C N 0Os \v,gSۏXEtݍ{ 7. u[Џǫa'̌VǮC얉r32Mz ((z "X 9i 1l1 ~-RN %|:|/y &G-8 (7ǐX8h1= @/8't{9 T#i}dhy䐫2ov ^,R uWҍ{9.l/ )+\:70=S)/Hj3| -2] ^=Wy7 s; S(y֍i$Փ/n2[z ajЏ$!--[3*:fӲi >:2< i: ;;97X/1xrn r@@x堪 /#/K{ UK2 ,y4P5$49/dm >P 6Ֆc.6=~$K 6:;C:hzˠbC 39][▂`v+GȋʏĔk+ [;>"952^ade0 +b3}";.KCNF}tt;h׃~3̞֝hߪSۏɗYVNܚ2- a?1A|+iݘܢ qj֏-PP-i ;.6 n3-7 %0v"p+9i(_㖈, VS [1B~ΐh ?a$7Ywt$ <h R00 "z# G>55T Vя)2l| 4%Wf)Y   pn,_,)b C ܚ-!~y K5 ƖlUV#&_ 5?3<,82)n˶^ȠMD6ӏd);,=e5? 964s<+ K65v> )("Pʘ4L;+K 1ޏ_ZzaэTg:喧mGĚ?5=z6ÞQ3. )4Kn7|N' 3⠤giΏm׍x%5$4+1:797X49W!0>>zCĞČ~T o !M`0!"05c ~yϠ':nuЏۡ؊⍸]c .<3.u?@7i c  cf6Y$Uɖx՚ǗF"ΑpꑱB{Hp|# .2=;~ `֏x܈^>] O-9B2R("lyڏѐg(ȶ9-"OZUB4kصer7ؠД:ߚX[֍E7cЬךl,5$YY!b %:":3)H%IA$%<13i"䑲)^*r (P.yf}J$X]N?n3v *e}Ֆ'8њ/א6*{v 5 8;X9vw6!7'F'_ q;Hɘ%3B4kc+664/:䓙Wu\"# /^'.1p+{>&=*i4* $O9)7v!jD 4:K9 Q8zQݏtˍ;ГGĸ3ȗy^X4J%_S <>? Ӛ]ĆБp+23 MVHVP@sg,%x&1~)1; P $'8Sq cU:s珥> H  D$=d50(= Ñ]2<^I vs~R4`^R [G/y4*-?_51T髡! n?>); D )ԖUj>% ^_3‘34:$tL֐EŽě;$ uK!`yΏXjX # s3ZүH斪n<1! 8AqB^_I\5~?\͛UvڇߚN {wNm._8t7$<*%05o>"CNK4+6o21T./3+bӖ.2. 70;E-0@i"HIdÖRKƚ%D*0Kv՘(Çɐ^oY}MaU=ڌ pjq/ ֝ 5\P*/F 9`4%3JS#:{ޞߠGGp:k8"^oj9[~K~?Aa䑓 =V<,#K[8' OH)`  }$sM6B/B*4G>ЦȚʘ 񑴙Zӻ˝"_"@ȥE ks̠rR揗Q0[ǍG6GfB1/;* 1(7 [) ")L%]C(\ 7a.- Jn / R%q01+>" 1>1 6F11!Սpn9ƚ̈́>ygQ* 0 dsy뚬&`2'<%혊퐳 0L%O6!" e;!-q=>3\^+gHYFb״AH<=W-ҙdsP=-$/UNHɚq3a! -) %%@c'> /ࠢ#$j7ț󴏎wuw^:/=8v/1Y! ۭTw^ـŏڀ3Q.\,x- UК2 @BN:G;; Iy!(EVA&>>o<`.J/59 qRbW<>2!wO G57aAuڏ7H\ 1{! 6#$!A-DJo˚xI%kEkL#:g10TW7.+3,~7~{-:bDX+-I9 )"*f %2͚dߏ _-}r1jCɂAȖe: \`‘p=nBC$YwffJ Nk;AH]J̠k,T85Y!eM,%V2L =!$1@o?:: p<-1tLYljM]ΡZ#@ ] # vUy[L5B6g,;H QSm5dYyu$暚3ٟ+ 5/,p-:ϝ:^= z㑥}$i6~ )"Dقۮ`7ؠ Q'ޏȣHʄΓ/^#";/ˏGü7'M֕);.^5dҚ6.Q^;5*=fL|N(]&6 ^FL ))cͽo/H!X Z|Ď##&5  LB=>+A9wX|  ZM)[w9jrxZ oN@ƍ:6q<ǖ#T g{4:#y Rמfg,ӨbČHif3MN,$2ax^>?Ɂ%携 8 ,/P2r GǏWT!! %>[9% 2{ h2X@z; 7 "1[4ښ\T F˔57F36* 5 t)=?U[ϖwJ>,F]S̀ҜT/f'<4iýAb'/34+ sNTyCϠ&N\'1+ n#^) +>N+2 ꏠ? Z AN' 8R4܏‘.oē7 X9,)ZA5Vô;'M/C(ߏ`08+!55375S;ߖTùA%{6w a<я85潓`7_n9B&Q f1R~ , M?@DJ>663#%l2X"cԏW34bÍuv5V9 œ֚)) +1(KE3!P"#xe_٦!G0Qsh# #&!p.''S؎\J$ҍ (ڸ1/mMs'2>#ΚNžN{=h7nX:^mL^E55b1\7J(͐MU:M]Ơ Θ ˎ8Vcq6+X9ݡ[̏[c%g6[<ŖۙǍT %> P>ǜ;xIzZɩ׌:MUK4KOU4=Qt9, ZW(Ma.РWq&䠃 g#\1{֍> Ɠdy?>&f/3oQ*] 45>[쏜&=VW\5/(5 ȫ֚ȗưΧ$zp[@3n+3tŤĠg7/׏$-Ś&iƆÌՖSϚs/4m$`1Y_[ߏ<)9錎H-E"N7X<4'&=60:4L64݌."O"0noF ?ȌMgK{L93LIAv;fݢ筐$P1]ƍ0C U5r;:M¸%-0 Hi/<ӞYf菮Q1 #y6A"kE ֑8R;+.% p [))><  \8KF~-"ے %<k!'WoKf#n&AŶv O1*9vZʷť5m.89=yJ / :60\ҋ0d)g*j Жwa'ӱh&ٞy0]=J#␖`.yp砫eɆOƏcE"ܭ؍4* W. %M@5r1{ok s)0OÜݖLz Pc<6b6 mPa;I@b@(bP=|<֏}i #ϐJ0g}-HH$  H+ޏ [a&0~`w$H|-OI!{̵8ߑ׀&yU# #V/1R@{ԏ}1܏*ĵ4REH7ړ2 /CM6@I%9מZTL5\_.Eʟі!I [Fi8Β/(Z x2u_(_[ "9fh폔|l("-M]Q6Җ V?+MLԞ(m_IUc}F$1$It+%٪/;3*N+7!AT_Р$ ϠSR bj!j?xV;=37J'ޙյ e}-7T(];і<2Tș9ت*w"8 Ia9#[k74({Ѝ? ( 8<;/%͚͏5AvHꏀ-:77\)e1ŗVU6@F" 8UO4w-櫳x^Vs&?3W% O( )[0tg֚1:(  K>>O~L.:r} :܇"đLX#4)ݛډ*Tp."[o&rM H6ɼ܋9c$ov' 0șE##(!s WO1{ݖe4RR( lݑZ0:W+_ g(֫GU ] ʅ=QH_-6jWe J-PO97QļQgHW]Dnm^3h VŖ /̷'δ#c rđB?@SE-3:Іږ֠O `j:M * ḓ֥2q9b.NQ**d8 YԌ%?)9fp0n]7 1!  J^Ze',+ Πq%*ύ : 0 86o;K H+L螥2!Q8~oUo^/fRHQ0G_XfS52OPX8#* ''XHDBU-t"Խ`+" 1(Pfs ;WzҩX*߱ݻDž%Ap,%}:^25YQN0$_Wэ!Փ«],]89!(\HB,NɞbB 9;T̳3ԖLkx-[T/[KY( ɨaW1.Q}bۏ?2=L&gz6'&?Ú. ~ 1VV&3i$8?Җ/ ' 6 %'5Α/)ې.3 I)@T!3oʏp ,sJ_F?ɑ؁.mi(<#4N6kU0;g zc 9J\ܭ0v߯c};2ڏC{ lص8{a1-0 X9u("~$͐MR -`\ZaCxTG0}QݏAEQ[8Q7L NԖ$h C8Ts;qg9͕=Q*- 8 PΑ$̮7N8j o'Dՠ(]=9CQa9IH:KNE  ;ޮ=v%H=I 2 { ]8'/7<'^P)Џ8`6_M 0ݏ|GWm&ڈ$Z͞ H 0[~v 8~ژhw;!ʦY= 30ޡ:c2ju.Z9Rs|_M m؏^M➶ 0-όɗ sg2ʑ1!5S $R+,S=- l9Z_ 2"P.EX3-"=U= #01Ut?2N:t`};댚"j喿<@"*T+MU2P$KH+!HJ:"uT)?r [4ˠ c%0-Bɍ`cM -. ;|;C..b-qg|Q] ЖR絚!E~!Ø]/!b%ųקHǠr<܏q= Ó %];ǎƑkcȈ8Ə\ 2; H 7%%&*2fr309=! *2I2V[;= 5S^U,m-܌}/ؠ꼁0%}'/ )g薆TÄߑJIb61^ xnČS>ښ*<>>ᑉ" w\|Z\ 8#3 |P$D,z`XSv]v :_:*DN78_ߚnc4'2}]TK`E>4?Xܚ͌鈰Бzi {8`>o#Bmd_ ,-.~$ utL((Um@PQÓ xQٲ?/:j.3#Tkj632V >ƚ.UmyёZ כ 蘡)s׾ϼp.>m':2_ ͍tZm#o9=>S}>4nЏ ی Jזԣè[)CZWL;4L-Q֐  -ˏKZW; <]A$2z ,j9$ _v + -RJ)\6%-U6>> <[ Sp=K1Ӹ-Qę۫V K !>Nči|䓜?O?^暞ϪPrVI+p% i<(:=6K ww$V 3!<1I#*".%9*A8r:U ɏU(<Eٓ|0sƖLߤ&Ś !\%!"DA|*ONG<5<?>=Ӗ>nKؚ%^r#%Bl&p8#5%aE&ac1^2;:3<Y=!?C/v[BB .;o ok 3 B;7ccJ_j7F [g$"3!S  cRGƠ+=' 9Lȍh+3Gf(ٚ7(6CI,=2*nL0jĚs+u߈%*]u#"Z:w$' ðϠp-A.-k~iݓ|P>+z-1_j74<eĞ<ׅ֏MY ~5L!\RN6"ا!g0;$x-?"vlZ*<&,Ϡ< :9[7AMb\B`Rs˖0W,#r2ZWUg>ۙ+to $R32σՖW4$]%zE\őa&\9ܐV&5>T] hb48,3?U/-G1ңs 33949% 7g   J72 09Kp1[W'>Pv[.4E;ܑΧ7;\%MǞ76=B/G패( AU2DGq hYL8#Z SJҐG<h5o/e;0+8<7LLz:mu8_/;y ꏢ>NeՖ^% X%*|@M.c;(78Ϡ.ox8<? BF: 6@h|>5žH=ɨ׏ [%<=hӖ~*#T2T51#ÑIN3ch!\@8^+/W̼n%˶.:y%?7֍ ɜIc!N=/ &[jtB8ƾdT8|2䌚ۖ4ܖgA\h|_% #M֑  "TM4((S 8={<;:8 7e4,^H˓s <Ֆi& LT4ZiYbDԇn Ìbٚ5(͑ ߀<;0 r=UNQ!~гpٕ2 @ə8,<;21&h>,&_X#w➸3ER'ܖ> |ٚ55wE2# #D*^7^%?ȐE=HԵDh&^SDQp]Џ#B "7#,R2±*0|?>\ʚ 9l"% ؛,&( 9D+;p6 /@U'ƞrҍ*P#$c۔(|h.81/3( q5T[/.E,\-+t>s ‘ާ9u<<5O|L7XѴbٳpۍؓJw*y)C*N'cHKȗo ?2ז׍ֻV T!4p+*;٘+Ԏ Qz蠆 T9k(m3BnK7Ӝ B Qf:b+:6[)Go09d Ӯ*451 3d2 S+/L;0E, ;u-4JI)'o2:a:6"F!& 1K?"zii<==Nߪo@75:- [. sYs_HDΠЎ+ڠ|2:>a!*:) T 2*y<#ďV/7VaZ>&x(ΖΆ3ǻš˻Ă=P$lg>h,t*^BfV6=>7$E= <jߚ ȚZ09ڳIZ l&D̊& fa# L3|+!'-*' 7> VϚвӱ"䏛3:G W׏ipF&5!ȈPG1JV+9CjRCSژ|d'p4&7 #fۍUx.0"((#3$RZΦ !" -{/Z@$< * D=-!Fu < 4}(+H@\/ˏ? dDV*Y\Ukؖlޏ⯁Ǚɞ߱VДCܖ< ƚw n>'#Q?"P4JSeBC9V,ibՠ]=]&*I`ٍoГ\1<ަߚYΰwz'^3CP5( b5G_'K<9  VvߖƏV]֍0Όif˧# -ӍҺ HN,ÚLj63&#z$Z^;hd>_6T | W'0 !B**(q'} Z ʏ͍ 3`1%嚐Sď$;&=L ;d <0k4Hϖ:r"Z %\ÑS;;& (_zԠʏgښ\(Mo]~8D,(۵ˡט4+.1-a3+QY'L *-T<Kꑞ>uy<1` Ø͉ߐ0nIϠ%/\KA Q}"Hl{Y('Q >閟:<17-:s#Ȍ[М?ՆQu J$דYw<8 <5迯V.I͜7\BAB ؅D] >NwU8&˺1^c+6boS*_w*;2l+KDҚ2*[ d2ah >X T Fh#,/Տtiݍh8 דZa o Ə9aWXc޲ɏ*Ņ5@{. fњDʑ -9h ё?L)0,C{àxٚ|?18r =;HQR瓊xl,($Q"돦KJHU,OPY:!?]UPĨĊߥߚkRE%uwG][D\['3ΣCC j7:A]ڏ[iǍ$魸3b%,6  /Q׎  $+s8ֲLЖRwjٿ}ʑoX-w1 ;f/?0pEf@HV !%+"*%%j `,NoCHE=974.['?YviA( 5O6Z6$|ќ͖kvKǚD ("Fm *&yِ@ІI+?0=:ԍW(n /"LQA/Ϭ95W {jd̚MA i!Q 8R Adc0TL4.upP1ۍq=/(#$$=1pS?'e}xZ)X""663-3MIvk ((ɨz u֘j6}ĐTuFJ'+p[\#'<+.'y,vԚsꉫ!#0N 폀ވGŘ51l4G}= 8% f ېH:[l +:^dP /N{ ɛ1uܘe|#,̖X$}J!%+!g+h+=T.5Ui}[[x2$Ճ .Q UJBŏF"b3-}sv\1.B(!<>e6,+ʏ(;;z>X.V.ؖ.ރq2ϑvQYrm%  Mj *ͭW;͎V082^P8J*@>[*n!_1߻ڏbW<3!D[7qA:Aɑ8.s: fSWP|B;A8N M- i27?* ػwď<9; *Qۓ93mC0~ȧƏ 7V6Z7ꌸ@QL41?NX@r^@8!&oÑo搎rY01WF3 u ,Wďa>y΍3󦀹㓝)t3Ӗ%Zs,% rY@Ӟ'dS'7z\/>ޱoY Jh%\?];- z'Tc18#9Sh 1zH4"o6#:7! !CUn7PC* R5X]JDL 9oɌ 6*x)ÚNΒ EF8>옸Vϒ|Ð{䠏Z[ɠqÝֹL؏8=PM=4';U֖O/ՃҴǏ N B+eNR,J'h-_?) Qj08YF2,bS& w _D,v cꌍU4?}8{'&8m8`0Bon, ֶ\˞f "',o7uS6CM NVeAjIqD > 5'>J-*&ю"ƏˋT$j^@>⏂X Q XP 4 Z.:!,-KI%4=% đb h0NL~5+E̠d  1 u= +/v<5s8@^S;Xkʏʰ  56!4׌k 9/V@@!ẓڑ@X8+ Y:(q>[!Ԡ;=A˵5l׏±ζǸэ :EmoF}m:f ik͞(;9o]J<|<,,0;"%19ő=+櫘WPaY0I<#L2r71K3)1 XJ9jkŖ:&41i,!d(-9 r#<)?ԱcvњbJґ ?[<;Lg޶_5G!: i;B55\*jcӀ&6#5,( >[tԹTΏkJ;1</( #.+{x6vL N7I'u^R% %l# &R`&xܚT!n`JsіDO횽o>v2ÑJ)eĘj'hV)T x#/Ǡ#ݗď,"(.݆ e8׏F9%{c5ߖK{cT֑GGHǘb֕t۫ :)$o8N=* čWN ֖)%pM xjNL=ӵCܟSAE1  j ;BI2aّ{}㘢+MQd|ȢЃÏ1ڍf:W4(18Π4L]h|(# Y!ď;Ri?Z&8)B|!-o)Z氢dӏ/f=a !@S9>3p%"qȍ_ݓF =:= 58< s1b(]=#n o1< Vr `+H nubL:w4 79N5oď!E׍2 o<"$tm0% :d <7[VUqn~ tTR]і/ O#ޑ8ϑrƶzcD^o6FP).8n "$,sN})|!mҐU.2knHƬݬÌ!%C-Α_ga?^V1R6 ݍy*:eؖ>˜46H3r; ;(!$/ճLޓ} 7>i*ښ06  '+ @ 6%,6LP#)fޏ3ڍ" j֓-:[߶E ,퓰SwwRg%3-M)!w0 . =>ܑ;$EWъ~V.l13> G '*, bšʔ̄ ̞%Uҏߚйb?!8ᚎ;< N;9u 5-".6O3/|MI%\5 7 y. "#[N*&Z25 5PϏ+zŞQ~e`ʌ1+ċ/ \ְ|Z#h 8"=g-RSV1k'4[č>!U6@l鞨ڣӏt7":v,\L:;4Zϑ(ļ&1%> $?<= 6 "ۏq-U$  .jӖ\Ǚ6Jv8S[I?%喀˲κĚNxБ__ӊ ,ΐ_?'%fq̏7*r:e (S*p2v{ȃWu DLvNM1I:t]Ʈܚ/PDo<B3Z17GI ǠGO8*:9 6)j 5( wߖk*6T-w B3=X.=/6*;7>.7 +4$1LK)n;+ 4me*e& 5E 8 , 7Nȍ:&4+1_4: RhiÏ) 6V V1v׼? 7U6e| ^X 呔|u摈{h )W栔+%y cՍm "zf__ĚQњ$.ʏ,Y\}87z` ] K J L-} 21*,`(J )%0JQ2 "1= Y 1'T`x  4o$"'..^ zDŽ<A,r0d/ہ  xtܑ x6  CZcĐ6s.:843)cFMˍ*'@JY3'ەHVbkY ў LeTtښ .⑙ߦ:8)><96}ir-[!%l΍m^$ 0>e7;SOg!7-nb0X*_u̮Ӛ_ ,!*n"{ʘ*;#ub? 6>ޏȜɉЍY(#% D8s. m;[G+3SW?'薰݌͑# P/7 JW:~Տ^Ћ $O^' 7Tdz016[)) /Q֚IΑE_ :t'A LɐP<}ZO !&*2r 8Qu  W/GX"va48zٖP,ך-,7_qőLЅޓ˘q.>- 5nq,Q, g$pJ| DE + 6,垃Y3 Nj4G 2˹ȑw@C# a7* $:,Ώ!ڍ\Fѓ @*g5 03Qˏ!#z X8ɳ<<[A% K+%=5u9(<|1+ K/O/_ ]%#? "폾T8ޏ;)#ͰA_Z xΑӨ(:^t_Κ̏A ;)KMjn:6APe i~ :1 "і*]ҿQŜbh砩 2;1ГIXbKaLպ)u+?R1K %Čʂ<VtrQ ł} ݓj~9K&K嚬$Ğ` -23;<,.&%fhZP68Bp搽"|85uޏ, [0K#44W$`:4=(>TƬ} 2 "?S%疅0 1&|(4 ,3 5g  ՏNX2 9.*:><]3WYp)vՏV:J  q 3?wDJwݐ}ƬǢżoOR 228яaSr06?i+ [)"8&sÒ я5ۀ HK挢K ݖ"([ۿkHC+ 4 .ȍJq؍vqu :Y #9 3{Z@Mԏ?o֌mܪ r/Ԑ쑹P hi4 w } ' 9j{&"&&)^8l 5+ɯȆ+"R `," 30 ُunȫ?gg/R >1=9a Z/1D11 T4P f!&sk1Kj(S-?pdÌ,yCoOB&ϑG?X/טƟi ?X5b .>׏ &n,v3_?';869Ş͓d,=) ΙHtԑ" k}k3[E ҏ?DQ'[;ľٖY?/6OƖ珘 w91 Z㌴&q C+_ >$"-xQv~CPw6ܾ˴@ Uؓe%+ᚎ K7h/@rf#%$,#NuWM7&+M%ָ٘ !,}AY9:m99&#6'Yw1a/d"%7>3,k S5-( ۚ#&s%@b/"$|-oѠ&5(bˏ+}=P꓃G6U,Q4 b/.Z Wi~f6`7+ 1 | EF/䠌p>]ۍl . ?8f2(OTbs Aj 0l Q>90;l 0ᚸVꑎ#.  o  o=]ά:?udfc<6.=u0~ܜ]錐6$&a"rۚ>Ơ17ȑʸmp> U-!C  4 ib\~'c E5;XO/;l ,zgBT _(ӏh={';{ ?s76/$4I4t)Z<DDq2 bˍ8?VX dVu>N/SZ+,I L2F,猞] X[ych=P|m  X\M:3S #= "H>:9 / 0 @}*s.29Xp 8e=>o4Z?@SjJ1A3T Q82D {4)+n J zQ "i %$ *whAWQ`\?A瞿>/!~w_2▫d?D0 V f+ " drg8dP͏DZXٍ6xa75B!|2P Aa6Xƈ^r枳 66kZR 8]S?CF v eɑqԄvl O%^2s # kZ`ԏhRl&q/868zڿ뚉y& U $' 0?挐ƒŖd ?&9p`lİNO (K D׏T3=4ݍ Gӓcu)'/; 9$+Y%8z:1>ӾԖm{"ՊE1_$ujF6$\6* nbH>|9F؍:Q'xU )BG&C)j+_%`R%zY:dmXk@!^*=b6;o{8!)\;K gX3n<޶J +DhÝ?Ƒf_J.C\,2D)(=(''-K:  , T6: .) }%(1,'D;垜]8`䌺* \$t 9^ 0/LrA6 vœ̠Ο +=~)f xC J,Z) ?54d* u/~; /< ov}ߊόȕ93!"!?$i's/P, .*9 "b>wI 9 VJ/ uxu+bA+%N D-8<%*8++t( ==]po }}2, G$^ ' /~1Ok53|(2j7 M.>o3M<y[ ߐm Ly9* U Oր10b&R鐉Cb⠅ u YُߍPjv 8]圤C)^}ҖzFN M!01 Y/-b Wi.!>9$%=k>j>qPu:* e&E4R;: OG ^[sQ_ C=ؖJuy`"+PJc1+%S|&ԏe[ۍn铨P 1+ u$ ߏ?R햏#`Rȑh4& mM1}5 4<pt xۍa`}3Җu'/2= #2*#^: N' t%K ~e8f`PxB [E'{㓓fM24.qc 8x!+0~?3" H$OS x ` _ B.%M&6b4Ig_M }$b`HJoU)oq C :qC1m.-YNq 1g+J! ")J"bS< #|(  7s]" i}z~r~ITDANW  W P Rx`# q՛givD0Г7eT!q0C :5וJu-Y1'l Fm  - Kr͏.I/^ ;!e/p,PXO\ cRi|,: e$<93  Lt  ԏnkn׍S.E"}^F=KI +O/ `: ~/ʘ* ʐWY7.?u+,) '<'6: ~1\N 9~~ _W795] .-H6?  F'9̘†L׾S?.]?ҏ%׍]F?דYȔ斅m  c14z(/+* (; \'۹lUG 7=ϏR+̍   [y  e O "%!I*lsW: ) mx & ?5 ;r,^{-U(-Xn'=MfxZZ暫q;)e0|T KL6!iwӍXm߳O412 jW1t h"ڱ/^2㘙?P L$ K&I< & y]>q..Y,o,( o+~3};sF'⑦ٮ  c 頞tL 3@ ڍmAOk}8ω皣菙 M 'l6 9Ix8}:*H;t p : Z"T*uϏVڍkG# 1g.0#C }Tn[hQ@#%~[ WW8F.0+  쐦tJ4vM֏! 5 # : 0O㏉ysU^\K u,;&"4R!Wr܏|H<0)5SO _*W+_!(sj" 7 \) p R⑶O  K1yR:Ϗ/!6 q \ٷ4I(j -b ?  Ag  ԯ#Eٺ ^tVc 6 %^TɏxF n-M/kF=}N8$hoR` PAzВu_  %r $ybx.f(E]N V*ꌠ (/-5P%鑲#$<"/I0 ph% @=<1h hkwzCAy ,].Q+ Y oub铅 IGc?\iq,4 4v @A y߻3AqH?=9qJ x"u X 7c?pg4S[# aWI )!{X3/^  %So!?Zv+ k"6~DY+}]AA" /w-h#g +'j ^~ *cDЍO68,jn^p5 h'_ 0S]W 1#D'IW6BE~}7 K%0oe -}!y ({=V .[%[Oՠ0XE=M'[  ҏ(o0&ӭ ? >/E_^1G9t=K+hđ_ʻʘo~ y. 60 ~  _ O`3" Ew6L f}b+u ^g 0v2rӱ! zA ۏ $P'H0 ~!5 Qw`#t"@5#~WBB6 44!s64֏bލ(!yu9JP M!;r!\O\Ώ>ʟ@䘒4 `|zuۏv K# HW`,} wJzH%l!+JB[ | -SOT}L- 'g,) G 0|d.ᚰ14S4LW 6M\IkֱG!;edtH@ &hM!^5B'IRQgET{qlT;㚬W&u[ $JgJYxD@ݏ"r*qV 0`yxUL^Y. $34 KN dx8632 X+^eu >.BR>ҏ6ύN] ]D u3!VጶX J%#E+Q- )pm 8e.`-+՞p^Mi`mY"Da ,(hR { D怨PdNڍ3Y h3z+L'iS02GX󔕉 DT) ZluC؍Ra"J? !?KLk!D P)9c,sC:/n)"B䘛X@CZuIe( `~) % N 6/w m'폅8}垖:k }"Q9ܡ0 P wb$e$m9 7 !5 9 D6 &"=3q b$38jL! glKWN N.w#Mj含袓EI91؍ vJ &Q[ X!aY!Gъ( ' Mru_ލ,$D\T瘜b! ^u"n9#S aedࠢbZ4Џ)"Ѝ!w'q-/O  s,>9XLO+%3}P@=$d "ލ-ލH%i)Pu*rY'&/  ?PocNݏ aaލ }-ir잗,^IY$9eu *)q(<Q 5 tP#/ ֏ύHQv ّbT!$ B| }Twh8V푸.wn!V3   Z]-aNޭ_WפQ8PR.[Zn( %6r&{%  ;K᠇qᠹڍ!L ;$ &U0 aFt?G  W o(p:$ G(.o6qI&ۏۍI~ Z[M .(* }2i5q7K^J a;'tNޙd2昼x?)᠝T)A܏9ލ6r m#X r)8 M P ⌞k0~ ' T"j$!8_]UF B yN&/Tdc &G!9rlblh x0iXa!5$ !uB-$*-*cDik0UQ7n %bW #c%$, E _o& A#4568 ݻ CV^Cj瑴   ?"=  !u Ov&4b#kزHza\ {9޵O! U ]FEH{ |ipT ޏi+ٍ&)HADdR"$$> 7?33 %9 % %jF7 $eB#B #l+\ډ -ܗC또{nC2jB܏LqލcCn $!b"  "!G# ]V  G3 s2(U+720De F"/$~ Ώ& u{p➶g_\,43Jffޘ ! y fr{#Nϥ y\# u 1d%$ ~& uG욛 ⼬eؓoUښ6YY]I{y  Q" 3sލQk6ɍ!{]" \|jױbM #i]lc\V꓍ vg /A?w c< z ޚO#g 4k6w%iRI%瘐Y4R.؏"pٍJܬU#$y1%!%,,XӳqZR5!ލ7TtnV /%? X   C &j! uKw<'K =nd)^3z+1,x5T x vKmyL xPlT q\.)6&A  }x r/ 2 MX-QJP_0u6)iSBj fߨV>$ tk  "X -߆斶ܝuFL$?eBL٣hu  z& "c!" T4'~"NT=I94|ɣ0Gp㌖NanM 8 S`$ vpP*m ~ ;$ BDk!  i!^ Ry 2'Jvq6QRfI#8u G QX%ݏ8dۍqU]+ 0澷]Ę} < o9 }Ms"3Cm\ r^[:iTP] wIH G x %u=#AM\ JiPbޙ0_=P0W"G6ESHAقWKFm1O]ꌲIPXchOP8Ith Js"S:Pw|&p5'=0+uRB"WhYX`푕ܽLݥT(Ǡd:# A$)o L uVJ:.nDi  UOJ[l^g瀑k ?IN^I5هOeg^N"f D! # %H {ܩ<:zp5Hj65!^="F-.j دmF!BI#[o -S Q#UG N  aNN*YBB)'%6Uu3ub"zϟ/*B uof%ӾG01y .(Ƀ,19;2!J._M rYP`ޯ26Ie`QI, .?  ~ u}A % Ϗ2v{ T~Ze&Q l7<9ީ/ 7$:*_rp`[CWf]^QCVBOn@SD]G1!Uv0Y&<7]_2+  ,LE= +; 9#, :P>/,Y :k.5\U;$="@>#1$>g_%u8M_rQln7[ovRővPؑd3὘<%/ ✠d{Pp1:%vC6atxd k =? 68.;ӌ82.>,5(6!;7Q&1O(]0'0%J;g, \*'׍ߵ٩ݪC׾Yɼ^ޙW#>N*N2/,!5# 6)7%6+/)$'r(/v/L6o/w*_'{#W`nZ6-' ))76+RkևdЛeޫiܙo֤ʗKߠȕaʜ]˞tИlfʖg˙zЁQՉb܈D߬QQ˸'23 ,!5%# P/K/~6]!N6\#s5H)Kf6B(rs'Y#yjpE6DZGXt!xbzF{#Mzz)q/ca!miP5noYg5&!5# 6#,mȶB˾lЍKՍccu?|)tc!aj+67、2S/h؝`r{ɗ{~ةF1֠ hY0.)9%g4d{6Zqir(Ap.x%z#U6w({%Ps4v"p<G EJSRDO}oMeЫͩeП̈ӷͽgFͫ]ƅlIҗvܕqÞBlĸ3ŠʄΧlvܿy;D , ; -@0RB8?7ISMCSNб %_p64M3_k"$<$wsqVB3H%Q_"^" :  ;=@K::" e?*098sɠv(ԫ, ލ)ד1ס m:'*8.> 3,Ϗ.13/ ayF݌=-Ly70;͑[3W8VXyФ[ӥO;J-e gWLIYOk1͓\k¨x, \7nD'#\y|SpΏU rپGQpƁ &*ycU/͆R*ߓ &8@X(ѢG/D0#39W (#7UWIL]-Q0s:ʑ[ .4qi i(K[=OT4.1>:nJ̳"mOEܚA,C836 _!b6`Y]0 ^G׭ ]r^3f?? jS)=al*<ֿV?ۖ044 ֚/%7o6 N7Crl9(l=X"r"::@jibbA>\3,X ߑxCZ!e|y ՠQ˔4F-* p|'̏!<9̂sF $P:i"9 =4[#q t.HFN2BzT0,J% 5__XzPL9族%=Xǜ71ʘ/ ` NL$͟+,薏,L T~bBl8R.R4N* (۔?ǐ̜L× N _URQ 7[K`-M=mɮ6 +.-)6a9ЏL44#21eP_!<&?O ,[/<'&p$ÑWe(hڑޚ^ M,J KIONy d2 H|+ŀdmRy1U$Բ>ҁ͏Zqn펞i/#?A P!'# M2$@/߃έ g f%F1ȏcyں:[C}R@$9&d-Ĥ{ʚ> J4c81)Ì4{ҖF|_ 0)-G7:ո#:&( AZal]eԷˠ2 # Gze1F JT(A@#\]&lz4`% w :6I#ؚ $Rc:)ۑ<=13e&kt9γ< 5>'Qk:3l:Nb/9q:>,AFv:b1Vc9)*.#?7z@r8͠X,؆ǏĨ·;<} 5fu+W3K"L1L(е.3 :6ԖYЄY?t/L4`)ޟ;2̐-+֠gîԠJ_ |; ݋%~UCN0fX 9K\,ڏD0z1K:g#-6_,F Vt.746.՚':#2}x>q.3d_6|5)J99 ?m?ہ^\Ķuў-MQl q˟7E6>H  ^;c 4y?&aKAI ǠOرE׳WW=Yv]UQ.G>=ўi bA b! Ѿ  G5E0푧K&WpԌ: `  ײ&3à( (IK9h6*C u(1?[kuŴ[-(^)Ԑ'OY!2'-\d<*G`1-)\qmCٖۘ',U .Ӻ *o^G]52ЍcHn/&O>8j@ $'$]BCC9!݌8;eRY&! =:?M?͑5]#[ JRs4#h?=jÍUPљM->}TwЦɮӪ225Џ0*y4'@e |/m67 2ӭ̘6ETn%X+4=?1WЧ$p(dȒ}+A1'\yߗ6Ǟ9ĦЂu-</޺g]]W/ב)14ˊ|+(a0HS TrB/߾mą06.1“<:5o7L&80#IAď? /&@2(@.<A%opݖ:o! ?|6+ Q 1ژ]:)G a/=4O 6&ϓV(@j̦pҠ[B2O xȞ~НZ89 $@78/.> 69L0'.3߮ 5%H63~?$+9O#  bޏ=(*""8%͓m6+0# њ #⫏t+IkퟌuG@i%ٴΑ Ҙ(FTj(j}Oo.c֖Zp z  D Rۓk*AO%XdmTѷY ³ʧɖVHeʚI=. CT+CFL= Z}!0((!LΎx#퐏n9+^78 < HȶA& ׏# >0,1 5)u1 #==l0<]3%WعtA@3l 06  lm[Iy!& $&H8O4&v?3= K˞zr,g&!8̖z-$S&Z</>#<.  G< 3Jz9ᕏ4<7<=%~5~= 3v_"5A0%d˃ׇx`  !/ؚ"ILDu*/36.LXˠםU1:f4/ 6d7:zI>8!F4" l80>M ,d/2M7H3ЖSB[tG/:+=˺.rh$`>>z)5!+%??L [્sȞK_ T.3+F#/?E=ۖYh `^Ə|+؞n p\ j*/_S?]V8oچu#䱑 /> 5?5i 뭠 x$ Q=03ԍ fɡW(6pY!"u>"ZJb]<"8X՚DOi*w!m8 0,.+1 *>/)3!x45%b Ŧ;+=z?~פ˖q6 g;Su8Йha(-j۾(8{5F檑滘ΎQ3Ϡ2_Tt^+`7 X њ8   ພ\{M $% &&zՑqm &0 SȐ+w&sdLYBڏ͊a1Ke"j*ؖ[r="? 6U ,`ŏ/?sٖhNΑ&TCJ0ޠW 1 ͑s)& 7 )}* )V7 9ğwjBᝏ +}"nIȹJ0ԟj$ՙ$I)M僠8<4ُebH G/5a "- z!>9n&@ݡꙞ6{[(!.Q'Q!.&գ=Ǔ/ϋ(LAmo.]Md"]"׼̠QLd-fA9W&Չ :;̏!c- 0)Q1HƖg b桑n7;3+rn?JT eh!  *Y6298(>"09X2=C>b5Ӎ59 8Ó waou9t;:3g) T 6q )1d2-> [6``і\ nM 6), Ҍ0“  8 0)f2O E  )ʖ)e}"0 0  g?s6r_LڷӚJ(zH>dS6 V"ǖ?1(,A~  x ؘЊzǩ²\h| UMQƖQyB&O÷O 8 (V+\'j2Zݖ1 @%\*W ^ Wd !/.~ 9 n%4 %WxqD!k"n9ٓ أrş޳՜- 8 yβ\Tb f:< f.‘ KT ǘ[1:8_ **2%;#&4͏4!< ] :) ,3o>&k83h ƙ增s|$T.-=56w8N+)}5l1< 1Up>k⮑x+饘#B0uנj,햠826.=6 2,P0:,1V?xz _H9BǠ;((] o .'u:51;p? t)L_*zT%Ȋl 5 2y+=׏üƏϸۿ߿ƓtG齖~i uo cQй'EvB& G?7h+]R%8-, W A.%$Ę1 o!)?ՠf6̙Úfxqɹ.kЏE4䏏NWh5Y(/6=R?Xɘ&U/W+|=ÿ`BBMq@J" T` &kr̛%O+X%y!jT0P 1Am"EBQ G:F)0=Q0f׌ V'r9 EΑwnڷ}V˜#} .f*9,#cďm2[$Du !_ƞ K&01 0 -+r6 ;':0= 8) ۑOZ.5HZ;2k|uV" 9 JQN簚ݏz+%Ȟ Em/< :u;ƚ3H> HH  kpU(Q!A;,M 4 G,*:1<3u@ =;6&.QUks])Eq3Df ԃi2+{\d׸WI4簠9   ,Wxw7)֒W9쪌z=U!-=U(. &*Al :j UP b%_ ( Xh%F6XF]䥖 ^Hl!u1ud}'g 7$ /x2-'2/ "4qNgMVFH$[/84 }$+Z 7=W WF^73$'0W6N`P=.3&F(P' ,!I* dGA `X,rdɃ)ғP*]\> ,F-m= Ξ1&w  `$.Ֆ7 <0?5<'[t*e=ÞJ<䥠 1 kV6;e 6 hXdg ޚ6m)'c=$64 B)撌C}@+>-d?(2-2< x: 1r$yS_#ͰfǍlǧ3쑓5iɻ7B  |'؏M25>>" 5 Ќi~ݞ%a7*?+8p7 v4aU6" 5.Ѡ܎6A͏ 6MCip)b 9 /3~P})N=U/4@:5/7(/_ 7%$!U&נu꘏1. 4 tMqw2 b9 6 %b_i5U 7/ cW q ydGѳ͠ 59 R h̬ZӠΧЋso!׏оPݞQc6Ocʒ`xpE!K`έkbX #S)!ABT !+05+=(Kp~4%9 y7/8o/5'*Q(i5V?! /x랠J/퐏=q#\n5–  Bbp~ Z{N鶞XNCWA[KPRO֑.&` kq-3t +p } Š .VI܉.ө[@Lr q#)o$6+ Sh&tPƑ69dIxzᖠߠ @F\B΍ 3$R9t$ ZB0 q n "mџJ֑^]8k)tbCR'ns W3/5–z > b+n7 y %7;wRwN{Jl sQ\!E7kPdKS.mB (0–R Tq >W ÞS?6я788 Xo3՚ & L$ j5G=;p> @Π$ o;%Ǐk 8  7 dI 4LΏ*Q a#h1:簌y 2S#h!E+)&  ΑJ(z(8!}R<*(!먍 % c>Xӏ )a퉏An:Z@%O"b:hԺ"o-5w, 4-/l \Eԏjļ;9K(KH @0/j%  k ;pz)#/FZ1RbO-  g#F#-Z: x; Rя;!x֍rSF:%O*+V(# 6  "2s˶r 8 St!z2r-!š_6 {p# [*;O  2 bCjd. X%яӽ晞qV$na 9+Eg'  ~H W%8+t;!15 4nWJh"㛚YJُ͍wR 򻀐' >V" )t:YVM I 1I/ ՚EA x 1&[,5sm"'b*%A % a4]/m 4Z r n~oē@j#v՜梞$頻iH @<~<-b̏ >3*<@;mt)ܞ %J;9 23ye 3}\8G*;}#XBw9 &v o?Auo!"1z ^&ebmisN) ir?'9iߑfkސ sΑ ŘܴvD#13w,60m-'" uF92⬞jS ڏs=l\`$ῑ`h l1` e e k~V&s T/S7]gϺ 2φI'ԘsHן| 2 ޠcT&9kD%B}z/ypۺ,8XxꐸUYKos`hyq.W;,goM(隢\Cs7/"ZNzo6 C6x I? 59vϏ A$؍  -嚄dnG"F`$  vs7,yD.co 6 ( Oe/70" ' < @f%.n l &jZϝwS  1/%蘅a9~3堠m(ڏoݍQ.S !Hb "wK8 XtTG0J:9fQ&")eZD/AHJuc / q ;іdz,H vS_if蓚Kh k.y&%8%I  P tv#"(~WJ w%/Nߍ j5unӦ Ofi?% p)D/ 6 TKNױwC1]NKhkKnڏiӍs G͕e3Jܱ{8  :|&+t ࠴Czah؏mdڍ |!%%X+]m,9 F EsP6K2ޏr$%BF;  ןy{^a瞉f m b)&= eZ $Y呕1gԽ7A}鐋;Mp #9Ob$ӽ*$P^[~ߌ菨*A՜T3 } K!%. 9l^푳C]_搓(+堕5SяPcƍ FM H@mruXӨa@ފ$4 a4O"ec_$: ~ݍ0W%ۘq:羁{,/yX!L퐭0p H#M'RX {* S-gCg1{8ݽV|QǠ ( % EL7:/R jq*CfupAǂoj梙D{rs[&| zaM/U(= H ro8l㑻@]oIݏm## .TNH B&F* {׏( Hkt[$Zv 6oFd駘ޫ Ukfo ͚Pa @Dn*8)&f-<9  O(+|s [/) f /C:ݧJԔ;ɏsX闍^Jߓ"]* n: |  a!)Џ  . ,‘Qu#xq%R aΠ  /O & 3D烏v1 {)ܞq\t14":< +?f XyQ \Q^J顊îYޙN,d۫<Ah&ɓ # Ik ߚn['3݌nᅩ1#oܷ7PBTIxL(B# A"a# xzٚS%؞#կ␏/WpsS("`sZ d!, i *Nj0ܗ8 '``eȏe<L fEn䮐ܧk=ZY Rލ =ƚMќ)<EU !mؖ3":/.=!⅑}6)$8"h A+  G3w ~d*3kh7n md Qw}Muwr ~%E ]0: BDѩ⌞[ 6ke(!]l!4>V( m#TT:ZD ٞ ")]m H^͚~퀈F( u }?%Ry$@Ú  -D;)ZZp& i^͑V@&j/, V h>} H0ΖA6o️pMZ ;lګuЎMA+>{R΍f1&1> 7< oZ#G 0J*p*X-z^&a uN+1ُE {  Zۑ^.Ę"X)~  @0gэ )\tC`ؚtp  kȰCv1bđ @-c*s?B zڃA ? cූԶyVWec8g h"y'Q:"%5 +"E ȏSj݃E!Ja%kVS7lLB*xk($ m, x+ ]:3׵;)Ő]umJ+,\J.,˓i "Җ3dFq2яޕs5$V fDR^翐:| K 䦏铉E9 zGD՚'f(^Fː)t 3=Ds`@m)#+4[֚P Q9 W_ &zI"% + SI {LbU 8%KS!"0MtoY5[97E5\ 6p  YWoJhP#/ _ "ڧY!W {lz"YedOm+ "w"Ζ 9 0,.D /"Ty8 ]ޘ!K>Oߩ_QMV_\?`%TL'Ҍsǖc!1J#q^ޢ고_w{ GW % s$m rgW|QŐkwZ 45L"&ytN. } 8$! z  ֑1 IϘ& C$  t  =E egoqkE 3~ 0 eh$2 {6 m p y !6T2T1vߏG` 3ތg9{1R؂3]k&>{,:SLa  !0)ﵦ[s7 $[+' % ^l5euP%F."&bvY(7W AR ` o$ud~F9星~ IA^*/"椌s␚ܯZO]%,lEz#Ֆ ]  ( ؏ i*#Iwc #@!)uy(;-=Q1[8 [#~ =޴Z4~\//<)XCe^; aōD #{ };mݔK`֚$`i F 6  mť~niy>Q% ١@DP={= 1!O%g Տ 1 M S&, s3Ì $ HХs8f&ކ %n]R!=>.". $ p ? h U ݈U=R#n sޠ ;r !z CKcKIRyP f#!#Vwp# ˟ g"Wf!%/Ϗ^K8洜%umᙌMЖ m!2m\ᔔۻ\mዏ#D6h4v9 ${5)+8',N.%#n l|,C\m1K(R Ξ$ÌsmN v#Ú;kɑchQn YcO`ҟ2/SC"*,"`$T U"=wC ej}䃝,jI cwoJRe^ # 0Zrbw c&MahMO5‘~8ܭqj5807$# ! $o ,K !݅~T?bC/Sm#5'5 eq/0X"Q ΏNˠ d+$y XF#Ưmv*T!=$XN:&g{Xǜ"9 WjϘXDŐq"iih_Y5ޱ蚏~e1ΎA=죠(SĠ OwϏk>7΀ǵ@#wx l\ hpqrI@#ޓ (P%Rۨn%f'!eo' i D  T"9, &N` "Hw9ꦍY6Sپw'f uXZ2w (! R}+篐@sEP<X`<:_LI  V gg&*s#z )zxUCGڨ^䟢3O[heݜ i+]eps® *pOEMt؈ 眞 ?ˆ/|3٠%O寏܍˗00:^x墌ש bdeؐ0:豠 f'c鄠sNh M%韎T.B ?"vDn.$TȠ~+u0r* 3 m6$מz7 x"`-K@oiqޑpښ" w oYy 2 6d" 6= e&')y@r Ֆ5|+d^Y#a&+F h0a 0~@TE\Ug51 ǐNJ B3g) T?K/U2(*[H5KE`lQ7(ߊ&5;傐ߛT j1dQ  NNC J5"ső "qNԀ!5M)GAOAcF\t q%훸 *]\Gm  d ƈ%BBC K=hQr8풾P$玌\ߑ% }2n[ ﴡ;):\^5X_p/Os @ZNg  f?W Df! ^E;~Z`2L7 0A -w uy as$g X Z ޑ +# n f@dĞ *o z H̯1ư5!7)%< jPkv l!~6|Z">aARJ"v_>&' \vX 74_p`/ OY|B@ 0ifT>~>1FvHqa wex1؎@L.єDM;QqOAgQ): Ӛ Q"g̞!" H?^3zˈSc0R졍jS0ۃ`G7$Wxۑ +!F_Pv5V EE UPLF0 μΜ f1 ?Edvd./!h"USni\v?ЈTUe'+@6@cޠ^ L`XNN d;C "S/!a.r M*ntS ې'noTbmpmasBߴcQ/{!S}{<šًJQ]W.uZx|`tޜ`fC<l&z2Igߗ/%]u֐rpH M̰5ZG^5 e߸U/J:# q y1 F\fF \1&N9:(y @@w^}9W8=ZeÀL@/4"Ʈ]VR#,*<7z:M-UP*6'^pſo%0w`UAУoߠ!VE\V".ɿ gI ?OĞo/99Sou  Ot ^ B:?P*g Lnzy, ?Q%G("%[ uC6. 0-8L.2.+2u<6-;<6c0((62e$8Z %<3${56)U=VT5oUHUőEோ< 0!= "q: u?3|6 o:";=|"Q=!ϐߢ۷xˠHYÀL~1&'w[əU}LˠbͬĠ{D 7I
3˂ N∎>f2 \#>l+ŲtݏM]`%]%VbHSM՚̑i%%_=!"g: x?37w\. 4⇄Ǫ= "=Y2i`D.?4[&ʀŴc4W,ú26 #7!6=p!"V= SbE р;\ V4Ď!=4 Ֆ#83?V8`ýހۦgh{eMkɯåٳܨ`[ʡe=a"4X3>6["I:5j?3C6sǖ"h:5 "l2<"RsWX'27:<';#9< 4'|>37 : $֌?ňGK7=;##? c> D< WQ< k>2a< y;#wj6G[ŧܯy19L۲Ĺx)˅˰*>? Jyw h;s=6$53#{ޖd/ǜmަ$4U<;"=1<U#Nĉ$+"' Ֆ:V80=B : "]4"0砑 ýi#0 WI::*[:|8$?] ߓ4~'?u ǖ!<=7*NŶߖ{~޿0 61=οE&!Q=ØN801qK<3? p% $S²7-̚yC5& =275:ذ? ֓57%"\!3">EV̑y$FԚ>>&і> =2N<1"':` 81lPĩT4ś±T# ̖ =6l$06{=X+:5F&͈լìdS T.Z0H4=6r8a? ǖ 20CˑlveT4=T!Q14xV=،8i0'0x XQ¯̙Úg D튧r"64@;,#$ܖ>o !s\Ż'5Ψ`'p<:#N"24;"%&"!8/3~˂҇JlrˬS "[&5ӵ<;&#< #6y!:f'֛ӣ4S®waū11'%7/$4 ye;Q#`98V.@da*9:,nrߦ?%?e m> < ;:E>2=:00dX!Ig•›ܙπ8>g!""=67)=s ?-ɤy+žT%r7%11> &!!:&41?$= ϧ:2SR.?1-T=:X7>=+| &VŒ{Rؔd&@:05ڏ?436&=È #A ==2& ,;5`ɤZ_n۹3ެc=O?89s?J&!S=68 01k<ݍߨ0ƥah* 'į:C=!=@"6l=:!4:s0X=Hs(̋p~t"Ə< gK806L=::"= 6~!99Ǽ$ÛTσfo)yҐ8# <#W7 x$4d'?Ҝ+?"6 áw76s ϡ%A":5* K< !v=߯<&#'0cȇ=?[Ūdupy|N>&!n"=b ?0z0%?!Ƞ8#GS{eGϏIóŬ{>P P-3e!E45~þq~PFcƒ̲ܽܰιM) fu ^~g# >2>b: 6ٖݡ`kaΟuo`͎Vڌ޽v8y<'62? @8 ":#@+] ݑ*Bߢҏ>%&&>9%#Ϗ#A-9,-'5#8 (A/t!Rɑʢ2ӑҡ՛Ъ.I/ޠJsZISQHLP\T}ZRU3_;JYXLC5Nƣp'VޣzM(sFmGEI]xHwH|C-^m[EvGGIBs|l0KV誗Чt^ }xYOZRN9DKB[BLnNSIH|B"[q݀Vl{ϼݫf&"{ԞSfxQ{DCVO@ @JmWUvKzH@GJy.JXy.Z,G)e萄ο|5Զ iZH@9OfFrAIMVJ+yA5UJz˖[UĸܚMť͹ D{?Z$플EsFPVWMyHJ9WBULɈ{ J)K(FIѻϺ?{?閪n^*x6s[LxJCNDSWFcBLNUS%Ix|)D,A(}ӪѾ;퐃ս$ X%CWKRW&JzAUNJySNYEY7]+>3jMO<{tZDt[xLL VMVxAUTJTGTOE^յ썲RJ뤉鈏\QeAYMy3HU^JydMODXWF BeLrZQ(DC ȶښ3MBث i"_mG!RBPH VPVMBvID@KOuT2IzgC֦ @wzڥ|L dV7nO'SYCҐ{LTKT@WK|T0K6r̞"[̒U@eᶄ䱫˿B9O`xHDyWU)LzI.D@BzLTH֠R[iOG6BSQꓼͫCawfShT D@oJ鮎zHbGڞJYVJ}ws2RD𨁼֨]Gh \@ASCkAIlVVMVFULUR@DB%ʔHھ޽SAW{'IRF}KPH|Oh~{JBH| NROQ>Ǖѹ2ܷ׻92I|xFUJzTLZB-UDK@/rOMAS8M-zI3@qK9̕6zDZ ̠J] KV"V MPA͏HCGA~IMUJzAV/KEz4VK!5ݷϨ稢^EE1jSLz|IDAgyMPVJSVA%UJGD\RŏYZVV8gFדusyP¦{ؐ"VcKTTW2ZNXZ6Q[2N.`i-o!/w+1&s ø˞ӥֆߝqj{mGD-%&,*3f*?B!Y0)*r4+#2К%'+5]и,sbֱȚi7Y̨ YLp6:+ۘ`/P%&*p$S(*">!o,- 2+]B֚͐n3ўnO"N˩ČWͨA* *+8-2#2!1֑+04+.D$'J(f HQɁճˉWhՖˆӪܙueߕW !,u/0-**$3&&,13x*8](\"j*;φߥfofbWB |ݴEG嶍-4,fiL&@+ 1t4-qtP*&5-s3#1U?ٗy~}Ŏ܈ʊޞJȏs`0*a#w+-2#2!c0}-2*2i z1u(M6݀Nۋ䏍ֺȚŅˏԗ܌%(46N$h49 <(3O*,T!U0<*d4+#5nyւΔY0UߞޭՀɣʏՠیkɖL)=0,13*;&,*y4 |J0*-*0˒ܖӞ݆˹߬Ӷ˷ַ¾ 's5#:!2,[63-/0n13-d./&%,y)6כ샱ڗҔޏՌ6n ,+-dl{C&_7!-n6$3[-?$Y()"\!(,K-K3-*&&9# &݉ppʙ01:_펐Ȝ@ӓڠX61j&,*3b6O4 "`sv/'&-SA:Ct72U$ 4'ߐՄ8e՚ڙkؐO,%({"Hk`3*$3"&,1bim(7 d0OJ˖T NȚqJғNo@QՐ1(-7ܨEÓ'0 &+d#娜0z13 /c-13*'%|-Q˓ A{6r͠つk`՘)˲ތX0A34@_3"& 7`-'&zuB0*14*n'۩ֈNͨ`Jך6'ҥFYEϐa߱ӨpР n -%->3g*kr3+6"N!F6Iۀ[F͉b`[b'>Y#dy肉֟K4>rw7-3n/20 dZI("fӏˡԠ˛)e_`7"E;ˆߟW7Zֆ 'R /7N 8";'o;q9 ֘S&<+/b";%<.>$1h;خ׏BfÍƗv)ԓLwÖRʐܴxÌص8';j x?<1j&c2388%z(94v8K70)=n)9 (˕Yv:t@ŖoԏaCG A=\,=4 C_+'= NW >b G#"I0j :t`QW)=S;BA 7d > 4Q%>9 # %!>&  >*-@,W [#:29(% 'oMjN ).@Zej)L)PUQ%: >E<.+;/:8)6;' 0~  8= 3%."3%%>0< );Z͵^202l<%3v? 0>c0>C"/׏aޜ3 >9(,JI2G gt'4 >t. &aΏo 10:Y!'Y.>["7BC <2>5(u0_=q~%ca%m s u@HxkCh u=B  Lr /ܐ< o<3 N)Y 5 ˑ= +CX?l k0_sB>^|%LmCADp \o_t j;Q!?5q5i %6?)>/k *Ü\c;ExAGXu.E Yk<^o#? 84 5? N >>U6Y9b| y=`#~kd/8yOPkPKq):3'%_> Q G_-.!  1_YL|0H Aj%zs x=jv0v\xj ]3 O90)A  q w=xUb }(N ca~=o>4p,Ns 78nh0 ENtw4Um%=v%ّgg}"J;|UrZggC? Z_# XpC%o\1vu쯈-2AŪ :  s[| X" u7M :7 }疨/~iʦ$'FkVGͦE!+ UP1 1P  g[;bE܏0>э.*< [,Q5.R,&#.,:(,-=.I8T.S!0 Ҵ++Š'Q;<1(!d)5t(}4%w$z޿ #M 2 6Ҙ#K8o?9g D~cѓ"L-~n )'4|=(pҗD9_Y>Yy)پДҺ) *+qJX-]JeTwL#D/D )K8Ac4ۀ тߚ( "C>J:b'Ӎ@t26.M%E>(aŝ܎< $֗SZE)]6+x1Yk!˧-wI?ԧ68q'0݈,ַ8>Qx3}EunHAM'.ɡ()+/=3U$^وLġ1ޘc7{?| V>>U%5Ǜ%9**AϠt$qƛQ"$`Ua1&a"萃$u ԚK=]y0щļ >(,)?eьd'am}@4+--|R3 *&(ԍ .BFOuջ -ANNֻ_ m(`N@#(+hRI6#' ]ߍ1hZp{~n؏pOOn^{_@hNDNAsr ' ' Oc|{{ Iu ڏqJrR{p yGvyM}v|@{MevnCqv⩐ qO*zJnD|hIa w0Kzug`OO1HTyMvQdpv!|ySaM.~i[uwvRHFMNR$IFLS&EXUٍfgby~P(QtEa/DPcOSoyd|OېJ }|rN|HrH}M@F||U*c!:X~RaPk/FYxDpF~aDahDwCP3E@ tESDFZAQ\IV(e{S' Y=VzlPd[CB~[:TQ(+BZ2L@tm\IAڏ 'g`rW^~Bj@<NbHGu^ 2%T#.hQLT_|5Mr1-mi0QLFz^rq%Y Dg0PyQV|_xS{|[BzF~eEq-|@.cWxo(Ct4b4}LLo1kV|Vd#b &Bl[&TOlHMAP_zI] n#rN V?vf:N:\{&C[$BbjnOi" V,,cQQHO#B]Z`o0zs~ nM R&Ύ~*3-FuhW ^W2WP N&;c+.LLK@w|~݉o$d߹`MF]S Z, '#1<ލ!Г ! ni f CD GJ(9; 5  J7!9-d_JAC}zk 7$:rip`[CWIAWQCVBOC[JDZ1(a>&<.:I2+0,P S6 +2/(, ,< [,\U89ܒK>:1=9n_UDUc3Lor{yS쉍tBD -tO/"25Mj 觖S? 't,J/N/2Ҙ49Ր~̭֟ȠMA*1"8

+ 9m j>G+ yX@ɆT]ҟ"f_2_ZUO9IۖRhWTR\o*N9ѻRߺS֡5/QI7X ISSJX[KFPFQVS0F r]Cmjҵ%[XPJ@HYYg[.KYg^xPR>5tq>R̙`ߧsʯډ9QJYJ GQ hT:V];hQ?Mī'ɻwNI._dPJ3XfFPQEJT:^ZU;a˞֏˹q7]M}[d[ZSZX$xbK{\ a=Cߪ!N%}ɹ`?ԏN[Z׍UFUIh^iDRaiՖNY 6eadҟ;PAMRwYWIHUgEPkYƚS k6_v&]ԠZs)DK+TK:_HTƠI7JRh]PV)ɭٜް>]"'$-vVؐϧ۩̠ΰ|vِ!N9.b0~%Q3u.%2e0)X,_t.Tݪ_|ᖃP͠_Yм0$ &SVˏ(z'1Q%$./3D0̖/vّۈه?`Ԭ:W%5Zr)d3[.@3y%0Q6=NWXh՜ޢqtҜ||ߜ֏YS!N%Z+24{.AjSZ4CTߘՏގɡvS }e.O"0r C2x*U353):wP<(4CbF؞[ˌi# .l,2*y 19+q6YVSȂ|mՕ`צyҢ^Ϟ. 4@!!E+6]4*W^)"+V8ܭ8X@dnMӊ*K82'(4 7+65-"v)Z$.XȹՑZ߰fԦsw!.,:E4)F+7#). -Y/5I$ۏڇAS 8aԚtZ9,Q;4!$%/,B"O ϙ֝5ߵu؍Э4ƖVi+V4Z+q &79H+<3(_?Q%gڝŖݥיǬ.Y+"5=-6b/5|%4:,. !ޓOƞrşآ Ǵݒ0+/X(ٍ#%7$)9!Qh#7/?s-͋sPzi1r, 5&c".(/4@ ol@.jUΣ!ժ Ґ)d%O.2^3.>뻏_ Cg>QБn`ֻ׈4a/V!OMeY Qݏݎ@/"%o:z30̨!`*_!OVHّZ E:CؘƧʣjNJR CYqG0T3 t?t(J]crVOWxYgJ&ElERmRA dmnj7[DKߖ\`GoJ؃=BBV#KDFWטs٬Ql1ɿU)IVGCMD䏢Mm p_^DX$cҖ^Ihi @{cZ;DUpmX ^6S>iTOZ^2ui5AC\N\fV"Skr=ѠCMnER^_9gč&G2Ǔ`]/lM^P!隬p0} rYҞ3mZg`4_iR.r振D4#c6SUϚQjT1 ԰gΑٰ-b\Z^YP<S4ۨ砵;k#b.6 #1+$N ֜ХԠbГ]O)&:SƖϦ ԦgM8+e%MɏދڂQ;T5`({S5~YM%6O7!~Y) [j?*3:W8&+D s~v7b(0b$E47קNoѵעʉL/G/͞8+>gmևD1g7z# %G$–߳?;-n(-.bݟeԠʾ~Ţ=]85p$=#["P'Qcِۓ?))d)<$-i(0$U:ʖ_O 7k','XaЂE$R:/G+'$0ǑѨ'|Yz&d(3"ǐ&(:ҁİa +, $&..eTO薓5ϖ11% 8;*'¸]XMa%/&.:2&_ъ a>E 3"y4ImW*b ڃƑ<ӨLS/!$}!L60QɎܝ 0B$><%)):'!|ZZE!*4( %|#qDLy';|"{=!?}$&=tЅӴ q6"?4J+6mۿ' >(.RK`(f0gDܢٛB&ޖ Ҟ75',D'XAМ"w8t(+'w$91 ˝ ؞9Ø'(A-S+ՁpTΥ *+%P(), ˆfUհF3$g.i:˚-!#IΘ Eɹ'̏!&,< 6ӽ'԰,9! <,6xŝ 4<%':'.߲އ@5LB+p0" 9 5<6,.O鳖#+q q)G5'<~#ڨǏ;)G95-??وהó1= - -l!'@yݩ6 "k69M67=Ǝd0*>&n'c?$ ؓ  yʮԚ ^, <@oǦƕMfv,J0u=4>'?+ )܉,2>5/(;$,#8/pO­0#>/1"C'׏!)46?1(9/?LzOơ k +6$+?$&&r8:F7Ə:9*~4 C D#M8,1,h?߯:36Ɛ "&fɿ٣$0&>50;?nez=1v5E&54g׏080#p1$AɎg< 8(A4&;v+yvF6= }0"K6)TS6N066:6;);N$^dt¤&5#N۞ŤR. :(9,&?b! 䗠oϾȌ͞0<0'D97h@Ŗ׺hZ965%m($4 OFʾVL̏V6 >8*C*ǖ:,G†|=EpC##9;$6+% Uo^74!@g:і(r3D<%JQXLYe'u3x331cB7?<89 0'. 'ԽbJ 17"9 0ứL1N::=25" Ԡؓzۦ,|5J0,|6N9-3Ғӓn6>3>;R'8=U׏[?lX0,0.90!׽S n=j5(0Ƞ$ԉ%a_6s940L.;|ѳѣ68I'=>5L,͏&pY΄)0->0>2%"'9$+q9.37 ɑM>G/5,8Q*nջfw͵8M 9+3S?isƆ!PoşԚ\2G(b/m3E(t<25H>,3x86/e ʩQ-(ݑR./ =#M9{e2~&nɻ1v8H/i jɏkHU.T0U>054U̱1{//Ԗ=;xDr/Ɔl37=;775PЕS/7/ K;CyZ"9%7R?59ҊCNZ}3=4o^Lv6Ӥ2<"  c Q,, R?':0Zޠ.6 gή"A1:a Vc \AdȏojH ?[ `_kÖ ":iYWx5W6> cƠ{yU,6{CW|A rulpNxs+d  |#7/O=BbR˜E9o W=5p=+@ ~ &NU_9^ K nH~ό 7A 6;`MP5D;@02s<5 wz ]i)>R6sݚ 6$볏OdJu9M.-^]J ! y5l. 0 ~f8+h#.({ ' ʝ]Ƒ3Z  5 >t9U$1>~;i伖8V8y 5\ u:Z a3u&*B G"-)\cC ^)wʈ,Zdu C.5Lȑ拑Vd6&Y30Rh&Czʠ!\  ,Q4wݚ Y&~6Mwm 7 sj4KWj*N}+wz ;א6絠1Ibv, x3ts˧ t  " h f7qK˞ Y ' &˝ 8DB  3Xp>JB? 0 z~~C3 L `Lɞ3 -0aざʥ 23% )SAa&s3=x8yV  ςV{f UP&Hal [ >֖.3/W!UMP Ϯ, j.C%1M$ !m+5,YЖ# ,x%.⡞, * Ì>-IA ҫOQCdOm| '|`֏"y/zK'Е,sH"},D=^0/︚ n!2zU,Br7 Y阏z㴍W%+D- \'}98x,r &䳏!ٌ2M+yL w2g+ um&加A'|䮍DRd)p~Sb (2+lAlW*Zu(TW ? 9)k*`\HJ5) ?Ŗ(_he(.ẏeK3&)衚#B$ B!bT]쓠X ﯏q?۹5`Nyc  &`;{#`~ u8$h: H<ۓՐ8  \e7\n/5 $Tq|fe0K7 r#P.iW>i* vJ$削_0` M$I Ԡ^P꘠^Zwlkc2.9OPNڐa# >m WM2[/ "iRQ/#jt#zQߌMV!"6$" (o Z X,ÏIR "PLv! oU!jqޤ艏Al`Tb Nc!8) ' *1.)7N  c+Zyn~pq q m h3IT)*p)6 Q C0Ġ^ \0\@ b /61$,ng_`^LC\C]oBZ\I_UeD_ +/"83n+ <7')S2#0  I=+ 2%05#*9   /-93 <) S,/W\$:,-@>6 >5no1fq"y8E_p[c$d/t猁 S A07XLcL)c  06*.t[_amߓ5:6#">#n= U׃>֞Tߦ%Ϋď70S%Q'VNYL?[JG9YPr. )yr*ڻx@VJySNFZ{ˉz*khylяK@2BUACLUQTEsEaQ+mcGXTaO6{J8BoM~.Bi A2sp|Q_8J3ysTNXDaX @ Nva]FCLcUySF.~Gx %r}CmUF8|JBB}AYQEiPP̿Τ%$)РYR/I|BQFc~[piXްػL*i싃%\}NJ@ReLED\CkWIJ* 㤖HAVQ5GQXuJvMM|XԳ/CLæ5-RANIFGUJYOs@ي%;\r{^-. vyAUKr_@3\cKCco#7޼~u#͎$qnU FVA_DTp(ɧ fj,+zTJ]VAz]A9:ͤm0x%캥r6@)^DiUysYGV_GQ71KQyvڽPJ o\pyUATY^yAHz65rlgߊ=,p@KZfޭG5[ [ADoF^PeG`-g>Xܠ l !N%ULnC@BE@LMo g##aLBkL4BgEo7[YNM߷h@HݬK{]NhAJN,UD6B3ZU9ERגVw+ MAYhX.tF\JWUuSxA"ͥYvBVFY^tJ_X#Wtۥ9 P J|_Z^tF[EH[R):Tڠ5STEZUX@^8_TEivdSa墘ϯ?QCFCWGNIe@E2EgѮF\X̹H\KyH\ǁJ+^נS#VY_E^V_Eq ASrё4?EC.짐J[TF[QNI{@_DH^CZnתnDwᨃ VBDio@]CrGF[ۯSWy#CwHmBq@uJ^MK^@\h|,9ʱٔټϵ=B6AOB]]GIAYQHǠgzŔ-$NOBMJ*A\&_Cwn@z~$LG<*[_rCO@pDA LsbȻYzlθsX_^A3_KCC@.ZFE^j U6EjAofXK󵓭7mĦѐך1JAZiY\WF.J)\G ҥl͒ԡ54|JE_4D@m^pUPH>+˽߭IƦ͒,I5[hPS_ ^_}TvKY稲 5^Y@n2[tBYpS@k#h\Ψ_ތ&q=Q5APA(]nCU[]d&=ϢBZ/]VCsHX_O\OZQOۺ 7R ◍,^?XTWCuI^dF!sSP򭨥g=@f]Y_fYKM?}4 uΦ(GJ_ITJ^iNZj[\ߥˡ<^@eAPpUoJhPY~D;q`ު!שܡ͢i!\K^l]vH3BT3nPJ&Z!󢹻R~>kSQ)\nQCN 0MǼĪݛFʠ;eɩE&^=tS:]]h-5 i_3佚Ew&7O"S_[JF_% ӏH&O. T.MS|B NysW)+[9>+ -pꬭ٠CV~A_OJuYUϧI]'DnWJEC9§ytz]qyVS= D b#m.TDPF&̂̉Or^~zT&XU -z{ Ci☪" :eF yD U-9 zW7DFTNUjz]mG=n_t${xNUaO|t+ADmz κ폏wA_tpoګ Ǯ"!-oVFdjEQ\EiˢﻐN%zAAI]F!i1ڒ谶KE}'Bp笓atm@@WwO?=춏|KkNFH?|٬곩R@r\+X;M& 𫭽?˨N'C C]CzȳͰȏx"\}FWz<D-[U_DĚ'rz|@BCd%Ŗw$Fy3Xlį.sUmXpxCD{&rJ_Y8BT^ob@q1G¼|ݰu.SIL1YpƩ*IUD5oPz$TnDWKqUΥ?!7eV)NUOh1=̌rjMu@SP:nm 6Ot\@瑴۶(ݩy!EJiCDBJ?8y$\YeE۽wݠriHA)\֤#:4CCBRŃuG/CCJ&'ىh J6LUx| }޵rgJlT]J񮉯ʧ"HrUPb5걭ݓ}]LGv[됴< O#GW~T ;JldCUBoYwBƻ I\@M%72!uNqnWSR5JVHDUEsX:Bɇo㾖y(DEE]4Bb< C]NZwTTիF*[_KUL-#uں"DqVDMϨoؖQYeu]LPIlfb"OK#[pW9~QYUM쨿a;uCU@A&g|R&W[CrRYoسx ZFShVE?;F~U4Z}[ggֲִ{6E'BDH!fB(;µQ]@YWS6E뻈ݭ?KUk3N RVŐSYKA2PvX8c5:uTGI^)FDʥDTZ H_+XD=`BVD*MtָsOM]FfF̖:驚_:}YB]w:mӸہOMM&MI\CfV4BN]]&Y֢vR+T?OKBJӬtRG@Zdu ܾ߾1JFOX>R%v4U.mLDQYwy}`IYw`T*WޘzZq\SG=s.)uY.ZSzV0VEG*D,BByޏD[Y[FaāڨK7X"kE"&QuP ֑]K.CaRH˻rZSG C$Xf$jW7TEB!NJWԪ騏{B.P'DLW3B+񠔩*YIcB]aLʨpYGZq}:G܏kw_hJIuMaI?ӣ!k_p]Eň$&ʼnYSAE%CѰ]ۑ>;KCZKN `àF0\WYC#ێ;Pm1EtR Kٱߠ༖`Db]D)q(!0uWZH\𩬦H@lN1VH5 ҺB0~v ]T_sg$= G%L@dP%"&Ѡ?&_j__*w@rדUH[ _K0o .XT_+]D]=Ɂw@SNTGa䳖65^%K^ D~J:D!ѽڥ歑ŒPXQ7_^Hz=։{;QSV Ds ꛏ@QIH@BqGuK!Hb]ȤslIHMK\򷑥Yओl9~U5X~KJ^_̯ѺfN~(JJOJwDZ1CVVqkNb-ߚ.E26]VhqD0"m/A8H]\g J%գvM%B)4\k0'<_zP_N@?GYָp(,e]3/u0˲6 @KH^-֡ ;AC'^|'[(PN'_gX(\خL~ؐOFOwFc%VE.ʫɠ3p_K_1ֵ}_SGP]1G#X5FR\HW=#bx0&U_^CזUڼJ]KQm4[Dۑ[v̛UNT2cEDLKpUHSQC96HNTYU1JcUՠ Z\OVlkN1Qfռt.COhC/&s!ʐ 2?WRMh\GG7Mĥ"Yl(\˘{Y@Tu^|Yq9pԠWwYG/rյΣ}#e_ODI[b%fү!\ E&$kKINaQP>f`_'GϚl9KKn_TB篑œ6@gS%8U*M>Tio1FȺwqϤ䖻@Qg[e&弥?t \R/kBĤ m@o)H.^"ɚȯU:_fT!UˣYCQ/JJ9VH^_5MR3^* Xޠ$;]uR)DWi3۲ @,oP16#\߳;գTN. j豜_z4F, 7ߌW"+_WN%FD쨑ȝQ#i*NۘΊ颐)HW'-Z~Ҡ󨃴jn$"E*chIFɓ`9WL0XU.͏TX F _:0YQc%^ x2FʘCZ8_SU_CP1Hl%g2Yu43ƝV(_D7Y􏗥IAQ'0:YȖ Y4X\al޳ J00_]ɚj^MZ&Vw՘D}/\2zI}6έ좄2 PT/Aۦbɖ\h-L8Wbt՞^E)JEU8_*EҨG&O\ /YבQ$Rw[fv!J E1/V^@0݄ԺĮQR4 \'+^R.lMI5ݔԚ6iӉ(w- _7W̏"B#s[i#bQNe2?ߘ8dʚm+ 1H/mԥPQXg2[3I5ciFܠVG''/V/zCP͆ڗϜr܍F+YJ7:+'-J3($lpʏb@ͼY0NT{̠:֌w\.:A&AJi#@:ԑa:W'0S"_Р Qi'GMrUWߞȓ+PH5gZ<ש^=|w_x$M^t?lVBÚ<_U]΁eG3$T/c;pӑGV=yN)Y7f[Ky٠=P++UM;Mһ}ٞ%TDZ94TkGϖRΫYb6Ra :ʯ$ڷӞ.7NxNE*i?RUUf9R53YL9>ƶKꍧ;Yas-_Gl[H|٠֎WT!7_+r:OȨ"c:_)VҖԩޭO bP$,)8޴/֞Së7'/` b[QοxƖY Y[K;*R37/6B֑ O"JאĨ Y$$$809Bµ ꏹx?~'<\R͓M$N&q.,,W׏a>-$#IN$ڰތa 5%/yCšlz,9d.-8Y;8\ؘ>M'72N6v޳֠ ;y8,YMӶ|ƚ׭BO'+n#,i-~Aݚ\:*%Z}h؞ҙ)̨/QF*"0oϖ}3)4]+>eNڔԓؑ:V';i(X5x8 s׀?*d$=)QbqkoQ5,z<ϓxѲJ͖*+'eL&2nߏwa[;)d*4x)wҵΌ[X,`6,;OkΚį 6a %"iջИ-߈- *4{;V項ԂӠtNx#mB-x&=r/E%#%Mskۚ9cb%$*/#ݞNэ݌1*+c.2NŖ,pVN"198sޥjՑĝ63):E%АEr+Q,'f%&LD83zU7# '߅؈ɖKSM.9# ڏe#& ( 80֌զU>F%;.š ΅q?;/&_/ژޙR<1"c-mL\ޠv-k/3ru?OPa</E!ҁԞ㤎07'pތB_'Q[?d$>)X* ґ(t'n q1fP5gՐoL&'!%@ώ٠luI'>'I;'K-{ȓۜ}S=*0" <Ě2% %785,$ Ïi`\=!'Y1PL߯w2!z-S ڑJɈ͘O^*3K!Mzԭ=ޠޡޖ H-+ k9,B8k(v(0.[˖wvCB1'ya*d nܞ;1o?W/:1QOΖo2/|:,_ؑbP ( =SUOݐ*+-M%z%Рfۮ" =,MޙƓl 0 ; ' @HFݏ,.K>\& 5Qɏ1؍u, a5Yɚ6ܹ;$` t-w$<( =͖=ܚ:#N卙%gԠ9 l:f#Y#,K4#2, &dǚN )$96 Ҟa2vC* %1 =`` +(.٘XN6+$ 6Y>Uڠ`P/ 9+#[&R"Y8ēK!;*;7">št #) -ٽ߃Hi)Z4'x &aؖvcrʚ 8C?9GpȑAV+2Y+UɠeSt8!s9Eݓў_97H&' ]tx;*54& P(!69&;%"Y}Α++;> !/'2ؐػ+7,:#ЂCί^ a!'8u,ι–k' %;%6' ُ*Ɣ Y.$>F#2;E-ЌE#o&.&"@I#½Tߑ0&05UƾĘ!ʈҤ%'9?!cDà$58 ,Rӓ^,0F%$06rÚ6m*#87^<'*Bޏwˮ8+8G–*%W 0 V%:k˴ב* 7::35ҠU.+[7[?;%ٵuAYƆ#m"]161ޖ)L7>w# "%:vяܡ̞6<<09%i)L3ΌU9}: 5?)~Zbő:z93. B.tܘkߞ|ƹ;"&+m~۠8! )&)ƍ`}ʠē,==< Ě`[18 +%"|ܭXݏڙ%3! ȖmÚ6g# tܙΠ,:5i"=7? pӍ9s:>(="xUǖ M݄R<>:Cў\& !>#=Ɍ"Y.(=I1;{Sޖđ@)6'_ؘBбې0> '4s%,֬ @=10=!ġؓ$!g=#'мߚ[ރc!3v>58݊ďɶCX/! 1#ܹ];%a' 0yȓcΦn >5 $H ʠށV,n9}'K"J5./ ><'7Q$K*9ܱٖ߃>%h<+ݏǪˮ׌ 78C$,_OؚqÊ {"2=_ɘƔ=?&y<ՠX[Ս 'd ?2f׳$>|31#U¬q76ؖ [F <*= $rɞ˲8;)t >iŒM+Ö?6E&T!%Mĥ97@<7('8 Ơo=Uܠ?I:( +Oߏ(UǶ:];^+{6d"7ŏ!˚1=F 9#Ϗ<5U? )Ę'ףx>\%%8MķɐǠ:$7 >e>S?112:d | ۙϘ 0W8<= 0ɽw՟ޏ;7<7Ԗs$6#+x'ffȌÑsi!N6&z6ސnܼ.à05_8)74'n|'!(?4KԖ)ղ4l>(o!47$#9͌;5(4+*|`7đ=/830 G̘c0*p$2g7;ʯ8ɠž?3'gśؓ>=;) I˚L€@;z3K0f% ʛ*ӏx>-4[45l4ږygc=:(0'<7ɑG6%>"֖̠[3?#8?BwA><;'?<{"HɆזr3 7T$799ŏȡWɞ8C%+<^мƪČ"<&2nĔӧȑ< f620;oŘHٯo K,?? vǾĠ[ 2v(p=Ս^:ړ43p$(. \+ΚOϱ'F?d?*T68֏Jĕ˽==;  ז46ݚD$K(36  \ub?,0*1^VƠ0S73#zՍ[ʍ!5 2* ?̼ؖ69;+4 0’Û֧̞'8>r/H%4GivŌĂ0Ǫ2*(? HٍԑϑJ0-8 n2+̘1~%1=?nΧˠo8'5рwғn:*$*=$ǚp9:$>6*9ȑn`t><.?4o9j>˜3Е9_͐-f,m>9?2tlʠT 9z)951bkΜѓ 4%.=z˝˚5;N<;l*A=*yُG7|:m6A=㖸2Wfښ[',83Tu& :+Q1WHI&W3 (vPz?șU+68ɾiʏ-G%8:?6ڏuNɌ[0.2: КL̪Z:-fƵN>H4w6w=<0c>זƽҽ~}91)4>wÑ5K4,;f+As^Ѻ RN767-@?]3P*59 ([|ŸЖEAX l *1da̞ :5..68!̈Z'&):-%/;F81 Ș5H1$0V1ųˠ$ز8-\7% T^ %z  p4\DL*35Ȱ ˍӖ_&*=M.;ȑg/:}7.7O S̒ & J(U`;;e0q(FZ=ΚvH 0W8*'g$֯/)6<Ԧˑ7m8 )N;Ȑ*i6g86˨z* ^SʚW4'7n2\1{+ c6{A?,1)ϑMϕwh d*r ']ϐoՅ =3?>sιO." > ӓ6ʜ ?*1 7DʏAi.2? %,ČU6.< )̌K6?62 E)1,+I 9CW 4=2< _O*>E;4AK8d2+?A2: o? ƞO;ז7o2:eԖ2,4@J(FU<ݗ0ao0_, ԫ1ɩ3:+7idϭV7I?-g5 דxӖO1 +jɏK3f9G6 ]ʑS K8^+9;'̐) ; ˃˓2?8, z6,Q >r0̟̏^:/3~9ѻ8W  /aČw=-4 >(0WƱɎ>=60bϋď3?53ӓ+z㞉)bוd:Gӎʪ118Ӗ~2x5{,< ^őy3A!.Vd RǠp:U3 -Gř.--D'WQ k.a FMYXƞ!2m0-Aτ=-t-1O/'\fW<]>7PE͘#?<,|47Sқo00Kh>:h /:5`α=}cT7x: `̚WP I0:2EҚ<,gz 8d2p9 -4 I=/zꓽJT0:*0¾A.10.ҏW ;6r;h!(X7N7YY/p = tkDz(G ,fJ  ZGĚ/s9<9{[:#g, JǠ7ƍ4Pe7 :-u#&'$5@Џ8>,!\B7-{i bN k=Z 2! l>xS  4~1 08  _ɩI M2=17)G/ɑ/ ]?Y)M0_I(N7H4;.L? 8}2ćKpο-4 ^ eS)ƙ S; Xu9J  ><m)~ > pB0Moy菃t5 ?'.Ꚁ V ;h>Ǜol"/ o05;Ə : ayV >7,q|=1  Ȑ:m/np>I io.|V*s ,`CN:Qc>pȍU ʼn>8 XRl菾9H !nsꖲeE 9|y!Ʃ l8]z b)Ï$9<  8 =s 5 0J L 53,  >B0M Wl cZW: ?č j031~ p: #=P1cg5c OS d:wvHFh4v o>ȏW= &2V:  JO)so\^Th7k=a^sBqs}VC]k ( g܏ƍ|; 3  T7z a6 c- ~6%z3cM >.o5 Py.N<QhNpfҏW 6-E:1 ȧ#d5V揗!`7w$g9 <kjZ qV,t }}.8-ˍ};\;koǔ#6r9,'0c6 ˎ /mfMO8dJp  7 j ƏVak5)f3y  *tbE\ 33POtQ S5yƐ$ c Rm7&a8ȍa w )#td 5z8UK䖙 s̹ES5 2!O~kˏ,_8. W| 6 V:d!-Alɂ9g9*VR:5 T {h(s$0kUZ p3cʍy  DhǘK/5qNb5*Y Hő `H⑈ȼIQ"p75  s%ʏv4Lnꓸ+T7j&L.1>0ͫD/Q p "(tJ9 V /R(!?w8j7 QLB̍e " / v^9i !^U&74 e p[".&NF-- J  8ȏ7A'H334f hck8L#qo+H 7T SC654-2ȍD%`;hM+Y} KF N8b4XgDt8\v"{N?DF013{;R ͏18\ 0 6%V@:J `B1dI  0EG ^i'}L-ˍ8s  j2)3<K`0;T팜̧U斉<h8 B$1g>?`z ! VYmbя530co ]n_4wa D  u㏘1$2^ {f4   g+1&6/7΍#M  s l6Ζ4rw'VE $22; b"cP<4;m &_̏*2^]Gu/`νTE v har̡1W_ /)/M0Y/ ˩Ḯ?=P7jΏSoE3  $E!d10> :Hx͹ q =H 71^0 =1R'/ ͍&u! )\͌Eb s]Rf㖞  .SϜ /%c #~"c 76׏ ]0ek4}l!t2} ϣ Np 8I\H0MlI2;㚪=Ug1weA4C RW{-v*HJ .Yr7эL aBC0cR*2 9| z/L O~  摹g1$`,Fa ⠷ ̏g/8Q]/N-'0㏽2?#(' eR&̒ 27JT[C;R~%6*Xn7>~ة( 2{Sᘱf2Y}cԏzvn̍ fEffB[3sᖛl D'iM d+wL 3hяYI"1tSWx2MX}(q t lh֋HgNͲ @ooӳk x-If [cn . Ob׍0 bRᚷ^ ?& G/08J2/g-2;MRH2O^kW2,PϏo2gލI,@1n}o(7ҷ|@p/L&XJ@]-JV혷RsB䠯+,' /S[h9Nːy)l--ioO/>呡2B'fh?W␟hԏq Xw,?nq-w䏅 'h-쌄e.rF7~-xy! TY\ wQ| @$+*6 4ԍH9h9- U*!ItYo/ҁ+ٱOmnԏfOf)%N8k ++SRJSD $댏E$0_=$#,J=?|,s0xq~:,4ԍ}j (JG 皨H+4Fnu?B,:%k%Y,MP5␝biTF_98 *ziSP,uԚN-o} ִ)*7iRYJՏ,9Xc T ^>&&Y(k| {[9) '(؍3)K V *y *%dHj1'5R#_  G )ܙ3jrd @69ots*'1N~  #W0 -% Vq1&ieiL$p F <+<ۏ qx& ,1k @g y%D]*O2; PN m/!&3 s k$<% ޥbB M ;頞) %-fڍG T! 1:%]u]Q$9!1  鑹sPM V Bꐑ6=_ڏ+$^ 3 % OڎM?CX _o"4  `&"A{k$[g$ s0ꢞ)tG jYm"N i%<? { N%4v'Útg I%`d 됲"{ZhIڏGpZ% b> $p"1BCEiTO쑃&c& $v pDv Fkٍ Jُ;)c}TN g=à3 <8f᠍|W }ۏ(x%;&Y9ی;z ^UBVھ)<`% -2!Ev 9 B+2ꠀ$ ݅+qiڃ9a 1@ i M%v?V L:Iۍo 9"F%c, =a$ywKf , yڷwᑽv !h 5lmKۏ3z# ,Kk6$KLK88]#hN" 7 R$DN/ {=S !ۏgC܍F [ 6=~5#va p#RM- xꑧ#o& o[ Rv(9"##P]Ml t d~!B A B\pC A_":RYb9 , & p*2~9EQkݏ " 5X=a1 "Y o돛˫n"z{9IS ؾp @3" x:._W| Pz E'"c_M~Ncޏ 1]( uqxO:!x_ ^s,! _ @ y(Ll !)*;q!dH4B,  )z]~ߍaO7  @`aጢN lMs o^E 砊"b-PߏB )9BG P8I7A2 .I(ߍA   9/*V G"/N)ᎀO  MHA@m vsiu炇E h_ }n~W\n垏n/-/3pleqWC_f_[@@]KA^_U@s^3$TAl|B*<&L@ T;,R N4: 32*&P5S=:R  01T=nU @ k, 9\]: ,,\I(62(>o_UB~1}plv|Vů$n7I⨠T\j =yʖq\3_, ./37g(`441ŏ>1P&t01< !n?D #/#K%V;-,9-4(7L6*sڪYҧ|3VMڬaɼF$ϖ;Ĥ!1tC,L7TPKz(LLB@JW0B U@2VJWU;Lz8ID2@zJLUDKƠUy@VJtTSEkcʩ骑 o,hڸk0k9l*̼ګs xRʒuNHfGAz`LUvKUE@VKKWYUL_B͎35VJKz^ULHBUrD@~JWTK{fJ WH}({aXVŷ뫺k5켝|7F""nu7XȑU4ǑMTTnO{IE@fzƎ0LsBIGD@MJLUUUHD*>zkLߏLaBUA@KWTH5|_wQ?ĸ$N>rs5pv>>p >͆x>s'0]?JAT@AJZWU K*yIGH}xO WS@WB.[oGZXV@wE[H{OvCYaEVZN^YBZ:ɫ?*3ď$tCBƫ3rLܥ͏,5/ WZkg\ EREP}E8YDF_\h&[VRfgZQHVH]-J8WؠKIUSB]̎cHTd;KxU \;OEq |m¬ݫϫݥFŊBƫvlڲlǝa@ QN˳4VO4KRdPHRdUR[K1Y^5SI1LU= 7- LUc^OUcKlT=]:IJ諤 Anq같͖؝ϮZ̠|&u(JRdYH R 9[K?Y^>SI8LU5~t4OR/LK]^SIL=U5bU#H魯K02fŬVgˬ`/~QQ!7ф!K,M+RߏYHRd Ld$M#YT;LχW(]^ B? 7RdYH/NJk-/"˚y/FC}jFiܫ1XBTYGOjŀQګ|9A&RGUPLKROcjYMOpR^ccLCUa[iLa]JYdScNnLTRbc0PdO&Rd4U@^8OߨRLUL^OTS7`Mצ4˭_鞟컣𥬸tDɧkpv_ Z˰AU:\7^cRLULb^ +L~^(,cpUOfcHTOvRAN~%IRxcZ:NYtτUy7c7̓J*v |2.;#f yRs4LMצ~㸀Ry[WhRdL8R7ZIp,4uĭV) T1C6ͥ\zV氄ᨧ.Ek%VzаQIgLQ .PO$,3.21(S-#8'++3E-3&K7f*64-#)#$ *A/j6(f"5)=7.=/I8)V-$s"hٚq>ݏ0ݱԅ֞cQ[OުЌ؍cDÚ,ݷ=ƑyˑØm͐84>\27w<;v#< 7!< ";5"37= "< >B= "< >`2<{ ;C#5#4 ‘zUɑAW˜(-$>ˠ4:â91<¡52۠3N2>p27o<;"< '7:<ʳ7T ;΋Өɒ<7f< x#  */ܾ(*Hiͱzht"|26 Z:"s="b6x=[:"i!# 7΅D!< >!/ "Z;$/X77)/I2Џ*ҷ6̏$ʖƤ3>>%"ޢ͏_Xiˆ{{ l84<0 Yz4)3Ҍ ";'76.L1V: Ň]=|2<0 8+&2`S:=9d+ξŎ/0/:V./1.U˱7n':Db >%N.3\*6'cdVtrOohje=\;T+Jn =pAspZ̾ߎH>)4\ q3Nhݼʢo\Q߁ɍ 56# 3G6;}a ᕟH:܈#&ڈ>b,h= eA= 4?;!=| `ȐēIU_'\4G˔Ǔ:X1AجĂ0K+ρvݏٕRlj.-͑1 9 %&9 ;Y6ߚ9>'e?'S=F+ 7*(14o8=SF0)7Ϡ)<*7}(a*93T= 6 ;?53*G5>p(5:N9-{xэ҆xE>tg̏ߚ?,iUH]DSR+UI3WI(T7P2E]X>O)j֚ψ•\-6;N- 1g,*.J7/LLEZG.}HK7Q }JEP'1fK3KFh."?EN[R[.!Gv.:Bсɑh>Vđ<[ G8\-8E%$% B NSR$C!M'R#7T#EoEM4H$Q1LQLӝm6"-#AN]_'SUKNZPPn?M"\RB'A$\N NB;?I;|L~ɖM;-t1=,v.(7H$2O?#;C< P<7^9E+E'}AZ0C;GkK(_ B.,%v2X1% G.G;3;F1,H..0p2<Ԛ0>% \ ]0GZ;R-QETNQjP[\C.'AOPIPQ'I$I.T00- c*"&+R#Z4V3m#;4-IE/S\RiV5QTTMUn8X^%A Ts!$TZ*QSF H0N'8P*L!);xC[2GHN31-[OX38SNN).4"[?#!8P'"4"= 8M9NCE:H="8OS2(SO;nMP&&XoY0Pl5Fg O:H C44GF6%BMn.779.;;d0-{$ \{욒:Bg-Y~0&ÏHmč.6MpS閘R&@^4\ `P[8# 8 PK ";& e ]?6 JR+HV+.V5 \XzʏuwmɍgtcYnoXw4g/zmnzmi maCnn[:6%EZdzutgaX5Ǫ$ ! S6tVqU0|q~/} mgdE`aWjllZ,fx cwCX4V6 .@хZ{Ao{1JVB-oE3L8/7 mO gBED摎rye`-mllbԉr{/hDlt  ,< a8-:!6dROtn27.*&M=̌$/6  v/wOY cbj׶ ̻nϊEGɰ呐(pVD 1  q_e4דl3bH( 3 `{2O+2ʏ ~ B (1s0^>  T]/,/c_U,溏)ԍ'8Oj–*[=.T}x$ 86) , եﭲWe('Aг߯˭ȱѯKנʮ찱l١ӯ nѭ첐m^D ۚ뱞²㳝ʰ졨 !8G/$<a<&7 ⼅&䡿n˰y a8жڮHNȧNEN3EeRc:fvf ^#4ƣ߻g%:9eݡ/ ʲnBލXR% n+rb`؂^3[o߱o#_׭׋CV󜕞o+RIypڰ\@)Аߘ=/UNz{l :>6EGC|r̞  &^Azz؀椚ˑ#듘 2'mj sF ], : .( & e%d W\ !(+ %* ;%y.a sM.}4c3 `a&xlNwb;L$z a0~!g0t`$ ?a#Z6IV]`PsV[{bycTuim[akOw~|e~prkVKs|$$W_ZHac[ܘܠԚ8,'SEHVDh}~w룘ݶܐp :%1 6  <  >j.4h j"  pk.tv c,pN_c. r~ \ KRG&V#!UGiF <>Y9i" : 1h-r_8iT쐗 pGi 1liwyFh. T!(_iĒCX>v"ϐ" Р  pnk!by {M![_[e.5" ?7! !  Ė!!y ,(  d\)G ;' *Wm@DLDnv+&,ppiwi]]PLAU_l^IABS^i+ >k+( 9+: U61E O ,,& 3 I5 > E 355 'F5;mB'- A(#1#7_qmpu9}rin9T[Yb3gُ#~׍'|sӛ5K珂;IG͏_Ti3Jz/`$(0;$9/-2+a2=b*8}" "< >` < @̞-3  & 1 J!¢p ˽" 1-<9;*!]ŋ+ʷ[I?*_"G= |?3< ;"5"7!7'Uf>87=>4{ #mVAC=>== ";}7!<Ҡ k#;y4Ώ>52u74j#1q.'10/OӍ絷)յ*ouj#F{F,K= \&'1.2"̈́-("!;W!7 $aC'ʐ6m@meenwqrϊ6 9ۖ܁54 V=8/;KN 5g`yߜ &0m'(ssb!GӁCA;5,8!c6I2V&-6Yqc^Fav\hqleJfnJ|cl [S܏†*9m=!v"j=ՐKe]N,=5s=ւeFx!?I ;6% 4|Aޖ ٠sps`zprDNcjwqf%}٢`)75+\)u$*+-N4$3& 0x,]12+"_. $-(r1.0%L3C.MOVY.~)}Š԰RѲ{M᫰\oYnC_Y؝ӞŝxᏫZz2ߖU]cQP|]\Rzw2}L@C.ILzQ!dYBUjL0pR%uLw)!j/"/E"+Y&-;$E,(62*/ (kLMJ'eP-]^-zlR@^} Ͳޥx,h/Ⰵ-'a!.:v)t)%īۥݧŭ]ʲ|kD4p-SNKU\*PZ=YT5UpL(RccPYfO\RdcQL~U[[OLV]aU.{w2^1f*%t(M]nYHcl2QUM[@ 5*"y8?oNKQ;KՌk@ղt`n؏.̱r)߲734Ç."IJ.|,a֧fg qX&"£@?:RNK5Rd PZ#x?NoLJUkcFPjM#uRnNzX4RJ0P X[

}ƲoUٱ\@ :WUoZ[nUYv)ܥV$Ӫp.d$N5O>I"JLRUNOA!VKI p;oOB%U oS&qp SOmR*cRU>\Z31 Ď@ʱoUC_BzY=UV_j/5ӝ0aįw1I8Vۚ9{+(?, ?OՀyM(=Be7NX PWT>k=;߀@ 0|,STH[W-]^+S]< tUQg/m=X+d?O'vUP}/-YbO'x?9:U\~<>]UcRL\L_a4:2c@10H3|/*|0u>f% |,g#`ε2˲|~'}w!9GԳő^׆=KMDRcW]^cR LUL^ OUNKgc^}w9NKd1L[^LR[W]Y^RP8":Ų̭^0X?RsR;ֲ6mlq<#hvצ5E)_>:VUt˱,d.IJ[J9^0IUK&JPfOU X]gQHfVFHRDXY#EF_Q*ZgWxSZ\]ER[kQ2GZl{DZTSCqRQ2; Y֒o\ľe-.¿w6Úk5ꑶp3&E5ڶly ֠,B\O DrIBH4N7WlIyCUKHfyUL1B4U6D@7%LL8B1U?@@!J*W%U K!zI[DK@%UL{DJBTd3İսϪڏ񼘷MлĜΚ񰃨缑Ʒᨫ;&Ǿ0#*LOTtH{@WK|zUSLBsUDE@JbWU+Kz5IV,Kz9LL#B).K>$5$Y:Bv7etDc Nr Ky7a l0l Щۆړ&ϖŢ"DGuHkV.VJzHVJzLLuBUIO^KzFLUSBU-@KU>LB ;Vdp9LBuU@Ca<0$Ŗعʷ̙̀驥P܋ӏд\ʾݸܽ#\; &|OMmAT@x@J@WМV-K&BU; D-o ְ PJhLUJsy_@Q=͒q]n¨ƶɍ΍$㷝Ҝǵᓳ:ԫɍ\¸Іб>kô ~Hp{LwUK^N46L>9I&WXJBUYKUK@VyK WfULCIE@KdO7TH}eZ񞭋GןϪs ~v?:W%_'ERMC!M>|+緮3pТa {]JEWTLhzIwD@wzҍwKAz3KUzIPRK}0S0I9b5ϩq2l=ߣ?To-e.d񼋏±OAJVWfžď" 󮮾˓SQ![iWIăJV~VrK: ư9'_'9h%8e!t.Ѩއ4] sIoKTT-UHg]wg@KSBU;ZDPbWU3_FEe|JLTK{CP$̭Ҡ&{O޴0׉1ª}쎞㾸̽϶`)V⑴XFƘ| JE@{ƉGARߤЖ 6ј}L`BU@SU<㥧1)l wgp.sRgF1_A&; mHJiez}c14wXf=[TUY/~+:]4<[L!UX xzH@mJWC?VF^>6ůָS85ʼ0&QۏE]{:z~*5{~ dRsRCvETT~ΑAd~! z,f:?r(Y\GKTRSp}ʹHȩγW_(zugpv=aQ>Ղ!Stּ}EOe@m K|OTOHѱܱENzTޡzpIEJWWUzKٰVkVKZyqUWUE}CJ !6L]A&p^OMD}p{]jms^Qb񓜧~І˩j+-RH]0ϳCcCZfI\3Qv3u]oWM@~zL^CJCYNneu׽y+.m-vשа2F:GM0Y0"&4:LDZ xC'KzP~w^VUM+AOJ zup1â Jp46!L&M¹YӝTCڹ$Iᅠ74*J pﵜ-9&8 Kcrf0~%YMѐáղUHUcJ}WhP JVUJ-?C֌FB-ΤֵgeCXh ^3͠s_ z̭p?Ly,&&3" X*46Z&%&9%j$$)?055> #C:( 979o06*Ց=+89.ӑ2sŨH*k#UPᖍC=s8f1 f߉ YAjZaga~cPrd}-Kꏎ'l+.g8 j.i p.o ݌)d d,vCirCF^$R .q铟pM !cL"pϬn 2̃m+gKWX<g.8`cŅLgryHg;䦊gLTg% g(p^Tby@coj~\t*mzm hgDpfiTgpzwJ;}:r~gqzSvVjOFE|zphWic=_eKUNK8vKND@MNKIJUl[CE$@~JaKfnOFBwfpUL@aFDNZ`]rE_KzTDJCWJ!PDFo^APn7ia[TTZACHllsSFb)lJQmFEjw)RUJQ C`JKLYF5Z ~c[䞽XVw(ؖr8|'䑜SϊF3}3 |;7>3b H8.<83.+x5"5j*6*>?t1%1W1< 6"?F <.!!b'"=+_<./8K 'ޑ(Gܑʣ՘˒EVА 󧠺pl~utvRvJ 4ᭅ `j1RU\"L^$YTNaL^Rtc[P]@RM"LLk>HLBYpOQRQNPLyUS[tP!]^'SR"LU:c^OUcKU\)WiSJ'D定jԥӧ_Ivαv 4fZYT99L^O*Uy zU>( z8@)󓬷%xEN1⵰e[tv͠t{}8U7W(Y#^:F]'UZ3\2S2[LJUFC%{zȿ挬;CPJ 扡rUƇ=ڌV:bZ7|܏8r`,@ kiz,n=c5ѥU%L @_|JWS3X8ڞް/-5C>9G/-, :-F_'7SYyWOL!6![=V-J/I_u@GU xӰVj 4XJ糒6U0 K;䛇Jǒ6g7>ڈ1هޟؐ;KUA;^4@x߱"t@*F >^.kRA'S"&\16OWK'G/36#* 4A"";zϱ/SѽP:>I:m҉(5e*Eftq5K@CND@;ŶXJʸ=h˻$jɿ`٢Rz弖Y | Hآ1趞Ӑo H39YOPt\?XRTWNP`Z(3.s1(!%2A"&,664U+a*5((.k!/82,,]%8a;%L -k#$&>)t?*`#3?"G!8g >37 ;"X=z"?p/ˠHPYEoW]HPyN]yB\DP_Hj5YtQUS^ABD[n yQ)jY 0.ɞɓ-u2` O?3c= ;"5"7!= "\"7U=(;Y5\Qm;]ļnWUm#@Wr,P^ ";i4e EHE*Y }o]HP]#B@R%+UM%'.3834!/%5.8hY9H% $ 2so88B9Rf?Ck 9 r 7!78ٴR/U95W :>:  */f\0&:# 0&?$<3";698<3J?_!"`: M?I3=͐4*\i]!6~#8%+M2SʎLCHoy; ࣐ȑTU<3v_63 1 Xo)B PFl _EixC5VB"Y:EQĠk^9/0!l_ny'B/nrA(V1$BY2pA^اYl .XA_lUa5 X=b>M$? 729x]Žqlټ͑Y׶T˫*ͅx9щt!oސ>t"{*{go[ʉC7wC<ޞ8/GU&p+#Q)kf  W ~$ #ې#m >K   iҳonknKi`vgnixyLiwha&zz,A/F-͒_`\XJPcXs2E<-MS®bsuR *izs%̇הɴI:r2AGanؔYd1M ŻuĮneQ%%6ǰݹ4e1l;ȼ2lN1̰ޓ>lxPYɞWl,׻GDld¥ѺQnlܶ8Eo)ܭlv0ÜOªlF̐-lȾŽàlԸ>љާԮÓmih ݡXf폨P`{ב,w !qQр=F4F;Ct_ȏ4ˍ ~) g >K  6Z69.88J2.8,5~7;X40y)?h(2$9$M&<6 85o1q ::VAVm@;S ; !HbB\?!F/9283pV/>`G^~AJAP [l, tvX (ɥ99 h?3gr61,nPsm\E]jPv T#@u> 7{ <5Odq"49T8(. VvP3ZY_tJV \c31':ʌZڝ)n*5@p\pH}>T#iEmn}RT\(c(r+k\3i$FMXQl- >_'"<;3n=#*ycVeLRt@.Bl)\u_-]DVlH]M76I Jg]ƴ`J$_  \MTfnLwE:kO%L)ۡC/ %lxs fLV8Qi!C]>js `4LAa}-P6طM~n#~Lw|gPGLo,O. 7%14Đy2Kc*1xQCK?0ޖ ΪW (|>""; "-:L+,;&: :[ xЛP~ފ R<߱E֋ _d11Ϙb.`;δO=C换6{=jȧ :WVC^6\jBtXGY6Dv@Q@OXBBiHT\VK zI!J?W U/%:U3@2J4L*L6B2U:D@>Z+"Z-C9AG&j(B2UBVH{L&z m8v?9 Y=v<9K ?@[E"K$U*1@JILUGKzL@VHH ձ3o6}#Ot&>]&mD2*^ORN]]rYMn:r{ϩJt>HzaI˞VzKz^LLZB* JWU4L  @'a8BU yC'Vb5L U,hn Vn31q@Z7=1༜vw x8YPJV!/>[% \M@:%YlPSSwvj SLcBp 9/_;7 +Tz&)'K7/c8}n.*6bQDJWrUǖK{IEH:|Up%CJ Z$1TV`";?;-z6ǩ:0̪ KVuKzgLٚ!;@\#_ULVBI\'Yzc*O"1YC5)UG5Tz2>@GJXߠɑzHDAyxJMLԺzvl%KOA !6 QG0wR昆(|̯1|p^A =%%1W*˪~^F ֲO2D@JUVCnSީ߶|U"rT7,{ćY疧C_2o/AՋ"HӶ⌶:BʖݚЗ@Z\K^A0\r_GpCNJPo2Y@^mA{TB_CA6[6U^SdVC\ݍZC]l*QGZk_EK\REnWxSY,DFX/h0[ԞDYwgYQTQ[gƌ@3 Flw{ۑ̝dyaⲳsAgfͲޠձߠ٫ܡō9JRdYH Rd.LR<[K!]^&SI,LU#cqP'OeR.cqUOUk0Pae16/c^*OU?cK&U\?LZYT3N]M5vݣŞ2\}ߪȥLUsాBZTެr~(#eLR[K]͎/xU]c}PS]|Y\caU@LRqL{YJO|RuNsLXUr qYGOERL+TLHRE)LY>VYqSxVB!{Y'OU0EԠ#~>jkʝ-Yґo tUZcnkZM&eUR Ϳ:^?Yc|UDLxRU(J]g;zc_D rLwYMIt9pLY(^E9go;lCcjWp|8T茋ZYXd/V_Ɣ5DrLɲˎ?Պ)mqÆktk̫ҧ{ '|)F>& RRnUW0Pg[O%yk~m]``a]NhZ{}V{W3'pKpY eTsOI%TRaאoY%&c wndYO9d!ۥX#ԬȻ-gEʙv|CwMzqNapoԐu` 'm8"KRKYH>ďH-racLpq2:XSON\|P]~Ea:q%]_]Chb{LD~DdG0@}(NGU`qO&!BϪQ#oDqz}C`YĤpt|Ri EZETxZ%^ CN}GQDJ CՀGxYpi/h 0qNKVonBiKQR7O,ǓYRb* 㱓ϣxʭ_НNaaxrzqh^qBhΜ;# SU\4LaRh`SBstqYYs RcUUWZMXՌXQBLNPaR)^/Q`VU0C'z,e %-(1/(2p'1,12>U܏f/'lԌГ]v桖i٩-^aٷ Rn nŗѪ}270 8-Z»(9!? y"4 cB U:%? 7m 8r ˨# -9lT:?b23?X$> 14Ƽ!5<#5!? 0. ͖Q2 j&<#}-q+j" ^J !>6!G|zfԞ2> ;,.>>#9֗ 1;# 5<2;v#Α5r#7Nط8 +5WA"pn9!$""78ec k 11h{UX! [/C{Ys/>! n7z%:#c#8D.5 (> >5@ݹ<,j5 '}FTkvg_+_|rqV0z l~#$ R؇5i0#7.<˜.$w-?5^5">8c1  0: #:4${51- ?1Z Tdt«ݦS`auVsX񸦻ntҎtr~^ \ F_?P,+'ETR[2 _~pԺʏܩϼȾԒ–ݠ칲֭mOn`/Gm,F%Itl \WD% 2gjl^{ޏaϖ䗉ƴhݟpe晑A lJԱ03b3,.52Zʘ6> e2kt\r¯֒ǒ¦ĺrŜdáprl^xw$-n6LnJ#Zk6)6<6s^2mb Y y;2]$pL]`\u㚲JwKh_uJtYmPsErRf鐑Y᠎\xߏH#8  F* C:! B <%F )R'J Q%FV"M.WCS!D dH_kPOaPDaDFWQJFQDeFHMSO~OuPO|JqM@UdBFL]M3AI|pK\JDO|9\UM~FF[l\EAMe0XDPLjCNP\_g>IF@d-|LSMgS\D_z\EU_7VDl6Qv+jC+,&q品cr AEZJGVF4Ylp&5p(3]T E_Z,rm]ޡb/P4 {:՟L⥠4_o_T( y>ǖy'`ϏOXF, 5P;+? ?6r+(9_:4 ; N=#i4"4l"?=&?'*!-m)#:'D9-4I) 45,#f("s&Z-(0.`Z+MP)c7|ښeKࣲCrnCpDTDp,^ q&eדYH6RocIL~U^[HLE]hYHS@NMLHRELYBJNLnUFFjuqLErLyYO]ccUDLf[eLiY+OTN(K--4DcؤНlвifܣխβڝΟөҲ~沟iۑ۲ΣqȭW{SӦY97Ⰿު/럞/PMcR=U\LhY\YeSj@C{FOx%tD|s"``UX[RhO[NK'Rd,PZRdUL>6H\eXfͬDz}oc̄/`)'z㢲eõw÷n,Hgx(TcRL\92]I &,Rгe]1Yl#qU%0;&m=rΑ×K8U\PZ$Xfj%GT]c]:GjrQǴY[(N4RKYIv&ieݧ˥e9ž`ij+}ֹ&nɅPɗߟH+HRQ:;nVRFfPJtApXYB[ csw`ox=iR,eYHSH'7dDqȹߥQwӠNbRՎӴUИt=&o\kuOUUĠKdi_\[f|@0YoP!;.5L_5JqQVBpv\drԳi_={MҜà%Ϟ0~\bjx0^κhr]z{o͏V˿YN;6W=L^OvUڠ7v[ɑӪ~ߊiL拓դbٸn´%t٬KŭI` l_/d5yKg׾|نܡEj䈎Bq!gQ.TK1&ORLJU4 ZԱ8 N/W?$:ۘ`j;-KᲖp@ 3L/X&Y=ЌR䒞KpT6BFnG ɕyb>"Ð:;5UkZi1:ī $#[Lvɰ>hO0ƅ޹ɫȚvїهixǢ(`?d"0rF(WdF.re,exА/-nnEh[–U7cW`UcW{G5'eүScXNV*yu_bule%opm]epٵĵa=J$(~q(Eb7EA[ɍ 8D*\WRKO6up_F\ghHISeBs<+[6U=ciPRcAYR6PL/\Z\.%gߓ+|~G<3xwȬiy $0s.UWOKRa`*ߨsdt}s/A}E܋^0 M6""M]KYHmRIg'uԦ[bC PsuisP%<}1~w֢ߤͲa舝M5}9&SJZ5W]^SRԙ[K ]d$#"N+3.P6/"lY^ٵQS.bPZZw _{nxq綩dv@:aDXkgCâ?譼ԨXRU\L^6YmiPNшQ,(0ٕ!_-ЇI0j0OkY^S4IuMTX ІvMh_2!J@L,~u[ŗE!JǨ&:$ֺɇ>h )1W\UL]zIRD@UzLMUKXU@!VK.deU`cU@J@Jmt_UBwU@|zLpUKT@W!HhVsWHK%!Iz燏ūևߩžǸ󶃪詷󩏳Ɔ߆Ωc ;a$FyMUVJUAVk oLU@KkDE@JeX7KLw/jIԪ@BuzVKmzLM#ASW 󨏯[k?aub0|#aa]]t ޹Gbw+jGTy @&J$9LBUD5,zK%I@_}UuxjDVNKzPhKz` N*m> b, ٍ⍱yȧ.-9JATDAJN Wk_E)@V*J.W1UL1zID*@z#LU#`UVKJzڗDK{IޞWSH,{}NFKL$Sg͸?:G۽ժ/ 侯ߴ渋mwhohڪ T9zp=%FI* >YVJdyTLjB0˟JAWUPK@BVĄѝn{zۃ@wVZWn CUA@K9TS^4xڶ† ^>5]aٰL,?6*=Vl3dj_n"ݰ&۾_TX0GpHzV4VJ~yHDJo⼴KT@W*-LoBUE΢zMLHyIV VgMWxxN"qfԼ*1?"OXTEIAyOrs?赨n򑼭l0xMxU@T#OAVJWTLgBsQKJz\s{+#6 U1,V,ZD gDJ?üۄޑćAɶՏζ$8gE1MgV8#L%UK*U@%/E-KIzT‰nUL{`UJ)TRT}NB vRLU0Lᾲ2>K7$W1C1K%@/HOE!R__!@RApYHRIL)R_Z V4O رSȜOUu O|0øn4%2"Ի)elBa.L(Y`7Rڹ..#@Z1^+=}!o=?&(#+175?9n!s?4"?6 +";5"њ3s6=[!ݏ"d= w?ў փ0kR!19 [0  [,!.  :/0")!.k0 1A} F1 ;p)5>3< 0' ,3=Y1l'"37m< x#2?ꖃ˻ۻߚf9#)M.0!>$7/.&%5;ˀ){.KܥŻݓL!I#n%kk2; >37 ;,95>3> ";5<5= "47,k3<!!383M 8E'%I+X+;" q1q> o6<H+&%+%2 d 1N'uܓjr1$< 77i?;$;"?1j=7 ;l7=99 5!<94 5#"N7}۬[>.'.6,3/$\+d9A&!0I. 0x7!z5Y%h;(ܞT?!m=9 ,T6<ן%=I!"W= 8?=3=x N# ݭΑoÝ@X P//?]; <0?)2!.sxo%"~!l= B:";4"66"g2Uŏ|ZSK>703D-> H)- m17,$0 (2’e)k܉Ȃ8`#=:5h#3P6=F!"yb'S#!`/t));>ghky%j (;jdG4j4!=N6Kq\9s%0}#h5G ;%<.}>"m!'R,/+q ;bW0eg.Nc"O# < =-CɗZqbL$9)&8/j;r9?8  3B>;;4-L3ՠ,?9(5b)*K3>65o8=V7>'8 S3&4; $l=4#37= ".4!=0".>3 1"< >ܞ!= 3K :Z7Qߩ;? 39.",)乹;32T 7!< ";5U#3J6G=7+<˚j3ŏ>9ɞ44܏ #425۪ω-ЃÿQ&ˆ"< 7!< "=K WVO6w'cށU%06o k(Ֆjz)$ ?"t=?ĭy U$- *ީ1)=Y ϯ,Z&Ε >3ܚ͝_%>q"\6!g%<*ɼ֊Ķ ں_ܮ =v$ߴDᖓ5"H6&!7nE%:L [d`کSÆaaStƜ 'dkva!9A$ .+2װ m[YѓƒD37ǐ f=O ŀEuݼ?ؖnײ@z5LURKUI@VJKTSQغ}#M5V0@!U֩?G4.O$t4!&,@(K%ԫDE(63*K85=AP΁$USKmv)q\ֽW 4GՑDvVAVFJWQUL+z bV5Kxv6B4r L3zV99..V4& 0}j@JVLNo~,])7*S&hVIP܆K4e[X0od!L*ifclX7sRg*i uP:ghߵ%E1nYp(ϩ\%Dmzfuhbopn{sJ !U|IND@KE%4|)@<[= %<.bYqq)a$ \7bXr,uu#eJr!Fl=kʶʪGy0ULXB I.D@:Wjr2w kelvΘH}Wme ɿbU?[|UY@VdKfTSNS Kƍ|%Y^Mh3i/opdr[oq:qh&\mH3n^2po"1`$5p{3q7aRW?wConQP-!m{8vMPڦ ̟C6πgÏ(ݽpʽcQ׼ Dӝ1֓?؃~!ޔã`; .1P=㱼O%$Ư0ᡗǞ"z62!r6@nLOb610N :hVwbޘ6ʌ Ŷߧ/:n ݭlrY <5a& f( wH4Oe+0zraF-  pk2gkΩ=㟾1Џ^2k"'P_ 0<4.; 2@} W_>qgŐ޴nձbY24F>ܥ"):hɆpSo` ^;:%>)))<ј;"<"u7=m=#q - +<.a 006U@p˜O ˜=< 3Yˠ 9;oƄ"/߃n{wfhu;ѩ޵Ҁ˗Ʒv܈3< ;w#ȑ5#7.#0ՊQ 8,P37NY G@xNYD4/L/ˠCîD,e<] 7!\7MC[;GUW,*31_;v4ܳKѧ庼];߀cżw؝"č<$*= ,{ LTLr2-?,8 H{z9Z[<-? !"o:›Ƀ7!ߙ ⪻sߎ[Ĺʑϴϋȳ܌>!t>G8PVŚnǣ0KÜàcS|;ۇOŔ%yؗՔ $1/0)w'O#^QZQLۏMScPuOUQdSSr]I*\]WEGRYi?ZT[pj]9DT)ChVAW]CAYoo\N1JqGK^ C]NIuԵV^e۰5\p ZD0[_0Z_C6n"@"\&_;B_Z+[>W$H>wwoʏ!b͓OlV=KzNULUBUS{c'Kz6L L)B!U%@Q~g`#J`"K0|D?S|(NEx L(=O7ID6DWUMw~PU@OVKNWU}~yғ)3 mܝ$ha;~7gL6~:Qb#JIpI3wJOxRl1oe}3Fcz놗թܶw*CCq+O@RVKYz7PbWwvct/uz:Gb IN@~ MC4K|;bhR+B|AcK[WUYLBOIDA/IˍJGg_Ӫk9rVQ[)PU\ؼTIRNN[ L^SOSRST!DQB_Eni:H_~縌Ҷ8RBNAVpO4LUE[YR|iu py\9pX!#DV@WKVUbLO@IVK_-bDvIWyK}M%1,Q@7H vxaMq&/yYo@AVK{fVJIU0I>g}|Bq: v$d$&z7u?B#BoyyA!8IK^yI z)rQ8UU;Jq`E\n!^U0N=LU$$u LGB%$I)֎1L{LJBX[}4-ȫo4ER]MWQIZ[@eN-qk=kIwBybgw$%k\:$LhRB9\W#T@0PNt\jPTT>/YCA+M7.GUUoLB^UDA IQFHD_~MйgIt/+Œ}0q׹:&eĽ^[+hHħ ĻeJj/J[ORbM/WYtO!^ZI/20/.Ξ1]-{-)-#p5 e#)4&7ߖ)x$)/'A#:b,>;.P?ۑ#>=$" .Y*@&T,NNTD4+m=;ؾ, =Mp_+~<,<ΎB»ĺޚ6v< s#m ﳐ;k&gљގ w#;J4&"24^0 t~Eٖ^[ӊ/+"qF ɲ˂1Z^޴B(IʌE$6!4%"I{6s"%ܫqђ罇–Nm ;w>&N{cwVS.xW 89b<Sݨ{357尥ޗ<:-67៊ⳕ t#ޒ3~= B:"4"_ :}Z u*2nTh pd|v^sdڌ HLnnO *&_"~=)냆JυƇĶ% ՞ t|= F?3g 6j˜D6@ =066(Yy.t@.|cںw祝JuâD"\d Ν°c:?݁ \v z}43)5 T; Y }e {7L͓d+Y3m%T¨ X1Ày Ԥ#&măwzؑۅ">lCs #mird20A39W,U8?)S+¾ 78<֌;g4"o<ݒiʿrDžiPݴʙzyɯ܎ ?01Y$;;۸ϙ{n˜"5̌ rk(]ׯϥ'cÕ(O9xԝQjƸ*jО,K?;:0-s9? o0>j9ّ VN <4 ; t _ d0 J6v7 (6<P ^]FɈr~p~kR,n{eu ylnubthc|_z$|t5oByH6 6]6޽6庅򜏮96lw򳿍 4-։r&fpjzw Oe $3(g7y_ɕ3\1V dՠͯğ̠⢋m̡Y֬ǔķӁ֠5:I|zd3ʑ}`lK]s3TVJdTdoגha猙Gry}2/;6 ̋M旕ptkઅoƧ]8 i_% j'Vd~rѭg t )I.SX`p mDsAIa揠xc\qp7lr[`HBHysLywʍH)96x;sRRz{uL0]DQr1d5@%m6@"me>Z#H%*~ y=f2enߍ!kE.>g!e;,!xp96!m146w8'?&n56h!= ?4{? :s;6%6a4#0a0:,!!42-2a4:!#1 >0A08%# c9eF A 9+ eVNp>>!;Z( = '0]\p2& s?,p0" *K zp4 %=6p `G I8p62= } + p4  e /;(pH Q %8pu$ 8T q{XR #>WMH,6my%g.# V_#v 0=ՔbߡWoTg dz٩"{/xo렀*s3Џ@8΍U Yx7@.~Jʼn떫;%So^H!F;cZ7h.3d-9/5)h+3\=58b<7O1'9 3~%;! $ =s3#;/2I{XM^!@vAXU 7yn< W#%<Kŏ@? 㐰象3e頰* 9.#F=8? & \(+_'K፮Kܖdt~<ᚡO'7;Ln6!< 8*"i_ߞNؿ]AJص]7ؗ;{ݷ3<<"7k By졬ތ /ߩ̰dqZ^EևISTQORP}L~QH*o("KYH9SI(LzUQcPU]fYBcjUZLsRvLwYFOxRyNwLUUO[TPz]Qo^KU@>SLIzU{j^zW_NDImLAGQN]jY^tUBXLU` 8)˥اԭԲYU][\VCU5B@_UoH{͖)ISILR9cW)]^*cpUMLnReLaA}Y[S*c/@c/^sc_E4]\wcBsL@qEXPyQCf_|xYQk^|c\EUOjSNKUe$SᲆA@^V4 ^BDU"ϦE߱a2˲Wڧ߭²kĝ}E9_(?QItLBU{w0xAfG.~a :iZrlEb2|_*ePd.ucC%EYbotUOY"@!Q)YTUKRdfXI!3&zkS*Yqť,,ЬW0 ^\C/3[-&%AR%AN2G@;Z+TcRL\/L^OTY"LU)LQ^$o9LR'o8U(d7Y`O%/cN`[LQWh,V3]M3qR0V_VzW|@rSod/@|UP6YHRe'7G9Cj@9)՝%֬J9,Y= ѳ(B93ͬj˲zNlr!9hMhc4SjT`5H79UK*F'LPn|B~ZItkWlUEwUs.oPiNP\%+'UK[KYIM%?h؝meM<ϡ. ֲj͝pfgo[S#~b߫iZ<DŲi;T+_<7 h3)CQo(Uf[Lqo%Ik![g,x@X0&,Y5T($U|;[$J"(ˏ<-Hͷ\š?q֨g)tظ㡑 _@`Թ]Azᣮįjb^Y4H_@NEJA\^%@iqA^ C*rrDEK#\HIgIDY%[-EuF KDougCYN@Y>L[GfZXNYwKKFCxLQXM085gf˴˸冏mi2oc7`urz q}8v)k6"YrҢ09\%E@Ez L#UK=U0@ V0K.W9UL BI.D @$JL8UK#z@#QJWKUKQzIRVKDzLTLBEU@y@JVUJ|yHGM zȖ˽Gݩ긟ꆇ%(rwY5emG𩖟թ6rV[>LEAHDAJqLUzKzq@V@Kz@ULCBUUTKz\JI@@LoUKrz@iJVPVJyNH_Vռ𶼪>aCűkygi'b/B9MƼݫު[6F(*J"OTmH{@kJW`UKp!r@@NJWJ&>JB(=G̀LkU"UkD@jJWTK{IWRH?{OK[3rמ2Ĩط7k }g2n0U>[:G ^ SRP)S3QG K}pḨե{ 3TϨLV_BU_Dz;%0?K06W7U 6#B1F>w8!6"7} =~!"^: J?$2- Gq8o-p 14147o"/!s%R]LxŇj ;g,!:5k?3a6=_:"< Ɵcq|` `5l3n p< ˓7g <{ Җ"V:5#?36>,L gޘšlŏ^V,.6p%#[a#Er&l'WcUnjN{b$ř="eQ߉*3e!< p!< ;q:5P#7Pmn< ;ISȬؐ_ȷpR($q&r>;pwn|c_`xc*iJ˘jɔĜZw<=2s='’e(Vi>K7{?M#Gq_ Q”i ?08T#KgǭPk{@0n/p!yq"To Disab>8UaPm*yd%n l|8&;"I8I3_ %X~kS))4 =g!rpOs?Wm>#ΆŸtkɞ-<5͚HծfUƚ=(?*5 (w+37:>S"5,2a-B8.3/m.N792?y:#0.6/1A?Lk>p 0ɚb O!T; o]P]*p虑Uy"qq{c}%N.66̜?ۅ ~ 6s$G施p~岖G a `titg(zv<hT6ofpa?svɅQBɗW!Cz f  x9k`ِ .tߝ+, QT]SXUo"c?Ub &.a0 8l1-bp~+yo䖸*S6 ' 1<>;%Ì ֗ AE1>殃ri.eٕezitD^x hJp6+ ezPce,68 66ɡP DəT3Fp]A瑼sTDrvMP' gy d 8Y/jŮyWX^P܍3;kYbc= j-v3c,r*a/o$aeP_J-G Ϥe.7k>6з4>-F1㌄ SΒgږIŝϝVsY*L d2&)ݨqDɝ>e c% Noښg%l6u8iR6tvU3o&7!y^`dŅf$] j\{@gov? z SMiNԜY- >yoeۣ؉˗b,(~BԝdI 6.BLݮIk?*XhμÞ/r/YhGnѺ* y<9?u+$ǐ*`Xg)KY | $&Ɠ x)% J ;gDdD@^Df/6($5ig_`^HQJH]oBZ\PX\eD_=$#鎭m?>(408,'&;8-> "(#7MWOWQw_^Xo]CXmQjEGhÒ_WuYRz,Q+D&f±w j>IX 80 <>Ǝ2)+I_ J#x"p*Q/|ѕD Zh]i2NN_mky`iYΏ=;>/?p<0.6>4 Q> wneaq6p 4GgCBgP\]T\r(e{5lDyy 7?W1 >=$-20% . <OP I? 9sKoSԀVSЯ\VEʀHA؀1b5EIp/gj:n[I/em*q><4ra?a%q;a/lnqh 8&p9n$pr(tIu;E`_ӀZr5|}9k ,]$>(ph?5`#cgv'_7VRpx_=g 2ÕP_\Fa X@S]TrLCYAa,6NsPxԀo~pP5n5w1Q\ːypO.1! _)nZ>b > c e Jp4Ҟ^\4qUGPZuVuG͠P 8ڏ>P`3z7_"JrQ+wp Cˠ_Do}ޗIvHPWĂEl@2>Pƚ.Cߚ˙rtyue:os ela.6n5r$˙vQrΗ:IY.BZ^JPrK YqqHmRyCFd |?`@y9\ ڞ6 Q0!6q/0Tj;. 3,2<*!:]?5=+ߏ)5'/ƍ=ٖ=f71ܜҘ[iY+$]>G#Q=)6?%9+;#-%(t,S&r!8!)`"# 4)ElЅe0\ހP̌PѻXSF^Sʲɱʖba P[U.eSIّ^VI]KgWFJGBQh!TV]hQFWFD8>?"t§oƨ[tACO!HYg[ KY""]HYzg[`Y`VhAQG _ G]EVAղ19\NǵjנۧSōgV-*DY#gG*QP H֛Y+g^IQPnHRG]X|U ?HWJ0-ݭ(ƠM]!DV(EH%^_ (DVGhsI_^HF[Wiж /񢡷wj<5cxRIZKF?PiUUWh\F,PQUTL^\эvn:|ϩq5Pw|܌W5TGIX4u\EcV[EeI_@fZXNSHeMQB& Yy2gɮ EܖSTi^PRGՑ_3G]D WE HͤG1RzPR 擠a jsJ:AoqP5TfT7iPFM^F]|DWlE YOH`磶܎VD y_FV#hFЭHaRrJX!}J$[rcUwMĖ୳F" *DP&͏XT\E\SWaE٥ _GzO]xg_J2X knK fWϭ+]|\YKFQWjS\YKqF/TkP-QMK M;- BT%i7\sH XJGVhKTDDP7džۅO/ŃڅILUlۦʠBQeʓ\9EWi/I_8^FXSVMD4Jo[Qc]F蝘m y$@\6C]G\{K4V#JYIQNfuUoX%CHF$eݔ_>Ե̚Qj疳1_SJALVd`UHLWJcoPU_@Mb]֌[(Y͖٭8I\6C᝟ͧ{[ܦЃ5͡*T3TaRnW[MY+X(RNMYRaTQǚЭڑ~ p˲Щk.EuҺ?PO>UN^MUưLKU`ϓ_3Y%?`ĦR Oðު⮠Q+1r_Z@TLKPdRޣETT=/Іʧ):P91l[Ԯ,`FRmVW\eO_ՌZOUl3GQƢdԡ[yܯ&>.V`^PM Rb–LT[7M}\hXR%I8e#eϨ/g䌁\)' N^ MTNUˠN^+L TP3Eӥڰϊڦ?j-)IQ5dWϏRYK[^㪿WO(UڰUM؞`6߲.hW\YUR`TvMScXOgPdKOQ;A՚g\߉u+ͶKqT!T`LRN\N\^`0SB18YO,=нIR ~ٖք YlZESOLCSbPNRUaRWZ 鎢۟f-i摥iW粏R[[!_aR NiR&NBYAM$R[LK,OAާn1 Go7xcюݐ#^O^[TLKPdrSvZQg9m NH]n]4*MLS1c[[kOPdNGRXJE S6 љca݌pp*ё$%d`VVLɑZqMYNCSL0KVf-U4pϭˠ=2ϖϾxߚQQ}-KOU- X+XS LZK.Eh׫%^֨[V<ѳͲdAT$fVJoQG]XSTMQƪΙ_zF잳!.eL1TP*%;\ɐ8U;Нγ$ӏ ؗ~W2C.:$3q,@2V$iN8'T\˱(oѕϺq.׳?qzH6Q.t-Z"/+1$&0 "N0߶7)yz9{ޗΎI'6V#,"D$,,(2N,#ړ'7uʝ1C'ڃπ Ӟŗ5b\,0)z#0&C$,3 3>/,*7 <4ܵުÑԘˍ`ӗ](H*1I-Š1c&2-3'3T(M#R7|Ұ$OT:f䛖ZҿqU4>O*|(3-F*(f$B2$$,+S ʖհkM=ӻ[ݴMݮI 6V,"b$5(/37/-3$1)R-$ݩz@7Ε]24Y.R,0.)*'H41%Ō!l-䤱E[ Aaյ̺ 3lь6c*- /P &I*0-0!L]( N0ҏVԠӵ Bό%0&s2#$R,33}/,7QSSu~Ռ׾տ0ב<_O&2֑-d0&2+k. .&->MD͝%^W-qMۼն|[:4Yn6.1+&2'-33QfhΗ0~Ւ)Y<ݧ2ٯ0]0.X7.10*m&/!&/+-Oh(xbZmb`UAG9̭I7淮/()*8^-r"֚/(\30&3Z! ̖]: 1n&pbNz⍓ިa :bW5()$0К"%,2-Y#8O#_lvqГ׋O?[4\*ʘ. 'r+]2,K2'e1,Ǡ2<ƾِ^&m2Սw7^a˿R L$Z+2Q4.W,7u.k{V/!]] ŧqZЍSվݚբ9O^5-3}3(-#$ (G$,[*"Í##mh2GWEښ]|NE5.f'$-0322r'S1Y'<*w֘{Oل̲%e>+P$1/Q2+)%2 #5'-011'O~Y/՛̾3ŊUOS"^32gQ%#'--01$4q27̊ݦ*̾TĎ0L̀+)x%.L#2b/0Bk> ς&lUZA2Z(2/ϵw01o- "ޛ 6 ݃YԟҤ5S4*1,n2'zfs-+2,I&43!gΓ^>?ٝ/Y1*/'"&8*,3-43*!p0j+)3+&RÏ@ڷߒӞԋ?ߚɘ)UUԜ<"[ +P74D+))7+,-!22Z5؉:6ߚҪɗ٫45=9+/*;(/!2*)ɚ+,uHBŮȐ&vBUj(֖36)57.V +s&q-)i!֋ə"9# Jصv9aԚƗ[pƸ֕1#s%7'/:6j!!+&"(/?悓ӿ趒&j0ܕ/-t,b):&6ז&$'ؚ&&!q6,.56/7ɑ*p݇MSMNRӳ٭"-N.263)޼E!/?/6-$#~&*7:,5#դ״e%ƯߌX/Y8c Fu4)k|8/\/6)*#':J҆Dńydz˶$)# /o8(7tY"(k.7A)o #<rƷ"؍yر+2ӑ-c5',d5' 48 /*)#Ґx/9-M5:*V/Vr{Lё|:ٮb-,8!08#75(//)0+F'ˍ&P顖<ѽ Б֓ٳ(-_A*6&48#//z*f( &C,:*98ؠ u& ֗"()*=:u7N 7")4S.u7{&L-5|&?ut.E֫\$lBټcФݑJ':a):6.R+&*"~.Y8(Ҡ8 :* ˢjMը'߮KZnuB"P: ~:I):6)!Lg"47)5٥ٚ$Qwݸ?^LX{KQ.Ϲ!1ϥ;(8K(\*m;))=ӼJ6׀ɿgޗx­{5$04uI5b8(S*;)((8p/N$މZǢĠґKAʅ'رlpۂ=-+Z-5)#c's=.WÅ;*r82c /؋߇ǡ]Ęغ.LߟБfڭ'#s7'͓,4'B9!.8)(A,'b86 s՞**nJ`pǪũݎ?ZM1w#p;'_;,:8'99"|-'I+.%]"!֭z53j'ӹ =$ Q]áH&$ŏ"+S"*'Z,7)#ҍ%<"P(e[$W=7u*Eڙ֥BקS!iݩԚ~$;*;(a?""~>N=0%f -)!$:בe{aڐTcp~ݧm‹"8ɤ8;%O 3?k#QV$U%/*]<a#\'8 בSڟiߖS֌I9b1ÍƠ:'-O"*($Ý$;g=ؚ*($?; 'hF#`Ǘww֚h]fÌ~Kzc/9/','!o-B(T#O$"<")?"͗}`%fǨߎ%7ܼfTߚ\#M+<)tu%-.(H#L?2w`+<)?#><%'4( ÀweahklcڂkߤvClܻ#;/+."9IIT*p5P+<~(8<@ŭ֘'5aY NOQ[jw">%Ubi=1w<)?̑#><%tuf>!(` 4o4y@(ݯ<֞ݏوҰ4\)#><" -"=%h=D+=q.O%LGX\?p]w{ÂlքsI:֒%_%ݠ<:=+܌ܛAÆ!WU—i׀zKyխFl ;]>%',ۋO9=NР;(8z 8"?.͏ ֜ެL 4¯}|ŞrV") ;(. "R>]=EGW \-)%<\"Π=B/4>iY݄vPR6.q<0EL2#q4g -!^SS_F@%4+U|N>|"5"ُ$,> .0ۇц_CuH ӰpJ2 ۪5e>c";KI4=s"_`\,Y>C&Gi" "ۏ$,k>0)e?֗S7\YUތӖ2܎Ţ(~?# =%*<,)"W?`>@#"!t=#U1SOԏ1#_zöeKՋ*" #?+< =Y?&(*#.* c& ) -]:Ǐ?Ț&G# ?=1?8q!t5 ;7#Α="~#;.Ԣqyݪ\8sʯĨ":0 7> !F<p>">4{ȶX߀݉lϠL<-ڑ<#9I7"?#!86D>0=7S>; =\%Y޸܄kȻD߬XG-;>DZѝ 7">#!k04rߗ!86!E3563uAGK10;(}v;;!Pʞ8\ލݯ}ïWNkCn۞  Ύ5!l u4_=#l"?t Я4a=#"?} =08Abܖ2ɘܓȚߚNߥlP}ޫ.>ٓ +(<""'?, =R!?G |!X57 @K%נp Ņݓ‚{ȱ]ߖݜ›xݏ¿'/>P/ 8[5 =^34"=+8"Y? o1g&Ϥfk¥ XNjZ>3@4= 8n"?!4"?#YЕ?p0L# O=Q˞ Qeޏ—p̎i'J߹hđ~̸ɑ[!"|4!-? 36q!23 4 =# "r? < '4o/̬>98;{$4JܖܓÑg޸`ąbpkݚr?:>Q07%; !6!S? |!;71#/y[ܖ4(#ΕL݅uׁ7̤əDjZ 37TH!i4>#۟ҞE5.^07 EŚsϜɎ k_" 9\ݓMKɁ"H$"H4 7P88"<6<3'431d"6\/|71 {هa߮̄ 8ě\ ȧâz=Y$=3K4 ;8,I>0Rg !M;97!> <ZARГͧCߖ=> C{׾"kߚg$;9BE9&%" z=#"0`%ZB°gܛܻ:lW3F͌6f٘ඞ3"U>44 /N8+5! 8*;"60&3m;C.`<%lײַϠ/"]΄2nܖ)F0]!0QN9l,N@б?"? =3? <4ȟؚuFœȠ Qzqޚ@̠2Š(9g R66';=0 #=4$21<&#: 8 L;"'RX#ʌǮږij@lŦەټha$7Đ"ږ8>P:43:?%8 3&8~ &R?1p&@6D3;8k$-'^7uұƚ~Dǻ`n͞7 2؇ Aۚȥ&Ñ 7{63?'88'3:&>1('72 9%Y)UU%¬Q؏E2 Ɍ70=ؔ4ĘƂ͑4Åz2W'3 9 *>&?9˼$'8:6i7 QזDΙ׼aےG#WƘoVƐdNϠ<5ɐy%9 2%.9 U'?X03%_9 1>? 07793Wږ@r¼ۚmvq͑|{Ƙק͸ԘƐV0$8 &$>1'ƒ8>?, :6B8,=~b}P} LDJߐq׊͞^Ł@-8T:f6a9 t?bZphde$io?|'%&+.՟؀yvBlGͮiaϙJ1_7h?'8 !0'9 O>?P0&*2֍^ >&đ0-'I_OۮɠئƑΖ؉Ϊϲ׻ɦBn;`9ͫ1~;7\ Q35NGǣDIW 1U'Յ(cؘJ31|+#8çelX P81&)9נ&2& U}΅_kz8pg+|ׁ͐ju ' e&UcYo%p<:6+$r(= 6f[ʼnxWfDKi#y֙0`R{ե<:7[29D>&b9lg63y8$O'-ۜ79; r1%GgʌT`#(8$bRiJˇ՚N(079nZ%`8~3l$8o{'?p60U 28pnΑ׺ qhRzCprVii6Ԏ;ӑ '$'? ce~$?[!I^0&Xc%9&9 ;7\2k`H`CipOD]p'FEElkAnWRⲑLzn§)' 7eZ [rY'N&^A@29h,C>1&u>5Յ̰%!vR2WPW-O@E&_'T839%;P1|$Jamܖ`8>Msu27pظg]ȚArS Q3@I8H|}jqP0͵nU$V(">;62>'g6k(A=|+*6F*(B1?o49{= 6Ӎ>LբOԖbǙ:ɌTNrf(̊H\<5+*7c6 ;I4(3*=*?)ӑ5(*3g6:<6wWՃ#xniʃѐӢʆ뎇%Хܖ*j͚s ӏ0(252;+ 9>3N.5+6;+9( 3),2H DʘvE:_:J%'=YVcܓс2M;,o= 9n3 .+=2#5494S9,<4,>/ڑ4.,Š}r MB 9A7u #;]2ŏu?94.+O7 <5=v9"u5=,a2),h90573r >dУf#~v.S Q f#nӒ˩ԏFů0G %9KR5+5<0i<R55%5 6O5( 2),2;ݏ0qwٝ{O0LMV SD dʚүғe ޠ)Q,C5w;c0r=I9t3f5l,\2yDN=B9K3p.O,E2OdN9'94=[6ϭޏe9s9]3b,oѕ͔ρeӨ 2 ?I9NY5Z,MuBOv/[5! ;5hq5m5>\;[ "W!)<^!ϑ/ .9 ?#.*5<$,/b;KQ^O"[YP/z2XBf,RU+?*I <54/;&X7ϰ$(5'9(\ʑ=?2,f/"9 J.,z/9v3Me.39j54.J+ab|KAB6_<#<,8 HͥWAC+f8. X,S5C;xJJ@3~.Y}v;`+ "#S2/}iĈc3w=1;9;EzlhKL;]rSe+ /562//~|RLM/,B>+"9h`6?`'|Hrv}H/iBT$3 >&؂ 5WXQ*+ #]%6>"`'ҥƧ)m=o#nc iu55o.qŪ%1C2%$7 KX8#%'P A:4";9,9/3.,hޘ,9/2H/,N4;1=8X2rIoĜόѺѓ> ӖHy$͚gXυZȏeƪи1y-.~1j3?O1cO6[/6!8/ސ-/683>:T7L`S D^sPo얯Sme,Q>D S>KU/PO*P$]>X 5s9K#v&UYLW\D^pZJbM;}/51>>?(>#&:#*60]BtGH5u>X$h`D+|#A7u|F~> x^Uޒ7# .*>ϰ%> _[#Ov=l!gK&g3)&'{$"'ic)l6 ??M1=># >~;-x7 P6#4?ǩ3%p"'랧wfh⨾Dޟ.wkXٞs;CAo?^9Wm&MD A(?<5\?>0 ϫ FԢUBWr\}jeCrUrMfD IVVCz"</ :>Oݥ"'<-i7 $GE7O3._{>|u4D3jRL]oAʿƍWzoۉhȏY`>%]]-0# <]"(| 5q_k+7ÍǗ!"*o`Pf? G 5ˣɡ> #'TiakUˇrERϏURpAao2vC~qZaa@@F1Up>!Tֱe> uY\xNxUk<.]SB~LJK3b#YH >U7.?Xor)Sȳu;0L˼Q\…E|]RlN@lCv-Fct,r^.,j 74f10չ k_Eatp]rcdncʐxhbLDP=+ 8 ,O ;%>> `>2  GcLt ;6n.jC^f~Ʀd < oyuE rV8 1;  ; ݑ ?} s.C45QNOmh͍.";% .9 9NPAN S}@}tRqwrPGrN}VPU~PaHEHsY8RGAI oY Ino39ǖjHddPizRq Qm$^O3YSx@{L`XƈPB#I{|5ZZvNkLkSO?'J~IiB@1D6s .Rm1)EKAxV u]oPGO BbY(A|WAD"or H5Ygc FUUWƍ. )NPQD懠RCpX " Ng "@KQ_r*mx1h}B(TS~PkƎS Bm1}U1l4" 4cW T \"Il bkzt.wR\3JAFHUI< -2#  RAG(LU oPEoN{ 19B\>QF)ƹ @/ }M9H/:yCoO UKy^LBvR~`{}_LQ9d%@_n?4 ="IQ9 A#喣,=V]MJc菖ȘHg7 7 x|QNI /&( 6 q5{ fU哱 9>4JB}y䏈˾zp5' 4 6=&7Ÿ44krX䂑Lm皑VwovdgksixsT,<(55+̟,+0>saˏ{gl[sxsua|I XΠ<4;\4":&ⓅNUkurwmuxl瘙ϙ%VjC9(> AWsu~9NGcɏOWO6 &ޢh;=̾')4m%k~Paęҹvizrˏ &%XhŪ=˝Ж4`fMzޝ}Ēp~l &4m41+숋4[J̛kon!aT|2 ڄuVڽ66ӹ®7;saw}˗&+ HJL1ݚ64 aO|{Gr\ đ[T>CC+77ĮOٍެ4<lGjvmeY`x{D_ݮSƾ巹ȴ 6 {EMlvxq̎^J$Hf\آ#ΐ3#=,F PQlzfWdCCW d 4wziI H^,;) + 3 3yy^ W%T@{sh͏  "FUIќtek b|OXH) : ݍ0Ó 0[yjYH.5Y.^\l}YwmukNpY)1H//z(n'^'e%r)o;s#qVn r\a.8@ReGBrqqxlrjdjlцr瑟єf?ri x` B>G-XZs$*MJ3_u _~b-Bse{/A1SC,fq|T~Ubc1@\#L~j fq@@+mNs&NLn2AP_|y aV~m#[!ӫ#Wla^`U ^_6}%xoo r<*S?o`.C'Sqzos!qd-UnloGR_$r|л/VpyolLJM&4. .{-p,)N ?#6WrJ|lҍ팂ӽ$?;%GGhh?}tb^]"80+ +gmp*iJ@=N  U]YEteՏ컴С>λ缜&۞}*ullZRfyoo)q? tWv㷳 1֯尤z%,%',࠘֘nDa^a`W磜O*/6(!.%{`vetMg)PmQvpp[hXK`.>-.Ꚕݮd4(*ymL awrdLh.叆,8 ཱ@OG0t!vqG~*2m3-7(jALL$mwuOdEv'PZl7}q`&'L&.}:v XbfK )jw슞u*_Fs.  ﺦJ(nmFv@}[܄x_w{p ޞ#!֨n t~ғJ O—ЛCEӶש yҍ核(ş[pzF{SRjE`lI=ʶ];<x8w6k^}!6vރL qNɨ).V:ִ3'%`F~ae)w{EAR,5( (xd@'U7i%n48_]GH`gਏ镍=WFOAozLE%WLQ 4   %% [ c{C{U JN D쌠Oȏ޸ؼܴꚚ۹չ> >l CxM8JURK광eN\~$5湵ʼΤ۴ƍξΥЏڽBۍ{r eEJآxcXI$`_q&ۦ/B&%Ҿּ硺տiu YrDtّxG@ Y }V{#׍m_ڽ=M۱gX$iz [R齛%wRx$Ak0 uȼ҆ۋ7%o:1 təpqNeGswfݐx](Iʶ[Σٷ`/vy\d_[`xhBϝd@v\pP ݃ӴּwۡԆlJNomCKGcX)LZ>1񷝐}]?P=lB֏0Fp`i^럁 @w\\É2ՊՎ_fqܞpNvk yVp؞p g wq;Бǎ2|u?{@m)a]&vᛶdWL~fes(GgptpsFmSȿ##Oo_LsoZChZd W 5+$"31$ 3.!=- /VI_:+{f. &(933, -a4$f_91@>1?2,Z %($&eNx4*$M#."d8,r3'*^C 65&4 -'/7<(]$|]NW0?'30{+Tm"HU07%:<|$/s0[8Ѹ/QxdQPC( 1:"X,#qfa׈1]Qk)d B1J1I <+&;+ ZSG7 n#Y <:I쐯<< PC]53 %;; ?06 ߁ጂ߮3 5'_C>   +&,pinwm]\\^W^_l^IA[TSmv+ >cW 9j.!,)a J5*<O>P: +9$7,$G0 O;0c 3Z;, =AW%'%5^G)#-,#en`?Lg_I :4pTR#ᑲ 摹,> [V -uP &ď!LDГ/İ΅ЖЬ87$7 >V<1#1_7<+""#?Đӌ-wŖg\˚XPw,Ցg0'V0KQNt[OfSHaLQ4\LZZT砨d FRv&Fm@BxCYn(DcXJFA H$TC@xZ%p+Wk#澚b⣑%cLTr&Y^AC_NJ\@FBn^YK^K\衷 WӢTk05r#*Y\s]N^L_r`XDKVf]TI][?-Ï:obӣBBКGSGHo+Gj@@_JX\j^\@D UWA`eO#gµ;7xޤڽo!X CC+mFBpA @}RB+@mAR9D P [2Nz7޼ϦU!-Ҵ:ED KAAC'@ XWc]3PUh]F3C^ˏؿFʡåڐA8BkFZHCfUVl_A_!Z}pYJ7=([Y͸ӢuȣБpC[X_Q;^ ZmB\mWY@_MkC$U#rӽB::X''ާ68mJPW^~GAd[nRYP[>n\@P\d;'Bܣ3vOnTӾF퐯YHYQB^TWLZZD]kQ@k[ip_" F鸷Η򻉥oᤏ}!|ARwVYAF&]iC_W\h`[AIqI,JȻ7&̯,ޢ+ߴBHDBIQT %[9USύ*E__REjW\]ʽa'e$诞N*3.])gXV`[h]THS*HQyJ\H_}ɢwB䦘x⧐𩠧}OXY\P@EVj]3EPViG}^PCG]^챖a]#IH1EWi=UWWiPF^F_KFSB'ζ5ȴ㪐ʲA\\ P'T_JYEeRJCVfHPZ_Oe-aԳ!gR7Ƞhl,EJVe T[V}d[QKPsLSBMP]e%G6ۨT;$URPVYWdUHU4f^JUfK P%֓#IaҚĶ eBaž&VXN JeRPe3Pu[RfU-IZHZ@;*5@;ȦG5H{+,]N'T!_p_RS)MTWbb^{NNU.bJ$,]kΡruf_ϭ)6&^$RMNMUbW`_UaS4O^1{P&d ƨrE?F(]SZEZ{SW-LPc[OqQdo8FΓd͖?ӚԱ)ԏ1&3X[RLMLQ bSD\Qc)K%F4kӈèVe֥I7јK%J2#U-&NQ!X/T 0hPX3RQd߅~Ѹ͝_-Ϊ䊭!$OZZQ/M0rQR $P9bT4{_ àɚ5ԑ+[ۑ ΁И&nT@6cN+Y".R^['Pi+O[,`'N* sZ̓+&#Ζ,Rך.5Ϝ*&@1$$p.^00 ,.^-a,Jc潴iE~Զ̧<בUؑV{͊ҘO +M]4)$,"%,v(3.PZ!}ʵW͓IkԞϖ`SҚZi-*1%3''1,03",\-%.T-ʚ0fȠӑ |yޑIҵ˼ؘa[5/7B2),%O)#: -,#2B(3nk̩ПɓO`˖]lۚ1,*O"4!! +F7r4+K*#)BN,у|ݧȚjɛӑT;ߑJd0d-(0p)16-!W('h!{(*7/)k.0< ʓ߭؇Ȗ]Ӛ%*-/"6#C#)76+()-IրĖAXGĚ3ޑVlґs/,9d ;+ :5$!"$$-!* Z30t`}ȔƓ;QǖlʞݕY}6'H!/+/-7""(g:<7&%'!SɖsL˚ڴœޑnہLݑ\V44$6,J4'59%..K+(+#.$-'r菸ЧۊxAǓIʖP)8)*!z#/9_,,&|;f:&G%%(ÖjH&ǚ+ݑZTlִɑ/;&2;-68&:98"/'7))* L`%]n Ónוي–q~!;9""L#,:U./%9:%.،@[ŖH׆ǚݖ¢ݑ ˮ<&$0:" :)9"8v=)#*%/4"QVH[4쏰ܯVtݹ1ēC8˖(T&{=D%"@$o+<:))#=>t= %Όzy3Nš"F ّo9/"$>B">^)=F"<;c& ,M<) 8ؕKwܸ<՛ߓn˳A 7 ?#?O!L' $)=+k+Z!K>? %6_&;3٣vG;|߇ɚ`@;",#!J"# r&79.(~ ** ! ݐiݷ̌c,kޖ/JRՈޚ߶"40 *]&7!!-!*"O!t >:,6>cǴ vݸX^Ċȩۓ$l&><:>##j<896 45:ό­ޖ;ɐݚK1>]07T;^!w57T ;$<$7X&?$>ʠkà^5dG .34='~#; J9 C; o<:P2?#?¢ڗۏʌۖZΰޚ'j+$< 950 <$$U8X$36 G6" ŷ#Ǻ(ƠNن̓Z7ؠ?!19t1&8&&: Y9%->'&:ʌ b}ږrϦ|͗ښMÑ??;92/68>)8H6: H%̧Փ\xԖʚZo˚/H6"8?7J2"(2 jde67ÀՓ<זHbȚG 5h0<)><4++75a=6;{֖`H֚{D̑,oºr5+?()5 )+]2<6D=?3X3- 6ݏ,%Կ8_ӓlƊcі&̚t73O4A84G/+_321 ; \IҖYњFӔȑVő:,0 .0H M}%  b<5#oˏi^ҍS'>UV –53皃RZ:-'9 9)$@$/3gg $/̚fπԑ\-7Řw]Y0U2K#V] RXe[$WXVDL*V<.Z^Led\f3CFAxkwFLZJBpIDQI+4NⰌʣ?Ƥ & ᮦ͠]A.DoAQHoD@HCBL#\ۧ8+ӾٴɓkX&K&@9]s_AqC]AqYERYtw{!ܐ)ή5չaW$[CT^Y_6\_GpBeQ KpB\e䴐5z&q3CX~]sT8^b_r}ADV\S%I¼ӽи\õR񳞺JG[[]s^!L\s Z[]QiUǪ4GǸﴑS=@EJBA]#ZJ _LVC$_Vyw|mqo`I;A@kB0@=AmF[H0CKhPE)鯌b R'E@BgXm^]SNTm]XB^CSKJ6﬐ҫ"Vsۇ3AlA[^UB5SW]@B_ic^ۚpf MMҩE AiW@_kXDmUDTG^,GbDɑ-d\GFnǩ/B_\W TOYXHF_iUKNBՍFɩ(pD^ÑۨZiu,SKYPA>RT2XCxH^e%F}6?R8 ӭO\n^BVYbC)R}@Y@ID@Ȯ{ܘ5MʭPG?U~R[DDXk=[^GVXnW8ӫɯO4Od`"l)TEQ8FSEYDF_\i[Up&湣ԷĴ1Tܮj)~\mPEZV iREcViDH+_O_5Kƒ,p褚hɦҚ`|RoT^GZKEWViUkWpT;jRCSnuHﴭiQÞԧcAMQH[[I}FcRRWUU[A鋿EЪ]N"[CcZHDyL[~a\DWɳXﰚ!Dz-.Y"Yh R7HSU%H/^KUE`M?]O;-}ѬРJŪ'Jf[_VHyJoUfNWJbRh ͢4kMzoA= ǫi %H%[J^ITHKSd{W['. [°V s`>YWI>S e{XIDSeMfSXYK$-ȪAr=[eQ%TV\MBJPeRM[4QJf(D7D؉.ИŨs޵]]a29\p3TMJV][,X.'4[taۋ?4Īдa`cKY1LU`WLWR`dUV \*1RPծ̭ZvKLIJڈD)2#PO&OT]`Q(^X`NT0T#鮐ڳܲVXLPZ`nOYVLo2SmLQbs {C͟Ϗrс`Ӭތ;8%')/"I$4q$Śy܍<ܑ,ٞAӑz%i<,8v$9[:"I-T (~((P E ><+Nē g :%'8%;%B&S4ǐÖ.n9nnxڑ8,"<%<.?%>;%(.՜ܠ 0>|ؓ8.Z.6!9R>%K'=9%#и\ўZ1?Ï4@ՌR7A6:*81 9?"t'0#):LژW/ mݐG×ǚԠD3(t;;>i5?f> "688cЬŒJ[ݚVܘ߱ۏҺ*(5:"m"=!z<,6>(8:ޒcšBVّTܒrԑHs =?J*<s<4\8ߖdcMܚsHiQƑlv-( &!`>!A5"C>Y ?;T6: ίB߃l@?ٹ<5*,q o< ! %PڰʞsُޏlLǧΌ;2?%1 #<"#9 #4T)#r#UIHxW޼üɠŘm/ /< :p1"C:$O82>F%ߖf@{؜³$ďȐ1#1=e&"D:f K83: X< "ΣؚHĞr‘mǺˑΑ4\4#1z'_:`&U$% K1'*=wzۓyūؖ ڈƚgw=!;a?n3%910;*'$; 9R6ۖDΧ=̶ٚ*ƀdl‘EƯ4:&:&1%:$|$>q4%ϽĠΑHc͸14{ ,868&':8L+n:9]ΞWڏ+=ʒˌV.!>$=&R7'+(<z98L7@)Rbּǘ<AǐHXٽΠɝʆ91&&6 >=%86 (? >$ fږxe˚՚ɬHRj>28>*'6466e0&й՚gȍԌ֦ϑǭÑЗ|'<5+U7*K)1D>4W8=75q|֧Փ+&s5*6+,4'31=(d>n2%(w3%yy̐V.ĠA9L̠Ϯѱǘ 0.6)^5>f,897/n&͚Hճdʏ*{>եǞfM7!}6=43,=,,?.X7`ˑ5ŊǑZI̘$iH&/,2;7=>3 2,5:P#H>IіrͳaϚwXʏ7{Þ>n2.,21?C? }SNUfM>ϑD]_ Q,!j!?k;)=#-y8֓׳A߬ wWOa :!Ꮥ*R"2&$v<K* :=2s0ZRZHM_JБn޶E٘J wD(KA3F^% Cʨަ< 31[+DF,GX;^E]&񯾽ҡ ʍ2D1m\6[LDADM뺴§܊w[mDW^>JJd]R]µhTRZVY[OU;;rސ;k7ySRCZ[n[GMJU YJwZᏉ[)_1\rBE|R VPҩ~ JVl҂HkDA[rHaAJ S>ے }$LGL*ENEH=TR񪑡%nHuHޞvӤ##/.&2,'Tfɥ^ƚ{Ɛ0+T%4#!,Y6(uӗJƆҐt\/-s 2' 9<獾ޝŒLSs(#&C<XpХcˏZPڌ U *8#8&!9P`tۑߣ ב0G$d5#-5)4: ڠB؍WԠFU`\)0$[;(;œD ҥĖȇLv#"*$*OV)ˉďaקֲȌ#?C 6l-F6.239@^ґVb?ڑ`+;(I:":)?<Վ-Ԡ8dݠ r z/) ?+ 26ѓē׺ĖMS>2.h=+w,'& ٞ QǏ1&!*; p=&3Ɂّܰ $V8%S9.;?!۱Ѡ:֒Ԡ2!8+5!L:œØ1s#4! &*|ˍʞ{,Ĭw#+l"%9)5zȚ<߶ޑ*e z =$==,)&ɐL;&֠ JA-E!J&u^-$"*794=Ӆ-–.P)m%<',eО&ھǏGt!@,""?/_Qޚܝ~đn&5~0&;;!:=۠ݐaiuԠ*;9?76Y>~fP“ѬԭÒ/9y?d"#8!1 'ߏâHמ^E[>?= =0g<8 –CJ"Ú" :#5*G $xĘin< '7+:'u'%*Wfs²pӓ;:5Q;#$b? !"ݩƏ[֞"'!=: ?38RnjٖD!!ۚޚ1=> :g03 iŚ*܂*ƠR#5J$>R=TؓS;DۖJ΋>&= ;D>7(Ԟ/[ Cޏ-".9U r?w$2#>~՚zXTÑ+?<3?-:vlȐֆʹ .h231D,%6!03(ѓ-P5')-*4gL6(7?/~pžĶT"&3S08f3, a1ӴyКʋ=l ]39/;36%{F̐ ֍E 88854]*0goДyvؓ?2),;2F0/q#ɏn̡iճ¸%/46?7z7Ӗ*q՚~ :h9;1T82 ̐ޯ .h#3k&> +7,+RmD W6,D15SD,l* L=̖L ǚ2MRbV\]UaQv-0Ҧ8ؠ([JWYF]ybW:NKDZ-)rtEKI]jJzFDlCZN]F.A-WϠ1;2\CWFL@'CaEFH>9-a0FE\ǼOJIF}DlNA:ElX/ҬX? oJjC[EKSBI3WEM<Ώ(!߼VcAuF&Dh@\GXr\,Lf]xſ{޺;9&=BXLMTBYq_AKo~Tgrݣ7$H'ʶ{Җ[\q\\A@nDZNꪼL9G߁l0Y@HAKArBGVbɆ,xޡէeH/@@^PZIhXMSI꩑\|٧2MQA5F5^A[s[Uஏ> ,äļ,4$uZL[iq#_\_V8ШpݔѮ<{Y;V]S%]X_HA:gd;ޤ7TxID(P^WK'WX=>O`+\0 9MV\8GAie\VCfqMjɾaQ?&"EXJLhEXF_#FU 2֐;۠fc 6DfUiD9\siIC\PTzKbf];(BPVFVP[FEFZs̤ ɳGlњ\GED\jXWyVfDbFgj+[ô[nPY]!GqZ8gWrHB֍ QSYۆ_K*ZgZPUQLI:EX+/vդ8VJVJ\HBtTsS(ȧL=R}=d@hU TgWR^]T\H+ӶF뵓79AO=CUlW@Sqg5DT LPlUD[DpXB$?0GG^[G4RGKw_-[hX'+ܚӪ%/8_FYE\]ST)EKX9Oߚ󹿯+Ѧչ9ڞ8BNX{cWTVZVe.PNBBݻ[,/Ϣ#,VbjQKWJ_JKR JN٠ f桭ݢ _HTeKP[`H ^ Wk覞.;#&RJ Y}_S&KMAV+ ^yP@񰚠"ߨ:7QwaUn_\aDQA1\ M opsIx!r^O-W/`/\LVVHBy͓=mUҚ'[Q()=^0]'\пϖQ1mVK3Iz(5f.T|>籪̟F카T/ X$Uf( J/h7.*/֧!Γno D-e+-H.dV(S+PĻUe̱ӜM<j*K=&L%%N/N7đ(dtؑՋ%Ԙ`D-NS1T9'R^/Zr-ﶛ_aٽ5YJ#[[/6MO.al.OV˘ЏU0?ޞ̧IWԏ/6,^E/{`o+M#*H鈴g䨑ۄ .oOm,9O7'MK-O5QL㠐oKԠGð#b3jV$NF%X=)J ڬIѳ׏eG؈ſ6Y.*L4PFQ$&V,wɖ$~ϚґxґDW'[sV5=P7l_wbȎ͐۠Сڦhՠ'T[W5QxRO4.m[*zۉއΖ[%^Қj+9S!9X%62%f#/4)N:NZیҔFɖW~!T-:10/) d#&И*؄ ӐB8[X]-)./2+n 1$oڟǓ< ǖKYb$/19(,-#5 V͏Xڲ܌A۵H2O y4 [6+x43.ё ؘпIʐd:5q/v"*%" , N[Ѱxؾ͓҄ɝ()+54)$90$aکYӈJӞ0Əէ?r"~'!4.$3.M\KĞӑxկDܑyHš61/!7g$6:*:+RM۠_e菍ĈO~),e4+!%r6<.z8/՚cօ{ޏJ?ўal2<*0=)L*E+t+a,K& ĚڨŌБю%<M,;Z(;##8*%)7ѬӠՍҚܠы+!$<>T(V7# K;'7?˖"ÍۚuA?ԏ%%=z".Y'88$"ŒԺW–o¥.ÚE3 $s')(/v k;q$Nx֐yߠ(!S&"~:$c/8`' 5fmߓ7Ԑ#ÖQ͚=$#@%.<-++ ˏeWw׌ߜi ǖ)#,F>C%a?9$#%.fIߘIߐ:ڥ1/"d+0+&'R9>e'ZzoÓt(/7!9#b9!!;81,IʞTG]+_dҌZ89m75:`5d9*>4ۑ1޻ԑè-!E5w<`8 }"-7&d0-1 gJ&6W3P.?[>_ D"&)~*Ə'"˞֛$I)6 q 1"N'$Q +&mǚ ۑ8B4ґٳ!"" (t# =>;u3 cmm$L e>9}(?.W*?9< ޚߜ"ۏK*5 = >!*"R28$bfږNh?ߚ0ޒ? #40*%&$" L$/Bې]^4נJM3ޠ/) *!!F >=-=+ 5Lޖrxɑ$:(#*t1!'`;( Όfŀݖmݶ K"i'?Iޘ$E*B%%i$ɠ@0̥à|3)'%!G D S<(&4,wPޖ•2PH؏4+\'v50? ' ;rU ƌeYŝږVcۚ (=l>90:0< 3uӠȒړsʠw!5>!; "0p \; )ؓkzkږEP%뚘= 9 <:%2o$119<ߏoHģ͌m-/!3 :&g%<> :3Ͽɘ߭ȐI?29&4l3;?# 6 ܁?(ۓPȣ($8F l;'9| @09ޫI׏6(J0X d1j%l?$=*'6"[ UǑfƢ̑ǘ,ӏ 67R'n.7 ?P"%վؓ(͋ȉՖ 6@&7 0=hچҏ&8[=91*?*=.GEΑ x͑XPD;5,=l(/7()j3 =6X͠gCɐ‘unЍ(2>*;9?N4+7,9ӜŚEϏ͞3(O+4J6L=7?eM њ$нhˑo<O?03,14,<3-8j؟ TΛǫˠ,-դ<<.4>*4m=.~6$dҖԎY<Κ̱{>.?5;5,E*16Dƌs;;Ŕ]E121~i0($HXr %>?-15"% %okۏWoj';58&d%l%#4>GϖOЈϚ?lν ϑ9.<_'b+XK-*Eeܶѐ5{<;+/CRKkU^,@TkP؍Foq𠷙MJAJnP/BCo^6@au@ sM@lE7@ A]WT9檤>Ͷ)7pE}oJ^_tDMxD@ӽFҚ=F_t[_BTYSG!οۑC@~%TQYVY:\eYnCY焾F٫P0mTyW[^Y7BEWBML'ASɥٯ5JSOT]NJB.A-Vr[CZ^)Ͻ *bw;oDMF\lnP:BRVu*CFC:wXAX*n^F]Yx@ĕӤǮoPF@_@]BClU]ݗd6㘱Y^;CV^@GFZRV,TټUhB5sI[QREdTR@ Ȓ~s46h7@RP@ZE^CTs粌HM q~ϚVPExD_Pxl5VPwXtLnpuvΕHPMS_]SBXUfj(ɨؘ֭_CrO~CTk6UJEX$"f:U;G@pWTVh_JW|,WeDʕd${+ kQHXbJuPzN@s٠(ȮlǐSePHm[cC%VJJ9m?lA;`g]DT/RLPYVUԸ3]HNPSOXHsI^$ ۣu])z_4OZHS]?T\TW U΍^w\E%PhJ Z]SDOa_ /̬a;>]מrXR+E(NzYaY *^â( 5Y8Z4^Ra7QM(QQ`z޷M٠W/QM!TcOYKP!,lߢӴn[`V=OR2eV]W x7ٞ/ѥϏVß\+;UdUW-JXHn'M@문d( $Κ,L./I%J.J2\ǠYW޾Үڳ\@-g}1&ST'tK_:!ۣ ɜ%Қ{ٕ\L%gKZpXnQHMI=z0ZԊ?K/OtNV cA.W5̴dӘ ѐ`9W$2P5]W<-[6RȴϏaڌ\R@6Z4u[7kQt7OZ15ۑ5P%]5^P6O*'"-,ԠEʌz",p0J,'F30#.$+!N ٬bʫ8֏EР6%Z*&x,34L.V!ɖ`yΚ54)S,'qZPЬ#q Ր΍ȒW)ZD()6.!6مӔ"ީ͓gI8.<'."6-=; ͟ҞT[gŏl*4Q&b--W3 M7 Ұ̡ԑ9UѩBݑy +4+13x"n1'QOҠЇj֠Ю""1.&S8H(j,"LiٻȖme׆ ښcKc="(+.2->&(k;ۏۡیz݊PN+/0|'K76/:օБUۘ@2]9,!?+R$,Y/hP㏞iv4D6' -"*;{4%Z`J̞W\ߏQߞM(84$&"5"̖_f<Śtƽ6`b!]%g. #n6-'=ĺِ;Njzݠ2ޣX9.z%J6'-:O+v1Ó'֊u'˖u&";&C.T%%j4۞GsȏIHΌ<\P!s;. ;p#g=.LۑEБ">_j)=#?(>6$K! ڠjėذQ,6%i/D<)/F=MߖB؀ښhliՏx#=-.8% 8T<(JPь n"Жӥ.(b>:#)^%/!( {٘:Tڐگ8_+%,I,R'B%@<$Bߏ]ۃԞt'*%/$"s<71 ǚߧ߅ܑ0h#)"="@<+v;ŜZȠ7+۷,$(? _ /ȓ\ʚ"D!&2"7:7l#Dޏܧ~Tӌ4I75:q48?9 t&r!ՑJVØ4:<]> H$(",-?¢K}Ǜ/ݓΜ\9?# <# $֞q&^M7,!P8'5!E*r#|, s]ޅđ`ԑ8!#" (!"&8Ө__85)VF(ߓjob›ޖp8<:=@&k1u=[$Bߏ܏'W&Lӌ??{2$ 1o"<%Ӆő 2vϑc=0V"I:+ M#:7sǨ͝d $;74g$y3n3*!'=ŚހLJÏgY<#760P=Z$;!9#ьƷEۖ*~LO=|%!?w :027DǘNe΄WOژߡ8) 4v33d#917 &i);bTǚGΏ^à8a4>5&(;B:70O(ٖVڊٚ1jܑ;H:62 e0# ːն z0*7S1^'z7V ?!G ؓ6‰-+57 `6%4 c5,; ۬ ׏fˮ 2Z2 l2&=&?>*D"և̑/gWƑl#|2j'?K+7H++( ĠEȠ'̭I&5n*0?+4NăӖL ϚU 1>*j<>G7L/$Aθnj͈͝ԖA>(7a.(5ku2c4zUʘ;Ɛ,$7x?.19s8A65,f*2eP786.*55Dw+̏9 ªр@ '3.0:65F1 8ÀӚ]ռȑ$E=">3-.7/3fȐjӼ˶Š\G4-5>.5~*nѓW~ɔWPݩ=/<8E $gsCጿiY q h3#m>%A%&gݑūژV6&55!&&n ֠=ԗŬ@ď8?j5,3P8Dݓ5XՖPg8?#d,KQߞRҩE폺Ec]^jPg.>0頺1~)À[_u_MKlwѐCBD@"SFP#_+iYTnZ]ND)P|pš?}ν70HAtE]y@QXӞN5n!JCwl1@GF Z9q 2DQUZt\_Rɘf񽏼i7A]NInZJ1Ϫ 免LU^LuQKe;񏗼Ty"eLZJ%^/V@J4_ɐ.F{t\0]HBsBCGFF4iEiA_Xv9"ȩ& WmBRD[@4D oԕyԻSXhOLy06oMHQ TbMJkzAf^][Z]͵ݬ]JNTghx_K$Inp,BZSUh.R_-:Żw_I[QT]UYNyPDY EXc_A])¡`)/Ec)'SK]YQ8ՠ͏饙.p)"CZF$]=Ԥ"䩑(ՑS`ZN[!K#Vѐϫdo_\[[=VDEPr`#ֲ?6A]bSPF0aVo놯c6ԏG](IRpZ[H0A#ŤЧ;F(4QJX;El-E]HfƦؑ5DR8L]3^;è@*$]MUf;%sAΓ#\SMKKT`7_26 GVD/HK9QkJ^«ϖPW/2/UNN\77krӸ/Zd,]:@۞Zے˿f,!R\X薿0ͶɲںQMS\F!uh<"Ҙl?C H3*XaS"M]Mˠ ZkLg;4wVH'39X{vwȖF=ОfYW6(%J] jM͏ұHV(b+U2\-WĚ 2HZ:)Y)N7אͩpR\H$]x#xP(-"6PP(q tM'O[+29 ۚy1׆!,FYh7X#+;ʏ(('֌MӐ*OZ M-M!:wёMف2(6QP9\wѐ4oiEҠ ?[,=,O"'fҳ]4^ߧi_4 +38T9YʠKߏcM#g!-G:qL4מTPڌw\$ WZ,7&0(rOBzGoґ0L&3!*4'PI iߔܠd;U9,#LkջȓqnS8#2(T,,Jԏ-+̓K^ #v38*'7UܐG˖ײ%8U.v8 3/ @ؑU=DŽØK7/2$08~'ӠحaӠxg#'H80,|v8V˓ңGܑ˖$)Zo'?1"_Ώalٞi)5y(.,SUҲǖ Kdb1&88 q!_,QDƠט(O,;8,+SnڠțᏵ[1$.m7q%{&Uq܏Ŗ$("-8)n"n+e֞̏ &e'$T*Pƚa&ɉ=(I+k+//[bΕޘq/Ԑy0'!>'$+ p ߗ֜iH ,G*8 )9fݖn"ٚ(,J' |;3cߤنQ- 'n7 * #šLsQȡّr >R,"u/6?%ٯיqސs9?'){*j(9 6[?×ٽk6.:/"> 0%zWݚ} .+=,5,ǏWGό4F.=+:)5k6sʦۑLQ'<%?a#֐݊HȠb# C% ;;<= _ ڏ;܁Ȟ3~>>a#% " Č6KÖv¼9<" ;=+ѤՑ8pڻؘA(<^<> %.ިȳޠÖz_q4<"c 8](ݓD՝ǖ%L #. ݐ؄ނĨ̠UF.;O9! =QaB`cŀ֎ᓐ+0 x##B6ؚdŏ>:3*<, Y?Mь9ǻ)+'+&w>#ّ86ˑD[x!a9?>3#M:)ȠtC|ɠc?P&! r5c%8ٮ ߓ!4& 8v;!)aď-FA׾˞< &1>"+ޖE"v;G$ !1"7ϑOıֻߘz5&; >('c@àZε3B&=ca?!ؓ*:ȅݖ ">!8'9Q"Ϟ—O ~6 >96>&6ƫ֖پ{ݚ]"(=M ;0pϕƘOA !+=$h>s0>g e Nq`.?<*&E:d7ÚЃU!9>66:'& 6ʌ6'D1*66);* .ϑeǫϑlʸ*7$?'Z4o(_ҝ/͠CȠ6(;1(58<rZړH‘ %&4c 0!KΏo:a˞ :*)F8}>rؖ`Ě 3&6+*']5y VX)ӸŘ{s0)17*+v=*=Vñɠʆg >S*6$"ӓ-gxؖ:Sb5*5 Cü8&?$26:8F-wҖ)`ۚ&-1 J76hȑ͘42j#:,[(5=g5USϠ,oVnI$q1G-0S<+{Ӗ%UZ7-65#05$m[ĞÎjяc=1<80^7-NӚT 76??<G3H͘a#R2<28\8Zc!3S*5:*[3זkҾ L4!4!3 7(,67e02/:k82+|ɢZȘx}uʘS'11.<73S2G֚w1$d3X07:cΘ.7<)L6B<0E~ʫo.1i/3+9/ʴ\Υ - 4f36:Ğn!ͺ;O1c:51L A*i4ӚʿV7?2Ԗ̮X̚0K75p.Qr4Ğ2=2.  0)g8[ 2 NΩC/na9=Ve]B 쏝StZ .\ ul`8  tv_Ln e8[+bZÍX,I  vM=6S= :A94u4 \J P"n-/8kǝt & [o _b3+St*C [:h q"\o86* |9w /F%F /)9iID@};=V{ W 6jD9 0Jl96eqlEWoY6  I6l2h9xD8hY rNK6 Ѭ.sBmyˏ6k o&Ws6q,LBx#| *WEoM  v t~26N'2Ys4R>ǚP3:y5JE^&㖚r/CLO+蠅 ^>6̏3(Bʍ" v jͭakY vNuN˦V' zO;.FW* k}?d14}΍yJ&lU4L=W  a6ߨ|: V{2unN`!we Y  0x1: *)rLfdsv/[y' (1Xt=4+Ys/r둵AMLG`>rV, 0rj]Z/- eO2. 1pha~ ^.y [&=~#fӏ -rbiE효(-G@ P0܎b,."J.,:i xH/k9[tiҏ) R| S0̚b~1 6[t&N,7C#O*}$Jfl:i1oxUFm'+sOqb[]+a)fD @)u+$|bz$vP)sp u>bl4;E׏ww( jAL)* 잶VL[T*r(#C)\(( 春(t搆 2Ux׏]fٍf| r&Yf)89Z猫U&  ~u<1 &c 9 Q萬B0k ݏyُ:z&+ f%@tg% &+ E m%M' ꘺?" ~U(3ۏ$8 w a#VNNuT$ .w#0#}c }% C#G'#9 KrsdX!܇]/U -"4AZ돓瞹k T J"W6  "*U'rbF<gZ _hk3 }6 +'!W  ~C0Hx+s  u鑓߮E~8E(_ D1   .ߍ3K'gF  r-2(-,_pld+&!!)=f 2 G j4 =9&<A5;4lV*F8o_6ȉN6A:I,LSA:RÓialex4src/extras/0000777000175000017500000000000007710721372014303 5ustar pdewachtpdewachtalex4src/extras/alex4_unix.diff.gz0000666000175000017500000000140207710720330017622 0ustar pdewachtpdewacht"?alex4_unix.diffTo@Y.`SjFZmbň] rZj(xyXĶ8 4'ÒU80%ŋJ%j=wt#o31Ȩ^-׫$ }x0A۠,*PxcF\<9*R,W*5NcfҌ CY4SE&Y='ٞ(.뉪I)<%iK0b7~Έ9!/~Lp4뒐X1Ht8/ιnx%N9@Q JPJ a(<39R-デ.돞"o ߏp}WO{)mv2u*טزR[Wo]nu jSנo?@ҁK>䭭48|y1p`S{T_z=DlDisI[^<ŋp2NIN6ċ ʲ..҅/c dK8[5 6]alex4src/license.txt0000666000175000017500000003513707710022070015156 0ustar pdewachtpdewachtThe GNU General Public License (GPL) Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS alex4src/readme.txt0000666000175000017500000001101607710466710014774 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ INTRODUCTION Nine times out of ten when I start to write a game, I have planned to make a small game. Nine times out of ten, the game grows halfway through the code into something to big for the code to hold. Usually at this point, I'm to lazy to refactor the code so that it can handle the scaling. Instead I hack. Hacking is fun, but not very good practice. Still, if it looks right on the screen, then it is right. Right? :) Anyway, Alex4 started as a small game and grew from there. Hence, the code isn't exactly great at some places. Still I think it's quite ok in most places. What I'm trying to say is that if you're going to learn from this code, don't take up the bad parts, and don't look at it as the only way. It's just my way. LICENSE Alex the Allegator 4 is a small platform game, created to match the retro style of Nintendo GameBoy games. If is Copyright (C) Johan Peitz, Free Lunch Design. This source code is free; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This source code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA COMPILING If you're not content with just reading the code and want to compile it, here's how. First you need the libraries that Alex4 uses. Allegro and DUMB, get them on their web sites: http://alleg.sf.net and http://dumb.sf.net How to install and configure the libraries should be covered in the help files that comes with the download of each library. There, having installed libraries, just compile all the source files. Make sure that you maintain the directory structure so that the c-files can find the h-files that they need (mostly in the data/ directory). If you have any question I suggest that you visit the Free Lunch Design forum, see below. Please bear in mind that this code is supplied for learning and it is can not be supported (by Free Lunch Design) in any way. AUTHORS AND CONTACT Free Lunch Design is an independent game developer from Sweden. Our aim is to create small, high quality games, where gameplay is in focus. Alex the Allegator 4 was written and designed by Johan Peitz. Johan Peitz also drew the graphics. The fabulous music was composed by Anders Svensson who also created the sound effects. Visit us on the web: http://www.freelunchdesign.com If you have comments, bug reports, or just want to ask something you can contact Free Lunch Design by e-mail. We do however get a lot of mail and it might take a while before we answer, so if you have a question please check the online faqs and forums first. E-Mail: info (at) freelunchdesign (dot) com If you want to support Free Lunch Design in monetary ways, please enter our web site (see above) and click our sponsors a few times. You can also donate money from the site via PayPal. - the end - alex4src/src/0000777000175000017500000000000007710530540013557 5ustar pdewachtpdewachtalex4src/src/actor.c0000666000175000017500000003331207710456700015042 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #include "allegro.h" #include "actor.h" #include "map.h" #include "timer.h" #include "player.h" #include "bullet.h" #include "particle.h" #include "main.h" #include "../data/data.h" // pointer to datafile declared in main.c extern DATAFILE* data; // draw an actor at specified position void draw_actor(BITMAP *bmp, Tactor *a, int x, int y) { // check if the actor has any frames and quit otherwise if (!a->num_frames) return; if (a->status == AC_NORM) { // normal drawing, just select direction if (a->direction) draw_sprite_h_flip(bmp, a->data[a->frames[a->frame] + (a->is_hit ? a->hit_offset : 0)].dat, x, y - a->h - a->oy); else draw_sprite(bmp, a->data[a->frames[a->frame] + (a->is_hit ? a->hit_offset : 0)].dat, x, y - a->h - a->oy); } else if (a->status == AC_DEAD) { // draw dead frame, check for direction if (a->direction) draw_sprite_vh_flip(bmp, a->data[a->frames[a->frame]].dat, x, y - a->h - a->oy); else draw_sprite_v_flip(bmp, a->data[a->frames[a->frame]].dat, x, y - a->h - a->oy); } else if (a->status == AC_FLAT) { // draw flat frame, check for direction if (a->direction) draw_sprite_h_flip(bmp, a->data[a->flat_frame].dat, x, y - a->h - a->oy); else draw_sprite(bmp, a->data[a->flat_frame].dat, x, y - a->h - a->oy); } } // animates the actor one tick void animate_actor(Tactor *a) { a->anim_counter ++; if (a->anim_counter > a->anim_max) { a->anim_counter = 0; a->frame ++; if (a->frame >= a->num_frames) a->frame = 0; } } // gets an unused actor from the array a // a = array to look in Tactor *make_actor(Tactor *a, int x, int y, DATAFILE *data) { int i = 0; // find free slot while(a[i].active && i < MAX_ACTORS) i ++; // set values if (i < MAX_ACTORS) { a[i].active = 1; a[i].status = AC_NORM; a[i].x = x; a[i].y = y; a[i].direction = 0; a[i].data = data; a[i].frame = 0; a[i].anim_counter = 0; a[i].anim_max = 4; a[i].dy = a[i].dx = a[i].tx = 0; a[i].mode = a[i].toggle = 0; a[i].counter = 0; a[i].energy = 1; a[i].is_hit = 0; a[i].sound = -1; return &a[i]; } // failed return NULL; } // special handler for jumping the spike crusher guardian void _crush_jump(Tactor *a, Tmap *m) { a->y += a->dy >> 2; a->dy ++; if (a->x < a->tx) a->x ++; if (a->x > a->tx) a->x --; // check left and right if (is_ground(m, a->x, a->y-1)) a->x ++; if (is_ground(m, a->x+31, a->y-1)) a->x --; // check ground if (is_ground(m, a->x+1, a->y)) { a->y += adjust_ypos(m, a->x+1, a->y - 1, 1, -1); create_burst(particle, a->x + 8, a->y, 8, 10, 25, PARTICLE_DUST); create_burst(particle, a->x + 16, a->y, 8, 10, 25, PARTICLE_DUST); create_burst(particle, a->x + 24, a->y, 8, 10, 25, PARTICLE_DUST); play_sound_id(SMPL_CRUSH_LAND); a->mode ++; } else if (is_ground(m, a->x+15, a->y)) { a->y += adjust_ypos(m, a->x+15, a->y - 1, 1, -1); create_burst(particle, a->x + 8, a->y, 8, 10, 25, PARTICLE_DUST); create_burst(particle, a->x + 16, a->y, 8, 10, 25, PARTICLE_DUST); create_burst(particle, a->x + 24, a->y, 8, 10, 25, PARTICLE_DUST); play_sound_id(SMPL_CRUSH_LAND); a->mode ++; } else if (is_ground(m, a->x+30, a->y)) { a->y += adjust_ypos(m, a->x+30, a->y - 1, 1, -1); create_burst(particle, a->x + 8, a->y, 8, 10, 25, PARTICLE_DUST); create_burst(particle, a->x + 16, a->y, 8, 10, 25, PARTICLE_DUST); create_burst(particle, a->x + 24, a->y, 8, 10, 25, PARTICLE_DUST); play_sound_id(SMPL_CRUSH_LAND); a->mode ++; } } // special handler for jumping the spike crusher guardian void _spike_jump(Tactor *a, Tmap *m) { a->y += a->dy >> 2; a->dy ++; if (a->x < a->tx) a->x ++; if (a->x > a->tx) a->x --; // check left and right if (is_ground(m, a->x, a->y-1)) a->x ++; if (is_ground(m, a->x+31, a->y-1)) a->x --; // check ground if (is_ground(m, a->x+1, a->y)) { int tx, ty; Tmappos *mp; tx = (a->x+1)>>4; ty = (a->y)>>4; mp = get_mappos(m, tx, ty); if (mp->type == MAP_BRK) { mp->tile = mp->type = mp->mask = 0; create_burst(particle, (tx << 4) + 7, (ty << 4) + 7, 32, 64, 0, -1); create_burst(particle, (tx << 4) + 7, (ty << 4) + 7, 32, 64, 0, -1); play_sound_id(SMPL_CRUSH); } create_burst(particle, a->x + 16, a->y, 8, 6, 25, PARTICLE_DUST); play_sound_id(SMPL_CRUSH_LAND); a->toggle = 1; // don't crush any more , fall and land } // check ground if (is_ground(m, a->x+15, a->y)) { int tx, ty; Tmappos *mp; tx = (a->x+15)>>4; ty = (a->y)>>4; mp = get_mappos(m, tx, ty); if (mp->type == MAP_BRK) { mp->tile = mp->type = mp->mask = 0; create_burst(particle, (tx << 4) + 7, (ty << 4) + 7, 32, 64, 0, -1); create_burst(particle, (tx << 4) + 7, (ty << 4) + 7, 32, 64, 0, -1); play_sound_id(SMPL_CRUSH); } create_burst(particle, a->x + 16, a->y, 8, 6, 25, PARTICLE_DUST); play_sound_id(SMPL_CRUSH_LAND); a->toggle = 1; // don't crush any more , fall and land } // check ground if (is_ground(m, a->x+30, a->y)) { int tx, ty; Tmappos *mp; tx = (a->x+30)>>4; ty = (a->y)>>4; mp = get_mappos(m, tx, ty); if (mp->type == MAP_BRK) { mp->tile = mp->type = mp->mask = 0; create_burst(particle, (tx << 4) + 7, (ty << 4) + 7, 32, 64, 0, -1); create_burst(particle, (tx << 4) + 7, (ty << 4) + 7, 32, 64, 0, -1); play_sound_id(SMPL_CRUSH); } create_burst(particle, a->x + 16, a->y, 8, 6, 25, PARTICLE_DUST); play_sound_id(SMPL_CRUSH_LAND); a->toggle = 1; // don't crush any more , fall and land } } // checks the actor with the tile map // this is an ugly function with an if clause // for each enemy type void update_actor_with_map(Tactor *a, Tmap *m) { if (a->energy <= 0 && a->status == AC_NORM) { a->status = AC_DEAD; play_sound_id(SMPL_E_DIE); a->dy = -8; if (a->type == MAP_GUARD1) a->dy =- 16; } if (a->status == AC_DEAD) { if (a->direction) a->x -= 1; else a->x += 1; a->dy ++; a->y += a->dy >> 2; // add smoke to dying actor if (a->type == MAP_GUARD1) { Tparticle *p; p = get_free_particle(particle, MAX_PARTICLES); if (p != NULL) { set_particle(p, a->x + 8 + rand()%16, a->y - 8 - rand()%16, 0, 0, -1, 16, SMOKE1); } } } else if (a->status == AC_FLAT) { if (a->counter > 200) { a->x += (a->counter % 3) - 1; } if (++ a->counter > 250) a->status = AC_NORM; if (!is_ground(m, (int)a->x + 2, (int)a->y + 0)) { if (!is_ground(m, (int)a->x + 13, (int)a->y + 0)) { a->dy ++; a->y += a->dy >> 2; while(is_ground(m, (int)a->x + 13, (int)a->y - 2)) { a->y --; a->dy = 0; } while(is_ground(m, (int)a->x + 2, (int)a->y - 2)) { a->y --; a->dy = 0; } } } } else if (a->type == MAP_ENEMY6) { // cannon a->mode ++; if (a->mode >= 125) { Tbullet *b = get_free_bullet(bullet, MAX_BULLETS); if (b != NULL) { int diff = (player.actor->x + 8) - (a->x + 8); set_bullet(b, a->x + (diff > 0 ? 8 : -12), a->y - 16, (diff > 0 ? 3 : -3), 0, data[ENEMY6].dat, 1); create_burst(particle, a->x + (diff > 0 ? 18 : -2), a->y - 8, 8, 8, 25, PARTICLE_DUST); a->mode = 0; play_sound_id(SMPL_SHOOT); } } } else if (a->type == MAP_ENEMY4 || a->type == MAP_ENEMY5) { // fish if (a->mode == 0) { int b[] = {8, 14, 18, 21, 23, 26, 28}; a->ymax = a->y; a->y = 120; a->mode ++; a->dy = -b[MIN(MAX(ABS(a->ymax - a->y) / 16, 0), 7)]; a->ymax = a->dy; } else if (a->mode == 1) { a->dy ++; a->y += a->dy >> 2; if (a->y >= 120) { a->y = 130; a->mode = 2; } if (a->type == MAP_ENEMY5) { a->frames[0] = (a->dy < 0 ? ENEMY5_02 : ENEMY5_01); } } else if (a->mode >= 2) { a->mode ++; if (a->mode > 40) { a->y = 120; a->dy = a->ymax; a->mode = 1; } } } else if (a->type == MAP_ENEMY3) { // stomper/crusher if (a->mode == 0) { a->ymax = a->y; a->mode ++; a->dy = 0; } else if (a->mode == 1) { int diff = ABS((player.actor->x + 8) - (a->x + 16)); if (diff < 32) { a->mode = 2; a->dy = 0; a->dy = -4; } } else if (a->mode == 2) { int hit = 0; a->dy ++; a->y += a->dy >> 2; while(is_ground(m, (int)a->x + 8, (int)a->y - 1)) { a->y --; hit = 1; } while(is_ground(m, (int)a->x + 24, (int)a->y - 1)) { a->y --; hit = 1; } if (hit) { a->dy = -1; a->mode = 3; play_sound_id(SMPL_CRUSH_LAND); create_burst(particle, a->x + 16, a->y, 8, 6, 25, PARTICLE_DUST); } } else if (a->mode >= 3) { a->mode ++; if (a->mode > 25) { if (game_count & 1) a->y += a->dy; if (a->y <= a->ymax) a->mode = 1; } } } else if (a->type == MAP_GUARD2) { // ground pounder /* MODES: 0 long wait if jumped on, mode = 4 1 get alex pos 2 jump 3 mode = 0 4 spikes on, wait 5 get alex pos 6 jump 7 small wait 8 spikes off 9 small wait 10 fire 11 small wait 12 mode = 0 */ Tactor *alex = get_alex(); switch(a->mode) { case 0: // wait a->frames[0] = GUARD2_1a; a->frames[1] = GUARD2_1b; a->counter ++; if (a->counter > 60) { a->mode ++; a->counter = 0; } break; case 1: // aim a->tx = alex->x - 8; a->dy = - MIN(MAX(ABS(a->x - a->tx) / 2, 10), 30); a->mode ++; break; case 2: // jump a->frames[0] = a->frames[1] = GUARD2_2; _crush_jump(a, m); break; case 3: // land, goto 0 a->mode = 0; break; case 4: // turn on spikes, wait a->frames[0] = a->frames[1] = GUARD2_3; a->counter ++; if (a->counter > 50) { a->mode ++; a->counter = 0; } break; case 5: // aim a->tx = alex->x - 8; a->dy = - MAX(ABS(a->x - a->tx) / 2, 10); a->mode ++; a->toggle = 0; // crush break; case 6: // jump a->frames[0] = a->frames[1] = GUARD2_4; if (a->toggle) _crush_jump(a, m); else _spike_jump(a, m); break; case 7: // land, short wait a->frames[0] = a->frames[1] = GUARD2_5; a->counter ++; if (a->counter > 50) { a->mode ++; a->counter = 0; } break; case 8: { // fire Tbullet *b; int i; play_sound_id(SMPL_SHOOT); for(i = 0; i < 3; i ++) { b = get_free_bullet(bullet, MAX_BULLETS); if (b != NULL) { set_bullet(b, a->x + 16, a->y - 32, rand()%5 - 2, -(rand()%5 + 2), data[BULLET_1].dat, 1); b->animate = b->gravity = 1; b->bmp2 = data[BULLET_2].dat; } } a->mode ++; break; } case 9: // wait a->counter ++; if (a->counter > 10) { a->mode ++; a->counter = 0; } break; case 10: // spikes off a->frames[0] = a->frames[1] = GUARD2_6; a->mode ++; break; case 11: // wait a->counter ++; if (a->counter > 10) { a->mode ++; a->counter = 0; } break; case 12: // return a->frames[0] = GUARD2_1a; a->frames[1] = GUARD2_1b; a->mode = 0; break; } animate_actor(a); } else if (a->status == AC_NORM) { // other ppl if (game_count & 1) { if (a->direction) a->x += 1; else a->x -= 1; } animate_actor(a); if (a->type == MAP_ENEMY2 || a->type == MAP_GUARD1) { if (!is_ground(m, (int)a->x + (a->direction ? a->w - 1 : 0), (int)a->y + 2)) a->direction = (a->direction ? 0 : 1); } else { if (!is_ground(m, (int)a->x + 2, (int)a->y + 0)) { if (!is_ground(m, (int)a->x + 13, (int)a->y + 0)) { a->dy ++; a->y += a->dy >> 2; while(is_ground(m, (int)a->x + 13, (int)a->y - 1)) { a->y --; a->dy = 0; } while(is_ground(m, (int)a->x + 2, (int)a->y - 1)) { a->y --; a->dy = 0; } } } } if (is_ground(m, (int)a->x + (a->direction ? a->w : -1), (int)a->y - 2)) a->direction = (a->direction ? 0 : 1); } // play/adjust sound if (a->sound != -1) { adjust_sound_id_ex(a->sound, a->x); } if (a->y > 160 + (a->type == MAP_GUARD2 || a->type == MAP_GUARD1 ? 600 : 0)) { // change win conditions if needed if (a->type == MAP_GUARD2 || a->type == MAP_GUARD1) { m->win_conditions_fullfilled |= m->win_conditions & MAP_WIN_KILL_GUARDIAN; } a->active = 0; // stop sample if available if (a->sound != -1) stop_sound_id(a->sound); // if not already doen, decrease number of enemies left if (a->status != AC_DEAD) { m->num_enemies --; } } } // puts the actor into dead-mode void kill_actor(Tactor *a) { a->status = AC_DEAD; a->dy = -10; } alex4src/src/actor.h0000666000175000017500000000471707710456700015056 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #ifndef _ACTOR_H_ #define _ACTOR_H_ #include "allegro.h" #include "map.h" // different modes that an actor can hold // they are all exclusive #define AC_NORM 1 #define AC_EAT 2 #define AC_FULL 3 #define AC_SPIT 4 #define AC_DEAD 5 #define AC_BALL 6 #define AC_FLAT 7 // different flags that show attributes // of an actor #define ACF_JUMPABLE 0x0001 #define ACF_FLATABLE 0x0002 #define ACF_HURTS 0x0004 #define ACF_SHOOTABLE 0x0008 #define ACF_BOUNCEABLE 0x0010 #define ACF_ROLLABLE 0x0020 #define ACF_ROLLABLE_BACK 0x0040 // no more than 64 actors can be on one map #define MAX_ACTORS 64 // this is the actor struct typedef struct { int active; int status; int type; int x, y, dy, dx; int w, h; int ox, oy; int tx; int direction; int frames[16]; int flat_frame; int frame; int num_frames; int anim_counter; int anim_max; int hit_offset; int counter; unsigned int flags; int mode; int toggle; int ymax; int energy; int is_hit; int sound; DATAFILE *data; } Tactor; // functions Tactor *make_actor(Tactor *a, int x, int y, DATAFILE *data); void draw_actor(BITMAP *bmp, Tactor *a, int x, int y); void animate_actor(Tactor *a); void update_actor_with_map(Tactor *a, Tmap *m); void kill_actor(Tactor *a); #endifalex4src/src/bullet.c0000666000175000017500000000553207710456700015224 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #include "bullet.h" #include "particle.h" #include "timer.h" #include "../data/data.h" // sets values on a bullet void set_bullet(Tbullet *b, int x, int y, double dx, double dy, BITMAP *bmp, int bad) { b->x = x; b->y = y; b->dx = dx; b->dy = dy; b->exist = 160; b->bmp = bmp; b->bad = bad; b->animate = 0; b->bmp2 = NULL; b->gravity = 0; } // draws the bukllet on specified bitmap // pass along the map offset to get it right void draw_bullet(BITMAP *bmp, Tbullet *b, int ox, int oy) { int x = b->x - ox; int y = b->y - oy; // is the bullet inside the screen if (x < -b->bmp->w || x > bmp->w + b->bmp->w || y < -b->bmp->h || y > bmp->h + b->bmp->h) return; // draw it if (!b->animate) { if (b->dx < 0) draw_sprite(bmp, b->bmp, x, y); else draw_sprite_h_flip(bmp, b->bmp, x, y); } else draw_sprite(bmp, (logic_count & 4 ? b->bmp : b->bmp2), x, y); } // updates the bullet one tick void update_bullet(Tbullet *b) { b->x += b->dx; b->y += b->dy; if (b->gravity) b->dy += 0.1; if (b->exist > 0) b->exist --; } // reset bullet array void reset_bullets(Tbullet *b, int max) { int i; for(i = 0; i < max; i ++) { b[i].exist = 0; } } // returns an unused bullet from an array Tbullet *get_free_bullet(Tbullet *b, int max) { int i = 0; while(b[i].exist && ix + b->bmp->w/2, (int)b->y + b->bmp->h/2)) { create_burst(particle, (int)b->x + b->bmp->w/2, (int)b->y + b->bmp->h/2, 4, 16, 0, -1); b->exist = 0; } } alex4src/src/bullet.h0000666000175000017500000000357607710456700015237 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #ifndef _BULLET_H_ #define _BULLET_H_ #include "allegro.h" #include "map.h" #include "particle.h" // the bullet struct typedef struct { double x, y; double dx, dy; int exist; BITMAP *bmp, *bmp2; int w, h; int bad; int animate; int gravity; } Tbullet; // max bullets at any time #define MAX_BULLETS 64 // the bullets themselves Tbullet bullet[MAX_BULLETS]; // functions void reset_bullets(Tbullet *b, int max); Tbullet *get_free_bullet(Tbullet *b, int max); void set_bullet(Tbullet *b, int x, int y, double dx, double dy, BITMAP *bmp, int bad); void draw_bullet(BITMAP *bmp, Tbullet *b, int ox, int oy); void update_bullet(Tbullet *b); void update_bullet_with_map(Tbullet *b, Tmap *m); #endifalex4src/src/control.c0000666000175000017500000000720407710456700015413 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #include "allegro.h" #include "control.h" // "constructor" // sets default values void init_control(Tcontrol *c) { set_control(c, KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, KEY_LCONTROL, KEY_ALT); c->flags = 0; c->use_joy = 0; } // sets the desired keys for the control unit void set_control(Tcontrol *c, int up, int down, int left, int right, int fire, int jump) { c->key_up = up; c->key_down = down; c->key_left = left; c->key_right = right; c->key_fire = fire; c->key_jump = jump; } // updates the control unit void poll_control(Tcontrol *c) { c->flags = 0; if (c->use_joy) { poll_joystick(); if (joy[0].stick[0].axis[1].d1) c->flags |= K_UP; if (joy[0].stick[0].axis[1].d2) c->flags |= K_DOWN; if (joy[0].stick[0].axis[0].d1) c->flags |= K_LEFT; if (joy[0].stick[0].axis[0].d2) c->flags |= K_RIGHT; if (joy[0].button[1].b) c->flags |= K_FIRE; if (joy[0].button[0].b) c->flags |= K_JUMP; } if (key[c->key_up]) c->flags |= K_UP; if (key[c->key_down]) c->flags |= K_DOWN; if (key[c->key_left]) c->flags |= K_LEFT; if (key[c->key_right]) c->flags |= K_RIGHT; if (key[c->key_fire]) c->flags |= K_FIRE; if (key[c->key_jump]) c->flags |= K_JUMP; } // check if a key in the control is available int check_control_key(Tcontrol *c, int key) { if (key == c->key_left) return TRUE; if (key == c->key_right) return TRUE; if (key == c->key_up) return TRUE; if (key == c->key_down) return TRUE; if (key == c->key_fire) return TRUE; if (key == c->key_jump) return TRUE; return FALSE; } // returns true or false depending on if keys are pressed or not int is_up(Tcontrol *c) { return (c->flags & K_UP ? TRUE : FALSE); } int is_down(Tcontrol *c) { return (c->flags & K_DOWN ? TRUE : FALSE); } int is_left(Tcontrol *c) { return (c->flags & K_LEFT ? TRUE : FALSE); } int is_right(Tcontrol *c) { return (c->flags & K_RIGHT ? TRUE : FALSE); } int is_fire(Tcontrol *c) { return (c->flags & K_FIRE ? TRUE : FALSE); } int is_jump(Tcontrol *c) { return (c->flags & K_JUMP ? TRUE : FALSE); } int is_any(Tcontrol *c) { return (c->flags ? TRUE : FALSE); } // saves the control config to disk using FP void save_control(Tcontrol *c, PACKFILE *fp) { pack_fwrite(c, sizeof(Tcontrol), fp); } // loads the control config from disk using FP void load_control(Tcontrol *c, PACKFILE *fp) { pack_fread(c, sizeof(Tcontrol), fp); } alex4src/src/control.h0000666000175000017500000000421507710456700015417 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #ifndef _CONTROL_H_ #define _CONTROL_H_ #include // flags for each game key #define K_LEFT 0x0001 #define K_RIGHT 0x0002 #define K_UP 0x0004 #define K_DOWN 0x0008 #define K_FIRE 0x0010 #define K_JUMP 0x0020 // struct holding all control data typedef struct { int use_joy; int key_left, // actual keys key_right, key_up, key_down, key_fire, key_jump; unsigned char flags; // bit field w/ info on which keys that are down } Tcontrol; // functions void init_control(Tcontrol *c); void save_control(Tcontrol *c, PACKFILE *fp); void load_control(Tcontrol *c, PACKFILE *fp); void set_control(Tcontrol *c, int up, int down, int left, int right, int fire, int jump); void poll_control(Tcontrol *c); int check_control_key(Tcontrol *c, int key); int is_up(Tcontrol *c); int is_down(Tcontrol *c); int is_left(Tcontrol *c); int is_right(Tcontrol *c); int is_fire(Tcontrol *c); int is_jump(Tcontrol *c); int is_any(Tcontrol *c); #endif alex4src/src/edit.c0000666000175000017500000002764407710456700014672 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #include #include #include #include "main.h" #include "map.h" #include "edit.h" #include "timer.h" #include "../data/data.h" // current tile int edit_tile = 0; // path to current map char edit_path_and_file[1024]; // datafile to use DATAFILE *data; // current edit mode int edit_mode; // set new edit mode void set_edit_mode(int mode) { edit_mode = mode; } // set the path for the current map void set_edit_path_and_file(char *str) { strcpy(edit_path_and_file, str); log2file(" edit path set to: <%s>", edit_path_and_file); } // returns the path for the current map char *get_edit_path_and_file() { return edit_path_and_file; } // draws the edit screens, panels, whatever void draw_edit_mode(BITMAP *bmp, Tmap *map, int mx, int my) { int x, y; if (edit_mode == EDIT_MODE_DRAW) { // draw map and HUD int tx = (mx + map->offset_x) >> 4; int ty = my >> 4; // blit mouse tile if (tx < map->width && ty < map->height) { if (edit_tile) draw_sprite(bmp, data[TILE000 + edit_tile - 1].dat, (tx << 4) - map->offset_x, ty << 4); rect(bmp, (tx << 4) - map->offset_x - 1, (ty << 4) - 1, (tx << 4)+16 - map->offset_x, (ty << 4)+16, gui_bg_color); } // show stuff textprintf(bmp, data[THE_FONT].dat, 1, 1, 0, "TILE: %d,%d", tx, ty); textprintf(bmp, data[THE_FONT].dat, 1, 11, 0, "SIZE: %d,%d", map->width, map->height); // show start pos x = (ABS(map->start_x) << 4) - map->offset_x; y = (map->start_y << 4) - map->offset_y; rect(bmp, x+5, y+5, x+10, y+10, gui_bg_color); line(bmp, x+8, y+8, x+8+SGN(map->start_x)*6, y+8, gui_bg_color); // draw status bar rectfill(bmp, 0, 110, 159, 119, 1); textprintf(bmp, data[THE_FONT].dat, 1, 111, 4, "EDITING: %s", get_filename(edit_path_and_file)); } else if (edit_mode == EDIT_MODE_SELECT) { // draw tile palette // calculate offset depending on mouse pointer int ox = (32.0 * mx) / 160.0; int oy = ( 8.0 * my) / 120.0; int tx = (mx + ox) / 16; int ty = (my + oy) / 16; // draw clear_to_color(bmp, gui_bg_color); for(y = 0; y < 8; y ++) { for(x = 0; x < 12; x ++) { draw_sprite(bmp, data[TILE000 + x + y * 12].dat, x * 16 - ox, y * 16 - oy); } } // draw selector if (tx >= 0 && tx < 12 && ty >= 0 && ty < 8) rect(bmp, tx * 16 - 1 - ox, ty * 16 - 1 - oy, tx * 16 + 16 - ox, ty * 16 + 16 - oy, (logic_count & 4 ? gui_bg_color : gui_fg_color)); } else if (edit_mode == EDIT_MODE_STATS) { // draw map properties int ty = 16; clear_to_color(bmp, 3); textprintf(bmp, data[THE_FONT].dat, 1, 1, 1, "%s (props)", get_filename(edit_path_and_file)); line(bmp, 0, 10, 159, 10, 1); textprintf(bmp, data[THE_FONT].dat, 1, ty+=10, 1, "Win by:"); textprintf(bmp, data[THE_FONT].dat, 1, ty+=10, 1, " 1) reach exit (%s)", (map->win_conditions & MAP_WIN_EXIT ? "X" : " ")); textprintf(bmp, data[THE_FONT].dat, 1, ty+=10, 1, " 2) kill boss (%s)", (map->win_conditions & MAP_WIN_KILL_GUARDIAN ? "X" : " ")); textprintf(bmp, data[THE_FONT].dat, 1, ty+=10, 1, " 3) kill all (%s)", (map->win_conditions & MAP_WIN_KILL_ALL ? "X" : " ")); textprintf(bmp, data[THE_FONT].dat, 1, ty+=10, 1, "4) Boss level: (%s)", (map->boss_level ? "X" : " ")); textprintf(bmp, data[THE_FONT].dat, 1, ty+=10, 1, "5) Name: %s", map->name); textprintf(bmp, data[THE_FONT].dat, 1, 110, 1, "F1: back to editor"); } if (edit_mode != EDIT_MODE_STATS) { // draw mouse line(bmp, mx-4, my, mx+4, my, gui_fg_color); line(bmp, mx, my-4, mx, my+4, gui_fg_color); } } // updates the edit mode void update_edit_mode(Tmap *map, BITMAP *bmp, int mx, int my, int mb) { if (edit_mode == EDIT_MODE_DRAW) { int tx = (mx + map->offset_x) >> 4; int ty = my >> 4; int pos = tx + ty * map->width; if (mb == 1) { // put tile if (set_tile(map, tx, ty, edit_tile)) { if (edit_tile > 0 && edit_tile <= 48) map->dat[pos].mask = 1; else map->dat[pos].mask = 0; } } if (mb == 2) { // get tile edit_tile = get_tile(map, tx, ty); } // Handle key presses // // note the ugly "if (ty < 7) ...)" that I had to // add on all map changing commands because I had bad // design and didn't notice until afterwards that // it was possible to click outside the map :( if (keypressed()) { int kb = readkey() & 0xff; char buf[1024]; int ret; Tmap *tmp_map; switch(kb) { // next tile case 'x': edit_tile ++; if (edit_tile > 96) edit_tile = 0; break; // previous tile case 'z': edit_tile --; if (edit_tile < 0) edit_tile = 96; break; // save map case 'S': // get filename from user strcpy(buf, edit_path_and_file); ret = file_select_ex("select map to save", buf, "MAP", sizeof(buf), 400, 300); if (ret) { int ok_to_save = 1; // check if file already exists and prompt user // for confirmation about overwrite if (exists(buf)) { char tmp_buf[256]; sprintf(tmp_buf, "The file '%s' already", get_filename(buf)); ok_to_save = alert("Alex 4: OVERWRITE?", tmp_buf, "exists. Overwrite?", "YES", "NO", KEY_SPACE, KEY_ESC); ok_to_save = (ok_to_save == 2 ? 0 : 1); } // allright, let's save if (ok_to_save) { if (save_map(map, buf)) { msg_box("map saved"); log2file("map saved: %s", buf); strcpy(edit_path_and_file, buf); } else { msg_box("save failed"); } } else { msg_box("Map not saved."); } } break; // load map case 'L': // get filename from user strcpy(buf, edit_path_and_file); ret = file_select_ex("select map to load", buf, "MAP", sizeof(buf), 400, 300); if (ret) { tmp_map = load_map(buf); if (tmp_map != NULL) { int tox; // destroy old map and switch in the new one destroy_map(map); map = tmp_map; msg_box("map loaded"); log2file("map loaded: %s", buf); // set the new map as current set_map(map); // setup initial map variables map->data = data; tox = MAX(0, (ABS(map->start_x) << 4) - 80); tox = MIN((map->width << 4) - 160, tox); map->offset_x = tox; strcpy(edit_path_and_file, buf); } else { msg_box("load failed"); } } break; // position items on map case '1': if (ty < 7) map->dat[pos].item = (map->dat[pos].item == MAP_1UP ? 0 : MAP_1UP); break; case '2': if (ty < 7) map->dat[pos].item = (map->dat[pos].item == MAP_STAR ? 0 : MAP_STAR); break; case '3': if (ty < 7) map->dat[pos].item = (map->dat[pos].item == MAP_CHERRY ? 0 : MAP_CHERRY); break; case '4': if (ty < 7) map->dat[pos].item = (map->dat[pos].item == MAP_EGG ? 0 : MAP_EGG); break; case '5': if (ty < 7) map->dat[pos].item = (map->dat[pos].item == MAP_HEART ? 0 : MAP_HEART); break; case '6': if (ty < 7) map->dat[pos].item = (map->dat[pos].item == MAP_LOLA ? 0 : MAP_LOLA); break; // position tile types on map case 'q': if (ty < 7) map->dat[pos].type = (map->dat[pos].type == MAP_DEAD ? 0 : MAP_DEAD); break; case 'w': if (ty < 7) map->dat[pos].type = (map->dat[pos].type == MAP_EXIT ? 0 : MAP_EXIT); break; case 'e': if (ty < 7) map->dat[pos].type = (map->dat[pos].type == MAP_SPIN ? 0 : MAP_SPIN); break; case 'r': if (ty < 7) map->dat[pos].type = (map->dat[pos].type == MAP_BRK ? 0 : MAP_BRK); break; case 't': if (ty < 7) map->dat[pos].type = (map->dat[pos].type == MAP_WATER ? 0 : MAP_WATER); break; case 'y': if (ty < 7) map->dat[pos].type = (map->dat[pos].type == MAP_SURFACE ? 0 : MAP_SURFACE); break; // position enemies on map case 'Q': if (ty < 7) map->dat[pos].type = (map->dat[pos].type == MAP_ENEMY1 ? 0 : MAP_ENEMY1); break; case 'W': if (ty < 7) map->dat[pos].type = (map->dat[pos].type == MAP_ENEMY2 ? 0 : MAP_ENEMY2); break; case 'E': if (ty < 7) map->dat[pos].type = (map->dat[pos].type == MAP_ENEMY3 ? 0 : MAP_ENEMY3); break; case 'R': if (ty < 7) map->dat[pos].type = (map->dat[pos].type == MAP_ENEMY4 ? 0 : MAP_ENEMY4); break; case 'T': if (ty < 7) map->dat[pos].type = (map->dat[pos].type == MAP_ENEMY5 ? 0 : MAP_ENEMY5); break; case 'Y': if (ty < 7) map->dat[pos].type = (map->dat[pos].type == MAP_ENEMY6 ? 0 : MAP_ENEMY6); break; case 'U': if (ty < 7) map->dat[pos].type = (map->dat[pos].type == MAP_GUARD1 ? 0 : MAP_GUARD1); break; case 'I': if (ty < 7) map->dat[pos].type = (map->dat[pos].type == MAP_GUARD2 ? 0 : MAP_GUARD2); break; // set alex start position case 'a': if (ty < 7) { map->start_x = tx; map->start_y = ty; } break; case 'A': if (ty < 7) { map->start_x = -tx; map->start_y = ty; } break; // show tile palette case 'p': set_edit_mode(EDIT_MODE_SELECT); break; default: break; } } // move map if (key[KEY_LEFT]) map->offset_x = MAX(0, map->offset_x - 4); if (key[KEY_RIGHT]) map->offset_x = MIN((map->width << 4) - 160, map->offset_x + 4); // change map size if (key[KEY_INSERT] && key[KEY_RIGHT]) change_map_size(map, 1, 0, SM_RIGHT); if (key[KEY_DEL] && key[KEY_RIGHT] && map->width > 10) change_map_size(map, -1, 0, SM_RIGHT); // when pressing left, alex' start pos must be adjusted too if (key[KEY_INSERT] && key[KEY_LEFT]) { change_map_size(map, 1, 0, SM_LEFT); if (map->start_x >= 0) map->start_x ++; else map->start_x --; } if (key[KEY_DEL] && key[KEY_LEFT] && map->width > 10) { change_map_size(map, -1, 0, SM_LEFT); if (map->start_x >= 0) map->start_x --; else map->start_x ++; } // enter stat mode if (key[KEY_F1]) { edit_mode = EDIT_MODE_STATS; clear_keybuf(); while(key[KEY_F1]); } } else if (edit_mode == EDIT_MODE_SELECT) { int ox = (32.0 * mx) / 160.0; int oy = ( 8.0 * my) / 120.0; int tx = (mx + ox) / 16; int ty = (my + oy) / 16; // get new tile from palette if (mb) { edit_tile = tx + ty * 12 + 1; set_edit_mode(EDIT_MODE_DRAW); while(mouse_b); clear_keybuf(); } } else if (edit_mode == EDIT_MODE_STATS) { if (keypressed()) { int kb = readkey() & 0xff; if (kb == '1') map->win_conditions ^= MAP_WIN_EXIT; if (kb == '2') map->win_conditions ^= MAP_WIN_KILL_GUARDIAN; if (kb == '3') map->win_conditions ^= MAP_WIN_KILL_ALL; if (kb == '4') map->boss_level ^= 1; if (kb == '5') get_string(bmp, map->name, 32, data[THE_FONT].dat, 8, 90, gui_fg_color, NULL); } if (key[KEY_F1]) { edit_mode = EDIT_MODE_DRAW; while(key[KEY_F1]); } } } alex4src/src/edit.h0000666000175000017500000000317207710456700014665 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #ifndef _EDIT_H_ #define _EDIT_H_ #include #include "map.h" // the editor can be in one of the following modes #define EDIT_MODE_DRAW 1 #define EDIT_MODE_SELECT 2 #define EDIT_MODE_STATS 3 // functions void set_edit_mode(int mode); char *get_edit_path_and_file(); void set_edit_path_and_file(char *str); void draw_edit_mode(BITMAP *bmp, Tmap *map, int mx, int my); void update_edit_mode(Tmap *map, BITMAP *bmp, int mx, int my, int mb); #endifalex4src/src/hisc.c0000666000175000017500000001023507710456700014657 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #include #include "allegro.h" #include "hisc.h" // creates a table to work with Thisc* make_hisc_table() { Thisc *tmp; tmp = malloc(MAX_SCORES*sizeof(Thisc)); if (!tmp) return NULL; return tmp; } // destroys a table void destroy_hisc_table(Thisc *table) { free(table); } // check if provided score is allowed to enter the table int qualify_hisc_table(Thisc *table, Thisc post) { int i; if (post.score == 0) return 0; for (i=0;i= table[i].score) return 1; } return 0; } // sorts the table void sort_hisc_table(Thisc *table) { int i,j; Thisc tmp; for (i=1;i table[j-1].score) { table[j]= table[j-1]; j--; } table[j] = tmp; } } // Replaces the lowest score with the specified void enter_hisc_table(Thisc *table, Thisc post) { unsigned int lo = table[0].score; int loID = 0; int i; // find lowest score for (i = 0; i < MAX_SCORES; i ++) { if (table[i].score <= lo) { loID = i; lo = table[i].score; } } table[loID] = post; } // Resets the table to the values specified void reset_hisc_table(Thisc *table, char *name, int hi, int lo) { int i; int d = (hi-lo)/(MAX_SCORES - 1); int acc = lo; for (i=0;iscore * 37; char *s = entry->name; for(; *s; s++) i = 131*i + *s; return i; } // loads table from disk, returns 1 on success int load_hisc_table(Thisc *table, PACKFILE *fp) { int i; int ok = 1; for(i=0; iname); if (show_level) textprintf_right(bmp, fnt, x+80, y, color, "%2d", table->level); textprintf_right(bmp, fnt, x+140, y, color, "%d", table->score); } // draws the entire table void draw_hisc_table(Thisc *table, BITMAP *bmp, FONT *fnt, int x, int y, int color, int show_level) { int i; for(i=0;i < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #ifndef _HISC_H_ #define _HISC_H_ #include "allegro.h" // highscore list length #define MAX_SCORES 5 // a hiscore post typedef struct { char name[10]; unsigned int score; unsigned int level; } Thisc; // functions Thisc* make_hisc_table(); void destroy_hisc_table(Thisc *); int qualify_hisc_table(Thisc *table, Thisc post); void sort_hisc_table(Thisc *table); void enter_hisc_table(Thisc *table, Thisc post); void reset_hisc_table(Thisc *table, char *name, int hi, int lo); int load_hisc_table(Thisc *table, PACKFILE *fp); void save_hisc_table(Thisc *table, PACKFILE *fp); void draw_hisc_post(Thisc *table, BITMAP *bmp, FONT *fnt, int x, int y, int color, int show_level); void draw_hisc_table(Thisc *table, BITMAP *bmp, FONT *fnt, int x, int y, int color, int show_level); #endifalex4src/src/license.txt0000666000175000017500000003513707710022070015745 0ustar pdewachtpdewachtThe GNU General Public License (GPL) Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS alex4src/src/main.c0000666000175000017500000023400007710456700014653 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #include #include #include #include #include "timer.h" #include "map.h" #include "control.h" #include "actor.h" #include "player.h" #include "particle.h" #include "bullet.h" #include "scroller.h" #include "options.h" #include "hisc.h" #include "script.h" #include "main.h" #include "edit.h" #include "shooter.h" #include "../data/data.h" // some game status defines #define GS_OK 1 #define GS_GAMEOVER 2 #define GS_QUIT_GAME 3 #define GS_QUIT_MENU 4 #define GS_PLAY 5 #define GS_LEVEL_DONE 6 #define GS_GAME_COMPLETE 7 #define GS_GAME_DIED 8 #define GS_SCORES 9 #define GS_EDIT 10 int game_status = 0; // globalez DATAFILE *data = NULL; DATAFILE *maps = NULL; DATAFILE *sfx_data = NULL; BITMAP *swap_screen; PALETTE org_pal; Tscroller hscroll; Thisc *hisc_table; Thisc *hisc_table_space; char working_directory[1024]; // the map Tmap *map = NULL; // controls Tcontrol ctrl; // actors Tactor actor[MAX_ACTORS]; // edit int editing = 0; // music and stuff static AL_DUH_PLAYER *dp = NULL; static DUH_SIGRENDERER *sr = NULL; static DUH *duh = NULL; // mod start patterns #define MOD_INTRO_SONG 0x00 #define MOD_MENU_SONG 0x08 #define MOD_BOSS_SONG 0x0c #define MOD_OUTRO_SONG 0x11 #define MOD_PLAYER_DIES 0x1a #define MOD_LEVEL_DONE 0x1b #define MOD_GAME_OVER 0x1c #define MOD_LEVEL_SONG 0x1d // sound fx #define MAX_SOUNDS 32 SAMPLE *sfx[MAX_SOUNDS] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; // various char scroller_message[] = "Free Lunch Design presents Alex the Allegator 4 " "Guide Alex to the exit of each level Jump or shoot enemies picking up stars and cherries on the way " "Use arrows to move Alex, ALT to jump and Left CTRL to shoot, or use a gamepad or joystick " "Code and GFX by Johan Peitz Music and SFX by Anders Svensson "; char init_string[] = "[YhJPJKUSY`0-'\"7 "; char *level_files[256]; int num_levels; int got_sound = 0; Toptions options; int menu_choice = 1; int playing_original_game = 1; int init_ok = 0; // // // // // // // // // // // // // // // // // // // // // // returns pointer to the game over bitmap BITMAP *get_gameover_sign() { return data[GAME_OVER].dat; } // returns pointer to the lets go bitmap BITMAP *get_letsgo_sign() { return data[LETSGO].dat; } // returns pointer to the space highscore table Thisc *get_space_hisc() { return hisc_table_space; } // returns the init_string char *get_init_string() { return init_string; } // loggs the text to the text file void log2file(char *format, ...) { va_list ptr; /* get an arg pointer */ FILE *fp; fp = fopen("log.txt", "at"); if (fp) { /* initialize ptr to point to the first argument after the format string */ va_start(ptr, format); /* Write to logfile. */ vfprintf(fp, format, ptr); // Write passed text. fprintf(fp, "\n"); // New line.. va_end(ptr); fclose(fp); } } // saves a screenshot void take_screenshot(BITMAP *bmp) { static int number = 0; PALETTE p; BITMAP *b; char buf[256]; int ok = 0; // check if the file name allready exists do { sprintf(buf, "a4_%03d.pcx", number ++); if (!exists(buf)) ok = 1; if (number > 999) return; } while(!ok); get_palette(p); b = create_sub_bitmap(bmp, 0, 0, bmp->w, bmp->h); save_bitmap(buf, b, p); destroy_bitmap(b); } // garbles a string using a key void garble_string(char *str, int key) { int i; int len_i = strlen(str); for(i = 0; i < len_i; i ++) { str[i] ^= (key+i); } } // sets the current map void set_map(Tmap *m) { map = m; } // plays a sample using default settings void play_sound(SAMPLE *s) { if (got_sound && s != NULL) play_sample(s, get_config_int("sound", "sample_volume", 100), 128, 1000, 0); } // plays a sample using default settings // (from an index) void play_sound_id(int id) { if (got_sound) play_sound(sfx[id]); } // plays a sample using user settings void play_sound_ex(SAMPLE *s, int vol, int freq, int loop) { if (got_sound && s != NULL) { int v = (get_config_int("sound", "sample_volume", 100) * (float)(vol))/100.0; play_sample(s, v, 128, freq, loop); } } // plays a sample using user settings // (from an index) void play_sound_id_ex(int id, int vol, int freq, int loop) { play_sound_ex(sfx[id], vol, freq, loop); } // stops a sample (providing an id) void stop_sound_id(int id) { stop_sample(sfx[id]); } // adjusts a sample (from an index) according to player position void adjust_sound_id_ex(int id, int x) { if (got_sound) { int vol = MAX(100 - ABS(player.actor->x - x) / 2, 0); int v = get_config_int("sound", "sample_volume", 100) * (float)(vol)/100.0; int pan = MID(0, 128 + x - player.actor->x, 255); if (sfx[id] != NULL) { adjust_sample(sfx[id], v, pan, 1000, 1); } } } // shows a little message void msg_box(char *str) { if (got_sound) al_pause_duh(dp); alert("Alex 4: Message", NULL, str, "OK", NULL, 0, 0); if (got_sound) al_resume_duh(dp); } // polls the music void poll_music() { if (got_sound && dp != NULL) al_poll_duh(dp); } // waits for user to strike a key, or x seconds void wait_key(int seconds) { int t = 0; int kp = 0; clear_keybuf(); cycle_count = 0; while(!kp && t < seconds * 50) { cycle_count = 0; poll_control(&ctrl); t ++; if (keypressed()) kp = 1; if (is_fire(&ctrl) || is_jump(&ctrl)) kp = 1; if (got_sound && dp != NULL) al_poll_duh(dp); while(!cycle_count); } } // returns the player actor Tactor *get_alex() { return &actor[0]; } // stops any mod playing static void stop_music(void) { al_stop_duh(dp); dp = NULL; } // starts the mod at position x static void start_music(int startorder) { const int n_channels = 2; /* stereo */ stop_music(); { sr = dumb_it_start_at_order(duh, n_channels, startorder); dp = al_duh_encapsulate_sigrenderer(sr, ((float)(get_config_int("sound", "music_volume", 255)) / 255.0), get_config_int("dumb", "buffer_size", 4096), get_config_int("dumb", "sound_freq", 44100)); if (!dp) duh_end_sigrenderer(sr); // howto.txt doesn't mention that this is necessary! dumb.txt does ... } } // delay routine used by the fades void fade_rest(int msec, AL_DUH_PLAYER *duh_player) { int i = 0; while(i < msec / 20) { cycle_count = 0; if (got_sound && duh_player != NULL) al_poll_duh(duh_player); i ++; while(!cycle_count) yield_timeslice(); } } // fades in from white to 4 color palette void fade_in_pal(int delay) { set_color(1, &org_pal[3]); fade_rest(delay, dp); set_color(1, &org_pal[2]); set_color(2, &org_pal[3]); fade_rest(delay, dp); set_color(1, &org_pal[1]); set_color(2, &org_pal[2]); set_color(3, &org_pal[3]); fade_rest(delay, dp); } // fades 4 color palette to white void fade_out_pal(int delay) { set_color(1, &org_pal[2]); set_color(2, &org_pal[3]); set_color(3, &org_pal[4]); fade_rest(delay, dp); set_color(1, &org_pal[3]); set_color(2, &org_pal[4]); fade_rest(delay, dp); set_color(1, &org_pal[4]); fade_rest(delay, dp); } // fade in from black to 4 colors pal void fade_in_pal_black(int delay, AL_DUH_PLAYER *duh_player) { set_color(4, &org_pal[2]); fade_rest(delay, duh_player); set_color(3, &org_pal[2]); set_color(4, &org_pal[3]); fade_rest(delay, duh_player); set_color(2, &org_pal[2]); set_color(3, &org_pal[3]); set_color(4, &org_pal[4]); fade_rest(delay, duh_player); } // fades 4 color palette to black void fade_out_pal_black(int delay, AL_DUH_PLAYER *duh_player) { set_color(2, &org_pal[1]); set_color(3, &org_pal[2]); set_color(4, &org_pal[3]); fade_rest(delay, duh_player); set_color(3, &org_pal[1]); set_color(4, &org_pal[2]); fade_rest(delay, duh_player); set_color(4, &org_pal[1]); fade_rest(delay, duh_player); } // ets all color to white void wipe_pal() { set_color(1, &org_pal[4]); set_color(2, &org_pal[4]); set_color(3, &org_pal[4]); set_color(4, &org_pal[4]); } // removes trailing white space from a null terminated string void clear_trailing_whitespace(char *data) { unsigned int i; for(i = 0; i < strlen(data); i++) { if (data[i] == ' ' || data[i] == '\t' || data[i] == '\n' || data[i] == '\r') data[i] = 0; } } /// load the level filenames void load_level_files(const char *filename) { FILE *fp; char buf[1024]; int mode = 0; char *ret; char path[1024]; // get path to maps replace_filename(path, filename, "", 1024); // reset counters num_levels = 0; // open level file fp = fopen(filename, "rt"); if (!fp) { allegro_message("%s not found", filename); log2file(" *** %s not found", filename); return; } // start parsing ret = fgets(buf, 1024, fp); // read a line while(ret != NULL && mode == 0) { // read lines until #start# token is found if (!strncmp("#start#", buf, 7)) { mode = 1; } ret = fgets(buf, 1024, fp); // read a line } if (!mode) { mode = 2; allegro_message("#start# not found"); log2file(" *** #start# not found"); } // read level lines until #end# while(ret != NULL && mode == 1) { // read levels until #end# token is found if (!strncmp("#end#", buf, 5)) { mode = 2; } else { char full_path_to_map[1024]; clear_trailing_whitespace(buf); sprintf(full_path_to_map, "%s%s", path, buf); level_files[num_levels] = strdup(full_path_to_map); // test if map exists if (exists(level_files[num_levels])) { num_levels ++; log2file(" <%s> found", buf); } else { allegro_message("ALEX4:\n<%s> not found - skipping", level_files[num_levels]); log2file(" *** <%s> not found - skipping", level_files[num_levels]); } } ret = fgets(buf, 1024, fp); // read a line } // close file fclose(fp); return; } // blits anything to screen void blit_to_screen(BITMAP *bmp) { acquire_screen(); if (options.use_vsync) vsync(); stretch_blit(bmp, screen, 0, 0, bmp->w, bmp->h, 0, 0, SCREEN_W, SCREEN_H); release_screen(); } // draws the status bar void draw_status_bar(BITMAP *bmp, int y) { int i; rectfill(bmp, 0, y, 159, y+9, 1); draw_sprite_h_flip(bmp, data[HERO_NORM].dat, 0, y+1); textprintf(bmp, data[THE_FONT].dat, 9, y+1, 4, " :%d", player.lives); for(i = 0; i < player.health; i ++) draw_sprite(bmp, data[HEART2].dat, 40 + 10 * i, y-3); draw_sprite(bmp, data[EGG].dat, 80, y-5); textprintf(bmp, data[THE_FONT].dat, 85, y+1, 4, " :%d", player.ammo); textprintf_right(bmp, data[THE_FONT].dat, 158, y+1, 4, "%d", player.score); } // draws a frame of the action void draw_frame(BITMAP *bmp, int _status_bar) { int x0, x1, x2; int ox = map->offset_x; int i; // calc bg pos x0 = (-ox % 1280) >> 3; x1 = (-ox % 640) >> 2; x2 = (-ox % 320) >> 1; // draw backgrounds blit(data[BG0].dat, bmp, 0, 0, x0, 0, 160, 120); blit(data[BG0].dat, bmp, 0, 0, x0 + 160, 0, 160, 120); draw_sprite(bmp, data[BG1].dat, x1, 120 - ((BITMAP *)data[BG1].dat)->h); draw_sprite(bmp, data[BG1].dat, x1 + 160, 120 - ((BITMAP *)data[BG1].dat)->h); draw_sprite(bmp, data[BG2].dat, x2, 120 - ((BITMAP *)data[BG2].dat)->h); draw_sprite(bmp, data[BG2].dat, x2 + 160, 120 - ((BITMAP *)data[BG2].dat)->h); // draw frame draw_map(bmp, map, 0, 0, 160, 120, editing); if (!editing) { // draw actors for(i = 1; i < MAX_ACTORS; i ++) if (actor[i].active) draw_actor(bmp, &actor[i], actor[i].x - ox, actor[i].y); // draw particles for(i = 0; i < MAX_PARTICLES; i ++) if (particle[i].life) draw_particle(bmp, &particle[i], ox, 0); } // draw player draw_player(bmp, &player, player.actor->x - ox, player.actor->y); // draw bullets for(i = 0; i < MAX_BULLETS; i ++) if (bullet[i].exist) draw_bullet(bmp, &bullet[i], ox, 0); // draw statusbar if (!editing) { if (_status_bar) draw_status_bar(bmp, 110); else rectfill(bmp, 0, 110, 159, 119, 1); } else { /////////////// EDIT stats int mx = mouse_x / (SCREEN_W / 160); int my = mouse_y / (SCREEN_H / 120); draw_edit_mode(bmp, map, mx, my); } } // loads a sample from disk SAMPLE *load_path_sample(char *fname) { char buf[1024]; SAMPLE *s; sprintf(buf, "%s/%s", get_config_string("sound", "sfx_path", "sfx"), fname); s = load_sample(buf); if (s == NULL) { sprintf(buf, "not found: %s/%s", get_config_string("sound", "sfx_path", "sfx"), fname); log2file(" *** %s", buf); msg_box(buf); } return s; } // counts number of maps // invoked when loading the map datafile void count_maps_callback(DATAFILE *d) { num_levels ++; } // invoked when game looses focus void display_switch_out(void) { if (got_sound) { al_pause_duh(dp); rest(100); } } // invoked when game regains focus void display_switch_in(void) { if (got_sound) al_resume_duh(dp); } // sets up the gui colors void fix_gui_colors() { ((RGB *)data[0].dat)[255].r = 0; ((RGB *)data[0].dat)[255].g = 0; ((RGB *)data[0].dat)[255].b = 0; ((RGB *)data[0].dat)[254].r = 63; ((RGB *)data[0].dat)[254].g = 63; ((RGB *)data[0].dat)[254].b = 63; gui_fg_color = 255; gui_bg_color = 254; } // init the game int init_game(const char *map_file) { PACKFILE *pf; BITMAP *bmp; int i; int w, h; log2file("\nInit routines:"); // various allegro things log2file(" initializing allegro"); text_mode(-1); garble_string(init_string, 53); set_config_file("alex4.ini"); set_window_close_button(FALSE); // install timers log2file(" installing timers"); install_timers(); // set color depth to 8bpp log2file(" setting color depth (8)"); set_color_depth(8); // allocating memory log2file(" allocating memory for off screen buffers"); swap_screen = create_bitmap(160, 120); if (swap_screen == NULL) { log2file(" *** failed"); allegro_message("ALEX4:\nFailed to allocate memory for swap screen."); return FALSE; } log2file(" allocating memory for high score table 1"); hisc_table = make_hisc_table(); if (hisc_table == NULL) { log2file(" *** failed"); allegro_message("ALEX4:\nFailed to allocate memory for high score list."); return FALSE; } log2file(" allocating memory for high score table 2"); hisc_table_space = make_hisc_table(); if (hisc_table_space == NULL) { log2file(" *** failed"); allegro_message("ALEX4:\nFailed to allocate memory for high score list."); return FALSE; } // init gfx if (get_config_int("graphics", "fullscreen", 0)) { w = get_config_int("graphics", "f_width", 640); h = get_config_int("graphics", "f_height", 480); } else { w = get_config_int("graphics", "w_width", 640); h = get_config_int("graphics", "w_height", 480); } log2file(" entering gfx mode set in alex4.ini (%dx%d %s)", w, h, (get_config_int("graphics", "fullscreen", 0) ? "full" : "win")); if (set_gfx_mode( (get_config_int("graphics", "fullscreen", 0) ? GFX_AUTODETECT_FULLSCREEN : GFX_AUTODETECT_WINDOWED), w, h, 0, 0)) { log2file(" *** failed"); log2file(" entering gfx mode (640x480 windowed)"); if (set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0)) { log2file(" *** failed"); log2file(" entering gfx mode (640x480 fullscreen)"); if (set_gfx_mode(GFX_AUTODETECT_FULLSCREEN, 640, 480, 0, 0)) { log2file(" *** failed"); allegro_message("ALEX4:\nFailed to enter gfx mode.\nTry setting a custom resolution in alex4.ini."); return FALSE; } } } // show initial loading screen clear(swap_screen); textout_centre(swap_screen, font, "loading...", 320, 200, 1); blit_to_screen(swap_screen); // set switch modes and callbacks if (set_display_switch_mode(SWITCH_PAUSE) < 0) log2file(" * display switch mode failed"); if (set_display_switch_callback(SWITCH_IN, display_switch_in) < 0) log2file(" * display switch in failed"); if (set_display_switch_callback(SWITCH_OUT, display_switch_out) < 0) log2file(" * display switch out failed"); // set win title (no! really???) log2file(" setting window title"); set_window_title("Alex 4"); // register dumb log2file(" registering dumb"); dumb_register_packfiles(); dumb_register_dat_mod(DUMB_DAT_MOD); dumb_resampling_quality = get_config_int("dumb", "dumb_resampling_quality", 4); dumb_it_max_to_mix = get_config_int("dumb", "dumb_it_max_to_mix", 128); // load data log2file(" loading data"); packfile_password(init_string); data = load_datafile("data/data.dat"); packfile_password(NULL); if (data == NULL) { log2file(" *** failed"); allegro_message("ALEX4:\nFailed to load data."); return FALSE; } // load options log2file(" loading options"); pf = pack_fopen("alex4.sav", "rp"); if (pf) { load_options(&options, pf); pack_fclose(pf); } else { log2file(" *** failed, resetting to defaults"); reset_options(&options); } // loading highscores log2file(" loading hiscores"); pf = pack_fopen("alex4.hi", "rp"); if (pf) { load_hisc_table(hisc_table, pf); load_hisc_table(hisc_table_space, pf); pack_fclose(pf); } else { log2file(" *** failed, resetting"); reset_hisc_table(hisc_table, "alex", 25000, 5000); sort_hisc_table(hisc_table); reset_hisc_table(hisc_table_space, "Lola", 3000000, 600000); sort_hisc_table(hisc_table_space); } // fix some palette entries ((RGB *)data[0].dat)[0].r = 0; ((RGB *)data[0].dat)[0].g = 0; ((RGB *)data[0].dat)[0].b = 0; fix_gui_colors(); set_palette(data[0].dat); // show splash screen clear_to_color(swap_screen, 3); bmp = data[FLD_LOGO].dat; draw_character(swap_screen, bmp, 80 - bmp->w / 2 + 0, 50 + 1, 1); draw_character(swap_screen, bmp, 80 - bmp->w / 2, 50, 4); blit_to_screen(swap_screen); // load maps if (playing_original_game) { log2file(" loading original maps"); packfile_password(init_string); num_levels = -1; // skip end object when counting maps = load_datafile_callback("data/maps.dat", count_maps_callback); packfile_password(NULL); if (maps == NULL) { log2file(" *** failed"); allegro_message("ALEX4:\nFailed to load original maps."); return FALSE; } log2file(" loaded %d maps", num_levels); } else { log2file(" loading custom maps"); log2file(" reading map file: %s", map_file); if (exists(map_file)) { // load level file names load_level_files(map_file); log2file(" %d maps loaded", num_levels); if (num_levels == 0) { log2file(" *** no maps were loaded"); allegro_message("ALEX4:\nCustom map file must\nhold at least one\nlegal map file."); return FALSE; } } else { log2file(" *** file not found: %s", map_file); allegro_message("ALEX4:\nCustom map file not found:\n%s", map_file); return FALSE; } } // install some parts of allegro log2file(" installing keyboard"); install_keyboard(); log2file(" installing mouse"); install_mouse(); // fix palette for(i = 0; i < 256; i ++) { org_pal[i].r = ((RGB *)data[0].dat)[i].r; org_pal[i].g = ((RGB *)data[0].dat)[i].g; org_pal[i].b = ((RGB *)data[0].dat)[i].b; } // init control log2file(" initializing controls"); init_control(&ctrl); // initializing joystick log2file(" initializing joystick/gamepad"); if (install_joystick(JOY_TYPE_AUTODETECT)) { log2file(" *** failed"); } else { ctrl.use_joy = 1; } // install sound log2file(" installing sound"); set_volume_per_voice(0); switch(get_config_int("sound", "sound_device", 0)) { case 1: i = DIGI_AUTODETECT; log2file(" DIGI_AUTODETECT selected (%d)", i); break; case 2: i = DIGI_DIRECTX(0); log2file(" DIGI_DIRECTX(0) selected (%d)", i); break; case 3: i = DIGI_DIRECTAMX(0); log2file(" DIGI_DIRECTAMX(0) selected (%d)", i); break; default: i = -770405; // dummy number got_sound = 0; log2file(" NO_SOUND selected"); break; } if (i != -770405) { if (install_sound(i, MIDI_NONE, NULL)) { log2file(" *** failed"); got_sound = 0; } else got_sound = 1; } if (got_sound) { int s = 0; // load music duh = (DUH *)data[MSC_GAME].dat; if (get_config_int("sound", "use_sound_datafile", 1)) { log2file(" loading sound datafile"); packfile_password(init_string); sfx_data = load_datafile("data/sfx_44.dat"); if (sfx_data == NULL) { sfx_data = load_datafile("data/sfx_22.dat"); log2file(" sfx_44.dat not found"); s = 0; } else { s = 1; log2file(" sfx_44.dat will be used"); } packfile_password(NULL); if (sfx_data == NULL) { log2file(" sfx_22.dat not found"); log2file(" *** failed - no sfx will be available"); } else { if (!s) log2file(" sfx_22.dat will be used"); // assign samples sfx[SMPL_CHERRY] = sfx_data[0].dat; sfx[SMPL_CHOPPER] = sfx_data[1].dat; sfx[SMPL_CRUSH] = sfx_data[2].dat; sfx[SMPL_A_DIE] = sfx_data[3].dat; sfx[SMPL_EAT] = sfx_data[4].dat; sfx[SMPL_BEAM] = sfx_data[5].dat; sfx[SMPL_ENGINE] = sfx_data[6].dat; sfx[SMPL_HEART] = sfx_data[7].dat; sfx[SMPL_HIT] = sfx_data[8].dat; sfx[SMPL_HURT] = sfx_data[9].dat; sfx[SMPL_CRUSH_LAND] = sfx_data[10].dat; sfx[SMPL_JUMP] = sfx_data[11].dat; sfx[SMPL_E_DIE] = sfx_data[12].dat; sfx[SMPL_MENU] = sfx_data[13].dat; sfx[SMPL_PAUSE] = sfx_data[14].dat; sfx[SMPL_POINT] = sfx_data[15].dat; sfx[SMPL_SHIP] = sfx_data[16].dat; sfx[SMPL_SHOOT] = sfx_data[17].dat; sfx[SMPL_SPIT] = sfx_data[18].dat; sfx[SMPL_STAR] = sfx_data[19].dat; sfx[SMPL_STARTUP] = sfx_data[20].dat; sfx[SMPL_MASH] = sfx_data[21].dat; sfx[SMPL_TALK] = sfx_data[22].dat; sfx[SMPL_SPIN] = sfx_data[23].dat; sfx[SMPL_XTRALIFE] = sfx_data[24].dat; } } else { // load sounds from disk log2file(" loading sounds from %s", get_config_string("sound", "sfx_path", "")); sfx[SMPL_STARTUP] = load_path_sample("startup.wav"); sfx[SMPL_POINT] = load_path_sample("point.wav"); sfx[SMPL_JUMP] = load_path_sample("jump.wav"); sfx[SMPL_MASH] = load_path_sample("stomp.wav"); sfx[SMPL_EAT] = load_path_sample("eat.wav"); sfx[SMPL_SPIT] = load_path_sample("spit.wav"); sfx[SMPL_A_DIE] = load_path_sample("die.wav"); sfx[SMPL_HIT] = load_path_sample("hit.wav"); sfx[SMPL_CRUSH] = load_path_sample("crush.wav"); sfx[SMPL_E_DIE] = load_path_sample("kill.wav"); sfx[SMPL_HEART] = load_path_sample("heart.wav"); sfx[SMPL_HURT] = load_path_sample("hurt.wav"); sfx[SMPL_XTRALIFE] = load_path_sample("xtralife.wav"); sfx[SMPL_CHERRY] = load_path_sample("cherry.wav"); sfx[SMPL_MENU] = load_path_sample("menu.wav"); sfx[SMPL_SHOOT] = load_path_sample("shoot.wav"); sfx[SMPL_SPIN] = load_path_sample("turn.wav"); sfx[SMPL_STAR] = load_path_sample("star.wav"); sfx[SMPL_CRUSH_LAND] = load_path_sample("impact.wav"); sfx[SMPL_PAUSE] = load_path_sample("pause.wav"); sfx[SMPL_ENGINE] = load_path_sample("engine.wav"); sfx[SMPL_CHOPPER] = load_path_sample("chopper.wav"); sfx[SMPL_SHIP] = load_path_sample("ship.wav"); sfx[SMPL_BEAM] = load_path_sample("energy.wav"); sfx[SMPL_TALK] = load_path_sample("alex.wav"); } } // misc log2file(" initializing scroller"); init_scroller(&hscroll, data[THE_FONT].dat, scroller_message, 160, 10, TRUE); options.use_vsync = get_config_int("graphics", "vsync", 0); log2file(" vsync set to %s", (options.use_vsync ? "ON" : "OFF")); // done! play_sound(sfx[SMPL_STARTUP]); wait_key(2); fade_out_pal(100); init_ok = 1; log2file(" init OK!"); return TRUE; } // uninits the game void uninit_game() { int i; PACKFILE *pf; log2file("\nExit routines:"); log2file(" unloading datafile"); if (data != NULL) unload_datafile(data); log2file(" unloading original maps"); if (maps != NULL) unload_datafile(maps); log2file(" destroying temporary map"); if (map != NULL) destroy_map(map); log2file(" freeing level names"); for(i = 0; i < num_levels; i ++) free(level_files[i]); // only save if everything was inited ok! if (init_ok) { log2file(" saving options"); pf = pack_fopen("alex4.sav", "wp"); if (pf) { save_options(&options, pf); pack_fclose(pf); } log2file(" saving highscores"); pf = pack_fopen("alex4.hi", "wp"); if (pf) { save_hisc_table(hisc_table, pf); save_hisc_table(hisc_table_space, pf); pack_fclose(pf); } } if (get_config_int("sound", "use_sound_datafile", 1)) { log2file(" unloading sound data"); if (sfx_data != NULL) unload_datafile(sfx_data); } else { log2file(" freeing sounds"); for(i = 0; i < MAX_SOUNDS; i ++) { if (sfx[i] != NULL) destroy_sample(sfx[i]); } } log2file(" exiting dumb"); dumb_exit(); log2file(" exiting allegro"); allegro_exit(); } // inits the player on a map void init_player(Tplayer *p, Tmap *m) { actor[0].direction = 1; actor[0].x = m->start_x << 4; if (actor[0].x < 0) { actor[0].direction = 0; actor[0].x = -actor[0].x; } actor[0].dy = 0; actor[0].y = (m->start_y << 4) + 16; p->jumping = 0; p->wounded = 0; p->dy = 0; p->ammo = 0; p->eat_counter = 0; p->actor->status = (p->ammo ? AC_FULL : AC_NORM); p->health = MAX(p->health, 1); } // draws text with an outline void textout_outline(BITMAP *bmp, const char *txt, int x, int y) { textout(bmp, data[THE_FONT].dat, txt, x+1, y, 1); textout(bmp, data[THE_FONT].dat, txt, x-1, y, 1); textout(bmp, data[THE_FONT].dat, txt, x, y+1, 1); textout(bmp, data[THE_FONT].dat, txt, x, y-1, 1); textout(bmp, data[THE_FONT].dat, txt, x, y, 4); } // draws centered text with an outline void textout_outline_center(BITMAP *bmp, const char *txt, int cx, int y) { int x = cx - text_length(data[THE_FONT].dat, txt) / 2; textout_outline(bmp, txt, x, y); } // plays the let's go sequence void show_lets_go() { BITMAP *go = data[LETSGO].dat; int x = -go->w; int mode = 0; int wait = 0; int y = 120, ty = 60; int dy = 0; cycle_count = 0; while(mode != 3) { // do logic while(cycle_count > 0) { logic_count ++; // poll music machine if (got_sound) al_poll_duh(dp); // move text if (mode == 0 || mode == 2) x += 4; if (x >= 80 - go->w/2) mode = 1; if (x > 160) mode = 3; if (mode == 1) wait ++; if (wait > 50 && mode == 1) { mode = 2; ty = 130; } // move level name if (y > ty) y -= (y-ty)/8; if (y < ty) y += dy++; // move on cycle_count --; } // let other processes play yield_timeslice(); // draw stuff draw_frame(swap_screen, 1); draw_sprite(swap_screen, go, x, 35); textout_outline_center(swap_screen, map->name, 80, y); blit_to_screen(swap_screen); } } // shows the game over sign sequence void show_game_over() { BITMAP *go = data[GAME_OVER].dat; int x = -go->w; int mode = 0; int wait = 0; cycle_count = 0; while(mode != 3) { // do logic while(cycle_count > 0) { logic_count ++; // poll music machine if (got_sound) al_poll_duh(dp); // move text if (mode == 0 || mode == 2) x += 4; if (x >= 80 - go->w/2) mode = 1; if (x > 160) mode = 3; if (mode == 1) wait ++; if (wait > 120 && mode == 1) mode = 2; if (key[KEY_ESC]) mode = 3; // move on cycle_count --; } // let other processes play yield_timeslice(); // draw stuff draw_frame(swap_screen, 1); draw_sprite(swap_screen, go, x, 35); blit_to_screen(swap_screen); } } // drawing routine used by // show_custom_ending() void draw_custom_ending(BITMAP *bmp) { int i, r; BITMAP *head = data[FLD_HEAD].dat; blit(data[INTRO_BG].dat, bmp, 0, 0, 0, 0, 160, 120); r = 70 + fixtoi(20 * fcos(itofix(game_count >> 1)) + 20 * fsin(itofix((int)(game_count / 2.7))) ); for(i = 0; i < 256; i += 32) draw_sprite(bmp, head, 80 - head->w/2 + fixtoi(r * fcos(itofix(game_count + i))), 60 - head->h/2 + fixtoi(r * fsin(itofix(game_count + i)))); draw_sprite_h_flip(bmp, data[ALEX].dat, 60, 40); draw_sprite(bmp, data[LOLA].dat, 84, 40); textout_outline_center(bmp, "Congratulations!", 80, 60); textout_outline_center(bmp, "A winner is you!", 80, 80); } // show the ending of a custom game void show_custom_ending() { int done = 0; int wait = 1000; // ten seconds int tmp; tmp = game_count; draw_custom_ending(swap_screen); blit_to_screen(swap_screen); fade_in_pal(100); game_count = tmp; cycle_count = 0; while(!done) { // do logic while(cycle_count > 0) { logic_count ++; // poll music machine if (got_sound) al_poll_duh(dp); // poll user poll_control(&ctrl); if (is_fire(&ctrl) || is_jump(&ctrl) || key[KEY_SPACE] || key[KEY_ENTER] || key[KEY_ESC]) done = 1; // decrease time if (--wait < 0) done = 1; // move on cycle_count --; } // let other processes play yield_timeslice(); // draw stuff draw_custom_ending(swap_screen); blit_to_screen(swap_screen); } } // lighten or darken a 4 color bitmap void transform_bitmap(BITMAP *bmp, int steps) { int x, y; int c; for(x = 0; x < bmp->w; x ++) { for(y = 0; y < bmp->h; y ++) { c = _getpixel(bmp, x, y); _putpixel(bmp, x, y, MIN(MAX(c + steps, 1), 4)); } if (got_sound) al_poll_duh(dp); } } // draws the scoring sequence at end of level // used by show_cutscene(..) void draw_cutscene(BITMAP *bmp, int org_level, int _level, int _lives, int _stars, int _cherries) { BITMAP *go = data[LEVELCOMPLETE].dat; char buf[80]; clear_bitmap(bmp); draw_sprite(bmp, go, 80 - go->w/2, 10); sprintf(buf, "Level %2d*100 = %4d", org_level, _level); textout_outline(bmp, buf, 3, 60); sprintf(buf, "Lives %2d*100 = %4d", player.lives, _lives); textout_outline(bmp, buf, 3, 72); sprintf(buf, "Stars %2d*100 = %4d", player.stars_taken, _stars); textout_outline(bmp, buf, 3, 84); sprintf(buf, "Cherries %2d* 10 = %4d", player.cherries_taken, _cherries); textout_outline(bmp, buf, 3, 96); } // shows the scoring sequence at end of level void show_cutscene(int level) { int x = -160; BITMAP *bmp = create_bitmap(160, 120); BITMAP *swap2 = create_bitmap(160, 120); int mode = 0; int my_counter = 0; int _lives = player.lives * 100; int _level = level * 100; int _cherries = player.cherries_taken * 10; int _stars = player.stars_taken * 100; if (swap2 == NULL || bmp == NULL) { if (swap2 != NULL) destroy_bitmap(swap2); if (bmp != NULL) destroy_bitmap(bmp); return; } // music! if (got_sound) start_music(MOD_LEVEL_DONE); // create cutscene screene blit(swap_screen, swap2, 0, 0, 0, 0, 160, 120); transform_bitmap(swap2, -1); draw_cutscene(bmp, level, _level, _lives, _stars, _cherries); // scroll bmp onto swap_screen clear_keybuf(); cycle_count = 0; while(mode != 3) { // do logic while(cycle_count > 0) { logic_count ++; my_counter ++; poll_control(&ctrl); // poll music machine if (got_sound) al_poll_duh(dp); if (mode == 1 && (keypressed() || is_fire(&ctrl) || is_jump(&ctrl) ) || my_counter > 200) { mode = 2; } // move text if (mode == 0) x += 8; if (x == 0 && mode == 0) { mode = 1; clear_keybuf(); } // count stats if (mode == 2 && !(game_count % 4)) { int a = 0; if (_level) { player.score += 100; _level -= 100; a++; } if (_lives) { player.score += 100; _lives -= 100; a++; } if (_stars) { player.score += 100; _stars -= 100; a++; } if (_cherries) { player.score += 10; _cherries -= 10; a++; } if (!a) mode = 3; play_sound(sfx[SMPL_POINT]); draw_cutscene(bmp, level, _level, _lives, _stars, _cherries); } // move on cycle_count --; } // let other processes play yield_timeslice(); // draw stuff blit(swap2, swap_screen, 0, 0, 0, 0, 160, 120); draw_status_bar(swap_screen, 110); draw_sprite(swap_screen, bmp, x, 0); blit_to_screen(swap_screen); } wait_key(5); if (got_sound) stop_music(); destroy_bitmap(bmp); } // shows a highscore table void show_scores(int space, Thisc *table) { DATAFILE *df = NULL; BITMAP *bg = NULL; if (space) { // get space bg packfile_password(init_string); df = load_datafile_object("data/a45.dat", "BG1"); packfile_password(NULL); if (df != NULL) { bg = df->dat; } else msg_box("ooga"); } if (bg == NULL || !space) blit(data[INTRO_BG].dat, swap_screen, 0, 0, 0, 0, 160, 120); else { clear_to_color(swap_screen, 1); blit(bg, swap_screen, 0, 0, 0, 0, 160, 120); } textout_outline_center(swap_screen, "High scores", 80, 8); textout_outline_center(swap_screen, "Press any key", 80, 100); draw_hisc_table(table, swap_screen, data[THE_FONT].dat, 10, 30, (space ? 4 : 1), !space); blit_to_screen(swap_screen); fade_in_pal(100); clear_keybuf(); poll_control(&ctrl); while(!is_jump(&ctrl) && !keypressed()) { poll_control(&ctrl); if (got_sound) al_poll_duh(dp); } play_sound(sfx[SMPL_MENU]); fade_out_pal(100); // clean up if (df != NULL) unload_datafile_object(df); } // draws the level selector void draw_select_starting_level(BITMAP *bmp, int level, int min, int max) { BITMAP *stuff = create_bitmap(40, 10); char buf[80]; int xpos = 2; blit(data[ALEX_BG].dat, bmp, 0, 0, 0, 0, 160, 112); rectfill(bmp, 0, 112, 160, 120, 2); sprintf(buf, "%s %d %s", (level > min ? "<" : " "), level, (level < max ? ">" : " ")); clear_bitmap(stuff); textout_centre(stuff, data[THE_FONT].dat, buf, stuff->w/2 + 1, 1, 2); textout_centre(stuff, data[THE_FONT].dat, buf, stuff->w/2, 0, 1); stretch_sprite(bmp, stuff, 80 - 4*stuff->w/2, 30, 4*stuff->w, 4*stuff->h); textout_centre(bmp, data[THE_FONT].dat, "SELECT START LEVEL", 80, 90, 1); textout_centre(bmp, data[THE_FONT].dat, "SELECT START LEVEL", 79, 89, 4); if (options.one_hundred) { if (game_count & 32 || game_count & 16) draw_sprite(bmp, data[SHIP100].dat, xpos, 2); } else { if (options.stars[level - 1]) { draw_sprite(bmp, data[STAR].dat, xpos, 2); draw_sprite(bmp, data[ALL100].dat, xpos + 4, 14); xpos += 20; } if (options.cherries[level - 1]) { draw_sprite(bmp, data[CHERRY].dat, xpos, 2); draw_sprite(bmp, data[ALL100].dat, xpos + 4, 14); } } destroy_bitmap(stuff); } // lets the player select starting level int select_starting_level() { int start_level = 1; int done = 0; int counter = 0; draw_select_starting_level(swap_screen, start_level, 1, options.max_levels + 1); blit_to_screen(swap_screen); fade_in_pal(100); clear_keybuf(); cycle_count = 0; while(!done) { // do logic while(cycle_count > 0) { logic_count ++; // poll music machine if (got_sound) al_poll_duh(dp); // check controls poll_control(&ctrl); if (is_right(&ctrl) && start_level < options.max_levels + 1 && !counter) { start_level ++; play_sound(sfx[SMPL_MENU]); } if (is_left(&ctrl) && start_level > 1 && !counter) { start_level --; play_sound(sfx[SMPL_MENU]); } if (is_jump(&ctrl) || is_fire(&ctrl)) { done = 1; play_sound(sfx[SMPL_MENU]); } if (keypressed()) { int scancode = readkey() >> 8; if (scancode == KEY_SPACE || scancode == KEY_ENTER) { done = 1; play_sound(sfx[SMPL_MENU]); } if (scancode == KEY_F1 && options.one_hundred) { done = 1; start_level = -100; play_sound(sfx[SMPL_MENU]); } if (scancode == KEY_ESC) { done = 1; start_level = -1; play_sound(sfx[SMPL_MENU]); } } if (!is_left(&ctrl) || !is_right(&ctrl)) counter = 0; if (is_left(&ctrl) || is_right(&ctrl)) counter = 10; // move on cycle_count --; } // draw stuff if (start_level >= 0) { draw_select_starting_level(swap_screen, start_level, 1, options.max_levels + 1); blit_to_screen(swap_screen); } } return start_level; } // starts a new game void new_game(int reset_player_data) { // init player if (reset_player_data) { player.ammo = 0; player.lives = 2; player.score = 0; player.health = 1; } player.actor = &actor[0]; player.eat_counter = 0; actor[0].active = 1; actor[0].data = data; actor[0].frames[0] = HERO000; actor[0].frames[1] = HERO001; actor[0].frames[2] = HERO002; actor[0].frames[3] = HERO003; actor[0].frames[4] = HERO_NORM; actor[0].num_frames = 4; actor[0].frame = 0; actor[0].anim_counter = 0; actor[0].anim_max = 4; } // tidies up after a map has been used void deinit_map(Tmap *m) { int i; // stop any playing sounds for(i = 1; i < MAX_ACTORS; i ++) { if (actor[i].active && actor[i].sound != -1) { stop_sound_id(actor[i].sound); } } } // sets up actors and stuff void init_map(Tmap *m) { int x, y, i; m->win_conditions_fullfilled = 0; m->num_enemies = 0; for(i = 1; i < MAX_ACTORS; i ++) { actor[i].active = 0; } // check entire map for enemies and initialize // them as they are found for(x = 0; x < m->width; x ++) { for(y = 0; y < m->height; y ++) { if (m->dat[x + y * m->width].type == MAP_ENEMY1) { // small human Tactor *a = make_actor(actor, x << 4, (y << 4) + 16, data); if (a != NULL) { a->type = MAP_ENEMY1; a->num_frames = 4; a->frames[0] = ENEMY1_01; a->frames[1] = ENEMY1_02; a->frames[2] = ENEMY1_03; a->frames[3] = ENEMY1_04; a->flat_frame = ENEMY1_05; a->w = 12; a->h = 14; a->ox = 2; a->oy = 2; a->flags = ACF_JUMPABLE | ACF_FLATABLE | ACF_HURTS | ACF_SHOOTABLE | ACF_ROLLABLE; m->num_enemies ++; } } if (m->dat[x + y * m->width].type == MAP_ENEMY2) { // big human Tactor *a = make_actor(actor, x << 4, (y << 4) + 16, data); if (a != NULL) { a->type = MAP_ENEMY2; a->num_frames = 4; a->frames[0] = ENEMY2_01; a->frames[1] = ENEMY2_02; a->frames[2] = ENEMY2_03; a->frames[3] = ENEMY2_04; a->flat_frame = ENEMY2_05; a->w = 12; a->h = 19; a->ox = 2; a->oy = 5; a->flags = ACF_JUMPABLE | ACF_FLATABLE | ACF_HURTS | ACF_SHOOTABLE | ACF_ROLLABLE; m->num_enemies ++; } } if (m->dat[x + y * m->width].type == MAP_ENEMY3) { // crusher Tactor *a = make_actor(actor, x << 4, (y << 4) + 16, data); if (a != NULL) { a->type = MAP_ENEMY3; a->num_frames = 1; a->frames[0] = ENEMY3; a->w = 30; a->h = 16; a->ox = 1; a->oy = 112-16; a->flags = ACF_HURTS; } } if (m->dat[x + y * m->width].type == MAP_ENEMY4) { // spike fish Tactor *a = make_actor(actor, x << 4, (y << 4) + 16, data); if (a != NULL) { a->type = MAP_ENEMY4; a->num_frames = 1; a->frames[0] = ENEMY4; a->w = 12; a->h = 14; a->ox = 2; a->oy = 2; a->flags = ACF_HURTS | ACF_SHOOTABLE | ACF_ROLLABLE; m->num_enemies ++; } } if (m->dat[x + y * m->width].type == MAP_ENEMY5) { // yelly fish Tactor *a = make_actor(actor, x << 4, (y << 4) + 16, data); if (a != NULL) { a->type = MAP_ENEMY5; a->num_frames = 1; a->frames[0] = ENEMY5_01; a->w = 12; a->h = 14; a->ox = 2; a->oy = 2; a->flags = ACF_JUMPABLE | ACF_HURTS | ACF_SHOOTABLE | ACF_ROLLABLE; m->num_enemies ++; } } if (m->dat[x + y * m->width].type == MAP_ENEMY6) { // cannon Tactor *a = make_actor(actor, x << 4, (y << 4) + 16, data); if (a != NULL) { a->type = MAP_ENEMY6; a->num_frames = 0; a->flags = 0; } } if (m->dat[x + y * m->width].type == MAP_GUARD1) { // spike-car Tactor *a = make_actor(actor, x << 4, (y << 4) + 16, data); if (a != NULL) { a->type = MAP_GUARD1; a->energy = 100; a->num_frames = 4; a->hit_offset = 4; a->frames[0] = GUARD1_1; a->frames[1] = GUARD1_2; a->frames[2] = GUARD1_3; a->frames[3] = GUARD1_4; a->w = 32; a->h = 32; a->ox = 0; a->oy = 0; a->flags = ACF_HURTS | ACF_ROLLABLE_BACK; m->num_enemies ++; a->sound = SMPL_ENGINE; play_sound_id_ex(a->sound, 100, 1000, 1); } } if (m->dat[x + y * m->width].type == MAP_GUARD2) { // spike-jumper-crusher Tactor *a = make_actor(actor, x << 4, (y << 4) + 16, data); if (a != NULL) { a->type = MAP_GUARD2; a->energy = 150; a->num_frames = 2; a->frames[0] = GUARD2_1a; a->frames[1] = GUARD2_1b; a->w = 32; a->h = 32; a->ox = 0; a->oy = 16; a->flags = ACF_HURTS | ACF_JUMPABLE | ACF_BOUNCEABLE; m->num_enemies ++; } } } } } // starts a new level // level_id < 0 -> load fname // uses datafile map o/w void new_level(char *fname, int level_id, int draw) { int tox; int i; int x, y; if (map != NULL) destroy_map(map); map = NULL; if (level_id < 0) { if (level_id == -1) { // get map from file log2file(" loading map <%s>", fname); map = load_map(fname); if (!map) { msg_box("failed to load map!!!"); log2file(" *** failed!"); return; } } else { // get map from data file log2file(" getting map %d from datafile", atoi(fname)); map = load_map_from_memory((void *)data[SCRIPTMAP0 + atoi(fname)].dat); } } else { // get map from MAP data file log2file(" getting map %d from map-datafile", level_id); map = load_map_from_memory((void *)maps[level_id].dat); } map->data = data; init_player(&player, map); if (player.actor->direction) tox = MAX(0, MIN(player.actor->x - 60, map->width * 16 - 160)); else tox = MAX(0, MIN(player.actor->x - 85, map->width * 16 - 160)); map->offset_x = tox; init_map(map); reset_particles(particle, MAX_PARTICLES); reset_bullets(bullet, MAX_BULLETS); for(i = 1; i < MAX_ACTORS; i++) if (actor[i].active) update_actor_with_map(&actor[i], map); // calc pickup frequency player.cherries = player.cherries_taken = 0; player.stars = player.stars_taken = 0; for(x = 0; x < map->width; x ++) { for(y = 0; y < map->height; y ++) { if (map->dat[x + y * map->width].item == MAP_STAR) player.stars ++; if (map->dat[x + y * map->width].item == MAP_CHERRY) player.cherries ++; } } if (draw) { draw_frame(swap_screen, 1); blit_to_screen(swap_screen); fade_in_pal(100); } } // updates player movement void update_player() { int old_x = player.actor->x; int x1, x2; Tmappos *mp; int tx, ty; if (player.actor->direction) { x1 = 2; x2 = 10; } else { x1 = 13; x2 = 6; } poll_control(&ctrl); if (player.wounded) player.wounded --; // most stuff can only be done when the player is alive if (player.actor->status != AC_DEAD) { // handle eating animation if (player.actor->status == AC_EAT) { player.eat_counter ++; if (player.eat_counter == 8) { player.actor->status = AC_FULL; player.eat_counter = 0; } } // handle firing if (is_fire(&ctrl) && player.actor->status == AC_FULL && !player.eat_pressed) { player.actor->status = AC_SPIT; player.eat_pressed = 1; if (player.ammo) { Tbullet *b = get_free_bullet(bullet, MAX_BULLETS); if (b != NULL) { set_bullet(b, (int)player.actor->x + 7, (int)player.actor->y - 14, (player.actor->direction ? 4 : -4), 0, data[EGG2].dat, 0); player.ammo --; play_sound(sfx[SMPL_SPIT]); } } } // return to normal if (!is_fire(&ctrl)) { player.eat_pressed = 0; if (player.eat_counter == 0 && player.actor->status != AC_BALL) { if (player.ammo) player.actor->status = AC_FULL; else player.actor->status = AC_NORM; } } // horizontal movement if (is_left(&ctrl) && (player.actor->status != AC_BALL)) { player.actor->x -= 1; if (player.actor->direction) player.actor->x -= 3; player.actor->direction = 0; animate_actor(&actor[0]); } else if (is_right(&ctrl) && (player.actor->status != AC_BALL)) { player.actor->x += 1; if (!player.actor->direction) player.actor->x += 3; player.actor->direction = 1; animate_actor(&actor[0]); } // rolling? if (player.actor->status == AC_BALL) { if (player.actor->direction) { player.angle += 8; player.actor->x += 2; } else { player.angle -= 8; player.actor->x -= 2; } } // horizontal tile collision if (is_ground(map, player.actor->x + x1, player.actor->y - 1)) { player.actor->x = old_x; if (player.actor->status == AC_BALL) play_sound(sfx[SMPL_HIT]); player.actor->status = (player.actor->status == AC_BALL ? AC_NORM : player.actor->status); }; if (is_ground(map, player.actor->x + x2, player.actor->y - 1)) { player.actor->x = old_x; if (player.actor->status == AC_BALL) play_sound(sfx[SMPL_HIT]); player.actor->status = (player.actor->status == AC_BALL ? AC_NORM : player.actor->status); }; if (is_ground(map, player.actor->x + x1, player.actor->y - 15)) { player.actor->x = old_x; if (player.actor->status == AC_BALL) play_sound(sfx[SMPL_HIT]); player.actor->status = (player.actor->status == AC_BALL ? AC_NORM : player.actor->status); }; if (is_ground(map, player.actor->x + x2, player.actor->y - 15)) { player.actor->x = old_x; if (player.actor->status == AC_BALL) play_sound(sfx[SMPL_HIT]); player.actor->status = (player.actor->status == AC_BALL ? AC_NORM : player.actor->status); }; // vertical movement if (!is_ground(map, player.actor->x + x1, player.actor->y)) { if (!is_ground(map, player.actor->x + x2, player.actor->y)) { player.actor->dy ++; player.jumping = 1; } } else { player.jumping = 0; player.actor->dy = 0; } // jumping? if (is_jump(&ctrl) && !player.jumping && !player.jump_pressed) { player.actor->dy = -16; player.jumping = 1; player.jump_pressed = 1; play_sound(sfx[SMPL_JUMP]); } if (!is_jump(&ctrl)) { if (player.actor->dy < 0) player.actor->dy >>= 1; player.jump_pressed = 0; } // apply vertical force player.actor->y += player.actor->dy >> 2; // check floor while (is_ground(map, player.actor->x + x1, player.actor->y - 1)) { player.actor->y --; player.jumping = 0; } while (is_ground(map, player.actor->x + x2, player.actor->y - 1)) { player.actor->y --; player.jumping = 0; } // check roof while (is_ground(map, player.actor->x + x1, player.actor->y - 15)) { player.actor->y ++; player.actor->dy = 0; } while (is_ground(map, player.actor->x + x2, player.actor->y - 15)) { player.actor->y ++; player.actor->dy = 0; } // check for map types ////// PICKUPS / EATS tx = (player.actor->x + (player.actor->direction ? 10 : 6)) >> 4; ty = (player.actor->y - 10) >> 4; mp = get_mappos(map, tx, ty); if (mp != NULL) { if (mp->item == MAP_EGG) { mp->item = 0; if (player.actor->status != AC_BALL) player.actor->status = AC_EAT; player.eat_counter = 0; player.ammo ++; play_sound(sfx[SMPL_EAT]); } if (mp->item == MAP_HEART) { mp->item = 0; if (player.actor->status != AC_BALL) player.actor->status = AC_EAT; player.eat_counter = 0; if (player.health >= 2) { player.score += 100; } else { player.health ++; } play_sound(sfx[SMPL_HEART]); } if (mp->item == MAP_STAR) { mp->item = 0; if (player.actor->status != AC_BALL) player.actor->status = AC_EAT; player.eat_counter = 0; player.score += 100; player.stars_taken ++; play_sound(sfx[SMPL_STAR]); if (player.stars == player.stars_taken) { Tparticle *p; p = get_free_particle(particle, MAX_PARTICLES); if (p != NULL) { set_particle(p, (tx << 4) + 4, ty << 4, 0, -0.5, 0, 50, ALL100); } } } if (mp->item == MAP_CHERRY) { mp->item = 0; if (player.actor->status != AC_BALL) player.actor->status = AC_EAT; player.eat_counter = 0; player.score += 10; player.cherries_taken ++; play_sound(sfx[SMPL_CHERRY]); if (player.cherries == player.cherries_taken) { Tparticle *p; p = get_free_particle(particle, MAX_PARTICLES); if (p != NULL) { set_particle(p, (tx << 4) + 8, ty << 4, 0, -0.5, 0, 50, ALL100); } } } else if (mp->item == MAP_1UP) { create_burst(particle, (tx << 4) + 7, (ty << 4) + 7, 4, 32, 0, -1); mp->item = 0; if (player.actor->status != AC_BALL) player.actor->status = AC_EAT; player.eat_counter = 0; player.lives ++; play_sound(sfx[SMPL_XTRALIFE]); } } ////// MIDDLE STUFF (door, spikes) tx = (player.actor->x + 7) >> 4; ty = (player.actor->y - 7) >> 4; mp = get_mappos(map, tx, ty); // turn off exit flag map->win_conditions_fullfilled &= ~MAP_WIN_EXIT; // check tile for death or door if (mp != NULL) { if (mp->type == MAP_DEAD) { kill_player(&player); play_sound(sfx[SMPL_A_DIE]); } if (mp->type == MAP_EXIT) { map->win_conditions_fullfilled |= map->win_conditions & MAP_WIN_EXIT; } } ////// BREAKABLES tx = (player.actor->x + (player.actor->direction ? 15 : 0)) >> 4; ty = (player.actor->y - 7) >> 4; mp = get_mappos(map, tx, ty); if (mp != NULL) { if (mp->type == MAP_BRK && player.actor->status == AC_BALL) { mp->tile = mp->type = mp->mask = 0; create_burst(particle, (tx << 4) + 7, (ty << 4) + 7, 16, 64, 0, -1); create_burst(particle, (tx << 4) + 7, (ty << 4) + 7, 16, 64, 0, -1); play_sound(sfx[SMPL_CRUSH]); } } ////// FLOORS tx = (player.actor->x + 7) >> 4; ty = (player.actor->y + 4) >> 4; mp = get_mappos(map, tx, ty); if (mp != NULL) { if (mp->type == MAP_SPIN && player.actor->status != AC_BALL) { Tmappos *m = get_mappos(map, tx + (player.actor->direction ? 1 : -1), ty - 1); if (m != NULL) { if (!m->mask) { player.actor->status = AC_BALL; play_sound(sfx[SMPL_SPIN]); } } } } } else { // player is dead player.actor->y += player.actor->dy >> 2; player.actor->dy ++; player.actor->x += (player.actor->direction ? 1 : -1); } } // checks and acts upone collisions between // bullets and enemies void check_bullets_with_enemies() { int b, e; for(b = 0; b < MAX_BULLETS; b ++) { if (bullet[b].exist && bullet[b].bad == 0) { for(e = 1; e < MAX_ACTORS; e ++) { if (actor[e].active && actor[e].status == AC_NORM && (actor[e].flags & ACF_SHOOTABLE)) { if (check_bb_collision(bullet[b].x, bullet[b].y, 7, 6, actor[e].x, actor[e].y-actor[e].h, 16, actor[e].h)) { kill_actor(&actor[e]); map->num_enemies --; actor[e].direction = (bullet[b].dx > 0 ? 0 : 1); bullet[b].exist = 0; create_burst(particle, (int)bullet[b].x+4, (int)bullet[b].y+3, 4, 8, 0, -1); play_sound(sfx[SMPL_E_DIE]); } } } } } } // checks and acts upon collisions between // bullets and alex void check_bullets_with_alex() { int b; for(b = 0; b < MAX_BULLETS; b ++) { if (bullet[b].exist && bullet[b].bad) { if (actor[0].status != AC_DEAD) { if (check_bb_collision(bullet[b].x+1, bullet[b].y+1, bullet[b].bmp->w-1, bullet[b].bmp->h-1, actor[0].x+4, actor[0].y-16, 8, 16)) { if (!player.wounded) { wound_player(&player); if (player.actor->status == AC_DEAD) play_sound(sfx[SMPL_A_DIE]); else play_sound(sfx[SMPL_HURT]); } //actor[0].direction = (bullet[b].dx > 0 ? 1 : 0); bullet[b].exist = 0; create_burst(particle, (int)bullet[b].x+4, (int)bullet[b].y+3, 4, 16, 0, -1); } } } } } // checks and acts upon collisions between // enemies and alex void check_alex_with_enemies() { int e; if (actor[0].status != AC_DEAD) { for(e = 1; e < MAX_ACTORS; e ++) { actor[e].is_hit = 0; if (actor[e].active && actor[0].status != AC_DEAD && actor[e].flags & ACF_HURTS) { // first check if alex jumped on the enemy if (actor[0].dy >= 0 && actor[e].status == AC_NORM && player.jumping && actor[0].status != AC_BALL && actor[e].flags & ACF_JUMPABLE) { if (check_bb_collision(actor[0].x+2, actor[0].y+12-16, 12, 8, actor[e].x, actor[e].y-actor[e].h, actor[e].w, 4)) { Tparticle *p; p = get_free_particle(particle, MAX_PARTICLES); if (p != NULL) { set_particle(p, actor[e].x + (actor[e].w >> 1), actor[0].y, 0, 0, 0, 5, PARTICLE_BOPP); } if (actor[e].flags & ACF_FLATABLE) { // flatten actor[e].status = AC_FLAT; actor[e].counter = 0; } else if (!(actor[e].flags & ACF_BOUNCEABLE)) { // kill kill_actor(&actor[e]); map->num_enemies --; actor[e].direction = (actor[0].direction ? 0 : 1); } if (actor[e].flags & ACF_BOUNCEABLE) { // bounce player.actor->y = actor[e].y - actor[e].h - 6; player.dy = -15; // jump! player.jumping = TRUE; play_sound(sfx[SMPL_JUMP]); if (actor[e].mode == 0) { actor[e].mode = 4; actor[e].counter = 0; } } else { player.dy = -5; //play_sound((actor[e].type == MAP_ENEMY5 ? sfx[SMPL_E_DIE] : sfx[SMPL_MASH])); play_sound(sfx[SMPL_MASH]); if (is_jump(&ctrl) ) { player.dy = -20; // jump! player.jumping = TRUE; play_sound(sfx[SMPL_JUMP]); } } } } else { // now check if alex dies or knocks them over if (actor[e].status == AC_NORM || (actor[e].status == AC_FLAT && actor[0].status == AC_BALL)) { if (check_bb_collision(actor[0].x + (actor[0].direction ? 0 : 8), actor[0].y-16, 8, 16, actor[e].x + actor[e].ox, actor[e].y - actor[e].h, actor[e].w, actor[e].h)) { int wounded = 0; if (actor[0].status == AC_BALL) { if (actor[e].flags & ACF_ROLLABLE) { kill_actor(&actor[e]); map->num_enemies --; actor[e].direction = (actor[0].direction ? 0 : 1); play_sound(sfx[SMPL_E_DIE]); } else if (actor[e].flags & ACF_ROLLABLE_BACK) { if (actor[e].direction == actor[0].direction) { actor[e].energy --; actor[e].is_hit = 1; play_sound(sfx[SMPL_HIT]); } else wounded = 1; } else wounded = 1; } else wounded = 1; if (!player.wounded && wounded) { clear(swap_screen); wound_player(&player); if (player.actor->status == AC_DEAD) { actor[0].direction = actor[e].direction; play_sound(sfx[SMPL_A_DIE]); } else { play_sound(sfx[SMPL_HURT]); } } } } // maybe he can eat them? else if (actor[e].status == AC_FLAT && actor[0].status != AC_BALL) { if (check_bb_collision(actor[0].x + (actor[0].direction ? 16 : -8), actor[0].y, 8, 16, actor[e].x + 2, actor[e].y + 8, 12, 8)) { actor[e].active = 0; map->num_enemies --; actor[0].status = AC_EAT; player.score += 50; player.eat_counter = 0; play_sound(sfx[SMPL_EAT]); } } } } } } } // calculates camera pos for map m considering player p void calculate_camera_pos(Tplayer *p, Tmap *m) { static camera_type = 1; if (p->actor->status == AC_BALL) { camera_type = 2; } else { camera_type = 1; } if (camera_type == 0) { // centered camera, doesn't happen a lot static int target_x; target_x = MAX(0, MIN(p->actor->x + 8 - 80, m->width * 16 - 160)); if (m->offset_x < target_x) m->offset_x ++; if (m->offset_x > target_x) m->offset_x --; } else if (camera_type == 1) { // walk camera int x = p->actor->x - m->offset_x; int pan = 1; int tox, d_tox, step; static int side = 1; static int d_step = 0; static int count = 0; if (side) { if (x < 60 && x > 40 ) pan = 0; } else { if (x < 105 && x > 85 ) pan = 0; } if (pan) { side = p->actor->direction; count = 0; } else { d_step = 0; if (++ count > 50) pan = 1; // pan anyway } if (pan) { if (p->actor->direction) tox = MAX(0, MIN(p->actor->x - 60, m->width * 16 - 160)); else tox = MAX(0, MIN(p->actor->x - 85, m->width * 16 - 160)); d_tox = tox - m->offset_x; if (ABS(d_tox) > 1) step = 2; else if (ABS(d_tox) > 0) step = 1; else step = 0; if (p->actor->status != AC_BALL) step = MIN(step, 3); step *= SGN(d_tox); if (d_step > step) d_step --; if (d_step < step) d_step ++; m->offset_x = MAX(0, MIN(m->offset_x + d_step, m->width * 16 - 160)); } } else if (camera_type == 2) { // roll camera int x = p->actor->x - m->offset_x; int pan = 1; int tox, d_tox, step; static int side = 1; static int d_step = 0; static int count = 0; if (side) { if (x < 34 && x > 8 ) pan = 0; } else { if (x < 136 && x > 111 ) pan = 0; } if (pan) { side = p->actor->direction; count = 0; } else { d_step = 0; if (++ count > 50) pan = 1; // pan anyway } if (pan) { if (p->actor->direction) tox = MAX(0, MIN(p->actor->x - 34, m->width * 16 - 160)); else tox = MAX(0, MIN(p->actor->x - 112, m->width * 16 - 160)); d_tox = tox - m->offset_x; if (ABS(d_tox) > 70) step = 8; else if (ABS(d_tox) > 60) step = 7; else if (ABS(d_tox) > 50) step = 6; else if (ABS(d_tox) > 40) step = 5; else if (ABS(d_tox) > 30) step = 4; else if (ABS(d_tox) > 20) step = 3; else if (ABS(d_tox) > 1) step = 2; else if (ABS(d_tox) > 0) step = 1; else step = 0; if (p->actor->status != AC_BALL) step = MIN(step, 3); step *= SGN(d_tox); if (d_step > step) d_step --; if (d_step < step) d_step ++; m->offset_x = MAX(0, MIN(m->offset_x + d_step, m->width * 16 - 160)); } } } // shows the pause menu int do_pause_menu(BITMAP *bg) { int done = 0; // pause sound if (got_sound && !editing) al_pause_duh(dp); play_sound_id(SMPL_PAUSE); // darken screen transform_bitmap(bg, -1); blit_to_screen(bg); // show text textout_outline_center(bg, (editing ? "<<< EDITOR PAUSED >>>" : "<<< GAME PAUSED >>>"), 80, 40); textout_outline_center(bg, "esc to quit", 80, 60); textout_outline_center(bg, "any key to resume", 80, 70); blit_to_screen(bg); // wait to release esc while(key[KEY_ESC]); // wait for user input clear_keybuf(); while(!done) { if (got_sound) al_poll_duh(dp); poll_control(&ctrl); if (is_fire(&ctrl) || is_jump(&ctrl)) done = 1; if (keypressed()) done = 1; if (key[KEY_ESC]) done = -1; yield_timeslice(); } if (done == -1) { game_status = GS_QUIT_GAME; play_sound_id(SMPL_MENU); } else { play_sound_id(SMPL_PAUSE); } if (got_sound && !editing) al_resume_duh(dp); return done; } // play the game! int play(int level) { int i; int playing_go_music = 0; game_status = GS_OK; cycle_count = 0; while(game_status == GS_OK) { // do logic while(cycle_count > 0) { logic_count ++; // poll music machine if (got_sound) { al_poll_duh(dp); } // check if user wants to enter edit mode if (!playing_original_game && !editing) { if (key[KEY_F1]) { // toggle edit on/off editing = 1; if (got_sound) stop_music(); set_edit_mode(EDIT_MODE_DRAW); log2file("Entering EDIT MODE"); } } // check player moves if (!editing) { update_player(); // dead? if (player.actor->status == AC_DEAD && !playing_go_music) { if (got_sound) start_music((player.lives ? MOD_PLAYER_DIES : MOD_GAME_OVER)); playing_go_music = 1; } if (player.actor->y > 160) { if (player.actor->status != AC_DEAD) { kill_player(&player); player.actor->y = 150; player.actor->dy = -20; play_sound(sfx[SMPL_A_DIE]); } else game_status = GS_GAME_DIED; } // camera calculate_camera_pos(&player, map); // actors for(i = 1; i < MAX_ACTORS; i ++) { if (actor[i].active) { // always update guard actors if (actor[i].type == MAP_GUARD1 || actor[i].type == MAP_GUARD2) { update_actor_with_map(&actor[i], map); } // update other actors only if on screen else if (actor[i].x > map->offset_x - 32 && actor[i].x < map->offset_x + 160 + 32) update_actor_with_map(&actor[i], map); } } if (player.dy) { player.actor->dy = player.dy; player.dy = 0; } // particles for(i = 0; i < MAX_PARTICLES; i ++) { if (particle[i].life) { //update_particle(&particle[i]); update_particle_with_map(&particle[i], map); } } // bullets for(i = 0; i < MAX_BULLETS; i ++) { if (bullet[i].exist) { update_bullet_with_map(&bullet[i], map); } } // collision checking // bullets vs enemies! check_bullets_with_enemies(); // alex vs enemies! check_alex_with_enemies(); // alex vs enemy bullets! check_bullets_with_alex(); // update and check win conditions if (map->num_enemies == 0) map->win_conditions_fullfilled |= map->win_conditions & MAP_WIN_KILL_ALL; if (map->win_conditions_fullfilled == map->win_conditions) game_status = GS_LEVEL_DONE; } else { // edit stuff int mx = mouse_x / (SCREEN_W / 160); int my = mouse_y / (SCREEN_H / 120); player.actor->x = map->start_x * 16; player.actor->y = map->start_y * 16 + 16; if (player.actor->x < 0) { player.actor->x = -map->start_x * 16; player.actor->direction = 0; } else { player.actor->direction = 1; } update_edit_mode(map, swap_screen, mx, my, mouse_b); } // COMMON STUFF if (key[KEY_ESC]) { do_pause_menu(swap_screen); cycle_count = 0; } if (key[KEY_F12]) { take_screenshot(swap_screen); while(key[KEY_F12]) if (got_sound) al_poll_duh(dp); cycle_count = 0; } cycle_count --; } // let other processes play yield_timeslice(); // draw frame_count ++; draw_frame(swap_screen, 1); blit_to_screen(swap_screen); } return game_status; } // draws the title void draw_title(BITMAP *bmp, int tick) { int w, h; char start_string[128] = "START GAME"; int y, x, step = 12; if (!playing_original_game) strcpy(start_string, "CUSTOM GAME"); blit(data[ALEX_BG].dat, bmp, 0, 0, 0, 0, 160, 112); rectfill(bmp, 0, 112, 160, 120, 2); w = ((BITMAP *)data[ALEX_LOGO].dat)->w; h = ((BITMAP *)data[ALEX_LOGO].dat)->h; draw_sprite(bmp, data[ALEX_LOGO].dat, 80 - w/2, 30 - h/2); draw_scroller(&hscroll, bmp, 0, 110); y = 60; x = 50; textout(bmp, data[THE_FONT].dat, start_string, x+1, y+1, 1); textout(bmp, data[THE_FONT].dat, start_string, x, y, 4); y += step; textout(bmp, data[THE_FONT].dat, "HIGH SCORES", x+1, y+1, 1); textout(bmp, data[THE_FONT].dat, "HIGH SCORES", x, y, 4); y += step; textout(bmp, data[THE_FONT].dat, "EDITOR", x+1, y+1, 1); textout(bmp, data[THE_FONT].dat, "EDITOR", x, y, 4); y += step; textout(bmp, data[THE_FONT].dat, "QUIT", x+1, y+1, 1); textout(bmp, data[THE_FONT].dat, "QUIT", x, y, 4); draw_sprite(bmp, data[POINTER].dat, x - 25 + fixtoi(3 * fcos(itofix(tick << 2))), 44 + menu_choice * step); } // switches gfx mode void switch_gfx_mode(int mode, int w, int h) { log2file(" switching to %d x %d (%s)", w, h, (mode == GFX_AUTODETECT_WINDOWED ? "w" : "f")); if (set_gfx_mode(mode, w, h, 0, 0)) { log2file(" *** failed"); log2file(" trying default mode (640x480 win)"); if (set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0)) { log2file(" *** failed"); log2file(" trying default mode (640x480 full)"); if (set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0)) { log2file(" *** failed"); log2file(" exiting program..."); uninit_game(); exit(0); log2file("\nDone...\n"); } } } set_palette(data[0].dat); } // gets a string from the user // used for getting highscore names int get_string(BITMAP *bmp, char *string, int max_size, FONT *f, int pos_x, int pos_y, int colour, Tcontrol *pad) { int i = 0, c; BITMAP *block = create_bitmap(text_length(f, "w")*max_size + 2, text_height(f) + 2); char letters[] = "_abcdefghijklmnopqrstuvwxyz {}"; int current_letter = 0; int max_letter = strlen(letters) - 1; int print_delay = 0; if (block == NULL) return 1; blit(bmp, block, pos_x - 1, pos_y - 1, 0, 0, block->w, block->h); clear_keybuf(); while(1) { cycle_count = 0; string[i] = letters[current_letter]; string[i + 1] = '\0'; blit(block, bmp, 0, 0, pos_x - 1, pos_y - 1, block->w, block->h); textout(bmp, f, string, pos_x, pos_y, colour); blit_to_screen(bmp); if (pad != NULL) { poll_control(pad); if (print_delay > 0) print_delay --; if (!is_any(pad)) print_delay = 0; } // get input if (keypressed()) { c = readkey(); switch((c >> 8)) { case KEY_BACKSPACE : i--; i = (i < 0)?0 :i; break; case KEY_ENTER : string[i] = '\0'; destroy_bitmap(block); return 0; break; default : if (i < max_size - 2 && isprint(c & 0xff)) { string[i] = c & 0xff; i++; current_letter = 0; } break; } } else if (pad != NULL && !print_delay) { // check pad if (is_up(pad) || is_right(pad)) { current_letter ++; if (current_letter > max_letter) current_letter = 0; print_delay = 8; } if (is_down(pad) || is_left(pad)) { current_letter --; if (current_letter < 0) current_letter = max_letter; print_delay = 8; } if (is_jump(pad) || is_fire(pad)) { print_delay = 50; switch(letters[current_letter]) { case '{': i--; i = (i < 0)?0 :i; break; case '}': string[i] = '\0'; destroy_bitmap(block); return 0; break; default : if (i < max_size - 2) { string[i] = letters[current_letter]; i++; } break; } } } while(!cycle_count); } } // lets the player enter a name for highscore use (or what ever) void get_player_name(char *name) { blit(data[INTRO_BG].dat, swap_screen, 0, 0, 0, 0, 160, 120); transform_bitmap(swap_screen, -1); textout_outline_center(swap_screen, "Congratulations,", 80, 8); textout_outline_center(swap_screen, "You've got", 80, 19); textout_outline_center(swap_screen, "a high score!", 80, 30); textout_outline_center(swap_screen, "Enter your name:", 80, 55); blit_to_screen(swap_screen); fade_in_pal(100); get_string(swap_screen, name, 10, data[THE_FONT].dat, 50, 80, 4, &ctrl); } // title and menu int do_main_menu() { int status = GS_OK; int count = 0; int tick = 0; log2file("\nRunning main menu:"); draw_title(swap_screen, tick); blit_to_screen(swap_screen); fade_in_pal(100); clear_keybuf(); cycle_count = 0; while(status == GS_OK) { // do logic while(cycle_count > 0) { logic_count ++; tick ++; // poll music if (got_sound) al_poll_duh(dp); scroll_scroller(&hscroll, -1); if (!scroller_is_visible(&hscroll)) restart_scroller(&hscroll); poll_control(&ctrl); if (count) count --; // is it ok to check for actions? if (!count) { // if the user has pressed an action button, // handle the different alternatives if (key[KEY_SPACE] || key[KEY_ENTER] || is_fire(&ctrl) || is_jump(&ctrl)) { if (menu_choice == 1) { log2file(" play selected"); status = GS_PLAY; play_sound(sfx[SMPL_MENU]); } if (menu_choice == 2) { log2file(" scores selected"); status = GS_SCORES; play_sound(sfx[SMPL_MENU]); } if (menu_choice == 3) { log2file(" edit selected"); status = GS_EDIT; play_sound(sfx[SMPL_MENU]); } if (menu_choice == 4) { log2file(" quit selected"); status = GS_QUIT_MENU; play_sound(sfx[SMPL_MENU]); } count = 10; } // esc is always a shortcut to quit if (key[KEY_ESC]) { if (menu_choice == 4) { log2file(" quit selected"); status = GS_QUIT_MENU; } else menu_choice = 4; play_sound(sfx[SMPL_MENU]); count = 10; } // movements in the menu if (key[KEY_UP] || is_up(&ctrl)) { menu_choice --; if (menu_choice < 1) menu_choice = 4; play_sound(sfx[SMPL_MENU]); count = 10; } if (key[KEY_DOWN] || is_down(&ctrl)) { menu_choice ++; if (menu_choice > 4) menu_choice = 1; play_sound(sfx[SMPL_MENU]); count = 10; } } // releasing all these keys, and you cen press them again if (!is_any(&ctrl) && !key[KEY_UP] && !key[KEY_ESC] && !key[KEY_DOWN] && !key[KEY_SPACE] && !key[KEY_ENTER]) count = 0; // shortcuts to gfx modes if (key[KEY_1]) { while(key[KEY_1]); switch_gfx_mode(GFX_AUTODETECT_WINDOWED, 160, 120); } if (key[KEY_2]) { while(key[KEY_2]); switch_gfx_mode(GFX_AUTODETECT_WINDOWED, 320, 240); } if (key[KEY_3]) { while(key[KEY_3]); switch_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480); } if (key[KEY_4]) { while(key[KEY_4]); switch_gfx_mode(GFX_AUTODETECT_FULLSCREEN, 640, 480); } cycle_count --; } // let other processes play yield_timeslice(); // draw frame_count ++; draw_title(swap_screen, tick); blit_to_screen(swap_screen); } // user selected EDIT if (status == GS_EDIT) { stop_music(); fix_gui_colors(); log2file("\nEntering editor:"); fade_out_pal(100); // create an empty map for the user log2file(" creating empty map"); if (map != NULL) destroy_map(map); map = create_map(50, 7); // if all went well, start editing if (map != NULL) { map->data = data; new_game(1); init_player(&player, map); init_map(map); reset_particles(particle, MAX_PARTICLES); reset_bullets(bullet, MAX_BULLETS); editing = TRUE; set_edit_mode(EDIT_MODE_DRAW); set_edit_path_and_file("new.map"); draw_frame(swap_screen, 1); blit_to_screen(swap_screen); fade_in_pal(100); status = play(-1); deinit_map(map); } else { log2file(" *** failed"); } if (got_sound) start_music(MOD_MENU_SONG); } else if (status == GS_PLAY) { //// user selected PLAY int level = 0; log2file("\nStarting new game:"); fade_out_pal(100); game_status = GS_OK; editing = FALSE; new_game(1); // select starting level if (options.max_levels && playing_original_game) { level = select_starting_level() - 1; fade_out_pal(100); if (level == -2) { // esc log2file(" cancelled"); game_status = status = GS_QUIT_GAME; } if (level == -101) { // shooter log2file(" shooter selected"); stop_music(); start_shooter(&ctrl, got_sound); game_status = status = GS_QUIT_GAME; start_music(MOD_MENU_SONG); } } // start playing while(game_status == GS_OK || game_status == GS_LEVEL_DONE) { // select level if (playing_original_game) { log2file(" starting level <%d>", level); new_level("datafile", level, 1); } else { log2file(" starting level <%s>", level_files[level]); set_edit_path_and_file(level_files[level]); new_level(level_files[level], -1, 1); } if (got_sound) { if (map->boss_level) start_music(MOD_BOSS_SONG); else start_music(MOD_LEVEL_SONG); } // actual game starts here show_lets_go(); status = play(level); // done playing level deinit_map(map); // act on different outcomes if (status == GS_GAME_DIED) { log2file(" player died"); if (player.lives == 0) { game_status = GS_GAMEOVER; } else { game_status = GS_OK; fade_out_pal(200); } } else if (status == GS_QUIT_GAME) { log2file(" player quit"); if (got_sound) stop_music(); fade_out_pal(100); if (got_sound) start_music(MOD_MENU_SONG); } else { PACKFILE *pf; log2file(" level complete"); if (got_sound) stop_music(); if (level < MAX_LEVELS && playing_original_game) { int i; int ace = 1; if (player.cherries == player.cherries_taken) { options.cherries[level] = 100; log2file(" all cherries taken"); } if (player.stars == player.stars_taken) { options.stars[level] = 100; log2file(" all stars taken"); } // check if all levels are aced for(i = 0; i < num_levels; i ++) { if (options.cherries[i] != 100) ace = 0; if (options.stars[i] != 100) ace = 0; } if (ace) options.one_hundred = 1; } level ++; show_cutscene(level); if (level == num_levels) { log2file(" game completed"); game_status = GS_GAME_COMPLETE; } if (level > options.max_levels && game_status != GS_GAME_COMPLETE) { options.max_levels = level; } fade_out_pal(100); // save options log2file(" saving options"); pf = pack_fopen("alex4.sav", "wp"); if (pf) { save_options(&options, pf); pack_fclose(pf); } } } // are we done or dead? if (game_status == GS_GAMEOVER || game_status == GS_GAME_COMPLETE) { Thisc post; if (game_status == GS_GAMEOVER) { log2file(" game over"); show_game_over(); } else { // game complete if (playing_original_game) { start_music(MOD_OUTRO_SONG); run_script((char *)data[SCR_OUTRO].dat, data); stop_music(); } else { show_custom_ending(); } clear_to_color(swap_screen, 4); blit_to_screen(swap_screen); } stop_music(); // build post post.level = level + 1; post.score = player.score; // check if player got a high score if (qualify_hisc_table(hisc_table, post)) { fade_out_pal(100); log2file(" player qualified for highscore (%d, %d)", post.level, post.score); // get player name get_player_name(post.name); log2file(" score logged as <%s>", post.name); enter_hisc_table(hisc_table, post); sort_hisc_table(hisc_table); } if (got_sound) start_music(MOD_MENU_SONG); status = GS_SCORES; } } // show highscores? // can be entered from both menu and end of game if (status == GS_SCORES) { fade_out_pal(100); log2file(" showing scores"); show_scores(0, hisc_table); if (options.one_hundred) { show_scores(1, hisc_table_space); } } // user quit if (status == GS_QUIT_MENU) { stop_music(); fade_out_pal(100); // show bye bye screen blit(data[INTRO_BG].dat, swap_screen, 0, 0, 0, 0, 160, 120); transform_bitmap(swap_screen, -1); textout_outline_center(swap_screen, "Thanks for playing!", 80, 20); textout_outline_center(swap_screen, "Design, Code, GFX:", 80, 48); textout_outline_center(swap_screen, "Johan Peitz", 80, 60); textout_outline_center(swap_screen, "MUSIC, SFX:", 80, 78); textout_outline_center(swap_screen, "Anders Svensson", 80, 90); blit_to_screen(swap_screen); fade_in_pal(100); cycle_count = 0; while(!key[KEY_ESC] && cycle_count < 200); fade_out_pal(100); clear(screen); } return status; } // main int main(int argc, char **argv) { FILE *fp; int i; char full_path[1024]; // init allegro allegro_init(); // get working directory get_executable_name(full_path, 1024); replace_filename(working_directory, full_path, "", 1024); chdir(working_directory); // start logfile fp = fopen("log.txt", "wt"); if (fp) { fprintf(fp, "Alex 4 (%s) - log file\n-------------------\n", GAME_VERSION_STR); fclose(fp); } // log program arguments log2file("Game started with the following commands:"); for(i = 0; i < argc; i ++) { log2file(" %s", argv[i]); } log2file("Working directory is:\n %s", working_directory); // test wether to play real game // or custom levels if (argc == 1) playing_original_game = TRUE; else playing_original_game = FALSE; // init game if (init_game((playing_original_game ? "maps from datafile please" : argv[1]))) { if (playing_original_game) { start_music(MOD_INTRO_SONG); if (run_script((char *)data[SCR_INTRO].dat, data) < 0) { fade_out_pal(100); } stop_music(); } if (got_sound) start_music(MOD_MENU_SONG); while(do_main_menu() != GS_QUIT_MENU); } else { log2file("*** init failed!"); allegro_message("ALEX4:\nFailed to start game."); } // tidy up uninit_game(); allegro_exit(); log2file("\nDone...\n"); return 0; } END_OF_MAIN(); alex4src/src/main.h0000666000175000017500000000644307710456700014670 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #ifndef _MAIN_H_ #define _MAIN_H_ #include "allegro.h" #include "aldumb.h" #include "map.h" #include "hisc.h" #include "actor.h" #include "control.h" // version string #define GAME_VERSION_STR "v1.1" // sample shortcuts #define SMPL_STARTUP 0 #define SMPL_POINT 1 #define SMPL_JUMP 2 #define SMPL_MASH 3 #define SMPL_EAT 4 #define SMPL_SPIT 5 #define SMPL_A_DIE 6 #define SMPL_HIT 7 #define SMPL_CRUSH 8 #define SMPL_E_DIE 10 #define SMPL_HEART 11 #define SMPL_HURT 12 #define SMPL_XTRALIFE 13 #define SMPL_CHERRY 14 #define SMPL_MENU 15 #define SMPL_SHOOT 16 #define SMPL_SPIN 17 #define SMPL_STAR 18 #define SMPL_CRUSH_LAND 19 #define SMPL_PAUSE 20 #define SMPL_ENGINE 21 #define SMPL_CHOPPER 22 #define SMPL_SHIP 23 #define SMPL_TALK 24 #define SMPL_BEAM 25 // functions char *get_init_string(); void textout_outline_center(BITMAP *bmp, const char *txt, int cx, int y); void log2file(char *format, ...); int do_pause_menu(BITMAP *bg); void take_screenshot(BITMAP *bmp); void set_map(Tmap *m); void msg_box(char *str); void new_game(int reset_player_data); void new_level(char *fname, int level_id, int draw); Tactor *get_alex(); void draw_frame(BITMAP *bmp, int draw_status_bar); void blit_to_screen(BITMAP *bmp); void fade_in_pal(int delay); void fade_out_pal(int delay); void fade_in_pal_black(int delay, AL_DUH_PLAYER *duh_player); void fade_out_pal_black(int delay, AL_DUH_PLAYER *duh_player); void play_sound_id(int id); void play_sound_id_ex(int id, int vol, int freq, int loop); void adjust_sound_id_ex(int id, int x); void stop_sound_id(int id); int get_string(BITMAP *bmp, char *string, int max_size, FONT *f, int pos_x, int pos_y, int colour, Tcontrol *pad); BITMAP *get_gameover_sign(); BITMAP *get_letsgo_sign(); Thisc *get_space_hisc(); void show_scores(int space, Thisc *table); void poll_music(); // a little bounding box quickie #define check_bb_collision(x1,y1,w1,h1,x2,y2,w2,h2) (!( ((x1)>=(x2)+(w2)) || ((x2)>=(x1)+(w1)) || \ ((y1)>=(y2)+(h2)) || ((y2)>=(y1)+(h1)) )) #endifalex4src/src/map.c0000666000175000017500000003110107711252134014475 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #include #include #include #include "allegro.h" #include "map.h" #include "timer.h" #include "../data/data.h" // creates one splendid map Tmap *create_map(int w, int h) { Tmap *m; m = malloc(sizeof(Tmap)); if (m == NULL) return NULL; strcpy(m->name, "noname"); m->map_data_needs_to_be_destroyed = 1; m->boss_level = 0; m->num_enemies = 0; m->start_x = 2; m->start_y = 4; m->win_conditions = MAP_WIN_EXIT; m->win_conditions_fullfilled = 0; m->offset_x = 0; m->offset_y = 0; m->width = w; m->height = h; m->dat = malloc(w * h * sizeof(Tmappos)); if (m->dat == NULL) { free(m); return NULL; } // clear map memset(m->dat, 0, w * h * sizeof(Tmappos)); return m; } // loads one splendind map from disk Tmap *load_map(char *fname) { Tmap *m; FILE *fp; char header[6]; // open file fp = fopen(fname, "rb"); if (fp == NULL) { return NULL; } // does the header match? fread(header, 6, 1, fp); if (header[0] != 'A' && header[1] != 'X' && header[2] != '4' && header[3] != 'M' && header[4] != 'A' && header[5] != 'P') { return NULL; fclose(fp); } // get memory m = malloc(sizeof(Tmap)); if (m == NULL) { fclose(fp); return NULL; } // read datastruct fread(m, sizeof(Tmap), 1, fp); // read map data m->dat = malloc(m->width * m->height * sizeof(Tmappos)); if (m->dat == NULL) { free(m); return NULL; } fread(m->dat, sizeof(Tmappos), m->width * m->height, fp); // close file fclose(fp); m->map_data_needs_to_be_destroyed = 1; return m; } // loads one splendind map from memory Tmap *load_map_from_memory(void *mem) { Tmap *m; char header[6]; char *c = (char *)mem; // does the header match? //fread(header, 6, 1, fp); memcpy(header, c, 6); if (header[0] != 'A' && header[1] != 'X' && header[2] != '4' && header[3] != 'M' && header[4] != 'A' && header[5] != 'P') { return NULL; //fclose(fp); } c += 6; // get memory m = malloc(sizeof(Tmap)); if (m == NULL) { //fclose(fp); return NULL; } // read datastruct // fread(m, sizeof(Tmap), 1, fp); memcpy(m, c, sizeof(Tmap)); c += sizeof(Tmap); // read map data m->dat = malloc(m->width * m->height * sizeof(Tmappos)); if (m->dat == NULL) { free(m); return NULL; } // fread(m->dat, sizeof(Tmappos), m->width * m->height, fp); memcpy(m->dat, c, sizeof(Tmappos) * m->width * m->height); c += sizeof(Tmappos) * m->width * m->height; // close file //fclose(fp); m->map_data_needs_to_be_destroyed = 0; return m; } // saves a map to file int save_map(Tmap *m, char *fname) { FILE *fp; char header[6] = "AX4MAP"; // open file fp = fopen(fname, "wb"); if (fp == NULL) return FALSE; // write header fwrite(header, 6, 1, fp); // write datastruct fwrite(m, sizeof(Tmap), 1, fp); // write map data fwrite(m->dat, sizeof(Tmappos), m->width * m->height, fp); // close file fclose(fp); return TRUE; } // frees the memory of a map void destroy_map(Tmap *m) { if (m == NULL) return; if (!m->map_data_needs_to_be_destroyed) return; // free data if (m->dat != NULL) free(m->dat); // free the map itself free(m); } // draws a submap to a bitmap void draw_map(BITMAP *bmp, Tmap *sm, int dx, int dy, int w, int h, int edit) { int x, y; int tox = sm->offset_x >> 4; // Tile Offset X int toy = sm->offset_y >> 4; // Tile Offset Y int tx, ty; int pos; int ax = (tox << 4) - sm->offset_x; // pixel adjustments in x int ay = (toy << 4) - sm->offset_y; // pixel adjustments in y if (sm == NULL) return; set_clip(bmp, dx, dy, dx+w-1, dy+h-1); for(y=0;y<7;y++) { for(x=0;x<11;x++) { tx = x + tox; ty = y + toy; if (tx < sm->width && ty < sm->height && tx >= 0 && ty >= 0) { pos = tx + ty * sm->width; if (sm->dat[pos].tile) { draw_sprite(bmp, sm->data[sm->dat[pos].tile + TILE000 - 1].dat, dx + x*16 + ax, dy + y*16 + ay); } if (sm->dat[pos].item) { if (sm->dat[pos].item == MAP_EGG) { draw_sprite(bmp, sm->data[EGG].dat, dx + x*16 + ax, dy + y*16 + ay); } else if (sm->dat[pos].item == MAP_1UP) { draw_sprite(bmp, sm->data[ONEUP].dat, dx + x*16 + ax, dy + y*16 + ay); } else if (sm->dat[pos].item == MAP_STAR) { draw_sprite(bmp, sm->data[STAR].dat, dx + x*16 + ax, dy + y*16 + ay); } else if (sm->dat[pos].item == MAP_HEART) { draw_sprite(bmp, sm->data[HEART].dat, dx + x*16 + ax, dy + y*16 + ay); } else if (sm->dat[pos].item == MAP_CHERRY) { draw_sprite(bmp, sm->data[CHERRY].dat, dx + x*16 + ax, dy + y*16 + ay); } else if (sm->dat[pos].item == MAP_LOLA) { draw_sprite(bmp, sm->data[LOLA].dat, dx + x*16 + ax, dy + y*16 + ay); } } if (sm->dat[pos].type) { if (sm->dat[pos].type == MAP_SPIN) { draw_sprite(bmp, sm->data[SPIN1 + ((ABS(game_count) >> 2) % 4)].dat, dx + x*16 + ax, dy + y*16 + ay); } if (sm->dat[pos].type == MAP_WATER) { blit(sm->data[WATER].dat, bmp, ((ABS(game_count) >> 2) % 4) << 4, 0, dx + x*16 + ax, dy + y*16 + ay, 16, 16); } if (sm->dat[pos].type == MAP_SURFACE) { masked_blit(sm->data[WATER_SURFACE].dat, bmp, ((ABS(game_count) >> 2) % 8) << 4, 0, dx + x*16 + ax, dy + y*16 + ay, 16, 16); } } if (edit) { if (sm->dat[pos].type == MAP_DEAD) { textout(bmp, font, "D", dx + x*16 + ax, dy + y*16 + ay, 0); } if (sm->dat[pos].type == MAP_EXIT) { textout(bmp, font, "XT", dx + x*16 + ax, dy + y*16 + ay, 255); } if (sm->dat[pos].type == MAP_BRK) { textout(bmp, font, "GL", dx + x*16 + ax, dy + y*16 + ay, 255); } if (sm->dat[pos].type == MAP_ENEMY1) { draw_sprite(bmp, sm->data[ENEMY1_01 + ((ABS(game_count) >> 3) % 4)].dat, dx + x*16 + ax, dy + y*16 + ay); } if (sm->dat[pos].type == MAP_ENEMY2) { draw_sprite(bmp, sm->data[ENEMY2_01 + ((ABS(game_count) >> 3) % 4)].dat, dx + x*16 + ax, dy + y*16 + ay - 8); } if (sm->dat[pos].type == MAP_ENEMY3) { draw_sprite(bmp, sm->data[ENEMY3].dat, dx + x*16 + ax, dy + y*16 + ay - 96); } if (sm->dat[pos].type == MAP_ENEMY4) { draw_sprite(bmp, sm->data[ENEMY4].dat, dx + x*16 + ax, dy + y*16 + ay); } if (sm->dat[pos].type == MAP_ENEMY5) { draw_sprite(bmp, sm->data[ENEMY5_01].dat, dx + x*16 + ax, dy + y*16 + ay); } if (sm->dat[pos].type == MAP_ENEMY6) { draw_sprite(bmp, sm->data[ENEMY6].dat, dx + x*16 + ax, dy + y*16 + ay); } if (sm->dat[pos].type == MAP_GUARD1) { draw_sprite(bmp, sm->data[GUARD1_1].dat, dx + x*16 + ax, dy + y*16 + ay - 16); } if (sm->dat[pos].type == MAP_GUARD2) { draw_sprite(bmp, sm->data[GUARD2_1a].dat, dx + x*16 + ax, dy + y*16 + ay - 32); } } } } } set_clip(bmp, 0, 0, SCREEN_W - 1, SCREEN_H - 1); } // gets a pointer to the mappos at tx, ty Tmappos *get_mappos(Tmap *m, int tx, int ty) { if (m == NULL) return NULL; if (tx < 0 || tx >= m->width) return NULL; if (ty < 0 || ty >= m->height) return NULL; return &m->dat[tx + ty * m->width]; } // copies a part of a map to another part void copy_map(Tmap *src, Tmap *dst, int sx, int sy, int dx, int dy, int w, int h) { int x, y; for(x=0;xdat[dx + x + (dy + y) * dst->width] = src->dat[sx + x + (sy + y) * src->width]; } // changes the size of the sub map according to dw and dh // dir_flags hold on which sides to shrink and/or expand void change_map_size(Tmap *sm, int dw, int dh, int dir_flags) { Tmap tsm; int i; if (sm == NULL) return; if (!dir_flags) return; if (dh) { // save old map and create new tsm.dat = sm->dat; tsm.width = sm->width; tsm.height = sm->height; sm->height += dh; sm->dat = malloc(sm->width * sm->height * sizeof(Tmappos)); for(i=0;iwidth*sm->height;i++) sm->dat[i].tile = sm->dat[i].mask = sm->dat[i].type = sm->dat[i].item = 0; // copy relevant parts if (dh > 0) { if (dir_flags & SM_UP ) copy_map(&tsm, sm, 0, 0, 0, dh, tsm.width, tsm.height); else if (dir_flags & SM_DOWN) copy_map(&tsm, sm, 0, 0, 0, 0, tsm.width, tsm.height); } else if (dh < 0) { if (dir_flags & SM_UP ) copy_map(&tsm, sm, 0,-dh, 0, 0, tsm.width, tsm.height + dh); else if (dir_flags & SM_DOWN) copy_map(&tsm, sm, 0, 0, 0, 0, tsm.width, tsm.height + dh); } free(tsm.dat); } if (dw) { // save old map and create new tsm.dat = sm->dat; tsm.width = sm->width; tsm.height = sm->height; sm->width += dw; sm->dat = malloc(sm->width * sm->height * sizeof(Tmappos)); for(i=0;iwidth*sm->height;i++) sm->dat[i].tile = sm->dat[i].mask = sm->dat[i].type = sm->dat[i].item = 0; // copy relevant parts if (dw > 0) { if (dir_flags & SM_LEFT ) copy_map(&tsm, sm, 0, 0, dw, 0, tsm.width, tsm.height); else if (dir_flags & SM_RIGHT) copy_map(&tsm, sm, 0, 0, 0, 0, tsm.width, tsm.height); } else if (dw < 0) { if (dir_flags & SM_LEFT ) copy_map(&tsm, sm,-dw, 0, 0, 0, tsm.width + dw, tsm.height); else if (dir_flags & SM_RIGHT) copy_map(&tsm, sm, 0, 0, 0, 0, tsm.width + dw, tsm.height); } free(tsm.dat); } } // returns the mask id if there is ground at a,y // can handel masks [0, 8] int is_ground(Tmap *sm , int x, int y) { int tile_x = x >> 4; int tile_y = y >> 4; int ox, oy; int pos, mask; // return FALSE if outside map if (tile_x < 0 || tile_x >= sm->width) return 1; if (tile_y < 0 || tile_y >= sm->height) return 0; // cals position and mask pos = tile_x + tile_y * sm->width; mask = sm->dat[pos].mask; // the simple ones if (mask < 2) return mask; // 0 = no mask, 1 = full mask // calculate offset from top left corner of tile ox = x - (tile_x << 5); oy = y - (tile_y << 5); // the semi-simple ones if (mask == 2) { // half full block if (oy < 16) return 0; else return mask; } if (mask == 5 && oy > 31 - ox) return mask; // 45 degree slope / if (mask == 6 && oy > ox) return mask; // 45 degree slope \ // the not so simple ones if (mask == 3 && oy > 31 - ox / 2) return mask; // 22 degree slope / (low) if (mask == 4 && oy > 15 - ox / 2) return mask; // 22 degree slope / (hi) if (mask == 7 && oy > ox / 2) return mask; // 22 degree slope \ (hi) if (mask == 8 && oy > 16 + ox / 2) return mask; // 22 degree slope \ (low) // return FALSE for all other cases return 0; } // returns delta to new y coord int adjust_ypos (Tmap *sm, int x, int y, int ground, int dy) { int oy = y; if (ground) while (is_ground(sm, x, y)) y += dy; else while (!is_ground(sm, x, y)) y += dy; return y - oy; } // returns delta to new x coord int adjust_xpos (Tmap *sm, int x, int y, int ground, int dx) { int ox = x; if (ground) while (is_ground(sm, x, y)) x += dx; else while (!is_ground(sm, x, y)) x += dx; return x - ox; } // sets the tile id // returns 1 if all went well int set_tile(Tmap *m, int tx, int ty, int tile) { if (tx < 0 || ty < 0) return 0; if (tx >= m->width || ty >= m->height) return 0; m->dat[tx + ty * m->width].tile = tile; return 1; } // returns the tile id int get_tile(Tmap *m, int tx, int ty) { if (tx < 0 || ty < 0) return 0; if (tx >= m->width || ty >= m->height) return 0; return m->dat[tx + ty * m->width].tile; } alex4src/src/map.h0000666000175000017500000000633007710456700014514 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #ifndef _MAP_H_ #define _MAP_H_ #include #include "allegro.h" // some directions for expanding/shrinking the map #define SM_UP 0x01 #define SM_DOWN 0x02 #define SM_RIGHT 0x04 #define SM_LEFT 0x08 // the items #define MAP_EGG 1 #define MAP_DEAD 2 #define MAP_EXIT 3 #define MAP_1UP 4 #define MAP_SPIN 5 #define MAP_BRK 6 #define MAP_STAR 7 #define MAP_CHERRY 8 #define MAP_HEART 9 #define MAP_LOLA 10 // the enemies ... #define MAP_ENEMY1 101 #define MAP_ENEMY2 102 #define MAP_ENEMY3 103 #define MAP_ENEMY4 104 #define MAP_ENEMY5 105 #define MAP_ENEMY6 106 // ... and the bosses #define MAP_GUARD1 151 #define MAP_GUARD2 152 // water tiles #define MAP_WATER 201 #define MAP_SURFACE 202 // win conditions #define MAP_WIN_EXIT 1 #define MAP_WIN_KILL_GUARDIAN 2 #define MAP_WIN_KILL_ALL 4 // a position on the tile map typedef struct { unsigned char tile; // #id in tile set unsigned char mask; // #id in mask set unsigned char type; // what type has this tile? unsigned char item; // does this slot have an item? } Tmappos; // map header (overall stuff) typedef struct { char name[32]; char dummy[27]; char map_data_needs_to_be_destroyed; char win_conditions_fullfilled; char num_enemies; char boss_level; char win_conditions; int width, height; Tmappos *dat; int offset_x; int offset_y; DATAFILE *data; int start_x; int start_y; } Tmap; // functions Tmap *create_map(int w, int h); void destroy_map(Tmap *m); Tmap *load_map(char *fname); Tmap *load_map_from_memory(void *mem); int save_map(Tmap *m, char *fname); void change_map_size(Tmap *m, int dw, int dh, int dir_flags); void draw_map(BITMAP *bmp, Tmap *m, int dx, int dy, int w, int h, int edit); Tmappos *get_mappos(Tmap *m, int tx, int ty); int set_tile(Tmap *m, int tx, int ty, int tile); int get_tile(Tmap *m, int tx, int ty); int is_ground(Tmap *m , int x, int y); int adjust_ypos (Tmap *m, int x, int y, int ground, int dy); int adjust_xpos (Tmap *m, int x, int y, int ground, int dx); #endifalex4src/src/options.c0000666000175000017500000000322607710456700015426 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #include #include "options.h" // saves the data structure to disk void save_options(Toptions *o, PACKFILE *fp) { pack_fwrite(o, sizeof(Toptions), fp); } // loads the data structure from disk void load_options(Toptions *o, PACKFILE *fp) { pack_fread(o, sizeof(Toptions), fp); } // resets all data void reset_options(Toptions *o) { int i; o->use_vsync = 0; o->max_levels = 0; for(i = 0; i < MAX_LEVELS; i ++) { o->cherries[i] = 0; o->stars[i] = 0; } } alex4src/src/options.h0000666000175000017500000000314707710456700015435 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #ifndef _OPTIONS_H_ #define _OPTIONS_H_ #include "allegro.h" // number of levels to count cherries/stars on #define MAX_LEVELS 64 // the options struct typedef struct { int max_levels; int cherries[MAX_LEVELS]; int stars[MAX_LEVELS]; int use_vsync; int one_hundred; } Toptions; // functions void save_options(Toptions *o, PACKFILE *fp); void load_options(Toptions *o, PACKFILE *fp); void reset_options(Toptions *o); #endifalex4src/src/particle.c0000666000175000017500000000644107710456700015540 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #include "particle.h" // pointer to datafile DATAFILE *data; // set datafile to use void set_datafile(DATAFILE *d) { data = d; } // inits variables in a particle void set_particle(Tparticle *p, int x, int y, double dx, double dy, int color, int life, int bmp) { p->x = x; p->y = y; p->dx = dx; p->dy = dy; p->color = color; p->life = life; p->bmp = bmp; p->count = 0; } // draws particle depending on map offset (ox and oy) void draw_particle(BITMAP *bmp, Tparticle*p, int ox, int oy) { int x = p->x - ox; int y = p->y - oy; // is the particle inside the screen if (x < -16 || x > bmp->w + 16 || y < -16 || y > bmp->h +16) return; // draw it if (p->bmp == -1) putpixel(bmp, x, y, p->color); else { BITMAP *b = data[p->bmp + (p->color == -1 ? p->count>>1 : 0)].dat; draw_sprite(bmp, b, x - b->w/2, y - b->h/2); } } // updates the particle data (position etc) void update_particle(Tparticle* p) { p->x += p->dx; p->y += p->dy; if (p->bmp == -1) { p->dy += 0.1; } p->life --; p->count ++; } // resets all particles in an array void reset_particles(Tparticle *p, int max) { int i; for(i = 0; i < max; i ++) { p[i].life = 0; } } // returns an unused particle from an array Tparticle *get_free_particle(Tparticle *p, int max) { int i = 0; while(p[i].life && iy -= p->dy; p->x -= p->dx; if (is_ground(m, (int)p->x, (int)p->y)) { p->dy = - 0.9 * p->dy; //p->dx = - p->dx; } */ } // creates a little fireworks "bang" void create_burst(Tparticle *ps, int x, int y, int spread, int num, int life, int bmp) { int i; Tparticle *p; for(i = 0; i < num; i ++) { p = get_free_particle(ps, MAX_PARTICLES); if (p != NULL) { set_particle(p, x + rand()%spread - spread/2, y + rand()%spread - spread/2, ((double)(rand()%100))/100.0 - 0.5, ((double)(rand()%100))/100.0 - 0.5, rand()%4 + 1, (life ? life : 70 - rand()%50), bmp); } } } alex4src/src/particle.h0000666000175000017500000000400407710456700015536 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #ifndef _PARTICLE_H_ #define _PARTICLE_H_ #include "allegro.h" #include "map.h" // maximum number of particles at anytime #define MAX_PARTICLES 256 // the particle struct typedef struct { double x, y; double dx, dy; int color; int life; int count; int bmp; } Tparticle; // the particles themselves Tparticle particle[MAX_PARTICLES]; // functions void set_datafile(DATAFILE *d); void reset_particles(Tparticle *p, int max); Tparticle *get_free_particle(Tparticle *p, int max); void set_particle(Tparticle *p, int x, int y, double dx, double dy, int color, int life, int bmp); void draw_particle(BITMAP *bmp, Tparticle *p, int ox, int oy); void update_particle(Tparticle *p); void update_particle_with_map(Tparticle *p, Tmap *m); void create_burst(Tparticle *ps, int x, int y, int spread, int num, int life, int bmp); #endifalex4src/src/player.c0000666000175000017500000000657707710456700015243 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #include "player.h" #include "timer.h" #include "../data/data.h" // draws the player depending on his state void draw_player(BITMAP *bmp, Tplayer *p, int x, int y) { BITMAP *head, *body; // if flashing, just bail out if (p->wounded && (game_count % 2)) return; if (p->actor->status == AC_DEAD) { head = p->actor->data[HERO_NORM].dat; body = p->actor->data[HERO_JUMP].dat; draw_sprite_v_flip(bmp, body, x, y - 32); draw_sprite_v_flip(bmp, head, x, y - 16); } else if (p->actor->status == AC_BALL) { if (!p->actor->direction) rotate_sprite(bmp, p->actor->data[HERO_BALL].dat, x, y-16, itofix(p->angle)); else rotate_sprite_v_flip(bmp, p->actor->data[HERO_BALL].dat, x, y-16, itofix(p->angle + 128)); } else if (p->actor->status != AC_EAT) { if (p->actor->status == AC_FULL) head = p->actor->data[HERO_FULL].dat; else if (p->actor->status == AC_SPIT) head = p->actor->data[HERO_SPIT].dat; else head = p->actor->data[HERO_NORM].dat; if (p->jumping) body = p->actor->data[HERO_JUMP].dat; else body = p->actor->data[p->actor->frames[p->actor->frame]].dat; if (p->actor->direction) { draw_sprite_h_flip(bmp, body, x, y - 16); draw_sprite_h_flip(bmp, head, x, y - 16); } else { draw_sprite(bmp, body, x, y - 16); draw_sprite(bmp, head, x, y - 16); } } else { if (!p->jumping) { if (p->actor->direction) { draw_sprite_h_flip(bmp, p->actor->data[HERO_EAT].dat, x, y - 16); } else { draw_sprite(bmp, p->actor->data[HERO_EAT].dat, x - 16, y - 16); } } else { head = p->actor->data[HERO_SPIT].dat; body = p->actor->data[HERO_JUMP].dat; if (p->actor->direction) { draw_sprite_h_flip(bmp, body, x, y - 16); draw_sprite_h_flip(bmp, head, x, y - 16); } else { draw_sprite(bmp, body, x, y - 16); draw_sprite(bmp, head, x, y - 16); } } } } // set player as dead void kill_player(Tplayer *p) { p->lives --; p->ammo = 0; p->wounded = 0; p->health = 0; p->actor->status = AC_DEAD; p->actor->dy = -15; } // decreases player health etc void wound_player(Tplayer *p) { if (p->wounded) return; p->health --; p->wounded = 100; if (p->health <= 0) kill_player(p); } alex4src/src/player.h0000666000175000017500000000334507710456700015236 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #ifndef _PLAYER_H_ #define _PLAYER_H_ #include "actor.h" // struct for the player typedef struct { Tactor *actor; int score; int jumping; int jump_pressed; int eat_pressed; int eat_counter; int angle; int ammo; int lives; int health; int wounded; int dy; // pick up related int cherries; int stars; int cherries_taken; int stars_taken; } Tplayer; // the player Tplayer player; // functions void draw_player(BITMAP *bmp, Tplayer *p, int x, int y); void wound_player(Tplayer *p); void kill_player(Tplayer *p); #endifalex4src/src/resource.h0000666000175000017500000000070607556232132015566 0ustar pdewachtpdewacht//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by alex4.rc // #define IDI_ICON1 101 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif alex4src/src/script.c0000666000175000017500000003622307710456700015242 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #include #include #include "allegro.h" #include "script.h" #include "timer.h" #include "token.h" #include "main.h" #include "../data/data.h" // silly value #define NO_CHANGE -3249587 // datafile to use DATAFILE *data; // internal buffers BITMAP *buffer; BITMAP *swap_buffer; // bool if script is still running or not int script_done = 0; // any objects Tscript_object *objects = NULL; // shows a speak bulb void draw_speak_bulb(BITMAP *bmp, DATAFILE *d, int src_x, int src_y, int up, int left, int lines, char **rows, int arrow) { int i; int max_w = 0; int x1, y1, x2, y2; // bulb coords int xa, ya; // bulb_arrow position // get max text length for(i = 0; i < lines; i ++) { int len = text_length(d[THE_FONT].dat, rows[i]); if (max_w < len) max_w = len; } // calc bulb position x1 = MAX(src_x - max_w/2 - 8, 4); x2 = x1 + max_w + 8; if (x2 > 156) { x2 = 156; x1 = x2 - max_w - 16; } y2 = src_y - 10; y1 = src_y - 10 - lines * 9 - 8; xa = src_x - 4; ya = (up ? y1 - 10: src_y - 10); // draw the bulb rectfill(bmp, x1, y1 + 4, x2, y2 - 4, 4); rectfill(bmp, x1 + 4, y1, x2 - 4, y2, 4); line(bmp, x1, y1 + 4, x1, y2 - 4, 1); line(bmp, x1 + 4, y1, x2 - 4, y1, 1); line(bmp, x2, y1 + 4, x2, y2 - 4, 1); line(bmp, x1 + 4, y2, x2 - 4, y2, 1); line(bmp, x2+1, y1 + 4, x2+1, y2 - 4, 1); line(bmp, x1 + 4, y2+1, x2 - 4, y2+1, 1); draw_sprite(bmp, d[BULB_TL].dat, x1, y1); draw_sprite(bmp, d[BULB_BL].dat, x1, y2 - 5); draw_sprite(bmp, d[BULB_TR].dat, x2 - 5, y1); draw_sprite(bmp, d[BULB_BR].dat, x2 - 5, y2 - 5); if (arrow) draw_sprite(bmp, d[(left ? (up ? BULBA_TL : BULBA_BL) : (up ? BULBA_TR : BULBA_BR))].dat, xa, ya); // draw text for(i = 0; i < lines; i ++) { textout(bmp, d[THE_FONT].dat, rows[i], x1 + 4, y1 + 5 + i * 9, 1); } } // waits for x millis or ESC void esc_rest(int millis) { int clicks = millis / 20; int count = 0; while(count < clicks && !key[KEY_ESC]) { cycle_count = 0; poll_music(); count ++; while(!cycle_count); yield_timeslice(); } if (key[KEY_ESC]) script_done = -1; } // object handling Tscript_object *get_object(char *name) { Tscript_object *o = objects; while(o != NULL) { if (!stricmp(name, o->name)) return o; o = (Tscript_object *)o->next; } return o; } Tscript_object *get_prev_object(char *name) { Tscript_object *o = objects; Tscript_object *prev = NULL; while(o != NULL) { if (!stricmp(name, o->name)) return prev; prev = o; o = (Tscript_object *)o->next; } return NULL; } int set_object(char *name, int x, int y, int dir) { Tscript_object *o; int new_object = 0; // search for object o = get_object(name); // create new if not found if (o == NULL) { o = malloc(sizeof(Tscript_object)); if (o == NULL) return 0; new_object = 1; o->x = 0; o->y = 0; o->line = 0; o->frames = 0; } // set parameters o->x = (x == NO_CHANGE ? o->x : x); o->y = (y == NO_CHANGE ? o->y : y); o->dir = (dir == NO_CHANGE ? o->dir : dir);; o->vx = o->vy = 0; strcpy(o->name, name); // set bitmap if (!stricmp(name, "helicopter")) { o->bmp[0] = data[CHOPPER1].dat; o->bmp[1] = data[CHOPPER2].dat; o->bmp[2] = data[CHOPPER3].dat; o->bmp[3] = data[CHOPPER4].dat; o->frames = 4; } else if (!stricmp(name, "cage1")) o->bmp[0] = data[CAGE_SML1].dat; else if (!stricmp(name, "cage2")) o->bmp[0] = data[CAGE_BIG].dat; else if (!stricmp(name, "cage3")) o->bmp[0] = data[CAGE_SML2].dat; else if (!stricmp(name, "chain")) o->bmp[0] = data[CHAIN].dat; else if (!stricmp(name, "lola")) o->bmp[0] = data[LOLA].dat; else if (!stricmp(name, "alex")) o->bmp[0] = data[ALEX].dat; else if (!stricmp(name, "ufo")) o->bmp[0] = data[UFO_BIG].dat; else if (!stricmp(name, "ufo0")) o->bmp[0] = data[UFO0].dat; else if (!stricmp(name, "ufo1")) o->bmp[0] = data[UFO1].dat; else if (!stricmp(name, "beam")) o->bmp[0] = data[UFOBEAM].dat; else if (!stricmp(name, "ship0")) o->bmp[0] = data[SHIP0].dat; else if (!stricmp(name, "ship1")) o->bmp[0] = data[SHIP1].dat; else if (!stricmp(name, "ball")) o->bmp[0] = data[HERO_BALL].dat; else if (!strncmp(name, "drumcan", 7)) o->bmp[0] = data[DRUMCAN].dat; else o->bmp[0] = NULL; // rearrange pointers if (new_object) { o->next = (struct Tscript_object *)objects; objects = o; } return 1; } int set_line(char *name, Tscript_object *src, int sx, int sy, Tscript_object *dst, int dx, int dy) { Tscript_object *o; int new_object = 0; // search for object o = get_object(name); // create new if not found if (o == NULL) { o = malloc(sizeof(Tscript_object)); if (o == NULL) return 0; new_object = 1; o->line = 1; } // set parameters o->x = sx; o->y = sy; o->vx = dx; o->vy = dy; strcpy(o->name, name); // set bitmap o->bmp[0] = o->bmp[1] = o->bmp[2] = o->bmp[3] = NULL; // set line end point refs o->line_from = (struct Tscript_object *)src; o->line_to = (struct Tscript_object *)dst; // rearrange pointers if (new_object) { o->next = (struct Tscript_object *)objects; objects = o; } return 1; } int move_object(char *name, int vx, int vy) { Tscript_object *o; // search for object o = get_object(name); // exit if not found if (o == NULL) return 0; // set parameters o->vx = vx; o->vy = vy; return 1; } void delete_object(char *name) { Tscript_object *actual; Tscript_object *prev; actual = get_object(name); prev = get_prev_object(name); if (actual == NULL) return; if (prev == NULL) objects = (Tscript_object *)actual->next; else prev->next = actual->next; free(actual); } void delete_all_objects() { Tscript_object *o = objects; while(o != NULL) { o = (Tscript_object *)objects->next; free(objects); objects = o; } objects = NULL; } // end object handling // script commands // used by the script interpretor to launch various events void cmd_showbmp(char *name) { if (!stricmp(name, "buffer")) { blit(buffer, swap_buffer, 0, 0, 0, 0, 160, 120); } else if (!stricmp(name, "treetops")) { blit(data[INTRO_BG].dat, swap_buffer, 0, 0, 0, 0, 160, 120); } else if (!stricmp(name, "darkness")) { clear_to_color(swap_buffer, 2); } } void cmd_savebmp() { blit(swap_buffer, buffer, 0, 0, 0, 0, 160, 120); } void cmd_loadmap(char *fname) { new_game(0); new_level(fname, -2, 0); } void cmd_drawmap() { draw_frame(swap_buffer, 0); } void cmd_fadein() { fade_in_pal(100); } void cmd_fadeout() { fade_out_pal(100); } void cmd_speak(Ttoken *t, int arrow) { int sx, sy; int up = 0, left = 1; int lines; char *rows[8]; int i; sx = atoi(t->word); t = (Ttoken *)t->next; sy = atoi(t->word); t = (Ttoken *)t->next; if (!stricmp(t->word, "right")) left = 0; else if (!stricmp(t->word, "up")) up = 1; else if (!stricmp(t->word, "upright")) { up = 0; left = 0; } else if (!stricmp(t->word, "rightup")) { up = 0; left = 0; } t = (Ttoken *)t->next; lines = MIN(atoi(t->word), 8); t = (Ttoken *)t->next; for(i = 0; i < lines; i ++) { rows[i] = t->word; t = (Ttoken *)t->next; } draw_speak_bulb(swap_buffer, data, sx, sy, up, left, lines, rows, arrow); } int remember_sound(int id) { int i = 0; while(active_sounds[i] != -1 && i < MAX_SCRIPT_SOUNDS) i ++; if (i == MAX_SCRIPT_SOUNDS) return 0; active_sounds[i] = id; return 1; } void forget_sound(int id) { int i; for(i = 0; i < MAX_SCRIPT_SOUNDS; i ++) { if (active_sounds[i] == id) { active_sounds[i] = -1; return; } } } void cmd_play_sample(Ttoken *t) { int vol = 100; int loop = 0; int freq = 1000; int id; if (t != NULL) { Ttoken *tmp = (Ttoken *)t->next; if (tmp != NULL) { vol = atoi(tmp->word); tmp = (Ttoken *)tmp->next; if (tmp != NULL) { freq = atoi(tmp->word); tmp = (Ttoken *)tmp->next; if (tmp != NULL) { loop = atoi(tmp->word); tmp = (Ttoken *)tmp->next; } } } id = atoi(t->word); if (remember_sound(id)) play_sound_id_ex(id, vol, freq, loop); else log2file("*** cannot play sample %d, buffer full", id); } } void cmd_stop_sample(Ttoken *t) { if (t != NULL) { int id = atoi(t->word); stop_sound_id(id); forget_sound(id); } } void cmd_blit() { blit_to_screen(swap_buffer); } void cmd_wait(int msec) { esc_rest(msec); } void cmd_end() { script_done = 1; } void cmd_set(Ttoken *t) { char *name; int x; int y; int dir = NO_CHANGE; name = t->word; t = (Ttoken *)t->next; if (!strncmp(name, "line", 4)) { // special handling of lines Tscript_object *s, *d; int sx, sy, dx, dy; if (t == NULL) return; s = get_object(t->word); if (s == NULL) return; t = (Ttoken *)t->next; if (t == NULL) return; sx = atoi(t->word); t = (Ttoken *)t->next; if (t == NULL) return; sy = atoi(t->word); t = (Ttoken *)t->next; if (t == NULL) return; d = get_object(t->word); if (d == NULL) return; t = (Ttoken *)t->next; if (t == NULL) return; dx = atoi(t->word); t = (Ttoken *)t->next; if (t == NULL) return; dy = atoi(t->word); set_line(name, s, sx, sy, d, dx, dy); } else { if (t->word[0] == '*') x = NO_CHANGE; else x = atoi(t->word); t = (Ttoken *)t->next; if (t->word[0] == '*') y = NO_CHANGE; else y = atoi(t->word); t = (Ttoken *)t->next; if (t != NULL) { if (!stricmp(t->word, "right")) dir = 1; else if (!stricmp(t->word, "rotate")) dir = 2; else dir = 0; } set_object(name, x, y, dir); } } void cmd_move(Ttoken *t) { char *name; int vx; int vy; name = t->word; t = (Ttoken *)t->next; vx = atoi(t->word); t = (Ttoken *)t->next; vy = atoi(t->word); move_object(name, vx, vy); } void cmd_del(Ttoken *t) { delete_object(t->word); } void cmd_run(Ttoken *t) { Tscript_object *o; int loops; static int i = 0; loops = atoi(t->word); cycle_count = 0; while(loops && !script_done) { while(cycle_count > 0 && loops && !script_done) { logic_count ++; poll_music(); // update objects o = objects; while(o != NULL) { if (!o->line) { o->x += o->vx; o->y += o->vy; } o = (Tscript_object *) o->next; } if (key[KEY_ESC]) script_done = -1; i ++; loops --; cycle_count --; } // let other processes play yield_timeslice(); // blit buffer to swap buffer blit(buffer, swap_buffer, 0, 0, 0, 0, 160, 120); // draw objects o = objects; while(o != NULL) { if (o->bmp[0] != NULL) { int frame = (o->frames ? logic_count % o->frames : 0); if (o->dir == 1) draw_sprite_h_flip(swap_buffer, o->bmp[frame], o->x, o->y); else if (o->dir == 0) draw_sprite(swap_buffer, o->bmp[frame], o->x, o->y); else // rotate rotate_sprite(swap_buffer, o->bmp[frame], o->x, o->y, itofix(-8*i)); } else if (o->line) { line(swap_buffer, ((Tscript_object *)o->line_from)->x + o->x, ((Tscript_object *)o->line_from)->y + o->y, ((Tscript_object *)o->line_to)->x + o->vx, ((Tscript_object *)o->line_to)->y + o->vy, 1); } o = (Tscript_object *) o->next; } // blit to screen blit_to_screen(swap_buffer); } } // end commands // helper to get a line from a string char *get_line(char *dst, char *src) { int go = 1; while(go) { if (*src == '\n' || *src == '\r' || *src == '\0' ) go = 0; *dst = *src; dst ++; src ++; } *dst = '\0'; return src; } // runs a script // returns -1 is esc was pressed, 0 o/w int run_script(char *script, DATAFILE *d) { char buf[512]; Ttoken *token; int i; // set datafile data = d; clear_keybuf(); // init sound memory for(i = 0; i < MAX_SCRIPT_SOUNDS; i ++) active_sounds[i] = -1; // create gfx buffers swap_buffer = create_bitmap(160, 120); buffer = create_bitmap(160, 120); script_done = FALSE; while(!script_done) { // get commands from script string script = get_line(buf, script); if (buf[0] != '#' && buf[0] != '\n' && buf[0] != '\r' && buf[0] != '-') { token = tokenize(buf); if (token != NULL) { if (!stricmp(token->word, "load_map")) cmd_loadmap(get_next_word(token)); else if (!stricmp(token->word, "draw_map")) cmd_drawmap(); else if (!stricmp(token->word, "set")) cmd_set((Ttoken *)token->next); else if (!stricmp(token->word, "move")) cmd_move((Ttoken *)token->next); else if (!stricmp(token->word, "delete")) cmd_del((Ttoken *)token->next); else if (!stricmp(token->word, "run")) cmd_run((Ttoken *)token->next); else if (!stricmp(token->word, "speak")) cmd_speak((Ttoken *)token->next, 1); else if (!stricmp(token->word, "text")) cmd_speak((Ttoken *)token->next, 0); else if (!stricmp(token->word, "save_buffer")) cmd_savebmp(); else if (!stricmp(token->word, "show_bmp")) cmd_showbmp(get_next_word(token)); else if (!stricmp(token->word, "blit")) cmd_blit(); else if (!stricmp(token->word, "fade_in")) cmd_fadein(); else if (!stricmp(token->word, "fade_out")) cmd_fadeout(); else if (!stricmp(token->word, "wait")) cmd_wait(atoi(get_next_word(token))); else if (!stricmp(token->word, "play_sample")) cmd_play_sample((Ttoken *)token->next); else if (!stricmp(token->word, "stop_sample")) cmd_stop_sample((Ttoken *)token->next); else if (!stricmp(token->word, "end_script")) cmd_end(); else { char msg[256]; sprintf(msg, "unknown: %s", token->word); msg_box(msg); } flush_tokens(token); } } } // destroy buffers delete_all_objects(); destroy_bitmap(buffer); destroy_bitmap(swap_buffer); // stop old sounds for(i = 0; i < MAX_SCRIPT_SOUNDS; i ++) { if (active_sounds[i] != -1) { stop_sound_id(active_sounds[i]); forget_sound(active_sounds[i]); } } return (script_done == -1 ? -1 : 0); } alex4src/src/script.h0000666000175000017500000000353507710456700015247 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #ifndef _SCRIPT_H_ #define _SCRIPT_H_ #include "allegro.h" // struct holding script data typedef struct { char name[16]; int x, y, vx, vy; // position and velocity BITMAP *bmp[4]; int frames; int dir; int line; struct Tscript_object *line_from; struct Tscript_object *line_to; struct Tscript_object *next; } Tscript_object; // max number of sounds played by the script #define MAX_SCRIPT_SOUNDS 16 // array holding the sounds ids int active_sounds[MAX_SCRIPT_SOUNDS]; // functions int run_script(char *script, DATAFILE *d); void draw_speak_bulb(BITMAP *bmp, DATAFILE *d, int src_x, int src_y, int up, int left, int lines, char **rows, int arrow); #endifalex4src/src/scroller.c0000666000175000017500000000672707710456700015571 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #include #include #include "allegro.h" #include "scroller.h" // initiates a scroller // the input text (t) will be messed up if horiz = 0 (vertical scroller) void init_scroller(Tscroller *sc, FONT *f, char *t, int w, int h, int horiz) { sc->fnt = f; sc->font_height = text_height(sc->fnt); sc->height = h; sc->horizontal = horiz; sc->text = t; sc->width = w; if (sc->horizontal) { sc->length = text_length(sc->fnt, sc->text); sc->offset = sc->width; } else { int i; int len = strlen(sc->text); sc->lines[0] = sc->text; sc->rows = 1; for(i=0;itext[i] == '\n' && sc->rows < MAX_LINES_IN_SCROLLER) { sc->lines[sc->rows] = &sc->text[i+1]; sc->rows ++; sc->text[i] = '\0'; } sc->offset = sc->height; } } // draws the scroller void draw_scroller(Tscroller *sc, BITMAP *bmp, int x, int y) { if (sc->horizontal) { if (sc->offset < -sc->length) return; if (sc->offset > sc->width) return; set_clip(bmp, x, y, x + sc->width, y + sc->height); textout(bmp, sc->fnt, sc->text, x + sc->offset + 1, y + 1, 1); textout(bmp, sc->fnt, sc->text, x + sc->offset, y, 3); set_clip(bmp, 0, 0, bmp->w-1, bmp->h-1); } else { int i; if (sc->offset < -sc->rows * sc->font_height) return; if (sc->offset > sc->height) return; set_clip(bmp, x, y, x + sc->width, y + sc->height); for(i=0;irows;i++) { if (i * sc->font_height + sc->offset <= sc->height) if ((i+1) * sc->font_height + sc->offset >= 0) textout_centre(bmp, sc->fnt, sc->lines[i], x+(sc->width>>1) , i * sc->font_height + y + sc->offset, -1); } set_clip(bmp, 0, 0, bmp->w-1, bmp->h-1); } } // scrolls the text #step steps void scroll_scroller(Tscroller *sc, int step) { sc->offset += step; } // returns TRUE if the scroller is visible in it's windows int scroller_is_visible(Tscroller *sc) { if (sc->horizontal) { if (sc->offset < -sc->length) return FALSE; if (sc->offset > sc->width) return FALSE; } else { if (sc->offset < -sc->rows * sc->font_height) return FALSE; if (sc->offset > sc->height) return FALSE; } return TRUE; } // restarts the offset void restart_scroller(Tscroller *sc){ if (sc->horizontal) sc->offset = sc->width; else sc->offset = sc->height; } alex4src/src/scroller.h0000666000175000017500000000371707710456700015572 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #ifndef _SCROLLER_H_ #define _SCROLLER_H_ #include "allegro.h" // maximum lines in a vertical scroller #define MAX_LINES_IN_SCROLLER 512 // used for vert-scrolling // struct for scroller typedef struct { int horizontal; // TRUE if the scroller is horiz. FALSE o/w char *text; // ptr to actual text FONT *fnt; // ptr to font to use int font_height; int width, height; // size of window int offset; int rows; int length; char *lines[MAX_LINES_IN_SCROLLER]; } Tscroller; // functions void init_scroller(Tscroller *sc, FONT *f, char *t, int w, int h, int horiz); void draw_scroller(Tscroller *sc, BITMAP *bmp, int x, int y); void scroll_scroller(Tscroller *sc, int step); int scroller_is_visible(Tscroller *sc); void restart_scroller(Tscroller *sc); #endifalex4src/src/shooter.c0000666000175000017500000013055507710456700015424 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #include #include #include #include "main.h" #include "hisc.h" #include "timer.h" #include "shooter.h" #include "../data/a45.h" // data file DATAFILE *s_data = NULL; // buffer BITMAP *s_buffer = NULL; // explosions frames BITMAP *s_expl_frame[32] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // objects Tspace_object s_player; Tspace_object s_powerup[32]; Tspace_object s_enemy[32]; Tspace_object s_p_bullet[32]; Tspace_object s_e_bullet[32]; Tspace_object s_explosion[32]; Tspace_object s_sign; // music int s_got_sound = 0; static AL_DUH_PLAYER *s_dp = NULL; static DUH_SIGRENDERER *s_sr = NULL; static DUH *s_duh = NULL; float s_music_vol = 1.0; int s_fade_music = 0; // color map for blending explosions COLOR_MAP s_blend_map; // shooter data Tshooter_data s_var; // stars Tspace_star s_star[64]; // the level Tshooter_event s_level[] = { // when enemy movement num x y vx vy d1 d2 { 1, ENEMY03, SM_SIN_WAVE, 5, 160, 20, -0.5, 10, 2, 24 }, { 4, ENEMY03, SM_COS_WAVE, 5, 160, 75, -0.5, 10, 2, 24 }, { 6, ENEMY02, SM_STRAIGHT, 1, 160, 10, -0.5, 0, 0, 0 }, { 7, ENEMY01, SM_STRAIGHT, 1, 160, 75, -0.5, 0, 0, 0 }, { 8, ENEMY02, SM_STRAIGHT, 1, 160, 40, -0.5, 0, 0, 0 }, { 12, ENEMY03, SM_SIN_WAVE, 6, 160, 40, -0.8, 10, 4, 20 }, { 14, ENEMY07, SM_STRAIGHT, 1, 160, 40, -0.5, 0, 0, 0 }, { 16, ENEMY02, SM_STRAIGHT, 1, 160, 86, -0.5, 0, 0, 0 }, { 16, ENEMY05, SM_STRAIGHT, 1, 202, 92, -0.5, 0, 0, 0 }, { 17, ENEMY06, SM_STRAIGHT, 1, 180, 0, -0.5, 0, 0, 0 }, { 19, ENEMY03, SM_SIN_WAVE, 4, 160, 20, -0.5, 10, 2, 24 }, { 19, ENEMY03, SM_SIN_WAVE, 4, 160, 75, -0.5, 10, 2, 24 }, { 21, ENEMY05, SM_STRAIGHT, 1, 160, 92, -0.5, 0, 0, 0 }, { 22, ENEMY07, SM_GO_DELAY, 1, 160, 80, -1, 0, 100, 100 }, { 24, ENEMY03, SM_SIN_WAVE, 6, 160, 40, -0.5, 25, 4, 20 }, { 27, ENEMY01, SM_STRAIGHT, 1, 160, 10, -0.5, 0, 0, 0 }, { 28, ENEMY02, SM_STRAIGHT, 1, 160, 75, -0.5, 0, 0, 0 }, { 29, ENEMY01, SM_STRAIGHT, 1, 160, 40, -0.5, 0, 0, 0 }, { 30, ENEMY02, SM_STRAIGHT, 1, 160, 70, -0.5, 0, 0, 0 }, { 31, ENEMY02, SM_STRAIGHT, 1, 160, 5, -0.5, 0, 0, 0 }, { 32, ENEMY01, SM_STRAIGHT, 1, 160, 45, -0.5, 0, 0, 0 }, { 33, ENEMY02, SM_STRAIGHT, 1, 200, 75, -0.5, 0, 0, 0 }, { 36, ENEMY03, SM_SIN_WAVE, 8, 160, 50, -0.5, 40, 1, 32 }, { 36, ENEMY03, SM_SIN_WAVE, 8, 176, 50, -0.5, -40, 1, 32 }, { 45, ENEMY06, SM_STRAIGHT, 1, 160, 0, -0.5, 0, 0, 0 }, { 45, ENEMY05, SM_STRAIGHT, 1, 160, 92, -0.5, 0, 0, 0 }, { 47, ENEMY03, SM_SIN_WAVE, 8, 160, 50, -0.5, -40, 1, 32 }, { 55, ENEMY06, SM_STRAIGHT, 1, 160, 0, -0.5, 0, 0, 0 }, { 55, ENEMY05, SM_STRAIGHT, 1, 160, 92, -0.5, 0, 0, 0 }, { 56, ENEMY06, SM_STRAIGHT, 1, 160, 0, -0.5, 0, 0, 0 }, { 56, ENEMY05, SM_STRAIGHT, 1, 160, 92, -0.5, 0, 0, 0 }, { 57, ENEMY06, SM_STRAIGHT, 1, 160, 0, -0.5, 0, 0, 0 }, { 57, ENEMY05, SM_STRAIGHT, 1, 160, 92, -0.5, 0, 0, 0 }, { 62, ENEMY07, SM_GO_DELAY, 1, 160, 40, -1, 0, 60, 100 }, { 63, ENEMY07, SM_GO_DELAY, 1, 160, 60, -1, 0, 100, 100 }, { 64, ENEMY07, SM_GO_DELAY, 1, 160, 20, -1, 0, 80, 100 }, { 66, ENEMY14, SM_SIN_WAVE, 1, 160, 40, -0.5, 10, 4, 0 }, { 68, ENEMY01, SM_STRAIGHT, 1, 160, 50, -0.5, 0, 0, 0 }, { 69, ENEMY02, SM_STRAIGHT, 1, 160, 10, -0.5, 0, 0, 0 }, { 70, ENEMY01, SM_STRAIGHT, 1, 160, 80, -0.5, 0, 0, 0 }, { 70, ENEMY06, SM_STRAIGHT, 1, 160, 0, -0.5, 0, 0, 0 }, { 71, ENEMY02, SM_STRAIGHT, 1, 160, 60, -0.5, 0, 0, 0 }, { 72, ENEMY02, SM_STRAIGHT, 1, 160, -5, -0.5, 0, 0, 0 }, { 73, ENEMY01, SM_STRAIGHT, 1, 190, 50, -0.5, 0, 0, 0 }, { 73, ENEMY05, SM_STRAIGHT, 1, 160, 92, -0.5, 0, 0, 0 }, { 77, ENEMY03, SM_SIN_WAVE, 8, 160, 50, -0.5, 30, 2, 32 }, { 77, ENEMY03, SM_SIN_WAVE, 8, 176, 50, -0.5, -30, 2, 32 }, { 84, ENEMY09, SM_STRAIGHT, 1, 60, 150, 0, -1, 0, 0 }, { 84, ENEMY09, SM_STRAIGHT, 1, 80, 140, 0, -0.5, 0, 0 }, { 84, ENEMY09, SM_STRAIGHT, 1, 100, 170, 0, -1, 0, 0 }, { 84, ENEMY09, SM_STRAIGHT, 1, 120, 130, 0, -1, 0, 0 }, { 84, ENEMY09, SM_STRAIGHT, 1, 70, 120, 0, -1, 0, 0 }, { 84, ENEMY09, SM_STRAIGHT, 1, 110, 160, 0, -1, 0, 0 }, { 85, ENEMY09, SM_STRAIGHT, 1, 65, 150, 0, -0.5, 0, 0 }, { 85, ENEMY09, SM_STRAIGHT, 1, 85, 170, 0, -1, 0, 0 }, { 85, ENEMY09, SM_STRAIGHT, 1, 105, 140, 0, -1, 0, 0 }, { 85, ENEMY09, SM_STRAIGHT, 1, 125, 120, 0, -1, 0, 0 }, { 85, ENEMY09, SM_STRAIGHT, 1, 20, 160, 0, -0.5, 0, 0 }, { 86, ENEMY09, SM_STRAIGHT, 1, 75, 130, 0, -1, 0, 0 }, { 86, ENEMY09, SM_STRAIGHT, 1, 115, 160, 0, -1, 0, 0 }, { 88, ENEMY07, SM_GO_DELAY, 1, 160, 40, -1, 0, 60, 100 }, { 89, ENEMY07, SM_GO_DELAY, 1, 160, 60, -1, 0, 100, 100 }, { 90, ENEMY07, SM_GO_DELAY, 1, 160, 20, -1, 0, 80, 100 }, { 92, ENEMY07, SM_GO_DELAY, 1, 160, 20, -1, 0, 60, 100 }, { 93, ENEMY07, SM_GO_DELAY, 1, 160, 60, -1, 0, 100, 100 }, { 94, ENEMY07, SM_GO_DELAY, 1, 160, 40, -1, 0, 80, 100 }, { 95, ENEMY07, SM_GO_DELAY, 1, 160, 55, -1, 0, 65, 100 }, { 96, ENEMY07, SM_GO_DELAY, 1, 160, 45, -1, 0, 100, 100 }, { 97, ENEMY07, SM_GO_DELAY, 1, 160, 25, -1, 0, 80, 100 }, { 98, ENEMY07, SM_GO_DELAY, 1, 160, 50, -1, 0, 55, 100 }, { 99, ENEMY07, SM_GO_DELAY, 1, 160, 15, -1, 0, 110, 100 }, { 100, ENEMY07, SM_GO_DELAY, 1, 160, 70, -1, 0, 80, 100 }, { 101, ENEMY04, SM_GO_DELAY, 1, 160, 20, -1, 0, 100, 150 }, { 105, ENEMY12, SM_STRAIGHT, 1, 160, -53, -0.5, 0, 0, 0 }, { 105, ENEMY11, SM_STRAIGHT, 1, 160, 73, -0.5, 0, 0, 0 }, { 105, ENEMY07, SM_GO_DELAY, 1, 200, 45, -1, 0, 80, 100 }, { 107, ENEMY12, SM_STRAIGHT, 1, 162, -20, -0.5, 0, 0, 0 }, { 109, ENEMY11, SM_STRAIGHT, 1, 170, 30, -0.5, 0, 0, 0 }, { 111, ENEMY12, SM_STRAIGHT, 1, 162, -25, -0.5, 0, 0, 0 }, { 111, ENEMY14, SM_STRAIGHT, 1, 160, 80, -0.5, 0, 0, 0 }, { 113, ENEMY11, SM_STRAIGHT, 1, 160, 35, -0.5, 0, 0, 0 }, { 115, ENEMY12, SM_STRAIGHT, 1, 170, -15, -0.5, 0, 0, 0 }, { 117, ENEMY11, SM_STRAIGHT, 1, 162, 25, -0.5, 0, 0, 0 }, { 117, ENEMY14, SM_STRAIGHT, 1, 160, 8, -0.5, 0, 0, 0 }, { 119, ENEMY12, SM_SIN_WAVE, 1, 160, -60, -0.5, 20, 2, 0 }, { 119, ENEMY11, SM_SIN_WAVE, 1, 160, 80, -0.5, 20, 2, 0 }, { 121, ENEMY12, SM_SIN_WAVE, 1, 160, -40, -0.5, 20, 1, 0 }, { 121, ENEMY11, SM_SIN_WAVE, 1, 160, 100, -0.5, 20, 1, 0 }, { 123, ENEMY12, SM_SIN_WAVE, 1, 160, -80, -0.5, 15, 2, 0 }, { 123, ENEMY11, SM_SIN_WAVE, 1, 160, 60, -0.5, 15, 2, 0 }, { 125, ENEMY12, SM_STRAIGHT, 1, 160, -53, -0.5, 0, 0, 0 }, { 125, ENEMY11, SM_STRAIGHT, 1, 160, 73, -0.5, 0, 0, 0 }, { 128, ENEMY13, SM_SIN_WAVE, 5, 160, 20, -0.8, 10, 2, 32 }, { 129, ENEMY13, SM_COS_WAVE, 5, 160, 75, -0.5, 10, 2, 32 }, { 131, ENEMY07, SM_GO_DELAY, 1, 200, 45, -1, 0, 80, 100 }, { 133, ENEMY13, SM_COS_WAVE, 5, 160, 75, -0.5, 5, 3, 32 }, { 135, ENEMY13, SM_SIN_WAVE, 5, 160, 20, -0.8, 15, 1, 32 }, { 139, ENEMY08, SM_SIN_WAVE, 1, 160, 20, -0.5, 5, 1, 0 }, { 140, ENEMY08, SM_COS_WAVE, 1, 190, 60, -0.5, 4, 3, 0 }, { 140, ENEMY08, SM_SIN_WAVE, 1, 160, 40, -0.5, 6, 2, 0 }, { 142, ENEMY08, SM_COS_WAVE, 1, 160, 80, -0.5, 3, 4, 0 }, { 143, ENEMY08, SM_COS_WAVE, 1, 160, 70, -0.5, 5, 1, 0 }, { 143, ENEMY08, SM_COS_WAVE, 1, 190, 20, -0.5, 2, 4, 0 }, { 144, ENEMY08, SM_COS_WAVE, 1, 160, 60, -0.5, 3, 3, 0 }, { 144, ENEMY08, SM_SIN_WAVE, 1, 190, 30, -0.5, 4, 2, 0 }, { 146, ENEMY03, SM_SIN_WAVE, 4, 160, 20, -0.5, 10, 2, 24 }, { 146, ENEMY03, SM_SIN_WAVE, 4, 160, 75, -0.5, 10, 2, 24 }, { 149, ENEMY08, SM_SIN_WAVE, 1, 160, 60, -0.5, 5, 1, 0 }, { 150, ENEMY08, SM_COS_WAVE, 1, 190, 20, -0.5, 4, 3, 0 }, { 150, ENEMY08, SM_SIN_WAVE, 1, 160, 80, -0.5, 6, 2, 0 }, { 152, ENEMY08, SM_COS_WAVE, 1, 160, 40, -0.5, 3, 4, 0 }, { 153, ENEMY08, SM_COS_WAVE, 1, 160, 20, -0.5, 5, 1, 0 }, { 153, ENEMY08, SM_COS_WAVE, 1, 190, 70, -0.5, 2, 4, 0 }, { 154, ENEMY08, SM_COS_WAVE, 1, 160, 30, -0.5, 3, 3, 0 }, { 154, ENEMY08, SM_SIN_WAVE, 1, 190, 60, -0.5, 4, 2, 0 }, { 156, ENEMY12, SM_SIN_WAVE, 1, 160, -50, -0.5, 12, 2, 0 }, { 156, ENEMY11, SM_SIN_WAVE, 1, 160, 70, -0.5, -12, 2, 0 }, { 157, ENEMY12, SM_SIN_WAVE, 1, 190, -40, -0.5, 12, 2, 0 }, { 157, ENEMY11, SM_SIN_WAVE, 1, 190, 80, -0.5, -12, 2, 0 }, { 158, ENEMY12, SM_SIN_WAVE, 1, 210, -60, -0.5, 12, 3, 0 }, { 158, ENEMY11, SM_SIN_WAVE, 1, 210, 60, -0.5, -12, 3, 0 }, { 159, ENEMY12, SM_SIN_WAVE, 10, 190, -60, -0.5, 20, 0, 24 }, { 159, ENEMY11, SM_SIN_WAVE, 10, 190, 80, -0.5, 20, 0, 24 }, { 165, ENEMY12, SM_SIN_WAVE, 1, 210, -40, -0.5, 12, 3, 0 }, { 165, ENEMY11, SM_SIN_WAVE, 1, 210, 80, -0.5, -12, 3, 0 }, { 170, ENEMY09, SM_STRAIGHT, 1, 60, 150, 0, -1, 0, 0 }, { 170, ENEMY09, SM_STRAIGHT, 1, 80, 140, 0, -0.5, 0, 0 }, { 170, ENEMY09, SM_STRAIGHT, 1, 100, 170, 0, -1, 0, 0 }, { 171, ENEMY09, SM_STRAIGHT, 1, 120, 130, 0, -1, 0, 0 }, { 171, ENEMY09, SM_STRAIGHT, 1, 70, 120, 0, -1, 0, 0 }, { 171, ENEMY09, SM_STRAIGHT, 1, 110, 160, 0, -1, 0, 0 }, { 172, ENEMY09, SM_STRAIGHT, 1, 65, 150, 0, -0.5, 0, 0 }, { 172, ENEMY09, SM_STRAIGHT, 1, 85, 170, 0, -1, 0, 0 }, { 173, ENEMY09, SM_STRAIGHT, 1, 105, 140, 0, -1, 0, 0 }, { 173, ENEMY09, SM_STRAIGHT, 1, 125, 120, 0, -1, 0, 0 }, { 173, ENEMY09, SM_STRAIGHT, 1, 20, 160, 0, -0.5, 0, 0 }, { 174, ENEMY09, SM_STRAIGHT, 1, 75, 130, 0, -1, 0, 0 }, { 174, ENEMY09, SM_STRAIGHT, 1, 115, 160, 0, -1, 0, 0 }, { 176, ENEMY07, SM_GO_DELAY, 1, 160, 45, -1, 0, 100, 100 }, { 177, ENEMY07, SM_GO_DELAY, 1, 160, 25, -1, 0, 80, 100 }, { 178, ENEMY07, SM_GO_DELAY, 1, 160, 50, -1, 0, 55, 100 }, { 179, ENEMY07, SM_GO_DELAY, 1, 160, 15, -1, 0, 110, 100 }, { 180, ENEMY07, SM_GO_DELAY, 1, 160, 70, -1, 0, 80, 100 }, { 181, ENEMY07, SM_GO_DELAY, 1, 160, 20, -1, 0, 100, 80 }, { 182, ENEMY04, SM_GO_DELAY, 1, 160, 25, -1, 0, 130, 150 }, // boss 1 { 188, ENEMY15, SM_BOSS_1 , 1, 160, 42, -0.5, 20, 90, 0 }, { 188, ENEMY16, SM_BOSS_1 , 1, 173, 20, -0.5, 20, 103, 0 }, // restart { 189, -1, 0, 0, 0, 0, 0, 0, 0, 0 }, {9999, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; // PIXEL PERFECT COLLISION ROUTINES COURTESY OF IVAN BALDO'S PPCOL #define pp_check_bb_collision_general(x1,y1,w1,h1,x2,y2,w2,h2) (!( ((x1)>=(x2)+(w2)) || ((x2)>=(x1)+(w1)) || \ ((y1)>=(y2)+(h2)) || ((y2)>=(y1)+(h1)) )) #define pp_check_bb_collision(mask1,mask2,x1,y1,x2,y2) pp_check_bb_collision_general(x1,y1,mask1->w,mask1->h,x2,y2,mask2->w,mask2->h) int s_check_pp_collision(BITMAP *spr1, BITMAP *spr2, int x1, int y1, int x2, int y2) { int dx1, dx2, dy1, dy2; //We will use this deltas... int fx,fy,sx1,sx2; //Also we will use this starting/final position variables... int maxw, maxh; //And also this variables saying what is the maximum width and height... int depth; //This will store the color depth value... char CHARVAR; //We will use these to store the transparent color for the sprites... if( !pp_check_bb_collision(spr1, spr2, x1,y1, x2,y2) ) return 0; //If theres not a bounding box collision, it is impossible to have a pixel perfect collision right? So, we return that theres not collision... //First we need to see how much we have to shift the coordinates of the sprites... if(x1>x2) { dx1=0; //don't need to shift sprite 1. dx2=x1-x2; //shift sprite 2 left. Why left? Because we have the sprite 1 being on the right of the sprite 2, so we have to move sprite 2 to the left to do the proper pixel perfect collision... } else { dx1=x2-x1; //shift sprite 1 left. dx2=0; //don't need to shift sprite 2. } if(y1>y2) { dy1=0; dy2=y1-y2; //we need to move this many rows up sprite 2. Why up? Because we have sprite 1 being down of sprite 2, so we have to move sprite 2 up to do the proper pixel perfect collision detection... } else { dy1=y2-y1; //we need to move this many rows up sprite 1. dy2=0; } //Then, we have to see how far we have to go, we do this seeing the minimum height and width between the 2 sprites depending in their positions: if(spr1->w-dx1 > spr2->w-dx2) { maxw=spr2->w-dx2; } else { maxw=spr1->w-dx1; } if(spr1->h-dy1 > spr2->h-dy2) { maxh=spr2->h-dy2; } else { maxh=spr1->h-dy1; } maxw--; maxh--; fy=dy1; fx=dx1; dy1+=maxh; dy2+=maxh; sx1=dx1+maxw; sx2=dx2+maxw; depth=bitmap_color_depth(spr1); //Get the bitmap depth... if(depth==8) { CHARVAR=bitmap_mask_color(spr1); //Get the transparent color of the sprites... for(; dy1>=fy; dy1--,dy2--) { //Go through lines... for(dx1=sx1,dx2=sx2; dx1>=fx; dx1--,dx2--) { //Go through the X axis... if((spr1->line[dy1][dx1]!=CHARVAR) && (spr2->line[dy2][dx2]!=CHARVAR)) return 1; //Both sprites don't have transparent color in that position, so, theres a collision and return collision detected! } } } //If we have reached here it means that theres not a collision: return 0; //Return no collision. } //////////// END PPCOL // stops any mod playing static void s_stop_music(void) { al_stop_duh(s_dp); s_dp = NULL; } // starts the mod at position x static void s_start_music(int startorder) { const int n_channels = 2; /* stereo */ s_stop_music(); { s_music_vol = (float)(get_config_int("sound", "music_volume", 255)) / 255.0; s_sr = dumb_it_start_at_order(s_duh, n_channels, startorder); s_dp = al_duh_encapsulate_sigrenderer(s_sr, s_music_vol, get_config_int("dumb", "buffer_size", 4096), get_config_int("dumb", "sound_freq", 44100)); if (!s_dp) duh_end_sigrenderer(s_sr); // howto.txt doesn't mention that this is necessary! dumb.txt does ... } } // draws any object at specified position void s_draw_object(BITMAP *bmp, Tspace_object *o) { if (o->type != SO_EXPLOSION) { if (!o->hit || o->type == SO_PLAYER_BULLET) draw_sprite(bmp, s_data[o->image].dat, (int)o->x, (int)o->y); else draw_character(bmp, s_data[o->image].dat, (int)o->x, (int)o->y, 4); } else { int c = (o->energy + 8) >> 3; if (c > 1) circle(bmp, (int)o->x + 15, (int)o->y + 15, o->image + 9, c); if (c > 2) circle(bmp, (int)o->x + 15, (int)o->y + 15, o->image + 8, c - 1); if (c > 3) circle(bmp, (int)o->x + 15, (int)o->y + 15, o->image + 7, c - 2); draw_trans_sprite(bmp, s_expl_frame[o->image], (int)o->x, (int)o->y); } } // draws the status bar void s_draw_status_bar(BITMAP *bmp, int x, int y) { int i; char score_str[32]; char padding_str[32]; int padding; // draw bar blit(s_data[STATUSBAR].dat, bmp, 0, 0, 0, 109, 160, 11); // draw lives for(i = 0; i < s_var.lives; i ++) draw_sprite(bmp, s_data[ST_LIFE].dat, x + 3 + i * 8, y + 3); // draw stars for(i = 0; i < 5; i ++) draw_sprite(bmp, s_data[(i < s_var.power_gauge ? ST_STAR_ON : ST_STAR_OFF)].dat, x + 36 + i * 8, y + 3); // draw score sprintf(score_str, "%d", s_var.show_score); padding = 11 - strlen(score_str); for(i = 0; i < padding; i ++) padding_str[i] = '0'; padding_str[i] = '\0'; strcat(padding_str, score_str); textprintf_right(bmp, s_data[SPACE_FONT].dat, x + 160, y + 2, 3, "%s", padding_str); if (s_var.score) textprintf_right(bmp, s_data[SPACE_FONT].dat, x + 160, y + 2, 4, "%s", score_str); } void s_draw_frame(BITMAP *bmp) { int i; // blit bg blit(s_data[BG1].dat, bmp, 0, 0, -(game_count % 160), 0, 160, 120); blit(s_data[BG1].dat, bmp, 0, 0, 160 - (game_count % 160), 0, 160, 120); // draw stars for(i = 0; i < 64; i ++) _putpixel(bmp, s_star[i].x, s_star[i].y, s_star[i].color); // draw powerups for(i = 0; i < 32; i ++) if (s_powerup[i].alive) s_draw_object(bmp, &s_powerup[i]); // draw enemies for(i = 0; i < 32; i ++) if (s_enemy[i].alive) s_draw_object(bmp, &s_enemy[i]); // draw player if (s_player.alive) s_draw_object(bmp, &s_player); // draw bullets for(i = 0; i < 32; i ++) if (s_p_bullet[i].alive) s_draw_object(bmp, &s_p_bullet[i]); for(i = 0; i < 32; i ++) if (s_e_bullet[i].alive) s_draw_object(bmp, &s_e_bullet[i]); // draw sign if (s_sign.alive) draw_sprite(bmp, (s_sign.d1 ? get_gameover_sign() : get_letsgo_sign()), (int)s_sign.x, (int)s_sign.y); // draw explosions color_map = &s_blend_map; drawing_mode(DRAW_MODE_TRANS, NULL, 0, 0); for(i = 0; i < 32; i ++) if (s_explosion[i].alive) s_draw_object(bmp, &s_explosion[i]); solid_mode(); // draw status bar s_draw_status_bar(bmp, 0, 109); } // creates a new random star void s_make_random_star(Tspace_star *s) { s->x = rand()%160; s->y = rand()%120; s->color = rand()%2 + 2; s->dx = (s->color == 2 ? - 2 : -3); } // inits the player void s_setup_player() { s_player.x = -30; s_player.y = 30; s_player.vx = 0; s_player.vy = 0; s_player.alive = 1; } // returns a free object from an array Tspace_object *s_get_free_object(Tspace_object *array, int max) { int i = 0; while(array[i].alive && i < max) i ++; if (i == max) return NULL; // reset some values array[i].hit = 0; array[i].fire_counter = -1; array[i].movement_type = 0; return &array[i]; } // creates an enemy bullet Tspace_object *s_make_enemy_bullet(int x, int y, double vx, double vy) { Tspace_object *bullet; bullet = s_get_free_object(s_e_bullet, 32); if (bullet != NULL) { bullet->type = SO_ENEMY_BULLET; bullet->alive = 1; bullet->vx = vx; bullet->vy = vy; bullet->image = BULLET04; bullet->flags = SF_NORMAL; bullet->energy = 1; bullet->bx = bullet->by = 2; bullet->bw = ((BITMAP *)s_data[bullet->image].dat)->w - 5; bullet->bh = ((BITMAP *)s_data[bullet->image].dat)->h - 5; bullet->x = x - bullet->bw/2; bullet->y = y - bullet->bh/2; } return bullet; } // updates an object void s_update_object(Tspace_object *o) { // first, update movement and position switch(o->movement_type) { case SM_STRAIGHT: o->x += o->vx; o->y += o->vy; break; case SM_GO_DELAY: if (o->x > o->d1 || o->d2 == 0) { o->x += o->vx; o->y += o->vy; } else { o->d2 --; } break; case SM_SIN_WAVE: o->x += o->vx; o->y = o->d2 + fixtoi(fmul(ftofix(o->vy), fsin(itofix(o->t)))); o->t += o->d1; break; case SM_COS_WAVE: o->x += o->vx; o->y = o->d2 + fixtoi(fmul(ftofix(o->vy), fcos(itofix(o->t)))); o->t += o->d1; break; case SM_BOSS_1: if (o->x > o->d1) { o->x += o->vx; o->t = 0; o->ty = o->y; o->tx = o->x; } else { o->y = o->ty + fixtoi(fmul(ftofix(o->vy), fsin(itofix(o->t)))); o->x = o->tx - fixtoi(10 * fsin(itofix(o->t >> 1))); o->t ++; } break; default: o->x += o->vx; o->y += o->vy; } // check boundaries, has the object left the screen? if (o->x > 160 && o->vx > 0) o->alive = 0; else if (o->y > 120 && o->vy > 0) o->alive = 0; else if (o->x < -40 && o->vx < 0) o->alive = 0; else if (o->y < -40 && o->vy < 0) o->alive = 0; if (o->alive == 0 && o->movement_type == SM_BOSS_1) { s_var.guardian_active --; } // is the object hit by player? if (o->hit) { o->hit = 0; if (o->type == SO_PLAYER_BULLET) { o->alive = 0; } } // is the object firing? if (o->fire_counter > 0) { o->fire_counter --; } else if (o->fire_counter == 0) { o->fire_counter = 100 + rand()%50; if (o->image == ENEMY07) { s_make_enemy_bullet((int)o->x, (int)o->y + o->bh/2 + 2, -1.8, 0); } else if (o->image == ENEMY04) { s_make_enemy_bullet((int)o->x, (int)o->y + o->bh/2, -1.5, -0.3); s_make_enemy_bullet((int)o->x, (int)o->y + o->bh/2 + 2, -1.8, 0); s_make_enemy_bullet((int)o->x, (int)o->y + o->bh/2 + 4, -1.5, 0.3); } else if (o->image == ENEMY05) { s_make_enemy_bullet((int)o->x + o->bw/2, (int)o->y, -0.5, -1.8); } else if (o->image == ENEMY06) { s_make_enemy_bullet((int)o->x + o->bw/2, (int)o->y + o->bh, -0.5, 1.8); } else if (o->image == ENEMY16) { s_make_enemy_bullet((int)o->x - 3, (int)o->y + o->bh - 16, -0.9,-0.5); s_make_enemy_bullet((int)o->x - 3, (int)o->y + o->bh - 16, -1.2, 0.0); s_make_enemy_bullet((int)o->x - 3, (int)o->y + o->bh - 16, -0.9, 0.5); } else if (o->image == ENEMY15) { int i; for(i = 0; i < 256; i += 32) s_make_enemy_bullet((int)o->x + o->bw / 2, (int)o->y + o->bh, fixtof(1 * fcos(itofix(i - 6))), fixtof(1 * fsin(itofix(i - 6)))); o->fire_counter = 200 + rand()%50; } } // update explosions if (o->type == SO_EXPLOSION) { o->image ++; o->energy --; if (o->energy <= 0) o->alive = 0; } } // creates a powerup Tspace_object *s_make_powerup(int x, int y) { Tspace_object *o; o = s_get_free_object(s_powerup, 32); if (o == NULL) return NULL; o->type = SO_POWERUP; o->alive = 1; o->vx = -0.5; o->vy = 0; o->x = x - 8; o->y = y - 8; o->image = POWERUP; // setup basic bb o->bx = o->by = 3; o->bw = ((BITMAP *)s_data[o->image].dat)->w - 7; o->bh = ((BITMAP *)s_data[o->image].dat)->h - 7; return o; } // creates an explosion Tspace_object *s_make_explosion(int x, int y) { Tspace_object *o; o = s_get_free_object(s_explosion, 32); if (o == NULL) return NULL; o->type = SO_EXPLOSION; o->alive = 1; o->vx = -0.5; o->vy = 0; o->x = x - 16; o->y = y - 16; o->image = 0; o->energy = 32; // setup basic bb o->bx = o->by = 0; o->bw = ((BITMAP *)s_data[o->image].dat)->w - 1; o->bh = ((BITMAP *)s_data[o->image].dat)->h - 1; return o; } // creates an enemy Tspace_object *s_make_enemy(int type, int y) { Tspace_object *o; o = s_get_free_object(s_enemy, 32); if (o == NULL) return NULL; o->type = SO_ENEMY; o->alive = 1; o->vx = -0.5; o->vy = 0; o->x = 160; o->image = type; o->fire_counter = -1; // setup basic bb o->bx = o->by = 0; o->bw = ((BITMAP *)s_data[o->image].dat)->w - 1; o->bh = ((BITMAP *)s_data[o->image].dat)->h - 1; // set special stuff // depending on enemy type switch(type) { case ENEMY01: // small asteroid o->energy = 20; o->flags = SF_WAVE; break; case ENEMY02: // big asteroid o->energy = 30; o->flags = SF_WAVE; break; case ENEMY03: // squid o->energy = 3; o->flags = SF_NORMAL | SF_ION | SF_WAVE; break; case ENEMY04: // space thug o->energy = 16; o->flags = SF_ION | SF_WAVE; o->fire_counter = 20; o->bx += 5; o->bw -= 5; break; case ENEMY05: // up shooter o->energy = 6; o->flags = SF_NORMAL | SF_ION | SF_WAVE; o->fire_counter = 20; break; case ENEMY06: // down shooter o->energy = 6; o->flags = SF_NORMAL | SF_ION | SF_WAVE; o->fire_counter = 20; break; case ENEMY07: // single shooter o->energy = 10; o->flags = SF_NORMAL | SF_ION | SF_WAVE; o->fire_counter = 20; o->bx += 5; o->bw -= 5; break; case ENEMY08: // mine o->energy = 12; o->flags = SF_ION | SF_WAVE; o->bx += 3; o->bw -= 6; o->by += 3; o->bh -= 6; break; case ENEMY09: // up rocket (^) o->energy = 4; o->flags = SF_NORMAL | SF_ION | SF_WAVE; o->bx += 2; o->bw -= 4; o->by += 2; o->bh -= 4; break; case ENEMY10: // down rocket (v) o->energy = 4; o->flags = SF_NORMAL | SF_ION | SF_WAVE; o->bx += 2; o->bw -= 4; o->by += 2; o->bh -= 4; break; case ENEMY11: // up pillar (^) o->energy = 4; o->flags = 0; break; case ENEMY12: // down pillar (v) o->energy = 4; o->flags = 0; break; case ENEMY13: // helmet squid o->energy = 8; o->flags = SF_ION | SF_WAVE; break; case ENEMY14: // star container o->energy = 4; o->flags = SF_NORMAL | SF_ION | SF_WAVE; break; case ENEMY15: // saucer, lower part o->energy = 100; o->flags = SF_NORMAL | SF_ION | SF_WAVE; o->fire_counter = 40; break; case ENEMY16: // saucer, upper part o->energy = 80; o->flags = SF_ION | SF_WAVE; o->fire_counter = 20; break; default: break; } // set common stuff like energy etc o->energy = o->energy * s_var.difficulty; o->score = o->energy * o->energy * 1000; o->y = y; return o; } // creates a wave of an event void s_make_enemy_wave(Tshooter_event *e) { int i; Tspace_object *o; for(i = 0; i < e->num; i ++) { o = s_get_free_object(s_enemy, 32); if (o != NULL) { s_make_enemy(e->enemy_type, e->y); o->movement_type = e->movement_type; switch(o->movement_type) { case SM_STRAIGHT: o->x = e->x + i * e->d2; o->vx = e->vx; o->vy = e->vy; break; case SM_GO_DELAY: o->x = e->x + i * e->d2; o->vx = e->vx; o->vy = e->vy; o->d1 = e->d1; o->d2 = e->d2; break; case SM_SIN_WAVE: o->x = e->x + i * e->d2; o->y = e->y; o->vx = e->vx; o->vy = e->vy; o->t = 2 * i * ((BITMAP *)s_data[o->image].dat)->w; o->d2 = e->y; o->d1 = e->d1; break; case SM_COS_WAVE: o->x = e->x + i * e->d2; o->y = e->y; o->vx = e->vx; o->vy = e->vy; o->t = 2 * i * ((BITMAP *)s_data[o->image].dat)->w; o->d2 = e->y; o->d1 = e->d1; break; case SM_BOSS_1: o->x = e->x; o->vx = e->vx; o->vy = e->vy; o->d1 = e->d1; o->d2 = e->d2; s_var.guardian_active ++; break; } } } } // kills the player void s_kill_player() { s_player.alive = 0; s_make_explosion((int)s_player.x + s_player.bx + s_player.bw/2, (int)s_player.y + s_player.by + s_player.bh/2); s_var.player_wait = 100; // play sound play_sound_id_ex(SMPL_SHOOT, 100, 600, 0); //play_sound_id(SMPL_A_DIE); } // collision checking (and acting upon collision) // projectile goes in b, object in a void s_check_collision(Tspace_object *array_a, int num_a, Tspace_object *array_b, int num_b) { int a, b; for(a = 0; a < num_a; a ++) { if (array_a[a].alive) { for(b = 0; b < num_b; b ++) { if (array_b[b].alive && !array_b[b].hit) { // do bb collision if (s_check_pp_collision(s_data[array_a[a].image].dat, s_data[array_b[b].image].dat, (int)array_a[a].x, (int)array_a[a].y, (int)array_b[b].x, (int)array_b[b].y)) { // handle all collision types if (array_a[a].type == SO_ENEMY && array_b[b].type == SO_PLAYER_BULLET) { // change bullet into hit image array_b[b].image = BULLET_HIT; array_b[b].hit = 1; array_b[b].y += - 5 + array_b[b].bh/2; array_b[b].x += 3; // check if enemy is harmed by bullet if (array_a[a].flags & array_b[b].flags) { // decrese enemy energy array_a[a].energy -= array_b[b].energy; array_a[a].hit = 1; // kill if needed if (array_a[a].energy <= 0) { int cx = (int)array_a[a].x + array_a[a].bx + array_a[a].bw/2; int cy = (int)array_a[a].y + array_a[a].by + array_a[a].bh/2; array_a[a].alive = 0; if (array_a[a].movement_type == SM_BOSS_1) { s_var.guardian_active --; play_sound_id(SMPL_E_DIE); } // play sound play_sound_id_ex(SMPL_SHOOT, 100, 600, 0); // place explosion s_make_explosion(cx, cy); // generate power up if (rand()%100 > 85 || array_a[a].image == ENEMY14) s_make_powerup(cx, cy); // increase player score s_var.score += array_a[a].score; // special case? if (array_a[a].image == ENEMY08) { // mine double vx = array_a[a].vx; // spread bullets! s_make_enemy_bullet(cx, cy, vx-1, -0.5); s_make_enemy_bullet(cx, cy, vx-0.5, 1); s_make_enemy_bullet(cx, cy, vx+0.5, -1); s_make_enemy_bullet(cx, cy, vx+1, 0.5); } } } else { play_sound_id(SMPL_HIT); } } else if (array_a[a].type == SO_PLAYER && array_b[b].type == SO_ENEMY) { // kill player s_kill_player(); } else if (array_a[a].type == SO_PLAYER && array_b[b].type == SO_ENEMY_BULLET) { // kill player s_kill_player(); } else if (array_a[a].type == SO_PLAYER && array_b[b].type == SO_POWERUP) { // upgrade player s_var.power_gauge ++; if (s_var.power_gauge >= 6) { s_var.power_gauge = 0; if (s_var.power_level == 7) { // allready full s_var.score += 1000000; } else { // increase power s_var.power_level = MIN(s_var.power_level ++, 7); } play_sound_id(SMPL_HEART); } else play_sound_id(SMPL_STAR); // remove power up array_b[b].alive = 0; } } } } } } } // creates a player bullet Tspace_object *s_make_player_bullet(int type) { Tspace_object *bullet; bullet = s_get_free_object(s_p_bullet, 32); if (bullet != NULL) { bullet->alive = 1; bullet->type = SO_PLAYER_BULLET; switch(type) { case BULLET01: bullet->image = BULLET01; bullet->flags = SF_NORMAL; bullet->vx = 3; bullet->vy = 0; bullet->energy = 1; break; case BULLET05: bullet->image = BULLET05; bullet->flags = SF_NORMAL; bullet->vx = 2; bullet->vy = -1.5; bullet->energy = 1; break; case BULLET06: bullet->image = BULLET06; bullet->flags = SF_NORMAL; bullet->vx = 2; bullet->vy = 1.5; bullet->energy = 1; break; case BULLET02: bullet->image = BULLET02; bullet->flags = SF_ION; bullet->vx = 3; bullet->vy = 0; bullet->energy = 2; break; case BULLET07: bullet->image = BULLET07; bullet->flags = SF_ION; bullet->vx = 2; bullet->vy = -2; bullet->energy = 2; break; case BULLET08: bullet->image = BULLET08; bullet->flags = SF_ION; bullet->vx = 2; bullet->vy = 2; bullet->energy = 2; break; case BULLET03: bullet->image = BULLET03; bullet->flags = SF_WAVE; bullet->energy = 3; bullet->vx = 3; bullet->vy = 0; break; } bullet->bx = bullet->by = 0; bullet->bw = ((BITMAP *)s_data[bullet->image].dat)->w - 1; bullet->bh = ((BITMAP *)s_data[bullet->image].dat)->h - 1; bullet->x = s_player.x + 6; bullet->y = s_player.y + 20 - bullet->bh/2; } return bullet; } // updats the player object void s_update_player() { static int shoot_delay = 0; int bx1 = 0, by1 = -6, bx2 = 130, by2 = 85; // handle input poll_control(s_var.ctrl); if (is_up(s_var.ctrl) && s_player.y > by1) s_player.vy = -1; if (is_down(s_var.ctrl) && s_player.y < by2) s_player.vy = 1; if (is_left(s_var.ctrl) && s_player.x > bx1) s_player.vx = -1; if (is_right(s_var.ctrl) && s_player.x < bx2) s_player.vx = 1; // fire bullets if ((is_fire(s_var.ctrl) || is_jump(s_var.ctrl)) && shoot_delay == 0) { switch(s_var.power_level) { case 1: s_make_player_bullet(BULLET01); break; case 2: s_make_player_bullet(BULLET02); break; case 3: s_make_player_bullet(BULLET02); s_make_player_bullet(BULLET06); break; case 4: s_make_player_bullet(BULLET02); s_make_player_bullet(BULLET05); s_make_player_bullet(BULLET06); break; case 5: s_make_player_bullet(BULLET03); s_make_player_bullet(BULLET05); s_make_player_bullet(BULLET06); break; case 6: s_make_player_bullet(BULLET03); s_make_player_bullet(BULLET05); s_make_player_bullet(BULLET08); break; default: // 7 + s_make_player_bullet(BULLET03); s_make_player_bullet(BULLET07); s_make_player_bullet(BULLET08); break; } shoot_delay = 20; // play sound play_sound_id(SMPL_SPIT); } if (shoot_delay) shoot_delay --; if (!is_fire(s_var.ctrl) && !is_jump(s_var.ctrl)) shoot_delay = 0; // update position s_player.x += s_player.vx; s_player.y += s_player.vy; // check bounding box if (s_player.x < bx1) { s_player.vx = 1; } if (s_player.x > bx2) { s_player.x = bx2; s_player.vx = 0; }; if (s_player.y < by1) { s_player.y = by1; s_player.vy = 0; } if (s_player.y > by2) { s_player.y = by2; s_player.vy = 0; } // update velocities s_player.vx *= 0.8; s_player.vy *= 0.8; } // resets AL objects void s_reset_all_objects() { int i; for(i = 0; i < 32; i ++) { s_powerup[i].alive = 0; s_p_bullet[i].alive = 0; s_e_bullet[i].alive = 0; s_enemy[i].alive = 0; s_explosion[i].alive = 0; } // reset guardian counter s_var.guardian_active = 0; } // shows a sign (game over, lets go) void s_activate_sign(int game_over, double vy) { BITMAP *b; s_sign.alive = 1; s_sign.type = SO_SIGN; s_sign.d1 = game_over; b = (s_sign.d1 ? get_gameover_sign() : get_letsgo_sign()); s_sign.x = 80 - b->w/2; s_sign.y = 120; s_sign.vx = 0; s_sign.vy = vy; } // the player can enter his/hers name void s_get_player_name(char *name) { clear_to_color(s_buffer, 1); blit(s_data[BG1].dat, s_buffer, 0, 0, 0, 0, 160, 120); textout_outline_center(s_buffer, "Congratulations,", 80, 8); textout_outline_center(s_buffer, "You've got", 80, 19); textout_outline_center(s_buffer, "a high score!", 80, 30); textout_outline_center(s_buffer, "Enter your name:", 80, 55); blit_to_screen(s_buffer); fade_in_pal_black(100, s_dp); get_string(s_buffer, name, 10, s_data[SPACE_FONT].dat, 50, 80, 4, s_var.ctrl); } // runs the shooter void s_run_shooter() { int i; int playing = 1; int quit = 0; // setup player s_setup_player(); // start music s_start_music(0); s_fade_music = 0; // int gfx s_draw_frame(s_buffer); blit_to_screen(s_buffer); fade_in_pal(100); // Go! cycle_count = 0; game_count = 0; s_activate_sign(0, -1); while(playing || s_sign.alive) { // do logic while(cycle_count > 0) { logic_count ++; // poll music machine if (s_got_sound) { if (s_fade_music) { s_music_vol = s_music_vol * 0.98; al_duh_set_volume(s_dp, s_music_vol); } al_poll_duh(s_dp); } // move stars for(i = 0; i < 64; i ++) { s_star[i].x += s_star[i].dx; if (s_star[i].x < 0) { s_make_random_star(&s_star[i]); s_star[i].x = 159; } } // update player if (s_player.alive) s_update_player(); // update enemies for(i = 0; i < 32; i ++) if (s_enemy[i].alive) s_update_object(&s_enemy[i]); // update player bullets for(i = 0; i < 32; i ++) if (s_p_bullet[i].alive) s_update_object(&s_p_bullet[i]); // update enemy bullets for(i = 0; i < 32; i ++) if (s_e_bullet[i].alive) s_update_object(&s_e_bullet[i]); // update powerups for(i = 0; i < 32; i ++) if (s_powerup[i].alive) s_update_object(&s_powerup[i]); // update explosions for(i = 0; i < 32; i ++) if (s_explosion[i].alive) s_update_object(&s_explosion[i]); // update sign if (s_sign.alive) s_update_object(&s_sign); // check collisions s_check_collision(s_enemy, 32, s_p_bullet, 32); s_check_collision(&s_player, 1, s_powerup, 32); if (!key[KEY_SPACE]) s_check_collision(&s_player, 1, s_e_bullet, 32); s_check_collision(&s_player, 1, s_enemy, 32); // update level if (!s_var.guardian_active) s_var.level_counter ++; if (s_var.level_counter >= 80) { s_var.level_counter = 0; while(s_level[s_var.event_counter].when == s_var.level_offset) { if (s_level[s_var.event_counter].enemy_type < 0) { // restart level s_var.event_counter = 0; s_var.level_offset = 0; s_var.difficulty ++; } else { // launch wave and continue s_make_enemy_wave(&s_level[s_var.event_counter]); s_var.event_counter ++; } } s_var.level_offset ++; } // misc stuff if (key[KEY_ESC]) { if (s_got_sound) al_pause_duh(s_dp); if (do_pause_menu(s_buffer) < 0) { playing = 0; quit = 1; s_sign.alive = 0; } if (s_got_sound) al_resume_duh(s_dp); cycle_count = 0; } if (key[KEY_F12]) { //al_pause_duh(dp); take_screenshot(s_buffer); while(key[KEY_F12]); cycle_count = 0; //al_resume_duh(dp); } // update player score if (s_var.score - s_var.show_score > 100000) s_var.show_score += 100000; else if (s_var.score - s_var.show_score > 25000) s_var.show_score += 25000; else if (s_var.score - s_var.show_score > 10000) s_var.show_score += 10000; else if (s_var.score - s_var.show_score > 5000) s_var.show_score += 5000; else if (s_var.show_score < s_var.score) s_var.show_score += 1000; // update player wait if (s_var.player_wait == 50) { s_var.lives --; s_var.power_gauge = 0; if (s_var.lives == 0) { s_activate_sign(1, -1); // start music fade s_fade_music = 1; // game over! playing = 0; s_var.player_wait = 999999; // never come back! } else { // fade out fade_out_pal_black(100, s_dp); s_var.show_score = s_var.score; // remove all objects s_reset_all_objects(); // rewind level counter s_var.level_counter = -40; s_var.level_offset = MAX(s_var.level_offset - 8, 0); while(s_level[s_var.event_counter].when >= s_var.level_offset && s_var.event_counter > 0) s_var.event_counter --; if (s_level[s_var.event_counter].when < s_var.level_offset) s_var.event_counter ++; s_var.level_offset = s_level[s_var.event_counter].when; // fade back s_draw_frame(s_buffer); blit_to_screen(s_buffer); fade_in_pal_black(100, s_dp); s_activate_sign(0, -1); } } if (s_var.player_wait == 1) s_setup_player(); if (s_var.player_wait) s_var.player_wait --; cycle_count --; } // let other processes play yield_timeslice(); // draw frame_count ++; s_draw_frame(s_buffer); blit_to_screen(s_buffer); } s_stop_music(); // fade out fade_out_pal_black(100, s_dp); if (!quit) { Thisc post; // try for high score post.level = 0; post.name[0] = '\0'; post.score = s_var.score; if (qualify_hisc_table(get_space_hisc(), post)) { s_get_player_name(post.name); enter_hisc_table(get_space_hisc(), post); sort_hisc_table(get_space_hisc()); show_scores(1, get_space_hisc()); } } // restore palette clear(screen); fade_in_pal_black(1, s_dp); } // simple blending (used w/ explosions) void s_blend_frame(BITMAP *frame) { int x, y; int c; for(y = 1; y < frame->h - 1; y ++) { for(x = 1; x < frame->w - 1; x ++) { c = _getpixel(frame, x - 1, y - 1); c += _getpixel(frame, x, y - 1); c += _getpixel(frame, x + 1, y - 1); c += _getpixel(frame, x - 1, y); c += _getpixel(frame, x, y); c += _getpixel(frame, x + 1, y); c += _getpixel(frame, x - 1, y + 1); c += _getpixel(frame, x, y + 1); c += _getpixel(frame, x + 1, y + 1); _putpixel(frame, x, y, c / 9); } } } // generates the explosion frames int s_generate_explosions() { int i; int x, y; unsigned char c; BITMAP *tmp; tmp = create_bitmap(32, 32); if (tmp == NULL) return -1; clear(tmp); // draw initial explosion circlefill(tmp, 15, 15, 10, 31); for(i = 0; i < 32; i ++) { s_expl_frame[i] = create_bitmap(32, 32); if (!s_expl_frame[i]) return -1; // draw new circles in the first third if (i < 10 && i&1) { x = 10 + rand()%12; y = 10 + rand()%12; c = rand()%7 + 3; circlefill(tmp, x, y, c, 44); circle(tmp, x, y, c, 3); } s_blend_frame(tmp); // copy tmp frame to animation frame and reduce colors clear(s_expl_frame[i]); for(y = 0; y < 32; y ++) { for(x = 0; x < 32; x ++) { c = MIN(_getpixel(tmp, x , y) >> 3, 4); if (c > 1) _putpixel(s_expl_frame[i], x , y, c); } } } return 0; } // inits the shooter int s_init_shooter() { int i; log2file("\nStarting shooter"); // load data log2file(" loading shooter data"); packfile_password(get_init_string()); s_data = load_datafile("data/a45.dat"); if (!s_data) { log2file(" *** failed"); return -1; } packfile_password(NULL); // init stars log2file(" init stars"); for(i = 0; i < 64; i ++) { s_make_random_star(&s_star[i]); } // generate explosions log2file(" generating explosions"); if (s_generate_explosions() < 0) { log2file(" *** failed"); return -1; } // init objects log2file(" init objects"); s_reset_all_objects(); s_sign.alive = 0; // init player log2file(" init player"); s_player.image = SHIP; s_player.alive = 1; s_player.type = SO_PLAYER; s_player.bx = 0; s_player.by = 6; s_player.bw = ((BITMAP *)s_data[s_player.image].dat)->w - 1; s_player.bh = ((BITMAP *)s_data[s_player.image].dat)->h - 10; // getting memory for buffer log2file(" reserving buffer memory"); s_buffer = create_bitmap(160, 120); if (!s_buffer) { log2file(" *** failed"); return -1; } // reset shooter data log2file(" resetting shooter data"); s_var.level_offset = 0; s_var.level_counter = 0; s_var.event_counter = 0; s_var.lives = 3; s_var.power_gauge = 0; s_var.power_level = 1; s_var.score = s_var.show_score = 0; s_var.player_wait = 0; s_var.guardian_active = 0; s_var.difficulty = 1; // create blend map log2file(" creating blend map"); s_blend_map.data[0][0] = 0; s_blend_map.data[0][1] = 1; s_blend_map.data[0][2] = 2; s_blend_map.data[0][3] = 3; s_blend_map.data[0][4] = 4; s_blend_map.data[1][0] = 1; s_blend_map.data[1][1] = 1; s_blend_map.data[1][2] = 2; s_blend_map.data[1][3] = 3; s_blend_map.data[1][4] = 4; s_blend_map.data[2][0] = 2; s_blend_map.data[2][1] = 2; s_blend_map.data[2][2] = 3; s_blend_map.data[2][3] = 4; s_blend_map.data[2][4] = 4; s_blend_map.data[3][0] = 3; s_blend_map.data[3][1] = 3; s_blend_map.data[3][2] = 4; s_blend_map.data[3][3] = 4; s_blend_map.data[3][4] = 4; s_blend_map.data[4][0] = 4; s_blend_map.data[4][1] = 4; s_blend_map.data[4][2] = 4; s_blend_map.data[4][3] = 4; s_blend_map.data[4][4] = 4; // lock onto music s_duh = (DUH *)s_data[SPACEMOD].dat; // done log2file(" init OK!"); return 0; } // unints the shooter, frees memory etc void s_uninit_shooter() { int i; log2file("\nClosing down shooter"); log2file(" freeing explosion frames"); for(i = 0; i < 32; i ++) if (s_expl_frame[i] != NULL) destroy_bitmap(s_expl_frame[i]); log2file(" freeing buffer"); if (s_buffer != NULL) destroy_bitmap(s_buffer); log2file(" unloading datafile"); if (s_data != NULL) unload_datafile(s_data); } // starts the shooter int start_shooter(Tcontrol *c, int with_sound) { s_got_sound = with_sound; // init shooter if (s_init_shooter() < 0) { log2file(" *** init failed"); s_uninit_shooter(); return -1; } // get variables s_var.ctrl = c; // start the shooter s_run_shooter(); // clean up s_uninit_shooter(); return 0; } alex4src/src/shooter.h0000666000175000017500000000523607710456702015430 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #ifndef _SHOOTER_H_ #define _SHOOTER_H_ #include "control.h" // space objects #define SO_PLAYER 1 #define SO_POWERUP 2 #define SO_ENEMY 3 #define SO_PLAYER_BULLET 4 #define SO_ENEMY_BULLET 5 #define SO_EXPLOSION 6 #define SO_SIGN 7 // bullet flags #define SF_NORMAL 0x01 #define SF_ION 0x02 #define SF_WAVE 0x04 // movement types #define SM_STRAIGHT 1 #define SM_GO_DELAY 2 #define SM_SIN_WAVE 3 #define SM_COS_WAVE 4 #define SM_BOSS_1 5 // any kind of object typedef struct { int type; int energy; int image; int flags; int alive; int hit; int fire_counter; int score; // movement int movement_type; double x, y; double vx, vy; int t; int d1, d2; int tx, ty; // bounding box specifics int bx, by, bw, bh; } Tspace_object; // collection of shooter variables typedef struct { // level related int level_offset; int level_counter; int event_counter; int guardian_active; int difficulty; // player related long unsigned int score; long unsigned int show_score; int lives; int power_gauge; int power_level; int player_wait; // common Tcontrol *ctrl; } Tshooter_data; // a level event typedef struct { int when; int enemy_type; int movement_type; int num; int x, y; double vx, vy; int d1, d2; // variable data } Tshooter_event; // a star typedef struct { int x, y, dx, color; } Tspace_star; // functions int start_shooter(Tcontrol *c, int with_sound); #endifalex4src/src/timer.c0000666000175000017500000000365507710456700015061 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #include "allegro.h" #include "timer.h" // keeps track of frames each second void fps_counter(void) { fps = frame_count; frame_count = 0; lps = logic_count; logic_count = 0; } END_OF_FUNCTION(fps_counter); // keeps track of internal game speed void cycle_counter(void) { cycle_count++; game_count++; } END_OF_FUNCTION(game_counter); // initiates the timers int install_timers() { install_timer(); LOCK_VARIABLE(cycle_count); LOCK_VARIABLE(logic_count); LOCK_VARIABLE(lps); LOCK_VARIABLE(fps); LOCK_VARIABLE(frame_count); LOCK_FUNCTION(fps_counter); install_int(fps_counter, 1000); fps = 0; frame_count = 0; cycle_count = 0; LOCK_FUNCTION(cycle_counter); install_int(cycle_counter, 20); game_count ++; return TRUE; }alex4src/src/timer.h0000666000175000017500000000274307710456702015065 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #ifndef _TIMERS_H_ #define _TIMERS_H_ // the variables used by the timers volatile int frame_count; volatile int fps; volatile int logic_count; volatile int lps; volatile int cycle_count; volatile int game_count; // functions int install_timers(); void fps_counter(void); void cycle_counter(void); #endifalex4src/src/token.c0000666000175000017500000000665707710530540015061 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #include #include #include #include "token.h" #include "main.h" //////////////////////////////////////////////////////////////// // token handling //////////////////////////////////////////////////////////////// // creates a new token Ttoken *create_token(char *word) { Ttoken *tok = malloc(sizeof(Ttoken)); if (tok != NULL) { tok->word = strdup(word); tok->next = NULL; } return tok; } // frees a token void destroy_token(Ttoken *t) { free(t->word); free(t); } // frees all tokens void flush_tokens(Ttoken *head) { if (head == NULL) return; if (head->next != NULL) flush_tokens((Ttoken *)head->next); destroy_token(head); } // inserts a token last in the list void insert_token(Ttoken *list, Ttoken *t) { if (list->next == NULL) list->next = (struct Ttoken *)t; else insert_token((Ttoken *)list->next, t); } // tokenizes the string str Ttoken *tokenize(char *str) { Ttoken *tok_list, *tok_tmp; char word[256]; int a, b, c; int i = 0; tok_list = create_token("head"); while(str[i] != '\0') { // skip leading whitespace while(str[i] == ' ' || str[i] == '\t') i++; if (str[i] == '"') { // find end of string part i ++; a = i; while(str[i] != '"') i++; b = i; i ++; } else { // find end of word a = i; while(str[i] != ' ' && str[i] != '\t' && str[i] != '\0') i++; b = i; } // copy string to word for(c=0;cword[strlen(tok_tmp->word) - 1] = '\0'; tok_tmp = (Ttoken *)tok_list->next; destroy_token(tok_list); return tok_tmp; } // returns the work of the token after token char *get_next_word(Ttoken *t) { Ttoken *next = (Ttoken *)t->next; if (next == NULL) { char buf[80]; sprintf(buf, "<%s> has no next", t->word); msg_box(buf); } return next->word; } // prints a token list void print_token(Ttoken *t) { Ttoken *ptr = t; while(ptr != NULL) { printf("%s ", ptr->word); ptr = (Ttoken *)ptr->next; } } alex4src/src/token.h0000666000175000017500000000303207710456702015055 0ustar pdewachtpdewacht/************************************************************** * _____ __ _____ * * / _ \ | | ____ ___ ___ / | | * * / /_\ \ | | _/ __ \ \ \/ / / | |_ * * / | \| |__\ ___/ > < / ^ / * * \____|__ /|____/ \___ >/__/\_ \ \____ | * * \/ \/ \/ |__| * * * ************************************************************** * (c) Free Lunch Design 2003 * * Written by Johan Peitz * * http://www.freelunchdesign.com * ************************************************************** * This source code is released under the The GNU * * General Public License (GPL). Please refer to the * * document license.txt in the source directory or * * http://www.gnu.org for license information. * **************************************************************/ #ifndef _TOKEN_H_ #define _TOKEN_H_ // the struct for a token typedef struct { char *word; struct Ttoken *next; } Ttoken; // functions Ttoken *create_token(char *word); void destroy_token(Ttoken *t); void flush_tokens(Ttoken *head); void insert_token(Ttoken *list, Ttoken *t); char *get_next_word(Ttoken *t); Ttoken *tokenize(char *str); #endif