diff --git a/.gitignore b/.gitignore index 251ba95..0e86287 100644 --- a/.gitignore +++ b/.gitignore @@ -32,8 +32,3 @@ Makefile.in /configure /dist /tmp-build -.lock-waf_* -build/ -.waf3-* -waf3-* -__pycache__ diff --git a/README.md b/README.md index 6f367be..b80b3e4 100644 --- a/README.md +++ b/README.md @@ -40,8 +40,6 @@ You will need the following tools installed on your system: - libtool - zip (optional) -If you choose to use the "waf" build system you will need python 3.5 -or above. See the file "README_waf.txt" for more information. Building -------- diff --git a/README_waf.txt b/README_waf.txt deleted file mode 100644 index 1bc55f8..0000000 --- a/README_waf.txt +++ /dev/null @@ -1,156 +0,0 @@ -Introduction -============ - -This file documents the work in progress as of 2023/07/08 for adding -"waf" (an alternate build system, see https://waf.io) to the TRE -project. - -Why add yet another build tool? Well, I wasn't really planning to when -I started, but as I did testing I found myself doing a lot of repetitive -actions to get clean build and test environments. Since I had good -results using "waf" for testing builds in my own projects, I thought I'd -try using it in a "testing only" way for TRE, and then I got kinda -carried away :). However, the GNU autotools remain the recommended way -to build and install TRE if you are not doing TRE development. - -The waf build system is based on Python, and if waf was the only way to -build it, it would add a dependency on Python to this project. However, -waf can use any version of Python later than 3.5, and since one of the -features of this project is a Python extension, the dependency does not -seem too onerous. - -Advantages -========== - -What the waf build system does do for TRE developement is: - - + It builds and tests most reasonable configurations on a given - platform with two commands (i.e. it builds and tests multiple - configurations, such as with and without multibyte support). - - + It puts all build products and test results in a separate - directory, which makes sorting out modified files for version - control much less confusing. - - + It works on multiple platforms without further depenencies. - As of 2023/07/08, it builds and tests successfully on Linux, - FreeBSD, and MacOS. (MacOS does need the Xcode command line tools, - but does not need an xcode project file.) - - + It builds and tests the python extension in virtual python - environments for each viable configuration. - - + It runs the various test programs without needing an intermediate - shell, and so dodges the issue of escaping shell characters in - regular expressions in order to test them. - -Building -======== - -The steps needed to build and test with waf are: - - 1) clone the git repository or download a tarball and unpack it - (presumably you have already done this, or you wouldn't be reading - this file). - - 2) In the cloned or unpacked directory do: - ./waf configure - - 3) then to build and test do: - ./waf - or - ./waf build - -This builds and tests *multiple* configurations rather than just one -like the GNU autotools do with "./configure;make". This is very -different from the usual project build process, and is even different -from the usual use of the waf build system. - -There are many command line options, use: - - ./waf -h - -to see them. There are quite a few that might seem to duplicate -functionality, but because the options can apply to both the configure -step and the build+test step (with multiple configurations possible -in both) the apparent duplicate functionality makes fine tuning -during development possible. - -The waf output is coloured if you are using a colour terminal for your -command shell. - -Selectable Features -=================== - -The current scripts attempt to build 12 different configurations on -Linux and FreeBSD, and 6 on MacOS. The various configurations are built -in different directories depending on the platform and available -features. The features that are (currently) selectable are: - - - nls (or sls) -- National Language Support (or Single) - - ap (or ex) -- APproximate matching (or EXact) - - wc (or nc) -- Wide Character support (32-bit) (or Narrow (8-bit)) - - mb (or sb) -- MultiByte characters (or SingleByte) - - ti (or ri) -- TRE Interface or system Regex.h Interface - -MultiByte requires Wide Character, so there are 24 viable combinations -of selected features. - -National Language Support on MacOS currently depends on Objective-C -or Swift macros and functions, so the MacOS build disables nls. -(Also, there is a bug in the MacOS linker that breaks the Python -extension for clang versions 14.0 to 14.2, but is has been fixed in -14.3.) - -As an example of where the build results end up, for FreeBSD with -nls, ap, wc, mb, and ti features selected, the build results are in: - - build/freebsd/nls/ap/wc/mb/ti - -or for MacOS with sls, ap, wc, mb, and ti they are in: - - build/darwin/sls/ap/wc/mb/ti - -Installing -========== - -This would normally be a simple command: - - ./waf install - -but at this time (2023/07/08) it is still not recommended. It will -currently attempt to installl exactly one of the viable variations -but it chooses a "default" configuration of the selectable features -and that may not be the configuration you want. - -Cleaning -======== - -The simple command: - - ./waf clean - -will remove a large portion of the build products, but it will not -remove the configuration information, and it has not been tested to -see if it removes everything it should remove and leaves everything -it should leave. - -If you want to completely clean up after experimenting with waf, just -remove the entire build tree. The build tree includes the configuration -information, so if you remove the entire tree you will have to configure -waf again before further building. - -Roadmap -======= - -I am actively working on the waf build system, and I will work on a -more functional "install" once I have sorted out the outstanding PRs. - -I'm not a big user of Windows, but waf does work on that platform -(again, needing only python and compiler tools, no IDE). However, the -windows build of TRE using waf has not been tried at all, even to see if -it configures and builds successfully. I will look at the build and -test situation on Windows after the "install" on other platforms, but -will probably leave installation on Windows to someone else. - -Tom Rushworth diff --git a/Tools/waf/build_variants.py b/Tools/waf/build_variants.py deleted file mode 100644 index 37c1675..0000000 --- a/Tools/waf/build_variants.py +++ /dev/null @@ -1,377 +0,0 @@ -#======================================================================================================= -# Create the different build type commands. -# waf normally has a plain build command (e.g. "waf build"), but we want -# to be able to either: -# 1) build the variants directly (e.g. "waf build_dbg64"), or -# 2) choose the variant(s) by means of options (e.g. "waf --dbg --64 build" or "waf build --rel --32"). -# We do this by creating a bunch of variant specific commands (for (1)), and wrapping the "bare" commands -# in a function that redirects to some of the variants, depending on the options (for (2)). -# -from waflib import Options,Logs -# Import the commands/classes we are going to wrap/clone. -from waflib.Build import BuildContext, CleanContext, InstallContext, UninstallContext, ListContext, StepContext -bciuls_tuple = (BuildContext, CleanContext, InstallContext, UninstallContext, ListContext, StepContext) - -debug_build_all = False -debug_build_variants = False -debug_build_variant_queuing = False -debug_install = False -debug_bv_colour = "YELLOW" -debug_bi_colour = "YELLOW" - -variant_test_results = None - -def add_variant_test_results(bld,tpass,tfail): - global variant_test_results - if None != variant_test_results: - variant_test_results[bld.env.VARNAME] = (tpass,tfail) - -BuildContext.add_variant_test_results = add_variant_test_results - -def show_variant_test_summary(bld): - global variant_test_results - summary_colour = "CYAN" - failure_colour = "PINK" - Logs.pprint(summary_colour,"========================================================") - # Logs.pprint(summary_colour," {:d} variants tested".format(len(variant_test_results))) - if len(variant_test_results) > 0: - tpass = 0 - tfail = 0 - vpass = 0 - vfail = 0 - for key in variant_test_results: - res_tup = variant_test_results[key] - tpass += res_tup[0] - tfail += res_tup[1] - if res_tup[1] > 0: - vfail += 1 - else: - vpass += 1 - if vfail > 0: - Logs.pprint(failure_colour," {:d} variants tested, {:d} passed, {:d} failed".format(len(variant_test_results),vpass,vfail)) - else: - Logs.pprint(summary_colour," {:d} variants tested, {:d} passed, {:d} failed".format(len(variant_test_results),vpass,vfail)) - for key in variant_test_results: - res_tup = variant_test_results[key] - nt = res_tup[0] + res_tup[1] - if res_tup[1] > 0: - Logs.pprint(failure_colour," Variant {:s}: {:d} tests, {:d} passed, {:d} failed".format(key,nt,res_tup[0],res_tup[1])) - else: - Logs.pprint(summary_colour," Variant {:s}: {:d} tests, {:d} passed, {:d} failed".format(key,nt,res_tup[0],res_tup[1])) - -# BuildContext.show_variant_test_summary = show_variant_test_summary - -def construct_variant_names(variant_group_list): - # Construct a list of (name,path) tuples for the variants. - # This is called shortly after importing this module as part of reading the wscript file. - variant_name_path_list = [] - variant_count = 1 - for vgroup in variant_group_list: - variant_count = variant_count * len(vgroup) - lenvgl = len(variant_group_list) - vx = [0 for i in range(lenvgl)] - for vn in range(variant_count): - # Build a variant name/path using the current index values in vx[] applied to variant_group_list. - name_components = [] - for i in range(lenvgl): - # Logs.pprint("GREEN","vgl[{:d}][{:d}] {!s}".format(i,vx[i],variant_group_list[i][vx[i]])) - name_components.append(variant_group_list[i][vx[i]]) - # Logs.pprint("GREEN","name components {!s}".format(name_components)) - # Construct the variant name and path from the name components. - # The name is going to be used for the variant build command and function names, so no '/'s. - variant_name_path_list.append(("_".join(name_components),"/".join(name_components))) - # Increment the values in vx[] for the next name/path. - for i in range(lenvgl): - vx[i] += 1 - if vx[i] < len(variant_group_list[i]): - # Finished incrementing. - break - # Start over at 0 and continue incrementing (i.e. "carry" to the next column). - vx[i] = 0 - if debug_build_variants: - Logs.pprint(debug_bv_colour,"variant_name_path_list {!s}".format(variant_name_path_list)) - return(variant_name_path_list) - -def create_variants(cfg,variant_group_list,variant_name_path_list): - # Create env variants for everything in the variant_name_path_list. - # This is called from within the configure() step. - if debug_build_variants: - Logs.pprint(debug_bv_colour,"Entered create_variants()") - Logs.pprint(debug_bv_colour,"type(cfg) {{{!s}}}".format(type(cfg))) - Logs.pprint(debug_bv_colour,"type(cfg.env) {{{!s}}}".format(type(cfg.env))) - Logs.pprint(debug_bv_colour,"type(cfg.all_envs) {{{!s}}}".format(type(cfg.all_envs))) - Logs.pprint(debug_bv_colour,"len(cfg.all_envs) {:d}".format(len(cfg.all_envs))) - Logs.pprint(debug_bv_colour,"existing variants:") - for cfg_key in cfg.all_envs: - Logs.pprint(debug_bv_colour," key {{{:s}}}".format(cfg_key)) - original_env = cfg.env - original_env.VARNAME = "" - original_env.VARIANT = "" - if debug_build_variants: - Logs.pprint(debug_bv_colour,"--------------------- original_env:\n{!s}".format(original_env)) - for vnp in variant_name_path_list: - # Extract the variant name and path from vnp. - bld_variant_name = vnp[0] - bld_variant_path = vnp[1] - # Logs.pprint("YELLOW","variant name {:s}".format(bld_variant_name)) - # Logs.pprint("PINK","variant path {:s}".format(bld_variant_path)) - # Copy the original environment and set the key for finding it to be the bld_variant_path. - # Do not use native_path() for this, as waf will force '/'s anyways. - # Note that conf.setenv() sets the class variable cfg.variant - cfg.setenv(bld_variant_path,original_env) - cfg.env.VARNAME = bld_variant_name - cfg.env.VARIANT = bld_variant_path - cfg.env.viable = True # Assume this variant is OK until we figure out otherwise. - # Set boolean "variant_VVVV" flags for each of the variants VVVV in each of the variant groups. - for vgx in range(len(variant_group_list)): - vgroup = variant_group_list[vgx] - for vx in range(len(vgroup)): - vname = vgroup[vx] - cfg.env["variant_"+vname] = (vname in bld_variant_path) - # Go back to the env we started with. - cfg.setenv("") - if debug_build_variants: - Logs.pprint(debug_bv_colour,"Finished create_variants()") - -def create_variant_commands(variant_name_path_list): - # Clone the base commands for the variants. - # This is called just after calling construct_variant_names(variant_group_list) above. - if debug_build_variants: - Logs.pprint(debug_bv_colour,"Entered create_variant_commands()") - for vnp in variant_name_path_list: - bld_variant_name = vnp[0] - bld_variant_path = vnp[1] - if debug_build_variants: - # Clone the various commands by changing the class/method name with the following bit of magic: - Logs.pprint(debug_bv_colour,"cloning for name {:s} path {!s}".format(bld_variant_name,bld_variant_path)) - # For each waf 'command' (actually Python class), - for bciuls_ctx in bciuls_tuple: - if not bciuls_ctx.__name__.startswith("build_"): - from_name = bciuls_ctx.__name__.replace('Context','').lower() - to_name = from_name + '_' + bld_variant_name - if debug_build_variants: - Logs.pprint(debug_bv_colour,"for {{{:s}}} clone {{{:s}}} --> {{{:s}}}".format(bciuls_ctx.__name__,from_name,to_name)) - # define a subclass of bciuls_ctx with the appropriate cmd and variant. - class tmp(bciuls_ctx): - # Note that we are setting the CLASS variables here! - cmd = to_name - # Setting the class variable variant will end up appending the variant - # to the build path, so here we need to have embedded '/'s. - # It is also used as the key to locate the configured environment. - # Note that waf forces the use of '/' in the path used as the environment key. - variant = bld_variant_path - def __setattr__(self,name,value): - if getattr(self,"DEBUG_PATH",False) and "path" == name: - Logs.pprint("RED","setting path attr for {{{!s}}} to {{{!s}}}".format(self,value)) - object.__setattr__(self,name,value) - bciuls_ctx = bciuls_tuple[0] - if not bciuls_ctx.__name__.startswith("build_"): - from_name = bciuls_ctx.__name__.replace('Context','').lower() - to_name = from_name + "_test_summary" - if debug_build_variants: - Logs.pprint(debug_bv_colour,"for {{{:s}}} clone {{{:s}}} --> {{{:s}}}".format(bciuls_ctx.__name__,from_name,to_name)) - # define a subclass of BuildContext with the appropriate cmd. - class tmp(bciuls_ctx): - # Note that we are setting the CLASS variables here! - cmd = to_name - variant = None - #def build(bld): - # bld.show_variant_test_summary() - if debug_build_variants: - Logs.pprint(debug_bv_colour,"Finished create_variant_commands()") - -def variant_decorator(platsys,func_to_decorate,variant_group_list): - # This should be private to this module (only called by redirect_to_variants(variant_group_list) below). - def variant_wrapper(*args,**kwargs): - global variant_test_results - queue_msg_colour = 'BLUE' # See waflib/Logs.py colors_lst for available colours. - # Get the Context for this command. - ctx = args[0] - orig_env = ctx.env # Configset from the original configuration command - command = ctx.cmd - default_build_variant = orig_env.default_variant_name - if debug_build_variants or debug_build_variant_queuing or debug_build_all: - Logs.pprint(debug_bv_colour,"Entered variant_wrapper(...), type(ctx) {{{!s}}}".format(type(ctx))) - Logs.pprint(debug_bv_colour," variant {{{!s}}} VGL {{{!s}}}".format(ctx.variant,variant_group_list)) - Logs.pprint(debug_bv_colour," cmd {{{!s}}}".format(ctx.__class__.cmd)) - Logs.pprint("PINK"," ctx.all_envs {{{!s}}}".format(type(ctx.all_envs))) - Logs.pprint("PINK"," len(ctx.all_envs) {:d}".format(len(ctx.all_envs))) - Logs.pprint("PINK"," default_variant_name {:s}".format((default_build_variant))) - if debug_build_variants: - for cfg_key in ctx.all_envs: - Logs.pprint(debug_bv_colour,"--------- cfg_key {{{:s}}}".format(cfg_key)) - if ctx.__class__.cmd.startswith("install"): - # We only want to install one variant. - if debug_install: - Logs.pprint(debug_bi_colour,"entered install wrapper") - if ctx.variant and len(ctx.variant) > 0: - # A specific variant, just do the requested install. - if debug_install: - Logs.pprint(debug_bi_colour,"variant not empty, go with existing fn") - ret_val = func_to_decorate(*args,**kwargs) - return ret_val - # This is the original unmodified install command, but we only want to install ONE variant, - # so queue the default and not anything else. - Logs.pprint(queue_msg_colour,'Queuing {:s}/{:s}/{:s} (default)'.format(command,platsys,default_build_variant)) - default_install = command+"_"+default_build_variant - # Do the actual command pushing (Options.commands contains any following arguments from the command line). - if debug_install: - Logs.pprint(debug_bi_colour,"Queued command: {{{!s}}}".format(default_install)) - Options.commands = [default_install] + Options.commands - # Do NOT proceed with the wrapped function when there is no variant. - return None - if ctx.variant and len(ctx.variant) > 0: - # The build context has a variant set, so just call the appropriate function (one of the ones created by create_variant_commands()). - if debug_build_variants or debug_build_variant_queuing or debug_build_all: - Logs.pprint(debug_bv_colour,"variant not empty, go with existing fn") - ret_val = func_to_decorate(*args,**kwargs) - return ret_val - if ctx.__class__.cmd.startswith("build_test_summary"): - # This is the test summary, show the test results and don't queue anything. - if debug_build_variants or debug_build_variant_queuing: - Logs.pprint(debug_bv_colour,"test_summary, go with show_summary fn") - ret_val = show_variant_test_summary(ctx) - return ret_val - # No variant (this is the original non-variant command), push variants of the ctx.cmd onto - # the command stack depending on both the current options set and those set during the configuration. - if debug_build_variants or debug_build_variant_queuing or debug_build_all: - Logs.pprint(debug_bv_colour,"type(variant_test_results) {!s}".format(type(variant_test_results))) - variant_test_results = dict() - variant_commands = [] - curr_opt = Options.options # options from the command line for this build - # Build all the variants if (a) explicitly enabled for this command, - # or (b) not explicitly disabled for both this command and the eariler configuration. - build_all = (curr_opt.build_all_variants > 0 or - (curr_opt.build_all_variants == 0 and getattr(orig_env,"build_default_build_all_variants",0) >= 0)) - if debug_build_all: - msg = "build_all {!s}, co.build_all_variants={:d} default_build_all_variants={:d}" - Logs.pprint(debug_bv_colour,msg.format(build_all,curr_opt.build_all_variants,getattr(orig_env,"build_default_build_all_variants",0))) - Logs.pprint(debug_bv_colour,"default_build_variant type={!s} val {{{!s}}}".format(type(default_build_variant),default_build_variant)) - requested_variants = [] - variant_count = 1 - # Look at the current options (in oo) and the configured options (in ctx) to figure out which ones we want. - for vgroup in variant_group_list: - v = [] - for vname in vgroup: - # We want to build this variant if: - # (a) it was enabled in the current options (i.e. on the command line for this build), or - # (b) it was enabled in the original configuration and not disabled on the command line of this build - # values are -1 if disabled, +1 if enabled, 0 if not mentioned - cov = getattr(curr_opt,"enable_"+vname,0) - bde_name = "build_default_enable_" + vname - ocv = 0 if bde_name not in orig_env else orig_env[bde_name] - if debug_build_variants or debug_build_variant_queuing: - msg = "vname {{{!s}}} type(cov)={{{!s}}} {!s} type(ocv)={{{!s}}} {!s}" - Logs.pprint(debug_bv_colour,msg.format(vname,type(cov),cov,type(ocv),ocv)) - if build_all or cov > 0 or (ocv > 0 and cov == 0): - v += [vname] - if 0 == len(v): - # We must have at least one from each group, so take the first. - v += [vgroup[0]] - requested_variants.append(v) - variant_count *= len(v) - # At this point requested_variants looks like variant_group_list except some of the groups might be smaller (no group is empty though). - if debug_build_variants or debug_build_variant_queuing: - Logs.pprint(debug_bv_colour,"requested_variants {{{!s}}} len={:d}".format(requested_variants,len(requested_variants))) - # ------------------------------- - rvlen = len(requested_variants) # Should be the same as len(variant_group_list) - vx = [0 for i in range(rvlen)] - for vn in range(variant_count): - # Build a variant name/path using the current index values in vx[] applied to requested variants. - name_components = [] - for i in range(rvlen): - name_components.append(requested_variants[i][vx[i]]) - if debug_build_variants or debug_build_variant_queuing: - Logs.pprint(debug_bv_colour,"name_components {{{!s}}} for vn={:d}".format(name_components,vn)) - # Add the appropriate command variant to the list of commands we're going to queue. - bld_variant_name = "_".join(name_components) - bld_variant_path = "/".join(name_components) - if ctx.all_envs[bld_variant_path].viable and (build_all or default_build_variant == bld_variant_name): - Logs.pprint(queue_msg_colour,"Queuing {:s}/{:s}/{:s}".format(command,platsys,bld_variant_path)) - variant_commands += [command+"_"+bld_variant_name] - else: - Logs.pprint(queue_msg_colour,"Skipping {:s}/{:s}/{:s} (not requested or not viable)".format(command,platsys,bld_variant_path)) - # Increment the values in vx[] for the next name/path. - for i in range(rvlen): - vx[i] += 1 - if vx[i] < len(requested_variants[i]): - # Finished incrementing. - break - # Start over at 0 and continue incrementing (i.e. "carry" to the next column). - vx[i] = 0 - if len(variant_commands) == 0: - # No options set, use a default (only here in case the options(opt) function - # is messed up and does not provide a set of options). - Logs.pprint(queue_msg_colour,'Queuing {:s}/{:s}/{:s} (default)'.format(command,platsys,default_build_variant)) - variant_commands = [command+"_"+default_build_variant] - # ----------------- - # Add a function to summarize test results if more than one variant was queued. - if debug_build_variants: - Logs.pprint(debug_bv_colour,"opt.enable_tests: {{{!s}}}".format(curr_opt.enable_tests )) - Logs.pprint(debug_bv_colour,"build_default_enable_tests {{{!s}}}".format(orig_env.build_default_enable_test)) - if len(variant_commands) > 1 and (curr_opt.enable_tests or - (hasattr(orig_env,"build_default_enable_tests") and orig_env.build_default_enable_tests)): - summary_command_name = command+"_test_summary" - Logs.pprint(queue_msg_colour,"Queuing {:s}".format(summary_command_name)) - variant_commands += [summary_command_name] - # ----------------- - # Do the actual command pushing (Options.commands contains any following arguments from the command line). - if debug_build_variants or debug_build_variant_queuing: - Logs.pprint(debug_bv_colour,"Queued commands: {{{!s}}}".format(variant_commands)) - Options.commands = variant_commands + Options.commands - # Do NOT proceed with the wrapped function when there is no variant, because at least - # for the 'clean' case this will end up removing ALL variants, plus removing/altering - # files needed to run waf commands, making 'waf distclean configure' necessary. - # Logs.info('variant_wrapper finished, skipping wrapped function, cmd={0:s} variant={1:s}'.format(ctx.cmd,ctx.variant)) - return None - if debug_build_variants: - Logs.pprint(debug_bv_colour,"Entered variant_decorator(), returning variant_wrapper") - return variant_wrapper - -def redirect_to_variants(platsys,variant_group_list): - # Install the wrapper we are using to redirect the "bare" commands to the variants. - # This is called just after calling create_variant_commands(variant_name_path_list) above. - if debug_build_variants: - Logs.pprint(debug_bv_colour,"Entered redirect_to_variants()") - for bciuls_ctx in bciuls_tuple: - cmd_getting_wrapped = bciuls_ctx.cmd - if debug_build_variants: - Logs.pprint('PINK','redirecting {:s} for {{{!s}}}.'.format('execute',cmd_getting_wrapped)) - # The BuildContext.execute() fn loads the all_envs dictionary (if not already loaded), then calls BuildContext.execute_build(). - # If the variant wrapper needs to look at the envs, we need to wrap execute_build(), otherwise wrapping execute() is good enough. - #func_to_wrap = bciuls_ctx.execute - func_to_wrap = bciuls_ctx.execute_build - if 'variant_wrapper' == func_to_wrap.__name__: - if debug_build_variants: - msg = "Function {:s} has already been wrapped in {!s} for cmd {:s}." - Logs.pprint('RED',msg.format('execute_build',type(bciuls_ctx),cmd_getting_wrapped)) - pass - else: - if debug_build_variants: - msg = "Function {:s} being wrapped in {!s} for cmd {:s}." - Logs.pprint(debug_bv_colour,msg.format(func_to_wrap.__name__,type(bciuls_ctx),cmd_getting_wrapped)) - #bciuls_ctx.execute = variant_decorator(func_to_wrap,variant_group_list) - bciuls_ctx.execute_build = variant_decorator(platsys,func_to_wrap,variant_group_list) - if debug_build_variants: - Logs.pprint(debug_bv_colour,"########################### finished redirect_to_variants()") - -def construct_variants(platsys,variant_group_list): - # Construct all the variant machinery that can be done at the time of import (before the configuration step). - # FIXME: see if this can be cached so it doesn't need to be done for every build as well as the config step.... - variant_name_path_list = construct_variant_names(variant_group_list) - # Clone the build-like commands for each of the build variants. - create_variant_commands(variant_name_path_list) - # Now wrap the standard commands with a function that queues the appropriate clone(s) depending on the options. - redirect_to_variants(platsys,variant_group_list) - return variant_name_path_list - -def variant_value(varname,variant_group_list): - # Treat the first variant in each group as the most desirable of the group, - # and the earlier groups as more desirable than later ones. - val = 0 - for gx in range(len(variant_group_list)): - val *= 2 - vfrag = variant_group_list[gx][0] - if vfrag in varname: - val += 1 - return val diff --git a/Tools/waf/intltool.py b/Tools/waf/intltool.py deleted file mode 100644 index df49746..0000000 --- a/Tools/waf/intltool.py +++ /dev/null @@ -1,105 +0,0 @@ -#! /usr/bin/env python -# encoding: utf-8 -# WARNING! Do not edit! https://waf.io/book/index.html#_obtaining_the_waf_file - -from __future__ import with_statement -import os,re -from waflib import Context,Task,Utils,Logs -import waflib.Tools.ccroot -from waflib.TaskGen import feature,before_method,taskgen_method -from waflib.Logs import error -from waflib.Configure import conf -_style_flags={'ba':'-b','desktop':'-d','keys':'-k','quoted':'--quoted-style','quotedxml':'--quotedxml-style','rfc822deb':'-r','schemas':'-s','xml':'-x',} -@taskgen_method -def ensure_localedir(self): - if not self.env.LOCALEDIR: - if self.env.DATAROOTDIR: - self.env.LOCALEDIR=os.path.join(self.env.DATAROOTDIR,'locale') - else: - self.env.LOCALEDIR=os.path.join(self.env.PREFIX,'share','locale') -@before_method('process_source') -@feature('intltool_in') -def apply_intltool_in_f(self): - try: - self.meths.remove('process_source') - except ValueError: - pass - self.ensure_localedir() - podir=getattr(self,'podir','.') - podirnode=self.path.find_dir(podir) - if not podirnode: - error("could not find the podir %r"%podir) - return - cache=getattr(self,'intlcache','.intlcache') - self.env.INTLCACHE=[os.path.join(str(self.path.get_bld()),podir,cache)] - self.env.INTLPODIR=podirnode.bldpath() - self.env.append_value('INTLFLAGS',getattr(self,'flags',self.env.INTLFLAGS_DEFAULT)) - if'-c'in self.env.INTLFLAGS: - self.bld.fatal('Redundant -c flag in intltool task %r'%self) - style=getattr(self,'style',None) - if style: - try: - style_flag=_style_flags[style] - except KeyError: - self.bld.fatal('intltool_in style "%s" is not valid'%style) - self.env.append_unique('INTLFLAGS',[style_flag]) - for i in self.to_list(self.source): - node=self.path.find_resource(i) - task=self.create_task('intltool',node,node.change_ext('')) - inst=getattr(self,'install_path',None) - if inst: - self.add_install_files(install_to=inst,install_from=task.outputs) -@feature('intltool_po') -def apply_intltool_po(self): - try: - self.meths.remove('process_source') - except ValueError: - pass - self.ensure_localedir() - appname=getattr(self,'appname',getattr(Context.g_module,Context.APPNAME,'set_your_app_name')) - podir=getattr(self,'podir','.') - inst=getattr(self,'install_path','${LOCALEDIR}') - linguas=self.path.find_node(os.path.join(podir,'LINGUAS')) - if linguas: - with open(linguas.abspath())as f: - langs=[] - for line in f.readlines(): - if not line.startswith('#'): - langs+=line.split() - re_linguas=re.compile('[-a-zA-Z_@.]+') - for lang in langs: - if re_linguas.match(lang): - node=self.path.find_resource(os.path.join(podir,re_linguas.match(lang).group()+'.po')) - task=self.create_task('po',node,node.change_ext('.mo')) - if inst: - filename=task.outputs[0].name - (langname,ext)=os.path.splitext(filename) - inst_file=inst+os.sep+langname+os.sep+'LC_MESSAGES'+os.sep+appname+'.mo' - self.add_install_as(install_to=inst_file,install_from=task.outputs[0],chmod=getattr(self,'chmod',Utils.O644)) - else: - Logs.pprint('RED',"Error no LINGUAS file found in po directory") -class po(Task.Task): - run_str='${MSGFMT} -o ${TGT} ${SRC}' - color='BLUE' -class intltool(Task.Task): - run_str='${INTLTOOL} ${INTLFLAGS} ${INTLCACHE_ST:INTLCACHE} ${INTLPODIR} ${SRC} ${TGT}' - color='BLUE' -@conf -def find_msgfmt(conf): - conf.find_program('msgfmt',var='MSGFMT') -@conf -def find_intltool_merge(conf): - if not conf.env.PERL: - conf.find_program('perl',var='PERL') - conf.env.INTLCACHE_ST='--cache=%s' - conf.env.INTLFLAGS_DEFAULT=['-q','-u'] - conf.find_program('intltool-merge',interpreter='PERL',var='INTLTOOL') -def configure(conf): - # TBR: modified to check only for required features if conf.env.intltool_features has been set. - reqd_features = (conf.env.intltool_features if "intltool_features" in conf.env else ["intltool_po","intltool_in"]) - if "intltool_po" in reqd_features: - conf.find_msgfmt() - if "intltool_in" in reqd_features: - conf.find_intltool_merge() - if conf.env.CC or conf.env.CXX: - conf.check(header_name='locale.h') diff --git a/Tools/waf/lib_unit_tests.py b/Tools/waf/lib_unit_tests.py deleted file mode 100644 index 2ea530a..0000000 --- a/Tools/waf/lib_unit_tests.py +++ /dev/null @@ -1,348 +0,0 @@ -#======================================================================================================= -# Add functions and features for generating and running unit tests. -# -import os,sys -from waflib import TaskGen,Node,Task,Utils,Logs -from waflib.TaskGen import feature,after_method -# from waflib import Options -from waflib.Build import BuildContext -# Make sure we have the variant test results function on the BuildContext -import build_variants - -testlock=Utils.threading.Lock() - -# Task groups only apply to task generators, not individual tasks, so we can't use the feature and gen_run stuff -# in unit tests to put the unit tests into the test group, it has to be explicit in the wscript files. -# Add a couple of functions to the BuildContext so the switching and returning only takes two lines. -# FUTURE: Consider creating a new task generator in gen_run(). - -def switch_to_test_group(self,sub_group): - # Switch to the task group for building and running unit tests. - # Logs.pprint('CYAN','switching task group to {{{:s}}} from {{{:s}}}'.format(current_test_group,self.get_group_name(self.current_group))) - self.set_group('test_{:s}_tasks'.format(sub_group)) - -# Patch the BuildContext class so that all instances have switch_to_test_group() as a method. -BuildContext.switch_to_test_group = switch_to_test_group - -def return_to_build_group(self): - # Return to the task group for building regular stuff. - # msg = "switching task group back to {{{:s}}} from {{{:s}}}" - # Logs.pprint('CYAN',msg.format(current_build_group,self.get_group_name(self.current_group))) - self.set_group('build_tasks') - -# Patch the BuildContext class so that all instances have return_to_build_group() as a method. -BuildContext.return_to_build_group = return_to_build_group - -def show_test_results(self,bld): - lst = getattr(bld, 'utest_results', []) - # Logs.pprint('PINK','type(sys.stdout.encoding)={:s}'.format(type(sys.stdout.encoding))) - # Logs.pprint('PINK','sys.stdout.encoding={!s}'.format(sys.stdout.encoding)) - # utf8_encoding = sys.stdout.encoding - # Hmm, sys.stdout.encoding=ANSI_X3.4-1968 on my Linux - utf8_encoding = 'utf-8' - if lst: - lst = sorted(lst, key=lambda t: t[0]) - Logs.pprint('CYAN','vvvvvvv Test execution summary for variant {:s}'.format(bld.env.VARNAME)) - Logs.pprint('YELLOW',' (these can be turned off by using the "--notest" command line option)') - total = len(lst) - tfail = len([x for x in lst if x[1]]) - tpass = total - tfail - if tpass > 0: - Logs.pprint('GREEN', ' tests that pass {0:d}/{1:d}'.format(tpass,total)) - for (f, code, out, err) in lst: - if not code: - Logs.pprint('GREEN', ' {0:s}'.format(f)) - # lines = out.decode('utf-8') - # lines = out.decode('windows-1252') - mark_end = False - # We could use "ignore" instead of "backslashreplace". - lines = out.decode(utf8_encoding,errors="backslashreplace").rstrip() - if len(lines) > 0: - mark_end = True - Logs.pprint('GREEN', ' === stdout') - for line in lines.split('\r\n'): - Logs.pprint('GREEN', line) - lines = err.decode(utf8_encoding,errors="backslashreplace").rstrip() - if len(lines) > 0: - mark_end = True - Logs.pprint('GREEN', ' === stderr') - for line in lines.split('\r\n'): - Logs.pprint('GREEN', line) - if mark_end: - Logs.pprint('GREEN', ' ^^^') - if tfail > 0: - Logs.pprint('PINK', ' tests that fail {0:d}/{1:d}'.format(tfail,total)) - for (f, code, out, err) in lst: - if code: - Logs.pprint('PINK', ' {0:s} -> {1:d}'.format(f,code)) - mark_end = False - lines = out.decode(utf8_encoding,errors="backslashreplace").rstrip() - if len(lines) > 0: - mark_end = True - Logs.pprint('PINK', ' === stdout') - for line in lines.split('\r\n'): - Logs.pprint('PINK', line) - lines = err.decode(utf8_encoding,errors="backslashreplace").rstrip() - if len(lines) > 0: - mark_end = True - Logs.pprint('PINK', ' === stderr') - for line in lines.split('\r\n'): - Logs.pprint('PINK', line) - if mark_end: - Logs.pprint('PINK', ' ^^^') - Logs.pprint('CYAN','^^^^^^^ end of summary for variant {:s}'.format(bld.env.VARNAME)) - # Get rid of test results in case they hold open files. - bld.utest_results = None - # Save the numbers for this variant. - bld.add_variant_test_results(tpass,tfail) - -# Patch the BuildContext class so that all instances have show_test_results() as a method. -BuildContext.show_test_results = show_test_results - -class run_lib_unit_test(Task.Task): - color = 'CYAN' - after = ['vnum','inst'] - vars=[] - def keyword(self): - return "Testing" - def runnable_status(self): - ret = super(run_lib_unit_test,self).runnable_status() - if ret == Task.SKIP_ME: - # Task has been run before (it is up to date). - # Always run the unit tests again if they are runnable - return Task.RUN_ME - return ret - def run(self): - # Figure out what executable to run for the test - # self.inputs[] is a list of nodes. -- These are the nodes required to exist and be up to date before this task can be run. - filename = self.inputs[0].abspath() - args = getattr(self,'ut_args',[]) - self.ut_exec = getattr(self,'ut_exec',[filename]) - if getattr(self.generator,'ut_fun',None): - self.generator.ut_fun(self) - try: - fu = getattr(self.generator.bld,'all_test_paths') - except AttributeError: - fu = os.environ.copy() - self.generator.bld.all_test_paths = fu - lst=[] - for g in self.generator.bld.groups: - for tg in g: - if getattr(tg,'link_task',None): - lst.append(tg.link_task.outputs[0].parent.abspath()) - def add_path(dct,path,var): - dct[var] = os.pathsep.join(Utils.to_list(path)+[os.environ.get(var,'')]) - if Utils.is_win32: - add_path(fu,lst,'PATH') - elif Utils.unversioned_sys_platform()=='darwin': - add_path(fu,lst,'DYLD_LIBRARY_PATH') - add_path(fu,lst,'LD_LIBRARY_PATH') - else: - add_path(fu,lst,'LD_LIBRARY_PATH') - cwd = getattr(self.generator,'ut_cwd','') or self.inputs[0].parent.abspath() - exec_full_name = self.ut_exec[0] - ## Logs.pprint('PINK','cwd {{{:s}}} {:d}'.format(cwd,len(cwd))) - ## Logs.pprint('PINK','exec full name {{{:s}}} {:d}'.format(exec_full_name,len(exec_full_name))) - ## Logs.pprint('PINK','unit test name {{{:s}}} {:d}'.format(self.ut_test_name,len(self.ut_test_name))) - if len(args) > 0: - args = [self.ut_test_name] + args - else: - args = [self.ut_test_name] - ## for arg in args: - ## Logs.pprint('PINK',' arg {{{:s}}} {:d}'.format(arg,len(arg))) - proc = Utils.subprocess.Popen(args,executable=exec_full_name,cwd=cwd,env=fu,stderr=Utils.subprocess.PIPE,stdout=Utils.subprocess.PIPE) - (stdout,stderr) = proc.communicate() - rc = proc.returncode - if 0 == rc and hasattr(self,'ut_expected') and hasattr(self,'ut_actual'): - # Compare the actual output to the expected output. - diff_args = ['diff','-qba',self.ut_actual.abspath(),self.ut_expected.abspath()] - diff_exec = self.generator.bld.env.DIFF - # Logs.pprint('YELLOW','type(diff_exec)={:s}'.format(type(diff_exec))) - if list == type(diff_exec): - # Just take the first one. - diff_exec = diff_exec[0] - # Logs.pprint('YELLOW','type(cwd)={:s}'.format(type(cwd))) - diff_proc = Utils.subprocess.Popen(diff_args,executable=diff_exec,cwd=cwd,env=fu,stderr=Utils.subprocess.PIPE,stdout=Utils.subprocess.PIPE) - (diff_stdout,diff_stderr) = diff_proc.communicate() - stdout += diff_stdout - stderr += diff_stderr - rc = diff_proc.returncode - if hasattr(self,'ut_label'): - filename += ' ('+self.ut_label+')' - tup = (filename,rc,stdout,stderr) - self.generator.utest_result = tup - testlock.acquire() - try: - bld = self.generator.bld - Logs.debug("ut: %r",tup) - try: - bld.utest_results.append(tup) - except AttributeError: - bld.utest_results=[tup] - finally: - testlock.release() - -# For any build target that contains the feature 'lib_unit_test', add a call to gen_run() after -# the call to apply_link() in order to try to generate a task (instance of run_lib_unit_test) that -# will run the link output as a unit test. -@feature('lib_unit_test') -@after_method('apply_link') -def gen_run(tgen): - debug_expected_output = getattr(tgen,"DEBUG_ME",False) - if getattr(tgen,'link_task',None): - if debug_expected_output: - Logs.pprint('CYAN','looking for input files for '+tgen.name+' in '+tgen.path.path_from(tgen.path.ctx.launch_node())) - Logs.pprint('CYAN',' tgen.path = {{{!s}}}'.format(tgen.path.abspath())) - bld = getattr(tgen,'bld',None) - input_nodes = [] - if None != bld and len(bld.env.VARNAME) > 0: - # We're building a variant, look for variant specific input (under the VARNAME (i.e. '_'s) not the path). - input_nodes = tgen.path.ant_glob('data/'+tgen.name+'/input/'+bld.env.VARNAME+'/*.txt') - # The 'v' is just a boolean indicator, it could be a directory or file. - dash_v = tgen.path.ant_glob('data/'+tgen.name+'/input/'+bld.env.VARNAME+'/v') - if len(input_nodes) <= 0: - # This isn't a variant, or the input isn't variant specific. - input_nodes = tgen.path.ant_glob('data/'+tgen.name+'/input/*.txt') - dash_v = tgen.path.ant_glob('data/'+tgen.name+'/v') - if len(input_nodes) > 0: - if debug_expected_output: - Logs.pprint('CYAN','input files for '+tgen.name) - for idn in input_nodes: - # Assume output to be produced only if there is an expected file present in the source - odn = None - xdn = None - idf = idn.abspath() - fname = os.path.basename(idf) - if None != bld: - if debug_expected_output: - Logs.pprint('CYAN','looking for expected output files for '+tgen.name+' in '+tgen.path.abspath()) - if "PLATSYS" in bld.all_envs['']: - platsys = bld.all_envs[''].PLATSYS - if len(bld.env.VARNAME) > 0: - expected_output_name = 'data/'+platsys+'/'+tgen.name+'/expected/'+bld.env.VARNAME+'/'+fname - xdn = tgen.path.find_node(expected_output_name) - if debug_expected_output: - msg = 'searching {{{:s}}} for expected output {{{:s}}} --> {!s}' - Logs.pprint('RED',msg.format(tgen.path.abspath(),expected_output_name,type(xdn))) - if None == xdn: - expected_output_name = 'data/'+platsys+'/'+tgen.name+'/expected/'+fname - xdn = tgen.path.find_node(expected_output_name) - if debug_expected_output: - msg = 'searching {{{:s}}} for expected output {{{:s}}} --> {!s}' - Logs.pprint('RED',msg.format(tgen.path.abspath(),expected_output_name,type(xdn))) - if None == xdn and len(bld.env.VARNAME) > 0: - expected_output_name = 'data/'+tgen.name+'/expected/'+bld.env.VARNAME+'/'+fname - xdn = tgen.path.find_node(expected_output_name) - if debug_expected_output: - Logs.pprint('RED','searching for {{{:s}}} (expected output) --> {!s}'.format(expected_output_name,type(xdn))) - if None == xdn: - expected_output_name = 'data/'+tgen.name+'/expected/'+fname - xdn = tgen.path.find_node(expected_output_name) - if debug_expected_output: - Logs.pprint('RED','searching for {{{:s}}} (expected output) --> {!s}'.format(expected_output_name,type(xdn))) - if None != xdn: - if debug_expected_output: - Logs.pprint('RED','found expected (known good) node{{{:s}}}'.format(xdn.path_from(xdn.ctx.launch_node()))) - # The output file needs to be in the build/variant directory, not the source directory, so use find_or_declare(). - # We don't need the variant in the output file path because the build/variant directory already has it. - actual_output_name = 'output/'+tgen.name+'/'+fname - odn = tgen.path.find_or_declare(actual_output_name) - if debug_expected_output: - Logs.pprint('RED','output node{{{:s}}}'.format(odn.path_from(odn.ctx.launch_node()))) - (fname,ext) = os.path.splitext(fname) - if debug_expected_output: - Logs.pprint('CYAN','generating run_lib_unit_test task for %s' % fname) - Logs.pprint('CYAN',' input {{{:s}}}'.format(idn.path_from(idn.ctx.launch_node()))) - if None != odn: Logs.pprint('CYAN',' output {{{:s}}}'.format(odn.path_from(odn.ctx.launch_node()))) - # Get rid of windows noise about foo.manifest if present. - ut_inputs = [x for x in tgen.link_task.outputs if not x.abspath().lower().endswith('.manifest')] + [idn] - ut_outputs = None if None == odn else [odn] - rut = tgen.create_task('run_lib_unit_test',ut_inputs,ut_outputs) - rut.ut_test_name = tgen.name - # Logs.pprint('RED','tgen.name{{{:s}}} fname{{{:s}}}'.format(tgen.name,fname)) - if fname.startswith(tgen.name+'_'): - fname = fname[len(tgen.name)+1:] - rut.ut_label = fname if None == odn else fname+'{verified}' - # we want to add the data file as input to the unit test run task (not the unit test build) - rut.ut_args = ['-v', '-f', idf] if len(dash_v) > 0 else ['-f', idf] - if None != odn: - # There is expected output, so add the flag and path for actual output. - rut.ut_args += ['-o', odn.abspath()] - # Then tell the run_lib_unit_test task to verify that actual == expected. - rut.ut_actual = odn - rut.ut_expected = xdn - else: - if debug_expected_output: - Logs.pprint('CYAN','no input files for '+tgen.name) - # No data files, just run the test program. - # Logs.pprint('CYAN','generating run_lib_unit_test task for %s with no input files' % tgen.name) - odn = None - xdn = None - fname = tgen.name - if None != bld: - # look for anything under the expected directory for output - if "PLATSYS" in bld.all_envs['']: - platsys = bld.all_envs[''].PLATSYS - if len(bld.env.VARNAME) > 0: - expected_output_name = 'data/'+platsys+'/'+tgen.name+'/expected/'+bld.env.VARNAME+'/*.txt' - xdn = tgen.path.ant_glob(expected_output_name) - if debug_expected_output: - msg = 'searching {{{:s}}} for expected output {{{:s}}} --> {!s}' - Logs.pprint('RED',msg.format(tgen.path.abspath(),expected_output_name,type(xdn))) - if None == xdn or 0 == len(xdn): - expected_output_name = 'data/'+platsys+'/'+tgen.name+'/expected/*.txt' - xdn = tgen.path.ant_glob(expected_output_name) - if debug_expected_output: - msg = 'searching {{{:s}}} for expected output {{{:s}}} --> {!s}' - Logs.pprint('RED',msg.format(tgen.path.abspath(),expected_output_name,type(xdn))) - if (None == xdn or 0 == len(xdn)) and len(bld.env.VARNAME) > 0: - expected_output_name = 'data/'+tgen.name+'/expected/'+bld.env.VARNAME+'/*.txt' - xdn = tgen.path.ant_glob(expected_output_name) - if debug_expected_output: - msg = 'searching {{{:s}}} for expected output {{{:s}}} --> {!s}' - Logs.pprint('RED',msg.format(tgen.path.abspath(),expected_output_name,type(xdn))) - if None == xdn or 0 == len(xdn): - expected_output_name = 'data/'+tgen.name+'/expected/*.txt' - xdn = tgen.path.ant_glob(expected_output_name) - if debug_expected_output: - msg = 'searching {{{:s}}} for expected output {{{:s}}} --> {!s}' - Logs.pprint('RED',msg.format(tgen.path.abspath(),expected_output_name,type(xdn))) - if None != xdn and len(xdn) > 0: - if len(xdn) == 1: - xdn = xdn[0] - if debug_expected_output: - Logs.pprint('RED','found expected (known good) node{{{:s}}}'.format(xdn.path_from(xdn.ctx.launch_node()))) - # The output file needs to be in the build/variant directory, not the source directory, so use find_or_declare(). - # We don't need the variant in the output file path because the build/variant directory already has it. - fname = os.path.basename(xdn.path_from(xdn.ctx.launch_node())) - odn = tgen.path.find_or_declare('output/'+tgen.name+'/'+fname) - if debug_expected_output: - Logs.pprint('RED','output node{{{:s}}}'.format(odn.path_from(odn.ctx.launch_node()))) - elif len(xdn) > 1: - xdn = None - Logs.pprint('RED','{:s}: More than one expected output with no input (ignored)'.format(fname)) - else: - if debug_expected_output: - Logs.pprint('RED','no expected output found') - else: - if debug_expected_output: - Logs.pprint('RED','no bld, cannot look for expected output') - # Get rid of windows noise about foo.manifest if present. - ut_inputs = [x for x in tgen.link_task.outputs if not x.abspath().lower().endswith('.manifest')] - ut_outputs = None if None == odn else [odn] - rut = tgen.create_task('run_lib_unit_test',ut_inputs) - rut.ut_test_name = tgen.name - rut.ut_label = fname if None == odn else fname+'{verified}' - rut.ut_args = ['-v'] if len(dash_v) > 0 else [] - if None != odn: - # There is expected output, so add the flag and path for actual output. - rut.ut_args += ['-o', odn.abspath()] - # Then tell the run_lib_unit_test task to verify that actual == expected. - rut.ut_actual = odn - rut.ut_expected = xdn - # Make sure the results are displayed by adding the display function to the post-build functions if not already there. - if hasattr(tgen,'bld'): - # Logs.pprint('CYAN','gen_run: found bld attr') - if not hasattr(tgen.bld,'post_funs') or tgen.bld.show_test_results not in tgen.bld.post_funs: - # Logs.pprint('CYAN','gen_run: calling bld.add_post_fun(show_test_results)') - tgen.bld.add_post_fun(tgen.bld.show_test_results) diff --git a/Tools/waf/python_unit_tests.py b/Tools/waf/python_unit_tests.py deleted file mode 100644 index 7a7a8ca..0000000 --- a/Tools/waf/python_unit_tests.py +++ /dev/null @@ -1,480 +0,0 @@ -#======================================================================================================= -# Add functions and features for generating and running python extension unit tests. -# -import sys,os,venv,shutil -from waflib import TaskGen,Node,Task,Utils,Logs -from waflib.TaskGen import feature -# from waflib import Options - -import lib_unit_tests - -debug_python_venv = False -debug_python_venv_symlinks = False -debug_pyvenv_colour = "PINK" - -class no_lib64_symlink_EnvBuilder(venv.EnvBuilder): - """ - Override the EnvBuilder code that does a symlink to avoid problems with remote filesystems (see the use in _____ below). - """ - - def __init__(self,*args,**kwargs): - super().__init__(*args,**kwargs) - - def ensure_directories(self,env_dir): - # 1. Create the lib64 directory first, which stops the super().ensure_directories() from creating it as a symlink - lib64_path = os.path.join(env_dir,"lib64") - if not os.path.exists(lib64_path): - os.makedirs(lib64_path) - # 2. Use super().ensure_directories(env_dir) to do the rest of the work. - context = super().ensure_directories(env_dir) - # 3. Copy everything below lib to lib64. - shutil.copytree(os.path.join(env_dir,"lib"),lib64_path,dirs_exist_ok=True) - # return the super's return value - return context - -class ensure_python_venv(Task.Task): - color = "BLUE" - # after = ["vnum"] - vars = [] - def __str__(self): - tgen = self.generator # The TaskGen that created this task. - bld = getattr(tgen,"bld",None) # The Build that created tgen. - if None == bld: - # The standard way to create a TaskGen is by calling Build.__call__() which sets the "bld" attribute. - # If there is no "bld" attribute there is no telling how this was created or what is supposed to be run, so bail. - return "non-standard python venv Task" - if "VENV_PATH" in bld.env: - # VENV_PATH is absolute, return the relative version. - return bld.bldnode.find_or_declare(bld.env.VENV_PATH).path_from(bld.srcnode) - return "Unknown" - def keyword(self): - # The VENV_SYMLINKS_WORK test isn't done until after run(), so we can't use it here :(. - # tgen = self.generator # The TaskGen that created this task. - # bld = getattr(tgen,"bld",None) # The Build that created tgen. - # if None != bld and "VENV_SYMLINKS_WORK" in bld.env and not bld.env.VENV_SYMLINKS_WORK: - # return "Creating symlink-free python venv" - return "Creating python venv" - def run(self): - if debug_python_venv or debug_python_venv_symlinks: - Logs.pprint(debug_pyvenv_colour,"ensure_python_venv>>run() entered") - tgen = self.generator # The TaskGen that created this task. - bld = getattr(tgen,"bld",None) # The Build that created tgen. - if None == bld: - # The standard way to create a TaskGen is by calling Build.__call__() which sets the "bld" attribute. - # If there is no "bld" attribute there is no telling how this was created or what is supposed to be run, so bail. - Logs.pprint("RED","ensure_python_venv>>run() - no BuildContext, bailing") - return -1 - bld_env = bld.env - # Fetch the path to the venv we want. - venv_path = bld_env.VENV_PATH if "VENV_PATH" in bld_env else None - # Test for existence of the python executable in the venv to see if the venv is already present. - python_exec_path = os.path.join(venv_path,"bin","python") - if not os.path.exists(python_exec_path): - # We need to create the virtual env. - if "VENV_SYMLINKS_WORK" in bld.env: - symlinks_work = bld_env["VENV_SYMLINKS_WORK"] - use_lib64 = bld_env["VENV_USE_LIB64"] - if debug_python_venv or debug_python_venv_symlinks: - msg = "ensure_python_venv>>run(symlinks={!s}): Creating ordinary python venv in {:s}" - Logs.pprint(debug_pyvenv_colour,msg.format(symlinks_work,venv_path)) - else: - # Test for 64-bit lib needed (but only on some platforms) - symlinks_work = True - use_lib64 = False - if debug_python_venv or debug_python_venv_symlinks: - Logs.pprint(debug_pyvenv_colour,"ensure_python_venv>>run(): assume.symlinks={!s}".format(symlinks_work)) - if sys.maxsize > 2**32 and "windows" != bld_env.PLATSYS: - # The built in venv.EnvBuilder code will put in a symlink lib64 -> lib on posix-like - # systems because many distros do it and it's too complicated for python to try and - # untangle it. Unfortunately, if we want to run this build over any kind of remote - # filesyste (e.g. NFS, SMB, VM shared folder, etc.) symlinks are not going to work. - # Try making a symlink to a directory to see if we need to fiddle things. - # The symlink issue isn't variant dependent, but put the results into the variant env anyways. - lib64_path = os.path.join(venv_path,"lib64") - if os.path.exists(lib64_path): - use_lib64 = True - bld_env["VENV_USE_LIB64"] = use_lib64 # indicates the python running waf wants the 64-bit extent - # Test for working symlinks - dummy_target_path = os.path.join(venv_path,"dummy_target") - dummy_symlink_path = os.path.join(venv_path,"dummy_symlink") - try: - os.makedirs(dummy_target_path) - os.symlink(dummy_target_path,dummy_symlink_path) - except: - symlinks_work = False - if debug_python_venv or debug_python_venv_symlinks: - Logs.pprint(debug_pyvenv_colour,"ensure_python_venv>>run(): failed.symlinks={!s}".format(symlinks_work)) - if os.path.exists(dummy_symlink_path): - os.remove(dummy_symlink_path) - if os.path.exists(dummy_target_path): - os.rmdir(dummy_target_path) - bld_env["VENV_SYMLINKS_WORK"] = symlinks_work - if symlinks_work: - if debug_python_venv or debug_python_venv_symlinks: - msg = "ensure_python_venv>>run(symlinks=True): Creating ordinary python venv in {:s}" - Logs.pprint(debug_pyvenv_colour,msg.format(venv_path)) - venv_builder = venv.EnvBuilder(symlinks=symlinks_work) - else: - # We only need the extension we're building to go under lib (and nothing - # from the base python), so just override the EnvBuilder class with code that builds - # both lib and lib64 as ordinary directories, and put our stuff in when it gets built. - if debug_python_venv or debug_python_venv_symlinks: - msg = "ensure_python_venv>>run(symlinks=False): Creating symlink-free python venv in {:s}" - Logs.pprint(debug_pyvenv_colour,msg.format(venv_path)) - venv_builder = no_lib64_symlink_EnvBuilder(symlinks=symlinks_work) - # FUTURE: check success of create() (nothing returned, maybe check existence of python binary?) - venv_builder.create(venv_path) - elif debug_python_venv or debug_python_venv_symlinks: - Logs.pprint(debug_pyvenv_colour,"ensure_python_venv>>run() python executable already present") - # Finally, make sure any extensions we're going to test are up to date. - # The self.outputs[] nodes correspond to the self.inputs[] nodes after skipping the python executable at the start. - if None != self.inputs: - # Copy the latest build of the extensions into the venv's site-packages. - use_lib64 = bld_env["VENV_USE_LIB64"] - for ndx in range(len(self.inputs)): - bld_ext_node = self.inputs[ndx] - pkg_ext_node = self.outputs[ndx+1] - bld_ext_path = bld_ext_node.abspath() - pkg_ext_path = pkg_ext_node.abspath() - if not os.path.exists(pkg_ext_path) or os.path.getmtime(bld_ext_path) > os.path.getmtime(pkg_ext_path): - shutil.copyfile(bld_ext_path,pkg_ext_path) - if use_lib64: - pkg_ext_path = pkg_ext_path.replace("lib/python","lib64/python") - if not os.path.exists(pkg_ext_path) or os.path.getmtime(bld_ext_path) > os.path.getmtime(pkg_ext_path): - shutil.copyfile(bld_ext_path,pkg_ext_path) - return 0 - -class run_python_unit_test(Task.Task): - color = 'CYAN' - after = ['vnum','inst'] - vars=[] - def __str__(self): - # return "pyx_test_{:s}".format(self.ut_rel_name) - return self.ut_rel_name - def keyword(self): - return "Testing" - def runnable_status(self): - ret = super(run_python_unit_test,self).runnable_status() - if ret == Task.SKIP_ME: - # Task has been run before (it is up to date). - # Always run the unit tests again if they are runnable - return Task.RUN_ME - return ret - def run(self): - debug_me = getattr(self,"DEBUG_ME",False) - num_venv_outputs = self.num_venv_outputs - # Figure out what arguments to supply for the test - # self.inputs[] is a list of nodes. -- These are the nodes required to exist and be up to date before this task can be run. - # The first num_venv_outputs of self.inputs[] are the output nodes from ensure_python_venv. - if hasattr(self,'inputs') and len(self.inputs) > num_venv_outputs: - filename = self.inputs[num_venv_outputs].abspath() # filename is the first part of the line shown for results, should be an abspath() - if debug_me: - Logs.pprint("YELLOW","filename {{{:s}}}".format(filename)) - else: - filename = getattr(self,'name',getattr(self,'_name','xyzzy')) - if debug_me: - Logs.pprint("YELLOW","task name {{{:s}}}".format(filename)) - if not hasattr(self,'ut_cwd'): - Logs.pprint('RED','bailing, no working dir') - return -1 - cwd = getattr(self,'ut_cwd',None) - cwd_path = cwd.abspath() - os.makedirs(cwd_path,mode=0o770,exist_ok=True) - args = getattr(self,'ut_args',[]) - exec_full_name = self.inputs[0].abspath() - if debug_me: - Logs.pprint('PINK','cwd {{{:s}}} {:d}'.format(cwd_path,len(cwd_path))) - Logs.pprint('PINK','exec full name {{{:s}}} {:d}'.format(exec_full_name,len(exec_full_name))) - Logs.pprint('PINK','unit test name {{{:s}}} {:d}'.format(self.ut_test_name,len(self.ut_test_name))) - if debug_me: - for arg in args: - Logs.pprint('PINK',' arg {{{:s}}} {:d}'.format(arg,len(arg))) - if len(args) > 0: - args = [exec_full_name] + args - else: - args = [exec_full_name] - proc = Utils.subprocess.Popen(args,cwd=cwd_path,env=os.environ.copy(),stdin=Utils.subprocess.DEVNULL, - stderr=Utils.subprocess.PIPE,stdout=Utils.subprocess.PIPE) - (stdout,stderr) = proc.communicate() - rc = proc.returncode - # Logs.pprint('PINK','args {{{!s}}} -------> rc {:d}'.format(proc.args,rc)) - if debug_me: - Logs.pprint('PINK','------->rc {:d}'.format(rc)) - if 0 == rc and hasattr(self,'ut_expected') and hasattr(self,'ut_actual'): - # Compare the actual output to the expected output. - diff_args = ['diff','-qba',self.ut_actual.abspath(),self.ut_expected.abspath()] - diff_exec = self.generator.bld.env.DIFF - if list == type(diff_exec): - # Just take the first one. - diff_exec = diff_exec[0] - # Logs.pprint('YELLOW','type(diff_exec)={:s}'.format(type(diff_exec))) - # Logs.pprint('YELLOW','type(cwd_path)={:s}'.format(type(cwd_path))) - diff_proc = Utils.subprocess.Popen(diff_args,executable=diff_exec,cwd=cwd_path,env=os.environ.copy(), - stderr=Utils.subprocess.PIPE,stdout=Utils.subprocess.PIPE) - (diff_stdout,diff_stderr) = diff_proc.communicate() - stdout += diff_stdout - stderr += diff_stderr - rc = diff_proc.returncode - if hasattr(self,'ut_label') and filename != self.ut_label: - filename += ' ('+self.ut_label+')' - tup = (filename,rc,stdout,stderr) - self.generator.utest_result = tup - lib_unit_tests.testlock.acquire() - try: - bld = self.generator.bld - Logs.debug("ut: %r",tup) - try: - bld.utest_results.append(tup) - except AttributeError: - bld.utest_results=[tup] - finally: - lib_unit_tests.testlock.release() - if debug_me: - Logs.pprint('YELLOW','finished {!s} {!s}'.format(self.ut_exec,args)) - return 0 - -# For any build target that contains the feature 'python_unit_test', add a call to gen_python_run() -# in order to try to generate two tasks (instance of ensure_python_venv followed by run_python_unit_test) that will run the test. -@feature('python_unit_test') -def gen_python_run(tgen): - # Generate two tasks: - # 1) an instance of ensure_python_venv with: - # inputs = any python extensions to be tested - # outputs = the python executable in the venv plus the venv/.../site-packages versions of the extensions - # 2) an instance of run_python_unit_test with: - # inputs = the outputs of (1) plus the sources for this TaskGen - # Note that by the time this gets executed, the BuildContext bld has had the bld.path reset to the top directory - # (it's a context, and it changes), so we have to get the build node for the venv from the extensions or the sources. - debug_me = getattr(tgen,'DEBUG_ME',False) - if debug_me or debug_python_venv: - Logs.pprint(debug_pyvenv_colour,"############################################# gen_python_run() entered") - Logs.pprint(debug_pyvenv_colour,"tgen {{{!s}}}".format(tgen)) - bld = getattr(tgen,'bld',None) - if None == bld: - # The standard way to create a TaskGen is by calling Build.__call__() which sets the "bld" attribute. - # If there is no "bld" attribute there is no telling how this was created or what is supposed to be run, so bail. - return -1 - if debug_me or debug_python_venv: - Logs.pprint(debug_pyvenv_colour,"type(bld) {{{!s}}}".format(type(bld))) - Logs.pprint(debug_pyvenv_colour,"bld {{{!s}}}".format(bld)) - Logs.pprint(debug_pyvenv_colour,"bld.srcnode {{{!s}}}".format(bld.srcnode.abspath())) # S.B. top - Logs.pprint(debug_pyvenv_colour,"bld.bldnode {{{!s}}}".format(bld.bldnode.abspath())) # S.B. out+variant - Logs.pprint(debug_pyvenv_colour,"bld.path {{{!s}}}".format(bld.path.abspath())) - if hasattr(tgen,"orig_bld_path"): - Logs.pprint(debug_pyvenv_colour,"orig_bld_path {{{!s}}}".format(tgen.orig_bld_path.abspath())) - # Find the length of the prefix of (i.e. filesystem path to) the top dir to use when building relative paths. - abs_prefix_len = len(bld.srcnode.abspath()) + 1 # allow for trailing '/' on prefix - bld_env = bld.env - # --- Get the actual test script sources. - srcs = getattr(tgen,'source',None) - if debug_me: - Logs.pprint(debug_pyvenv_colour,"abs_prefix_len={:d} tgen sources {{{!s}}}".format(abs_prefix_len,srcs)) - if srcs is None: - # Nothing to do. - return 0 - if not isinstance(srcs,list): - srcs = [srcs] - # --- Get any extensions being tested to use as a (possibly empty) list of inputs to ensure_python_venv. - extensions_to_test = getattr(tgen,"extensions_to_test",[]) - # Make sure we have a (possibly empty) list of extensions to use as inputs to ensure_python_venv. - if not isinstance(extensions_to_test,list): - extensions_to_test = [extensions_to_test] - # --- Construct the path to the venv we want (as mentioned above, bld.path does not help). - venv_path = bld_env.VENV_PATH if "VENV_PATH" in bld_env else None - if None == venv_path: - if len(extensions_to_test) > 0: - # Use the directory containing the first extension. - venv_dir_node_parent = extensions_to_test[0].parent - if debug_me or debug_python_venv: - msg = "ensure_python_venv>>run(): new from extensions venv_dir {{{:s}}}" - Logs.pprint(debug_pyvenv_colour,msg.format(venv_dir_node_parent.abspath())) - else: - # Fall back to the build directory corresponding to the first source. - venv_dir_node_parent = srcs[0].parent.get_bld() - if debug_me or debug_python_venv: - msg = "ensure_python_venv>>run(): new from sources venv_dir {{{:s}}}" - Logs.pprint(debug_pyvenv_colour,msg.format(venv_dir_node_parent.abspath())) - venv_dir_node = venv_dir_node_parent.find_or_declare("venv") - venv_path = venv_dir_node.abspath() - if debug_me or debug_python_venv: - Logs.pprint(debug_pyvenv_colour,"venv path {{{!s}}}".format(venv_path)) - ##if len(bld_env.VARIANT) > 0: - ## venv_path = os.path.join(venv_path,bld_env.VARIANT) - ## if debug_me or debug_python_venv: - ## Logs.pprint(debug_pyvenv_colour,"bldnode + variant path {{{!s}}}".format(venv_path)) - #venv_path = os.path.join(venv_path,bld.path.get_bld().path_from(bld.bldnode),"venv") - #if debug_me or debug_python_venv: - # Logs.pprint(debug_pyvenv_colour,"bld.path {{{:s}}}".format(bld.path.abspath())) - # Logs.pprint(debug_pyvenv_colour,"bld.path.get_bld() {{{:s}}}".format(bld.path.get_bld().abspath())) - # msg = "ensure_python_venv>>run(): new type(venv_path) {{{!s}}} venv_path {{{!s}}}" - # Logs.pprint(debug_pyvenv_colour,msg.format(type(venv_path),venv_path)) - # Save the path for next time. - bld_env["VENV_PATH"] = venv_path - else: - if debug_python_venv: - msg = "ensure_python_venv>>run(): old type(venv_path) {{{!s}}} venv_path {{{!s}}}" - Logs.pprint(debug_pyvenv_colour,msg.format(type(venv_path),venv_path)) - venv_dir_node = bld.bldnode.find_or_declare(venv_path) - # --- Construct the list of outputs from ensure_python_venv (also used as inputs to run_python_unit_test). - # Start with the python executable. - if debug_python_venv: - Logs.pprint(debug_pyvenv_colour,"ensure_python_venv>>run(): type(bld) {{{!s}}}".format(type(bld))) - venv_outputs = [bld.bldnode.find_or_declare(os.path.join(venv_path,"bin","python"))] - # Add any extensions. - for ext_to_test in extensions_to_test: - ext_test_bld_path = ext_to_test.abspath() - ext_name = os.path.basename(ext_test_bld_path) - ext_test_dst_path = os.path.join(venv_path,"lib","python"+bld_env.PYTHON_VERSION,"site-packages",ext_name) - venv_outputs.append(bld.bldnode.find_or_declare(ext_test_dst_path)) - if debug_me: - msg = "gen_python_run: ensure_python_venv has {:d} input(s), {:d} output(s)" - Logs.pprint("CYAN",msg.format(len(extensions_to_test),len(venv_outputs))) - # --- Create the ensure_python_venv task. - epv = tgen.create_task("ensure_python_venv",extensions_to_test,venv_outputs) - # --- Create a run_python_unit_test task for each src in srcs. - for src in srcs: - # Figure out the names of the test, both when running it and when showing the results. - # The run time name should be relative to the top dir (e.g. start with "build/...."), - # but the result time name should be absolute. - src_path = src.abspath() - ####TP - test_abs_path = os.path.splitext(src.abspath())[0] - test_rel_path = test_abs_path[abs_prefix_len:] - test_name = os.path.splitext(os.path.basename(src_path))[0] # name too short - if debug_me: - Logs.pprint('CYAN','test name {{{:s}}} abs_path {{{:s}}} rel_path {{{:s}}}'.format(test_name,test_abs_path,test_rel_path)) - # Figure out the working directory (below build) for running the test, but keep it as a node, - # because we probably have to create it, given that we won't put anything there except test output - # and that happens after the test starts. - twd = src.parent.get_bld() - # Convert the test path to make it relative to the working directory. - src_path = src.path_from(twd) - if debug_me: - Logs.pprint('CYAN','test directory {{{:s}}}'.format(twd.abspath())) - Logs.pprint('CYAN','path to src {{{:s}}}'.format(src_path)) - if debug_me: - Logs.pprint('CYAN','looking for input files for '+test_name+' in '+tgen.path.path_from(tgen.path.ctx.launch_node())) - input_nodes = tgen.path.ant_glob('data/'+test_name+'/input/*.txt') - dash_v = tgen.path.ant_glob('data/'+test_name+'/v') - if len(input_nodes) > 0: - if debug_me: - Logs.pprint('CYAN','input files for '+test_name) - for idn in input_nodes: - # Assume output to be produced only if there is an expected file present in the source - odn = None - xdn = None - idf = idn.abspath() - fname = os.path.basename(idf) - if None != bld: - expected_output_name = 'data/'+test_name+'/expected/'+fname - xdn = tgen.path.find_node(expected_output_name) - if debug_me: - Logs.pprint('RED','searching for {{{:s}}} --> {:s}'.format(expected_output_name,type(xdn))) - if None != xdn: - if debug_me: - Logs.pprint('RED','found known good node{{{:s}}}'.format(xdn.path_from(xdn.ctx.launch_node()))) - # The output file needs to be in the build/variant directory, not the source directory, so use find_or_declare(). - odn = tgen.path.find_or_declare('output/'+test_name+'/'+fname) - ####TP - test_abs_path = tgen.path.get_bld().abspath() + '/' + test_name + '/' + fname - test_rel_path = test_abs_path[abs_prefix_len:] - if debug_me: - msg = "input file, output node{{{:s}}} abs {{{:s}}} rel {{{:s}}}" - Logs.pprint('RED',msg.format(odn.path_from(odn.ctx.launch_node()),test_abs_path,test_rel_path)) - (fname,ext) = os.path.splitext(fname) - if debug_me: - Logs.pprint('CYAN','generating run_python_unit_test task for %s' % fname) - Logs.pprint('CYAN',' input {{{:s}}}'.format(idn.path_from(idn.ctx.launch_node()))) - # if None != odn: Logs.pprint('CYAN',' output {{{:s}}}'.format(odn.path_from(odn.ctx.launch_node()))) - ut_inputs = venv_outputs + [idn] - ut_outputs = None if None == odn else [odn] - rut = tgen.create_task('run_python_unit_test',ut_inputs,ut_outputs,num_venv_outputs=len(venv_outputs)) - # The task name should start from the build directory, not the abspath - rut.ut_rel_name = test_rel_path - rut._name = test_abs_path - rut.ut_cwd = twd - rut.ut_test_name = test_name - if debug_me: - Logs.pprint('RED','test_name{{{:s}}} fname{{{:s}}}'.format(test_name,fname)) - if fname.startswith(test_name+'_'): - fname = fname[len(test_name)+1:] - rut.ut_label = fname if None == odn else fname+'{verified}' - # we want to add the data file as input to the unit test run task (not the unit test build) - # rut.ut_args = [src_path] + (['-v', '-f', idf] if len(dash_v) > 0 else ['-f', idf]) - rut.ut_args = [src_path] - if None != odn: - # There is expected output, so add the flag and path for actual output. - rut.ut_args += ['-o', odn.abspath()] - # Then tell the run_unit_test task to verify that actual == expected. - rut.ut_actual = odn - rut.ut_expected = xdn - else: - # No data files, just run the test program (there may still be expected output). - if debug_me: - Logs.pprint('CYAN','generating run_python_unit_test task for {{{:s}}} with no input files'.format(test_name)) - odn = None - xdn = None - fname = test_name - if None != bld: - # look for anything under the expected directory for output - if len(bld.env.VARNAME) > 0: - expected_output_name = 'data/'+test_name+'/expected/'+bld.env.VARNAME+'/*.txt' - xdn = tgen.path.ant_glob(expected_output_name) - if debug_me: - msg = 'searching {{{:s}}} for expected output {{{:s}}} --> {!s}' - Logs.pprint('RED',msg.format(tgen.path.abspath(),expected_output_name,type(xdn))) - if None == xdn or 0 == len(xdn): - expected_output_name = 'data/'+tgen.name+'/expected/*.txt' - xdn = tgen.path.ant_glob(expected_output_name) - if debug_me: - msg = 'searching {{{:s}}} for expected output {{{:s}}} --> {!s}' - Logs.pprint('RED',msg.format(tgen.path.abspath(),expected_output_name,type(xdn))) - if None != xdn and len(xdn) > 0: - if len(xdn) == 1: - xdn = xdn[0] - if debug_me: - Logs.pprint('RED','found known good node{{{:s}}}'.format(xdn.path_from(xdn.ctx.launch_node()))) - # The output file needs to be in the build/variant directory, not the source directory, so use find_or_declare(). - fname = os.path.basename(xdn.abspath()) - odn = tgen.path.find_or_declare('output/'+test_name+'/'+fname) - ####TP - test_abs_path = tgen.path.get_bld().abspath() + '/' + test_name - test_rel_path = test_abs_path[abs_prefix_len:] - if debug_me: - msg = "no input file, output node{{{:s}}} abs {{{:s}}} rel {{{:s}}}" - Logs.pprint('RED',msg.format(odn.path_from(odn.ctx.launch_node()),test_abs_path,test_rel_path)) - elif len(xdn) > 1: - xdn = None - Logs.pprint('RED','{:s}: More than one expected output with no input (ignored)'.format(fname)) - else: - if debug_me: - Logs.pprint('RED','no expected output found') - ut_inputs = venv_outputs - ut_outputs = None if None == odn else [odn] - rut = tgen.create_task('run_python_unit_test',ut_inputs,ut_outputs,num_venv_outputs=len(venv_outputs)) - if debug_me: - rut.DEBUG_ME = debug_me - Logs.pprint('RED','gen_python_run: tasks generated') - rut._name = test_abs_path # was test_name ========================================================================== - rut.ut_rel_name = test_rel_path - rut.ut_cwd = twd - rut.ut_exec = os.path.join(bld.env.VENV_PATH,"bin","python") - # rut.ut_exec = os.path.join(bld.env.VENV_PATH,"test_task") - rut.ut_test_name = test_abs_path # was test_name - rut.ut_label = fname if None == odn else fname+'{verified}' - # rut.ut_args = [src_path] + (['-v'] if len(dash_v) > 0 else []) - rut.ut_args = [src_path] - if None != odn: - # There is expected output, so add the flag and path for actual output. - rut.ut_args += ['-o', odn.abspath()] - # Then tell the run_unit_test task to verify that actual == expected. - rut.ut_actual = odn - rut.ut_expected = xdn - # Make sure the results are displayed by adding the display function to the post-build functions if not already there. - if hasattr(tgen,'bld'): - if debug_me: - Logs.pprint('CYAN','gen_run: found bld attr') - if not hasattr(tgen.bld,'post_funs') or tgen.bld.show_test_results not in tgen.bld.post_funs: - if debug_me: - Logs.pprint('CYAN','gen_run: calling bld.add_post_fun(show_test_results)') - tgen.bld.add_post_fun(tgen.bld.show_test_results) diff --git a/lib/wscript b/lib/wscript deleted file mode 100644 index 2bf8d45..0000000 --- a/lib/wscript +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env python3 -# encoding: utf-8 -# -# lib/wscript - part of TRE -# TRE library waf build script. -# -# This software is released under a BSD-style license. -# See the file LICENSE for details and copyright. -# - -from waflib import Logs,Options - -def options(opt): - pass - -debug_lib_tre_config = False -debug_lib_tre_include = False - -def configure(cfg): - if Options.options.log_wscripts: - Logs.pprint('CYAN','Configuring in {0:s}, VARIANT{{{1:s}}}'.format(cfg.path.abspath(),cfg.env['VARIANT'])) - # Logs.pprint('NORMAL','Configuring in {0:s}'.format(conf.path.abspath())) - # Extract a subset of the config values for the library config. - for vpair in cfg.variant_name_path_list: - cfg_key = vpair[1] - cfg.setenv(cfg_key) - if not cfg.env.viable: - continue - # FIXME This is a terrible way to do this, find something better - DEFKEYS="define_key" - # Save whatever defines are in cfg.env so we can restore them later - top_defines = cfg.env.DEFINES - top_defkeys = cfg.env[DEFKEYS] - subset_keys = { - "HAVE_LIBUTF8_H", - "HAVE_REG_ERRCODE_T", - "HAVE_WCHAR_H", - "HAVE_SYS_TYPES_H", - "TRE_APPROX", - "TRE_MULTIBYTE", - "TRE_WCHAR", - "TRE_WTYPE", - "TRE_VERSION", - "TRE_VERSION_1", - "TRE_VERSION_2", - "TRE_VERSION_3" - } - cfg.env.DEFINES = [] - cfg.env[DEFKEYS] = [] - for k in top_defkeys: - if debug_lib_tre_config: - Logs.pprint("CYAN","top level key {{{:s}}}".format(k)) - if k in subset_keys: - if debug_lib_tre_config: - Logs.pprint("GREEN","top level key {{{:s}}} is in subset".format(k)) - for d in top_defines: - if debug_lib_tre_config: - Logs.pprint("NORMAL"," looking at top level define {{{:s}}}".format(d)) - if d.startswith(k+'='): - if debug_lib_tre_config: - Logs.pprint("RED"," got one: '{:s}'".format(d)) - cfg.env[DEFKEYS].append(k) - cfg.env.DEFINES.append(d) - dname = ((cfg.env.VARIANT + '/') if len(cfg.env.VARIANT) > 0 else '') - incdir = "/local_includes" - dname += cfg.path.parent.get_bld().path_from(cfg.bldnode) + incdir - if debug_lib_tre_config: - Logs.pprint("YELLOW","cfg.bldnode {:s}".format(cfg.bldnode.abspath())) - Logs.pprint("YELLOW","cfg.path.get_bld {:s}".format(cfg.path.parent.get_bld().abspath())) - Logs.pprint("YELLOW","--------- {:s}".format(cfg.path.parent.get_bld().path_from(cfg.bldnode))) - Logs.pprint("CYAN","--------- {:s}".format(dname)) - fname = dname + "/tre-config.h" - cfg.write_config_header(configfile=fname,top=True,remove=False) - if debug_lib_tre_config: - Logs.pprint("GREEN","Finished {:s} for TRE regex package.".format(fname)) - cfg.env.DEFINES = top_defines - cfg.env[DEFKEYS] = top_defkeys - # Set up INCLUDES_LIBTRE for this variant, so we can say use=["LIBTRE",...] to get the include paths. - # It's a mess because some of the needed headers are in the build directory, some are in the source - # directory, some of them include others, ... - bld_parent_path = cfg.path.parent.get_bld().abspath() + '/' + cfg.env.VARIANT - incl_list = [bld_parent_path+incdir, # for tre-config.h - cfg.path.parent.get_src().abspath()+incdir, # for tre.h - bld_parent_path] # for config.h - if debug_lib_tre_include: - Logs.pprint("PINK","variant {:s} INCLUDES_LIBTRE={!s}".format(cfg.env.VARIANT,incl_list)) - cfg.env["INCLUDES_LIBTRE"] = incl_list - cfg.setenv("") - -def build(bld): - if Options.options.log_wscripts: - Logs.pprint('NORMAL','Building in {:s}, VARIANT{{{:s}}}'.format(bld.path.abspath(),bld.env.VARIANT)) - debug_install = False # bld.cmd.startswith("install") - # If we're not building for approximate matching, we need to exclude the entire approximate source code file. - excl_list = [] if bld.env.variant_ap else ["tre-match-approx.c"] - lib_nodes = bld.path.ant_glob("*.c",excl=excl_list) - # Normally we would use a 'source=lib_nodes' keyword argument directly in the - # library targets, but if we do that for both styles of library, waf builds the - # objects twice, once for each library. Instead, we build the objects once, - # explicitly, and then use the objects for both libraries. - # It might be better to do them completely separately for darwin. - # We use a distinct target path here to avoid confusion as to which one is - # being used when other targets are linking to one of the libraries. - bld.objects(features=['c'],source=lib_nodes,target="lib_objects",use=["LIBTRE"]) - # Build a static TRE library (we need a distinct name to avoid target collision) - # This builds libtre.a on a unix-like system (adds lib to target name). - # The steps required to build things are ususally deduced from the souce list, - # but since we have no sources here (only objects), we need to supply the features - # so waf can find the steps from those. - if debug_install: - Logs.pprint("CYAN","building static lib") - # The waf system won't install a static library unless it is given an install_path. - bld.stlib(features=['c','cstlib'],target="static/tre",name="static_libtre",use="lib_objects",install_path="${LIBDIR}", - DEBUG_ME=debug_install) - # Build a dynamic TRE library (we need a distinct name to avoid target collision) - # This builds libtre.so on a unix-like system (adds lib to target name). - if debug_install: - Logs.pprint("CYAN","building dynamic lib") - bld.shlib(features=['c','cshlib'],target="dynamic/tre",name="dynamic_libtre",use="lib_objects",DEBUG_ME=debug_install) - if debug_install: - Logs.pprint("CYAN","finished libs") diff --git a/local_includes/wscript b/local_includes/wscript deleted file mode 100644 index 1f947a4..0000000 --- a/local_includes/wscript +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env python3 -# encoding: utf-8 -# -# include/wscript - part of TRE -# include (headers) waf build script. -# -# This software is released under a BSD-style license. -# See the file LICENSE for details and copyright. -# - -from waflib import Logs,Options - -def options(opt): - pass - -def configure(cfg): - if Options.options.log_wscripts: - Logs.pprint('CYAN','Configuring in {:s}, VARIANT{{{:s}}}'.format(cfg.path.abspath(),cfg.env['VARIANT'])) - -def build(bld): - if Options.options.log_wscripts: - Logs.pprint("NORMAL","Building in {:s}, VARIANT{{{:s}}}".format(bld.path.abspath(),bld.env['VARIANT'])) - # tre.h includes the tre-config.h header file, but tre-config.h is in the build directory. - # The install_files() method uses "find_resource" on any paths that are not Nodes, so it fails to find - # the tre-config.h file in order to install it. Make sure we pass it in as a Node to work around this. - cfg_header_node = bld.path.find_or_declare(bld.path.get_bld().abspath() + "/tre-config.h") - # Logs.pprint("RED","tre-config node type: {!s} abspath {{{:s}}}".format(type(cfg_header_node),cfg_header_node.abspath())) - header_list = ["tre.h","regex.h",cfg_header_node] - bld.install_files("${PREFIX}/include/tre",header_list) diff --git a/po/wscript b/po/wscript deleted file mode 100644 index 576a29d..0000000 --- a/po/wscript +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python3 -# encoding: utf-8 -# -# po/wscript - part of TRE -# TRE natural language translations -# -# This software is released under a BSD-style license. -# See the file LICENSE for details and copyright. -# - -import sys,os,venv,shutil -# The ugly hack below for intltool needs to compare files and operate on waf Node objects. -import filecmp -from waflib import Logs,Options,Node -from waflib.Task import Task - - -def options(opt): - pass - -def configure(cfg): - if Options.options.log_wscripts: - Logs.pprint('CYAN','Configuring in {0:s}, VARIANT{{{1:s}}}'.format(cfg.path.abspath(),cfg.env['VARIANT'])) - # Logs.pprint('NORMAL','Configuring in {0:s}'.format(cfg.path.abspath())) - # waf version 3-2.0.25 checks for: - # - the "msgfmt' program to implement the "intltool_po" feature, and - # - the "intltool-merge" program to implement the "intltool_in" feature. - # We're only using the "intltool_po" feature here, and some systems don't - # install both together, so the stock waf release has been modified to skip the - # check(s) for unused features (see waflib/Tools/intltool.py, fn configure()). - platsys = cfg.env['PLATSYS'] - if "linux" == platsys or "freebsd" == platsys: - # Ugly ugly UGLY hack to simplify configuration on Linux for internationalization. - hacked_intltool_node = cfg.path.parent.find_node("Tools/waf/intltool.py") - # Logs.pprint("RED","hacked intltool.py type {!s}".format(type(hacked_intltool_node))) - stock_intltool_node = cfg.path.parent.ant_glob(".waf3-2.0.25-*/waflib/Tools/intltool.py") - if list == type(stock_intltool_node) and len(stock_intltool_node) > 0: - stock_intltool_node = stock_intltool_node[0] - # Logs.pprint("RED","stock intltool.py type {!s}".format(type(stock_intltool_node))) - if isinstance(stock_intltool_node,type(hacked_intltool_node)): - # We've found the stock intltool file, check to see if it needs to be replaced. - if not filecmp.cmp(stock_intltool_node.abspath(),hacked_intltool_node.abspath()): - # It does. - Logs.pprint("RED","hacking stock intltool.") - stock_intltool_node.write(hacked_intltool_node.read()) - # else: - # Logs.pprint("RED","stock intltool already hacked.") - # else: - # Logs.pprint("RED","stock intltool wrong type check.") - cfg.env.intltool_features = ["intltool_po"] - cfg.load("intltool") - -def build(bld): - if Options.options.log_wscripts or True: - Logs.pprint('NORMAL','Building in {0:s}, VARIANT{{{1:s}}}'.format(bld.path.abspath(),bld.env['VARIANT'])) - using_venv = ("VENV_PATH" in bld.env) - dest_path = bld.path.get_bld().abspath() - bld(features="intltool_po",appname="agrep",podir=".",install_path=dest_path) - if bld.changeable_task_group and bld.env.BUILD_TESTS and using_venv: - bld.set_group('test_tasks') - # Go back to the regular task group - bld.set_group('build_tasks') diff --git a/python/data/example/expected/nls_ap_nc_sb_ti/foo.txt b/python/data/example/expected/nls_ap_nc_sb_ti/foo.txt deleted file mode 100644 index 022f495..0000000 --- a/python/data/example/expected/nls_ap_nc_sb_ti/foo.txt +++ /dev/null @@ -1,41 +0,0 @@ ----- Fuzzyness with maxerr 0 -tre.Fuzzyness(delcost=1,inscost=1,maxcost=2147483647,subcost=1,maxdel=2147483647,maxerr=0,maxins=2147483647,maxsub=2147483647) ----- Fuzzyness with maxerr 3 -tre.Fuzzyness(delcost=1,inscost=1,maxcost=2147483647,subcost=1,maxdel=2147483647,maxerr=3,maxins=2147483647,maxsub=2147483647) -==== Start of tests -+++ Test 0 pattern: Don(ald( Ervin)?)? Knuth -... Subject: -In addition to fundamental contributions in several branches of -theoretical computer science, Donnald Erwin Kuth is the creator of the -TeX computer typesetting system, the related METAFONT font definition -language and rendering system, and the Computer Modern family of -typefaces. - - -~~~ Codepoint size: p=1 s=1 - len(m.groups())=3 - m.groups: ((95, 113), (99, 108), (102, 108)) - (95, 113) ---> Donnald Erwin Kuth - (99, 108) ---> ald Erwin - (102, 108) ---> Erwin - m.[0]: Donnald Erwin Kuth - m.[1]: ald Erwin - m.[2]: Erwin -=== Test 0 passed -+++ Test 1 pattern: xyzzy -... Subject: qqsvxyzzyaabbcc -~~~ Codepoint size: p=1 s=1 - len(m.groups())=1 - m.groups: ((4, 9),) - (4, 9) ---> xyzzy - m.[0]: xyzzy -=== Test 1 passed -+++ Test 2 pattern: xyzzy -... Subject: qqsvxyzzyaabbccđžš -~~~ Codepoint size: p=1 s=2 -XXX Test 2 failed (ValueError in search(qqsvxyzzyaabbccđžš) --> In search(), this build of TRE does not support characters with codepoints that cannot fit in a byte. -+++ Test 3 pattern: xyzzy -... Subject: qqsvxyzzyaabbcc😀 -~~~ Codepoint size: p=1 s=4 -XXX Test 3 failed (ValueError in search(qqsvxyzzyaabbcc😀) --> In search(), this build of TRE does not support characters with codepoints that cannot fit in a byte. -#### 2 passed, 2 failed. diff --git a/python/data/example/expected/nls_ap_wc_mb_ti/foo.txt b/python/data/example/expected/nls_ap_wc_mb_ti/foo.txt deleted file mode 100644 index 4ed54ad..0000000 --- a/python/data/example/expected/nls_ap_wc_mb_ti/foo.txt +++ /dev/null @@ -1,49 +0,0 @@ ----- Fuzzyness with maxerr 0 -tre.Fuzzyness(delcost=1,inscost=1,maxcost=2147483647,subcost=1,maxdel=2147483647,maxerr=0,maxins=2147483647,maxsub=2147483647) ----- Fuzzyness with maxerr 3 -tre.Fuzzyness(delcost=1,inscost=1,maxcost=2147483647,subcost=1,maxdel=2147483647,maxerr=3,maxins=2147483647,maxsub=2147483647) -==== Start of tests -+++ Test 0 pattern: Don(ald( Ervin)?)? Knuth -... Subject: -In addition to fundamental contributions in several branches of -theoretical computer science, Donnald Erwin Kuth is the creator of the -TeX computer typesetting system, the related METAFONT font definition -language and rendering system, and the Computer Modern family of -typefaces. - - -~~~ Codepoint size: p=1 s=1 - len(m.groups())=3 - m.groups: ((95, 113), (99, 108), (102, 108)) - (95, 113) ---> Donnald Erwin Kuth - (99, 108) ---> ald Erwin - (102, 108) ---> Erwin - m.[0]: Donnald Erwin Kuth - m.[1]: ald Erwin - m.[2]: Erwin -=== Test 0 passed -+++ Test 1 pattern: xyzzy -... Subject: qqsvxyzzyaabbcc -~~~ Codepoint size: p=1 s=1 - len(m.groups())=1 - m.groups: ((4, 9),) - (4, 9) ---> xyzzy - m.[0]: xyzzy -=== Test 1 passed -+++ Test 2 pattern: xyzzy -... Subject: qqsvxyzzyaabbccđžš -~~~ Codepoint size: p=1 s=2 - len(m.groups())=1 - m.groups: ((4, 9),) - (4, 9) ---> xyzzy - m.[0]: xyzzy -=== Test 2 passed -+++ Test 3 pattern: xyzzy -... Subject: qqsvxyzzyaabbcc😀 -~~~ Codepoint size: p=1 s=4 - len(m.groups())=1 - m.groups: ((4, 9),) - (4, 9) ---> xyzzy - m.[0]: xyzzy -=== Test 3 passed -#### All 4 tests passed. diff --git a/python/data/example/expected/nls_ap_wc_sb_ti/foo.txt b/python/data/example/expected/nls_ap_wc_sb_ti/foo.txt deleted file mode 100644 index 4ed54ad..0000000 --- a/python/data/example/expected/nls_ap_wc_sb_ti/foo.txt +++ /dev/null @@ -1,49 +0,0 @@ ----- Fuzzyness with maxerr 0 -tre.Fuzzyness(delcost=1,inscost=1,maxcost=2147483647,subcost=1,maxdel=2147483647,maxerr=0,maxins=2147483647,maxsub=2147483647) ----- Fuzzyness with maxerr 3 -tre.Fuzzyness(delcost=1,inscost=1,maxcost=2147483647,subcost=1,maxdel=2147483647,maxerr=3,maxins=2147483647,maxsub=2147483647) -==== Start of tests -+++ Test 0 pattern: Don(ald( Ervin)?)? Knuth -... Subject: -In addition to fundamental contributions in several branches of -theoretical computer science, Donnald Erwin Kuth is the creator of the -TeX computer typesetting system, the related METAFONT font definition -language and rendering system, and the Computer Modern family of -typefaces. - - -~~~ Codepoint size: p=1 s=1 - len(m.groups())=3 - m.groups: ((95, 113), (99, 108), (102, 108)) - (95, 113) ---> Donnald Erwin Kuth - (99, 108) ---> ald Erwin - (102, 108) ---> Erwin - m.[0]: Donnald Erwin Kuth - m.[1]: ald Erwin - m.[2]: Erwin -=== Test 0 passed -+++ Test 1 pattern: xyzzy -... Subject: qqsvxyzzyaabbcc -~~~ Codepoint size: p=1 s=1 - len(m.groups())=1 - m.groups: ((4, 9),) - (4, 9) ---> xyzzy - m.[0]: xyzzy -=== Test 1 passed -+++ Test 2 pattern: xyzzy -... Subject: qqsvxyzzyaabbccđžš -~~~ Codepoint size: p=1 s=2 - len(m.groups())=1 - m.groups: ((4, 9),) - (4, 9) ---> xyzzy - m.[0]: xyzzy -=== Test 2 passed -+++ Test 3 pattern: xyzzy -... Subject: qqsvxyzzyaabbcc😀 -~~~ Codepoint size: p=1 s=4 - len(m.groups())=1 - m.groups: ((4, 9),) - (4, 9) ---> xyzzy - m.[0]: xyzzy -=== Test 3 passed -#### All 4 tests passed. diff --git a/python/data/example/expected/sls_ap_nc_sb_ti/foo.txt b/python/data/example/expected/sls_ap_nc_sb_ti/foo.txt deleted file mode 100644 index 022f495..0000000 --- a/python/data/example/expected/sls_ap_nc_sb_ti/foo.txt +++ /dev/null @@ -1,41 +0,0 @@ ----- Fuzzyness with maxerr 0 -tre.Fuzzyness(delcost=1,inscost=1,maxcost=2147483647,subcost=1,maxdel=2147483647,maxerr=0,maxins=2147483647,maxsub=2147483647) ----- Fuzzyness with maxerr 3 -tre.Fuzzyness(delcost=1,inscost=1,maxcost=2147483647,subcost=1,maxdel=2147483647,maxerr=3,maxins=2147483647,maxsub=2147483647) -==== Start of tests -+++ Test 0 pattern: Don(ald( Ervin)?)? Knuth -... Subject: -In addition to fundamental contributions in several branches of -theoretical computer science, Donnald Erwin Kuth is the creator of the -TeX computer typesetting system, the related METAFONT font definition -language and rendering system, and the Computer Modern family of -typefaces. - - -~~~ Codepoint size: p=1 s=1 - len(m.groups())=3 - m.groups: ((95, 113), (99, 108), (102, 108)) - (95, 113) ---> Donnald Erwin Kuth - (99, 108) ---> ald Erwin - (102, 108) ---> Erwin - m.[0]: Donnald Erwin Kuth - m.[1]: ald Erwin - m.[2]: Erwin -=== Test 0 passed -+++ Test 1 pattern: xyzzy -... Subject: qqsvxyzzyaabbcc -~~~ Codepoint size: p=1 s=1 - len(m.groups())=1 - m.groups: ((4, 9),) - (4, 9) ---> xyzzy - m.[0]: xyzzy -=== Test 1 passed -+++ Test 2 pattern: xyzzy -... Subject: qqsvxyzzyaabbccđžš -~~~ Codepoint size: p=1 s=2 -XXX Test 2 failed (ValueError in search(qqsvxyzzyaabbccđžš) --> In search(), this build of TRE does not support characters with codepoints that cannot fit in a byte. -+++ Test 3 pattern: xyzzy -... Subject: qqsvxyzzyaabbcc😀 -~~~ Codepoint size: p=1 s=4 -XXX Test 3 failed (ValueError in search(qqsvxyzzyaabbcc😀) --> In search(), this build of TRE does not support characters with codepoints that cannot fit in a byte. -#### 2 passed, 2 failed. diff --git a/python/data/example/expected/sls_ap_wc_mb_ti/foo.txt b/python/data/example/expected/sls_ap_wc_mb_ti/foo.txt deleted file mode 100644 index 4ed54ad..0000000 --- a/python/data/example/expected/sls_ap_wc_mb_ti/foo.txt +++ /dev/null @@ -1,49 +0,0 @@ ----- Fuzzyness with maxerr 0 -tre.Fuzzyness(delcost=1,inscost=1,maxcost=2147483647,subcost=1,maxdel=2147483647,maxerr=0,maxins=2147483647,maxsub=2147483647) ----- Fuzzyness with maxerr 3 -tre.Fuzzyness(delcost=1,inscost=1,maxcost=2147483647,subcost=1,maxdel=2147483647,maxerr=3,maxins=2147483647,maxsub=2147483647) -==== Start of tests -+++ Test 0 pattern: Don(ald( Ervin)?)? Knuth -... Subject: -In addition to fundamental contributions in several branches of -theoretical computer science, Donnald Erwin Kuth is the creator of the -TeX computer typesetting system, the related METAFONT font definition -language and rendering system, and the Computer Modern family of -typefaces. - - -~~~ Codepoint size: p=1 s=1 - len(m.groups())=3 - m.groups: ((95, 113), (99, 108), (102, 108)) - (95, 113) ---> Donnald Erwin Kuth - (99, 108) ---> ald Erwin - (102, 108) ---> Erwin - m.[0]: Donnald Erwin Kuth - m.[1]: ald Erwin - m.[2]: Erwin -=== Test 0 passed -+++ Test 1 pattern: xyzzy -... Subject: qqsvxyzzyaabbcc -~~~ Codepoint size: p=1 s=1 - len(m.groups())=1 - m.groups: ((4, 9),) - (4, 9) ---> xyzzy - m.[0]: xyzzy -=== Test 1 passed -+++ Test 2 pattern: xyzzy -... Subject: qqsvxyzzyaabbccđžš -~~~ Codepoint size: p=1 s=2 - len(m.groups())=1 - m.groups: ((4, 9),) - (4, 9) ---> xyzzy - m.[0]: xyzzy -=== Test 2 passed -+++ Test 3 pattern: xyzzy -... Subject: qqsvxyzzyaabbcc😀 -~~~ Codepoint size: p=1 s=4 - len(m.groups())=1 - m.groups: ((4, 9),) - (4, 9) ---> xyzzy - m.[0]: xyzzy -=== Test 3 passed -#### All 4 tests passed. diff --git a/python/data/example/expected/sls_ap_wc_sb_ti/foo.txt b/python/data/example/expected/sls_ap_wc_sb_ti/foo.txt deleted file mode 100644 index 4ed54ad..0000000 --- a/python/data/example/expected/sls_ap_wc_sb_ti/foo.txt +++ /dev/null @@ -1,49 +0,0 @@ ----- Fuzzyness with maxerr 0 -tre.Fuzzyness(delcost=1,inscost=1,maxcost=2147483647,subcost=1,maxdel=2147483647,maxerr=0,maxins=2147483647,maxsub=2147483647) ----- Fuzzyness with maxerr 3 -tre.Fuzzyness(delcost=1,inscost=1,maxcost=2147483647,subcost=1,maxdel=2147483647,maxerr=3,maxins=2147483647,maxsub=2147483647) -==== Start of tests -+++ Test 0 pattern: Don(ald( Ervin)?)? Knuth -... Subject: -In addition to fundamental contributions in several branches of -theoretical computer science, Donnald Erwin Kuth is the creator of the -TeX computer typesetting system, the related METAFONT font definition -language and rendering system, and the Computer Modern family of -typefaces. - - -~~~ Codepoint size: p=1 s=1 - len(m.groups())=3 - m.groups: ((95, 113), (99, 108), (102, 108)) - (95, 113) ---> Donnald Erwin Kuth - (99, 108) ---> ald Erwin - (102, 108) ---> Erwin - m.[0]: Donnald Erwin Kuth - m.[1]: ald Erwin - m.[2]: Erwin -=== Test 0 passed -+++ Test 1 pattern: xyzzy -... Subject: qqsvxyzzyaabbcc -~~~ Codepoint size: p=1 s=1 - len(m.groups())=1 - m.groups: ((4, 9),) - (4, 9) ---> xyzzy - m.[0]: xyzzy -=== Test 1 passed -+++ Test 2 pattern: xyzzy -... Subject: qqsvxyzzyaabbccđžš -~~~ Codepoint size: p=1 s=2 - len(m.groups())=1 - m.groups: ((4, 9),) - (4, 9) ---> xyzzy - m.[0]: xyzzy -=== Test 2 passed -+++ Test 3 pattern: xyzzy -... Subject: qqsvxyzzyaabbcc😀 -~~~ Codepoint size: p=1 s=4 - len(m.groups())=1 - m.groups: ((4, 9),) - (4, 9) ---> xyzzy - m.[0]: xyzzy -=== Test 3 passed -#### All 4 tests passed. diff --git a/python/wscript b/python/wscript deleted file mode 100644 index 99051a4..0000000 --- a/python/wscript +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env python3 -# encoding: utf-8 -# -# python/wscript - part of TRE -# TRE python extension waf build script. -# -# This software is released under a BSD-style license. -# See the file LICENSE for details and copyright. -# - -import sys,os,venv,shutil -from waflib import Logs,Options -from waflib.Task import Task - -import python_unit_tests - -debug_python_venv = False - -class no_lib64_symlink_EnvBuilder(venv.EnvBuilder): - """ - Override the EnvBuilder code that does a symlink to avoid problems with remote filesystems (see the use in configure() below). - """ - - def __init__(self,*args,**kwargs): - super().__init__(*args,**kwargs) - - def ensure_directories(self,env_dir): - # 1. Create the lib64 directory first, which stops the super().ensure_directories() from creating it as a symlink - lib64_path = os.path.join(env_dir,"lib64") - if not os.path.exists(lib64_path): - os.makedirs(lib64_path) - # 2. Use super().ensure_directories(env_dir) to do the rest of the work. - context = super().ensure_directories(env_dir) - # 3. Copy everything below lib to lib64. - shutil.copytree(os.path.join(env_dir,"lib"),lib64_path,dirs_exist_ok=True) - # return the super's return value - return context - -def options(opt): - opt.load("python") - -def configure(cfg): - if Options.options.log_wscripts: - Logs.pprint('CYAN','Configuring in {0:s}, VARIANT{{{1:s}}}'.format(cfg.path.abspath(),cfg.env['VARIANT'])) - # Force loading python3 instead of python - if "windows" != cfg.env.PLATSYS: - cfg.find_program("python3",var="PYTHON") - cfg.load("python") - cfg.check_python_headers() - # cfg.test_pyext("c") - #========== testing --> make sure we have a virtual env set up in the build directory. - # PYTHON_VERSION' '3.9' lib/python3.9/site-packages - for cfg_key in cfg.all_envs: - if "" == cfg_key or cfg.all_envs[""].PLATSYS == cfg_key: - # Skip the original env, and the platform specific one. All we want here is the variants. - continue - var_env = cfg.all_envs[cfg_key] - cfg.setenv(cfg_key) - if not cfg.env.viable: - # We aren't building libtre here, so there is no point in looking at the python extension. - continue - if not cfg.env.variant_ap or not cfg.env.variant_ti: - # The python extension needs approximate matching and the TRE native interface (not the system regex interface). - # We can still build libtre but the python extension won't work. - cfg.env.viable_python_ext = False - continue - cfg.env.viable_python_ext = True - cfg.setenv("") - # Turn off install of .pyc and .pyo files (and hence building them) since we're not - # building anything with python source, only testing with it. - cfg.env.PYC = 0 - cfg.env.PYO = 0 - -def build(bld): - if not bld.env.viable_python_ext: - if Options.options.log_wscripts: - msg = "Skipping build in {:s}, VARIANT{{{:s}}} (python extension not viable in variant)" - Logs.pprint("NORMAL",msg.format(bld.path.abspath(),bld.env['VARIANT'])) - return - if Options.options.log_wscripts: - Logs.pprint('NORMAL','Building in {:s}, VARIANT{{{:s}}}'.format(bld.path.abspath(),bld.env['VARIANT'])) - tre_py_nodes = bld.path.ant_glob('*.c') - # The "pyext" feature will modify the final component of the path as needed (e.g. adding the PYTAG). - py_ext_path = "tre" - # Use the static libtre for the python extension, so we only have to install one library for testing. - tre_python = bld(features=["c","cshlib","pyext"],source=tre_py_nodes,target=py_ext_path,name="tre_python",use=["LIBTRE","static_libtre"]) - # FIXME: Any particular variant will be either 32 or 64-bit, but there is only one exentsion per variant. - # if sys.maxsize > 2**32 and "windows" != bld_env.PLATSYS: - # # Just build it again for lib64, because it is too complicated to figure out where python is going to look for it. - # py_ext_path64 = "tre64" - # tre_python64 = bld(features=["c","cshlib","pyext"],source=tre_py_nodes,target=py_ext_path64, - # name="tre_python64",use=["LIBTRE","static_libtre"]) - if bld.changeable_task_group and bld.env.BUILD_TESTS: - debug_unit_test = False - # Build and run the tests. - tre_python.post() # So we can get the link_task.outputs[0] - # Logs.pprint("YELLOW","tre_python.tasks = {!s}".format(tre_python.tasks)) - # Logs.pprint("YELLOW","type(tre_python.link_task) = {!s}".format(type(tre_python.link_task))) - # Logs.pprint("YELLOW","tre_python.link_task = {!s}".format(tre_python.link_task)) - # Logs.pprint("YELLOW","type(tre_python.link_task.outputs[0]) = {!s}".format(type(tre_python.link_task.outputs[0]))) - # Logs.pprint("YELLOW","tre_python.link_task.outputs[0] = {!s}".format(tre_python.link_task.outputs[0])) - py_ext_node = tre_python.link_task.outputs[0] # the extension node - test_node = bld.path.find_node("example.py") - # Put the tests in a different group from the build targets to avoid having to figure out indirect dependencies. - bld.set_group('test_tasks') - # bld.DEBUG_PATH = debug_unit_test - bld(features="python_unit_test",source=[test_node],extensions_to_test=[py_ext_node],DEBUG_ME=debug_unit_test,install_path=None) - # Go back to the regular task group - bld.set_group('build_tasks') diff --git a/src/wscript b/src/wscript deleted file mode 100644 index e8b50ce..0000000 --- a/src/wscript +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python3 -# encoding: utf-8 -# -# src/wscript - part of TRE -# agrep waf build script. -# -# This software is released under a BSD-style license. -# See the file LICENSE for details and copyright. -# - -from waflib import Logs,Options - -def options(opt): - pass - -def configure(cfg): - if Options.options.log_wscripts: - Logs.pprint('CYAN','Configuring in {:s}, VARIANT{{{:s}}}'.format(cfg.path.abspath(),cfg.env['VARIANT'])) - # Check for the headers in agrep that are not already handled at the top level. - cfg.check(features="c cprogram",header_name="locale.h",mandatory=True) - cfg.check(features="c cprogram",header_name="fcntl.h",mandatory=True) - # datarootdir ${prefix}/share - if "freebsd" == cfg.env.PLATSYS or "linux" == cfg.env.PLATSYS: - cfg.env["DEFINES_AGREP"] = ['LOCALEDIR=\"/usr/local/share/locale\"'] - cfg.env["LIBPATH_AGREP"] = ["/usr/local/lib"] - if "freebsd" == cfg.env.PLATSYS: - # On debian, ubuntu, linux mint the libintl functions are part of the base C runtime (glibc) (i.e. we only need this for freebsd). - cfg.env["LIB_AGREP"] = ["intl"] - -def build(bld): - if Options.options.log_wscripts: - Logs.pprint("NORMAL","Building in {:s}, VARIANT{{{:s}}}".format(bld.path.abspath(),bld.env['VARIANT'])) - agrep_nodes = bld.path.ant_glob("*.c") - # Use the static libtre for agrep - agrep_task_gen = bld.program(source=agrep_nodes,target="agrep",use=["AGREP","LIBTRE","static_libtre"]) - # If we want an agrep that uses the dynamic library instead: - # bld.program(source=agrep_nodes,target="agrep",use=["AGREP","LIBTRE","dynamic_libtre"]) - if bld.changeable_task_group and bld.env.BUILD_TESTS: - # Prepare for building and running tests - agrep_task_gen.post() # So we can get the link_task.outputs[0] - bld.env.AGREP_NODE = agrep_task_gen.link_task.outputs[0] # the specific agrep variant we will want to test diff --git a/tests/agrep/wscript b/tests/agrep/wscript deleted file mode 100755 index b0752e6..0000000 --- a/tests/agrep/wscript +++ /dev/null @@ -1,203 +0,0 @@ -#!/usr/bin/env python3 -# encoding: utf-8 -# -# tests/agrep/wscript - part of TRE -# test driver for agrep waf build script. -# -# This software is released under a BSD-style license. -# See the file LICENSE for details and copyright. -# - -from waflib import Logs,Options,Task,Utils -import os,shutil - -import lib_unit_tests - -debug_agrep_tests = False -debug_at_colour = "PINK" -debug_agrep_test_name = False - -def options(opt): - pass - -def configure(cfg): - if Options.options.log_wscripts: - Logs.pprint('CYAN','Configuring in {:s}, VARIANT{{{!s}}}'.format(cfg.path.abspath(),cfg.env["VARIANT"])) - -class run_agrep_test(Task.Task): - """ - This is essentially a unit test, but it is so specific to agrep that there is no point trying to make it a general class. - """ - color = 'CYAN' - # after = ['vnum','inst'] - vars=[] - def __init__(self,*args,**kw): - # (self,base_name,agrep_node,test_args_node,input_path,expected_output_path,actual_output_path): - if debug_agrep_test_name: - Logs.pprint(debug_at_colour,"kw={!s}".format(kw)) - Logs.pprint(debug_at_colour,"self.bld = {!s}".format(getattr(self,'bld',None))) - Logs.pprint(debug_at_colour,"self.generator = {!s}".format(getattr(self,'generator',None))) - super(run_agrep_test,self).__init__(*args,**kw) - self.name = "agrep_"+args[0]+"_test" - # self.agrep_node = args[1] - # self.test_args_node = args[2] - # self.input_node = args[3] - # self.expected_output_node = args[4] - # self.actual_output_node = args[5] - self.inputs = [args[1],args[2],args[3],args[4]] - self.outputs = [args[5]] - if "bld" not in kw: - self.abs_prefix_len = 0 - else: - self.abs_prefix_len = len(kw["bld"].srcnode.abspath()) + 1 # allow for trailing '/' on prefix - def __str__(self): - return self.outputs[0].abspath()[self.abs_prefix_len:-4] - def keyword(self): - return "Testing" - def runnable_status(self): - ret = super(run_agrep_test,self).runnable_status() - if ret == Task.SKIP_ME: - # Task has been run before (it is up to date). - # Always run the unit tests again if they are runnable - return Task.RUN_ME - return ret - def run(self): - # There can be multiple instances of this running (with different args_files) in parallel, - # so the log output can be intermixed and very confusing. - agrep_pgm = self.inputs[0].abspath() - args_file_name = self.inputs[1].abspath() - input_file_name = self.inputs[2].abspath() - short_input_name = os.path.basename(input_file_name) - if short_input_name.endswith(".input"): - short_input_name = short_input_name[0:-3] # get rid of "put" to match "make check" output - expected_output_name = self.inputs[3].abspath() # used by diff at end. - actual_output_name = self.outputs[0].abspath() - # Argh. To match the "make check" expected output, we need to copy the input file to something ending in ".in" instead of ".input" - cwd = self.outputs[0].parent.abspath() - short_input_path = os.path.join(cwd,short_input_name) - shutil.copyfile(input_file_name,short_input_path) - if debug_agrep_tests: - Logs.pprint("RED","for {:s} cwd={:s}".format(short_input_name,cwd)) - try: - # Try for the stashed OS environment. - fu = getattr(self.generator.bld,'all_agrep_paths') - except AttributeError: - # Make a copy of the OS environment and stash it. - fu = os.environ.copy() - self.generator.bld.all_agrep_paths = fu - extras = ["","-c","-H","-l","-n","-s","-M","--show-position","--color","-H -n -s --color --show-position"] - with open(actual_output_name,'wb') as out_file: - with open(args_file_name,'r') as args_file: - for args_line in args_file: - if args_line.startswith('#'): - continue - args_line = args_line.rstrip() # get rid of trailing newline - # Note that the args_line has all kinds of funky stuff in it, quote it if any other interpreter is going to see it. - if debug_agrep_tests: - Logs.pprint("CYAN","args line: {{{:s}}}".format(args_line)) - for flags in extras: - cmd = [agrep_pgm] - tst = "#### TEST: agrep" - if len(flags) > 0: - lst = flags.split() - for f in lst: - tst += " "+f - cmd += lst - else: - tst += " " - if len(args_line) > 0: - lst = args_line.split() - for a in lst: - tst += " "+a - cmd += lst - cmd_1 = cmd + [short_input_name] - if debug_agrep_tests: - Logs.pprint(debug_at_colour,"{:s} {:s}".format(tst,input_file_name)) - out_file.write(bytes("{:s} {:s}\n".format(tst,short_input_name),'iso-8859-1')) - # Use stderr=Utils.subprocess.STDOUT instead of stderr=Utils.subprocess.PIPE to see actual error message, - # but it disagrees with the expected output. - proc = Utils.subprocess.Popen(cmd_1,executable=agrep_pgm,cwd=cwd,env=fu, - stderr=Utils.subprocess.PIPE,stdout=Utils.subprocess.PIPE) - (stdout_lines,stderr_lines) = proc.communicate() - status = proc.returncode - if None != stdout_lines: - out_file.write(stdout_lines) - out_file.write(bytes("\nExit status {:d}.\n".format(status),'iso-8859-1')) - if debug_agrep_tests: - Logs.pprint(debug_at_colour,"{:s} < {:s}".format(tst,input_file_name)) - out_file.write(bytes("{:s} < {:s}\n".format(tst,short_input_name),'iso-8859-1')) - with open(input_file_name,"r") as in_file: - # See above re stderr for messages. - proc = Utils.subprocess.Popen(cmd,executable=agrep_pgm,cwd=cwd,env=fu,stdin=in_file, - stderr=Utils.subprocess.PIPE,stdout=Utils.subprocess.PIPE) - (stdout_lines,stderr_lines) = proc.communicate() - status = proc.returncode - if None != stdout_lines: - out_file.write(stdout_lines) - out_file.write(bytes("\nExit status {:d}.\n".format(status),'iso-8859-1')) - # Compare the actual output to the expected output. - short_output_name = os.path.basename(actual_output_name) - diff_args = ['diff','-qba',short_output_name,expected_output_name] - diff_exec = self.generator.bld.env.DIFF - # Logs.pprint('YELLOW','type(diff_exec)={:s}'.format(type(diff_exec))) - if list == type(diff_exec): - # Just take the first one. - diff_exec = diff_exec[0] - # Logs.pprint('YELLOW','type(cwd)={:s}'.format(type(cwd))) - diff_proc = Utils.subprocess.Popen(diff_args,executable=diff_exec,cwd=cwd,env=fu,stderr=Utils.subprocess.PIPE,stdout=Utils.subprocess.PIPE) - (diff_stdout,diff_stderr) = diff_proc.communicate() - rc = diff_proc.returncode - filename = os.path.join(cwd,short_input_name[0:-3]) - filename += " (" + short_output_name + ('{verified}' if 0 == rc else "") + ')' - tup = (filename,rc,diff_stdout,diff_stderr) - self.generator.utest_result = tup - lib_unit_tests.testlock.acquire() - try: - bld = self.generator.bld - Logs.debug("ut: %r",tup) - try: - bld.utest_results.append(tup) - except AttributeError: - bld.utest_results=[tup] - finally: - lib_unit_tests.testlock.release() - -def build(bld): - if Options.options.log_wscripts: - Logs.pprint('NORMAL','Building in {0:s}, VARIANT{{{1:s}}}'.format(bld.path.abspath(),bld.env["VARIANT"])) - if not bld.env.BUILD_TESTS or not bld.changeable_task_group or not bld.env.variant_ap: - return - # Build and run the tests. - # This is meant to reproduce the effect of the run-tests.sh shell script. - # For each *.args file, and each set of command line flags in extra_flags, run agrep twice for each line in the - # *.args file using the corresponding *.input file (once with the input filename as a command line arg, and once - # with the input filename as standard input). - bld.set_group('test_tasks') - agrep_node = bld.env.AGREP_NODE - if debug_agrep_tests: - Logs.pprint(debug_at_colour,"AGREP_NODE={:s}".format(agrep_node.abspath())) - test_args_nodes = bld.path.ant_glob("*.args") - # Make sure we have a directory in the build hierarchy - for test_args_node in test_args_nodes: - test_args_name = test_args_node.abspath() - base_name_with_ext = os.path.basename(test_args_name) - base_name = os.path.splitext(base_name_with_ext)[0] - input_node = bld.path.find_node(base_name+".input") - expected_output_node = bld.path.find_node(base_name+".ok") - actual_output_name = base_name + ".out" - # actual_output_node = bld.path.get_bld().make_node(base_name+".out") - actual_output_node = bld.path.find_or_declare(actual_output_name) - if debug_agrep_tests: - Logs.pprint(debug_at_colour,"test args file: {{{:s}}}".format(test_args_name)) - Logs.pprint(debug_at_colour,"base_name_with_ext: {{{:s}}}".format(base_name_with_ext)) - Logs.pprint(debug_at_colour,"base_name: {{{:s}}}".format(base_name)) - Logs.pprint(debug_at_colour,"input: {{{:s}}}".format(input_node.abspath())) - Logs.pprint(debug_at_colour,"expected_output: {{{:s}}}".format(expected_output_node.abspath())) - Logs.pprint(debug_at_colour,"actual_output: {{{:s}}}".format(actual_output_node.abspath())) - # The run-tests.sh script runs agrep many times, accumlating the output and then diffing the accumulation with expected. - # To match that (and use the same input and expected output files) we need a specialized task that does everything in - # order and not a bunch of individual tasks executed in (near) random order. - agrep_test = run_agrep_test(base_name,agrep_node,test_args_node,input_node,expected_output_node,actual_output_node,bld=bld,env=bld.env) - bld.add_to_group(agrep_test) - # Go back to the regular task group - bld.set_group('build_tasks') diff --git a/tests/data/retest/expected/nls_ap_nc_sb_ri/foo.txt b/tests/data/retest/expected/nls_ap_nc_sb_ri/foo.txt deleted file mode 100644 index 4c46ed5..0000000 --- a/tests/data/retest/expected/nls_ap_nc_sb_ri/foo.txt +++ /dev/null @@ -1,90 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################# -Testing LC_CTYPE en_US.ISO-8859-1 -## -############## -All 7253 tests passed. diff --git a/tests/data/retest/expected/nls_ap_nc_sb_ti/foo.txt b/tests/data/retest/expected/nls_ap_nc_sb_ti/foo.txt deleted file mode 100644 index 4c46ed5..0000000 --- a/tests/data/retest/expected/nls_ap_nc_sb_ti/foo.txt +++ /dev/null @@ -1,90 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################# -Testing LC_CTYPE en_US.ISO-8859-1 -## -############## -All 7253 tests passed. diff --git a/tests/data/retest/expected/nls_ap_wc_mb_ri/foo.txt b/tests/data/retest/expected/nls_ap_wc_mb_ri/foo.txt deleted file mode 100644 index a8fd36e..0000000 --- a/tests/data/retest/expected/nls_ap_wc_mb_ri/foo.txt +++ /dev/null @@ -1,92 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############## -Testing LC_CTYPE en_US.ISO-8859-1 -################ -Testing LC_CTYPE ja_JP.eucjp -###################################### -All 7311 tests passed. diff --git a/tests/data/retest/expected/nls_ap_wc_mb_ti/foo.txt b/tests/data/retest/expected/nls_ap_wc_mb_ti/foo.txt deleted file mode 100644 index a8fd36e..0000000 --- a/tests/data/retest/expected/nls_ap_wc_mb_ti/foo.txt +++ /dev/null @@ -1,92 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############## -Testing LC_CTYPE en_US.ISO-8859-1 -################ -Testing LC_CTYPE ja_JP.eucjp -###################################### -All 7311 tests passed. diff --git a/tests/data/retest/expected/nls_ap_wc_sb_ri/foo.txt b/tests/data/retest/expected/nls_ap_wc_sb_ri/foo.txt deleted file mode 100644 index f447326..0000000 --- a/tests/data/retest/expected/nls_ap_wc_sb_ri/foo.txt +++ /dev/null @@ -1,90 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############## -Testing LC_CTYPE en_US.ISO-8859-1 -################ -All 7270 tests passed. diff --git a/tests/data/retest/expected/nls_ap_wc_sb_ti/foo.txt b/tests/data/retest/expected/nls_ap_wc_sb_ti/foo.txt deleted file mode 100644 index f447326..0000000 --- a/tests/data/retest/expected/nls_ap_wc_sb_ti/foo.txt +++ /dev/null @@ -1,90 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############## -Testing LC_CTYPE en_US.ISO-8859-1 -################ -All 7270 tests passed. diff --git a/tests/data/retest/expected/nls_ex_nc_sb_ri/foo.txt b/tests/data/retest/expected/nls_ex_nc_sb_ri/foo.txt deleted file mode 100644 index 7ce2c44..0000000 --- a/tests/data/retest/expected/nls_ex_nc_sb_ri/foo.txt +++ /dev/null @@ -1,87 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -################################################################## -Testing LC_CTYPE en_US.ISO-8859-1 -############# -### -All 6983 tests passed. diff --git a/tests/data/retest/expected/nls_ex_nc_sb_ti/foo.txt b/tests/data/retest/expected/nls_ex_nc_sb_ti/foo.txt deleted file mode 100644 index 7ce2c44..0000000 --- a/tests/data/retest/expected/nls_ex_nc_sb_ti/foo.txt +++ /dev/null @@ -1,87 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -################################################################## -Testing LC_CTYPE en_US.ISO-8859-1 -############# -### -All 6983 tests passed. diff --git a/tests/data/retest/expected/nls_ex_wc_mb_ri/foo.txt b/tests/data/retest/expected/nls_ex_wc_mb_ri/foo.txt deleted file mode 100644 index b5ab352..0000000 --- a/tests/data/retest/expected/nls_ex_wc_mb_ri/foo.txt +++ /dev/null @@ -1,89 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -### -Testing LC_CTYPE en_US.ISO-8859-1 -################ -Testing LC_CTYPE ja_JP.eucjp -###################################### -All 7041 tests passed. diff --git a/tests/data/retest/expected/nls_ex_wc_mb_ti/foo.txt b/tests/data/retest/expected/nls_ex_wc_mb_ti/foo.txt deleted file mode 100644 index b5ab352..0000000 --- a/tests/data/retest/expected/nls_ex_wc_mb_ti/foo.txt +++ /dev/null @@ -1,89 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -### -Testing LC_CTYPE en_US.ISO-8859-1 -################ -Testing LC_CTYPE ja_JP.eucjp -###################################### -All 7041 tests passed. diff --git a/tests/data/retest/expected/nls_ex_wc_sb_ri/foo.txt b/tests/data/retest/expected/nls_ex_wc_sb_ri/foo.txt deleted file mode 100644 index 58d2e9d..0000000 --- a/tests/data/retest/expected/nls_ex_wc_sb_ri/foo.txt +++ /dev/null @@ -1,87 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -### -Testing LC_CTYPE en_US.ISO-8859-1 -################ -All 7000 tests passed. diff --git a/tests/data/retest/expected/nls_ex_wc_sb_ti/foo.txt b/tests/data/retest/expected/nls_ex_wc_sb_ti/foo.txt deleted file mode 100644 index 58d2e9d..0000000 --- a/tests/data/retest/expected/nls_ex_wc_sb_ti/foo.txt +++ /dev/null @@ -1,87 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -### -Testing LC_CTYPE en_US.ISO-8859-1 -################ -All 7000 tests passed. diff --git a/tests/data/retest/expected/sls_ap_nc_sb_ri/foo.txt b/tests/data/retest/expected/sls_ap_nc_sb_ri/foo.txt deleted file mode 100644 index 4c46ed5..0000000 --- a/tests/data/retest/expected/sls_ap_nc_sb_ri/foo.txt +++ /dev/null @@ -1,90 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################# -Testing LC_CTYPE en_US.ISO-8859-1 -## -############## -All 7253 tests passed. diff --git a/tests/data/retest/expected/sls_ap_nc_sb_ti/foo.txt b/tests/data/retest/expected/sls_ap_nc_sb_ti/foo.txt deleted file mode 100644 index 4c46ed5..0000000 --- a/tests/data/retest/expected/sls_ap_nc_sb_ti/foo.txt +++ /dev/null @@ -1,90 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################# -Testing LC_CTYPE en_US.ISO-8859-1 -## -############## -All 7253 tests passed. diff --git a/tests/data/retest/expected/sls_ap_wc_mb_ri/foo.txt b/tests/data/retest/expected/sls_ap_wc_mb_ri/foo.txt deleted file mode 100644 index a8fd36e..0000000 --- a/tests/data/retest/expected/sls_ap_wc_mb_ri/foo.txt +++ /dev/null @@ -1,92 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############## -Testing LC_CTYPE en_US.ISO-8859-1 -################ -Testing LC_CTYPE ja_JP.eucjp -###################################### -All 7311 tests passed. diff --git a/tests/data/retest/expected/sls_ap_wc_mb_ti/foo.txt b/tests/data/retest/expected/sls_ap_wc_mb_ti/foo.txt deleted file mode 100644 index a8fd36e..0000000 --- a/tests/data/retest/expected/sls_ap_wc_mb_ti/foo.txt +++ /dev/null @@ -1,92 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############## -Testing LC_CTYPE en_US.ISO-8859-1 -################ -Testing LC_CTYPE ja_JP.eucjp -###################################### -All 7311 tests passed. diff --git a/tests/data/retest/expected/sls_ap_wc_sb_ri/foo.txt b/tests/data/retest/expected/sls_ap_wc_sb_ri/foo.txt deleted file mode 100644 index f447326..0000000 --- a/tests/data/retest/expected/sls_ap_wc_sb_ri/foo.txt +++ /dev/null @@ -1,90 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############## -Testing LC_CTYPE en_US.ISO-8859-1 -################ -All 7270 tests passed. diff --git a/tests/data/retest/expected/sls_ap_wc_sb_ti/foo.txt b/tests/data/retest/expected/sls_ap_wc_sb_ti/foo.txt deleted file mode 100644 index f447326..0000000 --- a/tests/data/retest/expected/sls_ap_wc_sb_ti/foo.txt +++ /dev/null @@ -1,90 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############## -Testing LC_CTYPE en_US.ISO-8859-1 -################ -All 7270 tests passed. diff --git a/tests/data/retest/expected/sls_ex_nc_sb_ri/foo.txt b/tests/data/retest/expected/sls_ex_nc_sb_ri/foo.txt deleted file mode 100644 index 7ce2c44..0000000 --- a/tests/data/retest/expected/sls_ex_nc_sb_ri/foo.txt +++ /dev/null @@ -1,87 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -################################################################## -Testing LC_CTYPE en_US.ISO-8859-1 -############# -### -All 6983 tests passed. diff --git a/tests/data/retest/expected/sls_ex_nc_sb_ti/foo.txt b/tests/data/retest/expected/sls_ex_nc_sb_ti/foo.txt deleted file mode 100644 index 7ce2c44..0000000 --- a/tests/data/retest/expected/sls_ex_nc_sb_ti/foo.txt +++ /dev/null @@ -1,87 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -################################################################## -Testing LC_CTYPE en_US.ISO-8859-1 -############# -### -All 6983 tests passed. diff --git a/tests/data/retest/expected/sls_ex_wc_mb_ri/foo.txt b/tests/data/retest/expected/sls_ex_wc_mb_ri/foo.txt deleted file mode 100644 index b5ab352..0000000 --- a/tests/data/retest/expected/sls_ex_wc_mb_ri/foo.txt +++ /dev/null @@ -1,89 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -### -Testing LC_CTYPE en_US.ISO-8859-1 -################ -Testing LC_CTYPE ja_JP.eucjp -###################################### -All 7041 tests passed. diff --git a/tests/data/retest/expected/sls_ex_wc_mb_ti/foo.txt b/tests/data/retest/expected/sls_ex_wc_mb_ti/foo.txt deleted file mode 100644 index b5ab352..0000000 --- a/tests/data/retest/expected/sls_ex_wc_mb_ti/foo.txt +++ /dev/null @@ -1,89 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -### -Testing LC_CTYPE en_US.ISO-8859-1 -################ -Testing LC_CTYPE ja_JP.eucjp -###################################### -All 7041 tests passed. diff --git a/tests/data/retest/expected/sls_ex_wc_sb_ri/foo.txt b/tests/data/retest/expected/sls_ex_wc_sb_ri/foo.txt deleted file mode 100644 index 58d2e9d..0000000 --- a/tests/data/retest/expected/sls_ex_wc_sb_ri/foo.txt +++ /dev/null @@ -1,87 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -### -Testing LC_CTYPE en_US.ISO-8859-1 -################ -All 7000 tests passed. diff --git a/tests/data/retest/expected/sls_ex_wc_sb_ti/foo.txt b/tests/data/retest/expected/sls_ex_wc_sb_ti/foo.txt deleted file mode 100644 index 58d2e9d..0000000 --- a/tests/data/retest/expected/sls_ex_wc_sb_ti/foo.txt +++ /dev/null @@ -1,87 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -############################################################################### -### -Testing LC_CTYPE en_US.ISO-8859-1 -################ -All 7000 tests passed. diff --git a/tests/data/strtest/expected/foo.txt b/tests/data/strtest/expected/foo.txt deleted file mode 100644 index ea9db2c..0000000 --- a/tests/data/strtest/expected/foo.txt +++ /dev/null @@ -1,114 +0,0 @@ -rewind to 0 -str[0] = 120 -str[1] = 102 -rewind to 1 -str[1] = 102 -str[2] = 111 -str[3] = 111 -str[4] = 102 -comparing 1-4 and 4-7 -rewind to 2 -str[2] = 111 -str[3] = 111 -rewind to 3 -str[3] = 111 -str[4] = 102 -rewind to 4 -str[4] = 102 -str[5] = 111 -str[6] = 102 -str[7] = 111 -rewind to 5 -str[5] = 111 -str[6] = 102 -rewind to 6 -str[6] = 102 -str[7] = 111 -str[8] = 111 -str[9] = 102 -comparing 6-9 and 9-12 -str[10] = 111 -Match: 6 - 12 -rewind to 0 -str[0] = 99 -str[1] = 97 -str[2] = 116 -str[3] = 99 -comparing 0-3 and 3-6 -str[4] = 97 -rewind to 1 -str[1] = 97 -Match: 0 - 6 -rewind to 0 -str[0] = 99 -str[1] = 97 -str[2] = 116 -str[3] = 100 -comparing 0-3 and 3-6 -rewind to 1 -str[1] = 97 -rewind to 1 -str[1] = 97 -str[2] = 116 -rewind to 2 -str[2] = 116 -rewind to 2 -str[2] = 116 -str[3] = 100 -rewind to 3 -str[3] = 100 -rewind to 3 -str[3] = 100 -str[4] = 111 -rewind to 4 -str[4] = 111 -str[5] = 103 -str[6] = 0 -comparing 3-6 and 6-9 -rewind to 0 -str[0] = 100 -str[1] = 111 -rewind to 1 -str[1] = 111 -str[2] = 103 -str[3] = 100 -comparing 0-3 and 3-6 -str[4] = 111 -Match: 0 - 6 -rewind to 0 -str[0] = 100 -str[1] = 111 -rewind to 1 -str[1] = 111 -str[2] = 103 -str[3] = 99 -comparing 0-3 and 3-6 -rewind to 1 -str[1] = 111 -str[2] = 103 -rewind to 2 -str[2] = 103 -rewind to 2 -str[2] = 103 -str[3] = 99 -rewind to 3 -str[3] = 99 -rewind to 3 -str[3] = 99 -str[4] = 97 -str[5] = 116 -str[6] = 0 -comparing 3-6 and 6-9 -rewind to 4 -rewind to 4 -str[4] = 97 -str[5] = 116 -rewind to 5 -str[5] = 116 -rewind to 5 -str[5] = 116 -str[6] = 0 -rewind to 6 -rewind to 6 -str[6] = 0 -rewind to 7 diff --git a/tests/retest.c b/tests/retest.c index c7e02f8..597fc95 100644 --- a/tests/retest.c +++ b/tests/retest.c @@ -19,10 +19,6 @@ is poorly documented and different for different platforms. The non-ASCII encoded strings are now guarded by #ifdefs with one of the following values. Define/undef whichever one(s) you need. - These may affect the total number of tests performed, which may - make the waf build system result comparisons fail because the - output includes the number. Look at the actual output files under - the build directory to see if all the attempted tests pass. #define SRC_IN_ISO_8859_1 #define SRC_IN_UTF_8 #define SRC_IN_EUC_JP diff --git a/tests/wscript b/tests/wscript deleted file mode 100644 index 4d6f23f..0000000 --- a/tests/wscript +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env python3 -# encoding: utf-8 -# -# tests/wscript - part of TRE -# test programs waf build script. -# -# This software is released under a BSD-style license. -# See the file LICENSE for details and copyright. -# - -from waflib import Logs,Options - -import lib_unit_tests - -def options(opt): - pass - -def configure(cfg): - if Options.options.log_wscripts: - Logs.pprint('CYAN','Configuring in {:s}, VARIANT{{{!s}}}'.format(cfg.path.abspath(),cfg.env["VARIANT"])) - # Logs.pprint('NORMAL','Configuring in {0:s}'.format(cfg.path.abspath())) - # datarootdir ${prefix}/share - if "freebsd" == cfg.env.PLATSYS: - # could use -Wno-invalid-source-encoding in CFLAGS_TESTS - for cfg_key in cfg.all_envs: - if "" == cfg_key: - continue - cfg.setenv(cfg_key) - if cfg.env.variant_nls: - # cfg.env["DEFINES_TESTS"] = ['LOCALEDIR=\"/usr/local/share/locale\"','SRC_IN_UTF_8'] - cfg.env["DEFINES_TESTS"] = ['LOCALEDIR=\"/usr/local/share/locale\"'] - cfg.env["LIBPATH_TESTS"] = ["/usr/local/lib"] - cfg.env["LIB_TESTS"] = ["intl"] - cfg.setenv("") - -debug_test_builds = False - -def build(bld): - if Options.options.log_wscripts: - Logs.pprint('NORMAL','Building in {0:s}, VARIANT{{{1:s}}}'.format(bld.path.abspath(),bld.env["VARIANT"])) - if bld.env.BUILD_TESTS and bld.changeable_task_group: - # Build and run the tests. - bld.set_group('test_tasks') - # Some of the needed includes are in the build directory, some are in the source directory... - if debug_test_builds: - Logs.pprint("CYAN","src.parent={{{:s}}}".format(bld.path.get_src().parent.abspath())) - Logs.pprint("CYAN","src.parent.find_node('lib')={{{:s}}}".format(bld.path.get_src().parent.find_node("lib").abspath())) - Logs.pprint("CYAN","bld.parent={{{:s}}}".format(bld.path.parent.abspath())) - Logs.pprint("CYAN","bld.parent.get_bld()={{{:s}}}".format(bld.path.parent.get_bld().abspath())) - incl_list = [bld.path.get_src().parent.find_node("lib").abspath()] # for xmalloc.h - use_list = ["TESTS","LIBTRE","static_libtre"] - # 1 - retest_node = bld.path.find_node('retest.c') - # some non-UTF-8 in the output breaks showing the results... - bld(features='c cprogram lib_unit_test',source=[retest_node],target="retest",use=use_list, - includes=incl_list,DEBUG_ME=debug_test_builds) - # 2 - strtest_node = bld.path.find_node('test-str-source.c') - bld(features='c cprogram lib_unit_test',source=[strtest_node],target="strtest",use=use_list, - includes=incl_list,DEBUG_ME=debug_test_builds) - # 3 -- This takes a long time (and at the moment runs out of swap space), skip it. - randtest_node = bld.path.find_node('randtest.c') - # bld(features='c cprogram lib_unit_test',source=[randtest_node],target="randtest",use=use_list, - # includes=incl_list,DEBUG_ME=debug_test_builds) - # 4 - benchtest_node = bld.path.find_node('bench.c') - # bench.c needs the math library (for sqrt) under linux, just leave it out for now. - # The bench program needs at least a "-t N" command line argument where 1 <= N <= 9. - # bld(features='c cprogram lib_unit_test',source=[benchtest_node],target="benchtest",use=use_list,lib=["m"], - # includes=incl_list,DEBUG_ME=debug_test_builds) - if "AGREP_NODE" in bld.env: # agrep built. - bld.recurse("agrep") - # Go back to the regular task group - bld.set_group('build_tasks') diff --git a/waf b/waf deleted file mode 100755 index da4ccb7..0000000 --- a/waf +++ /dev/null @@ -1,173 +0,0 @@ -#!/usr/bin/env python3 -# encoding: latin-1 -# Thomas Nagy, 2005-2018 -# -""" -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. -""" - -import os, sys, inspect - -VERSION="2.0.25" -REVISION="767522112be77f8585812fcfaa08e805" -GIT="39ef33e48380a2db38a0eae40a3a4a2c954f4450" -INSTALL='' -C1='#+' -C2='#*' -C3='#)' -cwd = os.getcwd() -join = os.path.join - - -WAF='waf' -def b(x): - return x -if sys.hexversion>0x300000f: - WAF='waf3' - def b(x): - return x.encode() - -def err(m): - print(('\033[91mError: %s\033[0m' % m)) - sys.exit(1) - -def unpack_wafdir(dir, src): - f = open(src,'rb') - c = 'corrupt archive (%d)' - while 1: - line = f.readline() - if not line: err('run waf-light from a folder containing waflib') - if line == b('#==>\n'): - txt = f.readline() - if not txt: err(c % 1) - if f.readline() != b('#<==\n'): err(c % 2) - break - if not txt: err(c % 3) - txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r')).replace(b(C3), b('\x00')) - - import shutil, tarfile - try: shutil.rmtree(dir) - except OSError: pass - try: - for x in ('Tools', 'extras'): - os.makedirs(join(dir, 'waflib', x)) - except OSError: - err("Cannot unpack waf lib into %s\nMove waf in a writable directory" % dir) - - os.chdir(dir) - tmp = 't.bz2' - t = open(tmp,'wb') - try: t.write(txt) - finally: t.close() - - try: - t = tarfile.open(tmp) - except: - try: - os.system('bunzip2 t.bz2') - t = tarfile.open('t') - tmp = 't' - except: - os.chdir(cwd) - try: shutil.rmtree(dir) - except OSError: pass - err("Waf cannot be unpacked, check that bzip2 support is present") - - try: - for x in t: t.extract(x) - finally: - t.close() - - for x in ('Tools', 'extras'): - os.chmod(join('waflib',x), 493) - - if sys.hexversion<0x300000f: - sys.path = [join(dir, 'waflib')] + sys.path - import fixpy2 - fixpy2.fixdir(dir) - - os.remove(tmp) - os.chdir(cwd) - - try: dir = unicode(dir, 'mbcs') - except: pass - try: - from ctypes import windll - windll.kernel32.SetFileAttributesW(dir, 2) - except: - pass - -def test(dir): - try: - os.stat(join(dir, 'waflib')) - return os.path.abspath(dir) - except OSError: - pass - -def find_lib(): - src = os.path.abspath(inspect.getfile(inspect.getmodule(err))) - base, name = os.path.split(src) - - #devs use $WAFDIR - w=test(os.environ.get('WAFDIR', '')) - if w: return w - - #waf-light - if name.endswith('waf-light'): - w = test(base) - if w: return w - for dir in sys.path: - if test(dir): - return dir - err('waf-light requires waflib -> export WAFDIR=/folder') - - dirname = '%s-%s-%s' % (WAF, VERSION, REVISION) - for i in (INSTALL,'/usr','/usr/local','/opt'): - w = test(i + '/lib/' + dirname) - if w: return w - - #waf-local - dir = join(base, (sys.platform != 'win32' and '.' or '') + dirname) - w = test(dir) - if w: return w - - #unpack - unpack_wafdir(dir, src) - return dir - -wafdir = find_lib() -sys.path.insert(0, wafdir) - -if __name__ == '__main__': - - from waflib import Scripting - Scripting.waf_entry_point(cwd, VERSION, wafdir) - -#==> -#BZh91AY&SY#*s†#)Êwÿÿ°#)Pÿÿÿÿÿÿÿÿÿÿÿeà(Â(€0Í0çŒb¼{¤Æ@#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)#)÷Ý×}=y”£îâìl=½Á½µ«C(4šÓ··ÞÓÞ³ è>ò·›lÙb#îÒi÷·5ï;µ‘zë´hm2_<>ûåÁ;íëo9tz—QRQ^îë{­†íÞÖZS»vÏvn«Vá¤|óÏKz×Ùï–÷G)Ú¦=Û×;ï¯{Ü#*ß{_ÜÏ}Þ”H#)´´Åmk®úoEË#)%Þ°rM€o¼xyæôìo‘ͽìô-nŸ}ç½ç_uÁêñק ›íÊ£Ó^ÊÔpiÒù›¸w‹>o¾¼ënîÜÛ—tÕÝÚnúÎÞåØúæ÷%³çjuÚî^Ý^¯=Ã=·×wΥؒlÕ4k#*mõîôï°û³Å×-³n肵Ñé«fî¸ïmÛçÔR›^îí\kS7Ϲ¾¼ï¶;ìÛžöí÷==k{‰½—R¾÷uëc_YGgŽÛÝ×uõÏ=é¾D#)7Ó—Ï;Ð.|ÃîðhX:©E€Û!°³#+æËvrT[뒽ݗ`vèí= ¼Ç»Téו{¶Ø®•SŽºžÞ=æR-×m½GBë5¦ÛÛ#)#)žç]¨#)[Ü^¯sÝz­yìönñ¤æ½ëÞ ^Eî;Ó²Þöˆò½ÝÒjtºŸ{¸|˜öΈ…O‰®:"öàóÞÇ›^ûg¹¹ÓÀ)W£Ò•íÝ0÷·W¨™ƒ¯rxiôú£ï§AÝk뵇>ÛžÇÞ³3înï7ß;›í»»»xît°Ûíƒî÷yîínŽÇ½»ŽàæÛb³×E“`Ø3EhÞÏYÛ£)꧞¶®‚¶Á²©Ïê•Øì/<7}µÚÞ}ÎÀ­^ÕªŸ\zR}ÝöôèéÝÑÆ•ÝmÆ#+»MÚÕÑÙÕ÷îw9ÚÏs#+ûk/a½w»¹Åëvî4×J¬”èÐíã2]ØÞ¼èåLêðn ·T;PãG{Îò÷Ÿ}®À{[ÈÈ#* ŽYµm¡::#)J¸ò·›]z›ì÷¹ÀØP(¥Ù·{”ó»[lì\nòu—[P¦UU–÷M—wb–ëÀH¢ÝµÔífí¥F»¶éî4÷¹.Æ4î7zu"ïXÛzÒ9s×Öí|CÞùöÛÖ`OcàB=± š=×Ýâ'·›´P¶½í½™uÝÏ}Ï}t:§Ïg5í¥`wwn:xº½áo;ÎŽZ¾5ñw#*4@#)™#)@M#)&L#)O%4Ò4ÓÒ#)hõFj=Ó) B&4Äñ1SÄô“SÙ&SÒz™='¨4#)#)Ð#)#)#)H„!4C@#+i¦$Ÿê¦ñ$üG¢žž¨õÊF#*¨Ó@#)#)h#)#)#)IꔑÒF“MOj&¦ôô‡¨mOSj#)é@úˆ=@#)#)#)#)#)’€ #)L€˜M ¦2##)Ô4É¢z&(Ð#)#)4#)#*#)ÐI¨ˆ  ‚hhCL©²O%<ÔOjŸ”ÊhõzOG¨€2#)#)#*#)òÿúF«]rOã9µ©7ôjµ×ñÕkõêµÞÙ‰%ˆ0S=êµ×dÕi“yU®»h­¬ª“ᶒ¢ £""à1=gÍ$=¿1ðÔc#+{Ø xƒñ™‡):µ*±„©æe[Ý\Uz™VXÅbŲ ‘Cóš¼é^õµp® :Á]ªðˆ„‚4‰½¡PÝ*_vü6¶:U4ËÇ\\¬=:|\QurõŒf‰ÏñU#ÿGùƒ?ù~{Z?òJµÊâ/e¸+(‘ ¾Ç4Ñþ{ÜàõJ°Ãàvûño»¡\àÆT5¶ÃÃ5bÓ¶'$ñ–¿‹#*R(¢†É8¡·'%ˆÁýõ»fÍ……£ÈÌ`I¥Û"lÆLhƒcõhÉÉ£®ÉÞwHLo\»ÓÒ¯Rñ®YÎå—ùŽ¼üŽ³9«I±u¨S «Åš&U;1¥Ì¡LU)„¤ŠI1H°Þíº P®‘€‰‡[•xó®ØeñnTŒÞ›š4V´"ÁS8͆@Ö÷.9_ûXk#)àá#*ó)ŒX)Ú¦ºòhñË ïv¹IlF1IùÿޢܼYÜñzf´µÕ±S )´)þY*̶Ñ"Ìi^­©@Ã"‘ÆnDçD”á÷éWŠ÷†¨XœÐ¶ (D%òþgËý×F[1ÝD!²Ð9³$¼nä ÛâÄÕ­–F4›iêY#+“qÆA³¸¦W6éd5sn¼v$ØØŸ]×ÊmxÚ,EAoÏÝO§¯ÖW‹ì[‘L¯‹‘mËÿ9 ƒòxë#Q¶~=¼¨"!çç˜Añ´òe¨Rh˜rÆê Š°XOUÔ†Ž\º2MÊM£;®QéÊ7Õß~z»»\¯nò^+›Ý\Ѩ8šë•ÞwcrŽ•Ë™(Ë®é$s™cé¢K ÿTþÒS–ArÈ6ÓbÈD‘a#+hg†ØËËV,öQJ>´š~-Ò¶í.¾ofd4x ‰_îQI»)饖«PÅCüè`ìÀQ³ûVá%.x×Ûˆs@ÇG㡆Î[cÌÉ‘º!$Āšê‹|Ù{kädu¶ï\’(3)£^··vj¼1»kÇóÙg¡øaN#“³U›x“:8XMÙ†ØFPÑÉýðû&¤Ï<§^¹ŠÍwÔPCàÊANME)ðëöߣž—ÀÁîNÝÚÝ95ó¨RDUH„ä,Œ©Ü›¦tj#+M4+É1e)Õ–Ód|h*ô¡ã¡e³,YI#+N*}±ÆyÞ>×åŠUË"õÖ“UO¯pi)O$WàÊø„ÓéûrH›†å¿ÜÃ××oL[1þ[¬3&)}]uøúèÈÇCßAbæ¶Ä­^¨ŒJFmǶ®Aâp¶˜=8 fwŠ^w0ø²µð¯õ{(ÊšÒ…A@P#+m–™5ÆÕ͵þ‡ì÷’>·S6½•^41XýÞ?¶Ã³4E#T™Š¾çÇû/6½5ŒcšŠO‡væn#)(5Qžë#)£6Ïi‘ÞÒç²à”\×-±zï˽z¼ˆFiVJ‡µÜ±h¯Ü–ëÝØü½qQ¡7Ó׿ÃÖñO~‹FÉ·ÐûÍãƒIo±Ð¨°R:§eè!íÅx鵘OrTÅB™)¦jKGñ¨ræPaŒLÖ¶jϽ$ô¥+?+³òu·e dÛð÷DvU»½Ð´’ºp²ðÑ$XS†Í²]#ICœ›HÕsÖžM]·J)”"’ê­)Ù¥®úµ‘¿Zž»øVS“–^ÖX1a#+p(¡M˜j!i«L‚$¦õœï0J» *‘£ÃDbá‹MZûÒ—ucg²~,'~6ÅQXXy²Ö"<4º:QS’xU<ßb_3²Šå|ìá®Ñ 3VoÎMëËX¸„³ú¡ó犈rõWŽ`cï su‹$ß²)kG›AÃFš5Ú”ØdÌ(Ì)¿/s1õ÷´óMƒLOýæoÛòõ€m¡¹ÄîÃÏ$|2Ì¥@Œ¡ïj"*i_mQû{»{p}X‡aùRi“Ç¿WìѤ-´#*©ÉÍ{ˆiçºRJñ¥ÉnCMÏ…‡×–ìƒ1nÇ#+ÈÁ61K¦Â¹vB9&Ò#*Xe5úèÙÆÔyÕ:”éUáCÃÙs“…“GÚ…$ä¾»Z×qZ‡#+9‘JQo`·ÐéX¹O q\‹åN¨Yœñ'mg2||Ý#ïӌ֒ÈþöÜ\KÉŒP6@{"i:O8–ƒhºQXPüŽÑlŒÕ-ù‰±y²…èú)îaS×¥)F´ÚÇãš6¢ #*΃`w©Dï ”T ÝfĈÎ(»W\ÞN0›“í!oǺêŽ3»º„hö4{:Œ#*ñ#+¸øM-;¹È2°âV¶ã[ÿr‹Ýf6Øq6>ݵXÙdȶ_»ï‹îfŸÕ¿'q¸v³™­NúøS#Yöbùd6CTEMØßÛ'Õã×è×k7éÑT^D¤AèëEõtE¾§Ü®½wSæÜe÷º(A¢P¦3ë¹~- UKTWúXRŠ™ò¿éºü¿ý¶Ÿ/úñÕ%}ÍE}Ì?Bñ‰ó»o·®ñ`¢*~§no“=b~¹·ïùÚ­ô¨ð»šUÈgóLZ{ŸvØìÅkêܬ’'ù5·Xýð黄—n#†9ìÄ<$’0 1,áÂ|Ý®>¸ÙL¶T¼å0$Õ4ÔºÓÒùÔBQ³”‰ü\†‡?‚л´£#m* ÒŠŒøÖ×'Ñ; 0ÔO'IXÏÂb«´W·°äÅÏ ‚„|‚.aûâðXŒËO˜àLTÍéC]Íø­ Â`áGÙE"¢¿«4dfýš\}(¤Eàf¬F"‘daIήü´©¥Yç¥dÂ|wjŸfýs|4H¿mž#*A”çÇŒ0h´ë-+‡mènnΛÔrÛòy¯=×m`p¦;öš~—iÄë–Ó2 §Ÿi>5Îe 2}–¥Ö™;v¦dMŸ¥¨ù&;ÝÅááÛã¸D;/[×0Êe¨ÌõÇàg#š<Ð/¶ŠGƒ5¸SÓ³k˜~ {bÂõ¢Ø ú’Y×…é¤DQQe0¨x~r‚Û{*©nf Øøg·sèÉð„kÃ#bÜ󼺟S½™!žP­ m¶³ìª¦ÞHóæ´éêÈã¼ÔVm ò§w‹ˆ~W«5FA´?8.†¥úš6e*DF/:‘h®¾˜åʳ¢q³ý½hñáPÐmÔ‰lðaK–R‚±7gFTaes×^¾o#*‘Ò÷àbì±,¥7KªÊß\Ï«fÜËFá5L´*éù“÷9æ]L³u·óôŒ,aï?æÐÎÊÙu9s}r~û)|ݳ‹Ñ-Áð‡7ÒïŸgÖ"+EÅ3|E£[³±è'ÿyÂôî¹nó®[ñÊ[(/ËÂc#¤ÎMü¾5¸º;7„Œuv†kBoy ùqòª#Š¤:¤*!šãü…žãß¡Ë¢¨@ÜÚì…2,Sæ\&¹X±@•E©¢$@Ájô°Œ÷SÑ ¦ú%ѯ9Ar*¨[Ú­ï›—á„9Ù…H±T›Ò9ÿ#*|PוÖ+ŽJÔemA×ÂŽûis…õWô9šÂÐä^å!UdT±Ä ¨q‘¹pöæ÷¹ûÔ¡)M¡_DÏO߇7•ª9;¤Ò™&)¡/)ãUE¸ëêYùL6”î8:<öp½wœõ¡íÑ+‰q°.~ŽÇäô°ô?­“á߯•Æ´üwZ·ÙQgí¾Y­goKR!e=Šcë—ê¥ÕÞºø“ŸÛ›oä¶Ú`èéΓq©+¥µ\”GÓkšvji7XÁÀœÔH0U4UtÁSfŸrƒD^8Ç·™üß˧oy±áóã=˜‚ÍO*÷9ßú1‰btE†WZ»»#*&5Oçׇ‡NzŽåÜ\패gÆv“Ç“:T‹³Z”()ÇÃ'Àu€®•\ð><¼û:è<&.Ò#*iEíƒÙϪEÙöP~úáPØë9*±‘18pÎóM‡µú0ôÞ¸Ätëm«Ž²HøŠ][ÑŸVµu”·ì©üûS)¡#*:þI)D}èá‘ÈU}g]_­“lS­#+´íŠ0ã×D¶ v>wNšÛ­b8mDzØÆó-¿òžx½8À}¦^©i»~8õß•ÒÁrõn;¸wCéÖƒ‹•O'Dô׶øæ1;ÜÂô˜x< •”փܛ÷*E''Ni<·HôD}¡*¼Áq½Él‚SìòÁ°Ýç¥víãsx±-¼kÁÈ##ÜÒlëËJÖñ‚†#+½sRõþö`ò4£Å™‚£"Ïæé›{ª¢rÆ6uTú®¸¾•ïÈnä²°<H¨ËÈvA²„‘ÂË»å6<8b?©š-íts¬PZk%‰|e… øçÆ…éJÓüj6J¸É8Mü„ÃËêëóñåf_~²eèt³"߈d¢/ø ¦¸ ÆF=ªDŠaø3eëyB>Hý2Úú¶ÇHÅ‚”Î~·\¸n‰GKùTä·÷ç²¥C­rh¥fí¨Ÿ,ù8Œæ`Û{åÌÂ3Ѹc0qÖ£QËãAdXŠ"ÏDôÐ+–j_Á¢Ü}• º¯ÅÐYŒ‚ØÏžÜ~Ú?OmŽ´v¼ážij§ØœÙŒNIiÏ_qßη÷§ow…Ò¡¿G8K‘åU¦ý€Ž›?dÈ~ó:Úâ—k†³Ržú¨v æ´•ÜÕ  ì®Élßj9µú»¶Û0üÞ#)†éÁ3mpŒ¡-#+F,V!ý Œ©­µ„\bŸ« ¡G·5:¥3yÁ¢šfXøµÐO‹§LÜòbÛE\É:b£Em¤MÉå#LÄã¢Çtˆ”бÞîDk³Æ6Ñ<ë¤8™äû!û¬7ÍWËÝRçz-s½žÜºú%У$éÇü„Æc÷Íf"6½’.u¡ËùÙ^E¤J)*&h=Ø®9£¾…†Ž®ŠøÓXKa i†±å›C«Bâ¼hJüB¬lßÙlĨÁ¤Âè黌?bª¼Râ€ÉQUÕ)YSWŽÝÛ›Äír)qÕuÉ×YyõljÀbkxs# <ý°Ø ÀêòMüy°w2Ô¨tÔ°õõ±$ù#+’IrHŽR‡Uï‰NœŠ|ÿž. @˜ËîÕbX÷Ô}Á¾Ð#)A0#)A©»ù²¸n½/ò\FÄ÷ä°z(T 9hÝßçù„¿}¹¹F*y”i>+_\‹z.½Œþz™Òñ‡“Ò>“J÷j«Ä3ŠžPS„}4›&Q¶Ïhsy[ÝQ|£*S&; Ù4 ÙöP¡!šÌpëƒ\·„iÛrjÕø¶×‹£Œêh=­~í9ÛqmõÞ"1R;ëj–QùkÎß;FfãPÙ@·OXý°Û#eÙ~E‚‰`©iF!Å1!ä8¥–,â­ò«ø]\ö=ƒ]ñ‡(úŒa‰¶›ÎqÊNŠy™Í¡HÀi/U#)Ãó|7?^•º­Ê#*0qˆ®ûm€|42eoæmÚàù>÷UÇͦ.óKdÔ}&ݪˆ%”côõB±Û=Šò«<©Ô÷œw?ú‹¥GŒZ«ô—‘g¹PD†ù¬da´ÌÍÈGŠÐ´#Næ¨j²=¾ù¬pH.]Ũsë]!ÛŒD}µ7Å×*´gJ¢ðýÞ)ÆÉãHg#U(+mV¼)¦UÎñÛl\*!"·Ž¬,•´¡c8ÔäÞÕ@á›^¾e\7ErûvóÐ-­4ºD¬Û÷¹ŽÜšHü– `6ãˆn—#)ÛQ¡v“Øýå¥ÚOËqñ1¢°>ˆ¾÷¬Óº÷âI7ïÏ“ô£*a#>êfÜ0“Õ†v÷^øÍ)X+4£Í¦õøéxÓº¸*aO‰¿tl1Vc;ee`àã=xwËc£8É™A nËÌ‚NˆPÊNKYªƒnÃôÞÌŽZnt¥vföíöÒbäU'A#+ã“ÑK—£s3…ü‡%ʘ“, æþ"…ž'¸‘ðƒƒQ¼Õ({Û¹eÚ¶Ó‘K–ÏD@JÁÖEé½Æ̱#+hYʆS¹-Ø.6-sÊØá0ç(<1ÄìqÛ‹‚‚ȤÕ&X ³5lS‰û9¿ž”;õµ¸\½Ü×ý—+=hË‘~-lÝù6ˆòYn{j(ŠRdW=Íå†QÓ1Ü+–Í׬¹´60æÕ«H’“¦Y.!\1Yƒ©m…„aÇk¹n²Ã¨íŮԸmÇ&mŠHIõ 'ó"š¿7îÄ”Ôh©2¬ŒªÅç ªÁÀÄŽ ¨ÆíŽ0€ù,êÐðÃûÈ…Í,|QØu11åGÕürßñߦZ]SÆ´Æ#*y[òöã¥O¦d‚@ˆÀøP%ÿÕGW–vT鎉?å‚z(x&gAaÉBC‡?öñæÙN\ø’¯vŸï#LlÇ܃Bí»@BØt´ÞRµùü2~WjÝÜÕ½›gºú@ßÆŽšÆTrÒûJ&ùæs/³KH–}ÒöDdü#+W•g}¥ÿQϪuææ:;bà-—Ô#K/+Ãì.tíçß­`—zó}¸jÂv-ÓJ#ã|וF~šäŽz·EõÚ„ÝÏC›œñ´¯¬‚œõMUÃYÁ´}Ë £Ë–çp Ð.p~A¶™º­f—<ºO†–ëAí¾›õÝEã;4JbNC•F$öštÊ%Ú_6ŽÈÆ!š 4«qŒ¡£=2´ ÓL”:½c&Ü8Sm€¼¢E‘j9+r9¬»jµ„N@RfV9ý’ü¦ºìm\½¼Ü‰O†þ'ª*±Å?¸·íÕÛŽŠ±T19b7;·š®q?ÛBÚçõ0Öê+ýùHLoÝ鿤Dk÷Ý×»/!œpäE‰åzùÀð#þp$œ×#*[ÿºþïw¿¹Æˆ½ÓÈÀW§º®Ïæº.:üƒª=–°(q™¬wQ>±aUÞÀÝb‹}÷ão#)#)‡¿¼¾½‘r ŸŸõ`ÁM3#*¿»]#û\·)ÍlqŠðñ®ª£ú-,‘"»$‘æ.ÛqQÈq|"ŽIú“¬|üüã^›h‘nlÛ¨ðø5y½Ÿ#*GO³XÚ!ÝÅW·Õ;¢=¥:¾Í:Ñaˆ¼:ðA¹TX…ä^¡þ#*NàÁµîBrAH€ 'Óú®ãøZ.žïKbúá“¥ÝzÅñ×@;@2Ùì-` üþ¼¯‡rö/öåïѤ_R4#)ýôþÕ¼Ú¿ú>×!Öÿ‚‰fnÈB$Ãxw Hƒó>u7##) ýÛÖ0o2ÒíÚp½_Ùû#*Ïç„DuH??=¤»·Êï•ÝίH=²àPYc¸ ô?ösÆËZkûÞÿVåþ3¸£]êd¹訉.ò¦(æS#*ùòô³íÈסؔÌ5íM#*áÂ:“U¥Ø@´¶8~xŠf„—Ö#)4§_Li€ÆçyÁpŠÛ«à‡Éí•o¥—ü¿2 ÿÆ2a™º&„0Ö›:|–½Ç—¿×0·ÈÎdYq÷™G¤·õéÁ0…¶xÔ«%[I(në½T$~W”ëãâ!>ë·hjI6õâ·Èò›7Ã#ôo.ÇöþË–…æå93O~6Fp“ö÷ñø+jf_´4 eÝd(K….ë?§2Íàóî«—åÚhfDjë0é[‡Ô ½µd˜šÛ>±TÆoí¬X[0ùçïñvý?ÅÌèî¶}QUÊ 6”®ùq—>¥?½kÐ#Ìv%6g#{`,d’·>oÂ,§Ã´ùâOrbè5)ïÏëÁº×¦[Hä‡ØmÔ¯¤†°°ÐÃýôt’ÂÞD¼Í·òÏ–û6.ë¸w8wk3{eùÿ£–º¦ Ýûu“UÇÒWKèÓõ"ÕpGÅxºáXÿ ƒÒÄ$Tèf~ÉË’e$uño†ï½„õ|cŸýÑ.9®ë߯Ìï0zr2}yÍ#‚˜}Åä#)8Ot¹ Q[ñ]ñYÔ.…´*}`#)ƒ™ÎHYrØ-ÞŠdpó¢:Ë_êíRzNša£ ä¡#+#+Ï×øÝþk9&)Þ=#*¹c„CWdÑƬ!TÎYÜ—Çö^ópÁ™áûxFv<–ºGtIPï°EG`ˆÕWÕ˾íÓq—9á´‡'¸Líý’Kçƒ:(äBûd¡4Z L1á-õ®`,•õ‘hTƒƒ;±ß›‰Öø›ÍW÷½ék”AÁr4‘#©ß¬uš3_ÓÆùËéIÀííÛb˜ÊÀèæŽýêÉ([ŽýÃuN: ‡_5ï/ Z#*a{ÿ¶±c±Ä¯QLšÄ69øGׂtToËN­7}F"í^ê=#°âˆ*B#+ íÃY9ŽõñÃàZX`¼P!¾N`XžÐPŠL“P°"­Ó=ŸÖnžøß}ˆ6NÈFaתÍb(VÇBœiÅÂÂwÞº|þSLøÁ( ‰ „)í#‰®ÉÖ»ÂF‘j4ˆ™¦Š[W~³bËaJˆ‹!F#™fWAB-(0¹\tÁÖ±¤s ÕñÅöëTäŽnšSû3 ‡–ºõyfl+¼F2¤E€ÄI&fûƒ3s—ž†Õ”'¾6‹Éü‡ù@Ú¤ßaEƒßNê¢o–³ãü+´ý_íWÅéö¹ÓÏæGßàT¦xìÆÞ^¸´‘òb‡À'ÝÀGp Æ b@1@00{Ëa(zÂÍÝ¢”âkˈ‰t†öÛ¡¡IÚì¨øbÂ÷‡—#*ê€FW´HqFYT_…"Ú,P~ÕµZI.3©Ku-(T:åE˜ZX¡2}uØ!;vÜØæïHÝ ïU®˜ça“=åjÖ†¡1‚sŽ©3#+½ÓQ}²•þcáJ7oQ÷HR'Eã¿9jàøÆâ÷y?šî’¸»…(=$yq¡”Õ#Qg»(^ɧ;B¶2Z!(ŒÀ­læÁêNEäªé¹ö Õf˜ÚRμÛÑ:]yìë‡é£™8·<”X‡Hç΢‡ètny™PЙF”:ݼ!ª#*œ‡lÆB¥œI:¥š:è˦Â849‹œ½BÃœ‘ºØV%UfeÔ±oߣœ)vä fìƒG<ž\%Ž•ésÍÚ"”„Ž)Xæì:?õ(çØ­¼Ú8ÅQ²C-nP°7/.#*KÓÕ/.—tÍ•ëÈtnª5<±VY6ú²‹žòö½x“ ð¹Â0±Q↸ñý¾¦Â)™ñ£<¾?~BóüÈ} •3ìSÑ;TëÕõ£ùöÒÓoA ü|*Ã(tô=5¸ƒ›¶Ís¾Ä'Ö¢…Îæ(#W2Ì4U>ÿjWzòòmç]„K×v»¼ó.×wu§ŽÈÌ`#G7²™)  ,ѯ-q¡æКUtÚc{ù^}œßv3—ÊúN^÷’Ê–Â+H…$ƒ`Õ1U…1ƒlj'XÐ×Ë^¸,[fˆ©‘¦ n8Ã#)H³ƒèrdCÀ5Û–âG·.+õ#*×J lÇ-$ #aÞ÷«ƒS—£‚MÝ8°Ê^M^ŸÌ÷Úïy³òȃ¾´^Ï´J¥Z¥òÀšH(\Xb·0í`CÔ[!‹±â ë¾N'—¿r`?S…Ú¡Í-÷óÍ *#)ªÈ´ç#+¼dÈUÕ<ÞD\ ˜Œ¡ý¢í¡ßu{:k4ImÇ0PÔâFÇÃÁΉΧ—ÃÖï–ùE¬©¨úUÓäL#áÒêeVßI6µNu­£°ìûúùÎJZv#*r_#c¾àó¡ó˜E±÷Û .Š  ?FVÄÀX¸7é@ˆŸ!#)F¾8ÊF´rê͵óh^ øEXìf£Mºâb£.Ôh»gºN^Þ¶5#*9ºÎëf)d¨n)Šl™„­â„'xÐñXX’)œ²Þk0˜™‘¤$`Q1¬aX£@ÞѤK"ŒÀ4V—-,KX!3e ¬° e…0Hóãö'aÇÇKêÇé±|»7è<à¤6M¹£%쮚½1jûŠóß­¹¶4È£&ŒÚ(ÞÁ4d¶ "†XTMPÄ—tæÝT±¡dáÑ"°+j±°1¶"Q„$@‘C(çmõ—c¿Ï3f—Ö-¯ßÓݶ#+_»[0¢³*¸ B¬¥yÖz%,è¦5`±|]“mH!–ëU#Ú€WÛ#)Rùᩬ€õÉ`ˆ–0ì@í~Ám'c۳̟ÆxO²ô߶ sþ‹tDèქ´{£^aˆ„¢eóoÑ©?Ÿ7srtZ&ìR¥º 5ýr§z­´}~[to¡_(æ{4ö°qNø…Õ¼)½JÎÓí–Ún€…™©t,–ÜXë¬)b²KoS¾‡¥Ï/?ÓR嵩Ñ2´%–®Õ@*q°ÄÀÔ²ZÍñ﬒֤ûög`ùT½`‘Í=µVbž¡„$§ÞÂO<Â+v“ 8Y,á݇ß~¢&#+?½]°Dé©—„á¤Ú í7R0°µ'v†HDߺß(9Öï­§øÛ0ó‘Ëý½^:^ɱ¹îË¿žá5~¼ÍfbU©Ü`z;Þl®—&z+šézµ#*s@¼û¸¬i£ÌkxMª’ˆ,V A…’ÐKsÄí#nø©.ÝŒ‘‰aÛ÷Žß±oý»0ðÆé¶;pCÇ`ìyQZ·(A+#)”ZÑı`Œ–ÏqþS™Žä œ._«OñÉ­Ï^BvB";3Ö)á¡HÏï|a¶Î¾šŠFâ¹VàÛû—Ù˜Óä^TNˆ¹ýÞ¹-˜%#)ÚLdCŽ&òx“VDVA£N”ÍL@ô2,*¥Ò 6²Jd :u¢Â€ë#`Ø)c¤QG¼É#*•$ÝCMþBà&¤Ò+J‡,µÆˆ£áÆ;§Î"7bøõÕ3^îÙïué{¼ÒöÆZU‘,q¶àëÐÐ;F¤ˆÇ¦a¢A‰±!ˆbÓ%Ù†òý/wîæ¡™¡7¸†ý±…×@ä¡»iÈ[ dikðÛÂݼm¿ME1¤w.#+WÒ;K³<8G'Ž©¶nX¬HýÑ߈g(q5ÆL¯+•ÆÎEêRiü©4xÄriȦa‚ôá Bâ±£s¹‹©Áâ|ðß>~ÌpÇ6n)ɱèÇ­È.œÔmø@°nP’è$ºÜ°ÖõgW˜§€GÐÉK#+EŒÜpäRµþÛ–`é>#*L…F#+)Èý‹:×I±ˆO”>\¤zR«0«ñCµÊKÖI¤‹R×7‰ÙçɹœØ”äÛ›êT¨‹þ–¥—Žêí}ú½ãô6YÄŒOJ¦à÷¹9Uדÿ,}:î“&;`ÓÌ’ìø§6d]¸‹,öâÔß|?H-£AìuȹHƇ÷ª4¡Ú‚:¢¬ts¥ lV¹âé+Té‡F:Ä}W”½v}›ü˜Ût<ÅÎÂÖ™“‘ô”y#)Ð*¤\Òr¶ù7#•vÉm#)ü~¼ts»V̶4&`à×ùl5]UL«IŠ(Vj¡Š”1zõ«xk.iò&Û0âúžÙTn&éÁ9ëƒioé×XqÃÔxQ½Ÿ3’øJ§»`r'ã~Saÿ«0mp¼J%ŸlÅ//Lg•û>¶„#) “*Ä#ìM4×5~ø(LÄ´²Íà룫šÀ“siµ·&ëæ§ ªÚËA7cÎ¥7þÐÕœ‹šN.-R6‰6£ ·5k¥’5phˆ’ QVˆ©#*RK܉jºQc*¶CÊÁPDo°[H½Ëf#*„Ò†K_vjN¼ ¦fÖ¡Ìâ€Þ5¨5–iUÂeúNQ×8Ôèö'´öž°ž@ûP€w—AoÉ[¬ÌN=û媼ô[¿´¿ìòñJü¹Ñûž¯klñ|{øî>PÃ@¿K³J5Óth,šŒþ+¿^Ñû‡ݧGGZ 6¨¤!òªZS<ÐêYßÀÑÈ%øÃo_.ûú8#*^"ƒñíÅÖ?‰«j€þ©ð¦u·+•C ²q›_S ~ܾ¹Þa?¿*—ÙVI|gâ­^H¿žãñ–øó­ØܧŸq\f#*ep}‚”2¹ð™¥òƒ'QÑ~;rœÒ}øçÊ]¤5áH@U|8Lf-È€ð7J‘ÞñŽ#ë?¾‹‘˜v0ûað ÷^ðño(¢¿hVø(¸Z£0yØöþ¯o¯¤Ìøžœ6ºTrÿØl9ç—DÉåÔÞußÇÇ#)j#+NöX´¦S#*n…Æ#+ŠÆè©ãû¼7:Mv­õ° Wí¾ëÝÈ­-5#+ÃNt |`™2žJ¤Ò¤£ÕDÔ6°æ¢ªš+0mD(pRsSÖÙè_ÑÜ¢B~û*õõÀëC„y+ðˆeyPd+Ê‚J´§ôÓø0ÓoÈßšbÝkµ'oÞ‘Mï¦#*/½SÁ5ᢠÊn䟦¨ÌÓú·ñÁ“?!•‡‡±Ü_¾± Iz¯²}´õ±$Åa>þTW¦Vˆ4Æ(H"¨€4š¼¿µBïUWÀ%Ägrõù¶4#+b£‘ó–XX Hà¿Ž–ÉA9Ùį©X“¯TCA˯צkûÝODZW(qH¡O€#*ÒP- Àn¡H‘¢¢¢=©9ñ=<§•ýœ9kìFÇF–Äþ•7ô Ñ*å %¢T-¢#*DK)·œ:T—żÔWןÜižiÕ®ú Ýs­²?¬À<†)—]üÿÏ«¿Ùáôï槳èú.>³”¶ò늪o«ŸÚuúé£bgòýVY\8yÈûëìlç鵂½vé|ÓJ[]çrå®ÎÇ{_àÞÃúøn¾Û¢Ý=ßw~Á¿oÅ.[ìµåzaè¿"¢Zªö×ýÏ×cT¸yOŸ¹z9¤×{áGo Mû3ôhrŽÝ÷+Joï"ÑÖí_ŽèÿÝ}Þ­ù¢ðï>\³Óþ=>÷Ñæpm6\\,'vz5>½SÓÏã[h=è·‹ØoéÐ’¡=ŸÒ^èƒîG!#)ËŠ@i>þÂ+Û¡Ý]줧´ÄY!ô=7ãñ~wŽ*l–™qçédÄy®¶PÝw:ÙNÍñm8ó½¯}›.dé§^ŸCæÙ¬£uƒé€×ÆŒ4õû5ý¦×qêÉ9ðéþ“¶1†ª¶¿•ãTÏ¡å¯fˆÝkè4ÇkßÇmëiÞŽt= Vîh]²î†¯L´ùÉÑ"ÆÑÇôhø[oîÂë­Ù[ï”­Á€ÛÈ¥(ý}ùÙJ‰ytö°ù±ÁñóÛËŸÖ;uç4kÏâc#+`|LvR®–TÌýÏ-?Íð9ïQ§™ãÇ ;›ÓË›–ù8rÃnïAÛ¨›c†çyÈ—³×¾VéôÞ{©=ü[Û44ͼ4Bƒæu ûô"¼q+ˆQÙ‡£óWìÀu0Ù¦Kð­£å×Ìï•óÁØtt¹³‡¿ªMóØéæ¯Îÿ‘׌›èAåí_,«þ‘¡¿ðÏB8a¡‘S’€GŽ`x8W–ØÏUŸ·ùVÎϾÑÏ·<è?¸ýIûù]§»FÊÝÊ p§cÿÇ?gª½ÖÛüÊN¸~ŸÜG£ô…•®wN£Æ^fÉ¥Ûæ#*ü¿F¦§ð÷~ô%¸PŒ=î1B,Xןúß —˜aúyyiŠÿЩ´Þ¢WÞ39Ôéw_/+<Ä~_ AõÕE€(Xb˜Ã¯C¹?òúµs¨:~ïXOßÜ9SÑÒ0ùõýÿ7Éw>´ŸWÅ/gf}Â_ˆ±™µ÷õŽÛ±ôOSõߠߧÔݹsD[lêÙ²ÕÙ·ëÙG Ô…Û©—è^ô厮Ë?»–‘äðø§ÛÙûµÜ0û{þîœs±èßÍåP¹nM³óLÏ.ûáý,gëÕºÄAþKôS÷Ü“yÇËbhèvÏñü¿nê·O×\Ü4Ž/­ß·à¾5ÅFÏRpçŽÿ·7 ³Wi¸tÃéó|Ëéû¹´§È?oðÅGæÑ€#ùL8|‚Ƕl?-ŸO8ßÈ”~ϼü)byŸœkè€G*´B¬¯•öy-Ëc»ÂÚ‚¸h)€uÿ&f®X®ÞCõ6Ô¥ApoïNnvÙé§ðòuù˜]·Ÿ¦ù.}Òù‹ý-ÌìôÛßÅ[O'þéï¬I—ÖÄù'm<óEX#Ëüÿ†DPw/„)ò*Œtœ»°r‘Î?‹¸É-©—(¸Šï^g`EÃÙ38KA¼ŽC¨nÔ>ÔÛúøiÛ螟œ'Ïöoü…ÿ~˜sØMƒºX<æ±ÒÚì/#*" ËÊå˜+]ò­iDWsÌdãѲְVŽèù)óÛOÆQ/ÜÆþ/ŒààÖ²òÙÄQ9\ônîZæ²› có"µ1þ´ö¼Ýãƺ>õÍóÏ¥]päÛÔæÇì?!O]PB:®ús…G}ëeaµP¥u²™Ñ­3eˆ¤Ò*ú¹qþc‡/`¯øÿ“'–{ÒViÎô„µÏ· ºô ÈhÖ.à-¼ÞœÀTh–8hœ^"®Mœ+àñ§ãxúõ7žÛîužù&C„”ÄP¢G×ßX ?=ß Uê<ˆÍ®pBç/ÞÍæ½~Y6Ã>f4W‚7¢Ã˜ y‡Æí¤A–?.Šõ?ìùõŽÏŠÑaǤQ=º¿ÉÔ~kÖS<¦³ =a‹5ÿ$´3QÉ]E··cˆXwBñR‘dK¢Â`z¿¯òÖqõÿ |&àÏ ôò"4i[F2DHèé@ŒÖbï¡i7¢C$M¨R%dl!#*YRM±¦Ù…¤’©$sþlˆm»gí:>Ý ”ãoÏ—ÍåÆ噧?ÆšþÁ?χÉ>“}ìþ8ÒØ$2p´iŸY²Í2ÆsªÝu×äÏ–û}ÇGžÍ•åð×^¿Ûåø6‰yÇ©VÏ¿óz³xìF_·ª.êèÙÃí2N¹'åü±}º,ú²ýZ$ªAÜÂ1lx[~{4˜ÅÎîô,«eVMq×eoùç²9ñ5Ç0¶Žë„J0Ê}È(H’AáߘºêÀz;=ß«ò_·W·N¯gyD´A˜¯Þ8s8#)á /ÔQMŠ¦ï™À]q×ðt#+ed,á¿£¯8táÁ¬‰:ן÷YþG½ì÷¬a75¡…Á‡›ªçòþ—_0©­Ku;âý­îüz5ù¶+uój»˜š~›²³öÏñÓß1l–@L/í‹í   ô¿J°(¤}Ý 8=u¢ãýQNñðâþÏ^vÆ&ŒÚò1[ª-«DŠÚPÈ9+¥®–#+Œ0‡q,j‡Ó[»¦KAi¦ˆ$J‘D›·||×£^·^¡­|š©­R§§"ˆƒPlchŠ1J1BÀdQØZáa++)YlÿWÖ£F¡ã*­\æŒmFAKT£Q[*‹£86ÁFH2#*Ó©7›¹äÌ#+F5ß”MÈAS(Á„˜0£FÌ&bpïuœÚºÙ) lcQ#*¤c̉†fUø‚4î::RÚæpI C†ù₉mh  £üͧ`2ãzXUÖ»]b¥0Q‰‹$I•8‰ì ~UÒIGù E­,I´W2*œ„ÐEsEQUÚ™QŽde¤cÙ=€ÓDérf†Î Ü|ªÃAI$¨åJCÙo!AŠ¼–„Ý"÷²^ˆ1ž—báÞ¾¨ÉÞ³¸a/úNîN²ßÎdjEböó­ž:aù×ßìNãÚ5ÇæTRÝ:s^¼>º)쇻çvà ÕSž‰º¹"°÷?ä±]u>ñìÏ–ˆ ˜UÅÉâ0H#Ç°=z™6Ê)R#k“¡Þ©»”BƒžÏÝšV=A{®_y}~m‰²""tçñ^©ë§3zò×aŸ…¿6ÁÐôþãU¦Žq8³óüŸiÒù?¾¡ýoQdOeÏp‡K‚Ar2ÉNâ 50Èhû6tMHåçnãeD ~µé¹µ÷z‹Ôª¥ÈI%™UU®ðQ8$whM 9,HÙbzy¼‚B>SÄâ‡èþéË‹è—åó¯!üz=‚÷Øþ#+‘-Õc®>M¨É¬’[ 5þÔ’]þ¬ù¿L5òøo¶ê )Ù²gF1ý#*/¾²XnFDy»:|V51ï°9$, ½0¾¦*»œòI¸HKöŠ×§#*740±zä`ÛŸ!°O¿¯®zï÷ûÔkF …Tf@ ’žÙ"ªáï&ˉw\í{÷[ÎÓu_×¥]`OóåÓy¶‰yteŠ(È7b–¤dkîô{eý>\ÿËç·ßÚ4þ˜UÃ!”ûûþhyž Å“Q#+#+¤XŒŒõë›RfDQÌr¡Kò„ØOÐlfrñ¦41-6—·n›ÑHÚ)¬1=j ±o\ËA„y©Y¦=Zﺊ°Ì#+ÑFy# â¨=¦fhPi12ŠÔX_;š&Ž-/ö؈Ä××&D+‚剕.œ!&ˆíš™7ùI%‚Î6Ðmlst+¥#*ß¼Œ†hŒ5`£yTðeLzDm,ݹÁ²#+¬ä$d]Ÿ#)Ë’ËtŽjÐøÕEfÞ­;BÕmÆ6Ü,‰’šÝëq3cRbˆlfÐrP¡™&%‚L"#)´nåµG[#Hê¡Âcm'[C®Ù`Ø2麰!05i™ÈgNªéÿ=Pp…©$Xj§0C^ž¼eÌ]w î:õÔw¦P(“Û Ö­¿+¢á8Fñ™ãž )JÁ`Ù­ÂÒ´ÛãûÏâØþOØTáÀ1ÞË·räø¸Cw€G”;ð† ÷MIg瘸(!Áàƒ‹1¦È&^3òÙ÷MÌ8aŒýæˆ=AÀ¯/qÿ~3Aм}ÛåÌqµBÝŽt¢zømG¿6 ôûA>Ãò#+èÇW-~¬:S¤Òh v¸-ž #*áî..T–AbŒX°´ª¯Ï“ U44ã÷Þ1nEtˆHé7^ZQ"TéöO£KVItêDqH2$HÝMCŒÁß®ÍEĉÔTíšÃ~¡£DžÝÞg‹¶ l=½±zM7§B‡v<„WÁæôk@KEÓÈ´A¢#+‚q64(¸ÃXĸÜæÕÒª´U…N3éý”uÆb!П:¦”ŠM¸Û(ŽoÊÛ†V~[ÿ¼ŸÙ×~ßgœtþþ\`<}âï^‘vZ¼Ióâ<=ŸÏÆUî« ¢‰ýП‰T§ÞÂ#*Óî›? 4.ZVƒ#qnÎ&:Ç”øíxöö›ÚÀgNŽ|æ4Rë«Úî½æé˘cŽmcÒ´Â@ƒÌ}äu·{ªŒ¤ï#+è»2ïÊXHÜQàÈØÙùÌE±å\b0­A¶œF:7„)zÑ6ñáE–„ãZëyž6fDÙª\â]Å£‚`ÆQe…AY5d¦C`1T‚ùAX„oª$e*QM5CEZ¬-Ý#*ÿH®YÚÃŒccæCB;:y¾#+ÛiypMDˬ’dnŽ’`ºh#+Í$¶.ÕcIŒçš6Œ]Ú „O–âDDï{´5#*8±¦w(eŒÉÈÚèèÊ&E½À¬vÅ`j0t¡E&Y#FS%|åFX3äÐg~v™nÔ÷tË„.1z~8æ[Ê3ʦ6˜þ‘ͪóœÍ[¦ù m†²ðÏ©Ó‘é'Çêä™ÁÌŽp8QZãÇmùá¢hø*®åûÐ`æΩܔ;ÕPVü°M!”_ã§[m¾·mŸcFSÁÉÈf=¼Rà¸@“mˆóc®1´¬òÌѤ_C¸5-Æ«¯:úÙ¶ØÆ?8¢ðΗÜÛc5P ‘0Ú±ÇI¶q·kYäp8Íé0„$Å',¡ˆã±5ùC:˱°`¬Åü‰X~ÖqÆÞX¨aÐì’yØiœŽˆÅ{q¬¸Ã}Cç¹ÃÎFÜõ£#+ÄÞòî~ëa™]]Íú’7›HIƒñmßS/—LíyÝ£#ZÝõy –€t×ß^—@ÒÆÆÜ>QÒcVò+UZÞLª‚î]IK‚´*ùNþjì;«Îºc…ÁÄ`ÉoȶÃ@ŒA‚Í@G!¸xL¨ÚR‹x·Î-“nÚ×:ä¢>é%·‚!Dvx(æÈØ6)v¸íÆÓ½»#+6ÚŽƒ®®ê#+ɼIJV;…Fç¯-ÓoŽ¨¥Ó#+ÀO¾ƒX°Ü#*¶µ¾×.:1ì¹ÅjÇhDèÅ7M]g2r3³eI(ijäÍb<@ìÕ.6bsŒÅ“†6Ea–`0œäcZ6ƒ7ÑÉ'8Ù¢—+šÑ].íaZu `Øäí¶ÆNM žIµ©42 Ãiæls}žã’ÆÄ×ncV¿<ëfm“‰¾µö’® ÐÌ!(nÇ,~>éµáÜ)2pç:䤡KÄ9S!mDø¨ë;¥éí¼¶Ó–#*ÖŽ)¸‘‡º=öäâ0„b#%To¯,Ú¶¼5ó4•ÿŽã"N'"1±$@Xùdý )­ºci§ä)ˆx·×AQ5{¶Ø‰Tˆ‹™‡ygWþK®gQYË•$×½F蛎‚JYY1 D1–Ê›t»ã¼ik IÂœTi#+uoŠBËÚÁñÚæ]óO#+3¥"‹Û0EPû)y‰¥IeFø;“ƒ<™A¦²?Ïh&‰ ¾¹âÀJÈÝzvØ#*ò-d…„ Êl#26«7“Ž'}ÆôÛ_–YtNÃWdÓ;=ä/fRͲºòcRá\ŒÓò«åÚæ×·Ãù³¦†£²ŠŸ'7И{ì1î5HtΚáØž~¶Ç¥_iM[AÍJ6E;àñ¬Ü#*1µ(zïZUå†Þ¬M1¡¶2„’ƒ. – ¬±¡°DûN‹A2Dàá½\69Ø/ZãÂ%ë—•ŽkMév뮶ƒ8ux¼üá#+‹ÂÖð-2‰ºtl_¸Æ.Ž#*€­A$Xð¯fß¡j7§Èüg:¶æ$qCñnsl û\ÂŒ=³ÜØå#)vƒåy=ˆÄ<žàßïÆNý\«ë´ˆI _*ZžÀ"Á&eÁ.Pjâš›?ߟÏÜû¾rÚbgýIX¯È¢ê+äS\Õ}ÞuFŠ/ê«>Í‹¦ìu]dÀë:FNxëýbT{ÈIZkŽªÎŸ$ér­Î[J(7ÕZÊõR:چ齄óv¦„­ÉÕÁl×h[…¤0¢^·1£´ÜD…e-×FóÜÏå¦ú ÓsT»f«ùW#+­/期«šÑLõYf#¡òxÃ#½áåÐ!#)tÎÖ“ïnŽW4Ubsa1´RXŸµèèÙß“¡L¢)áŽÕÕ.Xmz†Q‹ÿ·ÉjJÅÚQÁgÏXoÃ=¢ss²­¹*vÅn± »ËÏâ¬*pƒW[¦Ú¬óþ:]~p6œ áLqi1Þ³={ËÊâ¸Õjù_hæªÌÕ,`œRWsÇÀŠÇü§}²ù*šÅFÀª²[,çÚڌ2–SXBX€>Ǽ9ÁFmd"­ÊR¢Ý-­ó¹òKÐÙk÷#*ž6:#+váLñÊ-,’ØZØtw&Aâ%å^è]7Jéråpu™¦G‹à8Âü§/q°X4VتÆÚ†-. › éÌÖÙ‹EðR´t­}yuQ³…[Cî¨Æûáo¦s„˜-÷°&žRS*:­SʤR9q%yßù£ã¯³ÆL.ܧ™ö§"!ÙÃÊ̦æÐð9B †Õ²üë(ÊâéYµô×åI|m¥ˆ¹\ët3úõ™slLÔÓÊÞ¡ -«ƒk·^ßp´mV‚iT“#+3X»¯±W (ñ]‚J­l_'‰AZŒYÝ/§#*qƳ 2¼(ÍÔ 1¹QŸ†­Ùš8Yž]”Òò{¯>Dob|»ú,Ô÷ïKÓƒýƒÚk"§Š3Qý…îCzìί-%´ÍK>qn‡AåôÂZW\e'(âʺé¿då2^$õ°‡'¨œÛ»*_F’.ÜÈM¿¹¢ä½…Lî¡BÝK²¶#+:x’¥ÐQ±µ’â5Å.’Í#+ºy*¯fÃ_zÎW@]¬ë™†Ñ€¨»ÆÝ33JÎÏ¡HÆÔ)#¨ŽIY_#+ÛJêp|–JBÖNaỞ×á`ÎVŒj¶kÖøÙ²!¾y´\¹piR-A b g=3KiWÆ•–}¹Zí£KQíd«v»®Ðå¬Âï¡óÖÙïiv«W#+1‡ŠíòÞ÷×YÖjÈ—|•C¨_(ÙŠÁ³óG¦›—`ÈH·Œ¯£UÈ\ƒ,œÐíÓŠð½:^‡ÑÕêëõ8àÔŒÊB„q-º]#*òÃS›~4±â3 Sƒ„j²™n{­w46Ä]¾û¶_ bó9hÁÍx• å ÊÜÆ#*Ó“cZ#*µ¦ºjŒZèt+d$ÎÅŒ'[_Èç¦z¨éÑZ°´ÀC1MøÀ¨+ÒÖgØ#*“¤#EÖ-æè_+g –.Ô;· żŒƒµµ@Á\÷#+59ÂBþpœ­!M6i€Pgä,2¢1ýÒT¥ƒ Y)ø€÷z>÷·/#+,:νÓ1Çàöö‹KÈSáoÒ@úˆ°Ì@­¡Î2²8 áÕ)ÜÒVyí-U~œóv‰C#+É%PoYZ”QÆœœ6Ï©¥ÿ¿ÍîšÃŽ9°ãôåQTº~®îËuj™/ šÙEJôFÒëjm£ÒxR$‚ ãd5UáöÑÝ´ƒ_#+q#ƒ<‚<ŠÌˆGX-š;Zä/µD5Ë·Wºé«iT ÒèœÏèÄ2 Á¿bÖÁëh´Cªk3dÖ9ñt{¨±­ëmª!îô…¬ßË|Ìëxú£±Ê…÷ÙÍ:ç/f/Óå/x™N;Tǧ?]æÜuG<Ÿ±©3+#+¡·û^×ìw)ŸÝÊZsÉDmÛy™L?ÝÈ港LKý|©RÔŽ#*¡à]lZËãKÝMÍeÁÏ”lŸ0Ê"DYH]ånª)ßòOë·IáÏÏ: ¿|žZzÛ]~77Mæ¤tÄs%YI QĘN¦u¾T¢¬ÈLÚFÃÌ`o¦ÑµKæ KÔM)U¼;®Š,= xý•ƒŸ“ùmDt¬8upŽq qc%ãMù¹°ì¤)Àl*j„î€Ôàñt0ô:×>1[OSÚ÷ô; d„…Ä“{“79È·ƒß»Ó»žŠùäÞæ;û+o,ÛaéïöÓË0Cuüqoœà¨L½_Øã³T™Û:–¤¢6m‹›á ršE˜ËKÞ_Þsû)ªÖ{gÖ6ß,±e‡>tá±ë&<'k’è+Åœö./ÓÚÕ‚TÃ÷Ûô‘!#y FG{Sà¬6:e#)”}¤+Ë€é|1Ò·´fê—N<ˆ‰1Ó“©i\7¬lÂõQÖþloa#+ËÎdñª°Ë$˜c×Aš |zåÕºt¨äǤjÿR<×íGžÎ{¼ª}~>LRú´,9¡ø³½÷½»óùcÁ ¢C;¯»£-ñ’r)ñÜ©ÆÎrÄ ÀÝ:9Òâ»UÝNmúƧ¾}[6âjž‡5tM¢ð» Ùx/pö_”ft€J6ç÷LY5TÞ¾pGC‚ÍÍ{îÛˆúr¦³”DK#)¡•C,#+h¼:- ð0!CÜ$trŽY¤…øÙÄi°NWœ—a‹°÷Sø-tœnªšµZLš¿±ô×CôÊÝa.Ž›U*BñVÄul˜J;FûX#*Ç -È8÷«¨S‚ót¹,’sšáA‹È‹ìòž3<¸{’ÞÝs£3û¿‹ûr÷ë;XÏÄû§zí̽ƒDfáÛ)9æK¼«ïuÑ:mhEdׯÌl}ÐgN×)‚À£„<ÙïV¤˜56\Ÿ6^xü0¥}]´`2+µÌœgs¢@x8lkÜÞ°Å­¿ñp”Aa¥¢–&=}jŽ,ùxâ=xÅ­ÞÊ]>¾y#+çtTl0-AÒnŠ¼ýCÍ‹>ˆ±”„D’ ƒúÏŸÝü{øúuv&çÉœ_±ÖÿUÕHÈ”#©êÝ#Öêä.Ûæ–Ž“ZL©_~1º/Ûe½úkeÎl}ÚXqaœÿGWð ¹8$ýià†¥,°NHŒs€³<áÓ#+yú¤¼ƒ#+ت„^í@^™.—.N¾þ×ËX’±Ñ©®4釅Èö¸»®­eý#)öw.mM“Bªò‡ß6èÖ¢sÜÒ½KRBaãÖš³ù_Ruþ¢0r 8z\AÝ DŸW°NxïÒº¡i£Uþ~Œ©iAxb@© is‘=ãÀ†G!¹QD¤¹ŽbJ)ËÑ–"é#FB´§W2Ò3fY…RîDHÒ®œwÇÝ{#lü/ëÅúeþë3-vŽ"U™4欤·EPMw­Ž¢‡ìg Nu.¾Çb-ÂÚ¿I!"`}¸’fŽëÑ|«—öÆ~ݼ÷5—Hô^žœw˜ÇlÏDm»ö^Bn±b3F”ÛŸÞ³Š’˜Þðj!l¢ìÒ ö°Þ/¥VÔ¤k$™Ã%²Us±Áâׂ |&i{™)þÔOJ Ìl+ç¬}X}6z^V…¶sk1ƒ†‡¼†ßI0X‡ã>7p¤ôÎbÛ` -ÐèeùÖ, CŒü`Æ×[È©®Ì{¥£ÎŽRzÅ~Üò:§\âågÉ5~:¨e\æ³ÞnÝ®ŒPßUïå-éðÉÛѸFµÎqÚk”ÓZ9ád*”t™ãÖÛ¿5ôƒ’žÈôÇ[r|o)#XÔW·—>‹Ÿ˜æz^x¶‰±¡ê݈eQʃû#*‹`Ü1˜ÛNAõ;ñoò$³®‹›¸x‹¹¼¬O_3EÅ>HاŒ«\àMœÜ_Ñ™~¨:'ñÝÏ“\•ùó€®?œMæ*=Z WxKÂù×c×ÉÈU‚b-Š[ñƒ ¯×Ó3öœ¶ž`ƒàŽ#Îk¨cdÛ£ÇÁÓHdIZ©Vám…ÊA„‚9ÛW5~!ÛŒä[åg¥yõ¿ov"ÍZ†n#+ÚçÂs”Ô¤‰oéìé‡ÆaÓƒ¡ÑÀÿêøG‘ÁŽzö·ÝòCÛ &™(B~ðž[ÃP:mPžÌG~ýÖÔÓíQ@E#äTa’ÛåÕ#G]›Ñ8s>—_X¡xhs›rëxÐgÆ2Ì4j†f3›™ (¶x!ðê¦Ï{Ux+Y8;å>w^`Óq6ɇï»s%˜è,ºt‰Fý._\T Rôzà’æ |'+Ÿm‰loEá}™Ì÷þ®dxáÐCbù?ÃÊ”ù‹ÕfÜ©W®Ö„cé2-Ixãà‹»ò!½bGeœžÚ(Ô®"LI´'š¶Kbjd±ˆÈ¤d¬ä#+oÃR`äèÙb&d#*}ûgìò:C qÐì!¼eùÎzó—F­y÷Ä7Ž÷ÇãŸѹYTJ@ ;šè‡Xþ]‰M;oþ›¶tÚîúØQ_—UgX¦žµA4!;MàbšĺÇ#OC<_ˇjtnïPàA4‹ëdí)½ã 'Œ+éU<Ê•#*$–‹rÛ7¿g˃^‘ïkÝ®^ÃöûÆË´pejžûrBÇ¿›çÅäwjò m›Þ$?³ÿ‚£™¨;ìŸ0n—f1U#¶#+Ú”?´òÅò£¢¦ò5½¦µìûp&Z~ÚÞÜrý±"ÝΗÄ#*IáÞqŠð§ò~‡9Œ;ÌÙÑWÝmÑÚ›TÆ—B!WÆosÝãËæ}™ì1­+°ð/8ç2·z³RB+×ÃM €tg¡mAH ºY4rЖh|K::Òq¬ß,cøËZ„ &Có÷(;&¤úr/ï°…@tØB˜,ý¾¦æ_@×™Žºÿg? €ð2åòú/¯éîïNøŸ‡WË>2–•ðåÄ #)§ÏìPìOÑõãÖŠç°Ø9Mw#Ù(JL+G;Q@À€ðè{<¸ÖK ! Až½(AF#©õƒãWyl.£%ýç8Ãöÿ¡v¿œ•Î»–Ä–“õ;e6‰HÚ“l›ªå¶åµuÕ§¯@ðbq2"Z"@ú4 Ë6o+ùü,q‰µÂ[~-Ÿ,øk_Ï|Ðù‰–¾FåxI$"‘AƒRIæ&©×‡™z½:›†r:L-&OŸÄÌx§jÎ-œ»-±<Ù‘ýp®™j9I2½KW²}¯& ‚ßh'Ùáó7#+&-žû¡{ì$Cì®È#)GÌþä㘋`ªˆ$-Qµ]Ê¿º8,ªdU,…F’£rºÞ›¿eEž'ÛP Øåo±(Í¡mÿd“^çü€»‚‹ªHœ“’Ê=D-òùÞƒ­=’ûb/çòwÏhYäb›zêÞ96½]µ‡ÎîÝ0nCqýÌ.ü|ìŸÒ#*®…ªzïnbb5i£¦¤dÔÓҔػZCŸÒÎ)rª%‹ça{à®èRˆö9#MLЩ‘; $=‰Bj}¥HøÓCåÃ嬉°‘?GØ©¡ý*!Š#*K©wkSî¨ÅÈ?ƒÜ˜ê„#+}s³˜íÜ"—kU‚€@UVeÀUœ7íËoÔ¿v¿‡ñ%\ÏÄ«B#*Ór\E³¨dн0_±Ùè³|\eÁ‚ÿ'ígsÚ*ƒ“Ôj2l…î2é稈yc% 3p†€ýŸæsy5Iø„ç˜FÛ{ òá k‡çܨ¡XÊr¢’¢È¦~úw@ß8§Ý>öÀ{“)LW@¡Ïñÿ%ðB!àkRw!%"_VºU<'lC&ˆVnÂÎp#+d÷°Õ)4`/Žµ‡\дž,¤†¥Ô“D¡¡°á» †ìxp ƈ #+Tv‘½µ%ƒÙg#)ùL¢#OF³»i“µÒÅ„þˆC®ÀžÏ‹¬„½Öl£öNºJõøÂañŠ¾`Ù8ú&Ø`“Fvk¾}N¿ãÞ =øõšk¸!„zí13H쇶7*¥NëT] ]ê£v̯>[0nƒÝ®…ÎiÑGTqâtÔÊÀÂEŠÊ®Àoj¢Ê#)¤’P Ì°‚ÒL{Ww-%éfá­…ÉíU½íuÏîª%í:ûïFÍÀ`¯o—LïøÕÀ”žØÀ_¹êÏØîŽ]¦P#qŒ´€lÏQ#)}î«"Ýb³“ì ^<#Ìë£{÷o9¬ã*]U×»â_‚ãõßì…‘mdÉÔ(­ß„ ˆ9_7¢¬™J^UÁAÞªBzJ” Pµ+ªj_©¹Üï¶#*FãŸ$z¨Ó‡/[O2F•PÍU3Œ) K—^÷ÑbO|4Òè´ÉÇ1¶ÿ ”5¶q‰ººXG]uÖ/q<2‰´Û=ªc-ƒ­QuŒHí@i6Ī"Àm!¼Š;¢œ³Ï•özè6é~Æ}uç<§VF²&¡«½€:ÍBªë£»##*Z·kÛ²¨Ù¢¼Š\DAN=†W<„1”ˆJ¡`Qf¡YAá¾7MÇñõ°*"%l+a僿 (1A&×Ç]ß3ºhàÂrr^õ{ñ䨡ØÎÿ¡–lÎgîV‰•õÔ#+@žæD* šõf›#!‚‹O‚f[ïÕž×oeùn+݉FS? Ÿ¶qœ@ýÓs#ÎÐàH˜Hj )2q¶Þø|7¤vžoŽ$ìLÇõ“62½×5g$&¨ES­PÁIÉ4J«ÎŽ`¥ŒÏÓŒ }#)z¹…÷í»§®®€ªz‹ qƒ®Ä†„ïd-.Šð/Ôˆ¼úÝyüuåÕI­Q ÏXçnÅ,ø-pÐ#)ÕDl–ìõL‚‚#0®´šq'#+žÎê—΃´ŒÿØΰ›Î_N!^À–Áîì˜\:BnÛè/Š™ •ícÆ<ÂÔ`IßQCmßQóy¿Eã·¤ò@ù¿°ù ç‹êÎi€îäC·˜T%.TÞ1ÚrûÞLóˆîòye› TŸ›DgˆÏF›œÃÎÊû¶«…æ|F‘ŒÞ“Ï7ȃ;#o§HՌʼn?MϹ\E#*«Ï4¥0½B)œhBÐ-L »Ð·àUrçúõ›Íà±I¿á(HªZaõÕMËj~Û5¨Õ'J‚ßW>-ò·õ¸8ÓJ°V`ųs-‡tï³Hmȯ]pkâÐeØÊfõF©äctÕmèÚFhMÛrúÿ‚ˆ k^`’GQ‘^í#ïm#*#+tå¶3˜:PJÞ7”«èÃ0ò¸§øßKêO‰§C•/Žo·‹oOßšÛºáŽýå‡Ü³”ˆlÔ3‘ã$m¬]Øɘ˜9#+ùæT@æÀã5¢MÌE#+*€CÙÆý\ötÚ(Þ°sÝ°¡Ã=Å% b¦Í(´‘laM§^ý~\GNr˜jμ‹ß‘­nS™Q—O æ¾áIÂjcÁaŽ®sብ»#åéôë¼áÀ8o¿’;êF¼“G“¦‰[¿‚‡Å1)ŒùOç!\Húڎμÿ\ïo$î¥éÍö*Ð’žÄ?ÙPbJk<èG+¢‘D„qþd1üæåhºÎ Å¥+vîß°*Ý…Æ(”ÂR«ü¿Ùí{ò©¦x¥#)iþ>÷Ž]q~º¨LþÏñŠ¨Å„+Ü|Ì“ïôwÖYÂgßAUOv€ þ0OH19ùqýþ—F:Þ9Ž¿V»ã^’"p…ç¿ãÕ,_©Ñ*",õ{|s¸ç¸ÖËëë°åt N" )!{!Qð*ô©¢§îõE6ÌF:¶j¥a‘Y·‘1Žk{¿„ûÏëۉDZÖyJ GJ €ãÀyùËdo~#)ú‘K›|ûÂ]Í`«éhÃGgYØøïE‹>ARá?´xp˜˜å½B—N#œl#Éí¯êœÅM“•¹Õ_VDñb|ÿ–É×¥wۨݙCƒ ‚°Uûƒê.VÁ÷frõýŠ†;ÿ+Ÿ¡ý_/LþOPçOyQ(¼#)zXÚlD¿×òÿùÿ'ü?Ïþ¯ö}ß÷þÿ«ÿ‡ÿµûsÿgÿoüáøûoûÍõÿ£ý?7«ýÑû}ß÷ÿ·þÿ›ÿú?ÓˆÿÇþÿò¯üñÿ/ú¿ãÛþïõYÿ³þùy>ÃÏôWÏþÿ÷¿ïÿwûáÛÿøÿÇø~`#)ŸÆÿo÷ãþfäþ«XUª?žËSûÌXq|¿ö¦¡ýÿêåÚ¯üˆCû"—ÿQè .Y¬0~t fS¡’£Q#)rPÈ\€ ýª‡D :D,Ãñb¢e:¢97ÖØ¡Ë4°#)H‚ú€Ò€»2‚a¥ˆ é#)Áˆ+#)‰­²–Õð‚¶L¨Šk),dEI¸:\¤tQºPY#ʸ2 ™Ž½Öø\°†5R&¤£M¢îK•ŒÄ±`ŒK%•LlÉJYªFDƒ%ÔPÎ*ÿß¡mŸæžÿ:/úUÿ—ÒÏ/îéÿXÿK8õøÚ,è“=§u* bwòy‰îËüÛÖ7üôl8#+Ùp\†ÿéBÿ¶±§èsx$–š»A¦ÀdCa5±³æÀ!Ù^däîË¢ß÷g¢Še®Ð½­1‘˜ÞSfb¶ºxÞ¨ãžæhÔ>ªo-cGhšBWzŠ}î©íw¿÷\Û9ÔgE»ÇýNÉ&ÀÆܨ>Ô½­¹×/2GGom_fÉ=´Ó3rèÃÂ@z³ ÈH6 i¡°R™(•V ±n‚pmœÜ"&ñõëwa!šH´q™s£·ˆ~þ!°/1üxÛˆ‚¸ëŒ«û¤á{ÑKãqÖëFÞ|!YÓ'¢YÅG¾&ÍŠ†‹ˆe'u×ìᶡÅðõZŒŒ’mè~á–Dw`w³FjVPõ?ÚãΩòi‹¨ö$³ÇgWæv˜ll<Í㢲ë›õÓÌøÃòYDéÝtZ e1ð!!ÇÞ‡ƒ=£ÎBÖšØc™ÿ¥á#*q{ìiÂÚ¬?8k?ã`Ë6…ïîÓbW?"È?ìÀ9Ùž-Æ%ŽâÀvø+FM1f’ËY)šT³ZfJbEïo°õr,r4UU1¤”UBÎÝ}˜j#*ÚO{r;# \C9ìpr.S³p˜7ØÍÉ0GY|è‹HÆȘDˆ°ìHg“$" E=å‘_„M-6iòÇ#*»wÔTõ7fƒRnÆ2AðØÙDmqLú(tÔ8‡d+owZ€KBl‘ ÅS;’4í£±‘þ<¡›'vÐÞd‚Òf„-04 ê È(xÂ#+’mŽ©¤V H…ƒ®·YÖ©Fv5Ñ¿YF´E#*¶è:¼ï¯8û Tšcëàtœ\µSo +!á :,jθ‘­ÚÎ04âàq‘É"z^2“É‹¹žØ†p‘ Á5VD9?øh4šUºòöt¬ŒXži×PMŠ`ã9'rx#ÞédN(ìPíeDT#+H¦­ì·5²V±«|eY*Ø«\«\Û%Zæ«¥µz²/:ïÆó»×­uÊ«èùôØ)4`¯HÅÑI²³ÊâdMñøWÎUt×/°>—§¬È;¾˜â½@A¥£ÎèpC§áŠøðY¿f“…©j4•9<Ìx›òvt/#*Ž‰-Ÿro=ù•ïão"tkçP¡å/‡c€µ>¹Xñ èg„øøÜO¹¶ú–É´VÆÌÛE_N¢Ù9Á#*œËcV#+Žrñ©Ã« Á£ÎY‘_1ôrUñÈ¥X¹ÝÉ£@Ǫ«ƒ–©)e&I$e¼ñT’’ׂ“$ædS’ßçZÁÐO²¾Ûx”Ì#«6>7šÂ+u9l(Öƒ‰BÃ*(ˆÔ ˆÈ튄¨ÙÝ«{×àmk×û·ÀlYHªÔJX%PIR$;ï€<6t:ûý®6÷”[·@Šš%|êIB@D5dXc<³ƒuEÞ@¡:ž“o”u‰’dŽlx"gwÓŠ›äåyNჟ.dzY:,ÛÝÌ%›3g`}Ò〭¦#+„ÜCÊeoP;»Èøc».¨L„!²ÊÊo@ÿ?Êl+ Þ2ÇÁ‚ûR`]Q“‘w4lÉQLHR³%„Âx›Êý~]ØÉãFÀ”KBmTŠ„Ì©7ﲓ»¬ËÎô£¨­¼d=ßfÂÖ4î{÷†‡·ˆCœ>è•gJºu¨K€w—J9*¿L6ßT^æËŽ°Ëƒ^Œ®Ç&¡¨a Dn4Ð(#+;öñž÷!ÅvŒÚÀå‚@ Ay&6c×™‡ß»gˆ»«Ó–Mré#r8ê’©Jî¿-JíD‹(Œ"À`‘—kŠJñ¹„WuqíÜdyëÎx,Ax0—¥‘ïàqÇŽ4ž Ù¼©T94¦„òò)Hþ齡…°ŸŸ‹›e<ê‘`y¼â—FéEWt÷ww댪wT¤KFˆ‘´¼N8½‡#+ KF„d‰&¿d§¹1ƒƒ»®Ðž¤'œŽÒƒ==[¬Ç 7ßœŸ/7Ço³œÞ}²x¾ìPîˆpíŠ|;ªm¬U0/ÄNøz$΄ج\4Q¢v.ŒékyéOCh£‚”*¢Ár2(³ƒ%*øNœãçÛ¥vÿ]pû9äé Õ:¬ÜöWqÙG¾;ÏÍöaÓL(ðûW:궂öÁË}k]®]¿-bz}>kÒ¸¨iä´mê{ÌŽf|å†Ç{=V #*'&#)NÃàÁlbJ§b{³œKåLã «ì…è˜U¶AÓ`wLj£jm 1Åy Ãwÿ&}Öª@ÞTL˜v9ƒ¬\I^‚ý:‚ÿF}rÒîœ_MûC ¿$éÔ&NèØÈ1Ò…@Ù"1#*—@ÌäuàÜà&„{¨ªku¡÷—vPćžœÑ"Å— êN5ºÌQ“\À\ªD¸„A7Þ·»þ¦†')Cqµ#)µ¢r£Ž#+Dh‰žRÖHz4y˜Ó.(P§ˆ–wûè…?kÀVsóšokÏ0 åP懧!3„”@$î‹Q¯Må ZæølŽ¶Æ–äKQƒ.›1 X~kBÖ¹s2ìWyS„V#`¥T:l àüŸ¹#+w›Hë²#+€u¶h~»ÃÂ^æAâ~¸ßs†ß]²•éÑЯ>c¢›Ã:­²R³Òå-¤Â¡Ø MÀSvÆ›ô-@@ânXêÊŒŽÃ>UÕØÓ̈L³6ÔŽòÅùã…×hQÆr ‡(¯IÊ.È›§KÉf$náï´Ö¸6W &¬'²Ä8@í!™}®J»#*!‹’B ŒCL‹I³lšL™MÝmî1–4ÚG±œ6v8ÙFÌÑã(ÍÓÝfçÐèZ烉À¹ˆEP{š% rœ`0 ÛŸá]íì˜j15=´SoÎ]i’?'ñž¹ÚÏ øPÍ#)P×K-<*x,ƒÔ”l÷Õ}C®u7aXª¥:´0!±,xDC˜@ÜÐmì¾·é±F¯§Ã“ú–$Íc y;œùÀÄoΑú†LIW8Î J_δHMúáœ#*¥ÓÔŸû~Xê*ve¡þùéÖ÷Ì\øÙ”<˜zd4y§Óo>ÜúpβNÿÆu#)KˆX?ÊxÄϧþç£@êíÿn°Ùð£¶Çü÷;Ç0>ä­#+'áŠA¥JÝ/qóÎ.H¾²pý_Ž™•åb}[õýµ<€,€k×eñ†qK-n^@ ׌o#+sªÌ&¨˜ûé¸)G<ãñ#)bi´Ç³Ù'\AøÀðÂyŸp¨>˜óö˜cÍó8v‰ìê9¾&y”•ÝÿcñımfŸˆ>–ý¾Ö‹: ¾‰’‡v+‚ØÓ#)ÂÄ™À<Àû¿§÷Ùÿžüùüó5¼fîØÁ þù ºe… ¨É!¢.XZgzþù<îÿõà߆áõOåã¿ËÕ–7:%‡ð;ÿxêÂߣ±!)'_›Î‡\åî|y9ý0#*Q ÿäô̈jçn1Küçþræ…[³ŽÞz¯?¸.wd ö¶¢€'Áÿoú|ÿõûÑÿ‡ýrÿ¶Gþå™QøÿäÐX:´•’m®f•ŒçÊ|"¢¿Š·ê¬éHZ-ÊåjEœíœã_Q §h¬H#+ó#)H( eÙž_*4í3#)GDwœ#)G#)"kíO—®^¸#)C,?=ƒ3”A‡xt|'ñŠ©QêÞÿ¦ˆ@ïÆÃ|}"Ï¢¨•D*ä??oæúº9φ`ŽpFCÇ÷éÑ çþ^G3¤Z¬Èa¤&ny½EÛu®ãkÊ½Û #9˜‚Îrº ÁÔ°}¤%¤'6·ø3n–M‹Qô«×¿œòO7B¤3fâŸä÷{½spõ‚ÀRJ£ïƒ|îø}ÀÞ@¾Ÿy¬Ó]nGêÍñEZbᑯl‡-‹ËÍ¢­À@wv=1…ïˆKxªè"ŽÊ#)”ˤ~£P¦Î!’&ÇÕ-A™Q¢¯ õQâ:^GÜî#)@Ü¿ÛÔûÁ¸7ÏjLjæJŒm¸[Rlvãeˆ(W£n¿pã'y”"¬êƒH¶îÏ߃¦l Ó]úÔoÙÀ„2LδûY~šÅµC375_[PÆøïb l?,ïþ&œGʼ ؽþuÜm{~šaO”ÏeÓÂ'¢CJ2„>—3¶ÖÒ²ä3Š*£ {G·ÊÞ½žË­>Ê#ð*”·ü¿#)Á;9 Éôh`‡6P#+°!#)‘(|³ø6§OýO£#Æò»ýñ:ïBoL½NãÕ:?mwgÕ_«²ÃQ´‘_‹ÓCÝÂq3"åân6êú ¿ùÏ®;âm†P6CöCKÒÆyT¡"Å“VÖtçÙó×ó¾Æª¼[ëÕÂE¤” NZØV@L~q98:ßNαwÐ6Ýçáo‡îÀg›Àly‹Ï¤ò_¶~N³èâ4lmCÕ<î{=²\ÝœíÑ´y-¿Ñêðz,ýˆ•µ#)æ#+¯{™Æ2UûnÿKÌXžçõØ}¼¶œ ½jijY™µôîfs(§ï/6G÷—ݤ4¢¸nÿ¥ÆÉkåyih‹„Pa*††©ò\̨ü™™Å·¹›s RžÀ€ïîé#)u„îì¨O9)W©#+ç]ÜÍEŸgßñ‡"aàO•Š‰s…G³¯²oêøx|D#*–3ÆKÏÝ­üšèêdéU=Ï#*éò”%º†¶ÛåÄuÜt<ŸGYL¸=´èË~ë<‘”‡nðÿš:wÓ¤zÂ#*®#+ ô*–/ÊHœÁç„ÔÛåøÚP‡ú—ì(HëÅÿ³¥èïãÀCäsE{øò§®¼±ûRÿFWâý«ìÏ^D·õºÄ… äH0y1×úAÚv÷W®!ú¶+õîê±Û÷j]óÛÿC+cî†èg’(+îP"@>±Ó#):»uóÉî¶~wÂâ=Lõ#*°_*º«ƒ¡ˆ‰¿ß˜¢y¾a¾`{;÷yG¯ÙéJ™¢§~Qëק-#dy9K‚"€1s8l#*H⺥zÈìÎc „A¬üu¨»pZæQÿ¾¯fíúd>Q…‰éèP›·ë¿hëp;•S®è}½”yšf.Y(øbæ£4¦äEsò©ff#*!¾ê¯±6(»,Éyb'?†ÝjŒ­4põ|ª‚]íLÕ«qÃ~ŽÍ:ÐpO–L#)̃=ÜÛŸ˜òþé:EÍyPŠî9õµ¢W[wAþ,0d(Sy âÏ3Fïf LNÏ£«;y°ù4[q 7ºyôqXjÆ Â]S›v4äHuˆŠ3^·ºQLB"$…rå.kªöíߦ}·®¿vÍ×ØÖª†“M­dž±V­Ëßè3í¾…BADR!æ)FÍ÷ÖSm¶az«”8Ê5èÕ‚"4˜lòùî²F›lx»\C#c`‘YJ=šÞ]™ øA*w'°z>Æ1Om&š´÷œˆ™kØ*Êò§#*Üx‡-ÁÈííöuvNØwÚØèeŒ2óÕN¾@æ@+[ª(M]dð÷ÍAŒ7ÄFI÷ÓΕöA­p­)#)â¬TˆDENø»²Fr‰Ï*s`Ž›…#*Žùe:„DHyj"&]€#óôuý½º¸¢í5ü€;]%†ñ'¿²yfoî¿£Vüÿ¯o5èì~íßmÃXg–b¯@«°CZ 6¯§x ‡?Pÿù¤v_dîÑwjs¡·´ƒ†TT;‚s.l¸ï¿xt]'ŸõmÛeÚ½½¡atÓp.¸C+i‹Á@ ßÈùýŒ,ü77ôŸ¸0ôíu#)%Þãî ùJLùßRîW<þzhøŸW I!mÏŸ™†s”ܘ5(¯«Ç¤`g=Röà5×köÿ‡Ö±š×xkÁQ‘Q5#+зø/+å›Ñ&Ÿ#*PîêÉÌš‡Hìªü¿Õ˜Ã×É/Å<&Ÿì÷j-{cñGlUÈþs¤qvs¼C`pÅÃç,*)G<›nh9YX¶Õ­W•`Ñ5(‹x¢âwÇlÕUySê¸'üŒßõÉž&’™^ZƒF+¥½z6úè„–È^|>Ò褑äŽw«Î.©?Og§Ev½½k9~˜Þ$Ì¢úËCHî!Ñ¥Ùh´×b’úW´gøÈzÌlçXu³îAÆù_Rò˜¹îþË"e2"­é“¾öé)_ÏáFÔa.uDuÓm·µ¼›lC¯o—ÎÊEÄcâïΈµ[±­ðâûÝÂÉôØN¤1µY‰B¨`åa MÂKÈè"t¦›ù0a#+¨È5‘#+ò½&æLKÜ MbŽUy`²[âhXñ‚Š„£2€ÝÞS¢>YF9\3è~äã裰¹±´å±X¬##)Ülªúa×¼±àÚ ÓÉᲫcËoÇxʯð¹PrƒÄÔ‹‚3uòï#* ‚õ‰  ¥r,HeƒXËoˆ‚Þ9–ÍUÐ^zÉIÿSÂeN–ÞÏI—ÊÅnñI¤B&¦V× #Ÿ»Ò ¾pæâqy¦æC®zY]³²¯rѤa›¬•Å†7¸M~¦XEÊãe—DºBI¡ö ±¯TúܳýÓqΗu’å·É¤åK9D¹[6eÈgE+¿K¸Uã×yí§ÌåÝÖÇí …0«7ŸQÝçYјòÉî® úAžyÛEg'/H¢ÏG&'wÄ=}µ˜â‹óS‰qoçuç®;ÖuÖçTõ;Aúc4¬ƒêSyïâe0vòÔ‡"ž#Ê=³{­_xÖ¿nX°ÊÝ"ùâ %.Èm™ýÔ_¦þšw)UWG±»ë½*ñÎ%ðûšo>Õég«Ì×h9Ñìòzíú7)½¿’êsÙ>µh îá®ÕA„KÕ‰7ÌSnˆz)D‚Tä^™ÕÒGã¶m¨(y#*©ñþšŠmTZ”“¢‘£ñ£rÐußH[‹ÌlÞ=/ævmo³¦(áPaN#‡7§_¶hâžœÿó¨i”Sš‰$¾ã±ºÓ¨í¹­RwóѾw/ké¨Ò[3™é숧­¥ñC(SåaÒÎ×;`÷If‹uyØu¼)'ÐÆGU*ºrÊØΡÝm¿mïXqrãŠß³Út[)Ö(@ñäßIw ËüÅ6ÑywNè·;²L;\ÄâÒ” X‡Äz©ø=n™èÒ¯^l9$˜d-”ÏwûãÈrÞ]j­[ÓñÝ(Š·ìbeW8…˜s_¦c‘A¶‚‡*$=“³„¥.Ø=¤…èÐ-®zÄ"c´¿Î:"¦¤íX‚=œW+À~Û×d0zÀŠç²çOœæÉ¢¨;)pè;˜ä«îú}±Ö¹véÚìñ½=aɤÄi.œ½#+T¤„#+è!·—ؽêðLJ%Hºî­­Ê”;pwJö88Ö#*šÅJhÑ‹ä=‰œ~‰—¿e̒㶉ÛÆå×ÛgÇÛ-Ýó1åäðYþ|佧A¥­<ðyæVý!ð{}YQxù‡}ò{âÚªª¬Û—‘iûY''~¯ŒÈømsœ&äh³ä\ŠjdäW¹MØ£Çæ£Ó/K:é`g0hâÕíÓ7Ötq~€{Ù¯ÊÚíÇú]ÄÒÜû\uïç¶ûþl¡³ÞE*m‡èk‚ª2#*v#*;ÎjÊúûºx9së6Áx•R \G²Ø ø}bqç™|j'âÌóšt>ï–d='ˆì´˜ª7+óûpÇŸ}ºÞ vî2ʼn±ÛÊ!öˆÌl´µùJ?AøŸ£·òèZ9” ùŽÄHþÁ^…Me?ÚÒ=`ˆ”yÚ«Eì`º ÚÒ,¤E^"ÄGº>æÚšŽ@¿÷¨ŽÁp KcIŸgãêy`P¸†ÚsRŽ(¨úÝ aþôÞ_sCrZãóûeßø{µp¸…A8Cò¶tQ‘5ÄjÄÐ~·«2'uKi7pR¾¶Sáš±™>ß5Gõ ßS>ßÐkÏÙ¦Dç¡mñÕóªo™ ËĺÏIŽNÆØêà#+±´r@ü(ù{¹èæ “8xö0ÑP¢\BàQáÁú[ÄXþ#+§½BˆiLxrDÛ)‡f”³øû¢KA‰‡úM„éås_Ëáp»»··€!)uÓ¼Ï/Ÿ[éƒ;õ¨ÿh/KyNi6¡+ž[G$èoÁܵQbP®p.2±¢|b龞Áh…„ "¨&µjÚþt&ØãJ\EÛ/z ÇåúaÝ•.Q!"ð›_[®ÿ”åï¤$=ØK»$ñø…Î‰Þ †‹<;ù24ÇIëIÇà¿][ý9Ï»Ùo«íôèòÞtÍÒ¯N*º 0æVE´G\.ï©Œ’OgÄ»~#+ÉVƒò³òŽèýf:ê¥'4ø°ôeä(ä‡b<êÊf—=¨PžÖežŒ<\¦¬…¤ö¡x(¦`BB*Dú0aéu"âoåo(e(¯%c:–FЮ‘a`pqæú±Ôp»”ˆôw‰²¨¦²ì;¢€pĸÛ"@üÐ "J9$I¯HQïŠ6½ãT*Âꘊ“,ÈÌ0™ 2Íî´B'}Q„D…#) ý1¿=?°~qìóáfµpÿ辬úú¥jt¥Kd¶‹{ø×ÓÆ™:ŒÄW·—ëÁ³ïö~ÒC #á³ÑÉ=ÝóYë×ð?‡ùìçþ“ŽE"Ãôr,Ÿ´€Bðj~¾ÏÚúd;¿3­4V?2¦?Pµ+î©YÅÚTI#)þÛVžˆÿõö\Ìý‡é-›Ç§Ýê =õ^1‚9a+7>”0âËÿÁüÏþÆׄGÿ3ˆfæ&“÷8L§ûy}ôøêùÿÏ2Wæh´¨† ê¬B?À}ÁÙ§ûÕÿ‘¼xh=„ÿGÁΚû„z†Cãmßñã÷A.zDÿµ÷žêgÔ7v+Ÿæöü•éÐ;I ˨^æ#§¨0WjÔëµmR1+‘7I¬˜ó„檻5R@é#*ú) h”!ùðnÅâüñqN5'…’ç]$î¯"ôKøQkÓõgÛ§?ú=EDõsŽÑmr„‰)ÐD„ÕVcL4{ÿº•xœuÌ]ÄhŽ,` c.[ ¡×¯Ã ˆ#)U¯'ˆ’5ôÞˆ7¡á‡ gùFe#)~z”)Aa`A‰Ö¸_!}ª¾Õ$z§f-ÈnfAaA¾ÉŠ› äAß/p’F `öØcòÌ’ÂÉÎ&k)°°EÑŸ+œÊ!ª]‰?e9#)XÉÄ޳Ěü4P)Mµ1ç@øçDãÕÜÜÛú9]½û¼¢²ÿv^ùû#4ÄúÕJXG2Átñš‰+Àšëï{³à–Ke(Ö½#+¦±©0½Q,+*ÚJé׉b$€XŠ Y-$R%Ë»‹(4­g7½ªøn‰¦m–W]”ÆÏfa”ì8qœuW Sñ>²D1Ê¢+™!ôä:‚ѯ*µ9jW$±Â3VŸf)ƒÑ*lW¶Ø™¹ž(¶ößyÚ“!Œv¬ã¶QBTTr"ÚhŒ£4€¤ðÄz¥ñI‘Í‚€A6Ð4JPoZ 8ë}3èð6#)ý3TÚJ#…þlÞU#*>”ÕÏIÌ{•œ^án;ƒ· {$PkÏáçŸmaµÏ!|"ÙØýQ|ˆœ¡AÝYJ¬ÛÌBùiž:#Ù]Ü4Ü õ‰QG8ïÐËÎ,¨ü¸Ó^žÉû·ÑÚ@´2ªô8äìpš”¯QVŸ”s;HÙFêÐåõú»m?Oßu„`W|ÆýárÖ@#)‚HŵÓWÃòxä¯8Ã%…%¿­±ªýÿŠ$–cÄU¤áƒý^oˆz´î?kÁ•·1sü¿×uŒˆÒ#Ïn:gÏ] Ë5|›üOÁg-¶ËVó©ü“SW3»M­‹+ïê³Ä"4kŒä]]!c+óÉ|]3‡îSóüX{ë^­%a0åàf–x8y =1\`–…ÚázNö}Ë¡ê˜9„)•×h¥Þ²-#)Êàó)ÜF"ªIŒtÀ@Ò*JL:T…ûûqÁ[¶Ç½9Ïy–ÃbÊSN™ÂDÆK*1A`aê»â}×Ü‚#V‹D#*þIeÉiïõ÷8†Ze¦²È Ñè\ù^ãç! î Ïný“†EmÎ׌MoݦéPˆ<&ÖÆG‚·¦jÇŠ&dÛéqê¶Y-Ï«½¥ºá8žkŒïuZ7s$ qäL4•ŠÌÌAv#yƒH%ØXjÇBuãÃ3t·gÏLÅù ‚iq¿TGÛQu¯Ãàã0èD_$k‡¶:zàÔÔ¥‚ˆìgj{9i+ AÇDZ#*ˆÓ)åªMG¢Òé3•}£Þ£Ç¾wUµs¬vöâõK¹y¼M>ÞKu¬!ËÃ:q§ò7Ï6žÞŒ&I£¾®6uÙüTÁ3öÏúpø$e)ŠV#+¸lÏLî”ék3©REUДZ˜•D #*}¯ÓÚPŒž~}œ^p•sMñûã—×Ùq=øƒrIš».¨Ž™ë{?Ž Ë{ß·>Yž0ý»BU¸‹¯!"cƒ¤ZnÏP÷áàíÐ.¥¹fý[è´ú%¶Ó"”)ƒapûÍ¥€tºQªC:ËÅ÷…G3fºäómï.¸ôYÖû´rä&Kˆˆ}µáDJ)6u÷mÃv0° Hpð#*Œÿu-}~ŽáÌü´Bƒ°ô yVÆU‡̬#)ŒE©ìì{ p ]ù|-*u¾Òɵ*ƒ,¦ }…›ðžrÅVì³òY‘‡Ú>Yôÿ±ó\¿l™1è|Ò~Xc}E:‘òE#*ÁÃíô‹;8ؼø‡Ãî{ZCkNØirrTÏ8í—=¹Kýšºš·…#+QËiƒºt"íÌ}’Ʀ{¾§ÍŽî7 Øþ¸›ÔÔ^ŽÙæoæaÛ©å"žç±¤j$ŽrRf‘kÝ¢)—'û } #+–tÇ©#*ŸêWLé¶K¡åŠ«Ú[Ï«S;uåÝ yaqZ‚š¦—Ïïù…%­àqu¸ lv‚<÷ ³d-#*6ÞÕõÖñëÝSƒÈ±j‹®[nD|^ÿNž¬¯¥2PsgäÝ&<à¥W¥./Âc.M;>/déMçî¬y«?R­UT A)ÃSÒÌ—$½tîO“ϪíRJ°¾°0`»í ÖùÀÃ^¢‘²#)m…žŸo‡ƒÄIj(‰úß«õüC}f¿#*ñ‚úäÐNϲeQb©<¬¹ #)‚p¥£ºIåêðÙ¶ÿ@¶åÑk´ƒz¨â7ès8m½uõêq/ÁêH2×>t~6~ÏŧBö‘É*µE@9Õ[>RëÂLQ¨®¾â (‰ËdÏnL‘žÙ„·®ßàFºí@ìd„ßd0ÝJD pæÖÞIe!$ 82È#* f˜®õðiüûYè;€¯mˆ!ÚFL=xíGWc'd¼’ÔzuQ!jî߆ìøaã6¨ñ†±ÃšQI ©`º;{ÚUR&ƒ‘nFº¬YKªpÅÑxTRâ’µáÎÉBê~ÓX:^ðzmVÅýñ’PG<òuø`06 ß`ì²vqµp•lïÃ#*&s\]ÛSÚx–hÁÕ´xïQ¶; f`A]Ò@sÊy‹„s ‹%(tceäFz¥¡ÚíXî¼#*kô¿q†cÞÚg~zw4–# ñsqág ò÷·‡3±Û'ZðhÛ«ç»i9”áÑ Êlö ¦¦Méu3µÚ žáÑóëUÇ)ë#+ÚN½­Râ 4°Ì…Ì¡A¥Cl¬Ìݽ\"S#†ÞáMÂàÀ<‹k£lÀçax”˜^ù¿É„d:0ž“¤`ô¦óÐöÛ-šõµžŸL2ÆüYÌà\Û%¦kccˆœ"òòɪ"Ì5e±î8Õ˜:È"‚—55¬w«„¦«È§'CaunNÕÈ’ŽIØ‘z?oƒ™¬0¿x„OšÓrà|¯ÔIR¤êÛBŸÂ®¾È†¿%rúÆD·Õhr ÏcÚ+ k(HAA¡ÊƒqN<ºOy^¨©æΠ/yß¿£Ù#+ÑSx##*jŠeAú *ù‡{Æm˜r:Ía MÌ€ bàÊ&’ÀifWÍçBùVd½ZÒ>…RÂ#…ì2íÃP.ÑÚí=BÛriW#)l$; .…½ö†¥ª¹ TÈ,{«?Ÿ¶ƒ­6PH½ÆŽÓ‚¾Ó Q 5¿¤A•~Qw|è'·´xÙ”:³µ:J”Ä1Óƒ>k]N¬¡fO°c+lr]h±{'Õ}”GÑnÅ°“œý%U°GD‹B-CQ¨uPs_ WÔÐu[„Ps¤Jdàè¬âäà&.B$M·§#*#*b©ÌÜ‚HlyùàÁá­·=Ýä2M“¼Zpê܈•²êwFçlZÃmËoXB CQ‘O±b×¾ÉDXkSÛŽÝ/kq6Ð#V©P­KtÆùÄÅsúTK+AŽu~ÙÆkÞ÷áñm7©Þ„:¤Œ·Ã²aïÄ,«&q\‘$@µÉ¯×ŽçK#*J2uvïݧ¼3¥›úÇÙùÜî©´H.b2¾e%k€Ûš¢t”=Ð#*cžÚá¤tèá—n^`»¿$ Mu^Qî`£—¾m¶üÍclRŽ5§:Æ<¡Âí÷‚§0yuv“Y<€D¤”ÖøõBñËø–-źy~éoÒ“îUÆÌÂÈó^u¤Do3q"’È ò–¥;Íbù¶ì0zß‚´.žØhÍt¸h BÜ‹m£O—rÎv@0¼ð(“ã‰KI¶ã[R9dkÅÛb(e$òUÕuXà¢ýºàîêF®½nÒ hi¡Ö4 LBc¬ ¶"P¬d#*¯KG`™‡Ãë/íò'8B‘Z®@Ü0ÇÁð঳Ã\¸k#)¼"ˆpáÆ÷à#5žÅE¸ã` sépZ€Ò#+sóóõ¿ áÌp²ñl°(3"ÞȉïÛ*+9O¾¨o†¯…x\µTJjY ³_$#+·Ôºzç2ߟG5.ù-ºÉòœy©xwí,)³û¿F­Ÿ£ßíÿ8÷}zät ço¥ËõOèÑGסQ̉'ü+Nxá;}sé±­Ù¶ªkò>I¡VsåsÝîBŒiT,ˆŽ•[²…g$ã±ïȵ4MFñ`{~> Ž„;Ï¿-¼ZûñÌ'òùkjy\ç³PÝÊN#)B1ùßÛ¹yy‚Ì#*Õ£N'Ôe:ïÍŸ£÷/_’îÞø£ùyG˜ê<¥xÃâ“p¼¼þƒpü!`o²]øEè(,DýcB¬ç†VD#*&j?`ǽŽœþ§ª«ý™aÃï#)JúýؽÀY²Të*”Br)SŽ0e–Ç÷3Ý_‡úÐøÛÝÇwåÙðýsBO܇õ…ô$A€ašúAÃngüÍ¡¤FÿÈÕT*¹ý¤º–@íþ]jùÁêa#«`¼4‰E€.“ˆ£`õÚÀóP¶ÎÏè-ãž··²Çç…Ûººoîºk[‡ûªœ3s¹Ç—GZ0¾î}ÆñSR‚f†Ã±.AÞu »·q#+ïÜiSÙâŒrk¼òÔ8”*¬™ðï„Æ8BWŒ_™J0T6(Ì kª£È?ßÈ3ºªu—ƒ]*=cÚŽÔë÷£Ú]1‡¿Ýèr’úþ³AÐÕ Z;"µÿdT,+Þ.áð'Pš%–‘Ñ…î\þK¿ÚÍ5”9€Í=M¶ÏØú²@e#*C\„™Óù¶73O =‹Ð:Ð$A7Ÿgð.³¿²¬¦äè²wúKõÇÅÿj­…]ŸÞq|tç˜1f© wùƒÕüU„ÿEô]£å¥-–GÃo==Cd¥_C™. Y@#)¥`Ê•ätk‡ÝýÏøý_?ÌWð¶ârõ0kmd#*š£ÙPŠ6}œunÀTí` ie•Ãè ˜‡ñ½Ý  Ði#+vBÛ1>â’m>“StKçKP}Ej¿÷éÖIÖzÃ.Þ^ä/Cý£`Âx„‚kò†þÄ\½;&ýTZ4 °A)rœ±»†l¤nô‹#)Á°Ô#*쥬ò„†Â #*œô™n QX¢í$ òÅÌÝj×<#+ǃ*CÕؾÖÏAþV|4©UÆå¡õå÷ù‡“¨!ÍìNä+¼éímÚšâ»VÀiö’j9(K¦cᇬÞÙü]ÇÔqÆóÎÂØÙêXK" œX°YH—q; ® t¥Áv¼”£H¿YlÙNé¹±©{NÜ#*®c”î×ráÁ6†ŽIÙ0ÁÁű B¯€t‡æ“ø É% w¿¥{qWM)'Ùõ…îNïíñïY @ô• VÛ6ù†¾kMú´ ¨TÎ(ÔXÐ# ýcNù ù O´#)@#+éÜ]k"M~˜ÚŽw겿Åß~Õ´Ä‘û±#ÚžÌ~X;ðux!×÷F2Œï¸n÷#abÀßbÌHzG©FFààŸû#'#+”0E#*%Ažr­æ”J"ÒkmbƒÃôÐÊ×5ˆj"²H§äŸ?br;é)X`öûý4®U{íðïÅ5ù€ÖÿmÙGsãï?yòƒ&G&mfækBôdŸ‹Ù®l2ëì!Ô²ƒ\"ty\ŸŸ·MP¦g7;¾üÏ­_s,ûu†vÉNÿÐà ‚ŒGÚyé6:š$£OnKà,͆$«Ô'¼i=¾'‡YÐ!Óïýaµ¬¶â¿sÈ#+RÜc¸¨$ªa %—•Ëô›`êu)”]#)æS‡ü%ÃSžE›æÝÿĹH„™s™Iàh„½ÖÒÜ1©özÿƒGz)K¶¦Üµ×JŠº™G9Îj•UG,ê²KÏ—fÕɘÇìx6#í.M{ðé=†{ÞŠg¸6=!ØáÔFA„#*Ù‡<üŒ¡°è:L×H;Þ53ijlœfIbíQM²ó‡C÷_oÇÒ"ÏÔd!_”þèIÌÛïÝýÝ<Ÿ`úÎ'ˆ”±'ó% .¾%… ¬ºŸ9ºÿzlCÛ‡`´EzÄ`½|ÀŒcdúìªõ A°ðÿäL¨+˜b['æ#+´‚K¹Æéµ±gë¹?Ùú¾ÙûCcj¯Úz\[B™ÔÔë˜e$¶#6ð)ƒRPdÉ:Û·ÆrhY+{‹„’I¶#Wyô]ãÉÎ:¹e%5º&V‘ŒKDux#*¸w­6Þ¡Ãn®4îàsø”øñ‰ËaèŠJ#+Sõ_³Sª/y¡X>‰p2ó{²Shža›ú‚Ö,ØÞs|‘Ìát应Áö}Zû™´6aYû7箜fíJnP.nS)QMÝ´äÃ&a‡{w†#)xˆ—‘;GƒŠZ ¨—ÚmDó±ÈÁõd\³ö‰èƒèúÝn>i=Èì9ÇäÁêe„9{ôM˜dP‚Ä"¼èH}#*wçs8í{ÍáöAÏ|?’cr»¯ô?IÖ8CeP}”»XÀýÓóíxîÝàŸyÄC¥<#)#Þ)Ú@‘«£À#*Ïj‚L¦IF±ûƒÊÁŠ zwóë®ÿyæ]ÍÇ£ÔiËhBµqàGŒïâSi*›oôŽ¦ˆ†»N] ²D‘YdR2>X9úÂε€é €w '¸È gŽ«ÉÅðû´7;ø˜Z‚>HtÁ„€ê Íå¾*?©ú€¨}]]%þì½…¯ÿx_dWê'Ô>§Õ&³ÛXÝ1UD bV¸Ð÷åÊïnZŽ¯® ßôCËàUõ[ˆÔÖ‡¥LÔ 1 Яà‘I>Ž´S®;µº¶´öœ¾™GW  ÁÕ3çäê5…[¥ÚØËSßãÅà_B#*—/¥šT† ßà‚ãôú·£°20®Uõ*ZÉ3#*ûî#*º|½5 ‘œeÙõ•_Á¬ðc$Ÿ=#C‚ïvö#)uç0q`±8…‹IjúoyÇî99™s”0d$Ûz…àòûLàˆjb¢#J””p2nF!ª~ô2¦s$q±»rp‰`±'G/öR¢qÙØÖ¡CˆJOg³îÌ@Ä<ÕDc ’*‰RqÕëÏ›¶ÐËFc›ÄŒnFÚ=¶7°—;žet¦çÕÃÔ›:y9‘LÂ*ðß<5Lñ†$Ed›˜P’Z-hU£_é; ½¹r%"QCôò:K°õ¨Õp »lªV#*pã:t#)÷ Nÿ„ò>0O:ÄÐ>|Þ ë#)ÁÙ¿„éd@º)'á›û74=#)6Ê:ˆ#)_fÒ½‘#+Ü<šNŽ€v9èÏTì·M¾»lsrEÚdÍ…´…@Ðaå}VQé=ydëìÁ‰:àO¬¬ÊLIsÜI÷¶— LPQEýë%Oðü™=gÍ€¾áiZ/w¡Û‚žÿsêº|ñþe6z‹è÷ø·¹ë©PüH_Œgü$MŸx´*ÒÓ3Ó&jBð°Œ!†ö(ö,’¬’Hû\ô`ú÷ɺœ;õkRZÀ51 ÐfT´¨ÏW·ó¡Ì©-#7^Ýhò³¹ ˆÒc«£«¦% ~Ú(í !ìIøCäýÉêåñíTõôÿšUE¥:5,OZ†ÀZ#*²úwâ#+Ts‚Ôa÷þ¡óö%j:¾`|s°x<9xõ`î7˜Éíö¤Š¼#*ý6êO“g"w`¤P°jI&éTp2߬„rs©3:ÉÀWÀ îºó˦]ˆœâ²ìK†gϧ;H%CÂÜ'®§*÷w–Ë€>ùÈ;@ rAÄà»ö[g+LÑÕ°"ôƒš¡¥ÐEM`èw§A½¸Ò1!#*p Õà#h"–H‰@Àäo½tÛ‰óB{ÉèPíîõ½^àøì= [66"N ëiUÀz-ý\Nñ¨xÌ•Ëàl‚€¢—/lD$ð»wQ¸ÏlPÊŸ__£Ëæì-:>¿ô 4-Ò€xB½ÔH",¡b Þû€gõrxÿ#T€ôûÉÁ‚¯½YÞDç¡ùì>’8ydTó**n¥ ÷–%,"pä~Ô6(ŸÍϵ¾’¾Óî  å™êlÌ_è¿ÏÎÎŽ7£‡Íã Ãœƒwà~ŠíÿÕoÇá{Þœ³â Óø©uä7k©zs€#*D’D¦’#+˲²š´*mØØæ-ôh ƒà÷`>¤rBÁ#*éA«’#*!óa´#*lu84BÀG :•R‡ì³¸ÁW¸»zY€ú~Ä6¨±û"²g „‹,ˆÿ4¸:€º¢ö¦Õä/.Ô˺‡0,Bd% ¯hA°kò:Ž.îY´wÇónÚà}Z†Éé]ttU‹Â„_ ¯;’Î ±U2H?á¡‘?zÊñÚV íC¶È»Æèì¡,ä`Ž0Ø67ñ#+/@zÃaŒBv%¡EÂÐÐ+ãèõ{ {š³üw¾}²dP¯‚(ŒšA*Š—Jn°­EÿŒúÞâºe·pŒGôñõÙºÈÀ®Þn]¯C9Q›pë’]q¾#*ãvË´[ÒQ¦ßó‡ßõ‡…­1ìÍ<¡kCS#*…ÚõJ0Ä8"ï/ÅåñµzÌU1¡š(¯~ûºñ÷ºä nî¡xÏ<¼"2¤š+wiŠŸ_‡˜ùÃÊW;X}¡òÓÙCí ™’ C ."²À=‰Û='È3àpFP¬}ñ„Ô¾Þ½ž¼#¼ï8&`Ûw¼là?:8z¸”Š/(…AJïõã©8ògà ðI€œˆÊLoü÷â ÔÜz΋mað‚=jÛ$„@Ë;]wwe}ßؼÝçÃ×+!kÓüuü7mQ8ú¿€ÃcÝBaÊñA£ðÃD«BOo­Ý®˜p¤Ã]ŽÐ˜EŸÎ°6ÓÔJ ÓalU6Ù dˆcc.ª @M„[™§æ:ÔOíÅçpOO…BSAÚ]OOçÃDŠÈ.?#Ã0Y?cÍû¬áCU*9äÕ¸S^t œ§$u#*¯´Ûã8ÈoùøÞO®R…)ÊßœÔpîþÓ(Mžÿ®ýRÑŒ¨xóÜöÉW¦¬{*áñGr`ãÓ©rd/ú!"Cò=¨·;Ì»wûu%ç#+¿ñj8²šÌ$4̨g@¸ö:>®Ã\rU7©6Ÿ$ù….ýÖÆw‰[øÞS Z‡Ö……—Üh¹Ò‰§Â&/—ŸÄˆ¢€«#)a`“d<ªào¥Ð NñÛgí‡P±±]Q,EÝîê¶DŽÈôýÇÝcòN_Þjìd!ËLÄ»³ØcÐvfh@À’ƒsÒ{@è¹ë]ÁhDƒ,ŠðÛ}ÐrVa±ûorXýý}/Jr=ßB\~{ÎaõXCò*^Þ¢åôîW.1s•´!É!å [ëõ0 oÂõ,–õ|º]e®jfót̶#*‚#*]É*EE’ËF¬˜eRÙÀC,D%”%DÊÚš®¦å_hq=[VkAU¡E`<50´•3®0••dzØ&ÔþÏ¥š©Qÿ¸f8M•!C[1׈0µÿ€~½ˆÌQ-1ùª *ÄóÀ÷¼°SÃVo¶ „ÏYú\Îf»Pº›–ô#*DÈRHè2ì[h®îVäý&XšÀö`i o¡ úpKÊ÷”ÏßþGâOøþ­–ìè±âdfWòp+jõußó'èÖ¿´ÚwµQ’±FH+ü\"þùzÔ12É'C«dåR°_ÜÓüìÎm¶þN ´ß!îðåüæœûxš¹×¯g£ix|šÃõkÈy!Õ->;2 Ä± þ²‡‰^'Ásþ¼"*St^¬lˆoº<¥ ÃÜ3ˆï@Ïèk¸(˜ªØP4îæØBñx"s£Þ 'Àá*7É槒Oéw¬éa* îº4/ÿoölrŽ]Úlo:¾ÚP»=¤?W×nÏ«µ²1ýÜB‡bᤌÈ*£¤¡±fv5§™Ã Ø„èŽtx~J½²íE8dõŸÃ_Ãy ï%wBwsDÀ§#eþÑžNÑ¿PÄh‹Ý8”#+,jí{(*]{aÁçÚñïÈnªöÚWYJ}ù…GJ b0âo~ ôq½±¾ÀcÑØtÁWþæXþšèUŸ¹ä‘r¢Ž}²oëåÑÛãzo¥ƒ&¹DY«-·8B¹u¸¢ñb8§…*ôÝb Þçú#)ÆQÌù‹€üAðÙÛï[T?Üï9Ý =d|í0¢(ºCÄx:'æŸÎßÎIGG”HNåwØS‹îý+éä-‚¹²¸5‚ñk~WÄ9ÑÃEÔÔ0{}#*%{ÕU:V^¶‰B4ž§äÑÕý—®Ž­ïùšxVsÓcßœ† ÑÍà @uTfköºýc·Dà;!Œ—åxØëæ[[±SƒufÈrÒ©›­óÜái£¨ù— Ëƒ¥a€»:»E8W+ç)#+QAE`ÓÁwRwgÑðÉyO†áÕ­&iLq‡fÊeêížÎºÄ`¯e®¬á¡n‡—²Ø€Qí³ézââù¼¡('­ntZa¡´¯âx_&ÍñzŠ V˜*]0{fXå..Ž{·pHëY†÷Ø«ímåyï׎0ì0'w1#*Âh\ÝÍݶXë@þS®Ä.y~yÂešlâ±2o›¦zÜókS…Tõ!Én†" ELÑ µñêé¶jJˆmÜÃz#ŒsÁ¬:êúFe™Óç~¼@Ò%óqìT³l‚) œïÉP.…°†ôlq\g]¤ÀÂÝ_òI#)ˆ#) ˆpååø¾‚ï¾^œ¸# ÈÄTY–ÎÒ^¯ŒgßT‰˜¿G“ëöÆ&Ê“°¿žf»g¥c"¼#±ñºéÉë7wÍïTdFê´œ““Ú“sH†‚©´¿¢Y©/åë˜ËõÐù<ÏŸ;Ïåw9×O¨Tg¬Ù˜z‡úB­| ü#vÂí&w(µQ@ Vh39T,4ć#)á[C !P@ˆØ§°¢&Ýj$EÇ?U×L~¬+äüøJ·­ÚêÈä`P)Ì@ %ÄbxÃ#GR¢6Ù†¨÷iœXOÆ5ñ(ëð£ÕŠ1Ñl}ê{¿áÒ } õþdêí…nïTwñóͲ"á/ié¸Þo5¾¾{mF#øîô.̹朡„#+"ªO€¦cʯMÄB2Éd)°~Yr»Ðrš#)û= ˆ„\ËåÈR&fî°.²A” )@–åäøÁ!ž¸ñL:÷Vúõ³A$)‡ˆr…Rì¡ÍIÇ£ÈzG3öñå[àœJÃnùå‰=¦¥¹Bÿ'¹ ÙF:”~2t&fHG/Ÿ;™ÛBdÇ’P»vâ¦LÈd„Ýd^äÜËHpíå1Ôz<½_Þ›;%¦€€óÌÈK¸yîÒ@”DƒX®vtÕ!p}f¼bbÎ!ü|X[[EÈ%%O‹v¦‡`9ìlÂ=îuôgÎ3‘ÑÏ‹ZbjD)Ï={5eˆÒ/Ca%BqævßÑ`ì5$fªE¤nnL/«$ytįOLÅ\†É ´É1V—S#+ÕñäëˆB>rˆŠ„‡/Íb§Ê{_#)Ÿ Œ¬s,Q`‡è Š|ìËêÿ\|ßöýþŽÏéÿ=iÇhBФ+Õþï8_‡úëƒvá4¼þxÓÆ)ÓèôzºŽ´49¿ÙóEÀÄî…Jûþku¹j‹"&l ƒâZ¤ý_}ÏÝûПú‘óˆ ñMa§¥//íÆE½5UVóž¦ÔÁ„þLųq@sÙ·8@u—1`6ì ð2ߺ›“`S»P#)Qw÷œ#*…¦’•#"1þ×jE—€vj›¢¥Q¯¬Ë;I|r#*nu:æÒ #)\ ›kÑÕº×u^âøñLšC@8j"ÑÜôYq'àÝrÛ[Ê¢«ÃfÑN=Ïø‡3¼¼'>#Ü€<4Ç_»wWñ¡g# ,)¼Êˆâ'C·gsˆy~‡œÈQÕÔk¶‹|eB™mc¿ÈȆ‚xeÁèë’ô;+#*pÂ}‹Ö3ez&;1r°íöŒú"•B&ªqdŽ³³ôàð$à Æ#*@ cX`Œ‰¡ŒD€¸RAšZ,¬à­¡À³)€Ùæd—3#)a8wIçåÓ¶=Þý{ùoÌw¾ !ÇaÖ*’ZÇ|.Ýý6œ5ùçsŸZ“Ûw}ß"tvé˃^YxòÆZ‰Û¯½°èã˜_€»IW­f«QßÌJx×£{Ëq#t:eƒ‹9o&uÍ-ÈL!ñZ£ZNV¼xn4: ( [ÍæF¦:©s¬ÚVðá(¼#+#*daÃ…ÓZ#‹.\‹,X|üiö.d_1úΊÂhpQ¥Eèq$5À™32s¸Õ]"zuÂhšuÂL‡Z+[^Âèì"H‘½÷ÌÍ¡…_E{_çÑæ^ßY-aLËn1¦Ã¹6W&¤Ì’Í šc9ê0IÐèªL®hs£>#+`HçAëÁ£²Ü-ÐÚDZa“À#*Â\'Œœ#)×RŠËÈ4ÎòPj…†ž‹xIËÒ–Š¦• i‹kn»°XèÜa’±Û»€ÀšG-¯9!üré‘úÖ÷äÓ=ÇlërTÇqÝ8ž¹ v;= × QÅL_n+5Eªè!‰‰Tß`ºèæyùXwò4ÜAuaÕ#*!ÃäÀD¢Cs#*†àƒ5ÖT‰¥ ‡p”T»P¢t!¿‰Ma!}Ôé”b›I#*€qÉÆpã#*f¶MÃQCƒˆäJoH^Œé™–X°ÄK‘a#+ Ô©ƒÐðÒcHs-5­^Á¯ƒ:F¹õuF¡‰ nÜ·ù'b<,!ÑŒ½SŽÐ5Q‘®\Rw|j½#€ZqØ;v#)cDx¢M]ôQ”¥’ÆÑ4Ùªf(G1ÐЄH.ò,‡™Ò85IF+:5_`d{ŽšäS_OªK[ª3‘¯–ˆÈóz‹#+õ½¦tuö¡‘sY‘¬¡´†Åêëe+Ô\›©\äëgÃÅ؇"„2åEÉ3Ý Â–úòÌÞ«ôH…ó†Ê‚O„ÑJ°{ $ˆ÷1íë×ZB!»·B¾ü@òæÒ&9Í—c|<¼Y^~166«l ¨t›V¦„”—™_ÓÂøVN×›òòÕË­<ÞÆÐÄ0\`±#)1PÈCnW¾(#*¤›‹*É&Ò`%·mĨ G”±@PIúyÑ»#ë0Lÿúܦ¼€d—ÁYôܯYèTÊ’˜S²}¬âœkl‚奵¿¸üNZM£lìug膥å×Ûë›5§>›»l—:¹ž#œ'¢ ´‰8*ñxdø¤;D#÷Ϋý#+Äd#+X/ef3Òø®+Ñ6#*‰ÜÂÀé²éÝò¾MZà†8ßg_fzÐy AJÒR]û«ÏEÞDžiÛbÑ¢a€ #*‚;!ÝHóØ=è(Q6ÿ’o!²UJJœP—#+ !`Ê‘ =þßkÓŠyw¸+ñ#+O»×†z”_ü¨ôûfY‡ü?×8t­Ed·rïP#)€%/Ø„ƒ·]µ¿?ë[ZŸž§©v”¢Ù›&Qjþ&Û:û>Ï·õmúƒÌ”#*Cg þ«?iØt‚Ó¥úCéôÄšR“T¶™5JDÄ­íÝòZHÅDBSÃaJ7¹J¥ÏÑUÆ¡pÀ•hÛÂñP¦‰?‘òï{×-X¶+>¹*ˆ®´ÓT*ck(%™¯n xwsèHï`{É!!%-zÕÆw¤£ÊÀ>ÿÕÈõI#*P*A¨ ´Š>;iDG¥èN-¬Ž‹#)ߦñ;,—û•rÎòIêÖo^¨x¤)…="%ÔšÃã#)ìaIf]‚ˆØ¶Kdš4~;H‰#™òž¹r‚€ú"Æ*X4GZ#*ʛäȼA=´†Ò0"A€àà °>|/ò R³¥éŸ´z5(Ø‘-hF)w]¸¤c ŠTI‡ÅÊ»{m|®Õé¶#%«X¡tkp`]0‘¹˜ò¶D[¡¯¯´áYQá—¾ÇÖ‡3dvxHIÕÐnbtÑ:2WÄŠ¨y{C#)X€¤0ô zLΠ–~ª}P“6T÷¨à<¹&à«zk½À7Åñ¿¾ÈV××¥w›áEÍÔdwiÔn\¶iüŠ/˜EÕ˜áÂ(x@*Ä #)4ÛÎdô2›m¾¥cj墩i,ÚT„Qõ†C¸Ž² /킀ȊH""«" ˆ#)±)ÀÇâóä’z­ÑmöKnS#+;eðQè‰B6ÒÕE“ê KVlâUÝFÖ‚nbåŒ%È°†#)Ü Ý­u«ãy^YëäWøäùŠe‘5êx×¢¥$˜·«»xôÛp½Mênk±(ÝÝ ’ðë¨×6ïñ<óo7Lwr®nY++»G$Mèh”%Ò+F–À”2 ©Lÿ‡>6õ|,ÚÊÏâ¾rlƒ@›$~ÕØÜà=³$.4¡°†eœÏ ÄET`{ æOfãòŸÕ“·í'‡!KöQÁ¨8Ë!G_–r=Žžž¥ù§ ïyîi‹ˆb^‘ð-ó8fá|ÏHHÁä°+ˆïÒ]§TóѤt¾µ)m¨Q#)ðI$/,V#*_=}…ZéñÝ4ÙþŠw¶€90Uo‹mµÊÛš¶4ûºÏXÊi˜ÀÀ‘fŸ,Ž&t9YþؼG¨#)N~캷¤`?¬ª‘ÞÕšÊóξ‚Þœ9˜ÛÓöøŒãàµãd[ªÁú°&ÐÿUvæB†ÃCc®*Žj Ô21¡aY¤Fñ6(¬°©~ø#)˜VlFTÛHm­kŽÜ¢÷VˆüñHªcQÎ$Ê4¶h›x&‘4é_*›šJ2-#)Á0±_@/¥dÌ “5^=žåºïOlQQv›•)-v‚ÎÆ|5#)éÏzN®dÓ[µ‹mK§#*” ˜‰I…Uü¨{X—áõ ×ÖζÅÓŒ¶Ú¹Í¯žÖú>s²ÎÕÉE,÷#)X~6$#*ñH’@`Å~yk•ŒIj+W6æÉ\Öå3aJ™ES0j*Mlm!ÎÉ(¨‹~mû{ëw«ÞWÞ–rÁš†Ð8@#) HAdA•NÀ#)5(ò¾¾—Hýw¾ïIù=8·*i£|´†F\"nø¨dÐôxW‘Þ'h=×b’€@O¶°ùB4‡OšCÖÍÝÿ¿ëþ/ÍèÿñØ€žp|ç#*ôB">–! ŽŽÛÛÏ]£O\À©»­zjûíÓm¼#)÷çH0còu!h QŠÂˆœ‘›?9ã3<‰î÷zÓitÑÓŒ‹• iyþ¸ ¹D9!6}Zit¨GøýM¯û¿ÆÃó0ð›É?ZOve%â°ôn®ÈeÑKâ”ë!oÝIÓÎvî9‰'ïÒ+µ˜A#*¬Zb ‚¡žÿià1픉Œ;+.ýú‘©9¶ê!N}„—ƒŒPá×æÐ_Û®ÍoŠÉ•>å¸*NK2Œ~ò¿‘G[ P>Xë Š¢QC ­.ØÂoêzS¨ùuœÿ%¡Ù¸ 6E4œ2T†]%rNEX7³8­û#+^´'øI” ëb¬½ý“yáóŸg@ü"O#)‡bÿc¿Fçʇ}±GÆí‡çÃÀæUÊ|œ>/×ëütt#+ª ðƒÄ˜?|°#¡1÷­¨Añ>çWæÔ<óQ(hvïÅ®_ï§#*9W#*gN¥ٳȽËŸôÜÚ0Ç­#)?¾"»:ú‚#)f§8È»]H{w^ ì P,\ï:¡J fÛ2”ÚS>â„×âbÛãFûz›ãbrÛáãØÇZq¦5 §#+¥Pžˆ NC>+ü3wf³¬âí!’t2å´ó›BüÐ"b±ÅÇ33Š·u‹(7êCÄ€È#)BÀ" í)**¡ñ;Àµ÷ºf'¾”òˆ†Î®GEf«nß×üÔC¾D„,Ïç?£¿2¨Æšª*#*(ÔDæª>Þ‡ˆü‌ÇÙWwk¹CE†X“_‡íþÃtP ™ªEbxæ:¶õ/„ëóË£–pMP×b‚ƽ¯7îqÖBèˆUjúÚY#)Œ<äE?‹Î¬í¡‡p¡äaîLxGCôE#)¥d8H#)Ä™E&ŸF|ë°²ö¯ÐÊ@ÃrÙŒ5@5™7uß2Õ² ʇT;wÄ?u¤edÅ °wûûwéňîíÂè!KÉÕ/ì®ÿï„Þµ±ÄC!Ú¡×…mÑ0ÁÑ1Y6&#*#+Y½Î²3 //­23q0-ŒsÏèi¾toº®èeРíZÀèîôqÎÛŽ}kªçߎ‘×\¹.ãŽ(Ç]YŽe—¸û4ºÛ%B0.HëÃížúåÒ¹…ñ¼óغ:qîf‡£¡´EE0º7ƒ~6Ù®2.H¥¶Æ×#+ôa`)“’'óÜégNFÙÚƒM«‡ 3†ølèî#+vl`ÝùâØÔÛ¾}¢ÔíF&hŽµ»(tدýË¿ª†µ;Ñj4L)‚>Š0ƒˆ®.fm¦Q}ét*;›#*|–!G™£ßïÄæç=çÓŽ#)²Äȇ”Éà7÷>ç÷w“¸a¹{3¶N8ˆN\uŸÙ×í *ôCÀ÷{#+‡»Ê~Yù¤r€BYa b3ê–H)¡}¾ÌF7kÕ¥Çbþ›8 JÇa^XòRìž ÷—ãèšr@­vLæxztu÷DÔØ+Aé*Þ)ghŠ&™íÜ•œ0bÛ7ôPü°Tä‰ÊùFËØFÆ™²ÛQ8o%“ƵÅ>kÚÌv(M!ê€;2#+!·Ÿ#)ˆFB@Öw ÐõZ†«‘Ó°øúk2û¯p#*Û4n;uèÝlKÚ ö îlKrÕ&„JfÀš¹²v5¡w&¸Ý8W¤à€moˆmR"Lytì6Y¸7,Lnç.ªƒ-Ž]ŽA}"…C¶PdÜä§^DZª•,AFÎÏösß$Lâ9˜4¢‘O¥âüVD`Œvi¢´,ªn¨OmcÝîàcÐõ"€¥úõYq‚/7í@îŠæuc/í>©ÑÓ·N„ØÛ´»ÔLuŒztú‰i9M“®ýí§L!v†óõüÌklÑûÙ1,Š%ç…òôa¿oq.ª¾\Ž€üMµø¦qš(|<¥ÜiF#+¨r¾n:¤“¨Õé©©GéíèȎ漉qB'}s¾TïËx%'›4ôf뮹gw³ ‹l6Yøý;6ˆDdSWÏÃ/WVåé΢A|Cª^Ìš×¹@þ½iÐ}ÌšÎtµY½…—T`„ #+b‚ÈÐÍ’Úése'uu6r.KiKk·êyrÝÍ×uÚ¼Q„ËFBÅX㈆†Q(ŠnY)v{¹‘.ce¬¸wlÈ,–E´„"±#)Â:7\0mI’jkʬÊ-¶|÷õÏÉZà1›#)¢¨B£$4 |–,ãÛ`ªuÛÉ“nìVá;~ïâJëp”üK”‹(ÐÔ… XŒ#$õPz¢ª¼n› žp#+@"¥Ð<²#)¢&éø—!ñ³î{S½Ø®¨Š»t$Nî­ I‡@g“Ð.ˆ/Õ#*i™AÙòã/caÍh¦1ÁP¡SšÍŠ×„»™BˆMe†º>5ªåHìÛ}àW¹ ¤vëC0‚Ù_³«#)b žˆn*F¢[föUŽnÃÛ¦š¸í«Bíe›Ù¡ì˜ü–åÍŽMgl—äÀ½ø…ýF2uÄE#)¼K:”ÜüšSç-Þb‚Wê’m)c[bfÕUTù7¨Áê&a&"A#)íÇ®¦ûãÙû«'\¢= Yx‡)´ôÛ‹­¨Ã0(…FB¤grB˜ó ª'9=Þzìë}]Ý¢oìÅX±dM¦†ÇS6Vh¤‰›ø[ðØhÖ¹1T„á¯?³hN ä(Kd*EŠ£¤xìÖ™Ã1Uï§Ñhå1EúzíóÇ#fCDÚňˆ$X=h¡,æyÆj󫤮U1ULå§ ú¾gÄ’©5–•¬µ >"qIñ·£y¼ëš9ñÁÖúo©$¬ÔªB»3Ä{ì÷§@Ï]ïkÀá[ºj‚‘=cj7®çkÏgÔKm&ðŠßÌåܹÀ¸.”SëÔÆɸŸs4„ JApN:l™ÍEÏ×Æ­‡m2LÆ?¯]pËYÔ¡¶“§½Á‰”•R}Aïá}Õ!ž9Φ(šCvê‚ÚÃA ´»†Ê/>!!hl5ç©Vê‚d)p.¿N”E# “¨ к XX)sC‚ ðnÍ@Ôd„#*sV rË (°È îHÈ‹ûœÞì¯WÃ>4Dg‚1 •Ö$~ÑÌ°$‹Ô#)Ô#+‚­A¥×̬ÔÖ hÒk7Y¼»Œ© ¥¨LBˆFõ‘¤WS#*#*0dL0Pqg°ÒÖˆá="ØÃɘj8NÆXRÒz‹A#*``(3ŠS@F“Q ¦ÊÛåuu¶»Ë¯„Æ.¥,0ðÙnäy~Îs‡žxížB&}ØŸ¾$qìM¶EädÜN#*†°€°æûy@TbørȾL£k¶è š3›O—3àpd›Ù¡¤9#)üâPNäή|ëb„yÖ‹’ÈȲ:²;¸Ô¶»ë6âæ]ÅÝ Wd…ÙǦûOºi@,òIÆÎÖ#*•[ä6q>rÉ.0å\3kÛá¯Âzûõ(d½Üf£_°màÉ~úéöðX˜˜™š#*)³Qc÷ô³Ê'HœC…˜-&Å#+©TDhvÏOiþd€ÈAˆæªsF¶¼ÞZ%αÙ0g,#+–N£’wÁÌ3Ú%@…î{nÝÝËòo,¾n<âó ’ Ï€«h˜{Ó*^#+c˜>½MÿÃóaë¢TZˆñ‰ac$œ/ è\)¢(DOÖ”#+« ¦¡yh¹‚©~ ¬¬ãb©#+¦1¡ #*ÐA+$ð¥t˜1'?]‡ˆŠ& ÕçÎó‘P#*"Ó\P‰ïAÒçÒq·z½(Ò“…ÌlÄ&7eú¶¦×É =‚ÅZFtHFØÑ}ãZ0À"'•¦?Æ=Ä4Ä·“QC¸¼ôl©çV}Gd ¡GH¾Ã#)âT“Ãîjªn(šÂ2§’^„ÝÔ•ÇZ«@y­ðÍüªÎF‘)†ù:œ6“t:ùGka¶²Ž=8ÉfY’]•ürmŒUÈ’¨^X³à>w†¨#+¼™Iêõ½T,øQ2xQ#+á£\z›¬¢þÆHy!ŽwD0íµÞÇ•š™-겑µ#M$g!S•`Ób™¥>Êb1èÔX2¶ŠEH¢ƒ¥·ÆÏ,ã…Ãc«¬õkmy3OF£‚kÙصj#+2¯j!FN¨C˜…¦±ûY†žÉç–õ)hÛ²ÆÈS`6ÒcHÍͼôϺpTƒc £*òaÃXÀ[Ý*Ee;±±¦ ¾ò†ämc–#){Zv‹“#)Æ­$ñŸÑß5Ù‹WL–ï f­I Ñ õÙ¹’ÇwX‰§U0Hzq"LYq…†?͵›’÷¯;©¥D—“ìéÃÆÓ£¦6ϺC;#–ÂBTï&ï嘌#*¬Ø¿Æ›ý„Ù ÃŽ&çÛC'¶–­Xn™‹@vEÜE#*b6H’ª¨B  2&.A#P;áZ¾v—MòË’²”rZ«Á@ƒر¶“ä,\/ËÄ¥ qJª“D¢MC°ÁsA›¦ŒÐáA´¢a‚% f´nh4“Q(Q#*ÓFÚa#+a&¢d˜lØ;7-2Ëtp£#+ ©1h ¥ÖÒE“„Ú2V“ƒ"""ÈÃX´0dLÒU)hn†Ž8Q4-‹" X 1f“ÂÈ­[&fVî£á÷Iâ]·sߎYÝML™Í5#•ê I¾^LÆ­ŠÎ ÄÞÏ7C¬ÄJ=èÖ9‘°ƒŒt8¢„gf ˨_ØÃ;*1h¤ 'æbÇãÓG—”+Æ\{HƉ#*“* @›RáÁ Óôª#)Ù°í„k/ I0—GåÇØÙ̺>|ä†Æ¥½hYJˆÑª)r! .ï6øÓXD.š=ZΈ´À6ïá8#× >ÇeÑ€šÈó44Ó-”›åÏÏWßüút^aª¯gÂtš“×z‰dMtSŒ[w–é ••/ž4©ívÌf©]€Î6„0…•ÀàðÔÉTSâ“B²æ(²N»5gØAF]±ú!¶&¦|¼‹#+ˆ.{+Empµó½d6&ºMæ+&Rhú‘9jwpD Ó-²0>-™ÊD†ú9ÎÖK‘gÀº#*¡B;üànèý°ê’Ùë œ~mÆí9™ggähA°dN9X¦ß›ÑÔN„|ö•ß£±ÝB °!D±¡DÐE‰Ï% #*&3ï÷Ò’¯ŠÁC…‡K0ÒÂ#)•F$ÔI “:É$sMÐeXŒ<5\ldµ¾µ°aÑ#)!yåÍ6:à1@iØ5‰i²$#)„ jMÁ„Œ%#*Úù7‡è»›&&À­Y—¤=˜5{‹Q#À{þ ³¿»/ÞNäR@I¶u®Ìô•ç¤ß9‘ YŠ^ï|•6¤b]*#)4&¥Ì¢ðÕÕ‹ÁøÜ&Z+NòNr?#+¹¨e)Á‰ù™,̸¨bœ¥ú;õ}Àƒ<Ð Œ@TnwÎÒÊxÓ<éì>x’HB¦­~eÏÜA`V­Eµâ£W-[cZÚŠÚ¹­¹²È€2(A!CBì<5_œ¸œˆ_¹Æ#+)«ª:¤ë6Û¹W*¦@š33Òp:Kã•á†s³¬#*ôç#*ƒS²rÁ‰¼YúqœS(hÆô–Þ™å #)àŒ#«3—7ZuïïKEF£>ê6%øv„Û‹‡m¦ê%ËA<Ì,ã©]‚õ\vidZ¿Æ—CZFú“|wë‚.µ­vc±êÌ núðµÒ6—óˆö—_`?ø¡¿YBß~+˜Èè6&Û pÀÈʦAáJšØýZø^Ûoů±bc- £1³Y6ŠŠ#d´Ë(„a;3ãçŸQ†íè·bÀLØQ×4àíø3³ÙŸcÌÍ7›œa‡¯AfŠJg9 W–œ8Ć62i\û®[é®å/c°zCŸÄH `MþÒ”›WS·aèéOŽÕûóÇ=G"Ã!v¨NŠ¢ÀJè/™Ö4JËô|,ܸŽäÏž†›rÅ%œ¨†Ü‹}bóÑ×D!×UVm\jQJA(U$I#)‹Ø™1ç[ÒÿWW×p‘öL£~ݶþYwÖ1ðšRüüâ(é2‰F^#*>Ûp}1ŒcÇ"$•o7Û|^ZàèÜžrXL´g/.Û>^?Î#+ø‰³ƒû5¤þ#*jè*’[i¾½°ÞÓ‡îe¸¥…†*t*.#+mfà8ÅXèPÎù†úVÚó¦Ç(iÅl£˜_€€zРQ›g¾ôrÁ ‚Iú¯›WÅ­ò`µº L¡|dŽ»j:÷ä½órß¡ñºe8yaŠÊc¡ni§q=æxK›C Í®Æyapü& EJzŸ3\ˆ{ßeá%+iÄi™¤òï¤Ò(P”?KÇÕ GdêpÚNB"T]¦SÄbY=¶ÍP¡#)Æ­®ôu;¡²/©Nº6ÞËmÌ̽á–Ê"lG¡ì9 ve…óúf«§–½SËnþÖìîäÈÙIrÝð'SVú5:„õW§´Þ]v>OˆÁãA8}_Eq½ÿAÓi9¤*HgŽtwÔœË#*ÚÁ¸YÑ5V\Ú0>x’æ˜$ÇIçHݘ5êΙwJ±Õ†B¹äêh`Á«›ÌX;!÷67¶ŒLjL¾ =ù_mbí¨Ç.›îPq°¶ž#ZÐ'¥œË=§å˜¤ :ØÑ5% ÜšÀ„ ­öÄ0ÿ{¶ñ01€l´“¼G¯ji¦jë%\X´5Ùòvxãͽ4V 4ØZMDxç‡<üÉïYÛ0gµ;iʼ¼bL²ãj-è‰Y»Û5™Éœ^ŒW7ÅN·­Å#:LèNèvØÚÐõYšÛ6Pñ#ccYÐÔw߬n×(}q|oWÄî²a…3™§¦è:Ó;1¢dÆ9Ž°„LJ©n5´š£Íš']ºß—ÊßQt×\PÄ##)^Nò”:±¡µÑ82%­pd™"^­!ä\´°»¨(2CAl(¸jS }5\7š¢¨HÂIÓlª^mK‘ a+a[æâ*ɾ÷UµìŒ¦„!2Æ(1ª¸ ØÙž¼§ŽY5‡«òíd 7ç—s%}“Ë.’ÊùÕoÉͧ)8ÇRÚcLÌÜÐcZXƒ!”ŤÜL—¨Ç2@ª&ßhƒ”Cà†–I¶5$äËÁmÉ·wŽHÝ0냦`á\ö§%‹C’šõ“j£–3fà HâA–ÌÃìí ˆÐ—#üÁÄ5ï™NºD©#*@\Ü@;ÂaÙ#+ši[ÙT싇ZN#)]`¹rmep œnçô‘¼%–Ì>ÎPiI#+4óÉ6I‡ƒjvÅ0,¶iQ!³é¥ØXlhÍÍÌpÑÏNVŸNÚ]#* ºQH.q¼†Æ.¶bÔJ2¦E ›6™äz…Èr'i3…jR}¶huhfá…,ˆÖGmõ¢çHBºfY|c90ÌÒB P×±!¾j1»½ý%EàÖ‡N74BbeÓŸŽK„Œ„7èîŒÔm´píƒpRj¯âã#*'Œ5xîs/ps[Dìr·‘1„Qvkwg·JÃ]Þq•ÛÂEBIìÙB –HÄ9ú”amoaq&õ•ØS‹™™ŒLMæxÔ;dçv±•ð#*o!Õé8fÜÈm¢qãKf‰¹¼s%O6;ª‘éÔ!,ÙH¹D»¨#+¤®%'©ˆE@ª‰IæQ(îšQnâ\ñ11ˆyññÖxƧ#+3§¡[›ÃÌáæTB¥Uqx‡Úk ¨ÙZGžÏä‡-é,­ÊƒyóÓã.‰vÆX¨Ì¼!$œª‹UH–ÔÑ-‹„ÌG€5–fêJ½1·[ƒs2ú™Bº9‰“†H4qÆ:jn¬21É O)&PmV†Ìâë\—[™lÖfõŽ™5,yU–LbÇ0vB‰ÓW5£YÓÖ™fBÞ0Ì £Ý+.ì2çÎêç#+ªAâÎ1¬“BåPÜÒ Õi:§c=ÞX­‡°¨Âj8rËUW8Šbvg±ËN+X©0Nø4a©Ë 9Þåqä{Á¨·É"aNû+â(0àe#+Bu öó›Rõ`h©µÄE8($ÔÍN–3L#Itq…FõîXrm\1Ü&ÖÌÔ¯½©cQ²ê¤EÒÂ%*‘ÚrÕK#*tÓ1#>"<4[»K5ýl^«¼;6ÜåZÛ|g®È95{ÛdæŠmP)MÂÝç#)º¡$Ì 0ñoj9ÆÄÙ‘²‹ë4tP)Q´IÂÊI@ìÍæxúªÄ°… iÙ4J¥L©Ù‹¶TwdZ>h€!#)4Ãß“B£Xž¡#+_,nÛ¦Pí„&R Ìá‰Ë°dY‘Ù°Ž¥ܱÑ>á!ÿÐá‘W<ÖDwÀ6é"ðd^»åÉDk¡H¤Š1Ršd-œXZ‰‡vCϤ0é‹C€ÊÇgys( AÍ1š® Âej‰–³7Õ)©š a–D@ÈÓJ l”ͪ”‹—viÛZéN”(XŽ”S7p‚ÛͤˆËC a9ëZf¦É)!…Šè윒ZE´¦æ¶O7"eÈÁÒ¤âÌ<Á0ÈjËÖ¥:3T#*°æ˜Jã\ÙÁsC…U¶ xò¬eV'—'qøƒ#+­¹X¡àèÑ¢Ó@¥Nœ"g¨…ØÊ ãc8zŒöf\»#)CÔPà†È1Œ6`ÚuFòjlAé;H–wnË—Û¶L>Ð8è·ŽHy}×hn|Jãfå«n#+eɪó™>ã—Êt¶C›Ê¡WŽ4TÎ…õJ.ô½ßc¢vk\8RÎÒ¬˜³ˆÎ ÔÁ|`5Œ`pËî¸ÅG5D´Lbð¥ñ®¬]CC[¸.Œa½n–œ!“ŠÏ!©ÏaA¦WíÉ„˜™ÓŒPiIÛ+] gw6÷¾ü2Ç­Ìï—æf ²„9i 7U@88û±³0…6šD¼rî+„Ýx¤½WÁ\Ö+Ùr»º¹kǦ©-Nô\)–Ä``i’ÚÏêÀè’âãA.NâˆÑÔGI–F1¶ÂHÀcfÒíåxüÚæË•c¬ik#¿í*F ï%‚Dv ‡JíèlËRQ]+y¦—"€9 aÔ4ë8†æy¬r¡˜2„6(kX›mlá.@!µÛlyˆkCŽûÈ¡¢#*F+2fisÄØÜ l³3Y†ÅÖ…²U)¡ÎQÓ#)e2É•%d#)rá¹™#+9ŽÅ‡32£ðÆŽäp‚UC=N A‚#*ŒBÀÑÙ¾ŒpÙÂ+q‰%ÛʈÝÒÐÎhÎ2\fÐÜ$#*†DN4”;œÄÅ1Í‹ FÃ9²4SlÁdÌž)Iy#pt( q“3a4ìnf:Í«™t5Ž‹³aÁ¢ê23i…“RR8Æ‹Æv´±={›f¤Í¨Ûss!€¦D‰w[ÎpÌ #)ÅC¨@Àî#)bú†âgT£Ä‘„bõ€% °‚P¡ú·?ÈI„MDÐìÎðTÚ)¬¡rˆûR‘(#_é×ÅGǼ=ý …ÔŠö´I$IddŒ’BO}Q¸úöcœ€Q€"'T:F韡ˆÔ‘Blƒ@Q(#+‹@D3ŒÀ™#)ÀP.àH;²Óß–³ÈÏ‹ i°p‡é…‚IñNÙUI‡Ã>”ÜâV›Cûuœü®Ëâu âv,áÅ¥ÍÁ«”¦kFñ“wë-ÖQEÜ‹h^uËïµÄL«4ó¸ëá›&Rc'j_ÃXGåxÎœk—’ÛW g`ÐÉÍ`f!æƒxFì##¶<fó¡-°[,pCÃp„"ÁŽŒo· ë úÍŵ²Rän„¹ÂK” A#ÈpBÿ:ì‚ 4Ñ*D•Q*4Ëkñ¦j¬›ÉIªÔÚÕåðQ#+"ïðŠPT!Ó Ô&) óïæ‘2­éЩ 4¤B¨,Ô'^8ª(É¥ÊÏgpÄ2C¹~ò‹u6ô|Ù§b¯À ‚*¹EUÝónR Z¾•Ë÷Õ9uwu]˜Öë»2æë¦ê‚×6Jþ槗ïîì‹[äÕìvˆê¡àK…ï½#)\vÊc±Tw ;7Àüø#)ä$3äñC¡}ÄCŒãÌ¡ƒ8‘jÔQæaGSÜ`=¥?Htsáßב´}+¾ÆóðÕ&EÃò‡ô™‚·Aääý-•ö`Ùþ'Íðc–Ñì̾B6ÊzîçfiZLPOB0@cK.ªõ6£xº e ÀöøLfà´kü;[&ÐdBšb±oQ*¥4#+:\sq„¹v´¤Î‘s.7Ê ’ ýƒÑÇ#4"Î愈k;ϵ‰˜‡ë"Ûñ·‡€\¹b^®”èz#”o$±‘57Îý‹ù=~ã_b«M¢IL¶*±¢Ñµ£j$Æ¢&I°f™–DQm‹¯§ã©$Be¢|±Ç†•¢§h‚•Ô§#*œû—$È2]åÑÔv@Y«°CÒæ‘¢#÷Ý؈šð´Ad±#´ÂL#À+$Ej;Håm U‹qy€ÍÂx:žosשÔ2ÁÔôÑi;¦kþD{Œ5î|¨á™)ƒKõXQ¤‰s>5a¼$ô€'-ZDŒW‰@Hm<ùä®2¼3+¬ƒêi¢™¨0É…–á#ÎÅH7üGEi1¥Ž´‘d#ÜBn^šÕʺU|›z—¦Þ„j™#+°.ÉŒ[2”²bš+ÜaZ\34B1c@ÔsùÎ2‘3cÅw,!hF¶¾X#+Dü]ˆðªDˆÁÇÆäh8Y (ÛIƒ@U~ªXž8ªM;¹ˆ&T»ïÂyþš;byÞ¥¥\ä™7»j.â"­ ††ôC‰µË}ë Úc* 6È5$*G/z¥.G­5ÝàÛÜD¢Ñ; tfõ$^&Ž’ІäŒ6ÚfjÃLâ*qLuquEÔLhF1IoÄGTK&Bºäf¬¯:ql¼? ã#)=¡ìIæz{J˜(À*À-!VD˜S04ªýÓx#F%ûÆ…¬*’ðU÷Ø#*±D3‚0cº#*ƒ4þ$À!°|µ÷KxÅz[úÌÇòý4g<0æFÖ:N%E`Ö™ú7p£˜ÀßQr0«s|œªÚ## ‘qöe]²cûÊCNH¦§gØå÷›DÒ˜oÃ8ªßÂæÃwhº"4ˆŠïTØuñ£L4úãAÈÑ´-«ã…¥¥jÖAl"¿–á$á‡2k³B¨TLí³H#+g‘NÇ6:Ç™ÍÅ®(láã¡Y·MŒ{”^ZÖH8[΃3™<Ÿ#)÷¾æÖU¸ehÃå ¨ýúN¦Ã¥‘œ¤Í¹=†Œ’(Jv›n­N#+•Ë‘ö>!ã5¼¡ïè#*-h¥õq\MoŽvÎ^øA¸ÕY[ QÑY½¨äØr­$®E#*“{9éÃYÞ%lšeäʵS0:2¥K‹ßl4ïµi¶“vl“t2Vø»–¯V1FÛÜlc6h9Äq£šHÒ.™KÄӃƶð¤¶Ê> s7’a”ã 6ÍWIT%³/4ò嫈’öçŒáöäD´¬SNDIžRá©7DMÌ—C€é‡ÚsF7Êš€ˆ¼Œ1­N·ÉÄÉÍ£qNv˧º£~Q&˜Ç؈ƒh5)ßa=`C§‡8·Š´Û§ E2±J|Å&-MØ 31Î5Ä™›µ3žµfgS´œb¨i½ðyXÛz›Mp“\ÎJùš}d£3œ}æxdÇ·ÔW!2„dž9lð4(ÚwM‡ƒc&úU/“›dØ¢™­¨sLêgïgjRP@Æc$"1a¹9ã czÕºR‚,"ˆÁ`‹L1É`´mYGË]¾qµK¥ŒŠ¥%!Ð##+\¨ŒP ´0hH¥ƒhmQª’†” "D‹"·5œÒèP@@`Œ’~äË V¬,0ÜqJÓʹ¢ƒÔƒ€ØØ"í²8ÆqUv‡;bì×MŠŽî¯I#ÊV¬e’¦HÜ!²ŽæVÁ‰­ÒÍ75t*ê×i5ƒt®ë®î)7Šå¯]®L´í<Ýw™W“bcJÝMní4H¤‰,ÊÍø)80¥Ú6x¯m¸­·Œ¥´Ê¤²“"lÖ6Æ´ÔŠfº–ºV–RÒÉm,Êšª4ú5òóÂj6¨0X©š-[IŠ± B*BËzüŒÞH:#+ü£cV©@YKj@æÁD8¦EØd0 (TM¦æÐ ¥Ø”D ACœAìnŠùDv‘AÚ{,œñ=$# ¡Øóý²–œr,¦¡¯Úmúsýj‡œ'>bŠ è ï@¶a€´èµ¬¸Á‡fn¼´±°51bÜ  HÈhûìê$Ì•5,aâÕi¶“ŽiŠ§‰ÛæØÜCЩ6¥O‚}oßd@êŠ\b•*©Fˆ„‚ÔBàÅ,þ Z2"S ¨F;¤†ÒïÜò„ðüiâw®œo.Ž‘†kGìÔeÃ]‹}yº,n§å#)ת 2!Mi­K‘Ù˜ˆ<«…­L¦Ez鄤0©"@ŠÑª÷éêýŽý¼µ†Çsdx†ñàc‰ž újõ.\*;öóÔì6Ÿzi¿p¿C~–g%éT2r "¬ËŽ-Ž#r­ý9™,æå!3`ZI!æÈ!“kÉ*ð—¤*“ k„˜8噧&¶(\¨Ž :aÂë%e²;N_#6Yð f”Ký[Z‰­8&›ajt'áwM¬íÈ 3 ¤š·÷(}JªD#)Œ"¡Þøú¾v5Òû¯™±¼“¼áež*²øÌ£_¯ôä](’:~B’IBv{[Vñ¥ã²Z¨€þÿº£VH¼]…ÒLª12I¹­®E”2Ñ5’b·¾íZäÓi´e-¤ÙFŤE4Ë%”ÉJ¢˜¥›P)F~EÖÚ³LÃfÐÌi‰6Š*ÔÖ©¢zqEdV¥w]6¡/«iÚÍ^Ý»*b(2#+f¶ÒŒÖ”¶¤ÚÄš1iUû«UÖ¾—"XÕïݲM‘E¬l•­¶D’&Ùµ­Ë­-LªI©m¼ó¯)Q-6›(L¦¬6Ú[6“{:µ©mŒb¢ƒWÌhJ~=;6û„@=ã¿ÅïçÚºÎ6óv#*çG±±Ý][{éLcÚšÓPô„P,Àý;nÉÞù »!&'ù¿ÅÀ«–‚Îx…Q®\‰úþ»ÌŸÌyìíË^›)6†#*¥iÿÖþ¾XV·¹YlQ´2²’$QŒhÑœÕRhÖ4C DÈÂ6À­‡¼D5$Öê-pÁ´#*‘‚9m&ˆRÍ(¦7#JhÃ\Ã#*cŠ±¬Œ‚h¼°Š³†7#*»KTŠ3› ˆl LÐÝeq‹±Å,TCD.ÚXUTŠƺ]$ ˜*Z´÷è¨1£ñMnx$œé˜W’¶âÓâëUc^o#ŽMÉ! y§h^õ Q‰¡²ÒÛˆoŠkÙŒ»±“4!¸L «}IfÈzIYS*#oÓ½#*àþœ›ãCòü¸{öcÂô2>þÅHT#áÓJ)Xùö˜`üh˜øæb¾Ú!ºE›¡X R$ÕÒS$™>]ˆZ¾<¶.¬_;ö¤ 8RñN0$ ‡™µœÅýS䘵 àü>¶&µÂ¶ïm%ãü¼¦šm£jõiå&4jRRy´zj"²„Ô…Ž@£2>8#*¸>Öw8æ篌ì’ä1vb]00ŽÌÍ…PȵHÏ à=G"Ö÷’3Tm´âp Ëéí©Ü¡\}js¢f‹F¤„ÉÃ'`²Ãa¨‰«Zô­t0Q¥ii¿}'Sé~éUŒDì=9”Jª^¬¨‚P'–e\fzÕ:q»ò•yì°êD#)€É ÉÁê÷Nbœ¥CŽ“J&˜õ & @C8„D»Ï¾½¿w~è>g—áÚ©4¡Ë7õŽ¢áuEÕËiÃÎÒ`€sCgÀ|#*#)Q0jHõ¢Â¹»ˆšÇïó„瓘ú­(7׎±™…74Lmu¢‰Ú#¨€MCgÓ—­@îíËïÄ&ä¶æÆíMD#*ÄÓ’5Œ˜ÕŒ-8ŠvÄÏI±Ô9:ÌbÚË‘(ÖK­€!¨™1ÎÓ€8rUb*ú¨¥^ž²õâzvœ3»¬ÞVÌòT.4ï;¡3sÎŒø9ö Ðb‘*,R¡)Œ`f‹"DB —¥×*¯zïšIÚÚJXB“%ÉË9˜FœCqp¿£GàîÚH¡Í]ໃiH¢tGV#+‘ $iU8Œ@ ŠïÁb È# ꢱ˜$¢»™‹„ \Yu«JIK‹NzîÆszîLo;®îõ›ØƒœSÍ>­÷5&#*æÁH©µR*Šª†ÌZô­D´†‰I4ªuÔ›3‘¦†ÚêXˆÚ|µÅDÉ$ Ë"de<ís›‰.W[rY¥Ï<ëAâxñŸkzËÎä' "#)$lŒá­`Ü1 çéÛv»ÕEš%0ÐXpe§2Q0{º–Ý„'Cü[Ñ›cÛ[J;¥PaŸ*C·Z&»ã=ËÚ#Ûm°ÝÏ>[øtuÖ­ ë࣯ Y8Î,×–)B¯ -ÂñXµLTªÍ,©±»°K¯áÔ˜Šé¨8RŽ„6øyçͨ:c¯£Ù‘éi]ÏP¦áA:¸´íÊBúëÂ'n3Œ|sÒ+tÄF,Âzvlt•-~} -$Ö@U&j˜*ÈÃíü°h9;˜%žþ©ëD(YzwÜ°À—€jN,0â©‚e캒EÖ—®µzròåÞ7Rmõ·dLÊ$'zó^­^µt“c7m«ww@5*Ha(’™´Qcš°O;·„Õ˘¥ì”¼ËUCV(ÅiH@M6ïÛß;›ÒÚ"Žè¯´º›»µh»4z&cèúvñŠD §¬¹½‹íðœú³¹RãMpÜuH§ÞwÞêf“=û™5~´½/kë]f"±‘‚’~¶‡t¤ÚÃZ¿kZõhÕ“j¬ŒÃý©ÁP:U2dfÃ`mEouM4m(¢Ö«”iTÓI¥¥ºè¹·C“Y‹hÛó*ÜŒXŠÑ­|iEUéz^¦Ö¼nZË6þóûÞñ¶É«i¶km¥é::byôÐÅ) *p%—Î\TâMHùÍÃ#*Kƒ8 –BЊRâ2DZq1'+C oЂØM†ñ2P‡rËHD}¯…ç:ÈÐÖY4‰–°´š¤•wfa#*r½5ølmØ›=›œ €IŸ>l#*“¼Ühov^¸§¶J*”_ô„rÖ-0¢v&èŒà¬…¥!m…OÊ©Teª³Ò‚¡WK$š¼Ã2£Í†YÖp€ëÖàtîó£!ÙÓU#+#Q#+ŠD‰UKLŠ&ÑTju¶Ûªµôïfé^#¡„k„*7Ë/a7 ¹fä{ª+†»ab·(ôÁ ”‚dYQ·½óãÅõ†÷y8ൢƒ:uˆ²-Ɔ€‰²#)ó,¥¬ôI÷íà)œM3ðÇ×þü#)vºDÖä[Bê‚NgÀÙŒ(4dˆA(þèš¿ë°ä³CŸ•Ï®ým©°wÃÅQ–‡€¢,#*„Aéä ¢{ök‚ ‘ªCb%ò58þ\4ùj™m¯³ü÷¢9üGákè D‡T]°õdÞˆn»&ߥ¡=ŇœwuŒðºyB¼U¡Í?o“ÜG àìì}/Ž?Š$D‡'&\^¾ˆo¯Ì£¦ûºBónÍŸÕðC¼! ˆÏ¼äP:Í€ç¾Õ؃â#µ_›Íô_å;^Hž$PRI‘Dë #+J¥*#+¡DUYXD¨©PPfŽälY€¡x@ ‘,‚ä‰%f¸añ¾¤Nìk3.?Þ†=Ž·3Rº0V(,i,X)ÀÊ6Bý¹î\r;”é>«SìSQù~Ý«Ëj± DŸ@ô$›SОģC˜N/P¼läV_Ôþ€å$¤ ÂPÀ‡eø–ÈwGÜÉj‘BÒR+†—‘D‡o×ØøŸ,Âïª11Yøz¼ùqa8X8¢j܉ó8:ÎÓœdŠÓaí¨#u›¼…AÚ5m,WÀ»5¦ XiË.Ì·œû¨ô§Ü¤NÒ*^D’"tÈa±æ5ðÙ°¾¤—TY*¥6È.j§ó³,?6a&šòìuCFª ±QV$6kù­y ´ÐDj6€dÀîÈaX¡†Z? °QÖú){~å]j¬iRD@‚›]C–*H¢†0PžrÜ5uÉ8b¤™EX¤®wγ##*ÛŽ‰fQ“"#+×Rf²ÚâXÄj°+HìÍ46„úˆÀf˜ÚPŽ)11Ò#*ŒµYÆTdÅE‚ˆ˜´«a)’©”Vk²ÙÁ”€ÝBS ,†‰H춨„)&Y#+³p–›2SŒPa D‹²X„Æõ!l –’•‹#*m&4‚±6–ò!ÀÆFFs•ËÚ!0! «-&‰•hÌ „´µƒtªÒÁ ‘¼–7 6È«#+Ãp´X›Õ¬«L°rt5¶ŽÞÝ{{öÛÁŠòwvwnk–¹sV6•Ý+–åQ\·/ƒxĘ׮ïK.»o‹dÁ®IŠç4\3•¨lêApÌjÓ´KŒ&Di:3±öu˜i–4ßÃZ±1£–(\'(2ƤÙÕ#*ª0%ÓI@ 8ZÖÔ¬¬<5MSÏXÛ3¥‰b]ÆW¾ìµØ?±4ì}0œÆA,¾çmˆ*[l“ʤÀ…ÍZxpu±»õ>KϦ4ÀˆšÌoªÝçn¼™n³MÖn²‹«áùqý”Â1Ó ÍÇžVàqãìz~#*áÝ£ .H(ó MTÖÔ?<û Ñ 0€À«Š¯X1 «ûãÜE•DˆFåæ¶5*Y-UvØÆ•d¼[¤ªŒ,k\µWR±«m·7[d´ÓX™%ƒ YPuŠ«#)–¥II¼²n>”ýaäXv¨j ¤,b$"Ò?»yÞ}_A`5~ôUXŒ³ƒ¿é®¿w}XõŽ¦Qc×/«ÈÍrCCËPbP¤Š­PBªT`T"¯ÆáP—*(R$åþ 0 …ˆàã:njÄ€çºêù+q˜„§3Ú‡-£›ˆ’" ^å8ʵáQíû‹¿Õá ~'ÇG^ÌJ8×V¹ "ÒuˆÄjS«6a k‚907ÓM‡ƒrb&'üD¦Å0Ù#*d†IPŠ0¡l0F¡fœj±RF¨¦y#+!®l¿ îäi=ŽÍÈ5Ï$w¡¾L±Ã\jð…‚f÷bäv¬C<¡ÿŸ÷òZK&$HànÙdÁá&l½¡‘Ç^zÂŒìgR}ÔÉϘŸ:z#)CÒûV€r®Ì”>?#)Õ8 $j<#)¶Æáãj4[Ö"Ùƒ RRd³Lŵ5´µ&Æ´d˜Êkõev “DÊ™igìµnm©™jl‹E 3X%lÅSÆÛ5T­6²Ìµ™m–"Ö-(Š¦ÔÌMš¬Ñ4Õ6ÅUE°¥ Í¦Ï}WÊþfêÛöû&¿Nãç~EÓ–üÙlµ$"jp+#ÕãúÛ¤µ¹¶ŠÖºœÛjµ‹]Mk\ÖìÞ#+¼Â£ßÁ´×¨¡µ°IÁiÌîêá '@6Ѳ6æ®s·6(¤º—å´·¶Ùê’ ø]‘Ê^”èŠúöÐFBD2$N8À¤‡ÒÑ0)ö¨ 0üÙ‡“‚|Ù1q@a>ÎVGœ{æÅ1jéC¿ž~ þ‡N€'( %J€² whzÓ¡#*úØ‘óÐQ!•(dñI-$$)#+@ý‘nAö¥ºE"#+Tõ¡3Ë=»¶\ׂÁ‹#)%ªÇ S">³¿Ê¥§m©#*±¹%Éê"¶éMà\˨¹”Òõ™™ƒÀß¿<º«€ÏïRÂÀк…®D+ñ½½þJ§'`4Œñ=#¤VNÂOy„£°9×Wwj2jÃéï6˜x#)!ÅçÖ¡›¼ƒ¸€p[5v›»ËAÕ‚o/ “Ç•7# Hp¡’m`q>»#*Sø9m+¥.â!Fb+BCCD‘Â6°L¿Ð¼£LÑÓ°„,ÜXšË•;Þçì:>1J=h}¿”º‡Û ¹œ~n¶kIêµP¿²)øIötSBó‡Úeµ §¹'s«ý|a®#)p® ¬-Aç®×_Ï‘ÑŠQ’÷ýÚðãž7oåñ¡çE/6¡ p)¬ß‘µ¾°³’¼3§ñäÀŸ'×ë )&©#+§Y A””²’„´ ,˜Sßñð4Ç]«Pù&云kÑe•ˆeIŠß…׬z _;ª‘#*ûxƒoMt#)‡Oñÿ»È ²å˜­µ1¦¬²É‚ ‘Œò¢´Ž!n[$#M0©Ø )#m$_/w·ìÁ£ Ý)œùb`H‹¥E)ƒ—°·*#Ó²vDIUãÆVŠ´@Z-QzÖal¢ ¸£Á5«OšâÞv=òñ 5#)Ù“=UZH_#)ÁÛæÙ,H ™B™ˆʆðŒPjp´ ûjETq1¶Ö4s#D‰>¸€i‚‘@ ¯L`)ªv@§G—­çðÒçžeê’Àá5ÀÕÂöΰŽ3­æñ¡µÉ—I#+5ˆàÂ3‹Œ@!ádêuhA ë†ð-íÐÍ-ç-1¡‡4X…”þñ dîxžža,H2:#+0ˆÒ ‘0…B’†Å4#*K …‘)Š¡ ÊNMœõx¨†vi=>~½Ö(è:À>ß0C.¾jú]½¾$Núª$dG ”É!ETB›G|¶«bªŽúOb~)¦]ÈÁ­àfÑ·ôÄ!,ƒç4FDZŸ&NAóŸBÜ`5±Ý®lÔtfë,”'e[_e·ç·¶ÛÛƽ#já©0‘QØSAˆSR0×èßÓ3Ãå’¢„æÈRBn©FPÉ,¬KØ­¢¢±­õù^g­ïD¥ÓÇI¼¹L”…Þyå#o¼é"½ $M¶[QR]Áªo(²(|Íq"!‡Äª‚‘¢(‡YÐÆ]ÚÐi¦u¢Ó#|½-0"`ÁÓdƒKùÈbz ¸¦Š£$mŠq£IÎ×I2íâ05“ÙâÍ3±-±äS‘.î’¿80ˆûiÝqâÐÛ*JåÊ–W"€Ka·­'óník#)þ„‚D‰•º¨EOy©$($4#*²¨q[ñ¶BqK â¼]FžCl Áã–&M›eÖ” je 5VWE·[Ñ$F¥”¬ŽÂB q‡’?5î‘À2·wbÄý¤Íè€hGràE<3ƒ¢§U6‡ÍD]‰ç_Û1"bvÁ'P e;dÙeƒgÍÙÒRħêλ¨Ð#4öû=*ÔíªŠv8—Z¥mÍP›ˆ^OMWñ«MsœÞ(@d'/m1òÎ ãƒ,'=¥QC®0òÖ³´B×oô~ÔéÕÓå®ä[æ¶5‘ÔPPÒZ³cyq»UÝÕR‘Eµ^²Ýu4»^3bÑ(Þ–)²DTqŒa[áÜPxê¦AOi#),ÀH®Íþ™ÕõŠ#)vgœoˆ€åþm½0€WöWÛ®0Ýçà5¹°ÈßÒjêõ™( 2#)²ˆ!Åã¡GHGR:Dz÷`­‚JµX–#*ÚØ@\#)q8—¼Rü`õúh#*}]^HjÛ¼íÓ2jÜYÖ“8›‹ê}Þ—V¹žIæ©êð”Äò “¡ŠMè È’B$ÆÆ’b…°j •Äˆ&äÛM¬›mRm´²ñä£ZT…Hˆ2¨”c,@ ÏÏú=ç¼ðB°d?è¡vî­i|%À›Bn%I ¸û-³ú½ë[Cb¶CCàU³-¤0 3U;¥ià]¾=¡M»½·®Ò±»¢ái— Ʊª4 öš¹I^eæ^5%ªæÞ^;WKj˜#+¢-2Ð0å­,¶f«(E¶›»ÎŽšg½¤rêé/óåEÎ!cLL9xô¡5ªbÀ¯P#X¡²ed9diä%»¦<yŒÛ#hÔH„$lÉx0á¬þ½«@#*­½¼9 öñ‹B,\*…°ii@eàÄ3l¶b8†©wn_\þ\ç;*gâjI –KÚUŠ8è#)ʘˊž|ë³° ¿ 6'!>ŸM-.r­Þïg¨^ÀCôÎu ؈›'ù·;I¦“Ãá8š'½ÜIÏ­#)}t%u@1$D8 ×y•šK*5’¶&Z6KI«cT¦µùÕ~VÚL®»U=ÖÙlX[$¤)#+a 0?OBz ‹ÃòïK˜Øò¹e(¹·›j˜8 ã´UXz;-f¬…Cß5"”ãÌå×ËFžì²ËŠ«Ÿ×®|ÅÖØøª7ׂ02¶Wº¨;nõ²| âê<³ˆU¶åÛoUx$˜§Á#*ýk¢È¶‚ËÍðŸ #*Iä·Ø¹¨Úa$Ñ8UA‰vSÀ&·Ólw×?™Í¹ï†û)ôÄÖH"Ð7ªˆ ¡#rž†)1{l.¸ßop0ˆ²B1Ž¼ó¿VýÉFyä#c¼ù½ð7ÄCD‰¤0Iƒ®%¬:EGs“|AAÓo-/Ù3¤m]'щ)MA=gÁKá.öú¶Å¹ò6H_³Æ:›ïmÓô¹ÖŽ=;’Õv9ÅÛÈìÖÐÈ@ëóxâFýØ?™åJª@(/#+6¿‘eg‡9ë máÔ7¢õ¢>G‚ª>Üé ³iëíúîؼ`Rv…@ñï £!*íŒnQvÚRÕ»f…ï‚ÄMü–O6Bdm@8LÊŒÒZ¼òAÄê²ÅÚ)­ ÛØy~LM¥÷Á¶²"&V¶Ð\s!JD»‚„H@zp.¥É†çÂÓ‘çÀ†‡.äǬJ¾ÁÙ Í[Õ#+y°aB`*• û {P›œ'û¼6àGÑÔ1…åÛ09ô_(žŒG”·1Œ>Na{{D-¨ï<ð¬j5ÝÛÓmÍ:mVÌ\U#*¡$‰HH0‘Q·‘KAŠCo³UïÌ£éݨ#*Á•([¼Ú¹„õÇüÿy~¼ÉuAb ,Zk€¶°º,D#&:É’Q–"¢ÄH0n°lP±Hà¤p˜”M$…PofK>E„ AÃ!š#'‹v®#*”¿sóÈóDïÁéôcÚ/yê»tT’a¿èÿ_ÎÜ 9&­-ÒV)7‰ëEöîO†iøîÙË–8›¦•å΃¶ž=q#*~ÁóhiѦî‚`†Ì5bË$ &ᢓËPŽoÍAë%ÀIÓTª)1¡Ð`Fœ#w#ÈIj¶"ü’óhäkÝ‘XHš²Œå’Šä½HßÚ‡XŸ&¡ÏO‡ÛÈ>«%2jlqî‡ÁìqŘƒ‡N•F’#rs*+A°×ZëšîÜ·WYµ4Õ”µgnÚº“d•¶Í5ªê¶4W)—‹——v•¼­o£,Ñd#)ˆ #)d›:0Ô¦ªlê(† }~z¥+MzŠPS†nœ­ÔÎk.Ea„ŠQµöÐ,#+I¾=—Å”›¾¸?ø5Ò`ë|~‘ádd„µ|Ø…‚_Û“”œƒcPÔÇ–Õ&üÚ‘Aª#+Ú¤“sc£ ðÿ^álxÐl6%´ÀÎjC"j“PÈ4FXl=œ‡ƒ¸jÎÆ$RÈZ±`„#4 g·Õú7¨Nè9S-VÞM¹”dmÐL¯Oj†³¯ƒÞnW&VBÞ~ÐlÈõÎ>êî7í Qˆ#)Ï2æô}M÷ïBÆMØð=Z‚¼uJøtyÜÁ€ëwÛÏ©ày•'¥·õ|ù_ûºìhª#f€òQuÌ:eaú·Ï s£¥lá1Gèk}8¯ª¨«¥¥ÐIDdPÀ+ÄŸ©ß/ëý¿×ÿWðo²À-OæDàÎSßRú¿$Åö]'v5ÂkŠPX‰·çˆ±²ð¹ßSX§%DAÀµ¶&Œ‚¤?9¬½à-`û6ÌÌ5¯ãºµ „.HÛy4#)jP{çÆÝ‹ B˜oQp|¥ƒ.œ× Øþ!õ·;ô‹Â‰+"dÌŠ¡òÈÿšaB;)™ç=‡^yÌàö¤‘ÀcK-ÒÒLÅþü7"ðŒ¢ÃOè­š´xÞ¥s,LWÇëÑÓkŒC;”ò9y^ýáÖy[u¬Øvªdl‰pIÀf–—mAk¢Å7NÚö™#+bŠMjÏF¥nYÇLgöQ³nÔ-Tôúî}jcàÀtÓW3Àd7ñµM¶H0`¹yào#*Ðíu#ÑÌ1ç'qB~ï8}“aÛüÞÀŠ0Ôy+å·0ò#*¦ÊHHˆ^Ìz„döŽü"÷{õ`{rÃø}¸sdÃ¯Ò m“gø;6Q80;qÅÎc½dà ’Ìæ9‹Ç¦Å¯‘!HÕ(zh{+qQ@ïˆf?¬!¶ÛVb£9µHC!•?E) ªj•³Kÿ~·®º`”&#*I·€Žy$ ­Œw»mõºÙ¡—®…#+ƒº X®™*ªJ Ê>$‘ñï«×“:.æg‹"g±ª‚¢éMñÆŠZTÍ âYlP¦WÒuÜ Ò ŒWS™ X(‚‚ U £a[#*aA˜†°þN{-{æg#)]!7#)‰Õ8 ŒâÃ2A#*™U š*µB 8îÏÍõ{ÝïK=yz¸Ñtg™ƒf#!A@Ò…STU7I20Š9Áð‡uxâ÷/Œµ7D?qôpkØô“’Añ û»k ï—TæÝâ×ik"9ŽqE8QŒs,86iÁ-2wC³c8wÇF¼‹€‹àý6bå‚Äb‚ªŽ,x»©3ÏžÚ êŸßm\ë¯YáôûAú~{ì#)¹^‡DÛàÅQ ê=£t8üx˜î÷ž3jÐøjgïªo²½ ˜ªQW<èÒ!¦uˆå¨¥Eª¢FD€ óNCˆ®YIô ÙMIÀÓÚîBU„Á¨˜Ø»Ùì͆ ÀE³#+YK¥’óâŠ"”¡é¼Ðr#*£uœSl5X<'­Z4A vXñ==YŒcnµ#*»§dÃZŠ´Çƒ #*}•V±„‹·‘jÚ$ùqàÒyð¨ã&Ói@¸r1i®†(fëC}`j˜ÓqÒŸD^^­æíXª #+×­®”QH×ùYi6¾ tžÕäôÓ›3,–«ÛºÍUY)¡Ò.Y A@Ë1³pÉ°Úá£!*‚›$#+Ò1#+E¬45-—w%¦WŠÈŠÂ¤Ä1än0-¥Œ‘&`Ùi%ehCÑV‚“SšØÆ1±&;"ÐÆf;jc ß».qÂ#Q†7†!•» ¤n¸LÉšœ@ã67v:ãÊV¥´¥ÄÐW ˉ¼÷ZØÚÔ†H¾¦£Óûì#*2M…4tðõq(÷°‰»6ô¦CÈ NyVëu5Hÿ*ÕÜó@qø¶¦iM(9ôyCKô€u»¶âgåbY#ÃVnmm8álíHÀá€jÆšEÃ`ÌhÛ1½½U”ÄÙç¤)b#*¡M$}&¹Þ ƒv] ö1̳?ÄÑ„§7#*0á.™ƒa™1ô_#)Ç©úþs¥²÷ÓSb<4$²àwOÄô°¿.y™~nžl¶Ç\èë‘I–XåW²ÙŠ-ôÅd1ì!fŒkâD7\``ñ£HZ­%Sm•›âir=S|qš„ÒSŠ^5© aÛ9U¨E£fÖT5pŠ©#¶*PŽMOF,ÐÈÁ‹bðÃÜG¬ùû¼ŸI¬1ŒDPÅ#*Ы(é»)e ë â °z‰9R· A™UnØÆýnnÆQøÓÎh ¡ ä¥P4-¼µÕ×[¦´ÛÝy¨Ú*é«6¤TC H˜ƒØè0c¤,%€ˆÁ²B1T±Av D$—›þЀrÓϨô‡T}šàC`»¯¯å¥™aÅ'4î¿4H‹ýjÒâêZ¨¡Ì1õâÄ?„Êhý4Qˆ‘Ì>Ͻoz4që=½6›Ÿuß¡ÄÛâýç ›I[ù]ÏTáX‹bjDþçפ=Ö+žé¡á£F' ÷6#*¼=ûº™)doowIعqû¯7M^³O7«šÉ«—;2)eY–¾INþššúí[¥·ë{7tn(ÌD$å¹™›ru7•Ó‡ÒÎG‘Xg~{–õÏϬ©Oƒ9ñÁ¯..Ýš„’Å>òÿt’L˜õa#Ü)»*"e ¶Ë!†æŸŸ†©’½5©ï Ç)N‡K¨Ÿl®ò7ðü<-ä6lC¤eÀ~홦¶j–À¬Î¸jR™N¯àùÀCá?SŸ|pO|Â{ÀÝ!0ŠAdŠˆ ÷ˆÈŠ³aDl- u%‘>ˆ¢š›*GãB Y#)Ý! Κyw“¸»wM;Æòy[ÇJ⫳kp­ºmRm]ã±b¬my×.šºµ;s!ίQO ²X´‹HÅJš¹Çu]Ý«Ôª4×ÅZ¼[y6´›¥[ªëÏ7ŒV4mmâÚ5^¬|Y\ ÃèÙ»ó4ÝaF=FÂ9"’õ]­+®åbôä*Z(Q…”"…4Éu¶ìÚ©µçš©ö‹f^ª.!{,4„¬¤H…¡ ÍkµíµäÍÙ^–«Öµy«¢÷–úe#*b¡)„© …@ËTj¥)jEú]j)²‹X¬ÆfšT[cQ©˜¨ØÔZ‹ck2°hÑ3T›%™D̘•J(©™6@Ímš¼íWK;)@¢"¤gÙá™ ~Ý÷‘G!O§Uµç¨4•¨¬%I"H)eø;/öO³Âý½Lx­êþ~»·?ÑãEÓ´°õ‡Šp8#§;«»æè(s/ò£²xI%µ¥ŠÖüÍM6´”Íhß77Ïzº…š5Qùf·ØÖ·#+µâ×Oézº‚Ѧžnê#m;»:êÝÚJZÛ˜¨ª±¤¶æ¹sYÕÚnέiZÊõÛ³Y¨‰#)#+R-4}6Û!˜î7eg"1&Yˆ~%Å_t(†‚Ñ$˜‚D`b#*‹€‰7“–`Ij¨ ‰#*È´p#+¡a#*§_G¶¤¡Pm+½Êlr„50^5+´¹†)Â6!4žoª@§Ýv§¼u¾\Zó›;¢HCÇqÉó3¾¼è¨…Ì]hʈ°Ÿ<Ó`û6l<ê£ú™ÃZÆ ºK1Œ&~VX8ØÆ2»™&š„ă#+b‘X3jiº8$Ó ÉpîM¾¦S‰(íQ‰qàu?ªæñåß­ì! 5éá1°<¦ˆt2b²sÙðVþ’ðæ8ÀU;¬"Ç‘¶C’}¥s—ceòw¼o0<&…1d¼ØeÌ"ò9Æ.{òmiÙO“P–Öû'–kFÚíì)[hítKEH³ *Ó¸Áƒ† ¥“#*1.ïg¹àšE‚¯ð“¶…c,žDèÀRs†Îû…fGaºò²ˆ#+&Õ6g-Ÿ³îñ¡þšÇ†*C“bô™”SªVÕK­5¼î„ï5QG’P…Àõ†š'7í5¬›dµlmF©-¾TûêÁDB‘!÷0?ÌAÊô‘Î#+>§Åmo$öu¤ªØÛQµpA,[w±€+oeªåi÷«Ä8coEò¤ @Ã×åfÿ Éð…íê—º¥äm]-’Úk®ÓÛ‹¶3#+"…¢Ø€‹Âb-‚8#DFˆ-37lZRE ÀÑ÷=šüA€!·Â¶ÞªÖù’ÚÛ2LFÉ«jæšÅñöÉUçu\Dö]â®Ò"6—5ÞN¹øzç¥ÞM^[f2@IÀ@Îq¥à´q•µHÌ …FÚ#*[FÙ«R”âm ˆf¬*Ö© ÆÐ0©…#+’"J¨…#+…#+ÅcÈeG,¤ÌBÞ0«ßDdЄÂ%¢€ƒ“®aìÎõÄј@¤'˜Æ ‚ƒxÐ8 _ ùxõåõgb1ˆ¤/+=]çè?'Üõ´X*œúŽx„«Œú3&mÓYƒ·vgÒd…$£Ìk%¨Û·Onü÷hÈèUN$E#)‘;KHFI$„$ h‡`UH OÇ°<3Ëè> t…PúGì£;Q‘÷éþ? Ê›&áò‡6»#m›Ñ£ ø•Nœâ3„“½*z€QCøƒLà_!¤òeAws®m«¥j®í²Ý]ÚF!Ò”1«" gü×êJ¨µr;Sñý6|.;Å#*’òš¨#+’‘b£D!Q‹ó –Bt?w>,Yi^½çžygyÝ\º2嫆”uÝâòœÜËÍÅfË"i$l&Ê–£ÆÛ´Û%(¦l`ñ¸š %͹\«›¸î¼æ^MÇ]vÊ9й]ݺErñoJ£šl·“Ì·W.æ³,hvï6©VŒ;m®nZéµd¶JX¬ër›2Édñ[»»£tæ®ìΚäŠZ3œ9Wl¹ÖTZ4rµ»i¶åÝ-·_áy^j#)ÜÜ,*­=P #*Â; ìD€!¤#)zöúwƒ@åØg¦ b0#)v£û»Cº€‹#P„ ¡A;‰al@ExýjŠoNy¨x~©Â{AS°qè)à‡| ‚ÄŽo¦=¾ž ¯Eö=¶¾&• —Ø!çŸp¤û(P ü¾íÉøö&Ó¨öƒ`#)7 2#Õ¨Êfi}6õr«[ñ­b£ )TØ\³ýQEc#)Lç?o&¶½”–5²jÅjÐ¥¡„&€ÀÐañ>IŽ‡À #*©* +—âW›ÇjœuÝÔÙX¨²ªC"Bб‹—c 1ZÇ#)‰ÄÄ#*IÇY%¢–#+U„"mA#‰#)l(DÓtRŒ„]0KDdK#+”ÐAŒ`FÝi&Å­Ä*6VjBTE+ k±˜3¦ÙPƆ٘î\´.ÐRH¶ö° AL R$¤Ð‰! @’XÂ(&eIòvlI$–ÑTÉ8ŠÂ‚«ÞâOoµáPîÊ«3h}Á“” H\U3‚Ô*”\ÍcÂï@zyd•ëõŠÔ4Ö #*7¨ÛÚ<í'ŒW5ÞRŽ¼ø^¯²#*ˆ- ȈH€£qR¡@”¨(!´Üþ]!³lnqÒèîŠë)7nÜá4}Ô#ù“wIRBB@Ž»¢‡‰WËØtÑÁùÛFЦå’× Àz ¡XLÓv iQÊÀˆHm-P·FékxyÓ±‡Î°óÃG݉#Ihä©Õº#*#)%- X#)± Ñ*@t*©È ©øCm{­ˆÒ¾¸¦i]½ZvÍ­ÁÌ#PZ¡ŠtÀ³­‰ŠÐÂÐE¹ÍxO\MÁšy'KŒ(HÈzŠÈ(‰µãÎ?ܶn°™£kª–ª¬¢Ø˜¶ˆ@sjÝ'ü°Ðkå*ú˜mpEg/Í<î½5ê´¹ÚæJÔ·y›o!,™&8(BIa]f<™·d„T®„’ÿL1‹þ}†Ù#)â®0‡'ŽîF¼>ãò-A*ËÊ«m°¯+X¹i§Öm9/'…½zaa¢áHÄî> ñÖÔ6šõ é‚ Ÿ¿ ?Dv#u|%D³óÕØtop ãdPª.Òµiúýnʪ¦þK«Kò„¨ˆsT{B®h³‘sJloÛ#)qo­€KSè;äþiÃÍ[zÐÿNïµ&GcÔßÖiI4A¤,3EŸ³·Í‘E„ÚÙñˆŽ`€ê>"ŠjÔñëÜ£í=<²Ì}#+ý¿JÅ:.µ(+÷ ”¶ÇEòì¯GoᢘÖ÷ eeÛÑtËaƒ>¢Œ‰¼Ûã75‡ Žé/#*—›íà†PfÊ#*ÍÿI”ËZ[{¬Ââ&6ŶíÍT)ˆáˆüÍy#*ü¼‰ÆNÕñ* žVÆȺx$LdUC#*–xY‰L©m@iq)3Š¸7Ò#*D#)ÆadÆ-!cã˜?—½;ÄCq¿sb‰Útd‡äûVÞ¬WÜÈ ·d”’ óS»°Ùœîòc­³$}´®%9õ<Æýf‰ÇH±SÚrÜÂÑT`ùÉ0Œ>îÈáUNlÌ "^â¡ßŠ¸%ýϾ­ëú#昦>ÁYµmÂVÐ…½Ç,¡.³Š÷²þ]²˜oF™‚ƒ3q‹N8L- a}d,„ŽYͳàÉúÓúC‰ßìª1ûvŸëUÞ/OßȆæ…U ïçÕÏn™*~’ÏD"ºÐ¹gA\}y·È¿®óŠöñ6&hl€sÒ’‚& ^Ñ |·šL5íI2Ðùlÿož¥‹¢É3 Aà\0CÝçOªLÀŒè¥¨$D3M‡AFþ{©Ûkä ›<3±Éî£ríµº?¿nrè}l<X+5 Çð`~ö¸÷Τ•²I5½j¿›é˜·ƒíJIõ¶ÅÃ⪠!0$D–‰eh#žü*h$m®¬¹«·¥«¼Y ϨãøH—#Œ=%$3XUSGRgŒgYÏF»Ë`IY_øâ÷=>#õ eß½ùû¤ï¤×„r-µÜÐ “½T©Ø¾a®:ô¾6p&Pƒ{ wÇh|QØcÑÏ! ™Åi¼@Rö¡dN¢íAV)‰GJ-ùtúfu†ñ‘ów-*zf§-paäG'óS⛄ÒÝÓ>Ì?Ÿ#+R” ÜÜѹñåmçQ•v0/ÏnñÑ8ª¡3'»=·„1Kø)ê–`Ėȃ§¶Æ§N9ß#*Tò´Öô!†1]OCã´ÑJ®óÕÏÙ× zð1SGÐ#+·,62”RopiB#0^ì¹ÀŸ…ô³áÆÁÌé:L½Ëïüºbl©õJÃò °bA$_‘ ¼#)$PîG½!ñG¨/ð‡ÈùÅ`Ýð Š$€$""@ C»qz¸ŽÄ~þX*G®»²½¡2™º€Špzຎ cÐñØC¯QîNÉq#)ùƒs#*Aná#ó-¼GCÒsä.6c’;þ7­ÇñÂǾq1Ú qñq.ùt–rîÀ SîÕµmó‰h<4¶ÓkñfÐDW‘@¢Ã~9({¤Š¾5ÝB¢ªMóû«ììJíçÜu;×ǶH@ùwQÍ`ÄDÉGK Ÿ>X¶ ÅG›¬ä1‚ÇÊ¢ci>Çb¢˜Šƒ"vɤ`¹‡Uš›*Ó^y…ø»³àHàà0×ê‚^:=¡#)¥ìIKB#)Æ1XH ås‹Zû9ÿ+úþfee$^ú~ò˜Ñz‚Åd—z[-Úé@Ðî'Ó—`i! Jª‘ PÔųøš?·–}‰‘°µÂ«Ln3”’9‘/·.±)Žä÷ïÜ;¦õŒªÌ©Dæýúà³{%à˜Úû÷Ù[™¡óÑŸ¿åˆîP’AÙÈÑoª¢_˜]HÄúwL˜üZ­;×u‰±55(øtЇ»°;èÉR:R¥:íe­T‘@ÙÖª¡#Ùú²è’vœ<7eú1*2‡Í,˜Î•ë;rÌ~jÂ2Z…J‰,JŒr¹Wtýê»U&b-¶[5šj–kÒ•ªj6©³ñîÙd#*Ï*Ô’D7!й¬\»ºîêøuŸ(Fè¢(z¨‡®¥Z#)°Eîü9Ì`gú?O‡™#)›FeRDhÌš(&›D¢j"““%ˆÓJ‘’‰¡HI³dØP‘£$é]»'Ž6 'È‹¤^d’;Èzâúã·‡6ú]y”R’M›vÌ ÜÆ0Øh5$˜l²AšQR0%óoº[=4È ˆ®Ú8o‰‹ùñ•€ü‡“‚’G4ÓÁ߇+kí÷›0‰9ùvg\vruÙ{R·ŸÉû½2÷ÑæÎL£(JÙÀô11¶Ýó‰˜Þ— ïÃ`-®šMU_@µi–0bVÇ ‰šÇ-ìMci©ãŠ‡ÙU'ß߀nk±Ù¤ec‚á¬j˜TC§Ûë¨fèÎ[‰‘À ËóÏÚróˆië©ß#+kkž5I"þX@É—ýoò猉Þðù‘T“Mópµ$ -e±*˜ÉJVÚiÆ(âKBjEIj0 Q‹¬i’@´FÝQUË;®JW+n×t¹ºº…µ’êÅd#IJ4fÑŠ ÅÄC#+Û1&Ú1;¤Œ`f¢#+€âà¥n‰J„.Ð0¤£¶É”´×6\ÅP2ÿÂ#)(²PˆÂMi•x«W.—,î·5d”Frã>òÖÅ\èÚòfT#+ÌEùHSËH"Og¹£°i-±¼knâq¶H܃oͨspÅ!4\Í4Eý´Â¿ƒù‹Øágˆ<„eÄÚ8tÖHL%ÀB„•ˆg”äôFªKýã®6¸*:„mä1›bCb%mä„`tDy¶>ñm#I°y²¬`½­ppl¢¶n8„F„Ú11!9¦ÞZ4ÉcŠ#*‚'Žómܲ‹®Þ5¿#)õÝv»¨Œ§³jƒHÌ-M#*Œ @áüJrSM#+¢Š‚a´ØãŽ(’ÆYm©¦ÔÛ‰¦c"ÃJibnD Á«²¡±=#*ÉbƒUDë•V).QÙ„m•ÖÚÁ6Â*âÐaD«ªE‘!P®•Ú1§CiºÓe(l©o0•Q†¨ZcÂaUƒJŒ0lC­ezïOv9»*A)V(»‚쨻SEÝÄ´¹j @űѩ§¼Å¶e™ÕÞŒøÁc®„¬—µvCg@TF4±pÖ”ŠÔƒqs”¥`«UÆ«A–@–Úì2¦AÕŒ#V„‡ «M3OK »Ÿ.UÑ×€ÀÀÊAÇ•Úbb¤ØJ ˆ,à’ºÒ|¢µÀuÄ=7¢jšdt³EÁƶ¢Éçpf˜á3fðÆIkRPn r¨ãnbZ@Á<(Ó„}dU¬—šŒŽá*8˜ ` wÈÂ3ùN XÕ¤ãT`hdJ‹t.hŠ"³d‚j!B!›SUPj8ŽöÎŒ@ÉŒ3ƒ@F¿oЈ/¢‹”à#XšGdÕm5œÊÐ&ÄQ‘@ݤÎ*Ò”ÁW:Ô22dI•@PËdI¦™¸H*‚†Š(ÑšhË#+Й °£B©¤äA(0XѽÀGUý¹tôÅnÒ\LA]ª²Ðà†¤‚IqЩDÚYcŽY¼R±éŠ ¨}#*œ¸ƒ‘<Ÿ6 `Ó᪢é8ÃðA6á(¥â =M„8@ ¤†’£)¢ ˆµqîe‘éån#*nèÀ™OdnDœD­óêaµyQ‰²]ò}Ž´ÞâXP¯¬Xˆ–”ãîÑÜ¥Ð7¬j"ªB$5çf‰lŸ7ªMrg +µe°FÓ"&˜Ï&©8±xtí¸Œ¶ª$ˆ’Z!LìaMHÒZ#*Š(ƒæ!B†ÐQ!bJŠ£"¤Á€524 ÚK7 )"#)8ZhýpÞ PŸÅÌ;zÒR%R”Å%ZÕ+wvñ?›çytŨÉk½ut·ïuÄõr;§rV;å|-ôWàÚJ j-¶(Z›6™²É“Vú6ÝÐBÊ!÷X§é.ÿGšnÛ45*êv‹²ÍÂüÀ2‚,P¨ „‹ÝœÔ Yé’n‡Lß銤€Œ¦jC;Ðü(£‡âµZ˜r'¹Y "#)P€Â1©F‚¹"…ËkÒörAöÔ¤¨‡y±‡tÏ/}ˆ^T$IB\Œ*dû§H•÷0,ç—š¨Á.PÓ0‰â¦’#+;+$(ÿÓ`fHØ›;»b1±­ÕÕÓkomuÒ‡w `ÂwJ¢Æ .P¡‹0°nÙ@b˃¥ÀÖªQ³)Œ€ø2CöŠYrT PjnkºeËF()fÉC ×BˆŽ$p½µ#+.<ßîûÂÞÃápd͵61.ÎòX× QÞÈnO¶ÍŠño#*o» ‹;˜#*¾/=”ÍIÂEJÍžf«üA¨¨ ½Ùî ÷¶²^õ#·L_HÄpæm:/§W~‰^‘­£éP5ýÃR@[EÒrŸy¯%C°Ë‚ðPÃTP‡‘‡'BJÏ܃¼MIˆÑÚ}ý[^Ýè½÷±`±z¡‰.Qr¯f,C^&Ù¾šë9TøõkëCøO‰LK g¯ªïâÔueÚ‚7Ñú~¥ØÁ#)Ë×)%í·½·•ç#)Ó–«Ç2Ðai¾§Äþÿ¼™ñ|DG¾˜Þ™†–ÞAÆÝKÇÉîeÅød"I¯yé’#*EP¨@B»þtìÛHûÏY…À|,fcœ¿n³& N.È=ÌFÕåX,Ù:V*mî(zà PTÜÅÝZµšë-¶:#+@'?‘`{ñ*yÛ\ŒP„èȇ`ò;b\”Ø‚eb‚ Š©ö0’á™óNÊR¨QmTÎÞ¤¹Q¤Uñs´k"ÕU– Lèa¿ÃÆ´Èj樤0À—mE„ýMg‘¾#*Α9H<\f·µÉ±´&Ä›#m¿è1Éóë\’åWH»¶â²öþŸÊñFɽ§+d¶‹{5·b[—wVßÁ-pÚñTk9¹[¦ÖÝ5d5¹´š·5“\¹U¹S»Ý®E²mAŠ5¼W"ÒÒ5AüKpÃD8ì²îÉ7cu=#*Q_€g”@âQ™Zú4׌œÄ™‡©6ûÌÉ Ù]Ä[Ð7RD"†èŠ#D@Õv½A ½Sm("!bB ch‰C¬@M°%Ô^별B3ã`û‡NÉ"vTôsmöö㺲³×”„…QRN {AD‘!ì Û‡ôllˆÍÍkTþE&˜SG]Ÿ¡º0±öô††€–\Z#\b»‰Œl2× ÷(–!„mùq€Q#+@†©Áú|ük.ë1ìb>f‘€ÆlÑú¬QjªGþœ4{S‚v!Ü©ÐÉ#*Îk¦Ü;Ç™¼•ÖòË©R™”/Ü]êµrѵ±hÖ„$ª@©!pil@züœ%Žü3¡í×Gù€Q‚¦1TšUw¸p̤B™GÓùtÙê˜K*Pt—Êo¤= ¸Kaõo÷~X¬¢TåÙ²¥-¦?§dW<`ã•Ìõ‰ºx¹¤Ý7Þ)ÿKóÕ¢4•/!Õª¡0#+Yš*¥07É«'È™ªà«Œò*Ðû÷üÛÎþÞ'#*’'×$;Â,–Ë<ª£™βë‰ídçr§–þ«slsB߬>Ô;ZîãuÄt~—Ǻ)ã‚øaº õ=â¿òigW¯Pê!>æ#)샭±š^(quÔ¨ryqTOŸ›´i6.Ý–ÝYíRñH„ªTwâšQlvróßµŒØ`çŠn=ÑÒ¬ÁŠ©fÞ¥ðsqÕq­·0œ7%Üëª5ÓXô̪qĨÑuÃøUc2íÐ|oq@²°™‰$q8ܳ=U2Ím³òoq¼×Gnó»f–èœ{í§†ÛÍc&AÍ31oÄ#*\pׇ¦·ÒiÈþÿz„¦Fx ]YsCÊ—C¶é¦ žžI$;º/€O™å;•U›#ÆøQaÌ"Ç#*è`—cÄr6¦b˜#*•ì;w;è\kg#*Û/+6ÌkïSb1£‰Ä¬¹tRrÎËÛÂAÛŽõ2yÊîuëž-£1Y—¥˜fÕ>ùZï!¢•ÛºÚ#*¤êÛO9ž[ÿŸÒ·O¶%Öôq¹Ö’KÉ$òxÌÓFñÅ4šÓâ^’¾¹¨ïŒDˆtºwqHrd3­­'8¢÷Ýz|¨6È™)QÛmî¹\zá@êAqÙ=ˆ0zˆ¯Jè­1žKRØ_—)îóŸLÅtï;RzŠâ»[ám8ƒ8ÏÕפ6îûe3®Züç´ç‰yÜOÏÜžý=#J£§G•ÞÕº›6de6 k›L£*YYã#+b®´JÚºró%Ò©#*YÕìð¼àywyï=pô¡'Fñèòª‹­éïlgš/Ç=˜‘ašâô‡~U0›½Ë¾¿¹˜…æŽëÍ™{0àÞµ«ðyJçÚ|¹]‘—%•².IŒw‹ôõǯ ú;ö#*ü[–qØwb÷3ÍñÆåvXÂq²XÆÝiÅc8LŒiÓ%J'¼ÅŸ3­Ís°ß4.¯ Ör6žDtÃ6Êc™Mê,¦å³ÊØ~܈ðÕM ŽNP¢PÒÞ²ø­s1¿fJºàeÞ©’tóŽ[hƼÜ|òTlŽ1'¼¶)˜'#+  )„@#„Aµ#—-ãôqØlߣúqéwŒÁˆa¸s¸ã3¨iaHN(ç¼ÆFÞ§N‰]Fµ4:0ƒaš (@ˆÙÁv„dym—9Ø8Õ³IÛ6£”˜­¤*fíN²#+á*5®¼†¼­¶¹®/32{ž\ûôŽU"Š©´¢*¦¦œøÄPQb§ë·,M—Ä e²ÚzÁï]QÁk]9ÖÔ4nû““Œz‚FQWîíÀ¨LçßZKµ´óBŠý°Öüüû`c³5ÃIª4q“ç;B×u´o|€ï|»ñ- #™iå5Q½j×(Ãdvéxwu®g~E5­´db‰#T@Ç/¥-lZð¶é/yÂŨáìPÌó¿Ä ^›4n´«5¨–™ß¼¹‹sN™¢xâö/-”¬kèíd͈¢:œòÑ£c·=ÊêÜXtõç牻\!œjãmú.;‘uWã´ ˜ÁÓ¨k vGMuË7%O¹¾‰Àºt¹n= r£©£u ý˜«Ç¸Žny_6æYí»­Îòæîü_XÕL0xNq]åÒÞ3—Ͷ • ßx™“GT·Ÿ#¼Tù8bW—‰öï‚o)Ä{ƒÉ›îº.<»ðr žr9Ô­«T+OC*0Ñðúw-#+X”±÷4µ`#)Ï´½pžƒRñ˜Â¨†–ñ˜³ay£ ê9r)ªàtY#Û‹Êp¨Ò§<8‹°ÞÐãUV¶{@þå™#*î7£'víÌÉòsƒð:á™»ÐüÍúŽ\h0,;¢â£}jålÿe¸ˆAáb: ·`PnQšßÚVù€¼t#*~Ê#*s¨òæ!tÛV\Äò~ À g6û;Ã4q[1êUT4úŽuÝ-˜)1„ïëù‡Ì2òvÀ×ÁúC#*¡MR­—_’°gÓί«U£Ñ#)£¨=idO8›Ã¬œû\vŸ2¶¨ÄY‡Í¥B,‹#)ü_ƒ`Õ…D–aí»Ímlš…s˜Ô±U%&F’b—uBDá Ø¢d SÌhXЂ6”c#I#*•‚U@’ ³x"–‚s@ˆACUkzVnkQZܵ•ÓlÖ(v¦R,ˆ ‡u‚­¦¨5*2‚ Æ”TE#+Š2•($…FñÊ3='ð3ÆÄ-¬!™È#)É€ýÛ„p°R.Ú¼4$‚¢,g9¨¢§§+ÓxÛÆÜ‹“cm*µ¯Î¶[E«W-TkU^›•]{2×ô7#3t9Ô¿—…¥­t~Í}×XñËe©ÐRÞ9Š±Œc`ÒÅ#+ÝD"5Ëçj4°{nmŽÚæðÍÀÖŒt†Ÿç1h‘]…2¸™÷Í*ŸvlëZq£U˜Ž'–±ÕÃ)f¼³M±A¤« ÊC‹*‚#H¯—z‘Þ2î›Æ³‘,"E#+´™º´Æ#*¸æÈaDÔi6›K’)a.ê+M1¢@%rÑQîSüO1#+|'X·u²¡ÒHW£>úlÀö›L#¢Ù7T€²`&5„Í81"Ìvî\¦jVã p#+1ØÆÝ{zÔ¦™Z;ñÎÖY½ÈÍMi¢ŠµM­kTÈ7 glÓÔ–ÃZ±êts‹œÕ²·Ã ‚6Ò ¸È†<Á³‰`"Í3@ªÅŽ Å¥àÄVPË­+m†IK_¦øÖ§<äîÝ£L…d39Nñ+;rDŽHcB÷Aê„@Ô ˜ãŒi÷cÅ]c®w¢ªC1¶ã!sR%à4²©Æ®eo˜iY2R³ .õ³7 —R‰ŒÚ›°Ý ±Ç·ÔV¹´¤IØ'tRÙ«#*wÍ4ç‹®¨.DÕ)l£|˜Dä4< ÿRãÞºÓÖ“cSˆ‚ò£œµ.¨CZF“Làèd¬q¨Ô"Ú7*ª#+”*à Ѹ”Ðá¤0m0m15+‹‹FÞn-¼™,²»zça›[ ¹tùÐC 2´CdT¨£]ž&09ÜEZÙ*å#*hFe¡›±—mÝF=]q›„DËš&Zþ㙢ðà•¬½ÍˆòÞа¨iSq—W²©U[UO$¼*7Ä®ôéif›:˜pÌw`ôäcL…"½®ûb†[¥cMUSW³E¥…(V›UÖ‚ÇZ1ŒÐµ¢r3LäÅ=š&g6Õ3rã<@Ê5Š±ÑÅ›òıqɦ3ËN•Um!C4@ŠÛý]éþ®ôQíj>«ÌÇÓ( £è Qˆ±¯sA_-š$u»)‚‹¯(h1êÄn#*`9ÐáŽe4.¢v“O«æçñj¥,Hˆ,F#+Q؆ˆv2I-¾;Vè¾\üóþaüÝœae2m–MÓíÚ¿oe&¸}ývÝ®HIô®Ÿ9®;ÅÍóÂÕ'Øb ÒNÕSº¬fƵn¤1R˜ËnÏÞq(0‘UQ²»ÔR¯¹…=M5àÙ?G²5{©•ðšîà’O{Öx§9òPÕöv‡5ô b¨,åVÈe&8O—Ÿ°'êØ}`oìé#+2;GŸ«Ë×Užž/ždJpšÛ×'iäõµ±®‚¦ôh?wÆÿœöd£¬PlµR¸<³gÏÆos×n7„Œm#*H1É"a~öî€òrwnÍ›»žÿUdöÆXãá\÷<¹BùÊ= r;àƺi![k«ð„Hãƒ"ûðûŸÒÌge‰Ô<øOE¨÷7=ˆ`–•ènb¶ìÛIIWj™JBHF!6$‚#*V’`@H”*#+{ÐÕ€7~ÊÉ.AÀÜQÖtíêCÈ¢™FÌO>!¶òI!pNƒ]­ä{ý9¢¿WQ¹éíŒ ÕF©©ˆNÜÙ~ʈ\ÛóÑ«µØæ§P #+š?ˆ3Vüm¨ÕD–Ù6ˆŠÀ˜RmcGÝZµÍ¦Æ¥#+MFŒkb3ð]«™VZ•ŠJ¤}ia, Ë¿À·€ÈÈB 3(d…‡³"Ù›”Á÷V tö`ÏŠá(TGaE¨i˜Œ7?,º5XÑ“‹§CªŠ82V)©#”˜ˆ¢Ûf#*UE"#+tå³FÉÐË! `#+@ÐqÅÜ“ I‰çÉ%±jouåݺvs^Þuyš1”×FLˆX#-(`£Ä%$¦ýÔ&j#+8EÁጠ¸»»Ä2‚lZ(à‚ ‘‘X‘—ªèøC¾÷µï>ê#*F“äá‘`rgÅäÁn¦.Ì´‰Jû©EˆÜ×I‘j#L!(ÊHRˆÏ:ÔÎn`ºÐü«b9×›1·›‘ŠU"tq‘aî!¡o@ƒ„Då0„Ä#ß!éon¬ #±©#kmA±¶(*¶kH‚"Àpä#+K†Hä[Å’D’I#€U†*!ëßѺLŽ@i¢d)Já£qKO5„ˆ^žÆÊz·±Ý‘ØB°WÛ#)ä{»¹8Æ~´¨žr†ÌçzdHFBÿn/ë~̉“ª:zjÙ¾^H%¡Ì{‘Ò‰ª¡ÓuËÖ:DŠx µ%BÉ„bce+kS4ñ óó Bðæ›÷ì+C",dæö¢Ðñørðý«Òå1*í጗Yøxxã*Š7ß­š™*¨¥K6×­jãe%=WÞTŽwçLMKê”ãjÛD½CHÄŽºŒšW°Ø»øäûo#ÌÒ`=¦"Þ¦©œÝ[S[ÆÚdÊŠlA`‰£5%4ÝŠº [—Bë¯yZr µZ}^“×`ÕŸˆz8®Å6WÒœ“•®J5yžê¢Žìš<§ ¢ÀHƒ'¬ïàYÃN}GÕ}¾k±éøɹv±SIÏœ­¾….b'zFIJ¡S‘ê5êOöflSÌÁ°ãºÀ¤ãcµØï/¬2B I£<ƒ3ÕÌTãŒwj7éV<ñ@M„Z¨þ?œ¨nìj“2`ÃîÝô#qõÀÊ%»¡ÐA÷{NqH R,’""#+©ƒO¤z¾©Gq1/±û5´mƒPq#à{ì=ØJaoÏ÷þǵÂGæÎ3†’x%Éôºkƒøþ¨Ù®{¹©d*ºh°À†U0ÚÝ\C’t€‡btÅ^~I;Lƒ ©XÕï=¡½;éòî/Ú#)'‡‰?e‰óh·ÂÙO;ʤÂA/˜”UÒ\yge)^±²=sDiù~{ÜãŒuñ¨õ#9d,™ÝÛÙ¬–"]Ò!ntr• #d+}å»»H¶»…†|Y°‰Jwa¢*®ˆ˜ž'*óƦxN#+š„G x„(€` Y#)wÄfAƒ‚€€jþSuV A/úB¢ hœäI†ù9Qw.äÖì뀰8e˜$R5)&Øn$”ŽÅpÉc#*Ò„ÚQF´¡0&¹9팈@ÂËÒp,@2ÎÔgõ,3cÎÍÊvÒAÓK‚Æ4‰"q“H¤·Ÿ—™Údœ:äK'[àY†˜l›µ¯K,䜒¡ãaF¼¨q¢*T©€p(6<ÏÚf`P1)‘5B08o±lÐE¤W”®7Û—%È–úÁ’/‘ÒF~y¸v“‘»ÜE2"Ã97€š@³1-$TL NI‡…Õgl_éÿ’NVÛqÙÕLÊçÉ”ÌâçÌ|e‡—–¶ê)1ÂÉ>}ƒ~D°r ¤àº×4¢ƒvkcõ#+Ä1e·2áƒnìмPÍÏ:"PÔ…$€uÜwÍZ…ƒ"À4d)/BV²b’ °Šg®q'^c«¹š5@·Iå¥lgºë Ô¬Çûµ^nÝ­Šœ3yzÞhõâ²¾#*3(I—#ƒ£ìíy`•p“HöXÈßlÄs 5‡…vA[ÄâñèØé­Ÿ§— ¾ü:fÓ½f4ˆÖò0æmg8pâÂpëàÓ$é˜3k:{OAŠ9 ­6q8v5´ÌNÂRd7m¶ÚX)‹‘Ê’(Lè®ZŠ1–”•¾cvLª4f\±ÖyíÃdɽ>ñ¡9²äLG&FæŽ%5í!¤Òžù8ÐdZ®{‘² Òvk)Ûm®š]ÊHŠg0ÑH6SDâK“;K—.žõeÖψ[m0Zyk.eŠF«—Mý:’-“_g|X™á[§pBsqáWbEºÁÇX­­Íñ4Æ´Nòò2bš-Mâ>‰£ŒÊ²ÂY“‰†s-š00¹æ§ ¬S®pUœ1ízD©š½é¬S\¡åÐó‰¥Ëv'#*tÝ“ëˆJñs&âiÒtîÔ‹\sH`Za#*YxBË•ÉaVj¶»&àdKŒØZ{§pwreè¨âÈP·_.u«aw<‡×móMs±\œjJ݉€®oÕÞà{Þºg(ä*ær5Îih+BFìIJfÁÈ8¬#*¹ž\šÕåÓJ—)ÖÎ9‚Xw0rô :^¡¹ñ1–;õNå5âÓ!?'Ã*8;_}®fà´Žøk(D$N 6)ËC f•`ãf(i®»@;MX#+ÄRP„M#)Æ“¼)ÃS–´1jn¡®å·öÁºZHº+¤‚BN\¯…mgY¬ù%C]ÞÅV…@§„#*4ÑœèLkå#)¼»"È@x;vüe9§àcf¡øétR^›=k4Q&ªÉ=š‡“£{M¢æߊm‚ãb5éhÚÎÜæ.ƒ¦m#„Iøßíû¥öÙs.›"—!­ybi¤ü|òqζò°ø#+ƒ„˜l×Ƨwu#)i×ÁÖ¯®ó\uK!®~~·¥Õ#ßrÌÈNz´ÉXÍQLÍ;T_!5qUŠÔ¾®èj齜&Ú7›ð, –FJMjfÁ‰LX|2ÜX[[ï˜#5…1 !#+ÆÃعb£á«0tÔLb 6Òê#+»#*àf… €é\&8æ¹>LJd†½áõÒw+mÆ4,¶(»ÜËuvè­Z 0¡ÉÄ (K(f…¤cn8é>{rk­o)Þ¨ †˜ij!¡A¡¦ ñÅàÇQ4ZsжÖ&&Ú¦‚ ,¸ÓÖß™®`—s¢ÙÅD^±Û•‘Êk;¦¸Ë ©MNNpŽËW4W*aÛ“€ëPÐ&~±×ŸX¼ £;ï¬Qažœv3†“atŸ¤&ïnɦ›ñ’ÃGå Ð캆„‹Yƒ®.ÏÙ®jß’Á máÌé1ðà ÞÅÄS{qßb: !0dG4lä]+T£p:5Ò‰‰™ù¤Žd‘A¶¢„HòCªhEáAFH"¸ªPÕ5“S¼–”ºÄ8:ðšÑ”a˜¬áÍ0QcLjNî ºà<ÙSlð°;*0%DH!¹¡.æ¢ì+TК÷™‚Y0#*#*L#)ŒN’.jdë2#*¹¢‘ÔJŒØC SÕâ„5&²Ìš,•œMÃV6feŠ¨”`àQ®ç›ã:š½V™iE®Û]\Q$ÅÇxTÊ®:!Зz2 *#*ˆ¢ÐlïC |ŒØ¸#aȪ#+v6f4šodADàġ¾þdd„jÂҥ͕MŒ„P6' HD† €6NÃ4#+’0`éFp†Í$Á50J€uÑœQ´3#)€¦ˆÜ`Îq·é:Á# 2:ÎÚ@Æñ…¨Ø#+S&pÃI`³Øâˆ^0Àgi¢¢‘H±DŸByyôŸÆÖ9Fª”QQ`1¯Má#*áËcêð_PØ3 {¹!Ö! &°U#+‚(tCïßú‹yì½€ñ:ŽUbÞTW òKóvÒ³S%Éùú¥gy3>Fø[JÞPÇðE£MÃ܇)üç|=º¾6¥MmºåTÞchS”uá÷H…s#3A7bÙÒÃ$†8lªŠ\¹$ r ‘¯çK5òìé^zê䪠õZˆ¿š º2˹DJöR* UzRƒÃåY†SAEB;4«€ö0ã×k4AüvïM2p#**¸J‰;’£2;Ë•"påp2‚‡24Š­P}öQ-çµ#*{4GâV‘}’&™2xäïvÇàÄms,:nÞ8§èÖ•ÔŒ8"s˜¨!š€´#*~°¨¬Pœ‚â—Ù›–Í,%ì5J¾Ø’ÓÑòWoÒxzœ¦BBLÉTEÅ £ÃÆ u/¨UL}*ˆ‘TöQ—_Àù)ÌèÏ„‰htß^ØìCÝ#)Àϲ m²²rè>d¼‚žå¤$uJ%U+'L,P`Æ¥#+5Q¡(ßÀäNN5J¦dÝÀ*v©Z0b#i`ˆŒ+q“µ¼ÒC&J-âjwÒÞní6ÒfH –$ÇH0Ž6BÉ#+AvaˆHX€i #Ôª i Z4(Ðû©3 IŽæG\“H2?=Ãjæ¸ï§(b¹«Â4jÂ%Ö…#34u*ÌÙbQ „GFùçÕ×;goˆCá wÚµîùј"rN€€YÈúc/è#*XA‘¬·“ŸEÚÛF'„j#)ðƒ¤Ì5™‘Í#+´4V%vH˜†Ja^0kbk‘‚ÚPƒ< ÜPžŽ€šÔäqÞÈ)¹ŽÁw²Ó¹óg1ç×g>ÈhÑÕQ4eU=jbʯ,È_Ýäô¸r²ÉÂ}¼C8~è¾&à·e†9/958ãMHÀîí¹lÔŸeV¸¥˜…Bóïq-ÊŸ(Ó…ÓkTÄMAÔˆÎ!²¢‘÷z†ž‘ÇN͸Åìã›Ðz8½)a 1V=œÿÛKà6-h] s·1´†;&ælÐÉùgN¢ó#*‚˜ÏþÀìæÙ7ŽÀ6‘¹âQW"#)‘16ìã sôÔ…ß2½©g½Qfúö08D$Pu¨S @‘!2)#)Î&½Ü!0PGkT<†ìUZž,Ö–C¸œ„ÄŒ¥?ßãÃ;«¯»›h Wä§Ã0ü¯PÄ'xè(–¼e[Ì…´ÒУÆo8œJ-9—‡—:—ÂTãî8ùõ9ac©¡JñÝq›å.ÇòæBÀØhÓÇ=ÜD¡6“½ºgÑê× Ö}PQ: P€A©R†IJך'Œ|DÀ¸é,ü5øÃõóÑ_väŒVÈ éG/ —’DˆÁR)›I©%¥–˜Åd” ª¶-f&Л(©­1jÒmû­«Œæº5‹¡Üï7Ä6ÏôÇ*¹df¾ÝhØw¨‡»¦oñšœÇD´ùÐÛéêæ#+¹ù ­Ïo,8Ù‘dEÍŸ"6ONïãÒ{¶î( ìTìÚ{®™NB¼ÛfA$ŒÆŽ}÷âQê×s‡I*°Š74” +–Ô´½A#)ñ7ËáM´W®§!¦ÁjRÛCÍQÇH6Ù¦S¹3¿ @0ÔÝ47 G²•Ë¹,O6PjàaWDÙ6fÑ ëEƒ·ÂDÉ&FZеŒ)­ƒäuã˜á#*¤ÀÖRhIHnbí tqVùsF?+#+ØÕ:âõ9Ê\1¶ÔìÀÑ€#+ -–2[BU‹(nC- ¡u¡±ùõ»ÝÞˆ©ÁïT>1`!}î¦L˸Á,Å¥LPæìTkA¿ãV´0X³«Xpm/À°ûÙ­“c"úYXS“ù2áÐèÆÄ`:û=/0l–Q{Šä³»¥#+P]¿%¸ï,‰B#ÚC¿‘„æ²tôâø:—L¯#+‰Ðð0"0!Ò1sUb©Ó¸èºXøú'ÃÌ¡¯FÿAÈ Ä’K@9& *'IÞF/X¢£C^­óXIÑ{ÒˆPE¤ä2t#+ž!o~Ãêíßêý;{‰ÞbG?>£9±žfÈìó¾Ó‡"v‹R6–fï=aE½ž;o=J±(#+gÇeL|ù•5\……~—YˆAòdż:Ä{‰ì#*XÎH.yÌ„Ê/yèòÌq좫Ù»°±…!"ŠN3ä?Ít €ž&ny¤À˜ÞB Q¶Äb‘pû oMýw#+‚€Û@ÖóAÖ¡ñÉ‘0Št§µZ€¡ ½!BŠS¼|·WFšÔ–Û¤Ö©¶¥"”’ ÐdÓdù騠85¶Ù´˜U«)#*aJ€ë.•)ï)VE‡²Öe—Cý†¾Š¡÷GÇž4Æ!ûøkáaÃûŒ5†W§4°&âcÄ´LüVuÅ3Wch« ×ÒµÚ}èÁÆ€›M¢%Í 9ßjõ-òÀß&ÄÕ£è{Æ÷>rõÚ61ýT‘Ç+õ`ËÁ„{ ½?áWû@ ðWRC¤i„IŠSLJ“dj)lb¤Á¨ªM¶´oÕm¿#W‰°ÑZ(ÚM2€Ø•,ôôÛç[(ËD$#+B©‘„<ÔЫ |æØ @è*F…F&L(÷ÑMCfÒa`¡7ë@ïô}0ÏzíÙ/uÝ[imoçÔkWš±mF- Ú”5F„«6X‹X«RÆ „ø’3†:t6ù3·kiU–JHœËÆÿl}ð(€!£õÖX¦0Å.)E4¤»ÂƒžQFzžQ%Û馗àIôx$È«miGlþ'‡šYl홑#*€Å…„«‰9æí‚ÇûŸ= ‡ECˆ&íÝWMã­ô-Öi54R ±4›a‰ˆ’&¢ª€4‚É­éW%E¼ÝÖfì̪뛶¢®v ’Ùm^]ØÓDÚîêîêÒl©*dJlhV@U#*V$©ÉJ°ÁÀ·k¡¹o"o%i„^•ëˈµJil¦¤Ë*ô­uo:º¼ó­WŠŠÊ3LÛe²–¼îå»]ۢ˭—Mtšå®Üö©Ùš ì˜HVØF€íÄZ´`&ÍOÜ5åUY¡t¤X²nBøQ’ñ°˜){Z6gª TÛW9d¢ck?žô™KhÍ¡ø¤Ê AT.F¨’oÅ#)9 vŽÝÎpéÓ\MÎp,ôi‚Ér{Qv~×/มpõBK°‘îˆyü7‡Ç0ôźsÛéŒ I¼ž†Ú¶éƒ•)¶uF±±á¼·âBÝÚñË‘ñüȦF$Ç©CUR§WÊtÎÑoÎ÷¼QŒ-õx™˜zä)ØaöíådŠ(â¹E#8—…Á¾½Iâå¯â½„#)5:‘0î¡5$ÑÇÃ3U‘wà°þ̤—øæÍ 8;x_°jùœþ©+.ëIé­ìcìE±<@yr#+RÕ!®*F<¾ÀÖ±ÛU‹foÕñŠÈ%£h¥G|6×U:žóPj” ~VoÜv•#*ñÞpÅ`×L‹ÝŸ¦žl“v›³ôhœKxP¼¿„³4pcoGê>ÖìâÌ ç7$ä5¦-XêI0TR'·!À4¶ª/pÖšÄëj hêa×»[0Qüá‘Élc·É#+Ù]©´±':µ@¶¤YzêÛÓ\ñJmå5ÓuÖÜŽWC%Û‡Ôq äYãÉÈ[9Ï|Çîù¹‚Öè|l‡pYyL(7Æ|5NˆÞöÁò<-šX ýî 8 M[‡Ñó.8#‰1YÚˆËÁäŒpÃ÷2\µ†{h$ìŠùÕ­¼›Pnh Òþ¨6±ØEì’ºQÅæFÜn‹hÔ*ëǨïÆ…@ãƒ[8AÀÓ Êö;÷—çAÇÒ!"1OAªs¶Ü±2ÒȤ¦Qhšät Á‡-u1ßp–dl0Ày±»o¶£ï=(ð1Žäœl=¦¢ûEè9œG™È"¸=г™Úxû´2 os+:ίmåm=ÚŒí¯Êöý¾Ûgâç«TO®àd ¤úñ´ ýñ3ød„L¨-é¡ršCp…@C·Qü…Šã~Ï4ÉPUµƒÌóOftë#)OfYvë35Ãǵ^úUsb¡2ýë#) ?ýÉ$ÿâR†V¼wÎÕާцRÄÜá™íúN±LL§#)¤p`óõHŠo!Pv‘#*%η°S+VEÀö ´2²Z¿@CbŽïQnóí¿—ŸØ÷;º‰$ 33ç­ò¶U¿ÕwUðï$rφB@;3Õ©.í6ˆkC’2tBÚ9DmžG}ü/dp¬°‚uÇfý©é´ ¹ª¡mÒñ#*ÖâƒÕè'º/ÐŒÊ{†qäW„bA€µ|îÌ3ñ‹À;:hž÷d\:_ìÈ`Ï6l€Ctè~+—Ú³õ_Ëðò=íC‡’íLáCáÂ2éJêóøCxŠ#+,]d†'ŠD$í¯”‡oóUËrOü#*Ê7ãKýšÝe¥‰ˆL‡1Ò·Yàþs#5¯×Íà {R¦¤ˆo½)ž:Zef—Y#+¡¦†#+]”#*‡—šTÁŒ0ÙÿŠeTò´o[x÷ìÒÁ§îS¯sÅ#;µ^ûlÝÃL++UŒº¢X9aðiæ̦õ@£µ­»G‡Ù¹4Ñ#)fÜkc•AšŠŽ°lÄa¦DÑ!vÕI„œ^$ö–l,—rA‚C šÔ6ú¼ú¼bÓ›Å#gw9h‚Ð„8ƒ+Þ^è†{Í:‡² ¾~YŒ£ø&l&Ï6ì¹°ÙB¸©˜°w‰$Y#‹\ž{bò#)c.4£™èÇB#*ùLÏÇL<2t)«zׂƒ}vo  …iÒ64k…³)Ü#+fì‰ÓÇL}2›îöB±³è h3‡œ^i IäqÝôac·F³U1]é.`AHŒIàˆ˜z†|ØK¸RCd0UÊñóüy=ûŸ#*¸ax1¥wfLò¹ƒ¶à ‹ÏÛ³¯]×8óÔ,glÍ+P=X¢#+• ðÝÓÂâ™vÝf``3(HÈ&½®épØæ&‘V† ÷‹ „Pð:¢üìØPÄ‘@$HÁBHË´e!ÅÞAyð–á(8caÆ—Ð0û¿ ¸ŒÌáÿ{M Âüì;Œ¹Yݲ@XŒ DÀ'-t¨n`ºô6îé­btÂ#+D„Õ´¤LjÄÔJƒlkY¥3[FÔm’¨ÌÒDÅ…‘S_;¶®Ú¨Ï::"füO˜Še#)úȇß#)/ΪZŠ·,Rزs=r€Ë‰M@±=ý?ÝãÉùÏÍ##*"¿L·¾k]O¥×¬Á¡ðcS9öɬצåU1Š#€•sóèèéüÍäÛ­\ç•pè-Ü—uñËþëû¨mŸPÌïð€^¡Ë‹Žðl¤ïjoEwÊ [å%®ð†=Ç•N›æ7©¥í·ñ6éx¹h?ÃÈþßëô~§iô/Ï㌻#*<Ú+:³qM:ãÉïøuЧ·Îä÷„ùG²y‹%ÞŸ_ŸˆàNøŒ÷§þV'—ˆÕûÄOA Qä $»ùiwDüeàp#+?dYðêÉ×ÿ6•occ-3{(WQ6éÿ›Ø#³ÞUßæf'üuâ¥Ä”ù6Qû*Qþå³Ò»xœULà›çªáq–s¦ò8‡ÇÕ´éÛD è2²±ûye‰¼#pÅå°–7áá'ו´æ .ÇŸ ÁȬ2LMf¬yÙpx`HŠ$Y@zõïÔ=²Ù j‰ýÞÍÏ«_ŸûŸ©®E=Tg6(‡ÚgÝ-UŒF7°;·m¾Ïö™m÷Ž_—øy ¨ÿÿrE8P#*s† -#<== -#-----BEGIN PGP SIGNATURE-----\n\niQIzBAABCgAdFiEECzlystnjLqtCPS4PIr4MYv+/pUgFAmOxj14ACgkQIr4MYv+/\npUgg7A//X6agCAo9x3REEDFk4GTbW8nMkH7gD+ixNnMNcDF96pmp1f3Qdkm4DU19\nscpa1IPN5ik9xeU4Xs7+SifSlJrT1h9gj2bCFIPWWVlXjCXbn52mU4lijQ4iyaV7\nwLuD4ebG8UU9QK5gP1U2hERdTbkuOxuhQijTijDpfOuUnR1N5YoZmONszgYvYmAL\nr7Zr+Cuc+0HiEdsgMUabp1LTyY+urkZJoHcOTMe0QoyrTvM/CFgB4V3ppw9006VQ\nV4XdoAXEkNNfdJUE1s+4SrQxWT2AC2n9X7vjxbqNwfglzrujf862JrloOjybffdg\ngMPXwLpfT8TrVHFSs5aQK++8YhgwcgDz4Biqt/aq68iM424XnUYSwkzZTowGM/A7\nhyM7Jh+Mp/Of10pIx6PBbjjhbh3dH4OUtFv48uYLh1V95ICQ538UypMfBOK9mEPL\n8zpyTbQ8U873Ri+awOcpoJ4738gZNHAbEHZ3Ctr+g7eoayNlFMENG8bMrLwOkiUQ\nLZVXzNPtPs/OFe0rYu6okVONs8MLmuArnIy7v21Ti73Dtc4ABP6V4CFfc3AGqO+l\n3SmEb5r31h+iXvc4vdp33tESohxUFosIgMGjD8ZMyVFWy78wgp5I9qSbSPdVhl60\nF8WGX/ydvcf6D8NDZqjrsRyFtxKn6xLRQgUI+6DKsNLwRzJBVas=\n=mYk7\n-----END PGP SIGNATURE-----\n diff --git a/wscript b/wscript deleted file mode 100644 index c1dad1d..0000000 --- a/wscript +++ /dev/null @@ -1,1188 +0,0 @@ -#!/usr/bin/env python3 -# encoding: utf-8 -# -# wscript - part of TRE -# Top level waf build script by Tom Rushworth . -# -# This software is released under a BSD-style license. -# See the file LICENSE for details and copyright. -# -# -import os,sys,platform,sysconfig,subprocess,collections -# enum needs >= 3.4 -from enum import Enum -# make sure the unit tests can handle UTF-8 output. -# import codecs -# # Python3.1+: -# sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) - -from waflib import Logs -from waflib import Options -from waflib import Utils - -debug_final_config_envs = 0 -debug_build_config_envs = 0 -debug_build_defaults = False -debug_specific_config_env = None # "nls/ap/wc/mb/ti" # e.g. "nls/ap/wc/sb" - -top = "." -# Set up platform dependent build directory so the project can live on a shared file system -platsys = platform.system().lower() -Logs.pprint("NORMAL","Platform is {0:s}".format(platsys)) -# Known platforms: "darwin", "netbsd", "linux", "windows", "freebsd" -out = "build/"+platsys - -package_name = "tre" -package_version_major = 0 -package_version_minor = 8 -package_version_miniscule = 1 -package_version = "{:d}.{:d}.{:d}".format(package_version_major,package_version_minor,package_version_miniscule) - -# To check on where imports are coming from, look at the system module import path: -# for mispe in sys.path: -# print('module import search path element [{0:s}]'.format(mispe)) -# Add the project tool directory to the system import paths so we can get at things like build variants. -sys.path = sys.path[0:1] + [os.path.normpath(os.getcwd()+'/'+top+'/Tools/waf')] + sys.path[1:None] - -#============================================================================================================= -# Build variants are different configurations of the targets, such as with or without native language support. -# We want to be able to build and test all the viable combinations while developing, although end users will -# probably only want one of them. -# -# Variants for TRE: -# nls/sls (native/single) language support (i.e. gettext() and .po/.mo files) -# used for lib, agrep, and retests -lang_variants = ["nls","sls"] -# ap/ex (approximate/exact) matching -match_variants = ["ap","ex"] -# wc/nc (wide/narrow) char -width_variants = ["wc","nc"] -# build the wchar_t variants (wide) or not -# mb/sb (multi/single) byte (multi-byte is encodings like UTF-8) -encoding_variants = ["mb","sb"] -# conform to the system regex ABI or not -# ti/ri Tre Interface or system Regex Interface -rxabi_variants = ["ti","ri"] -# -# Strings names for the variants need to be unique with respect to all the other variant names because -# they get used as part of variable names (e.g. cfg.env.variant_nls or cfg.env.variant_mb). -# -variant_group_list = [lang_variants,match_variants,width_variants,encoding_variants,rxabi_variants] -# Note that the python extension requires wide char, and is cannot be built for the narrow char variants. - -# Import the build variant machinery and start creating the data structures for the variants we want. -# The final part of the variant setup is done in the configure step. -import build_variants -variant_name_path_list = build_variants.construct_variants(platsys,variant_group_list) - -def options(opt): - # Add option for logging calls to wscript build() functions (helps with debugging wscripts) - opt.parser.set_defaults(log_wscripts=False) - opt.add_option("--lws", action="store_true", dest="log_wscripts", help="Display wscripts entered") - opt.add_option("--nolws", action="store_false", dest="log_wscripts", help="Skip displaying wscripts entered") - # - # The waf build system has slightly different semantics for configuration options from the GNU autotools, - # because the option flags are available at configuration (like autotools), but also at build time (i.e. - # like the "make" step in "./configure; make; make install"), and they don't have to have the same values. - # This is handled here by recording the option values at the config step, and using them as defaults in the - # build step. The convention used for the recorded value is: - # -1 for option disabled, - # 0 for option not specified (i.e. choose a default), - # +1 for option enabled. - # - # Build all variants - # - opt.parser.set_defaults(build_all_variants=1) - opt.add_option("--all", action="store_const", const=1, dest="build_all_variants", help="build all viable variants") - opt.add_option("--noall", action="store_const", const=-1, dest="build_all_variants", help="build only requested (or default) variants") - opt.add_option("--notall", action="store_const", const=-1, dest="build_all_variants", help="build only requested (or default) variants") - # - # Since multiple variants are possible, the exclusive pairs for a single variant have more possibilities. - # For examle, when building only one variant there are two (exclusive) possibilities for National Language Support, - # the built target must have NLS enabled or disabled. However when building multipble variants there are three - # possibilities, (1) build only variants with NLS enabled, or (2) build only variants with NSL disabled, or (3) build - # both kinds of variants. It doesn't make too much sense for the fourth combination (no enabled OR disabled NLS variants) - # because then there are no variants at all being built. - # - # Rather than trying to come up with wording for the option names that makes the 3 possibilities clear, I've kept the - # enable/disable terminology and added a negation style name with its own enable/disable options. To continue the NLS - # example from above, I've kept --enable-nls and --disable-nls, but added SLS (Single Language Support) with the options - # --enable-sls and --disable--sls. - # - # NLS/SLS - # - # Add option for building the native language support variant - opt.parser.set_defaults(enable_nls=(-1 if "windows"==platsys else 0)) - opt.add_option("--enable-nls", action="store_const", const=1, dest="enable_nls", - help="build native language support variant, i.e. gettext (default)") - opt.add_option("--disable-nls", action="store_const", const=-1, dest="enable_nls", - help="skip native language support variant") - # Add option for building the single language support variant - opt.parser.set_defaults(enable_sls=0) - opt.add_option("--enable-sls", action="store_const", const=1, dest="enable_sls", - help="build single language support variant") - opt.add_option("--disable-sls", action="store_const", const=-1, dest="enable_sls", - help="skip single language support variant (default)") - # - # ap/ex - # - # Add option for building the approximate matching variant - opt.parser.set_defaults(enable_ap=0) - opt.add_option("--enable-approx", action="store_const", const=1, dest="enable_ap", - help="build approximate matching variant (default)") - opt.add_option("--disable-approx", action="store_const", const=-1, dest="enable_ap", - help="skip approximate matching variant") - # Add option for building the exact matching variant - opt.parser.set_defaults(enable_ex=0) - opt.add_option("--enable-exact", action="store_const", const=1, dest="enable_ex", - help="build exact matching variant") - opt.add_option("--disable-exact", action="store_const", const=-1, dest="enable_ex", - help="skip exact matching variant (default)") - # - # wc/nc - # - # Add option for building the wide character (wchar_t) variant - opt.parser.set_defaults(enable_wc=0) - opt.add_option("--enable-wchar", action="store_const", const=1, dest="enable_wc", - help="build wide character (wchar_t) variant (default)") - opt.add_option("--disable-wchar", action="store_const", const=-1, dest="enable_wc", - help="skip wide character (wchar_t) variant (eliminates multibyte)") - # Add option for building the narrow character (char) variant - opt.parser.set_defaults(enable_nc=0) - opt.add_option("--enable-nchar", action="store_const", const=1, dest="enable_nc", - help="build narrow character (char) variant (eliminates multibyte)") - opt.add_option("--disable-nchar", action="store_const", const=-1, dest="enable_nc", - help="skip narrow character (char) variant (default)") - # - opt.parser.set_defaults(use_libutf8=0) - opt.add_option("--with-libutf8", action="store_const", const=1, dest="use_libutf8", - help="use instead of and ") - opt.add_option("--without-libutf8", action="store_const", const=-1, dest="use_libutf8", - help="do not use instead of and ") - # - # mb/sb - # - # Add option for building the multibyte variant - opt.parser.set_defaults(enable_mb=0) - opt.add_option("--enable-multibyte", action="store_const", const=1, dest="enable_mb", - help="build multibyte (e.g. UTF-8) variant (default, requires wchar)") - opt.add_option("--disable-multibyte", action="store_const", const=-1, dest="enable_mb", - help="skip multibyte variant") - # Add option for building the single byte variant - opt.parser.set_defaults(enable_sb=0) - opt.add_option("--enable-singlebyte", action="store_const", const=1, dest="enable_sb", - help="build single byte (char) variant") - opt.add_option("--disable-singlebyte", action="store_const", const=-1, dest="enable_sb", - help="skip single byte (char) variant (default)") - # - # ti/ri - # - # Add option for building the TRE interface (ABI) variant - opt.parser.set_defaults(enable_ti=0) - opt.add_option("--enable-tre-abi", action="store_const", const=1, dest="enable_ti", - help="build TRE ABI variant (default)") - opt.add_option("--disable-tre-abi", action="store_const", const=-1, dest="enable_ti", - help="skip TRE ABI variant") - # Add option for building the system regex interface (ABI) variant - opt.parser.set_defaults(enable_ri=0) - opt.add_option("--enable-system-abi", action="store_const", const=1, dest="enable_ri", - help="build system regex ABI variant") - opt.add_option("--disable-system-abi", action="store_const", const=-1, dest="enable_ri", - help="skip system regex ABI variant (default)") - # - # ################### - # Add option for building agrep (only makes sense for the approximate matching variant) - opt.parser.set_defaults(enable_agrep=1) - opt.add_option("--enable-agrep", action="store_const", const=1, dest="enable_agrep", help="enable building agrep (default)") - opt.add_option("--disable-agrep", action="store_const", const=-1, dest="enable_agrep", help="skip building agrep") - # Add option for building python extension - if "windows" == platsys: - # ... but not on windows for now - opt.parser.set_defaults(enable_python_extension=False) - else: - opt.parser.set_defaults(enable_python_extension=True) - opt.add_option("--enable-pyext", action="store_true", dest="enable_python_extension", help="enable building python extension (default)") - opt.add_option("--disable-pyext", action="store_false", dest="enable_python_extension", help="disable building python extension") - # Add option for building and running library tests. - opt.parser.set_defaults(enable_tests=1) - opt.add_option("--enable-tests", action="store_const", const=1, dest="enable_tests", - help="enable building and running library tests (default)") - opt.add_option("--disable-tests", action="store_const", const=-1, dest="enable_tests", help="disable building and running library tests") - opt.add_option("--test", action="store_const", const=1, dest="enable_tests", help="enable building and running library tests (default)") - opt.add_option("--notest", action="store_const", const=-1, dest="enable_tests", help="disable building and running library tests") - # Add option for using alloca if the header is present. - opt.parser.set_defaults(with_alloca=True) - opt.add_option("--with-alloca", action="store_true", dest="with_alloca", help="use alloca() if available (default)") - opt.add_option("--without-alloca", action="store_false", dest="with_alloca", help="do not use alloca()") - # Add option for using libutf8. - opt.parser.set_defaults(with_libutf8=False) - opt.add_option("--with-libutf8", action="store_true", dest="with_libutf8", help="use libutf8.h if available") - opt.add_option("--without-libutf8", action="store_false", dest="with_libutf8", help="do not use libutf8.h (default)") - # FIXME - lots more to do in configure before actually completing this. - # opt.add_option("--enable-system-abi", action="store_true", dest="enable_sys_regex", help="try to make TRE compatible with the system regex ABI") - # opt.add_option("--disable-system-abi", action="store_false", dest="enable_sys_regex", help="ignore the system regex ABI (default)") - # # Add option for profiling with gprof - # opt.parser.set_defaults(enable_profile=False) - # opt.add_option("--enable-profile", action="store_true", dest="enable_profile", help="enable profiling with gprof") - # opt.add_option("--disable-profile", action="store_false", dest="enable_profile", help="disable profiling with gprof (default)") - # # No direct option for debug build, now treated as a target variation (rel/dbg) - # opt.parser.set_defaults(release_bciuls=False) - # opt.add_option("--rel", action="store_true", dest="release_bciuls", help="Build/clean/install/uninstall release versions") - # opt.add_option("--norel", action="store_false", dest="release_bciuls", help="Skip build/clean/install/uninstall release versions") - # opt.parser.set_defaults(debug_bciuls=True) - # opt.add_option("--dbg", action="store_true", dest="debug_bciuls", help="Build/clean/install/uninstall debug versions") - # opt.add_option("--nodbg", action="store_false", dest="debug_bciuls", help="Skip build/clean/install/uninstall debug versions") - # When clang is one of multiple compilers available, try it first. - # Standard alternative: - # waf configure --check-c-compiler=gcc - # waf configure --check-c-compiler=clang - opt.check_c_compiler = ["clang","gcc"] - opt.load("compiler_c") - # And finally pick up options for things we might build (options have not actually - # been SET at this point, only initialized, so we don't know what will actually be built). - opt.recurse("lib") # tre library - opt.recurse("src") # agrep - opt.recurse("python") # python extension - # opt.recurse("po") # NLS - opt.recurse("tests") # what it says - # Logs.pprint("NORMAL","finished options") - -def de_dup_os_search_path(os_search_path): - old_path_lst = os_search_path.split(os.pathsep) - new_path_lst = [] - for p in old_path_lst: - if p not in new_path_lst: - new_path_lst.append(p) - return(os.pathsep.join(new_path_lst)) - -# Useful bit to get a look at the compiler defines (gcc or clang): -# clang -dM -E - - -def normalize_option(enable_value,default_value): - # There are 3 possiblities for enable and disable, giving 9 cases to check. - # Return: - # -1 for setting_name disabled - # +1 for setting_name enabled - # default_value for setting_name not set - if enable_value < 0: - return(-1) - if enable_value > 0: - return(1) - return(default_value) - -def normalize_option_all(enable_value,default_value): - if Options.options.build_all_variants > 0: - # Build all implies the other options are +1. - return(1) - return normalize_option(enable_value,default_value) - -# Data structure for describing what needs to be done for the C #define lines -# in headers depending on whether a variant is True (yes) or not. -CDef_Action = Enum("CDef_Action",["CPY_FRM_PLTFM","UNDEF","DEFINE"]) -CDef_Val_Type = Enum("CDef_Val_Type",["INT","STR","VAR"]) -CDef_Info = collections.namedtuple("CDef_Info",["name","comment", - "yes_action","yes_data", - "no_action","no_data"]) - -cdefs_for_all_variants = [ - CDef_Info("HAVE_DLFCN_H","Define to 1 if you have the header file.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_GETOPT_H","Define to 1 if you have the header file.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_GETOPT_LONG","Define to 1 if you have the 'getopt_long' function.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_INTTYPES_H","Define to 1 if you have the header file.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_ISASCII","Define to 1 if you have the 'isascii' function.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_ISBLANK","Define to 1 if you have the 'isblank' function.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_LIBUTF8_H","Define to 1 if you have the header file.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_STDINT_H","Define to 1 if you have the header file.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_STDIO_H","Define to 1 if you have the header file.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_STDLIB_H","Define to 1 if you have the header file.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_STRINGS_H","Define to 1 if you have the header file.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_STRING_H","Define to 1 if you have the header file.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_SYS_STAT_H","Define to 1 if you have the header file.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_SYS_TYPES_H","Define to 1 if you have the header file.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("_GNU_SOURCE","Define to enable GNU extensions in glibc.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - # ("HAVE_ICONV",True,"Define if you have the iconv() (codeset conversion) function and it works."), - # ("STDC_HEADERS",True,"Define to 1 if all of the C90 standard headers exist (not just the ones - # required in a freestanding environment). This macro is provided for - # backward compatibility; new code need not use it."), -] - -cdefs_for_debug = [ - CDef_Info("TRE_DEBUG","Define if you want TRE to print debug messages to stdout.", - CDef_Action.DEFINE,(CDef_Val_Type.INT,1),CDef_Action.UNDEF,None), - CDef_Info("NDEBUG","____.", - CDef_Action.DEFINE,(CDef_Val_Type.INT,1),CDef_Action.UNDEF,None), -] - -cdefs_for_nls = [ - CDef_Info("ENABLE_NLS","Define to 1 if translation of program messages to the user+s native language is requested.", - # NLS - enable NLS - CDef_Action.DEFINE,(CDef_Val_Type.INT,1), - # SLS - disable NLS - CDef_Action.UNDEF,None), - CDef_Info("HAVE_DCGETTEXT","Define if the GNU dcgettext() function is already present or preinstalled.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_GETTEXT","Define if the GNU gettext() function is already present or preinstalled.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - # These functions do not appear anywhere in the source code (as of 2023/05/25, so it is pointless to look for them. - # ("HAVE_CFLOCALECOPYCURRENT",Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework."), - # ("HAVE_CFPREFERENCESCOPYAPPVALUE",Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework."), -] - -cdefs_for_ap = [ - CDef_Info("TRE_APPROX","Define if you want to enable approximate matching functionality.", - # AP - enable approximate matching - CDef_Action.DEFINE,(CDef_Val_Type.INT,1), - # EX - disable approximate matching - CDef_Action.UNDEF,None), -] - -cdefs_for_wide_characters = [ - CDef_Info("TRE_WCHAR","Define if you want to enable wide character functionality.", - # WC - enable wide character - CDef_Action.DEFINE,(CDef_Val_Type.INT,1), - # NC - disable wide character - CDef_Action.UNDEF,None), - CDef_Info("TRE_WTYPE","Define if you want to enable wide character functionality.", - # WC - enable wide character - CDef_Action.DEFINE,(CDef_Val_Type.INT,1), - # NC - disable wide character - CDef_Action.UNDEF,None), - CDef_Info("HAVE_MBSTATE_T","Define to 1 if the system has the type 'mbstate_t'.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_WCSRTOMBS","Define to 1 if you have the 'wcsrtombs' function or macro.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_ISWASCII","Define to 1 if you have the 'iswascii' function or macro.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_ISWBLANK","Define to 1 if you have the 'iswblank' function or macro.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_ISWCTYPE","Define to 1 if you have the 'iswctype' function or macro.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_ISWLOWER","Define to 1 if you have the 'iswlower' function or macro.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_ISWUPPER","Define to 1 if you have the 'iswupper' function or macro.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_TOWLOWER","Define to 1 if you have the 'towlower' function or macro.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_TOWUPPER","Define to 1 if you have the 'towupper' function or macro.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_WCHAR_H","Define to 1 if you have the header file.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_WCHAR_T","Define to 1 if the system has the type 'wchar_t'.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_WCSCHR","Define to 1 if you have the 'wcschr' function or macro.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_WCSCPY","Define to 1 if you have the 'wcscpy' function or macro.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_WCSLEN","Define to 1 if you have the 'wcslen' function or macro.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_WCSNCPY","Define to 1 if you have the 'wcsncpy' function or macro.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_WCTYPE","Define to 1 if you have the 'wctype' function or macro.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_WCTYPE_H","Define to 1 if you have the header file.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_WINT_T","Define to 1 if the system has the type 'wint_t'.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), -] - -cdefs_for_multibyte = [ - CDef_Info("TRE_MULTIBYTE","Define to enable multibyte character set support.", - # MB - enable multibyte - CDef_Action.DEFINE,(CDef_Val_Type.INT,1), - # SB - disable multibyte - CDef_Action.UNDEF,None), - CDef_Info("HAVE_MBRTOWC","Define to 1 if you have the 'mbrtowc' function or macro.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_MBTOWC","Define to 1 if you have the 'mbtowc' function or macro.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_WCSTOMBS","Define to 1 if you have the 'wcstombs' function or macro.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), -] - -# The regex defines may seem backwards because the "yes" action is to NOT use the system regex ABI. -cdefs_for_regex = [ - CDef_Info("TRE_USE_SYSTEM_REGEX_H","Define to include the system regex.h from TRE regex.h", - # TI - use TRE native ABI - CDef_Action.UNDEF,None, - # RI - use system ABI from - CDef_Action.DEFINE,(CDef_Val_Type.INT,1)), - CDef_Info("HAVE_REGEX_H","Define to 1 if you have the header file.", - # TI - use TRE native ABI - CDef_Action.UNDEF,None, - # RI - use system ABI from - CDef_Action.CPY_FRM_PLTFM,None), - CDef_Info("TRE_SYSTEM_REGEX_H_PATH","Define to the absolute path to the system regex.h", - # TI - use TRE native ABI - CDef_Action.UNDEF,None, - # RI - use system ABI from - CDef_Action.CPY_FRM_PLTFM,None), - CDef_Info("HAVE_REG_ERRCODE_T","Define to 1 if the system has the type 'reg_errcode_t'.", - # TI - use TRE native ABI - CDef_Action.UNDEF,None, - # RI - use system ABI from - CDef_Action.CPY_FRM_PLTFM,None), - CDef_Info("TRE_REGEX_T_FIELD", - "Define to a field in the regex_t struct where TRE should store a pointer to the internal tre_tnfa_t structure", - # TI - use TRE native ABI - CDef_Action.DEFINE,(CDef_Val_Type.VAR,"value"), - # CDef_Action.CPY_FRM_PLTFM,None, - # RI - use system ABI from - CDef_Action.CPY_FRM_PLTFM,None), - CDef_Info("_REGCOMP_INTERNAL", "Define on IRIX", - # TI - use TRE native ABI - CDef_Action.UNDEF,None, - # RI - use system ABI from - CDef_Action.DEFINE,(CDef_Val_Type.INT,1)), -] - -# FUTURE: make this a variation, only valid if "HAVE_ALLOCA" is in the platform env (header may be separate, or part of standard C library) -cdefs_for_alloca = [ - CDef_Info("TRE_USE_ALLOCA","Define if you want TRE to use alloca() instead of malloc() when allocating memory needed for regexec operations.", - CDef_Action.DEFINE,(CDef_Val_Type.INT,1), - CDef_Action.UNDEF,None), - CDef_Info("HAVE_ALLOCA","Define to 1 if you have 'alloca', as a function or macro.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("HAVE_ALLOCA_H","Define to 1 if works.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("C_ALLOCA","Define to 1 if using 'alloca.c'.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), # FIXME this should be yet another variant.. -] - -cdefs_for_alloca = [ - CDef_Info("WCHAR_MAX","Define to the maximum value of wchar_t if not already defined elsewhere.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("WCHAR_T_SIGNED","Define if wchar_t is signed.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("WCHAR_T_UNSIGNED","Define if wchar_t is unsigned", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("_FILE_OFFSET_BITS","Number of bits in a file offset, on hosts where this is settable.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - CDef_Info("_LARGE_FILES","Define for large files, on AIX-style hosts.", - CDef_Action.CPY_FRM_PLTFM,None, CDef_Action.UNDEF,None), - # See tail end of autoconf generated config.h for const, inline, and size_t workarounds. -] - -def cdef_is_in_env(key,env): - # Check to see if key is a cdef in the given env. - ban = key + '=' - for x in env.DEFINES: - if x.startswith(ban): - return True - return False - -def copy_define(key,comment,dst_env,src_env): - # Define (or undefine) key in dst_env to match key in src_env if it is in the src_env. - # This does not modify the src_env in any way. - # FIXME - try to convert to using dst_cfg and the methods in ConfigContext instead of operating directly. - DEFKEYS="define_key" - dst_DEFINES = dst_env.DEFINES # S.B. a list of "key=val" strings - dst_DEFKEYS = dst_env[DEFKEYS] # S.B. a list of "key" strings - src_DEFINES = src_env.DEFINES # S.B. a list of "key=val" strings - src_DEFKEYS = src_env[DEFKEYS] # S.B. a list of "key" strings - dbg_this_cfg = (debug_build_config_envs > 0) or (dst_env.VARIANT == debug_specific_config_env) - if dbg_this_cfg: - Logs.pprint("CYAN","-------------------") - Logs.pprint("CYAN","considering key {{{:s}}} for cfg {{{:s}}} from {{{:s}}}".format(key,dst_env.VARIANT,src_env.VARIANT)) - if key in src_DEFKEYS: - if dbg_this_cfg: - Logs.pprint("CYAN","key {{{:s}}} present in cfg {{{:s}}} DEFKEYS".format(key,src_env.VARIANT)) - def_start = key + "=" - # Look for the defn in the src. - defn = None - for possible_defn in src_DEFINES: - if possible_defn.startswith(def_start): - defn = possible_defn - break - # If there is a defn in the src copy it to the dst. - replaced_first = -1 - if None != defn: - if dbg_this_cfg : - Logs.pprint("YELLOW","found key {{{:s}}} in src {{{:s}}}".format(key,defn)) - # Replace the first defn in dst_env, or just append the defn if there is no existing one in dst. - for x in range(len(dst_DEFINES)): - if dst_DEFINES[x].startswith(def_start): - replaced_first = x - dst_DEFINES[x] = defn - break - if replaced_first < 0: - # No existing defn. - replaced_first = len(dst_DEFINES) - dst_DEFINES.append(defn) - if dbg_this_cfg: - Logs.pprint("GREEN","replaced key {{{:s}}} : {{{:s}}} at dst[{:d}]".format(key,defn,replaced_first)) - # Remove any unwanted defns (after replaced_first, or all if no defn in src) from dst_env. - start = replaced_first + 1 - removed_one = True - while removed_one and start < len(dst_DEFINES): - removed_one = False - for x in range(start,len(dst_DEFINES)): - if dst_DEFINES[x].startswith(def_start): - del dst_DEFINES[x:x+1] - if dbg_this_cfg: - Logs.pprint("PINK","removed key {{{:s}}} : {{{:s}}} from dst[{:d}]".format(key,defn,x)) - # The del may have messed up the iteration, get out of the for loop, - # but repeat the while in the unlikely case of more than 1 define. - start = x - removed_one = True - break - # Add the key in either a define or undefine case. - if key not in dst_DEFKEYS: - dst_DEFKEYS.append(key) - # Add the comment in either a define or undefine case. - if "DEFINE_COMMENTS" in dst_env: - dst_env.DEFINE_COMMENTS[key] = comment or "" - else: - dst_env.DEFINE_COMMENTS = {key:(comment or "")} - # Make sure the dst_env is updated, just in case any of the ops above copied the data instead of modifying it. - dst_env.DEFINES = dst_DEFINES - dst_env[DEFKEYS] = dst_DEFKEYS - -def find_sys_regex_path(cfg_ctx): - # Find the path to the system file or "_" if not available. - # Use the C preprocessor to do the search, and look for lines like: - # {# 1 "/usr/include/regex.h" 1 3 4} - # in its output. - # The autotool configure uses: - # echo '#include ' | $CC -E | grep '^#[a-z]* [0-9]* "\(.*regex.h\)"' | head -1 | sed 's/^#[a-z]* [0-9]* \"\(.*\)\".*/\1/' - no_path = "_" - rc = -1 - stdout_data = None - stderr_data = None - if cfg_ctx.is_defined("HAVE_REGEX_H"): - cc_path = cfg_ctx.env.CC - # Logs.pprint("RED","cc_path {{{!s}}}".format(cc_path)) - args = [cc_path[0], "-E", "-"] # Both clang and gcc need a "-" argument to say to read from stdin. - # if "clang" in cc_path[0]: - # # clang needs a "-" argument to tell it to read from stdin. - # args += "-" - # GAH! The type of input and output of the Popen depens on how streams have been opened, and I don't want to figure that out... - try: - proc = Utils.subprocess.Popen(args,stdin=Utils.subprocess.PIPE,stderr=Utils.subprocess.PIPE,stdout=Utils.subprocess.PIPE) - (stdout_data,stderr_data) = proc.communicate(input="#include \n") - rc = proc.returncode - except: - proc = Utils.subprocess.Popen(args,stdin=Utils.subprocess.PIPE,stderr=Utils.subprocess.PIPE,stdout=Utils.subprocess.PIPE) - (stdout_data,stderr_data) = proc.communicate(input=b"#include \n") - stdout_data = stdout_data.decode("UTF-8") - stderr_data = stderr_data.decode("UTF-8") - rc = proc.returncode - # Logs.pprint("PINK","type(stdout_data) = {{{!s}}}".format(type(stdout_data))) - if 0 == rc: - # Logs.pprint("PINK","rc==0") - for line in stdout_data.splitlines(): - # Logs.pprint("PINK","|{!s}".format(line)) - if line.startswith('#'): - rx = line.find('regex.h"') - if -1 != rx: - rx += 7 # postion of trailing '"' - qx = line.find('"') # look for leading '"' - if -1 != qx and qx+1 < rx: - cfg_ctx.define("TRE_SYSTEM_REGEX_H_PATH",line[qx+1:rx],comment="Define to the absolute path of the system regex.h") - return - else: - Logs.pprint("PINK","rc=={:d}".format(rc)) - Logs.pprint("PINK","{!s}".format(stderr_data)) - # Not found. - cfg_ctx.define("TRE_SYSTEM_REGEX_H_PATH","_",comment="Define to the absolute path of the system regex.h (no found)") - -def find_sys_regex_field(cfg_ctx): - for candidate in ["buffer","re_comp","__re_comp","__reg_expression","re_g","re_pad[0]"]: - pgm = ''' -#include -#include -int zot() - {regex_t foo; - void *bar = foo.''' + candidate + '''; - foo.''' + candidate + ''' = bar;} -''' - # If pgm compiles OK, candidate is good. - msg = "Checking for usable regex_t field {:s}".format(candidate) - ok = cfg_ctx.check(features="c",mandatory=False,fragment=pgm,msg=msg) - if ok: - cfg_ctx.define("TRE_REGEX_T_FIELD",candidate,quote=False) - return - cfg_ctx.define("TRE_REGEX_T_FIELD","failed_usable_regex_t_field_name_search",quote=False) - -def handle_c_defines(cfg,do_yes_actions,list_of_cdefs,platform_env): - dbg_this_cfg = (debug_build_config_envs > 0) or (cfg.env.VARIANT == debug_specific_config_env) - for info in list_of_cdefs: - cdef_name = info.name - cdef_comment = info.comment - if do_yes_actions: - action = info.yes_action - data = info.yes_data - else: - action = info.no_action - data = info.no_data - if CDef_Action.DEFINE == action: - if None == data: - # The value isn't important, just define to 1. - cfg.define(cdef_name,1,comment=cdef_comment) - else: - # data is a tuple (CDef_Val_Type,val). - cdef_type = data[0] - if CDef_Val_Type.INT == cdef_type: - cfg.define(cdef_name,data[1],comment=cdef_comment) - elif CDef_Val_Type.VAR == cdef_type: - cfg.define(cdef_name,data[1],comment=cdef_comment,quote=False) - elif CDef_Val_Type.STR == cdef_type: - cfg.define(cdef_name,data[1],comment=cdef_comment,quote=True) - else: - # Unexpected data type for cdef value, whine - msg = "Unexpected data value type in {:s} action for C #define {:s}" - Logs.pprint("RED",msg.format("yes" if do_yes_actions else "no",cdef_name)) - elif CDef_Action.UNDEF == action: - # Remove any definition. - cfg.undefine(cdef_name,comment=cdef_comment) - elif CDef_Action.CPY_FRM_PLTFM == action: - # Copy any definition from the platform_env to the current one. - copy_define(cdef_name,cdef_comment,cfg.env,platform_env) - else: - # Unexpected cdef action, whine - msg = "Unexpected action type for C #define {:s}" - Logs.pprint("RED",msg.format(cdef_name)) - -def gather_env_for_variant(cfg): - # Figure out the various DEFINES for cfg's current variant given both - # what the variant requires and what is available from the platform. - # We need this complicated setup so that for example, we can build - # a variant without NLS even though the platform has the include files - # "gettext.h" and "libintl.h" available. - dbg_this_cfg = (debug_build_config_envs > 0) or (cfg.env.VARIANT == debug_specific_config_env) - dbg_colour = "BLUE" - if not cfg.env.viable: - # This variant has already failed, no point in looking further. - if dbg_this_cfg: - Logs.pprint("RED","====== variant {{{:s}}} not viable".format(cfg.env.VARIANT)) - return - platform_env = cfg.all_envs[cfg.all_envs[""].PLATSYS] - if dbg_this_cfg: - Logs.pprint(dbg_colour,"====== Handling defines_for_all_variants variant {{{:s}}}".format(cfg.env.VARIANT)) - handle_c_defines(cfg,True,cdefs_for_all_variants,platform_env) - #-------------------------------------------------- NLS - if cfg.env.variant_nls: - if not cdef_is_in_env("HAVE_LIBINTL_H",platform_env) or "darwin" == platsys: - # We need gettext and it isn't available. - if dbg_this_cfg: - Logs.pprint("RED","====== variant {{{:s}}} not viable (no LIBINTL_H)".format(cfg.env.VARIANT)) - cfg.env.viable = False - return - if dbg_this_cfg: - Logs.pprint(dbg_colour,"====== Handling defines_for_nls variant {{{:s}}}".format(cfg.env.VARIANT)) - handle_c_defines(cfg,cfg.env.variant_nls,cdefs_for_nls,platform_env) - #-------------------------------------------------- AP - if dbg_this_cfg: - Logs.pprint(dbg_colour,"====== Handling defines_for_approximate_matching variant {{{:s}}}".format(cfg.env.VARIANT)) - handle_c_defines(cfg,cfg.env.variant_ap,cdefs_for_ap,platform_env) - #-------------------------------------------------- WC - cdfwc = cdefs_for_wide_characters - if cfg.env.variant_wc: - # We need wide character support, either or , but not both at the same time. - if not cdef_is_in_env("HAVE_WCHAR_H",platform_env) or not cdef_is_in_env("HAVE_WCTYPE_H",platform_env): - if dbg_this_cfg: - Logs.pprint("RED","====== variant {{{:s}}} not viable (no WCHAR_H or WCTYPE_H)".format(cfg.env.VARIANT)) - cfg.env.viable = False - return - if cfg.env.variant_sb: - # autoconf skips the TRE_WTYPE for the non-multibyte build. - ndx_to_remove = 1 - # Use cdfwc so we don't end up modifying the original for other variants. - cdfwc = cdefs_for_wide_characters[0:ndx_to_remove] + cdefs_for_wide_characters[ndx_to_remove+1:] - if dbg_this_cfg: - Logs.pprint(dbg_colour,"====== Handling defines_for_wide_characters variant {{{:s}}}".format(cfg.env.VARIANT)) - handle_c_defines(cfg,cfg.env.variant_wc,cdfwc,platform_env) - #-------------------------------------------------- MB - # In both Linux and FreeBSD mbstate_t is defined when "#include " is processed. - # There are ways to get mbstate_t without wchar.h, but they differ, so for now skip configs with "mb" but not "wc". - # Note that autoconf/configure simply rules them out as an error. - if cfg.env.variant_mb and not cfg.env.variant_wc: - if dbg_this_cfg: - Logs.pprint("RED","====== variant {{{:s}}} not viable (no MB without WC)".format(cfg.env.VARIANT)) - cfg.env.viable = False - return - if dbg_this_cfg: - Logs.pprint(dbg_colour,"====== Handling defines_for_multibyte variant {{{:s}}}".format(cfg.env.VARIANT)) - handle_c_defines(cfg,cfg.env.variant_mb,cdefs_for_multibyte,platform_env) - #-------------------------------------------------- TI/RI system regex compatibility - if cfg.env.variant_ri and not cdef_is_in_env("HAVE_REGEX_H",platform_env): - if dbg_this_cfg: - Logs.pprint("RED","====== variant {{{:s}}} not viable (no )".format(cfg.env.VARIANT)) - cfg.env.viable = False - return - if dbg_this_cfg: - Logs.pprint(dbg_colour,"====== Handling defines_for_regex variant {{{:s}}}".format(cfg.env.VARIANT)) - handle_c_defines(cfg,cfg.env.variant_ti,cdefs_for_regex,platform_env) - #-------------------------------------------------- - if dbg_this_cfg: - Logs.pprint(dbg_colour,"====== Handling defines_for_alloca variant {{{:s}}}".format(cfg.env.VARIANT)) - handle_c_defines(cfg,(cfg.env.build_default_with_alloca>0),cdefs_for_alloca,platform_env) - #-------------------------------------------------- - if dbg_this_cfg: - Logs.pprint(dbg_colour,"====== Finished defines_* variant {{{:s}}}".format(cfg.env.VARIANT)) - -def configure(cfg): - if Options.options.log_wscripts: - Logs.pprint('CYAN','Configuring in {:s}'.format(cfg.path.abspath())) - os.environ["PATH"] = de_dup_os_search_path(os.environ.get("PATH","")) - cfg.env['PLATSYS'] = platsys - # Just so we have them if we need them in the subdirectories... - cfg.variant_group_list = variant_group_list - cfg.variant_name_path_list = variant_name_path_list - # ================= Config options to be saved for build - opts = Options.options - # We want to save the DEFAULT build options from the config, but not to rule out other options on the build command line. - cfg.env.build_default_build_all_variants = opts.build_all_variants - cfg.env.build_default_enable_nls = normalize_option_all(opts.enable_nls,1) - cfg.env.build_default_enable_sls = normalize_option_all(opts.enable_sls,-1) - if "darwin" == platsys: - # National Language Support is a completely different animal on darwin, for now skip it. - cfg.env.build_default_enable_nls = -1 - cfg.env.build_default_enable_sls = 1 - elif "windows" == platsys: - # GNU gettext is an extra on windows, for now skip it. - cfg.env.build_default_enable_nls = -1 - cfg.env.build_default_enable_sls = 1 - if not (cfg.env.build_default_enable_nls >= 0 or cfg.env.build_default_enable_sls >= 0): - # Rule out the "don't build anything" case by taking the simplest one. - cfg.env.build_default_enable_sls = 1 - cfg.env.build_default_enable_ap = normalize_option_all(opts.enable_ap,1) - cfg.env.build_default_enable_ex = normalize_option_all(opts.enable_ex,-1) - if not (cfg.env.build_default_enable_ap >= 0 or cfg.env.build_default_enable_ex >= 0): - # Rule out the "don't build anything" case by taking the simplest one. - cfg.env.build_default_enable_ex = 1 - cfg.env.build_default_enable_wc = normalize_option_all(opts.enable_wc,1) - cfg.env.build_default_enable_nc = normalize_option_all(opts.enable_nc,-1) - if not (cfg.env.build_default_enable_wc >= 0 or cfg.env.build_default_enable_nc >= 0): - # Rule out the "don't build anything" case by taking the simplest one. - cfg.env.build_default_enable_nc = 1 - cfg.env.build_default_enable_mb = normalize_option_all(opts.enable_mb,1) - cfg.env.build_default_enable_sb = normalize_option_all(opts.enable_sb,-1) - if cfg.env.build_default_enable_wc < 0: - # Multibyte reqires widecharacter - cfg.env.build_default_enable_mb = -1 - if not (cfg.env.build_default_enable_mb >= 0 or cfg.env.build_default_enable_sb >= 0): - # Rule out the "don't build anything" case by taking the simplest one. - cfg.env.build_default_enable_sb = 1 - cfg.env.build_default_enable_ti = normalize_option_all(opts.enable_ti,1) - cfg.env.build_default_enable_ri = normalize_option_all(opts.enable_ri,-1) - if not (cfg.env.build_default_enable_ti >= 0 or cfg.env.build_default_enable_ri >= 0): - # Rule out the "don't build anything" case by taking the simplest one. - cfg.env.build_default_enable_ti = 1 - cfg.env.build_default_with_alloca = 1 if opts.with_alloca else -1 - if debug_build_defaults: - msg = "type({:s}) {{{!s}}} val {{{!s}}}" - Logs.pprint("PINK",msg.format("build_default_enable_nls",type(cfg.env.build_default_enable_nls),cfg.env.build_default_enable_nls)) - Logs.pprint("PINK",msg.format("build_default_enable_sls",type(cfg.env.build_default_enable_sls),cfg.env.build_default_enable_sls)) - Logs.pprint("PINK",msg.format("build_default_enable_ap",type(cfg.env.build_default_enable_ap),cfg.env.build_default_enable_ap)) - Logs.pprint("PINK",msg.format("build_default_enable_ex",type(cfg.env.build_default_enable_ex),cfg.env.build_default_enable_ex)) - Logs.pprint("PINK",msg.format("build_default_enable_wc",type(cfg.env.build_default_enable_wc),cfg.env.build_default_enable_wc)) - Logs.pprint("PINK",msg.format("build_default_enable_nc",type(cfg.env.build_default_enable_nc),cfg.env.build_default_enable_nc)) - Logs.pprint("PINK",msg.format("build_default_enable_mb",type(cfg.env.build_default_enable_mb),cfg.env.build_default_enable_mb)) - Logs.pprint("PINK",msg.format("build_default_enable_sb",type(cfg.env.build_default_enable_sb),cfg.env.build_default_enable_sb)) - Logs.pprint("PINK",msg.format("build_default_enable_ti",type(cfg.env.build_default_enable_ti),cfg.env.build_default_enable_ti)) - Logs.pprint("PINK",msg.format("build_default_enable_ri",type(cfg.env.build_default_enable_ri),cfg.env.build_default_enable_ri)) - # - cfg.env.build_default_enable_agrep = Options.options.enable_agrep - cfg.env.build_default_enable_python_extension = Options.options.enable_python_extension - cfg.env.build_default_enable_tests = Options.options.enable_tests - cfg.find_program('diff',var='DIFF') # Needed for some of the unit tests - # ================= Package values - cfg.define("PLATFORM_"+platsys,1) - cfg.env["PLATFORM_"+platsys] = 1 - cfg.define("PACKAGE",package_name,"Name of package") - cfg.define("PACKAGE_BUGREPORT","tre-general@lists.laurikari.net","Define to the address where bug reports for this package should be sent.") - cfg.define("PACKAGE_NAME",package_name.upper(),"Define to the full name of this package.") - cfg.define("PACKAGE_STRING",package_name.upper()+"_"+package_version,"Define to the full name and version of this package.") - cfg.define("PACKAGE_TARNAME",package_name,"Define to the one symbol short name of this package.") - cfg.define("PACKAGE_URL","","Define to the home page for this package.") - cfg.define("PACKAGE_VERSION",package_version,"Define to the version of this package.") - cfg.define("TRE_VERSION",package_version) - cfg.env["TRE_VERSION"] = package_version - cfg.define("TRE_VERSION_1",package_version_major) - cfg.define("TRE_VERSION_2",package_version_minor) - cfg.define("TRE_VERSION_3",package_version_miniscule) - cfg.define("VERSION",package_version) - cfg.define("_GNU_SOURCE",1) # only if gcc? - # ================= Debug - # FIXME - make this a rel/dbg variant - cfg.define("NDEBUG",1,comment="Define if you want to disable debug assertions.") - # ================= Configuration for C code - cfg.load("compiler_c") - if "freebsd" == platsys: - # FreeBSD puts optional library headers into /usr/local/include, - # so add that to the list of places to look before we test for headers. - cfg.env.append_unique("INCLUDES",["/usr/local/include"]) - cfg.env.append_unique("CFLAGS",["-fPIC"]) - elif "linux" == platsys: - cfg.env.append_unique("CFLAGS",["-fPIC"]) - elif "darwin" == platsys: - # Only if later than Apple M1... - # Logs.pprint("RED","CFLAGS {{{!s}}}".format(cfg.env.CFLAGS)) - # cfg.env.append_unique("CFLAGS",["-arch","arm64","-arch","x86_64"]) # fails to add 2nd "-arch" because it isn't unique - cfg.env.CFLAGS += ["-arch","arm64","-arch","x86_64"] - # We need the link flags for the dylib but they break the static lib - cfg.env.LINKFLAGS += ["-arch","arm64","-arch","x86_64"] - cfg.check(header_name="getopt.h", features="c cprogram", mandatory=False) - cfg.define("HAVE_GETOPT_LONG",1) - # Configuration defines for C can be on the compiler command line or in a header file. - # We're going to put most of them into a header file called "config.h", with one define - # on the command line ("-DHAVE_CONFIG_H") to indicate the header file should be included. - # Waf manages the defines using a list (cfg.env.DEFINES) of "name=value" strings together - # with list of names (in cfg.env["define_key"] by default) that are meant for the config file. - # Any names not in the name list are meant for the compiler command line. Writing the config - # file will remove the named defines from the DEFINES list, leaving only the ones meant - # for the compiler command line. - cfg.env.append_unique("DEFINES","HAVE_CONFIG_H=1") # no entry in the list of names, so this ends up on the compiler command line. - cfg.env.append_unique("DEFINES","USE_LOCAL_TRE_H=1") # no entry in the list of names, so this ends up on the compiler command line. - # ================= Platform specific feature availability - # Get a platform specific env for discovering what the platform has available. - # It is derived from the original, so it has all the values set up above. - cfg.setenv(platsys,cfg.env) - platform_env = cfg.all_envs[platsys] - platform_env.VARIANT = platsys - platform_env.VARNAME = platsys - # ----------------- Headers for the actual libraries - lib_incs = [ # ( , , ) - ("stdlib.h",True,None), - ("ctype.h",True,None), - ("string.h",True,None), - ("strings.h",True,None), - ("limits.h",True,None), - ("errno.h",True,None), - ("stdint.h",False,None), - ("unistd.h",False,None), - ("iconv.h",False,None), - ("inttypes.h",False,None), - - ("wctype.h",False,None), # guarded by TRE_WCHAR - ("wchar.h",False,None), - ("libutf8.h",False,None), - - ("stdio.h",False,None), # guarded by TRE_DEBUG - ("libintl.h",False,None), # guarded by HAVE_GETTEXT - - ("dlfcn.h",False,None), - - ("sys/types.h",False,None), - ("sys/stat.h",False,None), - ("alloca.h",False,None), # the alloca() fn may be in the standard C library instead of its own header - ("malloc.h",False,None), - ("memory.h",False,None), - ("regex.h",False,None), - ("assert.h",True,None)] - # Logs.pprint("CYAN","0 env.DEFINES {{{!s}}}".format(cfg.env.DEFINES)) - # Logs.pprint("CYAN","0 env.define_key {{{!s}}}".format(cfg.env.define_key)) - # - feat = "c" - for lib in lib_incs: - # Make a basic check that "#include " can find the named header file using the C compiler with the header_name= keyword. - # Add "HAVE_upper(inc)=1" to the cfg.env.DEFINES list if it is found (default action), and add the #include to - # the included headers of following tests (auto_add_header_name=True). - # The check() method also adds - # cfg.env["HAVE_upper(inc)"] = 1 - # on success. cfg.env is a ConfigSet, which is similar to a dictionary, but among other differences, - # it returns [] for keys not present, so testing for success of failure at a later point involves something like: - # if "HAVE_upper(inc)" in cfg.env. - if None == lib[2]: - cfg.check(features=feat,header_name=lib[0],mandatory=lib[1],auto_add_header_name=True) - else: - cfg.check(features=feat,header_name=lib[0],mandatory=lib[1],errmsg=lib[2],auto_add_header_name=True) - regex_path = find_sys_regex_path(cfg) - find_sys_regex_field(cfg) - # Make the options consistent with the headers found. - # The cfg.define() and cfg.undefine() methods manage both DEFINES and define_key lists, - # so these will go into config.h (or nowhere) not the compiler command line. - # Note that for FreeBSD, alloca() is part of the standard C library, it can be used without the header. - if Options.options.with_alloca and ("freebsd" == platsys or cfg.is_defined("HAVE_ALLOCA_H")): - if debug_build_config_envs > 0 or (None != debug_specific_config_env): - Logs.pprint("YELLOW","attempting to set TRE_USE_ALLOCA") - cfg.define("TRE_USE_ALLOCA",1) - else: - # We don't want or can't find alloca. - if debug_build_config_envs > 0 or (None != debug_specific_config_env): - Logs.pprint("YELLOW","attempting to unset TRE_USE_ALLOCA") - cfg.undefine("TRE_USE_ALLOCA") - # Look for things in the platform, so we know what's available. - # Some of these get copied into the variation environments as appropriate. - fn_or_mac_frag=""" - int main(int argc, char **argv) - {{ - {:s} - (void) argc; (void) argv; - return(0);}} - """ - fn_or_mac_list = [ - # (env_key, key_in/out, define_name, mandatory, message, - # test_fragment) - # where: - # env_key is - # None - # str as conditional _______________-- - (None, True, "HAVE_ALLOCA", False, "Checking for function alloca()", - 'char *foo; foo = (char *) alloca((size_t)10);'), - ("HAVE_WCHAR_H", True, "HAVE_WCHAR_T", False, "Checking for type wchar_t", - 'wchar_t foo;'), - ("HAVE_WCHAR_H", True, "HAVE_MBSTATE_T", False, "Checking for type mbstate_t", - 'mbstate_t foo;'), - ("HAVE_WCHAR_H", True, "HAVE_MBRTOWC", False, "Checking for function mbrtowc()", - 'mbstate_t state; wchar_t out[10]; size_t nb = mbrtowc(out,"xxxx",4,&state);'), - ("HAVE_WCHAR_H", False,"HAVE_MBTOWC", False, "Checking for function mbtowc()", - 'wchar_t out[10]; int nb = mbtowc(out,"xxxx",4);'), - ("HAVE_WCHAR_H", False,"HAVE_WCSRTOMBS", False, "Checking for function wcsrtombs()", - 'char dst[10]; wchar_t src[10]; mbstate_t ps; size_t foo = wcsrtombs(out,&src,(size_t)10,&ps);'), - ("HAVE_CTYPE_H", True, "HAVE_ISASCII", False, "Checking for function isascii()", - 'int foo = isascii(32);'), - ("HAVE_CTYPE_H", True, "HAVE_ISBLANK", False, "Checking for function isblank()", - 'int foo = isblank(32);'), - ("HAVE_CTYPE_H", True, "HAVE_TOLOWER", False, "Checking for function tolower()", - 'int foo = isblank(32);'), - ("HAVE_CTYPE_H", True, "HAVE_TOUPPER", False, "Checking for function toupper()", - 'int foo = isblank(32);'), - ("HAVE_WCTYPE_H", True, "HAVE_WINT_T", False, "Checking for type wint_t", - 'wint_t foo;'), - ("HAVE_WCTYPE_H", True, "HAVE_WCTYPE", False, "Checking for type wctype", - 'wctype_t foo;'), - ("HAVE_WCTYPE_H", True, "HAVE_ISWCTYPE", False, "Checking for function iswctype()", - 'int foo = iswctype((wint_t)1,(wctype_t)2);'), - ("HAVE_WINT_T", True, "HAVE_ISWASCII", False, "Checking for function iswascii()", - 'int foo = iswascii((wint_t)32);'), - ("HAVE_WINT_T", True, "HAVE_ISWBLANK", False, "Checking for function iswblank()", - 'int foo = iswblank((wint_t)32);'), - ("HAVE_WINT_T", True, "HAVE_ISWLOWER", False, "Checking for function iswlower()", - 'int foo = iswlower((wint_t)32);'), - ("HAVE_WINT_T", True, "HAVE_ISWUPPER", False, "Checking for function iswupper()", - 'int foo = iswupper((wint_t)32);'), - ("HAVE_WINT_T", True, "HAVE_TOWLOWER", False, "Checking for function towlower()", - 'wint_t foo = towlower((wint_t)32);'), - ("HAVE_WINT_T", True, "HAVE_TOWUPPER", False, "Checking for function towupper()", - 'wint_t foo = towupper((wint_t)32);'), - ("HAVE_WCHAR_T", True, "HAVE_WCSCHR", False, "Checking for function wcschr()", - 'wchar_t *foo = wcschr((wchar_t *)NULL,(wchar_t)32);'), - ("HAVE_WCHAR_T", True, "HAVE_WCSCPY", False, "Checking for function wcscpy()", - 'wchar_t *foo = wcscpy((wchar_t *)NULL,(wchar_t *)NULL);'), - ("HAVE_WCHAR_T", True, "HAVE_WCSLEN", False, "Checking for function wcslen()", - 'size_t foo = wcslen((wchar_t *)NULL);'), - ("HAVE_WCHAR_T", True, "HAVE_WCSNCPY", False, "Checking for function wcsncpy()", - 'wchar_t *foo = wcsncpy((wchar_t *)NULL,(wchar_t *)NULL,(size_t)32);'), - ("HAVE_WCHAR_T", True, "HAVE_WCSRTOMBS", False, "Checking for function wcsrtombs()", - 'size_t foo = wcsrtombs((char *)NULL,(wchar_t **)NULL,(size_t)32,(mbstate_t *)NULL);'), - ("HAVE_ICONV_H", True, "HAVE_ICONV", False, "Checking for function iconv()", - 'iconv_t foo; size_t bar = iconv(foo,(char**)NULL,(size_t*)NULL,(char **)NULL,(size_t*)NULL);'), - ("HAVE_LIBINTL_H", True, "HAVE_GETTEXT", False, "Checking for function gettext()", - 'char *foo = gettext("msgid");'), - ("HAVE_LIBINTL_H", True, "HAVE_DCGETTEXT", False, "Checking for function dcgettext()", - 'char *foo = dcgettext("domain","msgid",1);'), - ("HAVE_REGEX_H", True, "HAVE_REG_ERRCODE_T", False, "Checking for type reg_errcode_t", - "reg_errcode_t foo;"), - ] - for fntest in fn_or_mac_list: - if debug_build_config_envs > 0 or (None != debug_specific_config_env): - Logs.pprint("YELLOW","Considering fn or mac {{{:s}}}".format(fntest[2])) - if (None == fntest[0] or - (fntest[1] and cfg.is_defined(fntest[0])) or - (not fntest[1] and not cfg.is_defined(fntest[0]))): - if debug_build_config_envs > 0 or (None != debug_specific_config_env): - Logs.pprint("YELLOW","prereqs OK for fn or mac {{{:s}}}".format(fntest[2])) - cfg.check(features=feat,define_name=fntest[2],mandatory=fntest[3],msg=fntest[4],fragment=fn_or_mac_frag.format(fntest[5])) - # Logs.pprint("RED","Finished determining platform feature availability") - if "freebsd" == platsys or "linux" == platsys: - # cfg.define("LT_OBJDIR",".libs/") # Libtool stuff??? - cfg.define("STDC_HEADERS",1) - # Return from the platform availability env to the original one. - cfg.setenv("") - #=========================================================================== - # Configure for all combinations of build variants, regardless of any options. - # This will actually build multiple config environments because conf.setenv("foo",old_env) - # makes a shallow copy of old_env named foo if one doesn't already exist. - # Note that the name of the default env is the empty string "". - build_variants.create_variants(cfg,variant_group_list,variant_name_path_list) - # Create the defines for the variants considering what is available on this platform. - for vpair in variant_name_path_list: - cfg.setenv(vpair[1]) - gather_env_for_variant(cfg) - # Return to the original env. - cfg.setenv("") - if debug_build_config_envs > 0 or None != debug_specific_config_env: - Logs.pprint("RED","# 0 ################################ configuration environments:") - if None == debug_specific_config_env: - for env_key in cfg.all_envs: - Logs.pprint("GREEN","env({:s}) len(DEFINES)={:d}".format(env_key,len(cfg.all_envs[env_key].DEFINES))) - Logs.pprint("YELLOW","{!s}".format(cfg.all_envs[env_key])) - else: - Logs.pprint("GREEN","env({:s}) len(DEFINES)={:d}".format(debug_specific_config_env, - len(cfg.all_envs[debug_specific_config_env].DEFINES))) - Logs.pprint("YELLOW","{!s}".format(cfg.all_envs[debug_specific_config_env])) - # --- Now look at any configuration needed in the subdirectories. - # Logs.pprint('NORMAL','starting configure/recurse(lib)') - cfg.recurse("lib") - if debug_build_config_envs > 0 or None != debug_specific_config_env: - Logs.pprint("RED","# lib ################################## configuration environments:") - if None == debug_specific_config_env: - for env_key in cfg.all_envs: - Logs.pprint("GREEN","env({:s}) len(DEFINES)={:d}".format(env_key,len(cfg.all_envs[env_key].DEFINES))) - else: - Logs.pprint("GREEN","env({:s}) len(DEFINES)={:d}".format(debug_specific_config_env, - len(cfg.all_envs[debug_specific_config_env].DEFINES))) - cfg.recurse("src") - if debug_build_config_envs > 0 or None != debug_specific_config_env: - Logs.pprint("RED","# src ################################## configuration environments:") - if None == debug_specific_config_env: - for env_key in cfg.all_envs: - Logs.pprint("GREEN","env({:s}) len(DEFINES)={:d}".format(env_key,len(cfg.all_envs[env_key].DEFINES))) - else: - Logs.pprint("GREEN","env({:s}) len(DEFINES)={:d}".format(debug_specific_config_env, - len(cfg.all_envs[debug_specific_config_env].DEFINES))) - cfg.recurse("python") - if debug_build_config_envs > 0 or None != debug_specific_config_env: - Logs.pprint("RED","# python ################################## configuration environments:") - if None == debug_specific_config_env: - for env_key in cfg.all_envs: - Logs.pprint("GREEN","env({:s}) len(DEFINES)={:d}".format(env_key,len(cfg.all_envs[env_key].DEFINES))) - else: - Logs.pprint("GREEN","env({:s}) len(DEFINES)={:d}".format(debug_specific_config_env, - len(cfg.all_envs[debug_specific_config_env].DEFINES))) - # cfg.recurse("po") - if debug_build_config_envs > 0 or None != debug_specific_config_env: - Logs.pprint("RED","# po ################################## configuration environments:") - if None == debug_specific_config_env: - for env_key in cfg.all_envs: - Logs.pprint("GREEN","env({:s}) len(DEFINES)={:d}".format(env_key,len(cfg.all_envs[env_key].DEFINES))) - else: - Logs.pprint("GREEN","env({:s}) len(DEFINES)={:d}".format(debug_specific_config_env, - len(cfg.all_envs[debug_specific_config_env].DEFINES))) - cfg.recurse("tests") - if debug_build_config_envs > 0 or None != debug_specific_config_env: - Logs.pprint("RED","# < write ############################## configuration environments:") - if None == debug_specific_config_env: - for env_key in cfg.all_envs: - Logs.pprint("GREEN","env({:s}) len(DEFINES)={:d}".format(env_key,len(cfg.all_envs[env_key].DEFINES))) - else: - Logs.pprint("GREEN","env({:s}) len(DEFINES)={:d}".format(debug_specific_config_env, - len(cfg.all_envs[debug_specific_config_env].DEFINES))) - # Create the variant directory structure, write the headers, and choose a default variant. - default_variant_name = None - default_variant_value = -1 - for vpair in cfg.variant_name_path_list: - env_key = vpair[1] - venv = cfg.all_envs[env_key] - cfg.setenv(env_key) - if not cfg.env.viable: - continue - if None == default_variant_name or build_variants.variant_value(cfg.env.VARNAME,variant_group_list) > default_variant_value: - default_variant_name = cfg.env.VARNAME - default_variant_value = build_variants.variant_value(default_variant_name,variant_group_list) - # Note that writing this header removes the written defines from the env. - Logs.pprint("GREEN","Writing configuration header file {:s}".format(venv.VARIANT+"/config.h")) - cfg.write_config_header(configfile=venv.VARIANT+"/config.h") - # Return to the original config after messing with variants. - cfg.setenv("") - # Set a default variant for the build. - Logs.pprint("GREEN","Setting default variant to {:s}".format(default_variant_name)) - cfg.env.default_variant_name = default_variant_name - if debug_final_config_envs > 0 or None != debug_specific_config_env: - Logs.pprint("RED","# F ################################ final configuration environments (after header defns removed):") - if None == debug_specific_config_env: - for env_key in cfg.all_envs: - Logs.pprint("GREEN","env({:s}) len(DEFINES)={:d}".format(env_key,len(cfg.all_envs[env_key].DEFINES))) - Logs.pprint("YELLOW","{!s}".format(cfg.all_envs[env_key])) - else: - Logs.pprint("GREEN","env({:s}) len(DEFINES)={:d}".format(debug_specific_config_env, - len(cfg.all_envs[debug_specific_config_env].DEFINES))) - Logs.pprint("YELLOW","{!s}".format(cfg.all_envs[debug_specific_config_env])) - -# # When running the C compiler we want to be able to find the config.h header file -# # that was put into the build directory with cfg.write_config_header() above. Rather -# # than mess arround with levels of '..' in the lower level wscripts, just add the -# # absolute path once whenever we use the 'c' feature. -# # -# # Reminder: the "@foo[(args)]" notation essentially "wraps" the function following and -# # returns the wrapped function. In this case, we are wrapping include_tre_config_h() -# # in the "after_method('apply_incpaths')" wrapper, and then wrapping the result even -# # further in the "feature('c')" wrapper, both from TaskGen. The end result is that the -# # include_tre_config_h() function will be called as part of generating any Task that uses -# # the 'c' feature sometime after the generator has called the 'apply_incpaths' method. -# # Python calls this pattern "decoration", but the GoF book calls it something else. -# -# from waflib.TaskGen import feature,after_method -# -# debug_include_tre_config_h = False -# -# @feature('c') -# @after_method('apply_incpaths') -# def include_tre_config_h(self): -# if debug_include_tre_config_h or True: -# Logs.pprint("PINK","running include_tre_config_h() for path {:s}".format(self.bld.bldnode.abspath())) -# Logs.pprint("YELLOW"," include_tre_config_h() self {!s}".format(type(self))) -# Logs.pprint("YELLOW"," include_tre_config_h() self.bld {!s}".format(type(self.bld))) -# Logs.pprint("YELLOW"," include_tre_config_h() self.bld.path {!s}".format(self.bld.path.abspath())) -# # bld.bldnode is the top level build directory -# # bld.srcnode is the top level source directory -# # path.get_bld() is the node in the build directory -# # path.get_src() is the node in the source directory -# # self.env.append_unique('INCPATHS',self.bld.bldnode.abspath()) -# self.env.append_unique('INCLUDES',self.bld.bldnode.abspath()) -# self.env.append_unique('INCLUDES',self.bld.path.get_bld().abspath()) -# self.env.append_unique('INCLUDES',self.bld.path.get_src().abspath()) - -def build(bld): - # This function builds the list of targets, not the targets themselves. - # It is acutally used for clean/install/uninstall as well, since they all - # use the same list of targets. - # Once this function completes, waf starts running build/clean/install/uninstall - # tasks in the various groups to do the actual work. - if Options.options.log_wscripts: - Logs.pprint("NORMAL","entering build(), cmd={:s}, variant={:s}.".format(bld.cmd,bld.variant)) - # Logs.pprint("CYAN","CFLAGS={!s}".format(bld.env.CFLAGS)) - # debug_include_tre_config_h = False - # if debug_include_tre_config_h: - # Logs.pprint("GREEN","debug_include_tre_config_h set to True") - # The options are set each time waf is invoked, so we want a fresh look at the build_tests - # option when we start to build, rather than one saved from the waf configure. - # We also don't want to build/run the tests for installs/cleans, so make sure the cmd is build or list. - setattr(bld,'changeable_task_group',(bld.cmd.startswith('build') or bld.cmd.startswith('list'))) - if bld.changeable_task_group: - # Build and run the tests if (a) explicitly enabled for this command, - # or (b) not explicitly disabled for both this command and the eariler configuration. - bld.env['BUILD_TESTS'] = (Options.options.enable_tests > 0 or - (Options.options.enable_tests == 0 and getattr(bld.env,"build_default_enable_tests",0) >= 0)) - # Set up two task groups, one for building and one for testing. - for task_group_name in 'build_tasks test_tasks'.split(): - if not task_group_name in bld.group_names: - bld.add_group(task_group_name) - # Start out in the normal build group. - bld.set_group('build_tasks') - else: - bld.env['BUILD_TESTS'] = False - # Build the actual library. - bld.recurse("lib") - # Set up the info for header installation. - bld.recurse("local_includes") - # Build agrep if requested (it won't build unless approximate matching is enabled). - opt_agrep = normalize_option(Options.options.enable_agrep,0) - if bld.env.variant_ap and (opt_agrep > 0 or (opt_agrep == 0 and bld.env.build_default_enable_agrep > 0)): - bld.recurse("src") - # Build the python extension if requested. - opt_py = normalize_option(Options.options.enable_python_extension,0) - if opt_py > 0 or (opt_py == 0 and bld.env.build_default_enable_python_extension > 0): - bld.recurse("python") - # Both agrep and the python extension might use the .po files - # if bld.env.enable_agrep or bld.env.enable_python_extension: - # bld.recurse("po") - # Build and run the tests if requested. - if bld.env.BUILD_TESTS and bld.changeable_task_group: - bld.recurse("tests")