From 0cd83dc1f3b7cca3ba5a28dd79da52451d50cb12 Mon Sep 17 00:00:00 2001 From: Peter Vingelmann Date: Fri, 16 Sep 2016 23:07:49 +0200 Subject: [PATCH 1/2] Add .astylerc, waf and related scripts --- .astylerc | 26 ++++++++ buildbot.py | 107 +++++++++++++++++++++++++++++++++ config.py | 73 +++++++++++++++++++++++ waf | 169 ++++++++++++++++++++++++++++++++++++++++++++++++++++ wscript | 51 ++++++++++++++++ 5 files changed, 426 insertions(+) create mode 100644 .astylerc create mode 100644 buildbot.py create mode 100644 config.py create mode 100755 waf create mode 100644 wscript diff --git a/.astylerc b/.astylerc new file mode 100644 index 0000000..9c1e19c --- /dev/null +++ b/.astylerc @@ -0,0 +1,26 @@ +# No backup files +--suffix=none + +--exclude="build" +--exclude="bundle_dependencies" +--ignore-exclude-errors-x + +--style=allman +--indent-namespaces +--pad-header +--unpad-paren +--convert-tabs +--indent=spaces=4 +--indent-preproc-block +--align-pointer=type +--align-reference=type +--attach-extern-c + +--keep-one-line-blocks +--keep-one-line-statements +--min-conditional-indent=0 +--max-instatement-indent=50 + +--max-code-length=80 +--break-after-logical +--lineend=linux \ No newline at end of file diff --git a/buildbot.py b/buildbot.py new file mode 100644 index 0000000..bb733e8 --- /dev/null +++ b/buildbot.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python +# encoding: utf-8 + +import os +import sys +import json +import subprocess + +project_name = 'astyle' + + +def run_command(args): + print("Running: {}".format(args)) + sys.stdout.flush() + subprocess.check_call(args) + + +def get_tool_options(properties): + options = [] + if 'tool_options' in properties: + # Make sure that the values are correctly comma separated + for key, value in properties['tool_options'].items(): + if value is None: + options += ['--{0}'.format(key)] + else: + options += ['--{0}={1}'.format(key, value)] + + return options + + +def configure(properties): + command = [sys.executable, 'waf'] + + if properties.get('build_distclean'): + command += ['distclean'] + + command += ['configure', '--git-protocol=git@'] + + if 'waf_bundle_path' in properties: + command += ['--bundle-path=' + properties['waf_bundle_path']] + + if 'dependency_project' in properties: + command += ['--{0}-use-checkout={1}'.format( + properties['dependency_project'], + properties['dependency_checkout'])] + + command += ["--cxx_mkspec={}".format(properties['cxx_mkspec'])] + command += get_tool_options(properties) + + run_command(command) + + +def build(properties): + command = [sys.executable, 'waf', 'build', '-v'] + run_command(command) + + +def run_tests(properties): + command = [sys.executable, 'waf', '-v', '--run_tests'] + run_cmd = None + + if properties.get('valgrind_run'): + run_cmd = 'valgrind --error-exitcode=1 %s' + + if run_cmd: + command += ["--run_cmd={}".format(run_cmd)] + + command += get_tool_options(properties) + + run_command(command) + + +def install(properties): + command = [sys.executable, 'waf', '-v', 'install'] + + if 'install_path' in properties: + command += ['--install_path={0}'.format(properties['install_path'])] + if properties.get('install_relative'): + command += ['--install_relative'] + + run_command(command) + + +def main(): + argv = sys.argv + + if len(argv) != 3: + print("Usage: {} ".format(argv[0])) + sys.exit(0) + + cmd = argv[1] + properties = json.loads(argv[2]) + + if cmd == 'configure': + configure(properties) + elif cmd == 'build': + build(properties) + elif cmd == 'run_tests': + run_tests(properties) + elif cmd == 'install': + install(properties) + else: + print("Unknown command: {}".format(cmd)) + + +if __name__ == '__main__': + main() diff --git a/config.py b/config.py new file mode 100644 index 0000000..7852b6f --- /dev/null +++ b/config.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python +# encoding: utf-8 + +import urllib2 +import traceback +import sys + +project_name = 'astyle' +project_dependencies = \ + [ + 'waf-tools', + ] + +# Importing a dynamically generated module +# Python recipe from http://code.activestate.com/recipes/82234 + + +def importCode(code, name, add_to_sys_modules=0): + """ + Import dynamically generated code as a module. code is the + object containing the code (a string, a file handle or an + actual compiled code object, same types as accepted by an + exec statement). The name is the name to give to the module, + and the final argument says whether to add it to sys.modules + or not. If it is added, a subsequent import statement using + name will return this module. If it is not added to sys.modules + import will try to load it in the normal fashion. + + import foo + + is equivalent to + + foofile = open("/path/to/foo.py") + foo = importCode(foofile,"foo",1) + + Returns a newly generated module. + """ + import imp + + module = imp.new_module(name) + + exec code in module.__dict__ + if add_to_sys_modules: + sys.modules[name] = module + + return module + + +if __name__ == '__main__': + print('Updating Smart Project Config Tool...') + + url = "https://raw.github.com/steinwurf/steinwurf-labs/" \ + "master/config_helper/config-impl.py" + + try: + # Fetch the code file from the given url + req = urllib2.Request(url) + response = urllib2.urlopen(req) + code = response.read() + print("Update complete. Code size: {}\n".format(len(code))) + try: + # Import the code string as a module + mod = importCode(code, "config_helper") + # Run the actual config tool from the dynamic module + mod.config_tool(project_dependencies) + except: + print("Unexpected error:") + print traceback.format_exc() + except Exception as e: + print("Could not fetch code file from:\n\t{}".format(url)) + print(e) + + raw_input('Press ENTER to exit...') diff --git a/waf b/waf new file mode 100755 index 0000000..7c34c5b --- /dev/null +++ b/waf @@ -0,0 +1,169 @@ +#!/usr/bin/env python +# encoding: ISO8859-1 +# Thomas Nagy, 2005-2015 + +""" +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +""" + +import os, sys, inspect + +VERSION="1.8.14" +REVISION="dd6a0444b96d03922dbbe97911d21774" +GIT="9625343f91810ffeb8b844f14f997daf44a91ff5" +INSTALL='' +C1='#-' +C2='#)' +C3='#&' +cwd = os.getcwd() +join = os.path.join + + +WAF='waf' +def b(x): + return x +if sys.hexversion>0x300000f: + WAF='waf3' + def b(x): + return x.encode() + +def err(m): + print(('\033[91mError: %s\033[0m' % m)) + sys.exit(1) + +def unpack_wafdir(dir, src): + f = open(src,'rb') + c = 'corrupt archive (%d)' + while 1: + line = f.readline() + if not line: err('run waf-light from a folder containing waflib') + if line == b('#==>\n'): + txt = f.readline() + if not txt: err(c % 1) + if f.readline() != b('#<==\n'): err(c % 2) + break + if not txt: err(c % 3) + txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r')).replace(b(C3), b('\x00')) + + import shutil, tarfile + try: shutil.rmtree(dir) + except OSError: pass + try: + for x in ('Tools', 'extras'): + os.makedirs(join(dir, 'waflib', x)) + except OSError: + err("Cannot unpack waf lib into %s\nMove waf in a writable directory" % dir) + + os.chdir(dir) + tmp = 't.bz2' + t = open(tmp,'wb') + try: t.write(txt) + finally: t.close() + + try: + t = tarfile.open(tmp) + except: + try: + os.system('bunzip2 t.bz2') + t = tarfile.open('t') + tmp = 't' + except: + os.chdir(cwd) + try: shutil.rmtree(dir) + except OSError: pass + err("Waf cannot be unpacked, check that bzip2 support is present") + + try: + for x in t: t.extract(x) + finally: + t.close() + + for x in ('Tools', 'extras'): + os.chmod(join('waflib',x), 493) + + if sys.hexversion<0x300000f: + sys.path = [join(dir, 'waflib')] + sys.path + import fixpy2 + fixpy2.fixdir(dir) + + os.remove(tmp) + os.chdir(cwd) + + try: dir = unicode(dir, 'mbcs') + except: pass + try: + from ctypes import windll + windll.kernel32.SetFileAttributesW(dir, 2) + except: + pass + +def test(dir): + try: + os.stat(join(dir, 'waflib')) + return os.path.abspath(dir) + except OSError: + pass + +def find_lib(): + src = os.path.abspath(inspect.getfile(inspect.getmodule(err))) + base, name = os.path.split(src) + + #devs use $WAFDIR + w=test(os.environ.get('WAFDIR', '')) + if w: return w + + #waf-light + if name.endswith('waf-light'): + w = test(base) + if w: return w + err('waf-light requires waflib -> export WAFDIR=/folder') + + dirname = '%s-%s-%s' % (WAF, VERSION, REVISION) + for i in (INSTALL,'/usr','/usr/local','/opt'): + w = test(i + '/lib/' + dirname) + if w: return w + + #waf-local + dir = join(base, (sys.platform != 'win32' and '.' or '') + dirname) + w = test(dir) + if w: return w + + #unpack + unpack_wafdir(dir, src) + return dir + +wafdir = find_lib() +sys.path.insert(0, wafdir) + +if __name__ == '__main__': + + from waflib import Scripting + Scripting.waf_entry_point(cwd, VERSION, wafdir) + +#==> +#BZh91AY&SY#-'Z`G`#&"@#&!((b|}}Ȁ#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&#&yKVܹﻗTˢ[{t]RJg}2|캕4YYO3ﯾ\{Jw4<7=wtwLwg<hlӯ[:#):NOzsֻ`n{wwϼ#&#&#&(m#&x`:C}x{O`#)6Τ#)TuBognμlshv([*E%{e@餔T)϶ncCM={;v]+ok^U>}yׯkݻnް=mt<>'&Vkf_[_w86#-UGUt;ng{=])n4nZ$Fs]ὴ+@ʨ$:9@.䪧^Kݓ=4Xs֐Oc l({{ƚޫ˾C:#-Tþ< oCܮ;wvqu[k{nc]nv;dۜwnmƚwf{g!mG͞0"iW#Ľϳv;^6;v_cӰݓ_sq{&kv9sX#&{{v{ܠ˝+\#& tmlST;l\كG9v.[ݽ÷=97h]k<1#& =T#&5Oxfumbo&_}#{c["#-4}ǯw8;XVr"T:o}vl{gm=:tx;-S͑3G5˦淎[W-맑Q^ٻ#-9v^<+UaU x_Euv^K(UA};h]YsY׺y{JG^qv\ު@נevPi[8lv=b0g(w9I#-nJ]Ǡn۹UAJ >;5݉;}Ӷ\n1IUEmZtڼFc['{qwz}{ili;d24g3k[se;W^]ݜަ#)}rb#)yuv'>5| F#&@ #& )Lz2H4F54̐JhM4hѪzFi4#&#&#&#&#&DAdi JSS*m4J=z=OH2#& #&#&#&I4`қLm$SFCMi#)4 #&#&#&#&B#& #&@4Ѝdjx=SM4Ѧ#&#&#&#&j"#&4F &J6=~#& #&#&U?7r_ULJCI2lZ{Z${'ڙ5d\[ÇDċ0R{hMD\bCZN*܀Pwe"gw91i[X#)]nrPu΋\ܤ#-)A{ ea!UNs!dMBE=t bRn7>"\` X⤔=9ZB^hR*Rؠ۱F{zY]J4}]"iRFG&]1Po.Q@J#)`.+e+q,W+_Zc?0LRd;c1"UȂ0 0Q%*2[gs4!DSS?I` - QUmrǮƔKe-;.DaMSQ5A(8HR z:A8C+wz)lgADInxŨ娙(gZXZ26]P ;ӓ) z}oъ0Q;5fAs˩&uaiw!}iJ27k뻣f: e.\܉xrELyKժ#)VCԸ2cܻPcExex\jm5}n#)zn(=m?T8* SULF4X10uJ:42*Μ #-BIMB#- (ƛrzm ۶!5%_DYx\C0jT5¨D׺c< \XZv]AI2U#N5GiRe8!g\N8aW'#)m;⥇zJaq!V Ãl 3JbBF7:QRC\Wjco,=W{'j8Wk0{4#JR%ч8 ߶Ebv}$b5&}:A~pJ20S$>M~'U/tMv:,vԃx#8BeFw#)_#x:ydzwgۚiK˄2j<25OHf#-Ym4Xڴ49kP%+Ώ_|3nr&鉕8BGu%2yZ#-GNR#=-`kW6u^ gOamIvP]>X!H$>t8/_}7$L#) \V#"q]k(N٦jB_2dX፱+tsþ,21):b{;gCѼivy֢a)"#)|xA M񏒵B_p ~!y9ڈA!& +M#)jdb9Й+aaHiSvMmVc#)5r.<" 79m{(Il*Hł6חDQɻu]f,AWw5n(# d^sIRw30,J*kii.g`?ytV튊pQ^qş6#-3V2EFURvYIL>LwvٷΊSº=X4*DQЩ>kG{u(~C'F GH(s]W:O=z`2ɁLHŧ*F.K#- 1R#)>͚7Cs#-)8vφ5)#-[=F.TN}T(5k٦6dzHf9I=#)כvT+g<چq ,LLT;p&Э߭)t O9Q1QI:d$Z!8]30"9:Dݩg_x.7KUD)LO3@"=/!UPXC4[ c猡\E0E=)6t@C,m-#-o`>)y\ȕ4ҍ4#fd] {?p<`u03!ӛѮ'x)A¹+ 'H{|\ivZ #-NQ*̧xuZ&MO w7aL `ő;r #!-gmQa©HNq%q7]W3f`!{GG5N?#)6BiT OTj#)_/䰾#-tTN#8wA'z(ug\:l(\.~.GtqH! $[Wy ԋvt9]}|v*V:e"{*W[b#-UZ7#&ت=6(`r!Vd|(+V*6+R$Y3*HPbQOf'>P܌8$A<;ex׊<¹F 7L&X+*n޺v2xv` /_0#)1?d#&|39Z#-rͰ4NL텂QJtu>>kZfG׷saY6(XVsY5grsU 99#908xغQfJ#""쾝.d<,ä-}=ڿ8u8}e8<u/tifjkb2|)]Rә@dA=^IQk#-d.ұEQ褡ϩPsC0T`b"tJBRp?)"W%I`q8Pe+̰u/A뵺j#="Y&]9m҈b`O׽5`LekEXOjlx"/jm!!6g+,gNHjFƻ7:,#P2qI JިQ>YCڼ|US1^pZaUEKZb(,7$د/[8=Ċ)tQ-ORcƃK95}4zv=9i'1B9GMM6tӼwly#-9ZƱm}kf=ZgD(AUMh&?+`!zl&#9q*}~XhWicվ=DTgzc|(.YJ4oZ%99eyQeX{`\uٲx(1zxԠ^Ad"Q(mىQZ(ZST Ti :5 Ed֢R.tDz^]R*睹;\\uNu_Q-iU_on=xѹ*g^|;ZU| 9w\Bk!F_#&SgF[Ys~q~<,2G*5wF:dyQ^I-'ҟA{&x*y"Z)5g3V*H򷺢'„Ɛ*#I*17HA92%{1فldn6,<9w9ҰBl/iP-wmm俗+PZ#-V(>/|ZzL]y~Kf4P읷l۾SfDD6TDZnY;[r13TKhrMOwh@Sèh]tj>7Ԥw|^㷎z{r3:ȚG_l#)z)df4ĵyXl9hNͤ+uK:l+8~yz5/,6@9ZTي8^ @g(j]Qß>/~m(vjO^DdjpO;~t%E(ғAQof>-=O-a-̃" .b^wt)mv"`-~ .s+0EH؆QٺkT#s|vq^iz4n+r|< R+C\cӺWy27c?"wl`krnJRP9tUk: @(#&g=IMF̄Vp1#Q^SE63y80\Qc3t|EBBR-mCXJz39HP+DOAx%q;ĐU0sǓϊ=+OMcϫs.Ԥ><M,{#&|ﱻ5m;#)8IP*A8!Xίok+!2[ S]w)4X"øyog{7@SoMP<>?̀P L܈XS`T袔-U$wX8sS!{ry~*G]8Qwz?'_edp߈#)BC#-v4Rwd #&#&H#&*l}GNa..k(m-6gi7#pP遑G?~w``\aX`=PΡ&#-CHOƲj }ݻW*Q XFw|r&Y]#-q},(,"0K_!ՀvS'YcJ]u.p'vܷ^bSq0^D|^PPrxe}"r,Ւ.$$.#-.:[y$|}70ivMG]ϗ35f 21#)iNzGOP J9x;29'}siiI'#)̾1.?uBse/}F:8Ե#&#-q#)tR^OZR?(C3#-=(=MzESWAC3秷|ftnɐcLS`* ?Գm>;b3oXɭ%7j$tz^Om9##)ŅSȖQޞ0wJ"0Tzd_ p?B,6nL2d=/w!mg6Bצӏv*iC,nv=[a{}09F~*}$MPg4T^eؙBEXG7.+N#) Tin+]\閸6A&HchĚ1jO:*ea>ƛQU X".J@Ez{gM8dfoHp̄& -bitNN'#)}zc{U0&#)Lp2w#&#&ɰB#&R>MT~Of1Ɗ݌a@5Ng]6Vޟs;L_[kROdv5/A{oԉ祹Ǣ܄vwٷ7\L\@YOfŕL[>+[#-t/Uߩ8X_GM۵;囧wgqW÷T xgKΟo^z=A[˖{QauNF:Iy%hP'spR64ǤN!uBTn!-bPYv j[:Kze Cvh1i_inn<܄#c>#-6h3qГo^|ztRQSO{WY~ K.aj҃0~߿g)"ɲZ!ϑAϳ;v5}f;haT$g%Usm|aHra-wMwj"ûv0ނgFkyq}Ǐha9"VYX!fFqpzƚ³T[J.$0|aRҏ~ bq-v0&EZD9Gkڣ䚮 O0; oUrYStFTDa$tna"UGvc|nn/f]mUh5E0i]*ꂝD\D@(ZwB4(oz4i!iHaڌahLMqd|y:M$dSFK]MMhjq}fHzxp)]%ٜ~#)7\?# h625ڡ9.rAVbST 43EHTXU3y+LxЮZWjPg"TVBZ(Nr:B&~^yGd/hA>\64y7M^Zo#&QL5*ke6,5a9͆oLD#-$@*!BE$׍c,t*ue;0}%p0DΓd#V(Z4TVDI#)F rэif49V@ Q dmU6DD]͊jP!a6qv!ID RT_3).F{̆,=CH;ȥ9`$d='nx X.8Q&RT`FES-QV}9 ߓKk'DFIUHFo#-6L5]r#ݝ oEeAq-[M&m^~;uXUrت+}[~|߃hh8Nѡ9j$x;Pexgf#)Ahabϲl}`=W0z?f5~cY'$A_. i,B$Ek)ړ4^"Db f3#-U6F"ogCתCWjYY9'k 6oq)eAK#!jw>D)#-3=䮝}O5񔮕'|2¦0բ>I:4n{ͺu_7hoU[@Y ϻnۛzn5g{m7G̿?'ɱ}{rWMˠBN⎜qL5öxT fH;w$7n;}0{>ᓀԪRpO=@E#&,w/6{&EtV9lOD+uzGX t8#fϥVXop_ٮߟE/ƙ@s8=ʊRrC r@HI@xMKWp4 DRNO5g6qGJJS M9I Y#-e:#-`pTYnt:oH7Ov#-DӉV]=_K10!_ҋMeՅ ZcRꄶ#&S}4Kb$! *k#-x]@+_:p)ֽo{y#-5iE2ԖOdĆlbTkZTm~nvH %2Z92/0͵rߣ>@ $qc&*h  3뾷4bQaW55zXo@u+bKZOD#&w&$ЈioܯW*eQ&Y 2ȡ)CؘC $00(0#&m``L(d'?ߏȘx#-PKixXaCD*#-[*4DH~9^(q颶i?b3Giڱkit5òa-#&@V(:ҊCb7}ǁm'eIz(:|.}AScE$]Vo{#-IU+Nfl#I@AB 0?dq:R*(lE%zx\0MyaY5EaP;҆nRR}Eo'Pxp<\#-0PaMn2w0+A}kj1r#Mt!9#);+}k:41uˆ~A5XQe9Ý?{z>Xb9#&6~vv龹~a2l%PJlC#&HQq`uUU|SQnAn8̐>1iSDqfmػºPmмWe\Fز]I^C#-z⑐]#&57CR qO qy1v!*YzRHsLKև+Xn@RufBґÉL &P'.Mb{Ӛ~qkr̦=1K_?_}S5ԝ9m&={qGGRyGFn$h8sqbx$|"NP){~7o8xTgo"D[rDA~o% ĭSVIOJr/lJU@D ia dV#-M07fVù~,0r=Rdц#-ތ9C?|}=Z7 W?4qwFڀPUU;|!v~ʹI,Ȕl-~_#)DֺZDZ"HEI)D\ LΆ؅/tPzl{ H&PA#&>D+*0}/G9o(0ts 骟^t~zsw]c@hCƷYX~NHϯF7kp8k.]:V5ka>,n{:c: ̡9֟1sG۪V.68aTKǛ`v}X=2~rwmua_rɷ:O<߳ߕR$iΖa1j\/vjlrcg7\"^1<)ͨuUzVaYv^to'׷| {h~Jf4Mc>yvpAcǽM6#)9:v6YT'-e#zp#Q`>}¨EY[`\AP;^O?O,ƾWui~D՘/QUM5qW6#-%歷@š- C(@=?z{ȌEm1-xg}kgBn|c[)P=!PtSM?*OZ@\-_&j#-v\]wqjQ;<[cU8~ пJiF7%phMs ?,,w.86Z)[fP\h>*Nv|Ϙ.s^vоn-=i ?+8h:|D]ͣ,r!t/=?AK}pwAG-Vd*}è{>};)%.z䞔eڟJU~PC4bL\^5~&^sl`^s'(#il0N֧ck.v1}P/IbCmv`|+\x;d&K=tWL=$F#-}KvV-[?pۜxz3HFܪ$ڡK$},U^jr^ZetMx$Q68( I+D[4l7鎎>&Rl¾#&0*#-hu[/=[f#);x0mp cK%CL<&p`&fo#-Ei7V>osJPiQL:_ҊP0pUs5uvXDUqZ|/[k6#ڵp13TvP(B["s;5g\S}z@,<;6-'MZhB7U!y{տqvĭE)*t]QC1O4N5-ư#)~_M!ep59rx#&sƆ)"@{vckT3ݜrsQ1B1tB8u#)S 8=wGs=!(F+ӀM(Wc~wI2ϧW'BȚbJ6aghEQ:bGh~.ü@]N4˻JWc.w*F\{7hyn]X{i/x7%y(xZ<2JRe"Hxh\x|#&8d#F(HTŨ˙+nBѴ3,Ehf K9EhRLq+D68dXH*҃*M`l魵 #)(ɕŬ@VƓaILE4MЅ!kRDmh-+fk,0,''phj6ОMX޳fCg@X~jc$+M5.hkQ`>cgBű#50D@f~:A:BPd*%#-8$șQ(b)p]Tӵ8<6YIT(8EZ7k _+)yD~!u|27粚E\+Q哄=~r#-cvl_!|8}ӷfn_tE{SH[Wapv,L !hU̙#i)w&? 7ؿ^|yy%hAy_|sp NJ9 ۻfi^~lc$lnG^PaXacW_ٯG~u~pG#~__'Ot"sWGۛ@BVvMPlR wԗ@u/-qhaØƎ +,Ri[Ҵpli%"MM#2)#&iA1Fʙm]r6M"F6ZbZeO4*ͩss[J\ޚSb#)Ĉ¥bi\3 c-iO#)b4!9^ԛ(=[yo::ys7N6'B4:ɼ(لࢎBF(#-B x%!q#RE(g\UvJh JT#)b k(5(iqDiL`RpH8o 8֑FQ&d]X$ICxK"%O`cQ[I#)FF&j*0Ƌ+:X`- edfg&ii^ #)F&=nޘ]&zq}H_@CeLG(iauaK菹;`l®SF6vgX\V%_l<{s#kV r8jr'3܍)Bw)@V^LYE*DY:'t,!9|DM\)z/Q!`D )_G}sJUpC1,:M:V8[=HET=EPutqu3F_b?>IP/ ܡM0#)P~ yqPUI$*<"qPla;~_.꽍gے"6.Z#).}fǏw.{8H{*SΪ_.p$\#).Pa!L0-X$IɉEªM ep5v$Ԥ"5t8~sQKoC0q9)хleX0V"6<2z9>lkǰri 8~$ &2U&Rz9#)yceآZŏө<h ,Fh#)ƭD0vU{I24Ht"[~uΓRt)w& BJ4>ϳ~Te%YUjъFHGb&+`yfA LkE]T- i{ϙ}kUN_sO (Q":fq%EC,Dpi Chd5F-ga0 O5+4ӑ\\+qGԎI]ՠ*0he#-4HB)8,;M $˂٠yU@QX,>&"i# #7#"3Dk]2VbdK896@C;>AԱ=hg:cXxEc@(53\3QB#-J%ej @֧zShثH7C؝V4XK#`' %BsגKtbiv* )YEPVRK0' j66Jv;uSTVu8KY!y45$Y(dhm5Sy*~-=I-uWu'H'@pQ#&i mOCePqvf|C_F.$zQtpIKH'SԈӐ$dHCY+:oh'X6fhk hi(CcKkiЈ;n#)I5*QkF-Tih Rans]pjŕχ=mb޼$<#-ս C.z=?pb~7J^||c⺗l{T}0!o@8r#aFo^yA"ҁHQLx6\q6AiA8t7ǥ֚$hȊД"oT)bWXZqLN+2Ter9q0F,n#-Xk8kfaj"3"3&`Y)03 H#mPD=B*0J-FṶ>y:U8!8L叾sx2wCArДC0\h9BtZZ5ƫM7u4/y԰9N-1AA#)ŐQB(Rn_mzVw_ETG?F#H׋m\Y6W+(IU*#se[1À`3PPkTM59WzMh̢Цd d¸۱dM)S,fLHˆ8Hǹ+#M˳$%ƥ:;5al.SI_D@56u{4CuplBLҘHIn}_5ΖC9h 6W5.m:0I%2d3P[8{ElanoŖ#A#)m ENqlk]+ uӂkP9G]j`[k{9tO#&Z7K97F3#)J4Sfsm1Cm&隥XjQ$keӦNq 'IljFcv8qordjPn2Ppug&i1a>#iߞxXЁ1z7'֌Ng&dz'/XќT­Ζ)Sbݵ/N>РĎEsl?G6_-bgxN"0J6jQo16S,<1JpomJy۱E}:?WsJHU$#ՇX33eb MG]MC354G+{\H9~RK:w~6~d`Wطm}ocA]ſ*\&LUI Ma-i?0u`%"تZ7vw:~&a 6&G Gspb1KVW!Qv3Bl{?~9r*U%@Է0">(#- ,CeUx-pf o#@p)=%Jm#- `$<[PjP ĪUtPY& ?bA!f˷03!{#)j1w4uDh*sfiM#&ʮ%KK;vpbdU>Pnql$fKvr9 AxUqnˢ cXxGjB#fv*P9vcbx#&n#&De4NR")0s$זmTV%F`;Bz85qt:$\=IT#)y##)䎻>Q~S;Qi<@޿EGIJZ>欞HbԿqL#)BgHzC؆"b2-6L[;.|D#)'{#`{<4,$:I3CihǗ^63ɬAgo"ZӳN\rD+5Sݣ)y5yHDb7}Xs-?dZ1gK߮!95.uSe8G6OAck4{OH:2W(q.T?*oDpo^&ËBמ^drL曠Zß[ jmt:pmٽ:c{$)y}l# Ȫٲ}-jxG!C#)[eg!FnygﹶgRk#-Á{[ʁ`dԳt3(mm#a_`S=3p݌r-Vi{%کths'r_sIieF);uGX#)pq(o*V۩w5D㎥JgW$ ո''/.HﮨʖFZ6cΩ{3YPnžOc'(ESq)/!uLXcSA-6qJ1;#)7]uR$;f*#)G3r%}sфmv`O#-*MJ$c.)5kfZԇe&b/Ǫq~2xc|zvFI}!^3)c>d;Տ,% x{vP[|7YӋ0qRG?Pvhn\8:Q'#-L(n9귆c@](ZFMAg#-f]B5C&oH/y#t!aQ/[$; 70dC{0h]zo<5 ۉ[ѭo"[}1:tNTMʶ}t> ,FB~'n`{4r n|(IqFTݸFd(`+<#&bpv+/gq1$6'xx9Ϋxzݾq-Zǩ]m=l"K^m"a=Y܃#)%%ieS68u^ÐR:v)#-C{pa uZ;DiJCR6E6$ƺMK'I?Yr_o+jlps4ޥR#eDWXYY˫fR=cZ?ᮄLqnDA\Eg:'0#);PVZ/2f}l7CgRe=5"^#?>wYF(~4-`pB1{8>'lG6euٝt"Es4[R=GJ tHq?Yq.1)zxˊ3$sۧ|puA!݈n$BdO[WT*fz#)#)2# eYJi#-h;^!#):ղQ'[Qt+.T<=conm\8C Xq}:Cߤ` ҈dqLjpg/dUc6xvc"[;oR7Beم4?NpqV.7jo5*z&:ΉK=kauUx/E}7uQazt=1Jit9/c~Rω9rNWr}ɧg|OC.Qf8$682A?Cbx4v#-49w\o#):_#1𦅍صOіSѭ$^/a 5fGVԅD.Z=!"lgK3g]mCX\`}ϪrR+0@@YXCngu|#)Wҽ7#zww߉#njL_dz&QDbTW.IBIi(NB4lc}3ڴHa`i+i#)>”% =63NRʇ50/,9RclsŸ#'7D7cd-ZsuAXUDs*w>{0ؤ5RPAL)Q(iPTrNܷB:#)W[{,n c>Y#P`D͙l\ig#-`"VȹgT:l9=΋~  T|1v K{N} ?Fw͞f(ޕUΎtٺc2-{=k:{rs$/ I#R|!SEFУ'ńgEp赓Y`ǝ6 !! FKI95W㞉tm3#-%t;-4j *Edgoj/Y;vEGm]i{W1ESϲ'FBѠZKV7C#-ڜ !Es( #)sjjrZڻj'#&=|=O>>9{mQY며vt6cs!y;t 9ihkA6`+;)jO(*Z>犥,CoW19uw*!T>2j68/^:6.QYXĊg=$YX<:5yu0\$k}k}y3ZRv;!6ASv~iNӎjƉPݷU>6z?NʭVSsꗂ¢6YxT\=fS0dd;g&:oS,>(iStz kZ%1 &$6sSm5x>w뻗]u}xsym'i%nD}oE#-צU">7=b]ڝ0^r(p ȩUwuc5@cмw'XbI8`ٽ%iFjƝsʁEi4N%tCeNyoۧR#-k<Y|yۍkS+1#)ɕv_#)OR^:7`8)y}3*aUB_#)g!Y@wB JV"4?FUAҲu(F yhnc#:ܩ#&TS#ikW@qfF[{w<}~kJǂ?q.5_"C֐s#;Š&#-%XH:{mGAT_ MCh% S-6&hwvmώOݞmrxI{Ƿ4yfG6jm{/?KmM\mC{R+p^in`I Q7#)aߜ:RR\VA:WCH 2w8p-f*y;^##)6ۇ֠2#-"U<+IVBszWK9:udvP;)u#.W&{=oWүtS oMm1]&(#&P CL[[W-z̕Y۾u vVvay%<4KfaI/J JHI9׬ بM0DWX;Zfl'ͭZX4}#&(-T"ܯm#),PZ#-^lx֟tp>ǿ7ROeMcGuuT@`UU\#-r~./~n|4]˩vyñ#-_AfEh5r֙p`A %.!d裻}/З<.%&8ns2S|Ѹx:c+,7;Ge߹*γ lKuN#+뗥v9:H<>=篛u\{Wiۧ\5c8tgħ3i}1IA! [&=@_LpIxhYw➾d?@c.=:ճxL6g5-e{ȴ[#-rXf*W+$#)"wGEv7rmF+VZQ6T)zܵokR/Ib}72;ukm>n]CI'[%Z#- ֡RqųCFfOU}OYkGҨ#0.u[zݺptΛcs_BʜG\#-:8pRg_6ǪD#-BAKĈEBGgWm0@æ#uya cf+$+4xN2lzcXc`hHT*uy^]y惲ik;|Í=JD#&>%K]7y-=7xDTd(bh4:y#-$#-w[h@Z^U՞d;ܼÃr H#(~DQ_)@AF;~;bIz>@&V^qp A;h/ɬ#-9% U$"p/seNFN=ʭ~K)gK#&nUfu;1=CM[#Ln!xSs y$炎òiR1a;~\^>.,1%UuQIjk[|v՞hS;&!Boa9@(ߋgNf'6q3`KJŢcIWmr,=RP#-'^L3IR4[~n&ơ[#-T&͟V>8@zmE O޺i1F Q)'IgJ`YgxhlIORmwqZ;p<.ƦVz \}pmfH6od  Hٵ#&bEc#)wnG`H`ao['#&4Jo&2MEe)WO"GJC^R#&!p!g8 !%m>,%>+`vXÙ-ܯU!oSUN|3$3"xGHqEOO=chg;@UVlBD&p;55U\J 6%hFJnM҈6ظnJE#-pYĵոˀjC@L1΁ₓH~ü:38\M`>g6CmƢ!DlU㶀O##)#)8UݥL=L/y͕\ZN!s PL`PA}Xz6sʊ!?LJ=mrVMEir,,*4fL礰FN5mnYظ,!EDf|#-`TQ&\Tf#- ӷ9]f#&#- z0s̒J#d~f!{LOIxmӵ}V^:8"DƔ<OJ=$H2t 㳺 ``i5VV=) ?_{zDpzQ&?_.q\"(؈7 #)Jw0ejQͽcndW1 gQr:ہx^8:܎H01MꦺGN]AML:DlX}p`qeKrқl HiA0`JGzӍo^xMd {.vtƑG>/״l+_/,=L#)=3AKu])۵ƪyJWbl(» ENٷ +zKs&PP@ISfz ,-!Ĉʼn0BӧCX:14nrVi?lԱEfsϕ KA cDcbM&ҽ %DŽ<-y3&"XyB1(,qcߧ>j;':]~=6הO㤫1A^&8MSi8""~NBu[_2d+ꐿ{N  uDFǖe58jbR+iP,S(~ў+,S#&z1g1s3{[;w_wr}VhCMV Y".#&*YUt I %@O`HM<.F9!pq#)` #Y'(䘤 |p۝hJPɷlS#>ךx6H60v̸8p>>_nYlw-5! (s (w`G ku/_o˧{6Q[tO&`4Po)|ɿYm)-<1+S-) wcYQ!hmuAtNZ?>t6/ .,Ic2)A+aթdP)Mx-f3}{4Ǎ|Ds1B,$ZA9Ն(m"t,D wL#)7({}:i)X9Xձ,ķ뷔Y.x#5̯фE|%!!t ?iZS.vhc>SJ#)_tɲ:O7Voao(vʶO/ʻq‘#-TiѢV2y+.6xj)4XwyH_5%  B6Q8$ҌkkM)֭)D@8D#)c&W1;39>AmPp{x#&0R-E!DF#F2('+yx}F*jҊ#<}|0bאA (k@-c2v*|"Q`<, $'#&E,Cq[ik~–xv4Xj9wى^.[Npf#lҷe'J˰1F#-UH8yTy' m\ֽ]OhwDYHDJ|I%?ȉ#&|#)}yO@SeQ#&A(IH&P EG$BCu[''J@䔷H<]Y0&p2K#-:4=N+vRmR%b?DAZ{ؖC#VB=;\ÛZ9^^ #-_@dGh3SH,>.cU"#ww}_ճG*=Ӳ{.S"Z॒@ '(d_x$EF7$(ٓgf]-?Ůla#$ p;0."24 B?Ѓ~vZ7}1N"i`tHS#&uWaİ8DD2`%н#K,R>ȠRi"dtT+%NE.fe VɄ"C"`J Oǂ !m~t(71'ت#)ڇШ.ިw(QyevX-<=;klZP#&6ajY*VVmۦ`_@KCm#1#)m)l-E@%_JBx0UqTI#-a=oڎ6ƜP&TH&N5'2g#)YuSr-5)r%_CVT"^GVNSפԮmԸO]5DjKo:F&|]C3CL i'*#jz}g#(:64=9P#-">(2 GxqtHWZujY7φdrP{MBK>fF{Pu,gn[7ю27$iEvm(ai:$kHY甤Dqo~ἑ3"C#ߒ~8) sሴ9Іwهnh3/uwD"$#--$U#)(%L4}ʈ}3A!gPv*09 v)ӸyKgWP!ύD2Q;~%JKd{'O"inZi铱zd9wa{!k >0O3U" "4?wR7^K#}rgy`^x$=(i8pRF-^_o\죌JfS0}*Mk~$!J|:]5Ǔ_Bm"g)A mzFDArz֕Ai#)k.,R)E#-#)I_I#)u ݪqύ{gnesDX@H_?3:8#)BzMa6H{|vٽr{t]ҵA{g1/ؕm}`B=maᬷ bB b@=E#F8wx3u_i]8tPwo2mGIpOւy!C[d(gfS8(6Gi\%δM'+țDt"tĞBDMY6N^wBXa#)ߝq7Gq屮m.#-L[$'f/M,Z=5IfI( `$jRP"v12lTS] lM"B"kC:[6T5zm*ݵUwu]20Js*ꧢ=OJ+ɬeYng\qg.Y؆q#&-Qg }_?-wXUD{dRT[;EF9O|z% reD[ey@S15?R;ݖ0lgN!J/_G^[ņuݧ3,&W5=YWG28}Q!g|ڂmNo+|`E#&/YI T`j0ڏx<χՖ7:%I7S 1D\Qm'~3۰uEg״k?+YmPf}r@#&#)_g߼#-?9cIb~#Qc{[~RlTTбڵvh#&y2wLok\̉#-!-詶tl3q^J*%O}p \#&>8# 8BfoOxyZU-n審Z¹rY+(3>_l?bq/SF'di|2#&Z$%#-kvMlj;?Zi!BG5n4+<9U\oY5ȑ⨡BgΡȤ~'eoD^mT y<6n(ǗO[PC`~=xaXcNbO0GB,1[vku"bYjh3aoMa!t#ۼ^;bb'!@'<Ѻ#-$G+=a1@?0(+m\yuʎհfd`M_R=@#&KuRid:s@;iIm4oק˻\VO+]7,,Va%W={$dO&;vjؿK.QTw4pۡy{GI'{6/w,J? ]B1u0yK'>}#)-qG3x$ݒmH5Ax8&o#2ڕ]{̮#-4-{]ke$#yiWe1c:Iz~B':ɤ5Pl6Zs@({COkβy"AKu)|yzM%<}{m,VJ&@$Y{w ^by!Ah ;>KrL{85=Kw7ڻSIpB[?<_ ۹dz%lKlDKsiڒs/NyqYکFeY-T9&6Z95J#KZՉIA:w/˿|̩#&v=R DXE[#-44֨~[zx>F u#)@j'~JU#&TERZǢtɧ9\{aT<':Mn {m)/ ;A_Vi ě2|4phx"ÒSXL|ch2`>Kr#N~!ęt_b<^\[B1#)B#)nxVlJOMzŁz&TlS1}H47圣0L(e9T'AeHOK>{tہ.nEf7LrXf2>,>ڟIѓ9;;3DK1#&[%P9TSA@f}kԐ`/e螧: wss|JPi;}_o#-=`k#-A#F"|x׬6nwQtu.=삈ʵ>F|tr;qqVJlj\)yDB}l=CއaplֻÕzr9ޔJRK)$)T\.n_H{YW#-3F܁P0U U#&P^/ª HWE\;93;dgDG-|po{ :H `B0yۄMI E#5rb)5<=bNĴc_am>X7LѽϥTp~~wؕGQSS:-:u>maz*ABSbX5~ 6E$#)3wxF&~鱐׻q͇Eh5fQpֳq6rGDldF^P~t t~roq;G*43"D\Nsd^E` RRv(p}I +Ww2U/7#-CPAg;#)eg@PuFk >c]By iC %J'˄vOlj9S,@Y׃$LHY%\<Ѐ{wkt8,QOb'u0M\KvZ H^=F*HN8ȕez7dAƛ+ƕgs[bXDMjm)t/"m% N0s /A;ݤH [F5X[cn3(ﳤRc*+Mӄ2ЏX*_dGǭ~y`og #+{#-r:ɌV02nȃ2I`x+TcL~evw߅U{)i%c''`S? -o1DA%»<9Y\PYYE0]N heL3nq4]:j#-܋;;dTNSuuzcp:FZ[8-GaD&XaVC\ ctL7?etwqm@=ǟT5zATFU~lg/L}TU j&r`qϦ4H9JMm ΈQ}nF~I$.\PNmMq 1}c&7"1$שA1a,1pЇRdjmI-#-2'O#)pƫ(WTV@=YGeUդT9׫ w]K%U5N]-R~I=yoO4>@CLMrYJG8%4DܳM1$mUB!+S~/[ BۧK{vΙ:]#-EJS#&u{ε(`#)UA.(9k`D*@ B]TkLSiw4#-(d#),=F[ !T5~2vkzg"F.TT@| M+\_h;n!YϿ{p~ߌ\]}HCCğ\%"m#)_瞰סP5g_/S2 X gf)+ug@5EV({Ħt,9n24`z*ɴ1AMh\0"\Vr4лQך)^#-Xh`5$/(4iÐ"8iF7r-~+!J (Ȍi3tP]bU͎%IGvZ>w6Ѓ!>}Zߺo-rĸF#)7:Sp"TP\.*vB%*T(g8z9: [R8/[9A9B",װuQ^JD3YTh55EQű^BM57x(`,ZpJ3U<\/S7M@#&.gZ:jm\$s'ZMpe_hT#-5ږ9%Vrm2$#oR8={Ύ<,<1_hkCamp2/ҟ}&>̛ os#)cˬ4b5T30Y:nrEM#)n*3gGVCw}z D/Ve?{3C!琳{].RcZrxy~}8>uC *+#-BZXk{8Pg?3^A{#)ނ~>qʆP Pt^]K(6fTNCh6g%ـٕp(l (ӥ#&"#-N۝'w&0[%%-y92T##&7b( AF(,UwfjB-2Q0 <)=[\Nt"5QY4)ڂl#=ABiSLril)ő(9z(K1Ln:6_ǿIIC ͞;di w#-v}#&aCuZ<\)rB^[,{EF4 VCJ{UU48ӘB+(TEE8n.#&WFGP|}q /G-T 5D ,W,t|&}:?e~Wu"VQUbqeFDċPP9b O@GóMj#)sq#&hT1ɀ=?"Y.|EB9>/ӃC7߿~J?1]R\inV8N&IWnNWߗdWĿ?8D~~Pg T(.{njF5 hp[OOk#&,?K#&X y%IYA#&&#)EUW?ˆHHCGjEjP#&?ˎOyu\hsR{5Xdk2rp9v 7hm;`0xo6Au*Ja>AUj6gI,4_9ukUJ]""9)n53;t<}jH'=.!0WZSJ;bSUYr=E>AxzyBq:yw#&j_q'V%7,q!lxx#&!?(wFH[1##&'B6fHR]2=d#-P_GܐV ?\\5IkO瞯ⴔnz{!NdNB8aь!?,A^__X0\$l :}ͫ?M/$ݬWHZ|Zzm&’a&'N-l N*gVr6e7ɢ ֌_ $N9h{=X.A~/lx'dy,Mݐ[\=\Y;DyBDw w9bϻ3{',]LLz\Qx4H C+ҁ-UdɡUHq% D!UB88w!)#)6fpr&MRNf#-"j!' Sܹ?'zI:IYVaURI!3Z%WWr.#=}f^#<{2223^:>l9k!L#/A<?Q >;!RZğKXJD8iOјkM9S_QL#{Ɲ^űx!"pK|˽#),/trɗdzQؽ$fetCbB@1A(°(ȱ]h[,u6#):_.eJ@ ,GvA64.CAK1J5W5t}І>4"*Sq?^BxYoAz 9`aC#-)˃FJ.'0;>”ƲtϜe#)!!̒`##-#-5S:-s}ax0>x&UR(͵Fڪh6ôy, ?O5z242=e0ņu!ÙÁڟsC'=!@ۡsꔤd)K)~q#&Ɔ$$Û溫[]^kzzk#'VjIL%q##&ǶCMMqY,<7EMJ"^&Vŗ*]VKRJB):f.ǀI(ڨ*̨i"xt$s65ӶO;4H #& %#&p<\[1ٹ^lj|=/ncߙc?h#)=^@θC꽵zusGo>}ru(KC!Z X8AvBDxl(}_,!< l BY$Ы711WzUD8pS%[]wyNRSBCx6(Yx7fu.r"9yȤ"zvUe< `CE·Ad€>_?2)"o\4HV$@RcLOo40k]TR#-Oyf8`PLxCt_"~K3@,#-|@JC4y c')֌w`>hu0TAڶo{JJZWw-G>?>;SĀ$֗ `~&#(r]lCfXha5Ϣ #-5Q#&~F8#3m68bCsn|Z "U;)L'Ygb-c#&E QKD<Ih?Iݷ F9Kt)+ <6=ƜûNA6U9o[6O!zXv࢓5hb)#&q^/ϔmVLjM:s!KD(;#-)V =7Թ!cKC=E|:PN~ǘcEb@uws_H vv]bS(>#~LZ';qݳ'}%faqh}FVbT܀]H\50!f_T 5L6F,_ }^#-'mJ5#+*A"EQ,`Yfn4'0UA=bPБE&0elC8V(Zw3>#"X 4]j+Db`jXF^$W FB#&EPlQL*!P8tMCVw`6<?j&lfxx_#4(G")boU(ae: ?jd>ZJ#-$YAi`3_~~:`>pPC2B9T($ZL55|}uڹkj#-h #lw^xl)%,b :p{㷯)`twJf]'H b=a6r#)#&ahNA]S*bB)PHfg]$2#-DN\ҎJXZO%P6 ̨]8t] !ircjAͳru>( \`3hf=]VT7@ICm(v+pcszInv>ށ yrJ5{T!=5p,PfELm7ʩJUDe@oa$Jms8>T O#&-th>lUa$#$,X0f򡁩F 00 =o#)j3@d d`n|xQH}m#+c4J LQju l_X oG~D *y Kl#<ى3ThQD&"?LL6hrw_#r'0ۿRW3P&i]8z/L{_٥-)Få=".Ӆr_g. +Ū9 |uRP#-guvhL}}OM?*I[PRXo޺{v^m3G_>СGEBȊ;@^wdci$)#&j#)r%Z K@#-;?j?#&=@#-s~(J#-8s{:{#-(G?AM[0T(O&׊&w')|AcF#-$DQÌj<։#-)rI:}Zqg39-b"L#-OYcftLTj7])9;xn[ى@ʢ1#-J4HAij+BN(O&=l({la=#)߉== YQ?Ẹb̏/YeF \pLDr.Tnm\{bs%Dd[i#)I:0vN}^1JY#Dda6X_ʸ_$E@,R)H("TGgglm#&]dƄ`~'ϻCfvkhiةd[`pzXW=nm`C)JWQm_YC0q'\p"^]ޓ?סN%%]l#-%Zo.q2ၔC:#)1o#)42cXDVH#-h #-2$@4$ŅW׌Uŷ+k]RM#&3#)Ť1IjB= $F4a!Pkŋ.UDI#&#A$_-k\A.[/|$ndw`vbh"vyu9@Y`u9 #) O+IiQJgr&_~%T#&2R9G"Y.Jv˴sOc*_N~ד-dDgaUlZӵ#&OW%TXirjvvY ; u#-2O$@H$IVa[bX¸vw&=U-b*mOMگ#-LQX\? P5G w|)h<z"P-*?r~f[۹5 B/%ńWYۛ4+}L0 eQF4&r&E#-}Q`9HC;0Wz S7mq_1[#(I'@ES㹒%5uv=xlqk 0tXw5}Y2qPe!hx/!;Z%&SœDj1DC*L1ɺwnm<ֻ&iF>mgWjoٗwΗJ9Ss0_ItַbEZ4ިNyn{|Tcw#&Vh/L.n`U| xQF6^&0F}o~3h^7^QMv?(_bp}w#-Ø`_9HH}wU+̾EYVMɲu;PO'xgKMSJ9D|׶bQ9Ap}αRT,>B9}e,YL;~|%'xv~3I x\[#)ӳUw|TxqegRjzpdʖ/vwndjMFchjR`"˥\yyhru0M#-xXd+~#-&Rպݿ^^~zt؁U8_P&(%}Uj: ECwnesv[:N54RzȩWd?TMX4V;Ƃ:),RvfQ[FۗO\[" X}kco3{ "_X+%:\cgt :9)BTE2vpn?wA֩k(qowN},P8p2+gyY٥0A!q~@@S腝U#ݦ$վim_F@@n^VDA-#-w{lFҞU0!ez[3~}Gh` Aj8My6- (E/k +Ly#)t?o7HoZus/k^z)vNZ՚2NN~@C]b D8cB#-GCR*#-AnU;ar [R%(3d"(qA0!#)<8#)&>x"X_]_JX[" dLahOk+ÿ6!B>=SQd*8#}.I\~/u@#-fCG%{#ԹQ?^t%S?/>؟Qg?{߬ǁP+T/g| $$HT@v>4yo44ra{ƄA AijS>_Q?HO烰~eyꪭu0`? }c7DV2#)oI#&m<SBHl aE`!HIBayհ{OELju \ $z'$^Mz 4ă^༗OC:I4Y*SА= Îe %Ux4r_PnW/A!@X%hcNgyUQyJI6%TGl9s B5Jn#-!Ez~g~,mHJFa;f(4{F,== xeDP̵,&U#-DR O #bU9FeGxFb17Pk+ 4(000jҦCAvI&#-kq2#&S#)\]RmA=^ʶu^Ŏa9iT6f'GRofXw+!:j$)ӫ7KZ~0=9gHLc0CKD9P(so$it,jh4#){$07<{Z$y)U2@a6iAs{FluչT܅_b!'N2vh u{B˒(,I!lko>aDrR^ '|&f@8\m XĂzaA;70rߴu"q+[yR%U|Q5$3,z rv~ ӓԗ;y.&Ck{rq&ނnΙ~Bρ:=^<תlfZZM#9`ʗ[+EQʎgYܶ$$ۏcocBJdTE#)d4zhbΡ$HpMMO&{#&D:XYa'#\4>gB!48(Ҋ"8؏I$; C[3BQ!#%7AnF`ß6<*4D;pGcQrM Z =;V0Ll4{9K4Bu 1Tv/Btr33=!lkW1Q]#&MUNa궦jF`R4-#}Iwyh6p G1%AHj[IOhάш#)g|eg/&SWfRi)oVgg{ySr:Tiվ_~UHeͦA.("Ȃ#-Bu%1TU4#)!DnQ?=zŨR M=WA-gog# NTj.3Q`"]#CQ@hA{Ҫg1/uн}?$ޅg. h`M A X@M#&H6#-fhV-%bJM$Ib[~4~L&?#@|BaTؠ%;ì¡TO\M!#)ɬXJf\?3(:L^yzیųH1$,d1骒g L4 6*B|>>Ktc dA6xuȜʤlSD) Ab@`1Wft>j|- Y6t3e.37\R-;{COeQ(#-xx"5`\.$(FcmFEJ$5FٶSl6ضKm#))*Ե#8gr#-8mAd ȃ tz)+A#&PU.ދ!!0((!_ bxe#-fG 4#-ę#itP:@T.e@T-VK{[6v=ӎ :,#)|U_u xUi4d=#-8QhDL6ZEW-Q@0AQPw#&BrNrFtޑ*ҥ)SU!'Jh֚G0USn@!8#&]N H` %2rY+JfƓE4mtٓ>YWH90U$@s|#&:_7X۽i|f\"o"r][ Ey)8B#9I׳OxD ܄ 8=C*H"${0%&XSk%q#&T*7b#-)L C$Usu|Af XGVJ*H/74Q6vڭ@#-DS 薽U1Vpm-VN}g:I<`i8AJ=BR78o|W2/pl:-jQ_ǥL6bn#)bD3s ZpH0i:~;RHH#&'x,6}K#)*e?Ho@W끯 x;W{[أvô* y6lG`#- lFn"O^CRN#-iLR㟛яccLߎB\4Ǩ*{:Ȳ!PIj`m2& #)5@cXFUn/⢡1m=57H p񂐁TL=jXP<flBFF&Jeq0G#)o+1 {A#&g_Qkoݮv#-9҃Yuu8SUEJŗJӰǨMWu[X=~8S1C(6f2|;vߣDAt#~/ m"fj7@!sYc?>Ӓh(HZ[=LY=+;J B=V,#& I8\ݏ:B=1[V#)#&dVL@}Q2 MZQ)H!Bd} 0uT4^Ϛ_~>MIks72/Ro| 0{|.7ƍ~q837JȞh DXvt5'Y{?F#- F rcỳBo2WgheZ? R[mCZ3DIțV/AΠ4j>5܎LgV nZsCO+*>O:ZK4FdB)EM#4ݜ b=f BKtӐ*Ri)Z!6IR<*b&PA7"u Q6/s #0#)ulh<.<Hl6mFy[خ;_1w#&h`<3B<&Xb~!v߱c}2qǹ#)O4' r5I``=w͂;xק.hڋyu^7w$vLBzÉ `qܕ*USM0˰wipLQW0AU)AX_gz@.`b^$/ܯ|ϯYʶ&]|r(9wbώw=>{;;8!#)屸w}⦾@ jFB*)ZP{UMHS# 8k$ [TzˍW%˖UŐ6ӓ 'B!"Sټ0`C~D6!=ebdZFklYJM]-;f;5ȳuxHrץם0.sÇR!ˇqA@#&8FHFFG-u {&j5sYkm\;)B#-{ʅK<2#Q6lL%tR;k_musޫehJPJC=gYxCdxQh3v C?) #&^JXS dO$ >wBÚHC\Цl  D >H5N.gw+^^[Tf09.\edQA#)y*P{ߎi|k\n(gdIZ6%(&آ.:W F'b>a`)nGZ z!. bTvP)Y"se+ύgCC*@s 07Q*#-A6u#-Am8Ĉ1#&Fe0A#--1f&y0mFz3@BQ@< )#&XB\5[4W7vTsF/oZZJ1#&aSmxN \n QY!f@ו#-iAe6EuC&`0SBns{(3/ZK\KHM8=`>#)8R`<3896pXl̓z2;@p$c `b̭w# 456,P? ̰ ʃ\Q"Eȁ DvxSB.9DR׮m8_qc@=#)c}=2(h^!۱,]~XަfRg#)v9<Mv#-+-ayDi[`| aofZ)Iȫ&X2'RVM-osJݱՆ `tP|¡4RBV%8G]MÏyI +v(jiwq8(`(IJM.E`hȹQt.C[UJ#)b&t\ q2#$F9fM#-YFCzX)EHFBw A$#-5#-"4zrUSe9ǖqeAd "+GQM;Gɪ=2M;e70r1%Db~fڍ}>Bڵ9y;d0"2C!=%̄U").g2֍mWJȀ! "Z* Ȃ  K6=#&Wxbj ,,_]@~aA#-d]sL>SKs$=_ 8C,R=IYbۑ+of 4czKg0Xop.bwJ*';cÁ8bG wC΍3 fyfL,&,%f3W~nbDw"O8q| etzJfDl1УX U1-H #)br#&G1 "0Ei5Ve"1;+n[j))C_&&|DUh(J1&G^D7g&LĴM%H};~|54Nr-c#& #-FXOu=<~)Gm(K$,1 78~^*oL=mt0m#&@uPcTVd@ E>Оϥ%:!ͣ:qb".ѱ#)\M-z,mt&)əgg %]ۧeP4tMg3a.cZ<=z:3rpm2o@~M 4&qM#)ףY`a&P/M?:>mvt>tć1;=9᪢}VxI6^#)e5tvv5k]orL7_Hg0V A; iH[a|Mfm$͖Z,))u v3{"gwItp}{Dף^v~BK'ůwsM:NHFu;ϖ=_e_E3ؖ;|꼴/*Ow_2U(R|ZAX Cs#gw`feX rСt0۳pIOAOT)7b$7Z*V`kӲ] o|](Ly>CDtf ӅciT, `ES^c 8Bû].y)yr`⋗Ǽ#1,Ymary51-)lRڕJ<{ӥ1bsLDӤ4KB';^|ހ-`a;N/PwS|\.*c,#-)a52hy[һ8rQp|ILmwfLK;v٧IAq@͘kE.c;K-̘qA¢Gk5zP@iX6Q#VXͳu#&Dv6S튄X'DS[B QB#)#)6)>|@]^o۪`IfV'VzY*98l!=AIɣ#&2{lkDaQHiFԍJuCÚ-˴Aq#)aCCh]'wmQ^3ALl&Fa7P8)1h'f~G.nB"vڰDՖ[P#-3;Jun\\Zp1ENqM%*0lIPp#)#)VnMJ(HYkGAHB#-ق@]g#-1Njv0~C/uvpKCTXj8t4]hdB2%Ƞho2%Y `vݣ`;`P6 P݅pbj:"i3\ݺ](;.44 7\+Zx#&>@HcHD(({!""h/Z nP > 5g{AM‚E$vkFFNQkYk`2:U)#&t$4,J%fRjyy݁f% P#&R촿^>LFO>+;Zk-'}Rpкŗ7]}9٢dB,[iu Vl Ü9mx ,Kj20]0H@qlԇE#)@f3@>[Հ7R&r\H [iQ#&.4(d1$!#&3P#-l s)}I5CGHCVNg/^B@ո6w N>nRaD]`i1-Ť!P̹Imya"*l<;JIBgbo7(o^1ˑ9Ǎ.LS#H8 E͉5.3n>(ٟ8ds3XŶ鞄M;0d@c%0 iv%/#&A^Mvd6 c.ؔFz# Ti:Ds%U#C 494C`~,GPW󅊖ڢ#)匁MO9m)(RVTDZfj"ŴYU}<4EDJ{uwIdKۿ qK1L>#-r0QA:4$cyD0D/*S|2q2$D<}i?0 iAObb(B$f#-[HU#&ٮjaa2'U#-dk*ЛA(GFs$@@bu.h2s(_m'ZA l`#UHlV Q{_p3Ĺیc A7޼Pz'-#)\Gb7λ#&k*3%b by+jeq*WqtQYdKM+ff2*bX]uS^WO\k(ic#&m$cAL9>'o|hܢHV(cbt un7Z"2#-T?TQ}C|EtASH s*v/*VvT$#-B!f0R6M;iJw{Dsk݊V4 ފCA4l]dM-,!?Ӡ:C:$¥ ʬ,&p]MsnmxRԊCJ 'L˻2qZ` #&0{d9,k#54|<Ƞ0L0fH\bHMU25mJm6ȲRCӦ=UZI#-rXP$[ASoc 7)r!po0RuJ=UlM+HP7rΚv1FLɕT)%#-MvaѪMk98E ai,fA$8;KMS 4ZQ#-nf-IOXQc H1M:y*ڜi.a!ؤ,2ѓ)b4!D@ m 4X#L#-~]-|wr\!p(ș8r>S`TQhhK0'jo|.6ަ9|ǹӾÙgy }xMD1ty.Ġ;0r`B}_MMKK#)sC&~~.A\T#&ab( Ő·V($)#& 1I LԄa F#) eIy#)u5TIg04@pP}#jUk&joAQ1V{K.ʧ;^:LvNLue(]*#)vJ~KHP39Mh#Ý@(M2[iP֚f[-)1[m%8A !F?z7v,~5(/>NzIa6Gg@_x2{`TЂ# EӆCZ荦W Sse]k{PTp`d\9!#&pb*MD"CA}'Y[Z@^9 fr+ 2E ) DG!]g:vH^*oʼ. ,4g?',!rI[0MzlKөlmFƴK(WU7msA55ymh-jDbS,iMc0cV$]a55$ȩ5jch⊕+Y]۵آ#d,1SIEMWku_'&Ji%H6*MbҵovQajRjM&Yib`fT-VUDFx5WO;KT5Wk5IYl%m Vm+*k<׍!K#&~´.qW/⧷ψ}4ݚL!xEDZOX9#-s0̤QDd% &:efҢhSMiRUMK mHDZ̭[tղ[)DZKFP Z+mQ&B mTҒ>BDUmTlkil@-%%զ!Flڴ*elJhIllEmbm0PR*LL6D[Y*MMEM!44RDM#eZi2*ҦTZe*D2IJLFI4Rͪ[&mA#TRⶻljY4KJXe6^Si,} Z*RJjU{yWբMW+j  2ehyC`Kv卶Y .=nmvݸ@[,.xm^n<#-)DO#)cZK(X(݃Ǥ UDyc Xw-+mulXf<ٴC%̢DaWTIp4a`쾰BiődY#&F3ui"" &bT40[#&h!vy͎ftح#<>CAJy4ڼ(A~&E.xJݓ2O]jbu:wܬC%O#)"$.?7i=x`\LvJ0*RȣD:pu&dY$gL!XC@Sq6#-aҊWQd{9Q|wvQҗ)gަK8>_+LѝN#yD/#-4m/շm.,T9q˸=8#&*Q6Bq8z+#)`STBgg3>4<`Bu=V#&lp)GXlGVeӌj5k9ChazzEG58yi"k١{#g#):HY:W0,Avd =%*6(,R:,G91QalWŮC˽ܿ})2*ˀ}%"3(!ҲlC$b(r( *#rT?5+45kZ8,ԁi0#JVhuj8mcE*&n#-9@#)#)۹I_W΀#obd$Bd,B;BӐ]cC@49{FU)0)hG4# ͞z>\M62a~Chc"bްy1;#-EB@X7$BgQ&!2@g3@|nzMɿ7Wҳ*I'uGYJqMZwX<[#) xic^ i8. ϗ9Wޅwǿ7.<Ww=X\Rd_Ja@i5RIA-'?& rIhXNY%&k 3`c_B#-q&nZB#) R|vX՞]k{F,v "br#dAFM#)TT;"h"Gf&LQ[zͭ:`1`1*4#-G"( -#L#-$\_Uqv=X :Œ ") ZM*:)_7F*ݡ#A#;R7(-Aeq3L<`#)&#)&HȲXɅ #j*4*ce`@2#i,kp)]ļD+:pn[&CШAK B=hW$^LTchu@5EP#^YΓe`dgƩvgn,Bn˷$ >B5kݞm#)$6aN$XU8zfrY9^Dt? _U펒aLC}-/K I3 ÀSV&_GOP@ߦ&>O90{` oՈMGucLBz|Q,x/ -{}JZDaD"`TR kjh#&f( #&h#&#)m1вo`ڂ`l`\*e" B#-0ztI=g~w;1xBS "oO;h lvr+O=B )-}7cx!ߚqFP?DAeiFԶVks[|lQu]SQ{R=E/a;X H >?juq[#-B#-#-CQxkEsX**Twp%0J#-B#&)YKOQH4Pèi.0˜!JQ8ta?#Xj,cm@ᐴ!Ljˢ,[ndP傁FKnB˔1EL[VRBI-YݪX>- z^kimCy a]b#)tH4wUW#)rɯfɩ eQlh#)dI#)A@6(1T[e2.\`Ti-CfKe\*7e(L]R(%F5Ai6-88X#)R##)dӁfs x0R }a#)6iUiwf n81blDׁlm ݶ#&p&\OPCE@O)dуU87^_KħMRf2UoUyݯ.(i#)ՉdqVyGEx5#-O#)0ƣ#&:θk%h[ͪ+ήI+F.V۩QV#mk&5TE #&Z*&"QH;G76"Q)$]ctz(Y0kru4\MSӘbdEQ#&?`#-[i#Pe@ԣ#-R$ ꯯u%ED5t$8!qC()#-H|謝]U髚y%4Z62$@Zd: F&lkY5tTT6ԭ3C3D㭻J4’iJԕZ2ϋmDH+]jٍ$WM,B\-C Q 1f#)2d"c'%IhF[fl%JlSD#&,C#)NջD,ؾ\dK3#ؤd!$T6`>z{&FشLc#-PAW}r*DaJ#-rt9`KX|zcFU45LwgxL9E1αI ^43 F EP]*IWRX$\DG`$b4*0rF*Qr`w,NDI?8}^2=m|oQhy Ƅ 2 "# v7ďc#׍;[Rt({ kDT"~Újl٨^vl#)b`hf2w2x#-zlrYp0He|c5ݩͿD[yvv_vcxvk\hyLZnk]FkK#&ښ O}ynWZ-"F%DMTecjMMؒeLԳvMjfU6dFE3$Ԇjk2"m[,IU,ZYZ%cFXւVmaHfV(@U#P'O[$"h %#-$kmvsm6Zͫ\[oVͷΚ~hFl2 H'` 6n\o强t(%P0<(rd#&BI┆-7m.rw` m4Bj.ϧ\ g榾2}#)l&"NKa7I{DwC]S B#$=qzMEȨn{I6n#)NL'Ő07uaۆm(1QQ*ZR{QL}ݶώb.45BώlfhM'nKй2;SxYeXhT`p|tǒ喋[T-Ȁ#-k5`j>٬SQˉ(i>JIYGXYehE<!qx8|pEg7 %vvrW\\W9)D#-4I62l#)2: oٓ9<@( 0P)Hgiyj7 Ln\BgLRS*ٙBTiKWW&fS5x%|cVN}v?y"6|ս/aGԘA89-SaB#~(Reul2gC$^&.B{ )pX3AsDFQr4`m0Xu0 |AB(Ăm$QZ b5,ݷYU[S9vM*۪ѮR&յ3XIɌxN'J~JF/.f#b,G%k"mp22EH{OQϐD`~s؛DfNVѩ#)-E\-HŹ#-uV*Ö yU:K!e(B-҃o}w e 2.W#)plredz7l`^c=-4=[|~.]P9۰<+|ogil2)NŊҏ/sb)?+#)CJL8՘ *@4>?#-u}W/|8LM}M bV6A䘒،CQ baxս' ]R$mnABCSST&8\8rvFwd#-IvwgwP~$ccudJ6 |}a}r.jy8}8c8͠gX"ӝ!FKᑡm`vЪAY0!jk{#cGzVzfH57nF~:X7uY[հY3hQCeS<b"@jdL(Ge3< uǘ d/lxFPpD~>6䡣͉apir#)gx7Fw qٶ/(ќEDWvCX4,xpkV[pJFS  $S*$! =7xDB8Ij*DիŶUT[TmT`(6BD2v8}a#)b90-# 2ڎ# tф^~S8]~\I-ds+sf4UzA~N Lú'#&RTj#&J)yShyCAl/ "!c( '2&)m膭jyoqd7slÞb1yeEn)6|h#)˭rƗޠ݃`6ZM4߷{m8%AD!:wCvÈk{J$ Rjh:}{WgJα͊dHkIQD*'\ 6$dL=M  "% AZ*7k1'-hY*nR'}dRʑ#P#)xo=jGح *iAFBlC},ղ~s&"=_V1vNpCn*a!gz=f)Z?{⦢RBfbA@nt'#&LuQ^7\vc(76v`W[OF]yW5ܧ\uU5KV\Iii{c$MDX#)s+XȨQ@wU,V/;L)0)"\X~?h#&e2D"lfl `ᩍ;yFz4.Km=[F5h8֐̠"$Q z"&2آ 1]Wu"4C_}PH$$`SiĊڳ*HۻeL5.tMJQ[nYIƥ #-1i"@ymYg^Me1IұiXMPI5إ0JZo]ǬfL뻻\v[^ .蹚 $T2%FB3h^_;ݱe]̸!6U:FfB`h#)"IYH\)a[r#)IƂKjʡF 4lQ-ƕƁ0I a4 n)-4qW!o-2$'޻vy|/kzԆ-I/mmVyk2##)<ӧ I,nm% @ȂDVs$J#-LF* 0kHD±RJu*F`[K#)DF0#)aVk&X-#Laaeͤpb\dm2XcT J4 nrgg^#) aTbGdMSub5a>!#)F-lV#-T (b2A/D h-yy;)ɡײ=MFuW-9(/`7Q|WTZ3JYbLsb z6UWle-Ax Bz5b#-7o:+3nXMD:,Dm#),g)M,l"s9I^GviZd|{no܂#](H#-vkpQ)\gs#)o3zF }:D.|f$늷^88þ'#-OC5b,Ut @<*b޾27IBq'5=t/;i8`}ᕠKTjg>@;+-;^~~=_J,#h Ux$0668 > &B0 DPMN6ƜlCLWAWK&٭mXm;حmnU΢37uWW4!ceKsNVTab#҃@5F"PeF`ZI `V"+Tm锌!;U)guh ƒ#-BJ]U6mvŲ^BH@U,6dH2D%Ky2&km!AEz&pbDJP"oej+Eb_uHBV2S)Mkm--*)6T%$5*(IC")#- Ps>yC㑒v|` .I $@ȝCviޘnW(GTzge#&$Q lm[j[kn؉X<Ě)6vٱXY+wWiMmezkB!! JECmc @RO"P#-d9hdH 9fMhEUA@͠Ty-(:E ˽]tÛ Cb(=Z6ܣ#ٔyX}ȣ@@>,auC٘9oʤc#&1%@hi#-fV{et$I4у?ۺ}rmr<,a}á+G@ wb"=4q^N#m.5J8t%h(NΏN`p{8͜=B")Wju&ݥ KUcߡ|1V[LMns0Pa;*?2t:'a}#-J#&Ivw8p7'_Pe)M vs 4#-RQHh/~Kkbm-Tƨ}iT4CV@/ּU&wQXլmTK0>x<Î~LQqC#&@f#&+A{v QGTLDDB x6"*A)DL|D`*?fdЈ%!z[U-U2*VAiBԅ$$dai#K2(P.ڗv=hiLS5jn6#-b,"J Š!PD 4U@Xf!QK`кyCwrI( 1Jy?^sxclFYD[TkPO;Z$d˝e>'7g$ьc#toߧ|4@;:@E^$QF *A ~z~l] >>&ǒo(=UF}.pA$>ˤl&4y;3a|~|Ӷ ~r4g-ՕȨ"sV4ijZ툩#)IZBj$>s #&Sȧ∛^<ϓU#)\luB؆U-&W=a0DKTH];NR pB*Wg4e%?RoAĕjLۜMw0#)HۖS4ʉO"x}<7HTq#&<#&?-ӣ#-dEAB*=t4E`A" X꬀r0{)v?|f7(1OKOhަ@C^~d?_'~X HSR;QzU}[ȡ>@ A;9y~{ʨ}r DQFj~Wq~UHS~ϨN6oʱԱlD#-w@u;ml+ΒS1#-WWkLCL:mw>nf?b\ۮ>AhZTAHx}BКZAZa3ͣ<#&s{rռSS2fY@!Hx,W?A}hA#)&]/;/kiUQwxJpIɚ:ލƚ%kskBzwfp~aCZ4 CI (մ+s KIMċ Y6+cii4c:I8rTvDC˯)b#)f IX ȼG,ԷR'p +v'kde҉QU,tTV)jj^Gs~eW~H یeŒscɉ@fƽ=oGYKkSrq#)TV@I,SL#)KM poL@ #&x@u.hw[-k@OήnTz!B>*~hs|HVD: hl+)}#)C:߆F%+7g;2.+Tdu)4/ y=l#-^yz^*5&a^f#)#_0Ca?GMnz5+abKo}z[Z>r)0\RBrM#)K*&mȂ0?cٚT^ p4=eOڛѺvWa9d+#$h"=іV9#)ĉTqeg§MJ#--ۍL.v3LD@#-P$^ EFfvi  n>.z&N(et \׿&{\ *Pf=u\$$eB\?v|َi1Aa (o[MןRa:\IcGvW=!6:buTe#)ɿ[bDFBA =>_zߎjj,-j|@}K$gi>dnCޮbs#)Oj}jvK.{#)KxFFLaC-Oa^<_`rЀBה*zږ'XqMV+Ƣ;!=$ E!}}}>y^=v]}=rc:yV1;:dV#&ĝ@[{>Zƭhl5SMw$ 6xK@e_R2N+Lʇ&BF\o_N?X_Ωd(}h[ҁO`h#&BT*#&"`]G]bS}<9e:q0Wn g]~<%CJP>t본?Kª7[ .,ݔ>ӅH9lQA#kk x." )Zڋ *D̔%_]sf}v]DtVi[+?Ebif#&dR \,S r {f)"#-Hbth/Ļ)6fde#))(E,J2Q"6Y$%#L#)@`R|x<@~M-EQ'ŝ|>gyp`f.:)81530\R\Gsd6WVu>eʒGUWO8t:[߼݇3|"8A?!L$vGWbhWH.nH8drp7Ʋ1уĸ\{xS:x)q6-+?HNa8Y:erӄ:3f%Zq34WOېC2:d݅ ?>CDY]lO#!QYyGЗMtWB!ם#5#&a\mg%vI͔m4[#-/Ik^+U[nD<#@¢ cAɬ*nέ|&ƪCFՒmLnI.;mW*7r#-/wNں Q 1rDup֛iR ;xao!wY.ꩢZ4JTtٚ$3JP#-c`>(by@Ei6ExzͶzkf];";v5_zoK4y<2 H*!#X8@j5Cxǁfi#i7.KuzK˗zª d2o#&7  ƪEe{ŖL&,l@6kRQ(1JF#)#-uW8&9w&ͧʓ][.4B`6ɶ]&],Z^16+ "#j7u)*KJilU#\s"X[2LFd j68hIBXJSbFXkt `8Clmqi͠.Zkc+&QtRD؍UHO9D4)铗7Duҋu[RN#Np'M`1TP *AaCL. L #&\@cB(mBF$2*LHhؘ+u,`i Ѣ}*D'U1\B#)$c 󤉨1l-,enp#-,X[m SbZfm}˔b},5pL:,<  `}_+}+oꄺ:ډ颍BQ+L#&raB@d Z5ND`f^"o(#)MBxcgKʄ`d*A#-dboJQ#-Ib$-8TAYԮk{n:9 P`!BMDbdf4zo!nۉI;#)>8"CG7l'Q(ȉ9V~:#GDh}LEX|`"i#)8S^Nz?=*?LJ&O]3=STu>@[6?睋7aDj7񶿯^>6!vy1"4:#&*ā@H0dJ`zIf:_]0*k0C %œ噁?#&q1 >vZDI!0Yω3%UTG{'nAP_-A n21B`mo4atnh-I_^g }GVjܴH 0ـ)T2sPkFF-L7" dUeT2T3R\U.#&:tI\ѷ^+}2U^+kZ\(5^5XtڐnK`[%`Tޗ#-aP $qibB00h8.!wA(.p'' k -9  DEo#&h#&#- zEKÿuW<~9߲-MJ#&>qNOlR.l?B|T~RMD4-}o_G5ɵ4mw#)ٶtI\+ƀK@CRdk #* ! $-#-P0d)Hl)0#)'#wDs" 2B"#:?>T j*?O@#-m_'MC?U̙ `hP_qt! 䊊fݓ2>̢ymJv!fOOQ hf;#&/C,`BIERlFHlXٖe%$&Vj5TZjm5ERZkLiR61A 1FH 1*KT ,EI2#-6 #&]t]g۲< 10 DB*HȃDD`-Q0b+]BD5#&IMAJdJR>(T1A`DP^{=9E>EisEU)^|B#&H0 zccdGQ(wݚ48hZfc%g,ū# oT۬Hw2&pɉ |MTq4PZe@?^6,>fvޱ^L]5LŻV+"@%UȬ.ܪ`^#)GA?H&lǶE,kZMqtL4Ew#)ۃLCMvbZ}B$!w?. d b\9CA U\=}B~'@Td%ro& ϳY!WG!ܰ#5B FD${,کwd#)dSy dŧG4UpI<+J.f UJG72Ovȫ@$s0&=)9J>ne7m ?e*~+M}y/>l]1N:-33|Oevq.!{Q#-6gXwB߬LB0D`KJyc'h}YMhf869aw/0Kp}0h"It>[w@cCwG$Ϭ ?%|}J28Ll3ONSXS"xŨ!4JOjlc#)2##) 6i[ƊGZ5Mv[M7F%:]#-DnNd@39.BFJ;l;45t#u(+jg#-'ӯ]Btvi2#-J#HF,&խnbEbk &_/pB`w)Z;h">0x"N8ã8.Ėo{̓n9N#K܇?>LZu#mt*x1M7ts& PUML|pǿ[ĔRq{#-u5Q]*h2w<ǺQ&DtA}8 @#)+4(F޿^P-1m"Dh8dz,jxfGUך_CFHr>qϛM\q̐Bvz9"I-t9#4@u)/m2qTNM<;;q1\\veI8ܩ퓝ÆAҥ,Y|-#1$y󦎏pڅٷ#)=k= FB|3֜ Ժ=&N鵌]Ie"#)kju[G?DxYʨELg{C =Pއ8VRKh8xt=#)Y0HQ7cxߡSe-O"<]) ^ !/kASƓYkֈi$,#J2F ),bhc0dl'U8vACeha#핺;4z7'v̗ ^w$پ.0'SSՂvCa0޴N)#-hg ,F@УͨvXF;2G#-phkG+a1gJCd&u&B\H^'Zf^n91 6AtGjs @0=zb1r4xzKKi}6ca=q珿Bkfk2f{'dsOɫo* *L,$y:~>!8DD@:P{K`gmB3I4nsU+"DAK@ x""D4bBtE Ri*4㍁!kmUsn.nmG͜*M-5RW\6P((T^R(4  0ER (P fNo34.:hClrsֆF! k]-Hի_#)؀&!QI4}2\v~}.#)(PjP18kc#)h(b7Pra6SeΉ&W$֜aUX cP)KύɡJAARFEiAF ˍ=HxV3m"T'+AB`h&a-#-тTR#3sr-Qh¥;S3- $NVW:Z 7T@Y.&Ĥj#2Yj2Z3Czi881lr7 q.sRDli!v(4h6͙5XXkS3xr&i6ډRjmDUY&nZwreH!SEN(ίY5Mn{{]St"#&R&ljiv#*A#)AWAD<8Yt.lo! RٍB#&ޙi.$V!BK HRt4 YAWx<a'lq4aFN Hd'T$^#)s/L~.[$gb1|&۸Oq%#&M~A#8e#)ӷḇ<#&p4fV'>@P)$b_Os&b"[F6ꪑ+U0=W]4JZ2=N9@5`k"`2 fMQ(??MNp$BJU;t#&HZ#-骦ͫDTTA#-YH#&= 0@5!GTV1@UYlh(F$QYIڙkITcmX٥&ؒb̙1)HhiJE1PaQJhR+AL02UFE"G^YAnAg9{ϺmWT6fGy:5M.{4#tୢx$+$Q=PҊf.4_b[p̵!0gWD$"ÁNδ7!ly̶KgAub|~\B}<|nC¡\'ᛷ`BPI5ZZծk#-L#jL;BU/.2󥐲.C#-߸j)@KqF#ˆ|L-CO#)sˣEi+9-r#fqXŅnd&2p5& a4""=u2޻)fRhjzLk4k#)Kc1e{Rc,b!GD.R(q>Q?,'Hw"YLB@3R'x5۳&ADmqyM}TG XOdg.hJ6!#-)vB0.e0G&T lXLRId.EB$Ip|/$˶N:#&SLRT#&D'.#&|mD9Iu7!S=n~E(cF/#-[yaWL_q U/yn gjKOYqiWgiXIxt9l^)B%`X6FɾV+8XgzluQIqw [.pJ)i\Tpg3<':6a0`2E#-4I^”HlSJhaMIgGl!(<2谦e˕E ť oD$,Dv+Ɵ*7bW9 z3,MKc|C#&kmppI, "ah.=Sd<]ÜS&u^,!l!j4J$أ?A1@5 Ɛ(=?=-06p m*5"qm@\9 bژ8`T GCXog%+#)St;&Ȍ#&vs=FynvY u鼗9n !XAm+niC!!B23ؗ jo-8c8X.n mEy5kp9(Yn:J(8mqpf`18evNqm if%B°j -Ĥ*2! *#)1s -06ه[< |cy۾77_fML{#))\z=72d!yg,c勎"奚y`l!*Cit^0c[lL-,jj> ftr١顰/ngWBtE5{5ň)S:%MNKEK:Մb'dY#"|9IË(prDȓ8rm5N#)ӞZ9ѥPoNv2(Q5v#KjiUwlA-(&cuMf,wdCCᛲj7ccZ}d0GE&^qW;+;NzX㚻R>fRzgн)a3WeOg..{ъ:f*#&J%, })f#H-7ki#6'#&1nVҳtE2vbCtCvksK#&.K@XQGrEPi2eLXptwbrq(t8DwC4H>4xLD%Lf#-^fokĭӌx!ZiDBCІ.i Cdomru>hh#-ײhl/2mG;\QÎP`.ѸA ": *( %&#\; l`Je&jd #&%A",h I I#-)J&2xre3G@KF86l`ʈT(*N F9 n FFI"슆b)6sТ;J[Z(ls.B#)L%6*!ުllÁ04Ev0LuDCQDE#-cLCY5P>z:O=R%QL$zlo{s#)-qXswz"BAN@^i$Dxu1z^Dz4xDzX{ܱ2&TV^Kۻ(uyUA-D@9C;$LeXN)MBo'Dvid|w486u)ʲoIJ`MTu6ې?JQ+DXˉz#:n:~vwpǁR4xMhT"? R4UFWd]0G'k͑,l\EZQr'b/}~ }e$N7șW3;Flb.')|4:B*"oIw[^Ui. Ȅ :NPNKƌO0ȱTPDECLck𗛺J祹iwtdxTQ#& *hBVÆ%Iǻc %(6C r/z" fYp00dh*Eb/Xvv'ewp4$:!O33NH9ԍA&%JE-2QXDD 9W#&zbj#IpJȂu4Eg`れ?@"" i\;Pe7ԘOyw"RRK"[>rB4(8D"0(QyU1+08vgSd5iEbÀ2+CѶ6lDrdViL*u63f"i#&'LH^<39ޕ3OC~E8~UO=fqJ(9hJhL 5Zm~"+*~8FOZn!~^aSDT6"{.EE`21)e7ϓ)%=YB1K"A&eM2ј"Jfc5 F6V[,VMtA*FQ!PB)B#)}#@kߪy#-6;A<Ǩ_Z#&T=StE$4 #dwp>Ji$IÖtu|hECDrA'bгb!HE;4Ӓ(A4VjNuAY@9kұuh3bL \aMlPqIfZC:ie1VZFvINg:}XME AdR#)ɹqwz"|O}P 'o#) \Ap5#-pҘԨak#)G%|ȍ1FP4a0C+ZdtBv7Y] PdUKU=9= ׻Ǭp]L ֆd=D #-{# rTÉäK@!R0%PwB%|z`"-8_"w 265;r0kad`0{7{}=\fkxz#)!*<|gnˁn5`)I7aΛķZ797>oAn "q v#)k}=key}X$$bEb Py_wo$b-X~cVX!aֻv#&M+Aͻ4MaR0:"B ~yP6<x}zXvEAS#)(912&~'1DwO!,+F f`o(lHr~:q>%]DT9qܜ(d"u'#-` #-D$IKHA*H[U-hMTvSP)Q278pJ5D##)=;0J4$ %i9_]H G_MfZ4皘U gft#_;#-u ŗ"aĎqhJݣm șjd*uѰFܗ6T~!p뀥#)Ho(BZdM 6,QIAcm4X~^-^!QTG,ȖXO8`**ibdƏ54,#)A<|ahﻢ mo^VZ1MB֛(-bJـ˳JR@ӗϩb #xoYyB.2FAJo@s@'ԯݖBظh+̔-6 #CGgP%ȺC!Pj狱j/:j4ZbcKEQ[(E6Dm\7smXC:46^2ZKH~ 1Ć'X% lVRT"#-!#)ڑ1&XffUw:iST]6ʕ5liY*:.Ac#BFҋTiM2ٖmۺ9\R[xk3Jw-K%]np i1ЇǔUfaSD^TӣPI鶩/PV=H(_ghDU0k0d-՟=QG 5qo1BB[Z*, $7r[5I6^:>VnO]#)@tV5O6Q߇u&]>L4נi'OxhB!#I/A#)sȿN<#)C$w(x7Gȹ(V78v.&&2KxPq mop'Xn"V\@T˚X˜xπ0HRiH߻*?4?4"X#&U3h@#& AT#-=nN,!̱IWF&2d&S>oWd鐐G]ݦ#)q\e5Ad`e%֛i?N pM@Cuq|"Q.гuRt(F %[lA(`N@#&&q@uB 5clm#??YGf,3gKqPXCHBH,1T\Z"5UZaT')L5hR]Qb#).^&0g!FxEAWwם-2Z8fq#)07MCL]'-rRP-h6m0!dkfqĶox i6(^.ZMtcK"Rg$7!GLN~y[|(VDn.@jq8:`]z#CQ"]x:0sX6d*錁c +ɽ;}t#)8 #eݳ5c;KMˁHBxux-0exQuD'!#&^W FͰ\YWdߟL3bfaB^v) T1w]Sv .2 s\2@#b#-x$:ٰ"H$ `C‡k#&fI p7nBpn#&3=o[N "5Dq-2ɵ&Ԅ1dXJ@E:"s "Cc$}Sei#-  b2 P;{YWm ĵȿn}2=9Wӣ$rT<҃=k\5ʾ w]9êt8T  ]Csjqb4a'##-9Ȗ4hDKtfȳE^ E#[+@yChMG<{.eoF6 %TCVsm쒷/(6^Z-Tbқmxfu*-Qf|p5&ȧ]] à67gE)"; 0J.[=ª1#&"1")܎|:nML#)V#&XdA3p$=RA'wF"w![:<<|wefm.nx-CV D)<_:T/?w)a$a? @(uǰyD_p_ATcHAT#&m[af5l_G;?ټ>66GEHsӽvY";==wy|F}T=?q՟Th3:IgJ!)՞)OV@"G'ru(y% ݯjjp2hjR^}ڮ8AS>D c+%9,^]eK;𻭊ĶGrt{?H7EӘx?yCm3h'lgsmGBILJi떪OPv۳n6\~?"#]BC* +#<== diff --git a/wscript b/wscript new file mode 100644 index 0000000..a05cb82 --- /dev/null +++ b/wscript @@ -0,0 +1,51 @@ +#! /usr/bin/env python +# encoding: utf-8 + +APPNAME = 'astyle' +VERSION = '0.1.0' + +import waflib.extras.wurf_options + + +def options(opt): + + opt.load('wurf_common_tools') + + +def resolve(ctx): + + import waflib.extras.wurf_dependency_resolve as resolve + + ctx.load('wurf_common_tools') + + ctx.add_dependency(resolve.ResolveVersion( + name='waf-tools', + git_repository='github.com/steinwurf/waf-tools.git', + major=3)) + + +def configure(conf): + + conf.load("wurf_common_tools") + + +def build(bld): + + bld.load("wurf_common_tools") + + bld.env.append_unique( + 'DEFINES_STEINWURF_VERSION', + 'STEINWURF_ASTYLE_VERSION="{}"'.format(VERSION)) + + if bld.is_toplevel(): + + static_libs = [] + if bld.is_mkspec_platform('windows'): + static_libs = ['Shell32'] + + bld.program( + features='cxx', + source=bld.path.ant_glob('src/*.cpp'), + lib=static_libs, + target='astyle') + From 1e2a53709101f2abd2cd210a17af4561b3a5c188 Mon Sep 17 00:00:00 2001 From: Peter Vingelmann Date: Fri, 16 Sep 2016 23:45:35 +0200 Subject: [PATCH 2/2] Update README.rst --- README.rst | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/README.rst b/README.rst index 7f66a00..2783622 100644 --- a/README.rst +++ b/README.rst @@ -10,6 +10,54 @@ as closely as possible: http://docs.steinwurf.com/coding_style.html Steinwurf uses heavily-templated C++11 code that can be a true challenge for a code formatting tool. +Quick start +----------- +If you already installed a C++11 compiler, git and python on your system, +then you can clone this repository to a suitable folder:: + git clone git@github.com:steinwurf/astyle.git +Configure and build the project (use the ``cxx_default`` mkspec, because +fabric will look for the ``astyle`` binary at this default location):: + + cd astyle + python waf configure --cxx_mkspec=cxx_default + python waf build + +Running astyle manually +----------------------- + +First of all, you should copy the ``.astylerc`` options file to your home +folder. + +On Unix systems:: + + cp .astylerc ~ + +On Windows:: + + copy .astylerc %USERPROFILE%\astylerc + +After this, you can call ``astyle`` to format a single file (be careful, +because **it will not make a backup** for the original file):: + + build/cxx_default/astyle test.cpp --print-changes + +The ``--print-changes`` option prints out every line that is changed +during the formatting. This is especially useful with the ``--dry-run`` +option that will not write any modifications to the file:: + + build/cxx_default/astyle test.cpp --print-changes --dry-run + +**Warning**: Be careful about the working directory if you invoke the +following command, because you can accidentally format a lot of files! + +You can format all C/C++ source files within the current directory with the +recursive search (``-R``) option:: + + cd my-project + path/to/astyle -Q -R *.cpp *.hpp *.c *.h --print-changes + +With the ``-Q`` option, astyle will only display information about the +formatted files (it will not list the unchanged files). \ No newline at end of file