Updating the build framework
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1019cf5
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,23 @@
+*.dSYM/
+*.a
+*.dylib
+*.o
+
+*.cc~
+*.hpp~
+*.h~
+
+
+.DS_Store
+.lock*
+.waf-1*
+.waf-tools/*.pyc
+build/
+
+*.db
+*.dat
+*.properties
+*.pyc
+*.db*
+
+.tags*
diff --git a/.waf-tools/boost.py b/.waf-tools/boost.py
new file mode 100644
index 0000000..305945a
--- /dev/null
+++ b/.waf-tools/boost.py
@@ -0,0 +1,378 @@
+#!/usr/bin/env python
+# encoding: utf-8
+#
+# partially based on boost.py written by Gernot Vormayr
+# written by Ruediger Sonderfeld <ruediger@c-plusplus.de>, 2008
+# modified by Bjoern Michaelsen, 2008
+# modified by Luca Fossati, 2008
+# rewritten for waf 1.5.1, Thomas Nagy, 2008
+# rewritten for waf 1.6.2, Sylvain Rouquette, 2011
+
+'''
+
+This is an extra tool, not bundled with the default waf binary.
+To add the boost tool to the waf file:
+$ ./waf-light --tools=compat15,boost
+ or, if you have waf >= 1.6.2
+$ ./waf update --files=boost
+
+When using this tool, the wscript will look like:
+
+ def options(opt):
+ opt.load('compiler_cxx boost')
+
+ def configure(conf):
+ conf.load('compiler_cxx boost')
+ conf.check_boost(lib='system filesystem')
+
+ def build(bld):
+ bld(source='main.cpp', target='app', use='BOOST')
+
+Options are generated, in order to specify the location of boost includes/libraries.
+The `check_boost` configuration function allows to specify the used boost libraries.
+It can also provide default arguments to the --boost-static and --boost-mt command-line arguments.
+Everything will be packaged together in a BOOST component that you can use.
+
+When using MSVC, a lot of compilation flags need to match your BOOST build configuration:
+ - you may have to add /EHsc to your CXXFLAGS or define boost::throw_exception if BOOST_NO_EXCEPTIONS is defined.
+ Errors: C4530
+ - boost libraries will try to be smart and use the (pretty but often not useful) auto-linking feature of MSVC
+ So before calling `conf.check_boost` you might want to disabling by adding:
+ conf.env.DEFINES_BOOST += ['BOOST_ALL_NO_LIB']
+ Errors:
+ - boost might also be compiled with /MT, which links the runtime statically.
+ If you have problems with redefined symbols,
+ self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB']
+ self.env['CXXFLAGS_%s' % var] += ['/MD', '/EHsc']
+Passing `--boost-linkage_autodetect` might help ensuring having a correct linkage in some basic cases.
+
+'''
+
+import sys
+import re
+from waflib import Utils, Logs, Errors
+from waflib.Configure import conf
+
+BOOST_LIBS = ['/usr/lib', '/usr/local/lib', '/opt/local/lib', '/sw/lib', '/lib', '/usr/lib/x86_64-linux-gnu', '/usr/lib/i386-linux-gnu', '/usr/local/ndn/lib']
+BOOST_INCLUDES = ['/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include', '/usr/local/ndn/include']
+BOOST_VERSION_FILE = 'boost/version.hpp'
+BOOST_VERSION_CODE = '''
+#include <iostream>
+#include <boost/version.hpp>
+int main() { std::cout << BOOST_LIB_VERSION << ":" << BOOST_VERSION << std::endl; }
+'''
+BOOST_SYSTEM_CODE = '''
+#include <boost/system/error_code.hpp>
+int main() { boost::system::error_code c; }
+'''
+BOOST_THREAD_CODE = '''
+#include <boost/thread.hpp>
+int main() { boost::thread t; }
+'''
+
+# toolsets from {boost_dir}/tools/build/v2/tools/common.jam
+PLATFORM = Utils.unversioned_sys_platform()
+detect_intel = lambda env: (PLATFORM == 'win32') and 'iw' or 'il'
+detect_clang = lambda env: (PLATFORM == 'darwin') and 'clang-darwin' or 'clang'
+detect_mingw = lambda env: (re.search('MinGW', env.CXX[0])) and 'mgw' or 'gcc'
+BOOST_TOOLSETS = {
+ 'borland': 'bcb',
+ 'clang': detect_clang,
+ 'como': 'como',
+ 'cw': 'cw',
+ 'darwin': 'xgcc',
+ 'edg': 'edg',
+ 'g++': detect_mingw,
+ 'gcc': detect_mingw,
+ 'icpc': detect_intel,
+ 'intel': detect_intel,
+ 'kcc': 'kcc',
+ 'kylix': 'bck',
+ 'mipspro': 'mp',
+ 'mingw': 'mgw',
+ 'msvc': 'vc',
+ 'qcc': 'qcc',
+ 'sun': 'sw',
+ 'sunc++': 'sw',
+ 'tru64cxx': 'tru',
+ 'vacpp': 'xlc'
+}
+
+
+def options(opt):
+ opt = opt.add_option_group('Boost Options')
+
+ opt.add_option('--boost-includes', type='string',
+ default='', dest='boost_includes',
+ help='''path to the directory where the boost includes are, e.g., /path/to/boost_1_55_0/stage/include''')
+ opt.add_option('--boost-libs', type='string',
+ default='', dest='boost_libs',
+ help='''path to the directory where the boost libs are, e.g., /path/to/boost_1_55_0/stage/lib''')
+ opt.add_option('--boost-static', action='store_true',
+ default=False, dest='boost_static',
+ help='link with static boost libraries (.lib/.a)')
+ opt.add_option('--boost-mt', action='store_true',
+ default=False, dest='boost_mt',
+ help='select multi-threaded libraries')
+ opt.add_option('--boost-abi', type='string', default='', dest='boost_abi',
+ help='''select libraries with tags (dgsyp, d for debug), see doc Boost, Getting Started, chapter 6.1''')
+ opt.add_option('--boost-linkage_autodetect', action="store_true", dest='boost_linkage_autodetect',
+ help="auto-detect boost linkage options (don't get used to it / might break other stuff)")
+ opt.add_option('--boost-toolset', type='string',
+ default='', dest='boost_toolset',
+ help='force a toolset e.g. msvc, vc90, gcc, mingw, mgw45 (default: auto)')
+ py_version = '%d%d' % (sys.version_info[0], sys.version_info[1])
+ opt.add_option('--boost-python', type='string',
+ default=py_version, dest='boost_python',
+ help='select the lib python with this version (default: %s)' % py_version)
+
+
+@conf
+def __boost_get_version_file(self, d):
+ dnode = self.root.find_dir(d)
+ if dnode:
+ return dnode.find_node(BOOST_VERSION_FILE)
+ return None
+
+@conf
+def boost_get_version(self, d):
+ """silently retrieve the boost version number"""
+ node = self.__boost_get_version_file(d)
+ if node:
+ try:
+ txt = node.read()
+ except (OSError, IOError):
+ Logs.error("Could not read the file %r" % node.abspath())
+ else:
+ re_but1 = re.compile('^#define\\s+BOOST_LIB_VERSION\\s+"(.+)"', re.M)
+ m1 = re_but1.search(txt)
+
+ re_but2 = re.compile('^#define\\s+BOOST_VERSION\\s+(\\d+)', re.M)
+ m2 = re_but2.search(txt)
+
+ if m1 and m2:
+ return (m1.group(1), m2.group(1))
+
+ return self.check_cxx(fragment=BOOST_VERSION_CODE, includes=[d], execute=True, define_ret=True).split(":")
+
+@conf
+def boost_get_includes(self, *k, **kw):
+ includes = k and k[0] or kw.get('includes', None)
+ if includes and self.__boost_get_version_file(includes):
+ return includes
+ for d in Utils.to_list(self.environ.get('INCLUDE', '')) + BOOST_INCLUDES:
+ if self.__boost_get_version_file(d):
+ return d
+ if includes:
+ self.end_msg('headers not found in %s' % includes)
+ self.fatal('The configuration failed')
+ else:
+ self.end_msg('headers not found, please provide a --boost-includes argument (see help)')
+ self.fatal('The configuration failed')
+
+
+@conf
+def boost_get_toolset(self, cc):
+ toolset = cc
+ if not cc:
+ build_platform = Utils.unversioned_sys_platform()
+ if build_platform in BOOST_TOOLSETS:
+ cc = build_platform
+ else:
+ cc = self.env.CXX_NAME
+ if cc in BOOST_TOOLSETS:
+ toolset = BOOST_TOOLSETS[cc]
+ return isinstance(toolset, str) and toolset or toolset(self.env)
+
+
+@conf
+def __boost_get_libs_path(self, *k, **kw):
+ ''' return the lib path and all the files in it '''
+ if 'files' in kw:
+ return self.root.find_dir('.'), Utils.to_list(kw['files'])
+ libs = k and k[0] or kw.get('libs', None)
+ if libs:
+ path = self.root.find_dir(libs)
+ files = path.ant_glob('*boost_*')
+ if not libs or not files:
+ for d in Utils.to_list(self.environ.get('LIB', [])) + BOOST_LIBS:
+ path = self.root.find_dir(d)
+ if path:
+ files = path.ant_glob('*boost_*')
+ if files:
+ break
+ path = self.root.find_dir(d + '64')
+ if path:
+ files = path.ant_glob('*boost_*')
+ if files:
+ break
+ if not path:
+ if libs:
+ self.end_msg('libs not found in %s' % libs)
+ self.fatal('The configuration failed')
+ else:
+ self.end_msg('libs not found, please provide a --boost-libs argument (see help)')
+ self.fatal('The configuration failed')
+
+ self.to_log('Found the boost path in %r with the libraries:' % path)
+ for x in files:
+ self.to_log(' %r' % x)
+ return path, files
+
+@conf
+def boost_get_libs(self, *k, **kw):
+ '''
+ return the lib path and the required libs
+ according to the parameters
+ '''
+ path, files = self.__boost_get_libs_path(**kw)
+ t = []
+ if kw.get('mt', False):
+ t.append('mt')
+ if kw.get('abi', None):
+ t.append(kw['abi'])
+ tags = t and '(-%s)+' % '-'.join(t) or ''
+ toolset = self.boost_get_toolset(kw.get('toolset', ''))
+ toolset_pat = '(-%s[0-9]{0,3})+' % toolset
+ version = '(-%s)+' % self.env.BOOST_VERSION
+
+ def find_lib(re_lib, files):
+ for file in files:
+ if re_lib.search(file.name):
+ self.to_log('Found boost lib %s' % file)
+ return file
+ return None
+
+ def format_lib_name(name):
+ if name.startswith('lib') and self.env.CC_NAME != 'msvc':
+ name = name[3:]
+ return name[:name.rfind('.')]
+
+ libs = []
+ for lib in Utils.to_list(k and k[0] or kw.get('lib', None)):
+ py = (lib == 'python') and '(-py%s)+' % kw['python'] or ''
+ # Trying libraries, from most strict match to least one
+ for pattern in ['boost_%s%s%s%s%s' % (lib, toolset_pat, tags, py, version),
+ 'boost_%s%s%s%s' % (lib, tags, py, version),
+ 'boost_%s%s%s' % (lib, tags, version),
+ # Give up trying to find the right version
+ 'boost_%s%s%s%s' % (lib, toolset_pat, tags, py),
+ 'boost_%s%s%s' % (lib, tags, py),
+ 'boost_%s%s' % (lib, tags)]:
+ self.to_log('Trying pattern %s' % pattern)
+ file = find_lib(re.compile(pattern), files)
+ if file:
+ libs.append(format_lib_name(file.name))
+ break
+ else:
+ self.end_msg('lib %s not found in %s' % (lib, path.abspath()))
+ self.fatal('The configuration failed')
+
+ return path.abspath(), libs
+
+
+@conf
+def check_boost(self, *k, **kw):
+ """
+ Initialize boost libraries to be used.
+
+ Keywords: you can pass the same parameters as with the command line (without "--boost-").
+ Note that the command line has the priority, and should preferably be used.
+ """
+ if not self.env['CXX']:
+ self.fatal('load a c++ compiler first, conf.load("compiler_cxx")')
+
+ params = {'lib': k and k[0] or kw.get('lib', None)}
+ for key, value in self.options.__dict__.items():
+ if not key.startswith('boost_'):
+ continue
+ key = key[len('boost_'):]
+ params[key] = value and value or kw.get(key, '')
+
+ var = kw.get('uselib_store', 'BOOST')
+
+ self.start_msg('Checking boost includes')
+ self.env['INCLUDES_%s' % var] = inc = self.boost_get_includes(**params)
+ versions = self.boost_get_version(inc)
+ self.env.BOOST_VERSION = versions[0]
+ self.env.BOOST_VERSION_NUMBER = int(versions[1])
+ self.end_msg("%d.%d.%d" % (int(versions[1]) / 100000,
+ int(versions[1]) / 100 % 1000,
+ int(versions[1]) % 100))
+ if Logs.verbose:
+ Logs.pprint('CYAN', ' path : %s' % self.env['INCLUDES_%s' % var])
+
+ if not params['lib']:
+ return
+ self.start_msg('Checking boost libs')
+ suffix = params.get('static', None) and 'ST' or ''
+ path, libs = self.boost_get_libs(**params)
+ self.env['%sLIBPATH_%s' % (suffix, var)] = [path]
+ self.env['%sLIB_%s' % (suffix, var)] = libs
+ self.end_msg('ok')
+ if Logs.verbose:
+ Logs.pprint('CYAN', ' path : %s' % path)
+ Logs.pprint('CYAN', ' libs : %s' % libs)
+
+
+ def try_link():
+ if 'system' in params['lib']:
+ self.check_cxx(
+ fragment=BOOST_SYSTEM_CODE,
+ use=var,
+ execute=False,
+ )
+ if 'thread' in params['lib']:
+ self.check_cxx(
+ fragment=BOOST_THREAD_CODE,
+ use=var,
+ execute=False,
+ )
+
+ if params.get('linkage_autodetect', False):
+ self.start_msg("Attempting to detect boost linkage flags")
+ toolset = self.boost_get_toolset(kw.get('toolset', ''))
+ if toolset in ['vc']:
+ # disable auto-linking feature, causing error LNK1181
+ # because the code wants to be linked against
+ self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB']
+
+ # if no dlls are present, we guess the .lib files are not stubs
+ has_dlls = False
+ for x in Utils.listdir(path):
+ if x.endswith(self.env.cxxshlib_PATTERN % ''):
+ has_dlls = True
+ break
+ if not has_dlls:
+ self.env['STLIBPATH_%s' % var] = [path]
+ self.env['STLIB_%s' % var] = libs
+ del self.env['LIB_%s' % var]
+ del self.env['LIBPATH_%s' % var]
+
+ # we attempt to play with some known-to-work CXXFLAGS combinations
+ for cxxflags in (['/MD', '/EHsc'], []):
+ self.env.stash()
+ self.env["CXXFLAGS_%s" % var] += cxxflags
+ try:
+ try_link()
+ self.end_msg("ok: winning cxxflags combination: %s" % (self.env["CXXFLAGS_%s" % var]))
+ e = None
+ break
+ except Errors.ConfigurationError as exc:
+ self.env.revert()
+ e = exc
+
+ if e is not None:
+ self.end_msg("Could not auto-detect boost linking flags combination, you may report it to boost.py author", ex=e)
+ self.fatal('The configuration failed')
+ else:
+ self.end_msg("Boost linkage flags auto-detection not implemented (needed ?) for this toolchain")
+ self.fatal('The configuration failed')
+ else:
+ self.start_msg('Checking for boost linkage')
+ try:
+ try_link()
+ except Errors.ConfigurationError as e:
+ self.end_msg("Could not link against boost libraries using supplied options")
+ self.fatal('The configuration failed')
+ self.end_msg('ok')
diff --git a/.waf-tools/coverage.py b/.waf-tools/coverage.py
new file mode 100644
index 0000000..0a3db65
--- /dev/null
+++ b/.waf-tools/coverage.py
@@ -0,0 +1,24 @@
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+#
+# Copyright (c) 2014, Regents of the University of California
+#
+# GPL 3.0 license, see the COPYING.md file for more information
+
+from waflib import TaskGen
+
+def options(opt):
+ opt.add_option('--with-coverage', action='store_true', default=False, dest='with_coverage',
+ help='''Set compiler flags for gcc to enable code coverage information''')
+
+def configure(conf):
+ if conf.options.with_coverage:
+ conf.check_cxx(cxxflags=['-fprofile-arcs', '-ftest-coverage', '-fPIC'],
+ linkflags=['-fprofile-arcs'], uselib_store='GCOV', mandatory=True)
+
+@TaskGen.feature('cxx','cc')
+@TaskGen.after('process_source')
+def add_coverage(self):
+ if getattr(self, 'use', ''):
+ self.use += ' GCOV'
+ else:
+ self.use = 'GCOV'
diff --git a/.waf-tools/default-compiler-flags.py b/.waf-tools/default-compiler-flags.py
new file mode 100644
index 0000000..af237f5
--- /dev/null
+++ b/.waf-tools/default-compiler-flags.py
@@ -0,0 +1,62 @@
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+#
+# Copyright (c) 2014, Regents of the University of California
+#
+# GPL 3.0 license, see the COPYING.md file for more information
+
+from waflib import Logs, Configure
+
+def options(opt):
+ opt.add_option('--debug', '--with-debug', action='store_true', default=False, dest='debug',
+ help='''Compile in debugging mode without all optimizations (-O0)''')
+ opt.add_option('--with-c++11', action='store_true', default=False, dest='use_cxx11',
+ help='''Enable C++11 mode (experimental, may not work)''')
+
+def configure(conf):
+ areCustomCxxflagsPresent = (len(conf.env.CXXFLAGS) > 0)
+ defaultFlags = []
+
+ if conf.options.use_cxx11:
+ defaultFlags += ['-std=c++0x', '-std=c++11']
+ else:
+ defaultFlags += ['-std=c++03']
+
+ defaultFlags += ['-pedantic', '-Wall', '-Wno-long-long', '-Wno-unneeded-internal-declaration']
+
+ if conf.options.debug:
+ conf.define('_DEBUG', 1)
+ defaultFlags += ['-O0',
+ '-Og', # gcc >= 4.8
+ '-g3',
+ '-fcolor-diagnostics', # clang
+ '-fdiagnostics-color', # gcc >= 4.9
+ '-Werror',
+ '-Wno-error=maybe-uninitialized', # Bug #1560
+ ]
+ if areCustomCxxflagsPresent:
+ missingFlags = [x for x in defaultFlags if x not in conf.env.CXXFLAGS]
+ if len(missingFlags) > 0:
+ Logs.warn("Selected debug mode, but CXXFLAGS is set to a custom value '%s'"
+ % " ".join(conf.env.CXXFLAGS))
+ Logs.warn("Default flags '%s' are not activated" % " ".join(missingFlags))
+ else:
+ conf.add_supported_cxxflags(defaultFlags)
+ else:
+ defaultFlags += ['-O2', '-g']
+ if not areCustomCxxflagsPresent:
+ conf.add_supported_cxxflags(defaultFlags)
+
+@Configure.conf
+def add_supported_cxxflags(self, cxxflags):
+ """
+ Check which cxxflags are supported by compiler and add them to env.CXXFLAGS variable
+ """
+ self.start_msg('Checking allowed flags for c++ compiler')
+
+ supportedFlags = []
+ for flag in cxxflags:
+ if self.check_cxx(cxxflags=['-Werror', flag], mandatory=False):
+ supportedFlags += [flag]
+
+ self.end_msg(' '.join(supportedFlags))
+ self.env.CXXFLAGS = supportedFlags + self.env.CXXFLAGS
diff --git a/.waf-tools/dependency-checker.py b/.waf-tools/dependency-checker.py
new file mode 100644
index 0000000..629fbfd
--- /dev/null
+++ b/.waf-tools/dependency-checker.py
@@ -0,0 +1,28 @@
+# encoding: utf-8
+
+from waflib import Options, Logs
+from waflib.Configure import conf
+
+def addDependencyOptions(self, opt, name, extraHelp=''):
+ opt.add_option('--with-%s' % name, type='string', default=None,
+ dest='with_%s' % name,
+ help='Path to %s, e.g., /usr/local %s' % (name, extraHelp))
+setattr(Options.OptionsContext, "addDependencyOptions", addDependencyOptions)
+
+@conf
+def checkDependency(self, name, **kw):
+ root = kw.get('path', getattr(Options.options, 'with_%s' % name))
+ kw['msg'] = kw.get('msg', 'Checking for %s library' % name)
+ kw['uselib_store'] = kw.get('uselib_store', name.upper())
+ kw['define_name'] = kw.get('define_name', 'HAVE_%s' % kw['uselib_store'])
+ kw['mandatory'] = kw.get('mandatory', True)
+
+ if root:
+ isOk = self.check_cxx(includes="%s/include" % root,
+ libpath="%s/lib" % root,
+ **kw)
+ else:
+ isOk = self.check_cxx(**kw)
+
+ if isOk:
+ self.env[kw['define_name']] = True
diff --git a/.waf-tools/doxygen.py b/.waf-tools/doxygen.py
new file mode 100644
index 0000000..ac8c70b
--- /dev/null
+++ b/.waf-tools/doxygen.py
@@ -0,0 +1,214 @@
+#! /usr/bin/env python
+# encoding: UTF-8
+# Thomas Nagy 2008-2010 (ita)
+
+"""
+
+Doxygen support
+
+Variables passed to bld():
+* doxyfile -- the Doxyfile to use
+
+When using this tool, the wscript will look like:
+
+ def options(opt):
+ opt.load('doxygen')
+
+ def configure(conf):
+ conf.load('doxygen')
+ # check conf.env.DOXYGEN, if it is mandatory
+
+ def build(bld):
+ if bld.env.DOXYGEN:
+ bld(features="doxygen", doxyfile='Doxyfile', ...)
+
+ def doxygen(bld):
+ if bld.env.DOXYGEN:
+ bld(features="doxygen", doxyfile='Doxyfile', ...)
+"""
+
+from fnmatch import fnmatchcase
+import os, os.path, re, stat
+from waflib import Task, Utils, Node, Logs, Errors, Build
+from waflib.TaskGen import feature
+
+DOXY_STR = '"${DOXYGEN}" - '
+DOXY_FMTS = 'html latex man rft xml'.split()
+DOXY_FILE_PATTERNS = '*.' + ' *.'.join('''
+c cc cxx cpp c++ java ii ixx ipp i++ inl h hh hxx hpp h++ idl odl cs php php3
+inc m mm py f90c cc cxx cpp c++ java ii ixx ipp i++ inl h hh hxx
+'''.split())
+
+re_rl = re.compile('\\\\\r*\n', re.MULTILINE)
+re_nl = re.compile('\r*\n', re.M)
+def parse_doxy(txt):
+ tbl = {}
+ txt = re_rl.sub('', txt)
+ lines = re_nl.split(txt)
+ for x in lines:
+ x = x.strip()
+ if not x or x.startswith('#') or x.find('=') < 0:
+ continue
+ if x.find('+=') >= 0:
+ tmp = x.split('+=')
+ key = tmp[0].strip()
+ if key in tbl:
+ tbl[key] += ' ' + '+='.join(tmp[1:]).strip()
+ else:
+ tbl[key] = '+='.join(tmp[1:]).strip()
+ else:
+ tmp = x.split('=')
+ tbl[tmp[0].strip()] = '='.join(tmp[1:]).strip()
+ return tbl
+
+class doxygen(Task.Task):
+ vars = ['DOXYGEN', 'DOXYFLAGS']
+ color = 'BLUE'
+
+ def runnable_status(self):
+ '''
+ self.pars are populated in runnable_status - because this function is being
+ run *before* both self.pars "consumers" - scan() and run()
+
+ set output_dir (node) for the output
+ '''
+
+ for x in self.run_after:
+ if not x.hasrun:
+ return Task.ASK_LATER
+
+ if not getattr(self, 'pars', None):
+ txt = self.inputs[0].read()
+ self.pars = parse_doxy(txt)
+ if not self.pars.get('OUTPUT_DIRECTORY'):
+ self.pars['OUTPUT_DIRECTORY'] = self.inputs[0].parent.get_bld().abspath()
+
+ # Override with any parameters passed to the task generator
+ if getattr(self.generator, 'pars', None):
+ for k, v in self.generator.pars.iteritems():
+ self.pars[k] = v
+
+ self.doxy_inputs = getattr(self, 'doxy_inputs', [])
+ if not self.pars.get('INPUT'):
+ self.doxy_inputs.append(self.inputs[0].parent)
+ else:
+ for i in self.pars.get('INPUT').split():
+ if os.path.isabs(i):
+ node = self.generator.bld.root.find_node(i)
+ else:
+ node = self.generator.path.find_node(i)
+ if not node:
+ self.generator.bld.fatal('Could not find the doxygen input %r' % i)
+ self.doxy_inputs.append(node)
+
+ if not getattr(self, 'output_dir', None):
+ bld = self.generator.bld
+ # First try to find an absolute path, then find or declare a relative path
+ self.output_dir = bld.root.find_dir(self.pars['OUTPUT_DIRECTORY'])
+ if not self.output_dir:
+ self.output_dir = bld.path.find_or_declare(self.pars['OUTPUT_DIRECTORY'])
+
+ self.signature()
+ return Task.Task.runnable_status(self)
+
+ def scan(self):
+ exclude_patterns = self.pars.get('EXCLUDE_PATTERNS','').split()
+ file_patterns = self.pars.get('FILE_PATTERNS','').split()
+ if not file_patterns:
+ file_patterns = DOXY_FILE_PATTERNS
+ if self.pars.get('RECURSIVE') == 'YES':
+ file_patterns = ["**/%s" % pattern for pattern in file_patterns]
+ nodes = []
+ names = []
+ for node in self.doxy_inputs:
+ if os.path.isdir(node.abspath()):
+ for m in node.ant_glob(incl=file_patterns, excl=exclude_patterns):
+ nodes.append(m)
+ else:
+ nodes.append(node)
+ return (nodes, names)
+
+ def run(self):
+ dct = self.pars.copy()
+ dct['INPUT'] = ' '.join(['"%s"' % x.abspath() for x in self.doxy_inputs])
+ code = '\n'.join(['%s = %s' % (x, dct[x]) for x in self.pars])
+ code = code.encode() # for python 3
+ #fmt = DOXY_STR % (self.inputs[0].parent.abspath())
+ cmd = Utils.subst_vars(DOXY_STR, self.env)
+ env = self.env.env or None
+ proc = Utils.subprocess.Popen(cmd, shell=True, stdin=Utils.subprocess.PIPE, env=env, cwd=self.generator.bld.path.get_bld().abspath())
+ proc.communicate(code)
+ return proc.returncode
+
+ def post_run(self):
+ nodes = self.output_dir.ant_glob('**/*', quiet=True)
+ for x in nodes:
+ x.sig = Utils.h_file(x.abspath())
+ self.outputs += nodes
+ return Task.Task.post_run(self)
+
+class tar(Task.Task):
+ "quick tar creation"
+ run_str = '${TAR} ${TAROPTS} ${TGT} ${SRC}'
+ color = 'RED'
+ after = ['doxygen']
+ def runnable_status(self):
+ for x in getattr(self, 'input_tasks', []):
+ if not x.hasrun:
+ return Task.ASK_LATER
+
+ if not getattr(self, 'tar_done_adding', None):
+ # execute this only once
+ self.tar_done_adding = True
+ for x in getattr(self, 'input_tasks', []):
+ self.set_inputs(x.outputs)
+ if not self.inputs:
+ return Task.SKIP_ME
+ return Task.Task.runnable_status(self)
+
+ def __str__(self):
+ tgt_str = ' '.join([a.nice_path(self.env) for a in self.outputs])
+ return '%s: %s\n' % (self.__class__.__name__, tgt_str)
+
+@feature('doxygen')
+def process_doxy(self):
+ if not getattr(self, 'doxyfile', None):
+ self.generator.bld.fatal('no doxyfile??')
+
+ node = self.doxyfile
+ if not isinstance(node, Node.Node):
+ node = self.path.find_resource(node)
+ if not node:
+ raise ValueError('doxygen file not found')
+
+ # the task instance
+ dsk = self.create_task('doxygen', node)
+
+ if getattr(self, 'doxy_tar', None):
+ tsk = self.create_task('tar')
+ tsk.input_tasks = [dsk]
+ tsk.set_outputs(self.path.find_or_declare(self.doxy_tar))
+ if self.doxy_tar.endswith('bz2'):
+ tsk.env['TAROPTS'] = ['cjf']
+ elif self.doxy_tar.endswith('gz'):
+ tsk.env['TAROPTS'] = ['czf']
+ else:
+ tsk.env['TAROPTS'] = ['cf']
+
+def configure(conf):
+ '''
+ Check if doxygen and tar commands are present in the system
+
+ If the commands are present, then conf.env.DOXYGEN and conf.env.TAR
+ variables will be set. Detection can be controlled by setting DOXYGEN and
+ TAR environmental variables.
+ '''
+
+ conf.find_program('doxygen', var='DOXYGEN', mandatory=False)
+ conf.find_program('tar', var='TAR', mandatory=False)
+
+# doxygen docs
+from waflib.Build import BuildContext
+class doxy(BuildContext):
+ cmd = "doxygen"
+ fun = "doxygen"
diff --git a/.waf-tools/pch.py b/.waf-tools/pch.py
new file mode 100644
index 0000000..08cc5de
--- /dev/null
+++ b/.waf-tools/pch.py
@@ -0,0 +1,148 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# Alexander Afanasyev (UCLA), 2014
+
+"""
+Enable precompiled C++ header support (currently only clang++ and g++ are supported)
+
+To use this tool, wscript should look like:
+
+ def options(opt):
+ opt.load('pch')
+ # This will add `--with-pch` configure option.
+ # Unless --with-pch during configure stage specified, the precompiled header support is disabled
+
+ def configure(conf):
+ conf.load('pch')
+ # this will set conf.env.WITH_PCH if --with-pch is specified and the supported compiler is used
+ # Unless conf.env.WITH_PCH is set, the precompiled header support is disabled
+
+ def build(bld):
+ bld(features='cxx pch',
+ target='precompiled-headers',
+ name='precompiled-headers',
+ headers='a.h b.h c.h', # headers to pre-compile into `precompiled-headers`
+
+ # Other parameters to compile precompiled headers
+ # includes=...,
+ # export_includes=...,
+ # use=...,
+ # ...
+
+ # Exported parameters will be propagated even if precompiled headers are disabled
+ )
+
+ bld(
+ target='test',
+ features='cxx cxxprogram',
+ source='a.cpp b.cpp d.cpp main.cpp',
+ use='precompiled-headers',
+ )
+
+ # or
+
+ bld(
+ target='test',
+ features='pch cxx cxxprogram',
+ source='a.cpp b.cpp d.cpp main.cpp',
+ headers='a.h b.h c.h',
+ )
+
+Note that precompiled header must have multiple inclusion guards. If the guards are missing, any benefit of precompiled header will be voided and compilation may fail in some cases.
+"""
+
+import os
+from waflib import Task, TaskGen, Logs, Utils
+from waflib.Tools import c_preproc, cxx
+
+
+PCH_COMPILER_OPTIONS = {
+ 'clang++': [['-include'], '.pch', ['-x', 'c++-header']],
+ 'g++': [['-include'], '.gch', ['-x', 'c++-header']],
+}
+
+
+def options(opt):
+ opt.add_option('--without-pch', action='store_false', default=True, dest='with_pch', help='''Try to use precompiled header to speed up compilation (only g++ and clang++)''')
+
+def configure(conf):
+ if (conf.options.with_pch and conf.env['COMPILER_CXX'] in PCH_COMPILER_OPTIONS.keys()):
+ conf.env.WITH_PCH = True
+ flags = PCH_COMPILER_OPTIONS[conf.env['COMPILER_CXX']]
+ conf.env.CXXPCH_F = flags[0]
+ conf.env.CXXPCH_EXT = flags[1]
+ conf.env.CXXPCH_FLAGS = flags[2]
+
+
+@TaskGen.feature('pch')
+@TaskGen.before('process_source')
+def apply_pch(self):
+ if not self.env.WITH_PCH:
+ return
+
+ if getattr(self.bld, 'pch_tasks', None) is None:
+ self.bld.pch_tasks = {}
+
+ if getattr(self, 'headers', None) is None:
+ return
+
+ self.headers = self.to_nodes(self.headers)
+
+ if getattr(self, 'name', None):
+ try:
+ task = self.bld.pch_tasks[self.name]
+ self.bld.fatal("Duplicated 'pch' task with name %r" % self.name)
+ except KeyError:
+ pass
+
+ out = '%s.%d%s' % (self.target, self.idx, self.env['CXXPCH_EXT'])
+ out = self.path.find_or_declare(out)
+ task = self.create_task('gchx', self.headers, out)
+
+ # target should be an absolute path of `out`, but without precompiled header extension
+ task.target = out.abspath()[:-len(out.suffix())]
+
+ self.pch_task = task
+ if getattr(self, 'name', None):
+ self.bld.pch_tasks[self.name] = task
+
+@TaskGen.feature('cxx')
+@TaskGen.after_method('process_source', 'propagate_uselib_vars')
+def add_pch(self):
+ if not (self.env['WITH_PCH'] and getattr(self, 'use', None) and getattr(self, 'compiled_tasks', None) and getattr(self.bld, 'pch_tasks', None)):
+ return
+
+ pch = None
+ # find pch task, if any
+
+ if getattr(self, 'pch_task', None):
+ pch = self.pch_task
+ else:
+ for use in Utils.to_list(self.use):
+ try:
+ pch = self.bld.pch_tasks[use]
+ except KeyError:
+ pass
+
+ if pch:
+ for x in self.compiled_tasks:
+ x.env.append_value('CXXFLAGS', self.env['CXXPCH_F'] + [pch.target])
+
+class gchx(Task.Task):
+ run_str = '${CXX} ${ARCH_ST:ARCH} ${CXXFLAGS} ${CPPFLAGS} ${CXXPCH_FLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CXXPCH_F:SRC} ${CXX_SRC_F}${SRC[0].abspath()} ${CXX_TGT_F}${TGT[0].abspath()}'
+ scan = c_preproc.scan
+ color = 'BLUE'
+ ext_out=['.h']
+
+ def runnable_status(self):
+ try:
+ node_deps = self.generator.bld.node_deps[self.uid()]
+ except KeyError:
+ node_deps = []
+ ret = Task.Task.runnable_status(self)
+ if ret == Task.SKIP_ME and self.env.CXX_NAME == 'clang':
+ t = os.stat(self.outputs[0].abspath()).st_mtime
+ for n in self.inputs + node_deps:
+ if os.stat(n.abspath()).st_mtime > t:
+ return Task.RUN_ME
+ return ret
diff --git a/.waf-tools/sphinx_build.py b/.waf-tools/sphinx_build.py
new file mode 100644
index 0000000..e61da6e
--- /dev/null
+++ b/.waf-tools/sphinx_build.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+# encoding: utf-8
+
+# inspired by code by Hans-Martin von Gaudecker, 2012
+
+import os
+from waflib import Node, Task, TaskGen, Errors, Logs, Build, Utils
+
+class sphinx_build(Task.Task):
+ color = 'BLUE'
+ run_str = '${SPHINX_BUILD} -D ${VERSION} -D ${RELEASE} -q -b ${BUILDERNAME} -d ${DOCTREEDIR} ${SRCDIR} ${OUTDIR}'
+
+ def __str__(self):
+ env = self.env
+ src_str = ' '.join([a.path_from(a.ctx.launch_node()) for a in self.inputs])
+ tgt_str = ' '.join([a.path_from(a.ctx.launch_node()) for a in self.outputs])
+ if self.outputs: sep = ' -> '
+ else: sep = ''
+ return'%s [%s]: %s%s%s\n'%(self.__class__.__name__.replace('_task',''),
+ self.env['BUILDERNAME'], src_str, sep, tgt_str)
+
+@TaskGen.extension('.py', '.rst')
+def sig_hook(self, node):
+ node.sig=Utils.h_file(node.abspath())
+
+@TaskGen.feature("sphinx")
+@TaskGen.before_method("process_source")
+def apply_sphinx(self):
+ """Set up the task generator with a Sphinx instance and create a task."""
+
+ inputs = []
+ for i in Utils.to_list(self.source):
+ if not isinstance(i, Node.Node):
+ node = self.path.find_node(node)
+ else:
+ node = i
+ if not node:
+ raise ValueError('[%s] file not found' % i)
+ inputs.append(node)
+
+ task = self.create_task('sphinx_build', inputs)
+
+ conf = self.path.find_node(self.config)
+ task.inputs.append(conf)
+
+ confdir = conf.parent.abspath()
+ buildername = getattr(self, "builder", "html")
+ srcdir = getattr(self, "srcdir", confdir)
+ outdir = self.path.find_or_declare(getattr(self, "outdir", buildername)).get_bld()
+ doctreedir = getattr(self, "doctreedir", os.path.join(outdir.abspath(), ".doctrees"))
+
+ task.env['BUILDERNAME'] = buildername
+ task.env['SRCDIR'] = srcdir
+ task.env['DOCTREEDIR'] = doctreedir
+ task.env['OUTDIR'] = outdir.abspath()
+ task.env['VERSION'] = "version=%s" % self.VERSION
+ task.env['RELEASE'] = "release=%s" % self.VERSION
+
+ import imp
+ confData = imp.load_source('sphinx_conf', conf.abspath())
+
+ if buildername == "man":
+ for i in confData.man_pages:
+ target = outdir.find_or_declare('%s.%d' % (i[1], i[4]))
+ task.outputs.append(target)
+
+ if self.install_path:
+ self.bld.install_files("%s/man%d/" % (self.install_path, i[4]), target)
+ else:
+ task.outputs.append(outdir)
+
+def configure(conf):
+ conf.find_program('sphinx-build', var='SPHINX_BUILD', mandatory=False)
+
+# sphinx docs
+from waflib.Build import BuildContext
+class sphinx(BuildContext):
+ cmd = "sphinx"
+ fun = "sphinx"
diff --git a/.waf-tools/sqlite3.py b/.waf-tools/sqlite3.py
new file mode 100644
index 0000000..28dd57c
--- /dev/null
+++ b/.waf-tools/sqlite3.py
@@ -0,0 +1,41 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+from waflib import Options
+from waflib.Configure import conf
+
+def options(opt):
+ opt.add_option('--with-sqlite3', type='string', default=None,
+ dest='with_sqlite3', help='''Path to SQLite3, e.g., /usr/local''')
+ opt.add_option('--without-sqlite-locking', action='store_false', default=True,
+ dest='with_sqlite_locking',
+ help='''Disable filesystem locking in sqlite3 database '''
+ '''(use unix-dot locking mechanism instead). '''
+ '''This option may be necessary if home directory is hosted on NFS.''')
+
+@conf
+def check_sqlite3(self, *k, **kw):
+ root = k and k[0] or kw.get('path', None) or Options.options.with_sqlite3
+ mandatory = kw.get('mandatory', True)
+ var = kw.get('uselib_store', 'SQLITE3')
+
+ if root:
+ self.check_cxx(lib='sqlite3',
+ msg='Checking for SQLite3 library',
+ define_name='HAVE_%s' % var,
+ uselib_store=var,
+ mandatory=mandatory,
+ includes="%s/include" % root,
+ libpath="%s/lib" % root)
+ else:
+ try:
+ self.check_cfg(package='sqlite3',
+ args=['--cflags', '--libs'],
+ uselib_store='SQLITE3',
+ mandatory=True)
+ except:
+ self.check_cxx(lib='sqlite3',
+ msg='Checking for SQLite3 library',
+ define_name='HAVE_%s' % var,
+ uselib_store=var,
+ mandatory=mandatory)
diff --git a/src/ndns-tlv.h b/src/ndns-tlv.h
deleted file mode 100644
index d8535a5..0000000
--- a/src/ndns-tlv.h
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-namespace ndn {
-namespace tlv {
-namespace ndns {
- enum {
- Type = 2000,
- Fressness = 2001,
- ContentBlob = 2002,
- NumberOfRRData = 2003,
- RRData = 2004
- };//enum
-}//namespace ndns
-}//namespace tlv
-}//namespace ndn
diff --git a/src/ndns-tlv.hpp b/src/ndns-tlv.hpp
new file mode 100644
index 0000000..5343a96
--- /dev/null
+++ b/src/ndns-tlv.hpp
@@ -0,0 +1,34 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
+ *
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+namespace ndn {
+namespace ndns {
+namespace tlv {
+
+enum {
+ Type = 2000,
+ Fressness = 2001,
+ ContentBlob = 2002,
+ NumberOfRRData = 2003,
+ RRData = 2004
+};
+
+} // namespace tlv
+} // namespace ndns
+} // namespace ndn
diff --git a/src/query.cpp b/src/query.cpp
index 861d1c8..756de40 100644
--- a/src/query.cpp
+++ b/src/query.cpp
@@ -1,53 +1,63 @@
-/*
- * query.cpp
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
*
- * Created on: 18 Jul, 2014
- * Author: shock
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "query.h"
+#include "query.hpp"
namespace ndn {
+namespace ndns {
Query::Query()
-: m_interestLifetime(time::milliseconds(4000))
+ : m_interestLifetime(time::milliseconds(4000))
{
- // TODO Auto-generated constructor stub
-
}
Query::~Query() {
- // TODO Auto-generated destructor stub
}
void
Query::fromWire(const Name &name, const Interest &interest)
{
- Name interestName;
- interestName = interest.getName();
+ Name interestName;
+ interestName = interest.getName();
- int qtflag = -1;
- size_t len = interestName.size();
- for (size_t i=0; i<len; i++)
+ int qtflag = -1;
+ size_t len = interestName.size();
+ for (size_t i=0; i<len; i++)
{
- string comp = interestName.get(i).toEscapedString();
- if (comp == ndn::toString(QueryType::DNS) || comp == ndn::toString(QueryType::DNS_R))
- {
- qtflag = i;
- break;
- }
+ std::string comp = interestName.get(i).toUri();
+ if (comp == toString(QUERY_DNS) || comp == toString(QUERY_DNS_R))
+ {
+ qtflag = i;
+ break;
+ }
}//for
- if (qtflag == -1)
+ if (qtflag == -1)
{
- cerr<<"There is no QueryType in the Interest Name: "<<interestName<<endl;
- return;
+ std::cerr << "There is no QueryType in the Interest Name: " << interestName << std::endl;
+ return;
}
- this->m_queryType = ndn::toQueryType(interestName.get(qtflag).toEscapedString());
- this->m_rrType = ndn::toRRType(interestName.get(len-1).toEscapedString());
- this->m_authorityZone = interestName.getPrefix(qtflag); //the DNS/DNS-R is not included
- this->m_interestLifetime = interest.getInterestLifetime();
+ this->m_queryType = toQueryType(interestName.get(qtflag).toUri());
+ this->m_rrType = toRRType(interestName.get(len-1).toUri());
+ this->m_authorityZone = interestName.getPrefix(qtflag); //the DNS/DNS-R is not included
+ this->m_interestLifetime = interest.getInterestLifetime();
}
@@ -55,8 +65,8 @@
size_t
Query::wireEncode(EncodingImpl<T>& block) const
{
- size_t totalLength = 0;
- totalLength += 0;
+ size_t totalLength = 0;
+ totalLength += 0;
size_t totalLength = prependByteArrayBlock(block, tlv::Bytes,
@@ -71,15 +81,16 @@
Interest
Query::toWire() const
{
- Name name = this->m_authorityZone;
- name.append(ndn::toString(this->m_queryType));
- name.append(this->m_rrLabel);
- name.append(ndn::toString(this->m_rrType));
- Selectors selector;
- //selector.setMustBeFresh(true);
+ Name name = this->m_authorityZone;
+ name.append(toString(this->m_queryType));
+ name.append(this->m_rrLabel);
+ name.append(toString(this->m_rrType));
+ Selectors selector;
+ //selector.setMustBeFresh(true);
- Interest interest = Interest(name, selector, -1, this->m_interestLifetime);
- return interest;
+ Interest interest = Interest(name, selector, -1, this->m_interestLifetime);
+ return interest;
}
-} /* namespace ndn */
+} // namespace ndns
+} // namespace ndn
diff --git a/src/query.h b/src/query.h
deleted file mode 100644
index 001efa0..0000000
--- a/src/query.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * query.h
- *
- * Created on: 18 Jul, 2014
- * Author: shock
- */
-
-#ifndef QUERY_H_
-#define QUERY_H_
-
-#include <ndn-cxx/name.hpp>
-#include <rr.h>
-
-using namespace std;
-
-namespace ndn {
-
-
-enum class QueryType
-{
- DNS,
- DNS_R,
-};
-
-static const string
-toString(QueryType qType) const
-{
- string label;
- switch (qType)
- {
- case QueryType::DNS:
- label = "DNS";
- break;
- case QueryType::DNS_R:
- label = "DNS-R";
- break;
- default:
- label = "Default";
- break;
- }
- return label;
-
-}
-
-static const QueryType
-toQueryType(string str)
-{
- QueryType atype;
- switch (str)
- {
- case "DNS":
- atype = QueryType::DNS;
- break;
- case "DNS-R":
- atype = QueryType::DNS_R;
- break;
- defalut:
- atype = QueryType::DNS;
- break;
- }
- return atype;
-}
-
-
-
-
-class Query {
-public:
- Query();
-
- virtual ~Query();
-
-
-
- const Name& getAuthorityZone() const {
- return m_authorityZone;
- }
-
- void setAuthorityZone(const Name& authorityZone) {
- m_authorityZone = authorityZone;
- }
-
- time::milliseconds getInterestLifetime() const {
- return m_interestLifetime;
- }
-
- void setInterestLifetime(time::milliseconds interestLifetime) {
- m_interestLifetime = interestLifetime;
- }
-
- enum QueryType getQueryType() const {
- return m_queryType;
- }
-
- void setQueryType(enum QueryType queryType) {
- m_queryType = queryType;
- }
-
- const Name& getRrLabel() const {
- return m_rrLabel;
- }
-
- void setRrLabel(const Name& rrLabel) {
- m_rrLabel = rrLabel;
- }
-
- const RRType& getRrType() const {
- return m_rrType;
- }
-
- void setRrType(const RRType& rrType) {
- m_rrType = rrType;
- }
-
-private:
-template<bool T>
-size_t
-wireEncode(EncodingImpl<T> & block) const;
-
-public:
-
-const Block&
-wireEncode() const;
-
-void
-wireDecode(const Block& wire);
-
-
-Interest
-toWire() const;
-
-void
-fromWire(const Name &name, const Interest& interest);
-
-
-
-
-
-public:
- Name m_authorityZone;
- enum QueryType m_queryType;
- time::milliseconds m_interestLifetime;
- Name m_rrLabel;
- enum RRType m_rrType;
-
- mutable Block m_wire;
- //bool hasWire;
-};
-
-} /* namespace ndn */
-
-#endif /* QUERY_H_ */
diff --git a/src/query.hpp b/src/query.hpp
new file mode 100644
index 0000000..48ef464
--- /dev/null
+++ b/src/query.hpp
@@ -0,0 +1,152 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
+ *
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NDNS_QUERY_HPP
+#define NDNS_QUERY_HPP
+
+#include "rr.hpp"
+
+#include <ndn-cxx/name.hpp>
+
+namespace ndn {
+namespace ndns {
+
+class Query
+{
+public:
+
+ enum QueryType {
+ QUERY_DNS,
+ QUERY_DNS_R
+ };
+
+ Query();
+
+ virtual ~Query();
+
+ const Name& getAuthorityZone() const {
+ return m_authorityZone;
+ }
+
+ void setAuthorityZone(const Name& authorityZone) {
+ m_authorityZone = authorityZone;
+ }
+
+ time::milliseconds getInterestLifetime() const {
+ return m_interestLifetime;
+ }
+
+ void setInterestLifetime(time::milliseconds interestLifetime) {
+ m_interestLifetime = interestLifetime;
+ }
+
+ enum QueryType getQueryType() const {
+ return m_queryType;
+ }
+
+ void setQueryType(enum QueryType queryType) {
+ m_queryType = queryType;
+ }
+
+ const Name& getRrLabel() const {
+ return m_rrLabel;
+ }
+
+ void setRrLabel(const Name& rrLabel) {
+ m_rrLabel = rrLabel;
+ }
+
+ const RRType& getRrType() const {
+ return m_rrType;
+ }
+
+ void setRrType(const RRType& rrType) {
+ m_rrType = rrType;
+ }
+
+ static std::string
+ toString(QueryType qType)
+ {
+ std::string label;
+ switch (qType)
+ {
+ case QUERY_DNS:
+ label = "DNS";
+ break;
+ case QUERY_DNS_R:
+ label = "DNS-R";
+ break;
+ default:
+ label = "Default";
+ break;
+ }
+ return label;
+
+ }
+
+ static const QueryType
+ toQueryType(const std::string& str)
+ {
+ QueryType atype;
+ if (str == "DNS") {
+ atype = QUERY_DNS;
+ }
+ else if (str == "DNS-R") {
+ atype = QUERY_DNS_R;
+ }
+ else {
+ atype = QUERY_DNS;
+ }
+ return atype;
+ }
+
+private:
+ template<bool T>
+ size_t
+ wireEncode(EncodingImpl<T> & block) const;
+
+public:
+
+ const Block&
+ wireEncode() const;
+
+ void
+ wireDecode(const Block& wire);
+
+
+ Interest
+ toWire() const;
+
+ void
+ fromWire(const Name &name, const Interest& interest);
+
+public:
+ Name m_authorityZone;
+ enum QueryType m_queryType;
+ time::milliseconds m_interestLifetime;
+ Name m_rrLabel;
+ enum RRType m_rrType;
+
+ mutable Block m_wire;
+};
+
+} // namespace ndns
+} // namespace ndn
+
+#endif // NDNS_QUERY_HPP
diff --git a/src/resolver.cpp b/src/resolver.cpp
index 39da63d..fb9dd13 100644
--- a/src/resolver.cpp
+++ b/src/resolver.cpp
@@ -1,26 +1,45 @@
-/*
- * resolver.cpp
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
*
- * Created on: 18 Jul, 2014
- * Author: shock
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "resolver.h"
+#include "resolver.hpp"
namespace ndn {
+namespace ndns {
-Resolver::Resolver() {
- // TODO Auto-generated constructor stub
+Resolver::Resolver()
+{
}
-Resolver::~Resolver() {
- // TODO Auto-generated destructor stub
+Resolver::~Resolver()
+{
}
-const RR Resolver::iterativelyResolve(const string domain, const string name){
- return "ex";
+
+const RR Resolver::iterativelyResolve(const std::string& domain, const std::string& name)
+{
+ return "ex";
}
-const RR Resolver::recusivelyResolve(const string domain, const string name){
- return "ex";
+
+const RR Resolver::recusivelyResolve(const std::string& domain, const std::string& name)
+{
+ return "ex";
}
-} /* namespace ndn */
+
+} // namespace ndns
+} // namespace ndn
diff --git a/src/resolver.h b/src/resolver.h
deleted file mode 100644
index 1dcdd6d..0000000
--- a/src/resolver.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * resolver.h
- *
- * Created on: 18 Jul, 2014
- * Author: shock
- */
-
-#ifndef RESOLVER_H_
-#define RESOLVER_H_
-
-#include <string>
-#include "rr.h"
-
-
-using namespace std;
-
-namespace ndn {
-
-class Resolver {
-public:
- Resolver();
- virtual ~Resolver();
-
-
- const RR iterativelyResolve(const string domain, const string name);
- const RR recusivelyResolve(const string domain, const string name);
-
-};
-
-} /* namespace ndn */
-
-#endif /* RESOLVER_H_ */
diff --git a/src/resolver.hpp b/src/resolver.hpp
new file mode 100644
index 0000000..d690c43
--- /dev/null
+++ b/src/resolver.hpp
@@ -0,0 +1,42 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
+ *
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NDNS_RESOLVER_HPP
+#define NDNS_RESOLVER_HPP
+
+#include "rr.hpp"
+
+namespace ndn {
+namespace ndns {
+
+class Resolver {
+public:
+ Resolver();
+ virtual ~Resolver();
+
+
+ const RR iterativelyResolve(const std::string& domain, const std::string& name);
+ const RR recusivelyResolve(const std::string& domain, const std::string& name);
+
+};
+
+} // namespace ndns
+} // namespace ndn
+
+#endif // NDNS_RESOLVER_HPP
diff --git a/src/response.cpp b/src/response.cpp
index a4c7746..f0c5b17 100644
--- a/src/response.cpp
+++ b/src/response.cpp
@@ -1,121 +1,128 @@
-/*
- * response.cpp
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
*
- * Created on: 19 Jul, 2014
- * Author: shock
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "response.h"
-
+#include "response.hpp"
namespace ndn {
+namespace ndns {
-Response::Response() {
- // TODO Auto-generated constructor stub
-
+Response::Response()
+{
}
-Response::~Response() {
- // TODO Auto-generated destructor stub
+Response::~Response()
+{
}
-
Data
Response::toWire() const
{
- Name name = this->m_queryName;
- name.append(this->m_serial);
+ Name name = this->m_queryName;
+ name.append(this->m_serial);
- Data data(name);
+ Data data(name);
- data.setFreshnessPeriod(this->m_freshness);
+ data.setFreshnessPeriod(this->m_freshness);
- string content = "";
+ string content = "";
- size_t totalLen = 0;
- Block block = Block();
- block.push_back
- (nonNegativeIntegerBlock
- (tlv::ndns::Type, static_cast<unsigned long>(this->m_responseType))
- );
+ size_t totalLen = 0;
+ Block block = Block();
+ block.push_back
+ (nonNegativeIntegerBlock
+ (tlv::ndns::Type, static_cast<unsigned long>(this->m_responseType))
+ );
- block.push_back
- (nonNegativeIntegerBlock
- (tlv::ndns::Fressness, this->m_freshness.count())
- );
+ block.push_back
+ (nonNegativeIntegerBlock
+ (tlv::ndns::Fressness, this->m_freshness.count())
+ );
- Block block2 = Block(tlv::ndns::ContentBlob);
- block2.push_back
- (nonNegativeIntegerBlock
- (tlv::ndns::NumberOfRRData, this->m_numberOfRR)
- );
+ Block block2 = Block(tlv::ndns::ContentBlob);
+ block2.push_back
+ (nonNegativeIntegerBlock
+ (tlv::ndns::NumberOfRRData, this->m_numberOfRR)
+ );
- for (int i=0; i<this->m_numberOfRR; i++)
- {
- RR rr = m_rrs[i];
- block2.push_back(rr.toWire());
- }
+ for (int i=0; i<this->m_numberOfRR; i++)
+ {
+ RR rr = m_rrs[i];
+ block2.push_back(rr.toWire());
+ }
- block.push_back(block2);
+ block.push_back(block2);
- return data;
+ return data;
}
void
Response::fromWire(const Interest &interest, const Data &data)
{
- Name dataName;
- dataName = data.getName();
+ Name dataName;
+ dataName = data.getName();
- int qtflag = -1;
- size_t len = dataName.size();
- for (size_t i=0; i<len; i++)
+ int qtflag = -1;
+ size_t len = dataName.size();
+ for (size_t i=0; i<len; i++)
{
- string comp = dataName.get(i).toEscapedString();
- if (comp == ndn::toString(QueryType::DNS) || comp == ndn::toString(QueryType::DNS_R))
- {
- qtflag = i;
- break;
- }
+ string comp = dataName.get(i).toEscapedString();
+ if (comp == ndn::toString(QueryType::DNS) || comp == ndn::toString(QueryType::DNS_R))
+ {
+ qtflag = i;
+ break;
+ }
}//for
- if (qtflag == -1)
+ if (qtflag == -1)
{
- cerr<<"There is no QueryType in the Interest Name: "<<dataName<<endl;
- return;
+ cerr<<"There is no QueryType in the Interest Name: "<<dataName<<endl;
+ return;
}
- this->m_queryName = dataName.getPrefix(-1);
+ this->m_queryName = dataName.getPrefix(-1);
- string last = dataName.get(len-1).toEscapedString();
- if (ndn::toRRType(last) == RRType::UNKNOWN)
+ string last = dataName.get(len-1).toEscapedString();
+ if (ndn::toRRType(last) == RRType::UNKNOWN)
{
- this->m_serial = "";
+ this->m_serial = "";
} else
{
- this->m_serial = last;
+ this->m_serial = last;
}
- Block block = data.getContent();
- this->m_numberOfRR = readNonNegativeInteger(block.get(tlv::ndns::NumberOfRRData));
+ Block block = data.getContent();
+ this->m_numberOfRR = readNonNegativeInteger(block.get(tlv::ndns::NumberOfRRData));
- Block block2 = block.get(tlv::ndns::ContentBlob);
- for (int i=0; i<this->m_numberOfRR; i++)
+ Block block2 = block.get(tlv::ndns::ContentBlob);
+ for (int i=0; i<this->m_numberOfRR; i++)
{
- Block block3 = block2.get(tlv::ndns::RRData);
- RR rr;
- rr.fromWire(block3);
- m_rrs.push_back(rr);
+ Block block3 = block2.get(tlv::ndns::RRData);
+ RR rr;
+ rr.fromWire(block3);
+ m_rrs.push_back(rr);
}
}
-} /* namespace ndn */
-
-
-
-
+} // namespace ndns
+} // namespace ndn
diff --git a/src/response.h b/src/response.h
deleted file mode 100644
index 52e11c6..0000000
--- a/src/response.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * response.h
- *
- * Created on: 19 Jul, 2014
- * Author: shock
- */
-
-#ifndef RESPONSE_H_
-#define RESPONSE_H_
-
-#include <boost/asio.hpp> // /opt/local/include
-#include <boost/bind.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
-#include <boost/noncopyable.hpp>
-
-#include <ndn-cxx/face.hpp> // /usr/local/include
-#include <ndn-cxx/name.hpp>
-#include <ndn-cxx/data.hpp>
-
-#include <ndn-cxx/encoding/block-helpers.hpp>
-#include <ndn-cxx/encoding/block.hpp>
-#include <ndn-cxx/encoding/tlv-ndnd.hpp>
-
-#include<vector>
-
-#include "ndns-tlv.h"
-
-using namespace std;
-
-namespace ndn {
-
-
-
-enum class ResponseType
-{
- NDNS_Resp,
- NDNS_Nack,
- NDNS_Auth
-};
-
-
-static const string
-toString(ResponseType responseType) const
-{
- string label;
- switch (responseType)
- {
- case ResponseType::NDNS_Resp:
- label = "NDNS Resp";
- break;
- case ResponseType::NDNS_Nack:
- label = "NDNS Nack";
- break;
- case ResponseType::NDNS_Auth:
- label = "NDNS Auth";
- break;
- default:
- label = "Default";
- break;
- }
- return label;
-}
-
-class Response {
-public:
- Response();
- virtual ~Response();
-
-Data
-toWire() const;
-
-void
-fromWire(const Interest &interest, const Data &data);
-
-private:
- Name m_queryName;
- string m_serial;
- ResponseType m_responseType;
-
- time::milliseconds m_freshness;
-
- unsigned int m_numberOfRR;
- vector<RR> m_rrs;
-
-};
-
-} /* namespace ndn */
-
-#endif /* RESPONSE_H_ */
diff --git a/src/response.hpp b/src/response.hpp
new file mode 100644
index 0000000..95a4cda
--- /dev/null
+++ b/src/response.hpp
@@ -0,0 +1,99 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
+ *
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NDNS_RESPONSE_HPP
+#define NDNS_RESPONSE_HPP
+
+#include <boost/asio.hpp>
+#include <boost/bind.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/noncopyable.hpp>
+
+#include <ndn-cxx/face.hpp> // /usr/local/include
+#include <ndn-cxx/name.hpp>
+#include <ndn-cxx/data.hpp>
+
+#include <ndn-cxx/encoding/block-helpers.hpp>
+#include <ndn-cxx/encoding/block.hpp>
+#include <ndn-cxx/encoding/tlv-ndnd.hpp>
+
+#include <vector>
+
+#include "ndns-tlv.hpp"
+
+namespace ndn {
+namespace ndns {
+
+enum ResponseType
+ {
+ NDNS_Resp,
+ NDNS_Nack,
+ NDNS_Auth
+ };
+
+
+static std::string
+toString(ResponseType responseType) const
+{
+ string label;
+ switch (responseType)
+ {
+ case ResponseType::NDNS_Resp:
+ label = "NDNS Resp";
+ break;
+ case ResponseType::NDNS_Nack:
+ label = "NDNS Nack";
+ break;
+ case ResponseType::NDNS_Auth:
+ label = "NDNS Auth";
+ break;
+ default:
+ label = "Default";
+ break;
+ }
+ return label;
+}
+
+class Response {
+public:
+ Response();
+ virtual ~Response();
+
+ Data
+ toWire() const;
+
+ void
+ fromWire(const Interest &interest, const Data &data);
+
+private:
+ Name m_queryName;
+ std::string m_serial;
+ ResponseType m_responseType;
+
+ time::milliseconds m_freshness;
+
+ unsigned int m_numberOfRR;
+ vector<RR> m_rrs;
+
+};
+
+} // namespace ndns
+} // namespace ndn
+
+#endif // NDNS_RESPONSE_HPP
diff --git a/src/rr.cpp b/src/rr.cpp
index 0b9d6d8..4f55e21 100644
--- a/src/rr.cpp
+++ b/src/rr.cpp
@@ -1,79 +1,89 @@
-/*
- * RR.cpp
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
*
- * Created on: 18 Jul, 2014
- * Author: shock
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "RR.h"
+#include "rr.hpp"
namespace ndn {
+namespace ndns {
RR::RR()
-: id (0Lu)
-, m_rrData("ex.com")
+ : m_id(0Lu)
+ , m_rrData("ex.com")
{
- // TODO Auto-generated constructor stub
-
}
-RR::~RR() {
- // TODO Auto-generated destructor stub
+RR::~RR()
+{
}
template<bool T>
size_t
RR::wireEncode(EncodingImpl<T> & block) const
{
- size_t totalLength = 0;
- string msg = this->getRrdata();
- totalLength += prependByteArrayBlock(block,
- tlv::ndns::RRData,
- reinterpret_cast<const uint8_t*>(msg.c_str()),
- msg.size()
- );
+ size_t totalLength = 0;
+ const std::string& msg = this->getRrdata();
+ totalLength += prependByteArrayBlock(block,
+ tlv::ndns::RRData,
+ reinterpret_cast<const uint8_t*>(msg.c_str()),
+ msg.size()
+ );
- return totalLength;
+ return totalLength;
}
const Block&
RR::wireEncode() const
{
- if (m_wire.hasWire())
- return m_wire;
- EncodingEstimator estimator;
- size_t estimatedSize = wireEncode(estimator);
- EncodingBuffer buffer(estimatedSize, 0);
- wireEncode(buffer);
- m_wire = buffer.block();
- return m_wire;
+ if (m_wire.hasWire())
+ return m_wire;
+ EncodingEstimator estimator;
+ size_t estimatedSize = wireEncode(estimator);
+ EncodingBuffer buffer(estimatedSize, 0);
+ wireEncode(buffer);
+ m_wire = buffer.block();
+ return m_wire;
}
void
RR::wireDecode(const Block& wire)
{
- if (!wire.hasWire()) {
- throw Tlv::Error("The supplied block does not contain wire format");
- }
+ if (!wire.hasWire()) {
+ throw Tlv::Error("The supplied block does not contain wire format");
+ }
- if (wire.type() != tlv::ndns::RRData)
- throw Tlv::Error("Unexpected TLV type when decoding Content");
+ if (wire.type() != tlv::ndns::RRData)
+ throw Tlv::Error("Unexpected TLV type when decoding Content");
- m_wire = wire;
- m_wire.parse();
+ m_wire = wire;
+ m_wire.parse();
- Block::element_const_iterator it = m_wire.elements_begin();
+ Block::element_const_iterator it = m_wire.elements_begin();
- if (it != m_wire.elements_end() && it->type() == tlv::ndns::RRData)
- {
- m_rrData = string(reinterpret_cast<const char*>(it->value()), it->value_size());
- it ++;
- } else {
- throw Tlv::Error("not the RRData Type");
- }
+ if (it != m_wire.elements_end() && it->type() == tlv::ndns::RRData)
+ {
+ m_rrData = std::string(reinterpret_cast<const char*>(it->value()), it->value_size());
+ it ++;
+ } else {
+ throw Tlv::Error("not the RRData Type");
+ }
}
-
-
-} /* namespace ndn */
+} // namespace ndns
+} // namespace ndn
diff --git a/src/rr.h b/src/rr.h
deleted file mode 100644
index d6de294..0000000
--- a/src/rr.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * RR.h
- *
- * Created on: 18 Jul, 2014
- * Author: shock
- */
-
-#ifndef RR_H_
-#define RR_H_
-
-#include <string>
-
-
-#include "ndns-tlv.h"
-#include <ndn-cxx/encoding/block.hpp>
-#include <ndn-cxx/interest.hpp>
-
-
-using namespace std;
-
-namespace ndn {
-
-enum RRType
-{
- NS,
- TXT,
- UNKNOWN
-};
-
-
-
-
-class RR {
-public:
- RR();
- virtual ~RR();
-
- const string& getRrdata() const {
- return m_rrData;
- }
-
- void setRrdata(const string& rrdata) {
- this->m_rrData = rrdata;
- }
-
-
-
-private:
-template<bool T>
-size_t
-wireEncode(EncodingImpl<T> & block) const;
-
-public:
-
-const Block&
-wireEncode() const;
-
-void
-wireDecode(const Block& wire);
-
-
-Interest
-toWire() const;
-
-
-private:
- unsigned long id;
- string m_rrData;
-
- mutable Block m_wire;
-};
-
-} /* namespace ndn */
-
-#endif /* RR_H_ */
diff --git a/src/rr.hpp b/src/rr.hpp
new file mode 100644
index 0000000..95001e9
--- /dev/null
+++ b/src/rr.hpp
@@ -0,0 +1,82 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
+ *
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NDNS_RR_HPP
+#define NDNS_RR_HPP
+
+#include "ndns-tlv.hpp"
+
+#include <ndn-cxx/encoding/block.hpp>
+#include <ndn-cxx/interest.hpp>
+
+namespace ndn {
+namespace ndns {
+
+enum RRType
+ {
+ NS,
+ TXT,
+ UNKNOWN
+ };
+
+class RR {
+public:
+ RR();
+ virtual ~RR();
+
+ const std::string&
+ getRrdata() const
+ {
+ return m_rrData;
+ }
+
+ void setRrdata(const std::string& rrdata)
+ {
+ this->m_rrData = rrdata;
+ }
+
+private:
+ template<bool T>
+ size_t
+ wireEncode(EncodingImpl<T> & block) const;
+
+public:
+
+ const Block&
+ wireEncode() const;
+
+ void
+ wireDecode(const Block& wire);
+
+
+ Interest
+ toWire() const;
+
+
+private:
+ uint32_t m_id;
+ std::string m_rrData;
+
+ mutable Block m_wire;
+};
+
+} // namespace ndns
+} // namespace ndn
+
+#endif // NDNS_RR_HPP
diff --git a/src/zone.cpp b/src/zone.cpp
index 9483941..f5a33ba 100644
--- a/src/zone.cpp
+++ b/src/zone.cpp
@@ -1,25 +1,36 @@
-/*
- * zone.cpp
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
*
- * Created on: 18 Jul, 2014
- * Author: shock
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "zone.h"
+#include "zone.hpp"
namespace ndn {
+namespace ndns {
Zone::Zone() {
- // TODO Auto-generated constructor stub
-
}
Zone::~Zone() {
- // TODO Auto-generated destructor stub
}
-const RR Zone::hasName(string key) {
- return "example.key";
+const RR Zone::hasName(const std::string& key) {
+ return "example.key";
}
-} /* namespace ndn */
+} // namespace ndns
+} // namespace ndn
diff --git a/src/zone.h b/src/zone.h
deleted file mode 100644
index bdc2581..0000000
--- a/src/zone.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * zone.h
- *
- * Created on: 18 Jul, 2014
- * Author: shock
- */
-
-#ifndef ZONE_H_
-#define ZONE_H_
-
-#include <string>
-#include "rr.h"
-
-
-using namespace std;
-
-namespace ndn {
-
-class Zone {
-public:
- Zone();
- virtual ~Zone();
-
- const RR hasName(string key);
-
-};
-
-} /* namespace ndn */
-
-#endif /* ZONE_H_ */
diff --git a/src/zone.hpp b/src/zone.hpp
new file mode 100644
index 0000000..a54c9a8
--- /dev/null
+++ b/src/zone.hpp
@@ -0,0 +1,40 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
+ *
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NDNS_ZONE_HPP
+#define NDNS_ZONE_HPP
+
+#include "rr.hpp"
+
+namespace ndn {
+namespace ndns {
+
+class Zone {
+public:
+ Zone();
+ virtual ~Zone();
+
+ const RR hasName(const std::string& key);
+
+};
+
+} // namespace ndns
+} // namespace ndn
+
+#endif // NDNS_ZONE_HPP
diff --git a/tests/NameServer_test.cpp b/tests/NameServer_test.cpp
deleted file mode 100644
index 92e8bcb..0000000
--- a/tests/NameServer_test.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * NameServer_test.cpp
- *
- * Created on: 18 Jul, 2014
- * Author: shock
- */
-
-#include "tool/nameServer.h"
-
-namespace ndn {
-
-} /* namespace ndn */
diff --git a/tests/Query_test.cpp b/tests/Query_test.cpp
deleted file mode 100644
index 57feefb..0000000
--- a/tests/Query_test.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * query_test.cpp
- *
- * Created on: 18 Jul, 2014
- * Author: shock
- */
-
-#include "src/query.h"
-
-namespace ndn {
-
-} /* namespace ndn */
diff --git a/tests/RR_test.cpp b/tests/RR_test.cpp
deleted file mode 100644
index b14702d..0000000
--- a/tests/RR_test.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * RR_test.cpp
- *
- * Created on: 18 Jul, 2014
- * Author: shock
- */
-
-#include "../src/RR.h"
-
-
-int
-main(int argc, char *argv[])
-{
- ndn::RR rr;
- rr.setRrdata("www2.ex.com");
-
- ndn::Block block = rr.wireEncode();
-
- ndn::RR rr2;
- rr2.wireDecode(block);
- cout<<rr.getRrdata()<<endl;
-
- return 0;
-}//main
diff --git a/tests/Resolver_test.cpp b/tests/Resolver_test.cpp
deleted file mode 100644
index 7db3f1f..0000000
--- a/tests/Resolver_test.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * Resolver_test.cpp
- *
- * Created on: 18 Jul, 2014
- * Author: shock
- */
-
-#include "resolver.h"
-
-namespace ndn {
-
-} /* namespace ndn */
diff --git a/tests/Zone_test.cpp b/tests/Zone_test.cpp
deleted file mode 100644
index da5df01..0000000
--- a/tests/Zone_test.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * zone_test.cpp
- *
- * Created on: 18 Jul, 2014
- * Author: shock
- */
-
-#include "src/zone.h"
-
-namespace ndn {
-
-} /* namespace ndn */
diff --git a/tests/main.cpp b/tests/main.cpp
new file mode 100644
index 0000000..eec5adb
--- /dev/null
+++ b/tests/main.cpp
@@ -0,0 +1,23 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
+ *
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define BOOST_TEST_MAIN 1
+#define BOOST_TEST_DYN_LINK 1
+
+#include <boost/test/unit_test.hpp>
diff --git a/tests/unit/nameserver.cpp b/tests/unit/nameserver.cpp
new file mode 100644
index 0000000..de9f726
--- /dev/null
+++ b/tests/unit/nameserver.cpp
@@ -0,0 +1,28 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
+ *
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "tool/nameServer.h"
+
+namespace ndn {
+namespace ndns {
+namespace tests {
+
+} // namespace tests
+} // namespace ndns
+} // namespace ndn
diff --git a/tests/unit/query.cpp b/tests/unit/query.cpp
new file mode 100644
index 0000000..a92a5d1
--- /dev/null
+++ b/tests/unit/query.cpp
@@ -0,0 +1,28 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
+ *
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "src/query.h"
+
+namespace ndn {
+namespace ndns {
+namespace tests {
+
+} // namespace tests
+} // namespace ndns
+} // namespace ndn
diff --git a/tests/unit/resolver.cpp b/tests/unit/resolver.cpp
new file mode 100644
index 0000000..959a58e
--- /dev/null
+++ b/tests/unit/resolver.cpp
@@ -0,0 +1,28 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
+ *
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "resolver.h"
+
+namespace ndn {
+namespace ndns {
+namespace tests {
+
+} // namespace tests
+} // namespace ndns
+} // namespace ndn
diff --git a/tests/unit/rr.cpp b/tests/unit/rr.cpp
new file mode 100644
index 0000000..666aeeb
--- /dev/null
+++ b/tests/unit/rr.cpp
@@ -0,0 +1,47 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
+ *
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "rr.hpp"
+
+#include <boost/test/unit_test.hpp>
+
+namespace ndn {
+namespace ndns {
+namespace tests {
+
+BOOST_AUTO_TEST_SUITE(Rr)
+
+BOOST_AUTO_TEST_CASE(Encode)
+{
+ ndn::RR rr;
+ rr.setRrdata("www2.ex.com");
+
+ ndn::Block block = rr.wireEncode();
+
+ ndn::RR rr2;
+ rr2.wireDecode(block);
+
+ BOOST_TEST_EQUAL(rr.getRrdata(), "?");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+} // namespace tests
+} // namespace ndns
+} // namespace ndn
diff --git a/tests/unit/zone.cpp b/tests/unit/zone.cpp
new file mode 100644
index 0000000..252e22f
--- /dev/null
+++ b/tests/unit/zone.cpp
@@ -0,0 +1,28 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
+ *
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "src/zone.h"
+
+namespace ndn {
+namespace ndns {
+namespace tests {
+
+} // namespace tests
+} // namespace ndns
+} // namespace ndn
diff --git a/tests/wscript b/tests/wscript
new file mode 100644
index 0000000..261209b
--- /dev/null
+++ b/tests/wscript
@@ -0,0 +1,33 @@
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+from waflib import Utils
+
+top = '..'
+
+def build(bld):
+ if bld.env['WITH_TESTS']:
+ tests_base = bld(
+ target='tests-base',
+ name='tests-base',
+ features='cxx',
+ source=bld.path.ant_glob(['*.cpp']),
+ use='ndns-objects',
+ )
+
+ # unit tests
+ unit_tests = bld.program(
+ target='../unit-tests',
+ features='cxx cxxprogram',
+ source=bld.path.ant_glob(['unit/**/*.cpp']),
+ use='tests-base',
+ install_path=None,
+ )
+
+ # integrated tests
+ unit_tests_nfd = bld.program(
+ target='../integrated-tests',
+ features='cxx cxxprogram',
+ source=bld.path.ant_glob(['integrated/**/*.cpp']),
+ use='tests-base',
+ install_path=None,
+ )
diff --git a/waf b/waf
new file mode 100755
index 0000000..7828844
--- /dev/null
+++ b/waf
@@ -0,0 +1,168 @@
+#!/usr/bin/env python
+# encoding: ISO8859-1
+# Thomas Nagy, 2005-2014
+
+"""
+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
+
+VERSION="1.8.0"
+REVISION="094bcb3e7079041614f60222067e94d3"
+INSTALL=''
+C1='#1'
+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):
+ f = open(sys.argv[0],'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():
+ name = sys.argv[0]
+ base = os.path.dirname(os.path.abspath(name))
+
+ #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)
+ 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å+ÿÿ¼¢Hÿÿÿÿÿÿÿÿÿÿÿÿ¢¦PÀ#(#(!2UXaã¼c¦÷Æ#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(#(ð}ö}»ì_l:D@äí¾×}àòõ)µ^R¥{ÝÐ^µÉcRl*½;¬Ó±m¬)M¶[ÍÝí4zQÐÛ7»{XÁÕtíSÎÏz}Î}ÞÜ$ëîo¾Ý-âåÎáÝZ¾#-±öìúù#(#(@z#(ù#(F}#(ßx¾µ®ÀG½¤nÛ»*;)
@#(h#1ªÊôÛP
PPëACÐÕ%#(²ÕTª#1¤¥@kM²R´R;ïv½{ã×sÝîxÙwSszÌH%Ó^;f]SÇmÀÍx÷{.îê»Vô{{ì÷3µßo>o¬ûægÛO]ô÷kÏO½½ö}s¹íºöϯzû6¡¯J3w@J#(ôhÌks:ï{£ÛÃÐhtt==³ )$"ögOpô#( ¥#(t ë}o6w½õ÷i½s±½íÃÖW¹Ï>÷ßg¹Ú'³N½wWßg©Ä3W{×G¯5×h÷ëØ©Îø÷½6Ùë¯zt}÷Þ÷¯ï¾¼ðix4ùñÓY£BHuï·³sï{¼;ÆÙÍêeÏz>÷[¾®w=3×wlÞ÷k§ÞõAvÙëïw]g=o½×¶;ÞÈûêÕ/7£½o4î»Å¯.{QÛx´²»eïs©ô5sÞßNsåáöÝìëï}»Ï·{3ÞÔ½zÛ´î½ÛÎ÷sÛzZõ¹ÓÞ¯}ïÇC»ß/,#({Òóï|÷¾ðïz<z #(Í#(%T+mf¬¥µ@x]rr+í£yÝs;µè]ÆêTÎÛKGzÆ¢çÛ}nµ×À#(]ç@#(®ñwß^·/VùÞïo|v«ëí;£§Zôg¾âMëËÛ×f¦{ÚödFï9;ÝÏA@»»Æ½¼õG§yÙã|ù½õ½îݾm=.ÛkÛ»ïo{T%×½½×¥ì«#Æ6û¾;Þùöî½=ígNõ[Î϶Þs¶Ýmôk¶^»í×ßZÝo¼öÓÛ½ï_Aöh@P¸²lìïvôW´8.¶Ö¾°¼^TåÞ¸ë°ÎI÷Þ^+Ͻ7Enífâí'Ýí¾ÇÚßf¶Áï}xù¯O{Ù©Ðyôtû#-omÆ}/·°¾í{¾î§Óm¯[°#(è#(=y#-ÞCï²ÛÝ÷ÑÓÇÝ®pwdöw¦à}Ï·AÒ#-y8ÐÐ{Ü#(÷ç^¹79¤#( #(·§o¸Ç¾cîßo;àÜ=îëí§=·Ûï½´¹MkìÊ)A9«Û9)£-fGí¹·ms×v¦ùÛÖç^ç{ï¬öù]ëã¸óé}Ù ½ÇÏL^ôzçN;6ÜÝSu÷·ÝîÍ»·®cÃßw_=TvÌÍã½vUï/Q+ÂÂSH #( h#(2h#(B"~©êm@ýH#(#(#(#(JhÐ@ È#1dôj2Õ7¤OSÓQ£G¨4Ð#(#(#(#(#(H jhÄF©é©á6©ê4Á=OI£&¨z§¨hÐ#(#(#(#(z¥$db'¨y)馡µ?T#(#(z@#-#(#(#(#(#(#(#() @M4Ñ #M#$ÁÄ#-FIi<SÐУ h2i#-S@ôÓQåH L#(MJ~Iè*¤ÓdQúSÔ#(hÑ£ @#(#(ÿ×ÊOõ-¶§d$ÿg%ÊÝÝ«EwoÓ¶ÕÕØ²¯ÛWp$[Q*¤÷ZÕªü6öëj×êý_æÑÙ:_¡úñtõp]<TÔbéïª.LCPÏÅDÈñOò5ôû#'öxìÌ06È`gÜÖí'VJDröÌ)îÙw§Y^ûÜkµnu¯ëÓ®÷dÄÙW(Í/j`¢ÃÖ.%ñʪk#1éÌ$/óv=`Ç?j:&fÍTM×mµ*¢Ú¶i XÄ ,ªZUS¨PjA#(@PÌ"dH@?!D@Ò8 êEdV@ ªÉA Lı¦ "!F3R³DIJKLÙkIPÔÊjÒZ I&ÊÉIYc BÆÓ#1Pli#&ÄZ1DRJZS-D²ÒZIÁD¢ÚT,ÒÅ,MHÅ$¢DM3bѨÕ5-²X&I*-@J¦ÛF&lÍ4ÕL²Õ*[5I%HiI$QlÈÔÖHFɦQ$£ERAh¥*ØÄÁØ¡TÍB#()Æf !°É2%&M²@¥4¤2JL´DLd¥%¨KPcP) XQFfBM"Q1&Sh¤Ò"&E$d(¢!³HÄØbL!$#1lEIa³h ¤d¢£b ©2#1TI©(¤32#4&dÌÅ&³)CBXÄd"©6$FÁ2bÊSÍDSB¢¤Ñ4Dµ,°)FJCI¥lÓ1 5,RlÊ2²LÄ*f¥X#-,Í´e#-JlÑ%*ÓA¡ILcL©2RI2RÄ,T¨±DRj"bLÁ%()£@02CL4IPÔ3YfiL
)#1ZMÉ$ÄIFl&L±CdM#-¦f¤Ñ Øff#-¦M1f¦Å%(³I(Ñ&i$l¦4FÐb$af&#-2¡Â+$ÊÂAdÙ( Q&Q!ÓA22HËÒR©³XبÈ&D¤¶45CI$64H bZJF*KI¢ ,af¨Òd#*3HlµRµ´Æ2h¤ÙI £2R[%¢Ë#Le3M6JRS#6Ä£B¦Ìe#4#-,Ò×ï«tl
¤2Ê2XÖ¢±i64&eE46KATÅ¥T¡°ib%ÄÒF²£4µ j,k&5E¥F
abdÌjZi±#1̦ÛMdJ²²*ÃXÓeYQªÅ*ÒZB³ek5)LÙ
YÈ£MJ-2#,Q±XØ©-clUl[hH©(ÛcQ°Y(Ö"%Q¨4U¢¡µJÉ#1"´Øe4 (Ã5(ÚF£dh¬
SIµf«Mh°ËhÙdLÙ¬1³SJ6Û5E6f¥*e´ªZMªP«*e)6¦K"A[5$¬±EA©-¥´Ù#1-M#`h±¤£B£@BFAÄ!h)`R´mIÆÌ¥bÒMJPÂE2¢,RK-"i¢)±¬¦Íh*,YÙ£f¤°²i2Í&#-Ô0¥#-$X!4±FÆÄdh42S-4JÆXM&±0ÆÌÚR¦hÉl¦Ñ³666(Ð*#IiBE&#-¡K-DÚa4¦ÁØÌÍJ"I6jQm*1a±²#i2+bÂÉD¢I²XMQ¤%M¦lT²ÑQ±I¦¢e¢¦[RÊZ1%²1,DÆÓ(²Q¬¤Ù¡DE¡6**4QªL2LÑ%&h¦#(4dÅlÔÒIRÉ0ÒRÌÈVZ5Ù ¡2´Y51#-¥(b±ÌÐÅI%L*J$´l²Íª5bJɨ$¦4¤¦)d%)JQ¶¨l¤Qd£ITa(Ù,[&¢Å[3Ê6i¬PÒLÙ"bÂÅLÉC4bÒ`´¦XTÑÌÊk1¢Å¨Ö5ØdÐDe*%#-QIIVZSTÊÉQkFÚf5ÖH#1ÑT3 ,ÑF´Á£[QhضSm¤¡cQQ!Z&mZ¢Å¬I%µ(ÍCK+#1£fÆØÛ5%+(Ê4R
&ÊHmÉ´d£lÑI©LÊ4F
"¢¤£E¢ÚÛ-ZhÍBÉ¢$ÙZ66
Ði6k6¢ÔU¤¢*ÅhÛbÑm´mP͵-SR²Ø)bE¤#-
¢É4¨ Ø$)&DBÔ¦V¦>ê¿ ÛÙ¯ç§ûöÌN/ßÌE£n°ñ;æH¥aþèí¬"²'m6ZèOó¢uÿ7ù©ùϨxgtmüÐ}´©þoÐPÇ´øáA÷z^öPð0b[AËRO)b9lø§ùßÝûs¤?åZüõãú¬²ïö¥$É¡ÈBºd>H !\ÈAhÒfÙÿÝéONÈÇ3Sûe29Ƹf#-ÊÀF¡ï÷;GªSVÓ§LKmÃÏ&vrñGÜÉVÌ®#vÐU|¡ãð´âjT#1HßÀe¡YEf3ºUP;C¯ù)£5¹¹hØ´[0KWÍuä5#õeÂÅË@WýeYPFV±EÊb/0û´ÿCP15\@îß½'`ÄDüqH²"/çÿFOÊôÍ-DæÔ²CàFϧü¼áw«Ú²LDÂÂk»Cþ5upÒhAÂtÌ!dLǸǮJ2[å7ÃÏ(NcDÛÉsòW¥!"h%i8hÌPD(ÂÇ9"##1Ú)jÀ®ni4
%Y$رXñ!Ìfb !Ò¼-òØÌÊ1V
©¯9 ~1=}z:¯^Í#1iÇ¢ÄÀUDAÄûC©Ò@ q`®YQ©Qíñ×YÁ2ÀÎSF_1VÎdcF=Z#- ´aR¢2ÒÅmù¸1@U&åÿõ.#10PúÒò%Ë|·Ðd¯JÅU¨þê]þ[Öýÿy÷é8Áÿ©jxK}¹ºÀT(Y1Û Pe@Zÿ@û}W#(ëlDDÔÎ\I$¨4~5Zö¶úÛöS·Ë¦øÇ¶©àJýí|i®%¥c¾o¹ÿB6v
bA¢·Pz3x_cÃ6BH&BGc}uõÓÝÆ¿ô²¬ë,"· Ê ÈÇÎjí(°å~A4>?.SÛ3eXbOVbEÄ3¨,9ïÍý¯èÛ=é9ßÝ0ðØaJ·éLåÜ{nõwõuÖÉÄý9C.á\Á¿îZO§Í6I×ätÓ"Ìõ7ËËéíÙLÛ\Qíµ~Ôõ·Í;Õ·jS.+íçÃicó¶tZ²+Ç2Y7ç+¯ÝyME¸h´úº¾çý~ßõö¾kÚíËrµÝ]±E0a*GZ¿~ØB`Ñ"ÑOµDú(ÃÞ¡'Iöm" á¨WÔöy2úf¹É²øw¿Ïch±WÏ%NШ°>¦¢Ã-'TùgBw)Àé2
aß×{¼uûÚOn~Y#-^ÊyÊùOEHx¿Áe@ ßu#Es£_§Ï#oÚåæÐËÓ2ÁîÉ÷35c¨AùP]Õ<3¡9K(ýi>¦µTNþÀ½it
E/
ÉDÚ¤»ðÀös
¨¤}-L|Döv s!õlÒ¦[.Ò²½Ú§Á§HyæÄ_F¢³éøXO©}P<g¿ÒDù×PÐí#-.æ(q öØäïß(é¨ÇcfcÚ«ÕF1x»= AQëslnçüU(DäÂǶq¸÷¶`}4²z%$R(¢#17rSøKñê]R?;*´¥oV.½ùÃýÉÂý/1?Üå½öÖ;HLq®±Äö½ÕÊ:e*1Äàzð«Öq.=i¬¿«\I°LuÊó¦M¸ÌErøQ×YñÜÍËD%}Ý¡îÁ]#1¥Ðºþz*mÍi6<
HH¹?æ¢AÚAÅJÎDãêÆ=Þí»lùY}¸í~XÊÆ+Ãi©3æ©®áøNWYÂ?¥ä!QÅWåáãOaCÆDçRnÓ(«§öýVMwcöÄ[~fPÏâ:Æß<×úÕ&¹Z6ûuü3ëßµ¾5¾ý3Kjv
9]ö7S¦þyC±«úøñ§è9ÀCS3ÄùZùÿ5Çòhñ¡RQGÝOì~üÿ?ÑÌzgµú»&ÉÊÚ^.Fùhrrkp¢A$2nVTD$ÞáÜXΤÁ+úÔ(+82Jå(½zd×A_ÙE«>Lì¾X~»Æîòw|¢GÒI·ø@Üxû½¨vÄdPCñg§T{ïêÙò§Þð÷~RßÏMLjvÝ¥.ù¨òx½pW²tÂE# ¤edý.c9Êïò¹[]=é¬2¥ðMq}ÔÁæÙ/3yR(Hê£öHé\4í^±ç3iäwuõ¾^îa¥}¶1ììvF1jÓCw6r¥ªò3GìzN¹¡+«<¸å̰cÚçYúô&}yJZÌ¿nklôü7ôm:,¤,[èâýԾɰôÚA2a¸8Ñ`±H»lGè²#X`Ä¿jEùúUÏU#(É?Uß\'«þDñæðwÑAÖ(-Æ}Ùý8âLʳñgÄËüOõL¯ÆùP$
³¥îE¼Ã~ê¦Õ¶s¤þpÎ=bBùR|UÛÕ¦[Sº{Äm8®' $õz¿©Ú9rÒu£ hÕ'÷ÜI&çï{«ø)ÈÁôX~2ß-<ºw§Ç?]1ùñc¶JÔ£øØP]nD¿ÜQXÒ°£\Ê~¿à¸Î}{ô8Õ%:¥c_ê;ë¡û¶u+àË1Ãë¦Q'ß}ܼØü÷íÞ#1Øo¿çB¨dÜ»ÖÏóÆ%¿¶ëvôð!E}éõv8d±=ïÏ.¡mNÍ9 v©È¦d~÷VöÊÏÖ ´Áª¾ï6sJË~>ûªü3 $æë;3#-"¨-éûßkjߣۿKxóAÂ)ÐËÄ~í¤÷ïÂËEãÌ+N<ÂPÅ">úïàÌâ4×÷¢0ÝÞþ.ÓÁ{ÈqCÂ¥1ä°ìCþ¥åoqE=>ÇÏäåÇâ`ÓÃDû3ÅÝÚð
}úHüh" Ý5!¿Yê?|e#1â,y)îIKÙlyt^Ô.ÛIP¦ëñOÖáÇ<HýVþ
M.SJÜü´&~¥© Inw@²Z¡5[O^[¸LU'ú1¨}Ôú÷õ¥¼Ü
@è)txóõ×"§v¼Ê~W¾õáhF~ÁUÍ)±WÒÂPaqóM0ÔâmV¡¢ÁT)OrK#(àÈJñ"1gÅh_ÆG([>÷Ðsy»%Ô=ØnsEêô[{ò^¯·´þ<Ç2wpåÛÇíü #¨9¯G
¼('ãOZí²úU¼t«ù»o³óÒÜy=ê9Úeö|õ¨ßìçÝSé¿I9ñswàxÊqSh»î¼t~û}?#-úÏbÊøÛöoxVUÉwHIÁ¦'¨éÁc©®¤ø}Ønwi.»Ü²D¡n\\½mpÇSmÕ#1Å¢9·"h!rÔíJèH$!#1p%#æýócºG0ØôCÐåÚ&\<NN!(ó²þóßX߯Ná=dÔâCÐ!0`i8ê+.Ë,'U± ÃT=YÕø`a¬Õ`sï~«ØëX²:-ÆfÒÌöÝH{Ð=ËÍëHT±,=ï¢úZúu÷óMGÀJÚÁ[Ý °ÈñàsU^©Ób±8v!ODú+ÝiM,*¬Öfñ°¸ ør¤ËGÊN`¥bjV>Î!ZÄ\:ëpS¶Ð$dßßMä¨Ö÷-}·Î´áÍæíFsÝw±Giq¹2,£Äë,+(mJßwóáû>]LT;¢¾t»}Qc*îçÆÝÉAßßÎ¥àè3´È£ö«Eü yÞúÛ;ÒvI#êøR²©NG楿õOýöÜ-iÌîõãf³§ ÏßK>h£³Á`c}9úh`%Pï;}^Nëo#-2xMOÓËTgßnh~¼¹T8¾0»F%óh¢~ê²þ¿ôßLàý7Ãéo9Y·ëïqSZã-ÏÇ!ÀF1DYäN÷ndüÍõÜý;fzgzoL0S|r.+'#1gþ®É¿MÄHÒðéCC¤ÎìèÂ\Ü+v¨;pIØÓsFÅp)hx¹}o<díÁ6i»EËÅÇ_ä^Nö)ÍÆÂa5"smâ¹Ây<&>3DÔ("Äb"D0ÎW#-MÓ0D>hq~¹ÝÁÖÓ_Éüòv3ö÷îÝUö_glgý\RÛñ±5µ<57f-Q(@¶áÈVc´Í)Ý8×#-ÉÙª¥³_~]ñÌöñÌ]gµµ#-Ñ%H@ ÿm£¯Ù#Ãø;7¿2wíc
Ã_\%õð5qJA`EUÉIOÄïÎ3eTàà¦%Äv3@ÜÆ!<R*XÝ´c²ùmâ¤FrÉE-%QÚ£´ÒPAq*6+VÖ ãBbÖW3ñ÷ýÇÎ)sqù57#(§©9nåñNKUÑS7'ìÏ,ì#1Lfí,
mϧìü#1¡¡T4rÎÓufãÛÎL¢ã/T;?ßã§ûnÊ.ru±Í+§Kô'î¿*}õ¥¡°GC/êTIÆ¡ÇÕ7ÚÊÁnÑ·1RGº ò{©4Õåæp¨g¤3*U·O]³kR®¹þ*|ç?[!êÏwêÓ\´í|9zÙô®µS.£dÛw_»(УsÀÉå{D®y(ÍÇCÞâ÷=küïáî°ôÍÅS_zxä±^aO#1Z½ÚTªÎD¢à¥ºèì¡üÓ!ÊNPS0ãm%¼ôѤU|8eÇ¿Mrõι#(¼Û¯ëåÍ«YµSTtÇ!è½Ìk¿s³)?ÑT#1iþÌt_.iû×ü¥¡^¼átÏOñN¾tÞÊ#-gæÎåâáªÈôû¦hLSÂu&Þ%}~çj[,?Eqߤø¼å¶ËÆÉ2Ô¥z°}4ù¸OVEvgKî^/õõç#(ͳ=FÉáõ_î¾àysgQYÃõß<kã®Æù.`z;qO'²_:aãó·«ÆÏè°¤ÛQ!_g¨i¤UÞöîyu"i±IÜhÕÕ#-1Í@h¤ÆñkÛ¿¶ðYǯ¤¡¡Ï0ýi(ÂòI>¤¼Ö¥¼µ#1ßãßõÄ;Cü|k4{±Õ$zý´apßë:GR":#¹è÷Lß©âÓÙ¤¢ä¢ÛL³"aÓáÞDE-ëdAkrô÷ÇÑĸRhÝ;a2©GÕý}xß«n[!hôJÛB8â;tÐc5²H~æ³ã¦oævsF¸_ó|¯y*äý#1Pá\.\:%F©LÓÉáKéCA5/Îç4|%´ÓÙÃ=³¹ß8srÓ¬¤¹øâ÷ÓyÕ,uï5PµÔõ\û´=»%ã;uºLÐ('ãP#1¡teöú7FSQ¢ðJío,#Þþn¾S±ý<ýäýäqÖ7×8õÁ*3sËô¨ÊúgIkºl]饷ld8À;H4¡wóQÍÙãr)?Q× ¦´r¡¯8ô¯6Êú8¥hlç(7Bìn£×vp
½¨ßÇ>4MãÝ ÃÙçûâÕá~$zm¶>Ê6ßë¶} ¾%éIºñS4ZG.æwP!ó:Ä¢.AÛÃÅ×M&)¿ ¾>O=s×:vùi§kê°-ÅÎáBfå\ôL>¨¡î#˧ǿT]tµ] 4»E9Gú¨[~gw£²K;Õ»Þ
+ùá%'hÁ>:½3¶w²$MOg
pp?Önú4Aï¼Ýf̳®-q.EYÐvÓ«}yª°Vç¡JÖ:ùH±QC´j¨a¿#-ÖÊf&¿ë×uÛ¶l--ê|#1Q¨p¹ÚËtNÐ|´;_Æ)úõѦÊ4º^ªãEþúë#1MÇ?ý³5üWåôîÏÁÜÍaýcYùOù
¯øÑ#1<qÅKJ 2\uG8| ðeGKa¦Ø±B7aùÎÿ¤Výâ/\y_s/'«¹ÏT4ø%ÁðR;=_»xH!
éÍþM<½Ê_¼u¢È©¿7{*§Õj6¹m.:Ñà@ì#-sòó´×ID8e¯VOÝôÖtul5°0ȶ;¿g¢Gµ6kI´LÉhØd9ö´>ÂÎYÆ$X?zñs¿uiÄüº®ókºÿVí:[.ô`©p#-1þYSøÆØXCò-´ÐÍÐÌ;£û7¿êsbËØA$ÄX$^+áù»öiáÑoªD¡Y#-§*¾ÿlÃ4iøù¬J²ÔJ!Qî³>ùÑ{?Þ)E'l~¸rn.rßl»ÂÑMBQMÒPPSÏy*t0§Lý6sÚ"éÃ%²«¸ÅRbBÚLßòzæ:ÇP§ôãÂôAû¾@B=÷ׯÑ?Dê×<¾#(½â Û±°v Mÿ3ÔWeêâ]¾õ8ü¾K¼EêÙ3ĬݮñÖ÷tëÅĶËZf÷Ëö@ÕBPº:ïul
÷°¿%Èý:ªÚÌ#ïËõ;F_Ð?ï½b¯G.>íSÂò³B1Õá¾67OñòtD$ad®¬Ä§%±NE»ú(»Z@qÙpé5@±§íÇ`6Xïøý9ícBH½õµÿl»Ù7M¿ßÆÎ%£ehü¿÷K¨X%DO÷}ذêNZ
³®6Û_ÍKa@DØHp'¥FÈÐK
eß·ëÏöò=ñ¯ðv¥ClHC»f§ó²uE¦³ø§:ÁîÿKÌßEÉ5<¼òäéÀ½»üªÝ+0¯hÔá]½Úýg·¦2¸1#-¡iÇNwÞõ#( ½ñJ9x;í9¥?Î3íÒ"êhIè¼0xH4¶Feñv?³ô¹gx6Q÷×dc§·s³ú¯mdS#1 R$ßÎ
a×H#1ûpx¦a
èÎÁîr¶Ôh¦0g¼U1>˦¡óéáTë×Î6l_-VË_#Æ%_>-olàÉsÉ}LêÑÒ¹OÂÎUºù^OM9#Ûü¿LÛ(xÈ@JG8Ãàî¢#1j{^%z|5jÃÜjÝ-;xc{1Z4ÏCçÛO»úø¾ÛTiËTëÚÛ&ª±eª¡«Tiëú U«Y/<LðÑLp^Ûlßs3¼>kFU;pP3F¾Ôé$_¼ür>Gþ¶f`övÝNUL¤ÚãñU-Xl#1dLæ!ã½ü?}ë⥽cø©5,3».× ÒN¹¯ß6zÿgDµÃShØLðDJ§¥l&YS\á_?Wf×sÜW\;B¾M$!.4\qªÂ±(º/89?T·àÛ}°nJWoTé¾°ÕNÃe0ÃÄ·©ÛÊ"p6ûXôÅsj§k$Ã{MJ=ü J3÷|pÙã8ý7Q%t0Û.#-Ì6pg'"HD#-µÝõε7¯ÂMv/Õ¦a YÚÚoö¬î©«½¦ù¼2Çg$M( 0=X9
íõ¼À²ÞZvßlH´îÉdaCúÎ.3wC Ãz¢EÎ(I¶?O¡ù%.Hi+«N̸"mF! ²·Å«6Xo"j¶u̼"Bt0úâ?s·1Îqíu÷/õË0D@úûøøçWÀÄ@E?YÝçúãXwÿGùCã¾Dw&Û$±hhæI÷þy;.ð×áaxÕ8ñåQÉÞ±sf«Ö+JEѰÊ!#(¦d¨>GîÁ÷)°Ä?W¥íëèR³Ébö®Ø×ãÑáJ#p¤ÝVu×i%gø:ùï}0Ñ?Ý1îÎý5 (rÄØÙ΢/åøo{¹úrG¿ÉºÑÛºÔѼöOM¸{z#-×>W> ÷`¬60cä²1nÔø¯æoÕxu()é¨LCÎçmT¥LÄ#@É19Í:TÌúÐýeÒ]ãÞ»ïln-ì¶udË;\iÙ(#1Ô_V³¬ ÊâleçdKx¢ÐY-³¹gÃ#-Tcn½ü.RÛ|°§o±éLìηUÌ¿R7¥Ub¥ãÕô·Týú>}Õcý6=®®³¶¹caæä$qáÁÑ÷7¨gÓÀnätÎæ¯±B[u;È{òýס;oåsi=rèïÑA$Õj3|twLm-óǨC'å(~#ÊÍ·ö{Êkɱ¯Ø#1Çôù%²DFfsèðrºø>Ü`!ßʯêÜôýQky!ÿoeÏÁ^Þ9³®_¿B@S¹zÂjc¬W"'t×u^væ4;·bNtLɸ^qb*Óã篯uñ©^7ùý}PèÖîIP,nEC ì0ÑÄHý¼øho:ÇÐèÑJ4£Ó+íbIvñ¼1E¡E'$ëûèÇæà£ïÃÁtFëßDcÎHKÖæ¬Â.P8Å^ôyÇf7Ææí²ó?8|¦9LÐaÙ2E
BβsEó'å¡_(w".ÄØH¢ÑÃ\ç¿×Ìé"!ÙÛºBÂ>GtóëF0ÅÄ:dιÑ&ÞÑo\ñѲ/)8ÂE·ý¢O3EZvg#-tOül¸Ço9ÐÕ½ôâúí2FkÏÂþÜ;ßÂi#§²Rú>ìÞaÁÿÜ4hë{&&S?º#¢in³AÒÌÖÅñMPç¼èç"±× ä;("Râ0õB²ihþX'ß"àÚ\$¡±\ÖØ·ÎêY\*è2EKôçGLó>º^xq$é(&_·SW¤k_K[Á%QL±H £!RENØEÖeÃ!´éÈÉÄz¡0"¨H¤(P
=M«Æ¶Üò°ÛõB¬ÇJ×(ö^ëç=ù1Ǽ£7Ò1öµÅåK_ʾ!Å[QD$åÆloïÚTìÞ%ýmí¿«[l0%7¸Â»ò÷¸H+nêJ#_¨\}´ýÓ£~èjÝIòûü÷Y¨ú0£-;Ki{亲ÕctJMHQ+P`£¥%Íj³õp>Ìþ|<©·¦Ø_(ù,Àüæ&f%4ºm¹(²îצvo ëáA¨ß#Å~o!#~ßï»E}zøñå,}OÒ¸Î[åqæ]'áµïY¿ p4qìJ#dÌ¡m¢Yñq&Væ8|Aý4Ì?¯×Õã¢ÑmÆþwï>æf`ÄùòcH4x_lAÝ ¬§#1N3kíÓÙIÄ9d;ì¹(E}öÛ2ô>Fø4ÙÚsîæ$?aùa;¶ø #OË«zgB(Pm¶t
RãûSûÎyëÆµ*xó<'í!rñ²V¤]±D+ e#ogkd[ÔijGÚôø]èTÿg¡fÃ5. ,b`2Kë2ÙDÌwÙ8Ï:lÉ¡Ða:·cÓ9Xor%
aÖ1#(Y@,ÐK}°ÔP°¦Ð)Ì9²*R¬H°à&uÐ
X,ÍÊd10ÒÑôbL{î»SâY¡$½LÏeùÛÞ# «ù£oîs²¿áßmoÔðÌrƾÂàjiS%Úyp<PO-§xImâ'U}[å«À0ü<ì.Ó1ËOz¨»µ2Ñór©1àÛHÝ:gzr!ݪk-ÃK3ÐÑcÅKÕMñ?-òÁ Ãyl@ÈéP.Üð£Ãø6!AÐ0I;gÓ,\@(êT¢´ÃkO
þÃù÷zlÆ"æî*)-²?bºa˧lc¢1*2)0Q²êgpRYz4ÜìVø?`¿M8úøVBíÇ #ÎÒ!'=yº;_Ý´
|*V:=ÔòÊÔ#-pÞ1")6=rÆFL>`À<ìFL÷É·±e0lÒ~òÏH¥i¶`>Ók:,ñíß58H &¤c´|ÕäôÙö?ÊÛa3ûpº ÙgIC»TÜ¿¿hù/½ëf`ü<2ÉlãÝM§1ÉqZ¢Î rÛT_2sôCóm2`e'f~²1ÛßzÁI¨ùQ;Ùóî¾)c.Düqï0¦ÃÿmnÈÁmÏ¥øÇúfö|n,@W#1M(àoãë}uµêoßeyd^{kÆí%Ò:ôn"º&Åe¡0OÀáÚk,nB{ÆÄk-ÊÚæÒE©B$© F@cÐvJnÊ")k=.dVK7ç:LH½þ^iê{ë©ËnÃ-ÇG)dbrþ¡Ù6MPÝå#1{ÎóÈ¥PúCy·¿îl0môÎÜO/°#-ä¿#&s·;Çg¶¸[ñN;¹ÊØèé/Øê9¹\'Mµck/©Câü¶7çAÃAÿhõeÓqØÆi¡aõ»rGMææ;RªÕ¿
rxÑ·ÉÃFÉÂ=XרGíTyöø·´Êx'¦z¿êÃt_(Ù½âbP¿ËDKúªÕ9àþÂ/píðK¤tz¥qa<1±¹XRXNAk q Ô 0Åâ]eÑñqXÊ7&O¼OË[Â}ßõí]С÷ði¾üöÂ|i1òLg¾MÓ»äàD®gùilwÕ¢u|G#1ú?<lªÿ¶Æ(Ì4cÑWá,½|Êþ~máÛqw*¾êel¼ÖóEÚϪðçöJ²»·~þYDü1ìöwWþ]ÿþÿÛ÷ųÈϳ%ñú5Ém¢gbö7L÷¦wrWA ×E¦P»àÔ´|Tc¾ã·oañì®E¥i`J°ÏÙʱZbO®×¡P¯b¥¹Lk|xú§ü=|z~Vòï©êÞéÑüã=f%7ïä
ЦBe.èÑpäøïÎc»ß0ä(ÆJt´/åép#-NJf(e¸Ze.%Ê#-KüßÓëýâIE4檺ÏÞº¯
I3û½÷¹²îUth@vº5GÖüÂúõ}ð«àÝÚ§Às£{Pnoç¿£öób,*kÓµ e©6úÌR¦Ä©>פ´¨Úþi²ÔbÁI: Ë´µ4+~£ßd;û%³ú`~KÈx÷txããL*Úê̬֡þødéYQE [I(Ð@.ÉÕ@Ø¡§÷ÝôÌ÷OCV¢àÑsi.5KCë
XEðÙëi{ºÖ¾J,é¦DR$ljß#1ôÚ6¢2ÂØ×ä~Îðïå/e^«pq <B³ÜÂk5 PI¨ª(IÜ`}èÑXPDH@üú¿Ç³'µ1TLjCÈÊÊJLe¥Ð'>eGøf=ÒʸÿXÝ!÷u`lù¤ M¿qUï2åþ3ø)ûM\]ksõ4¹YÞèBÙ£#(%e®Çûêb)7×Á3¨t£¿T"ùXøa¶/¼µ%ÔP$ oî¬ß-Î>êîªlC´FÈ34ÂÚz³á4¢ýÁúÈ{Pªk\Óï\gïZ ø#1!,O ð=.½TT"QÈ|Jn¯`¿¯véø¡¶T{Fú°¿¦"YÍd'-a©VOádý_Ö¦«ë´_[è-Ô#1D&EêlDþt©Pý>¿ñùxÑÃ×ÒµCá?oÝÙWGw¬>\Oïßãë>j·PåQzø@¥öåï_ùÓü~¹ûy·â ¿Ç8FDé_|¸ü§´]ã¶?[-ß5o«³ª¢³øÁÃÀmZhò"æTcCÂÿuÝTðd¹Å8SÂß::1¦¶B¤Ý¦ûoÄ æëW´«Eo}ç+Ùªÿñ
(}Ìë?\t!SÆÌtj¸ù2Çõ%NÁhwaEý,¦H¸Æ@¸ºF1º*«¹ýµÓ+ûÿ³Þ#(¡áÝ#1T¹íwL/°nÀÅ14Ôïå8ýWN¨Bú¥jgSéÃO"8U»Úîi|ÊÌAn:9ÞEfýh(¶Pá'Ôß/¥Ûû,sJo¸ì<çÎÂ\#7¥¨NãÆÚI#(ôõ.ÔÞäcüÝöþù0ÑñD31°òæ|,¦Ô:F]þç~Ü R<V.BL¡ÇOîí5TÙâHÿcÖ§~á©j·r`ÇÎ3~¿.}4L2þ*/o¢ü3sm±¾¢æÊÖ[ÏËçÅ/ÿ·ð>\Ù0á©2+x I+8Áý/ó@«Þ¾ÒÈÔÚ;PÉB|'¸Då!è¹Jq|·ù|ó¤GµØÊx7w/Io/ªûïóÆ£UQ,¢Ò4>q¶N!A
-- öx¿²<üô½ü:|Hq^ç:Ág^ÊÞ,qÃéÊÛÓ·!ÜPF Kê¶Zb߸ùO~I%z`½$É:dµ#(¯3Næî6ÝQµø}ÿ³¯[í_#>
Ds3Ókïð_dJÓ#- !ÿ h~kZf4¯)iqj\¸·äÚ@oç=EÄ írg'ld0»AÙ½íØTOô§¥|ºöìîÇúvnïþÞÙ*}~_ß}Þ³èA÷ÙËOVK¹¾;«ÓðÖÖ{´ïûÿ¶¾sHkº»;êÚn§ÏDög~ú[©õ÷·^Üôjª-Ïwá:0ã«ï{ëOò/5Û/cü¿Â\ ãÌã÷jëá>ºçvf§kvTçÕýKËýÝoCóÐoÎ2ùÏwÛÃIçÇÕôjòñüI¸qæëæÛãÏU< qãü5Âþu4v]áÄÒ_éæðõztå¤÷ßÛúÃK?LÙáñyô[¤Èz í_f~_<kçÕoTfWTLïéî
^Rµ½.ÞÿAê³Ü9ý:öMüÜoÛ³ýÃU0nß'¶ÏVèn¿25%ÏSÉÛúm¿³Aäᡲþeª5ÔSÂEôOfjç·²ýï'X\\ºalör<l¿Ì©§»w5<)ʪ¯tº§{«¾úʲÎÛ}
ô;^cßÊÈÑÃ&ÏÏU9GèÃIË]¹Õió¹aZøÎQ0úNHª1cʾ#-³å9íZêzE¼ûlï¢66{t^[¤~#1^Ov»|;n×êçòZY0Ën½ÈsrvÕeܹtN«vzì¦:Þ¨»=£¼1K½#1ûx»(eáÿ\§oæ##_ÑÞÕÆéæþ¿Õ#gÞ6G¨øsuþ¥WÉíÜ|";aÆÚ#¦/,ǬÕTü ËÖÿ®«<·ÚU«ñú1xðkOçåÓ)BcúiÉ¥©Yþö|¼)#-2(îûv[ãuïßâ´í.ÛªÕ÷y·Îw»tc¦¯ÌÜøù>¿oíÏÙ>o§.úòTçýç§;ü_O¬¶þj/ù=Zj¦eg¿7Ûæö^åfú>8e´oÙU::SÏÌÝîxëú¸l«¡Äþ¿=±p¡rKÓ\59þþ«3dÖ9ÙafF}zá?VA×f[/Ù\nóù¥6u¬·Ûÿ_öîø|>¿ Ú~¼9kº\Ý<Ô?ZõQÓÜl/ÞO¦Øz/!òg£éÝÏ÷ÑüqýÈIýÉöb$deQãNç×ý?*u|¼íPì+S&q<ü£ï?íÝ)¦ù0ÃX²¢ü¾cö|ðÏxÂ|ݧ?FÓfãý=¿èÕç:ëì=GØ#ó·¨ì¦zé¾Ü:pûYWÐûtl×§_ÓöyÖ>Þ_ïÜ7rc«²¿ìˤðãçöÕÙûz9óïýE!ØyÎs÷#-÷¶ãS_¦æoÙ[='Åùöîo·ô~.úðù©ÛŵhåoÇIî)4ùûîè»e¹rV¹ö|¿òlͽßI¶£ËÚ*õDGd}¦ü8ôý+ÊÕ7Wnè#(ûÞB> úãè!ùqç»{²?`ÂôýÜýWÖa*!°Üw®þÙÛggGa´¹-_/Éü)\víýÅ?áÖ/Eý¯¦Èþª¸YRT¿Ê»ªººY|¨ïþ_·*jQáÕWÅF/óò0¿çØ)ñæm>ªß¤òÁ9¾ZìØ_ì¤Ó¥` À]زÔìsj=Ð!mÚúkÓ É©zF6E+³jAÍ#1Î"²YÐA©ª¥lOEO¤ú®èÇ©Õ]ÜÅ®oQD´éÕwNVócG0pNó8dmáI%¿µÈɸ¼ §W÷qÞÉ$
Tµ£gå¿O¶úad}Z÷söN}¯Pl£Zh'SÔ'õQYªÔc_ð£ãÙ|q:ùnºÎ95ªéI=Ô4l5ÓJ°¨ÏS5µjátzÌgnGÿ [¼Æñ^±«?CçxëÓ£ò½«~Ó÷ÍLxÖAÓl°HBð$
¾ý
¹ûËßíªÁoÑÁ»3ÜJðѫڦa¯qÜÇÕß¾¿íî'ª²ÞÈbsB®ÓÓËm¨3ÐBVÙ«\á¯
D 2ª¡[ndûÏÚÄ)aÍt~Ãn:zê®®EmíÓÝ«:g¶îËl¦Ææ~]'ÝÌ"\B$ÓøÑ¾?>½³4ºr(þ=uÞU_çºoú_ñ¢«4ëÙÇáð*GÏL]¶¼EÝÁÇù=qÓæûÎo/¨ænòÃ&ú½Zá¶moñÞ>èªäös{%óãÓo5ÝÞ« Ú8Kßk/,;ú&Ý÷¼o¶áËõG×}þ\ËýFø&Õ.#IËÊQæÄþÿE%bj ñĽyü=táÜNDªò²)e×ë©õ.¾znÿÎM¨G¢#-ó7ðA¿PñîæíS´°Ãïvcl-(µêÜ0Ú0ÞM!ÔV£xK3 I2##(Æèi¶jLIJÂ`¢2!ÒxCã78RM+DÚ]0ÕdR;¦Ã.FFEÀ¦ÌDnUB¯
^AÉ$û-õZÎvpÄå-WÒß6õIùz_c®nÓ¦ÎÉ)(ÿGôøòéÃ÷Ë©m7öÚq»þ^`s&å±ì{Tòe=ê"ÒPi!!ÇN&dHrB'äÍù[9/=¥@Сì>ïqÌÀ´`XZ88`6Ï«àQ)¶QK2̶`Ë-ã;eS+f&áùRC
ïÝ·ë0o7]_mèÛð(ûñ÷Ïx9ôê»ó¡¨xjÔ´édèÏßM}ûkÒkþÑI~ÿGúO:ßùýÞ|â~ü*á¿WOÜuÐÆ¼õ轪-Ç®jùlNç·º»4/Úë¿Û9þ0¨z¢%I _ÐÞMÎZÔãÓìý_ÑéÇ/?$5¬.)üÇ>è°ÚUöýû ×\µjù¸g÷Ñw7ÇË£8п¾F-¼bð¤ÿ5Òþ]]Óï£ïòþÝ®<&dzù¾Gß^ätI~ï/Åú(®?²®WOó»OoE_wÙû¨ý:½Z
'ªsê-#önG½È ¡KýxD3ç'1?ÅßN?ÂÝFy°C÷íL¦ÓɬÕ0iÖ#-z¸0Õ(Æ#-u0aY¸´)¤[ ¦×ÕL©mêíx×)SdØ,D,¶¡b0'l¹ÌjÖV°%ÁËJeËb,c¹0pÄÌd¾~[vù.=KzêuÞM¤ÆEÆ2a"d£DÇÊzß\;æ ^Ì%m(a)` $)Ä#1E!h´A"DQIH M¸d¯[aß#1%Û.í¸=]p³¼
½á:a´t²å
2ÛI!ô° 3íë3)ÒðÈDÔ¤,)5&ôd#1dvµú ®]K#-ÊdÆ^7¥ÂSÓI¦¸w0(\¸Ç]ÑÐÄߪ°Ã z¡.nfîK½pàÅs»ÿËúï¼×Ëú¦ÿ{T¹RYióÁ쪸£Ú+IñaV~KÏü¾Ê>Fò/w{boìËÌLûðÜ|qµ·cóTwï²Û«®2Ð57lWJ«¢6SÇ[C~6}:±Ãü-ô~X{3ÙÙ÷ÄÝ«n¹E¡¾©½Öç&\Ó6¥½3§EoªÚcÛ1ç9Î2% ïìâÖtTºo&P:R\KlèS&WwÓww¦¢«we\ù7ºâ?b¬îXíôGFí1"èÓOî²Qe=òrÉ.ç飫Xã©cCP0ÃB£\óxQ"'káñ¼.i4ÛÝBLø[WL,#=í=ú`úNé$¡w¿¾G®F7çh3i s×®z2À_'÷Qãcähù¡ÊeÍ¿zO Áh¾<ϷƾEaé)#1×~²ËÔõl¨b|ºãYn#(ýé!ÅɪCJBé"!mbQnev¼±uwKfND̤10"OóÐÎÁU·'çRȦ¦²¯Ùñã´®FÐö8!YäÌÐ[Ñ@\bÝ~j®öpÃÿv;nXHh2u¡ÕãÁàîïue§O÷ì`ÌÞc¶Æÿ#)Jëß_¾y|vî
k®ÊíϽ´½fB9ªû$G±WEñ2ÙJ×çÕ»:«¢t±6æÝ%[¿2I-Æ®jÃVÐã±yjP·¡kjÆMUë[Lågv¡eÃbnD%¦>]ôý.9¹3¢Pìú#1b³!FZVÃÃ,eûé+&µ¼×¢LLDDA:aîühóû~½^¾nãðó¼êµa¯Óß÷oúð0wÑBDXsZ®O EsêNÓìNv ¡2c#(«æîó}Ù;ayH'W8æÊFHïÄmlú0C©T©3nélãÌC!£ÂfC(>ÇËeë]ê$guZNøÇkf)ʹsI¾½i÷40¸ÀìÏê¦òðÃ2#1ñ#-HP«&÷¾ã¢MèöíÊÂ{ÀǾa2^9,æâ&\AAÀL<åQ%#-Ä<a7*E³XZÍq²Í'#l<"CJua$&Bã1JzáÌ6CÀmôÒvÛ%8lÇëÛÿcMè=ÞhúîsÉ/]f#1¢ÆoªÊZ'Á»eÖJÚQÓ2('"#(Á""ÂùP`HyPbjBa:v#1)ê§^ÿD¨õöå!á?}üéÔåÚ+Ú°LJ°~9pë>7üÙ*éTõÒ9d"áÑʦ3â{O_ªÞú4åöi³Ófæ_½Ò¤÷{Rö£-¶ú;Û¸K´^ªXH'XÿRQƦsMxâoÖgåa³»y÷¨gpÆ`cä
hÆÐµ,
«æíµâòófHAôÝÛ38çÎã/¼:bËe#(áÆÒAÅhÂk[,#RðàC9´ËÃZÎ
µ^9ÑÉî¹Ñ¸$ÏÆ¼½§®1QSJE#p4Ü&âÑ £'û>¼üÛÿÀþ4/×Ï4ûãôy'õ_E<ý³ÓÛäð4áßèþß%|:hÞÆh|lû@ÒaÅëVB©Ú-·¡È£ýúN/ ðÔ(#1´k#1«8f Ú)xÈpêÌ¥
*SLlÉûL¦ÄÆä3µ3±%#1Èfp¦¦îgHs`r1Q
@ñ3!32ï$À¦1¶KÔ#mp×vòkÌ^rdÑð¼5ýLäñq{Ð#/
²C²
2Û>Ûæð9AdîÂÏdól#-D=ièÃÎØFwé©8s-f1èzìãȧõnaÐïRc`(ÇÒYK+[Ö[Q:¤ð^w£ùÂÖøQkg9ôÑ9Øê~ßA£¯ÒöÇJ6'úHÚ¯¸³U°ØÍÍÊÌ¿$Ú©Ó¸2É©4NXØ&ICNÆÙÓáè6p¡Üj¿»-ÚcºLå;>Gi:NÒÏf,1è¸<Wqfzç)/æsmýFÏýX ¨c¤#-ÚC}N²V¬FEZÄ@÷ÜÃ
Qr4Êfµ]ñ5ô¥ED:½j̪ڦÌî¸ U+LdÊ£"&£§F9¸Ã¾Sï|îù÷;øµÜd¬=~ß3aÄÄe¦4±Ë`ñtP²±Hª-¨'ûæ±iöCN±ý¢$ÁA¥Á»U¦fØ-¾q§ØÖñ¶\ØCP-l7
·#-·c´B£Ë'%Á̸i¨É\W¸oÖÛmÝðZB%TfèíæMÝ
â®)ØgSÓ?6(!Yrlnt6ØÐZfÂB@v£¯K(_.6+Í|>s¶÷»h 5Û÷ßÉt6BWn(ÖYÞI,É,¦jb}ÃÇ
Adìºá·anoö[ð;ípͼ´%1¡7VÖzW1Æv#-Ç{rNF:ÔuÖ¦[ïµ9XO ¢+¸®2YÌåº1&Û4®pE6kv$<s1PãýÌÖm&û,Õ-ÊÃR¹ÀXb.¬Jd;JØÅp_.In-\'®-#1MY(7:34Á=aôãñÒ"ñ¼ÒëÐ*Ûëß鬱 HéæhÄõ¸Ä`ãE×ôô:$&îïmJ;#¨Dx</;g©ù¾k7¬ÈÉþ-ììZ¼»aV®t¯*Î[¶±gøÑ¢&3únQã3?ûs}ë}è!èDý¢ RðñÁA©UÜG+S^
Xy11À³,ðfc#-ýu:ÎCÃ$ÔçfÄX'HÃÒaà߯¼¤Ì¨Ì¢SsXk{é0ÈÌ¿}a#(èB`I{#"M2ì(4àëtÔ9S& HwrS.ßî.¹x¾Ó4þ¦µÙßÔîìD"ßwÎ9/ÁgÌËÄ©xU²×|àG0æ)7õiÅë)KN+s<uX4K(iàâë¶¼'<ßÎ7o¬òÉ?aÐúÌ\<:1À_/¤¯nr˶¹}O¯ó§4HNîNà
NCy+Dìæêê(ºfÒO}gCÝ~Ìá4~ì#1V&*XçÖñMVì7ÖKÂa.b KÃKµgVJQaïú/É>èzì§ìùô{;w«ÞN þ$0¼0ýtD&/m¦k5Ã"íÌjÖU¡¿JLñE5ådÖË%b;ôSvãʶ?,ÇúSK6Zq:fHeà) ï Òa4·^ÒÆó)¢3:QÃd<ÔW#1ü;=Ùè%ÕßN/ö"0§Sy½d~Â5~µg¼'Bzù+ÌÐW9wáJ¸l}fB¦ÕëHòoG©Óõb®Ç5Æ×÷ôÑ9lâ51v£b¾_j
vø¶¯,ëº÷zÞ1ÎEüËÇÑ?.ñÒðºþÚ*j5±é_µx7ðj#çnúÀý[§ÔUKw÷ì@õü¸Û#1À#1s[cª×énáÚJ¦#11òaÝãâYebIÄN8Ï£'J#-LQáGð¾ëK?¿F²Í#-tpÔ@o.èm¦y;QM"Ê#1'3¦tár±5%oD¯Á¨ÆóµÀèGeßÖ6h¾³#(ÏǰöL¶±2êv¦9yȵµg-Dh¹-Ù1ÒU)lðy!ÝäogsùÄ4~]G8²È¿+]FäH8
IMmö¿HjÎÚO11ç¿©ïY¢ÎKaª|÷µê"BYÚH%
ócL%'¥âÈá³úóÀÙm=¤°ÙÈ@æ¤$Aâ TZ¶Ãk8gcò ²ÒpŸ; ÝYæzàøàìw}´û¿w|0SÁSÀVI|½ÀðÈÕû=Öhñ¢£®%JSlÉä
tÆâúçǵÇÛä¦g\9pQ<.þ'8oØËº0Þ)ºìúQE÷Õ$ñÚLÖÑãÓz**=²ZÌù=#-!¹uo='k<ÇÙÙÙèY%û#1dúóÛã#Eë©XÔDê,÷lBd¿?=3alìºwEtGF#áÑñÅmêBROmÊõAfãÑäBÂß´8$:I3 ìÓì¤&ÒÓQ¬rÂËZ¯¬Ì¿":µRüÎç<4½ê}iòþïÌ/#1PY´x\k£m+u»Y'úÓ×%!ÞNlú0.aßpË£.âÏÚä;´Sùþ¡ã¡
#-¯ôNOnÙ}-°$r¨¥¤.Ãódô¤âÃpIQ¶CÚÉ2İ;:-Ö=Ê3Ñ;¨ÿZÜ1îw¶ú5æÜ²h1Øk¾^drL=æ ËZGÎ2ÌE¦>½«u¿{¶oov²rp÷¡L¶õÖølÛþdexZl6o¬¬äyi]²ÕòÛØþ~IL^, ÛTZ
ûå#1ÿ·Ï7ÙGj±·%7O:(.9m§HAÈn«ÓéÜA%ö²$'Þz9ãn´¦Ý¥½Ðƹ¬yÇ'a§guD]¥%BmNäÃ.IªàUqåÀlÛ 1FÞ'½ò·"öÌö* Xqå2èäü:zÛí¬(eM ºxÕ/fk>âÿëíØM=7Ú,%rî®I«îò?2ý>p##-c`Aä&ÒEl?}þ^XÊ-ø£íé)ë©Üì6æFÌÞÍ>.Öº¡ÜðA;¤xí¨3{bMàÅï?ìZòF>ta]åúò·gúVsÅq²¯NÊøã}JîÝÞ4Fû»¡ÏkÎLgxNýpe½Çé5Fªâ1îÑéëyFÍ«-8wÍÄ3ËÆzå,cgÖ!V<0-áíÚêW¶é3ÖnÌ>¤S$qÃñ˶ó·ÖöAÕâÓÔÙÔFhuBåðñ¾&øs]_xmæ>ȧ¾Ç¬ºeü6Þ?wî¹éçy>[o>zì¹ÝñgÔ&«)@qe:D%jzÑ-yÝ2$ð¾ñ5bf=².ɼÐGNí}/|l©o+zª3²8m¼b%¼:1©«6I<7ú*¶ÆÝo}ïàíi[]t>Z3Û®ä)Ý¡·íÈTØCÒlM|J4N¶-¬rÛEÐÐvÊ=ùQ=Zôô½ >J|¨<¾éäÛ³õ¿+/wq\o.±ÉyÄîA¨©1í{éz=Ûæ¿Å-ZÇ¡¨¶Ùðɳ³µ©B!OvûxXJ#-îqèÎäÒ]²Q³aU3cϳ¶#1¸0#Í&bîðÚùC,úSSm,ÏøCþqÈAÓDwê_ÛÓ,gÒHiÚÜ?DC§BÍp릮ÎÓº}%4UuHK[̾pH{JÔ£}L8a¶'îï÷®üKñÓ9Â^{âT±ÔÜòϺÆå-µÙ.#-»g½áÞÀÇ£©(ðRæH§ê}Ã;ñcA²mc6ÆG¼Î6öm¸¦î¶,Ú82ÞQeÔä)Å>0ã¬ÀììÝOy{É$»{ðçeF$.®$ Y«©;ÓDiÚJy©"ú6ó$èóÃôe 'ë.-ySHtl2}ü.æi½*ñ;c#1È ñ×0±LË)mÖm#-öÇù%{Ð{´ðûø&ìÖ¢ÃXñy©luïb]êÈîº#-ÜW¿3Påz~uXÊÝzó´åǦ#1²©4 ]ÕÙÓR%â3ìc¤¿½g~#-¯(Øô&FÜnâÍܱot{~U9#1ijsVº>h´#.âìM)t<kj#1m}ìÇSã³G1L¤åD ½öÑ(vy¨*ªíýÔ|jZj´/~EGÇøow$êVÝcu¯Û^=%ø·GáWïÇ8ã87ò#-ØN3ÊÓLÖwØÖÚ8ï@±$`ðz9¬½Ê.þsçûæZ$³méÔtÿDNÆ\öGÇEâVOÜVÎwÛÕܪÑç3óÛ¶8:»ôY5#1"On²8Ýl(H«ÁÇ#1Åôÿ(5yk!ô½üKò°³NZSEÜoÉÔß6\Eªªyv:øí²àlýÿѦê®#1ÎÖñ°"ÍI´ølý²ò¦1Sæ#9%dãe
Äôò§+ñ
ËâÞ;¹
ç©¿Kçtmzò),'d:ht.«ª½#-+÷[
è`ç+¯(aè"VC#1X8êçó¢eªo¨ªO<oÆôÔå§NrÖ³Å<mq-½®Ãccº>c×u_Êyî8aÌwy7ä sn:ÁGúþYúê»uãiªG:?¢kÇnoÃz8$GþÙÖo%õ(ÖË×Ûú4Ýÿ><4Ò#1:nHByç3Ö7öQ ]:g¿²üõÚåtS®nZQ=ðªÃhÏ*¨Pú'iã¿JzÏ>tQzn;ù.[J_ǬÛû{ÇȽþ·Ú¸8Ç}?)
ÂÊçì]ò+ë4G_Il=ºykbUñ*+½=%àDó³){b ¯mûoù,â£QÂ8°¼:ìíëkøk,%_d¿æ¿Â¬ã1Ë£Ïíðàj)Uyiõ'&ã:[EIiõæ¥_~
PW>ÓÍæÞ×Ï#1ºá¶öóñ¾9¾ª8ÌþçÉÛ8å'á-ÇÇë9D(Âs
Ø^ØäÓ³ø;N\ÉÄmË9WG¦ÝÛYgà¶±qøô1xÚõ¢6-ØýFÿ|c3r}õ×|*¿ÌÙû¯´øÏq^[Î=ÛhÖòÊ·:Æø¸Fâ1ê¡°ß^ÿüêñåðøÏ«ðyÇg:¹ëýRÖ¶ÿ/(©:¡öJÔõºÊð~ا:³öNÇ~J×ÛHî-Ý¡=~¿i=éõ´²=þÅdе©ÍúôÆÞÌÉ+¿m¤´¼{ïiÒ´m_¿¯~.´ú<"»ôòÅFËó·#1tÐì¼Áä¥Éû Ùxµ(Ú%ùâ/¶cºëzoLãÛPrFÑîä}{ónÈBMxÙq·ÃÏ}ÜÓ%âòÕ¦ÓfS^ätÎË#Aj3ZÔãÕ¦ÂòE!õ_K¿>e¸\ÕÆiS½Ñ¶QMnS³8]`õÔï±Î²Ì8éë/EÁ:e¾nÐð¢ôhÛ?í¥³Tz!¾CÓ«Ê9´)SEjøjhhÊ6óøýã øeLÆ÷Ö¶^Ð=x/×ë[mE¯4|r^yNg¸«ò~3êQ<d§éDæû<G]+pyóòn|3¾h+ÎM<dí¦Óo^KaÂÑß\pm+ó¥¥#M9ÍQ#1]ÍEDºkf;í0,b°pýñëM 1U´$a¼#1Á¼ºÇ®xÃç4¶÷CËh(ª.Ý3ß
tU¶Û"_k=àÐU¨cqUòÑÍ&ã/øPòO>«/&ýþoÇñüSÍ[1¯EZTB¼ÕXµpçXÇ,ª5,¥LÌÖgíó¯oÜûýX"öý\uòzI÷ÜÊ5^2vɪùÓ¡òëû'ʨÐΦjbÈB¼Ên×HQ'ÉG!å>[{|Tg1²=À³{ÔÝx¯ÑÄæBÌê`A#1¢äEêEê*<F¤N_C$é1»w|v¼N~οæ|á3§xsfsÙâ_õ¨¡ùÜq%ôÙ»KÚH6ûã¶¿Ýw~/JSÝ1bóµÍ´p®VÙ;Ñ#1eÖJøAÝ7W2,k
Tü8:m®5¸÷>×=÷<öÔ·åÍìþ}z.½ [TÔ³Åæa8ëÁ;6dÊ!çÃÅybS
0c¤É/"zé.WxâØý
9wºZ}khÚ5g*Mo[Ë<¸#.,:ñ(Ò3·×´>ÂÛnþó¬Y$èW×SÓ£ÔýkPO`ùu̶²òñóÍ&^¯,BTì'×+]øÁTPüÄßÖé
IÝÖòÇ[óQ9¨=xVlËvû¯]í®#-eÜHTG#1¹ïtvÂÎ:Eh°ÿöQÊ>médîù#¦|.¢7 >/·o}pe}tã£óºe)®a¸@߸~-ÛÏ·fzÔKg]EU»WúVrÊQm(ßyÙ,më®þÔäS§ÖoêêAóú|º{««*h
Q/VÚú(×#1)6Õ?çd¬¤õ¡ÑzÝ-ÔÁeR¼]c¯_\æ(>_}¨Õo×û(z¿|}Ù¼ºÑúOOKq|9{Y>ÒKôÄîÆt,F"èö9¦·ÑÎìð¶Ø»Hp<äd¹4ÕÐGDÌÖQO~ʦÜð±áW2¾;pS8C:;ºÇÛL*¹sßt!Å\ϲ=ñ4å®ÿ±)iø¼»=(#1^wÁløØ][»_ÎAÎõeSäÎ|8=~õ¯Iú5^Ý0§N=J%¥ªq#Ìû.róP°å좡ÉÃw"íQÏn7êÑdº?_£ìÒÇ'ð®x[V¯ê´#--³¦èC§/ ëÑS1tx?È^nTY;SùAxG»ãlŹö¡*¶èÚyøæ#ÄLtüõÄêÂx«ã2¹4Öv;RÎPC}Ñì4"RMZÔ§UfDz¬ºvIðmuKS®Ófàöò¾²8¬üµüÔ#Æü§é®ÛäÛn\Cà¯Ýÿ+¶q¿$|+âãqMl¯æÅcËã]㥫N¨¨ÕFá%f
¸·ª#-¾×Uü°
sW,¹Â¹ý¿¦KÖΪ};8½1Úo¬4#-Q<]ü½#\êG÷®â£÷8wôÃÍsDÌm½ùLz«èEÊúÞzëïöã}lÄêÁǥߥôÂÛ&ò:«õÅ*1f;øLCmmûp¾ÿ§Ê1ñ6Úd'ÏRq¶d)vÒ_ÇÎ)ª*£(Ç´#QÉ·üK5aIRÚ³¦èzù-Q*MP2"ën'W¨/©ì¯°Õ£¾Còj¹ÌQ¹WôÉ}nÄÌÕtY²Rµ«(°®«ºõWäÓÝIÝUWrP Òq÷ùCLxCJ^4ï)¢"Ê;ßdëáG\m·ÅáE×*éÙMÙWLgnʺ4¾)±èÓIu¦AÐÕÛáÆËQÀC¦l7¨æG"zSݪÚiwïÒ|
>N0vôn /õûcgl¾1l8dN¤OvJãÖ°k*®$:w¼*w{¡&)
´Q\z(å¦ÈMÇ2ðùOý8Vs¬æthô÷]J®ø"zª#- ¬¯±|»qÓßgÁÒbQ1ÖH^ï+o¡(?`ÕRª³âú=ù8tó\Üì¤ÒØÂtehr¦2+ªÂªØzè}/!xB´Sv9D.¯PÞCìQàÕ=õµ}ûMã¦ù]µiþ>>§¦,èüh¼dXó&³æ±ß&£c«á`Éà¢<x*æ,ù"Ìj[¢uâåTûÒ{±ÐPùGe#-ÝCÆý_U«Ü±ºØ6¥²¬"]-1³#-xè¥ÇÝÊ&rtµ«§YSY_Eâª.ÐîkKt¬9cDÚ'¤åaüÿ,/¿bä77%^a£m¹
ֳȷ÷)Ç£©í1ŵÑ&lѳ^Ô¥bðnzÑy~ºXu¤EÐÓªØG<oË/dÕxæPêw½$tuVÇö":¦<HXYÓì6ºÇ-¬\M®µ=J^-;¹©ó¬¯¥õQß}Èî%¥´µ*óôÇâq¬2mî[¹9RkR7¸å¨«¢ÈÝes5º*ºuGÕSÓÝkGO Ll>q"3D¹Ñmä#1ÇNFǸúz×Ⱦ3ð§×ŹÂÝ¢"ÑE"9¶fôJêÐórÉãII#-°neìýOÇé']fBOÍûg|äGi±7ý\群#-5åDïÅoLy7âGIlï µO£4e8
Û¨¨=Ó¤BRï\èB^w´gtÙ*ëÎ5¯|;lw·Ûºï¡¼C1Ýþ9¿Aö-&¨ #,ì;J¾ì]«IÚ®è§èEEÀêÜv;È9$î¼»?}&^rÜÍ:í¬4%ÖYɺõ÷tùpä&¤h¨S»éçÓh;7íÞzùñÉÎ|fã$#1çµóÖ=Íܾ+ÝAþ+ÈrÕÛ@ã"I Çoøo·w^ áïÿ9o,cqeVWÔ¦ÑxWz¼2ݲý#-ÿ,9Yûqîé:D%eò¶êÈÛ{U,ô°vÒ릫½níÆhÑÂ;ý8LÒßI¿tü}«ä-5±#-0x]ÉNÕÛÍßõ®/(V¦Ó5ɳ»2££gÐEEðéǨ
uùUTvÌ®Em4ªpKåÂV98ݶèo( ô~5Áó)ÈGÞ¥¦) A.æêH<\÷ª'*ê¢:å?æÒ¥=óù ²ÒQâC[ºlS¤ÄK¨_åû ácLÎ\?§Ê<HòômFÛóÐûjKÝ;&^þÎx)BA³ø¬<È<´M9ëô¿Cò¶:,W3Éu& â¿\>¿E¶xx´¯¦]æÙ«c3E¡#-éGï?NX»¸´%=¶Þ¸ìùUU5
ÈJbÅ&¯»Eui&ÜÄ$3¦G²ÿÓO(/Úçz¸FLý©?gùKD`¤KH«øv¿:Ã0m%´Ui#1(6>ÁØÒ%ÀB»Pi¨+ÿO1@ѦÃß(e#ElÞ}'a^E#(`Mi´Z!4{ëZ¿v_#1Sì8Ó àÕÃÜ2qñï¿w1\õRíEXFJHø)H¨}Ñaª ¨$; ])^¢'©¯>1IÂæõý#-/H`#ñf>ï?lúKé¥ÌV¦WÿùtxÏ"¡ûÏíÁgÝR*ÏF "{OÞÜi+ÚÂæB?ÒÌ8ÜзÚ|aëâî·¸ÌÖJø(ó·Púõ6³k¤¿£äøë³äSa4Ç¥Cá£yÏN÷áãÄ®óä?'ÃW üxà@Ëò¾Úñã[®%&Üíµ¸wõ5_-ÔúèMréùÊ"Oå1.LôúÃç
G1°vwKÔ)¥µ3ÙúPå/ìþJzLÐìkq̤ó}þ¼UÒb}DI)©öÒ#-zÓëµ5v5,þ$Ö;ÀÛ¿.gm¥nzÞNÞĬ5ó#12áô?Û·âüRxÂBO Î5̱¦È¶÷ìf|ôK×¾4(kxsÖTN?Má[á¨Êñ÷ökòÅ´º7à@t*O·©ãuUe?÷Á#-)æÝHØÆB<3øG`û¡æeùPN7j¹ÍYÆ¢ è afT({7Òä`Ðá#1õº²,OÌTã"ýa`µø2ð¤ôx_r_E#(Ö ð)\5V@ÍÂ#1YÎt%k0ÞÄÁ41Z%ºì×ÍS3!À¾ñ¦õX¨eUÔ¼ xUö9QÕwv¡iÄ+ö¶d$nÿ5Ó¾ì'oOºo©¶»ZH¡a\#1øJÌS×FV#1Û¾´HGLn³¥1÷áºÇD%áðîhÁD-øvdúÊWÙ(?Â|{Á,X[¼²Oý´ìÐ$h[×ózD5i¼vLi8Ï0vþ6éAî¬{MµÝTá#-Ó¿jRî·àî!°$n6òãÑ©¨¼©å(ÊI6-Ô.Ø]ÉXB#-D³ì*²¾ª'rAÁpwLo(VìçÌ5l§â?[Ù¾Ól;úÈâê9$êhöçQã·E¦âúÓ=;¨AòYèáXqçhdS9Ó<BÛO;À¶¾´Àz«}æ«Ðq0$BðÞ§iB&8î¶®ãñ©X¼ñÙÊ15kÂ4£bu Ýì¥û'N7o2êè Í_¦!Høá¶|3c¤ºBwQH1êâì¹ëkntL×Er~nÇý%¥4F¦<8öß[ê.ÊXÓÍk¶kÅH/ñI9ápÖèÅ0`²D¾;#1`
§N;<ìÇg¦s·ÕgÒZ!¡o¢/ù6 L$+¶LLKV®ËxOD%ÐLs\ fJaÐÓ# ȼaWGYÇà+ Ju¯æ^%ÿ þ4·«KdGO;¿WHçcMÆÉìf&¨BÞR¶Ô`×Úá92¸[:(ÀêѪ£^,|¨µ©Ð÷Ð £ xhË4ò+:g·ETD:gô3ªSlË8ÙÚ_ðÙE©Pêç°c¬Ñ7<#-1\ùá¦6 |çÖr|úçÃEl6k¶ 5qJ!¿F4=Û).KU{)sü{¼¦¬I,¡¦ËdÑ.f¸é#1#-)ÇhÎþ^
&ÊócYúqrXÂ#1å5WÅúÊ.EÑ`CÈc4¹Ðdï&
Ï¡Uñ˳®Äj 31é§¡Ç«9¨ßí/µVÍȦßV6äÛ)¸d3úDhH|}áè~± .)ÑVlÚP+e³[ôhèÝ/*DZ=YCë#1Ü&Jt¿CJû+W©hºBh¦Ä0Ü/fHw=Í"çg£¯læ u¡¨Eò fv_ô¿²ó}`û3nNÎÇf#>çg)àõ1_!_W"(Oª¬8ÁÑ¥ü`7C%0íÀj@÷Ì«¥@h©÷;ßeYÒÓ1§Fý×Ä~Õæ¦O ôß@Bñá°¾¶bG¤)\#-²ÁíÙ+¾]6_ºgUvA]v e`º°b[7'xÓM$;ReÂ7ȳ'iXVÜ/uð¼êðïp£[è1.J÷}/0ó(è/¦!£?VäSÆþêm °ÑíO(ö#´×xÔ?²+ë¹ÎÿC]Ëg.P&'7(@-O%Ý=ñm`Æt±ôÚ#(ÖE(û}·$4aóùd(÷fT@^bhÚ,뺵ôçºwÕ"VÂíáÀ F ²2`¶Û´Fóshnòà-^øuØ©×4É:Pyt?¿)¦(òYÕw^AIáß £¬mÎ^SQí.øÉ`Q#1ÑMDòð¤Ã7ÍrpQéäÃ~íG9[/dîí]|Ñzàð:M5:b§XIô_©5fQ@ Í2 UU{2Ðó¡§^Tâé)Pߤ~#1ÃäXæ%¹â½/åÖ,CþÈGD\²,Þk×ײh)R(Mãi§tu~;yÛÙnÍLlnb©+|Iê~6ͨê±ïfÙ©6<ö·fÖKî±¼áÛ*ÛÏ||¦v¼yﮤÁ'vëfHnÁ|jã>Ø:ðySóãsof8ØÝ¨0§HQkÆÂÃÈXwm$§ðA ôa&#Ç÷ -4ûïÓ>íycµ½ãÔÅË9ßGCVÍÕô.ÜǾ¶ÕÖÍ!·;ó)¢p!M¸Õ¢#-*ÀÊ£#1¼Ëºg9B¦¡¡«aØÝd7ÝTÝ-=m;ÊÎðûÄcNíQdSWßîïô}#׺TM×rnht5`Î C2{¸`®Û®üc^åÊ·±¨ØàÑó]E4n(¶`õÙÅI&î²ÆÒ®ÆÄúMêÿ$:M«>½»è ký?㡬Y_ðÕE,Z}ìl¤Ã(`ÖURÇíü{Q 3wNHù#1ZÜNãrqTÐd$ÛöF$"%y<ukä¿®uV
Pý¤"ݬµòÄæÃ3ǯ3I7ù à§}´p$L&ÇÐR0û¿ïPÈ~?ÆõâPÞ¿Gª'0ßBkâ8Ñ *mº²SL-¨n¢ÏGfÀ䫸½¶Ä~øMqNjE:aÐø½öyÁpWj,Iª;ç/r[?>ï««uuvn~ô"¥þ_bÏ|ÀwÂøwß¡1Öæzð¬0AH÷ksáñù*)=Z*"¥Öv}$Ã<Ïl*ó7ùSi
¶6 ³X;R6é3jV·lëO²aÞT/Þ|ºrI#-þT:¿#( 3Ð#1?O#1JN/AK¶ºJ%Ü?æüë¤ïÔ¦A±ìíPÓ×1Ba¯¥,CÄò`O©$Ùú¡ú5CÎjXBä8!sH®mñ¯ÙAº)½»¾Xm]²èh½jôGDäO8ݤõ&8T#1Á¢ÈÙ /P'Í´Õ]¶s#-<ôqsI¦¥I}àA®¥eÀ¸ÝL6ı-ÿVß)KÕ)(Ñ`@&ؤvDÁAkÚ)±`Ybå 8¦öÒ6bøÈ]Lÿ¨ÚòØX+a¢FL!4hpQNM ±õç Aþ%ÜLºÒ^ßq>Ïv2ö'RoÇ&dä(ÁàfÓ¡IÙz,¢mçtÁÝvz×7êÓÝ÷Y5ÞS&¢ÉC#-ÁcMúOwÞ ½¬Fþ¸5h¹g©ÃÜÔ¬¦#-SIáUÌFfj¥öUS!#*Äj0ÓaeÊO{Ö
uFz[óTbâó[=cÿÊ¡ÏKcÝÇ¢2Bÿq&Xèȱe@¤·.X$ÇÑC7ËHá#-¦YQ®ÓnëÌwÓË¢§¥UÀ·ûJ¨C§¼LsÊH>b!´ðE!¶Ä|ÔÂÄä¤ó2ÉßEôMÑkQxñúÃË'Ìgjkõ¦÷Gj>2¢3ÃÙ¶±g½I:µ½Ë_Y!ú;\\:$Xò`©0z£FöLãXê»+#ä ¾Ï½éÐÖþ© ÜÚsöx÷ÏB0CéúÀ©Ú FªÁdH£$IE$zËÑòÆ(ZÚYQJ[ù½ýÐùÃêðÖmÌåmWu9oZÊG}Z¼V{M9Âpd9ÀðTXÉèÔjË,õ Dy¸f¤£+á1gÁ°óÒ,àJ9d@ðâs¨ÞD×ÙÅ-#-PrwCõ°q-à[6\p¼xlkQ^'RHsÁîÛí-aÊ>e8 {¤]Ù¡|Kéãnç#1:ìQÀâ?.Ç§Æøi>ÕrBxÜEO.|zHIµÐqêwG\2lêFi=`ûLÇ#-;Gn8N8*-Ü×Ô8cFto%ûµ#-¥qÅá*I¸1Õ|¤25D7ÂD!MèAÎ%Ä7
EERAE@â´A¢¿ uXÀÒITN\[d2ØD}}õ·¹òI§h#á£VjD·éy´s¢xÎzvè#leLÉ#1%I\£N]ç#O0L"HÊ}¾Éý6rFêµ´Àñ£ÝmIGäÕùyÒs1Þý|¬gr,2#(ȦÁ°ß!yß%FBÈÞ|ÃDãG|2H>g®êúqMX
ÓÀ&1Ê&C´#1C2¾íµaÑ $ ãʲ;ÉíÎeè/¦Ò$
ràYÅR#(nFb#-DZ, )P%MÓøPÊ(b `gÝÀxÙZìÖåíÀU *Ã1+uáÊK§È !´N8-,Z|ù¸ç»oú8¤ëÊ0øÕYEÂ@ÀIîdz}^ÚpÑ»-Sl|7¼.¶f)³3NÉ.ß`ÕMÌB P£³·u·jäÉyÎ]Á¨i§3¤cèA¨'`"v:ñÄçTI Ã]d¸cر©#( +ô"°%1a}nViÂq.b±`tÌ×èÎò±0³ò±ð.ÔL äU·Ôj@§=꼸öß²¸ÌÕ¥; ;II¡*tãyh°2ÿa²Fª;pehDk MÃ^qº©ïü[á}«V©:fѧLðfØ%bQÃ[Öw÷¥iµ:K%GåÏk9Ü#(¦tû$%}ôDçE"{uΣAêFòáòèj·Üêãî3§Ío7¦ã_L³N·fi¼úl×ïÚR¤òï#µ±a£Ýï$$È:á½ÁøtF8åéh².fnn|Ã4]7=)@)ø@h>><-yÂÕ±ÛpÚÍD/#-/L¡ÝÒº Ì
&ÓCqíÈÎÎhÛm= áoÚïw#1|&ò.GrÁJ¼ðm}ñ|PÛLÈ q²<ü|±#-õª¦m" |7ØÏÛÌ}wÒgà-¯?C5«m'â·FÈaiWKêxó«A¤wÏyÏ)I¾Sh·Ï³c{Ì73§g8¦îàþI£ÝF!H¥ç»Ûhs¤9³è¨0¾OxD_®çÍÄ%@HcdIj¡è*p÷Þ¼ù᣻Գrõ7Séö ÉùáñÕ²#1¼þX^Îl÷ÃÔ<8UCÿ'Ø^uÏ2?Jø¥Iª¡JwðHJ jC:L
Ù¶ä{¿Ê×áÙöûù³µLj¶Yù}^¹*±ßðµ[~<øt¯|vã~sá§]×GzøçÖùôòZëQCBµANÃiÙ#-¯dFfY¾ M«,;¹Òä#1¢ hId[YÀ¥>.VÍÊ©QÜ¡Ul(9\tRæ!,Ù}äçÒ£$é}\5~yú(RoõvǤ e|HàÈr³@ÏѬYFI©:°¦ß£áÜ4cHÌwäA·Ðr$Eïµ"Å#1Á¾(ü}óÚÒ`NLeû+§ñÜèÄ®LÝ uDCQtNÛÖ3ó&a?ÇÔfÛø§½°hÀðGçýåö'¨¿sUNv#1±>è½-8QQ¹ÜuÓ2)ÕP\©Vºt±AfncåQíaÍÉA êí×BÊ;¾FÐÖì8#ßÒ3°2T¬E«VzJuòþx 2¹Ògi©à¯Raϲ6t÷DtßÛ~2¾w°pó:y%i5®qYÔùô19¼¢¿Ö×hG®¾ÃÎáÄ·ú{ÊÐëk$ÐÐE9_aãÉcqX\rÇ*¥7Ä|È0u!ËÚ=èØbIwéd5®õájq'ñánä:Ep\4±h½5ÕIf$¦Ûd;>M|¸*RÕëv8'GÓ]Âm#! õnèè_>¼@Hòâóy#-¡ó)Åë³:ýþÝè¤`¶{aï×¥K°ÁÅq§2CnC$¹ÅÄÍ@Ñ<°p.#ÃÖcç}ÍãÉÐ={÷-AáØöx¦Æ[s!rf½#1Ð!8IúSßÛ1PÁÇø+È\ôðÆ÷Õ{78Dè ½8jìªÍvÙd©¬¯¨ÚÛÐÑôòÕáPWñ¾È¶&béæ;籡=",>·ýð4ÌÜâcô|#1²n*ý¹Hòúwk|Ê¡Ó/lbj*îÝ¡ÏܪuÓÍiÜï®ìÆÜ:i«§ºçÇÇÇ3?RTÄí3vXÃøçÓÊy%¶ !çÈtu+Å%3Mßòx7?Ff`âØÅ?uMû#(x.¤ÂFÞ#1Ê #13U#-»áï??ÚÃîü~÷Ø:!hT$eѺÑGÙÑeAº£ÍÚ§×áa¦Oz`Aóg·øaY<ü(jÍZÏwïÃCá8ÃVª4S{4ÐqQrl2*±ñC4|OÌ_¦WG.®bìíÍÍH¸T¡^ú¿UåüßÇù1oÕaíßþª²õd(Zw¬Ö«1ÝTÛ?ݾwÛµ]ôè±v5]×è9õ¨þuP#1X9
üâÜ&ûÏ]³Wrõj¬9hÝÓ³R±¨ºçÆ_òû~¤Ó~j¨I^#(þÛ£9áASO®·ÚßѨÖ/RÒÐî~m^Þk¸pÝ,)fÇ=MGá®%AË.\®MϹ¿¶öÞàWÓ9Kêºß7¸Ë'¸ý§*ýêK¦ß-Ìk˲Õ#Æ/mRC#èvê
nð\tÑ"6ûÑ)a]
a
íY¬ìj¦=lÅYõ4Ûó]´}Nᥬc:yμðÝ£]õCý¿ÛñUt9ÔÈy9µÕ}
]Èðßü9ï¶Gü±é=t®8Û½3×ó©x#1H{`!Vyc\ÚkÏ?Wçw§þÈÓ¾5*ð0÷#ýÁíÃ{Üq$ÉÞz̨zb´¯0 f+!ÆI$$/³gÇç·Ú¬úå#úK\»¿£×CÛÙ?cDëJAI!2#(vIl7#-?MÁéͽðôSÃíý<õØ·1àØ¸Û#-Ç=·xÇãu¤í Ñ1ä¤û#tB¡FD"Öæ_Ñ7½x)ËjºlÔVïR¦êõ@¤/üJhW£·°¸úÍyxø~ó#1W3hÐÐ 3mÈä¤}G2Ý)<w^×Ô7¶ª»Ä¢ÔEYM5ðµ«ÍÑ¥lÌÄÜÃ#-0Ì;ÜJÆü´³ðé¨#-÷÷ÇûdÞ%0Çyרg1¶0ÅBÊø¼i«¹«òZûíR=Âø!8ëëç¤o{Óu?9LxcÖJÈÝ[×äú¾ò,gܦ½C!··Öÿðä[~ãz[û¾«ÓçóBavÍ÷hçêÙѽðÂ<Ä|zoµå§#Ïwá]½ÕÓR}Ád:.÷5>Á×nöÌ[êpþýºc㤺0¡ùµì¯ÆÉùþt.wÂSo»êRI31`;Ø»1ìÞ?±?ÂÀo"×祪²¾Räï|Ù®/®Y cUô£ß¶í¹¬US{"'ûù¾6YsSÃW·#(ìõytl:¼ÇXù*Cz>Ì·zVpQ}bÚ2[Ĺz]Ýî×ãߥuó~4Òʧ¥jÁp²@ýâG/åïp§×oÏòqæÛIÌZçGVÎt¡¡&'ÑAw?_C÷FaL»³¹Ððj¥¨r,u=GJ:R}¿4Ö%í¥r0㥢.÷V§&¥Ýϧ¦ÎÓ§
\óèîÕ )
TÄÉ ±opY²:ôãP}dµbóá>#« ²I7³·2nøLIá<yYm½\)ß>Ñ+sàü'dξÔÊsgòy|Æ)K=#(óoÞ±_Vx|DBÛ*.Gö_ÕÃUµUðPæÜ»¦'7±Mt8b:K¼sïPòëõ÷íhEFRÐQ!!¿\ÖS·eÙ3nÒÖvË8U°ªÄy`#-&ñØNh×!ÙÆá
ÒÜpaièz¢õµLc(Ý{»OqçösNg¶%:gs\#-'ÄÃýC3êÿ¾ì0óh¶Õ§^³]ðu-£ìÛ1qPûø7o²Ü>gRl£eÑÒ"xrb½¯ÖÙ6ýß^NvÖüÓ¹D¸³x½¢²²LU;0PÅû½ÁâÌäê¿«¾cO/ݽ}ìÌÁ×'¢Õán³d¼×Qû-ÝuÄgªñ¶zmGÁ{Z2åý5WjÇM\6íÔ0JÙ^7&áZkkÀåù¦mºÆhèÛ[¯ÎB`áá/¼v_ÏñÇÚSüõÄ&Ê`êü¡4¶vNÓ{JQõq£î|m«#1ìÜò¶ßO©â}¶"½Y9` +KïPN±àQCAÝ]ðRÒø)Nߢ-eDÞ*äìéDnóà>zÏÑERoê×(è©ÖÑTE\-²AâÙ6/¯(Ý:FÇõÇ5¶þD¥óM¦ï[³µë#-é´bâÏñçÙW[²Pf }àºaçöðÝÐÁ$(îöv/<õ´R§&ËûÏïé¼ýùhKc;!üj óZt
2*R,;x<cÁßéNu*_éwÖE¤»SÂÌàèCØÇA*éªêr¨Þø¿lêt4tådóV^gygÉÑR-¯U·uX@¸_Qa)zâ±µÄ/%å%CÏ\*£NjÎÏ"æ§ÍQû¯+>=þyÝ^¥ÉPdÌüU°Dµ¸LÙD©;à~×I½Þikëý;õѯíwSF1:S ©w>#1M+JZ¾Ù¹ F#üPÄý¢ò½üÜmPíê¹óÀû[=Âz :ûDF}¶o{©íYAã˽vR^õh²ê#1MÔ4k)bɱ%*IqõÎìѯºâw¹¯n ¬G]÷#î^¤ÎèȰî&¹Å^»ÔÓq/ÆÝ$vì;Ágê9ÑÒçø«âV|.aòc¼ÛâdÞ7IN»E¡qtÆy¬ÎcLKßàTÈêv'·ÇVr7"⹨»¹j(9ElðK=óã`ÂNÌHHwBzow0j¼ÑÙæjcon¸ÊÕ}Û0ºù¼/ÞÄ<¤ÙBù^·mÞg¦}ü²õ9øø=5W<ÔÞïYv^13£Z2rLU!]Mþ¶k>û»
ûaÕ1'1gý?}ÅbR?mZét)ØêÕ'oxex¹Ü/æög-<¼0¦W&òF">§øÔ(q3ï2}v©â[áÉM³ôxwt;Ûø>~1gfÐvzØ¿K.³Â*Ñbf<þ]#<½à£¤ÆÙ°ïî|C¹BQ«£¹u0Bã³GsZÅeðÈì+þÇ£GI$"7)î<¼=óÖߥû¼õn,r¼=#1+G£{§¤ßøáüIÇ3w|úæ<Yåi|z'I9oX^Ea%kºãLýõPc
Äp~®a²}~MT^ÆÙD&uôS¬Eá8"±u:;îzÐ|û£j8ØòzE×.?ϧÇ^{jw5°P¦âPB_8Á]ñá«mFÇÕ»ø¯²GNîî§¶}55T LKgñÀåÅÄ1äSûÿ,*¥í\ÆÜѬWGvKÃçm«o³89àAÅwñkÞ|\ùSs¾ûU4hXýïáÑxKdçg©x+!¯}C²^G>U-H?Üxö¡²ÔÂ(âbÝímùöésºâKîÝ8>ZÊôö\§¶¼ÔÝÙHì¢0zé©Nª)7DzmZwE[JwL¡«³(AIíS"Kª«|þÀ¾s C<'o¸Q©oÙoòE&)ØÍW®l#Á Lç«¥ªÓ M`L%éKïøïsÓ00¡Ü\8ç²NqÍõnh`Y»OÂì"ÇÝí¥N0î9Ã^ûFåÁæOwu&ÿZ1Óã$xkVH°~káødÓø¸ïØ'~ÜW¼¡eª½ÛEç[óîºâ¦gFJ®]ÿ#-ߨ³£ø~eùpª~E=Ý]ÀÄö{é>Ðï;º}ܦlþO¯LÀø£§NÝ#bOwŮԹ$aϯ1¾ HéR>·í®mb ç1ĸÈ}Ðt;âk+¬¸mð£=oÊÒÒX|¡«ÃÁË+ÙìüMK¥ä|[ϪúlíÛ㸢û+K¸ææk7pbÄ1E[À2Ã#(Ê'd¨¹®Ëèȶá1¿¾ã_l°Ä0|¡?J`Â|RTlNÉ,&tª2&cç<E¾Ç[b UvayéoaË\ö_Ÿs3K$ïÍ`MÖPE¤#(§D©R¦JÀÅJø$@f?¥Tu+%È!JÄ#(tã¶ÿ)-÷F7Ó5B+åùÖû^¹ø~;Lî~/þÜÀò-ã#©TOg
Ý#kª9Vy^¦E3À!vò*]¡`eaÑVÅÉÞ¥¸î hff´þG£Ç]Z?⣷jy§tÀ,%|º ñd;nz°0qõ+öÏ¿ïÙÆ9ëLæo!D#!Æ?jÁùVÄ××J¸w),a#(
5ëØ2øù CÅÐÏÛ^?,`E0ßr9ÐJOé¦DA"Æ<·ò(wF/£"$̶õ4 ¾¤PMcçz WAz¤ñ¨t»iJeÁ±§mP¥ÀQòÓñ^©¶½ dvµ1Dþwøtiwh¾è·ÆQ#-´;C/øÀP¤Ñ³ñ±ÚÈ#¯ëÚåØ6~âü7EäG,iø\ ²ªi~Iúé´3Ïâ ÝÕêÊ2pÅN(IÐEâHBërÓµKýK+t°zýgúXÚüäø`|ÇÂ;ߪ?¶M|~èBËÉã}?wVUæÅrg³ÌòÍ¡ø+å¡J¹ÑÑ.¿q²\è!¬$^¿ª}Cûþeè;Pd½wã}Ò1Fß<[ÙÃêÒRLJ4ºïÈj&^þ¯é,çÝêº,PáXü¹§úË
?&mYPV°Qª§?ô=÷)èÝ÷ÙÔý´T<³?rËòLWoáÍ3ÄáÒf@»îQ!×Çî%#!tÎo;ÌhÐÖ9ZÎ Òs&fù³Zt|Ð,úrTmÅEdïS¬!eLÌç?(E{Hí_ã²ÉK®èêÏ#ªápRmvï"ࣽÈEÄÔOQÝÏÈtÌgwU8¡$Ý(¤±^ô_Q ±ðò¿ö|vyîÖ6=#4P£ Û#(PÃãLV#(°>ëhÝ;Êýòò()&ìÎ$Z¹o ¨e8¿¸o«q#]hÔ &0R <EbI "ÊÂl,F(k?{oÁË·#(/ Ñ|Lï³C2<+eÐD6Í!yU<km_º×yB4»ê?\%kYr?1uê,ÖRû<²SâÕ_¶UÂå&w6gÝÓãn¸óöÃdP"Ó8MîïÝ|¿WåÎÔk¥ìÛñaÊb|T37Sfû,Â]#l9~LäñÙá-°û"2ôsñA²>@»|íMîçy×#(4é"©:sè§sTtÔ9e×=(z³"ñ@
¦¯o¨³Ér¿«ÉhH6cJÃ*Iú·sÕ*wd9[ÀÚm:7c^^þ}|ÜvÔGÎ3ÎÉêUiG}
>ÊXQª»*Ñu¥qêeìw#19¤Ât?õÏ~äÛ:jÀFçf4¦#-bβìàÔ*ö;~µÃ·£Û9²Ò+;}6h![éã¥né¿CgL?Géròò_B%þ^¯7¼õîÜàv/$P$þÿö%â'BI+ǵUúYÏ£ÏÉ¿A çcMúÖ++ŹZÄ&I£ÏªLà!Í·H¸xW@È÷¨sw&ÞhAÓÝãCz%´©±£åÐ/j°» (²Ìè³Ö6xSj/EiëÌÎå%ü6)i6½éÎ"WD(LáúeA(½h#1í"oÂR4}z+o$ñå¦Q#-(8{;Ï(¯ÈÓVC<ÂL¥#1qcÌÖtgF:Ü·Èå÷×dÐx,dÀñ\PÕ#1÷}VkÓ(;7Ü.òòrÚvBesnzµÙÆÜS°)«#1#oÈkæ¬ÂOWÙÊz?sÝ?OL!)PÅú¥UõW7^Ñ®ªdÚ%f7Q`ï9¢¨m¥Y¢ö³8ÜXý{ï®þåðúæ*bËðÊæbó9;®åÓ§²tF_±Ë?£e8Þ5på;®ÏrÎ3UIÃäâ[ãÝZ¼ë}¢^ÍvRÓNì¨£ËøÂãÙÎöIþ<sÍæ{¨ÖÆHåîºò)¶7U+Î#-mp3z®O}ÂCÆëíu¥¨¥æ(4"nn
0×[]Qf(3OÃ6B©0`í¨ÊEÖ¦É]ùÊñ ÞÒúDe¨U,e¨ôóÒÉDJK²HéâÞpMÊdU¡ûõ?·'rözÙÊ&±ûâ)@lLÄ.*o/·¬DC[ûÏa#15µö^JÉå#1Nç¾nÄ-ê#-æ äTúçߺ.ÜÈN#1å²!%³Sñú=ðÒ$ ´ãáÏï4I®îkçf¥&òM¶ÃPËgD(ôûèÜ#>£Ó|ÅðÝëÌX°óoI)mïÖH#1"ø X 3onìäÔ1$שL6&ÃÏIäÍÓ×ðæmÝa¡7ñJqBÉ¿f«ØÕaÅZFEÕ[(ß§?Åôim{q`H±Ø ó\]¢¥ü)´SØI¯ÊKéøþ|¯¥VʲË!êLùFà¢q ¢E&&=þße%abVq¤Õ²ñVy=WÛcY b;×JÇ&]Î2¯DµQ,"êÉnº4èMëS¦ÚÊòó?ÝØ0eÚg;å)/ïª=îèì2¿¨#1ûhVpòQ]ºZÛeÿLãv¿O#\a¾¼.®îOf8ÑÛ0ßrjÑ5-¤åÝÂÏ)`ÕØ×\3Û,óo7uN"Т¢%[Ì;©k§EnáÑí¨aOA®Nl9LÑ;6+½ñ¬úºæFͺ.^Ol Ü»äÛJÝiHnµ·2²qÛ#-uÔ(h±J¡çëyÔëß¹K²Qêµ t#-6¢zçT°¾eg=µK*îkLMxckÌUÂÃä!CöY¡_ B!ÓØÉr,Bg"tÞÐ!Mm.«ójrÒÁ¯&yNëÚç9H¦Å²Ò3Óà°ViR¶Â¯NCÃ,^.ï»
ÍKãVØÔE©£JÃ'ñXfjظi¡®æñÖïiÏd0æÜõ¤¶ÈÐÐ1µÉT*"#-¦éÒÒW^{75òÅå
þQ`xa^¤V_©-ϱ8ki^0¥¬|@D, ¶¹GLømz±¢ÂE6¨Å±z"òçG^ªZJ¼Sµã«¬iuXNiÒùWä$"%9ª%¸·2ðÆmݨå`Ú#ñlFÇl)Ü89¿ÔsS4~óAõ7ÙØèe»ôrò.èSC
ºì¡+IOTT#1´¾ØWE6F$I¹¢* :! ±,tl¶{døuhÛ³§$»å¦&úãÏ]^è@èÈtê¤Ge/@7aÞ;wY#-£Ä¦&7õFOSÆþDà½åÝÔU»¤ñµçÐ-¦ö Ð=#to¨éÑÌåfTÛ¼·<1±ó·.ÚÆüvpùßN;Ù}Và¿*ĶÂcèZ8~~^9|mÍ5òyu®iÖt`¢ïßÊNÌÃP9ëHéFfº«ÃÆñGçrëwe5E¦ú&<;à\2ÈëåѼ»Ñ¬ûøînÌ®Íísu¥*Ñ;é%-{#120Á#!§_D¨ä`Q\aÞÑ#.Az:¸ýµàíWôÖ<pFåq×fkY/*f12Iö¢Ê©7âf¹´ãyá7!àÄÈul`l.om®úQÃL®äìýý³&<Ø)(¿îéÞD×ÜE0%P®u |Êp¤ÖÜk«Cf[Ã]ó¯=FUèÉBøQÂK={¸Íp(§®#-ìàüh\j,Ö¢RáM#-ª©rbÈR¾º³¤±»í¨-°çrÛ§|'^4²&ådYô3µú4KvÝDátRP
ÍExRD(½È ±c³]VuZâçqì`OöNÆ!PAá<Q?«,âÂP8ó[ÎÅó{qÃ]åõÓ[7îéøüÕAikÓkAm3¢-dä¡DHÒòµ4fìÑj(ÉF1@ßý?N_§ßï>/âû<MÈçc>¨¿ÖF¯@«vaIÿÑçæ>ÂÄ|ä¶Ä+]ç_µ|{ó¹Û(ø*§!VªdBg#1jµ]д§h¢g~.¡¥>ßjîq]atmZ ý_.o$cm×Ã#(çóTvó9¼§CêÎÒ8ûª+O?_ð~%ݼ?Wè£ÇÊ¥ÇWòj¶5'¦Ü»!¦×CEc~Ãö+ï½g `UÔÖ»@ÿñÛóüâ¹å¢_´µ0Þ=öEg]*ÍTiJo¼èöeüÄoµü xß»õmùÅèúæ Æäí£p·#(±b¸Æô`¾É?;ö2á.Q#(êÉ_$Ò@ÈÂGB:Å.%#`Ì6ùßÈ]Xr3+üfy¼xí,{(³n9óë¤Íaþ[®(>ÁÀzD¼qpèà-«I¬ÌA1CIÎØ©×´à2÷^¨W]ÆU:N!dî9âHð³DÕWdmmQ#1:@ý£4q+¶¼£Øÿk°Ø¢sýnôwNpv<¾!À7¯GÁö¯÷9#(Fpó#1iQOå
Ê!ÕÍïY:È.ZG&-c×gùCA®9V¸û¯<ÌAµ¨4BæßóérKÌÓ´åÁ~þ#(|b}IÕú¸ÙMi׿ªã'ëx xCæVÏi#(LM0AUØ&#-3)OкQã2fMñ£½TÄÖ?ß3)®Ú#(ÑÔI$ÓySP`b± Söÿ¾/dÎoCðÌÖmÄ¥ã×ÍÛÛ,]¿ðZÝ#1¡Ë6!. I¡uäíú©¯àiñ¯á¾ß½¬B%øµÊVv?_#-1Þ]³\_úÆÂ> ÁçøÃ_aìðV§±$àYh¥/~k'½@"ñ,jýòN0Hxêæ$d$ÔTù}øÐL?Î\ºuIGIO¢!!nJj«#-ÔÙ£Èt kP6¸@&Øa~Öà#1 û´ÖÅ{F é£xZ öäWãDÁKáfÕ|X§vÁ
Ðèø7ÌÀ/#(è4¥A´õ>ê¤b÷~#-²ö8jHíR¸x
ÍBª¸3ã EÇt?Xÿ´õpßTìËÐB^øqÞ2Lé¹@_¡õ½w6¤CK86BØBºèÿÇ7è#(ÿaò¢©%õÞa4týæçxþÝN¡¼D³LÚ^ð
&°AR×ü8çrÿ7õý<¶v|_a¦ ]Û\Áݦ|l³þxãnZæYFÇôloD4Mý\Ô ¦ I üÞîæ;))X`bz|¾ v§~ò"½yìW¯Jî>cæhÅâ÷8ýmÙ+lÃ;T9ûBÍü:"#
LgäÛ(µè'S_ñÌõ3}fÖD»0¢HçÏÓaö»³°î$ÉR²k&>g±*.{#-M&ä#1ÅU!¬>gbÐzSÔ¢!#1¨FaRÍ~§î.pdw¿²\¸ÓyréÔk#ørªª¢&¢xø4§Þ÷oI'D=e%FYÍÛºI$,æ")ß,Jý~~ÌÖÃ]l¥»«ëI2ìl?u`Ú0r[HlkÈÈÈÈÌöäðÀ6àc#-e:Ýw¸¥5gæâ0À;aÁöxáßwøIkKýÇÜ>Ô½Ð~I϶#(&OÑúy²{¸áƤ¨yä`øO»¢" Hû#-)ÿHü)#(ZÓ`÷T×ÈSÂûoß:ÆîÍl^6B&®îéHÂjY*© I¢
ÔbdHWõãåû¾òön ;s e{Ô! "Ç|
¦§å÷H8¬.àÆã#15õ¬6U§¸#öÅÃ9yuïϲa42A®«#(°4¾òà=»DtêÝÚë4ëìi0\H(Ø{(Çãøÿ§#->ð÷íê"*åণZ}x*qp8á¡A°íAc¯#(çÔ/ALÞMF#(.Aó%=eRÈi£yEêu¦£¾>1ØÓHø°ydPrjh °@v(7S$ïV¦¦è´rsǤ¯ÁÄ"¤xvÉ1$jcù}jªBA ÓFãpúzÎCv¼ò461F¼K}ðêldtbÂÀhA¨îoa¬¼ÏcMp½Ãâø¥ìB~GêÀ§WÎÔ$!º-QFÐø-ë+·8ù?Wr#-XeWËíË㬯8&ò:¼ÖÎmX¦ûfaÊNòõË ï Gx½ÒÛÎð½ÝÉwMËtOëfux,L๣w
æÓÄåue)LWd©#1OFÕEÈ÷if7¬Âô¼æPRÆBÉØ«(ׯøAæÊ#(?DGÝòr;p¹DÞ_ø+/èÔé?'fÓÃâòÜy>F¾Û÷|õæäøU[f_ÄÈï¨Oæ¡æ!Óú¬ªª¹J¨¯àÒô-i()£=Éç÷¡¶»Ca¼B]ËÔ¸KÑbÁÊ£Ä*_¯f_Ñàwýÿ"S¸$/D?!¶Kf B¼èÕDAÕß#1¾Hÿ½qlg<× Tï¼UÞ#1èÕUY¦p}G2U°TJÛ(11qQíõãx'VZUYCUĵ¶¶àÊ£LÂ1õÆÛ' ôJ[97*(f9Ö3\fÜF&c½__Í_>TÌÙoÞ¿n¹ÃtH-$Dbvû/§k;~PÎw~×Ðúï=¬tþ\Ìý|)³z |gE¤_P{ .Y1´\ÇËn£ýíMøÏ@ ¨Â¾àçòÏoÑé$;²l'd9rá;Ýʰáj#1ô#-+`¬PÀÉ8Ü+N13¿ÀºØ|ÁÕþø]ìÜ=ñ6ÓÝí9NYê"HáK½"'bÀüQãõC}¦7#`ùÊØ`ÑøX;rqúah- î|C*¸§ñ÷þ¶#1HÀ3ó^ÃÎoûHÁÍæ¼æ1ü·Ã dC믧ó§Sòº´ÖÈ<³êùª¿:DZ"(4y#1ç»ip`ý¤<|[í%åK½,Æ`fÝ8Ø»êf!LÂ$xHS·AÄÔ{ù©Ø~*#Órðúß/a4U8WO渻î!æ4ééOØ´yC¥ô(sôuµêêI|ÅhÒ?(uÀLÂ#(5><ó\Î#-!1ÎSfCÔÀP#(3Þ·&,Wð09#-NB+õKCbÇ#(}¼¯ÌEj"È%ú¯Í[åð¼ß^Çæ8-!Ô sM=·Èu&÷³äÈÖíÜ!u{o"1 9âòCÇØnD§óèg²{J¼Ø7üã&éSýY[DðùöÙã£Ãöu¾«e+21ÝFÍ!ñ©XÞ¦¤[1 û$xø±óëþ[ÝðS¢¦Í£@Éøþ~`Iðu*/{MAÆý&³è*ÿ¹?·#-Êùe¶tÎSe¾-&¾ÀìãMPîÅ´wZ9«{Ï-Hò <BZèGpïó&[ÌÐPóÀf»ÞjýÇPòÖ;¹Ö!IøÈ8Ôâ5»ÃnTMôã$ÔÖB×7Aß'%
â!PÃqÑþ)JíD,Æþ#F²çúê¢zø{;°¨¡µJïûÿ{eKÛ^Ûó²°KÖÆ=Ó-¯åÕ¯z0ó|M|óMût3ÈDø3ù½ó\X~] #1ïÚòì(`("!¸³£ Uµ7rI#VQu·Ô_Oøw×óë¨ÄfHw«y{'(©Ö«Ði}:¾dä:(í#ET¢ã¯ÏìyÀ!áûùù|~ ]Ù#6«ú×?_ð¤ÿYRZÿÒÌÈIJÿ1lâsSÆ'#1Y~v<´#å:ânJ¹d(ÿ8~ÎngqÆNyÛuÿ)é£ K)¹ §ÛIÜ_(Bº«ÇU]ÆøÕÊ?Ò&Zì3:ã§Ï(ð#("m!«I§×ì5uMBÞ$ ! TV±6=×¢àÄ#-VNsæ>¹67)EED$ÞH/7æÿl[×^ïi7âØ#(ÛÆÂg8T\b+òs"GÙBQD1"D")µC¦ÅÆq)!gªë}ãÿ©ªÍ{?Qø}XN/æV4¤ñp*iѲÒX# ó|ØþÒdÍ´í.QÚðu;ÃúX
H}l0ÅWr,¬[X5^Ø#(_©Fø¡Ð ¨}¼@ÚAÉ4Ú[ãxi#1vÌ}u¹Äêë¾ËÙlS¡l"Â)aÍV¢Å
©ãJ`Ý>AübSÇ¡ø23.J#1Mäg:´$þçØ?O1?Å{®¤)kàÑIÝ4¢@É $Ì)wO¯ËûÞÿ5¡îívd5 Åâà6È6À¬²¬#(*Flʶm®ë϶]T#1Çâ(Úòâï÷en·£ÃÖn]ñ¡gËz1³Ð¡@Pm]vK7|"K zH#1GXÍ40ç¿ö²SGþ`ÒÜCJ¢F@@#1ÙdÛ:i! Rí¹° ÊK
ÅN°{-A p®Á§`åNÜ6oÃQv#d }äZ\Cq#-CtssfpÖþä÷Ñ@NJÛoåyäCI°hl
UflLk23È#-dÎô¶:k0~àQmJÊCÛ³ôxÞÀO·íû#(¬>&~Ó,¢oûQ6| º¥åXª¢ ýn_éùþóõ°ÌâԼ鱿µº ÄÐ} À«_Råõoiyº¾¥ê£ó¢bN&Ñ¥KmÁ¹°±òÇÕ}~ÔD57Þ!)éä¹Â,8ÉÄÐà!Má¡Ñ ðÕ´õì¢Øa¤5ðLÉA)á`9×ÇüéÚ2!Ô 9PÑ7È íÔwÃ.ÿ?Ü_qÀ´iÕ¶jï:¡°[ùùµ$Ú!óC¤$>åÐÓ18«æÛú!5Sa¥:Û
mO +øß$Ë66o¡ø6æÇWïû=#-"²Öa¼#1w/YîØw×íо#-ìèÆ¦a #HTËÛëôÎ¥$;£²Á®Tì"Ö¹@>ÀDDDNÅ)O¸øQ©&BWÍ0ÌÞ0aå(¯t^F~WÁ(ÁdÒÀ( ##É)X«UÃJ§2¯-£ýbÿXD\â?GO(cÖu#Öt°1Gr°Y9E¼b7Ð| ì6í¬ÃbBüÞ)vªä?7¸#-ºøØWN!ûÜ"z}?u×½ÞÒõ9S¿NC½^PÞ!4rÈU!pþv© 7ËG¤¶Ê_ì9a;²Ñ#1îâgnçÈ:ÜÂBIX¶Ã±¯ÝàÏν¾îif¼Ù»Á@¦1;oÅqÓ&º:· )§mPoÉd¦zÐzT$ÿ}p)ëÒÚ¹";ÏOÕã¢!ÒTø¦iOöþ8ª¡w¶AT!sLjæüq2éê#-uÉÙÓ9ý:DÓçvÖ)w~¤9ίSºPòæÒ3MRíM>Ë)=NùÅ¥:ç
ÆóAÊð<D]$ä_[ÕÈLA âN2¨ä }ýI&·&½ÂCî7V-`0r@$#-`4$çöã¸})þZéRI3×NjW4Çv9/ºæ¨ïÀ"öSUBè@#(bq]ÆÆÃJÃ!m%Z 7@ !Ãd]óæBèb3l@lÄÈ?¦\ÐH5Y.¢ØUO³Ï¡Ó³é¹äìÎQH;ÃîTÐa¢ðÀëD<У£ven¨Ã3}r±,|(¼ OAqAôÄÑôü¼HÉó¤ñÙ³Á«L¡>O|½Ý|o?H©Ø. ¡ñ0ÓáûJg nÞÌB¥ÑIýñ±
«÷Øÿ4¨ò1«OÿT{dWÄûi¤òz1¹±é!}FXû¤üÑ÷fS}Ó4Älñöó®¿£:Âãyè#16á/JP{ q3#(Õo¤,tÃCþF?½*pӮͳK·ñUf^06tA¸VK°¹ÂoO-Î9Dë÷,0h8¹Büò6#ÑÈì0´,¯0¢R{#è°D.¹&â^èPcñEdYÁ!÷~¤7e@<Ã÷/g±ÛÍ5ô(vÇ"hÅ@ ßh3ÁÕkÇâ© 7FAaª1iÆEÈ#-Ôc#(3%Ù$¢¢Çý?/"ÿÃEp|×§åósbåÐ'FÌßËàlÕêå¸r@¼ÔB¡?oÏì{¿¼z«gê¼XÉ&ÞÔÄ
+B¡¿ë¥8ci?3·9rFo6ÃÉn×m)2hÿew1ÚªhªqJxN¡.!òy·ÞPÒÉ×$Ï$§Æ5÷kÂð hö¡"+fÛKåpGc#1Qouõn~>ÅëÓ<óÊIç#(0s1OÝëò|§¼vZüñJ|òô}ÖäñÌÀ"Y!b\8Bó×ädh#(4ú¡¥|z=Whl$¾9ûy9Ѿ°tÖ2a!ôrãVlC¬fa!èúa ìþ¦ \< !2èqñ.³~ǯ<hfQbërMüEqñË ý×SmÉjßÝÔ¸©ô÷Ðj@]ÅßõÔÙù ÅcÂJd5ÔÉmEX/-50aöXpWîɱn9Óm½âïåßUUUÐ#(YNÿ¹}#(Ùñ0?¿U]àgDª#(9µ_±UÁà1cXÌR71iÖ[̱/òã¾§#(þtý¿µ¦K¶h÷&o@S-Ð.K¡wX#(ÄÔÕ7[3Á 2=-±hâ6¼zëÉÉGë¬ÉºGg `h8»rí>èC±¬üíç.BeP©Aê>~@T`Lºî.ISEA¨Ô#10Ù¥û»m^ÑP(zK]
ÅÌ #(bYâZÒ\f×÷B¿å¨h35é ï#-4 4Á¨=Ç»Ûn¾mCò¯MnÓo#(+S]$KTÄRcì?:·h'uôóJÑÐü±.>¼ü®ýÇ¿ÞY=ÖÃã?;òCù}f»OÚU.Ì}øW¥&?VEü4Yu"ÓïQ#1êìÞ\ã¦e²yLó«yhEar0ÔROâH¤4¥`ÄRõNCîBòêIm0!˳@ÆT c#(ÞMb"`a3$I¦X"Ã"ÅX¨¹hÌ-xÿz~ ·0!tþsç1½GðÄeòµR^#-4Ø,ý þ>;ÞE2#1þN«ÀÃÏ2"´É7!×J[Qd
·"#-É!0;wÃÌÎE¹x·cùÐÁÁ@á-Ä3F0T'MîÓaÊ8~#-¿¼uhv><¡3Eò»çoÒ`ß¿ø_ûD!H¢1TâU7$Á£U:)»þ5¥ý_éìæºV]Q~¯ÛÛ%Ý0ú¢§ËöÈÂã ¨¥ÑL5'lrÆT0UÂÓCwïHIé@8÷qj´NfîþÁC#(!#DBaàú0w°ÅUnØnQ²=*l.ÎiG'¿¼¬ªÎõã#!5 xÖQ¿áçL{4½}ów£ÑGÅAB®è _1t@vÅ#(¨îð'fÍ27Ê"P$gûö-#1üÝòfõùh,R?ñ¨Ìõ@BÔ¶óÉ&lµl¤ÿZÜ&4AW]õc9IéDÁt!É#.ê¤*2\±Ùx£IÀ;¡ìÔín0»bVAºÂ@¹¥lHÅÂܲ"ZC__?BN§#-®#³®xZÚÌ'±}ÝÂÀzû6ªkù|²pÔéAê,É!W1 EjÑ,¤7%9,$¾UppòAÂ=T?ÈOn^ðlÊ[n½~èm<Ö¼t49|¥ì§§öP¿ÞiñÅù+V2ªï¡ÂôR¬FûªPÎQ[®Q<ÑÞ%'hÇlð¬·t/A%ýç#-»¶L¨ÉÌ`ÉX
ÇM²øylñªYÇÔµÀ¦Y©§ïQÿoó·(_MÜ=×+få¾å þ¿uÜßá2ü½49.2c4Ö )Â#-¡rÝÔN¥c%¤N[§Ìç DÌÊIL¦Ãâ1c]Ì9]¾¾íáÔÐ-AÁ0íd9âî;ÁûaãyµUÜ,O¿6vØÂèÓ^>~ǦwÐnç]àg632)É"©z`A9·Ìâþ#-Ç|¿ÑC»Mòº[acQeõ#(&SUÌÆ·®ß¡x¨7êGQîëî>H£ÆP\ðmÉ/æm¦kß º¤³è³oÍ5_=êYd@£"ãö&éZ¯0¹âøÊû4¨Êâ0%#(ªõA¯¯òÙd pêc¶©|ÁW#¶y¿ZóÃõþ¾ZèY+#-CÒ[
Û£ÑóÏðØxöòÚ++ðZK#-5Aµ mÄéÑEï
´"U#-*²ê/ªz2¶xÛtbã!3Á¡×=4Ù»-Ƨ]¬gÂ;,.SvLRcI(>= 'ǪtkïËiRͺî;P
:Ë8ÂOþuK߯¢Q=°Aîp~c¬¶uê)?f6Cxyf|ë ºës¬K®e¼Ñ=æõsÖ<»HÒâ÷ÇøÛ±7㶺eæ0,ìKN\}]÷f´òóIîʹçÔÆÏ;ä3¬jzGú°ÃÛpdñÊ/äø{&âìÒÔf1**f¥B Kt}!ǧ-*wÖð-$°;uìýD#-,
[@2é#W#-äq;í-=ýUXëKE6«
CPÉñ?Wî<ß!õ/éùUòÛ½£23òix#º<v¼!ùBzÃd55{U;#L²9Sʾ*ÖûñOÎväý3dQ®s{x»l~ç³lÝöîÓoFÿ+sxÚ§O(9²þî:Ãë&³õðØÌ`S¢ÇÛÒi¿ÈïÁídYÇH !ÞâG"Ið¢öyR1á°£]b3sù»GÂ<~:jç6â¯Å-/83:.Lé2Bf.fBÞc^ùTNZ*CÚ$&Pt!s_CÈRý»îÿ¢Ç±¾ÿź;gw
8oIüZíáѪî\/Iw¢Kgëú#1+Úg: ÃývPúÏt#-©Ov.^|ñÕ~r,2éUOÔïªû¸7L#-|¿ûjotº>±á¤
ÑÝÇg¹ÒÓÃÙ@éM0S±âWyâùH,Éj!Ð!VÂ8D÷:±QÎi¬M ÃHÓ¸ûX¡Ò#1.¤AbéSc,bc¾Â»¡qÂ#1DÈùhj"DÊâmåS|;¼3=ì!Ö4:ÑDøm¡~WÄ@p¯Ìv!Aº3Ûr¤÷tò*£Ýø¿^iJf*'[LÁ©¹ZÍÉWDÕ+
3ÑÊÚ38+Ù2;u}<ÉùÈ®ÔrµÍÍ ·p?\2®-F2ävÙðèbcé
ÊÄJmÕáq }/;Çgd}hÙ"õ,×Ò»e1 )#dmäI¼ÉüúÎÆp9ð
4ÞÕ²*f~ë×íÿwØÿyD#-0IHbßý{,%ÐAwXþ/oà6g9!õþ÷Ëã_'£Ã"í=w5>æÁÆóô}kõÿâ{ÈýâZcܯ+ºªªìÎËÓðþq`Ö¸Ù[XÅ©ºñl&
ÐEDçVOÖQ
îM
!%F#P?KÈ~M%hqÑ4ºph§N*ã Y4u:Ü¡Á !²MtÓ<Ù$¸¢öf40ÛµIE¥âq¯mø®}îá °àCȵê.6¥ÈUt´~Ãs]ÔSÀÖàÒ6ëméµD`.A2C ða¿Î{3Ïù#(tjªª*ª û[kRäÃÞ¼è<Yó<x#(ÐNÀÏ;7èdU)±h;i£ÔíôzÏÁH `PN'yÙãl©å82wÁ±Ò4@kج4½®ï¨s¿PáÉ%qÖj¯twùöÓ\)²¬.¦#¾r:/P9)a0ÚâàiÀ³%¡ !¢¨p9@¡dJx83ÖDrá.÷é£a(#-K0hQ39¼q]Wà`â/¯G|9¯Ïë\i5¸AJ0ÈVÂZ]úµF-ö£µ¸ñoB±üª·ú9sîÓfÞ÷²]Ômoã)ËÙ¢4NM?l{ývóO§¥Ð\#-Ò¡ =ƶè³DWDj¬ÆNØ^AGþ³&iÉs2b"Qej Àø0nóöNJÚùDݵ»âKlEuQ}ëoS5°mŽ®o*6³u7qpdª-#1OÃþ³öi_ÖI!$®î]Q§pdþ³úÔ0xr×Ñ+¡£ãú¯'ð[nÙ B²¢l¾vÇí5ìÅÐÁª?ÖJ8::ö«"/wHv{êªÜ«Û[(±èXd<aE õÐ"q<ÀÓZIP8æg¥]ŲÍEü"ÂR0ß;Fhè¶à§
ÈpüÀRñáI¨QD?´aúÎÉà&L2Ë^·vyøØÌQNv<qEàh(½#(æuÐOaÜï¥Å¤]·AAéå¤ îs;"¥¿Ùé¼+#(´´ôáõùRªñ0¢,Nd,Yò!gGØQÌ@l r#-®ä±±-3TëðøIkÀ}=»&]§Õ^J¤©D/2i1x°æ6f@5(cÓTWe=§¯YõÊù¦ÙZëáãÇwÂvÛ«.·q»¶nÖ¼yÎó¸XÙ2ó3:¢é£4Íþ±§ ¾#-+ÐÉÆûbN/ªÝ·ð{ó®êp4zÃ5r[þ¼<u©Ô®6lø\R²0r"ÔÁH3å{;;k(Ò÷$ÈTÒI5~Bxø~]ݵözíË2¨hÏÙI#1¦]¶Ú>ÞùsØßKÌ}Eó¦5¬MNZwñ'Fزú0)f:8gùC:3JÀ&¦©ï©2¦ãÐ& rðäļ__àá°.@;7í#G b%ÝÉêäv¡EÚ¡Ãwd'b´ÃæT4ªR",Äv'&ÓÌ_ÈNÀPÁOaÙ.º_º\¼^1q`î¾IÀ±naÅF#iÄÒðx®bORÁávëJA2{oÚè¼»ÌØÁFÞC#1!ÐåÀíÕ40XuÇ(£0RxB+°n9}èͯ£í~\ίRA«Y4qv ¡Õd§:¨,>IÀÏt£R|°DÔe6]׿}¿$°c±2´D%³lIÇ¿yO{s h²lõξÌgz{%bÎt#(b,*H{·«_#(ÔÇÇsra¤«1v^t²Qº£ëÐbBz&DÒ!7"2!Hn0¡¨ãè4Ô^%B@ÙÔ:ÄëÆN¬ìwÊ0wLôÒ0Mh=#1'ÚéHÔª%ÈXLÁSN_3ÆÞq0ân¡±]|XÚÒÀrØLËA>^Vî[»îîÝÍÝÝÜ«¹»6nnê %LÌrÍÆµBM^5`º#1è6X, ±"E«&i¾arÓÂZIw<±àõ#1g2À!<}Ý\[úûú¶Ç/Ï:¡+ëmÉ (qåÇQ0@Ûðé8ˤ?®õ\ô¶nºq¶ñZ¶nÐçtΰL.³:ÐØjebà ° ¦r9[aó°øæ³Ù¨ÜßÅ:´AØêÃÁ}ðùp³ê-¶1[DZ6¥c#°[ç?ÞÐÎÄÎË\#Å48èÀ\06ÆÚ³YÛsÓ Î>þK=r±ÊS#1fk¥§ÙïhkD¦ÏZ!òBî{ZÂHI'"È÷æCÊ'¡úÀ°òë±Gì·@Ê¥Ò6¤¨#(Ù±ÈX
øáâS(DøóùÌÉÚµ%-möæd¨*0ä¦ÀLµ
&hDÜTS°OcÙeo7e6Ùà¬÷J#(\N¤Æa¦°Î¤ ^°ªwv»Z]®¨Dôxó³-ˬÃíðx?4í¿@¢ä¨NHØé$=pGñEÙÐ]ÃÕ_G
)Ó²!¯÷~&ÁÔýÉIM¡¬#% ë:§£#1ÄCá9ât§ô¯¡8u:«BG#-#-fh#-|{.HAfYÀ#1eÆJ+j´1-8ì(%pn=8`Èã`ÒÈíÞX`þ¦éîìÆäÛ㲪fßãÛÔfn¡Ø=ú6#-êF`¤QM;0iÏ#~
î![a7#(d¼Ah-|vc²¥~#(}±Øßo1aHï÷¡»Ãm%à§Á1¾¼/+nÍà¢Ç68îséOÄEaãÒ³ÉÄÉ\QH³ÉïûÜ wÛ!¬¹C{u¢V<§@±JÂʡľü" 2 [Ô¤=çxäÖH&j¹±Y¢'Tøøc¾»×̪ùFu8u#(ÖF"8ѾFÆ4.â \ 7É 8
^DpYQ}À×RPZaùìËåaîàsò0ÃïÝï¾í_Ü·-UÃéI$Oåæ1¶± èY5ä¸ìt^&v#1¢ b7·ïå-i²¦rPc"kHbzy4éîåwW@à 4Ï jm+ i"HM¡)é,PoÖ/7ª^iÀ<;#1êè(1Óh:Á.)£ã7³}iåJi k&8Fãí3ú¥A\ñò9Ó¶SeÔÎßnbÅÉo¨y éý¢v¼Éôò¶1lÿí£ý¤1!Á³Òø®+¯ÛæÍ½pW÷Ici[-¥ýã?û´V°-,Ûi´m3;7¼l ~[?OÄ£OÉÍÃL"D
L-`ÈUÈtPô§h#1Õøç! uJ¢C:ÌAÂ#-#(qÎÖÕZ9h!lXtxð2êõ?àËýüH<ùÿÎÀ«*Ürð#-õ>#1×gr#1ÎÆ^D)D
#(ÿ%Ï??oHñN4¤¾×sAÔwØyèå¼îÅ¥&Þ3ËÈi¬¤ÙJz¥2ïHómÓx¦YºK>ßÚïk×-´[ßNAâàBIÝ¥.zÙgnG4í0{!)'[ñµQ×r§ÝøÄüò1,Å¡¨#1¨§· jvûhíhëæúÙXôçD Ø4$VE³Ü/¿ÈË@2#-Ázh åè|H$!5?Yüö@#-A6aÞ^Hy¥(i«"Ù@?¿±@Ðd¬ã¯í=º²B&-fS$AHÅ 2e$$$!¾ìZ3î4Ó#öÛQ°W¯8§78O¨'Zff¬²ôµY$§Ô²%O/yKpÀ1æx/ðÝúFOÀñ¢áFýÛÂÍÁÜvk¶öÀõÏ;ïP/>äT÷±råÛÑ^1G«;k;HªÅb©©,©iVü/jùï¦Ô"»APaEc:`Qî4ü#(þ©'Êùß»Ë6&.!b8Õ²d¯â¬íÙne2ÓaÈiKl@8#(®%%ÍäÊCüaû5\ÜB¥²)Å1D`¤Ú\u SEtJÔFVEËB°³ûæd2Ò´¦74ºÅÊ|g^:w!׸RIIÂ_zC ÄHõýç3$l(&&¼¼Ú¿{}tNùzß·#(VU» $P^6Yo^<[ïcÜö§tS:ÇÒ¦y¨B®X q2 Ôh
kj'$ ÀWqÛ¡Dδfsê²Ã#Iqò#1@¢ªQbó'G¤ÏÓ®dÝP𢶽í¶>WÌÍ3Ó%ôcéÄä2 7wç°K¹C´#1ðDÀó?>wEÌûN=+£*>ÒÏ`HxB¼:ápÕ²%
-¡ªAÖØ
%AxüÌDIW@f-0ò4Y3ÚÄ4£â"L!4õ*CÑrWc%"OxáÔÚÍPáüÊá©£ÑÎøÆý§TºêÃØô1yBL(ísvÊw}M/t9ê#1tßÇ¥:\äÝL¶~Ù~þòë¾Í¸n¶³2q¸:[Ùjè|q@õù~ÂT(©E'7>Ýa·Ê8(º*^°²°#Ö2|òD}`Ææb¨¥G¹So 0ÆTÅËTYï¯XIðöøLhÉQ5x¤5¨È¯ú?ÝÃ.ãn¶Xæ(ýÜôçZ§/Wü÷7-H4QE ; MaÔN æ×ñ/UëUüÔVØÛhÅ*£"¥kb¨l¶¬ÈSlVƲ[hl¨¢`,H qµ$Û=Sïd*MÐÛ¥dAd"È"«Ëç@¡G!ôømfs;±¾J|,ç2þ,òé¸`hâèg4ñ²&Ôdèt¨R#-Ý3BYNx&Xöiñ>þYÑú0£îk#(ÑÖC´F»
Ý%K4ÈaÉPD"öfM_1ó|ZÛG`««P
¿X#ÉTëMªÍ\K
7SfQS\²'Óܤdr D*¨#-º!#(çãØ`Nâ?NIÔ:ÅF@b@c#(:²¢2lµËsI\ÕÚS6(I: EBè@M?Û*ØI[t2j¡ÌN¬`É$#-Q_UEÝó<Ýòùû~ìßZi£¹úF\§?ÁææÌ¸N÷º»Å~»HAO¡î<!ñ:³ý·êöyþß·ü?!/'éYÉÒúDú5ûLúu4Ja\X¬.#¤¥@PwQ"S¢À!DWáT:.WÄó;vî³WÝÙ R¦q@Ó@¨ÎNÚ+We´US8{óR÷ÆDOãùÓræÐ3T&`FþêS®ª·-&ë<Þsö©|è¤GS`¬ÿ'&g«ÀV¬:ÎænâBáh´$´ï¡½¾Æ³Ag´Sf@~òô P>eÜ[¯8ôCrpñç7û(âD4ë)tÇ(m@ÁaÊMø¸2£<ù§³#1oßή·'ÊxliÒÃGBÿ3¯&ÆçËCÍuôxÙ¸}W»Nb¬Q*sËNFÍêõ^KÖf±ó¶@HQ'û0ß!CÞ}ª_±Î^"Ýû9ûòn·5ÁËæåí-EørÜo[ÁýqÑͼ êh¤q7í|!Ò¿½0-8̲%[ùÎð0»:tïã·u#1Ûdé<:´¡Ø²¦w9ü¢µÌàY& x@ÚX'Ñ帵1±>IïqH:Z_.t¢ãÄX¤°"ýÅ%ECÈõU*¨q}XãAç:y²ÍèffñÛù~CìÑBQ?HçÂSp¢:k¨¦îËa@=NãÌâAYew]KvRUKmù?êíjSPCH°8j><<ÃÞzc¿¯|ÉA¦´ØG1ÕQ p Åö²Éï³nMæö'Ga >Dh UoYÆ!±.Po¤À2tpîªó×Ñu@Øgû[$I½¨÷ajì¨rYn^$ÕÐ8úàJ¢ÂÙwÚÙ½ÔàIðyÃå£>#-Z"w9!näxú÷çÃ$Ö]É£Æïo}ÆøÑ£(ãðò~&#-¥þ¢'¥Âã¢`âÕ£7¶-f0Á[WBúk#1ªr7ÎðÈDT÷6CX-²@ I»o~8ã§
ï´òô²ý7èeìèº(Çò]Óf(Ùׯ<zÖ©²sÌÆQ5r&÷ySs}x;Wní@hÕ¡ÅðÙÕδÛÒéêÞóïÞa-Þ´DömõÆgîýý{[Ã# ófFÇP×Xíç~4ØniçÁ¸t·QLÂ×¶Çw}PkF$9iØ$5`)´Æ§Ù¥è×C&/¢Ï,+[Ôu®HGQÒuñC·ÄªÀ¬ÜÕ´+ 5J«.ú-"ùäÚÝ,¹S y-ûÙµ$ÄÀâÍî0ãV5à#(£#(¤F¼cÊ¢@òEï`ÃÌ$VuLØ*¦ÕdÄø97ëä,kh#(#1C#qF9@Ø.ÕíäßÓ¬2-K¶ö,Õݰ/IÁéÈòZªÆí«ÉXÕk jÉÐi»!ã§³ìà9r09Æ0¯á<_C[g^ä:qé_>Â<\f;C&ø>wAËW¨wëȳæ¹S±fzwÛèzI½ É»ÉNîC%U4ÙF2zù¯-°Úsþ»õ#¥ªPº¿åù¹öýÊÀB=XåxX¼#hÝ#1ñó_Ù6×¾$&Û|TÉÜYÄèdØ×? ºxYw& uVX3®£UhkãËØ"¤d(r r§TÈ}¦Öª³í÷0ï5èY%áÏ·>:Ârè·~,©6ú®©êºuá³*µ2¹µx« åùóPH}|yyõF°ç'7EhÜl>m)rúû©ð£[+ÂZE¹èBâ0°9"cWJìÖêHÚ)·ïHÖRÒĬ¢,*CdgoØiÂNBèv˹£Ðm^G´çxÑ0 X.ÞUðÞµ|ÿMîMH+LUÜÓ·#(ÚÃ`$Z918¼ ÚªxÜw&´úq{¯×ï«÷þ|ÎÐPùe# ÆI$íBb#(û/ßh2Û÷eÉ#1X¥)Ld¡éc`¡EQ鿼é£à¼.LÕÊ!É AÃI4ÉEð½Ä 0ézMÙÞNápA~hk@/rÜ´¨ÇJOrL*ø2Kòþ+ß>_`]ÁÔÐ`@\×3+Ã@nbô⡵³ӧ#1Æ6ÉxÈÐÓè³ò£Ðe#1AI+%%%a-
RÔlpÊ«[[ý#-åB¹Ñ!PÊ:ø ÔûPÏ#(_c¼BDjÑDIßoߝ֨0
¨0 GåF7>Ö°.î<¨ño°ßÙmnÝè{ü¤¶Þþ']o]·Dâí$fô×%Âww &d¢Y¼5Íéà®g¡Åyù_
Ô¾¾!^½hJXH2º¯#-3r^»pÀ&ÂHPìx4ã¾S#-ûßøhË#1·ÙnDO?w-æ½½ÌÌ8i!¢µc¿AÄàêm(5ôñóIÓ2AüBaeP+P>Ãêí)ì9ÝmGÚ2[ÏgvmÉ]%h"t:è(ÙÛ(tGáÉI0×5BDÓ ~ÒФYbrE¡+¬K±d(T
BÙ^zøômâ½Pûü_UêÎ8²Cåªdèa ¼u´1¥e±¡Xç/ã[)Iyå® Å$I!ÍôS\V¤@$Ö=dÕÊrXVÈ4,{õL(`0®S~Íi]( Ù6Cì(èàär* Ì x÷¢-pO£@ØMÅåϲú³ãEìTììS+¼Àÿ30ðU* D ÐyÄPM"o!&0 ŵ(÷R@ÝÀ1ª¥rÐÒRçÄÙ»Þ³7©T§x"%0(/¸ï#3À¼ÀËPï4#$ú(b#1M¡·Ã\ÊêÚümÔ£$@Ù5üû»àÔNøKÂ%ÞêÄó1ZÐÑQ×J^½¨l©tÙ7ëh
EãÝêüâ»YdÁõQû}ëEý³î1#(ÔËF0©èaeÄw:7ÜIÛØ)R°CPbAâàG#Bé&ÂMï[c±¥ý½}~¾}Êúõ|ÍáëaéÔêQâ_ÛT#-J¦\ÒXÀ8þ]9vÎôBËmô]u®»mnÛåø}·ñéhKA©¼Þ¥x÷|zvÓQØkËÚ]j¾T¹ón*Ò*
É>~ÓnãG»¦m¦§²Ò<¥PT-3TH±{ºLhþi0TaiÅ}v&x?µûH©±,#úPðeÆòeÁC¢°wM@Û;ài",htR4{HQ¨ä xzÙÕ0#UçÙÄ$h´$@âØîêwµéÙ2³è"ZPÚÛËÃäBòlÁ7ÁÆè°(Ó×T±ÂÀr¶aÈ?¶uí"ê`£(mÖ\=\¦è>Ñ#1N°°° NcnÚ.@·#8-j!ÄW»@5Aøfc¹Ö=/µ|£µ¶ÜmðYϧ:-°2ÌD#-˰êD°TSNx#1*8Ùe Bw©ËçTûzËCÁ!|(at¾:ÉôÁO{O±/Îa=$QÆ^[8 ¥¼ÊL<482Tî_ÏÞlS)©Iìä¼Õ.2oÔöF¨t¤gÃØÌ&÷efO)BÊ
ó®Ìa1Iýd©mk#-ȲEB0`Á!ÖYu®¡ÝÓ{bnwÍÚÝLîÂHÅ$0åjaBfnÎì-«20/ý[»R<³mæMíéÛø·G(ÜL¼òT¦åü Nmý£3d6÷*(2Î;±#1MõJØèîÀ«F§¸o¯øþ»7}Ð^àÝÀóî°#-[yJÖùUºÝ(ÎjU»u 3â0Ñ)Ê`Ö2 ÉÄ4¿_Õ(¡£Eh{ÏÎ¥íôÔ4I< t Bp@¬':#1Kr[`ÁÁv2Ý,Ô@zÆ`ÂÁ:¥Q¦"Íd ©|2M°:<4Jó7ß^cÀn{¢#-¾#ïÄ£²áwEÆ"5Fn>Õ#1SÏÑ*¹ÚdÆXÔÚ
þa"r#-jQ<#-S2tlçÎ!xà>%©P¼>zäàìÓÆtLÆZ¿<÷ãg2Rò)ÃTà#-Ü@±d@öÅãÃSÔ±6"DëàμÐSI¶Ú-ȤǦÈÉV0 ?»¾Y²®^ÃLDmO§GwÉ©»¯^JzbÔ3º«LË`ÐYökÃß6Ì¥²8ñïÑ«¾T Oõ_¹¿)Å.]°Pl 4øRÌ.¨>`åé5Ërº"ÀgN]¼\KÆáìsT Ö!<Å`CMh¯2®"¾d z¿/§5çÈÞøq,âÀ*!f6 {mת¼Ú#-740eÁJ#-®4ìlbvÛ[ KÆÂI#(ÃáçS@>÷Ã$&À¬ B#1sÛ&MôHf¢2HEH»reDr/.Ü!Ð?R4
m¡üÍ´>ºo÷¾AÐñùÆÉóÓ_Éô°jyÕïÓk½ù£dß]û6¤hË-åì¦æIõB%zé$<ǸD.D ]$«÷Õ¸ÌÛÜ@4@TÇTüÞU>ÓðêüÚ·òØ,4-_®Þ6¹I)Z-¬Z¼lÔ#(IHERA(E@¸ÜU (Â»ì¶æFDã_¸ðÅÈÕ¡î Ù[Â÷9:ÎLí#D9y¹©Ü^yO)µª¿,
dSmHfI$³bÒeB%m!(ÚiPÓ#0$±%fH×Ë·LLRhÙ¥)VYLL£$fEԤЯv,R
"H¤YDmFI Ôhi),¥1FbÅ´¥¬Ë(2i,ÄÁ¡"Ê(©&BMT·; 1Ý "pÛEÈ Üöª¨QµrLÇÕì¢dÄıLuwqÇ!CÑêJȰS?WÀmÈí`·ß³`DAi[@"·b@T$ª%a®ðfÎ:câ\ÍÌáK®et¢s¿iÍO®S¶êNØÛÖÎ;ùBJ´MSüòñI0´éÛ.4L¯òõ®¿PÅ¥×-ȰCZhiÕÂÀ#-IÑõ|úvÛݶú¿+Debm,¤!i%4Ò(Ó5$ÍH0Ý{O×»à~ORô·²ûÙ5ùyâ&|DUh(J1ÜMpáI%¤"ÙÙ·?ÑÆØ/õ½òÒê îny}bDcrxÃ.<úO/õùk=éGfí!Â\2}QpÄåXéçù~xq
*'Sµ(%~p:£ùìzû0zZ)!KÁ-¢dj½>¨3 ¶üzk®Þó½å«ÄÂæÏs[îó;Oé¾kQ¤ºtwÓÙe-¾XÎá$2G ä%¼D+O#¹&;øt-K£üöù#1£ÒûLÖöÍ·Ów¾vïÇ¥ßr57äßi ½ÍmFðÛ ¥äÎdÁu$ L¡|&#-ñ·SÝvº=<j\gÏ+®<1Ó8|rå·#-O{WU¿]ZzI¸lexv+)«£ÂéRª¨àÞï§#1fb×Íå,ÄOw_%4d?4=Íãΰ͸ wqâéú¼½¢fm%'¹9ÂÛúhc£íÊ#('~¡âÑ
àÜïn>¼÷g]º¶ôØ'NñyM4@FWx`ðóTÕt¿FÒðÕ®³ h#-Ì W¿â(ÞBg`¹Ã#-¨MjRÀ Ý'1²¯=ÇÅô¹êÍÆð>æ)@PíV>ãn`Æ¥c¿'hÏP=ÜGJý[áÐ5C¾Ä`T> KkÜçÈè2£ÝÂûÞY.34üùj¢óEQØá±¤%µ#-Lõ±)7-§I2ñ«ã¸a!ÇC1u#(Ý/ù1¯uµ#-õùÝIÚïBÜã+)÷мKoÞ0¬Ñ8Ñ·cÌÆ¦w¹
4¢öå¿×;s¾azï)ÖðSnÞZT½Ý76èÙNÞl®êD¥$DWàá#-4ØÕVx·Ò0FS0Ã2Ës¿K§#-z*à>Ú¡éÒR×D¤Ù ßw®ÒÆ£uf`Ái¬Lm¨¿Æ=b\Kç&báqSÖ2>0ØD& N3À¼©éfââxRNéÿaÑ.jÊÕ6òïÄÌYv'3ÌÝ<¨Ôa`Þ±Ù;NŦS!¸ a´o¥ðÙja+»53é6ýbØÜ˺8THó3o GQ#-¡ó¡ÝÙÍ'È>Ùâ·:ó-Y¸[.µVú#e9#VòPÃâãf[ û,KBeÈ\D1N8ÉÈS'htntݸÌêdëVs±§ÅÕæø»Aóôvê¶ÙssÖï_¶e[]4!;ÂÈWÕη`7[ãfÅC¿Þæñ0!÷v<M¡(pÅvl´6êSâH64[e&(ÇÝÚ1׿ý¡Æ;í´[8á¹Îuñ<·Ú«hzë¾ù.¢*§2ñ±yðyçG"Ë2I6ÈC¢!ê.9.ñ@¸r4ÏÀåC¶èË<E]MåÈ3¨Ô`æúM¸!g=¸ÛdÆ·´qËv^L;¿@vãbv}Ç}ËrSzÃ7:r%ó)àiÂõ¶tÙ²Ì<#eã¨áºk9vnqõ3y&¡ÔѾ¹Å¥è5Ãaîº#(ÕB¦
å¡AÈ2ÂrWmèñH)èÃN»Ã<#1Ì OÖ{¦2ñÏ#-
s7ª4mÚ ìÞ®=utæîDÚ9¦5§´L$ÈB3¬6¤Ëi¢#~,ÙÎe3½:¦Sã<bLhn
ÆfÝuzwå òFfk0&MÂßiߤSaD2\£}ìR¸ÁrPëS§7}VèoÌY@#14ÚBGcUÐ4$8ÓÂ&&!!&¤Ö®îlªgn9k$Á>ø5Ê¢ñ»Ãи
@
ÙlM<ð¯%LÒl@Ó(4ødÆ])z壽g(Ù¯TZi¦ã!²7Cd@d!L-3˵Bàsd,Z$¨é¦Ýç¸Ã²¡¶mj®lîeÀùÅÁ¤Í #-I#-N;!KÇ#1¬Vbá¾Ë0°°KYoë6æ¥)ïïÊwL¥G®Qý½÷´ë{wøÁ§j`g]w¼Qj·[ñ¸#1ÄL]Ê4IAqLîò8³QÊÞ5ÇÑ,Yßt]7Z9âàë8 râHKµCîJi\˳
a3ÙHÃWå¥ä6÷·"Þ³ÑÎ×0kÃkär%ÂcÊ#(økÂ:j:©SOO/j"!Ùe`·)Ç\áêî±z'};uÎîuW¼îgI>ëAEªÖ&6%µPÔRs1ôõÃ9º>;]Í)Zðʱ;aßz<zá¸Uí)ê6P*bg<^©¸ðÕ¶ç[¹Õ×9ýeÛ§Sææ0¨Ñ¡SgWyÉÎzõÓÄQ½¸â²CÒcdÂMB¯bÊBvÚI-§@+S½¹Ñ°;opÏ
²Ö
øÑ%ÉyMZiç¹¾²é1lóImd&µik[´ÎÛXu³ÃBÒöÆ$`б»Ëâhpã*ÉÞÍ%8ỽ̪ AZbá6ôä´ª! jtO(cßNð7»%Û7ûÉ>1<ªòZ«ßµUoZ(u8*Ñ\´NÃMµD5º@Kh9ØÂ]Õy7_ëË£b[AD)NvPÁ-ÃÒ
0åçÄueQFKã¤ç©¡ØÙÇ<$æ$Üc øm¨è»éaE="yí%qY'Ôâi`Y1¨c×i4| 1vXS-¢F q|}Åp{aí¡E<ÝuèkÁñIÀbÃ6×£ÒÃRaîîw,b)*y´#-9xhÂã Ä1öJÓ8\&x§µêë#1Á`¤í>]°=å)Ò%:l¡©¤ÖèÂfI°Iìæù í¨+ËPˤÌ9Lr?H0¤F¨]%KÁÜÌ8L<£gÔì¶$`=ð{yD3ãÔ;èh¢õÁf·¡÷¸rm§Es(J#-Ñú[Á´-³K'Ãáò_ºG+HsCºi]%2J>0Èǰè0íĵë;á¸óÃ.8£Xâö˵k#-®)¬#(9$#1Å\êíôaºty»{ãì'>^à»¶|Í#1dgRÐ-°X%@3J¿yÎzðPóÑ#1ÅÔ}X5F@2ÓÁüæüZÛ(ÙàÚ#(k TP#-"=ÞÀø$¬ññà_CâÇ#1{ôZ# #-ÓußI¥<Zä2îJÓýÙd¾´(| ÏPµç5 #-ò¦8è86 Ð
r`L©@hÕt&@ÉÃmEÈP½NE9u½MÍMa=/K$Ù¸9´tÀ°#3'"ÕàW£°f2 jl³"q*QBBÛM;Í#1BؤaaÅâêt£=ÝÏ$d`hfDË2\ô#-4Î2ï5 @ñ5%§4ÁD04m#-º/5æHåv(²g`Ñ#1z¶u ìN`Y¸ñ#-M°ÔlÆvËÆ2bXãKØw¶æqtÃO`Ô0Ã#(Á¶,\9ªøÕZaRå`}ZÊôÂE4AC!vè¨AJ_Ò0Jý^øÊü]anmª¡8t1F0@XÄÖ×ì¼0$à"TïJ70J¯æHQÀ<0h21F )ÖRMâÊ%è]hyïF
uÚoL |&ÙöPm¢r9Ñçö¹&íó|~¶OÈwºB. gª¦±5nñ·üeµ Ârsßúé&4QÌO(#1Ôda´Á!¹¡ÜÃFkк·!Cµ4çЪí°f²¿»ä69$±B$GPOçä #(VÃMJJ)éDm¨lÔ@,§ÂC©ÊÅÜLSÈ#-Îýi5¡-.í¨Lm3Ü(FïFÃz= `&q_öÀl%ØAP^ààA¤¿ÓàÙr¨DdÒW]ÙÝÆ·KùËÍO×OXH ZöltvÕt-ÏÞ:Dæ(r@æå@zÌc¡§!´7nÚ]q¨ÊXFÑ|Öî1óv¡W>|$ÐXú?)d_¾àü-È÷üxOçññ<¶«±xbbXM_W6Ù\0e*fò\Ûxåßi#-¨×åÀÎÇ®àQ:¤á?»Ñ±©N9é$°á¯#129ßA+§8Hìç|¸-.jAÔÂáL¢þd?ÎÚ±HȳÀ¥¨hzO.a>ÖB¸#(%Ë3±ñ>ê?HEH¤ BØÛ&¥+Ek$¨¥¦f¢6Lm£fWÆ÷Ö£jPZéÕÞ_Å#(òó w*}<½`.ÂÈðÒ*|ZâiÁ!D}w]Ò0,d P¡|I6È{7©Õòép@iä÷Ñr{fËý~å4Ù E Q å
DIq2RÜ>j¡Ûe;·I<õÚ2]T-MôæC8rç§Y$Ĭã$0HðÃAʰ[̧@RÖ´ãAù@ù®gX<h(ÛX¢x¦« õ¿éºyqK¸Æ0ÍQÎ${jçÉ5LÚíçÇyC06'´Òu·ÈQÕ¶{8"d;®CÃÛÍ(b¤¹TÅ!UEÁ#1¢>Áä´ÎLµIÓDÑdã&{Ýáñ,Ç""E´¢I$èqÇúÙ#-@Q¤Ys8læ`vÔb6È-¢E \ÞVööø½Aéð_|=~`¬¤!ql0@Å?Ga!¡
£÷nÐ ²b*¿
¡Ê"¢0`«±Ü2Øèÿ2¾Z÷dæaåÌJ_±D^É1KoïÊ£qûè'm!×xÝægf"ÝØ:¦ÏÔå;}¨ØI¥ Ûg¼ªbòì;ðtÏSúv`·q¡16¡Á龿°áÃë6l³C<éÐKIÁ!p©´ ô\c;ÝS9âé-,9¹8:¡íÍ4:¼ra2îêpüÆ[§å¦¤_ÞTGã×&vFòC»¸æÍ»Øá)9TàÝê%=s°óÜ/g,îR,aæe;ñAfàSåÃwÇLÓ¨hjܼ¬á¢É(¢éÇër¤l @òݰ ¦3:$
lc`F!N¼L«³#-M'#(êx$|AcbËÐe$ñ'èÃ|H,»l,b¹,íÕ¢Ù#(`ã,ã÷#1;rè»üý;³éuxÎ EFÙ¡LGýòîõû0)ûnS!~Å;aq³¡rKÂ:B«*¶¨¹}%P×lLaD¾?^CY¯^nóãËâ[(!ÛjZ
øLÿIÂQ#({A#($<ÏRâÄ äÂÝÆw±D[È|'#1<ýÐ-QSoìþüøN.6¸têÅãü#6ó-®¨wÁj\#-u]D®T7rÎpÆîðam;LTéI,-J¼*Åal¦SÚuâ¨$0kM¡àBl2øsÅÑ(0°°D±#-÷DIpD¥g)§iiD)zº¥#-|uÆ6è9¢qM:ÅâG#1ª6§a˱É:°â)äì÷híñ)3ÅÁ¾3èZØY¤Æ¼Ig)Y8s~Ö´ÃßG B9}Ñ´áHºx Ù
S»,&²]ózC7J×T¬CÕKÌéöÞc/8F/~!ïÉUyzÏSÍð`¼}3:¹\ô}ÖÇÇFÝ pµ³Ï=RJqT¼Ë{ÞÏ|ìæM,ß×ðH[ù¹X\ÄRGqäfÄê3åÙE4EÙe²Ü«²Ì^í6ºÊ}ÑÛì`»¸±ª*p¢°Y#¼¼æÈ²UH¤!HÉT(CÈYØ`C?rq¹>R¸},ùåçözà}YÔÉRÙA#-¶×À½Ëu¬°»¹.Ýql4kKJ4¶U´AiJjéPWZ»IX7+ºíÝÚB¯;¡3S´õºòó[ÅHZånm»Jd ·ºÿáîÚi98,Ædª`¡ `ÉJL³[S5ÙjéZY¥¦²¦lÕ±¥ú>ÿ¢ù¾ªö÷&Æ´Í@hÔÛhDY"@$yKyûÃ9ñfE¡3AâÅ9ó&2sÒPâ(Ý]£T#(8ÀU7¡ÆÓ¤¾_ê}¬#-1>d=ÇòaKN»ZßyÇ÷hõÝWÌsÏTHHªý_ÐÖ,#-zÑ ¢òüy5dç'Hj²tþ8|vO-/Õ×õåb¤d59j(]#(=iXHpÐ=G·ã#(kLd3d(@¨¦MÿÀ¬¢A8Y S%`ÒmÑËG#1}r8Æ0Ìçøòg¦ áÈjQéçë°#1Df5rÖµ<YY¼w[Jf¸\ædòCÂ,L;#-#1«¿¨ûY-[zotæ!a~Ö<]4`ÀTë«¿õ<cÙ9õ¬·Âõ"sð3
Bé%q³G`¾·ùL=uÌ$ÂO®&/£oë?Wpã$ëM»q2NêLër²36É$ÿ#1 JsÈÜè`Üá¸ïXÚòº¸õ´Æ
$Ñ&½+ïî¨ÄN¯7´
s>ýú;*à¦Èûq»¶^h%D¢cMèãñþÃSúrÙ$4, @FýAÓ²3Xµ#ÒYM×vØ Æ¶¹ -måÚÚí-im%R"S,)R±EXa%2Âj²ÌYRLQEjX¼î(©¶ÍÝÓVDùmiW®®Ôb¥¤Õ©ªM±«4©mü+[ªø¹#Ti&È5cRV5U²A*Û^åuKFªI¨[Guå²Óe6jÃUMogm¶lE£Åº-*mçWO4¶Ì5Ê»YªMæY¬Ô´%[®2VZÔ¨6áûd§Mkß)++³^îÐ?ÆVÖÌÇ^p~êgï¯#m´tgrÜÉ@÷tÎí·
ãþ=a:°èê»èóúÙ¬#1Àm#(û¯·-ñÖq"Åg)úRj·»kA^2-6M,3hVÙ¾O'øÿwm}[ÜÛ!V¯enúWf¦´45
PÄ#1 "ï¨EdN%-B !" ñPNX¯ÖnDGD )ÁH%EEdv¥³Q4RÒQµz´ã&5+e+VfÉjiM²kdX¢mbm )L% #-¥)HJ6S2Å#1clIBI´M¶KRQfY)SÆ¢KRÍ#e¬m#%4Ùf%,%¬ ÙJJFRRe&b2LÉ¢Z¥±±2´#1¤ÖekRÊLY©¥2T§¶«M¶ë6¬Z¶6¶VU¦Òi¶¾vÚ×JÛl¥*B
¬@[b©"Il¥±¾M¶åª¥KZ£mîβtlû:6Ù§ªZo/7a½1¿æëé¾úsO©¡lï'F9 ɬ«Ð@DèlݶáI*NÀé3¡õBHõØêê·JÌ4 /&¥P÷ßxy¡ªi,$/ѸKAü>mõÙÖPLÇytuw-EU%ÄÞUÕL#Áý«÷]µ5*q3C`âKÄ L2C$04E-Å4!ò@áòX©$8ëxYp?ÎB#(ºhp7k(wưßqZCTBÿpÜÖàöb(AbïS©1*fÉ1$x¦ FNºCó§"EËÕ#-Ùd£åð_¼Ûñám}Ôï9Èa+×}'qݾg*³çÏØg[¢irø¼¸ð¼!!:Ð}HëÏ·ÏRîL8êÒä0(¿m'íC£ôS¤Å¯îÄs°ß
ú§5l,Eé>¬°Æ#-Ð:cTY-ú${©ë¦ÜÏáDJPéÎÛ£NÎoó.7Ô:&éùÔ`¡4ºo4À¹¥ÀEEH@òî#(#(U¨ÖØÀß2®¥«£UB{¤à'ý#(Õ p*ÄÄDÆÜ^x#1iu<Ç&BÖ½~äÄXÄ $;q(²©8¬v´±Xá,0j5éÐkõ9@haÏÇMöt$Zþ-Ã{içf°I¶¹ø\#±ÎðóÌ7pÄ}Û®¹ß< IPl?¨ý!ÒQVªÁ®Íûsü×µíÚ5éDYH¯'Vb¼)©ü©xQÇ¡gHD§FL"3¥6
°¥¦[ѶL[xÃáı²äcÏN±XV-m*O;dð3Z1¥¶<g¦9A`r VLIÃKé´ålQjÃ2`-%~9R¥lIÛ&©èn2ÅV%#-ÎÂ|#(#1Ká¤ÉF#(¥¼¨B¡q¨ïÀ@þ~L]qìCáð´<N7Ðz²ÖÉpº}ú}ÈCYAñeÕ}&<Ój]ÎFF¿ÎhzÞy-̲veò;I0F'RÉÀÙb#-å¸èÉÒÐ/{¥É?±µ"ÎÇxûìÁ¿Ðç\úÀ®hÛbÜÞÏhp>½¹bÉ"ç#-1Â\.õ1ºá,B
nÐå5KEæ9bE{pïFW @tx$\JMÀÜ1ÕéËL$¤²#>Gôñ·t}l÷êÇ`îG»ÓìUN;ÕcTò³atà¨GoÜT©;Êÿ#-#(Ô(t:ñHHÿZ"æ¥Êïfã"@¼¾Dm1íÔfl+ù'¯üéYncÙ{4ÚÊËK(Â4¥ÛÌ1) ¢Å"Ø;ÁÂ¥ÒrÀÁ/æC 屸ÁKâc®MÍ-vóÕÕ5#´xMLÓ dCÚÛ3}wtº!0ôJÅÏìðÌ|òïFðÙS¼ì|#1¨¤$@hN>9z1)öx$hsÞ2¨3ÞyOn!ÙM%k¬§§)¡ÊÞ<µ4}åcÞPrH°X°V!©¡EQ+î:#=9²s96Q9¹Ã kf8 âw÷á)#Prf·¿Úø;ÜÓèä°l^Eú ¨0®YôwM6R/Õ¾ý);¸Ì(wíÞ3k9}¸dÕ<^CÓ
G£ìÜò¼^CO?¶èCiF#(Ó#8Í:¨z@Úçv¿#-x0àkj¡©ÜøyPºµÉ'u$4¼!KcÉ#(9Îæ«ðtµs2¦ñaÆó@ecq¨Ú)#1%P5HUùðtÑDI·2±
4 (¥ æ#¦ÓV5Htl»»<}JÝs#È ¥v@K"ÒB¨Äh"tâYPdU$Ç._»Þãbî¸÷Zr0zQ`0ç)rò3V6 ç)÷ò^çAQb¨ª¨tű>ï&@âkO½PUècÓ9ºÔG,"Dº¼í;¹Þº9ÕØ«StºTn¹ó!/]³X0×2Âà¦Hä±Äõ¥ õC9Öp_oå#(]áÌ? Ôê<×cÛ®Øi.àGâAOox^uµkS¶6¢ê7,tã§cÕs5xµOp$ Ps.=#¾Ø «ÄnbQ*Ue,S@¦(ûþ W¿ íÚ§h. ³ÉnFªÓ»#(õ[BW7^'DëxjACÖXHR#À<°#$QòÁG²!¤j¨20dö=O?O½'"ÀIRÃ=Û4D<$×iTxØÂ#,Kiaï²±Lj+ P£)$âBlE$R@ÒÊ/#m(`Væ,¥0,Ã#1@ Æ@'#-ý+)ù¿BÔëã¯áµäo»V&ÐbþÌìIÓÁ×¶<²C#[ëÜ|Ïø·)Öá°ËDaéÀÙL#1i¹×%íï·¥yÔôå:,ÿeÞ8Ïl'BÌóÍ#1² \XBQ#16Ë#1fë×Jm½óIZåoµÍb1bMF #18,¼æ(!©6þëøûƬ«*[Jô$§;2sa^P>)YÄú²¼Yüs°½øÌ,ð3R#1H# Àq=Nuß\ù@ÈFJÝûÞ>¹Î¢#1¡¹H¡ÑÞ£÷ÂÍ
àu!ü)PLi
^ÝiÁ 6;T¢¡~°·BAª*#Uë±^Û¾®·¤Û!W¶(´8´©¼58·$/êÓP¦ HbU©
EhÚlëjݶÑÏî'ÀtЦÄ,Ä¢ c¡±yÁ¶¡ÒtäßV °ïlÚ·ñÇCÀ#-[(¨"nÍ=AI7Üj´¹Ü§Í«hDÀê·¿@!aAÓz^E¸dQ õüÎÂ)FDV *%lU£
¿[ôoÜvްߺ@/$·¡áôj414Hj·#KãÄíOfïøräµÏj#©ñºÙ×DxÅÙú2q'Ë«!ú¡VÙ6]EînÍFDFöWâ<ÄÎû=¥"!¿wR:ÇgbÐÀ#1#1¯Ä`GíDͳ#-ר(1¥¯FCD⥿¤?Ëò#-`ÂGàs#-éy!MQMÄý9<ÎXìWÙ<Áæ|½l©ÇÁK DTYN"E(`ª4@#($R(`#-@T$¢÷e«Z½-sZt×[ÞúÛeé~}bffÓ??9A4´IelâCAA±(¥4ý{õC ó:>ãèMçºã½çS£æ5nÒ6ÁÙ OÂr°<£7&çÐ;®p+ânó¨7Ô,>@ÈÎ0ÆôÏÍCc#1~GÇö }6¦°ýNõ6ÀËc×FbFBì¯]÷KÅÛ#(®Oqò,ÿëê{g
aÔpË´úWCÁÏvØÂm´(êÀêcÜÌ;¥#1áÎAHD²¤g`dÏ67O}.GSÿZ
CWùì_·ª. ¼¤QQT-&s2@©Îµqªm¸^¦òZñ~½a{»ùé1èDB~CS#!X@ðÀÅ)à? ÒzòÀ^_ïB¸Ü¡é¨«á|d¬TRÏ)#1Ï>/CTÊO%,)Ûf^DrCpÚ`ÉáNkd¬µ:tCÄ[;«W6oeÒ½ê¹I`Y#-`qtë&÷C\fÆNi°9æ N UH,¬LPë)*¼¯÷ðÎì#á Ð"ð;*%À*z:®Ýªf,óc#-gy/6Ç7©*tÔ0ÌTX¥ÔRE¨EY+$P#1»uÕè±ÓZ;´S|ZN'lÌ=,Ã,¢Yëþß7N&RÔwi;àÃnCÒy·ÔÔ5&§L=[Îç,yL ÓLz@¼÷#-ÁQSj¢G;_<äÿ{¬<|dD0ùÍ4§·ïÝcTÔ`fºSbh!uüÍ¿9~uq3úUv#-²¨ XÄ@Y$
Ëa
,,±#ïÉô¥#-ñ?$wÚµ;½/$;qqWZ;¦aT̵?}%#-éDcW¨ÄR#(ÃGìë "J*@l#if$Ú,Öójó«°¬aY1rÖÝ*MQ°#(AB$4@ +qQ8ÐȱôTÈ8ë(¸H%§#û¥ÿã ô{cÐÝ#SÃå3O."fzC"«EP!P")QJié(¤+ké(LÔV[w}ªÓUK¹ÎïãÚf)¢Á5°~(EºÔTIDI,Qd1°©Ú`¤B(Ë#1ÁT«1jCÞÂãH("65Y³+béX±]WuEC¾Î¹£å
@ð$%I2Z*)0¦4¥ªJÚ³àÄé¢Ht¨Ê#(daç]æP~\Ôr2ä,çPÒa°Ý'h#(¤ö&TjÈ0çgP8E$+É),#(æ(ÈBz*LH)<v*#-oðdwLÝÐogö%r#-2 gP?±9ä=él-FÅHx/H h@l;º#1û]¡¹é³¢~cÏLòj»£ª¸#1:zy¯ióÍÐ+°hÈ#-Xæ^£bE;æ&[bÝ9ë¶ÊM5¨Y/_0>}"¥ASïhw"mYñrÄØå¶7j°s¨ÈpæÖ!¤C¹@]!À®Â tçWmÜ%KHT¦mhÛ)¥4¦Êy+¤Ô b±1·f÷~WUùþï§éú6#1z@óÍ_ÅåJ*Á¾ºwÂMß»¬aiB?#À üÎø¼[}ýò`fÑíJ¤ÄÔ¶ÔSQJqpÿá¹yíPÜíïÏ\Q÷ø¹ä`´2*",®Y0DC¹_A@Ãaº¨M2nâÀ¶# ûgt÷=$ h³g¿É¹ï9úáÕj©T4ÞÞ\39"N[âíÁÆItr~ÿ£H«Õ9Hüw´£%ßvs86n5úêRL'Cëz'fùã2Ã|é·PÒYü,èÀtÇt:usÊhJ;#(W×_^ÑÊg<-ãd࣯ɹê×S¡#(6ų·ú×Xlo7äO(àóqsc¯#-v>ÅÙIûgOb}DCÁñLòZÛ À¿yëÑL&çµH*E±# BÔIL+SV£j5£#ý©»hJ~úµÍ¶fU6Y6ÑQE2!SÌKimf³m)¦´Q,I¶a¬ÛCKZE3Y©²ÚجE*¬øßàïÉ 8SôØÒuçã/;$"lSDgÞ#1R L**¬Ýµs[¦×X[õÔÚË_=@æSýx¬E!¢#1H#(F»á"|ÌGDç,PM|+åÕA²ÖZB¢gå,Cî¥ðèõ!Ág£bPà¶(Õ¤³pDlSr#1ñ½³§ü.G#vÅ$#(¨#-@^øÅË=hySãàþ?S
µ£@?
H"TZlPÅÒá E´¯Ì'XZç@H'+´ô[ ùñ%j5t`SkA³Iö¿b(¿^P=T#1>!Cr%M9.dÉî?-p(ëýK@DØÙRä<üç«þo2)å"t$¼ì{AÞs¥®§#ÂUSa¬M¡ÄÀtQçÇÌ#-^nD#(!>#(Üa ê]»O8FB¨P"Ðy} ¢Púf}û
9aÖÔÙ)ÿc¡!ª(¢ð,l=^§óü=-øD(û!îø#(ö&4hªmãA@¾NÏàïÊ¢A}Bb!¥néÇDê?X«hË"K´:k¢k¯ëÉé P½ÿ¯^sÆïøÑô9ÊèQNÄu=.½RL$5|Hº h
ð>ç>û1®¸.4"#´(bX|sLb,ùø_~Ư×pßÙ
¨IC²U Ä@X²H¯'êóþnaÝ=ÁÓC¤Ð^³þ½ÙBÉÚ·,²ÕDY&¥Q!Õ&áZ1DË#1QS,¿öÕËV#1,>H}Ù
.8Sê·h$ k ×T!½u[ãÀ Ò.Uuvu h`xxB$h?¬.ȧøu BzPoýÅrPB)wBC®éã$ãvÅm1tRq'å\Q7DÈø¨$i̱å«Bvʬ¬±%pó3t!¤tË61lB¨¦#1°»0êL('5,-7±rÔsò#D¼ä dD Â"Ì$H% SBRx´ä¥WÞ}þ¶zz§²#(ÝtjTpH|æ#1òºÞ¸Î¹RFEë HÞUD(+uÒr§ÛLz1ÔB-íâ#}ç»=ç#(í)|dP¢5IQ½.ITÍÎÅ6øzÓ¡´Tx¦¸¬"HaK²#"°ß£[#+3(ªW2D¨ä$ó×£/å»n<Ãèf°û"p0Æ.DÈâpG71«ÖÌ9rø3£#1,êïVèvrBL÷J)Z.eÎ:§dý"LËãÿG7òüÊÒpýÑ9Õ#-|¡ú4.Aû%8 7ÓuBËٻخ®\§ÞÌã£ÕßúVÝá¸âÁD>9Êäîÿ§o¨|§Æ÷ºéÌ¢IõåȪ[:qÚt\ÉBØhôâð¶ÍY*í(®}¸¡þë½$ô¿d¼C´¬»ç°' <°GPÌÒS,£
ºÁö'ÞàuÀÓa5Ó´É5æäU!
K_·]ø5eÐáwWeZG6]s$0Ô DßLò;'·wQbʤÙËql¦3´Ãdx}L¢FgÏú¿¹æÿ½!ÀÛG3j©F!0Q¥¸¶\JA9¥6 ær áøû#1]éü1GNÎùÃÜ .ãfe'XEÖd^h« KaÞ_ Âÿ#-ÉØnhåb y¯²EdaI¶ß©No+ º«JªÂ(óB!±ùÄ×ãªfô;Oðó'î»Or¯ÈñãVCøI-¤ RưX É&¸¦Q,Ì.6BÈ®P
@áA¤&ÊBzý'!E×?â¤5sV/|#(VáIî¡m´`KO¿jýq#1$Âm¤8}%Æq#(ÔÄ%dYË,AðïÐhdú|Ü[Î.ÿâ#mÁÀ±¬|ÒV"&FcTµaᨼA¶¡ñ
¶G
B^FÔZY<ÒxÉ1#Û7yöÉ u§8LN¬ä<ec¹ÊaèòM²®ÙV[!bV*z#-4:fÂOS0#1ÁCN@ëC1¥vJ\nÄ2Ú9E!¤uä§Â£hÁ0Ôc!#i¹c¨èÙÔë·§ÒôShpVÄIöúë#Õê9§6èR¤¡z7Màçñ4DÉla|ùóüÈuõ5èÉUõª×VfmJZ4Ê¢©M«íWÞÕ¿*%uÕgv¹c\Öé£\®+!'·:ÏXÃà!¾7V.Z,jÞÝL¿uä#(ª=þ˶#1Ý7"Þ'^Üo6sÕÙM9334òJs& YQ¨?#(@#¼*Ü$,L8n§ ïÒâónñïi¤Úo$]Úë;
3q1³-ÚmÞzæò¨$V1
·ÐKÑeÀdÂ6td)ÊîC
ÕͺF¤M°#(£&±GõÅTDMÀÁ#-åeÂYyC;¦Û/>7é1L,ó8éÐ&´Å%1R q8jPgt¤äm)¼©¿[Îf¶e¢@ÍAáåGÁõM(æ¬ô-3̪É6d+1`æD;'0¤ÎPñ[Huø×+(÷uÇqGBK¡}¿%X¸bgÇê<çR¸ùPã¬#(ð£8Xhàý=,>è>Q)2¯±f¬d%µ¥fý$©¯µ5>#)ëq§Í=$cLÝN<Çì`¤ý#-ìíñ¾W±^ÉhKÝÅû-Ñ·d#-;#-òÜ!ŧÈÑðL¸BxB§(+#1ý`¥åÄhèÚǦÌöL6bú7¹ÆTK¼D¡;q>æf>LzÚ²"Èk$*§« SÕ¨JA#(øCß)¯¿;rkÍ#-ajî.ÐßZ9|
Ë?g¦>ì12ÐÁ#1ذË@krJ R® B9JVÑÐ0 Wï`?P,¢ÒÜnN/i¨ÀÂ[ÎL`4ɤ5ñ_åþræ{d¢J*ðîã÷/Ðûôa0wá^óO"ÕSF*-±ïcØPkN'wX5Á¢Y#B¡ Åÿ#1eg=+¤±<pôS{Ç%ce3gbæLËü û¼="°ÊþݨâÌþõí3Fv|ÞI"£-Oâ$C[Þm¦RT%©Û`²Cy@¡% ©ÛµÖ[M*ÌÖɵ2Zj¶e[u[7L¥âäëhÔ!È1Dú`ñêÆ'ÔÀú`}µü5ý¨eMuÔ¬Øà+#¿¢Å;J¿ÀÓõ´bö#¡Ý¶û"&ûHÖþñ#(R$w>û;#-;&óò©·IHfUÒÔ!r¹ÿ=2)*ÖÂs æDâÊSv0¶jÑ,ÄîCÁ#(&Y#1Æå·¬ïC¦-ú]¼l&E²-Ä5
¹Ñµê#-j`ÊÁ_:4&Ó¾lôW9«GZÀ?Çô¿ rL8ù}VÍå¤ï~¼¿Çá_ßg#1G|gnéW:WÞJûýoùM@º(¾Òøî«1?«IÙÃAwÍÈ¡Ø)í$«ôÑyg*p2z1¾ÿ§òþoæýú4:õâo8*o¶/ʾÔ×Ç0d#(ó~>̪P=Núð] ³Ô©X%AÝQ»3QOâ»Ý¹U0AÚ«ÐVØnäe9wtw¾YÙ2æ½qÆç¡m'²tmäs#A8ë¯=d®]ÙÝÇÈ÷ÆÍ1ɵ&¶à2%Cq@ÀS÷ô=¥"`¯¦º\6BWÖÈ´ç·QüCpÈ¡¸{Ë@àÐv9@X2f!·pîXhÙ¬ÀË!¡ûN¥á¾áÈ¿DÐÂ'x¤|I;êUÓ~Þ*D¾ÝäÖ#1'¸Q3nLÂ÷>Côµ~xf°ýÆÇôýçûÄÃ#(¤Ø{|¥¢éaRêÌcºº;±Aݯx£¨lõs0'ðÑCð àüÔúHÚ#ÿ[ìS6%lAÁ g5#-âvö`³dÇ#(:¶24,·AvDøQ·ð%|ª{ø¨{8#¶ÕÇøT%]q;!Úr̿٥îËobæ/ì @A©!eó;<Ç#(+|ú<é8CàÀ"¹BHQø$X15V6ŪTÊ´¶®T *"&äÒaéO^²¿^×Ö@ÀUÑxÞT.³KböiMÜ´Nù@¢Àò+ìn«HÐÌËLFôÊÒC#-G¥Ë-µ#1·_Ê8r|ÓûÀ:é§¡óþ[Ñ-²9He±¦4)º{¢&bd|[¸5*Í©¿Ûý~Vì#(IUHÑGä'Ó¦áòQ<Z£bôI`ÌCA65@9"4?b2Ú;gø»!¶0{·¸ÌN1k® ®ãÇBPscUy~XÀ*»®yª»¡3!ê#t 0õ)X_·mAÜJ<ÕºçE^rt°ÈEÙ1ÒcÞÀ8gyâ^aû!CÙ·æ¶Õ³ó>ù=þëºÁ®¸tP¦R6¤¨-Ä|"¿¬ÄKé#(ÞéBY¥AH·õBdQ H+Eh+AbAÇûgÐ)`_*ÅèÃvRIJR¼aùü<|+»y{:l?È2Jlª[ÏDdX1Hx@ü>çñÉ
åµ¹qí?1Ã6h©$ùGIȱïû(uÆFq»ü#1ËeÒ'&$aëLëï3áÇ[. `Cáó°.ÒP_EU)ÈGq®xj Ìý}¾ÿB¾ÿPuWlfrh8â¸_.³¹.ì°®@Úºµ5T7]-¥¿c3(t¬:BóLR!VbÌÌ&0&¹p}¨¥e#1ÙÒ´;-7,j × f M=[Ê^[4Zî®Ù*Ì´DDPRÐY%/îz6Má¸ni¡¨ÈôØÎdE#i³fÉyÌeA#1%"¥mf`¶òA0g &Å¥û©YiQIôçA&ß®è#1CõþÍÌ
PH¤#Åâ+Ȳ«2®tκnêje,e»».É·ÁëÓf¦5«L#1¶Qó#(¨A#1k[¬óyÛy²¦Êe1FjKJÓKbJ2ci6Â2ÙQ£l·qêv²qnM7]¹åÄ3.DÖd"±å'rĹÚ&UfH°d½täÃCG$RV8tg2@áe¶ai"jVuó³Q)¹)p?++[:©3¤HYÝ$c¥ýxN¼T*Mgo{M½CΨj?"Ë#18vvo/+F©jÛk¢mëºB0r6l.-ÀÓÎifI"¹spXx0BpA"#4ÀLøÈtà Z<!/F¥`®ÌE.2Øb)Z@ÌÃ9@Ãasd$3(ÞqF eÁuÌÄCzú77¢¡«¤Ø&k(]CÙÁÖÔY,¥ädÆ.nôa§¬ÉÇó¸Ç:áMè,Ä0ù6ÐbÛ£²í=Öz~¤»Îã7p~&¦§N('`²ØhhrbJsDÒdvÖ¹!»TrArsÊÉvzA=M°zMÓ÷ÚIPþ¸¡õ¡ä©Üô/Öp/¸»¿*IÍT¯zRÞê(EÜC B¦ÉêJ5ðÚjfLh`*#-IÔBÄLN¼ð0««¡Ç¦åüݨa§,BvÅ4Èi"& täóò(ëL°°c`»o^ïo_MÀ´i(p
Ú?êâ2t£è$å#£¡02᪮ôÒ²aÌ0%i«ÛÍ\Ú*é6]J `F"]À0Ó!"Â--³TÂQ$C/÷0N¨§§Nïxñ8"õ_§Þ;:áÛõHç¿ï{
´8+·*X¨s}D´&}NäÏ#ºbL:(ºq%F/OnhOõ]Ðjø/éÖé¬ß¢û®x»Q&d;?N½eU4Oz
ÞµdÒý\[X®}]ç5£N]1¯GhSSãNu³£àÅaóPKÊQ+t8<<¥sSMTðdNK7md8ûVÆ¿rÝlZ[Â1åH÷9:Û½Û<îmà ±°íAs¢ÄFÙÞ|^xð§&&K7[ê#-ÂÓÇ6ILó§+@¼ß{ií¯c¡ÇEÎ_C&N»h¬o
n!¹_õ³ÝØþ!Éè=qæNk亲G¢ç"åå`öïÇ#-Uñ·\¡ö_®>Ô껺`ª±#1(X~¾:Ìפ×JÏ®!!ØR>ÐÚycÓÈû¾©Ç;¥ãÅ£¼DzbPr
F¦¿ Ì>A#(~_¯#1×ä̵N£òI Y!#( ð²2ÆFŤÂûHÈ#1;¶¡ñ¤´Úcn&KÌá3M/<Þ<µãM³5ok¶®ñÒXÚ¼º×mnwnFfî¼UÕÍ,²ÆÓR6l×8YÝVÒmÊÕÍ®{Mº[RDZ!vµ¸(¥pí´ÛCïg×Ý81pxVSâ&d²Ìí^x+#16Ål¨íb© Z]®ÍyæÖ~Ù/R>ÉÐ ^
"°,&P²$ ¸¡S#(
|w:Nâ°¨°#(Y ¦¼[©bAÕC(µÁ#1fSF±Z#Qhت*Ùͳ)$
³F©4#1-Y©Tê¸ÚíWWÏ~§Ë!êÀÁ8zYB#(,II!7q¢Èúׯ|vñm#-g$Z'óÙi")Z/à æç6¨ N¸H¢ALµc)³F¶û_bµ\Mx®ýöìD¬R]tÝÔ]»IJÚì±[i·ví2µ¥¶ÊôÛjëii*)#1R-4Sûd9M¨ö²ü#(>ºªNÄ¡¢jÁÒ"2H<Ch;¯$dAP kGFèÕs<ûûà æW·4îªsÀ$#(ÔÃÀá)æ
ºï#-OÉìÛ]º;,S÷út~Σ$>±½l#(>_ÄãRaØÃêÊ2¼3\TÝ5´ÅÓõeÉmf:¢<E)rÁ7M²´-$c0RáýTÏN±µj-÷¥qZ|¨
I2ïúÌþ8ͳ³Éä¸ÃBf`ùr¼þé6fàËÂØäzi8¹D;"G?WÈà¼ò÷iCǯ§äø'nÏÃ#1'Æ÷´³ßwgH|JR/É2ÃY3çëéÊÒåFî¶ghù§kd! øO*¹2víþc56%VÒÞèôq¥àG÷Ü?´}Tïñ@öEÄú¾3©¥|gk²GS¹¸OrÑ|#MÐõ@akQV[áKö[jü%¼iô0cb°õ@*¤²#(T@K#1/c°§wðNÏ_\Ñ?H(¹ xî·ø¯Ò>2¿Úg&-úSRÈ $J?¢iJ0&¡'Å#1Ñ(ÈQLÑ®ÔÐ%Ùe ÷g&2$GøQ«ÖÚÝêÛkéµ³)1ª2H¤ó±d¶X£Ä¸À "Ihf¤úÔÌ$A$g¯)Yq¸a1Ó²NiE%ÜÄæapRÀÅl99¥©¢ÚId #-RF!ÜD˱$B0tØ~úZK¬#(©K#-#(^7§`|Wcg "F@Äë%
ú§ÍÖ«5ç
Õè<,qHßZ¸û
ÜÓ_!Â6AãÇsøAÒ1xþgfP< R#1Ü@#(_K!!HD s6KäÏÌõc·Öu
Pù÷Õ1¼ùx}DÑCÂ8Ïkü½mÎp'çUÑ ¬¹¥ìCLB)Nnä¡Û,h.§"]©õnÙ3÷HÒ7òm%';¼ïUÇÖ¯FÜçgiõ½¬ÅçPªzzúáî~À´°Èü|û8Nºßg_ÖYG´9 %2B=[^àñ`˳yÃ1ÄéjB²yÕÍ]±] Dâ;& ¶À#Æía±Ñ³Ýù"`#(»ÁM]OùìØyý|É.ÿKبU^?#1vúáázÑ Ðhݽ0#(øbPö±\¬%éò?ËmUCÁ-òTQ)¢TT"!oD*ä¸Ïc¦¨é8
b#(r}9]ºZî%JÚ·´ìµº3ùOyýÓîbÈõ*.fAd4ºï<Þe¡NZéàÙȬ)jñ·,´µE4lðWJÒmêóy;GBȵJÉmELICZêi¼¼»W9¬ÍK£ÊÛ¬bÚ¼Õi³»jÔlÓSµÚ%´Xµâî2]wk»+®·FNë¶å]Ce¢¢¬I**ÃôP#1ìnAK /Ñ>)ľ|¾}ùZGìèq¶Å?7JEA7Åê «< ¡ÒÅ"yËîQíS9ñíùc©8¢r¾ZA°#îH_?¥zU5ï+ê_Ï<_}ã&pª¬Õj@òãÖ=ô P}:Óèâó£¿>òÕ·ÐUcY#-µDÌÈ'¨P$'Ø#1ö BÀ2?ß0Z¨m<~þ¶¨&d$#1Xµ¶KAhÞæ½Ó_¹}ËÓoÛ@d;©bÈ«" #-)KAª3wZæÛ¤¾¿7LúêÍóªjé5â/wÔ ÚÅ]) Ej¾o
]rÕá æÔu¡$bÄ&àP$Qa R,¢`BHDbÃJ#-Ì<gÛ§DØÔ(OR"VTIúv»o¥ÅU¾ò
K¡DVMÅçø>üÌï«ÃR[Ã0u» «"ÁR#1AȪEH0Ht]8~Ï"6¾6½ú·ÂÛ6ÉYTljM Eåì:ØrlJ}ïü·¼¬iJJ¬ÁM)Ú¿ª)j/WªØ*/ì~3MÔÏ]nÇBñBS¸¤ÄüÞ¸0ê0Ô$.¼õÃÇ
´©Ö^WÕÏß
×ü¼Y½bL° uõ#~3úï¶"©±zË#(óLbµÁDõ Õ)B ÛÉ2Ìý¾0=9N¶À#1w¾vQ9D°àúX1GVÎ×À JE÷|ÌBÃûòÖBiÕFeµj[ÍÒdGTÀ±Il N ¡L¹(ÈEeJÃL@¢B k@áÕ U,Ê.k³C)As0,'FÔxªåEzÙkzB @ì3Ïp@9|*1G¹ZOQ«éè¶çg¨\8uR4NØ@éÓÀÖbe¶çõIáÇÄ!ã¬.B!àÃv ¬" 6Dj*K#1bÓhÎÅ]YÐìqÇnhÑÓ±Hy¥sËͺQ.«BîJU¢C(T.JJ#-&%ÑXCkãéGÖ¢¢F0#1#-°^]e#P@'|ESÔ`©ë
AdH Q¤a¨²<Æ#1Kòî7ÁÛDÌiÊßx!å*~bBÚñæ}!ÝW» çbÉ pª¦¢û(r¶;uÃðNF'xh`CÁiQKbÌJ*Ü·Z¥ý¶±¤AqÑ«¶¦êÛifÿwsªiñýÔÿHÉQë¦#(àB%Õ§È¡C£ø<Ym©ÚrÝûݼ¸Æ×ÎÚ"uM¨ò Ô
ð¨î^'Á3FȰ¨ùª(*k7kDZ¤¿,T#(¤#(O#1"1 dpt
7ëì#1ä/=ôÜßw×ͺíTcv\óóhøÙÁåfRM4 ÚRD§ïHHþDTa9¶u'D7Ì#(MÂ(sâ
»Í¥»ëë$Ó÷;°¼h)! ;/^,0þ?5³BÏÓs#-æ¦ô7a³;of`Îÿ³¦/AjHUïÄqÒ1.Q~æG~|ê¶ç7X̨bw®·yurrMãµ@½1¸\&¤V
¯o±hÖ@ºzè¶(|½"®£_>¶Æî¥÷ÿ
*î£ÌêY,Ú+÷v\H+¹êÙÒcGà.¿×M)¦_¢<#É_H¿zß9¸7ªª0}R?\b½Pï4äÃPÇóX|Ó7Ü#Yë[Î
µÀ$¢_gV.J ¾MÊ33&#[©@Lb±:àä²óy#-Y8Ääe§â¶wtÄ%ìK¼ZL^pð[â©»Fp&¥Wú3æãÌ)ý2ô(põ+ÚX/¬®ë,ß'f)2>4ìíß}p¶Ø)Êjäj¦®ý6ÄvwêHÏÖ3þXÓÄÚB+ ¡Û~dê,ÔËLE¢GdP¡è0¿Ô®|<·£Ê&øÌW~#-ݱªXã¦Hñ(1CªL6ÆÛ`¶2 ZYÌ#-=1:AµÆÑ9ßtw ùÊz«JÀxNªéÞ-v}¾~><´ä©ø÷Â+Þr@ýLÆÁ¬n·âr½àPÓA²ELq¥§²-c:ßSZ#-E¦¸¿ö;j`$èBêcÝ×øÅäSëæê
tN&uYåP®a©#1`L$³1Ï^¡âÝfÄ#-£#Öõõ¨$ãOÏN=®ÆÑ!$)'npj7^£mÂÓq¿wãÎð ж©?sì@%ET¨[db¸¡PáP9Ñ¡?èòy\Ó®ªsNÂóvx¶/úññ¼`/Fä±Wü¦wÏmØÃ·$d;ï#-$ÞfæÜÏÂ#-ÁÂTÙÏFØK0²8b¼a,#ªæ#1P<Ú®ÓiÅÐíÚ·Ì4GJ-¾ÌcOÂmAe[Q^½)ëe£§ã¬¸bèo(óÇnHbÜãx ^!.UKXþlÇj&̵92¬PCO,Ì{7Û!$ÑíÑòãݼztãÌtÎòE·aÆØW={Åñèv9»?§èÄ*ùÍSÝ(i#-_Ù$7A$T;Tü X;ß<=÷6²Þ·å«hµJ±fÓ«Qj°¡¤SÇ®ÆÉî>Z{^Ô¼d5±O6ÂF17g÷_ñtçAQðo6:ºÃ¯ó` ¦' æÜ!¿^§ øÌí
¸¯ðÃo`k\Z6~1ßUZ¶d¾1º.Þ¦Â.óËÈM4ÈHíM!Ü8W{ÈH&~*ôì
mÕ¬¿ÃÂ"!ͦí&ÕFÅθ3WÓNÈb±i±fe7§Ì1¯1I 6½bOn
ÿ*zî *!Ø«#(bGv#$,³^ÆÝî]duî#-ÓoÛjbØToapa31i*±Ep¨ÛùÁáèG¾ê,Ä7¤¥Ñ#1'%L¥ àr§=#-#1R#(lÁVÅ7NàzL2
ËR#-¾¢âUBP(..ðq$c¥Â;`H*f~¥ÎòÙjÏvØRì°P©;{ÜIÛþ=yr(jo7XKzÁ(o`:ßô,Í#Ô]á#ÏûD{JyAy«qs?Q»¨< 8À{~DhS2¡Â!Q¡Ë!?ÁíÆµ!¨p~TÚ>ß>èï¯>8aj*F{êæ©º2JU'®o8ZļWÃ÷øáF¬©DC=zòÞ¦ÓÒ_=pßjFÌ'éûúbs,*Û¾FûO«ó´Æ `Hbekbùû`p!"4¡[] ] êYçh¦ þ¼Uä®bXzÀ°óÝ õý½v*BUQµñMlkµfÚSA@B,ïåÂÓÒ#kÀÊ;y^DÐvîðµ½ÞèÿGfi )(E6©6
&¦f#f2IM(%&ÍJTÒoåíí}7Íkܵõ$$"9Ó1ÒûsxýGI¢Q"XÞJIáhÔÙåÙÙçÙͯ&vÓ RXêÚ|%·#1¯è«xoö?a| 3ÔUWOê8t0I=Pç*LmzÅJKD9XÂ%
=°~óÀÅrÈu¶7 Äo()9&g a7è@RÓNÇ(sp¡âPP56¢h°ê<æè"BG`aLÖÄͶtVãí¦S£¾!Oc©Ç¸ØÐÝ9þçëÙÍÌBðEc¿c?õó=rÎrzÒÏTCû¤¹·ú+õ48ZA.®ê*
«áF¹LJ%E¨A°£B²,#-Rd#1Ü.÷Â@ͤB´«×U%·g%Í×[²W
.#1É%âÀ¡Êp0ÅN" 5,Ð1I Y!í¥$ ´Ð¥³G¥
ËDä]È7ûkÒÛV*fÔͼUÉ5Îl@$7ÈÔû÷<yJnYô¬*@¸;E¥[¬3 Ø·1m¦d÷d¢m¶°Ì?ØZbýFÐËG[¨A´¬8Lh¢ME\;4}ÆCÍ(/:Iʬ0ÁÚ4¨Å÷658Ñ1ÀÄPzÇ©¡ivVÕshÞ6¯Yª²®]H¥\$´HŲÉâ*¤§%X08a0c,RJIi
:³FdÔËYe¶S»,Ò¨èR¼qEÑiUNfÐ
tÌL&4ÉpÊîÑ.âh¶ºS«#1eD2B¦m2eÄ+²b)N¨<ÜÃ妸-J0¸TJQÉjñ7ÅÅcÑÐòëÖa¹nó2]éÝØ©o)Öw9/&MéâáAX8=¸®e02xeLjmÅÑÁÒAÜWM¦MÐÆT ªX½#(3ÍQH¦ðÏ×nÙ*K"`y¤< ÖHQ:Cv1<ä£RPfs:Âæ©fâ#-A7¬ÀÛ@áÌ5ôç2ìZë¤áFl@Jh´ñW¾iP-yaàêk$4è*h¾¢aF³ @IëÎÁ,Ê)ÒE´M&³4ekÐ5òýªç°ë¡zá2l ø¸#1
¨!åæaÙ0cÈ3®Xq& #1Èݶ4ˤ)R"`G¤1#(}â?»tõ×b;wyàiáÓ`¦¶d"!FJFC#1Bɦó&v:ôÉCÍ?9§ÃCÝã1Q:|õ¡%°þ7¢ÍN|°×yx!ÃÈFÈsg0ÕI&bÖu
òhTé>9^2;³OÞà`Øsüô¡ÑI¸¡NèX^~9ÊtðG"*ÁFÛJçåÊ¢yá¾hØZt¸K»Ëe&¤Ðò É %4¤íß¡c°&ú6©jÅ Èr(t2ɨ´C#(6N¨#J`rLÌ%!
f$ID7$Ô"Ò-àSF÷«JíäMò¥@ýÈTª%IÉ%-»Oë8[DtÇu×/Msyñ¾UõÚ"ZµSbZfÄÉm|]ZùmùÃx(}kíÅVÊ`æN¿£]·"#¤¡5b@z@±ÏzîüF8ZÖ)¨ç/¡oÎ×E(£Ö^¬zâ,"#(H -&`©°Ø¸4¸ð BD(hf%vS{¾¿n³Z¬PM ÿbÏà>RUßi=Ñ&lö° O¨è¸ZSúc$QVB
#10ä«AÛ¤9i}±Ð¤æNHäºóÉFűðß\íg+Ó!~j^´-¦æ¦ñ¹±!ix#-ÑÇNÀ[3í2c²þ ¦ôÚ)¥®åÙÞZƸK^·k©ïq-/¸CéåcvØ Ã@iW m*¤xDÁ>âì#ÏlcbW$_NÎù '¡ä kúùc]û#-]^âòLFDNøàÑÔµûÏ5nÀþ5ãÉôØeÝü0F"!#1àW»?A¯#-êíò3E¢½^ô}Îûø»vw91¸áÌú@ºþ.½æÄÆÞUf{qPó-S{5ĺ>óÔÂ#i¾kÜåò"#(ÈFD®_jp#(Ç ©(áTN6_²b«õ#(<&@lÐN,êÈ» ÐÌ×2»O¦ÐåoiûBÅïÚF Dèë^'kèËÖºJ¾uíf-DWêS×°`] Iù¢^4í=útÈLcºb[ =¡×b¡·v2·#-8k#(ÔMë÷åÓ#(éØÜ3:Sý;Cmg¾`«¤eÆ-)(« ¥AIưÀà8M!®"²CJÀªÅso¬éTÓ b2c#(YQ+&]ÂgôB#Xf rÙ¬#1ÈQ(Òs´`]Ðr9@~Qð÷?ù¼ÊÝ£FhÙªiSÔÜT U¬PÍþìTÃI¸éçªäù±N³:v%#1û"<"zQ1ùA°éú'Ù#(¤«JȦ¸Jl¦)Ùó}Ýæù¹\ZÝZµI)Z¡cÑ@û~ãBýô$ÇH@õPµÐÝAÉT@ThªÝVm\#-J×Ê×-±`¡IpÚu3Hª§`2"©ËÔÅD²DLÃ}'üª¡ÜªtN^B7uåà÷A0D±E0;#1îÃjøDÄbæ«pBõøCØQ ©w]!@×Ýj«û+2Ù2ÒEe6RY¤DMÓ6be&IÐʵ[EµSSlm¢©¢"#Aé½ßÇ2.ÍÚ¥#-ºÀªclóiiDeÀÜ¥K*B£
&íLCW4ã#1 m%f¤ÕÂÂݦåb¢Xc` ÜBKÁÁ ÄË(ÐÑHT -AXÅA-p½[U* öûÍ$ ϶Àq,
` ¢õ!a´*B¡ diË :#(Û`Pºj)Qãëgy"sÔìÞÝíè/ãX\ðÂB¥I&Ð;ÁXÂ#(°É·Ã&P
ƶMðHNÂ:KVi68sèzOh0IvHeVF@AÏyæ×¢Cè`pNk}Ø]¬:º`Náh¹Å8§JRF2¼)3¹Þ;ä·W*a4f!÷Bò£QZR°X²PÃ!áírYÛ÷EÖ!´íVI]Ï7;³¬ÜX¡6Çù{ßq¹@$ÚCuP9ñ_(gàw>nçïÚâ/)0ºë0IäÃ3á½_G¸Õ[}M~þy¼Ñ6Û;×(éÉTï´q:duñÔ_Wsnz]pVÎM8Òã@âWm,Âh¸¤éu'Im¼íÕÞèGfSýÔ·@ôQ}û¿tÜñ8·á]»rJiÚæ#(¼A#-ÀW;N !úCÆ6þNÑsÈvE.˲gÃî@:1q#1¹Þ[ðFAÎuÕLXkÚNz`ÉØã°çMÅÁ[×ÌÛØ©NàÄúWZ|·ó²ñPºÌGi
ØsswÃNÆHN7dDðȦLK</ñzWkyòn4nNí§j$3äöÕÂÆ0DzÑnr8öþګǹ/á¨7{ *~2Òü9gy®y»â8×ÁÊoÛé4å±V;û}e]@Ü véúÑCçÒìjÀT÷Õ5T¼ÔEDY-²6ÅK2WG²þ7¥ó4ÑVò¼OGmÒÅóS#¾H%Ô*>ÜS ÅõRUnÊ¡
cÍF©±zQ4ßÏy*oí<x!dØãì¥]Úå|±®JßAâèöð<áªqÑÏÌu#ÕT\uwð×_:7áGC´±¤·KÄs¯»f¯?ÒBl"Á2#1Î÷,pIÒVnMh¹v#-Õ¿x´qo¨NÊx[|ÍRÐD'({Áøcp÷Y´&v:{{ú¦¼q\¿yN<Ä âUÔèÞg#1Íüw¶ÂmûK#-U3g#-^¼øÙ¸bPk¯b5ñI½¤XU6k$+NéðÎ6±ÐñR&ëru£8ÑãGÓµ
AØ8¾þïJÙÜjMºnGQä%bLmÁ¥<×\?®/f.Qtk³ñ©kaèlt¹èNðÝT²\ÁìZ#×nØÍ< ð88èMùßl{Ú]»>I=½ynv¿¶öÞLxKòîäÝhEK"ëQ
²ì±Üfæ\R=¿l`ªM;Õ6ãq°Tç#÷loS=¨ïc
ãí.¼`̨}§*»E¾ü2<ºur×§3)§*vý`Õ©£B#1Sô»4 g×FSÌÆA\µéOßZëêuôï[è=ÞòÞ(a1.4bNûý´ÂVÌÇ[e*¸ÚZk÷3XT,©¶_¬ïy¥ÐÐú÷Ï:d¸Û íè,òÍ £`yîÕLoD@45,`ñ£©"N8D©%s·8°O£]c{Ï¡Å]/G=höf³Ab,N(Ø_p$Ã#1`"TñÎÄâj®Ûp9¦Ú»§c45³ÆûLV754'Íú¶Ucôu#-%F,=DóúK¢¤©Yi¼*)åÕeLÒ÷pi%eàbD/¶¡¿@v¤aJ.>¿YÀÎ#-kÀ°ãÄËm*éà|^]ô©ÞñÁR5°ý8za°úk»ÔJZdpÆÌKk%
æÔYÍZJO*#1uj`-D@ "^gI¡º:·Ûº¼ñËÏM¶ÊÓÖÏsÌ¥hõÐh[E'dwêg^xy« ¡ÃÚ"`}o}9jÖFV½Õ¾U#-¬A¶-L»cÇz7,þ¬îT&wÅ#1!1ÍT jô*.~ä±°6\Öm¥V%%¡ÝHv1M²qȸáêøÕKfQìó3³k5f3§xÇ9+t+ìK®ùÒÔwsB~Ö΢^!:mç ôÁ~øA´ÔC êÁ÷÷Ü6{M¤ÅIfí~CJnXØNAg׳ô7ùh:rüá,FSôr¯ÏZ#1P>(<PIJø;×Õm»ñäÑpfõS[KN©ÞdTB<£ %®N.3o`#1$Õ©f㧦ìåáü·)ç2ÐÕóñGW§7Ü´ä&P(oq¼¾pæâgLÐU^2ÊÉõ@éN®!°>c$|9ÓGG{Ԯʹ§}¯¥ðÁ}9ðÖî¼óNÆU.§Ë=$k#-Û,ÜѸ¨l´úÎAÿ»Øñ®8³Çè}uÌ$|máZ²$SÑé2³LDò¬#KÅÓáÀ·DÊês{ÎËèGäÜ}65bd¤&Q6CÇk¾pí¦!Xc+} ͤ8úõóƦi©Ä»UÒIí,¼¹à#J2F ),bhc0g ÁU8îC)#1¯3ÌÓehaô#ÒíºôG'ävÀÌ&\ËÎó$L1M³wTK
.ÕB#1Â#(oÕ1ØÛPùÕiÝÆYnE³S¸òC,ôrû'ÆÛ@Øïy8à¸RÂ1ã´P}~¾p2øQâþ;7ÐùIÔCÉ#-÷
&Å¡ '1w¥P#-a$ÕÉ&;hq6ä#-(á®ÐMñ£×êc¦ýv½±ÃºÑÞÔGxUçóÝÎÃÈ"VxB×uß½ ï¿~)æ5¦¢<¬ñPræR ù';.'ÕñKÔtúwÚÙÿ(çþ¶vï¹x!ëõªúª`±
kô¼#-¼'tÃÒ;ùå^£Â©ÊH¬%Ñjê~¢`#(T2nÌÈ:3 CÁ¬ÂrLKQ+Ø ZFË%Ú6c ¬ «°¨W+r´z]tðUæé[c×èkrÖdmµ½-Ê£TUkª6¦ Ñ.)î0%
6%¥¢ÖZm×>¦¼·w0´ÜiCà®V`æ8Ì÷¢Q£©`'8²\Q£V#-¢¡"¨H0TJt¦\h_¿[ÃfaPÉÜÌèýÞ~læºÜËiÛ%Àýç!Kýªz̾úx&
¡F-¥°ýNý¿â¸)ÉÑlËâ&ªð=A¶êd%K
±Df2|3èe0Ã<{ó¼
%ilÂÔ²³,L+ Ûá¬yKn÷é
@¢lÈGMÓòÓhȰCaDyNlZó%<Mët>é;x÷ݬu²¢¯oçî¾;±óLqÊ#1#(²d´ c'2M6·.dTLMx9ÓÌôÉ^ݽᨠ¦Xn¤4´Ì×s³#-<Z©ÞÑÀðæE[ìe
Ó£i®+<sNrù7zÙØ·®³#-µVX°ÃfX
¦Råήg98&6ÐÚb#-²ð#e1yp<5a+ãÈ%xD(#1±'E09hkëÖu3$
A'¡"ÎÎfɳ}9ÐÓnts¡M¥.ç.H³U
,ÇÅá-ÌÉ32Ó/J¼8ÆðºaFÓo^a½Áèõ0é(¬Òà30ÓN²z¤äcC¤EyÕ¥4µnyñ<![#-JjNĸÓf22èäê\-6=#-âæ¦0<©
¤<ê ):sþùÁ
7Þr.4ñ#-lÔ/ùLzmª7Átô9!ÇÈéf;<³A²¢¼Ü¢UjÖ#-T£)ÞCPYPô9qI©ÆN½pÍFÚ_w»qA¼ÌieòV
çäôáÁÅ(Ìç ñUTñ`QàÎDþõ¦ÀÆ_ÍêÌǸÊbBÔ#1õlç¶dÆ£ÆyêL=½¬ì@ÛÙAô.f·0ð:À?kyÓÙÓÃL˸a¡ÚqÈ¡L÷Ea¦h>Èc2í
bz¹¥¦ÜJähÐÄòjÖ"$ºxEXlÙWS8S:ÎBÎAì&ç¯jq/D)ÐËÜf¡ôb#hhsä©OûûÆS×êý×Û¯åSKFÁ¦Çì]àå<oûÇä8X¤U#(FYgä?>U$ #-M%@©$|ÌÃG}Í?(Êq!ñgÅTú¬ùÞ:#-fÙXöOb¤UUFJpãö~dì/(rEÏíW²ICªcyjcïÞÀsOX ^î!ªq%ÑâXß1æóÒ Þ\/49
vöèZ÷³FEª0¤Mâb[üÿÇÑü¿n£ðÎaeÈÌhëºZZ#mª"¨³\ß·½Þ¯Ã¦ê¢èm0Ecyìcpú߬ø{Ûàmäzçl%W#-Üì#-tÑQ¤`BZ\_.*U$àû¬¯Äoê:1Èt#-ó G¨'j¨o[×HÚ%HÙ6ÖU+6ZÔIy6ܪÄ@¶ H#(öN?ãO¯yýwßõýî¾/ÅüIÕ)+Z+J5cP£d²jfÖYµ&ÔÓbÚ±³JM±%dÉ,¶)Ji5#-4©H¡¨)FZDÙ(ØÓd¥4lÔÒ#1dÍ#-1#LÐcµ¿±½}wY^Iz Øðv6¼_7l ôrNvrj>ÔÖ®hi±uª>ÇfhÍ5ô¸êGôÍj)äx`¶ãQ=YêI&÷u/ía1¶æ3E Î3 @]÷úHI¬aÌâWc¿ë¤LDÀ¹{5¦ÒâHBôv¢Öë<;z²P#-KØÔTba) {Rsè ¯mõ,ÎJÒlc¢¶Ê)¿é÷ª"´kE°ª×-XÈF#ZL×Ñ:Ël¶JÓ*³Ío"\
¤±èÐâZ+ÐkÆÉIjë f!ù°»®fg_rØËÂ&Ý~î#-ý;8b±<&'0L0¸]
ªt.µ¨±aÇÂM&¡ÆBÀ££vjPaYø6uoIFh*®ñbÁFËc"3_Y9ù©£#-`ó
ɹ2Ķy¸d&²¤)d
"T³)#1Ió=s_¤þ´î¿¥ÔM1>HÉu¨¡h0ì%¯vyÅQWÝÉÊÜL}¸C¹³qÿ<M±éàï¹3°ªÑ*ß
:DL2p8©âàc5U#ëºÒ)($Ð4Bþ"B$I}9wyÉÞUPÛ`ÈF¢$EgÏÊÁøGâ)#ÜJ¿)t÷Öô,[´dÔ1Ï#(âîÓ#1üÛÁµìÝîÕ9Uç+â<ôH#-YNý)ÃCʧ[<øA!øÑBUiL4bgÒ»háð#-~AïüÏ»
jr æá<îÓú>gò¾ß±Èåª.\|ïÄË_Wy¿bÌî:K8VÏ´2gGFúÈ`Úù,ËKk¡wìÞ$Ûneð?VýOá¾ã)ày͸áµr¢<ÚÛ©µÁÛ&ð*"o#(£,pARB@oµ®õîWµÎ¡¦×?#ëõ°Þ'¼:|àéM{Ò®±3îñ¡dTå¼Âjx $N³2=_bµze&pög»È0âÎ0aEã~ò bP(îrðÙ`ûI«>Áó44øÕ|2q1#ÈBù|&s ×UܨÀÁñ×ð£dï©îkíüwï'ò*Ób¨H¦yíútî/maEÂSÓñ®ÄºP°ñ²£t;Gé¯wã8cða øföE6#-ìçæÑL2)¨b¦¾Ï¾ð?÷7õ|º:/¦~' 6'MT;zN"¨vzcnÀTùáÙV¯M2Kâ%tøúîU¨¢]!$)HÔ ©B³z¡L¢ÊôñϬ;åÁ5ú'¾ÃT1½Þ°_#1Q3$¥ÌD*T*ÃÌlãí3YxÛ0)dhR'f)Õ m&íH
±=2ôËþ\G$#1Oøå*ÚZf Öø§XS®æì¢iÃdÐ2¼á¦1(äLÐykå(zZIi¥Û"¨k#(5"4³#(lo^:Ø¿-%4TÄj ¬¶a!èxsæQ-×a*Ñj¤#-GHsvXãË@¨³´°By)î>óùM#1J21´FBuiâs#1ñÙÃÆNtd'YIeÛÈ #19(@yÑÛ±*B1dKkn4ëhs|L2As/L )ßSy¼Ä 36ѳ3G,Ê5©ÅO'×,vé|Öï»Üh&½Ì95èy§b'ÆÔèkèÒRï¤òÿu«nQd¯r+ZÖ+E@&Âl×´«|_·x)Ûv!HnÛ laÃ,Ö º~,fX`±±b$ð<Aâ
bÈ!.ÀáY#(c;@5'äó»®½kËWú*çé)zyWS=A£Âîa:¢"6úgð7lëÑ!H|&ÃàB6CVÖÆØm5iÊöEs¶Î·{b&2eE3ÔÎ0öJÌÁÑYs ES$0ΰÚ#-1>G¢¸"±nƱ Ú#-#-í§`vA!ù ¦Ï¸õ¦ßO¦B`É;mfæµNdQ±§)ñD5Ë»¡·L§ò:·*MÃ>% ZJ޳ʺLmV£pµ ÇtûóUvwÐåÒ!¶"eñ×1²Ïg'/"tÉdÛ)g(X]am9W,q·32å3:ö. »J#1Reè=æõÂq%gÓ#1[Á\¬CrÚ©
§0§£ó§\:ÃIïâ[3w6h¦~7³ò-&·"dhOnÒÓ%Çu©µY7ÍXÇI¤ Í>+gÝÝ6Cv¾là÷ík,Í ÒuQ0ssòsÇdcÛ£qÜ-2ý°í*Äz¸QEµBÅ;`-@$êÀ,¦4¥cð:ëÄ#(yⵤ¢2EÙvöËãõÙÐëÞS(wSb²À)C·U8:k¨7=ëaÃMÚ&åbklCM)$LÞGS·Þ¸Û:sO¸ÄߥpLÂvÖ¬m6ÎLî¶ËÐÅeÜ£àäÆ-Üt#(ÂÜ+¡Õ(Ù~7ü>¶¶ÎS6ESY.³éï1y2ϼßP(ÁªØk'ßÌÅ{ÈöénSiNc¤*7NK#w~Z<ÄØD`sͲ¾Rݼ
be² ÎË'{¦£ãÞY²´ãë¾AAð:4÷N+!ARud¸S±68Qöä~Bk:êÎFfyù]Pà'¡Ó5m¿T³å1yE>E{ÜyA;Ü4µ_
k²chaØd!%#15Xc+'¯¡Îw©§¬$i]4p'¦ ù<#(q0ÂÂI@£3¦G&+Ì5Q¹LÉUõ$ ;¹ßLÇ&´·ßZëJò2hkKĸ^ñChwzhm[·H[ºJöd,
ÝÑa¸5#-Ð ¤½#(Ó4#1í`izê¸%ôØ#~åòí¨d>Ä7-hî¡MjAÛT<½³èÁù°õë¼°¯Ò
£°V»É 2#viWÝfÅÈf³Q¢#(HA!±TíáDßia(@rMxDXUcØÚÉÂw!àö#-§H"«gaN#-RË]ZOHÛ¨µåµ×b.<Ëag#(^6BÈ)£MnNI©#-'Øï(CfXàß R¥µÛ;<ÃBvÙ=a`ÉXãɲ{JZ¤;£ÐMàJbl¥-pr°³CL!´8ë*WÁ¦Gal¶8B%Rxû=»ô~¹÷ÙRiª)#:qëQÐû¸IæþÄUs`£S@(#(Wq÷ìýM7^ª§Z»j¹sÌpñ³íâU¬»?]ñ#¹.îá?BƵ;f³8³Ð íuÆRÎI{<ÃÖrMðë¼hÓ§:¨%7d^ýÍü?ر[l)JPÛþ^Þ`Ì46yR£æ.¢Î@9#!CÎD^Y¬O#1)Iç;ãÂ=#-t-?oæ:OL¡V>PO>¦Dí' #-EVØ#÷ É·ÏÑfòÑí>¯@òçHäYɹuæLmªùXVÁËFh)©¦¤£{ÊFJ ûÒ@u0È_\ÙK÷HwÜ)Èélãï3c±TdÊf](±¢#(Åó/©BäWÂ9IùwÙç#;¯~1ôCïjOß¡y
ü§§x@ÄR(eBªFC|0°b4E-(`A?Ií&ÒûwzÓSXlÝ0Ëf°&Éup]&¯4#-]kÎð»+©+"(í)K.Ó! Ò
A°-¡#1ÁÇ-#(J2ÅÂ$@Î6aE÷ç[×ZfSG£ppì&#-è¬H#-íè~ðãÖÑ0ê:sѨCØóASã#(§ÓÑ÷"'ï7ØÇíß2dÁ ],¹º&03
(Ànýa36*j×éRÒ¼zAÐ >^8feÁ{&,ÀM± \pIÌ#s^!2¤%qf!ã¦Aì#îÌyáÜ¡æy¦Þ°é®ËyÛ)þËÕ$úé)]`6À+9·ï§àB.ÜÙ7<Õ<ãñÆPïPKï׸ÃbH)y÷#æl µ½2ßë«ËjĦÎV¹ç¦lRªÈî;3©ß¿Táί¬!ös£°~T_¬#(>ÐFÐB©Ël¥¿rÉjjOskTÐ#(s "jQ"ΰ#(¬Y 81Du½0Öª¿á¦9è¿&+â#1ÕÓuÜ´UJ2ØéK2hÕ&Ú÷ùïû¿gñïÃ&*ñ¦mÞ_'ÜVDDF`f¯É.ÑïÝçsdA#1ß Ík7,Fgx³SyÁ~aSS%÷Ù§W®Êd#dnÄÍ¡`B¤ÑÌ´,î]kÆÕÍt6¢ºµDHÂØ
Ð*2(.]5,5Ú H4:mµc#(A#(¤#-60.bUO´ ¼çkÊ(¢0%¯Ò
ß÷s÷Xv¦/faÐ #1ß#1ònVÓ ð8 YÏ˳Ièl¼"`-0V[§N:¦¨ÝÎSgÂ(³ÏFÈz+$êÉbjfaÅ[9(#i~p spfu;¦ËÈ#(8«Ì¤#-dÎ#»ßr©%Fû Ü«%¯x)iÁÈ!´ðvaÑ#;kÁTA@ªïômnä# \rñ³;F£×³Äõ¨øÚþJLïHõ¸çv¥ÛÑHQåéf:xbÈ m¦UP_¸Bg¬¸ï!f[cG¯éí;¡ôsÅ>J*h·¤"F 4ÊS-#-IC*ÚÈÍC*6mJ+ø5Ó],µÆtÝ#-Ë]©µÖúbµ¼0ì1&[jfkÎ¥¼¼´à9[XÌw:@³½vóðà¸÷ ÷n÷¼÷` ª "õ¹07ÁéÝÀ9´8måP |Ñè½@@Üëá¬C¹éðéáo¦£â`i¾?]a5Ô"vxw%àës×bгòb!HæÜêlQÀ²*L£Ë]m=º²vÉÁ°ô£NBcl9³4
°<05¢SBÕaVÁê8× ¦NæJà¹#-:iÆæ7Nßck£
R÷wdzç¤ÈsÏWÏTYEIsrÅ9æä?ÃÅùóèsuãT$H Ð ãC2XÓywËC§Ç¥pêAþ6ÿ0^,8³à0À<Dìx'VÀÀßÃ#1JTxºWP)¹#(«½j aEO¸°GMþ¹¶Þr|¼6¦9Ã#¾ó b °²"#1
êª$Eu#ÍÉzzNª2OOqB-p9#-Èc-¨FÐùå+)/é÷ýPøü´.R¶lߣïú<ÎÇ6=.ÕJþúäMtúQ@ð-.ÀÊã»?ü#19§#(ííòì·§(UJAò³)ª]~ãC?¿¬ïá÷£[òI¿»ÝÔÝÏ`4éÔÆ»*³p/JRD¼Ô\8ÓhzÑKF§í+ã*¡Ö#-©S×ICè
lü0'?&
¶Êòùñ±^uÄHÖ-È(;¹E}syE¯2âü%1Ü370AE$dIZ½k·ayFKFÔS1Sm3k]kõêí®têH¦ôVg¤Õ¾É À øÃÒ{ê.0uf#{ä3ølÅàÍöWÙ}±´Te¬Ö/VׯÑ}Õµ{¾ÈÚ%J$,X,Ó%³I-_oíÆÅôÕ{ÿ,C*-&£i"A?¥«!!hT#1{䥮q#-¸p¸¬ 6ÌÈF÷Þµuβ%D«6Æ*¥¦E¤zó¼µP°=#(@B.Ä(Ü ÿGq@hÚ.æååúÉ5s[Á¸®¶½¾æ:|öQ#-(§¿E]عÑN$@i¾¢:N ¦ºÌ)"|2?(¯ò]^ RHªOf¿©×ý·NlÀqÖBá1 küu à#-mãJ<ydô×Mc\àø#1tº""Å4;Óê´Eê#(%#-NTjJ¸\T«FÊl %´j|¹ô;ºÌ='®8*¨?»(+¸;v^J¦¸H¨HòÐм4í5þ2bÁ&ì&ëºù\Üæ#£?2ú'W0©úð*b¤AÑ4Ìë%!5bå¦1ÑÌü7õu5»é©Íh½}æ°\|Êé<½[ým¶®¯Ñkïù,Ê,+Ñ£QA±«6¨ÖûßcWaEm*}rÖ~Z:Ö|X?tɼ UHÒ(ÄÑ´SD˯EÄ.U#1#- ÇLöÆõÕ¦G] ùÀ \! !"!µ)¬ µ6hÖÆµ¦x_.¼ÍµZ$B¢9ãñýù~øt|}óßä ß6 Rì¹ÓÜ´ôü©Ä´}O»2fQeaRv7pÃ@ÌÆ(V¹gH±*PÿfÕqYxBIw#1dxUo13+[ô½5uñëÚmóî+!èÆI°ÀZA=FývÞSÅ·¼heÁ¾¿ß8ȨÅX@PìD#(bÈJþζÎeCøÐ5"Ô³zóÍ!å;ø0ÉLÁ%#"AbBf` Ym¢Ã&IH1"ÆÄ¹ÖÓJe#-½wkÚ+*#(ÀPY-ÈzÜÐ3izyåØÝ4ÒÚQmÚÓ-k¦Ý»«sÅ(ò.%:ÕÕ'ÂóMí0 ú#1èüf¬ê·
Ì#-Å9%Ï ¢\HD4ëØ¨xäHHMnýëÛ'<j¯³ò=ÿv¢M'múxFÈÝÛ$d§!a_¾ÝgîçØ"AE5WÔ믡©ÄÓh/d9¡§Pà`¬]oàd%RI}D.lßÌ+8_(T¬Âq5ÛK#-ÜimÎ-8,NMñï1GàõÀZ¨Þ»Ì¤ÝAg#1Á¿c©IÃçR$®$ûcÒ#(lA;â?°ðz²vóQR+T~
`sk2ân\@@¬írBhÔÈlÔ}¬zfªâdB,ó%J }»sL7%ƦÉùäB>¶$bÉlK"è±!L°DîÈá_;¾_É/YQX!Ç<誤2ñÄÃéa«õÙË DÁi´âp+M»Í"uöOß6p&>ú«9æÂ}ßßï³ëhù¦z_FMÝ2KùR¦LË?´Ã;ÙUrÂuó OÉ_²âÏ{V;'ªX"O~ñÇBsM¦ú2Ò8ghkP(øÃ@ÈqÒÉ©úÑ×M§áª5È$(¦dlY1~,y â?c#(t<ÀØf%ºÝàG1J¸2BFÃ,1yh39Ü5;µ4Ä×5¬ìE´ûô÷õÁ¨Ý:ôÀiìbüuûh8M¥úS0,¡y yhÉáûBË9W´ÌÅTU r°_Û/ÕT>ïfÎ>ÛmòªØÊ«¨@SÓ^dÏóºâ¿óÿ/ëø?×ýÓÿ_ú?úþïíùÿ×Éþ[¿ôÿo&ßëÿoóeý?øÿ¿û?÷|«ýßäíÑÍþßêüïßýÛù?Ýþµ÷¿·ý?ßýÙ÷¿Ýþ¯7õ{?·û?³þ#-ßÝýÿÝýßú³ûÿÿoïôÿgäÿOÓßü?øªþÎhÌ~óâ¡DÈý#-L6¬µ1?5¤!yø«õ? U èÎÂN*°±ÃùýN¿ÑÛF3$ 2}6¾»Û[_;YWÇËhvÅBwG<£"Qz[kPø%ØeE×ÿ#-$NÿfZöÐζ ø°öÒÈKhYÊ;÷TQ#`¯hQ;LÁÀ(?Oíp¢xMy~GKýÓþ¬Áõø<<ýüM*,ɪHþ{%þBPX¤¤G??żÁ¢Ð5íà¿Ü&ÎbdÈN;9)Ó?èÄX]bcBÄdYóäÕFsÑdËaü³L²IgüSDÃA¹ÔÜÊ1ø¾EX«çî9åÓÅ©=XhràÔ'}mNÓòÌzvÞÎÛm1:|8ùÅÕ²3çhcþ$c%[\FĦkóx¡,&Þ%y;äªit1¤MHY15åM9ßM±´ímK©=§iÙ¡YÌÅK4LañÂåçs±²¹]mC¢1ñ£ÎâºÉ-{æun¬oL@¸¬2Þ[{ÎÿXG}Eð|m|¸ïé5©Ãö5ÖHBk°xæ9¦4H"AÁóùú=z¾pÄ>ÍeE]k~ýúpìýZeðMw¶nÐÆ# Ñ´ª¥$j[Vº¬)Ñ«AAÀÑ F§\°`GJÁ@dE ¾ï¶ÐI@$!3â2îyÐóÕtêI#-pù>,\±34ÿ°à¼¬o¾Ís` ¡¶ÎÖ·Ïîø^í~ÄÒZ+m(Å¥¨X6Å&JÖKRmI%¨Å7ÂíWUm~&Úò#(}ç ãþ2 úÔ\\UÐä9Ú( Å?¾ tè5Y"Ôª¤ëíðÿDdO|¤>dûógëWOêÁAÜCÄü9tsýFòYJ¢#Ⱦ8ûÜÖ*vßø//Ü!¿«< ÞÜÎw1ø]uè<УÀîÍà¼ÃÛGxs·»f@pïÑÇAÈ£)laïÞ=î)¸?~FEôMÍ9HIbò5
¯¿á³z9¥´e)MeoÅb¥DHÇ1{E9Æ
Ý,¹kÓ[Å©a±JmkÆùmâÔ6ŨijlmG0G·`e¡*7aÈ¿:×B¡jZq1ÿ¢ùÒ2H#-Î «Ê¬ñl¦Tä£×·y&?÷çÐÂpj´HÈ÷ŧXPu<¿ê=×sÁÛÆçD$&Ñì\È wý/¤n/.´q|Ür²ÿP0#1Ø!µ=cÿ¼$@`DSKók|÷ÖøÖu¨»Ud¶¤k×m]5|_´¡²¯o*µúB! ªty¼o:½ ýð èGlÙíõ}ÿI¦Æ[ãw?z>XDÄg`|"QzJN¯wÈÿ¨ÿ]Æ!ÝIÿçzÕÚeú8Kþßú#1¨Óÿ$§ÞK å×þ[¹>û[ü[oäÒ[à6çÿ³ÿÿúþøjô¿Ñêú¡®mMW^\Qе×Ê</ë¥DO|¨%Î [êõú8Òù(5o9°òñ8QóDú?¾pÆ'Í#(× ·ÂÓI»ţÿÓÒ.rtg((¸ñ¶éÿéì(Ù¤¸J^0_ñ8
Êu þÁQúT£ýz-zàt®Þ12U3«³Qø=-mÄÆVJsìæBðÂë-bYßEÌQ¶Ø -x?.xfaB6] ù¡ÅÚxi3D¸A4ÀßÕûn¤§YÜ)>|zó9!XêæMjj|ïKRIÂO(cøñ»Þ}ÿ×÷UTÿü]ÉáBC`z0
+#<==
diff --git a/wscript b/wscript
index e779031..068c3e4 100644
--- a/wscript
+++ b/wscript
@@ -1,23 +1,60 @@
# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
VERSION='0.1'
-APPNAME="ndn-tlv-ping"
+APPNAME="ndns"
def options(opt):
- opt.load('compiler_cxx gnu_dirs')
+ opt.load(['compiler_cxx', 'gnu_dirs'])
+ opt.load(['boost', 'default-compiler-flags', 'doxygen', 'sphinx_build',
+ 'sqlite3', 'pch', 'coverage'], tooldir=['.waf-tools'])
+
+ ropt = opt.add_option_group('NDNS Options')
+
+ ropt.add_option('--with-tests', action='store_true', default=False, dest='with_tests',
+ help='''build unit tests''')
def configure(conf):
- conf.load("compiler_cxx gnu_dirs")
+ conf.load(['compiler_cxx', 'gnu_dirs',
+ 'boost', 'default-compiler-flags', 'doxygen',
+ 'sqlite3', 'pch', 'coverage'])
+
conf.check_cfg(package='libndn-cxx', args=['--cflags', '--libs'],
uselib_store='NDN_CXX', mandatory=True)
+ conf.check_sqlite3(mandatory=True)
+
+ if conf.options.with_tests:
+ conf.env['WITH_TESTS'] = True
+
+ USED_BOOST_LIBS = ['system']
+ if conf.env['WITH_TESTS']:
+ USED_BOOST_LIBS += ['unit_test_framework']
+ conf.check_boost(lib=USED_BOOST_LIBS, mandatory=True)
+
+ # conf.define('DEFAULT_CONFIG_FILE', '%s/ndn/ndns.conf' % conf.env['SYSCONFDIR'])
+
+ if not conf.options.with_sqlite_locking:
+ conf.define('DISABLE_SQLITE3_FS_LOCKING', 1)
+
+ conf.write_config_header('src/config.hpp')
+
def build (bld):
-
- bld.program (
- features = 'cxx',
- target = 'rr-test',
- source = 'tests/RR_test.cpp',
- use = 'rr',
- )
- bld.stlib(source="src/rr.cpp", target="rr", use="NDN_CXX")
+ bld(
+ features='cxx',
+ name='ndns-objects',
+ source=bld.path.ant_glob(['src/**/*.cpp'],
+ excl=['src/main.cpp']),
+ use='NDN_CXX BOOST',
+ includes='src',
+ export_includes='src',
+ )
+ # bld(
+ # features='cxx cxxprogram',
+ # target='ndns',
+ # source='src/main.cpp',
+ # use='ndns-objects',
+ # )
+ bld.recurse('tests')
+
+ # bld.install_files('${SYSCONFDIR}/ndn', 'ndns.conf.sample')