From 413e2c941e5335dac43afa84a10ae80f87985573 Mon Sep 17 00:00:00 2001 From: Roman Chistokhodov Date: Tue, 27 Aug 2019 17:00:53 +0300 Subject: [PATCH 01/24] Add warning checks --- CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 80c2c5d9..ffae124c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,6 +86,11 @@ if(${CMAKE_VERSION} VERSION_LESS "3.0.2") endmacro() endif() +if(NOT MSVC) + add_compile_options(-Wempty-body) # GCC/Clang flag + add_compile_options(-Wreturn-type) # GCC/Clang flag +endif() + if(BUILD_CLIENT) add_subdirectory(cl_dll) endif() From 6143c74dc9ec26016767976f2d606979490b5728 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Tue, 10 Sep 2019 11:25:51 +0600 Subject: [PATCH 02/24] waifulib: allow compiling using host clang and NDK sysroots, thus enabling building engine from any environment that has clang(termux as example) --- scripts/waifulib/xcompile.py | 112 +++++++++++++++++++++++++---------- 1 file changed, 80 insertions(+), 32 deletions(-) diff --git a/scripts/waifulib/xcompile.py b/scripts/waifulib/xcompile.py index d6bb1a8b..c0365ddd 100644 --- a/scripts/waifulib/xcompile.py +++ b/scripts/waifulib/xcompile.py @@ -38,16 +38,18 @@ class Android: ndk_rev = 0 is_hardfloat = False clang = False - + def __init__(self, ctx, arch, toolchain, api): self.ctx = ctx + self.api = api + for i in ['ANDROID_NDK_HOME', 'ANDROID_NDK']: self.ndk_home = os.getenv(i) if self.ndk_home != None: break if not self.ndk_home: - conf.fatal('Set ANDROID_NDK_HOME environment variable pointing to the root of Android NDK!') + ctx.fatal('Set ANDROID_NDK_HOME environment variable pointing to the root of Android NDK!') # TODO: this were added at some point of NDK development # but I don't know at which version @@ -86,13 +88,18 @@ class Android: elif self.ndk_rev >= 19 and self.api < 16: Logs.warn('API level automatically was set to 16 due to NDK support') self.api = 16 - else: self.api = api self.toolchain_path = self.gen_toolchain_path() # TODO: Crystax support? # TODO: Support for everything else than linux-x86_64? # TODO: Determine if I actually need to implement listed above + def is_host(self): + ''' + Checks if we using host compiler(implies clang) + ''' + return self.toolchain == 'host' + def is_arm(self): ''' Checks if selected architecture is **32-bit** ARM @@ -126,7 +133,16 @@ class Android: def is_hardfp(self): return self.is_hardfloat - def gen_toolchain_path(self): + def ndk_triplet(self): + if self.is_x86(): + triplet = 'i686-linux-android' + elif self.is_arm(): + triplet = 'arm-linux-androideabi' + else: + triplet = self.arch + '-linux-android' + return triplet + + def gen_gcc_toolchain_path(self): path = 'toolchains' if sys.platform.startswith('linux'): @@ -149,13 +165,6 @@ class Android: raise Exception('Clang is not supported for this NDK') toolchain_folder = 'llvm' - - if self.is_x86(): - triplet = 'i686-linux-android{}-'.format(self.api) - elif self.is_arm(): - triplet = 'armv7a-linux-androideabi{}-'.format(self.api) - else: - triplet = self.arch + '-linux-android{}-'.format(self.api) else: if self.is_x86() or self.is_amd64(): toolchain_folder = self.arch + '-' + self.toolchain @@ -164,42 +173,70 @@ class Android: else: toolchain_folder = self.arch + '-linux-android-' + self.toolchain - if self.is_x86(): - triplet = 'i686-linux-android-' - elif self.is_arm(): - triplet = 'arm-linux-androideabi-' - else: - triplet = self.arch + '-linux-android-' + return os.path.abspath(os.path.join(self.ndk_home, path, toolchain_folder, 'prebuilt', toolchain_host)) - return os.path.join(path, toolchain_folder, 'prebuilt', toolchain_host, 'bin', triplet) + def gen_toolchain_path(self): + if self.is_clang(): + if self.is_x86(): + triplet = 'i686-linux-android{}-'.format(self.api) + elif self.is_arm(): + triplet = 'armv7a-linux-androideabi{}-'.format(self.api) + else: + triplet = self.arch + '-linux-android{}-'.format(self.api) + else: + triplet = self.ndk_triplet() + '-' + return os.path.join(self.gen_gcc_toolchain_path(), 'bin', triplet) def cc(self): - return os.path.abspath(os.path.join(self.ndk_home, self.toolchain_path + ('clang' if self.is_clang() else 'gcc'))) + if self.is_host(): + return 'clang' + return self.toolchain_path + ('clang' if self.is_clang() else 'gcc') def cxx(self): - return os.path.abspath(os.path.join(self.ndk_home, self.toolchain_path + ('clang++' if self.is_clang() else 'g++'))) + if self.is_host(): + return 'clang++' + return self.toolchain_path + ('clang++' if self.is_clang() else 'g++') def system_stl(self): # TODO: proper STL support return os.path.abspath(os.path.join(self.ndk_home, 'sources', 'cxx-stl', 'system', 'include')) + def libsysroot(self): + arch = self.arch + if self.is_arm(): + arch = 'arm' + elif self.is_arm64(): + arch = 'arm64' + path = 'platforms/android-{}/arch-{}'.format(self.api, arch) + + return os.path.abspath(os.path.join(self.ndk_home, path)) + def sysroot(self): - if self.ndk_rev >= 19: + if self.ndk_rev >= 19 or self.is_host(): return os.path.abspath(os.path.join(self.ndk_home, 'sysroot')) else: - arch = self.arch - if self.is_arm(): - arch = 'arm' - elif self.is_arm64(): - arch = 'arm64' - path = 'platforms/android-{}/arch-{}'.format(self.api, arch) + return self.libsysroot() - return os.path.abspath(os.path.join(self.ndk_home, path)) + def clang_host_triplet(self): + triplet = '' + if self.is_arm(): + triplet += 'arm' + elif self.is_x86(): + triplet += 'i686' + else: + triplet += self.arch + triplet += '-linux-android' + return triplet def cflags(self): cflags = [] + if self.is_host(): + cflags += ['-nostdlib', '--target=%s' % self.clang_host_triplet()] + if self.ndk_rev < 20: - cflags = ['--sysroot={0}'.format(self.sysroot())] + cflags += ['--sysroot={0}'.format(self.sysroot())] + elif self.is_host(): + cflags += ['-isysroot={0}'.format(self.sysroot())] cflags += ['-DANDROID', '-D__ANDROID__'] cflags += ['-I{0}'.format(self.system_stl())] if self.is_arm(): @@ -222,15 +259,26 @@ class Android: # they go before object list def linkflags(self): linkflags = [] - if self.ndk_rev < 20: - linkflags = ['--sysroot={0}'.format(self.sysroot())] + if self.is_host(): + linkflags += ['-fuse-ld=lld', '-nostdlib', '--target=%s' % self.clang_host_triplet(), + '--gcc-toolchain=%s' % self.gen_gcc_toolchain_path()] + + if self.ndk_rev < 20 or self.is_host(): + linkflags += ['--sysroot={0}'.format(self.libsysroot())] + + if self.is_host(): + linkflags += ['-L{0}/usr/lib/{1}'.format(self.sysroot(), self.ndk_triplet()), + '-L{0}/sysroot/usr/lib/{1}/'.format(self.gen_gcc_toolchain_path(), self.ndk_triplet())] return linkflags def ldflags(self): ldflags = ['-lgcc', '-no-canonical-prefixes'] if self.is_arm(): if self.arch == 'armeabi-v7a': - ldflags += ['-march=armv7-a', '-Wl,--fix-cortex-a8', '-mthumb'] + ldflags += ['-march=armv7-a'] + if not self.is_host(): # lld only + ldflags += ['-Wl,--fix-cortex-a8'] + ldflags += ['-mthumb'] if self.is_hardfloat: ldflags += ['-Wl,--no-warn-mismatch', '-lm_hard'] else: From 07884957fbe15c5672dcf7a10dbda215ec20c380 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Tue, 10 Sep 2019 10:32:12 +0300 Subject: [PATCH 03/24] waf: update binary waf --- waf | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/waf b/waf index b35987aa..3bd5c703 100755 --- a/waf +++ b/waf @@ -32,13 +32,13 @@ POSSIBILITY OF SUCH DAMAGE. import os, sys, inspect -VERSION="2.0.17" -REVISION="da8474e646911ac5657990d535080c54" -GIT="31da55afb92d9865019eb5193e874d1ffb86c522" +VERSION="2.0.18" +REVISION="51fff4c95844a6b013877286b96a55d0" +GIT="68bf3867df33c04c944e8905820fc4cca4b663d1" INSTALL='' -C1='#9' -C2='#3' -C3='#*' +C1='#/' +C2='#-' +C3='#%' cwd = os.getcwd() join = os.path.join @@ -140,6 +140,9 @@ def find_lib(): if name.endswith('waf-light'): w = test(base) if w: return w + for dir in sys.path: + if test(dir): + return dir err('waf-light requires waflib -> export WAFDIR=/folder') dirname = '%s-%s-%s' % (WAF, VERSION, REVISION) @@ -165,5 +168,5 @@ if __name__ == '__main__': Scripting.waf_entry_point(cwd, VERSION, wafdir) #==> -#BZh91AY&SYL79u  8X0EbQ\{*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#3oKmCamvueJwt]Sf:lݶq:}S۹NNݺ7}ۡ{;RR]#9טͬ@aحٽy_>gv|axoyzw#*Ogmoޏl{3w|#*#*#*#*6>=#*N{r#*ݻaݭw+Z57:٦Im݅8F#9CMw#*DT#*"DPTzRJnT׽z>wsK+w*ۮ"jO[ppwcT>Jzz$cg׾ٻ)nmfl&vNkuuE۞R {7ZۮVm=zǽXztn9EQk^E@^G(c:uJKk/y˙zv>-5΃'#* {Ghν{{'$})#994Aq0vf[5vNͶ뾷zd.o}]ә}uCَ=)ƎN8r #*7zu_w}FzKsH(%;5IBklvv6ɗKݹY{ݞzoy(W7Uv#*#*&#*h{{^w}}EOp[;nøşj=ù ٯZP}Po5zSkiTsڽWivo#*V{ wl)NwGk^غ ؅#Y˛X.+7e}zmMWJ[p^tSt^{;{={v^&U!ܓ2#3ntX{8zkN{:>$ۭ;a}c:4#3=#*{tto;s(X;g:w4qoygl#9|ꁧ#*$=ws`x#*#9we5ۀtTP*=.Ֆ1wε=fc=jc:#*$HW&]6tvUf7YƦ6t8Ot7:|xwϞ۵ؚGux2^IٝocO}^Znp^_4#*@#*#*#*FM4i656!#*zF A2hhz6S'=OPyL51#*#*@#*#*#*$"M4$LLFFLO%GJzT#3M[NdH$ګDzV ?Go-[F2V'Ֆx* Xu2F$ý>.bzt^ťbgTCz#9@Eot\W |+;$!'\eF\K3Ls՗O55]˄3ŢĢk=5Wjwk]dɲ#3WZ[QmjkZkZUk[R#9 ""Q'9YDi!BG85[ ("|B[^UڝZ5E^ݴUDsQP$eYLZ 4֌Ril IMX2-)FR&‰,QmY6њK&DhͤB"jR@MK#*IRl%Jfam#*M -!C#*eLh66(Il H+1(#3K-#JZ-4VmmX2 UYf)i4TMMlfԶٖ$HMFMfh*#9$"X"Fi1&IS"3JRB"B#3FIR&B4B"E(H2#355fA%"K25bYHdbM RdSL%&M#31"fHcY(ڍEfI6IL66 ؉1M)mI`PI)6-I(Q "QHE"0Ed1RDa2JMERlk jHb iM$ 1[Ee2J&dX#9dFFljiD)A,#314,b#c,l&-T)D-""m4064!$%AFL6A2ցP#3%F,L&H#9(јLPAF&R 1ʄl*fme[)e0b͋(TlEI1&I6H2T-3Eғ6LFmiD`Q&`)i2R4A%,Y)"Cdd&LVCEF2,EMQI&$JmMF"&#&j4"mf 3!" JƔ*iebKI$# -EbiBȚ‘&C1 LjKDM2mJi@ɣZa&e&)C,"2$S!41 53&DZմ`BjfIY2Hh5)l#9YRiBYRmL-1$b&)J"f&Y0o՘eF[# SJhDm464ڕQf)fEXK Yi#30QjKTaFLeT"f$3LKh%&XQHZ2iKY,,m k4ɓ5&VQSeU&YMc+0f3*dFM2%LY*ͰiXڤhb4J&)j+*kE&e5dMZ*űhbDSIbŋF65FlFJ3`ѰiR QIilhbV-I6H[ZYd&S5-d&ĄJZEE1J[5MK1ZmY)djPlam$fƅk+66EME$`M JH#9jS*J!*(dڊ4E&MTM)H6DVY LJf%EM2PiͦbƲ)DąhAa Z"h1QbJdFcIeJ#Fa)R$&ђ!#936lI(HS1SY")XjMIaEhHT!FKEPE!F223YMbYcR-EQZ3DT4jSI,Vej4 bQQT(ce4!ILTRji,m(dXhYb, ٳC6ƦF&LBMI hQF*eaIXFY4R j(ʒS(FCDYIS"-X֍YTPV4EI-L4Ba51Q-4B4I̒cɋکYITkf&)B̕JmhJS4+m35)k)ll%l4ԒBA E,IDb6HjC&d h!hҚSmIli#9i)$QlM-Ibh#Il`#3F,-&Սe(KT!6Ƥ""R#$ѨKY*Yk&%h mDTQ$ZTmEbZF֓1f&3Mhm4lMQl#)#9h`*,i-FfX-3RVœjRf#3%bEc&6+b2Q1%X6)MES#9)%Xش[F542Y6!mF4eDhIEPjJ36X#BDbI2dIE+DS5S?/5#D\;S.j߮J-?쟡j>lcCHƿbf؆]MDcx?Kzd2i#92a.CV Ξt`F \h $-* /UIhT G&Mxdƣ/1硇{JP>Xql-JJ%=Aɚi陏+cF6va'%l٩8U#9JLU#*Mz4,MbG6%#&HcM#2RD6_.ܲ.N9T6S ɚ!Ɨ RR(UԂ2F,NmFsm,eALi5 E$E+Mpq,mqp c#9Gt\דGX_WkKb1(*?/x<^A;[b`ShR,Gļ#9#EHc hg,hQՋ}R#3?kF4̆+):iH*8d>}g!lȻQF(n*3_nss_V,[itEYIP8x26`^$Pi)5"Ve? 9nNVm՝ɣ'6I}+uC2PW} :>8| ݭsm 6m|lɺFF b#9PTOd e;6j4<\mQKiV*v+E5K* ڇٜ\OS\-Ee؝׷y}MXfDEtP1PX+W'OWn^{z0Cy8OE#ap/7,j_uXKɠFCD)b҈jR#9Ru&i1R|Wxꄡ4},DMR. EsQwѽzJT=hٚv,YAgHFbZT-cQRmSxE#TX)4@ޢWfـd%N5M08m@Z?CNekfL UTAQ#*FEP6J٨-${xhܮ77=u!ŴT]GeJEzwլХᡅ9:2 AM(SvZl JvJ *6Kn)i6I./(*̣f<$G5?vonjGqQEO%xxXZ<(e(vEՄ;ɗ ^~[N:M:Jb.8\WHa*% w3$wbZjVfmصIIQAQp|#peKbM+>?!y߷I}dhI:W0hUUPBЈ͝]1I¿*ϣn=l)]=3FJC2MX /s{u1\zQeU~.H$6,X}n0g;jCkwy=BluFɌ ,~2.z:\oǏ.NM(S?;珢X$M&ѳ-zsP\:knJ~\DaڟYXF| WU0Y+d0'%)l8bd):#Ʊp:aQ3*su{Ӻ.AHt" &Oδy.2>H=voHyV,t]iBL8#9.S#7Z8闭fSߪtC5=Lp~J] `!#.rW >iM!-ΰnc2?fZԩ*r/Niϳ`WVo>lteG!c7Cj )faL}:s6qåW,ܛbpn=(vѕ[t##3ȱgY%$LB;R\uXƬ!KTJNm*z]8W OG?G[\tlE`JDN)!]zϙʋm&]^_ϼ]4"&|_^:"Ԗu׈#9#gKWOw`zUʏ+QC}wxʙ$Ms#3KPx*)_vWd"I]ڪZ!(̳ewFKhP`/Nko"9f~H84t)MEojO#f.N'A?.1b3#3>c(QPGWv `GE"`fQQx[1H4ヲ詥YҲa>m;x3m/ch =ESҸvߢ"[]݀9J'p\PUj֫95d2T(B3 xb\JWe1595'aC)2dRfqm޿I=g -l TiتU:8ŕf ދB"Ic3Hj Ï*ZT7̡"۹fkQqGC#9EX@ܪ65koJ41S}4D KWʞ\xPxy [ڭ9مDKRaH(k~W,@J{ *)9B"R"Mttm(=}CKcGpl&N۳;}XUwAjkˏ6U[5f;C-Apqĩ(znn=:%b\lݿWeg>UqJ%. á~US1"aWt퓯ߛo[Q/"Qn5 Eu6IDp]VfAg%7M#*4USOA",E#_+B^0(gv6omգž%9!CgFs#3!ە/|#*?w9Sv7uR0ϗi?:3C4H>r"P1#*NNIꃭ P&NAq$N+U0D'&^L"EBpJ#3#9#3Ʈ}ΫTeM^;wnoȥU']eѱkLFoh#3>s?f=v[֎1$$nV@>kB?.| QqRM=wv|D#!oh7]ZBEf; p`xrdh*Qő7 FW?8n69F<7mELcEy6k@29ErtSUohsz[Q>)fu]Pf8u[4팍95w?g+i)se {-pҦg7V`Ѵm#3 t#38`X*ZQg*dCXqCYo"zVmbo햚.4]#*̠v>v.5bգCmQ8 >V/[ȂoI.5#Yܱt\J1kh`C|i3ZSTB4aq#cAr-CObnMuҟ'[H2{%=w/f(2G ![qu;s^e1Qla$kybqvw7IGˠI[OY|'U2`'k sJFS ]Fe5ƊE`AHW0qfHeN̽U^4x*Efh4=2ӾpSq@v/Z+>:f? Z:rm~*Zek`qa+h"[N]EU8( !D?COg$61܂EAb'wv=hq<ۋgo=sƍo5>P$RF@^:$n!ft#9`:\zsdJ|H'[1 Ѓh[;7?ݣY?#3[ٰl7QXʎZ_r D8tNf+"YE)^TqdONכ틀rb4s2_eҝ0: w7ۆ'b4)v'{Kvyu B偻e^y9kC(爻T˂2a^m2uo׫֮< Cזj,s7XSq $43{^Ȝš rPٯD%Sm Ej,$ߵZmOxx^49h:Yld,*0FosR\ 75$BD %c#3.جݲ#92n8Cr]#99J g,:AJBbwHYx݅&gݿՇvko']QP0w[)׏N p1#3|y1#9I#9/JmKps>ý&Zy@$B"P'o_#*_Le@%o WL#- *T1f`5U?ZK_2.#ưn#6tEߦNQǵC`Ƈɑ{(Ȣ)>9MSFS\E#3xFR:n%q:"4P[l#35sJ>}"wXd"£:7c56ÿ3ݒaI}6y[qT6Kc?xZx((H&;6M2U@TA۷F3C/ '&L]#3-&IK6g,dI;1S} #97߱L^2"O?0JfBP^]^mJl7>Q-o(!qU` B&f<#ӥ垚1W 4t=OLi=΋?\BsG>߬.ߩ[S0#9dTP'K2ηGz{v鹴9dkA,!nm(l6=b~3<:$,nnJ]X$ݙEX?Z;z)8c p"{Ѥذ4tnַN( n!,4N-żpzn LVo,)35CV)#M0ڻŭ9Ҭ0m''`z#*1( 4ygR]͜MH#9#3io3&L;Kcv='M0FM|ኟƄOJuo4ɃoU j!oaeFˏ˚ZV(F,abHUyWmeᴇNщL<~-HI%ɏP#pb.\*c@7+N[#9#PFPYږ2jN~an"C6aj{ό?`zg70I!LJs=N>.NJ&dDbasW:82Q` 4Y9%5C"bSJl,al^;8Ʀ@cb)SҦ780c\fMxq:f=Pi9- LǶ<2>}|s2H#Q߷79ls?3*#9:A(#9#*S {cz57f<+#9(ؚH#*^#*`,7P  fBy<hCm#U`E64GtP, W/WZiw&:6q (c^X=#9͖2xB%]ykaFݺFܴj4%9~'~ij+|xFCR@2˜EʅUPe#Z$gOw^ 0mP1 @6#* N 7hlyO>ɪtō,oӪhDnk}*2;QIIBiVjHb=9;bEjd4Pnz6p6Ƅ>#,ofLcLJ 5/IccB朆$@LApL)"d`P #9'}4XhێdY66QJ5˲ Z\ev}R|憕729` F9g;Psq >d5ƽ1NmeN2|,Qd!9żul#9?/{(Z 6}z-z(af3ԯ/aOR, ]Ѹzdp\Lxǘ#]&hq`׿aTmjmșʺQ a>[;q|w#9fqoy(sO-CKl&H0A";v 8Y)_&`/a! zpH[ÆGN;h*rYz9 DwcTX\kofsۊHZوɸ%g٭^sΡCKձRSW|Dz 2NN$kmO#@iÅg/!kTAE`AKcq#VыXw#3eŴ ḋ~r#rHQkO$((G8~$\aEAG#3iٕ%$MaMnVT?gre!Hܷ f7?ؼD䋟ߒ0Ci4Nh,FJf$= #9(dY$E4'F5F:Ep[̐A7P\ԈmZP9e0 4B0\8bJEڥ4Y#907iRa2ա#U#9ǦaA` ZiI.|tAr"݊CӦzaS G!3EcsƋV4%7~յ™O*1!a),j]ڝj@tG=*0Jv(db)4dLTE.䣻o7͈WPs";O~p^lsI :3BX4p#>.{Oioﶔp:;PRBHǺG_;xugޜI%I:cb}Nj S#4R n7Dg)e˴bOI,;`rKcE đ}Ӕ'4O{u|VrӶa<6})n]F~cnz_lV>kl}1SzRB>5~ţa!aN#7Q7UM{vi08h3P{.2?Ax}c#eJ8CZ f\L͊"ۡ#9n"R!9Uc9dIɷ;p #3q-p5Qq`{m]ȹˡAIF@-ͭtHͺV"4f!1ZYiOe#}cVR/p`kkIKCxw2@0-F,-keqA ׬AO"}Eȼsˬ?!zx|#FG/ ϕhaaΥٌ8jJ-߷`}3Wt4>b"y6J>{XYH5 -TxAޫNd1HVTD)wVo/%%ԃjE#9"(>͉*X(fņ>pr0#3#9x^-6#Oϱ׊/7'|n!O(Ɓ,0#9DNdI>5 _)=7r{6/Ⱥ,0Y$;zE#9[#3Yd"#*sm^~8tc=)uRx$vÐ|8jVoA!G0ԬCTy/rM#*]tE'ηy*:H'v3y=#֩gz_UQeȍA 5?ؽݡg;Ww:o 2yxvb9-#9Z?vV$8΁L_egOB#9l٭ ?sAduTz1ɷhh).w_oj޻b,*[kAͩ,$lbQbhb^۵k-K\#3)1@<)>$ij#9aD#_[~Iֿ6yh6E)^qJN a:ii]=(粍\E͊()%*A>wB3^k:{.(1gf4kekn6wK?[&01*#'&Qޥ\Cm$*nBTQ<zN}z{ljm6#E Qiؤfg~y0rExXʟMfɧRAQ~q?D 47Vks«#*ߙ@Xs,G1C1u4T;Df>O$9um~s}uX'HL٧WG Jy;7'#B#90M#3 'VQk=b՝+} XϟI1GOH6t~ `?4۟:X~4o|$_$z;>7!}!ΥsTh.6t#31}DO9]>냗ퟘu |KEdSfc6jxq_5:م uG"y3ɽɶv=V~]wis};??Z7mKY';i&x6iz`b"ULT[r!ݾb@S'(FoZR,>ek#*l9h6(#܌X0b3#97˝w6?ƈeNêP\M08v%j'C-fa?vz?QO3ϥc' Gp P[~#*Ta Hҽo* Ө#w 2 aиQX"¹|xY1Rtl<mkcda(5zYi},PW&=Lz{B@iW+ʀX+MS ?s'iS{邴qA<^e7r?Tj;Ƒ;l~`=v=i(/Hy#*2A1BDڪ}M=}d:ؼ8쓻ɽ)GAhm r㩀E:Y >^"7|/iHs$>OF;C$FsɪT#wu4g$<ȷSՕ>yΨpO0eܡXfl{/A!L#9H<$h W`XĀ%ot+~CuLlA.Ow@K߇FXGo>#V 4oW6vo-W7@/4}VN _Fe/[5U˧}/gb_./{oϠJp+cdTJ{nwK'Nw|hn~C⾹jv;W?ÇgF~ch;ӎt|;x0\G0vNo&Gۗ!勇IOҞ9d>T|._W[=YVtd-àWr|^:1-RCɐ\[)˺#3t-c0W%ͮӊrlc#35m_GDݪqW R˄zRmZXJ.6oG,+ljm悌i#3~,YytqaF[-W(~]|s ph<ȹΪ{fuܞnLw[͇IݬyȗW_9olwlabY7:= Wo';9'ѭ)2C'PO rM=Gɵe 6Ӳ6'8Wy986u/#3O{]|jkI#3&<\vc+p#9]gׅ:;67U.tkD}f؆6e ?9@ehƙx8\x|{r,y(n9,5tcLE^/wT.Zf(Q?+:Só.ƎxL?1&6jAհ_M?}#Q;ϦR-#*HmOWu0ݮK[GͷCgzz#գ+#3p8XO%jycO~X83 hdTǕx_䝗W-mI{me#9?=,T}?t/RwzW^/;iiw[Z#9(FAs(]ឃNn$E#3 ƮH#*Dh³Dax#9/2HvTgݮ6j|?ϲj{B~po58j}^bfe;";/D>Z.f."w:zp|tw}]?]AIaQO^aPgyTzƫQ񎪨i 0&qu^Mv`LW N>t":LDֽ9rkqf_u<)w?#iPjlpz@]|%U3壈zv$\=S3$!KܣtZڛ.:wwHyi~T9#*&SnK]=#*E{w0kT0qN\#9NϕdlZ*;}g8z = .'wrEkXuwƱqg_i2NyqOd] |QZ6U5ȴ PwVMM4D,=܂ԃ!EŖ%:'=*Ȣa|=^}A );$o#9#*Squ.e>0o5h5FGd(~BrK5mÏHz x+dWkwY}L,#3_AqyQGN+Vڕ~# QG^ VVilWaٍ_4}TտU*[LXpfy|\O q*a󍀎)(OgI^m;ϵv<͚mk/(z$_GCå󱐤'1AZ<99;g,d~^#3o#*3AKcĒa*?dS!/F%<#2#*o?7Fdʏ\?Z,̹,0!1#3AȑFd|+Z#3*mTMǒH*d.,fSVeH0%i[M`cXL Ց447BK#3X++#pѼ8 `f!IUD|уa #ohW}UR#3X/u}??]ga((>߷~Kī;7@w6c[\xV3={-!alar(ea}==_nZ"@!WǑ&USoWSpה:p^qsrNk CξTإ~]ݜ&&{- }o@ v,$!~Сix|lbhͯ#޵9G/^QB/DpTntUQ?ܣJ{ x_J%ٰc^FVcnFz;:f[H\S]y$$%ٳWy9#3#*F?w*H('بbUڤldq",CQ/b?.ʹKˣH7b>/elaW T#*v, 0XF3׮,=I"e_'639f4Ɔ%FԘ*G">i0-#3T)8#9X ")=eVƈS#JR0iIpE30Bj412X]k^MuC7y#9FCѢb~fɸ#3XنkV#9>ũۜcX1HٮϔsQ7Φa2 fVZK"d:\lR"H(h`aш0#36hfԇV"pIX6 jn [2LQnjL4`̼Ba%*QT*th.D>t:w(sGHO#!?O~d*5#*!#9*vngx>5$3iަ3#3xle1~>)Od#3qo>;_{ӷL枞:f`'|cyͯїJtuk'q""v#3hWQ1#38HFSX`VqX (GIHZb9B*k@WnFwcxLk>V惩uOa|G?v emNGc+2&t:҃6C~$m`NN,݇5H_;6}ś0 voUd:#T&m+;hjwuOIBۀ7SúwvԶL|Xڭa9odM׈M@of{y6񬰱7:XĐ;"Q@teJfŠPyAb>U`5/<5~+/jaXRRga1f8|K"smә17ԩK8T8~guŢ,2эfqFB#5;QJu#3S}yX6㍼LJ'3{l2E; AĦN>qLNQ zqyr}&[țﷃR'u:dJ/;U]ʨ.g=pAG.O#9ì=z-v>‘m/ʷj1`345?IӥR٬:&l^4Ip9½4@̶Z3+/u]k]VӰB| #3[aB#5o(|J}g89mAm&R=36߃TqΠ.5Y#3q'm m{BE8id&!zXmSL%ZWpiKW|D0TT9aĉ9⅙XNRL6=On'i%0f4٧ԅ&M-Z͆0Z #9lQm#[REWq&ँ{tuxCjx^1KW(*R]\|~?|be_6֠fB-2 [`x#9@̲W~g{8]vi rc{s#*U>\GW73o΋5ݥ'ໄ$;dw9*=d*?с<#3F}ad#9;?@QMSTuD5T?h;^O~">Y"dp|jjm&K90䌧aW9w1pހwDŽ#OVqB&ztny灲)IQ%ar(AF%{ &5U5hDp+PbqA4:4sUo#80%1RnLD6#*13$T#96=CM_0YidR/6h:G!Fm3EIZ>,.$0Q~L5ΰŝ0R)0#3TdkW"B_r.wnQ:+>H^e&^`DG%3`%x^~4!6[`2YGQE_t&I=K܂̈́rld{Ŭ_#3  ϶淟JsYSI#u)FP-u#*YwrGCM< ԤlѲSiz+UN-<:.ztG)Xޠ5OxCl(l d6Ԧ84I|6x?Gw 'ܴ$ZYDx38/,9\O|2ݧXOն#9l(jjwI7(R}2gVUGsHZahXy׮ XyukOצ"!4~kvͱQ3h#294W=(`#3{R{ghFT]R=@4 3 "x`71TJ#9M.J%1U#9]Q۫nMF_fFIo,1ט-QDVYCQv s!4ո[#906GyS 2TOjank3]24] +Na:n rOWo$HxW#9咧ׇK=}6nNtL\語m@F|G]ihi Zx6meHBsSAd- %lW9 +S8$gko;RZv|O:4Fىvߎ(gCռ2N#utcttdrNH:T,WE"řr#5fWK])V2bƗ8@%)zzj=v0 2$ 4-YV knHAN$#3Aٹݍ- 0-W)>vm'rgbn[@Bjޡfu28HYɮ16<0DnHRwۓ *f69SHq'տO|/,F INښ8xt(M9?hwgrD6zld#3x3ojqz.+fi_3s&pts(/uw;~)H@#3SA.b֯Bf#?)2}cϧgj";N^rKU9Be{oF3 ?6 EDOR @}Iۨ="Gh3ǐo\t 0y"ifزQfGԎlE8yBڅ}eilJ{,0`vy L$Gd].=9nSQL P"A#9rR;YBMC"xշ,AM@W_iRX:NC_`wEb.b¡$߂DUsY-ySBj>W{ѬUۼ΍q%0q?X= y^Dg<{I8wD$ãR`b3F |~܁8rsNތ5jgjUĨ&TGݪWb\*R }γZjXnЕ:qp}C#9F4pPtζTp^kFo^*$rzOlb,pQ#9]/lRP%aG!y0kAܳ 5UdY͆j0YX8it-%0uE唰\#Ƹ>I]㫰\k,!MOjC1#*^Brp`􀾣8heU Z\Y7AӘ5b h"wBJ꽇TnL%hB< 0_{0W\؝R)%IDZ㱯S>uu}VA2ݢ#*r 3Y%ѕ_I&5Ӫ67;=qeE3SO5""'sj^4M*aFf66`UkSZSjUm/)5w6dQuy߾믞w wjs3;g&^H8Vs{qǕ*5Th_tR$={>*,;NڪxtMZhQ#9J38#9c)&΁-b uimUU!fCW%DsS’7t0B }g佪uJaC{v7_fyQ?5oVv[%`IEFqxp#̴" fG^e^.VҨ99'+?BΟ +y=St~8{ku9lPfDt]Q#9Mwn8GT"89KZogfSpr^8#3)˵/m,%X`)k+)=) nz2uy_r@(h8_9cXy1L6PϦGRxw]Xz|b<p_8{@[%E9)t`5XU *Kss6_r z7w<97}p{s}2os#9OO'-򛏱;q`LT:6m9M"e/o9e5Z|jUL$NRcv.rۋgSDMb#9w4X#w CO6\ō t+~ՌTtÁ"ņE43NbnIS޽ٕ]эJҏ5Hejᆧ2u跱ҼwP0v#3eY#9Q@s7wui)>(XO3,#3q^#9G7$ϻf{[q>q _m@#9k#u#*ͱRjS+S|౉Z!?N՜ް*CyP5Pd _)#9vWcQ)}~KAFJCHjH^emg ͔D#hqX&&8'[RȎi6ᝯ+k#97mVIJVSs9/] d-:fë˭I SMTr\g()ٺvZX/4{sOߑxJ>oPΜWG灌4f\2yoل0=bnXH0=">Մ߻M=&j+񃒧̫7}T]C۵lm4YCGQ<]#9د`v/..NAv +MvU(R)T%MѭD+Z5wG;H ]V<8dݡt<&ݗsdY 3=O5KzRIcr)棟+co@k],bR :eIw$]]r%YNv|i3#3:r}_+|O]nwBDq$ ֟κ)45mlm caۗ39iQ6fv#|gen7#3~/66ӵ\mL7#=oƐj-ы[Dq`|C#9v:"!l5hhL=j0#â M3';FΑߍq7G?0rbAͼ/ʹ҃j1 .+? Z3t y1e7+0\6hRe;^o$H#9mtS a Xu= [R١.xj.у@)ȼrg\S; !#*Edop#9d c9&_x7y43x_#9s[cWdZ%KM~ls#3*I>(<7mb#̶j=ߞnΦϧ%A7HG>,q=1iPNW{z5J#*ks5)"[]xX:pu|]mG䇷:õPJjL:mOf#SdKБn-K/Kh3q~,r㐜xF_:PN^pK=lFɇp%,tFn_\T RzRHr>s=JC;#)))iP]z&B0QnJ ySש{5OK锫yj޼7әHb#9H+ˇV>;N^TuL鸘#*Ŏ/L޺hVփwmE(VA,.Ԩ(:#*IAEZvkx>\6pPA4Ymt#*XYU4Ti$[э^><Znei!nU=n4JN/ֺc%R:3)>iJL9#9@Z'e8Wku9˭|@ԓ< ?(ty:a(.[4AdT/4Xos:mHqp(kLmɖ/HI#*`o@qvgnԞ&,Q)wsRguvZ?y#̓BW.؂[|o`FW8B&ތ7̱c!TiVVޤTI$#3JeBdk7|h\Kfo_}||\RD䜖Q )o;k|f/>!gZ##*w9_Gma􅻂3אm?}`lXLtcL#3.;ՂE%~ ‘A\%)w0'vh TKaP->YɁđ?G ڢAдF$#3M"w#9Dh}[j I4*y/H8$*Ǖ-kvC(`L$};(;6GΠJO~ =~9q |#3#=Eu%$Ysf>s5cJ"&288N_II;(q͢ PB #3ꜤhXږD#aLMJ?U!&Aim~_/:moͯ2! cPɄ(\bC@qߵR,- :#*fQ%Š=HӶ>&D.MuÛK=*5#*5Q5Fs +%-NAևsߐ+%: \:n/ c<`IÛPxJe6WyN@0L#*2R!6 J\x2@;-3t \Gv Jt+(l#-z/0t|ctE)ð'<@B[Sn-\NyL҂<Vn!@Crp}=BT[Ǜ'O7X0f.'8fYwm|!\ LIG;!`KK#*m0MhKs\h.IvvOYD(t_тt{6͐o¯SX!~ezT K|L$Cn|1}?.WmT"ɘm pALÝd)?U<m߶h8,?HT~(!eRwe켨Y#3S{Tzߠlj+nK$#|`9`_rBQɋbZ,ew E#9#3qnǁ'$[#*nK QprP#j/0tng_ 8/4{[%&⒒dWw,/m/z9N#3vјt!KgRi%F*FeQ$Rb(^P,G !.C Fv0w*)UpK80S{I#3'#*ó3PڼnisVQ;i`)D}13GyMTm#90)(ꮊrp 7`ʙ< !N*ROt\lвoR@tƨS@Mc}R\י-nnJAB y;N\M!zfӇd]zt`aZ<#3Xvz=GϲzxvYQŃmOAFrP`\n>b]m+Ka#9QUPM.Cq]yԐh4dYsSW;2#* Al#3Ac!j圉uoSlzCwA̾ ٘F;=GV.* ፞’1SfZH60ӧn-|03On _h51P P`WE]JL#9J{ !]H~FP%1#9#9GR9) ]Tϛ5I) EQ{fJl8MRal)Z#*)#9Y"Jkvߡ;u?QhJU`w~jSL@6S.WP!taQΊFI=^HLT_؂o4R{}'ݻO~a>tR|/?FK~U}#9jeY($P?#*&>A@>c8!|;{.{0VAE>R"w(zM#_0R:<~oٴ|FhnE n#3,R, 򉏯M],(z#9jvL 2UHoO'HR߻/YCb xi@u(eZ}#9@3,tYwwl4gaؖ#* EwBј1RQ&叾#9!%) eGEts)(#*`V b(j5J4/t̶Y;Qa Dܔj$$'T*Z-t{I>2;=++   ewol8ƶO ?|Z*ۥ.:,l0E*><=4Nz_~4To*-b &Y3BsdS]ΣM!+AO={.l`Y}d#p@ 6[t|OCĸaH)6~-DCbl/;%r,SnKGaH6kOrQCy`2%ee_%\/b0u yVR*8 *©h)Ӥ \2NV0RUTpdCFjT2YǥS8:ybl쩢yZ_ΝULBgL8|gzQZC1i 5{?0lfоmJQ!#9ɸıXhɢE $%3JkL)^}7著%UPU0Nspkg;Hrs,繶\LL tɷ#9B*TqHЊ%Ev{(`m;ῲ߷]Sxޘȉ '7ʆ{Ý$Db#9r60NIxbV}-H%7 ]!;hgd.ô5IDq#*z9Q#9U#3T ԀF:m(oqút#9MrN@T¤I/uwp'rM h0N|yY l&UgQ4v#3|Èr{Y:MJ "0c_I`ƙqBȗwGY!D'"H_#9=1΄@=WruE=P$:b/vٺ9#9$M7}4! ]b=ۓ93V(>QaAU|ZƐq$8BTD7se5;#9h+NئAV)YrPaP!!~K3}aͦ,k^O'ciޯ"r#9: g* tze=I#900dh=td#i!dK5C&Nf%ڹDRdlϷî̉/cyL8` !DC^+|JNi.(e#9cZ:?;O}(y,dM8vC]!S~L$fN|,LERʂ?0扩UBZ [/cE|JN`hgDXo#327=_8t c+Ђ$iΫ2;bb~%,t[AK^<1 N#3Lzs1Bc8v:>f)*scx*~ -z 2dq#ꌖLn L4AO?m.SlA?/󦰼JAQ,兹޺OV/Nn* ^9ݳZmΉac:RU, z\æɤ#3VgB\exo9@"\#*?og#eV#3c,J~N{K13/ƣW7;_}W1N!tUXR"~y79| ll0>(Ll=_/ҜަrL$<#9p??$}PT!~@=58@_ВQS#9^T~A_CRj˖>//tm+םtAG>SzG : )5Qv~eM=.9UΌox7#91G̳%L_Yֺn a"tGe#*JggP܉WliP}8AsպT?*ujƓ{vVK`Z]ӌ4=AV^#*#9@+xT[G(m.G#9e͝XGL}?'leG+i#3(ۙ[K @ª17|}5Yi}#3{!:~?FjLd$PMh<~?jgGҿXROSb{j(-Hp/B>L ?1rOMY?k﹪S}xqhIlz)TWe?^ vO-?4:Cc/_3_\}x5iDY㣫O<:A1jyhwzjƱq*iΔ#g/+ca#*Q4•e#97Vy{>+Yvw~ O/|#36ε{DϷO!LLD#3"17I*7, fZ|` 䢺`)aT>,$Wva~p%q#?'ZB?L-gìB0fBf:w*3 96Vbm#9Q9x?|?m獊SP2 g#N˩;q\q`T!Gsg9=6rsw!<촮}}P{*w'z}Ò1OMr  1bj6 r/װUA#9'TR 2ן( #3T%6/=#36z4%.pZe?ǟk7 P1 v~n<.}h)6|6 Ȑ~]sf7wgDf0_ٷGGO?$a@ W:#*י`|7lÒ_t$El-ODn"F_F7e/P#33o0au}%&}/#*y}\%$P>6~fBnLW]03{agHuͬ_k'9* 1C{)UR0ЄH?S)!#9v#>{6?9X(U{_{>p mVbAC+>W970̠3uNpϝoǓWWYR:ouu,xe\jUly`i?gQ٦fQ.`QA"㧛הA#*/~5&Ve|x4U~=MՔTQn"Vrѥ23d,1k2(W,%MITܳ&ҼvߣNOxjst ٷ!~d*6ˊ bRccBX}w|3:+9n}"=Vc.wĸ;tv=BXҲw#9x:ݖ4h4 tg!.l3+>;ht&ib<ԦSV\/0XK:=}uDJ|)#3jBL8@Cn=(QZ+h?>s !g5T4l<+Y7~x_Ƿ!!j0iNj%$U}]'m>5h5EÁT }xe#9|:Yl|QOGI~U4\7 ؉1k̾=9elQnoZu#9Dtw}%㢑A[s$!zlc{BPNOst_O7g1fe.$A#*FYK: *%䷲LʮDrasJ9Qk3Hs+4.H@lt|Qh~ܺ"X`GsvCyW=J H#rl;Ӵ#VS&LoB$ WA#3WbC„Ťk`P٬T*bCڙJS.;h.1V|~3n/'峞NfA;a\oz69*"}{݂_K["-?{$p h8:1Mgȹ3IQ^&Q= L}t~pD;+գ+#kn9m_GŞC%K%#9 5e/ָBut3]73ސvkR*66c#9W݆u^nN{#9E̲)#* wW<#qO#3;2TF'S=tÿ#S#2ՕOeVm I;le 8Y0GN3ٕ5z>ë˷%{C 1Z;?<~&xOMuGQ]] :y6OܡLۙ$eո8;'xҋ^>:] mr)Dd&2V^Uqy< #*X˖Ĩ(0ÙĹ#*QH4<@#*Arppig2C#**ǰe^'epB{Hf#9yxs_^X7ͱ:) r Km44E=4Ffk[>;9CT~r#*$łű{f C嵺rSRT,_?i{QCkj,Q~D+&ѱ2@Y(݆lpM~QDp}l.}/wlL,&TCge;#8n$cЀ:#*j9jW$OzDe{푢' 6[`H`w>o-qxYw:{4ۣZI#* T-o[Ďb_h\Ag^rмWɿs`5o:SW'M6%*TzqP[#*im( Ԑc3␅ ʾ_l%0PnDrɏ nG2C0sS1+mʗzH4+q@)RHc04e%#92G+m*7yw\.1-P+ b#9E.\Hׇ#Ŕ҅~G=qpR9т[C7{YS&K-9|ipNkvZ7s$ qL4A8`i` pYG#*_"_E!&߮]l0DQ5۝zMjjJDY0;5Ec[z2n"[U{꾯NK6[Zt#O=qր0(J0 T3udRU\6gw^ܾRJӲa[wϥ9J|_qN;׈ad¡| [qsF٦ %gT<.XCq/9ŖZUAD'<— (Sn`sq4tGجU+o]|Cgm;a'O =NL\W` eAq'P=Jΰ吵̇A}\wiT{ &Ԫ 2(Zj\Q&~ 20>>gᚘǪO,E ]p544|^1JNz֐Ӷ\9*g.GG"ޔ+C&{slW.czɑy;gn##3$̔F}).u,SD,fXd/=\h6iCbm+PS2|nIOd#*s#*`f/#Lھ=[py-Q{_Nlr9gNj*ya4 !5:rlQ!3_$b>jc5l iS0̞{ҾϲKaX#9C!6˗%ݴmalb~O%(,`zHfHEIԒdKF,R$lx +(HAȪ9F.g -~:Akщ@"/ 2 SX9l˯ 1@@\#*3-ɒ30,k& d0JD pc^914 & 4-b60h7e*=nd뗊I@\HIǓG\_U7e\6"/Fm]$-̷n,ڼk#3hq^\A[sJxM#`vrڸJwa9."YV#9Xc ;#9n2Z#C1|lgZՎ?q+ӹg̢VK#9fTH`#**Q"*[%}x4oKݨZYcL>][Y@2T6H8D&"6[f_eRk a8OIFAjo0p)#9>ٙli5։c*ׁ֡vPh=q)Ԃ:lyZ5Mu(]0Qx0|ڃkЌ \M%x(*7e|?2%۠n!Zt&eۆ]zE0Yl՚{-pw62 솰z,y#9ֳrD$1a ʿ8t`1t0;u9O>O=2܇=Xܳp6sh(@4 PDT~\SA#pkē$S7Ii'Ցmy!lU9I#3xɓɁ %Fx rC.(B"WK|؇k#3-@1#3FDtum^%BdOfBu9裝gEqp}r*AquЌ鰠DA߾?x0=. T4!bS3e2x:h2QL2)!t2|W&،IZ6樝#3c{놑ѣZ2Z\ L&Gc_1Qƴhǔ8]TmQC4 vǪbߟ:fFhtIUXuk6_S ETy'=jx"Fd-lu7B:AiAmo B`[mXDw N18 Qn%iԖZP 6YA1:ĴpQr;nw F5ׯ[`UE¨'DeBq3 פ."K߰h}b? @wvxW^CͷTt~5L$VtFX0RA8hB暤@7튍uEsk_;vv#Tx˭PT,lix͑jhXЇ׋]a9#*VoykN<#*}3ܛB#3N٦5y^_WwO<п|'C!P.00?~07mtMgRC˔R#3K7?)UU/o,#*uU(02JW!Ƚzzח)'aC#9@@ ǬR L(bfS_%Բjxvܙ0Mrb,#*v#3 m gެ{lq>e ݡaNMpQ70;pt# 8*S46pG1+ړy,/:g^p#  ï#(m9FkjYOJ! J@sGp#4=< }:~~zo1O8I?a02)_}?330}ǿ`cڿ16uL9[Moh#3ЬlP+-"HzzX$mY?_~XoGǐ׿i.|/ݩ#1ҝȝ#9ܻk " -Rm(2d?ۍc97U WlF)kݺ&Wf^%%M)5ӌ]:~E>Gbtm=QI;vE3+\ /~JnfG3ӣ})< $ ~t7jSrIDl0Yh&_>53r/7}~4Q VxΞkx{-$}of$y(@[PI' OXKbb&!|CG+#*k;b+?o,#*r"9#*@#*lvT/Go9۠zva$ }Ëb鯺'݋+ǹ#*lAh_qcȸ?OT&IGW6`X ,!pȡ"B;sAcϥ8僟u,cN@x~;0ڧ8!#*"HǴ&S$Q)@p]/9;0#3GӣpBqOSi*~A5G`?>c&?6~/'ءb2@ w#*;ɸx,1/Z+h}'=O? U[0|Tf!!dI@~#*;`Xt@HJE$;NOcqB~2cDj:*4F2r!k3/v|ȹt Aޣ;Dr:ytND#*m=KlzC@#9s)TS:_?ǁ@ó?1ȓ2 [#4D*(([Dpuwe΍(`ix`i$n3-Phxk{}<5OaQ )dhUFm=ȕVϾG((W;Ȇߔ(T#*cED7m6I~hg#9\vmPN/$\#*k;>I!Gg"t73׺k+zwX^hڗv=sL:@\,)BBB"3ꕠkE #*=@ o2 (*MU^U UE{< 3ak`٭a]˗#[֌eb\y#IS9#*6L blE !{ #*DP}RBnFѓEav/eIol2_њ>w۩JU5;T#3 e$vrv0Q)߼ئfCjXJ#9Nd܍0 ~;Ut U_EûrKz'r0+!쭿dB5z|uơd2Q_ʣnj+km*VVjj-f),Sh"22ߙ-=/p2=>pJ#9 u$Z")g4aI037s0n#*iЅM*@aH@ P1#3%wt`qJ _J:J^OD;kǡ]!%FGQ:ypaދeizx#3v8r&|I9VȬCi!(tBy'm1B8l-*G3n[ps{L1Z<4I"tJb(NCz,=Gi@=ʼ$~n#9'Sy[>Ԩy(IܕZZy ԅ l!kģ[IVI$}&t38w֤(a]C{pKHQAETϕYnӒGaDs'$/_/6("N!njC$i7AN(OoG;2F#Iq)ch$#'1GUIQ2{+>g_G B0 J78[,c$0[@T;;4LP237?#`Fcg~IB?J^_9VWBy&#9|p%޼#*DE'SEn|udv?'AJEQ3B#9r|TW'Н X QXhM&Rd gp {R@RW!pd>uP|+jZE)`\\fǁ\Ng1 @wvtn>A(#*Ӓ\%RY.)S#*= fFاX{KYqHsP#3 "D#3@oKsp"x2 tQUS1C,(>0!@g7?Њ9vxEDToqVqj#3@*J8i!T}Q#3vSBE"3!~FF۳?NCb'w3x#9CQykcW#D?~tj30l+X#*sg75moN#KԽ:@#*+)Bhbվ0|uGX!(4$H}X#3x4TX{̊<ـ7`($)C5_VߊWA^޽)w՘3&`* gYfmGoٰl֎ʱy(+rY6IM Q+q[신mbTݒ'3qߐQzK< V#*PhxrP(v_"x@DDd Z+QA$>وdfu䬁H&CL433U4>!P2i4Ol-hjqp~WRpnޠaY؅`^QF,2O~@/M^Ev wϠ;G+k?-> ?B C ."Y OZlqP?$a6ݿ<#3ު5T$$ P펣>A#Cd6_Y1i9ƏoŒN/yc]$""!/BIGՀ럽c mtlnjqU0[#33guPhM*mfJHF0"Ԓ c$N#*PxSUT 91#cy/#OTpTEh`7 7y· bOAĢ2 w#9G-/wtK$ȡIz+9JUڸ}Lsd1#d 4vRKo9LdT%WJaxɠ0n'LԊPҩТN4L1ƬT!6|Yf!G3&ʑu -F9A4 /ӐsXE똵#3nL96YLLU4=[`771%X,b#384b1`T?*)onȧ +S֟PizF* y"zU(I:*?opMϘBj)%~H~ӥTI 5y354-(5"BNs%=<@K9t<#3Nڽ+ 4U#*T[_ـU7z?WXˆ8DTB!shb0w:̔py9w1FѦPGCvvJ0F#;C#][{ѼCΠA@B0BEߤ~4KI#*(OӇZg2Dn~;t0׆{-5#-¨&BQ3`uF SP=2>#*f}0CLW=L3M 3x'J_c kxbh22b2m|P;8i||?If5n#oO8"6 ~/6nIf-ϭ}\떷C?տ䝰_i)=,z2獝v5]Q#3#33fgČȥ.ͣl9Rڋ2NJM0#*AcA%&Eؾ ם8Ebm{u{#3~ Z<&*ƒl(sRD Сv0yc'u0#*wR1T@#*"Kgm=b1pzF &~ˇ_G݃#37bA"||SH4Eej&9I_wדkQ6P$E!"C`@AEØIvkZح-Ͱ,YoAܢC@ѱçw'7麗#3-t3-P;#{AΫ7?Ѓ:OI k?.;"ǣY8Kj#9vi>*@$Z\wl^Pv#9XĊ=Tt.M%aeBWؼJ@IRoz?.]8\ɥcN8$$ߒbхnm-}x0/5)yk#JyJ 6mpi78@# L9G3?&n#*vB|Q߿"`)<0nyHo] B!zRCƮMQbbQ\9Mdavld_24a#9@K#9_d>`5 L3YH)܇J6O1=ke8GnXCWQ|cWgGQI |}3{1Bۊ3!nM^OCû+]VO/]|vIKznCuLq룩eb%Pt㡴K˷"ݩL(:e)IHX#9~3ٷ^QXB6T'<9$7Dw2U"6+ ^q蘫o9ZLq}p`Xd~ح2G d61AX̀H }}կA!'}qn\&a"=WOuvhzv~t,R}pW->w~,nqd׃<󾱸4{RA1omUUs`>c#3#*pnr+fG5#9wh]Qi )1B#vlI*UgbI/$Cm yٺۂvb;4.qEˑ8U^>ݐT]9w?[QBN) $_$xƆ f"%^y ж6qnWBmUUe[R4xmio}HG$)ן;Y;/ܟCʹϫwZ,?^Z6pҋY mR2ԕH8460LaZ؁?R#3T-ȽW?je,i,_XA[;Ά΍EJY?OP}PQj۳~@)^A Q#32d #3.܍moh#3l[}SlrU±L}M11!ßڈ}^k#ۧ/p Bn@r 38p!Fc|&$u#9Bi]}mCkK&"̦vg.fGlǻϿïbBBd#$Boz%&nk+,{DR͹˛@ΞR=_P&iWd'T`б03XQ nPjt!,yGPHov9v =npx_#32qî<*rMPxK$ܗj@lU;ǥIh&OM նАPlaHr1N!lzgo^ϳn^8AsCXBY" ݷгr ^v<J'N9yGst'#*Sl* z0F8Nh<6EgJhp'&0;L,FM>#\tpr2pxѳO6sP)$S#*iKF5tM]<#9 i5s|8HL=7rb4*H*Gb&+V]TV1@hgLm2v:c=lb*D׃ɧ$qSE((?!D9ͻQVeyX#S Wr>zt-%per*ȵ&#3x#30[Pb'_o׊{0#8<y(#9' #!ԿO.Ft;s D[!ڍ\&q1ע*:@py f'6ݶ,B@"lݬslyeˑe1;\( BjqQErdUt6"N)@SIDV d!7o2GyDhh (BlC#*R)RxЕwGYXxNf.˻$"QpAPR#TRzQc CR Lm$6&Ì57#3E#>a3!OуI#3ɃI!̴ֵz(屼v^КXNFm%Q.:3q 5Xv`Cd #3ɃrHAF#9@s#3D.,CG#3U?#9~d׆s7k&YУELJ[Hm^RWv#* \˔9QE\SAʗM|^ҭ^h#3"β;йV6RWϵ묞j֞oHcHhbI#*Hn 4tvw}&eY$Rr܉P@9c F0RqAL&HD]z|KaI&)=鵛gԸơbge3$0^{גzx.#9뜁HzOe\!Ե)_mg޿76֯6ٛ$:(;^C=jPAmċ:#9t̘~޴>i ))df%on$-e*DN0Tǁ&7^gƪ2#3ky{`0#9#ެO/#*|9Pd%LVpcǿXI*(WޒEq# b%EQAiA|vРoCБ|yMuX+/;$#SC-G!"8K~b 7Sz47] 3 [jk}:X$BiΓJ#1-܂_SQ?z\;0\Z,CǕs(ldRaVFѢ%*KM"pt0SK#9K\S#*Gr!k/@bKѻ(ʸoo#3"Bo#3m֞ڐU|Ip<k;xHK==?Xj@@#@B@|CǃߧG ߲i䴮M[q_͇mix΄GҬF#3İh;#wS|z׉4=! U*tMPJ;v[.ǗT>| (#3 |": 3p 1"+X+);cL#9ץ^%d&JSa4CJAϋ_*#9c2FdUT4yowM_F%SQ)@[ 'H 㟒)*J @'ڌFEɶl6jƒlJͥZҩ-$+YQJfUiլk2BE9 ?V}ybE#*` #*s 521(H$._mvϙ* >ɋ+w`E@늣D,跤##*;#*E1%`e; XO'L!ВE`Bg6ǂ!tl`64<%Ű`!3iBY ZfhiO\ &ڒ2ml@:T@#*7#*Ae@< |a+`nX# ,D+(Q,D]NHgGd%JuƘ2@!KƩ#*mlRm4\(VmnjL)P[3-cE}wW}= 7.4H*9 j#}v__1q()F\"oY' z=#*H# T-*' "9q #*,w/#9#3Vn%Q w4E[I҄`ϩ*!#*UL4>Ýq<<;MnT]CCtE[1>nf _bsoC̠fqWp4r!h:+ÉUhE4P#\ooNgEQ4k:ACPClBj6Qrd#9d*[_0GI56D#9#9R&I.??.bwg (#*Ri:>fVΗ΃(a4Bث+ys=D6!y=룘w/9j}<>AU%Ny5ֺ5|~̦AUBMRm#9BЃ?W"H " #*X=E~]4Jkr wM ࿇+ߕnrq;%#*ʣxȾ`UJ%R#9F9kDp`'(;7;}\s5PgF! KRz$DcmM߻՘f]֬z%s e#9(}% n(Y;˘>i#*"ug"A  ,GFɏJ,K)rKw/[8cs(* ·wY4>mi&oqszGKn:v˧cpqF;jt,FCnP(}H'mO9:mG+6#3ץ^댩 7< z A-nu&ڃM 2d|6wf#3ߥw3S(ջ(RnZ-F GFq{xbjnQ^VaL{y,22c@#3 ׷s!9gw1(R~nѶ5vTzݫNYRO0K.VrsD! #PrIkg,wgV#*ᥳƲ:$]6 㪁GCq$&%:"Tb0vvxϫ"g_MhYw^+"0F;4Y,nOmcǡEJ=|7Ȃ! HOS$Ξ?GncnSQ10Ut=2X9Mv$'E:x3nĻ aG95ԑ'"wۥGOT`%wf}eV ., t2{6ȍz= p$dflNABt+W-’˪1D.s43d\G]]Mrh,ԌR5 V* #9(X"!%CKX"8\2Ƥݴd,i1Xa2@3rHئa5Qmi_75pAȣ{#9lԘҳSkGxf?>z[){5֑e#*(H0E!@BHA ;.Cg{ Uwl)iAaLvV 3%6vՠSP#9g|uYV}J)FnIEݗ#3ShL+f@ePOL8#Q-{@S΍ǖAR q#3:"!ԱYTA`hr#9"DR@iKR@(4,)R7i9~S4l`aP#33nN``qP@̌FD$jF=/uŊe$v! wT}{1&wj&7=ܹuk`caF;1P DE7?bWm)c[bfUT& (2$$=Y#9븸O&_'"+j^2X|N60n'z0 3g׋p.;I(D\uӳ+B#3|]˜#ҐS}Iq!$ދF1?^?]p Yԡ*m\KGrAjNP8d#3wE#*sO#3pO!j g#*b:DJnA,MI(rK5PBo%JNR1F@$K dN/s{_>4E[9Uhoz .#94!(.Ef*`7cq$CHd($l\C#3#3vBQBAenQlal&匐dh! F,#*$PchFrj0b^FᝆݻOT"SңJ!,x '>fʅ#3Bm%DXxXd@ Dno^pov,"2|6ws?Ed,}G4 ~I8Z?9k$,ϳ_wkfvm66ugLx;|3X1+3A7j`~y8ЉlQ@DF|= -@0CPzNa֠]! RoN9h#*{:fJIdNM.*(EcA'ș(&K)`6>aETq $! uAr@IlL%4gk{]׉u7@f[H0ڷZj*"K_ƵtBbN~E @Ʃ?˶d0SdD6RD!uU4 <#3M,V^""sFB~(E\`<9SHJXH΄mFDǸj(v (bl!IyTW*А5$N:BXn[GjvR#AƆ-n_8dAmYϧ9,$&ј\#9m#9xa]@xDΕ_BϢҽ2, \͒TRk<Ac&Y#9b0G}C#36)͘z ̍bi9kg]5kyE!G)PfRHΚ0hfUh?o[]iy潥5ck*6JPƵR#9돢,M#3g46p"#9f50 cU{NXEBl6jV@C#9QV#w#F+|o2|wLG=zFmP\aaWsj.H ޽.Q#T<:U:}e$%NG9M(MӾOm-ZtB]#3ڃa$*LhoH9kx\U7ї%e(W ;[dvdu,!*Y8 &6F MrYe0% mZ6#32#9!&,5022l9t#zfpq-)]d'5*)Pv-"J-#3 #3 ]#9 d3+B6]1yWRxnrxVc#9z E/z#loOP@.Su9ria:22N -4+.b$n1>k48#3rϗOf:T#3˔r"i`#zO|PCCSng7l~u}N^=, @`dM ">a9mhS (&1'<4ϗQfXD15BƎ$bhC@BAe̸) J&xsMΜ(#3BPXF 1"!bo "a0^%r.9H{<2McT5.kto&+Ph#ʸYZ*_[ЏkMn#9z%0ң,`0vn$ aplY&Y.r9#m]DG~ĭ`;8Q.XހxY#3#*[hd<&>8E^4]"upߊ/AP|snHe7O ]Q&X,.q aL•!5-׵Wc$ъFRHYRTb6c-2on͵>#3o*ŀ#*&iOY<ʩ =z 0i ;D$}L#3 'G%w|Ā}M\M#*'؟pځ̬guPhaz݂%DjAY#9´" D#"H\(1zN2ھ*+"${nI*"gSqObxq FDX4b-i{ tI-ۅiqBi҉]+{15k.R]i ePӊ#9+G0'ɇ57e$ԱUk|kPK溓ksIDVC):( Q5. l6 "=K{v-$H1䙚&B#*ue~fj<[TwC)14O1W;ͅ'=uqj9Ea$x^vpf3.4E7{D;P|EG!#*2T#*L ^uXKv!RB/6I!GP;+<41uA[gU~a+Oxb6% ܏ts;Ǹ#3ͳ6<@^(*,T̉LԛdyLQ\D4WCD`jJ jo<#3#*6ld*Uar@mJnm'5#38Hf[ɭ$$JPp'ajN![2$3%':N'n&s#3Rdi3t,3|=5UjJKa!"uffasZч1%d!RR3'_H12w^M æ5ݤc\^Jrf<;fH^k* YJP4$ OUFbv(Ⱥki[{P#N/hr]ua}mM{5ēV#z7~U9栙_A:#*2M'G L`xLYӺ؍HM9e'Kp<-A[}u1v#94vL]eS4`iw| A:8+4(w)SX0:a(i̴9dNjREITiEûc _V{OhMYӃ =5c#0rOKl=Eq;5^D X}4eEK؉F҃@Tñ߈/(o^#3x>^w%xo6a 7QfmAnS$1'scQ6lzȱE-bfrkY8הS:w;BڌdΤUnނ%#|OmGJT.6巇.-B~t%&,wm#j;PFvcK.8$F1ۘO#9\ڛhIBgdwr=]^*ɒ&1w#9/Lm5jLigV4BG[:ewZMQf͓CSDЋ#3ٱbB2kfbf.YcDI4u* ,X@8jS mb#9e74VWnusGC*/Qpf"uFFD$$L&X|AfW=Nq~^ȋ'C̕<WΨ~I:a5ffz)J)\x3 .;[4U:[iafD"a:0:oNKCSd[]6s#*L$:Z/ѳUVv:nЄ1fu٭DcXKh7KxH6:b `U>G0)xݤ&.>̖aoh.3Q͖#37p}ՋyyY{lTvYǢ֘ƹNqm>;Ynjή !Ņ;Eڜ;|>oY[&&fPdx61o Mr`;9afcne2a48dGN7xš#i$#3FǜL%+8YǑ]ne1dN.kfλfH奍ͿJ:6We$>u8YU&dG=MQ\@媫0 cVRa騒(4v=7"aN(J0fD {yͩzX*mBp"8i($NV3L##*qFXrm\1&ԯEKӦtWC*(TXkap6ab]ն*<&AKiMx"`Tm)L;ڎ؛fG hPhMRAëӃ";fmK0v=IۃT .AE j0Ґ#9*R@|3+R!Asɲv}D `2I Op<6Y#,ZduHq#39 O|[bhsHlLb0i0bg5 wtV=d9$^3O@ɻ85dцkfa0A&)((3&gJ*jVS-I09Zb)!tKH#3J=Y(00u9W8#3Yl\D#9LSi *s@p7#9p)RfE(+z;)6ʹt`NLc(33љrC(*"!#҃5]N06L>8O#:nuPFjfcNn'[!͎ @:б!Ũ mh2Fvbj`ӗU#3ߊ~@4LbŐ]".kz-8;ÖQAtz殉#9í/V@ѕcwwcy[ePMSGi3P4p" aNa!]HSo*5BE#324I4 (1H#33 `$-,iXlkF ͢gw'\$]#$#jHcf-*XŬ;@D4 #9PB`qԔW:tXgű26D!.4ˆl6YriSLa64da3!vf b#3V9bP(7b$cdf2 NLn:q- #ɕE6!`hF8m\L4cwHsC98qIx6a4Ttf!bp%s3T2KߪŤРp81MT2,i4.f:2j:.܄ظ20C9,ia#*KRX`m6RC,1[sFY͆q$Hs[0ܹWY*RLѓ5fUTP#9H mf@؀q`#3*o0D3,nD~)B##*A&r( y뼫X%":AgX0S W$ #3Z[hx[m @G4@IH;ilMZO>?w}ލه@HoT԰k;ZڒC7D(hWY& "2x/].:YkƾQmEMZQZjjZj,GmrA7Hz8Fosr/Rr>sN/#9]ioY_KqhWFIQ/ $或kƳUNCQs0鴥['̧i6PAZ*A%.Uu*faތ .23p ĜdB9>X<ɜdr9kGѝf- f3mM9LNtDt88kT8& v\4Ktm528SiSk&'m)7\tKxMG(3.^' .ۙ"ӻ#f*}HyNaf]%ЭɴѨZz[NMyC;dN5j|A3>a"BtWOXE#3mC`qfr `͂$"0aĝ clJPEPb,#*Qi~t#*XⲑTXȪRR)p0u@hX26(1$4I$Y@X.#9TGwH"7B%a).G8,hX9"bcY*#QIZٯshvͺ6f:Ven(BYGm/X,r]m\9LjFDbC[u+pخFѠeN pɴD Bb⶯)[2ԒRm6eS6mmeMieVYܯXdb6TZ%ET#3-\f#*4Q쎗6[ ;(u@QK ʂ?8ى0hB'l# OaTB`TG(ca|,1:FC#3?c KCрBf>&߳4PX1m_F~8?-/ΫQs#3` ;z奍b I#3&dc6M'O#tn ԛLP!e@` R-I#**e"6AH6S #9ɔ0`Poh{_-L6!eؼ}Xl,S@ᾖp-"nom.%#*@*ԩ| w"@?,j$׎ow^ ;|#9  #32ƆǗpt?: OEo\0z)@K7G+^&xLn#9Ѧ:`+aIW!T}n$gb0 lN_#6[ $,Us.(D760gM/@VDѾ?86UYTȟ|l!]G$c,d˕$_#9hQLbIY~^[NZ*w>yIDK۵DLomRԖWdƩyJɦإ-FƤS)fdiY)K}k)dݛnM(66Z'(jWuj{N5{SAS*-JkRU@jhƓ*]mƯ~k]U^6ZHam5MIfɩ[2W*&ia T[-zvR1Dgw$Z;&̳]YJ]e,%[\HxMv1j[m,9p1ǜ1kr=7X<9 ,#A|q:pU*^Ќ\^EI4NN>0\Dl2/>s(کŴaUňRLkQ#*,@wLԴXM5mF#*!B{t,ޱHv2NYlҶUkYvZkh(TYk*%P Mvni2R*; {6dfR3UBQIMLɭѥJmC IщFQ$(m-%M#33̦(,F2QM$FIZ4XbJM)L5J2Y#jQ#3ͦd(II&Ra44RʳlcTIVDRdfieX%JRk)m&jkkҳVI mk͕ZXڲmmUj*5(VUiZҥUoh#*N*; 5OHsv~O3xqJC"A؝l+NZ=646cb0{$?ъQ5.C"a#*DĽ;yRhyOGRRWw#*TM p~? 6냅Sjn '`#3~<} g &u4FL'#9$S1<(};5njo#u.Jؘ/0`;AԝD>dE76*7P -ߨ3ۿȄT PU.FƩ)i&+!_c=NC|$M*f>wliI tg)s1{V#QFOabxfXPe`#3J/jPtR6W0ŲiF#*.#*M5T`|Ү=NέZ#ȳ-=l  AdAK5J+z=hi " d^!&yL2cVN %>LsYTb76٬x^BBa':ځ#*Cװ9M}/r8zyo;4u#39x #* j3x4H~E*堳@,PPYf-a,`0iTPț)2~MWZHʠ kKMkMFhX=3S#3#36C=,kCh6 ʹsbkXc*e)զPlE͉D6'hnɜՈ慊T1*ȣ]I $eѕLHkHt_lBaTv#*,]R沏B H#9ŹN5,fހAbVeMTLXBUgr>p|'DZD=p*W'AcsaBHV2#hfo=wKKYKh-"Jpm}C+h,Dp";g '/,Y! i1Էh`/Ww}U%O 'kYikqɹ$hXK8BJM#3QM)#9M 2,Y0n P!+]7[es=+OdAT`$"Ƞ cgyq$P#*P7'#y@"lR!94,ݙcg#9*]ͮa,7#qkrY6JjFt@7 GAnLd7_3~+Vv'۬υ}z#?;^A($k(# f!~Ƅ_3{#9g7z#9i=nr-#9ϋ9AרӨ@a$AL@c2p@ 'd?0PNp:q5E6 sHEp!!"H qRU)QDJ"P h @Ax bPLJ#"Y«*Rz6Bf1 4+K]#93_u94}>P=;UOyԞ䣨9{%)a2_*~{/T1h &hhP&Q@[x׀rdPhf| %6NYxedD"vB1XH.KmWt0~E""vY( H,TU#95-4:f(6b݄ƍ,e@2#9$#*I؅GULCЩKeRniT[kκRʂۻ5Vm嗧DQlJQXLD/CLR55Wo[,ĤDFDBʛASQ; G1Ez#ΝcbMQIW0b"0+,ITRG4#* e`ɖ@29$F2UWŸ#9lOFDX$51Ju#9Rސ3#3ezÒؤa=#*\q읳ʫ8v{6>,@Ԫ @,}649y<$!ybt<>LY\u*lדNW ,#3mvbEJ@ipz8&Wu%`{Rl㷂.@ (mJb9#*?r#*8|=)$ #9E&<b7h{Q-o_zde҅j9D#3z\XJrnaj-4I `fOˁYQY#*Σg4~#9(jcx,T쵥QQlX gNž0LO+F4L # J6HJK3b* !?_s+遨Qn"0X:(;l@,عC;/fJIa:^Q/U[]Ϡ[5xuOHzreS% ?M rr≀a`h]B" j|oW"'p4y2A@ ǰhjis>?ACG#*  匠7/,ΊcpqK5OstWJEkEi$4$pI;9ʢ,XKO.}6yFϞ2DE4ڽf@ZTÏ)It)yCe 's>0#*N+k PyqqŨV4ME$ZYlkaB7oO6#*sY{;w&⩝Yć6a)U˼&.4@M=F{7NtEX!V #'Q(c8NY&Ibi];,-|:nW\i;A$m&IJB#3X11 F!d\UU) &#*` (^hBQ`էu=R 5&?BBe& Ҫ(A#3$ D1JOvGScG24H1C슺`H>>h/:E#wQFizUXqo!ŗiY5C5[kB!9a Ӄ(q 3c)SmȷlPPh#3$8IIBA`#3!IhXpK d'aa[PyL#*Y@:&^*s&>݆[pA 훡3#3u7b!YL#*HEDP4]a 0ӞJ(l66LMJMkA6AGh0{4fvox6p&"_ol$#*F |L#3D)&n^+לn6ҶZƒlkFKY661L5W.P(!`:h}lXN' krJ4SM$$U_&!j2[ SV1׍"0l$FmXܗ{oii担\1cXd#9A l#9dfFJ2 ǦwwhǙ͎3)((DlI) ͹VuLX96E-0#33lDHݵR^#9p6]@TGwnTͲ9PêPnb[1#* 7(x' o/iL&Đb;D\t1SÓİ*oJ([ޟ@j]th#*#9ЯҸeV)Vwuv: jF}X3BZKlL6-&FEeu֩|E^+\j%D gq)?[Obc_)90.lC7rێ%]ೕJB:Of66v1JX/U#G/c|LwL/cBh A)`2AKm#3\[4S0yҁwD=`vP#9."RQU2 8,@YWdҨ#9DY!/Th"!7v^EW#3p I-G,l]6URsh!A udeqR$`i@N#J \A(7>d!QD8#C(}Wˌ"S<Ҝģ>i@{n5LŬZЇWB #*~x?O]X7WztTC_}m#3: HnV,&q4#PbKT8i0#N$[~i.>XHkҙ! jOABX $ zxġDN윚F"SPir2;,V#*#3bFJ#9K4AUZkUlhf^.^]Kun[,bSRZՋl`uSQ @J^cPen9.EIA#dB jD1BkӞ f}djC!`<NS{TjE(]O!i's d(DI'?%8Iv8hC, '{vHhlt!c#*)*0f˓|I;hd3;7(k#3ѳ#7Tip>K"OPhx\ #3Kxh i6b0<`o2,2V1HZX g6.@jp#3O̝($u S$x&{y(8.  Ii6f^B9if] #3~ݍ!2pG%[a"*dvhCbZGhC#90_IA^SQBg媼Cdc;Ih|>cי!M".uݽ[䠥6Z۔|gլGL=?Ql׭6$Aʘ L\9FL@ej+nQݗS䚏#31z`vW,@&(*Ǔ8D@Q<'ъ<9 swF!Dz5:spJfaOnihUzN5fUjјAIL2#9 6L\  Eڂf}p529#9]B@i1Ta\1THf5M]nVλJFԤͱPh]u0&}<8#3&7f0cIB(q R#*2zvIcnMb`0$B%Zb%#p61#3 FOU$?-̄5,`~B2#9@"#3yՍ\ٲZT&Fy"J޺H_.FJUatCPE#9@TV#*#3k, VcT,qƒu<53(0l&SSC)ũ$4be&FSRڹ,͹0o^ӷWi^vݞ/^M*Zj{]{=iMȆTlJPh^ 0gaXD`x7l@5D$mqM1VN\Zi48!h`kUkHlik":qy&؍С MѦ*UE 20c7$Ej"BJ(vrĎXGVJiQVwʰ))*EE!h(bEDZIDJăFC %(, %1#9Eb)45.vY#9in0-$Ii%ehCVc*5Iꠌ1B.q#Q7xcy ndjqڡǔKLMms.#35d/>Ʊ6e5F #3MڙxljE#[ҷ:N`(ڙ#3.#3V}w|K$xjͭ-`pcM"[f71*;aX))y! #3Gxn$O7Bqhv`f=i驴I#.d'Y}\'׎ADV|XWL}2 ,-tɆy cdhU6iu*LJnoY!&sYl=Pc",]Z(Ԛ"X0^/Քet,El6dށ )Eݑwih4(=D(c(3(VݹGtXi#9i8)DT @ƕ 4,T,HF-h4 4 "b 6bK($.3Hf"B;@~,$c7uKhed3SGv#3Ѳ5ץx䢌߮/8J!cO10=h<1}7j2, |= Ƨ'q7пu&qcg1rpFRD'1'c͗48BEID!#Ջ@kIbB(Ȋ207iK D #* H0@$6ʔP2'RG#dR&t*+nWMKWxmu˦nW5;s!˶ZxfFSnqݷwjũ @4%*B5)^ybU^5U6!bX6߃б҄rE%vY*#*Z@4# 1U#9Bi#* WH!H#*"R_-ܴ5xֽD0 B'#3btWKeuf[kRX"zQJUiF,m3EFET[YKAcFZ6J̦ɒmMB6Hƶ^v}7E4G_Q]qR#$*0E\ÆGc/ZK'RBȡKя]hǔ qoNbE!(L726hhU#9O-oY[NκvZۘ)-\:km6WebU^y6n?!nĘrPJ||*S y C#*@#3GBBtFR%FI#*"2#3< *IF㳧 H&h96P$51&=M'=aOOk6ŞX,p\9Q@ީ% f i#aꪏ;V4i0f3}82&#~ H͒9S842[85]&d9&y񬖽K;7BUhĘȞdqq\f[~ѶU8huKEdsA/qaKxPWIBj(!́#*ǒY qYlzT?ެxLU}&eꕵRC؞FQCPANQOIklZS-46#1\I\ rh{:j-ڹU")Ǵ:.H d@:l"![Wbbą#r SUAK1kRkc2yyy5]SD#3 >ҩY01)4ҔpH¥8 l0b+m궷JْQڱ$E"6L4F(#%XEA2##*d83Ƙh3QPFvƵ+CP9m%- Xa#9Q%TBBb@Xn#3رv۶ؐrc1-F|8gD#3s!杯P*oZFW&"UX;#*"x}$ mU:d\#3?>9 Qк0-~{Q{ 8_ /3I:3^'"#GK9}ɓO~X9hSDudlFA2˗#mv>&=]5,ٗP!{B"bL;i#9CglYk[9%! ?P} $BȻ"P)X0RH,{#34sl,@)x@ip׫^ rNI!.Vs~N ڵ5QåX*- SsI '\](Uݶ[L` %`*BQLg,]x"e MTI@S)aھq hͧm,himd;^BRdQRȖDFTZ/YjM(p،%͹\;yv㮺:bwvroMl۫UfXZEmQ[[&)ckSвm&tnݙ\R*.uEj-uf@#*u-K(O\wA܉G F=#*woxxBQ`j #9's,/S՘g{r p}E < ȡ-zG'5#3~ʶydmm#9?Wpsu,AW&0EZͲDB#9ePlm hС-O] ?%;!" D"F*#9{ڊF*5RmbJ#9ZED$G} ЁI!sɮm.ڜK5&y6WSy\04"F2BXq"UjrSFZЌJzWJL4#9{).(F(B0%NH0md^Zdj6R4]+lLQb1 HG:#3ps ~AM&w(8`0bJ!}`6Bu^#9* ,P"H*klMڦڦԑ`տ #TճcMLՍPDNvWy#R;iWdMFkCfkl%&A?H:dm2v-iv{b AN[YGQtm^Ӽ(jI&ԣ~FsYM;ݾzْd`?@25?Ib~zAw,1tj/PD!v KY4-R.#MGФBHN#3nrky ?#3{#y3^`,pД(]@PC !R Y%`Q8?Sl„M7AMjk%׼^mҷ5IW(X&m-Suf3RBWA*0 13eCf,uYhXKE;fR#*c2)x*"2iGTI$L$+Oo`ig#*!tT P@{i<.Zd#94i& B?q`U0Z KJ) (tD*H#3d#3)#CSvߠ'bԲq0 Pca֜:ʉ A!*~5ȰHD+uvb $5A~ֻKڸKRղtwU@#T+!"@*%Tj"كdj BB@NtRYՉҐ0u%3OBsp`FCTB [B9Rh .4J,6tbY [ִ#3jkxK&I#9FWYƦcm!+*ClVû˼U#9#9i|y҇Kʇ]t=wЙ(P6~ce4J*;lPC-7#3) !#9S KS#5d>sϙTn:c5J3Mr3wDșC#3VfZ\)#*c0cFӹOP[{a篿CC#34 Q%Eh&vW9eN̴}$sUOc^ϩ{PCZ*Iݙ$pYT VTKW7䘡YmVЅ9ƇvΘӗ@+77]ήƽ+Ȭ]RmAe!fG3C&40ei5j] uLKrvUzZ(hnޝ8o+LhMO#9x=gO4{֓́[ŕ]} #=2#3w e{[+oaNP4qLn#>һ< o*(KG!Pubގt#38!=dH!?H0AV#3ĂH"ȑR@߼\#*#ã"{+zS!(q;"8ΐ{Ӷ\@>G`[xq :[6G6ǀxe[i4#*AյnbZUsF@R,*~!I9XD` ;TUI? ]S{"NBgŹnZQtәӕgʺ ;R1!2OG[kV6RkE6 A@jpķ[f~|!@o76VmB#*1XH qZfVRE) HG>}T@\?$E#*("Aš@gBdn1?xP81hf}P~x_Oy#3|QA_MBg)55av_tkKNq5gv*cϕVW I%k-#9HW1g~Kڊ"s oo22A'2&2 {0UfR کeV6z#o#3?<'BTRBلt#*5.%#3]<,zoXʪq:o#*STn~[5#*-ci>碪l\TAp|mqi#9A7 5! PT~]VG2RdSّפw2UC0\E`,#99n-rϏ]3I1S % (ȣDLU U#9Q2ҘB*4a(!c?F]L(up_ bBY1#?#3_2niNW5wOZTk6d,m)Zzt`guo`GtXq -E ʚV*,m_g|פ?/#*FeRDQ 4PJmQєb#JTB&ʑPTET'./<`HwzlI#/΍}Y[ͮKq Na6"Ƣ3bF&F@8$jBa~KW)@4*T}^YcLTB"U:J|rLuCmL_mtjrrz9d9pbj6]A01ӾYp <~'wbӕMi93>i kzV6\r$B,gT;=$#9| $#3ؕLd3su6zگ7aoI6#*ؑ#3Rk$#*r#*Zgu -WkKpAc,r$M#*F#3VlTCB jR+ %aKP(#9x)[R PI*Da#934jm3k2 NAF#*Dg.{㭢ivfP2}SH"a8=Mu#3ƶ'dȬTa0ds"=0/SO<YciXe@„#9D3rz#U%!\"oc6H [y![Hm<^lQl8iF4"oUԁY `BIw6Quxy$DGOF*1,EI& hUTF8LX-4QOlxFkM` "PieCbzp(UZN*vaeuTК uH amv"6#9E)e#3-hf5 i##«5hVlΏ,swұD`E\U.($MI)M:m2[Y,A٢Nl^ra7m7R;#UBI@xMa]򲏎EaVmf.]A `lIj#3kf,F4mE1fጒ.kRPn rnbZ@<(ӄ}2 #9#3/)Tp`V81`KV*#*ʆ&X\@ lh&bf)i5!bZ(ܐDsaQ'x^J*Nj\32*Pɑ*ȡM3dUH’1. PIhU4"1Aƍ$TPl+lU70mUDK Aء) v2YR(.3D0iCP:'~ 3dY~5zN#9fMgFSE Aj+#3<14PQ'Fh5x#9J>fUٵrr}N%n$1Ԇ2#9 T{% V1k9cS\'& McV`DM1#3R qbrî44hf)W ar#9J6(@K `#9@脱%(Ȭo i+ua#*IAG"R?ĻxpݼO]12mw޸GtM[o}U(j6ͦhLƵtȶ6=RL/A )_ &QDb-DD$86>m#*.ޯd!~M@Z:'wmUF֒mF1X Q(Hr{9"{T)vBsu볌 4,ࢂ0'absQ\]i `2;#9#9&,4]"{k˥HBC=*B UAchv@bƒ056b1`Oإua75ݘCd`T"T Z4c60L6fF,MK5^4Gf򷆷 tR`6vRcpdY~@H~-vbŦ/ߝf'r}NX@x#3MI #3p`1J*,~WZkgFB#oN#3&} W5T%Qa?6HLl,d$BkmAx .^߷xkslk&[٭n]Ukbرnmt6[\KrrӻٮEFFьQQ\Yݭ "NY/{Y L#g{M2!c>&#*W"-"|U튫g>"T`ƫhiz]D@>_x D3tfO%L+D66&${YM ,) T2#3JV#* KcO`#3 #* "( " X66 J*U#9\Ļq EE* H*4-U%ج2ci&V5YK6VE<%h; :5Hz1j3s#9*G+}qf-M!jvEJ^TT_ _#*$H1"$*ܛ[fNï2:zN#*ACtE$H(U#9f$ FZ4hmIFT&II+Xj5lVm-+L-dd %=ۑ :d,*AHpl#ʲq9z^guWq؍0.5QD%DJ$+!&#916 cH D*FтC!DF$ƈ(hAE@ ]E$DZC0 ~p#R̩˧uiӻ1ph/T[D#9#*EX5*PQ"0X`!0:vݟUisE)^I R AOFv̙B>)}ËL)aqUU OxM-ȓe0#@1*!H8>˺{kBD#35s쪵#3A6=;TiL$NbۦITfwFkZ\W]zJ}~UC#*^KC"̑$ud}{d^A(V-#w$µQ߈kIK4Eu*5.jMێ#-yɥEt԰bF2VJk<;ys c'[+#3,{8 .#3g hpt;?Mϋ pP#ͪ!s.#{KMe _C{TQ7[H0r^|}Jjo|:q]?EJq^9d#3WRnIA#9lEPG-⛲ T-?\u3,ݞ]l^7/lx_n3$"QNv޹C탁h#3de3~%ͣ[VOpWq}&71l2a$3F-Mo'#ي#\4ΎԪN)nhfUbURiyʪ-g.$PtcZbi$n DŽrmL1:,7F8ʓlN6!Z8JȘzFgɖgn-QZڢ֢)ٷmvl9w[j#9w9ZQsr`x#39IƟD$Xֳ&9D$3P?Fqqi9 8cm)uUw:幩QjPwH֌"vw|&6[+>/9WWqՖfzxutY[{gs6 xpxqwb,&mB6v3Ƭbdel1s\7#3 a{NF(Ga̱&u%N=xrO]28r֣#3qJPlcfqQ>!Jf y.zUb0@F+P(y%[pa;:6c86ySɎ|L(ԡELӿㅂR#kZ&@d@r `#*5Y<%oVffE.)-B hAvc~%˓77EkPiGQ ڲIm,E:2#X{#3{#~gO"h"^Hu޽Űt!Q#9yh-J$vqV Ul6^=0#99qCjDNިDb;dpt>[b-_X~v伫Q#!f3["#3#3j}hͧQJ3 +IZ6[f hбƐ@xNȵVpTJXUKE#9tF#*kmZ+[lf;3)DQ#3iցQ2ƔTE#92(# x9_L͇;[\q,ơx.]3s*H+#7ѾHzW^*]#*QOTE$6@`(km:nik\|3_e%?3jrr4=t7rjWfG!En)dĆ\$j<1#3ܸ1Lԭ&c2ԦZ:YMiMkT7 eǒu֬zqsVdbCȅ548/%`m5f$Β59;7hiF1xlT(DawVT I8Ƙяv2mϪ{`")4H}&.wc8#3lbSvUQ&IˑDYJ doPOWeӜflNϩC_b#zBH7 j{|;x%Hg&rk6<-?lʩ\\goszz0UhiQTfy痮rZH=@r;$ y#35.U0?/__y$B4Un8s!L}=DL4b(aXUatN[[zs{Ͼ0/Ux5k9,iT=+#*}IhE&&jZ}#3Z崨ԡIыXjmexR#9U#K=~&r}^."T$ ()Hx,y .B}H֟vjWE֢ jH&"(ك&h=4, @FDLz m/>I-C4K*#9a\dQJk~6z)7LbDo[l<1wyPĊP&FEbvѻ,{Ud{e&%ݡQX#*K%mkvE&bk\Lߋ59 l،~bHjfxlДa$;,ѿ^◩AϻC_F?.>'ȹBNȓ@7'Pپ#3"E$d%v(x|:lO dg~.Uo[52UQJm]B-M2QcR BF k܉f"(Y!(p#9CY#9HK׹2en޳koj-ֺ{G3Ћ:lW@Tv}iԝV(>Eu`n EY̻׳iێ]? 4=)8.Shm 0HYd•Q*Ne]{9/gΰyށ~qNp[ȾNɱsU9喅#R BpwʤІ ?Z7Ot[~TQ *L^ľDh]*~/1b = ]"4Rb!:ݕ5Ag#ߡlyxk# _f# }_~pkc֚2@2)J) 97d<>#3Xp;IbK~%د-CVߗбG$&%➠}Tgg٬ڝ1,P,`YHmĔ4m͢8!N ?Xem)biNUcnF|p%g:$8)`&P5CHfo.]p5r%m#38 6g% #3#*m@8 nw?<ꙙ2wvҥ5BY e jz ;P܂C1>d\4f>GN=#9"*D`J#3C!Qc V(m5l*@Ke%blFR> 4H3 iB2`l  fɶ*D@E#%qާf4 pE #9b0:ŝu&0̔Q>~Pglg}Hg雇lѓ!h]d&EYWZL-$TLOF^Wum'exl뛪vJ ^z~љY'ǻK!6EtIvkbRc o~hZ3Ĥj axuGz҅"jQ %VLREL#*Qm(qECE2$֢QJœD[Xb'(+Xy!Z&'X3P:ݖ$>*ؚGRA:ꘉRpcG$)^kTb0nU#8ebe3 9 !&ZJN>,}%;!HC;"Ƣ3m&X ݶi`.G"j``F%,Fә `]Y\#cCI=C6@Oo]6.[dɈm*ܡg0ڛLi ;Kܺ{՗[9[m0Zyk.eFVzaclLçq! Ǚ͋Emo |k3Huy}[eZog3 )I $:&}z̡Bojtqv'#3t닖9X7I4:MK'R%sj8rT5[efFʈΡL@Ő#3|9֭Nb/D'eRt]˂ߊ뜢C}F&!@#96t̓sYs=85˦.˙`qh7N&26T vSb$#gKit͑E[8"Յ0/0Fbthf b6P,E*0Ul@ٚܠ* "#3PU r:wfv`BBNF##3n9-l1K "ed3ҜQ49&7f灍u{k&/٥T!{l rbs-\hb|;^/9GNI0}ii6j#9fÊ.hg.@lw<6'ˬŽW@vBݳL_{N6`bhhSpňәeo-#98IhGuЩ8kKϽzaQ#3O.0 alD26|}=#*Z(}v/HĻm"#*Wp0P-4AP=vDn'з.$ʑ8r2"diZd[Jh"$M2d폹0|r~miGR!DNq+#96 T}W۝xnhq .ɈR@ J|=O0A=x䐁@OYhлlz̟(q&1тe FzLaI[vsP΍o437Y#"Hu7[dž=T`UW]~GJ?Ck&6*Dj5RVPĖOZJTVk&ZV꭫SRns!PKы*E[$T.B\0Tn%RzWr/+"#9ɻeB%QJi3ڀ{k8z\nȣD@Y`0&Ow{ýSp3@b#*HȨ2#9N[4O.Tqٟ*8۵Ѣ񓉪x.+Z-(ʌ_PV l"kwW5%(z dAdz@XBJi`UAC]I{%6>Y=)/zOR#99x]o'T ZM*Y,S,AU6 XM"eQU^O&^\tʱc22NՁy'8Uӑx#êp&y\m'W_XLpѐID] ]>!#3<9u6DOppp̊t"Rg4̂If,ё5l0/PYDXN&2F$HB&+|)iZ5ECóDm-sK0ݸp$Ieݙț(5p0F Z,ptF#3ABiD|U{HlU&35#h"(1yODTJBi"uCu&-#9A#3i%6"Y%p3*ZWw*p|Tȃ`-VL TkAZbZa2?S.ɌJ,L`AqȊB>_%^-޳ ҁ]J]@W#9,Bd{@Xć<ۄ; J$p0pο#3æ X拗p Cw_/~kZ1#* q盧fPSkއ#*~#3FiX#9E@u#9鯢7nzuQ72$ ̏Qe]06F?ck7bJ)5(y7s\#96JUn"Y++-6ݵ5DZE6y-w E_A_my%fl$2i4*/Mq0wxx( QY-MѴmE1!=R|26P $XJFѤ)fJ}~Q[iF1j6VR[jJY%L05%qd\aO" qMW}BFD@Zn1Mak-b#T%DxmRmU!#*^܅g|{ϣ%ݝ_#*kqJ2{yNژTrQ'H #*zaC8 5G]YaS-IqУ#3hdd;Gibz2`Ld*u`D%@ޭ}#9Q$&#ђ#*TOr@$ PQkv)mItmTiP"BJJX4 H665L#9#*Ք#9mrT™ #*IeeկG]!|-/nC#3a, - ~ Uk谠9@}ȡ.8jW_f07{wG8oENnzX/DvŹb#9XɶI;tإ4Ҥ1QTl)hߑCWXh`dTQ'O}$#l$ ZČ'[tO.(bdE46(,T[>wm,+ eUfbʱmF5(Ub6a F<8ɿ+s_,%|]-VY) !ˆ$&}I(a#*QyP|1񶼚fn$ڒƩ!F)/ԝ7BEZGY)elT #bbsc0@4#9 &Ϋ4M*[1D1D*DY-n3vfUv$Ev54J]m&ʒ"`#3#9D9)V8mF*65Fa"oo.")UMI-%XИ6je-yvE2]4A#{7Vlz`!I`A-2i#3l^uU ,X_2ȨPL(#*@ydmGi[FjV}2 /|1vH (lw*״u@e]\<%Cf;" &zX3]95K wk<DfBvL&;j9}#gk##3wrɈ^2W\; > EW(g7ש1\VMN1USp">9ڬ2_GAW#ZOJ˺Rzk{lI$#*.\H17!dI&yɫB$-S2Lf_#9zTqT7y&5"gta7VC@1>^#,iy< B=OQ8yM#3h-ZNQHXG`iɐ3=&@!v!F(3⚝YWiPdb貔۩DTbX#*'Q/lŜEt~ fwr'WwN6iu4>sꇢI1XXm6u:;պ#9%`s̪zkj'IrDVv+VmAn 2U 09$ʄq}~Em\#pu~)h5BN&>ro57#DF)A{M ز$CQhsWwvV} Icо/zV`"ωˏHْl?1`afyj ‘-t<#3 M:8kP&d$4kFf0d1D<)':n^-!+rP:~#*0WߔBЀ\O`YT6So]#*#,#*#0>7u?ǧJ3hE/ J>ƘՃLAW;x?/>??~Wv|ǿb?G_;Wg/?^|?@GT0##12ȞlC!ͫyH yp`J_s1P ABJaa0xùI I>T+h#*k;/EPC8;c"QY5xql(\8nLM͐7ے/gȿeGn⷇:j d|wjf#*s2k.\ĥ[#*(@A%7eCEP1 d:-**!$ = {6/ݳ>$ј:y|4}^v ,F*0 A:^"V;j0IԤLm Dж#94V$H35]uW@==Z<#*/Ti)lRe'C(#3ʔ:GوiWFrIP9f?D25ǻK*ABhQ?=$heiNe6Hdӆm迅#3|(4gF9vjoA)*0LceCOMdq."|-9g-]2%1 D6Ga!ZW9\ŭ҅t44lsV=ZX)5[}챯Am5lm+Um(oSF&Š^r{|:Ϊv m唰qp71Fgd7NOnNN"#'@xǹme#Rx.1&%ǕIGP _#9^4@$fR珗;NhGc \T=*|#*`( @"ڎ[n\٪-,fK{ok[_DH w٩?hb0=3Q2ˠm-8@d4VOk:,'ؑG7k dIV{ )"/(z.5La?l'M QhTPw>?gԿ_1v]igtt)͇{n8A=e<Ð1/s[)@G;WaNIC٩7aS p<3 R+R?wY"ScعBĎ{Dx|@{RA((Et'DS8&5\.2`þGv;hVV?7n<#DZAxm6x_H8ExRå .BPN1`#KCE.PZQ9h+i o5L{y*s< V1$AxmrTPSڗO Ou_ȬF/Y ?"(H&#* +#BZh91AY&SY:1P},Ƭ#%80ebT\{j#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%>۱]m#Xl.εmk*T(:zzfRw5/;{^'{;2n6YV|.ٛnܩAGBDub(;$ʽաD^m55wn7}=]뽯ڣyr;=ڎ{#%#%#%#%#%J :>_|#%딇mOv#%#-;==]QfTT z#%9kE^#/HITU(JK"P @Q@( Eo}je{Ҭ(T;dT-j{;.M46/}v7ݳ}{׾=_b۝o}/;=|m{y7rZ_Mmo`0#/֭[E:ֵ]\nsvDv#-"JI{#%Q@P"D#%SG(VXXO\u{5;yJ{[[{ﺆ=45UuΓq^믾s@7on޼.ݶ{j/ίy{#%)qS寭un.ᄑ=YOv>=7uM;M۳}}ww^;v4k_=tͱo:{=8R{|uu}#-]a|X]qO'C}rW`#%ッow}{wͅx(%" H9n4UW6:]z|Y:W+|ByGAfvސ#%;@#%i_{[Y#{yza_m-}=+>뭣fw֭݊u{zυ͆}Ӯwϰu0#F(:=#-6O|׹`v]_lRTWy[Jǽ>u;{w۷:uWuەy>zo;azOZ(pЗSq6#/Prv'F뼳լ#%#%eY{T52Y@(R}6{!ٽyulUW}7g;lQ.ksm;wnUӰ{51+ ={|wczvc6nW[L?ۭ_˚vD&C"|mY؈͵,mDI=WP9rQ$H(%H.ZAgFQUP&\usFkWyQGJ̗S6?j%+\QD[im!{1~GĬ#/#EHk hgo,hQՋ}:BCSNJfn1Ez!p]rZ@GOl2u>eh'BvQU`g:澼X&芳!)v}wCFua醕MbcrmU˓B$?6Q'v6#-Fy>lD%}e LoP#/2Yӝ\R~{:vɧ 6m|ˤn7L49+(Tp2xmiF6yAlDqKxخYD,'jnqP?= mr,>,O+ &'uy _ibޝ1EDEtP1PX+W۠箞t c3cSXl"nrɨ6mҩ`4h V>[Q#-PJ^XN &1O7nCI)wD:]e*dJ}幨o]^"RklZ5fݣY#9QؖU E0T|ϴ)-dҪ(I"kz{q]ofܕ8XZ4hU#-9Dc5I0 #h}TIQF#%Vl&PZI\,[sF^N]1[HI! tx8ڨJeJEzwլХᡅ9:2 AM(SvZl JvJ *6Kn)i6I./xC#/(6DŽm}>k)mL$,b;vRWʪ,DE'k)DG[v;bhp|84eP:jLo}3u0Sj(?~yʨnr(Møf*ZL;1-5Iٯf7)3#/3T~\*|#peKbuv6Y>}I]Rqƺ𪮕 %UUT=.м"">mFbeMc|Y@qwpMTd0cs6Db.=(Z?Md%MvA9G7gfylǪDNVG_f6ΩԧJ~v<~W2DRO^w"m0ΛgZ|KW%Nv6哷|J~[&"õYXF| WS#3[#X#/Gp:ÊF`?#-^9 :P%taI0Z\er}ꑡ)=woLrФ<S:wծʇ4&Q}vڜOtQyNfz/?D#B 5(5M{t-:tnc2?M<#NTnL7pSeq~c>߷&2y!m:>1  Fߤ :l#iQ\[ խW4WFnM87G;׽ۺ1͞Z%$LB;R\<矁tjI#n(=zґTc,1ӌQ\i}]'*>1ڳ~wtg#-ؓx11N#-xr"5(#2Bm_EÉ5dEt_k4;õZ : uHPqdwW)Xwãb, " u"}nW^n2vPP2AP3~- UKTWF#/u|V^1>{u2AD,廉z^>|Iϗܩg*36;q(*UTaҏઽmaચ-{/zvftdZŬ}kw4~xT;,nG8Uf;V̘v,Q˄? Jj+{y6b焿g.r FsV|H,co[߿]0ɁGE"03~}TT^ER,':i*iV{Ovf4ES1`өb董)|_:6#%*OO|Ma3xeğEBc"M4JW(S)ɋpFii5kٯKLJ$_#68.NbpN۬q ދB"Ic3Hj Ï*ZT$PHXG{yc(:n#-Z}Cgw/(f@IlA˛V#-NM֔^=xCt¸2%iȉBD;6zucm\p#->j)kkWޙI"#-Z\I)D~pɹ_X=_lS#/0҉ldsmwkِbmj42[Ji;ִ{qMqm¦TSnUs;,±Us +Q$R)8Piν%FMKҝ$vYO.V7 (}cO_'D`Z;ɗ,oT@e߁Hylj~ccZM)(Qmrs\~3OT9ɪˑkD"IKyhaU|Mӝ?}Ӌw;Rg)݋_tSU+|6Nl.~΄Kݶz.O)3ͬ}w/B]buZzW$f=D/|UO϶Yԇ$Z>bMuҟ'[Hz%tHd+}5_F#/6RƥPx\sK +}vT)izSI :]6h]5_#\Lh/#/F;=iFSgՆux*Efh4f=2ӾpS&q@;G3iP%!˿ofHtt@ݠdOzc䣎.-N%6wKu/H&`Fqך"pg#/35J.r[iȥD@JԾYL%Űb{벹JN.m);H#%|ɢ:W_ \W4nfZ񔴝$#/*b"/gLc$c寧Wm砰1˖.%ˮw߉1|߀붙!u}+lp*y#s]6dYA)|?eZeT<):Ab:JԳfUUJ`SQ e9j+{x$T ~U#/9JQ^!ipum.ѭưPd@P%G[ @D.gΉJΟ'7=\o(SZ`A-ߺf-9G%dw|v6ZA|:ߺmEc#%Jcw2yĺeRx?$E|uqC6c["}%.,hǗ>#/#"6|1Eꍟ7V3r˫eDѸHr.5Rg҉b(vScR^n+)^)Ls#Zۭ_DOZFJ[!~\܋͌zx*H@q3Kk&(ɢ!ySbe䆏ͬ;hӞz:4z# $2is߱s#-#-HaoX.0m)Ctc_'PoW}L9>mzq*ݽ16q&Vw#/r=+7r˝[bAyF9_am-tDgQ qjt 1H#-v/~xf )}=o`z-^H,>?-~mӃWo$1dݣdUރߏe6ǵ1jN5 h9݆9$>0ު =I ?]x\`aMo6<5MJ<,on+R1\ǔXr\lR:O(g7ݒŲ-KYgƝmwl'ϗ6wO<:~NM?,dZZ`cl-*V݄|䙦CM^d!) )3ȮW&m!ْI4ߩQuW}Y%Z#}J1bJ"YiN9e+Tˋ{}}:!tpa! V(qѶ1>?xZx((H&;+'yƛþr5UƼO)pn$:lY+4X}}Uu]~ɐ&gE3^~9ɂS2T҆Z-{jW@fo̤[G<@zfVw乚P>IMzݏY C$)w}"EyN6d(;p(*>Qյ3#%qwA(Ds#/g[R==E빴9dkA,!nm(l6=T?c mU)eN:ЉfbRUO!!}#;4olV,E,;O$#Iai`k-o(P@)9CXhN-#-+c8s/j8L+Cuxy;;~zhc}cyjsM?b-VX}pm6­nk\]Ǯ_N X/o86V1Z5CTñb4`M$cwU03.(]g׏{G`f:2Bq'(IK42ًM8U},I4"zVwqL{"R0CMq0YG##->ԄSy"HK2!4Ĩi:~ !xd㠐u+2{gom6!&-05%;݂S2rA1 `E[{Սu3pܭɑw#/7\y|K҉l /}S;qAnCG-;+5{JMLJ&V0/'QcLK#-yyI-6+d,1w |j(ٚS3 PB2HHa&z^~CN?8`ߧDېClԐ"=ty7wh-#˴So;~VQ$w=rЉB@@ @JAQ0{*UNNo\)1Jh;gՍ=XOōg]{db]8x_vF#-t8e2̕5}&fM h{ԠȄ^*]uo iuM2 UU$`!XݜX ߼stM -.&FzP15 zdȔ K|-TtwJdq\a{UMm8טbβL#- 5P8pZ)*+fiކ7P匈jswF!1I::2 #Cj勳z8ݨw! 8`\=i,;r$qIW6pY5ɦXi4cS2 ucz;K`r:7UqVY6Ľ(μ7J0 bBerx$Pgajaeyfj.{){FG=ń'?;]^7,Gr3+lPޥ.p&wE#%{,dPQQKv.wu1" CS%$mq=2zÿM4TqaIЛiRH6LcdR#:{hM&ɃjĤAC#% #%rY8;Z#~}fMUXzuV"H|fyIE'i'JRCJg"އ{>,HRzp6Ƅ>#,ofLcˇ LXɓ' C[4\0pREPE8U&IWTCyp2b0(ku4Im2,ٛU(OC柏^4D2g$zv4iVh{Tr;>'%-;^'ǡkζg}iPjt³G1sFrOVl? @%Ԫ%2c4ip1{j[* wywA/w>DKl)-ʆLS`Q7t r^uJiԱƑC6G81K,d* ɺLCXX6@F14_#-D}4 „c0a ْS%BC Yr#4eodFCFK`(euD 8IwNhK,:VbV66@@̄$#%^鵎fgf$?ËuZbBT"RS$o"m}%e7wrzI#-V6g]w -h5$A\,2VlV;:N{#D/OݜR&k0;am+kG?ϯ.q.86{1KqIU89.= 28.&T%chҖ!$rKoS<]K֦܉}\PMc@Ͽ_=or>qO-Kl&H16pKo9똀~2"&#/?<^lBpM#A'ם†m&IO/A}2{L`=}Vy=<^r::_jv52ICq57Υ<¸5t~Z~[BkTAbTh/j1ukᬺ>Ta4 dF<V!E<,Ў}j'~ S_F(PQD:idCg}dCAp i/J'D\ m#-2#%ҌGywQϽ9ؓKQ$,S#-O<1O#%K#/En26A0F;G4_OCF3K/8L:Ljϳ~ōFnXaLVzkDݰ`lJIZʶQJH[|3es^zimvu$$&"`hgɕi"1E#/T1E ^ʷdCB{-D)q͂4VX<(0d{bTrJG7ܼ6{ꔠHXU#%)Gܛ>#/3lq.沕%uHrN~N'%9BJUԣ!_M2UܭLH)"Z0sk]6-snIF$&)NM#-b c%*Ҟz,FF_0p`Pkfw2LN[u4Z2N태jo0 լAOE)8|"#-g:y'|QϡeQa{iϵԶܑ;`ڕ"~wyBywEb4Jۏq:~zůN#o9ZWi7<{;k|9$?-9q8L/[awvB/Lm6ەCA_>pr0#-#/yEb#//8*vzxOb)n%Jnq#/|=al7#/.#-kI$[@\*ؽO X܌u,zuxs>/ik%_9ѧ0)u㗓+_O$v}uj<=7]uVaו:oҿwo3#/F-4n#-u:W_B^ֳQ#%GFs{}VߐIʲi;+}l,,#-BnHMc9L*#Tˑ1ka[uX'~?nOMpR)&O'oP).5U˵#-K\VJ䟋b;/ZI㧝me3 ${_y5憯ᄿVǙ={}t?ó&<DŽpɱޙvܑ^f{c}~ ~ ʥ$baUM?z<6P}p[%qۜ׏mz*mm^a#-:k4ǦJZ#-v^(0dLMy>ϟ#̌(s/@HD2:'WD3co ƹ2׶?,2J]|.kj ~o⓷7UTZ#^4 'e=&]MTGGWڛc~A甑N8c:`CZvH]c9B~}텤UiXgרpiǿ6's0$-)̓yM"MxXf{ŏpIxFȱNѶ֍u;/[VA5d}2Ou#-+^NnFĥ^Ǟ iz< +6߶o}Uy5mG le!QT;-b =SG;P8)IoQ\FZ "Mphe}5?!ܹA}yyM6;jIcopוo$1ׄI=PEU)Cfg.I$酸Hq1%o ':̚xIfݷ% $utB}Z4s*\vRV(mj2a8S36q}Cͅ2(k1@-M h(0W%1ot+~>]& V &0L\UϻSz7׃fE|6S.wEc_u#*c8 ۱Lo#-|:/X˧SviVZuPj𾽜-lF_u^gA#n6z9˅yx<,p[|4ɾ~MejV+qǔ(kstieMucZ\!m#/~dNl>cYYyev{;uGyѳjfi3{Yvi}9#-c[ zȅ|78T)?c`B3V5Ixlp%?) ?x8#-G~/ݦßi5wo?O߫ͷ1>˖}gsxB,&_~}znfo2co Ӹy{džFϠQzv?qH^ln?ۻwkg=ۃl?_Kos/fӲFq_cz7, _7p)vy;9Kla=7Ti;Ń}z 9-()ϛ.2/Rs~~muo>~;}||+=>z|)OGL ه[}Xz-Uߦ#ywjܴg,j=N5٥&pd:v:k9>v\%zBZ|2,_{Z'(uIɯ.%9l٥LzS 7NUФߥ,W6Tu$a2Ԍ$99yrRNo5w@&7}:+?%>ξ=X} vhٱ0}y_tp?~H3ﱝAFjk5oKP]\eymWNtiÐ0ɾ|Z\ EWb)Q%}+w:K7jݎ%f }lLF\*mVe^Mt<7}%:KLMERKdچ=z. t˘/_*9Q+p|iʵ-Q{eL, \BW'b`y 59n|*au^ߞY+,;Q7H** vs[?gasv=nKOYI7.Wgpmu:WnԬ@tDk^:/OG#3un_8A]Rv~Du4)?۱F]Y֋]5w|{]nɭ/-jdRxc<=w^uva^%\n#-s󃦽ВO\浯?򆽮jGϞW5믯|޴uZqS#%۲z9o9JYs#jXa&Bc,"80(*+ZFAHMJ*Q&#-cT$UId.ϥY #/]ܦ3UaJ;;"Ʊ!LA"hhn)"4[ZZST7EzmLӾ `i0ؤioZ$]UJ8d6boxnvٶw]X~¬?֠;uV59n HXx\Г2!A$HRF/]E#/i[DƤDFk1wд6,*R#d!PXcM I%RAA6-zc;d{5+ݧO/M!8kJ53#+wٮۓǍ}{:1wzgǛȳ{߲gS?=nrMه߫#/p_gܫYK1pv_o#3щ#$m00j5!lRՀ~˖/4 Ő~OT?OLVW)K_&Fxy2_pw?wg/u%wfׇncck&3f%WXhO/{#E9բQ㇚(xӵߙ rC&oO-e5 pvb];Z$}4qyi>mţroiQo&ܖΝM/vTzR͙Keѓuҫ#/->]|0Vq-{5,z]ih|ƍd`C!IЛʄ 3ں)98u莖=PN$?5l Fl`1B¾Ե2S[~5ωU̩z&Py+f$RI!07%s8a2NRg"ݝ#/Q:MRL=/UwKϠǎj/NE^HDX#/DXmR62B8V!+`tm0bgPLі>}>}RwY7짶e#% 2L#̈Qe(A1141-6R9Im=XW2aM1(Ɗ4B(=H9$i-#/+Q`tkK̽"15[t#1p*-^ш<;rl&j6}fQX(D_x2t,|2dSHF8Oh0Nj1&^sYM8A$| )yBvk4?WEKZ[k|:wKGvn};ۼK {&}&Z+$,6aiUSʪ `ӌw=e֑" ˋJ1J>0UdNG#"D3~D}Bh$Kʡ!_t5;K9\#/nQRQL@4]-h0@F8(XsbtkB!S?ɅlB{-&1QTjQ}?ϗw.zvRk5ݨ?[n3>—1JcD[풄ښ\)cḛMI=שrFiv`n6UFRwt]9?1HӱUAEtn9}^Z5߱ゲq"~9#-g2QͅDY5dT&b#-} ,B92'-6X*0EX2ܡǾix<Y$QAMYڬi1A=>'q""w#-hWQ1#-8HFcXW<7:P",P#-H1KE<|3j2Yj큿x>惩uONzfC¸}JuF'٭DX&tv}v>"25m#/$8Bwv[!~d4xmxb͘h΋;7`MVx$Ջwu_˳soHusmZ$&sspțc D'wɯ .w2MmYac}yot v.4D4ʔ͒CW ƻU)Vw5Fx(_P߉#- ЛVga1f8|"smәR,P&#-#/ F4⌄Fjxȕp9*;my;lOTf՝3ـ seNv@ Bne;\#-2:Ž^[nS/w]ck[!o"nc`no>{YW $隒H3 B QZ΢sЩf$lrV닶i1cmK'- I4 ils}㕍iߦF|ZmR:||1IO:m"tus.?^𯔽^8ehN(]Dd1Ji+^"N';Lr:9#fOʒi)*&mXrbfaǖNag.c;o3diN#%gMTyc6ZFMTdPPS:G.O#/3=z-v>‘(^u10BBdxƓJt㷎po1N7Ⱥ0ǯl޺LJOQ½/hl1#-gW,_Aֺ-`CжL79qG2k܌o(|J}gpryO)[*4mfuŝ0\N8Ma8N#z33*d\3Bi)aW^La*}BZͿ:6wiCTֵ$I,rfLgouWF6(4vE"Qy)JQeXwiqth(Qb·j>#/V섬f葙Y3PvnlBa##-[l#-` }'&&h>PiJ- CbNo8xZ|%3h F6~mdk2aM:%H2f=S><ѷ}e#- ؤAŽPK%gP#-Fp;:ginӷ?"oqcj}9cȚkXbeuh`_#)t1z[/] H?|c$}v 2M2f#/Ʋu+88^h]t1"FYC,o6!͚kƨ oիM}ˇ=km5-44#-ZG 91͐}|lpt\#-a)?) 1HNSM')ٮ/{4<2^}B0cn2҃2RcozS™#aX3&^Z--ݫ)9FK!(D}2EɴTP'MctR=0[ Ofõib {gl 3ۛ0 1TLnP7x"Yv.Bm0J[^p0>1v[K$wa69C76}~/߇Vؘxmzb#%~nՙ?H!OUǪwiEh{{6-Mr8̟EpGy|G!Fm3EIZ>L+1G˦GKΈ<*XƌVAE,|Qav缘u<ţp;(tqD/~2ɓ/0T"X̆eM0ihͧ#%6w=YGQE_t&I=Kނ̈́rl#-8ք!{T)ZJcs[ϭv9YSI#uSٷءid/&]ܨQPsO.5)Etlrm5lJhTψIL#-WѶΒmBh+;&iWN[Xy:r$2jM#E22楔5Ǻf_^p[+LY`DcHGN'e(ndA-uY4baA5Sa;y)>ܙՕaVQhV^A#-GyS飢ňM,ݳlqTeLvM'Ud EVrC6&FqB6b] t+ϳ׫g"_["̛ad 9Y渿l#2.ĪBT{{Q;MXIUc<`Y49RC^#-am9z^#-=E-/a H zZ[z%nL9)*?#ոN_vMZȕp.Y*}x~{٤ƿ6nNtL\語m@F=E#/n~6Q {l;v'9#-#%WMs|&k_Lo*Z[h5Hó 0#-aqPLEsiW8o/!]2g05^uX. y9EUt|6ãM<QKfjW!-΅ֳVUG\E0+#/[nNT5psIyP񷕤gϮ4Vv:@?!,EWk`5=PkUxdG笽u&tcttdrNH:ƩvY|*Ci#\UmtΠHtt^oB:^}sȊ#/ [gƎg#-[ߟ5U"ۑHʃq[0a![3W)>vm'(rgbn[@Bjޡfu28HYɮ16<; Z=2֛SGɧ54Z-M[-|^Eqy܊5cs=z/#-;;RY>Ws'⛪c`Lgݚ;.$bӻZ~͚x?X}Hi/8q벡Gw)[k"Qzʧ(Xysw£}zmmH9l l%~pyRkC{!P6*"w/qR+ϡ[3k*lRxl9VNqSPsDS/Kj9%=.{x{O| E0xȧ/pn<=gs\)*?;D˓~HPUo''~:kNo-y3˩D4~auuI2w3;0#/pz,YZ|bcV*>DA{fBvAe&=yeY1./L #=}}5wsQ۹ǃ|_-5N4hVfQȫV-1.U&ү*-s.7٫wJ5XF{z/fĭ/dzd7߯V5ҵ+We6) 0zӎncl{#-zڼyƺgR %tλXeoكp&`r\1ղ%U]8`oXLP/s#/߾hr_-_IV-ԻE'n6Mv[)>ǒq#/q3ѫ)l9.#/ΤcC\Eۻ11M~\5]y ~"W^AtD,#< O# VF[0,pSwYv'_8+ӿntz\ׯTw,umoҮsgoS06Zߛu-,Iq*>@꼯2~{dվ( Ų_|N}ZĔ'Kڠ}쪿5|'QPna>odGD{aek BKgYaQs3Js- —4Jͼ}ϜTsayΈ|3W#/1]7z\e9$B^` U~faȢ5w ac±^LhR`)S'*ɑԣٍ]Ixߚ3X{kU1澫1UҸϯ~nu_r%JKh})"S'n}T)sy[wE׾*dt꠴q}gpdIjcn8FR ;p}Ôj[xEi{꧎ KhϏR`٠xX$kvP{ؕzWlw}W]ȆH97&ʝwvHedV r粔(puJ u(jc}R;Sr ȳKu11^Q$~aGOyQ{LC\w|Wm[J^ss?!N7<pp /:|f!7T{ާOpx[#~}iF'KڔNJq_ۿ|P뗄-%ڞ? V,R:bm!4}nG,*jťJUo뢊#/Tlv>(?pᜭA姄6F4V7W\hn3*;j2jHҚ%omNmľB샒4JOO[yMܝߍ80T&^qժLKRQ6hf2ďg{mK-s-ޏ:Ow_mKU5I\goT/RfbR*۪WbNgfy<פ_fa0{&>+ߙPu1lzQ{QӅӄ6+3O.{йv<0u%?o7~-m}Z8u㚄\ad_7yt:n8N7n(V9# QY1ߑ>O]r#GGۭ…T2\'J(wDr=qTD_@'bZY⯴կY )iW%W|sb}^%u<#O8{sժpp ju/%=jhZ+t'^'u8kM ޡ2x9RNoK;?)CanR N'95WWEW'>N۪/V^NLeԙz/">?Wn)G}Z>ol}{Rgwc\uWf⨢ӻ*™13JP"n/㥶de)q\/<)/!_wEzW5^8v;[6`:/S3\ +etpl0-m:#RwLTt\pk}}r:KOw494%/ E;%4;9mfn Kh~Ϻx#M}M t+; uכkz-n&Ef̃ M4 2=2'vu=dsyGl4?qyD>!W י*F__g~,ɧ;y>rv4򙆝9۾R';ci!"`}Rpkcܮ?o1_\sQ3g4ܣyvw/{ԺBzoom[|lm3ۧk94K"q{]Eq=*kh.)ϷK_˸iӥtǵ"| ~2fG1 1|(On)ߤ\H&yzEնB7hlh&dg\ 8SLus\gHƸx9Uo_/ʹ҃j1 .2raѮS{t y1e7+0\6hx#-o:PɄGI#|+?>pH<'uc6+&o67f} Nklzz9#/옋CoLǿ3mwO9H#-t:v>-Gkrw盳PnOOr ZoFC涋]ImۭӐRuzrG9Fq{g%mf=gӞ]=6Of#Zȗ#~^j4\yҁu8vs#-KwN|#,FTQp9+mvLj|Ӄ;6á,QeӤJ7r*JK𚤑v_9]JCMB);<X-2Eъ nm&^hwM;<֞kx!'Y=&1!śbVl5;8v]q'#-;vi'ӽW>]S:n&#%V!{bE s+ulwyk-3m!Vrc7?;4q3N]>g&!+L1YYu(n%L=o ȱݎ{g6Ze˳__iu$ɩ\4^?]o<.?vwycM.Ϝ J]I=Å&~~S|aЂ_ĮED__o: QޓU+}^kcq!TU-- K~e,I~ȭ/Jb}hXsṝe~eHqp(kgv#-bHI#/@P؂I#-SǑl\i{7w7?R:L-Lǥ;VqlGs4rOH\'G#!#F#-<.2a-HE?MOc2ӗ|{,Rڮ_ qHD-Mȧ }?#/(?/Cw.h/=t9Ҥ9, )o;k|f/|Byg*hCN1t4y)g22o×)S]JU߸Ѭ95/,;5KVESAb#%]_EE,[^QaٲD#/bAs>Ɂđ?kGՏQ Pm j[m&x8#/~K*5Sdp@F7()?~Q1I'R>29tM k [))Ә]yKgna*L#}%Uuc)9z\o@omSy8fb#/!Hq ,mNuCTSuCd#-W[XN:^#PC!JL&!Z;9GavV>5.H^&:#-:Ġ X3%n#{lK+xQS8m7apO?C!/u4 |#/~<b"TA/M/NON60ֈj2PFutыd^=WrMj;Qω}0b";̅"4y\4!Ʊwm:m,4~)m[NCa%~ɱ^Dzs]`Sު0"] {Tfޙ)e#-U Gޥ$o%gUvN ZG$Ԃ5s&d&!MBo9CWBmJwxPz^,=R,r*۞h7(WXqv;E#%]ӧ(.zz̟H&kL oǾe#-fqpiS#-kRޣd&zT[&C8aH%E8G|S'p'qe>и?YH~[{Kl5Y&o9jAzMblLvP<#Q;ulld@:l]ĮB,LYsS"AҫHTba!ߊ מI>hk1ϥSt cP YֹRw>58v_AK`[#/`Mޅ k7Ad(!HZc>DqZӓTi(⤂=FQ?w9֯LB{ؐ&V҆DXȐJn" +*hЩ509@:$;6dFҤFK3V#vr&ysWǕ>H/$M?YH)ɋA&^cIamϤ6>I,왁&is94ܱjp73&w2|4y0Ur523#-TO4+%!cߐށU OɰlQ:5KέPA~#-AVw E[Akp|:fǏξ#/{>du诎{zT?E8ieD <[K/W2 ~9f]>xҥNm4L#_,@&1(#%,BJXTyp_ "}i.=:w[IԒ$y p}Xu/F2Mj~95cn>l+<L,\9pރI4`= 𚭴FhMr@PtnI <@-2]VQ9_;КhM #-+t'#-շ-ObF6l11hȕ͸;Wl,uBgpGh*]$NWaCJ-$FSiӷ_ӜM׃\Ec_x51g1ߛ 4ֺкx#-9/ΡlJc^f̏6<:ujwVN^ofrcbMI}`sgYZ#Z)#/bҚݻ'nyyLd?,(F!]weTH/{.W(TQc?|~5ώ$?}F˿q߮|{H##-֒"}R"Uo^-L5-5~_o@˃3o}t#/X?a<9f8c[؁+_)?e8\*;Ν"]>ȔK-ʋ&纺lr,{v:#-}/k"KޠKQL;G/qaE@RBBUSD;N=mulJ"1k({e#9Cl#-ۥ؋F豘&npЊɉ. B!3anR49ΐrbیkݍvIGSGsfoSeWIcMDaLI(z2)N%r,SS9Dgm.M%U,f@pT̆~~berJʿ%\/07X`DžZnK87ٱPxU60R'DNd8ެ"auPކeS7OLXj'6K<+uM-ҵ^zWfՋxSmꞮal>p!Y9Ą8bz74-q6jWWRP~.M%wxFM*Y34,}ؾQEUTeE(Nyp;#N#sFYxl#-иN`%@,k/`$)H5#/wP!(+b#-V׮rII9MT6pk7Ț0`Hnh\xq;qy؁aj"6΢;hgd.ô5IDq#%r(̪Ul'A`PxWj@uTm6RAm7۸ˌnSᙰѨ#-3:QF-B]:6AD#-CDyHBNzzpOb`zmV|EkVe$nHh0ϋdⅽ=Kbzj\ `b#-W^ W]5j[J/"%"-@)")#%$ ~z{{ki}#/X)4`YI帙|=gH5 (x([-릷+nB@Y#P#-DAdBB !*Du8gK=;zߠ^rf5vA=m[􉷬|td%x3WJ.",#-e3}kSydPQ"݄C]v۵7yl^$:sf5C^t,HT&,#%AS~1hmmj8$4wo:jjIᾉ&!Nbylr#/PKB"P0tCG\Ddbr$=CMmgvX2@MVY2Mdl[(V* 5M*[5lg\x$o\68YtJ FZ{Gͬ`g*{4,D GqS^ClScYmqC*gsN.1#-#-.x #ֽOME׹`op$iLgrݩ\׳ "#-$JbSDf){Ls,3ntPC3N䏓PSBqȎdCc㢰s~y;Qhnq+WxYby'^ N2S]Ae:vseF$F!EVTL(kevPć$Hed[(`9& sZ/_dm0Z#%8<,Yz`rO#4ˊDmLr$pGwBK:Xs.dN+.\,ry+A}#}6CM7}4! \K&iA\nwՒ0:H#-.@`i@#-]$>&N'X;^ִvp~6k#aĞ'׃+קbA^X3}aͦ,k^O{9lmS>p3;'E4C=I#/00dh=e&Y4a8#-a D8@Qb'BΤRU!QY#&j&2m6"BM #/6_oz؛s'kW{8hZΎi:sn! @7ovЩѐY*T2:`XYKz;kN[Ovxs9 3fQrCxGLnL1ζ刖% k]fDWTsvHj+D#%y/ʈa>S*lx|ZPsKL!g#/UDB$}hsv؁")75#-vPd3`#- &'}ᇋ|LO= 8)ࠆǨ. jJ}320{#/=C:'m*yS,Sse@zN^t9#NuY.^]`f&f:x ':P4}b7,pt|-RU)xc&+u^U˰E28KU&7xM|E&F)oS2?pNRC*兹]'HZ>ڠ̅#- >D},: sv$I:<3q-\s2͙lh%?B1^F乸PaɌ0|}/OK?Rׂ?uu? 13/ƣW6ܬMVi[n\i.#%H)A}gޤo|pfMȶQ#%>Д[SĪ]j?gMb:NZ4 BJ>w^ob,dTXB]5>ȣ4L=ʇݥr?JDLX]ǿ^mX_{1kA`:XP仢9iVu, b )_ڥnL1pȎ֨n33υNH0ɘs} ]-#>{Rj0wO#-.BԮsg>'_K|:Rgl[751=zfaÎF^u䤗-nPzSjXkͽN!; k3o(xN[Phڅ4ٍi{M?sfW|`Rl܃"AϫC_G[Mo>?7Wᛂ (tw/q֝mo^*XB݉~O-W0.!5rԵYNB7A ˠ}J5;/Ck|,gG[K:%4lN\Q O8`"pf&5UMɞ&^zF+|Ϥ|h9IKhc9~/NW{Gʾń; FuMD|g=L6sD>Ϲ_ꮪ^n$dE['mRIRZ\-{[ɶ:,QF>.(U{N.|-SBA'ɓMm`em*,9*ECW9,0ʪV6X®5 =-_rQE^cF1Rː΋X[{:7a|m4{LuΥ[XW&'w=~⋆=.-"5NJλ\ꞡ,wiYڦ0LO8۽o77#-՝qrѪ"IfKSrUty7}wMWq/ܔ*|ڽdW鷃ZHB3P hϰSkyКrZ7۹\&0L̥ 3Әx3(>v+.K)12@C1РAC?v>{cZ)k{9K8~__<:Xuq͜qz"hE89-!ǖDyy{|cI\+TdV7LbC64k/|"꘿&3ޫe0yx2_]SJ|~72K'o=˯+>_w$/)s,'l8ˍ·i/ D:;;#wQU>DEd'pEeK:[e].ڡk.cMۂ& ]^]dEA_=]yqϲ&~J~i=R?[\Qs`8ATΗή<2f{( s:bU('ԕ I?W}X߆8XXDM}"PQ*J^syoТ3Ġ:b$?Dr ~)&ZlvN"#/shMG#%o{%χcaBY9#<#%c&0UP7$0G6G(-It:]z"pgV)a+e=֎P1NQ5(~>dDaldC%q! Y\6g#%U|V֣?V1ކ "ޑDzR03vw!oHQ³ !:y,Mjwc0egϵSH>^kaRXt7{ؙ'LܷXtPl. 4?Ge٩3r]΀=h7ad$&7b58_SB&tNd4YxG#/ԫިo=$.=v{lmY)#-I`{*E`d N2EC_vJ=IٵJNB|Xz2v#U #/7"'g){J)0 bH[IǥWUeʶU5ޡ!UTpq0 ֦M ЫN#/dMJ?muA#%#/Uī#%T#k5MJ& #%]j1^ʢ4y"uEl>jjeVQR+MH-V%jDCgji0Fz d&f9ro2%)Y cPçك# Iw?v ~jxCgCr"`{cC {tifNyzID4Rk'>llxygHWM"F%" @|#/v'&ed$>Go۟$ 'A8<К6[d#/%|=_8:NSλ7]~Unkɖ.BLnp1Ht(n']?WkCW#-ǾM>+ *Ŝ9ҥ 41;wQALlOO/yYN":}Q:rozI%Uʖ>/2=R-D"wtq(܁2Ξ\cݜY_UB|rbnvvըvϥzc5{I(kM-=\'?:?WQa'[鄆zr-{]|&>%B=?Kw,~;g\\j>#lKK"<_V; #.?+'${=ݘ g'at?1'aJ"NɫmyY<Cat$ȭƼ5Y}Q7_2pGQT)$,aebT;;>8\@J.qkɗF"͟[S45x!f[ganQ=H=Ͳ7v?DQ r I#1<,5M9dO13YM`>띜!]?}9#%[ Ok`6l{8jI3_ XV^DmvE˷.`-6s]tc=hxnGvףw 8rIBk0g&?(nA\_ Pp&Y\My)<φa8p㺸J_e&B#/F|)CI3/A,}0wr>,buӠw;QmjmvuiG oMweXZȔ3Lղdr+m[k|ׇAc36}=o}:V6a=\S{|G:+mq7b$%w_\4#-D'!TOl;ZU CԝQ)e]tQ$?o3VN~qVb.K_iYmki/T̾wDx4\Zܝy37kv{4!Y_,ly#-M5L|/ko#-G-nI󳂨Vuyѿ]]1QUo[<qdȼco5ա@gN"4ѧ4^GHlVY;vn*]+Hf(d#/۾}~B2zzu7}y#-&j캢:c:oxvqG뮹4%H6Hzx3 [#/9CmhwY]kjՐZ,X W,B>eu\|1hC:"?E&_7c #%ճ̹]j;F!.qQͩA *#Q|3$ ϣ.#-ɯcMvzo}Nɴx+JNW##-1c5se}NpaF;QCf#-D#- nғ*&fJ3].\\LxPՓpuk_$x=^@L\dȽÿiE#- 冢܆7W|2- SQ;K:~YU8jYAוebͮ#;Џw5:RS#F<=Y Ѻ-x~gǚуҎrY8 uoW?&d66i}Tܬ9&4cZ>& @8GpիlF5ǚD;M$$$n5#%vGxzxڷf!s(3[x̌MH|(uPz\/3A`^#/oRkK yg$cZ7=#/pIl5#/iv7^]f{=>˹

< 1#%"Z6?A#-oỉʖoecN[2D##-Jጛ#/0:ԛid=ɊhҪ1 Wy3 7#-i~|RW!*ݍTJmdA$do^hNfC^==2d`l"5"L;.7bdf#/ah+<&,r|{XRC4x4r{YYOJQ3n8집Z E[B3ƒ#/ӬÜdVP,|ojhC|ħ͔kcA:D"T~褯SmL1rɉv Q9ߦoF_zgk{0Qm5MkNvyÅM;]pfD!j -hlKԟ[倇XƳeV˥]Vx:XVvƛ5fͥw5+Fr 9 Ps\ Ӆu[,%UkA"4qŧ),̚\<3U_Æ2'[d^m*#-wV#/="Pȟ}~~nU}FSgI&:#/l9ǧ:OAsRv|ԴeSDf"A> _R~N=ƥukz/ x|ϒ؛hYDfpJMG-.v:%]O#%pOǯ){~&v1 &!oDN+&K>PO$o5ލQ0`YCacg/P2vL{n[-&+!ۣd_f!jwWHk&zfPDsU(QqNJONݘ`_f#%mt,&_ɟϛ[ˆ?{١'CY#%._K3UdC'5U#/.Pz̦7ּ;I!paU[M#-L~VҖiI{@W+p <І%TYRtcWwmpp#/JCyq>!"Oɓ\Qv>CIj)TSġ[E-ʻ!o,`|vk &~($7_7r&5W7*X(V0*.5 0 %cv-oP[Bė?Vns<^V]$Rk12OՆ8;ל1RP JT{#/2:"p{pS}f.ɉ5`63$#|ƒ#^| {ME~(jnף2T0Mc"瓌umc@I h9jHLz7鵗I&/ "'3b1fӁe%_ (9L-$!zN].ÈCN_UR:?#"ɐBK3",#/i 6AL 4ܩFja@32sÙ'O_Cw8sX埾 sC dJO5m8O^ތIrlS=K7 FvqXf]dmffF#->&hTr)#&uI$7QIu-ǘiՖ\oL:f^LXa fwGVh!AQD2;fs/1h =#%xDN#bidzd?Q1:Ӊٽ=H0(%'d?871MxQAe#H#۳Dždڮz-噑/6#/5N3oz`$AMLqgcq/KUY|#/h) %-rDĢ|"u=TߍYOa|S&;}I߿nd_2z=klp:$s890ǃDc$i~;+REJe$b#/FUK{;goRR8*~uPި$Im'h=\O7H7֌_ +FE z HY!#-6 "CƟx{q7+U4RԅBB26)leA7VfeBP0bR)Q2?W{pN:-+h"ƾ_|NڟqjO~&.c E*Ok$! b$iL%B|b&!9;3|C-p@?tMi#%4C?qqg"#@#%Bx|#-%eΓX|N>t(Df_6qd;#/A#-M(-TK7"z,s0{2.6|#-ߗbɮ%a7ƀe:Z&2(EPNćXs9o|pӐ=ߩ!!|:==T<#%dj>pX"TOxAрlyF=TفrvP֎ gֻ_TlmY-$)~+굧,WN{ M[.x'7opp#t$e!:#h?>,||>1@9?0?o A&fխ?Ė#y8=ebĮH<>Ǡ4#%2UJ/s~37[~-d{զ1!S0l4݀AjKd_q@9L*0jupʫ  8:2FA04EV4㋒7–d6#/:zKwDL=NoaKæ4`,bV~jQ-_bX 7<=Ib`#%#/8Ơx܆ݩ%;(~KAIB>$Aw?ګܝ[_AESh xC6 ab,CThV((3LFWǼە^ºF!1ef2iƸ2A&߇j#/ڐǭyo_Ř2H>$Ri“Wja go~Ǥ0n:<ʩUEU!`C! 2d !!R"ҎjXZO2(f.ǟ#y۝=" _Z^c#/@D)'*;C34=#%6R#/:a0>#jgc^kڶ pڣnj& 49 <&ܶF]0kxa!?)/-RT1AE|v%|ic*By)~kGUHxosGV6"lšVczd5!Q Ȅ7A3H #| t38w֤(STO,A3 )f9?*)~룣$ˆNH_>^mڤi7AO (@~όٻTyaކHi1?8HBk_:=!7>tqׯroz`;d$ze(_ow bVAĿG)٘_qzT㩒@١g c2oS~#{!+W;0c`n}βffOS`M#)|?UugD8( [`ɉv53S\ ĥUcƒ!?#/r[* +Oc`Ǣ`d&aPL!RdaN KC0cHb#/d".qU»-R@tګH,A  *b$10Uw`a#-@N#%rFf+T(A#%v%"`3GsUFêᷳpo j HzjJ#%VAȹ#%vk9Rx``sb*x2 tQUS1C,\?g}x߽謕q~G<'U;KKrc N!DE&GK嶅"k3j:_7 i1'P< 6+I`FfZWky!LS S(x_|եJ7ɡ뻸CVuUU*6GWDUԍ=jh6##/ȢQcw9&=#6h7U 9-Tn,$UqZ}ws'vE+Ѫ;#-#%DfZ_ 7(P}E׳>t;;"(KiitZh Y:ޕ Bic28yo;Lٴ 􃚡EMA'A1!H5x #nGl'<>!zCBHv.dH%VeU-ínENilFw~?AnuPn)<_{#/3YׇLO |%NAj3BQX(bbnt5#%P߷~:?zGَ@M~M7|j-k#-a#/Jd%|)BϲnmCLñ@#/JZ[|%Ɯ:uSP}^r`֋5ɏʏ}8iPs9kl;:{830{R|_/J>ٱGx.X#-#%f flfH#/H7o !AERT [xγ&Y UN%ȫ7BK0gކ?|VLv#/UH$*%@!]/xvtס:B.#%`\:E^"`9;:vfTwF}{]hiDA^{ U2H?dOʏa^ml;.uSvHP#-#-kJuP@>(%L$TT 0JZ){/oB;X<]#-UwIHo}.뷝-Irhb _3Dֵ}!:|F"`ys69Ji{d~0Ãc}+"!20$0_]K@cCݼ#%+`)ѱ#/!TQ @W>wP7w[-oXj3=^赇O3G ܖH8V~s#-N(#%7Fj}G9`6p^BBM#/I#/#-_M\j32FqƫŨ#-x5QS_I$HeH?dSV#%VkKia!k)^H`hf ݞݷMbyo3 z1#- &['1?8`ÐKTQP0@yfȿp{Jn 咥y D#-pɸOisxp5U/8Jfbo|x}4ILC 0YגafRqݝ*E0y_jcFE2i49g3#%eGE]VQyIP~\&BG0tͮjft̶O)NJQdUhl2h * "f#v&cOEtiTQX'B RbV*i6wQ F#%x Q#%Ќ.&I/Ղ0\&0o~AbOc-#-nD+IV#f=04 ~#-qɹ8}iA"q;d_]v>A'>`?f߮vb-dD?!>.iLu^]g$BeAdU&a^Lvv6ct^h-sy@I6n7ͯWD;>3Qh;\WS걗#-7dpB?H5w:J8<܋AFѦPGCvv@j^MFҙym#/C "#%Љ7Q--@'PE[v\M,$ C]:+[|xs[FnI&6#/Cn}% 99mE<0a$:lg |"Ͱ[@=bZkqp#-o#-!˞)3i]Hs6v٨:RoF4͙3"_̻60sK''j,9"⨶ C+}Ҳ:D?T&cRr_9vYII=vƚ֗c#A/2r)# v _/S׍4/Ov`L1eH~~~<(\{Ѫ>BI>`G:<\l->-j#/gkśDig5Z^{LYˀu&9Iw#V:'B~L1+)#/galR[_!V&g9sQ{H 'L>NSֶ~S&dᷔ'm?dn㺸i-{b}񓳳hv fsv'ce^&?|y][侉K(_oRnU_p",9_1兹Y/Λ~(#Ə(בBi8ZJZ-,JΗY»"~iٗ_Wu/oA[8APzK-9]CMv?3D`ug]]X?HelQI*yOfA^]4F&AkAC$`"k<7UlILzaHKmE)c_Aѷ0ظb1[Z`&"'wzRv|5liri#%Yep蟅%me/̧ȯkf]WNľg*L~tv|ij#(wSIWc/C 9θz}B=f?nZvK{g/9:H?wwao hLͽʣ6H?ZlF\/DæL6HԺC\ YT>w3I0w;&Ưxkߊv|j|ږsvgB5oiKcv#/!f)*#/}>wδ3.Ϧ20M1 QК t:"5Cn: l{kRO #/ E N=+k~vOV*T=<:$:,M[h}:HL/a<^Tə rl~Z>޹ w]Hn0yKeZfau*đ>TatI,vڈ*D#Gs>s:qkCͿǗ#-uz`qi{ßn _iZoi|mZLٗr!fvHvWt l r71 =!ξ?/Vw3xBOOI\[ Ƙ~H#-_gm]{) 1iȳSkꙒ/d3~? aMCK'$UUXSm]u4[0יhkyPvQi )1B#w'Yxvɽ*Ukb2y0ks6`p#-#/#-mWxCC' l]жsĬpnnQU&삠B˽9Ÿm99aA#%i,IßI`!9w$#-QaRV31%| i0h~[a,]kg١ @c#-I(h uO~#%\! t;HNN][([X2!1<*z%V“Ӑlܒ2#Nؚp0laCUŒ:ף8I 84@ư B1pPSjoB-n &;lt7a0Ρb,BқKNkcjw N oC 4ǃJGyɓ`K\jC==>xg+9Z|o:yk6m- nԜ̐>^U#%&FqiJ[Rw$PSɘ0>J?<_0" TDb) ddk)cLebV+gyyѺwO5Ǿ}.I@F|QWvݛ<q?"ޝ>H(bg :^ !HO.!xN`;I,#k/Y#'AnKc`6254#-4=)3b+41!CkZBv!clcbzm"T8FcJI,WJ@fGxq*4x}!Ȝ@vQ[^RmC-Dl?T84x ƌ~7mv!뷟Cޥ0cp^i#/7{~I4I>l!&A Oa9g d!kK&<ץU;βFC@wY2!:37vy86KN$#-+ƉK`f:9kgXV-S[ڵcq 3IT,\d‘0m.cwy)i, J3؃&i9ebM_ ٗ&xTqҙ&ws :4\MkrY:=6MəT#/2ꨐYCS8A&0aga.^n18{99&&"؊Qs% 87!%`q46 6I`YYSC:T&|kQ BŚ[sH]Ha?{=PlEVș`:zzY43h]@tDHPNsnTUc^d6Ts*>~ӎGV2bFv[w"TPp6ݳb X(;ueڠe]N{0#8<hp>в>yv7CY8N%> mm561n%GBYͭ7m6Fhh6ǖ\XD͘#/( BjqQFq7gr0fUZNIP#%E`@v$wCYF(aBN0sq(,a#%CTX1_iDݞf9x!scHB2xK&D+0wOfJ (on7 mq[[gtCdR#-6#-3E"1jzl#;+R*GTǀ蜏\fVWpOR#(/n<"Z F3ȓ'd ;ͺ &Hs(a ul#}!FTAE$O.ٴə&f#%I NᨡrG1d8T40i1hLLie4Fx SKp{f 8UyNW8d #-ɃrHAF PFjM`bvw!ъͣgpp6qTs)rW^n@M^cgGo525)m!{;YJ\Iv<T9"\F=#/>PT+z&\z 6T8zkޕl E4;v$7ޅo4Pڒ}}d/嫗Zy!!ڐݠi4&}nUM(-ȕ0`l4~]>ӀgD  xxPSQS/Il)$%'3jXԸơbe3$0ݶV. #'!L<٪Dт `:F{Mĭr-PӻܺFĀwvz AJRrq=zOXevq Y>u(9j=eHGgbrڤ<OL(Ϫm#/xW!#%Pcb*:GE#/!0B XB抲%PzB <ݶ:#/t̘~δ>c m3KSHJIm F :ß0Tˉ&@kdyƒ#/#ެ B:WdښjS!*b^Hx NQE+g\T(XBbeF#-@EJ=BEtX7V_;$#Sî-BBԙ^GO2PG&ױv̴*Sb]tTu=$GZiM4'1Rȃ&"9a DRD7,5N4{|kS#-# oѳ eIgͮ3;$i#R E"B,r@cW4FKdEoh(P5Kטf{1P1;DL`YtX%ן.`*$HI|u?ṕ#-ß % P#i-CPc'XJn}v?1F.Pap#--voS +yl1s4Q`@I8u @A#%d#/H(A` Q#xő@5]Kt-[_#UUVmWeV-ZUȁP(`؁b#%V }ѨgX*Ma>Chpq`IxVecP5Q*!H Irn`0Lm>WM{"/M{)$Ž]vnoSz /r<nn%e+cd#/тIC,v)ZZۯe;dH4=s$.K~G肀F#%1|-: y)xDDrYG$lC$ޏ?58-Y A\D]ƒ=Go\hؗZ! U*s<PJ;v[.ǗT>| (#-|aܬ H>`Lxy#M~%C͖bTiзzILZ^P?/r[Kb-~P!LfI#,f#/}?"Nª1`Jb?{-q%lҷW޽fQmmm$XMIQXUM6i&VdeE)#%Hd0S~C\KIj?V;*~B'N+"D@#%o$˶;gnʦϪh]jPs.2 \UTQ.2, cyA#%KZb2I9Y˝WD3|qwE}yU3(awR\#/DmҹPK`4B0f 1 }YV#%IsN(/ H)$`  #/B #%>`'= W5E%lMc@dae$Oޖ)DD!f"'uA}ޡ(R0PJ7뿍0e!P C=R 0Rm4\(\ۛ\rR(f QRmlMDDX4vV%@ܻx B " wjיviK?qk(H61ҠfP wv) /fnp;#8gWyڀ hF>%@(Ʊf*Aل!NIZ?-|ji]5* 'h};0xxwYݤD]CCtL[IA\^WfCZZ~/?WȖ_t!\y-AA`gRuTxr?U`l`Lb(T.g73qG;Z!Nn$PS稚F/DAkYgPS2A a=x:N]d@)H&.?]ZwWy`(a"ACo+onˆcQIv={4<_pjoH4#-j7!늒ஹ\*U 5In~f)#/O|#S.c%CDs^Qc=vY k07e]\  + NȒPbGh`2bZEEpK"S}B81#/Je޻͌kXR4ePW8r5!ٻɝf&"P#-kC4M1]y@v؉{y]2ض6-'X==?#%]4Jk9VjD;HBSJBVSIIPiF ʣx,U]ۭܡFT0M;+S٢ߎèuCwbMI0dN:"GLcmMݘfZ#/X Q>M9!pqG' o(>AAMa9 D,#%Ӥv{ō~xu8:#-&x벥ecpK#/Lr$^˟F)7./sh u-y1ݰYRu&bCcs(:#-o/oFmx&o70w`txz8mNtXy\9Qڳ /yQPۭT&Gnl9 Sn{3CEKg3zc#/ؤlq2 y6ɪp_Mζu;Pip_ cSn}jv%ڷec_\m YZJ"6uW`+0} > uPL2b@RExUǓ;UaKqtrO<;AЇcCC#%C_xh}1p|s3vݒ\R:4pf$u+<ՇS߭1Eg^E]^xq8`Ŷl~pTYkg36|I3{wѴ]>[￟}Y!~p8:2]MjY@ԧ=͉bN#%5Ixٿ >#%xX'\WHۨj^\LL\#-18#-R&%:"Tb0vvxϫ"g_d֊E_Ȍ4U;yIzn%䄀Hsas@#~{⹝x]:8s˂hi̵j&:#/F )vq/!9zCs6ؗa(]6sHA[v>^4ر;ZY9P+CCMSRͣdG8/?R:~K+6{*aq`M ~VUP `'_&7(brr{Z،)**\,%mIv%:l܋[JI|jkQXXm!bQaQrnDped,"i1Xa2@3zHSXa5Qi_G~e :bv'c$n/nO<(% ׍.Ht35_UW+ulA#%clb@| $#bfwmh%|CwCXi2[#gmZke1#/#/Ѝwemaآ:<%h)p6At_el j%ohXw6ln< CI6H٥#/#-cThKD"DHKVJiU6(!#-Ht]!q#/H5AB'm,ĺ*0(X|ݝXj6YBLlFFHM܈%#myR*we}[I]p##$HyoY.2(GrAkpB]6` 3@Ca-JZm#/##@bR#Lj4 ;"X@P%bL6#/ȁBk Д5bI`@Ȝ_e{ g1 ;s,DZ^STx[FS}˱ʒ#/QB6k#]C#-#-wBQBSKZ26="ÇI M!KI}h! Fm꺷ה&L]*rș e5 k(+wI#->z. _e)Tb҅K|f,̣IDM]D ^ktWK h(c1;lJ >#%hEữ;#Y.8묜@,qĵeWU8v&Cf#k79v#-xXqdǍtݚĄY#-!Ra{SmAТI!T(A6Ũ Ă*u{^_U7ޔl=ICwƒȲ6ϔ᝝Y|<.&H>@4Lb%0}zoּk_akd-קλb/̮&V!8#/NJ#aTh:qE4 ZLc8Ad(DDQLI`x@h'izhD#-"GtN{uvRQd+f/CH{6h_(R T8Û/ץ8_R@{RZFtHF{}h#%v${io&qhYa6" <+Jt$!_' ؓB<\vj8Uh#-g3YJ^#sGX^=Rqg>,K@Kbe#-\#/m#/i#%|i4ќY;˥Rf#/McdžprňתIXXɮm(bU>׀b9bOوǡс(F2t:0MPC| "F(C^ފT(TR%#343\*4ɸo Cy潥5ck*6B i6]pTcͧjL9x1F"cU{XEBl6jV@V ڢF5o._7ݜGioĭI|}ۂXiKb,4jmE{׭ңj1FT<>7:}7;#Ą߄16dHxsؒnfA້jZo-(w%K$Ȇ!@c+y\U7.JQj w2|.KRD6Ad2Ml .p5٤l3iۡ!Т l M6l`9*jdx>6mJQpm[^F+]0B1=A#%YMh9t!*iRyG7'8B*%c @R _t1ua`1 #/HyffX8-z!"M빨GG2jnsN~.<)WG}FiTS+k>N oU1RBݘݚ^rX4 3 &]aN#-0Xc{0R7&ɖ 0ݩ۸ -IdIJ0ƓPqH?̑`txsК3"/SZ*Z.1;Y/SB݋He".j/BgI=ޏzIʛ Edtm8`dtha2(j|DM !'tdaTƒ6FfYK!Qٌ0Qȉ3ƹ311Ek6J,0ϱNUMaY+H\Zmi&#-4/CO#/wd{ /c׳}#jh<72](^{[SiP5EOSQ,OO43LWmτ A..G!7v6ڏ^BNݦܪ^6ikkXSom&mϛ>{Ȫ|s@tL!<}ϺȒTDyܦ95?v^6h>ZAj*[i#/Ӈ񰩇tߜ;>.:;4}v,V[ޙ߆X"kf2r57iK sZsy lI5XѪ5LD 1mGNܯ|\DngN' ,:wht41 g~"=K{v-$H#/66j46y?Bw $7˰(GRbhcwu `^oY90\hTweIpm23/xeƒ`cZ3 {0v]eլY{-쵭~FA|C!$3ϯJ_q$Vy$:Y5+6T#-i+r|%&of ސH^3&8FbgKwQ'vD8)6[U9M{mal6idOă#/ٰ ,Ӫf@٦jMwPk{+>9tH 2"T 3c=/k&pqohoŶjSululsp0kb;1\(=}#-ڃ\ݒHbN4x|j&s͛2w޲,DKXYq+uܚnFr2tZ_B7FڤytBCj[x{2$'p'IRb|DlUYb3Yq$59~6V(xTfE3;9|n^Jn2dFɱhlbqS=i( igf4BG[:»-m&3fFC7!ٱbB2kfb2l4ƈI4u*  5*Y6iJE6K*szˊ{xFo/y]o}FD$$L&X|A\Y\ߜ*G݈wǝfJYt#+Thu(v[= i0f-=`8x+3\y "kO+f6c7Ԧ[32!:-rtڜ7CSd[]6s#%L$ؘ}VtŃ*cg+;zSho7hBVLֻl֢{RqeE‚_DTJFk0Hƒ90&T /s[m',fc)-չ[uofnlO1Y,.~sSco#-+u0je JgsisX.j;N2hx٢noS͎O`;4#-howY#/޲D<;:-K&;T^|YȍGIE8f$cjeipng/wNd\r^rVrѴpedXƂ)'j(Y6pnf_a x9$8:q-N O)&PmV6=MQ\@媫0 cVRa騒(4+j0}Op3HNsj^P8j#/ 53S :8£zXrm\1&ԯEKӦtkLyZoV[̸Gf.'lGZ]bwU{p]@`X'RL I&Ҕý덉dp}(+RPTdgN4pM[Ǹ1o@DZB& )@*ig|3+,9&a=j^,tg8$3Xu?„ |򇜍Hl65MFFvާ&4e2%v)HņsRHnRakL<&#-P;1yɐ爓6xz,#-&63[3 hȈ#-16LީAEIBeMe`i"2Ф=kLT%$0qdi#-%'jg!-Z2DsL§4ZwAF^9L/1#%2/#/airlGL0)Ӂ8$ c8z̹L!#-"clKǩ㡼Nal}qo:s0"47U3sq8lpNZ>&*LPTK:;UQkX&)aF#-LXlSxcx&CƸjux%5`̤r&|D s萩=NC6K6үo]_^aFFH#"!3,F 8>Ja"Z$կ֊ܣE[Ěݥl^c#Ȕ#/%:ͅ&PϩR"9#/@#/8",)@ ѡ}#,p>dȸ|>cEC'C@`_CR΄f#%Uri1p `)6Y6M(;"EiA ote#-9,dIEoL*%4#/rp h+f>z66IKcZ-F6&5&b{5hB)hخ|F™>P;{4$ABKw)wr y ńS;M#/N£EH1>ָ݈FDCTJ2eUP#%nԘ9ڎ%H4riK92o`<7wF8*#/cxQkxI0 z љCVQѥrNˎ$s=B0^e !ώ+amuh5#s(*cX%d#I7-\U/K^U1fRD6iMY#-G?q+P5P,)T,dUdi0`_0ޣ&TyTwh@&FMq[bbcL|/w=ŠQ9!ꔹd!Ym#D"v膥\QB7(ҚpǓ8W u1LLBEo0o#-#-3l8Ot;#%t7H$!! cZ cq*PQ%4}KK2B/`7EQAF*EC%5#%d>}"竑Ɣ>H]D5YU0PaPt5haV;;EVӑj.?QLSLlS,.Ɛ6ܑ! U,yQ!"-F1&AۃF\`r4[#-m)D5KapC5DJW3'N6:CU Q*j'qR'vs D)XnA2i8f:2e$bHwvql. 4E*)kb:~`PBA҅p\mKfѺ#PNz8q=8;VCamYl;It˜0,B^7nl2 E4HB0#/bQ"l%ƦB `1N%AP@ #%7Q #-l`%#%V(E6#Pk׿P5}M}ds&}4E`҃0CT=a v%Z?` D>肺bb#!5E˖*˪D#:-j,j5kF&իjZj,Gmrdmi}^+tGOk?#-}h{܏i5|emkKZQؤ|OF˗WsDKhⵇbcY e!¹tRc74u̼t,]0USbazQT#583 `i#hΡ)#-@IA#3.G0ލc5`[vB1κVu$J4w 38jMs%:a8l)lqJ x.#-kt!mjdp!T4np`mx0DAJ{"<9*q*򰅪5˗.ۙ"ӻ#f*}HyNaf]%ЭɴѨZz[NMyCQxLIewOuT0!8º}5)ڊ6!.OsKqpHDŇt35e)AB `#-E`$h mTx`KJC.BF#- Z16&DU%#-(DGoP9 #%P*;D6d! =аocD #-ۓg˕$_#/hQ;?E$}[NZ*wQ/RkLomRԖWdƩyJɦإ-FƤS)fdiYm)K}k)kinM(66Z'(jWuj#-mh)(RԕP1ʯjcWv5.*D i]F6͓Reί#/TMe jjmi7ZڊZ1hv,^^NծӲh\5՚Ze1.FkRiaC={߷7Aa#-nd;w#%Gmt<矋es$7B3qz5$8e;q#g ~'~ĞF]TXL2ZSCNt[""I2qD #%eV'tKMڑVF"u<٢X֯A9M"+fK[٪K[_#KǺł QY#" #/TK)3Aқ(*d$vܫ{-[sdfR3j(ZMLɭѥJmC IXi(ģ(Mhm6SHfS##-[(ɒK#BƤ,XTPTTʔLje%R,(mf#%$ł)0ddeY1$"FRͩ2HQѥ)5K6ړUkխJZm&i#-%Imk͛mKVMD,Pv"2#%ҔZ +W-ZDִ #%N; 59~zCr'xgۄYh9) BƹjrV[vlُ-a퓻h+rwdF+xƺ6uv-6PLǣLgTߑJ7i(xrJ1.`}BƗ*i+֙CX$hJC #-#-#%Ng3XF1fƸ(F* 0U;@NjЄ-B\AuŽ7Dz:UsO*yCOB:k&f~&̋fQ-wzdiT7e,gh$Сm!$u^p{߃bXnL_Rv#/8TT>K;CmD}&IلVsw$=MEFJ+bm홋궩2|ă{ďs6XEBу v! #exC ްr]\RJIZ@#%#%6ɶƪoUv܇T`)El `H #-dN]WmUQ],{g!+ H+5ay cTk;F@p>#%%q3=8S1𙙵15 T5˧nx`r.qFɱ^(v@J3$oa スٵxХy! i1Էh`/Ww}U%O 'kYikqɹ$hXKPZxKI;tnn !IFki0n P!+]8ө]q8V^)'}G5l30ӟ1Pi0HlW6J8UhZچwXp#-yD5Ck,SfI0/D/J yG xܥi@iII4|=wQ!MĊ9d73ۃqǞUTd4 :o*)kF,gx5\1bMOʘ =e#/N:.RBd`ځc8sh|nnw=W#/"vC T^P'e\fz:q`Pt"#%@i `6Azp(%cc#%^ hm{WwϜgs:R(_ `Dڍe6)HH`; v#% ʪ{esvN"?'8~f(7׎cD&扃nֈB3tCIϟ/m@/qY)*Qx]C4q2PɇMԽԹCqu#/fC#/‰8rUb*QJ =E,8gwY\iwBu4!0V_#/wR*e^ymO$!7kݠq+xYJ.݀qHT<%w]ei>ϝͭ!`B˨r#3Atd@B_с;Hܜ HR [~d1pO9-=UޜʸTXbk؋itOjrw4fLSҩӇRc)#-Ng]pc/("J>,ݙ*(tB'\C"edbaZ90Hq[rY*HfNVG:ҼMvriHC`=#/q7c8=1#%cbOWa@k,YVj*84P)ز!Kr^jرYIe#-GwԳoș$ׯ6mzI23uf_%צ-bzoo:SqHKn\/do%#-YHb)D`>󹿭,!#%1_q8na}AQ#%9v55'=rBMqIvN滨A5~K$3e6;@0Fr4CX `֩l6K`,-J j62NcwR蹫ĖFZh$(``#/#%eL[)m5*Vצ냃piFk׵Je>X2n^ELIlʈP 0`ɡcfE ?$szoph!de! _T0#/TtBHm -'O7cd#/#/Q5_K͓`9x#-rfw#/"H#/:w6*fk!RU1°Ƕ\q51+aĎ wѴ"l-~uz|p;ܶ7pvv;R$"D!ٜIzyCKfN6oH-Np:q5E6 @;>^w\vlHy"6\tUJVAD#/FŘ$"$FE #%)wi_icYq"?c ]"uB$(Rjh2;>c~$7Fb>H17'>d9KT\4$:}]]xEQ1eg|49b@d7@H0#/o#in&O.AF]Z 1Ȉ *[I JsedDȄc$d<T%a* #-=}DY#/(HoR/kMhCj3U QT*r8Dp$`X-#/dvIze]L"2@S|Pv~ZIF6{`^8#/,Zcm\񝳗c`AlMe &AIkcFi\ $,#/)U([Uʍ#-161Y+@F jF51Xf]Ti!ݮvGj6i"4CvK3Pޤ0ս[pƽɵxіXjcB A8e]0&ik[ :LbÖYZ AFhkq%y;wnksmJ\/O;gk]v+dH+勆r6v\3Ʊ$."Sm2miYUBӺ5o^KMLMIo&nҢL-j .mi6Sl[bT$H"G DRֵ-继. 6 s{C5r =eYcuU { BZhUJ#/D>V#/FT]/ 6L('[,^puv 5Z}1#-zH DO"#-n_*JܵvRۻkẍ-X,5QkH`49lfAD#BEmJŷEbRI$"4B$BTҚb\4L$P2<Ԭ]"K1(œdXXmѥQJV#/U$M#% X##% ,e rIb*ۙ R-tSb{"2"@̻5?3S0S smyC&zH#/ĆrEPvw3oߵ2`y^3X({ 0&{;r-N#/`w݉h3ׅeqvbdr#/kC@dvEJ&Ϡ26£P}'z#/U#-vE!_o+on۸)$G?Z@ŤЁK"5Yv\&b)"EdVv}o}g##%q;} @ U7cTQAj01B}5>l*Y3aIX=G,˩?#}09b0BgpvZ|M#/uo$Ca⣛;$ɦVC-k0@uRPhiLqGh4PжAP*hY#%?L#%>I|ú@I$!%TP} BBF>FzN#-P+uJPbs.~L{2fPᄦ" -EB=v9I6:ju%\9/#%ѡiؓhpDqrP$ѩMuPB#%TϢ4DQ0& P0lDS;*FQCL~3zQ 9"#-nw(43w @uifCLʀrsTLj49[NWKڋY(7`1c`n)`J>DbK B[Sz}8;gɒ0 {Q76Z֐:Ln0Cz;T4xx hUt4/g'LáPPBI;:ha6ƽIMC*M6 ቼ!Io5X^)k4$ʯ?FKɜ1 HkE![mQLb ’6HA3&7#CӀX[9 Gpa-@…T< #-Q`էv= 5%ɳ vbDDȢ@ΔL#KARݙd7ZƎdh"btF#%sAKδHO9Q~.x^,D#yhmrexHQDpaE̍Q^(B\l^+q&o#/ta `s)L#].Wv7M-5/+@i,GS̈KOG—&jdeҧ0UP@]4*]Ύ}?c#%u(v IhIZib]@Ojܠ\3ct٠7ad83 9騉ԘHMWȶaWI!U ѐ S=C$.C=oz%.x7)˰VNքE#],"Ů$D0BP7/KX0g3&`L0z"8$mq mHh`!2[+Ԁ 6TPPDd;{LFnb#JK+@$U×>"b#-$|TI#/G*NIo6հ_}{1dN\I1/9%iӃ P5]=#RҰ~a$qX`Q1tTʼnQZ#%05Qa[C.M4Qi^}n(7m{P,R]jԵ#-4=J;;M!ܲ*Vl6a:e4fJ+d4`[U]q g#/,~RwOmȷlPPZP["n B/z]vN8`G4IhP(#/! җ#-"jɛ׊J":۴fUJѵMd4rMw;j.YMP`wx(/SC:ذxAv6pE䢥J) 𘅨"zInf.X,#-Oюicf1"3ov#-;@txHG4\-2ቆa#%/@ `Y#%*W#% RHiAf=08eUe[`-"ЀB"ZKɶ$Sf(Mj+Z96E-0Ȕf#-D8֛jK0NпõhJ7VAӝ۔@!M#E :!e3 0:my߶@]\n3U룫e -]|#/#-^p$={Dա5UNby !⁕EmMo2JfFؙllZMSMV-dS/VjJjݾKg ~c儢0q>Ao#%`  xPq׼MzO#/R}#/ѝ6PۑWCeU?1#/sնXf'ho..ٴ7{XjOb &EFKZL.u Zd[V6C+P:UV'^l"99{XqcEv8#/3`lwGh4 3uQ ndp+#-%Mb)#%RKn}#-9a~$pwo"Z'Xy32Z `񔇃?תN`ⓟ|sY2y>)j#/QNw5(4aP45ө+@c`83#%7@IsAY9U1#%F> ]XoM4N} Jʖu6DՋ.;NLKfD][5 X@GC8F.Gٵ-4# ڍvl<=b{ B^1(h(346z&;>p e*@7jM @jTHlM٦]VƊeV9ED[b#/ `"tNSB]w)ZkRjrAї"R m2!Qt"5iӰ51:_uxY+X2xhfR(J_l!i's dq&27WCp:|L#-G8{ݰ|E'> *dٚ:nCMr؊N9uVy%qu__;s]Mb0VaEDdQ69.t`VHHHl:ne}9;?瀵EA젧R?#%4nh̔oD8tk16b?7cd!s7թ,S !ehXwX>ͳ34޿5:#/LMŹqbӶ,_:9mwD?KP`h#-"$J8~w%nj/a4r#%O{n`R0dm<")4=4I$^fY5YQ-ƅ5w6&F)4C5W׀Ȁ&D 2@ ;h!Ƀbcho#;KmΘ7C̺R`Q ʬI:+P s `[m"B#/b^So!dܘPfz7r#CA3 6; ߚ,!f] #-~ݍ!2ljG%[a"*na!`Z4}pJ:i>nFF9MPY'ź~ha@(%zhB<Ί9g; cggmQmknFMEsm[FFQlڊMm*cZmr454_TTdEt’]jhLdTΞ#/%Tb6߿ 8;Ybu{ E&Of`ōs qB-;i;T537Mld[cHo#//^Lw3:Z3#/Ie%LACxbHمV6; 9 oyQ[Փl5iITIRX505@a#a6PAb2T!Q8|eW_I9$ϴ붦QO.$+bczQGhfo,6JpKL'8:5ȱhi.o#/0ITתuل-l&[ |Vã#-xܘ-i ذϑQ=g.N#%`v´=Xpҷ~*mSj7e[*MFa%2cT((l{1j#/f͂jQrUH#-&7ʚl+0ygMStWf[ґ2fبhkƽ rbTLbhHa*d0Y ci48Cc5b!C@W#ON5#%SA&DADbkLDClmo;0A#b̈́ͅXadmx2i423YVZEdͅZ#/!&ۤ$j(^à{#-#-kVV+18ƒu<53(0lmlZ1jI#-)ؙfԻyuK;snLׯx4|8ɴ6#t(Hr1iB#-j#/J4Ce4+-DHVVEv9HG,QHN)E[lۼUM ITR*.Y A@*" J"V$2(A`иR]V"C؝Vexby i`f6ZIYZAXFV(T&0ݷ 7˜pa!C)la@67v2m)q4po>7 ̱}mG5ٶk.#/4tlN`Dݜ=6 yVn#/ uow,tQ~v(%N(Yz:oOd#-Y`ㅴXHmƖٍ JV+ !B9cbw,Hku6\Zjц.f8ȳ^/!~^Ke簾<1$=e1s̟O?~:WGj tWAeo`4c_"!HXFUɜvh!f1Ws$P$c:3jE38lCL3%]nZV!,֍/_ʱㇽꖊ,/ ^)dHwСBO'#/C#%ǒY ==&4+$̈́wNp :CuGDu~ž2uJکXl>j(@?#%SSXEA-F_iKdvF0?;dnM b- H L>dϐPg<69!ԘM ׶}Yi#-j"J#/YZ( .)I,dSD#- >Y01)4Ҥ¥8 d0b#/A5ْQֵυwZk{.nfM&k7-Nzw^jƲB$H &sX-f2C*#%(N֥iK-!PrKZE "$J#/#/cυׂ!^@T#/e0 6~]XrF(bAh` <^BRdQRȖDFTZ/YjM(l`+scwם˷ue鋕ۤUży*iO3n]W5b÷yM#ڣUrK[&)bX6+dKƱ5wft$jZLU.uEj,P1Z %(6]#%P'wA܉#%Cd;wx@EOhv2%y8#%A!A(N#/YA^_jט3Da IH8E2(! ڙ΄."lP=(ɸCѻR}(P~o~ =YS_ϖ};mj336a $B#/ePr@AXf#%`ET2 k;=#%$&*5RmbJ#/Hm#-AD}# ~×hMsnwv[H@bhM65"KXQ|UR*$@'%.FuKhőN_wYP1$`"5@RQHG!ݭҍ"Bz^#f! Hґt[2!DZ4$Q 5C~ #-OlO{Bg|R8+>{fX#-pAg q,6jY*klEHE@I #/=[QtUh,ɚTJ_oͷD`Cb#/Gq9f$#/a*0bfjZւ"an\1FS'l r֗h ѤTuFԕ;†o#-J=^6z. ~&FA)L?=")9beZ}#- `A ۵JZ8jt4:|m#/H$NDNuV֙>Pі{5i*KUE W p PEGqmhe-?iWHftU:\DZ{#Y&pOw6w6%P46.i&+E4Nw\6"Ĥ#/H54dD0.}T)u979}$a}ٝG #%]ՙE@uuU(Gõ~&(oEm[p!oqJЗYO/{e0ލ2E3qP8A0FY˪Q8U.ëp!f6DlֱZc&XƩPdX4grvUz뜡2w^㵼Ƶ+k:S/wzͳ`vĖ^y5i(+꘹0UH.LW]5œhGv y8z!dw z#-A`(ivk!o!׵7XcD=.bb!zjy%vOXLڡZ=lEdIVkbe9gdD%Nm!Ȃ56uC<[1Zs+_zYR״fLy`9n0@[T[B=%{,Ef#"ǁU{HySDv:󤤀n H#-Are猞 FD̄h|ςX1FKTA@H`mn*Gϲ2'M݇1QFO8) :Yfބ;6+;:UJ<0~P9#%9 uVM2#%+m%յnbZUsFmл#/EO2Ü$F#/PԽ4I $¹83䊇~:3047;H55ƨYl5sHdy>6CT5mԚmMe AP5ga8b[ʭǨѯPG`IE_bJZ1@q Zן?2/}_iLhA #/nUt\~`EF#/*@vHE27PxNp1<]$pc>#-~hf}άP7Vg#-n ,mNr!9L!&!t/t 쒴KC! {" %i-#/HW|1`Cب{b$#- ;|aN,dNeMZe,s$KT$>6Oj!sw`d9>џ^JHBڦ%SIub_Wxm槿qczUS &!~2ڣub!j,##/Mn$ʯ8]3XE=3HdX3r cRɅGds.&A2<ο_]Ukq 4:,,mw0R0.J yߐIURPZJaA raC3 !D yɌl=d)Z̜jک-jmZYTYZzt`guo`GtXq -E ʚV*,m_פ/@&љFTfDE&!&4eJIeHȨ*"*CIˋ nb'ɓNp뼸0qͰs8\*tf.Sa!Lj#8X.o1HHL/ϻDq0iӇNV|T}|SZ/jV真G8M2M Lmf7p kUSyAA#ߨ\m:i4?auÞ#/*yš9T֓13c_0䓔5Ʃ$?T"ɖ9w{|Hy4h3?$#-ؕLgyyx397Qg|l-b`#%lH5ƒH̀9#%jZgu -WkKtZwyWfqM(c7TA-SȬ0/B*#%boJ "!=u qU$UJZɶJU@)#TJB@#/6k=Ζve-10Z\.`\1knqH܊9OL1HM1i/#/28T6 ]5pPQȆyODj:k3FC"FJ;&ȫkfV#XVcB+H6Y-Hu 'mEmKHGO]*1,EI& 䦚D-Ѵr&A,eښMlVQh1ߍŹq( KmmmA聽CZY"mE1fጒ/kRPn rnbZ@<(ӄ}d4`w QZ#0oŁ-ZN0dc(bsDPtPa4l~i̥@(60Q!vEBkLБHX$7i32*Pɑ&SbYo-Wrі+Bc&RT9A 4oq 񪢃dyz b¡̚ph#%&SAЩDdxoLP]CaP4wB ܠ4؆l6Co݆S(0bQHDZ2O15L} (z#-I[aQʌMW'!M%EgX>9RܣoCA45QPC(쌮x5Kh.LJ+eF"&&8urѮT *R#/)!$R4DA#Ih6(@K `#/!,"ZR)IrE240 K7 )"(8ZhbHB?g0J)JeUKGwLj]뫥7\OW#w&-[_jԥmFcBٴɓVֿ!V$E =RL/9 ) &QD`EH#/HתP,3* '5d̸$ ČVh#/;(\^$%DGy؎Cg.FVk~=?_2=@CIr@$)-*7w6s,]"IiI$L!!F*e1;Z2EX > ,C% ##/hWN>kQN `&$Xl3#&%K?vnzU,$my$" gЅ ņ${Ԏ1}#O[vxM>_ ۟턀Mͼ &%|V#/"i ;mnM< 2y 6QSa"R7Rhp!2D_wH,S iG#Y9qݬ I$yd,in*>(?~¬~3úC^謯ʗy#@wcO8T#-DT@Bx} A55O Q NXbV:jkP0P"o`ﭚ[q)#%eꪾLᡠ$-[4"",lt\A4#-Rp~~7U$4{Sv]0Dd*ݺk.Jfa+kW56ZipB(l@{!(.D$k9Qn3=-"eg+9%cp#/EC$#VنٌO)͎|gBjP*i߃qF)H gnЀ0o),gM#>wNxi԰DF1aT9iaJ7{5lVƢa2pw`xnU'=wpV(^u.qAK(cw,zәwT|o<ù8l!#/42$q1T2f#/#/ )XET# ρ؃[yv=,R:R:˷H#%9o*uhh(tx.3X("r4hL-ndaUn0:PUZ$H%w5iZ3spX~2Z1N\=˓"ʹٲ7)+]bzv:-e7ZX*gnl>K޸uv߮;KO޳z[ɷ{"S1Rғ˳!=QX*7sDӑ#/,T&؁llvG53A񹓎}eĞ<#/#/gaLKuEuTHӼyXLHKE6vQGP:ϔ5p9!]յSv;C˒ϕ  Y$]XϞ֔Nm@]FYbP/]Wq$}[t#/x/a"Jƾk"Qhլk^Zl@pueJb;4f"M"v9c]..u۶+s4]xl8а@f_'^&HL"{txwF`o's\Wtm*6w\aGyzp[z ѵjqDSGG|>)NA~xn =;v:,t܉pa#-0Yrs.n#/Rjn0Tk(2` 3[X1fQ1ܶU<ŕwCSnJ:ΐ똳Jnyu1HF vMVq ur"3Iʣ"9` \&cǵp#/|_,u#-d3d;1 >׵5ag Iǩ[}Ik5rHϡzbW#%7.sn{26&~'#/ūʁ`1a35-hͧQJ3 +IZ6[f Dh!%O1zry1jWۑkDTPwLD|jV6֍krL 5!ݙH"n M#-E4(TR,F5'g㞸}36 l>EF #%rp6Uk^}ov3};/ץxbث6VѶ[j( %]LbiӭV!S()K2Z""&%#/II #-̮fюCf-+W `eƌBq<*TB^VX0pe$0tHpUF_.4#oY)k0E;AƑg6!Qm,jHlM4$䱢Oy܍<)Tsi\JћɺČip Q6cr3RXQ6֥4ێvFjhMUzmkZALk.lJWɫ+nbvtRUڦڦ^]sV6 #/!hb($((WކXk4/ӺWz"H$ckHje[aF6Lc%T-S*#/md#/J6ĕ#/4Qh͡M6I&J6RTF4"JD2BihL6#-D &KmkkNy{!D{6> ]gކOv6fk#-#`ǘ+;C7,saStbA4o[/m:&I-%P]*0CwPQB3ǍۅR4I&'ClzwU]腛O#/̏EPDA$bAw>@zÇI#/-#%rb(aXUS<>B~O%a5"ȼa4l$|$ ("@Z1R[cGѪ-F#/MFZ3HTbJ~daA'%FB Tgِ[3qB>i/Cjf B)5vjKƢQGJ5$r[l`awNP+56HP#%#-O$#%%X& V[e$] .kί3E7‚3 LB1 I)/A4裁. a#%a"h(B#/mJTvYd#-FpHraI90[!-#u[}>z(mkvE&b)UHjg#/?ǀ.D،~܍bB'GZ^6(H()0FC&XGcRF,clPUl֡D&f>V#/A:X%|k|40)JqKOJDWQnYndžv,c_|~˦*'PٝU'ds6K zOo(%=@jvo`CHOaJIKIpFRKC]8zpV2+0mH^byጘ{oʢkfJ)R3[J#/_Se4˅D #-,Ba|l_-5P0?y XK6I}~dԢ´(t!Dk9ʊm#-b14Ii_t@>ֻ:=wA[Wq1{08ǭm a(MBD#%@]ٴ.d[MWN #C.Rʼn*U#/ˮy6ay&,S԰y~N_ GTt˰,;nff6R\]' &h(7]fU `to,-uE 2DVHH*L1^ľDhn6=UF1IpXs'%SFqB dvTɀ44FI܆T#-)w ]H3ĢY ;Nn<4c6.J.1RPdCf,)V]30U#%rY:с5SX>NX1ZS7ĵ #/8ynE̛D&~ 95e||>j&X̳ ;P&QT#-nuawLJd]1k/u.`Զ]VI u дo2'sN#-4xkcm#%Fe!Zlj΅Kѭv4-j[I`F|jd#-o)ӗٜ;r9u0}0%5998fy<1/(U#%ۙIԳ 靉fH1'L)!4rk{vM&jXio|[֜;PMg1fj)3!j7˙@{E#"\@cK<<)ؤ@rF#-0N9"`+;$8iEڊ#2G6w q CTM|#%`'[S!3SfVߪMabh6"E#-&UBgar"d G iE,7EEEt6ux#-wAvЩ2\8f832TJK)#/wCHbT"I!S*wB]H#"#- ݇`|ظ#bU;3M7 ` J#$#VUmȻ!1`SFƑ<*Y`VThQaHV)#383@psxq̸t*Nq`ŠPwfE#/0M !hC]+Ẅ+%R>F}tFQQP k9DHlM~=C`9{J v+[Dڂ h('A?%?1n5yMhֆ&!A#Z0T1 s,-Fb9t*OV6ÃZ8h㶪#%_)2&*1K5S=j䢩Zo gP#%qM}uAE"4AP=vDn'з.$ʑ8rAg24ۑ~Q-#-zĭ"Țd㓽{(ˏ|t"eYٵr6~@d7{aOj#%;%:'g\vKm+y+LfL]dmO1JŒ׆ZHsyfd1(zw]]׮o7voR+\r]yR< J[m$r⁈H$`#-%,#Z45Xc.)VzH.Z=#SL/lQtdfff*>  df\[H <ʓnLUsm؀;@ tC3QPtl[j4D=htaib"*X"b)xh>AX0*-0N\P}=!5˃ 9hoq4(,<@kq,A-aN+MN8R(trh>2XBq-*fMFMܰ#/7ǭh#%B i餈5+A=t.\"P'!1#)_<8guu0MkIyLhXbv3c%2Z񅃿 (uw%ZoMim桺33"$dGC4;K\ eI}PBD5>" K)`#/!)U2#-u%BO'h6l"rmv͵6RR14حm6Y"e*R0a+j5#/ŊPxb=Ŋ4]FD9S4@;i:#%Xkv; ,sk@}NBxr u*m(2p3#/fAU9TY^I ۪fGR};t)A2#/t\pE6$HB&+|i4-J[haI"TG `0"tۉ7Hݔ\ّ>vDA\49|4X0/cFJ&G«>n8ݍ@#`puҩ4ѩ[AFaz%p"RHŢ۬)1hR $#/J0mc+DJ"R$rf #-˫<_C2!ţJؾLeZXÏ̭h`f-V_qAtˤKBϸ8DRΰlE{J JwRV*[jGVHmkۿuiSs&"DC;6HP$`D`Cb #/S}P./ y8+B,h-0<ۄ;J&*H=茼>lWަ=,B,ӗh>9Jɳvo۱Z:PY^PSkއ#%~#-FiG(#/ _ݺH"X!$FٟGyͱsכ7ᐩE4E/&k^Ehs\,׋yvIZ̛~n*FB/H "o"ni(Wc{>IY[ Ț}+e\L a(#/ -Ed*6٢!BA-uӲ@$`dPR66$RJ}~QΫb,m*ժTD$Ɇ0#%K[}r )"7w$VE_$Zn1Mak-b#jR`z[i5iRvRhE#@!D_Gݝ_#%kqJ2{y-1fTrU!f!!!ـ=D}dҨ6l3x_>r[3"%%%SDm'&BQepA?49&_]¢6I jd@8#%zZ J#%P0ui) Z$PJSTve{RU0llk)#-J.%J|#/Ua뵙eeկ>C|2+:}z3.b1+#-²2Pvfm?#/#/Ƈ )sR Hez4ozNmI7=2!Ļm6n{EG܇~k//vEJiI*)lbTl)hyV$)"HO#B8tld-@lHzWD#% u P2aGhwjAJSTs໶#/I#%T#%sbdZ* Vl d F<8ɿ+t.䯛g JHj~cv_>44 +҇Ꮝ7q ԗeb:i.4*'E,Ҭm)m$:ٙةeK"'<]9?&!Pa0E (eN *F `0[*[5^rweK6" TXfY3*svU["[˻%neIR)*5uo4ם]*rR$0p)ڌTljWWa{yqMzhP#-0E!lH#/oiFiK^wrݮa!"P„B)r&d$sVh߆˂#-yV.б`lY|h["A2H#%BB咡[FjV~ 2 /|1@"#/oMܪ?=aK."/ܺpBK=w2Zz/rAؽ晻c*SlccɼB'$ǩCURWto [30S QrFq/ }zl IF*wPIf6".Ȱܤ1kWIYw]*O]ocĜ@yr#/aKThڬ[3(uKFJmT|#-P߸* {:y6=#%ղs-B1~N,pStA.Z V%TR&{Hr#--5LbvP4v0@ݫ0Q#/ u3le䅻qjFlTQ]P"D4P%X ӳ[s'N>~ayAdՂ\rj̴{,q$P^^[jpzuBKTms݊d)#FOrDVv+VmAn 2#/aEJDGVo7#/o*j4 H3A`j1#/R7'##-0gTqt2ȤQht +>t1}z_=;+#/#-p;:⻟}z(Y#%tk%BE#R5異Xvvۡҩɑ\w(*ɑG&\ b lm~tua~~?C/r ov>#/@BЀ\O0,)L6i P;OF'33 J>(Ƙ3bdi_('kzkg[wV?{_og?_9_i^<ߤW/?i]~>g2ȞЧlC!ͫA*ۑ[@5'L$={PԪ"]|_}IF1#%zbtm#%`#-qe g#-HAwiC\zN Qe{ Q;G\8nLM͐Y#-EfPX8+uRP)TZe%4X x/SО"y&S%G*g*W9uy ^e[WrРt#i'_f#[:$|t9g7R2Y୙XMIdk1٠?^Px^iS @(vz+*SHyv%F^lL<ͅH0K2!pwkg3wfE*KK[7RYF%/#/k/(5?#,{zy4c"cm5 IЃKf::O9T[Mjc ,'v]DCm!A*ȖZdV4ϖbs{!*'4Se!<ΜnֳU1w&'DPR#drBL^Ypdj<)ZvOW5+#/lewhcլ,Cf$xޔ*㻧3ڙ̡# wˆ4<6xu7VE;lbH* 1!~,7CEʊi <>$W^2`¶hHS8xtwm#/@X`A10  5:9· ۛhґ1/kB*ҙmEf&,(2J(y)rlONa&'MV` L5)+C:{#/h N^)THK+#yB"]w:1NI9]Cr^͐e=2X/"-M(;@[%=#>qd4_Pt`<ٮ!9oT#-T!j8,'Ek_p}[{6h6Wvz9FX)5I8C^5dm661^-4Vؐhi#!cv5h7])`nbRoeBCձ,bmxˣb'DLQZc6f t)CBp$dc%B$>?h|qv/#-d 3x_{bq?+OP$DX @G-vjֹf[S3]-fK{ok[_E$ӿV}bmB6zunt%Jj&|fׁt oNegQQᦳ~-?AW(!y#-A'BY! ((O""JT?JHCM n=ѻ޴aS쯫._}Z;7kv"|>|)CۧO&ӆ67WaԗMM-7;?X燍v>Ӝ6^GEi_#/z݇ṓ7*#%̰~Y'E,x;u%.8RqWW!'?tB_Nu$#ep:Wo)}ڮg0ja#|}N@΃++X7 ^[ c~qQ-y[Na ~MGa_$ wD f8M๻5i |\y+2SȪb0<~X_~!dǂ/ӂN-1ojM_ނȬCh;e V^$?"(H~ #<== From a9d9f475b044f9c8026518e2af37d196bf6538d8 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Tue, 10 Sep 2019 10:33:19 +0300 Subject: [PATCH 04/24] wscript: enable clang_compilation_database in options --- wscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wscript b/wscript index ede9efa4..ef74ff6e 100644 --- a/wscript +++ b/wscript @@ -29,7 +29,7 @@ def options(opt): opt.recurse('cl_dll dlls') - opt.load('xcompile compiler_cxx compiler_c') + opt.load('xcompile compiler_cxx compiler_c clang_compilation_database') if sys.platform == 'win32': opt.load('msvc msdev') opt.load('reconfigure') From d9c5b04c54930398698dea62c9e138e674381540 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Wed, 11 Sep 2019 20:44:05 +0300 Subject: [PATCH 05/24] waf: add strip_on_install plugin from engine repository --- scripts/waifulib/strip_on_install.py | 46 ++++++++++++++++++++++++++++ scripts/waifulib/xcompile.py | 11 ++++++- wscript | 4 +-- 3 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 scripts/waifulib/strip_on_install.py diff --git a/scripts/waifulib/strip_on_install.py b/scripts/waifulib/strip_on_install.py new file mode 100644 index 00000000..b334c901 --- /dev/null +++ b/scripts/waifulib/strip_on_install.py @@ -0,0 +1,46 @@ +#! /usr/bin/env python +# Modified: Alibek Omarov +# Originally taken from Thomas Nagy's blogpost + +""" +Strip executables upon installation +""" + +import shutil, os +from waflib import Build, Utils, Context, Errors, Logs + +def options(opt): + grp = opt.option_groups['install/uninstall options'] + grp.add_option('--no-strip', dest='no_strip', action='store_true', default=False, + help='don\'t strip binaries. You must pass this flag to install command(default: False)') + +def configure(conf): + if conf.env.DEST_BINFMT in ['elf', 'mac-o']: + conf.find_program('strip') + if not conf.env.STRIPFLAGS: + conf.env.STRIPFLAGS = os.environ['STRIPFLAGS'] if 'STRIPFLAGS' in os.environ else [] + +def copy_fun(self, src, tgt): + inst_copy_fun(self, src, tgt) + + if self.generator.bld.options.no_strip: + return + + if conf.env.DEST_BINFMT not in ['elf', 'mac-o']: # don't strip unknown formats or PE + return + + if getattr(self.generator, 'link_task', None) and self.generator.link_task.outputs[0] in self.inputs: + cmd = self.env.STRIP + self.env.STRIPFLAGS + [tgt] + try: + if not self.generator.bld.progress_bar: + c1 = Logs.colors.NORMAL + c2 = Logs.colors.CYAN + + Logs.info('%s+ strip %s%s%s', c1, c2, tgt, c2) + self.generator.bld.cmd_and_log(cmd, output=Context.BOTH, quiet=Context.BOTH) + except Errors.WafError as e: + print(e.stdout, e.stderr) + +inst_copy_fun = Build.inst.copy_fun +Build.inst.copy_fun = copy_fun + diff --git a/scripts/waifulib/xcompile.py b/scripts/waifulib/xcompile.py index c0365ddd..96f9450b 100644 --- a/scripts/waifulib/xcompile.py +++ b/scripts/waifulib/xcompile.py @@ -156,7 +156,7 @@ class Android: toolchain_host += '-' # Assuming we are building on x86 - if sys.maxsize > 2**32: + if sys.maxsize > 2**32: toolchain_host += 'x86_64' else: toolchain_host += 'x86' @@ -187,6 +187,9 @@ class Android: triplet = self.ndk_triplet() + '-' return os.path.join(self.gen_gcc_toolchain_path(), 'bin', triplet) + def gen_binutils_path(self): + return os.path.join(self.gen_gcc_toolchain_path(), self.ndk_triplet(), 'bin') + def cc(self): if self.is_host(): return 'clang' @@ -197,6 +200,11 @@ class Android: return 'clang++' return self.toolchain_path + ('clang++' if self.is_clang() else 'g++') + def strip(self): + if self.is_host(): + return 'strip' + return os.path.join(self.gen_binutils_path(), 'strip') + def system_stl(self): # TODO: proper STL support return os.path.abspath(os.path.join(self.ndk_home, 'sources', 'cxx-stl', 'system', 'include')) @@ -305,6 +313,7 @@ def configure(conf): setattr(conf, 'android', android) conf.environ['CC'] = android.cc() conf.environ['CXX'] = android.cxx() + conf.environ['STRIP'] = android.strip() conf.env.CFLAGS += android.cflags() conf.env.CXXFLAGS += android.cflags() conf.env.LINKFLAGS += android.linkflags() diff --git a/wscript b/wscript index ef74ff6e..fe1abd93 100644 --- a/wscript +++ b/wscript @@ -29,7 +29,7 @@ def options(opt): opt.recurse('cl_dll dlls') - opt.load('xcompile compiler_cxx compiler_c clang_compilation_database') + opt.load('xcompile compiler_cxx compiler_c clang_compilation_database strip_on_install') if sys.platform == 'win32': opt.load('msvc msdev') opt.load('reconfigure') @@ -68,7 +68,7 @@ def configure(conf): conf.env.MSVC_TARGETS = ['x86'] # explicitly request x86 target for MSVC if sys.platform == 'win32': conf.load('msvc msdev') - conf.load('xcompile compiler_c compiler_cxx') + conf.load('xcompile compiler_c compiler_cxx strip_on_install') if conf.env.DEST_OS2 == 'android': conf.options.ALLOW64 = True From a4548074ec50f52fb75063c6361186231590c60a Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Thu, 19 Sep 2019 17:17:04 +0300 Subject: [PATCH 06/24] waifulib: strip_on_install: fix typo --- scripts/waifulib/strip_on_install.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/waifulib/strip_on_install.py b/scripts/waifulib/strip_on_install.py index b334c901..a535d0ba 100644 --- a/scripts/waifulib/strip_on_install.py +++ b/scripts/waifulib/strip_on_install.py @@ -26,7 +26,7 @@ def copy_fun(self, src, tgt): if self.generator.bld.options.no_strip: return - if conf.env.DEST_BINFMT not in ['elf', 'mac-o']: # don't strip unknown formats or PE + if self.env.DEST_BINFMT not in ['elf', 'mac-o']: # don't strip unknown formats or PE return if getattr(self.generator, 'link_task', None) and self.generator.link_task.outputs[0] in self.inputs: From 17e1af726df05c47289c7c66ab47100b341f0581 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Thu, 19 Sep 2019 17:18:57 +0300 Subject: [PATCH 07/24] wscript: remove DEST_OS2 --- cl_dll/wscript | 2 +- dlls/wscript | 2 +- scripts/waifulib/xcompile.py | 32 +++++++++++++++++--------------- wscript | 2 +- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/cl_dll/wscript b/cl_dll/wscript index d0bd0951..3ada920a 100644 --- a/cl_dll/wscript +++ b/cl_dll/wscript @@ -48,7 +48,7 @@ def build(bld): if bld.env.GOLDSRC: libs += ['DL'] - if bld.env.DEST_OS2 not in ['android']: + if bld.env.DEST_OS not in ['android']: install_path = os.path.join(bld.env.GAMEDIR, bld.env.CLIENT_DIR) else: install_path = bld.env.PREFIX diff --git a/dlls/wscript b/dlls/wscript index 05a7d002..b1c8cffa 100644 --- a/dlls/wscript +++ b/dlls/wscript @@ -54,7 +54,7 @@ def build(bld): libs = [] - if bld.env.DEST_OS2 not in ['android']: + if bld.env.DEST_OS not in ['android']: install_path = os.path.join(bld.env.GAMEDIR, bld.env.SERVER_DIR) else: install_path = bld.env.PREFIX diff --git a/scripts/waifulib/xcompile.py b/scripts/waifulib/xcompile.py index 96f9450b..6ebae1f9 100644 --- a/scripts/waifulib/xcompile.py +++ b/scripts/waifulib/xcompile.py @@ -14,20 +14,11 @@ try: from fwgslib import get_flags_by_compiler except: from waflib.extras.fwgslib import get_flags_by_compiler from waflib import Logs +from waflib.Tools import c_config import os import sys -# Output: -# CROSSCOMPILING -- set to true, if crosscompiling is enabled -# DEST_OS2 -- as some operating systems is built on top of another, it's better to not change DEST_OS, -# instead of this DEST_OS2 is defined with target value -# For example: android is built on top of linux and have many things in common, -# but it can't be considered as default GNU/Linux. -# Possible values: -# DEST_OS2 DEST_OS -# 'android' 'linux' - -# This class does support ONLY r10e and r19c NDK +# This class does support ONLY r10e and r19c/r20 NDK class Android: ctx = None # waf context arch = None @@ -309,8 +300,7 @@ def configure(conf): if values[0] not in valid_archs: conf.fatal('Unknown arch: {}. Supported: {}'.format(values[0], ', '.join(valid_archs))) - android = Android(conf, values[0], values[1], int(values[2])) - setattr(conf, 'android', android) + conf.android = android = Android(conf, values[0], values[1], int(values[2])) conf.environ['CC'] = android.cc() conf.environ['CXX'] = android.cxx() conf.environ['STRIP'] = android.strip() @@ -334,10 +324,18 @@ def configure(conf): # conf.env.ANDROID_OPTS = android conf.env.DEST_OS2 = 'android' -# else: -# conf.load('compiler_c compiler_cxx') # Use host compiler :) + + MACRO_TO_DESTOS = { + '__ANDROID__' : 'android' + } + MACRO_TO_DESTOS.update(c_config.MACRO_TO_DESTOS) # ordering is important + c_config.MACRO_TO_DESTOS = MACRO_TO_DESTOS def post_compiler_cxx_configure(conf): + conf.msg('Target OS', conf.env.DEST_OS) + conf.msg('Target CPU', conf.env.DEST_CPU) + conf.msg('Target binfmt', conf.env.DEST_BINFMT) + if conf.options.ANDROID_OPTS: if conf.android.ndk_rev == 19: conf.env.CXXFLAGS_cxxshlib += ['-static-libstdc++'] @@ -345,6 +343,10 @@ def post_compiler_cxx_configure(conf): return def post_compiler_c_configure(conf): + conf.msg('Target OS', conf.env.DEST_OS) + conf.msg('Target CPU', conf.env.DEST_CPU) + conf.msg('Target binfmt', conf.env.DEST_BINFMT) + return from waflib.Tools import compiler_cxx, compiler_c diff --git a/wscript b/wscript index fe1abd93..622d9b84 100644 --- a/wscript +++ b/wscript @@ -70,7 +70,7 @@ def configure(conf): conf.load('msvc msdev') conf.load('xcompile compiler_c compiler_cxx strip_on_install') - if conf.env.DEST_OS2 == 'android': + if conf.env.DEST_OS == 'android': conf.options.ALLOW64 = True conf.options.GOLDSRC = False conf.env.SERVER_NAME = 'server' # can't be any other name, until specified From 9b1fe29eb7f0f9ef44a16daf7a6c8d9286c1d706 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Thu, 19 Sep 2019 18:20:11 +0300 Subject: [PATCH 08/24] waifulib: xcompile: use llvm-strip on host --- scripts/waifulib/xcompile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/waifulib/xcompile.py b/scripts/waifulib/xcompile.py index 6ebae1f9..78b2b4ac 100644 --- a/scripts/waifulib/xcompile.py +++ b/scripts/waifulib/xcompile.py @@ -193,7 +193,7 @@ class Android: def strip(self): if self.is_host(): - return 'strip' + return 'llvm-strip' return os.path.join(self.gen_binutils_path(), 'strip') def system_stl(self): From 784c8d91a339b94d6112f574873d9eadc01a75f2 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Thu, 19 Sep 2019 18:20:19 +0300 Subject: [PATCH 09/24] waifulib: strip_on_install: add changed bytes counter --- scripts/waifulib/strip_on_install.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/scripts/waifulib/strip_on_install.py b/scripts/waifulib/strip_on_install.py index a535d0ba..6522065d 100644 --- a/scripts/waifulib/strip_on_install.py +++ b/scripts/waifulib/strip_on_install.py @@ -16,7 +16,7 @@ def options(opt): def configure(conf): if conf.env.DEST_BINFMT in ['elf', 'mac-o']: - conf.find_program('strip') + conf.find_program('strip', var='STRIP') if not conf.env.STRIPFLAGS: conf.env.STRIPFLAGS = os.environ['STRIPFLAGS'] if 'STRIPFLAGS' in os.environ else [] @@ -32,12 +32,15 @@ def copy_fun(self, src, tgt): if getattr(self.generator, 'link_task', None) and self.generator.link_task.outputs[0] in self.inputs: cmd = self.env.STRIP + self.env.STRIPFLAGS + [tgt] try: + self.generator.bld.cmd_and_log(cmd, output=Context.BOTH, quiet=Context.BOTH) if not self.generator.bld.progress_bar: c1 = Logs.colors.NORMAL c2 = Logs.colors.CYAN - Logs.info('%s+ strip %s%s%s', c1, c2, tgt, c2) - self.generator.bld.cmd_and_log(cmd, output=Context.BOTH, quiet=Context.BOTH) + f1 = os.path.getsize(src) + f2 = os.path.getsize(tgt) + + Logs.info('%s+ strip %s%s%s (%d bytes change)', c1, c2, tgt, c1, f2 - f1) except Errors.WafError as e: print(e.stdout, e.stderr) From b141cac977f4a3266c2d66097241abbee3a4e2fb Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Fri, 20 Sep 2019 16:30:59 +0300 Subject: [PATCH 10/24] wscript: remove DEST_OS2 --- wscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wscript b/wscript index 622d9b84..b937ca85 100644 --- a/wscript +++ b/wscript @@ -143,7 +143,7 @@ def configure(conf): conf.env.append_unique('CXXFLAGS', cflags + ['-Wno-invalid-offsetof', '-fno-rtti', '-fno-exceptions']) # strip lib from pattern - if conf.env.DEST_OS in ['linux', 'darwin'] and conf.env.DEST_OS2 not in ['android']: + if conf.env.DEST_OS in ['linux', 'darwin']: if conf.env.cshlib_PATTERN.startswith('lib'): conf.env.cshlib_PATTERN = conf.env.cshlib_PATTERN[3:] if conf.env.cxxshlib_PATTERN.startswith('lib'): From c93aa8c5689821719179d07df853a2a7241b003a Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Fri, 20 Sep 2019 16:35:33 +0300 Subject: [PATCH 11/24] waifulib: xcompile: preserve order of MACROS_TO_DESTOS, add -stdlib=libstdc++ to use system provided C++ standard library, pass target in host clang --- scripts/waifulib/xcompile.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/scripts/waifulib/xcompile.py b/scripts/waifulib/xcompile.py index 78b2b4ac..a0854106 100644 --- a/scripts/waifulib/xcompile.py +++ b/scripts/waifulib/xcompile.py @@ -15,6 +15,7 @@ try: from fwgslib import get_flags_by_compiler except: from waflib.extras.fwgslib import get_flags_by_compiler from waflib import Logs from waflib.Tools import c_config +from collections import OrderedDict import os import sys @@ -183,12 +184,12 @@ class Android: def cc(self): if self.is_host(): - return 'clang' + return 'clang --target=%s' % self.clang_host_triplet() return self.toolchain_path + ('clang' if self.is_clang() else 'gcc') def cxx(self): if self.is_host(): - return 'clang++' + return 'clang++ --target=%s' % self.clang_host_triplet() return self.toolchain_path + ('clang++' if self.is_clang() else 'g++') def strip(self): @@ -230,7 +231,7 @@ class Android: def cflags(self): cflags = [] if self.is_host(): - cflags += ['-nostdlib', '--target=%s' % self.clang_host_triplet()] + cflags += ['-nostdlib'] if self.ndk_rev < 20: cflags += ['--sysroot={0}'.format(self.sysroot())] @@ -271,7 +272,7 @@ class Android: return linkflags def ldflags(self): - ldflags = ['-lgcc', '-no-canonical-prefixes'] + ldflags = ['-stdlib=libstdc++', '-lgcc', '-no-canonical-prefixes'] if self.is_arm(): if self.arch == 'armeabi-v7a': ldflags += ['-march=armv7-a'] @@ -325,10 +326,9 @@ def configure(conf): # conf.env.ANDROID_OPTS = android conf.env.DEST_OS2 = 'android' - MACRO_TO_DESTOS = { - '__ANDROID__' : 'android' - } - MACRO_TO_DESTOS.update(c_config.MACRO_TO_DESTOS) # ordering is important + MACRO_TO_DESTOS = OrderedDict({ '__ANDROID__' : 'android' }) + for k in c_config.MACRO_TO_DESTOS: + MACRO_TO_DESTOS[k] = c_config.MACRO_TO_DESTOS[k] # ordering is important c_config.MACRO_TO_DESTOS = MACRO_TO_DESTOS def post_compiler_cxx_configure(conf): From 70c4279c251c7f18288465355ef62ebb2aa69637 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Fri, 20 Sep 2019 18:50:24 +0300 Subject: [PATCH 12/24] waifulib: xcompile: enhance compiling using host clang, refactoring --- scripts/waifulib/xcompile.py | 113 +++++++++++++++-------------------- 1 file changed, 48 insertions(+), 65 deletions(-) diff --git a/scripts/waifulib/xcompile.py b/scripts/waifulib/xcompile.py index a0854106..84344080 100644 --- a/scripts/waifulib/xcompile.py +++ b/scripts/waifulib/xcompile.py @@ -34,6 +34,8 @@ class Android: def __init__(self, ctx, arch, toolchain, api): self.ctx = ctx self.api = api + self.toolchain = toolchain + self.arch = arch for i in ['ANDROID_NDK_HOME', 'ANDROID_NDK']: self.ndk_home = os.getenv(i) @@ -41,7 +43,7 @@ class Android: break if not self.ndk_home: - ctx.fatal('Set ANDROID_NDK_HOME environment variable pointing to the root of Android NDK!') + ctx.fatal('Set ANDROID_NDK_HOME environment variable pointing to the root of Android NDK!') # TODO: this were added at some point of NDK development # but I don't know at which version @@ -59,20 +61,20 @@ class Android: self.ndk_rev = 10 if self.ndk_rev not in [10, 19, 20]: - ctx.fatal('Unknown NDK revision: {}'.format(self.ndk_rev)) + ctx.fatal('Unknown NDK revision: %d' % (self.ndk_rev)) + + if self.is_host() and self.ndk_rev < 20: + ctx.fatal('Using host toolchain with this NDK revision is untested. You can comment this check, but you\'re on your own!') + + if self.ndk_rev >= 19 or 'clang' in self.toolchain: + self.clang = True - self.arch = arch if self.arch == 'armeabi-v7a-hard': if self.ndk_rev <= 10: self.arch = 'armeabi-v7a' # Only armeabi-v7a have hard float ABI self.is_hardfloat = True else: - raise Exception('NDK does not support hardfloat ABI') - - self.toolchain = toolchain - - if self.ndk_rev >= 19 or 'clang' in self.toolchain: - self.clang = True + ctx.fatal('NDK does not support hardfloat ABI') if self.is_arm64() or self.is_amd64() and self.api < 21: Logs.warn('API level for 64-bit target automatically was set to 21') @@ -82,10 +84,6 @@ class Android: self.api = 16 self.toolchain_path = self.gen_toolchain_path() - # TODO: Crystax support? - # TODO: Support for everything else than linux-x86_64? - # TODO: Determine if I actually need to implement listed above - def is_host(self): ''' Checks if we using host compiler(implies clang) @@ -125,19 +123,26 @@ class Android: def is_hardfp(self): return self.is_hardfloat - def ndk_triplet(self): + def ndk_triplet(self, llvm_toolchain = False, toolchain_folder = False): if self.is_x86(): - triplet = 'i686-linux-android' + if toolchain_folder: + return 'x86' + else: + return 'i686-linux-android' elif self.is_arm(): - triplet = 'arm-linux-androideabi' + if llvm_toolchain: + return 'armv7a-linux-androideabi' + else: + return 'arm-linux-androideabi' + elif self.is_amd64() and toolchain_folder: + return 'x86_64' else: - triplet = self.arch + '-linux-android' - return triplet + return self.arch + '-linux-android' def gen_gcc_toolchain_path(self): path = 'toolchains' - if sys.platform.startswith('linux'): + if sys.platform.startswith('linux') or self.is_host(): toolchain_host = 'linux' elif sys.platform.startswith('darwin'): toolchain_host = 'darwin' @@ -158,23 +163,13 @@ class Android: toolchain_folder = 'llvm' else: - if self.is_x86() or self.is_amd64(): - toolchain_folder = self.arch + '-' + self.toolchain - elif self.is_arm(): - toolchain_folder = 'arm-linux-androideabi-' + self.toolchain - else: - toolchain_folder = self.arch + '-linux-android-' + self.toolchain + toolchain_folder = '%s-%s' % (self.ndk_triplet(toolchain_folder = True), self.toolchain) return os.path.abspath(os.path.join(self.ndk_home, path, toolchain_folder, 'prebuilt', toolchain_host)) def gen_toolchain_path(self): if self.is_clang(): - if self.is_x86(): - triplet = 'i686-linux-android{}-'.format(self.api) - elif self.is_arm(): - triplet = 'armv7a-linux-androideabi{}-'.format(self.api) - else: - triplet = self.arch + '-linux-android{}-'.format(self.api) + triplet = '%s%d-' % (self.ndk_triplet(llvm_toolchain = True), self.api) else: triplet = self.ndk_triplet() + '-' return os.path.join(self.gen_gcc_toolchain_path(), 'bin', triplet) @@ -184,12 +179,12 @@ class Android: def cc(self): if self.is_host(): - return 'clang --target=%s' % self.clang_host_triplet() + return 'clang --target=%s%d' % (self.ndk_triplet(), self.api) return self.toolchain_path + ('clang' if self.is_clang() else 'gcc') def cxx(self): if self.is_host(): - return 'clang++ --target=%s' % self.clang_host_triplet() + return 'clang++ --target=%s%d' % (self.ndk_triplet(), self.api) return self.toolchain_path + ('clang++' if self.is_clang() else 'g++') def strip(self): @@ -207,7 +202,7 @@ class Android: arch = 'arm' elif self.is_arm64(): arch = 'arm64' - path = 'platforms/android-{}/arch-{}'.format(self.api, arch) + path = 'platforms/android-%s/arch-%s' % (self.api, arch) return os.path.abspath(os.path.join(self.ndk_home, path)) @@ -217,34 +212,25 @@ class Android: else: return self.libsysroot() - def clang_host_triplet(self): - triplet = '' - if self.is_arm(): - triplet += 'arm' - elif self.is_x86(): - triplet += 'i686' - else: - triplet += self.arch - triplet += '-linux-android' - return triplet - def cflags(self): cflags = [] if self.is_host(): - cflags += ['-nostdlib'] + cflags += [ + '--sysroot=%s/sysroot' % (self.gen_gcc_toolchain_path()), + '-I%s/usr/include/' % (self.sysroot()) + ] + elif self.ndk_rev < 20: + cflags += ['--sysroot=%s' % (self.sysroot())] - if self.ndk_rev < 20: - cflags += ['--sysroot={0}'.format(self.sysroot())] - elif self.is_host(): - cflags += ['-isysroot={0}'.format(self.sysroot())] - cflags += ['-DANDROID', '-D__ANDROID__'] - cflags += ['-I{0}'.format(self.system_stl())] + cflags += ['-I%s' % (self.system_stl()), '-DANDROID', '-D__ANDROID__'] if self.is_arm(): if self.arch == 'armeabi-v7a': # ARMv7 support cflags += ['-mthumb', '-mfpu=neon', '-mcpu=cortex-a9', '-DHAVE_EFFICIENT_UNALIGNED_ACCESS', '-DVECTORIZE_SINCOS'] + if not self.is_clang(): cflags += [ '-mvectorize-with-neon-quad' ] + if self.is_hardfloat: cflags += ['-D_NDK_MATH_NO_SOFTFP=1', '-mhard-float', '-mfloat-abi=hard', '-DLOAD_HARDFP', '-DSOFTFP_LINK'] else: @@ -260,25 +246,22 @@ class Android: def linkflags(self): linkflags = [] if self.is_host(): - linkflags += ['-fuse-ld=lld', '-nostdlib', '--target=%s' % self.clang_host_triplet(), - '--gcc-toolchain=%s' % self.gen_gcc_toolchain_path()] + linkflags += ['--gcc-toolchain=%s' % self.gen_gcc_toolchain_path()] if self.ndk_rev < 20 or self.is_host(): - linkflags += ['--sysroot={0}'.format(self.libsysroot())] + linkflags += ['--sysroot=%s/sysroot' % (self.gen_gcc_toolchain_path())] - if self.is_host(): - linkflags += ['-L{0}/usr/lib/{1}'.format(self.sysroot(), self.ndk_triplet()), - '-L{0}/sysroot/usr/lib/{1}/'.format(self.gen_gcc_toolchain_path(), self.ndk_triplet())] + if self.is_clang(): + linkflags += ['-fuse-ld=lld'] return linkflags def ldflags(self): ldflags = ['-stdlib=libstdc++', '-lgcc', '-no-canonical-prefixes'] if self.is_arm(): if self.arch == 'armeabi-v7a': - ldflags += ['-march=armv7-a'] - if not self.is_host(): # lld only + ldflags += ['-march=armv7-a', '-mthumb'] + if not self.is_clang(): # lld only ldflags += ['-Wl,--fix-cortex-a8'] - ldflags += ['-mthumb'] if self.is_hardfloat: ldflags += ['-Wl,--no-warn-mismatch', '-lm_hard'] else: @@ -296,10 +279,10 @@ def configure(conf): if len(values) != 3: conf.fatal('Invalid --android paramater value!') - valid_archs = ['x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'armeabi-v7a-hard', 'aarch64', 'mipsel', 'mips64el'] + valid_archs = ['x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'armeabi-v7a-hard', 'aarch64'] if values[0] not in valid_archs: - conf.fatal('Unknown arch: {}. Supported: {}'.format(values[0], ', '.join(valid_archs))) + conf.fatal('Unknown arch: %s. Supported: %r' % (values[0], ', '.join(valid_archs))) conf.android = android = Android(conf, values[0], values[1], int(values[2])) conf.environ['CC'] = android.cc() @@ -315,9 +298,9 @@ def configure(conf): conf.env.LIB_M = ['m_hard'] else: conf.env.LIB_M = ['m'] - conf.env.PREFIX = '/lib/{}'.format(android.arch) + conf.env.PREFIX = '/lib/%s' % (android.arch) - conf.msg('Selected Android NDK', '{}, version: {}'.format(android.ndk_home, android.ndk_rev)) + conf.msg('Selected Android NDK', '%s, version: %d' % (android.ndk_home, android.ndk_rev)) # no need to print C/C++ compiler, as it would be printed by compiler_c/cxx conf.msg('... C/C++ flags', ' '.join(android.cflags()).replace(android.ndk_home, '$NDK')) conf.msg('... link flags', ' '.join(android.linkflags()).replace(android.ndk_home, '$NDK')) From cb51d2aa179f1eb622e08c1c07b053ccd49e40a5 Mon Sep 17 00:00:00 2001 From: Roman Chistokhodov Date: Fri, 20 Sep 2019 21:28:52 +0300 Subject: [PATCH 13/24] Fix potential segfault when reading sentences.txt --- dlls/sound.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/sound.cpp b/dlls/sound.cpp index 6637fe53..acc2dbf7 100644 --- a/dlls/sound.cpp +++ b/dlls/sound.cpp @@ -1281,9 +1281,9 @@ void SENTENCEG_Init() if( !buffer[j] ) continue; - if( gcallsentences > CVOXFILESENTENCEMAX ) + if( gcallsentences >= CVOXFILESENTENCEMAX ) { - ALERT( at_error, "Too many sentences in sentences.txt!\n" ); + ALERT( at_error, "Too many sentences in sentences.txt! >%d\n", gcallsentences ); break; } From 56ac3459778d406484297a3f8507a81976e491e0 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Sat, 21 Sep 2019 03:53:32 +0300 Subject: [PATCH 14/24] waifulib: xcompile: append SONAME to shared libraries, experimental support for host compiling with NDK r10e(don't work), replace exceptions with fatal messages --- scripts/waifulib/xcompile.py | 63 ++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 17 deletions(-) diff --git a/scripts/waifulib/xcompile.py b/scripts/waifulib/xcompile.py index 84344080..fd6dd596 100644 --- a/scripts/waifulib/xcompile.py +++ b/scripts/waifulib/xcompile.py @@ -13,7 +13,7 @@ try: from fwgslib import get_flags_by_compiler except: from waflib.extras.fwgslib import get_flags_by_compiler -from waflib import Logs +from waflib import Logs, TaskGen from waflib.Tools import c_config from collections import OrderedDict import os @@ -142,13 +142,14 @@ class Android: def gen_gcc_toolchain_path(self): path = 'toolchains' - if sys.platform.startswith('linux') or self.is_host(): - toolchain_host = 'linux' + if sys.platform.startswith('win32') or sys.platform.startswith('cygwin'): + toolchain_host = 'windows' elif sys.platform.startswith('darwin'): toolchain_host = 'darwin' - elif sys.platform.startswith('win32') or sys.platform.startswith('cygwin'): - toolchain_host = 'windows' - else: raise Exception('Unsupported by NDK host platform') + elif sys.platform.startswith('linux') or self.is_host(): + toolchain_host = 'linux' + else: + self.ctx.fatal('Unsupported by NDK host platform') toolchain_host += '-' @@ -159,11 +160,16 @@ class Android: if self.is_clang(): if self.ndk_rev < 19: - raise Exception('Clang is not supported for this NDK') + raise self.ctx.fatal('Clang is not supported for this NDK') toolchain_folder = 'llvm' else: - toolchain_folder = '%s-%s' % (self.ndk_triplet(toolchain_folder = True), self.toolchain) + if self.is_host(): + toolchain = '4.9' + else: + toolchain = self.toolchain + + toolchain_folder = '%s-%s' % (self.ndk_triplet(toolchain_folder = True), toolchain) return os.path.abspath(os.path.join(self.ndk_home, path, toolchain_folder, 'prebuilt', toolchain_host)) @@ -207,7 +213,7 @@ class Android: return os.path.abspath(os.path.join(self.ndk_home, path)) def sysroot(self): - if self.ndk_rev >= 19 or self.is_host(): + if self.ndk_rev >= 19: return os.path.abspath(os.path.join(self.ndk_home, 'sysroot')) else: return self.libsysroot() @@ -215,10 +221,12 @@ class Android: def cflags(self): cflags = [] if self.is_host(): - cflags += [ - '--sysroot=%s/sysroot' % (self.gen_gcc_toolchain_path()), - '-I%s/usr/include/' % (self.sysroot()) - ] + if self.ndk_rev >= 19: + cflags += [ + '--sysroot=%s/sysroot' % (self.gen_gcc_toolchain_path()), + '-I%s/usr/include/' % (self.sysroot()) + ] + else: cflags += ['--sysroot=%s' % (self.sysroot())] elif self.ndk_rev < 20: cflags += ['--sysroot=%s' % (self.sysroot())] @@ -228,7 +236,7 @@ class Android: # ARMv7 support cflags += ['-mthumb', '-mfpu=neon', '-mcpu=cortex-a9', '-DHAVE_EFFICIENT_UNALIGNED_ACCESS', '-DVECTORIZE_SINCOS'] - if not self.is_clang(): + if not self.is_clang() and not self.is_host(): cflags += [ '-mvectorize-with-neon-quad' ] if self.is_hardfloat: @@ -248,11 +256,15 @@ class Android: if self.is_host(): linkflags += ['--gcc-toolchain=%s' % self.gen_gcc_toolchain_path()] - if self.ndk_rev < 20 or self.is_host(): + if self.ndk_rev < 20: + linkflags += ['--sysroot=%s' % (self.sysroot())] + elif self.is_host(): linkflags += ['--sysroot=%s/sysroot' % (self.gen_gcc_toolchain_path())] - if self.is_clang(): + if self.is_clang() or self.is_host(): linkflags += ['-fuse-ld=lld'] + + linkflags += ['-Wl,--hash-style=both'] return linkflags def ldflags(self): @@ -260,7 +272,7 @@ class Android: if self.is_arm(): if self.arch == 'armeabi-v7a': ldflags += ['-march=armv7-a', '-mthumb'] - if not self.is_clang(): # lld only + if not self.is_clang() and not self.is_host(): # lld only ldflags += ['-Wl,--fix-cortex-a8'] if self.is_hardfloat: ldflags += ['-Wl,--no-warn-mismatch', '-lm_hard'] @@ -347,3 +359,20 @@ def patch_compiler_c_configure(conf): setattr(compiler_cxx, 'configure', patch_compiler_cxx_configure) setattr(compiler_c, 'configure', patch_compiler_c_configure) + +@TaskGen.feature('cshlib', 'cxxshlib', 'dshlib', 'fcshlib', 'vnum') +@TaskGen.after_method('apply_link', 'propagate_uselib_vars') +@TaskGen.before_method('apply_vnum') +def apply_android_soname(self): + """ + Enforce SONAME on Android + """ + if self.env.DEST_OS != 'android': + return + + setattr(self, 'vnum', None) # remove vnum, so SONAME would not be overwritten + link = self.link_task + node = link.outputs[0] + libname = node.name + v = self.env.SONAME_ST % libname + self.env.append_value('LINKFLAGS', v.split()) From 4623cb0dc2cb456992776401a1a8697144d82fbe Mon Sep 17 00:00:00 2001 From: Andrey Akhmichin Date: Tue, 24 Sep 2019 01:41:50 +0500 Subject: [PATCH 15/24] Revert "Merge https://github.com/SamVanheer/HLEnhanced/commit/89efd616d6aed0304db5bf63bfecd311c1cedbdd" This reverts commit c4820ad0df7bda569275452ad8f25c60d00301f9. --- dlls/subs.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/dlls/subs.cpp b/dlls/subs.cpp index e24a5c08..b57d7d23 100644 --- a/dlls/subs.cpp +++ b/dlls/subs.cpp @@ -107,13 +107,6 @@ void CBaseEntity::UpdateOnRemove( void ) if( pev->globalname ) gGlobalState.EntitySetState( pev->globalname, GLOBAL_DEAD ); - - // tell owner ( if any ) that we're dead.This is mostly for MonsterMaker functionality. - //Killtarget didn't do this before, so the counter broke. - Solokiller - if( CBaseEntity* pOwner = pev->owner ? Instance( pev->owner ) : 0 ) - { - pOwner->DeathNotice( pev ); - } } // Convenient way to delay removing oneself From c9fdcd91e8eeffce706b65731fe67589176fa88a Mon Sep 17 00:00:00 2001 From: Andrey Akhmichin Date: Tue, 24 Sep 2019 03:00:37 +0500 Subject: [PATCH 16/24] A little optimizations. --- cl_dll/hud_spectator.cpp | 2 +- cl_dll/input.cpp | 2 +- dlls/animation.cpp | 2 +- dlls/bmodels.cpp | 2 +- dlls/buttons.cpp | 2 +- dlls/doors.cpp | 6 ++---- dlls/h_battery.cpp | 15 ++++++--------- dlls/multiplay_gamerules.cpp | 15 ++++++++++----- dlls/plats.cpp | 3 +-- dlls/player.cpp | 4 ++-- dlls/scripted.cpp | 5 ++++- dlls/sound.cpp | 6 +++--- dlls/teamplay_gamerules.cpp | 4 ++-- dlls/triggers.cpp | 6 +++--- dlls/util.cpp | 4 ++-- 15 files changed, 40 insertions(+), 38 deletions(-) diff --git a/cl_dll/hud_spectator.cpp b/cl_dll/hud_spectator.cpp index edb743ba..889dc686 100644 --- a/cl_dll/hud_spectator.cpp +++ b/cl_dll/hud_spectator.cpp @@ -842,7 +842,7 @@ bool CHudSpectator::ParseOverviewFile() m_OverviewData.layersHeights[0] = 0.0f; strcpy( m_OverviewData.map, gEngfuncs.pfnGetLevelName() ); - if( strlen( m_OverviewData.map ) == 0 ) + if( m_OverviewData.map[0] == '\0' ) return false; // not active yet strcpy( levelname, m_OverviewData.map + 5 ); diff --git a/cl_dll/input.cpp b/cl_dll/input.cpp index 0abd542b..628ff088 100644 --- a/cl_dll/input.cpp +++ b/cl_dll/input.cpp @@ -169,7 +169,7 @@ int KB_ConvertString( char *in, char **ppout ) *pEnd = '\0'; pBinding = NULL; - if( strlen( binding + 1 ) > 0 ) + if( binding[1] != '\0' ) { // See if there is a binding for binding? pBinding = gEngfuncs.Key_LookupBinding( binding + 1 ); diff --git a/dlls/animation.cpp b/dlls/animation.cpp index f84ec380..9f70f3d1 100644 --- a/dlls/animation.cpp +++ b/dlls/animation.cpp @@ -203,7 +203,7 @@ void SequencePrecache( void *pmodel, const char *pSequenceName ) // of it's name if it is. if( IsSoundEvent( pevent[i].event ) ) { - if( !strlen( pevent[i].options ) ) + if( pevent[i].options[0] == '\0' ) { ALERT( at_error, "Bad sound event %d in sequence %s :: %s (sound is \"%s\")\n", pevent[i].event, pstudiohdr->name, pSequenceName, pevent[i].options ); } diff --git a/dlls/bmodels.cpp b/dlls/bmodels.cpp index fe56b6ac..b75a0fa8 100644 --- a/dlls/bmodels.cpp +++ b/dlls/bmodels.cpp @@ -434,7 +434,7 @@ void CFuncRotating::Precache( void ) BOOL NullSound = FALSE; // set up fan sounds - if( !FStringNull( pev->message ) && strlen( szSoundFile ) > 0 ) + if( !FStringNull( pev->message ) && szSoundFile[0] != '\0' ) { // if a path is set for a wave, use it } diff --git a/dlls/buttons.cpp b/dlls/buttons.cpp index 90bc42e5..f7441b3f 100644 --- a/dlls/buttons.cpp +++ b/dlls/buttons.cpp @@ -694,7 +694,7 @@ CBaseButton::BUTTON_CODE CBaseButton::ButtonResponseToTouch( void ) void CBaseButton::ButtonTouch( CBaseEntity *pOther ) { // Ignore touches by anything but players - if( !FClassnameIs( pOther->pev, "player" ) ) + if( !pOther->IsPlayer() ) return; m_hActivator = pOther; diff --git a/dlls/doors.cpp b/dlls/doors.cpp index 085ee441..9091d70a 100644 --- a/dlls/doors.cpp +++ b/dlls/doors.cpp @@ -520,10 +520,8 @@ void CBaseDoor::Precache( void ) // void CBaseDoor::DoorTouch( CBaseEntity *pOther ) { - entvars_t *pevToucher = pOther->pev; - // Ignore touches by anything but players - if( !FClassnameIs( pevToucher, "player" ) ) + if( !pOther->IsPlayer() ) return; // If door has master, and it's not ready to trigger, @@ -542,7 +540,7 @@ void CBaseDoor::DoorTouch( CBaseEntity *pOther ) m_hActivator = pOther;// remember who activated the door - if( DoorActivate()) + if( DoorActivate() ) SetTouch( NULL ); // Temporarily disable the touch function, until movement is finished. } diff --git a/dlls/h_battery.cpp b/dlls/h_battery.cpp index dabbc06c..6c6b9869 100644 --- a/dlls/h_battery.cpp +++ b/dlls/h_battery.cpp @@ -106,8 +106,12 @@ void CRecharge::Precache() void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { + // Make sure that we have a caller + if( !pActivator ) + return; + // if it's not a player, ignore - if( !FClassnameIs( pActivator->pev, "player" ) ) + if( !pActivator->IsPlayer() ) return; // if there is no juice left, turn it off @@ -135,16 +139,8 @@ void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use if( m_flNextCharge >= gpGlobals->time ) return; - // Make sure that we have a caller - if( !pActivator ) - return; - m_hActivator = pActivator; - //only recharge the player - if( !m_hActivator->IsPlayer() ) - return; - // Play the on sound or the looping charging sound if( !m_iOn ) { @@ -152,6 +148,7 @@ void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/suitchargeok1.wav", 0.85, ATTN_NORM ); m_flSoundTime = 0.56 + gpGlobals->time; } + if( ( m_iOn == 1 ) && ( m_flSoundTime <= gpGlobals->time ) ) { m_iOn++; diff --git a/dlls/multiplay_gamerules.cpp b/dlls/multiplay_gamerules.cpp index de91ac6e..358a4470 100644 --- a/dlls/multiplay_gamerules.cpp +++ b/dlls/multiplay_gamerules.cpp @@ -1331,7 +1331,8 @@ int ReloadMapCycleFile( const char *filename, mapcycle_t *cycle ) hasbuffer = 0; pFileList = COM_Parse( pFileList ); - if( strlen( com_token ) <= 0 ) + + if( com_token[0] == '\0' ) break; strcpy( szMap, com_token ); @@ -1340,7 +1341,8 @@ int ReloadMapCycleFile( const char *filename, mapcycle_t *cycle ) if( COM_TokenWaiting( pFileList ) ) { pFileList = COM_Parse( pFileList ); - if( strlen( com_token ) > 0 ) + + if( com_token[0] != '\0' ) { hasbuffer = 1; strcpy( szBuffer, com_token ); @@ -1496,7 +1498,8 @@ void ExtractCommandString( char *s, char *szCommand ) *o = 0; strcat( szCommand, pkey ); - if( strlen( value ) > 0 ) + + if( value[0] != '\0' ) { strcat( szCommand, " " ); strcat( szCommand, value ); @@ -1631,13 +1634,15 @@ void CHalfLifeMultiplay::ChangeLevel( void ) { ALERT( at_console, "PLAYER COUNT: min %i max %i current %i\n", minplayers, maxplayers, curplayers ); } - if( strlen( szRules ) > 0 ) + + if( szRules != '\0' ) { ALERT( at_console, "RULES: %s\n", szRules ); } CHANGE_LEVEL( szNextMap, NULL ); - if( strlen( szCommands ) > 0 ) + + if( szCommands[0] != '\0' ) { SERVER_COMMAND( szCommands ); } diff --git a/dlls/plats.cpp b/dlls/plats.cpp index 5a96a36b..8356d55e 100644 --- a/dlls/plats.cpp +++ b/dlls/plats.cpp @@ -358,8 +358,7 @@ void CPlatTrigger::SpawnInsideTrigger( CFuncPlat *pPlatform ) void CPlatTrigger::Touch( CBaseEntity *pOther ) { // Ignore touches by non-players - entvars_t *pevToucher = pOther->pev; - if( !FClassnameIs( pevToucher, "player" ) ) + if( !pOther->IsPlayer() ) return; CFuncPlat *pPlatform = (CFuncPlat*)(CBaseEntity*)m_hPlatform; diff --git a/dlls/player.cpp b/dlls/player.cpp index 926bf1e1..43d1d28e 100644 --- a/dlls/player.cpp +++ b/dlls/player.cpp @@ -2762,7 +2762,7 @@ edict_t *EntSelectSpawnPoint( CBaseEntity *pPlayer ) } // If startspot is set, (re)spawn there. - if( FStringNull( gpGlobals->startspot ) || !strlen(STRING( gpGlobals->startspot ) ) ) + if( FStringNull( gpGlobals->startspot ) || (STRING( gpGlobals->startspot ) )[0] == '\0') { pSpot = UTIL_FindEntityByClassname( NULL, "info_player_start" ); if( !FNullEnt( pSpot ) ) @@ -4432,7 +4432,7 @@ void CBasePlayer::DropPlayerItem( char *pszItemName ) return; } - if( !strlen( pszItemName ) ) + if( pszItemName[0] == '\0' ) { // if this string has no length, the client didn't type a name! // assume player wants to drop the active item. diff --git a/dlls/scripted.cpp b/dlls/scripted.cpp index 41638b39..8e3a88ab 100644 --- a/dlls/scripted.cpp +++ b/dlls/scripted.cpp @@ -1068,14 +1068,17 @@ BOOL CScriptedSentence::AcceptableSpeaker( CBaseMonster *pMonster ) { if( pev->spawnflags & SF_SENTENCE_FOLLOWERS ) { - if( pMonster->m_hTargetEnt == 0 || !FClassnameIs( pMonster->m_hTargetEnt->pev, "player" ) ) + if( pMonster->m_hTargetEnt == 0 || !pMonster->m_hTargetEnt->IsPlayer() ) return FALSE; } + BOOL override; + if( pev->spawnflags & SF_SENTENCE_INTERRUPT ) override = TRUE; else override = FALSE; + if( pMonster->CanPlaySentence( override ) ) return TRUE; } diff --git a/dlls/sound.cpp b/dlls/sound.cpp index acc2dbf7..8fc5cb89 100644 --- a/dlls/sound.cpp +++ b/dlls/sound.cpp @@ -184,7 +184,7 @@ void CAmbientGeneric::Spawn( void ) const char *szSoundFile = STRING( pev->message ); - if( FStringNull( pev->message ) || strlen( szSoundFile ) < 1 ) + if( FStringNull( pev->message ) || szSoundFile[0] == '\0' ) { ALERT( at_error, "EMPTY AMBIENT AT: %f, %f, %f\n", pev->origin.x, pev->origin.y, pev->origin.z ); pev->nextthink = gpGlobals->time + 0.1; @@ -218,7 +218,7 @@ void CAmbientGeneric::Precache( void ) { const char *szSoundFile = STRING( pev->message ); - if( !FStringNull( pev->message ) && strlen( szSoundFile ) > 1 ) + if( !FStringNull( pev->message ) && szSoundFile[0] != '\0' ) { if( *szSoundFile != '!' ) PRECACHE_SOUND( szSoundFile ); @@ -1732,7 +1732,7 @@ void CSpeaker::Spawn( void ) { const char *szSoundFile = STRING( pev->message ); - if( !m_preset && ( FStringNull( pev->message ) || strlen( szSoundFile ) < 1 ) ) + if( !m_preset && ( FStringNull( pev->message ) || szSoundFile[0] == '\0' ) ) { ALERT( at_error, "SPEAKER with no Level/Sentence! at: %f, %f, %f\n", pev->origin.x, pev->origin.y, pev->origin.z ); pev->nextthink = gpGlobals->time + 0.1; diff --git a/dlls/teamplay_gamerules.cpp b/dlls/teamplay_gamerules.cpp index 87b695e7..d3b5c5e3 100644 --- a/dlls/teamplay_gamerules.cpp +++ b/dlls/teamplay_gamerules.cpp @@ -52,14 +52,14 @@ CHalfLifeTeamplay::CHalfLifeTeamplay() if( teamoverride.value ) { const char *pTeamList = STRING( pWorld->v.team ); - if( pTeamList && strlen( pTeamList ) ) + if( pTeamList && pTeamList[0] != '\0' ) { strncpy( m_szTeamList, pTeamList, TEAMPLAY_TEAMLISTLENGTH ); } } } // Has the server set teams - if( strlen( m_szTeamList ) ) + if( m_szTeamList[0] != '\0' ) m_teamLimit = TRUE; else m_teamLimit = FALSE; diff --git a/dlls/triggers.cpp b/dlls/triggers.cpp index 6d8fef04..b7633498 100644 --- a/dlls/triggers.cpp +++ b/dlls/triggers.cpp @@ -1124,7 +1124,7 @@ void CBaseTrigger::ActivateMultiTrigger( CBaseEntity *pActivator ) if( pev->nextthink > gpGlobals->time ) return; // still waiting for reset time - if( !UTIL_IsMasterTriggered( m_sMaster,pActivator ) ) + if( !UTIL_IsMasterTriggered( m_sMaster, pActivator ) ) return; if( FClassnameIs( pev, "trigger_secret" ) ) @@ -1191,7 +1191,7 @@ void CBaseTrigger::CounterUse( CBaseEntity *pActivator, CBaseEntity *pCaller, US BOOL fTellActivator = ( m_hActivator != 0 ) && - FClassnameIs( m_hActivator->pev, "player" ) && + m_hActivator->IsPlayer() && !FBitSet( pev->spawnflags, SPAWNFLAG_NOMESSAGE ); if( m_cTriggersLeft != 0 ) { @@ -1499,7 +1499,7 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator ) // void CChangeLevel::TouchChangeLevel( CBaseEntity *pOther ) { - if( !FClassnameIs( pOther->pev, "player" ) ) + if( !pOther->IsPlayer() ) return; ChangeLevelNow( pOther ); diff --git a/dlls/util.cpp b/dlls/util.cpp index a5160876..a66b5fbc 100644 --- a/dlls/util.cpp +++ b/dlls/util.cpp @@ -2196,7 +2196,7 @@ int CRestore::ReadField( void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCou pString++; } pInputData = pString; - if( strlen( (char *)pInputData ) == 0 ) + if( ( (char *)pInputData )[0] == '\0' ) *( (string_t *)pOutputData ) = 0; else { @@ -2291,7 +2291,7 @@ int CRestore::ReadField( void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCou *( (void**)pOutputData ) = *(void **)pInputData; break; case FIELD_FUNCTION: - if( strlen( (char *)pInputData ) == 0 ) + if( ( (char *)pInputData )[0] == '\0' ) *( (void**)pOutputData ) = 0; else *( (void**)pOutputData ) = (void*)FUNCTION_FROM_NAME( (char *)pInputData ); From 5d85a3be8d796b1b335afcb0a2a962f979ad5ef4 Mon Sep 17 00:00:00 2001 From: Andrey Akhmichin Date: Tue, 24 Sep 2019 03:06:07 +0500 Subject: [PATCH 17/24] Fix build. --- dlls/multiplay_gamerules.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/multiplay_gamerules.cpp b/dlls/multiplay_gamerules.cpp index 358a4470..8305a07f 100644 --- a/dlls/multiplay_gamerules.cpp +++ b/dlls/multiplay_gamerules.cpp @@ -1635,7 +1635,7 @@ void CHalfLifeMultiplay::ChangeLevel( void ) ALERT( at_console, "PLAYER COUNT: min %i max %i current %i\n", minplayers, maxplayers, curplayers ); } - if( szRules != '\0' ) + if( szRules[0] != '\0' ) { ALERT( at_console, "RULES: %s\n", szRules ); } From 04a31f4a1ab825e1a051a0b433f4644f11ceaeff Mon Sep 17 00:00:00 2001 From: iZarif Date: Wed, 2 Oct 2019 23:15:53 +0400 Subject: [PATCH 18/24] fix gcc 8.3.0 format-overflow warnings --- cl_dll/ammo.cpp | 2 +- cl_dll/hud_spectator.cpp | 2 +- dlls/nihilanth.cpp | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cl_dll/ammo.cpp b/cl_dll/ammo.cpp index 4a4437bb..853cfe18 100644 --- a/cl_dll/ammo.cpp +++ b/cl_dll/ammo.cpp @@ -77,7 +77,7 @@ void WeaponsResource::LoadWeaponSprites( WEAPON *pWeapon ) else iRes = 640; - char sz[128]; + char sz[140]; if( !pWeapon ) return; diff --git a/cl_dll/hud_spectator.cpp b/cl_dll/hud_spectator.cpp index 889dc686..51c97bdc 100644 --- a/cl_dll/hud_spectator.cpp +++ b/cl_dll/hud_spectator.cpp @@ -820,7 +820,7 @@ bool CHudSpectator::IsActivePlayer( cl_entity_t *ent ) bool CHudSpectator::ParseOverviewFile() { - char filename[255] = { 0 }; + char filename[270] = { 0 }; char levelname[255] = { 0 }; char token[1024] = { 0 }; float height; diff --git a/dlls/nihilanth.cpp b/dlls/nihilanth.cpp index 1d072db4..d121f22f 100644 --- a/dlls/nihilanth.cpp +++ b/dlls/nihilanth.cpp @@ -724,7 +724,7 @@ void CNihilanth::NextActivity() if( ( pev->health < gSkillData.nihilanthHealth / 2 || m_iActiveSpheres < N_SPHERES / 2 ) && m_hRecharger == 0 && m_iLevel <= 9 ) { - char szName[64]; + char szName[66]; CBaseEntity *pEnt = NULL; CBaseEntity *pRecharger = NULL; @@ -772,7 +772,7 @@ void CNihilanth::NextActivity() if( iseq != pev->sequence ) { - char szText[64]; + char szText[76]; sprintf( szText, "%s%d", m_szDrawUse, m_iLevel ); FireTargets( szText, this, this, USE_ON, 1.0 ); @@ -820,7 +820,7 @@ void CNihilanth::NextActivity() } else { - char szText[64]; + char szText[66]; sprintf( szText, "%s%d", m_szTeleportTouch, m_iTeleport ); CBaseEntity *pTouch = UTIL_FindEntityByTargetname( NULL, szText ); @@ -1100,7 +1100,7 @@ void CNihilanth::HandleAnimEvent( MonsterEvent_t *pEvent ) // prayer if( m_hEnemy != 0 ) { - char szText[32]; + char szText[76]; sprintf( szText, "%s%d", m_szTeleportTouch, m_iTeleport ); CBaseEntity *pTouch = UTIL_FindEntityByTargetname( NULL, szText ); From a0ccf2d0a1ebe9e9126d5059691315029e6ee409 Mon Sep 17 00:00:00 2001 From: iZarif Date: Thu, 3 Oct 2019 00:19:50 +0400 Subject: [PATCH 19/24] size of arrays are now a power of two --- cl_dll/ammo.cpp | 2 +- cl_dll/hud_spectator.cpp | 2 +- dlls/nihilanth.cpp | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cl_dll/ammo.cpp b/cl_dll/ammo.cpp index 853cfe18..c6aabfba 100644 --- a/cl_dll/ammo.cpp +++ b/cl_dll/ammo.cpp @@ -77,7 +77,7 @@ void WeaponsResource::LoadWeaponSprites( WEAPON *pWeapon ) else iRes = 640; - char sz[140]; + char sz[256]; if( !pWeapon ) return; diff --git a/cl_dll/hud_spectator.cpp b/cl_dll/hud_spectator.cpp index 51c97bdc..b86834af 100644 --- a/cl_dll/hud_spectator.cpp +++ b/cl_dll/hud_spectator.cpp @@ -820,7 +820,7 @@ bool CHudSpectator::IsActivePlayer( cl_entity_t *ent ) bool CHudSpectator::ParseOverviewFile() { - char filename[270] = { 0 }; + char filename[512] = { 0 }; char levelname[255] = { 0 }; char token[1024] = { 0 }; float height; diff --git a/dlls/nihilanth.cpp b/dlls/nihilanth.cpp index d121f22f..c9ed0742 100644 --- a/dlls/nihilanth.cpp +++ b/dlls/nihilanth.cpp @@ -724,7 +724,7 @@ void CNihilanth::NextActivity() if( ( pev->health < gSkillData.nihilanthHealth / 2 || m_iActiveSpheres < N_SPHERES / 2 ) && m_hRecharger == 0 && m_iLevel <= 9 ) { - char szName[66]; + char szName[128]; CBaseEntity *pEnt = NULL; CBaseEntity *pRecharger = NULL; @@ -772,7 +772,7 @@ void CNihilanth::NextActivity() if( iseq != pev->sequence ) { - char szText[76]; + char szText[128]; sprintf( szText, "%s%d", m_szDrawUse, m_iLevel ); FireTargets( szText, this, this, USE_ON, 1.0 ); @@ -820,7 +820,7 @@ void CNihilanth::NextActivity() } else { - char szText[66]; + char szText[128]; sprintf( szText, "%s%d", m_szTeleportTouch, m_iTeleport ); CBaseEntity *pTouch = UTIL_FindEntityByTargetname( NULL, szText ); @@ -1100,7 +1100,7 @@ void CNihilanth::HandleAnimEvent( MonsterEvent_t *pEvent ) // prayer if( m_hEnemy != 0 ) { - char szText[76]; + char szText[128]; sprintf( szText, "%s%d", m_szTeleportTouch, m_iTeleport ); CBaseEntity *pTouch = UTIL_FindEntityByTargetname( NULL, szText ); From 6ef4c8765f3860d1c9a822766e7e85ba8afbbd73 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Wed, 9 Oct 2019 03:50:25 +0300 Subject: [PATCH 20/24] waifulib: xcompile: merge xcompile from engine branch --- scripts/waifulib/xcompile.py | 134 +++++++++++++++++++++-------------- 1 file changed, 80 insertions(+), 54 deletions(-) diff --git a/scripts/waifulib/xcompile.py b/scripts/waifulib/xcompile.py index fd6dd596..98516ce8 100644 --- a/scripts/waifulib/xcompile.py +++ b/scripts/waifulib/xcompile.py @@ -19,13 +19,21 @@ from collections import OrderedDict import os import sys +ANDROID_NDK_ENVVARS = ['ANDROID_NDK_HOME', 'ANDROID_NDK'] +ANDROID_NDK_SUPPORTED = [10, 19, 20] +ANDROID_NDK_HARDFP_MAX = 11 # latest version that supports hardfp +ANDROID_NDK_GCC_MAX = 17 # latest NDK that ships with GCC +ANDROID_NDK_UNIFIED_SYSROOT_MIN = 15 +ANDROID_NDK_SYSROOT_FLAG_MAX = 19 # latest NDK that need --sysroot flag +ANDROID_NDK_API_MIN = { 10: 3, 19: 16, 20: 16 } # minimal API level ndk revision supports +ANDROID_64BIT_API_MIN = 21 # minimal API level that supports 64-bit targets + # This class does support ONLY r10e and r19c/r20 NDK class Android: ctx = None # waf context arch = None toolchain = None api = None - toolchain_path = None ndk_home = None ndk_rev = 0 is_hardfloat = False @@ -37,13 +45,13 @@ class Android: self.toolchain = toolchain self.arch = arch - for i in ['ANDROID_NDK_HOME', 'ANDROID_NDK']: + for i in ANDROID_NDK_ENVVARS: self.ndk_home = os.getenv(i) if self.ndk_home != None: break - - if not self.ndk_home: - ctx.fatal('Set ANDROID_NDK_HOME environment variable pointing to the root of Android NDK!') + else: + ctx.fatal('Set %s environment variable pointing to the root of Android NDK!' % + ' or '.join(ANDROID_NDK_ENVVARS)) # TODO: this were added at some point of NDK development # but I don't know at which version @@ -57,32 +65,29 @@ class Android: if 'Pkg.Revision' in trimed_tokens: self.ndk_rev = int(trimed_tokens[1].split('.')[0]) + + if self.ndk_rev not in ANDROID_NDK_SUPPORTED: + ctx.fatal('Unknown NDK revision: %d' % (self.ndk_rev)) else: - self.ndk_rev = 10 + self.ndk_rev = ANDROID_NDK_SUPPORTED[0] - if self.ndk_rev not in [10, 19, 20]: - ctx.fatal('Unknown NDK revision: %d' % (self.ndk_rev)) - - if self.is_host() and self.ndk_rev < 20: - ctx.fatal('Using host toolchain with this NDK revision is untested. You can comment this check, but you\'re on your own!') - - if self.ndk_rev >= 19 or 'clang' in self.toolchain: + if 'clang' in self.toolchain or self.ndk_rev > ANDROID_NDK_GCC_MAX: self.clang = True if self.arch == 'armeabi-v7a-hard': - if self.ndk_rev <= 10: + if self.ndk_rev <= ANDROID_NDK_HARDFP_MAX: self.arch = 'armeabi-v7a' # Only armeabi-v7a have hard float ABI self.is_hardfloat = True else: ctx.fatal('NDK does not support hardfloat ABI') - if self.is_arm64() or self.is_amd64() and self.api < 21: - Logs.warn('API level for 64-bit target automatically was set to 21') - self.api = 21 - elif self.ndk_rev >= 19 and self.api < 16: - Logs.warn('API level automatically was set to 16 due to NDK support') - self.api = 16 - self.toolchain_path = self.gen_toolchain_path() + if self.api < ANDROID_NDK_API_MIN[self.ndk_rev]: + self.api = ANDROID_NDK_API_MIN[self.ndk_rev] + Logs.warn('API level automatically was set to %d due to NDK support' % self.api) + + if self.is_arm64() or self.is_amd64() and self.api < ANDROID_64BIT_API_MIN: + self.api = ANDROID_64BIT_API_MIN + Logs.warn('API level for 64-bit target automatically was set to %d' % self.api) def is_host(self): ''' @@ -139,29 +144,32 @@ class Android: else: return self.arch + '-linux-android' - def gen_gcc_toolchain_path(self): - path = 'toolchains' + def gen_host_toolchain(self): + # With host toolchain we don't care about OS + # so just download NDK for Linux x86_64 + if self.is_host(): + return 'linux-x86_64' if sys.platform.startswith('win32') or sys.platform.startswith('cygwin'): - toolchain_host = 'windows' + osname = 'windows' elif sys.platform.startswith('darwin'): - toolchain_host = 'darwin' - elif sys.platform.startswith('linux') or self.is_host(): - toolchain_host = 'linux' + osname = 'darwin' + elif sys.platform.startswith('linux'): + osname = 'linux' else: self.ctx.fatal('Unsupported by NDK host platform') - toolchain_host += '-' - - # Assuming we are building on x86 if sys.maxsize > 2**32: - toolchain_host += 'x86_64' - else: toolchain_host += 'x86' + arch = 'x86_64' + else: arch = 'x86' + + return '%s-%s' % (osname, arch) + + def gen_gcc_toolchain_path(self): + path = 'toolchains' + toolchain_host = self.gen_host_toolchain() if self.is_clang(): - if self.ndk_rev < 19: - raise self.ctx.fatal('Clang is not supported for this NDK') - toolchain_folder = 'llvm' else: if self.is_host(): @@ -186,12 +194,12 @@ class Android: def cc(self): if self.is_host(): return 'clang --target=%s%d' % (self.ndk_triplet(), self.api) - return self.toolchain_path + ('clang' if self.is_clang() else 'gcc') + return self.gen_toolchain_path() + ('clang' if self.is_clang() else 'gcc') def cxx(self): if self.is_host(): return 'clang++ --target=%s%d' % (self.ndk_triplet(), self.api) - return self.toolchain_path + ('clang++' if self.is_clang() else 'g++') + return self.gen_toolchain_path() + ('clang++' if self.is_clang() else 'g++') def strip(self): if self.is_host(): @@ -213,24 +221,28 @@ class Android: return os.path.abspath(os.path.join(self.ndk_home, path)) def sysroot(self): - if self.ndk_rev >= 19: + if self.ndk_rev >= ANDROID_NDK_UNIFIED_SYSROOT_MIN: return os.path.abspath(os.path.join(self.ndk_home, 'sysroot')) else: return self.libsysroot() - def cflags(self): + def cflags(self, cxx = False): cflags = [] - if self.is_host(): - if self.ndk_rev >= 19: + + if self.ndk_rev <= ANDROID_NDK_SYSROOT_FLAG_MAX: + cflags += ['--sysroot=%s' % (self.sysroot())] + else: + if self.is_host(): cflags += [ '--sysroot=%s/sysroot' % (self.gen_gcc_toolchain_path()), '-I%s/usr/include/' % (self.sysroot()) ] - else: cflags += ['--sysroot=%s' % (self.sysroot())] - elif self.ndk_rev < 20: - cflags += ['--sysroot=%s' % (self.sysroot())] cflags += ['-I%s' % (self.system_stl()), '-DANDROID', '-D__ANDROID__'] + + if cxx and not self.is_clang() and self.toolchain not in ['4.8','4.9']: + cflags += ['-fno-sized-deallocation'] + if self.is_arm(): if self.arch == 'armeabi-v7a': # ARMv7 support @@ -239,8 +251,18 @@ class Android: if not self.is_clang() and not self.is_host(): cflags += [ '-mvectorize-with-neon-quad' ] - if self.is_hardfloat: - cflags += ['-D_NDK_MATH_NO_SOFTFP=1', '-mhard-float', '-mfloat-abi=hard', '-DLOAD_HARDFP', '-DSOFTFP_LINK'] + if self.is_hardfp(): + cflags += ['-D_NDK_MATH_NO_SOFTFP=1', '-mfloat-abi=hard', '-DLOAD_HARDFP', '-DSOFTFP_LINK'] + + if self.is_host(): + # Clang builtin redefine w/ different calling convention bug + # NOTE: I did not added complex.h functions here, despite + # that NDK devs forgot to put __NDK_FPABI_MATH__ for complex + # math functions + # I personally don't need complex numbers support, but if you want it + # just run sed to patch header + for f in ['strtod', 'strtof', 'strtold']: + cflags += ['-fno-builtin-%s' % f] else: cflags += ['-mfloat-abi=softfp'] else: @@ -256,7 +278,7 @@ class Android: if self.is_host(): linkflags += ['--gcc-toolchain=%s' % self.gen_gcc_toolchain_path()] - if self.ndk_rev < 20: + if self.ndk_rev <= ANDROID_NDK_SYSROOT_FLAG_MAX: linkflags += ['--sysroot=%s' % (self.sysroot())] elif self.is_host(): linkflags += ['--sysroot=%s/sysroot' % (self.gen_gcc_toolchain_path())] @@ -264,17 +286,21 @@ class Android: if self.is_clang() or self.is_host(): linkflags += ['-fuse-ld=lld'] - linkflags += ['-Wl,--hash-style=both'] + linkflags += ['-Wl,--hash-style=both','-Wl,--no-undefined'] return linkflags def ldflags(self): - ldflags = ['-stdlib=libstdc++', '-lgcc', '-no-canonical-prefixes'] + ldflags = ['-lgcc', '-no-canonical-prefixes'] + if self.is_clang() or self.is_host(): + ldflags += ['-stdlib=libstdc++'] if self.is_arm(): if self.arch == 'armeabi-v7a': ldflags += ['-march=armv7-a', '-mthumb'] + if not self.is_clang() and not self.is_host(): # lld only ldflags += ['-Wl,--fix-cortex-a8'] - if self.is_hardfloat: + + if self.is_hardfp(): ldflags += ['-Wl,--no-warn-mismatch', '-lm_hard'] else: ldflags += ['-march=armv5te'] @@ -301,7 +327,7 @@ def configure(conf): conf.environ['CXX'] = android.cxx() conf.environ['STRIP'] = android.strip() conf.env.CFLAGS += android.cflags() - conf.env.CXXFLAGS += android.cflags() + conf.env.CXXFLAGS += android.cflags(True) conf.env.LINKFLAGS += android.linkflags() conf.env.LDFLAGS += android.ldflags() @@ -314,9 +340,9 @@ def configure(conf): conf.msg('Selected Android NDK', '%s, version: %d' % (android.ndk_home, android.ndk_rev)) # no need to print C/C++ compiler, as it would be printed by compiler_c/cxx - conf.msg('... C/C++ flags', ' '.join(android.cflags()).replace(android.ndk_home, '$NDK')) - conf.msg('... link flags', ' '.join(android.linkflags()).replace(android.ndk_home, '$NDK')) - conf.msg('... ld flags', ' '.join(android.ldflags()).replace(android.ndk_home, '$NDK')) + conf.msg('... C/C++ flags', ' '.join(android.cflags()).replace(android.ndk_home, '$NDK/')) + conf.msg('... link flags', ' '.join(android.linkflags()).replace(android.ndk_home, '$NDK/')) + conf.msg('... ld flags', ' '.join(android.ldflags()).replace(android.ndk_home, '$NDK/')) # conf.env.ANDROID_OPTS = android conf.env.DEST_OS2 = 'android' From 36516ddb47e6e0a244073208cdbbd1aeaf20d02e Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Wed, 9 Oct 2019 05:52:13 +0300 Subject: [PATCH 21/24] waifulib: xcompile: fix aarch64 binary installation --- scripts/waifulib/xcompile.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/waifulib/xcompile.py b/scripts/waifulib/xcompile.py index 98516ce8..fe9b0e27 100644 --- a/scripts/waifulib/xcompile.py +++ b/scripts/waifulib/xcompile.py @@ -144,6 +144,11 @@ class Android: else: return self.arch + '-linux-android' + def apk_arch(self): + if self.is_arm64(): + return 'arm64-v8a' + return self.arch + def gen_host_toolchain(self): # With host toolchain we don't care about OS # so just download NDK for Linux x86_64 @@ -336,7 +341,7 @@ def configure(conf): conf.env.LIB_M = ['m_hard'] else: conf.env.LIB_M = ['m'] - conf.env.PREFIX = '/lib/%s' % (android.arch) + conf.env.PREFIX = '/lib/%s' % android.apk_arch() conf.msg('Selected Android NDK', '%s, version: %d' % (android.ndk_home, android.ndk_rev)) # no need to print C/C++ compiler, as it would be printed by compiler_c/cxx From fea49e2187b0152bdf2a55eed0850d27c1b84161 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Fri, 11 Oct 2019 08:37:33 +0300 Subject: [PATCH 22/24] waf: upgrade to latest waifu revision --- waf | 12 ++--- wscript | 153 +++++++++++++++++++++++++++++++++++++++----------------- 2 files changed, 114 insertions(+), 51 deletions(-) diff --git a/waf b/waf index 3bd5c703..53213cb6 100755 --- a/waf +++ b/waf @@ -33,12 +33,12 @@ POSSIBILITY OF SUCH DAMAGE. import os, sys, inspect VERSION="2.0.18" -REVISION="51fff4c95844a6b013877286b96a55d0" -GIT="68bf3867df33c04c944e8905820fc4cca4b663d1" +REVISION="ff338576c6abcf8ea755ffa7e678f790" +GIT="6539bd1ad3e285b124c02859ee5862dbd80704b7" INSTALL='' -C1='#/' -C2='#-' -C3='#%' +C1='#[' +C2='#E' +C3='#2' cwd = os.getcwd() join = os.path.join @@ -168,5 +168,5 @@ if __name__ == '__main__': Scripting.waf_entry_point(cwd, VERSION, wafdir) #==> -#BZh91AY&SY:1P},Ƭ#%80ebT\{j#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%#%>۱]m#Xl.εmk*T(:zzfRw5/;{^'{;2n6YV|.ٛnܩAGBDub(;$ʽաD^m55wn7}=]뽯ڣyr;=ڎ{#%#%#%#%#%J :>_|#%딇mOv#%#-;==]QfTT z#%9kE^#/HITU(JK"P @Q@( Eo}je{Ҭ(T;dT-j{;.M46/}v7ݳ}{׾=_b۝o}/;=|m{y7rZ_Mmo`0#/֭[E:ֵ]\nsvDv#-"JI{#%Q@P"D#%SG(VXXO\u{5;yJ{[[{ﺆ=45UuΓq^믾s@7on޼.ݶ{j/ίy{#%)qS寭un.ᄑ=YOv>=7uM;M۳}}ww^;v4k_=tͱo:{=8R{|uu}#-]a|X]qO'C}rW`#%ッow}{wͅx(%" H9n4UW6:]z|Y:W+|ByGAfvސ#%;@#%i_{[Y#{yza_m-}=+>뭣fw֭݊u{zυ͆}Ӯwϰu0#F(:=#-6O|׹`v]_lRTWy[Jǽ>u;{w۷:uWuەy>zo;azOZ(pЗSq6#/Prv'F뼳լ#%#%eY{T52Y@(R}6{!ٽyulUW}7g;lQ.ksm;wnUӰ{51+ ={|wczvc6nW[L?ۭ_˚vD&C"|mY؈͵,mDI=WP9rQ$H(%H.ZAgFQUP&\usFkWyQGJ̗S6?j%+\QD[im!{1~GĬ#/#EHk hgo,hQՋ}:BCSNJfn1Ez!p]rZ@GOl2u>eh'BvQU`g:澼X&芳!)v}wCFua醕MbcrmU˓B$?6Q'v6#-Fy>lD%}e LoP#/2Yӝ\R~{:vɧ 6m|ˤn7L49+(Tp2xmiF6yAlDqKxخYD,'jnqP?= mr,>,O+ &'uy _ibޝ1EDEtP1PX+W۠箞t c3cSXl"nrɨ6mҩ`4h V>[Q#-PJ^XN &1O7nCI)wD:]e*dJ}幨o]^"RklZ5fݣY#9QؖU E0T|ϴ)-dҪ(I"kz{q]ofܕ8XZ4hU#-9Dc5I0 #h}TIQF#%Vl&PZI\,[sF^N]1[HI! tx8ڨJeJEzwլХᡅ9:2 AM(SvZl JvJ *6Kn)i6I./xC#/(6DŽm}>k)mL$,b;vRWʪ,DE'k)DG[v;bhp|84eP:jLo}3u0Sj(?~yʨnr(Møf*ZL;1-5Iٯf7)3#/3T~\*|#peKbuv6Y>}I]Rqƺ𪮕 %UUT=.м"">mFbeMc|Y@qwpMTd0cs6Db.=(Z?Md%MvA9G7gfylǪDNVG_f6ΩԧJ~v<~W2DRO^w"m0ΛgZ|KW%Nv6哷|J~[&"õYXF| WS#3[#X#/Gp:ÊF`?#-^9 :P%taI0Z\er}ꑡ)=woLrФ<S:wծʇ4&Q}vڜOtQyNfz/?D#B 5(5M{t-:tnc2?M<#NTnL7pSeq~c>߷&2y!m:>1  Fߤ :l#iQ\[ խW4WFnM87G;׽ۺ1͞Z%$LB;R\<矁tjI#n(=zґTc,1ӌQ\i}]'*>1ڳ~wtg#-ؓx11N#-xr"5(#2Bm_EÉ5dEt_k4;õZ : uHPqdwW)Xwãb, " u"}nW^n2vPP2AP3~- UKTWF#/u|V^1>{u2AD,廉z^>|Iϗܩg*36;q(*UTaҏઽmaચ-{/zvftdZŬ}kw4~xT;,nG8Uf;V̘v,Q˄? Jj+{y6b焿g.r FsV|H,co[߿]0ɁGE"03~}TT^ER,':i*iV{Ovf4ES1`өb董)|_:6#%*OO|Ma3xeğEBc"M4JW(S)ɋpFii5kٯKLJ$_#68.NbpN۬q ދB"Ic3Hj Ï*ZT$PHXG{yc(:n#-Z}Cgw/(f@IlA˛V#-NM֔^=xCt¸2%iȉBD;6zucm\p#->j)kkWޙI"#-Z\I)D~pɹ_X=_lS#/0҉ldsmwkِbmj42[Ji;ִ{qMqm¦TSnUs;,±Us +Q$R)8Piν%FMKҝ$vYO.V7 (}cO_'D`Z;ɗ,oT@e߁Hylj~ccZM)(Qmrs\~3OT9ɪˑkD"IKyhaU|Mӝ?}Ӌw;Rg)݋_tSU+|6Nl.~΄Kݶz.O)3ͬ}w/B]buZzW$f=D/|UO϶Yԇ$Z>bMuҟ'[Hz%tHd+}5_F#/6RƥPx\sK +}vT)izSI :]6h]5_#\Lh/#/F;=iFSgՆux*Efh4f=2ӾpS&q@;G3iP%!˿ofHtt@ݠdOzc䣎.-N%6wKu/H&`Fqך"pg#/35J.r[iȥD@JԾYL%Űb{벹JN.m);H#%|ɢ:W_ \W4nfZ񔴝$#/*b"/gLc$c寧Wm砰1˖.%ˮw߉1|߀붙!u}+lp*y#s]6dYA)|?eZeT<):Ab:JԳfUUJ`SQ e9j+{x$T ~U#/9JQ^!ipum.ѭưPd@P%G[ @D.gΉJΟ'7=\o(SZ`A-ߺf-9G%dw|v6ZA|:ߺmEc#%Jcw2yĺeRx?$E|uqC6c["}%.,hǗ>#/#"6|1Eꍟ7V3r˫eDѸHr.5Rg҉b(vScR^n+)^)Ls#Zۭ_DOZFJ[!~\܋͌zx*H@q3Kk&(ɢ!ySbe䆏ͬ;hӞz:4z# $2is߱s#-#-HaoX.0m)Ctc_'PoW}L9>mzq*ݽ16q&Vw#/r=+7r˝[bAyF9_am-tDgQ qjt 1H#-v/~xf )}=o`z-^H,>?-~mӃWo$1dݣdUރߏe6ǵ1jN5 h9݆9$>0ު =I ?]x\`aMo6<5MJ<,on+R1\ǔXr\lR:O(g7ݒŲ-KYgƝmwl'ϗ6wO<:~NM?,dZZ`cl-*V݄|䙦CM^d!) )3ȮW&m!ْI4ߩQuW}Y%Z#}J1bJ"YiN9e+Tˋ{}}:!tpa! V(qѶ1>?xZx((H&;+'yƛþr5UƼO)pn$:lY+4X}}Uu]~ɐ&gE3^~9ɂS2T҆Z-{jW@fo̤[G<@zfVw乚P>IMzݏY C$)w}"EyN6d(;p(*>Qյ3#%qwA(Ds#/g[R==E빴9dkA,!nm(l6=T?c mU)eN:ЉfbRUO!!}#;4olV,E,;O$#Iai`k-o(P@)9CXhN-#-+c8s/j8L+Cuxy;;~zhc}cyjsM?b-VX}pm6­nk\]Ǯ_N X/o86V1Z5CTñb4`M$cwU03.(]g׏{G`f:2Bq'(IK42ًM8U},I4"zVwqL{"R0CMq0YG##->ԄSy"HK2!4Ĩi:~ !xd㠐u+2{gom6!&-05%;݂S2rA1 `E[{Սu3pܭɑw#/7\y|K҉l /}S;qAnCG-;+5{JMLJ&V0/'QcLK#-yyI-6+d,1w |j(ٚS3 PB2HHa&z^~CN?8`ߧDېClԐ"=ty7wh-#˴So;~VQ$w=rЉB@@ @JAQ0{*UNNo\)1Jh;gՍ=XOōg]{db]8x_vF#-t8e2̕5}&fM h{ԠȄ^*]uo iuM2 UU$`!XݜX ߼stM -.&FzP15 zdȔ K|-TtwJdq\a{UMm8טbβL#- 5P8pZ)*+fiކ7P匈jswF!1I::2 #Cj勳z8ݨw! 8`\=i,;r$qIW6pY5ɦXi4cS2 ucz;K`r:7UqVY6Ľ(μ7J0 bBerx$Pgajaeyfj.{){FG=ń'?;]^7,Gr3+lPޥ.p&wE#%{,dPQQKv.wu1" CS%$mq=2zÿM4TqaIЛiRH6LcdR#:{hM&ɃjĤAC#% #%rY8;Z#~}fMUXzuV"H|fyIE'i'JRCJg"އ{>,HRzp6Ƅ>#,ofLcˇ LXɓ' C[4\0pREPE8U&IWTCyp2b0(ku4Im2,ٛU(OC柏^4D2g$zv4iVh{Tr;>'%-;^'ǡkζg}iPjt³G1sFrOVl? @%Ԫ%2c4ip1{j[* wywA/w>DKl)-ʆLS`Q7t r^uJiԱƑC6G81K,d* ɺLCXX6@F14_#-D}4 „c0a ْS%BC Yr#4eodFCFK`(euD 8IwNhK,:VbV66@@̄$#%^鵎fgf$?ËuZbBT"RS$o"m}%e7wrzI#-V6g]w -h5$A\,2VlV;:N{#D/OݜR&k0;am+kG?ϯ.q.86{1KqIU89.= 28.&T%chҖ!$rKoS<]K֦܉}\PMc@Ͽ_=or>qO-Kl&H16pKo9똀~2"&#/?<^lBpM#A'ם†m&IO/A}2{L`=}Vy=<^r::_jv52ICq57Υ<¸5t~Z~[BkTAbTh/j1ukᬺ>Ta4 dF<V!E<,Ў}j'~ S_F(PQD:idCg}dCAp i/J'D\ m#-2#%ҌGywQϽ9ؓKQ$,S#-O<1O#%K#/En26A0F;G4_OCF3K/8L:Ljϳ~ōFnXaLVzkDݰ`lJIZʶQJH[|3es^zimvu$$&"`hgɕi"1E#/T1E ^ʷdCB{-D)q͂4VX<(0d{bTrJG7ܼ6{ꔠHXU#%)Gܛ>#/3lq.沕%uHrN~N'%9BJUԣ!_M2UܭLH)"Z0sk]6-snIF$&)NM#-b c%*Ҟz,FF_0p`Pkfw2LN[u4Z2N태jo0 լAOE)8|"#-g:y'|QϡeQa{iϵԶܑ;`ڕ"~wyBywEb4Jۏq:~zůN#o9ZWi7<{;k|9$?-9q8L/[awvB/Lm6ەCA_>pr0#-#/yEb#//8*vzxOb)n%Jnq#/|=al7#/.#-kI$[@\*ؽO X܌u,zuxs>/ik%_9ѧ0)u㗓+_O$v}uj<=7]uVaו:oҿwo3#/F-4n#-u:W_B^ֳQ#%GFs{}VߐIʲi;+}l,,#-BnHMc9L*#Tˑ1ka[uX'~?nOMpR)&O'oP).5U˵#-K\VJ䟋b;/ZI㧝me3 ${_y5憯ᄿVǙ={}t?ó&<DŽpɱޙvܑ^f{c}~ ~ ʥ$baUM?z<6P}p[%qۜ׏mz*mm^a#-:k4ǦJZ#-v^(0dLMy>ϟ#̌(s/@HD2:'WD3co ƹ2׶?,2J]|.kj ~o⓷7UTZ#^4 'e=&]MTGGWڛc~A甑N8c:`CZvH]c9B~}텤UiXgרpiǿ6's0$-)̓yM"MxXf{ŏpIxFȱNѶ֍u;/[VA5d}2Ou#-+^NnFĥ^Ǟ iz< +6߶o}Uy5mG le!QT;-b =SG;P8)IoQ\FZ "Mphe}5?!ܹA}yyM6;jIcopוo$1ׄI=PEU)Cfg.I$酸Hq1%o ':̚xIfݷ% $utB}Z4s*\vRV(mj2a8S36q}Cͅ2(k1@-M h(0W%1ot+~>]& V &0L\UϻSz7׃fE|6S.wEc_u#*c8 ۱Lo#-|:/X˧SviVZuPj𾽜-lF_u^gA#n6z9˅yx<,p[|4ɾ~MejV+qǔ(kstieMucZ\!m#/~dNl>cYYyev{;uGyѳjfi3{Yvi}9#-c[ zȅ|78T)?c`B3V5Ixlp%?) ?x8#-G~/ݦßi5wo?O߫ͷ1>˖}gsxB,&_~}znfo2co Ӹy{džFϠQzv?qH^ln?ۻwkg=ۃl?_Kos/fӲFq_cz7, _7p)vy;9Kla=7Ti;Ń}z 9-()ϛ.2/Rs~~muo>~;}||+=>z|)OGL ه[}Xz-Uߦ#ywjܴg,j=N5٥&pd:v:k9>v\%zBZ|2,_{Z'(uIɯ.%9l٥LzS 7NUФߥ,W6Tu$a2Ԍ$99yrRNo5w@&7}:+?%>ξ=X} vhٱ0}y_tp?~H3ﱝAFjk5oKP]\eymWNtiÐ0ɾ|Z\ EWb)Q%}+w:K7jݎ%f }lLF\*mVe^Mt<7}%:KLMERKdچ=z. t˘/_*9Q+p|iʵ-Q{eL, \BW'b`y 59n|*au^ߞY+,;Q7H** vs[?gasv=nKOYI7.Wgpmu:WnԬ@tDk^:/OG#3un_8A]Rv~Du4)?۱F]Y֋]5w|{]nɭ/-jdRxc<=w^uva^%\n#-s󃦽ВO\浯?򆽮jGϞW5믯|޴uZqS#%۲z9o9JYs#jXa&Bc,"80(*+ZFAHMJ*Q&#-cT$UId.ϥY #/]ܦ3UaJ;;"Ʊ!LA"hhn)"4[ZZST7EzmLӾ `i0ؤioZ$]UJ8d6boxnvٶw]X~¬?֠;uV59n HXx\Г2!A$HRF/]E#/i[DƤDFk1wд6,*R#d!PXcM I%RAA6-zc;d{5+ݧO/M!8kJ53#+wٮۓǍ}{:1wzgǛȳ{߲gS?=nrMه߫#/p_gܫYK1pv_o#3щ#$m00j5!lRՀ~˖/4 Ő~OT?OLVW)K_&Fxy2_pw?wg/u%wfׇncck&3f%WXhO/{#E9բQ㇚(xӵߙ rC&oO-e5 pvb];Z$}4qyi>mţroiQo&ܖΝM/vTzR͙Keѓuҫ#/->]|0Vq-{5,z]ih|ƍd`C!IЛʄ 3ں)98u莖=PN$?5l Fl`1B¾Ե2S[~5ωU̩z&Py+f$RI!07%s8a2NRg"ݝ#/Q:MRL=/UwKϠǎj/NE^HDX#/DXmR62B8V!+`tm0bgPLі>}>}RwY7짶e#% 2L#̈Qe(A1141-6R9Im=XW2aM1(Ɗ4B(=H9$i-#/+Q`tkK̽"15[t#1p*-^ш<;rl&j6}fQX(D_x2t,|2dSHF8Oh0Nj1&^sYM8A$| )yBvk4?WEKZ[k|:wKGvn};ۼK {&}&Z+$,6aiUSʪ `ӌw=e֑" ˋJ1J>0UdNG#"D3~D}Bh$Kʡ!_t5;K9\#/nQRQL@4]-h0@F8(XsbtkB!S?ɅlB{-&1QTjQ}?ϗw.zvRk5ݨ?[n3>—1JcD[풄ښ\)cḛMI=שrFiv`n6UFRwt]9?1HӱUAEtn9}^Z5߱ゲq"~9#-g2QͅDY5dT&b#-} ,B92'-6X*0EX2ܡǾix<Y$QAMYڬi1A=>'q""w#-hWQ1#-8HFcXW<7:P",P#-H1KE<|3j2Yj큿x>惩uONzfC¸}JuF'٭DX&tv}v>"25m#/$8Bwv[!~d4xmxb͘h΋;7`MVx$Ջwu_˳soHusmZ$&sspțc D'wɯ .w2MmYac}yot v.4D4ʔ͒CW ƻU)Vw5Fx(_P߉#- ЛVga1f8|"smәR,P&#-#/ F4⌄Fjxȕp9*;my;lOTf՝3ـ seNv@ Bne;\#-2:Ž^[nS/w]ck[!o"nc`no>{YW $隒H3 B QZ΢sЩf$lrV닶i1cmK'- I4 ils}㕍iߦF|ZmR:||1IO:m"tus.?^𯔽^8ehN(]Dd1Ji+^"N';Lr:9#fOʒi)*&mXrbfaǖNag.c;o3diN#%gMTyc6ZFMTdPPS:G.O#/3=z-v>‘(^u10BBdxƓJt㷎po1N7Ⱥ0ǯl޺LJOQ½/hl1#-gW,_Aֺ-`CжL79qG2k܌o(|J}gpryO)[*4mfuŝ0\N8Ma8N#z33*d\3Bi)aW^La*}BZͿ:6wiCTֵ$I,rfLgouWF6(4vE"Qy)JQeXwiqth(Qb·j>#/V섬f葙Y3PvnlBa##-[l#-` }'&&h>PiJ- CbNo8xZ|%3h F6~mdk2aM:%H2f=S><ѷ}e#- ؤAŽPK%gP#-Fp;:ginӷ?"oqcj}9cȚkXbeuh`_#)t1z[/] H?|c$}v 2M2f#/Ʋu+88^h]t1"FYC,o6!͚kƨ oիM}ˇ=km5-44#-ZG 91͐}|lpt\#-a)?) 1HNSM')ٮ/{4<2^}B0cn2҃2RcozS™#aX3&^Z--ݫ)9FK!(D}2EɴTP'MctR=0[ Ofõib {gl 3ۛ0 1TLnP7x"Yv.Bm0J[^p0>1v[K$wa69C76}~/߇Vؘxmzb#%~nՙ?H!OUǪwiEh{{6-Mr8̟EpGy|G!Fm3EIZ>L+1G˦GKΈ<*XƌVAE,|Qav缘u<ţp;(tqD/~2ɓ/0T"X̆eM0ihͧ#%6w=YGQE_t&I=Kނ̈́rl#-8ք!{T)ZJcs[ϭv9YSI#uSٷءid/&]ܨQPsO.5)Etlrm5lJhTψIL#-WѶΒmBh+;&iWN[Xy:r$2jM#E22楔5Ǻf_^p[+LY`DcHGN'e(ndA-uY4baA5Sa;y)>ܙՕaVQhV^A#-GyS飢ňM,ݳlqTeLvM'Ud EVrC6&FqB6b] t+ϳ׫g"_["̛ad 9Y渿l#2.ĪBT{{Q;MXIUc<`Y49RC^#-am9z^#-=E-/a H zZ[z%nL9)*?#ոN_vMZȕp.Y*}x~{٤ƿ6nNtL\語m@F=E#/n~6Q {l;v'9#-#%WMs|&k_Lo*Z[h5Hó 0#-aqPLEsiW8o/!]2g05^uX. y9EUt|6ãM<QKfjW!-΅ֳVUG\E0+#/[nNT5psIyP񷕤gϮ4Vv:@?!,EWk`5=PkUxdG笽u&tcttdrNH:ƩvY|*Ci#\UmtΠHtt^oB:^}sȊ#/ [gƎg#-[ߟ5U"ۑHʃq[0a![3W)>vm'(rgbn[@Bjޡfu28HYɮ16<; Z=2֛SGɧ54Z-M[-|^Eqy܊5cs=z/#-;;RY>Ws'⛪c`Lgݚ;.$bӻZ~͚x?X}Hi/8q벡Gw)[k"Qzʧ(Xysw£}zmmH9l l%~pyRkC{!P6*"w/qR+ϡ[3k*lRxl9VNqSPsDS/Kj9%=.{x{O| E0xȧ/pn<=gs\)*?;D˓~HPUo''~:kNo-y3˩D4~auuI2w3;0#/pz,YZ|bcV*>DA{fBvAe&=yeY1./L #=}}5wsQ۹ǃ|_-5N4hVfQȫV-1.U&ү*-s.7٫wJ5XF{z/fĭ/dzd7߯V5ҵ+We6) 0zӎncl{#-zڼyƺgR %tλXeoكp&`r\1ղ%U]8`oXLP/s#/߾hr_-_IV-ԻE'n6Mv[)>ǒq#/q3ѫ)l9.#/ΤcC\Eۻ11M~\5]y ~"W^AtD,#< O# VF[0,pSwYv'_8+ӿntz\ׯTw,umoҮsgoS06Zߛu-,Iq*>@꼯2~{dվ( Ų_|N}ZĔ'Kڠ}쪿5|'QPna>odGD{aek BKgYaQs3Js- —4Jͼ}ϜTsayΈ|3W#/1]7z\e9$B^` U~faȢ5w ac±^LhR`)S'*ɑԣٍ]Ixߚ3X{kU1澫1UҸϯ~nu_r%JKh})"S'n}T)sy[wE׾*dt꠴q}gpdIjcn8FR ;p}Ôj[xEi{꧎ KhϏR`٠xX$kvP{ؕzWlw}W]ȆH97&ʝwvHedV r粔(puJ u(jc}R;Sr ȳKu11^Q$~aGOyQ{LC\w|Wm[J^ss?!N7<pp /:|f!7T{ާOpx[#~}iF'KڔNJq_ۿ|P뗄-%ڞ? V,R:bm!4}nG,*jťJUo뢊#/Tlv>(?pᜭA姄6F4V7W\hn3*;j2jHҚ%omNmľB샒4JOO[yMܝߍ80T&^qժLKRQ6hf2ďg{mK-s-ޏ:Ow_mKU5I\goT/RfbR*۪WbNgfy<פ_fa0{&>+ߙPu1lzQ{QӅӄ6+3O.{йv<0u%?o7~-m}Z8u㚄\ad_7yt:n8N7n(V9# QY1ߑ>O]r#GGۭ…T2\'J(wDr=qTD_@'bZY⯴կY )iW%W|sb}^%u<#O8{sժpp ju/%=jhZ+t'^'u8kM ޡ2x9RNoK;?)CanR N'95WWEW'>N۪/V^NLeԙz/">?Wn)G}Z>ol}{Rgwc\uWf⨢ӻ*™13JP"n/㥶de)q\/<)/!_wEzW5^8v;[6`:/S3\ +etpl0-m:#RwLTt\pk}}r:KOw494%/ E;%4;9mfn Kh~Ϻx#M}M t+; uכkz-n&Ef̃ M4 2=2'vu=dsyGl4?qyD>!W י*F__g~,ɧ;y>rv4򙆝9۾R';ci!"`}Rpkcܮ?o1_\sQ3g4ܣyvw/{ԺBzoom[|lm3ۧk94K"q{]Eq=*kh.)ϷK_˸iӥtǵ"| ~2fG1 1|(On)ߤ\H&yzEնB7hlh&dg\ 8SLus\gHƸx9Uo_/ʹ҃j1 .2raѮS{t y1e7+0\6hx#-o:PɄGI#|+?>pH<'uc6+&o67f} Nklzz9#/옋CoLǿ3mwO9H#-t:v>-Gkrw盳PnOOr ZoFC涋]ImۭӐRuzrG9Fq{g%mf=gӞ]=6Of#Zȗ#~^j4\yҁu8vs#-KwN|#,FTQp9+mvLj|Ӄ;6á,QeӤJ7r*JK𚤑v_9]JCMB);<X-2Eъ nm&^hwM;<֞kx!'Y=&1!śbVl5;8v]q'#-;vi'ӽW>]S:n&#%V!{bE s+ulwyk-3m!Vrc7?;4q3N]>g&!+L1YYu(n%L=o ȱݎ{g6Ze˳__iu$ɩ\4^?]o<.?vwycM.Ϝ J]I=Å&~~S|aЂ_ĮED__o: QޓU+}^kcq!TU-- K~e,I~ȭ/Jb}hXsṝe~eHqp(kgv#-bHI#/@P؂I#-SǑl\i{7w7?R:L-Lǥ;VqlGs4rOH\'G#!#F#-<.2a-HE?MOc2ӗ|{,Rڮ_ qHD-Mȧ }?#/(?/Cw.h/=t9Ҥ9, )o;k|f/|Byg*hCN1t4y)g22o×)S]JU߸Ѭ95/,;5KVESAb#%]_EE,[^QaٲD#/bAs>Ɂđ?kGՏQ Pm j[m&x8#/~K*5Sdp@F7()?~Q1I'R>29tM k [))Ә]yKgna*L#}%Uuc)9z\o@omSy8fb#/!Hq ,mNuCTSuCd#-W[XN:^#PC!JL&!Z;9GavV>5.H^&:#-:Ġ X3%n#{lK+xQS8m7apO?C!/u4 |#/~<b"TA/M/NON60ֈj2PFutыd^=WrMj;Qω}0b";̅"4y\4!Ʊwm:m,4~)m[NCa%~ɱ^Dzs]`Sު0"] {Tfޙ)e#-U Gޥ$o%gUvN ZG$Ԃ5s&d&!MBo9CWBmJwxPz^,=R,r*۞h7(WXqv;E#%]ӧ(.zz̟H&kL oǾe#-fqpiS#-kRޣd&zT[&C8aH%E8G|S'p'qe>и?YH~[{Kl5Y&o9jAzMblLvP<#Q;ulld@:l]ĮB,LYsS"AҫHTba!ߊ מI>hk1ϥSt cP YֹRw>58v_AK`[#/`Mޅ k7Ad(!HZc>DqZӓTi(⤂=FQ?w9֯LB{ؐ&V҆DXȐJn" +*hЩ509@:$;6dFҤFK3V#vr&ysWǕ>H/$M?YH)ɋA&^cIamϤ6>I,왁&is94ܱjp73&w2|4y0Ur523#-TO4+%!cߐށU OɰlQ:5KέPA~#-AVw E[Akp|:fǏξ#/{>du诎{zT?E8ieD <[K/W2 ~9f]>xҥNm4L#_,@&1(#%,BJXTyp_ "}i.=:w[IԒ$y p}Xu/F2Mj~95cn>l+<L,\9pރI4`= 𚭴FhMr@PtnI <@-2]VQ9_;КhM #-+t'#-շ-ObF6l11hȕ͸;Wl,uBgpGh*]$NWaCJ-$FSiӷ_ӜM׃\Ec_x51g1ߛ 4ֺкx#-9/ΡlJc^f̏6<:ujwVN^ofrcbMI}`sgYZ#Z)#/bҚݻ'nyyLd?,(F!]weTH/{.W(TQc?|~5ώ$?}F˿q߮|{H##-֒"}R"Uo^-L5-5~_o@˃3o}t#/X?a<9f8c[؁+_)?e8\*;Ν"]>ȔK-ʋ&纺lr,{v:#-}/k"KޠKQL;G/qaE@RBBUSD;N=mulJ"1k({e#9Cl#-ۥ؋F豘&npЊɉ. B!3anR49ΐrbیkݍvIGSGsfoSeWIcMDaLI(z2)N%r,SS9Dgm.M%U,f@pT̆~~berJʿ%\/07X`DžZnK87ٱPxU60R'DNd8ެ"auPކeS7OLXj'6K<+uM-ҵ^zWfՋxSmꞮal>p!Y9Ą8bz74-q6jWWRP~.M%wxFM*Y34,}ؾQEUTeE(Nyp;#N#sFYxl#-иN`%@,k/`$)H5#/wP!(+b#-V׮rII9MT6pk7Ț0`Hnh\xq;qy؁aj"6΢;hgd.ô5IDq#%r(̪Ul'A`PxWj@uTm6RAm7۸ˌnSᙰѨ#-3:QF-B]:6AD#-CDyHBNzzpOb`zmV|EkVe$nHh0ϋdⅽ=Kbzj\ `b#-W^ W]5j[J/"%"-@)")#%$ ~z{{ki}#/X)4`YI帙|=gH5 (x([-릷+nB@Y#P#-DAdBB !*Du8gK=;zߠ^rf5vA=m[􉷬|td%x3WJ.",#-e3}kSydPQ"݄C]v۵7yl^$:sf5C^t,HT&,#%AS~1hmmj8$4wo:jjIᾉ&!Nbylr#/PKB"P0tCG\Ddbr$=CMmgvX2@MVY2Mdl[(V* 5M*[5lg\x$o\68YtJ FZ{Gͬ`g*{4,D GqS^ClScYmqC*gsN.1#-#-.x #ֽOME׹`op$iLgrݩ\׳ "#-$JbSDf){Ls,3ntPC3N䏓PSBqȎdCc㢰s~y;Qhnq+WxYby'^ N2S]Ae:vseF$F!EVTL(kevPć$Hed[(`9& sZ/_dm0Z#%8<,Yz`rO#4ˊDmLr$pGwBK:Xs.dN+.\,ry+A}#}6CM7}4! \K&iA\nwՒ0:H#-.@`i@#-]$>&N'X;^ִvp~6k#aĞ'׃+קbA^X3}aͦ,k^O{9lmS>p3;'E4C=I#/00dh=e&Y4a8#-a D8@Qb'BΤRU!QY#&j&2m6"BM #/6_oz؛s'kW{8hZΎi:sn! @7ovЩѐY*T2:`XYKz;kN[Ovxs9 3fQrCxGLnL1ζ刖% k]fDWTsvHj+D#%y/ʈa>S*lx|ZPsKL!g#/UDB$}hsv؁")75#-vPd3`#- &'}ᇋ|LO= 8)ࠆǨ. jJ}320{#/=C:'m*yS,Sse@zN^t9#NuY.^]`f&f:x ':P4}b7,pt|-RU)xc&+u^U˰E28KU&7xM|E&F)oS2?pNRC*兹]'HZ>ڠ̅#- >D},: sv$I:<3q-\s2͙lh%?B1^F乸PaɌ0|}/OK?Rׂ?uu? 13/ƣW6ܬMVi[n\i.#%H)A}gޤo|pfMȶQ#%>Д[SĪ]j?gMb:NZ4 BJ>w^ob,dTXB]5>ȣ4L=ʇݥr?JDLX]ǿ^mX_{1kA`:XP仢9iVu, b )_ڥnL1pȎ֨n33υNH0ɘs} ]-#>{Rj0wO#-.BԮsg>'_K|:Rgl[751=zfaÎF^u䤗-nPzSjXkͽN!; k3o(xN[Phڅ4ٍi{M?sfW|`Rl܃"AϫC_G[Mo>?7Wᛂ (tw/q֝mo^*XB݉~O-W0.!5rԵYNB7A ˠ}J5;/Ck|,gG[K:%4lN\Q O8`"pf&5UMɞ&^zF+|Ϥ|h9IKhc9~/NW{Gʾń; FuMD|g=L6sD>Ϲ_ꮪ^n$dE['mRIRZ\-{[ɶ:,QF>.(U{N.|-SBA'ɓMm`em*,9*ECW9,0ʪV6X®5 =-_rQE^cF1Rː΋X[{:7a|m4{LuΥ[XW&'w=~⋆=.-"5NJλ\ꞡ,wiYڦ0LO8۽o77#-՝qrѪ"IfKSrUty7}wMWq/ܔ*|ڽdW鷃ZHB3P hϰSkyКrZ7۹\&0L̥ 3Әx3(>v+.K)12@C1РAC?v>{cZ)k{9K8~__<:Xuq͜qz"hE89-!ǖDyy{|cI\+TdV7LbC64k/|"꘿&3ޫe0yx2_]SJ|~72K'o=˯+>_w$/)s,'l8ˍ·i/ D:;;#wQU>DEd'pEeK:[e].ڡk.cMۂ& ]^]dEA_=]yqϲ&~J~i=R?[\Qs`8ATΗή<2f{( s:bU('ԕ I?W}X߆8XXDM}"PQ*J^syoТ3Ġ:b$?Dr ~)&ZlvN"#/shMG#%o{%χcaBY9#<#%c&0UP7$0G6G(-It:]z"pgV)a+e=֎P1NQ5(~>dDaldC%q! Y\6g#%U|V֣?V1ކ "ޑDzR03vw!oHQ³ !:y,Mjwc0egϵSH>^kaRXt7{ؙ'LܷXtPl. 4?Ge٩3r]΀=h7ad$&7b58_SB&tNd4YxG#/ԫިo=$.=v{lmY)#-I`{*E`d N2EC_vJ=IٵJNB|Xz2v#U #/7"'g){J)0 bH[IǥWUeʶU5ޡ!UTpq0 ֦M ЫN#/dMJ?muA#%#/Uī#%T#k5MJ& #%]j1^ʢ4y"uEl>jjeVQR+MH-V%jDCgji0Fz d&f9ro2%)Y cPçك# Iw?v ~jxCgCr"`{cC {tifNyzID4Rk'>llxygHWM"F%" @|#/v'&ed$>Go۟$ 'A8<К6[d#/%|=_8:NSλ7]~Unkɖ.BLnp1Ht(n']?WkCW#-ǾM>+ *Ŝ9ҥ 41;wQALlOO/yYN":}Q:rozI%Uʖ>/2=R-D"wtq(܁2Ξ\cݜY_UB|rbnvvըvϥzc5{I(kM-=\'?:?WQa'[鄆zr-{]|&>%B=?Kw,~;g\\j>#lKK"<_V; #.?+'${=ݘ g'at?1'aJ"NɫmyY<Cat$ȭƼ5Y}Q7_2pGQT)$,aebT;;>8\@J.qkɗF"͟[S45x!f[ganQ=H=Ͳ7v?DQ r I#1<,5M9dO13YM`>띜!]?}9#%[ Ok`6l{8jI3_ XV^DmvE˷.`-6s]tc=hxnGvףw 8rIBk0g&?(nA\_ Pp&Y\My)<φa8p㺸J_e&B#/F|)CI3/A,}0wr>,buӠw;QmjmvuiG oMweXZȔ3Lղdr+m[k|ׇAc36}=o}:V6a=\S{|G:+mq7b$%w_\4#-D'!TOl;ZU CԝQ)e]tQ$?o3VN~qVb.K_iYmki/T̾wDx4\Zܝy37kv{4!Y_,ly#-M5L|/ko#-G-nI󳂨Vuyѿ]]1QUo[<qdȼco5ա@gN"4ѧ4^GHlVY;vn*]+Hf(d#/۾}~B2zzu7}y#-&j캢:c:oxvqG뮹4%H6Hzx3 [#/9CmhwY]kjՐZ,X W,B>eu\|1hC:"?E&_7c #%ճ̹]j;F!.qQͩA *#Q|3$ ϣ.#-ɯcMvzo}Nɴx+JNW##-1c5se}NpaF;QCf#-D#- nғ*&fJ3].\\LxPՓpuk_$x=^@L\dȽÿiE#- 冢܆7W|2- SQ;K:~YU8jYAוebͮ#;Џw5:RS#F<=Y Ѻ-x~gǚуҎrY8 uoW?&d66i}Tܬ9&4cZ>& @8GpիlF5ǚD;M$$$n5#%vGxzxڷf!s(3[x̌MH|(uPz\/3A`^#/oRkK yg$cZ7=#/pIl5#/iv7^]f{=>˹

< 1#%"Z6?A#-oỉʖoecN[2D##-Jጛ#/0:ԛid=ɊhҪ1 Wy3 7#-i~|RW!*ݍTJmdA$do^hNfC^==2d`l"5"L;.7bdf#/ah+<&,r|{XRC4x4r{YYOJQ3n8집Z E[B3ƒ#/ӬÜdVP,|ojhC|ħ͔kcA:D"T~褯SmL1rɉv Q9ߦoF_zgk{0Qm5MkNvyÅM;]pfD!j -hlKԟ[倇XƳeV˥]Vx:XVvƛ5fͥw5+Fr 9 Ps\ Ӆu[,%UkA"4qŧ),̚\<3U_Æ2'[d^m*#-wV#/="Pȟ}~~nU}FSgI&:#/l9ǧ:OAsRv|ԴeSDf"A> _R~N=ƥukz/ x|ϒ؛hYDfpJMG-.v:%]O#%pOǯ){~&v1 &!oDN+&K>PO$o5ލQ0`YCacg/P2vL{n[-&+!ۣd_f!jwWHk&zfPDsU(QqNJONݘ`_f#%mt,&_ɟϛ[ˆ?{١'CY#%._K3UdC'5U#/.Pz̦7ּ;I!paU[M#-L~VҖiI{@W+p <І%TYRtcWwmpp#/JCyq>!"Oɓ\Qv>CIj)TSġ[E-ʻ!o,`|vk &~($7_7r&5W7*X(V0*.5 0 %cv-oP[Bė?Vns<^V]$Rk12OՆ8;ל1RP JT{#/2:"p{pS}f.ɉ5`63$#|ƒ#^| {ME~(jnף2T0Mc"瓌umc@I h9jHLz7鵗I&/ "'3b1fӁe%_ (9L-$!zN].ÈCN_UR:?#"ɐBK3",#/i 6AL 4ܩFja@32sÙ'O_Cw8sX埾 sC dJO5m8O^ތIrlS=K7 FvqXf]dmffF#->&hTr)#&uI$7QIu-ǘiՖ\oL:f^LXa fwGVh!AQD2;fs/1h =#%xDN#bidzd?Q1:Ӊٽ=H0(%'d?871MxQAe#H#۳Dždڮz-噑/6#/5N3oz`$AMLqgcq/KUY|#/h) %-rDĢ|"u=TߍYOa|S&;}I߿nd_2z=klp:$s890ǃDc$i~;+REJe$b#/FUK{;goRR8*~uPި$Im'h=\O7H7֌_ +FE z HY!#-6 "CƟx{q7+U4RԅBB26)leA7VfeBP0bR)Q2?W{pN:-+h"ƾ_|NڟqjO~&.c E*Ok$! b$iL%B|b&!9;3|C-p@?tMi#%4C?qqg"#@#%Bx|#-%eΓX|N>t(Df_6qd;#/A#-M(-TK7"z,s0{2.6|#-ߗbɮ%a7ƀe:Z&2(EPNćXs9o|pӐ=ߩ!!|:==T<#%dj>pX"TOxAрlyF=TفrvP֎ gֻ_TlmY-$)~+굧,WN{ M[.x'7opp#t$e!:#h?>,||>1@9?0?o A&fխ?Ė#y8=ebĮH<>Ǡ4#%2UJ/s~37[~-d{զ1!S0l4݀AjKd_q@9L*0jupʫ  8:2FA04EV4㋒7–d6#/:zKwDL=NoaKæ4`,bV~jQ-_bX 7<=Ib`#%#/8Ơx܆ݩ%;(~KAIB>$Aw?ګܝ[_AESh xC6 ab,CThV((3LFWǼە^ºF!1ef2iƸ2A&߇j#/ڐǭyo_Ř2H>$Ri“Wja go~Ǥ0n:<ʩUEU!`C! 2d !!R"ҎjXZO2(f.ǟ#y۝=" _Z^c#/@D)'*;C34=#%6R#/:a0>#jgc^kڶ pڣnj& 49 <&ܶF]0kxa!?)/-RT1AE|v%|ic*By)~kGUHxosGV6"lšVczd5!Q Ȅ7A3H #| t38w֤(STO,A3 )f9?*)~룣$ˆNH_>^mڤi7AO (@~όٻTyaކHi1?8HBk_:=!7>tqׯroz`;d$ze(_ow bVAĿG)٘_qzT㩒@١g c2oS~#{!+W;0c`n}βffOS`M#)|?UugD8( [`ɉv53S\ ĥUcƒ!?#/r[* +Oc`Ǣ`d&aPL!RdaN KC0cHb#/d".qU»-R@tګH,A  *b$10Uw`a#-@N#%rFf+T(A#%v%"`3GsUFêᷳpo j HzjJ#%VAȹ#%vk9Rx``sb*x2 tQUS1C,\?g}x߽謕q~G<'U;KKrc N!DE&GK嶅"k3j:_7 i1'P< 6+I`FfZWky!LS S(x_|եJ7ɡ뻸CVuUU*6GWDUԍ=jh6##/ȢQcw9&=#6h7U 9-Tn,$UqZ}ws'vE+Ѫ;#-#%DfZ_ 7(P}E׳>t;;"(KiitZh Y:ޕ Bic28yo;Lٴ 􃚡EMA'A1!H5x #nGl'<>!zCBHv.dH%VeU-ínENilFw~?AnuPn)<_{#/3YׇLO |%NAj3BQX(bbnt5#%P߷~:?zGَ@M~M7|j-k#-a#/Jd%|)BϲnmCLñ@#/JZ[|%Ɯ:uSP}^r`֋5ɏʏ}8iPs9kl;:{830{R|_/J>ٱGx.X#-#%f flfH#/H7o !AERT [xγ&Y UN%ȫ7BK0gކ?|VLv#/UH$*%@!]/xvtס:B.#%`\:E^"`9;:vfTwF}{]hiDA^{ U2H?dOʏa^ml;.uSvHP#-#-kJuP@>(%L$TT 0JZ){/oB;X<]#-UwIHo}.뷝-Irhb _3Dֵ}!:|F"`ys69Ji{d~0Ãc}+"!20$0_]K@cCݼ#%+`)ѱ#/!TQ @W>wP7w[-oXj3=^赇O3G ܖH8V~s#-N(#%7Fj}G9`6p^BBM#/I#/#-_M\j32FqƫŨ#-x5QS_I$HeH?dSV#%VkKia!k)^H`hf ݞݷMbyo3 z1#- &['1?8`ÐKTQP0@yfȿp{Jn 咥y D#-pɸOisxp5U/8Jfbo|x}4ILC 0YגafRqݝ*E0y_jcFE2i49g3#%eGE]VQyIP~\&BG0tͮjft̶O)NJQdUhl2h * "f#v&cOEtiTQX'B RbV*i6wQ F#%x Q#%Ќ.&I/Ղ0\&0o~AbOc-#-nD+IV#f=04 ~#-qɹ8}iA"q;d_]v>A'>`?f߮vb-dD?!>.iLu^]g$BeAdU&a^Lvv6ct^h-sy@I6n7ͯWD;>3Qh;\WS걗#-7dpB?H5w:J8<܋AFѦPGCvv@j^MFҙym#/C "#%Љ7Q--@'PE[v\M,$ C]:+[|xs[FnI&6#/Cn}% 99mE<0a$:lg |"Ͱ[@=bZkqp#-o#-!˞)3i]Hs6v٨:RoF4͙3"_̻60sK''j,9"⨶ C+}Ҳ:D?T&cRr_9vYII=vƚ֗c#A/2r)# v _/S׍4/Ov`L1eH~~~<(\{Ѫ>BI>`G:<\l->-j#/gkśDig5Z^{LYˀu&9Iw#V:'B~L1+)#/galR[_!V&g9sQ{H 'L>NSֶ~S&dᷔ'm?dn㺸i-{b}񓳳hv fsv'ce^&?|y][侉K(_oRnU_p",9_1兹Y/Λ~(#Ə(בBi8ZJZ-,JΗY»"~iٗ_Wu/oA[8APzK-9]CMv?3D`ug]]X?HelQI*yOfA^]4F&AkAC$`"k<7UlILzaHKmE)c_Aѷ0ظb1[Z`&"'wzRv|5liri#%Yep蟅%me/̧ȯkf]WNľg*L~tv|ij#(wSIWc/C 9θz}B=f?nZvK{g/9:H?wwao hLͽʣ6H?ZlF\/DæL6HԺC\ YT>w3I0w;&Ưxkߊv|j|ږsvgB5oiKcv#/!f)*#/}>wδ3.Ϧ20M1 QК t:"5Cn: l{kRO #/ E N=+k~vOV*T=<:$:,M[h}:HL/a<^Tə rl~Z>޹ w]Hn0yKeZfau*đ>TatI,vڈ*D#Gs>s:qkCͿǗ#-uz`qi{ßn _iZoi|mZLٗr!fvHvWt l r71 =!ξ?/Vw3xBOOI\[ Ƙ~H#-_gm]{) 1iȳSkꙒ/d3~? aMCK'$UUXSm]u4[0יhkyPvQi )1B#w'Yxvɽ*Ukb2y0ks6`p#-#/#-mWxCC' l]жsĬpnnQU&삠B˽9Ÿm99aA#%i,IßI`!9w$#-QaRV31%| i0h~[a,]kg١ @c#-I(h uO~#%\! t;HNN][([X2!1<*z%V“Ӑlܒ2#Nؚp0laCUŒ:ף8I 84@ư B1pPSjoB-n &;lt7a0Ρb,BқKNkcjw N oC 4ǃJGyɓ`K\jC==>xg+9Z|o:yk6m- nԜ̐>^U#%&FqiJ[Rw$PSɘ0>J?<_0" TDb) ddk)cLebV+gyyѺwO5Ǿ}.I@F|QWvݛ<q?"ޝ>H(bg :^ !HO.!xN`;I,#k/Y#'AnKc`6254#-4=)3b+41!CkZBv!clcbzm"T8FcJI,WJ@fGxq*4x}!Ȝ@vQ[^RmC-Dl?T84x ƌ~7mv!뷟Cޥ0cp^i#/7{~I4I>l!&A Oa9g d!kK&<ץU;βFC@wY2!:37vy86KN$#-+ƉK`f:9kgXV-S[ڵcq 3IT,\d‘0m.cwy)i, J3؃&i9ebM_ ٗ&xTqҙ&ws :4\MkrY:=6MəT#/2ꨐYCS8A&0aga.^n18{99&&"؊Qs% 87!%`q46 6I`YYSC:T&|kQ BŚ[sH]Ha?{=PlEVș`:zzY43h]@tDHPNsnTUc^d6Ts*>~ӎGV2bFv[w"TPp6ݳb X(;ueڠe]N{0#8<hp>в>yv7CY8N%> mm561n%GBYͭ7m6Fhh6ǖ\XD͘#/( BjqQFq7gr0fUZNIP#%E`@v$wCYF(aBN0sq(,a#%CTX1_iDݞf9x!scHB2xK&D+0wOfJ (on7 mq[[gtCdR#-6#-3E"1jzl#;+R*GTǀ蜏\fVWpOR#(/n<"Z F3ȓ'd ;ͺ &Hs(a ul#}!FTAE$O.ٴə&f#%I NᨡrG1d8T40i1hLLie4Fx SKp{f 8UyNW8d #-ɃrHAF PFjM`bvw!ъͣgpp6qTs)rW^n@M^cgGo525)m!{;YJ\Iv<T9"\F=#/>PT+z&\z 6T8zkޕl E4;v$7ޅo4Pڒ}}d/嫗Zy!!ڐݠi4&}nUM(-ȕ0`l4~]>ӀgD  xxPSQS/Il)$%'3jXԸơbe3$0ݶV. #'!L<٪Dт `:F{Mĭr-PӻܺFĀwvz AJRrq=zOXevq Y>u(9j=eHGgbrڤ<OL(Ϫm#/xW!#%Pcb*:GE#/!0B XB抲%PzB <ݶ:#/t̘~δ>c m3KSHJIm F :ß0Tˉ&@kdyƒ#/#ެ B:WdښjS!*b^Hx NQE+g\T(XBbeF#-@EJ=BEtX7V_;$#Sî-BBԙ^GO2PG&ױv̴*Sb]tTu=$GZiM4'1Rȃ&"9a DRD7,5N4{|kS#-# oѳ eIgͮ3;$i#R E"B,r@cW4FKdEoh(P5Kטf{1P1;DL`YtX%ן.`*$HI|u?ṕ#-ß % P#i-CPc'XJn}v?1F.Pap#--voS +yl1s4Q`@I8u @A#%d#/H(A` Q#xő@5]Kt-[_#UUVmWeV-ZUȁP(`؁b#%V }ѨgX*Ma>Chpq`IxVecP5Q*!H Irn`0Lm>WM{"/M{)$Ž]vnoSz /r<nn%e+cd#/тIC,v)ZZۯe;dH4=s$.K~G肀F#%1|-: y)xDDrYG$lC$ޏ?58-Y A\D]ƒ=Go\hؗZ! U*s<PJ;v[.ǗT>| (#-|aܬ H>`Lxy#M~%C͖bTiзzILZ^P?/r[Kb-~P!LfI#,f#/}?"Nª1`Jb?{-q%lҷW޽fQmmm$XMIQXUM6i&VdeE)#%Hd0S~C\KIj?V;*~B'N+"D@#%o$˶;gnʦϪh]jPs.2 \UTQ.2, cyA#%KZb2I9Y˝WD3|qwE}yU3(awR\#/DmҹPK`4B0f 1 }YV#%IsN(/ H)$`  #/B #%>`'= W5E%lMc@dae$Oޖ)DD!f"'uA}ޡ(R0PJ7뿍0e!P C=R 0Rm4\(\ۛ\rR(f QRmlMDDX4vV%@ܻx B " wjיviK?qk(H61ҠfP wv) /fnp;#8gWyڀ hF>%@(Ʊf*Aل!NIZ?-|ji]5* 'h};0xxwYݤD]CCtL[IA\^WfCZZ~/?WȖ_t!\y-AA`gRuTxr?U`l`Lb(T.g73qG;Z!Nn$PS稚F/DAkYgPS2A a=x:N]d@)H&.?]ZwWy`(a"ACo+onˆcQIv={4<_pjoH4#-j7!늒ஹ\*U 5In~f)#/O|#S.c%CDs^Qc=vY k07e]\  + NȒPbGh`2bZEEpK"S}B81#/Je޻͌kXR4ePW8r5!ٻɝf&"P#-kC4M1]y@v؉{y]2ض6-'X==?#%]4Jk9VjD;HBSJBVSIIPiF ʣx,U]ۭܡFT0M;+S٢ߎèuCwbMI0dN:"GLcmMݘfZ#/X Q>M9!pqG' o(>AAMa9 D,#%Ӥv{ō~xu8:#-&x벥ecpK#/Lr$^˟F)7./sh u-y1ݰYRu&bCcs(:#-o/oFmx&o70w`txz8mNtXy\9Qڳ /yQPۭT&Gnl9 Sn{3CEKg3zc#/ؤlq2 y6ɪp_Mζu;Pip_ cSn}jv%ڷec_\m YZJ"6uW`+0} > uPL2b@RExUǓ;UaKqtrO<;AЇcCC#%C_xh}1p|s3vݒ\R:4pf$u+<ՇS߭1Eg^E]^xq8`Ŷl~pTYkg36|I3{wѴ]>[￟}Y!~p8:2]MjY@ԧ=͉bN#%5Ixٿ >#%xX'\WHۨj^\LL\#-18#-R&%:"Tb0vvxϫ"g_d֊E_Ȍ4U;yIzn%䄀Hsas@#~{⹝x]:8s˂hi̵j&:#/F )vq/!9zCs6ؗa(]6sHA[v>^4ر;ZY9P+CCMSRͣdG8/?R:~K+6{*aq`M ~VUP `'_&7(brr{Z،)**\,%mIv%:l܋[JI|jkQXXm!bQaQrnDped,"i1Xa2@3zHSXa5Qi_G~e :bv'c$n/nO<(% ׍.Ht35_UW+ulA#%clb@| $#bfwmh%|CwCXi2[#gmZke1#/#/Ѝwemaآ:<%h)p6At_el j%ohXw6ln< CI6H٥#/#-cThKD"DHKVJiU6(!#-Ht]!q#/H5AB'm,ĺ*0(X|ݝXj6YBLlFFHM܈%#myR*we}[I]p##$HyoY.2(GrAkpB]6` 3@Ca-JZm#/##@bR#Lj4 ;"X@P%bL6#/ȁBk Д5bI`@Ȝ_e{ g1 ;s,DZ^STx[FS}˱ʒ#/QB6k#]C#-#-wBQBSKZ26="ÇI M!KI}h! Fm꺷ה&L]*rș e5 k(+wI#->z. _e)Tb҅K|f,̣IDM]D ^ktWK h(c1;lJ >#%hEữ;#Y.8묜@,qĵeWU8v&Cf#k79v#-xXqdǍtݚĄY#-!Ra{SmAТI!T(A6Ũ Ă*u{^_U7ޔl=ICwƒȲ6ϔ᝝Y|<.&H>@4Lb%0}zoּk_akd-קλb/̮&V!8#/NJ#aTh:qE4 ZLc8Ad(DDQLI`x@h'izhD#-"GtN{uvRQd+f/CH{6h_(R T8Û/ץ8_R@{RZFtHF{}h#%v${io&qhYa6" <+Jt$!_' ؓB<\vj8Uh#-g3YJ^#sGX^=Rqg>,K@Kbe#-\#/m#/i#%|i4ќY;˥Rf#/McdžprňתIXXɮm(bU>׀b9bOوǡс(F2t:0MPC| "F(C^ފT(TR%#343\*4ɸo Cy潥5ck*6B i6]pTcͧjL9x1F"cU{XEBl6jV@V ڢF5o._7ݜGioĭI|}ۂXiKb,4jmE{׭ңj1FT<>7:}7;#Ą߄16dHxsؒnfA້jZo-(w%K$Ȇ!@c+y\U7.JQj w2|.KRD6Ad2Ml .p5٤l3iۡ!Т l M6l`9*jdx>6mJQpm[^F+]0B1=A#%YMh9t!*iRyG7'8B*%c @R _t1ua`1 #/HyffX8-z!"M빨GG2jnsN~.<)WG}FiTS+k>N oU1RBݘݚ^rX4 3 &]aN#-0Xc{0R7&ɖ 0ݩ۸ -IdIJ0ƓPqH?̑`txsК3"/SZ*Z.1;Y/SB݋He".j/BgI=ޏzIʛ Edtm8`dtha2(j|DM !'tdaTƒ6FfYK!Qٌ0Qȉ3ƹ311Ek6J,0ϱNUMaY+H\Zmi&#-4/CO#/wd{ /c׳}#jh<72](^{[SiP5EOSQ,OO43LWmτ A..G!7v6ڏ^BNݦܪ^6ikkXSom&mϛ>{Ȫ|s@tL!<}ϺȒTDyܦ95?v^6h>ZAj*[i#/Ӈ񰩇tߜ;>.:;4}v,V[ޙ߆X"kf2r57iK sZsy lI5XѪ5LD 1mGNܯ|\DngN' ,:wht41 g~"=K{v-$H#/66j46y?Bw $7˰(GRbhcwu `^oY90\hTweIpm23/xeƒ`cZ3 {0v]eլY{-쵭~FA|C!$3ϯJ_q$Vy$:Y5+6T#-i+r|%&of ސH^3&8FbgKwQ'vD8)6[U9M{mal6idOă#/ٰ ,Ӫf@٦jMwPk{+>9tH 2"T 3c=/k&pqohoŶjSululsp0kb;1\(=}#-ڃ\ݒHbN4x|j&s͛2w޲,DKXYq+uܚnFr2tZ_B7FڤytBCj[x{2$'p'IRb|DlUYb3Yq$59~6V(xTfE3;9|n^Jn2dFɱhlbqS=i( igf4BG[:»-m&3fFC7!ٱbB2kfb2l4ƈI4u*  5*Y6iJE6K*szˊ{xFo/y]o}FD$$L&X|A\Y\ߜ*G݈wǝfJYt#+Thu(v[= i0f-=`8x+3\y "kO+f6c7Ԧ[32!:-rtڜ7CSd[]6s#%L$ؘ}VtŃ*cg+;zSho7hBVLֻl֢{RqeE‚_DTJFk0Hƒ90&T /s[m',fc)-չ[uofnlO1Y,.~sSco#-+u0je JgsisX.j;N2hx٢noS͎O`;4#-howY#/޲D<;:-K&;T^|YȍGIE8f$cjeipng/wNd\r^rVrѴpedXƂ)'j(Y6pnf_a x9$8:q-N O)&PmV6=MQ\@媫0 cVRa騒(4+j0}Op3HNsj^P8j#/ 53S :8£zXrm\1&ԯEKӦtkLyZoV[̸Gf.'lGZ]bwU{p]@`X'RL I&Ҕý덉dp}(+RPTdgN4pM[Ǹ1o@DZB& )@*ig|3+,9&a=j^,tg8$3Xu?„ |򇜍Hl65MFFvާ&4e2%v)HņsRHnRakL<&#-P;1yɐ爓6xz,#-&63[3 hȈ#-16LީAEIBeMe`i"2Ф=kLT%$0qdi#-%'jg!-Z2DsL§4ZwAF^9L/1#%2/#/airlGL0)Ӂ8$ c8z̹L!#-"clKǩ㡼Nal}qo:s0"47U3sq8lpNZ>&*LPTK:;UQkX&)aF#-LXlSxcx&CƸjux%5`̤r&|D s萩=NC6K6үo]_^aFFH#"!3,F 8>Ja"Z$կ֊ܣE[Ěݥl^c#Ȕ#/%:ͅ&PϩR"9#/@#/8",)@ ѡ}#,p>dȸ|>cEC'C@`_CR΄f#%Uri1p `)6Y6M(;"EiA ote#-9,dIEoL*%4#/rp h+f>z66IKcZ-F6&5&b{5hB)hخ|F™>P;{4$ABKw)wr y ńS;M#/N£EH1>ָ݈FDCTJ2eUP#%nԘ9ڎ%H4riK92o`<7wF8*#/cxQkxI0 z љCVQѥrNˎ$s=B0^e !ώ+amuh5#s(*cX%d#I7-\U/K^U1fRD6iMY#-G?q+P5P,)T,dUdi0`_0ޣ&TyTwh@&FMq[bbcL|/w=ŠQ9!ꔹd!Ym#D"v膥\QB7(ҚpǓ8W u1LLBEo0o#-#-3l8Ot;#%t7H$!! cZ cq*PQ%4}KK2B/`7EQAF*EC%5#%d>}"竑Ɣ>H]D5YU0PaPt5haV;;EVӑj.?QLSLlS,.Ɛ6ܑ! U,yQ!"-F1&AۃF\`r4[#-m)D5KapC5DJW3'N6:CU Q*j'qR'vs D)XnA2i8f:2e$bHwvql. 4E*)kb:~`PBA҅p\mKfѺ#PNz8q=8;VCamYl;It˜0,B^7nl2 E4HB0#/bQ"l%ƦB `1N%AP@ #%7Q #-l`%#%V(E6#Pk׿P5}M}ds&}4E`҃0CT=a v%Z?` D>肺bb#!5E˖*˪D#:-j,j5kF&իjZj,Gmrdmi}^+tGOk?#-}h{܏i5|emkKZQؤ|OF˗WsDKhⵇbcY e!¹tRc74u̼t,]0USbazQT#583 `i#hΡ)#-@IA#3.G0ލc5`[vB1κVu$J4w 38jMs%:a8l)lqJ x.#-kt!mjdp!T4np`mx0DAJ{"<9*q*򰅪5˗.ۙ"ӻ#f*}HyNaf]%ЭɴѨZz[NMyCQxLIewOuT0!8º}5)ڊ6!.OsKqpHDŇt35e)AB `#-E`$h mTx`KJC.BF#- Z16&DU%#-(DGoP9 #%P*;D6d! =аocD #-ۓg˕$_#/hQ;?E$}[NZ*wQ/RkLomRԖWdƩyJɦإ-FƤS)fdiYm)K}k)kinM(66Z'(jWuj#-mh)(RԕP1ʯjcWv5.*D i]F6͓Reί#/TMe jjmi7ZڊZ1hv,^^NծӲh\5՚Ze1.FkRiaC={߷7Aa#-nd;w#%Gmt<矋es$7B3qz5$8e;q#g ~'~ĞF]TXL2ZSCNt[""I2qD #%eV'tKMڑVF"u<٢X֯A9M"+fK[٪K[_#KǺł QY#" #/TK)3Aқ(*d$vܫ{-[sdfR3j(ZMLɭѥJmC IXi(ģ(Mhm6SHfS##-[(ɒK#BƤ,XTPTTʔLje%R,(mf#%$ł)0ddeY1$"FRͩ2HQѥ)5K6ړUkխJZm&i#-%Imk͛mKVMD,Pv"2#%ҔZ +W-ZDִ #%N; 59~zCr'xgۄYh9) BƹjrV[vlُ-a퓻h+rwdF+xƺ6uv-6PLǣLgTߑJ7i(xrJ1.`}BƗ*i+֙CX$hJC #-#-#%Ng3XF1fƸ(F* 0U;@NjЄ-B\AuŽ7Dz:UsO*yCOB:k&f~&̋fQ-wzdiT7e,gh$Сm!$u^p{߃bXnL_Rv#/8TT>K;CmD}&IلVsw$=MEFJ+bm홋궩2|ă{ďs6XEBу v! #exC ްr]\RJIZ@#%#%6ɶƪoUv܇T`)El `H #-dN]WmUQ],{g!+ H+5ay cTk;F@p>#%%q3=8S1𙙵15 T5˧nx`r.qFɱ^(v@J3$oa スٵxХy! i1Էh`/Ww}U%O 'kYikqɹ$hXKPZxKI;tnn !IFki0n P!+]8ө]q8V^)'}G5l30ӟ1Pi0HlW6J8UhZچwXp#-yD5Ck,SfI0/D/J yG xܥi@iII4|=wQ!MĊ9d73ۃqǞUTd4 :o*)kF,gx5\1bMOʘ =e#/N:.RBd`ځc8sh|nnw=W#/"vC T^P'e\fz:q`Pt"#%@i `6Azp(%cc#%^ hm{WwϜgs:R(_ `Dڍe6)HH`; v#% ʪ{esvN"?'8~f(7׎cD&扃nֈB3tCIϟ/m@/qY)*Qx]C4q2PɇMԽԹCqu#/fC#/‰8rUb*QJ =E,8gwY\iwBu4!0V_#/wR*e^ymO$!7kݠq+xYJ.݀qHT<%w]ei>ϝͭ!`B˨r#3Atd@B_с;Hܜ HR [~d1pO9-=UޜʸTXbk؋itOjrw4fLSҩӇRc)#-Ng]pc/("J>,ݙ*(tB'\C"edbaZ90Hq[rY*HfNVG:ҼMvriHC`=#/q7c8=1#%cbOWa@k,YVj*84P)ز!Kr^jرYIe#-GwԳoș$ׯ6mzI23uf_%צ-bzoo:SqHKn\/do%#-YHb)D`>󹿭,!#%1_q8na}AQ#%9v55'=rBMqIvN滨A5~K$3e6;@0Fr4CX `֩l6K`,-J j62NcwR蹫ĖFZh$(``#/#%eL[)m5*Vצ냃piFk׵Je>X2n^ELIlʈP 0`ɡcfE ?$szoph!de! _T0#/TtBHm -'O7cd#/#/Q5_K͓`9x#-rfw#/"H#/:w6*fk!RU1°Ƕ\q51+aĎ wѴ"l-~uz|p;ܶ7pvv;R$"D!ٜIzyCKfN6oH-Np:q5E6 @;>^w\vlHy"6\tUJVAD#/FŘ$"$FE #%)wi_icYq"?c ]"uB$(Rjh2;>c~$7Fb>H17'>d9KT\4$:}]]xEQ1eg|49b@d7@H0#/o#in&O.AF]Z 1Ȉ *[I JsedDȄc$d<T%a* #-=}DY#/(HoR/kMhCj3U QT*r8Dp$`X-#/dvIze]L"2@S|Pv~ZIF6{`^8#/,Zcm\񝳗c`AlMe &AIkcFi\ $,#/)U([Uʍ#-161Y+@F jF51Xf]Ti!ݮvGj6i"4CvK3Pޤ0ս[pƽɵxіXjcB A8e]0&ik[ :LbÖYZ AFhkq%y;wnksmJ\/O;gk]v+dH+勆r6v\3Ʊ$."Sm2miYUBӺ5o^KMLMIo&nҢL-j .mi6Sl[bT$H"G DRֵ-继. 6 s{C5r =eYcuU { BZhUJ#/D>V#/FT]/ 6L('[,^puv 5Z}1#-zH DO"#-n_*JܵvRۻkẍ-X,5QkH`49lfAD#BEmJŷEbRI$"4B$BTҚb\4L$P2<Ԭ]"K1(œdXXmѥQJV#/U$M#% X##% ,e rIb*ۙ R-tSb{"2"@̻5?3S0S smyC&zH#/ĆrEPvw3oߵ2`y^3X({ 0&{;r-N#/`w݉h3ׅeqvbdr#/kC@dvEJ&Ϡ26£P}'z#/U#-vE!_o+on۸)$G?Z@ŤЁK"5Yv\&b)"EdVv}o}g##%q;} @ U7cTQAj01B}5>l*Y3aIX=G,˩?#}09b0BgpvZ|M#/uo$Ca⣛;$ɦVC-k0@uRPhiLqGh4PжAP*hY#%?L#%>I|ú@I$!%TP} BBF>FzN#-P+uJPbs.~L{2fPᄦ" -EB=v9I6:ju%\9/#%ѡiؓhpDqrP$ѩMuPB#%TϢ4DQ0& P0lDS;*FQCL~3zQ 9"#-nw(43w @uifCLʀrsTLj49[NWKڋY(7`1c`n)`J>DbK B[Sz}8;gɒ0 {Q76Z֐:Ln0Cz;T4xx hUt4/g'LáPPBI;:ha6ƽIMC*M6 ቼ!Io5X^)k4$ʯ?FKɜ1 HkE![mQLb ’6HA3&7#CӀX[9 Gpa-@…T< #-Q`էv= 5%ɳ vbDDȢ@ΔL#KARݙd7ZƎdh"btF#%sAKδHO9Q~.x^,D#yhmrexHQDpaE̍Q^(B\l^+q&o#/ta `s)L#].Wv7M-5/+@i,GS̈KOG—&jdeҧ0UP@]4*]Ύ}?c#%u(v IhIZib]@Ojܠ\3ct٠7ad83 9騉ԘHMWȶaWI!U ѐ S=C$.C=oz%.x7)˰VNքE#],"Ů$D0BP7/KX0g3&`L0z"8$mq mHh`!2[+Ԁ 6TPPDd;{LFnb#JK+@$U×>"b#-$|TI#/G*NIo6հ_}{1dN\I1/9%iӃ P5]=#RҰ~a$qX`Q1tTʼnQZ#%05Qa[C.M4Qi^}n(7m{P,R]jԵ#-4=J;;M!ܲ*Vl6a:e4fJ+d4`[U]q g#/,~RwOmȷlPPZP["n B/z]vN8`G4IhP(#/! җ#-"jɛ׊J":۴fUJѵMd4rMw;j.YMP`wx(/SC:ذxAv6pE䢥J) 𘅨"zInf.X,#-Oюicf1"3ov#-;@txHG4\-2ቆa#%/@ `Y#%*W#% RHiAf=08eUe[`-"ЀB"ZKɶ$Sf(Mj+Z96E-0Ȕf#-D8֛jK0NпõhJ7VAӝ۔@!M#E :!e3 0:my߶@]\n3U룫e -]|#/#-^p$={Dա5UNby !⁕EmMo2JfFؙllZMSMV-dS/VjJjݾKg ~c儢0q>Ao#%`  xPq׼MzO#/R}#/ѝ6PۑWCeU?1#/sնXf'ho..ٴ7{XjOb &EFKZL.u Zd[V6C+P:UV'^l"99{XqcEv8#/3`lwGh4 3uQ ndp+#-%Mb)#%RKn}#-9a~$pwo"Z'Xy32Z `񔇃?תN`ⓟ|sY2y>)j#/QNw5(4aP45ө+@c`83#%7@IsAY9U1#%F> ]XoM4N} Jʖu6DՋ.;NLKfD][5 X@GC8F.Gٵ-4# ڍvl<=b{ B^1(h(346z&;>p e*@7jM @jTHlM٦]VƊeV9ED[b#/ `"tNSB]w)ZkRjrAї"R m2!Qt"5iӰ51:_uxY+X2xhfR(J_l!i's dq&27WCp:|L#-G8{ݰ|E'> *dٚ:nCMr؊N9uVy%qu__;s]Mb0VaEDdQ69.t`VHHHl:ne}9;?瀵EA젧R?#%4nh̔oD8tk16b?7cd!s7թ,S !ehXwX>ͳ34޿5:#/LMŹqbӶ,_:9mwD?KP`h#-"$J8~w%nj/a4r#%O{n`R0dm<")4=4I$^fY5YQ-ƅ5w6&F)4C5W׀Ȁ&D 2@ ;h!Ƀbcho#;KmΘ7C̺R`Q ʬI:+P s `[m"B#/b^So!dܘPfz7r#CA3 6; ߚ,!f] #-~ݍ!2ljG%[a"*na!`Z4}pJ:i>nFF9MPY'ź~ha@(%zhB<Ί9g; cggmQmknFMEsm[FFQlڊMm*cZmr454_TTdEt’]jhLdTΞ#/%Tb6߿ 8;Ybu{ E&Of`ōs qB-;i;T537Mld[cHo#//^Lw3:Z3#/Ie%LACxbHمV6; 9 oyQ[Փl5iITIRX505@a#a6PAb2T!Q8|eW_I9$ϴ붦QO.$+bczQGhfo,6JpKL'8:5ȱhi.o#/0ITתuل-l&[ |Vã#-xܘ-i ذϑQ=g.N#%`v´=Xpҷ~*mSj7e[*MFa%2cT((l{1j#/f͂jQrUH#-&7ʚl+0ygMStWf[ґ2fبhkƽ rbTLbhHa*d0Y ci48Cc5b!C@W#ON5#%SA&DADbkLDClmo;0A#b̈́ͅXadmx2i423YVZEdͅZ#/!&ۤ$j(^à{#-#-kVV+18ƒu<53(0lmlZ1jI#-)ؙfԻyuK;snLׯx4|8ɴ6#t(Hr1iB#-j#/J4Ce4+-DHVVEv9HG,QHN)E[lۼUM ITR*.Y A@*" J"V$2(A`иR]V"C؝Vexby i`f6ZIYZAXFV(T&0ݷ 7˜pa!C)la@67v2m)q4po>7 ̱}mG5ٶk.#/4tlN`Dݜ=6 yVn#/ uow,tQ~v(%N(Yz:oOd#-Y`ㅴXHmƖٍ JV+ !B9cbw,Hku6\Zjц.f8ȳ^/!~^Ke簾<1$=e1s̟O?~:WGj tWAeo`4c_"!HXFUɜvh!f1Ws$P$c:3jE38lCL3%]nZV!,֍/_ʱㇽꖊ,/ ^)dHwСBO'#/C#%ǒY ==&4+$̈́wNp :CuGDu~ž2uJکXl>j(@?#%SSXEA-F_iKdvF0?;dnM b- H L>dϐPg<69!ԘM ׶}Yi#-j"J#/YZ( .)I,dSD#- >Y01)4Ҥ¥8 d0b#/A5ْQֵυwZk{.nfM&k7-Nzw^jƲB$H &sX-f2C*#%(N֥iK-!PrKZE "$J#/#/cυׂ!^@T#/e0 6~]XrF(bAh` <^BRdQRȖDFTZ/YjM(l`+scwם˷ue鋕ۤUży*iO3n]W5b÷yM#ڣUrK[&)bX6+dKƱ5wft$jZLU.uEj,P1Z %(6]#%P'wA܉#%Cd;wx@EOhv2%y8#%A!A(N#/YA^_jט3Da IH8E2(! ڙ΄."lP=(ɸCѻR}(P~o~ =YS_ϖ};mj336a $B#/ePr@AXf#%`ET2 k;=#%$&*5RmbJ#/Hm#-AD}# ~×hMsnwv[H@bhM65"KXQ|UR*$@'%.FuKhőN_wYP1$`"5@RQHG!ݭҍ"Bz^#f! Hґt[2!DZ4$Q 5C~ #-OlO{Bg|R8+>{fX#-pAg q,6jY*klEHE@I #/=[QtUh,ɚTJ_oͷD`Cb#/Gq9f$#/a*0bfjZւ"an\1FS'l r֗h ѤTuFԕ;†o#-J=^6z. ~&FA)L?=")9beZ}#- `A ۵JZ8jt4:|m#/H$NDNuV֙>Pі{5i*KUE W p PEGqmhe-?iWHftU:\DZ{#Y&pOw6w6%P46.i&+E4Nw\6"Ĥ#/H54dD0.}T)u979}$a}ٝG #%]ՙE@uuU(Gõ~&(oEm[p!oqJЗYO/{e0ލ2E3qP8A0FY˪Q8U.ëp!f6DlֱZc&XƩPdX4grvUz뜡2w^㵼Ƶ+k:S/wzͳ`vĖ^y5i(+꘹0UH.LW]5œhGv y8z!dw z#-A`(ivk!o!׵7XcD=.bb!zjy%vOXLڡZ=lEdIVkbe9gdD%Nm!Ȃ56uC<[1Zs+_zYR״fLy`9n0@[T[B=%{,Ef#"ǁU{HySDv:󤤀n H#-Are猞 FD̄h|ςX1FKTA@H`mn*Gϲ2'M݇1QFO8) :Yfބ;6+;:UJ<0~P9#%9 uVM2#%+m%յnbZUsFmл#/EO2Ü$F#/PԽ4I $¹83䊇~:3047;H55ƨYl5sHdy>6CT5mԚmMe AP5ga8b[ʭǨѯPG`IE_bJZ1@q Zן?2/}_iLhA #/nUt\~`EF#/*@vHE27PxNp1<]$pc>#-~hf}άP7Vg#-n ,mNr!9L!&!t/t 쒴KC! {" %i-#/HW|1`Cب{b$#- ;|aN,dNeMZe,s$KT$>6Oj!sw`d9>џ^JHBڦ%SIub_Wxm槿qczUS &!~2ڣub!j,##/Mn$ʯ8]3XE=3HdX3r cRɅGds.&A2<ο_]Ukq 4:,,mw0R0.J yߐIURPZJaA raC3 !D yɌl=d)Z̜jک-jmZYTYZzt`guo`GtXq -E ʚV*,m_פ/@&љFTfDE&!&4eJIeHȨ*"*CIˋ nb'ɓNp뼸0qͰs8\*tf.Sa!Lj#8X.o1HHL/ϻDq0iӇNV|T}|SZ/jV真G8M2M Lmf7p kUSyAA#ߨ\m:i4?auÞ#/*yš9T֓13c_0䓔5Ʃ$?T"ɖ9w{|Hy4h3?$#-ؕLgyyx397Qg|l-b`#%lH5ƒH̀9#%jZgu -WkKtZwyWfqM(c7TA-SȬ0/B*#%boJ "!=u qU$UJZɶJU@)#TJB@#/6k=Ζve-10Z\.`\1knqH܊9OL1HM1i/#/28T6 ]5pPQȆyODj:k3FC"FJ;&ȫkfV#XVcB+H6Y-Hu 'mEmKHGO]*1,EI& 䦚D-Ѵr&A,eښMlVQh1ߍŹq( KmmmA聽CZY"mE1fጒ/kRPn rnbZ@<(ӄ}d4`w QZ#0oŁ-ZN0dc(bsDPtPa4l~i̥@(60Q!vEBkLБHX$7i32*Pɑ&SbYo-Wrі+Bc&RT9A 4oq 񪢃dyz b¡̚ph#%&SAЩDdxoLP]CaP4wB ܠ4؆l6Co݆S(0bQHDZ2O15L} (z#-I[aQʌMW'!M%EgX>9RܣoCA45QPC(쌮x5Kh.LJ+eF"&&8urѮT *R#/)!$R4DA#Ih6(@K `#/!,"ZR)IrE240 K7 )"(8ZhbHB?g0J)JeUKGwLj]뫥7\OW#w&-[_jԥmFcBٴɓVֿ!V$E =RL/9 ) &QD`EH#/HתP,3* '5d̸$ ČVh#/;(\^$%DGy؎Cg.FVk~=?_2=@CIr@$)-*7w6s,]"IiI$L!!F*e1;Z2EX > ,C% ##/hWN>kQN `&$Xl3#&%K?vnzU,$my$" gЅ ņ${Ԏ1}#O[vxM>_ ۟턀Mͼ &%|V#/"i ;mnM< 2y 6QSa"R7Rhp!2D_wH,S iG#Y9qݬ I$yd,in*>(?~¬~3úC^謯ʗy#@wcO8T#-DT@Bx} A55O Q NXbV:jkP0P"o`ﭚ[q)#%eꪾLᡠ$-[4"",lt\A4#-Rp~~7U$4{Sv]0Dd*ݺk.Jfa+kW56ZipB(l@{!(.D$k9Qn3=-"eg+9%cp#/EC$#VنٌO)͎|gBjP*i߃qF)H gnЀ0o),gM#>wNxi԰DF1aT9iaJ7{5lVƢa2pw`xnU'=wpV(^u.qAK(cw,zәwT|o<ù8l!#/42$q1T2f#/#/ )XET# ρ؃[yv=,R:R:˷H#%9o*uhh(tx.3X("r4hL-ndaUn0:PUZ$H%w5iZ3spX~2Z1N\=˓"ʹٲ7)+]bzv:-e7ZX*gnl>K޸uv߮;KO޳z[ɷ{"S1Rғ˳!=QX*7sDӑ#/,T&؁llvG53A񹓎}eĞ<#/#/gaLKuEuTHӼyXLHKE6vQGP:ϔ5p9!]յSv;C˒ϕ  Y$]XϞ֔Nm@]FYbP/]Wq$}[t#/x/a"Jƾk"Qhլk^Zl@pueJb;4f"M"v9c]..u۶+s4]xl8а@f_'^&HL"{txwF`o's\Wtm*6w\aGyzp[z ѵjqDSGG|>)NA~xn =;v:,t܉pa#-0Yrs.n#/Rjn0Tk(2` 3[X1fQ1ܶU<ŕwCSnJ:ΐ똳Jnyu1HF vMVq ur"3Iʣ"9` \&cǵp#/|_,u#-d3d;1 >׵5ag Iǩ[}Ik5rHϡzbW#%7.sn{26&~'#/ūʁ`1a35-hͧQJ3 +IZ6[f Dh!%O1zry1jWۑkDTPwLD|jV6֍krL 5!ݙH"n M#-E4(TR,F5'g㞸}36 l>EF #%rp6Uk^}ov3};/ץxbث6VѶ[j( %]LbiӭV!S()K2Z""&%#/II #-̮fюCf-+W `eƌBq<*TB^VX0pe$0tHpUF_.4#oY)k0E;AƑg6!Qm,jHlM4$䱢Oy܍<)Tsi\JћɺČip Q6cr3RXQ6֥4ێvFjhMUzmkZALk.lJWɫ+nbvtRUڦڦ^]sV6 #/!hb($((WކXk4/ӺWz"H$ckHje[aF6Lc%T-S*#/md#/J6ĕ#/4Qh͡M6I&J6RTF4"JD2BihL6#-D &KmkkNy{!D{6> ]gކOv6fk#-#`ǘ+;C7,saStbA4o[/m:&I-%P]*0CwPQB3ǍۅR4I&'ClzwU]腛O#/̏EPDA$bAw>@zÇI#/-#%rb(aXUS<>B~O%a5"ȼa4l$|$ ("@Z1R[cGѪ-F#/MFZ3HTbJ~daA'%FB Tgِ[3qB>i/Cjf B)5vjKƢQGJ5$r[l`awNP+56HP#%#-O$#%%X& V[e$] .kί3E7‚3 LB1 I)/A4裁. a#%a"h(B#/mJTvYd#-FpHraI90[!-#u[}>z(mkvE&b)UHjg#/?ǀ.D،~܍bB'GZ^6(H()0FC&XGcRF,clPUl֡D&f>V#/A:X%|k|40)JqKOJDWQnYndžv,c_|~˦*'PٝU'ds6K zOo(%=@jvo`CHOaJIKIpFRKC]8zpV2+0mH^byጘ{oʢkfJ)R3[J#/_Se4˅D #-,Ba|l_-5P0?y XK6I}~dԢ´(t!Dk9ʊm#-b14Ii_t@>ֻ:=wA[Wq1{08ǭm a(MBD#%@]ٴ.d[MWN #C.Rʼn*U#/ˮy6ay&,S԰y~N_ GTt˰,;nff6R\]' &h(7]fU `to,-uE 2DVHH*L1^ľDhn6=UF1IpXs'%SFqB dvTɀ44FI܆T#-)w ]H3ĢY ;Nn<4c6.J.1RPdCf,)V]30U#%rY:с5SX>NX1ZS7ĵ #/8ynE̛D&~ 95e||>j&X̳ ;P&QT#-nuawLJd]1k/u.`Զ]VI u дo2'sN#-4xkcm#%Fe!Zlj΅Kѭv4-j[I`F|jd#-o)ӗٜ;r9u0}0%5998fy<1/(U#%ۙIԳ 靉fH1'L)!4rk{vM&jXio|[֜;PMg1fj)3!j7˙@{E#"\@cK<<)ؤ@rF#-0N9"`+;$8iEڊ#2G6w q CTM|#%`'[S!3SfVߪMabh6"E#-&UBgar"d G iE,7EEEt6ux#-wAvЩ2\8f832TJK)#/wCHbT"I!S*wB]H#"#- ݇`|ظ#bU;3M7 ` J#$#VUmȻ!1`SFƑ<*Y`VThQaHV)#383@psxq̸t*Nq`ŠPwfE#/0M !hC]+Ẅ+%R>F}tFQQP k9DHlM~=C`9{J v+[Dڂ h('A?%?1n5yMhֆ&!A#Z0T1 s,-Fb9t*OV6ÃZ8h㶪#%_)2&*1K5S=j䢩Zo gP#%qM}uAE"4AP=vDn'з.$ʑ8rAg24ۑ~Q-#-zĭ"Țd㓽{(ˏ|t"eYٵr6~@d7{aOj#%;%:'g\vKm+y+LfL]dmO1JŒ׆ZHsyfd1(zw]]׮o7voR+\r]yR< J[m$r⁈H$`#-%,#Z45Xc.)VzH.Z=#SL/lQtdfff*>  df\[H <ʓnLUsm؀;@ tC3QPtl[j4D=htaib"*X"b)xh>AX0*-0N\P}=!5˃ 9hoq4(,<@kq,A-aN+MN8R(trh>2XBq-*fMFMܰ#/7ǭh#%B i餈5+A=t.\"P'!1#)_<8guu0MkIyLhXbv3c%2Z񅃿 (uw%ZoMim桺33"$dGC4;K\ eI}PBD5>" K)`#/!)U2#-u%BO'h6l"rmv͵6RR14حm6Y"e*R0a+j5#/ŊPxb=Ŋ4]FD9S4@;i:#%Xkv; ,sk@}NBxr u*m(2p3#/fAU9TY^I ۪fGR};t)A2#/t\pE6$HB&+|i4-J[haI"TG `0"tۉ7Hݔ\ّ>vDA\49|4X0/cFJ&G«>n8ݍ@#`puҩ4ѩ[AFaz%p"RHŢ۬)1hR $#/J0mc+DJ"R$rf #-˫<_C2!ţJؾLeZXÏ̭h`f-V_qAtˤKBϸ8DRΰlE{J JwRV*[jGVHmkۿuiSs&"DC;6HP$`D`Cb #/S}P./ y8+B,h-0<ۄ;J&*H=茼>lWަ=,B,ӗh>9Jɳvo۱Z:PY^PSkއ#%~#-FiG(#/ _ݺH"X!$FٟGyͱsכ7ᐩE4E/&k^Ehs\,׋yvIZ̛~n*FB/H "o"ni(Wc{>IY[ Ț}+e\L a(#/ -Ed*6٢!BA-uӲ@$`dPR66$RJ}~QΫb,m*ժTD$Ɇ0#%K[}r )"7w$VE_$Zn1Mak-b#jR`z[i5iRvRhE#@!D_Gݝ_#%kqJ2{y-1fTrU!f!!!ـ=D}dҨ6l3x_>r[3"%%%SDm'&BQepA?49&_]¢6I jd@8#%zZ J#%P0ui) Z$PJSTve{RU0llk)#-J.%J|#/Ua뵙eeկ>C|2+:}z3.b1+#-²2Pvfm?#/#/Ƈ )sR Hez4ozNmI7=2!Ļm6n{EG܇~k//vEJiI*)lbTl)hyV$)"HO#B8tld-@lHzWD#% u P2aGhwjAJSTs໶#/I#%T#%sbdZ* Vl d F<8ɿ+t.䯛g JHj~cv_>44 +҇Ꮝ7q ԗeb:i.4*'E,Ҭm)m$:ٙةeK"'<]9?&!Pa0E (eN *F `0[*[5^rweK6" TXfY3*svU["[˻%neIR)*5uo4ם]*rR$0p)ڌTljWWa{yqMzhP#-0E!lH#/oiFiK^wrݮa!"P„B)r&d$sVh߆˂#-yV.б`lY|h["A2H#%BB咡[FjV~ 2 /|1@"#/oMܪ?=aK."/ܺpBK=w2Zz/rAؽ晻c*SlccɼB'$ǩCURWto [30S QrFq/ }zl IF*wPIf6".Ȱܤ1kWIYw]*O]ocĜ@yr#/aKThڬ[3(uKFJmT|#-P߸* {:y6=#%ղs-B1~N,pStA.Z V%TR&{Hr#--5LbvP4v0@ݫ0Q#/ u3le䅻qjFlTQ]P"D4P%X ӳ[s'N>~ayAdՂ\rj̴{,q$P^^[jpzuBKTms݊d)#FOrDVv+VmAn 2#/aEJDGVo7#/o*j4 H3A`j1#/R7'##-0gTqt2ȤQht +>t1}z_=;+#/#-p;:⻟}z(Y#%tk%BE#R5異Xvvۡҩɑ\w(*ɑG&\ b lm~tua~~?C/r ov>#/@BЀ\O0,)L6i P;OF'33 J>(Ƙ3bdi_('kzkg[wV?{_og?_9_i^<ߤW/?i]~>g2ȞЧlC!ͫA*ۑ[@5'L$={PԪ"]|_}IF1#%zbtm#%`#-qe g#-HAwiC\zN Qe{ Q;G\8nLM͐Y#-EfPX8+uRP)TZe%4X x/SО"y&S%G*g*W9uy ^e[WrРt#i'_f#[:$|t9g7R2Y୙XMIdk1٠?^Px^iS @(vz+*SHyv%F^lL<ͅH0K2!pwkg3wfE*KK[7RYF%/#/k/(5?#,{zy4c"cm5 IЃKf::O9T[Mjc ,'v]DCm!A*ȖZdV4ϖbs{!*'4Se!<ΜnֳU1w&'DPR#drBL^Ypdj<)ZvOW5+#/lewhcլ,Cf$xޔ*㻧3ڙ̡# wˆ4<6xu7VE;lbH* 1!~,7CEʊi <>$W^2`¶hHS8xtwm#/@X`A10  5:9· ۛhґ1/kB*ҙmEf&,(2J(y)rlONa&'MV` L5)+C:{#/h N^)THK+#yB"]w:1NI9]Cr^͐e=2X/"-M(;@[%=#>qd4_Pt`<ٮ!9oT#-T!j8,'Ek_p}[{6h6Wvz9FX)5I8C^5dm661^-4Vؐhi#!cv5h7])`nbRoeBCձ,bmxˣb'DLQZc6f t)CBp$dc%B$>?h|qv/#-d 3x_{bq?+OP$DX @G-vjֹf[S3]-fK{ok[_E$ӿV}bmB6zunt%Jj&|fׁt oNegQQᦳ~-?AW(!y#-A'BY! ((O""JT?JHCM n=ѻ޴aS쯫._}Z;7kv"|>|)CۧO&ӆ67WaԗMM-7;?X燍v>Ӝ6^GEi_#/z݇ṓ7*#%̰~Y'E,x;u%.8RqWW!'?tB_Nu$#ep:Wo)}ڮg0ja#|}N@΃++X7 ^[ c~qQ-y[Na ~MGa_$ wD f8M๻5i |\y+2SȪb0<~X_~!dǂ/ӂN-1ojM_ނȬCh;e V^$?"(H~ +#BZh91AY&SY܋HP},Ƭ#200ebV{#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2׍Q{=hMOrw4fgTO/h]ZVO [X4>|lM<{T:of{]@b 7ozꮀg|9}9绽ës[Y#2}ww^n|G{ET}a{ok]ө{d3n&&ڷ4>Cvns.۷|#f6uѧ_ns;׫nNrvGu^7ιOlO{p4ne,=^^w6.wc)#2@&HQ#[!]`3n_E/sz)]75dvZ:uu]ΪlVix#2#2wQ#2*{sX{َ)آG9Ǜqb}g]Aڙnt5zz}y#2$zanfucjsvpz0:}=d6^}gO[ٞnv͆Cg|]9=s^y_dمl#E(V.Oz6[@8gK˦4*}ڸﻟ}#2;tݺZ#E*p6{]#[=m^3N7빰租UZrPzt==4't݈RvθwԞ 9]{|#2ac @DZ|4#2@ #2 #2#24D#2FOM@zCM4PjzS@ ! A2 CS&G&&1hh#2#2#2#2#2#2H 44ЙG钣4iiOQ#[im=h#2#2#2#2#2#2$JHjijOM50 SLSOP4iF=@#2#2#2#2#2$ #2#2#A0@h#E5=<@d A24MDA#2 2dȧ2hTbSeOS4#2#2#2#2#2rmwJGusmQWwkh̓>:HSTjʳ=[j6#X/|,gjʋ /|>s9Mc)j%ZGi#[ eے]ukoxۻkƹm׋+~<NjL$8Ի˼đ.V8J*pzsJ(­WDq$gO&-fJ+UvvL1Եoj7+\b" 4PI(C,"EtaaȀ#-HR=R`ALU1-*Z5E^ݵw#E#[ H$`YLZ 4֌Ril F %lLʄK#2J)maeKd5A0#Efɦ"b6HIQCiEE-Q$K+) IAe6H`1e3H6h&I- "f#%aiec)MM-Z*3X2 &6KI55R3d-&dHЕRe&34XFȖ6CP44I((X2#45)(؄!A"$,@#$!X!fhd"$aLMj231"JEej1ƉYHdbM RdSL%&M#E1"5%Fh3#[Q$D̒m$$`I ؉1M)mIBLeahII"KIE$DIB)ɂ("aIIc3I)5eI&($BZSd LleE"̒("b&ZQ$#JPlŋdLM &ɋER#Sd$fFhBIRKJ2m!)*e&1%K1F,L&H#[(јLPƠ#)Li# LPF2fQMc#["a#Kf,)*6iEF$$cc54Lcb4͓3%Da+#$l54"`QCSF#E51F#R2SDHlɑJeI#[X,LI&4"E#E#`LF0LiD#EIJ1fCfD%)(&jiebKI$# 6j JD2YeRXijSJM3ZPД̤ l`LhҘ0̙kh2LH)&djSl#[YRiBYRmL-1 b&)J"f&lXk7vf)Qda*iZm6Dm464ڕQeS(͢Y,mRAid#E0QjKTaFf2YM*HF3[%hiE&D-l&L6eZEEM"TdU6i*aMMfUQbȍledJe6UE M2ƪF,)QcDU!j06TRmQXbKdѵ[(,Q4M$m-حF-Q4f4J)FB$Ҵڈ4m15REQd&S5-d&ĄJZF,ԫ*RSe53eL6U,6[I$Yaaͤ-a 0Ih$hbRDTBTb2Ii+3@j+$E4QR16XSe hYd2E1)K#[EM2BE#6I#&)DąhĐdŢ,F#E E$Df4Ym2,i1f)Bj-"3j1F̤35"VKI,(%#[2Z(#[) Ě4e6e%*f &H,dD1٭*5)i5Dj@%16$*L$&k LTRji,m0DJ2Zdk"4г1)a1( *M#b5M Fl%EFUa’$i$Q&6#EeBD*2$JmƴmDMQAXm&0 MiDj5EF4QF"ْZ"1b1b2VRUř"ɤfP(3%`Ģ&m5V#E25JS4+E&KYRJR1jI! ldQY$1d5!3!j4m1R[$Z!M%54mI66LQFKPd+,Z+DV6i-R hLdfFcMHFl+F,mdeЕ mDTQ$mQLiQmE1f&3Mhm4lJԢT#4#[ZP4hD6KPk2ԕdڔISLV2cbmU*)*Q`!(ئ5L(cl[b5mֲT[)dSSl&4eDhIEPjJ3eb4 TF$)&DmIZ"|ܟWYiq,0閭J2,?Їye:b.!4%X(l0fD6O,:(|15žl{L*P <#[lZ/u \(4ZQB^?~YFrܝ5gjhM_JpfRfV:cFםwЇΜs_ٻ['?I,xڹQ#[X'mQgFѡ>IXBS#[f' e;6j4^.5E,DqKS\.YUPN0UIYC"Ҫ`K謼кTfõ&EcDETP1PXqNthxEڹ`E,8+u\,bźoM&Ω`h V>;|0zQ#EPJ^XNacXE`(#l*ڐ% ;b"h/i^\-m"RklZ5#[4j 袖(DAgHFcxûccQRmIh%.{/>O=Kd]+8uX "1Y$A?[vPاv|{RJ罗"SZ`8i(bi$2݁ʎU ﺖ"Vwլ*Х5œzY`ńQ )#E-6iU%;N%]MZMj˷|!#[#[@2(YU"N#[(~X\:!(zÈ:*}I+U"t##E.*pBUOSe(+;zÉH7͇T ]'QҡS n ?>xTC9k,5ӳ5rã,2ɞ6\@PRffF~Ox4P^bڼ4T_W:K<<13 6$ X]:Qj3tsM̼1FJ2P3T͒lYۭlτ&1mHmY~9n!BiP]~kfz/\TDN 5auljx6XsY(}SC./̍~:HTႰԦ;'xo^֫WF&؜p#ekrab=!9n;Ez[{6y9Ժ5$7CwJH1֛@83F?,bw W)DJ* Y!(.7'B4ߗ#[{AqkFoH |Cka !Cƶѯ(`q6>uXƬcȶ_f~pg0֧mz# !Mź_}Wg' VB] lP:`_cB#[:WrݟCqHf\)n_BRI&|o[OxkhE_c[y'FH(56/зm8{V=f{1A}[2H?ãw .G sHaުL/ƺ(?5L`.A-kc [avT S.A8Uf5ώY:6? Jj+{Uy6dY?s`ꚎO*ms%ltӿ;EEqQQx[1H4龜-}[1GO7~\f4ES`i=غ4x2/fH?#2rO&r2Om}P&dFiv>&Z:wæp#b)Lv_4$m;E)UN| x򹇓;./z- ӍiDQQe5a-FC#E((ꝚV!ԙ/g$&lwkV*s"1A>kAVG梳m/;<{E%#[Gq-2"#@Qh ̊5}5W65[5fC-88;J!jۥklX8woȲ31ҡ%MN0kP0Ő:!tx1KR] :YQ/"Qn5 Eu6쒈msNM";YFh5sr dkr)WZ|PvX@HהŸ՘momգ|K>rC{x2.+6o~U0$ݻKlۿ,(~^]$W9(Xhʇ{ԇV7VE8mȥս kWYK\Z7IIw,P֜9tC,b`qǟ*Kewv*e Unǿ鮬NpsfJ+Z=ҸSW rFs1^n< փ"kh6OMdGU .Kd0>!;+ P)˯]#[12Fw.3k1sUQD́ÿAr>~eho3ߪ0p$Cc ̨~8Pj'5":X@ @`[RsxE.::/>ƬF֘4s>wWxzؒ|%I$&GCdՐ2O{c>؂)&Bψ֓x#2 ѹR#2H@m}>#E.V}pمtڂY:zq&~w~UFF`H_g^&f(ҧտ"̲cEMvv(M$Q֙{h9=m/XGVέVgWT$3Yc0k;c#NMZSmwj8ީ7OZ!w|R貎]^(5$@5*(E+dX(#[b)!,gn#[W݀ߜES0lz)~ht=WQtLs|v>V1jѡkL#Wq*3>۵M.xf lr Kfm"go,br?\J1k~KV_%S}LLa˵$8}J>8 $.9. /q])qe\G_7C8t㰭q~:>xc@KMFMƥPxV\sK*ҸX#E#ESφj:wWj4.w|Sm,8q hU ;;ﴒoh-6Z\.UrMp#[TJm=2ӺpS&q@vl3iP%!˿fHt _]jUCQ\O5ϩ4z ~(w,3)=o~3&\_kĥR "#2,mr4U|){0>y~6[FMbv\>\ZE#E#H rٳ;g+[FW}]AO4. /LFncDt6 yg;bf(jlzwܾ;q+2Us:Qb:JسVUUJb)aBY|ZJ ?j;APz.#2!gGkRQX(SE D`|ѝs6@j@DQwyLmã>,Wω$f76.ʣ#2ƁIuc1@M㮢pX#[} o䣦p͚Dx4#'Jr'duvZ9_1X9^ONޞ0: wGۆ'b4)v-^uktպ/ zO}}K/8~O7]eZ0/p~`_}ɬoW Lvj,sn=fO8L]V rPןD%Sm@drYz-V)@)DȌߚ# Jg\-#2CbC `,9ȯuR@y*Vԯt:luUL8.@V۲𑑲ttKBF%a-?䯒#HNr+M<<80p !GgBF0졐rbu0(m 52Jk?OsySo҂ƸI]D$I {#>=+r˪`#EuGQlyGU)PK6cXt4 -H%ꐳɷ Mѯt?w&W0'UQP0wڃZ׏yN߻so# FCW(LoBuRB-M4D #E}+Y ւ"#2#[;?~#2i^kdBYxouwy%3喅G*v30Oz}ŵ۳of;#[7kߧ,_][ClmBL0PD*yRJ(Ȣ$03a#2c.ӠusD#ma#Ed|pY v`P[l#E5GsJ>u "vK 0΍#E~~ik"^/Ƶ 61 A!0t\lK1:m+WP\_?\#)1?<S$#EQWd#;:~>N\e;v:Pc#ECKT^FHL v?9\ѵ/P#2Ku Fq_޼=ϯcHl:\3pO~l/#~>|#Eh3sGԻ3;%_#:Cg1?el.Mm8*Th͊x'/H mv&FfzFߎf_.CEXȑuq ^%^Njjl@TƾG-6/I׏N3ŖO?` X#v΋f1-!Z\X.W?E9>F;9vm E[#[*+#E!#EuA'^nd#E4VQmY֓axy4FfbUPV4k%"2#L|`"b9} #[8aL^3g &g1:0חe=q (\*#ET,43U]'*L<#ӡ=a bCIJz#La:.X;3;T˝,PU[ה|uڙZ{,..H9ea@t̳yj\Q~@~̈́#2$Z|5aa vx mESaLc-c#޸Bg;:ܤ$XѩN^eCCGқ3ѽ2 I[Wb)a}q'MOO^mkx9DIN@<~ql&-d˃ߎ,02+M҂nhJHg{Sm]z潆h#0oɓ#EfL';~k mhJz3,PA#0N[5UdK-RzNaɝQ_Hb4"zVwc~&#ED&`%aYGGC7vWQj5E5nJh#Eԫ,abHUy>oK3Ȱ:tԄ_<~#[=F"%4LFZtU])6^Muc/gFP ۉaj=7)8oq%/>LcF#E0TztJ,]PA#%VDh\༄&/ө1$}kp/U`_PO#2,*b#EsRdnA{oPў8+vVl5 eb(_spKcl h/uuXF2D*H MFŕf1)[ XS R1SQ1CJ .W3#[XcAvA\tyAtȷ_LlxˋBLF1#[,"vNӸv5Q]YyݧH)1Iר@wis#nrsWx<^8wTvgkM]e$=OYŵ"`,j%|HU{[m.hQgjTa{ˆ@?:X0Ʊm (,[UJ[hŠQx-@Be/KoMx#EץI]k5#2f"͘=F<1K|abe7$,F2zuay_2*Pz1&S%EYbњЭ֨Cdn"gOM槽^j1}1;|v9Dnjo+Ӊ,8.ln#5H6hLu .XȆ77ptb#[ēY(C.p949BöB(y1/qP3y 4|Y^w=)HH╎\ĵdW4s7Hew|#Eӯm5.+ۑѺɷՅ>%`#tfHC acb@RxΤ-T,hAyӡeCD#21\!iyHsml#2Oqs#Eyb#2+6y6(Kv.wu1#FwnۖJʿut|ÿM4usTy!P XʅUPe"*TDkۡ4&#EeH+QU_WW|^]GxkDO.#EKJfT1D6x#,ofLcˇ 5/YccB.8P)"S"o*$#[x!1Bu:#E[q̋6fJ;b7em|w!?gܕ'y#Ӵ1JևNw+h9)i5Y=] ^u?כHLBW9ӟ3zfb/V18`$DfeZ`an:&eC!R;[#E֘Ι 4ͺB#[2J`@D(mzcjߪj4,Mh&׻o6+٢.c+cuR 'RS- *B `<^=iw$ pjdy Op,@b ILռ/oׇXc>:3!NA.sy/s?}qf|S#2{=>qd!9ż\4#[?/s([%"6}sgyzwQϽ9ؓKQ$,S#EO<1O#2K#[En˹=ッm(#eE̩NxS6Ν>w~p./%jA"ҽknW)hWm}l1󃑄 hE sB/r[GS+1Piʡ:.Sp;S)s aWpmZI$ #/^#E|][U, _<{p샣,@w-tqg?&6]^#[R';!~Xy>[4^ ;!p#j ]ulp B<&#2Oǚg[)t]$T'f(=ЙoU SQejRD4Y1@EiuH4|d_՟w(2a#[W+*}`E^YM_PԵd/lzₒ;?/ڲI?̂kgi,<=_W {z~J>^<}a~8:{$jl?,}B"¡EvLڒɢL@fʖ%8MlUEɪSDHnT}aH"c7:i|($6I=?wo7W]kD&)0(Cˈ喃%4 L1(p}wsFh"uM\ C>R7˽~AY wP>;ÁOX(ۂ05k9knmO?PDx2**He[jr#[$}LV%R뎌i5Ͱ+N ;zۑZ?vڒʩ[ m4ƝKsRƏ]ZK`Jԛ]Kۿ⏛&h(U=e\N$MSqzCums}ullH`e7I!U#EchKQXXJ}Mrx2=(T(` riaEE ׳#[2Zfd9xem$1c>~&*{Q>#["CalEa P#[A #[DRhm#[^Ϛ_`luy~oo֬GwQK4q%?OS\mzXb vo;Yii}X)Uǥ ;HO没P?PlN 8G^UJ` 4!NҚ4}̃DM]rqI}i`P~Nׄ4M܏O?|a =SG'ѿƊ4 fFCY26QEt_]wvx93>"9MMG* S1 JXTAUbzs(6oĒP<Ԡ:"w(dyX]fMSSּxwX>op$I7\k=_CHeܡXflzA!L#[dP>acQF4bA@mjEPM_qV 6 \&8K㻠}θ=ޮ}?]~}' qX2?Yz<gؖ|~m<ʣzFN _FbѺzOܳ#rw^%w|~Kħpn>Yݘ=5~[ڥ|wI';4y۷7;vlZ>o)8;юs;7\£vN~>:/>C Z6Q1Bb\b#EysUsO9QuIܞ<Î=nn;"^Vl廑ۯ;C¡1ds_1vl7>Rdxz#2zwXOg"anۻz#B| vbsGR g/}ǭf#MwcZHh12+gCһTv}}gha?gtفv#Ef>#EF?H˲O[߁wp"TF9NMSRVtN_{Q;J V8.o}=UA<8O~r:_3s#2m#2is$;;y?+ɒGv4QJ%Ъf壈rv$\=3$!Kܩ:-@DCM#E{dm:^Wry|W65ܗnF;Iױ͇E'c!IOdb.}]99+ϖRw~oM@7 7Iz^ÄyؒU?٥GY*bGuTA쒞Q|qz#2去cY|u~|/#`ydOZ,̹,0!1#EAȑFdAJbqx&(vh1 UiAQQ:Si68kMjD +HR#[kd0!XjlYYc'Ý;V &bTMFf&#ohW}*2N?wK-~;Yhfq[w]ZO!uN#[&$/[^0D[%v?Mw|ǁ#c F6,# f¾僻>3#2#2P,[2FfFDa`֗} IAb¥*26B40TUPT!( #2SݽuS;%v?+ֆчh.8`VU 8xja2s5;/sG͕뮭_N/ *>h~:~A)v~Lnk>| ? lw[~oA\We,0OdsP96GC^;a $av6?oٳNWyF Z[p9Vӧ)慛se|,$uwr8g]'5_WE=X*kR.~~~=|&r&s;- q2I|AEnӁ"M6Vz" U´[J-B:ゔ,JhQ< 1#EV4M QF&#T %TH#֡SӑDA6(VNiB@xU-p Li@e^0b:h-2TQ e e+4"dì7VbaV'vkj=J༓:tcoSwsEE]'5c""'No"U87-V-YipuKzs``K[X aĐ\S|1#>\R8@x۬P5о)s.TK2[֣F[@&$byw !NCCהj#8;q/vKzwI$"PG(cTRvRTHW43PiTR ̦H\S]y$$%ׯOy9#3#2DF>a(1*2#ER/\mFHG#[5 .ʹKі)YQK||{_0C*ww|ɠ ,``g\Xz2"cE뢴#[MɆ##D1TD|$T\P\+c0#ES릘7}UqƠՑAF4#NfhUw-F&QZ#2!{lDbk*FcTZ2}- r9p()Ne0#Ej5bLjf$dg9[bZSo֙\3+e-c2l?l(Ո#[&i.6B41@rƢln#N\ &e[C`2`.Bl˶1G2Q/-0wccWPmhǕF ;.D>t:wf<F`liZm~Gۮ/$cMPv~<_mw,QI[bT<(!c,ƛ y_ge703oPT+s 4۾|]Hi}':;nm~l) #[vcљ#2f F,XZUT4~c5DnGHҌiO| Y%ө Hȑ#u4CߪƫzV745LrHwq#Ela#[2T(qPGcE{/F04RhDŀL03 +kB!S/]M$<(-,׭H`~;?Ayqz|iF0EC78r-1 t[풄[v7ec˙`!I`8#EБWZa A oTe'hWEՐfRr7x;G#ccGR4yUE#Pm]B#EԈmଁk;o3~`isZÂQ„",S*Ip#E#Zc_H! #2PuD}N[UYo" M\шThGbG|5w.IFXKL4' dDօ#h&>h4Bb8ijF5Gs}M`rBy[`n0tE&Y#j+20f% ﹨[=U&240O04OK"vs5M cL >y9?_VdL-ۻzA!l?"{ְhz=F) ]mᶫƀO|`/#[!-ҳf&_C5-ƫ:}llc.";nfЅUL"g87#E =W#אM@of{񬰱7:XĐ;"Q@uBƮvR () 9f=cqڭtV=,9)69j#E)g#[5xoPNZ"-Dƴd"3SDP87Iq*#2LylOTf՝4#EݘF<ƨÆbnd|f3q2!Cpc(437ܦ^nюѭn:My5.ߗ8|2;I'5$%MfACx幻S8\A%g̙̈!9ʍ(|7#Et>rN\5#[#GV]Wk"wT%QvtwDydw#[6#[9c\&2]qqh5#EٌHmE|HX뫣NLyX-jv=.Xda9ɍhTr3}\sJ) n%h`XVC69vdr Z@" 6f19X؞}Ι֐8g5j:U cZN~K1IO:ۢ+JaX2E#[KЖSl#Q)SU#E%2$sw(2~T|?OUNjq a197=𝯲|(S!>vZp"6S(k I6QnB@aNuc9'^3$ޥtb^l#[Dyǫ `M06:U+3xPqEц=]z 5{_\#E)L#[?WZUyhz{zi74HFM{#"/ҭh܇s#g43bJKӭAE9McVrp5ĝF1̪]p{ uz+^]y1 k6j{\~ ?Oe>Z8Z`ޯ-u'4DEr@EK}j'zKFrq+mlO62 2‹iƴ$p#2 mHfνnvP| @xs#2%Wa>yO/ڷe{1#[3b['(d1#[{Z׾ Np牢.Wk #2aly9sd?A^68k:.v`=CwCɪW9*=d*?u0jKD£';O-d޸'4jN<ws/5|#[|x:THxP^ఖ0䌧aW9v0twۗ/$i 9~(*ꔛ/#EL\M1GD>5U5~(#Eofڥ^'躮znZ+ѺB mWfεSն|#[V!~E]7:_}tGIRN4e2E'8sl 鈐xnMU*(J 'CewQ ጢrd#'126ۦ6\#2ޣ;eGu}Ӽ%$/ 6'Ah^#[Eb薆}h]yݩQmFPid/ Qȡ]jR6j ^I됔Щ"u WppSD#E5,<&i}lGU$i4-yb o-8O "F,tvPt!'ACV>Z| BӕϤH^16KpQC=ϚVqLWo٬5'JuuK[ÍR]T(Fk4˔Jl,U'uy9ʓVElj#EB#ֶLWvZ+W.0۩GMhdMqQ綂Q-p[c1TeLߟ[B&TFYC^}[ɞ`ĐtkMBYdӚۚ-Y{S>L kEx9ٽZwɆ}ҝE{e8s!t7EMmH[N-j.4>pI0ʋѩ]CԓIWf!Pzʧ(XyXUw9ûQ[[[t9~m[~p(4ID>_!#2tO6 #[#KcEFB#izs$h^0K6b誌WSgu#"O<},mPfX|fNԭwj*a";"mu,wL 3tG(pp{פ3 l-@6-=.r*e2zxID?OSbvK'~<9k#E6Y?Uƻ2wCNDЧ+*#%[noo4$:m?Q7歹`Ȣ#Ew"j#2%HZ`e;8L}(} iĮYyx 3c+At j{#E Ʒ1x/g0*gb`eo `،CbqYL\G~$BM:<>Z `,FhZ?W5*:eqϿQTy?3صnZp*4[h!ZlUJԹYU}U}y)`nY+rt*5D. K֌i% eEA#[`VfC+DrNOUsI햼E#E!V6`A7.Y4Ubra1h(?]RAcIg`8ev#E8qϴ:s~%Ӗ6n3ՅXbU,T_[7(ZK&f]prZAHR3@gK'ܜ9X˿Mo#EQ/?NwOQ]8`oW;dz,iX,5LP#E]c\fO2BKAĆa#2^_7:OmZ0L8C8nv]%Y]@ťɺa+Gn)|lWXEQLkBV-pdJRS*;R)%{}}lkm9Ɲ`_z5Sa2y.dVFVKWE~BI1:csg{V.B-ɚ9!8=cMڱ /UؒaV\˷'ĝ|2yfcގ(6G]Ɏ6Ֆi <,6gk;Amh{\N/ͥg\WES|w[-jsT#E84ipŰ~y+9~[8R:/WcȺd<2:&eV>HmZ4´'tiJ#`>Ym|,|[&DX)XGjB<V AU`4i$)<ey¶W:'=,p.jZZ0p(Bz\`̝>zH_P9m]`˹o0cBU2:Ux7 C-nlXU=u^,[:b&ʍg=Xv|?3umS;6KnnQV|4'hhibKU#[GB0IIҶ: ׵,%F#[: ZbOqז8EE+cmH E_7n7+3o9fnI=wl:GPg5pc{ ^$&o#}ELw3u >K.PM;4Z,a}5V#6loL.\0"!s~0.`t{M'oK:#=ϋHZPu%Bu 0#E ^-~01Xӥykg!uMg(TE#[[t4ÍU V׉D-+63Hm4/}.}>ӍtT3l Mi)tAHs盳YhKuš#2Bq6Osq趿ϦzJmJ8c#2ppf4c`6LNeXSncy>g'`S:Ol&Nf$՜;^qc~'}v)`PϒӪUOKue]uЗ2;wp~`_=eXaӡt9PPI#[J(6ϡ1eA?^j*_v[P2k,<򸵬u AUp4we%ar#ZH#}/ikniT 鉖p|o$_L^tCn=N1y㏏n"C̿.>߄C4F8SR8xxq3CR?{ %EgYL?f0/VM]x}ia*M _9YIHN0wKsUMsɕJMEFc?V,R:bm!4}/k>g֋#EXUxKKM)U;,=KxSine!,8 Ĭ vCc=9)i*jt1\mB+J0S:Ѵbv0vje2@p!#2 C׷O 2)@Ġ}y¸w[UϷ6EBhP?pnC#2\70T_0,bVcv՘}9F倁PG&lx~#[;*9UkKicj%/0h>n Q!Nft3کR^"[k\d8Zn8/'SRȎ3 m5+~k#[7ӂZg*&|]D*_ ۚfa[,8T޺Gt>%W|sb}^%u<#O8{sSժp z^!R<#E9'7<GI:־3k v(Aج-MOw6^hJy`Wc,Ήyp06y\$aXթ6DrgxL7 q Xw`XmeI a}Q \ʤ^FY@a 19łyLƄ2z(0Wtg9 ѣcn'8%x.kkvDGT tF*h5MT_=*N#$ZBAO@dJ?-<ѵ%  4h`EV{#2xtruǶ IX:YEMn\kuզ_grXmb)T%mϩD絥`1MI?rd,c;#AD#ihZQ/ ;#2ŏFMR6۸ޏy#[!W י%=%%tX !5fYIuPM왆9۾R';ci!"`zXB?3SIGxgb|hO~IHYM_U+7M۵ъWMhۿlohL=0#˪M3yOtvs)#u:NJc+Nm=}\vLEYs&Sc@"9H#Et:v>/}L3X폟CNgcgӒ#>1ipNW{{ -vN}R%}5X|f8:G>qrc#䇷;(M2:P[T'ŭSdKБw~?k/\zt>\(шq49-^3#A9󤌳#Ean23ϽV2ro)R5q&á,QeӤJ7r*JL>7|gBctnc :jI))i'8012#2AOwoXn#) GwiMūrߣT QP:3c>ˇVIUOTΛ#2:#2@/EޚpVAl=(ﳗVWރfX]飥PQ snQKr5k>E8vx C[G]-',**uT4Z-tFG}s SnARySUTU9;œf8G]t{t:*a1:եO;WDҭ$2S7٢.K6wZu2h.&mJsھuLL#EުJnp{N;4f27_v͍ߧx 9zTe+WBr'Ҋ̎.V$C|C |?d/}B?MC#[Ke=Gf~Ņ܆~L˻br|1Q+L$Uz1btҩ[߶w-- K~e~jKdŶAA]Ƽ3>߻Ȯ#E}Q TxL >4X׵Ewd$c88sa5瞹&y?emKnUH ( &Sal\){b7_5`kaQ5|&j-h)挏6NϪI g_ o2mc ,XhHUUջ>(qHTi.Jz'"cHFfةk`yݽEpgH:By3Xv/aY,z1#[#[vÕ]V@[tAF]y>#E T ltTؒΔֻC."DJ0#plD'Aٺ( Μ{+"~QH.RhE8_M){Ԛ=ƵB|Am W3q*Ѓ|zj!rZ!P[6cK_#E3K$sǯRFciVy@FպЋ7Kkj8`r'IwITssE '6)͹B_aNLFT5U"Q({d0, x`KF/I{=ZPƕZD;I^A}ߐanQ sLo2kmdUq#[XzeYUM7;1nQy_l)A+w̩H ~DvϦ;4Zd8c~=PgpE1tӦ/RwtM-Sl|HZF0v4/d#EH`62 юgWs $|v/t9:"θZuQz:wjUSc$"@Ȅ$:sCHev4>#2Vª#Eܝ/(d2f8x7Ƀ9؇$6gGRe|h2C"5#^f#%3-I?wB2tC8&WC`(-3M74O>w5MR2AT&UPBJ^3; wF)]#]ufw5XmnKB\@p`؋G$(!=E,F>F,cײlvV~š+ ՆஹAD0NSu7s8 ^9Ȳ䥺#A(Ԛ"ɘm pALÝdťJo4BNt@oUc E*[Amp}QprP#j/0\%K]q(*ޯ}v"_4dRRZ"B_Њp-/W2 ~9o!ts!Nm4L_f4嫴LN, XZRzc}K~UӼD/mr!xBq;8]c5 ѽ= L=n@6Ƙs/4I;ZR'!ep[r EC͝aE4S@Q;U]{|fy_Gu !N*R#[=p bͅ*D=34V~Δd"Up5^ 7`OomFS6<" ׬4ãVB=PՇg(h'ǎ8{}EXHL#ַ.he,\ Qv-Fᓇ9wMD5V\I@d(]o)b9Ȼ`fttz"S>{yg@3T{䛷J|L* |poƚ0VVneh#E#2Sv  f˵FWgm3Bn@YIF=-l4(ۦ51t#E*0|xOOrہ** =tBFf?΄&P>Ow#2#[zO1R/x0#2I= ;"#2{/).-w5W9x#[㞩N.lJGץ kEē\j$ymtڷK>>S-Na~-UM$|s8hw ]#E?q!u4CܨوVT2#m#D%|U4ު0df=={Ha2^pK2pi-#[$eAJ?ә'Ƥ=v̯\rʘ)|nyN'lt;8=ӻM2Mi_w6xl7fY&`.}ٞlϟ깡Ab'Ļ#[.Yr#[{]@؇ۓ̬mUs By#[Cݷ/ICRxi@te-AQuCZ"a`#2;;OѶ[Z3K#2V"һa`bnK*Y D[&";#[KRA.7qbH(RP&3l!pFPĺkKnxXf[,(İl#[cfJJZ#E#[K5Pk D3#[:=WT#E۱Õ#E%a(*Ń#269|#[o}#[#[M5V.)qƣ#ER: ^9x#E,dΈQ .w$QN}(}Vui ]#[}@sbŗgModžr#2I#E4/JБɽ4;(Ka7M46&R]-1A8oE3FzvA9#Ir59gsY(vr{*~=,W$2UFP?㾭7iz*8#E6lT3M#E4:SINd8"a.5dGV#E@Wr͒S8:h/0+\ӺꩈL闘B=w=(-i 5~|fнlJQ!#[ŸıXhɢbU0i)TZfiLXo#.J**,ERwr7 mϋrwFYπl#EиN`Cm2$ T )(l՝J),=qثzwO߳]Sx^7c '7ʆ{t)l`:0o '"RTNh43n2QǸ;k @CiBPz-Pwk :(gMqQCuMל}*M5p9\ܩ+{Ɛ"v Ϟ4];&2s:fP?Ѯn#F ׷`M \DO4|Zё8(wD` jV؂KNKC ەkZk^5IZUt Y~F9f#E F#[+(.Zb(ͲĹ5x$R'e5/zl2 zM_>g sä!5 wa}nVU, twVMzf%d(Zaĵ>RS )Ҥmٕb[_-xU&}EG9xu٘djzeE;*>d2'Aɦ#E=P\jRdF[I)-{#[`'_]Pvfۊ۞\tŰè$Ė%)lmP;o[>7j׿0AZҍ.톖 lgdICX#29@%:ɐ`TEXRMFLDqђ̔l!^9(5K V֧V}2(y(Vnle'RoþyO"IS>oɋ1J:򤴡eB#E#2,|>nUUOw=WHtAN-<@ӠmA҄ҹ:*gV$-y}o\z0P*nxQ(PUz VU5)Wuz&WwJIb *ERTYeΪ8#Ehl%!%]|a6[rNA}ۻo(!gFО^L$H2P. rKq7yGjGP';KPGG~ͽp&l;@ԅP1Ie$d1M }#2za.z J KٙCkJk+f7wc'Ja33$s#E#E#[Npg!)mqC*gsN.1#E#E.x#[a}'suψe:d9&A`((zZLI߱er+ăIPm4yxY*r#uM5ITwߞ|J;ف0zqI^70=2-b ńhi> Iӑ6dDItF˥C(tLUc!T+(L$_"=IzPQн5G)ܳF#EQ1vj-,vNlAK0iأ%v 0@̬wU0'(wI CF9gޜc#1ʊ8AA,#"8IJ;Yg#E$86uxqNuW NOur!#E$F$(dф06Q18:Mio\ h|QSc5'{ #[6_o(ΔU8.$ (jځuYRfj|4Sh;4ֶxh[ѻ u~>p}LҀ#[I7ӳ;u5#EzB|QLq:?qa$};u;nU2*J ߚ& V h%n>y*Q9~#E ߳ Y ׶8q큐:,e{S9fGdLO:eV u#[O'J=y#E18v:>f)*so[#O}oQc#DdRco|&#[ n crBd7L!JY ]'_'#27y g-dD[:~RT0VRU*+LwwV7VdD߾OHO?ν̄D ]#2=_|?_0o0}):ٻkk9[&۟R=;5[G-f=c_0!tuX Egݦ} /]~v[֊\K5k0̧?O}ʽnmR0 M)^b^tݩMk7D>(}U"4'?~_Smj*8Kq9$5YHL$:Zr~3طknJŨ+ם !A6p}A,("m;=o_X%n*Zb8~RD#CܢLs!/:"tG]#2JfvmD+#E4AsQ.m;,noϸ'".햍]-9k{5>@ #[%$DNhnal:+z&&mPSh* %+u}$|_#[03!Bs>Mx uQe޻JRtOoONA$$b2%^ u[bx.{˺w#[3WiĔD&JiOyfEznxC~ϰ(g4ԟԜ1KO*#[,Y5gRUZUr fɁORNv;8gΘa4fHǏ#[m*( sK:tt5<CV Q6"N|~Bjb&;+`4LmS(]OUڹmYb3=3+Źͽ)O2#2xvt:sP'#EBs^x|E ^?)>BX"_0?˨ !Mnh#2#E:M]SzD#E\5 ;eӴ&ilԚt @76gcG`h(:w!sE{8rS[ctӎ-gp<`o0 ~OGӻ A[oLٶG#g$?zc ?#9MdWHMpx g]q*ͧϥv?R{#2$c<_u,"#EݱBh#2nSoC3ڞ}n]$#E֦?S{@]5Бb#EYۣl#EUV\(I=m֯AR#2Z|~~gd#EoIZ|`T +4C9^TB> aT>,$WvaB:0>P1D:'uF!6F[hdbFcĚY펌;r˞:E5YVyN_1e*CmP#["vJ:MCzQN%,UAD^>0{/3q"_Hv٭5E[ǯ:h%O=cr{i4.~c\C8ѰY\a#2a8q~:i0sm3p%zF"F6#E 7CyT&i;>vD>=Zݝ"V=<#J#ݵWϹ_殪^n$dE['mRRZ\-{ɶ:R(#'~E=Sˍ~x]%൚+vhYHV#0%o"`ś<;wN._D~ XX Fes+nwE?/}ߑ?t:uU(wg}lɤFgM>fQ.๿#.D&υ =V ,㚕\Hsܪ*st}yrkvBml%/f6?+Mwz:1g >k]sr(ɉ_f8G|KHMqⳮ:KњVASy#[}|8ۻ_,hiv0%Bz$W%׹J/3\lGUb_L)P亳l<#[V{#EJ*X)?G>'49u/cqI Qyk߭Qvre?m#E9w=0O'k-r)5fMأZ@ q46wfaT0rģ#2XSAfsh]a@O$ gƠ0wk/+g}ciYG%~ zw c#2C..e40p&4wt E3niP~Py#1_@YKtw[q{#[shŵMG#2o&>0q#E!*Lƽ3Ȁ),#n]c IH2?; LS`8Ep"M2h((nNC"sȶ|gZAZggϖ_c*\?|G_~(lyf#ElaL_z~%E&4DQ~%bP<bwv= BegNR)D/Kyi6\rߋ˳2O}\728zv)# .>OcJ\E/zC#2>wbPa$k'k=ÃD@UΉ ;;4I|}U7_:<W]Pp鬋)h U[/ʳZ |0|т v!=O2,,<ӿf݄rz ٤%^@yrs xdm6 +ԊQo#[ALC{ jWEw+j!OgP6ok+3) ("MRw^~kNN$3.2"jm=10rz9OV-[o&VҺ}u6?H'b;w`f6ُ,rexkBH(J;n|!{Kr"/?^#EߓĎ&F;"j CTunnNzE̲1#2 ˟oO}_i&~cqӳ%J4mz|߶!(3uu`9ͰjI;l~b?i@RFxΗfWd$>ڡO_nHtp+E TP#EJ#[Hz@zDrր??Κxr{m'_s?Y?GSǝ#[aA,*#[xHR ' tp6m#[In1;Ckumrlی[9v.3*\#E?NP1mD/FDA/-w׋lߵ,r*ǜ<Zګ].H[zԟNSK߸?rL>sD`#[]qX(#2t̴=mʶckFП@qjϾ&~a's\K% )av?/՟/pA!KFu.KA"2j0Bċh({^W.5m9z#2MY`L ,Fbݞj]:^W4;N5@A8Z+M4>RČtꜶZ;`r.rH:w(9 :ŵ$9 eZp}z\#22)$<}Ӄ)oMqFe#2z)AY`N|3{"*d{۫o`Ȝ r I#1;5M9ˤ谗4.\Q#ERI4#29l'qe;MZ1& #Eb[`+(*N9f.%T8ZI#2T-O#E?D6;B#Bi架x-hvd#EYgH]2Kc"r;6$юx=EOB20H!D$*E*<дҨLw9K5D0!CmT8#X]nX(u.+S)F8XR[[#c7>K1g`z<^4y?:W{+Ae#%q`:嶅嚾-`ݫy/BLP^કQAl/RA|)_R"##[jGHQx+У+\0IϹsS03 ]vTEx9OtGkHc[adR'G>IμLbSNDT:1AhaкPDcYqZFy#[}/ oFS]ރt:NQё:0@+hfk*dx5ч>Kt\;y#E%f3N>8x4\Zܝy37kv|C$oP]l0g(D\^S\Z@аQ=g-b 1h/aj{O>WՄQ}ʻyl۝i}_W HYThgM\er;H ๪8ze-"6#[Zu*HQxy&P`ӬXߔsE-Lj7$f.hs4|slٜ<Np:82*۪~g݇(GhI#)3HrE2 }K!b?WCl֥0z(Ɋ0W m+PS1jmIO\#2s#2`fBm_Eo8<- $=>#2AȮL Y9ӓ`Ld<1w{#El iJp4'\V~⼐M`6)`[g`?' @8ξΏaadY?I!JI<\#2@rR$x5yIP7D1;31'o |9;z#@r@y{ڪ/ 2 SP1l 1@ \#2g[$ga5X#2r^2}m-\vp LM  fi#EW ntӛr:Y:K A$$fɫgn%$3j$M1nc][ g ]E N)+^(#6#Eox:V9p1bmA]#U 4qw_eA/̌[Gp X# :#[m2Z#C1R66^DgYݪՎiam6%6&f8Y|vj(#E-s#EgNDmGs#exnВ]1D?y}ja?B+uq"E=~l\㉖ǪL΄ڴKp3{Y21qAzx79x5Mu*(]k01w|CjΌ \M%x(*6|efK@D)жot( fP.="YlzFպAcYpo:'Y\}.H":W΂{ j*`.*X#EV̡5Z ns]?^#fk18G"d a#fa~רtӅp-PE8Jd&.$zCFتs7 'a0!Z.@ ].ry1;bn[z@2b}Kd"4=SG; σV|b/^opy\13g\þW>m`"acg/ ̅C/7o0OOp<^Z(Rd'> pУ,#2zX"9ٔ(8'#E"5/XGB楪#EürUԬgk9XԜ7#2>g{rl @4^Ցe:Zc<rK:wx,l#2pMkk `uWOG#[5#E 7?_W?ʪxp~_ۏ#2YT)Q#2~9#2(@yDr|~@K:zDuyb=gWby:} eAʄ?zAb |j|:Y3Un6b}52zGΫ%Ls'y#EAë mG#EmTYRtc[I6R8Hu @K%!XQ8S]ɮV(BCGCIj TAH\W- RC\>x[ڝ0;KOs~M@eI;6jJo)#ENA㙝瓀0j,ZLHQ$Pak6ໞ+JQ $olHtNKי#r\8&#[$aiaV}JZ'uY}_J(?n40_h)=:,Ahhk2RI?CƵRfCcv-oP  M@'R.'}Q3JY-~1N6dEC 1)Q(>"pzzqVVYfH#Eژ<))Xy=PUW↴VʨI&’B*`"w#6\#2MBClH(#O۷8A@<$!DC9=5ME}#EU,F#p:̤>#2)$#E'q8D4U!n~/!,yS$a:Qc@zi"ee'm!Ka^r\tboX%I$xw.Hl7i)>g >:g6=!FA#EV~FPs:LH;53ijlBJ.a/bC{=_hfgG@#E~Kٸ.d@c1MpI?A#eR:?vl|'zi'L ڢͰŦ#[A 6O5W {;J6dbgVOO{J<ѡ#=V>A ixuOJ_UA#[oV_A=Fxյ`0h8mQ25wǨ8l6#E!#E˼n&F7yG C:CEF`BO#Es{H$(i^=JlvONZz7%7["!d95#2"o!Cp52dSt *)S<1a*/d a$s2"Цa$ Mʔk!=#2Lˆ[7#EDI?5ޮޮ!o#2+ܳDHd뒓`P{6W5׮ԛђ/\Lc`ޚcԳw5ݝnan72WYYYjѦee7O5IZ,7r6\JlɲG^I3ukZyYk #8nu:W3:֐Q$#[ qwJ"7e\D=(%'~0W'*x%hKd07kf9#R>WJ]`_SC3k#1ҝȝ#[ܻk " -Rmt2NvXMxzZU#ALPA+3/|DU&8KѬ)<#fT^2zdkwS-$|+#[*I  E0Z qOP72HH#>])$ RP5@RȆ~#[ٳ#2x}Թ#2#2 wWNWĨ_h*s78H0}6E'ʾTn/#2`Kz#[}O=F^Eϙz }?gԚ{m0,h0ȡ"B:kAcˡ7䃞uB,cN@xv: ʧ8ޟ!Н"Hð&S$Xz7y]Ǜih%nK*Z~]a&pk덍k%%/ؾ_v+gH]C=fIJ-W;ӓhnpo#t$U!*B#h??y~-~2o>u) KƇ <>_Cݰ/aMh{Ժf!!dI@76#[Y6,*tIqFoP% 45TiʌdBf^sJ6iR'y WoG`W*Pt}azw!;X_tOxM}0:N8X#2zP;w-G<ӌӺ|SA BV#Jq2lDYX&T҉džưbF_D㳱%T$)t$#!#[R#Eۦ&%f-ur6E7>ϓ8PxnłC#[ [l=Iy%%HBOð1plV#Ep9NrC#2s͠U @^"(nEX2@c,Hd!sL!d05CnQ#2BQK YJ9;7ً$8^vgO1x/l/!܅ `שÑ6DIƵEf: #ED/iFȅnM'G@;'v[lsr6ͅ@alfnz= V~-#[%IxT#[(9/XUO>mGHxosg3A_QAuϪN;Rf}uA*~*gp?ĶZ@n#EYq v4ul)h~)TW~vgiXhb0Xd&|DgՎ~b~fXTjT>UX&5ZMrOsoS~g5[ј=?β'D#2,Z[;ڰB8Tr]ؐݲ#25Ij#2uB𽐈* cn9k *?hq #,w$i#2Z!=Ԫ _qWnl}XY3BD#_XA^)y'7h^eV` Ph$@l#[ݴ!P= ʱy(b+rY6*Im +iZ܋lbTے&3qiKRv0Z@եfA~EX[?ձ|]*~@7 ^%"Mv+Ɓcѳ#~u䬁H!sh6*Jb~a$)#E?]K]C1B,zH׿Z{ HiZaYԅ`Ɍ @W?uUuj('b{;"p}!C+k?>!,q'p~g#2m0!"+wahV#2h[F$>@t\"Axm+0`]s x=(_#2jut/}%~Du6(_밮_ÚX0~,#[ݵS7eyJwxvʋ%WJahɠ$&iUˆ|(2b(@#EcxQd^y5E2+ҠZ2E6}5+~_~2^hqc~>Cy="f7?U_B,&&7wUHX>uwGO7xآr=Q &~xGك#Ez&bA"Ǻ=H4Eej&9I_;ЊKhڀ(M9T*7\{h=A>Qd҃7!jdSb #2Vʊ76@H e rxpBxx@ϱãJ?ɷK#f.Lk** r70Ԗk:o Ͻd=\tGA෨w\wBEˣ\+@^ljnt~ekүQQ!;;)%{9Ўع+[18;ztQtC%KTs4zֈ]”[^S <@k1QX:6#E:) e b#[7Vl-*m0pί0p5G_-xNp3+@K~ɒĊGIQ&PTχ[`vpзC˰[J>;>#E5Q1#EَvyDp=Wtݯ61֜]˂Gz7Uێy8;rWsm'd:~/10f2ioSٳ|PpM)*QhZPZMztS #<A6("#[s0ߟ[3V NM#2#2 9w嗟{X-s^yJ{b:pW6WufED82"t哻$򃬥X'*14gtO9p|?Ui. -$KtbfWLe炓{ vVs#3ufqHI#v-]6Q-9[1{RRv@0(S?C'v>;[My<#EVDbT[ţF(Eozt~'{ٿMqMpsq ~>0GѶ!t0bgW=9V,>Teр94:zԉNG=!&*X?{GO,F:Ǖ[5!a0/=e8GnXCq+H5OqdT@ 8_7y4.2#EUd6fƘ=vIKzCuL\Ӫbe%#q˅%%L4)Ll>NwgsGN-hwYOzj+^JaI#E1$dElnVU<11Wݪs;Dq.6-Ꚃ?dV WOd61A̱E=瘀H 1^#j O7_k!D'8_p^\i榕~_OIM>N}O#[BѓA1K SjV%U#[Q8 W3n!'5ZH92-몪`]LOav#E݆Қ#[ĭɘkPjk#[v(#"1'jevꛝ9x$T}Na0l,8k=VT>vI-efbl: !;pnmQUM@ӏsդ<ψnGa#2w=}<'HВCS"S@g,̆VScc`/HAv-RոLަlpf{I.4Uz+_̅XYS $,#vΜ}V!S!ηa-S-bbxg=r7 ГgɇC&8zjU*2SMsk"0f0j`,Mb D”j `8p}gH1<{#23vr };gHAfXWy.*vK] ؅wArOJɦd$[ 7(̅#[@ nyF;3BYd\OǪKj~Fb4\3ufgftdݨTh8iElj6\)ZcljJ$Ly &b0,*0ݿvUڷr -WvܙglRƙHbu^iu~Ae}htB>B0kKX߁#[#A,PknAfS;d`;'7Hǎ˝/xr"$Ȥ"jY{7'OMN_)#oX#3Qws y6=a!#[pW caPf1sCxƠڈBuvB;vuAق8EK;5b`?-8DSGPߨ-kɮ!6[ \yZTcl霄!D#[Z=WXj^&qmt&&M^Ce`u +#EFP{$,a=i-OLMmه#uw0;K9vhuGsG! "=<&G bu(+79-HFihvpTMn0? 7"[#Eo47vMo 62#2 !.э7qy"(;SV)k83Ȳ-77,xxrʊoR,pr2pxκѳO&sTU#2Y)j4Υ|#[5tM]<#[ i5z/MzoU#EbnLZQUDȘB 6Y ;r;vܜ#E-'NJ6C >ZJ ;:0Pyf޻wyuDђ܃W|N"V2 t՟j`!267fd侜1 y7mN;#E쪃b*D׃ɧ$qSE((ŌӢBI(Wa#E:.vGϰUԫѡi(;݃ns-U F@*(L8TK jAP*r]XlUV TeE&QP#E#[x%aGVbG{uU'#E#[G(t[K:&v;:ضB'(c{7pMNy|siQTqNmlMcIl۵m,r,a({jz=48(Ҋ"8532s]"z|h$d(#[pJ"K e}L#"|1C#[u}0kqF-FPY8r#[ha}t:*(Gf{%j}̜{G-DZa#EY2F/Tx& Dp†v1wp6vAp!$86H*`ј(4]"+΅ Em`ejEQ(Jc++'R#(/n<"'E*67]Wu&I`"Qa u)FB2Q.:3q 5hv`ENۓp ,E:]Y9:F+6@fxCyJs"%uaͺz:;<ȹRCb27x9"a[G<#p*0BWU0l~Pޕl sE0w ,(I~?z9j;yC"ʫii;+OA'V &~%mǩ.(h Beww|#ECq0Hè@LɎCHHFo譺f\$Dz[RSˏn[*+i:(00}4fBSm'ʶ*υ?N^!vJ]Vg<{AS ]I )kخ3%{#2_?$ D0j-(/Tz/#8xoe%gy$uk7T:*od-Iz~$2 #Em\*dHDI^D.@>Y #2(WSM ŌT j HNA`=Ԇ#E0" $ AM{Ĩ\ -\\lVJm!$JZSrT!|Y۷zQ#B k8.C j`]2HlCNk?׃VTTWLr_V(<qs}ӱc-=žG~n]2Kq9:{@BʮfZn=tZnBl(ַ5-XzĦf5 o:#E(ogbWķj#[zFגN1ph\5qh\X#[=҄FhJgҝ\SEWbz05u<{a=^@@(B#YUA_X#E넩_IIdp#E{X} YId?CD?w/{wJE?>T-7S6"* //_-W EbU1LR+ K넇#[ ?Fk6&ڍ@lՍ$D5ͥZljEiFTRZm5k#[z{ i-SwUc"zdUH#2#2~>q2*d^PH`<;?F˘!Yq*_&.hH9݁s@늣D,跤##2@]ǚ&j!C}Z߄C8ǿtW4u4m=. "C6\mnhyPK`4B0f 1-굦`J$ E^۽n'EB$AT1VHAEVJ @h#2r=yt2NjpU2- L 202#YPhf"'t}ޑ(R0PJ7˜2@!KoUhƳMI#[lQ%QZ6j3PBQlb#EvIE~߶.\ȁWm5#E2#[$ "jry_^Ã?z=#[h-!#22< 8O1'p=wb#2XFoMIa>c)HN<(ڀwwXPPn*xoBb/D*H~#|XD0I0A}r(ѳ<)T2V:7~5E^4A礆ǖ-dW : b+ NȒh{Bq Yd@ErȔ)JP(M~s~[.uiMf_i9xi؝Zq5 zJ8U8s{aNno~_EXdGi6cʺ :u؁#[}  (B <*XG<_MҚ#2_k$ xBzRJJJ5_C`FEwnrTd~O7;+Sעևs͑C$46/7WHy!"$tc l>ne`>%]4k&@%(iI9T&9 n(>A'R r$D`ƟmF]̥R;(&h|(uxfP8ٺ!@Z06#[zݕ< .~}(=c729ߜ`,73ViyjO&7KQt@޵㥷;WecpqF;jt,FCnP(}HSn{CF#Eu}E׷<{c*C#E8Hr8/[:m4ڸr/G`WpH7~ljm-NbdPV;Vb>x^=:yt$#v9s~|ښ9Y3YnïM׎#2ɍ68'^$Ƕn~ Ǜ!d;G#P=A#[O"#2q#E[6鍄Qu:m+GW> E獾%vr!c=R5,l _ [fϚNHE#E:.ED&ἔZ˜ʡKŅuQ!~P8yB2`P #2RBS .`ؖ$T,k͒g-l_u`C<}6 㪁GCq$$uERa{D E#Yr ; ]cc" AaoڏtW3xi΍ޚr-bC2*:YH,Ƿ@Gzl.Qyvˡ! =[?V1Q_t/fwAHR::55,?gVDyH;IS#Ot@gdE3U6NL};6DdFޞkm@T :y5׵@wwP#2r(PjbV%ڮbFlK(ȺKj0 DCd Ģ"¢%\#E KFX@FA(60Mt4pJS`0 b1  =#[ЁX]S%WFu==y^(d!BEV1@<(dBؔj$0q ,lx-ɖ^{1bOh/i$B@SBo N=ecR#+9c M#E3шP>]<cl6hD6,"PM=MꈐZ䄐^mopLE)AjYy̪b'[}lhXA"ꢄH:1WI\bzoL#[oMfN0%l7SnsY%WlDDEܝ<}8^Bj'e,u;xU4`-PXj6YBLlFFFND;O}[IٮePYGOI$`CIͥ$"Z4`u#E/#EBB kR֛gp1p}zB&L5#EjxlTf% 3Cxh\Ѐo5JNR1F@$K dN/s{ g1!&Xr(5#2u:m#Ef7c$`26k#]C#E#Ev4X10B3KZ26<ÇI M!KI}h! F,@Zb!i5lk. (%Kl%1CG-=L> BׄU*s1ZTiB%tbW5c70Po0a>_aݤChą 5٨Ɏ ɶ\O#2dIՓ߲am= 퐳Vi@,qĵeW #EܲKE9VGr%np%xEϪZrMr((P;8Í-&#[iwCA6EĊ:k=/ LYkRdst>U3ਙ!ly" -u뗵a'~fd(#[Z"q]X&1&1 c $_]M6o;Y^qX@$oU2QlM#H7I];VQu]%Wu$$;]%w@h'izhD BHPX0#2tUJiL$I¶"ًrQ]BRiR24ؿUP-PlV|Rږ*3!cE1ц4 pqOK2䬥P gc+m'hѢ[qJ CdN$نz 2c6#E#EF4`K`LBlddٰr EroV#EM6[Hpzj晹F`ʨ![&D)i4JZ+41dAR +zv,f$tB6]sʚqg<_>6mJQpm[^F+]0B1(=A#2YMh2iJN afZ@"Fj }˔r"i`#zO%A!NFw)ܝêO+̂rDw=Xڃ8ZI400[IRHЈ&Jei?aMMQi3%\LIH`Dҥ#[iM0mfd5b4Jelcf$M3i#&)"(%,M/(PiRJK20ɵ05Q"(%1Mb&Q)2S))J1#E3i4ƒ"DWoD7{h9)#[_7b2YZ*_[7o3y;ng:10Np5:,uplY&6B[6L@Lurv'f.hYL:=:s!\z-Cdd4 f]N͂G!;^Xmڍ0G[=84*.mؽ*F".kLǻI8`\GA6cGF e\C $FB1FRH٬)d*11fAEu<9nދx,ͅ,0ϹNUMaY+H]ZZCɃc#E+Ӿ'.#EK5@cr}#E\M#2'~m.WD7]OhƢo=$(so4Jٹu#EN#2kn#[l #:lGGge!U[ 7AhRJ$Q@"@#[&̠U: J?b8m`C<^E#_s着r$3w)M@̖vįX4b-izj*[i#[Ӈчf53*-hrEXN.Uyka7`3Oaie$ڱU5LD 鶣nWc.["^7LPKsM;4k]mw3XA\9b)_s9o &}ձd]+4/oo't.g!IO!W1T~r%I2rLw("Ngc7$wz;la=[y7gItn'[V:׳]v>gpA8y{HT8+xC\C>33g9i,Fġ;Q[|#EMs1mgZD"O'Ţ:25u܌qVeo$$XRW#[2yuӃ)$/|Ls iI҃O9S&24dfԺHf>*%%CZf׵/T̑;ýUeТ.#Ev`DXQ۠TI$ O :w[zɲ+92%~1 :ѻplp;&.)Ě0NP;`bL#`rL#[.8kT90:a(i̴9dNjRCTF-};e=6 g$NL+\q:8/̳|tQv`B\lӳV4!ŭoy**_vN4&sS0wM#EC`׃rQ뇁YDn>\(=}#Eڃ\ݒHbN4y>59͙;Y"H^Mk8O:(zqFUnޢ%#|OmGJT.6巇.-B~t%&,wFj5U(#;1Bh2s[|S SuҒ|3#Ez!{=T;q%j6McC`d#>g}e:,aLigV4BG[:»-m&3fסDia5&w !S S04\4ƈI4u*  5*oRE*BHҩ~NoYqPo8 WVMﺣt^ȄI1[K+{%a<%N78+yeЌQԹsiN1Զ h1/QLhfS\qP3 .m<-*>&%!öD#tîr\6%䦽e9͜ \ebq`JcTCVLֺ֢{sH0qKh3mQ)Y#J#OMPglC鵅 ,5rח+NP+ƔYh19D:Fb,1kC14qL&01sjR}iunXVȝ;qrbBZF#2$$zdb cmF8w Q bLvK0)N<]fms%pWrÝ7$ps[M5si -7׃uU6uu?S]iña(TI2))ͥ[B!`C8fmqKfs%O6(R*xq,HR*%'E)!*yD<;:-K&;T^|ydF"syL3qy1FQh8.%#+rzDc,Tf^m;FQFՑcY:Y% 4n#E2a48dGN7xš#i$#Ezev٧ 3X:̦1LdMw]D|iLH^:6We$>u8YU&tVv3P6EqX2a#[!:H=<Խ#E68pF4jfE :aQy96kfjWڢA:hHS *rK#Et1(Dwhm_b.skm#[#[ҪG[!$N`Tl)L;ڎ؛&FhRhmh)Ȏɯ#E{l7]bvžU˳;iidթHԐ!Im k $3A&D)~L*[# h`ۚV6&NoCaTa4`n'`y2cLS-WeBd<g5)&Y&,L$.RjC^XmjG4[e5tLP7aVMlff ё4bmA-R+])ʛpmDeIz֘JHaE]+dia jN,)CV[,,#E0ʎl݌*s@p$ntp,y+C:49]}O%imt@vjU`eBq1`&c<.S6pCd0m;`BPïBY.p0:!]du'f\`E hn66f4q_/= 7[6'gMX|k;3kߊ~@(yCp#[FLІӵ @9Jk ÙHL23훺$*c)|`Ҳv!0#[0bX%rjl"Ǯ 1|9!M#2a٦`a"ѦX]=QؠeԞB#8hI##ZA9Dcu48ř*F=.CE#2: ѽ#ټX2֦Q 1Ρb)S ?ޫFBB(V&in+yW "x6CB#2d ٲ r#2 l1ub?W~o=ه<#[G:6K,̽6jGTpYŵS5xɻ:(мk*ËCg/13\B{Y|T1eZ#E[U88k46CQXd:  !\r98בus"j I6kAM8Yj:eTS\,1`oCXw\UQA 1h da dD01)T27#Ez<,",Xc3Qj4zY!'XZҨk^ hASh{}Hh 6fV~#2OD*T(;kuݙsuuA\ ~Y cjH#>ayCzHaJ`o^B"H(童'Jc"4 j(=pE=XS7C3jP7X~ȸ|@#2 m=8>|3l5HFW1Vfɤ\#[ 1BĤKhńb&T@ 2&?^FQ&,FSL*%4#[!rˆh+f>'Gd2#[̤-شm!kcQbf*#[ih-mѫmx[j'n{\)#E#(B)n9n\2^%a$w $=E"e}qkm&0dAST#2ZI)'A3(f|,c ⬠BZ(8qơbX^ޕEO $)׫z-`7b$yԢ##[V$b{&11(0#E0&TP#KH^a&,ꠡ0"ɫ1IG?q+D*9'p@P,U`kTKi0`_0ޤ4y'n(pЁ0L."  NعGh8njHbG/z.aY5V@}H3CLΣjPed Cr-)RmhCt($4F+x Q#6^,[?/x#2rO3#[ )$Q#[UKiSFFKDB/`6QF #EcAM`-}D&}4E`҃0\AR~dXC5lI}6(GWY&4x/UA2]\JZ3!l=,Xj*M5jQA IrNJ֐5ے|{Ԍ|۝&rkT#E}h{܏Ӯj#[[{[֗F%+CJ/rRudKhⵇbc9 e!¹tRJ-Sm(m B җQQB3S0oF#[HmYMjN2 K,zfd2Lz5ՏUZ3ED^3JζR&x#EI"ndL8-)C`{ph]-wɩ SiSk&'"#ESn(ΖVVϕ-U!\N#2vf751UrCls#EL&K5.oMgB`roSmeM8WK-} j:f|ÊD<#[4If0!˴}^tX3`#$8p q)JI5G① R>5{jN"iHv0[#[A`C V H4I$Y@X.B4%)#!e텃t"PV2* 5CDQlT,k%Dj)-9+h\ۨ-fln8ҵ#,5#qB:;n)zfuUpQ11iqJlLimԭb5F81ÿ&I QۊڼlTlRHjRm6eS6mU55ZY2^TR[P`ڙFXJT5Izo|6E:\l.@`G]&TNH)DJDA;bϴZx$q+rT}b1Gua)h{`fy<>LWiE*(sܯoSy@-,l#ELXDFO` Ne-2!sƥzB&~u1H5TBA@) %*#2Z Y#2̙@#@ACcbf3 Dm̈́,S`p#2*LX; [xN+G8bhH߬ LU5Waè 7~r% k X\5Ř(l\N~놖O%T2r "@,էݼc|qT8Z&"\ $/HUKk9噧CZ #pYlӗ͖| % ( Ƞ{& s1jt'軅(#EAxtHEʨ#2DUa!>5nM^J>ޢpFO.7bn2У?_2.}uI Y~%lR;%h!FH]J&^ݮ12In" i-ҮƩyJɦҨ-FƤQK4ԖS%+LRh)H[]aKI7{6$(k5jh8-]MKVv٫߮Ɗ j)IUL3Uur%^$״(+6D iU\FIfjRUz•iBfF6[6zucmYIMZ;&̳]YJ]eS魮$m& A&r c9ŮivKXuz7@BqG#|{hp:ov ng\ԓD RzFS"7hSCNqSD YnXE$iǾTeV隖K*0IJi##2r^.K_JŤ"+fK[٪Mc[EWYvZkjr6k}*%H Mumi2R#2 #2qUecf)i~%tPZRke-m٦mdՊSF)̷e 0&Zb%M5$(m-%M#E3̦(,F2QM$FIZ4XbJM)L5J2Y#jQj6iY#[RbIM2M2TU#j)bfԙ$Y[ZYV(hҔ"0 *"#2JTMK|%Ŋ@D,m\zkkJ-敫"kZTVm?v";{@tGqF+"zq OwGh0ekUs@ =vߊb|ωjp"#[`b^Q=7y;# YvEgGv5ѳlf=][M &H nPRb]W҃^r9#ER{tqzB#[ /BCxC@.S1\a1TAQ;$"Q-B\A5GL؛b=H #_N*xH&"!'M5Q3?vILDs1 B."[^F= S-.y 4(nf}(|yصVv7#[8T>*#T蔴3{WoשodCIC~PR{H8d\_GJڤv7$sج$z3ep")~z0aΤ2}Tb/m^ݧH<#26QmJې8{;[#ij-=,  AdM/3qODONKdzP1Y#E^BmoqĻPLP3#2^"c2sj3(m𙙵15̇T9j˞;AN]5p;ɱ^u)jBH0{Shl @]bo9ހC@E*堳 f#[((c笳 ְ@syh)  k7 TP2S!Wk_F7Ĭ(YI#25 yTM-4A4CP"dai``N\44( t&),֊bˁ ΡcmH&ѪlƠ%R(lL2!1 ig5b9b- a#[(]@ɂC" L}U#[C\R]3Olm~,7\̈?Tשng(S &բ w 9!m@iAss^Ė‛9EM}QR19uy7"@yffC89r;zs,pbgpшTyb)p-DZ Nvݝگ?m[]RH|.Y#2'Xco#E}FL韐y6g!ctW-I=SG^VP<$f*W&`#EBKk\dLBBO[4sC3c(0H&7z[XD>5CAm*}#EH4̌FԝnQ=g[zp>;OR:4#E&A[bX#2]Z-J؆_;, 8Tl6΢dBoڧ htJq" ǍPhiF:I !%'續#En$TX#[1#[h3ѡ֟!pI0"U#Ee#<ɪW3Tm~g(WMNtfRBd`ځc8sh:ZZotQlUAx@TDR7 ϾԩyHz PdP [[%b%CLfT#[3+?_,?]y eEQhXNt1!AW8s&a9Ť;􁘠N1cD&扃nD!j:5u )6Qx~<őU\;1c9Imw/.]u,92&e"uޚ[^vɲduf_ LZm<rW7en) iLX&QF Yb( _Ml2\ #2_q8xlַCvL~*E#Efyc$,ʕZX}]fSW[8C6X+5嵆jҍY6?p0#[ª-KH$IJ#[leSfME]f$5Qj*mmȱTI[m_"" hAU*k[uϞ`b`p{kLsu .\ l@-Q#[Ð44 l(  VFRl[FAiT+ J[M!B|}u^品I!‚XzfGe{䢣EB9k@(N0D%2UGT2YAPTa)&,zz2]Q(E*)-U "31McmSV9yO#EBgȡ5b˘nG¸`k+r8#2$Q!9 ;?Ǣ9}NAgV, b5% K#[A~ܕ5iID<~aP+Qm !.D3n?%`T@Rb㚴;lyKH˼k#0Q@C`It("@Cp7lriR}z{ >#[Q!d=p'rCg*A$" mkQ[dj#[FŘ$"$FE #2)wdiS,ECq+BAiuB$(Jk44}>׬Gm1}C ڞ%!h8+, @RE#E!(HUvA2ZPH}Y}VmD̥O>SW@D^a2 &Z1#26|!z#En+imn>qkvW_Ӗ]myzy5MVy0b!#[PI@#2_i+ץ%""#Ei5! H,TU#[E3wn)g U$,%4 a?ťi#E?ꤰD@?e#E⃃:\CGD PnqRLRr,`7,8h-d"1`Fٕ$@3GƑmVo*4d4ed%1Íc]XEuP[\24޻ڮZ6b)m|$\b2.fj;&Fn׳x66k^#26ӣL j`9QF`L2тK-J+[ޞ@mV*ь9aZ56&Vt9(#E#En$l#ݹZʹm+,j+Erܾ#Eyܓ=u^7x&#ErKyXg+SgY1N,k#"4ԋk0,$iKbcG|xt4%ፁ$ &Dֶin-LQCT$GIkM;Rv ;(P3wPmOEI '"mO?'c wl۵LjUVC41\'0t4WUގ#2yrT@ xP?a}~[EEeVV#[Nn^W-y.m53I5&弚McJ2\I,V(]Mm5SAXA"Da8J"Fն-zg.ˤyD(R@^l-ȲaXzve~kDW#[,Ɇ;,$v&26BH}'r#[U#EvoE!R%v`JZ A @?-&#[Y75k")!4ZfIEgn_y~{ ѪvP(W5>xACiUq_+)aÊa6m;#E<>#IhoLH/L!!'.7셱B&!!@Z2Utkk]M\vRx6£zLŒ cwup6ζr56ō%Խ2QEDP$[k`w2L(,Hƚb0`SPafZ--"!%#2_'Y9@,E(P*x {R"*zʼCox#2EnFC&3יGN^K1:HR=趝50mHm,!#2iHvcВɒω5( "-r!z=8;@gɒ  zƈQ7V!t5'a!v(h #`y&TyQLt2 I i`q>A#ES\҂h#EDVCMGę?xFurQf\xjy!bByJ0UR8>xc!DS]ٍ\lh!ֵWds>>]Jh^p a4 v ӅpMaj>7>)6ŨV4&"-m,-FV$ ׇ~ּ'Y ,Lr`O08b&8:( hj5dX0dY0i3׽l:p%#[٨2o=\R|~ /ﵚd7&Ѭ=M1 񢁱B0ܮL*v#[HۉbLU)x`H#[S-9anTFmxıC^$S#2B(0Mjqo: 5&3U2fbDDȤT7`BRx%U)n̲C<ͦ(X)_TUDǒ#[[L`) MeP<8a6Hѫ&W$Gt.dh@/6vN/D=#[qqzf&T4Zz&Cٽ$Uȥ2c" B@ETX#E<[(x.3.| v"wUQ# 5"RK޳L\>8sibB#96;6YuJ#2N|Gd"15-$BȌ 0]PF!mH807FC!L#[AyIeb\B,@Q&2Ry6 d&-3T>6QdPĈ1T)]eK#2)vs2jQfRDGCtdN4i9&]#X9=]g[-=r+m'Iz/58Ѣ7һR9E\9k~ygޡTiI a TD#Eq[Salʼ-BK&˭(2ӣ PǑiX?t:AB#En}Y*# l4ɝd Cwh*TNi%-`v~Ɉm3 Ɠ86Nk &ԦZ-|{Q&SҭNF||v,Jɪ7UI|!6g18Ab0FKc0-*.aC/L&Gr]HP+]BնUJE{eiRZ-#2Y"*@c#2Vumt) t7qNp7owj2مj V^Y3#EtoC3Ngg2Qd!d!CprѠS)#EI%l WV6L]A(@' #E.HA{{}[ջdռӴ;HH}~^ɞI#2F>kFu]WIzF&DՓ7]玕םEuhʹcIm5k%Yɦh$q lR@LJD >?>QAl6K|-`N@\Ɗi_uU/|-FA2Ks1r`j|#[ 6FĈͽ1<7%ZB9i X0#0Z4\ \3AI#UAswCƧwhǙ͎39tAW8b`˯JZ,#[֠FEed9qKwL:--.r]KL P#[ƫ(:ƣ#[^>j!RA@jﵼ)i-2شUkجZɕZ^5xstJ!!Ӿ$R 87~c儢ޖ0p>Awn#2@t)sϟ#9(>\E}ΡRA{` >0JUoUbq61$(6 <00 D=4&m0b09_0/(](WK@K^֐(q2YlNMUY4%(I*6y!7z^%NHo 'ؖ+:Ғ(iQb1b!A udeqR$`xVy۹:WUtkv#E+DDOEX pB QCq!oY=ɋgĞɃ}'nANcQP jzS1khrCԫ#2}p?.gEW&qR@iPTĩfP&q"Bh퍥s+_payp-cMAp[(u F d#ENf@v#$0|%PAPJ+J #EŤ`Q_8`۲ʕh #2F)h ,I$:u[+w[f #[TDk:*D1JVng4eȩ0$pƢM)6Ngd}>H5!W܅x7.3 7iK|%P' hN<>%Aؖ!Z\ Mm#(SL^j#2՝Hu҃5,=+'?kˢ 2#7ξ/DɃT {4M62(EI.kGBJ9{5¾g:.z!`e~R[ՋUۮ0VaEҁ"}!Eh焹рcmp@$~8;Hrv}Y~;w_[X)jqTkÛIV3ۜcqm6A3}-IbU`6& k+Bô*m]Z0mdlAA[v,a%)`Ik$ХCiְ}`7P(8Iv8hC,@~_jGC;dLAPS4<>LlNvK3:skY~[d(cB0&(c&ȓfW(DeR:z90qlZLm#EDagjl(i] `Y)0(ϐmeVԪiݨ)={2uТHukg%x#* #[ntxރ51$) ~ 2G-?mlգ+c!}/ώrYն.o=b"y< f6%p*XT8G?#LIM*C<c!<,yb Ha@(%z(B<9&g%3@uATƮyBFBBPBM5_ǚckFգ\kU6ɍ,mZҭ\1 9˔Ӵhhir#[CN4&#E2*OBk1,.Bǯam" ܳ)v׸RkFz:PP1w8-z{}n}Tɀ_[Gh8ތH0I#E4 I_jCj{M&ú5CAH"H 5J٘x".e*)CФ:5t}>pQ.s\pE߾' AN㘼{lZ#[FCC٩僾a`}Fjr$0(}'HJ?1\$l`>EK[CHTJs|汘6e5F #EMڙxljE#9aUMb#QbY#Vnmm8m/\#4.@k1c{z,Pı9wp?a5 $/ikAQOjr-Rlg*m/&Ux:6te:d. (J|XWL}2 ,+{YL 1#2ͥ0)4ֳ:Ud&%77ГʬZ6mhk1U,T|k#E ,^{O7k/9vb ]#[l"`RS)ChҌMIP[̡[vGQ,44,ebl\ %T PFK*X0#2Aa@)#["Й.1$`!P#[8@9\l}v=-r,l'ؘE_4^ftsa#O!t&dײX8|_&[S#A# #MH'<+F9>=S Ž<k"v-!V\6=F@T<ǡ4O.Z~F!$07o)!u<p3G#E#[#EE}5xmED2kN9-|0PBS. ·WK|5td~R#Ew#28P d3SGv#EQ3=o\R&9n֬kþ0ToJeT1OE53͕#8q&/&qcg1Z[bG\co3 "'f1[-"r_b.V/F,j0FE#[0#P)V*#2yFuiF6T*填'5X %<ݮR&lhUY]kٴV+Ԧd_O\EXh65QlVZ 4m2ѲTe4fLjh6Z@65`]@(YP)`:̐>#E!PEF"u$ FH I!"ȃe:u_.Z%O}P(}gs,4dΎ/HAADi)}#E̾BmdڶR~^igTQm;:])knQQmR[s\[5WebU^y4}7dF$CSIP4LelJ#2`o":Bu.ۊ6*5#[HiT,2J6}VJ1AsGc#2B"f\z8MHk[O0zBmڞqk6wH(p\9uQ@ީ% f Y#a誏nfmdaLf7?,qew2M5 F3R-AeBa-su.ӓ2Ln#X|^^^hC&(l>A+u*;,yI]x4`xM#[b^IVsq8DFZM3-ҍJ=uɣKpꖊ,/ ^)dHwСEF0d^{B̀^.N;l>qYlz1~x`LU}&eꕵTY01)4Ҥ%52 ;0b#[wHDUc@l|n۸ם\Sws44ܷy:,&Սe)YekS7V6c5X!#2mlkRAUzu"XH`X,J٤h4V+DA2#2k+jѓHBH91x,=ac\4BRHcAA' irzx%>Jrlg31=FkIkdl۷ay]I(3j6ݿ= k̇3v= d AE-!(0@!#22L :#2ϑ:}#cUd! 0wCڍ527Γ]$x4#E)Pc+hz#2f9Yg?hABH,T [mPmzh6H0ځ!sc&Hjsמyu;fDoSky%>7yKL#[yRX*֪KdՑqLJ5/bbғ$o(FrD(71DHQKҭo25"[ dB iH@"9kC~똙i^؟\@q HP>>.ƲЀ.@Y(F$BY*[lMڦڠECzNh"k01G17mK[64ɚ!#2E9_AjAIZv9i+&*&n5hlm$7.܂ 2A#e8د#[HѤTuo%zࡩ$YGM&ר^{v?n?VH?D"Aޯӥ~kKnY[$#E`b^"#[%A0v KY4-R.#O::1)""pZ95inu~6Czy#2ZEO\88I#E"Hd#EADHVI-„M7AM큦2LBm.JPKT@`ٌԅPlX,b]`#[#[#[l6A*5 eRUnEdm3 qu|`pW%PTsNi4PR$5Hl8: Aydd&Y`#[JHYnE8b0 E`$BhTVޭ[KN2Sۢj ֫5N7ltR !SQQ$:ș{y#E#E#[UMvE1]SZk-;Wjm[,RU QY IUI(-4Q#PZVζ$b+JBT0t{" ̜aEO0&׏(|j 6,L[D Mtg_Lkꫠo<-\rښ)ɒcBH#[1xm$"uEXmYQߟ&ݛQKK\`Zek-4Bz=aw< hSIc[m4;CAA?n?\#ETD?MQQߴદZj]KV}nUS~ZokԮPE;%vDԳsU6#E8Άt^!-7o?ӏYȥ$уHX*f?kI&\Ps@PDDuG<Q_KttA_d:/? eetϼ2Ԅ gц8ZCD"2Ög4ū3:B:6."cm-LJ8';7n*e6jo\3gDșC#E28Aq)37#ED#2adƍ-!c?k 熣#EOqTr  Z1*+@R bV'f*i'#u<qr#[>U[g>$#EAahlt #3H` (._%v鏹1C},jۄ {r=RoF"*L&a}2+!#Vm1PŹ#f45M.EsH:}=n_~ʯKY{^#EcCm6`3ZS{O-;YҞi{K֞m#2>Dŕm}I#="cg9l/ؐWb鯆G4v8+,;(U^jq 邛dfj{Q۞ԇr#E|`0T\fҧm~jNHf#[GkfM敚زeY evӢq #2 I#[FPUs>*;/3&p>>~|g@܁P B=zEf#"yU{xDvD:m #[1-kkȄ4̄h|ǂX1ΥF~tHT#[&iQu63I hUf-9HV, p{Bv{عl3tk8[!ḑXPRRI5rh1JB$`$Ab#[d4WkkuV\Iswmo\llg>ns10o45?Y׎8k$lDe[<dX]kk,Fx՝<*kʾq|6p&Pphc!i @ ,@6D2241s#E۞S6ت銬5.v/doA:6vt*r׿#[͝V7󰓹$׼rUPr|D2H7&E.dthΩ*-6kP#=hWyG^M㷱p.FnBp6#[S(ooY&%kJ=A|>@+ iUEV+\#2#ٿEHqלC35P੷:4CYNq#2ss#EAn=\$JcQn I\sGk b"Um`֭vs>'98]л#[EO2dÜ$F#[QwBMpJ8a3⊇y96|ˮW>rWA9VXkb!|mՋmԚmMPX$QTPu%;ω#B>#EYUbXa 8-kǟ?̬WS/H$#>ۺ}b}J4#2QRD-t@<'O} Tbt~twuBHz=)Y:)Bo[9|u>n?h=kQE1tB ږ .Y♋i`eh`P 2GۯeFgwJo)XF"z#?O|/\cc4_*EXIT#2P瀍,dNeMZw,wܫL0̥kS~jFX$~YO'oiz*Q)ȿdU1ȹ#2:K5w.j{.p.4Є:o#2STn^[5!Qdyw,(RkQ%d7Qoc,: -dBʨr#! PT~6G2d@Sӑﯷ&j0b . H(딨D$xu,mw5rlLgCBsoIURP )t[Q 7BaD#[a<-daEFuH{nߗ}NT3]ֻU!ŭML $!!"!=XcZH#2;2zWE 7E#E[$P }o)#@&љFTfDE&!&4eJIeI#0]'6 9 ؒGyL_v)LWnl#Ec#EDɆ$D#iDg DfH#2#2 [/<Sop"ͳa2Q#[ԊFVj(%CѓQLBV̆L_mtjrr}XH|6{Xjv^vOBS3f#2JS;u'bʤTBO@I)E9rIP2M,HV*(E,C@;I@Q@k-TJRiƔjg|l-,U5I4FdDd.C5ͪwIwn],r#245YL TA-SȬ0 01 ^#[V蔀 #[J+M*(#2m4QY66mKH( Gm΋K2AZ.B:%#E[wFVxȪx0ǘ2aBhMW/SO<Yb&`7a.#[*99T|\mpX(hB0:'fi#E6EX/k[6hqiF4BЀ7sijҋcT&#EV%cy$D#ҕFؖRJa9)Q R6cD%SIm46LjhV.nyhuxPaTNYj:R\لm$!3l"š4A(F9*²1&6*e(lo3C01 2h1s-^hٔ#[4p֋B+R#Em,jh32Є1Ga%.S b#xMa]={LXaha~7iq( ]i3Pu=7kX6WK1dR0qx8B ټ1EMjJ#EBmKH'pA^KF#[Gp@.3N Xդ#[@62*4E.A& F♬FMHmFoҊ7$;豘TnuZS+j$R #I#EL!L#[:2 dIdPdaH*RF0&8e!ZLCcF(6O3OAlU8T6Ģ% وPlPȍ;,)FH|΢#E4ޡҨ?&,#EL5zN#[fMgFSE Aj+#E<14PP|EbY!滳lFڱg6y&w3\g߲f\ #c\qIźߦg^znU,`6vRcpdY~`!H~1aؾj/zۦ/b8 s8^%ze@RA!<3ޝ 8?3f'3X+4mM2y(62SrBYp|gQ"IDCeXh:>S|H,S iG#Y8 I$7!U8}(?"~';ip/VWy#@v矘 *tT2"B+N׶iFoC)D-Z1+\S<ғ:[٩9Bj묶R<9}ĪumptGiK%t#[܂hIEE/5~_#Eqw|!gOTeD@Q/e W5T%Qa?H&l6 H#[9 #[f#[썵!A+ L H24,"2Iv&ܻ6űcnZ[!mͤlVӻٮEFFьQQ\Yݬm_(/6^#EcW@riX}d>lo  "GtE#2Y(zgC*L0wU|C#2{@^hܪ#2N Z$R]$悑@*]ǏM)#!*0Hw]dH`hWz.0@V0TA#2`*2#[*"aUMTom׭ꨨR%ۈ]*/^*AQHѪ-aXe,MZ >b "܂U!s(ū8b>9_0b۹t6֫g@QTTu}z$A <=F7nJuYTC WiJkWURS3d)B-,&#E(ڊ)%b›UVƶmiZejekE޿O\ֳ&1aPF#EZ6W"D> m6aU#ש=7^:WF(!" c#[16 cH D*F E# cDQ4DB("E#[B䢒*-@VwDQSŗNiӻ1uW[^[xu*A[6J#[;#2dP&](B `+:vIʟ_EisE)^ R#2&Ȏ懭~a8gnu\Z# n! QT& <#oÌJRzqsbC4E8RXT0N اp#Et4E\;^7&˩RFVEkZ.EVo%o' Gr'S;ۺB@J/N1Td>{d^/zh.ؒ7rps~_~7!ZfҔc?ۥF@M}k_tC<%\"Mc/ӿm-ȚS窼 l㴼C#E,{퍈8 .#Eg%akBv4~#'gGࡢYU;ɗrpӀcHq }=@Te|eh|sKԻ:=Q>~1&\.*w[= &75zE M(#2`|36X:}=c8kTnmp#2AἻ5FkٕZ.x5] ppbIP489vҞ=5B#E⺻x:}N٢dJ;\z#E&1# ObSOǵ^rc=iA&; "ryw ZIqǧ<{o mA#['~î=E *'#EВnl! /ys74ׇ%.!¤Bu)-@^dAo]&V~9>TͥAACj:,=bM]dbqn// b4G09%Q"!m(#W$dxYH̓Ct+Bsr8i&r=:n!;bzz->'#f7<K[E@65&L yG&SAr<ݎ,ٶ$1SM`V'噢u^P.p.!Ύd3[FE=K6}xw[A3gε)#EgJ\۬;v(̎'%5.Oue~e$89λѬmym0k9l>D񫽞R C8̭DTg>툧Ƴ֗!"Jf u,GeNyl-+<YTG#2GXR(Y%nTl4gFg*yLls~ 1WNXi԰DF1aT9iaJ76+`cXXhf UI]\,PK՞p* =<ֻAv:m0FD=!Sف@PT0#q$ #E^[Ƥ+˳wfybO2."4q2NhkSACR5D0rp~2$٤S";KW~.r CJj#[VDg,gT3^^rx*(KbQQf +]bv:-e7ZX*gnl>K޸uv߮;KO޳z[ɷ{"S1Rғ˳!=QX*7sDӑY[8{bd8Y 7̜u36QjyLAӵQ)rTʓrz!*i3F%͝khΠu|b8g#E>\o|Ovb",|#{gk:8wc,nj]ē#1%'Lҫ"-gdPX#-ۣZwWf:a۷&٫t%U'<"B``e.v7Enpq -DZ̝d멿=ΈɐiTN港oC^Tl.ywh3q yH]}ᠥ%g3#ozVWdE6|>SB) Z`jE`LP'Z#[#[[22·y!tY#ۋp#E8`3#[u7,;ÞR>np~l ^+߳ &jBQc}km?LM8m <;P9j'#4f˧ʤ(aK/dyդ#E CזN ec8QFcӵlNe]Pے3:{iVm%4^YM[#ElBÇp%ִH+NUUa8և 0!sYX;Ϯ)-[etY,#[Pp5Y<%o+3#"! 0݉ArG+k#2#ޠE:(b^oC^9j$֘ HJ^ilϤ2aZqvkX ,r.Ĉޙ 0%pg2vx8:q)[b,204EDb$,߼fku[!?4fӨm-D3aP#E"4б(b#[QE؄Y#[4ƒHj/fTcmoMh`#2#EXB"(ڎ^-65*&PTҊX`Y,BŖƠr<3׎3}m H$&$HvΣ=5.H*"tŊj^Wbڶ-mhֹUj7*#-Sr31o]NV5]c-PRbc4BQHͳ @$$ۅQ!ѳQ+^3J{2tq1O#Ecׅ!(I ]R2AWˍ=HJo"DQNPk1j44#EaDi6K)a.+M1Ɔa 9,h墣S3U(3LGSPZs}zpcXߥaB#Du5S+$*6q+"`M,cfL"TX.tuˉ0:X#[2+M1֌d46NFFO=3jL;5:wF#E5ainmdBc"Q[ڟފ=#^f>2P(Xģ܋F:ݔpf {bib7'Sm6tp`mI#E@bof!br; Lf8wVfoRgULsa*"(R#(,n`ny&9ݾ#[OrA#DHT_Nvi+9s]mːO#[ vp?/P~D؅SgmXn’*$9gIaOYޠ^ŗNqcPAz}2C?t#2!o'4} U8I١0zQǑ7vwc_T&rkm. ]MF1F̪f|8yRm#wIܘD_w@y9;1cUS-Igºcȴkz@<@#EQ E8ߍ%Dbe~ӯû#8_MJAAfNך 25i-v6\Ս֮ɵiutH gi">_mwWzU!ckHje[aF6Lc%T-S*#[md#[J6ĕ#[4Qh͡M6I&J6RTF4"JD2BihL6#ED &Km$$E?aݫ~#/\5^G{ ԩQ&]Ś]dj~Q:"{%487`vDa"ŏ@$z8 ȫ베D%KT#2@چ`nj#[3\&x[ N!ƊPnejLn|O#E ~7p"H(EV\@d*>'fᘛL4b(aXUSy||WYSRBbsY8/V$6#[KTE%4}Vm*5(Rj4b#>ڹYj^]VvbY0ӓ $L#T 1f@ʪx v.B}H֟uvjKƢQGJ5$r[lTPAawNP+56I C(B[#2YGP%ĉؽ7 .kί3E75+I.h[_FG6\[(bEi(Q#""1/E򣖚iӻP΂*'\{N1Kyl@;{j|{#[ sjtp:[X.1$S*Li[ZVlP>-fEb#E/2b*7߭$m.8/Twh0xN:dj'9A%WK6$>?\QܲCQIZ"SA;k*)4Q$2J v(n]K2=W!B//Q`=ؤPߓGIX#2 .j`vc"x۟|`)GL71Ğ•Q*L#E||":߉tQXr<@?qe-_Xdjg4==j<УYXzb4YH&- O`:0aoQ{"ܠn,-tE`U2gQ,Wn-c0p#Jaou'98>I5csY%h dvTvx3͞.kbf e{~߮FA%5b?@ȏM IVQWiq鍔xfB?3ԏǸFr2g/z!$\:n&-bgбG$&%➠sxSpBH%m#E8 4s9,hL ƶn"6ﻍF_uC&ϮNA"4ЩL iwc' HkY F4³EJvct&ܨq*D`J#E0 HԅE1ZQkj#`*+b28\A@UCmcij"HCHRESx0T:: ^#E&1B97wΣYũGFF<,101:%bQ_zyԚ:?N6,F~v2eܦBd[ѼuEDTew\?v\gιwnL.#2a%魷=|$rn WD7f%+*0e/0B#EBRAxu#fB@3 Y03 Dh mlZUO-+c=-I5Rp+#[*hE|fPwZn<Lnkm&P1o.t@k삷#8`ʂXVFʲe.*eō!sslc ar4p$6ĶP=Em7Xv5ii2K1r=I tSc5-),id4fOȜ䘎v7״J{Ɔl޺l\Vg%mWM. S9gSN);&vt.s`\9W.d!&w|ؚ4t$!90ю+ظY+VKC-xsuZuvD#[eT;<=Dg2ɤ[ia#[׬J%XUǗC&M؜5wO.Xb.d$'5. ;HX!/U6Zexg)#ENiyK\ r"Yr-Y\[Sk#E7d.yR$1䎓H|V"ىd̓46yt֯.T.g[I#2aȱր{Ctc#S@8o{LDlCWÕņBI,k$`mHlR fy/ti#[]Hi6H"P(B&mI\aЀk|T3Fe#EX `C }U*5H$$EѬ5-fKZnRDv)Uӛ<1ymd(viU,6ddܺd\h!-_.6˝Et:"OF^.edR5LM4N:æ$ 14y({SyH'|]<1l>mCO|3"&q~<&aLS&3m͖&GCdYqUb|2A_!f栌դd0v5#Y#Es~f&K%! 6ҰUشS&z-6F݃lS3ΧGIf$LFJŚHPK(fc~y,M#[XrfP Ԇ+ˋɄhY#E-@@V*L 06S UV^v\Da4Jjrs&z"yyBn\C8Ls= 22ږvA=38L$wqWnɽ}K#E8`kcZ#E!*Cw_355[%L&IaJ.ttwR#E[BV E0eELMkI4"ݺ^w:EuHz 0͏0H$!uфaႍH`ȫn֩hI7C30l–QYl j׸̚$#E$ L}(xnqec&/͈mbRpq#EQ+@,&([v&aeHC!$#[l&.xL v 6"&dGfA3bTlB4odADt J#$#VUmȻ!1`SFΦ;Kl#[u]`v#[40# %$`g6bPyw|(@)2m#LQJ!BFCcAQE@Y' à| XU(%JמԛtM#-/sylxhdw]#[]v~-G*Z!D5,=̖xկp!yt#H`!{ɌXCYŹFDN#EI:f"+#E]&!W#E(#E5Ha ¢c#[$J#Ew&9w#[ncNL}3d*s=TYϮ4u*&YI>m$_?C8 zBb%%,0yIjE6mՔUkYT/1a8]6uLDB 8Ny9ۃvzN3D'#EGf.{/xQ {h0Y` iّf R}fk kG ;t穬YDI(w{L`(x`Iu&"IFZՔ1%KmI#"aeƅ*^jMm\o5W-WlB #[ ,]\P* R{&zMR/rSM? L ui{龆جdص$վke/'ޥ0n#21,# kewLTG#EYba]/8=CwIp2zy7IZM. $#E3\&QJ* FGlƔar`02`#2ȈTGLJ~Np857:DB{NO?9PoM=NE%"#[#2뵇"19$$ڲ~)^uUnʹk#nU6.#2(w3eWfX)hTE~d'#EkuVRQ,JZnM6wrPyR[~!%-a(|s$4(ͺuEz=0MgYCe"1B5*D3=`e>9:T*  ӆ^)&`LV8Sf)OKKmTT9;;$Jy7#E`0"tۉ7Hݔ\ّ>vDA\49|61PhTAFfa40HlU&5#h"(1yODTJBi"uCu&-#[A( (H<q#1hl~}nw#2{DȄlZ4M}$U9Ŋl8 ,ŪK3(3p]2EKBϬ8DR#2 "a[ Jw|RdH8-SB$<ۄ; J$p80#Ewg_mV#:\=IsuLyۻ)MX#[8#2<(\{i,ٮk5C#2_h#E(#P4@]X={KYFLfGj#4I#f}ͱsכ7ᐩE4E/&k^Ehs\,׋yvIZ̛*m]I#!S`7r۳wPQU+`EA$-M>U)#[~;@ê!(dfʬH^ u<@@XbJFѤYITٯ5u_F4lCflh)USIK5soMI\%-lH02.0諺Zn1Mak-b#jR`=y-I(tZ"wQ5{IܯxA5 FOjz#岜ڔ.I>8I$x{HC5`8IQx@:V1*.+~6Xdl IIT;g`ЂsNl[JB.#[!BY>Ssӯpx#EBhށ`0?6J =A#2$#[F#[J6[i45JkW@U0jlkL#2 ۔#E#[u =*ȰZ̲j2˪Dkz3.b1+#En&` #[&rVLն0ez4oNmĎ]Ͷ}0s*><+h)cvB0M$@JdTRF#Eb66Rѿ~F$$H$?2:w^=v2Q f6B$a=*ܫ|F:J(Ab0E4M#EJ5RkS{nbI"#2A(F,XZ* VmBE#2BF$n.a_={*I#a!#Eb &N6דL#EĀ[R]$!(]~,i}GXR du2!RLDRȉcOdpQ71& p]XM#E4M-{p9kwezk6%W6T[fnʮݵsȳVƦ[RTJFy[5$ISa!H6bM{v{7jרP4LPĀQ4Yl;nvV˦J_%= 0 0hFa4A?`וUkB- / v/kbg ToT1zLfgړ,b#[rrgxYT(pJƭl50:t#2j.rT.0\DNpۦ #[T!Ǔy%ąOM#EUJ]/αo&i13VBN1H+R3x\Lo5aMN1USp"^|3ww: @俔j>V]J[E(?^n#w/w6w?o?^p-s&Is zO#[d+6;"m\?ӌ#E@7W#\K_31Q azvTEdzO/s@3>ַT~`l#E)&wm$c>&aMf #l/ep#['`~鴠ssxqE@rzY'AJ(E(H-#[k.31#2AH(#'@WKHRYkC\#8y.PF\ʶPrРt!Bee}%?5rܧC#EsƗFc HڬV#2ԩU%3KL!TLf *avwjU2J 6^\I98L3 `KNSzc'48u>|1ikc%Pf\5ѽifw$%NRUxԛ͢Da$n&4KF5W#[_4^Q&kن\B!RFS#EHͮ^ `f6m#Pĝ?\cîTv7M^AȊY[N予nѳӳt5`%B(zy󲱦|uEfJ'w#EFbO#0۱L]IL|i'0 a Sӑh[•gxa#[c[һ0hѿu̡# c15xu7VE;DlbH* 1!},'Pr"B@K3/ݳ>$՘Jz9Y+Gb0H'v 5Z%owA#$Shґ1/kB*ҙmEf&,( M}(P R#['@t`€cΩ*Ә,Rؤ;C@e0ԤU W??*FPPIHlLG~W+ϙUIDjKKǻ&QU&ٽflzC=$2F c6ʆ#E} ]>֓|h |#2pǤq,J\D-y@3+]'تhx5E8٫#E D|c [+Yj?/Fg: &'THdocchV+ŶWZަԛUm0D`\D,n&볡H`nd#bNO.d=:$` 62F t)CB$ÌvfmkAA=z/uƒ\dFn+<<~QۢsGr:琾0+O,P$DX @G-n#[ )+Ve35۱-_B6hQVӻ{g>6E!xrˌ!z5X1zTGEQߦ,?f>?#[^olGQPAlC ((G#[z_~]KB'qxAP&~go?Ѭ.d.g&+0^8}vB^h|(5sN;g]wϪL<z\0O{'_r#7Xn#KBaw |J=-bh+SAMy0W#E#(f!X=T"q'%D=kG%Mob#[;?*Yh5K }#2(NY]N*pM\e|!m:v: G9bo1yl%جDârBF76TtaPt4,.b٭Yuu5[@(qh+h WP7U 1Cw?a~jb/AzsAxXmrTHS֗N&@?!S [fmR[{oR??R #2#)„_@ #<== diff --git a/wscript b/wscript index b937ca85..f3b268f0 100644 --- a/wscript +++ b/wscript @@ -3,15 +3,16 @@ # a1batross, mittorn, 2018 from __future__ import print_function -from waflib import Logs +from waflib import Logs, Context, Configure import sys import os -sys.path.append(os.path.realpath('scripts/waflib')) VERSION = '2.4' APPNAME = 'hlsdk-xash3d' top = '.' +Context.Context.line_just = 55 # should fit for everything on 80x26 + def options(opt): grp = opt.add_option_group('Common options') @@ -19,19 +20,26 @@ def options(opt): help = 'build type: debug, release or none(custom flags)') grp.add_option('-8', '--64bits', action = 'store_true', dest = 'ALLOW64', default = False, - help = 'allow targetting 64-bit game dlls') + help = 'allow targetting 64-bit engine(Linux/Windows/OSX x86 only) [default: %default]') grp.add_option('--enable-voicemgr', action = 'store_true', dest = 'VOICEMGR', default = False, - help = 'enable voice manager') + help = 'enable voice manager [default: %default]') grp.add_option('--enable-goldsrc-support', action = 'store_true', dest = 'GOLDSRC', default = False, - help = 'enable GoldSource engine support') + help = 'enable GoldSource engine support [default: %default]') + + grp.add_option('--enable-lto', action = 'store_true', dest = 'LTO', default = False, + help = 'enable Link Time Optimization [default: %default]') + + grp.add_option('--enable-poly-opt', action = 'store_true', dest = 'POLLY', default = False, + help = 'enable polyhedral optimization if possible [default: %default]') + opt.recurse('cl_dll dlls') opt.load('xcompile compiler_cxx compiler_c clang_compilation_database strip_on_install') if sys.platform == 'win32': - opt.load('msvc msdev') + opt.load('msvc msdev msvs') opt.load('reconfigure') @@ -43,7 +51,7 @@ def configure(conf): conf.env.SERVER_NAME = 'hl' conf.env.PREFIX = '' - conf.load('reconfigure') + conf.load('fwgslib reconfigure') conf.start_msg('Build type') if conf.options.BUILD_TYPE == None: @@ -56,7 +64,7 @@ def configure(conf): # -march=native should not be used if conf.options.BUILD_TYPE == 'fast': - Logs.warn('WARNING: \'fast\' build type should not be used in release builds') + Logs.warn('WARNING: \'fast\' build type should not be used in release builds') conf.env.VOICEMGR = conf.options.VOICEMGR conf.env.GOLDSRC = conf.options.GOLDSRC @@ -71,76 +79,131 @@ def configure(conf): conf.load('xcompile compiler_c compiler_cxx strip_on_install') if conf.env.DEST_OS == 'android': - conf.options.ALLOW64 = True conf.options.GOLDSRC = False conf.env.SERVER_NAME = 'server' # can't be any other name, until specified - # print(conf.options.ALLOW64) - - conf.env.BIT32_MANDATORY = not conf.options.ALLOW64 - conf.env.BIT32_ALLOW64 = conf.options.ALLOW64 - conf.load('force_32bit') - - if conf.env.DEST_SIZEOF_VOID_P == 4: - Logs.info('NOTE: will build game dlls for 32-bit target') + # We restrict 64-bit builds ONLY for Win/Linux/OSX running on Intel architecture + # Because compatibility with original GoldSrc + if conf.env.DEST_OS in ['win32', 'linux', 'darwin'] and conf.env.DEST_CPU in ['x86_64']: + conf.env.BIT32_ALLOW64 = conf.options.ALLOW64 + if not conf.env.BIT32_ALLOW64: + Logs.info('WARNING: will build engine for 32-bit target') else: - Logs.warn('WARNING: 64-bit game dlls may be unstable') + conf.env.BIT32_ALLOW64 = True + conf.env.BIT32_MANDATORY = not conf.env.BIT32_ALLOW64 + conf.load('force_32bit') linker_flags = { 'common': { - 'msvc': ['/DEBUG'], # always create PDB, doesn't affect result binaries - 'gcc': ['-Wl,--no-undefined'] + 'msvc': ['/DEBUG'], # always create PDB, doesn't affect result binaries + 'gcc': ['-Wl,--no-undefined'] }, 'sanitize': { - 'gcc': ['-fsanitize=undefined', '-fsanitize=address'], + 'clang': ['-fsanitize=undefined', '-fsanitize=address'], + 'gcc': ['-fsanitize=undefined', '-fsanitize=address'], } } compiler_c_cxx_flags = { 'common': { - 'msvc': ['/D_USING_V110_SDK71_', '/Zi', '/FS'], - 'clang': ['-g', '-gdwarf-2'], - 'gcc': ['-g', '-Werror=implicit-function-declaration', '-fdiagnostics-color=always'] + # disable thread-safe local static initialization for C++11 code, as it cause crashes on Windows XP + 'msvc': ['/D_USING_V110_SDK71_', '/Zi', '/FS', '/Zc:threadSafeInit-', '/MT'], + 'clang': ['-g', '-gdwarf-2', '-fvisibility=hidden'], + 'gcc': ['-g', '-fvisibility=hidden'] }, 'fast': { - 'msvc': ['/O2', '/Oy'], #todo: check /GL /LTCG - 'gcc': ['-Ofast', '-march=native', '-funsafe-math-optimizations', '-funsafe-loop-optimizations', '-fomit-frame-pointer'], + 'msvc': ['/O2', '/Oy'], #todo: check /GL /LTCG + 'gcc': ['-Ofast', '-march=native', '-funsafe-math-optimizations', '-funsafe-loop-optimizations', '-fomit-frame-pointer'], + 'clang': ['-Ofast', '-march=native'], 'default': ['-O3'] }, 'release': { - 'msvc': ['/O2'], + 'msvc': ['/O2'], 'default': ['-O3'] }, 'debug': { - 'msvc': ['/O1'], - 'gcc': ['-Og'], + 'msvc': ['/O1'], + 'gcc': ['-Og'], 'default': ['-O1'] }, 'sanitize': { - 'msvc': ['/Od', '/RTC1'], - 'gcc': ['-Og', '-fsanitize=undefined', '-fsanitize=address'], - 'default': ['-O1'] + 'msvc': ['/Od', '/RTC1'], + 'gcc': ['-Og', '-fsanitize=undefined', '-fsanitize=address'], + 'clang': ['-O0', '-fsanitize=undefined', '-fsanitize=address'], + 'default': ['-O0'] }, 'nooptimize': { - 'msvc': ['/Od'], + 'msvc': ['/Od'], 'default': ['-O0'] } } - conf.env.append_unique('CFLAGS', conf.get_flags_by_type( - compiler_c_cxx_flags, conf.options.BUILD_TYPE, conf.env.COMPILER_CC)) - conf.env.append_unique('CXXFLAGS', conf.get_flags_by_type( - compiler_c_cxx_flags, conf.options.BUILD_TYPE, conf.env.COMPILER_CC)) - conf.env.append_unique('LINKFLAGS', conf.get_flags_by_type( - linker_flags, conf.options.BUILD_TYPE, conf.env.COMPILER_CC)) + compiler_optional_flags = [ + '-fdiagnostics-color=always', + '-Werror=implicit-function-declaration', + '-Werror=int-conversion', + '-Werror=return-type', + '-Werror=parentheses', + '-Werror=vla', + '-Werror=tautological-compare', + '-Werror=duplicated-cond', + '-Werror=bool-compare', + '-Werror=bool-operation', + '-Wstrict-aliasing', + ] + + c_compiler_optional_flags = [ + '-Werror=implicit-int', + '-Werror=declaration-after-statement' + ] + + linkflags = conf.get_flags_by_type(linker_flags, conf.options.BUILD_TYPE, conf.env.COMPILER_CC) + cflags = conf.get_flags_by_type(compiler_c_cxx_flags, conf.options.BUILD_TYPE, conf.env.COMPILER_CC) + + # Here we don't differentiate C or C++ flags + if conf.options.LTO: + lto_cflags = { + 'msvc': ['/GL'], + 'gcc': ['-flto'], + 'clang': ['-flto'] + } + + lto_linkflags = { + 'msvc': ['/LTCG'], + 'gcc': ['-flto'], + 'clang': ['-flto'] + } + cflags += conf.get_flags_by_compiler(lto_cflags, conf.env.COMPILER_CC) + linkflags += conf.get_flags_by_compiler(lto_linkflags, conf.env.COMPILER_CC) + + if conf.options.POLLY: + polly_cflags = { + 'gcc': ['-fgraphite-identity'], + 'clang': ['-mllvm', '-polly'] + # msvc sosat :( + } + + cflags += conf.get_flags_by_compiler(polly_cflags, conf.env.COMPILER_CC) + + # And here C++ flags starts to be treated separately + cxxflags = list(cflags) + if conf.env.COMPILER_CC != 'msvc': + conf.check_cc(cflags=cflags, msg= 'Checking for required C flags') + conf.check_cxx(cxxflags=cflags, msg= 'Checking for required C++ flags') + + cflags += conf.filter_cflags(compiler_optional_flags + c_compiler_optional_flags, cflags) + cxxflags += conf.filter_cxxflags(compiler_optional_flags, cflags) + + conf.env.append_unique('CFLAGS', cflags) + conf.env.append_unique('CXXFLAGS', cxxflags) + conf.env.append_unique('LINKFLAGS', linkflags) if conf.env.COMPILER_CC == 'msvc': - conf.env.append_unique('DEFINES', ['_CRT_SECURE_NO_WARNINGS','_CRT_NONSTDC_NO_DEPRECATE']) + conf.define('_CRT_SECURE_NO_WARNINGS', 1) + conf.define('_CRT_NONSTDC_NO_DEPRECATE', 1) else: - conf.env.append_unique('DEFINES', ['stricmp=strcasecmp','strnicmp=strncasecmp','_LINUX','LINUX','_snprintf=snprintf','_vsnprintf=vsnprintf']) - cflags = ['-fvisibility=hidden','-Wno-write-strings'] - conf.env.append_unique('CFLAGS', cflags) - conf.env.append_unique('CXXFLAGS', cflags + ['-Wno-invalid-offsetof', '-fno-rtti', '-fno-exceptions']) + conf.env.append_unique('DEFINES', ['stricmp=strcasecmp', 'strnicmp=strncasecmp', '_snprintf=snprintf', '_vsnprintf=vsnprintf', '_LINUX', 'LINUX']) + conf.env.append_unique('CXXFLAGS', ['-Wno-invalid-offsetof', '-fno-rtti', '-fno-exceptions']) # strip lib from pattern if conf.env.DEST_OS in ['linux', 'darwin']: @@ -149,7 +212,7 @@ def configure(conf): if conf.env.cxxshlib_PATTERN.startswith('lib'): conf.env.cxxshlib_PATTERN = conf.env.cxxshlib_PATTERN[3:] - conf.env.append_unique('DEFINES', 'CLIENT_WEAPONS') + conf.define('CLIENT_WEAPONS', '1') conf.recurse('cl_dll dlls') From fbb5da7051ec0a93994a9efcb9b25c81eb04b935 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Fri, 11 Oct 2019 09:08:05 +0300 Subject: [PATCH 23/24] cl_dll: death: fix char signness --- cl_dll/death.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cl_dll/death.cpp b/cl_dll/death.cpp index b0667ec2..c6631f71 100644 --- a/cl_dll/death.cpp +++ b/cl_dll/death.cpp @@ -204,7 +204,7 @@ int CHudDeathNotice::MsgFunc_DeathMsg( const char *pszName, int iSize, void *pbu // Get the Victim's name const char *victim_name = ""; // If victim is -1, the killer killed a specific, non-player object (like a sentrygun) - if( ( (char)victim ) != -1 ) + if( ( (signed char)victim ) != -1 ) victim_name = g_PlayerInfoList[victim].name; if( !victim_name ) { @@ -219,7 +219,7 @@ int CHudDeathNotice::MsgFunc_DeathMsg( const char *pszName, int iSize, void *pbu } // Is it a non-player object kill? - if( ( (char)victim ) == -1 ) + if( ( (signed char)victim ) == -1 ) { rgDeathNoticeList[i].iNonPlayerKill = TRUE; From c2849e43cf5900c330b7e00b3198dac9ae3b3726 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Fri, 11 Oct 2019 10:05:07 +0300 Subject: [PATCH 24/24] waifulib: xcompile: fix including system includes --- scripts/waifulib/xcompile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/waifulib/xcompile.py b/scripts/waifulib/xcompile.py index fe9b0e27..a7818911 100644 --- a/scripts/waifulib/xcompile.py +++ b/scripts/waifulib/xcompile.py @@ -240,7 +240,7 @@ class Android: if self.is_host(): cflags += [ '--sysroot=%s/sysroot' % (self.gen_gcc_toolchain_path()), - '-I%s/usr/include/' % (self.sysroot()) + '-isystem', '%s/usr/include/' % (self.sysroot()) ] cflags += ['-I%s' % (self.system_stl()), '-DANDROID', '-D__ANDROID__']