modsecurity-2.9.5/0000775000175000017500000000000014147005275015225 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/aclocal.m40000664000175000017500000015303414147005242017065 0ustar mhsvierulamhsvierula# generated automatically by aclocal 1.15.1 -*- Autoconf -*- # Copyright (C) 1996-2017 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- dnl serial 11 (pkg-config-0.29.1) dnl dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29.1]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR # Copyright (C) 2002-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.15.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.15.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # Copyright (C) 2011-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_AR([ACT-IF-FAIL]) # ------------------------- # Try to determine the archiver interface, and trigger the ar-lib wrapper # if it is needed. If the detection of archiver interface fails, run # ACT-IF-FAIL (default is to abort configure with a proper error message). AC_DEFUN([AM_PROG_AR], [AC_BEFORE([$0], [LT_INIT])dnl AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([ar-lib])dnl AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) : ${AR=ar} AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], [AC_LANG_PUSH([C]) am_cv_ar_interface=ar AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a ]) AC_LANG_POP([C])]) case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) m4_default([$1], [AC_MSG_ERROR([could not determine $AR interface])]) ;; esac AC_SUBST([AR])dnl ]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([build/find_apr.m4]) m4_include([build/find_apu.m4]) m4_include([build/find_curl.m4]) m4_include([build/find_lua.m4]) m4_include([build/find_pcre.m4]) m4_include([build/find_ssdeep.m4]) m4_include([build/find_xml.m4]) m4_include([build/find_yajl.m4]) m4_include([build/libtool.m4]) m4_include([build/ltoptions.m4]) m4_include([build/ltsugar.m4]) m4_include([build/ltversion.m4]) m4_include([build/lt~obsolete.m4]) modsecurity-2.9.5/standalone/0000775000175000017500000000000014147005251017347 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/standalone/Makefile.am0000664000175000017500000000740614147005233021412 0ustar mhsvierulamhsvierulapkglibdir = $(prefix)/lib pkglib_LTLIBRARIES = standalone.la standalone_la_SOURCES = ../apache2/acmp.c \ ../apache2/apache2_config.c \ ../apache2/apache2_io.c \ ../apache2/apache2_util.c \ ../apache2/libinjection/libinjection_html5.c \ ../apache2/libinjection/libinjection_sqli.c \ ../apache2/libinjection/libinjection_xss.c \ ../apache2/mod_security2.c \ ../apache2/modsecurity.c \ ../apache2/msc_status_engine.c \ ../apache2/msc_crypt.c \ ../apache2/msc_geo.c \ ../apache2/msc_gsb.c \ ../apache2/msc_json.c \ ../apache2/msc_logging.c \ ../apache2/msc_lua.c \ ../apache2/msc_multipart.c \ ../apache2/msc_parsers.c \ ../apache2/msc_pcre.c \ ../apache2/msc_release.c \ ../apache2/msc_remote_rules.c \ ../apache2/msc_reqbody.c \ ../apache2/msc_tree.c \ ../apache2/msc_unicode.c \ ../apache2/msc_util.c \ ../apache2/msc_xml.c \ ../apache2/persist_dbm.c \ ../apache2/re_actions.c \ ../apache2/re.c \ ../apache2/re_operators.c \ ../apache2/re_tfns.c \ ../apache2/re_variables.c \ api.c \ buckets.c \ config.c \ filters.c \ hooks.c \ regex.c \ server.c # FIXME: Standalone does not mean that it will be a nginx build. standalone_la_CFLAGS = -DVERSION_NGINX \ @APR_CFLAGS@ \ @APU_CFLAGS@ \ @APXS_CFLAGS@ \ @CURL_CFLAGS@ \ @LIBXML2_CFLAGS@ \ @LUA_CFLAGS@ \ @MODSEC_EXTRA_CFLAGS@ \ @PCRE_CFLAGS@ \ @YAJL_CFLAGS@ \ @SSDEEP_CFLAGS@ standalone_la_CPPFLAGS = @APR_CPPFLAGS@ \ @LIBXML2_CPPFLAGS@ \ @PCRE_CPPFLAGS@ standalone_la_LIBADD = @APR_LDADD@ \ @APU_LDADD@ \ @LIBXML2_LDADD@ \ @LUA_LDADD@ \ @PCRE_LDADD@ \ @YAJL_LDADD@ \ @SSDEEP_CFLAGS@ if AIX standalone_la_LDFLAGS = -module -avoid-version \ @APR_LDFLAGS@ \ @APU_LDFLAGS@ \ @APXS_LDFLAGS@ \ @LIBXML2_LDFLAGS@ \ @LUA_LDFLAGS@ \ @PCRE_LDFLAGS@ \ @YAJL_LDFLAGS@ \ @SSDEEP_LDFLAGS@ endif if HPUX standalone_la_LDFLAGS = -module -avoid-version \ @APR_LDFLAGS@ \ @APU_LDFLAGS@ \ @APXS_LDFLAGS@ \ @LIBXML2_LDFLAGS@ \ @LUA_LDFLAGS@ \ @PCRE_LDFLAGS@ \ @YAJL_LDFLAGS@ \ @SSDEEP_LDFLAGS@ endif if MACOSX standalone_la_LDFLAGS = -module -avoid-version \ @APR_LDFLAGS@ \ @APU_LDFLAGS@ \ @APXS_LDFLAGS@ \ @LIBXML2_LDFLAGS@ \ @LUA_LDFLAGS@ \ @PCRE_LDFLAGS@ \ @YAJL_LDFLAGS@ \ @SSDEEP_LDFLAGS@ endif if SOLARIS standalone_la_LDFLAGS = -module -avoid-version \ @APR_LDFLAGS@ \ @APU_LDFLAGS@ \ @APXS_LDFLAGS@ \ @LIBXML2_LDFLAGS@ \ @LUA_LDFLAGS@ \ @PCRE_LDFLAGS@ \ @YAJL_LDFLAGS@ \ @SSDEEP_LDFLAGS@ endif if LINUX standalone_la_LDFLAGS = -no-undefined -module -avoid-version \ @APR_LDFLAGS@ \ @APU_LDFLAGS@ \ @APXS_LDFLAGS@ \ @LIBXML2_LDFLAGS@ \ @LUA_LDFLAGS@ \ @PCRE_LDFLAGS@ \ @YAJL_LDFLAGS@ \ @SSDEEP_LDFLAGS@ endif if FREEBSD standalone_la_LDFLAGS = -no-undefined -module -avoid-version \ @APR_LDFLAGS@ \ @APU_LDFLAGS@ \ @APXS_LDFLAGS@ \ @LIBXML2_LDFLAGS@ \ @LUA_LDFLAGS@ \ @PCRE_LDFLAGS@ \ @YAJL_LDFLAGS@ \ @SSDEEP_LDFLAGS@ endif if OPENBSD standalone_la_LDFLAGS = -no-undefined -module -avoid-version \ @APR_LDFLAGS@ \ @APU_LDFLAGS@ \ @APXS_LDFLAGS@ \ @LIBXML2_LDFLAGS@ \ @LUA_LDFLAGS@ \ @PCRE_LDFLAGS@ \ @YAJL_LDFLAGS@ \ @SSDEEP_LDFLAGS@ endif if NETBSD standalone_la_LDFLAGS = -no-undefined -module -avoid-version \ @APR_LDFLAGS@ \ @APU_LDFLAGS@ \ @APXS_LDFLAGS@ \ @LIBXML2_LDFLAGS@ \ @LUA_LDFLAGS@ \ @PCRE_LDFLAGS@ \ @YAJL_LDFLAGS@ \ @SSDEEP_LDFLAGS@ endif modsecurity-2.9.5/standalone/hooks.c0000664000175000017500000000426714147005233020647 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #include #include "http_core.h" #include "http_request.h" #include "modsecurity.h" #include "apache2.h" #include "http_main.h" #include "http_connection.h" #include "apr_optional.h" #include "mod_log_config.h" #include "msc_logging.h" #include "msc_util.h" #include "ap_mpm.h" #include "scoreboard.h" #include "apr_version.h" #include "apr_lib.h" #include "ap_config.h" #include "http_config.h" #define DECLARE_EXTERNAL_HOOK(ns,link,ret,name,args) \ ns##_HOOK_##name##_t *hookfn_##name = NULL; \ link##_DECLARE(void) ns##_hook_##name(ns##_HOOK_##name##_t *pf, \ const char * const *aszPre, \ const char * const *aszSucc, int nOrder) \ { \ hookfn_##name = pf; \ } #define DECLARE_HOOK(ret,name,args) \ DECLARE_EXTERNAL_HOOK(ap,AP,ret,name,args) DECLARE_HOOK(int,pre_config,(apr_pool_t *pconf,apr_pool_t *plog, apr_pool_t *ptemp)) DECLARE_HOOK(int,post_config,(apr_pool_t *pconf,apr_pool_t *plog, apr_pool_t *ptemp,server_rec *s)) DECLARE_HOOK(void,child_init,(apr_pool_t *pchild, server_rec *s)) DECLARE_HOOK(int,process_connection,(conn_rec *c)) DECLARE_HOOK(int,post_read_request,(request_rec *r)) DECLARE_HOOK(int,fixups,(request_rec *r)) DECLARE_HOOK(void, error_log, (const char *file, int line, int level, apr_status_t status, const server_rec *s, const request_rec *r, apr_pool_t *pool, const char *errstr)) DECLARE_HOOK(int,log_transaction,(request_rec *r)) DECLARE_HOOK(void,insert_filter,(request_rec *r)) DECLARE_HOOK(void,insert_error_filter,(request_rec *r)) modsecurity-2.9.5/standalone/server.c0000664000175000017500000010074614147005233021031 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #include #include "http_core.h" #include "http_request.h" #include "modsecurity.h" #include "apache2.h" #include "http_main.h" #include "http_connection.h" #include "apr_optional.h" #include "mod_log_config.h" #include "msc_logging.h" #include "msc_util.h" #include "ap_mpm.h" #include "scoreboard.h" #include "apr_version.h" #include "apr_lib.h" #include "ap_config.h" #include "http_config.h" #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_SYS_SEM_H #include #endif //========= /** The default path for CGI scripts if none is currently set */ #ifndef DEFAULT_PATH #define DEFAULT_PATH "/bin:/usr/bin:/usr/ucb:/usr/bsd:/usr/local/bin" #endif //========= AP_DECLARE_DATA scoreboard *ap_scoreboard_image = NULL; AP_DECLARE_DATA apr_array_header_t *ap_server_config_defines = NULL; AP_DECLARE_DATA const char *ap_server_root = "\\"; static int server_limit, thread_limit, lb_limit; static apr_size_t scoreboard_size; void *modsecLogObj = NULL; void (*modsecLogHook)(void *obj, int level, char *str) = NULL; //========= static const char * const status_lines[RESPONSE_CODES] = { "100 Continue", "101 Switching Protocols", "102 Processing", #define LEVEL_200 3 "200 OK", "201 Created", "202 Accepted", "203 Non-Authoritative Information", "204 No Content", "205 Reset Content", "206 Partial Content", "207 Multi-Status", #define LEVEL_300 11 "300 Multiple Choices", "301 Moved Permanently", "302 Found", "303 See Other", "304 Not Modified", "305 Use Proxy", "306 unused", "307 Temporary Redirect", #define LEVEL_400 19 "400 Bad Request", "401 Authorization Required", "402 Payment Required", "403 Forbidden", "404 Not Found", "405 Method Not Allowed", "406 Not Acceptable", "407 Proxy Authentication Required", "408 Request Time-out", "409 Conflict", "410 Gone", "411 Length Required", "412 Precondition Failed", "413 Request Entity Too Large", "414 Request-URI Too Large", "415 Unsupported Media Type", "416 Requested Range Not Satisfiable", "417 Expectation Failed", "418 unused", "419 unused", "420 unused", "421 unused", "422 Unprocessable Entity", "423 Locked", "424 Failed Dependency", /* This is a hack, but it is required for ap_index_of_response * to work with 426. */ "425 No code", "426 Upgrade Required", #define LEVEL_500 46 "500 Internal Server Error", "501 Method Not Implemented", "502 Bad Gateway", "503 Service Temporarily Unavailable", "504 Gateway Time-out", "505 HTTP Version Not Supported", "506 Variant Also Negotiates", "507 Insufficient Storage", "508 unused", "509 unused", "510 Not Extended" }; AP_DECLARE(int) ap_index_of_response(int status) { static int shortcut[6] = {0, LEVEL_200, LEVEL_300, LEVEL_400, LEVEL_500, RESPONSE_CODES}; int i, pos; if (status < 100) { /* Below 100 is illegal for HTTP status */ return LEVEL_500; } for (i = 0; i < 5; i++) { status -= 100; if (status < 100) { pos = (status + shortcut[i]); if (pos < shortcut[i + 1]) { return pos; } else { return LEVEL_500; /* status unknown (falls in gap) */ } } } return LEVEL_500; /* 600 or above is also illegal */ } //========= static char *http2env(apr_pool_t *a, const char *w) { char *res = (char *)apr_palloc(a, sizeof("HTTP_") + strlen(w)); char *cp = res; char c; *cp++ = 'H'; *cp++ = 'T'; *cp++ = 'T'; *cp++ = 'P'; *cp++ = '_'; while ((c = *w++) != 0) { if (!apr_isalnum(c)) { *cp++ = '_'; } else { *cp++ = apr_toupper(c); } } *cp = 0; return res; } AP_DECLARE(apr_uint32_t) ap_random_pick(apr_uint32_t min, apr_uint32_t max) { return rand(); } AP_DECLARE(char *) ap_escape_html2(apr_pool_t *p, const char *s, int toasc) { int i, j; char *x; /* first, count the number of extra characters */ for (i = 0, j = 0; s[i] != '\0'; i++) if (s[i] == '<' || s[i] == '>') j += 3; else if (s[i] == '&') j += 4; else if (s[i] == '"') j += 5; else if (toasc && !apr_isascii(s[i])) j += 5; if (j == 0) return apr_pstrmemdup(p, s, i); x = apr_palloc(p, i + j + 1); for (i = 0, j = 0; s[i] != '\0'; i++, j++) if (s[i] == '<') { memcpy(&x[j], "<", 4); j += 3; } else if (s[i] == '>') { memcpy(&x[j], ">", 4); j += 3; } else if (s[i] == '&') { memcpy(&x[j], "&", 5); j += 4; } else if (s[i] == '"') { memcpy(&x[j], """, 6); j += 5; } else if (toasc && !apr_isascii(s[i])) { char *esc = apr_psprintf(p, "&#%3.3d;", (unsigned char)s[i]); memcpy(&x[j], esc, 6); j += 5; } else x[j] = s[i]; x[j] = '\0'; return x; } #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 AP_DECLARE(char *) ap_escape_html(apr_pool_t *p, const char *s) { return ap_escape_html2(p, s, 0); } #endif AP_DECLARE(const char *) ap_psignature(const char *prefix, request_rec *r) { return prefix; } AP_DECLARE(const char *) ap_document_root(request_rec *r) /* Don't use this! */ { return "\\"; } AP_DECLARE(apr_port_t) ap_get_server_port(const request_rec *r) { return 80; } ///////////////////////////////////////////////////////////////////////////////////////////////////// #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 AP_DECLARE(void) ap_log_error(const char *file, int line, int level, apr_status_t status, const server_rec *s, const char *fmt, ...) // __attribute__((format(printf,6,7))) #else AP_DECLARE(void) ap_log_error_(const char *file, int line, int module_index, int level, apr_status_t status, const server_rec *s, const char *fmt, ...) // __attribute__((format(printf,7,8))) #endif { va_list args; char errstr[MAX_STRING_LEN]; va_start(args, fmt); apr_vsnprintf(errstr, MAX_STRING_LEN, fmt, args); va_end(args); if(modsecLogHook != NULL) modsecLogHook(modsecLogObj, level, errstr); } #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 AP_DECLARE(void) ap_log_cerror(const char *file, int line, int level, apr_status_t status, const conn_rec *r, const char *fmt, ...) // __attribute__((format(printf,6,7))) #else AP_DECLARE(void) ap_log_cerror_(const char *file, int line, int module_index, int level, apr_status_t status, const conn_rec *c, const char *fmt, ...) // __attribute__((format(printf,7,8))) #endif { va_list args; char errstr[MAX_STRING_LEN]; va_start(args, fmt); apr_vsnprintf(errstr, MAX_STRING_LEN, fmt, args); va_end(args); if(modsecLogHook != NULL) modsecLogHook(modsecLogObj, level, errstr); } #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 AP_DECLARE(void) ap_log_rerror(const char *file, int line, int level, apr_status_t status, const request_rec *r, const char *fmt, ...) // __attribute__((format(printf,6,7))) #else AP_DECLARE(void) ap_log_rerror_(const char *file, int line, int module_index, int level, apr_status_t status, const request_rec *r, const char *fmt, ...) // __attribute__((format(printf,7,8))) #endif { va_list args; char errstr[MAX_STRING_LEN]; va_start(args, fmt); apr_vsnprintf(errstr, MAX_STRING_LEN, fmt, args); va_end(args); if(modsecLogHook != NULL) modsecLogHook(modsecLogObj, level, errstr); } #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 AP_DECLARE(void) ap_log_perror(const char *file, int line, int level, apr_status_t status, apr_pool_t *p, const char *fmt, ...) // __attribute__((format(printf,6,7))) #else AP_DECLARE(void) ap_log_perror_(const char *file, int line, int module_index, int level, apr_status_t status, apr_pool_t *p, const char *fmt, ...) #endif { va_list args; char errstr[MAX_STRING_LEN]; va_start(args, fmt); apr_vsnprintf(errstr, MAX_STRING_LEN, fmt, args); va_end(args); if(modsecLogHook != NULL) modsecLogHook(modsecLogObj, level, errstr); } AP_DECLARE(module *) ap_find_linked_module(const char *name) { // only used for ACTION_PROXY to find mod_proxy.c; see mod_security2.c, perform_interception() // return NULL; } AP_DECLARE(const char *) ap_get_server_name(request_rec *r) { return r->server->server_hostname; } AP_DECLARE(void) ap_add_version_component(apr_pool_t *pconf, const char *component) { // appends string to server description string // } AP_DECLARE(const char *) ap_get_status_line(int status) { return status_lines[ap_index_of_response(status)]; } #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 AP_DECLARE(worker_score *) ap_get_scoreboard_worker(int x, int y) { if (((x < 0) || (server_limit < x)) || ((y < 0) || (thread_limit < y))) { return(NULL); /* Out of range */ } return &ap_scoreboard_image->servers[x][y]; } #else AP_DECLARE(worker_score *) ap_get_scoreboard_worker_from_indexes(int x, int y) { if (((x < 0) || (x >= server_limit)) || ((y < 0) || (y >= thread_limit))) { return(NULL); /* Out of range */ } return &ap_scoreboard_image->servers[x][y]; } AP_DECLARE(worker_score *) ap_get_scoreboard_worker(ap_sb_handle_t *sbh) { //if (!sbh) // return NULL; //return ap_get_scoreboard_worker_from_indexes(sbh->child_num, // sbh->thread_num); return ap_get_scoreboard_worker_from_indexes(0, 0); } #endif AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) { switch(query_code){ //case AP_MPMQ_MAX_DAEMON_USED: // *result = MAXIMUM_WAIT_OBJECTS; // return APR_SUCCESS; case AP_MPMQ_IS_THREADED: *result = AP_MPMQ_STATIC; return APR_SUCCESS; case AP_MPMQ_IS_FORKED: *result = AP_MPMQ_NOT_SUPPORTED; return APR_SUCCESS; case AP_MPMQ_HARD_LIMIT_DAEMONS: *result = 1; //HARD_SERVER_LIMIT; return APR_SUCCESS; case AP_MPMQ_HARD_LIMIT_THREADS: *result = thread_limit; return APR_SUCCESS; //case AP_MPMQ_MAX_THREADS: // *result = ap_threads_per_child; // return APR_SUCCESS; case AP_MPMQ_MIN_SPARE_DAEMONS: *result = 0; return APR_SUCCESS; case AP_MPMQ_MIN_SPARE_THREADS: *result = 0; return APR_SUCCESS; case AP_MPMQ_MAX_SPARE_DAEMONS: *result = 0; return APR_SUCCESS; case AP_MPMQ_MAX_SPARE_THREADS: *result = 0; return APR_SUCCESS; //case AP_MPMQ_MAX_REQUESTS_DAEMON: // *result = ap_max_requests_per_child; // return APR_SUCCESS; case AP_MPMQ_MAX_DAEMONS: *result = 0; return APR_SUCCESS; //case AP_MPMQ_MPM_STATE: // *result = winnt_mpm_state; // return APR_SUCCESS; } return APR_ENOTIMPL; } AP_DECLARE(const char *) ap_get_server_banner(void) { return "ModSecurity Standalone"; } /* Code from Harald Hanche-Olsen */ static APR_INLINE void do_double_reverse (conn_rec *conn) { apr_sockaddr_t *sa; apr_status_t rv; if (conn->double_reverse) { /* already done */ return; } if (conn->remote_host == NULL || conn->remote_host[0] == '\0') { /* single reverse failed, so don't bother */ conn->double_reverse = -1; return; } rv = apr_sockaddr_info_get(&sa, conn->remote_host, APR_UNSPEC, 0, 0, conn->pool); if (rv == APR_SUCCESS) { while (sa) { #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 if (apr_sockaddr_equal(sa, conn->remote_addr)) { #else if (apr_sockaddr_equal(sa, conn->client_addr)) { #endif conn->double_reverse = 1; return; } sa = sa->next; } } conn->double_reverse = -1; } #ifndef HOSTNAME_LOOKUP_OFF #define HOSTNAME_LOOKUP_OFF 0 #define HOSTNAME_LOOKUP_ON 1 #define HOSTNAME_LOOKUP_DOUBLE 2 #define HOSTNAME_LOOKUP_UNSET 3 #endif AP_DECLARE(void) ap_str_tolower(char *str) { while (*str) { *str = apr_tolower(*str); ++str; } } AP_DECLARE(const char *) ap_get_remote_host(conn_rec *conn, void *dir_config, int type, int *str_is_ip) { int hostname_lookups = HOSTNAME_LOOKUP_OFF; int ignored_str_is_ip; if (!str_is_ip) { /* caller doesn't want to know */ str_is_ip = &ignored_str_is_ip; } *str_is_ip = 0; /* If we haven't checked the host name, and we want to */ //if (dir_config) { // hostname_lookups = // ((core_dir_config *)ap_get_module_config(dir_config, &core_module)) // ->hostname_lookups; // if (hostname_lookups == HOSTNAME_LOOKUP_UNSET) { // hostname_lookups = HOSTNAME_LOOKUP_OFF; // } //} if (type != REMOTE_NOLOOKUP && conn->remote_host == NULL && (type == REMOTE_DOUBLE_REV || hostname_lookups != HOSTNAME_LOOKUP_OFF)) { #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 if (apr_getnameinfo(&conn->remote_host, conn->remote_addr, 0) == APR_SUCCESS) { #else if (apr_getnameinfo(&conn->remote_host, conn->client_addr, 0) == APR_SUCCESS) { #endif ap_str_tolower(conn->remote_host); if (hostname_lookups == HOSTNAME_LOOKUP_DOUBLE) { do_double_reverse(conn); if (conn->double_reverse != 1) { conn->remote_host = NULL; } } } /* if failed, set it to the NULL string to indicate error */ if (conn->remote_host == NULL) { conn->remote_host = ""; } } if (type == REMOTE_DOUBLE_REV) { do_double_reverse(conn); if (conn->double_reverse == -1) { return NULL; } } /* * Return the desired information; either the remote DNS name, if found, * or either NULL (if the hostname was requested) or the IP address * (if any identifier was requested). */ if (conn->remote_host != NULL && conn->remote_host[0] != '\0') { return conn->remote_host; } else { if (type == REMOTE_HOST || type == REMOTE_DOUBLE_REV) { return NULL; } else { *str_is_ip = 1; #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 return conn->remote_ip; #else return conn->client_ip; #endif } } } AP_DECLARE(char *) ap_server_root_relative(apr_pool_t *p, const char *file) { char *newpath = NULL; apr_status_t rv; rv = apr_filepath_merge(&newpath, ap_server_root, file, APR_FILEPATH_TRUENAME, p); if (newpath && (rv == APR_SUCCESS || APR_STATUS_IS_EPATHWILD(rv) || APR_STATUS_IS_ENOENT(rv) || APR_STATUS_IS_ENOTDIR(rv))) { return newpath; } else { return NULL; } } AP_DECLARE(piped_log *) ap_open_piped_log(apr_pool_t *p, const char *program) { return NULL; } #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER > 3 AP_DECLARE(apr_file_t *) ap_piped_log_write_fd(piped_log *pl) { return NULL; } #endif AP_DECLARE(char **) ap_create_environment(apr_pool_t *p, apr_table_t *t) { const apr_array_header_t *env_arr = apr_table_elts(t); const apr_table_entry_t *elts = (const apr_table_entry_t *) env_arr->elts; char **env = (char **) apr_palloc(p, (env_arr->nelts + 2) * sizeof(char *)); int i, j; char *tz; char *whack; j = 0; if (!apr_table_get(t, "TZ")) { tz = getenv("TZ"); if (tz != NULL) { env[j++] = apr_pstrcat(p, "TZ=", tz, NULL); } } for (i = 0; i < env_arr->nelts; ++i) { if (!elts[i].key) { continue; } env[j] = apr_pstrcat(p, elts[i].key, "=", elts[i].val, NULL); whack = env[j]; if (apr_isdigit(*whack)) { *whack++ = '_'; } while (*whack != '=') { if (!apr_isalnum(*whack) && *whack != '_') { *whack = '_'; } ++whack; } ++j; } env[j] = NULL; return env; } /* This "cute" little function comes about because the path info on * filenames and URLs aren't always the same. So we take the two, * and find as much of the two that match as possible. */ AP_DECLARE(int) ap_find_path_info(const char *uri, const char *path_info) { int lu = strlen(uri); int lp = strlen(path_info); while (lu-- && lp-- && uri[lu] == path_info[lp]) { if (path_info[lp] == '/') { while (lu && uri[lu-1] == '/') lu--; } } if (lu == -1) { lu = 0; } while (uri[lu] != '\0' && uri[lu] != '/') { lu++; } return lu; } /* Obtain the Request-URI from the original request-line, returning * a new string from the request pool containing the URI or "". */ static char *original_uri(request_rec *r) { char *first, *last; if (r->the_request == NULL) { return (char *) apr_pcalloc(r->pool, 1); } first = r->the_request; /* use the request-line */ while (*first && !apr_isspace(*first)) { ++first; /* skip over the method */ } while (apr_isspace(*first)) { ++first; /* and the space(s) */ } last = first; while (*last && !apr_isspace(*last)) { ++last; /* end at next whitespace */ } return apr_pstrmemdup(r->pool, first, last - first); } AP_DECLARE(void) ap_add_cgi_vars(request_rec *r) { apr_table_t *e = r->subprocess_env; apr_table_setn(e, "GATEWAY_INTERFACE", "CGI/1.1"); apr_table_setn(e, "SERVER_PROTOCOL", r->protocol); apr_table_setn(e, "REQUEST_METHOD", r->method); apr_table_setn(e, "QUERY_STRING", r->args ? r->args : ""); apr_table_setn(e, "REQUEST_URI", original_uri(r)); /* Note that the code below special-cases scripts run from includes, * because it "knows" that the sub_request has been hacked to have the * args and path_info of the original request, and not any that may have * come with the script URI in the include command. Ugh. */ if (!strcmp(r->protocol, "INCLUDED")) { apr_table_setn(e, "SCRIPT_NAME", r->uri); if (r->path_info && *r->path_info) { apr_table_setn(e, "PATH_INFO", r->path_info); } } else if (!r->path_info || !*r->path_info) { apr_table_setn(e, "SCRIPT_NAME", r->uri); } else { int path_info_start = ap_find_path_info(r->uri, r->path_info); apr_table_setn(e, "SCRIPT_NAME", apr_pstrndup(r->pool, r->uri, path_info_start)); apr_table_setn(e, "PATH_INFO", r->path_info); } //if (r->path_info && r->path_info[0]) { /* * To get PATH_TRANSLATED, treat PATH_INFO as a URI path. * Need to re-escape it for this, since the entire URI was * un-escaped before we determined where the PATH_INFO began. */ // request_rec *pa_req; // pa_req = ap_sub_req_lookup_uri(ap_escape_uri(r->pool, r->path_info), r, // NULL); // if (pa_req->filename) { // char *pt = apr_pstrcat(r->pool, pa_req->filename, pa_req->path_info, // NULL); //#ifdef WIN32 // /* We need to make this a real Windows path name */ // apr_filepath_merge(&pt, "", pt, APR_FILEPATH_NATIVE, r->pool); //#endif // apr_table_setn(e, "PATH_TRANSLATED", pt); // } // ap_destroy_sub_req(pa_req); //} } AP_DECLARE(void) ap_add_common_vars(request_rec *r) { apr_table_t *e; server_rec *s = r->server; conn_rec *c = r->connection; //const char *rem_logname; char *env_path; #if defined(WIN32) || defined(OS2) || defined(BEOS) char *env_temp; #endif const char *host; const apr_array_header_t *hdrs_arr = apr_table_elts(r->headers_in); const apr_table_entry_t *hdrs = (const apr_table_entry_t *) hdrs_arr->elts; int i; apr_port_t rport; /* use a temporary apr_table_t which we'll overlap onto * r->subprocess_env later * (exception: if r->subprocess_env is empty at the start, * write directly into it) */ if (apr_is_empty_table(r->subprocess_env)) { e = r->subprocess_env; } else { e = apr_table_make(r->pool, 25 + hdrs_arr->nelts); } /* First, add environment vars from headers... this is as per * CGI specs, though other sorts of scripting interfaces see * the same vars... */ for (i = 0; i < hdrs_arr->nelts; ++i) { if (!hdrs[i].key) { continue; } /* A few headers are special cased --- Authorization to prevent * rogue scripts from capturing passwords; content-type and -length * for no particular reason. */ if (!strcasecmp(hdrs[i].key, "Content-type")) { apr_table_addn(e, "CONTENT_TYPE", hdrs[i].val); } else if (!strcasecmp(hdrs[i].key, "Content-length")) { apr_table_addn(e, "CONTENT_LENGTH", hdrs[i].val); } /* * You really don't want to disable this check, since it leaves you * wide open to CGIs stealing passwords and people viewing them * in the environment with "ps -e". But, if you must... */ #ifndef SECURITY_HOLE_PASS_AUTHORIZATION else if (!strcasecmp(hdrs[i].key, "Authorization") || !strcasecmp(hdrs[i].key, "Proxy-Authorization")) { continue; } #endif else { apr_table_addn(e, http2env(r->pool, hdrs[i].key), hdrs[i].val); } } if (!(env_path = getenv("PATH"))) { env_path = DEFAULT_PATH; } apr_table_addn(e, "PATH", apr_pstrdup(r->pool, env_path)); #ifdef WIN32 if ((env_temp = getenv("SystemRoot")) != NULL) { apr_table_addn(e, "SystemRoot", env_temp); } if ((env_temp = getenv("COMSPEC")) != NULL) { apr_table_addn(e, "COMSPEC", env_temp); } if ((env_temp = getenv("PATHEXT")) != NULL) { apr_table_addn(e, "PATHEXT", env_temp); } if ((env_temp = getenv("WINDIR")) != NULL) { apr_table_addn(e, "WINDIR", env_temp); } #endif #ifdef OS2 if ((env_temp = getenv("COMSPEC")) != NULL) { apr_table_addn(e, "COMSPEC", env_temp); } if ((env_temp = getenv("ETC")) != NULL) { apr_table_addn(e, "ETC", env_temp); } if ((env_temp = getenv("DPATH")) != NULL) { apr_table_addn(e, "DPATH", env_temp); } if ((env_temp = getenv("PERLLIB_PREFIX")) != NULL) { apr_table_addn(e, "PERLLIB_PREFIX", env_temp); } #endif #ifdef BEOS if ((env_temp = getenv("LIBRARY_PATH")) != NULL) { apr_table_addn(e, "LIBRARY_PATH", env_temp); } #endif apr_table_addn(e, "SERVER_SIGNATURE", ap_psignature("", r)); apr_table_addn(e, "SERVER_SOFTWARE", ap_get_server_banner()); apr_table_addn(e, "SERVER_NAME", ap_escape_html(r->pool, ap_get_server_name(r))); apr_table_addn(e, "SERVER_ADDR", r->connection->local_ip); /* Apache */ apr_table_addn(e, "SERVER_PORT", apr_psprintf(r->pool, "%u", ap_get_server_port(r))); host = ap_get_remote_host(c, r->per_dir_config, REMOTE_HOST, NULL); if (host) { apr_table_addn(e, "REMOTE_HOST", host); } #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 apr_table_addn(e, "REMOTE_ADDR", c->remote_ip); #else apr_table_addn(e, "REMOTE_ADDR", c->client_ip); #endif apr_table_addn(e, "DOCUMENT_ROOT", ap_document_root(r)); /* Apache */ apr_table_addn(e, "SERVER_ADMIN", s->server_admin); /* Apache */ apr_table_addn(e, "SCRIPT_FILENAME", r->filename); /* Apache */ #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 rport = c->remote_addr->port; #else rport = c->client_addr->port; #endif apr_table_addn(e, "REMOTE_PORT", apr_itoa(r->pool, rport)); if (r->user) { apr_table_addn(e, "REMOTE_USER", r->user); } else if (r->prev) { request_rec *back = r->prev; while (back) { if (back->user) { apr_table_addn(e, "REDIRECT_REMOTE_USER", back->user); break; } back = back->prev; } } if (r->ap_auth_type) { apr_table_addn(e, "AUTH_TYPE", r->ap_auth_type); } //rem_logname = ap_get_remote_logname(r); //if (rem_logname) { // apr_table_addn(e, "REMOTE_IDENT", apr_pstrdup(r->pool, rem_logname)); //} /* Apache custom error responses. If we have redirected set two new vars */ if (r->prev) { if (r->prev->args) { apr_table_addn(e, "REDIRECT_QUERY_STRING", r->prev->args); } if (r->prev->uri) { apr_table_addn(e, "REDIRECT_URL", r->prev->uri); } } if (e != r->subprocess_env) { apr_table_overlap(r->subprocess_env, e, APR_OVERLAP_TABLES_SET); } } #ifndef WIN32 #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 unixd_config_rec unixd_config; #else unixd_config_rec ap_unixd_config; #endif const char *ap_server_argv0 = "nginx"; #ifdef HAVE_GETPWNAM AP_DECLARE(uid_t) ap_uname2id(const char *name) { struct passwd *ent; if (name[0] == '#') return (atoi(&name[1])); if (!(ent = getpwnam(name))) { ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, "%s: bad user name %s", ap_server_argv0, name); exit(1); } return (ent->pw_uid); } #endif #ifdef HAVE_GETGRNAM AP_DECLARE(gid_t) ap_gname2id(const char *name) { struct group *ent; if (name[0] == '#') return (atoi(&name[1])); if (!(ent = getgrnam(name))) { ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, "%s: bad group name %s", ap_server_argv0, name); exit(1); } return (ent->gr_gid); } #endif AP_DECLARE(void) unixd_pre_config(apr_pool_t *ptemp) { apr_finfo_t wrapper; #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 unixd_config.user_name = DEFAULT_USER; unixd_config.user_id = ap_uname2id(DEFAULT_USER); unixd_config.group_id = ap_gname2id(DEFAULT_GROUP); unixd_config.suexec_enabled = 0; #else ap_unixd_config.user_name = DEFAULT_USER; ap_unixd_config.user_id = ap_uname2id(DEFAULT_USER); ap_unixd_config.group_id = ap_gname2id(DEFAULT_GROUP); ap_unixd_config.suexec_enabled = 0; #endif /* if ((apr_stat(&wrapper, SUEXEC_BIN, APR_FINFO_NORM, ptemp)) != APR_SUCCESS) { return; } if ((wrapper.protection & APR_USETID) && wrapper.user == 0) { unixd_config.suexec_enabled = 1; }*/ } /* XXX move to APR and externalize (but implement differently :) ) */ static apr_lockmech_e proc_mutex_mech(apr_proc_mutex_t *pmutex) { const char *mechname = apr_proc_mutex_name(pmutex); if (!strcmp(mechname, "sysvsem")) { return APR_LOCK_SYSVSEM; } else if (!strcmp(mechname, "flock")) { return APR_LOCK_FLOCK; } return APR_LOCK_DEFAULT; } #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 AP_DECLARE(apr_status_t) unixd_set_proc_mutex_perms(apr_proc_mutex_t *pmutex) { //////////////// if (unixd_config.user_name == NULL) { unixd_pre_config(NULL); } //////////////// if (!geteuid()) { apr_lockmech_e mech = proc_mutex_mech(pmutex); switch(mech) { #if APR_HAS_SYSVSEM_SERIALIZE case APR_LOCK_SYSVSEM: { apr_os_proc_mutex_t ospmutex; #if !APR_HAVE_UNION_SEMUN union semun { long val; struct semid_ds *buf; unsigned short *array; }; #endif union semun ick; struct semid_ds buf; memset(&buf,0,sizeof(buf)); apr_os_proc_mutex_get(&ospmutex, pmutex); buf.sem_perm.uid = unixd_config.user_id; buf.sem_perm.gid = unixd_config.group_id; buf.sem_perm.mode = 0600; ick.buf = &buf; if (semctl(ospmutex.crossproc, 0, IPC_SET, ick) < 0) { return errno; } } break; #endif #if APR_HAS_FLOCK_SERIALIZE case APR_LOCK_FLOCK: { const char *lockfile = apr_proc_mutex_lockfile(pmutex); if (lockfile) { if (chown(lockfile, unixd_config.user_id, -1 /* no gid change */) < 0) { return errno; } } } break; #endif default: /* do nothing */ break; } } return APR_SUCCESS; } AP_DECLARE(apr_status_t) unixd_set_global_mutex_perms(apr_global_mutex_t *gmutex) { #if !APR_PROC_MUTEX_IS_GLOBAL apr_os_global_mutex_t osgmutex; apr_os_global_mutex_get(&osgmutex, gmutex); return unixd_set_proc_mutex_perms(osgmutex.proc_mutex); #else /* APR_PROC_MUTEX_IS_GLOBAL */ /* In this case, apr_proc_mutex_t and apr_global_mutex_t are the same. */ return unixd_set_proc_mutex_perms(gmutex); #endif /* APR_PROC_MUTEX_IS_GLOBAL */ } #else AP_DECLARE(apr_status_t) ap_unixd_set_proc_mutex_perms(apr_proc_mutex_t *pmutex) { if (ap_unixd_config.user_name == NULL) { unixd_pre_config(NULL); } if (!geteuid()) { apr_lockmech_e mech = proc_mutex_mech(pmutex); switch(mech) { #if APR_HAS_SYSVSEM_SERIALIZE case APR_LOCK_SYSVSEM: { apr_os_proc_mutex_t ospmutex; #if !APR_HAVE_UNION_SEMUN union semun { long val; struct semid_ds *buf; unsigned short *array; }; #endif union semun ick; struct semid_ds buf; apr_os_proc_mutex_get(&ospmutex, pmutex); buf.sem_perm.uid = ap_unixd_config.user_id; buf.sem_perm.gid = ap_unixd_config.group_id; buf.sem_perm.mode = 0600; ick.buf = &buf; if (semctl(ospmutex.crossproc, 0, IPC_SET, ick) < 0) { return errno; } } break; #endif #if APR_HAS_FLOCK_SERIALIZE case APR_LOCK_FLOCK: { const char *lockfile = apr_proc_mutex_lockfile(pmutex); if (lockfile) { if (chown(lockfile, ap_unixd_config.user_id, -1 /* no gid change */) < 0) { return errno; } } } break; #endif default: /* do nothing */ break; } } return APR_SUCCESS; } AP_DECLARE(apr_status_t) ap_unixd_set_global_mutex_perms(apr_global_mutex_t *gmutex) { #if !APR_PROC_MUTEX_IS_GLOBAL apr_os_global_mutex_t osgmutex; apr_os_global_mutex_get(&osgmutex, gmutex); return ap_unixd_set_proc_mutex_perms(osgmutex.proc_mutex); #else /* APR_PROC_MUTEX_IS_GLOBAL */ /* In this case, apr_proc_mutex_t and apr_global_mutex_t are the same. */ return ap_unixd_set_proc_mutex_perms(gmutex); #endif /* APR_PROC_MUTEX_IS_GLOBAL */ } #endif #endif modsecurity-2.9.5/standalone/Makefile.in0000664000175000017500000025123514147005251021424 0ustar mhsvierulamhsvierula# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = standalone ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/find_apr.m4 \ $(top_srcdir)/build/find_apu.m4 \ $(top_srcdir)/build/find_curl.m4 \ $(top_srcdir)/build/find_lua.m4 \ $(top_srcdir)/build/find_pcre.m4 \ $(top_srcdir)/build/find_ssdeep.m4 \ $(top_srcdir)/build/find_xml.m4 \ $(top_srcdir)/build/find_yajl.m4 \ $(top_srcdir)/build/libtool.m4 \ $(top_srcdir)/build/ltoptions.m4 \ $(top_srcdir)/build/ltsugar.m4 \ $(top_srcdir)/build/ltversion.m4 \ $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/apache2/modsecurity_config_auto.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkglibdir)" LTLIBRARIES = $(pkglib_LTLIBRARIES) standalone_la_DEPENDENCIES = am__dirstamp = $(am__leading_dot)dirstamp am_standalone_la_OBJECTS = ../apache2/standalone_la-acmp.lo \ ../apache2/standalone_la-apache2_config.lo \ ../apache2/standalone_la-apache2_io.lo \ ../apache2/standalone_la-apache2_util.lo \ ../apache2/libinjection/standalone_la-libinjection_html5.lo \ ../apache2/libinjection/standalone_la-libinjection_sqli.lo \ ../apache2/libinjection/standalone_la-libinjection_xss.lo \ ../apache2/standalone_la-mod_security2.lo \ ../apache2/standalone_la-modsecurity.lo \ ../apache2/standalone_la-msc_status_engine.lo \ ../apache2/standalone_la-msc_crypt.lo \ ../apache2/standalone_la-msc_geo.lo \ ../apache2/standalone_la-msc_gsb.lo \ ../apache2/standalone_la-msc_json.lo \ ../apache2/standalone_la-msc_logging.lo \ ../apache2/standalone_la-msc_lua.lo \ ../apache2/standalone_la-msc_multipart.lo \ ../apache2/standalone_la-msc_parsers.lo \ ../apache2/standalone_la-msc_pcre.lo \ ../apache2/standalone_la-msc_release.lo \ ../apache2/standalone_la-msc_remote_rules.lo \ ../apache2/standalone_la-msc_reqbody.lo \ ../apache2/standalone_la-msc_tree.lo \ ../apache2/standalone_la-msc_unicode.lo \ ../apache2/standalone_la-msc_util.lo \ ../apache2/standalone_la-msc_xml.lo \ ../apache2/standalone_la-persist_dbm.lo \ ../apache2/standalone_la-re_actions.lo \ ../apache2/standalone_la-re.lo \ ../apache2/standalone_la-re_operators.lo \ ../apache2/standalone_la-re_tfns.lo \ ../apache2/standalone_la-re_variables.lo standalone_la-api.lo \ standalone_la-buckets.lo standalone_la-config.lo \ standalone_la-filters.lo standalone_la-hooks.lo \ standalone_la-regex.lo standalone_la-server.lo standalone_la_OBJECTS = $(am_standalone_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = standalone_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(standalone_la_CFLAGS) \ $(CFLAGS) $(standalone_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/apache2 depcomp = $(SHELL) $(top_srcdir)/build/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(standalone_la_SOURCES) DIST_SOURCES = $(standalone_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/build/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibdir = $(prefix)/lib ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APR_CFLAGS = @APR_CFLAGS@ APR_CONFIG = @APR_CONFIG@ APR_CPPFLAGS = @APR_CPPFLAGS@ APR_INCLUDEDIR = @APR_INCLUDEDIR@ APR_LDADD = @APR_LDADD@ APR_LDFLAGS = @APR_LDFLAGS@ APR_LINKLD = @APR_LINKLD@ APR_VERSION = @APR_VERSION@ APU_CFLAGS = @APU_CFLAGS@ APU_CONFIG = @APU_CONFIG@ APU_INCLUDEDIR = @APU_INCLUDEDIR@ APU_LDADD = @APU_LDADD@ APU_LDFLAGS = @APU_LDFLAGS@ APU_LINKLD = @APU_LINKLD@ APU_VERSION = @APU_VERSION@ APXS = @APXS@ APXS_BINDIR = @APXS_BINDIR@ APXS_CC = @APXS_CC@ APXS_CFLAGS = @APXS_CFLAGS@ APXS_EXTRA_CFLAGS = @APXS_EXTRA_CFLAGS@ APXS_HTTPD = @APXS_HTTPD@ APXS_INCLUDEDIR = @APXS_INCLUDEDIR@ APXS_INCLUDES = @APXS_INCLUDES@ APXS_LDFLAGS = @APXS_LDFLAGS@ APXS_LIBDIR = @APXS_LIBDIR@ APXS_LIBEXECDIR = @APXS_LIBEXECDIR@ APXS_LIBS = @APXS_LIBS@ APXS_LIBTOOL = @APXS_LIBTOOL@ APXS_MODULES = @APXS_MODULES@ APXS_PROGNAME = @APXS_PROGNAME@ APXS_SBINDIR = @APXS_SBINDIR@ APXS_WRAPPER = @APXS_WRAPPER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_CPPFLAGS = @CURL_CPPFLAGS@ CURL_LDADD = @CURL_LDADD@ CURL_LDFLAGS = @CURL_LDFLAGS@ CURL_USES_GNUTLS = @CURL_USES_GNUTLS@ CURL_VERSION = @CURL_VERSION@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENV_CMD = @ENV_CMD@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ LIBXML2_CONFIG = @LIBXML2_CONFIG@ LIBXML2_CPPFLAGS = @LIBXML2_CPPFLAGS@ LIBXML2_LDADD = @LIBXML2_LDADD@ LIBXML2_LDFLAGS = @LIBXML2_LDFLAGS@ LIBXML2_VERSION = @LIBXML2_VERSION@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LDADD = @LUA_LDADD@ LUA_LDFLAGS = @LUA_LDFLAGS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MODSEC_APXS_EXTRA_CFLAGS = @MODSEC_APXS_EXTRA_CFLAGS@ MODSEC_EXTRA_CFLAGS = @MODSEC_EXTRA_CFLAGS@ MSC_BASE_DIR = @MSC_BASE_DIR@ MSC_PKGBASE_DIR = @MSC_PKGBASE_DIR@ MSC_REGRESSION_CONF_DIR = @MSC_REGRESSION_CONF_DIR@ MSC_REGRESSION_DIR = @MSC_REGRESSION_DIR@ MSC_REGRESSION_DOCROOT_DIR = @MSC_REGRESSION_DOCROOT_DIR@ MSC_REGRESSION_LOGS_DIR = @MSC_REGRESSION_LOGS_DIR@ MSC_REGRESSION_SERVERROOT_DIR = @MSC_REGRESSION_SERVERROOT_DIR@ MSC_TEST_DIR = @MSC_TEST_DIR@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCRE_CFLAGS = @PCRE_CFLAGS@ PCRE_CONFIG = @PCRE_CONFIG@ PCRE_CPPFLAGS = @PCRE_CPPFLAGS@ PCRE_LDADD = @PCRE_LDADD@ PCRE_LDFLAGS = @PCRE_LDFLAGS@ PCRE_LD_PATH = @PCRE_LD_PATH@ PCRE_VERSION = @PCRE_VERSION@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSDEEP_CFLAGS = @SSDEEP_CFLAGS@ SSDEEP_LDADD = @SSDEEP_LDADD@ SSDEEP_LDFLAGS = @SSDEEP_LDFLAGS@ STRIP = @STRIP@ TOPLEVEL_SUBDIRS = @TOPLEVEL_SUBDIRS@ VERSION = @VERSION@ YAJL_CFLAGS = @YAJL_CFLAGS@ YAJL_LDADD = @YAJL_LDADD@ YAJL_LDFLAGS = @YAJL_LDFLAGS@ YAJL_LIBS = @YAJL_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ pkglib_LTLIBRARIES = standalone.la standalone_la_SOURCES = ../apache2/acmp.c \ ../apache2/apache2_config.c \ ../apache2/apache2_io.c \ ../apache2/apache2_util.c \ ../apache2/libinjection/libinjection_html5.c \ ../apache2/libinjection/libinjection_sqli.c \ ../apache2/libinjection/libinjection_xss.c \ ../apache2/mod_security2.c \ ../apache2/modsecurity.c \ ../apache2/msc_status_engine.c \ ../apache2/msc_crypt.c \ ../apache2/msc_geo.c \ ../apache2/msc_gsb.c \ ../apache2/msc_json.c \ ../apache2/msc_logging.c \ ../apache2/msc_lua.c \ ../apache2/msc_multipart.c \ ../apache2/msc_parsers.c \ ../apache2/msc_pcre.c \ ../apache2/msc_release.c \ ../apache2/msc_remote_rules.c \ ../apache2/msc_reqbody.c \ ../apache2/msc_tree.c \ ../apache2/msc_unicode.c \ ../apache2/msc_util.c \ ../apache2/msc_xml.c \ ../apache2/persist_dbm.c \ ../apache2/re_actions.c \ ../apache2/re.c \ ../apache2/re_operators.c \ ../apache2/re_tfns.c \ ../apache2/re_variables.c \ api.c \ buckets.c \ config.c \ filters.c \ hooks.c \ regex.c \ server.c standalone_la_CFLAGS = -DVERSION_NGINX \ @APR_CFLAGS@ \ @APU_CFLAGS@ \ @APXS_CFLAGS@ \ @CURL_CFLAGS@ \ @LIBXML2_CFLAGS@ \ @LUA_CFLAGS@ \ @MODSEC_EXTRA_CFLAGS@ \ @PCRE_CFLAGS@ \ @YAJL_CFLAGS@ \ @SSDEEP_CFLAGS@ standalone_la_CPPFLAGS = @APR_CPPFLAGS@ \ @LIBXML2_CPPFLAGS@ \ @PCRE_CPPFLAGS@ standalone_la_LIBADD = @APR_LDADD@ \ @APU_LDADD@ \ @LIBXML2_LDADD@ \ @LUA_LDADD@ \ @PCRE_LDADD@ \ @YAJL_LDADD@ \ @SSDEEP_CFLAGS@ @AIX_TRUE@standalone_la_LDFLAGS = -module -avoid-version \ @AIX_TRUE@ @APR_LDFLAGS@ \ @AIX_TRUE@ @APU_LDFLAGS@ \ @AIX_TRUE@ @APXS_LDFLAGS@ \ @AIX_TRUE@ @LIBXML2_LDFLAGS@ \ @AIX_TRUE@ @LUA_LDFLAGS@ \ @AIX_TRUE@ @PCRE_LDFLAGS@ \ @AIX_TRUE@ @YAJL_LDFLAGS@ \ @AIX_TRUE@ @SSDEEP_LDFLAGS@ @FREEBSD_TRUE@standalone_la_LDFLAGS = -no-undefined -module -avoid-version \ @FREEBSD_TRUE@ @APR_LDFLAGS@ \ @FREEBSD_TRUE@ @APU_LDFLAGS@ \ @FREEBSD_TRUE@ @APXS_LDFLAGS@ \ @FREEBSD_TRUE@ @LIBXML2_LDFLAGS@ \ @FREEBSD_TRUE@ @LUA_LDFLAGS@ \ @FREEBSD_TRUE@ @PCRE_LDFLAGS@ \ @FREEBSD_TRUE@ @YAJL_LDFLAGS@ \ @FREEBSD_TRUE@ @SSDEEP_LDFLAGS@ @HPUX_TRUE@standalone_la_LDFLAGS = -module -avoid-version \ @HPUX_TRUE@ @APR_LDFLAGS@ \ @HPUX_TRUE@ @APU_LDFLAGS@ \ @HPUX_TRUE@ @APXS_LDFLAGS@ \ @HPUX_TRUE@ @LIBXML2_LDFLAGS@ \ @HPUX_TRUE@ @LUA_LDFLAGS@ \ @HPUX_TRUE@ @PCRE_LDFLAGS@ \ @HPUX_TRUE@ @YAJL_LDFLAGS@ \ @HPUX_TRUE@ @SSDEEP_LDFLAGS@ @LINUX_TRUE@standalone_la_LDFLAGS = -no-undefined -module -avoid-version \ @LINUX_TRUE@ @APR_LDFLAGS@ \ @LINUX_TRUE@ @APU_LDFLAGS@ \ @LINUX_TRUE@ @APXS_LDFLAGS@ \ @LINUX_TRUE@ @LIBXML2_LDFLAGS@ \ @LINUX_TRUE@ @LUA_LDFLAGS@ \ @LINUX_TRUE@ @PCRE_LDFLAGS@ \ @LINUX_TRUE@ @YAJL_LDFLAGS@ \ @LINUX_TRUE@ @SSDEEP_LDFLAGS@ @MACOSX_TRUE@standalone_la_LDFLAGS = -module -avoid-version \ @MACOSX_TRUE@ @APR_LDFLAGS@ \ @MACOSX_TRUE@ @APU_LDFLAGS@ \ @MACOSX_TRUE@ @APXS_LDFLAGS@ \ @MACOSX_TRUE@ @LIBXML2_LDFLAGS@ \ @MACOSX_TRUE@ @LUA_LDFLAGS@ \ @MACOSX_TRUE@ @PCRE_LDFLAGS@ \ @MACOSX_TRUE@ @YAJL_LDFLAGS@ \ @MACOSX_TRUE@ @SSDEEP_LDFLAGS@ @NETBSD_TRUE@standalone_la_LDFLAGS = -no-undefined -module -avoid-version \ @NETBSD_TRUE@ @APR_LDFLAGS@ \ @NETBSD_TRUE@ @APU_LDFLAGS@ \ @NETBSD_TRUE@ @APXS_LDFLAGS@ \ @NETBSD_TRUE@ @LIBXML2_LDFLAGS@ \ @NETBSD_TRUE@ @LUA_LDFLAGS@ \ @NETBSD_TRUE@ @PCRE_LDFLAGS@ \ @NETBSD_TRUE@ @YAJL_LDFLAGS@ \ @NETBSD_TRUE@ @SSDEEP_LDFLAGS@ @OPENBSD_TRUE@standalone_la_LDFLAGS = -no-undefined -module -avoid-version \ @OPENBSD_TRUE@ @APR_LDFLAGS@ \ @OPENBSD_TRUE@ @APU_LDFLAGS@ \ @OPENBSD_TRUE@ @APXS_LDFLAGS@ \ @OPENBSD_TRUE@ @LIBXML2_LDFLAGS@ \ @OPENBSD_TRUE@ @LUA_LDFLAGS@ \ @OPENBSD_TRUE@ @PCRE_LDFLAGS@ \ @OPENBSD_TRUE@ @YAJL_LDFLAGS@ \ @OPENBSD_TRUE@ @SSDEEP_LDFLAGS@ @SOLARIS_TRUE@standalone_la_LDFLAGS = -module -avoid-version \ @SOLARIS_TRUE@ @APR_LDFLAGS@ \ @SOLARIS_TRUE@ @APU_LDFLAGS@ \ @SOLARIS_TRUE@ @APXS_LDFLAGS@ \ @SOLARIS_TRUE@ @LIBXML2_LDFLAGS@ \ @SOLARIS_TRUE@ @LUA_LDFLAGS@ \ @SOLARIS_TRUE@ @PCRE_LDFLAGS@ \ @SOLARIS_TRUE@ @YAJL_LDFLAGS@ \ @SOLARIS_TRUE@ @SSDEEP_LDFLAGS@ all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign standalone/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign standalone/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \ } uninstall-pkglibLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ done clean-pkglibLTLIBRARIES: -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) @list='$(pkglib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } ../apache2/$(am__dirstamp): @$(MKDIR_P) ../apache2 @: > ../apache2/$(am__dirstamp) ../apache2/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ../apache2/$(DEPDIR) @: > ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-acmp.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-apache2_config.lo: \ ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-apache2_io.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-apache2_util.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/libinjection/$(am__dirstamp): @$(MKDIR_P) ../apache2/libinjection @: > ../apache2/libinjection/$(am__dirstamp) ../apache2/libinjection/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ../apache2/libinjection/$(DEPDIR) @: > ../apache2/libinjection/$(DEPDIR)/$(am__dirstamp) ../apache2/libinjection/standalone_la-libinjection_html5.lo: \ ../apache2/libinjection/$(am__dirstamp) \ ../apache2/libinjection/$(DEPDIR)/$(am__dirstamp) ../apache2/libinjection/standalone_la-libinjection_sqli.lo: \ ../apache2/libinjection/$(am__dirstamp) \ ../apache2/libinjection/$(DEPDIR)/$(am__dirstamp) ../apache2/libinjection/standalone_la-libinjection_xss.lo: \ ../apache2/libinjection/$(am__dirstamp) \ ../apache2/libinjection/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-mod_security2.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-modsecurity.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-msc_status_engine.lo: \ ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-msc_crypt.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-msc_geo.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-msc_gsb.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-msc_json.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-msc_logging.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-msc_lua.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-msc_multipart.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-msc_parsers.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-msc_pcre.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-msc_release.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-msc_remote_rules.lo: \ ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-msc_reqbody.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-msc_tree.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-msc_unicode.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-msc_util.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-msc_xml.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-persist_dbm.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-re_actions.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-re.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-re_operators.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-re_tfns.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/standalone_la-re_variables.lo: ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) standalone.la: $(standalone_la_OBJECTS) $(standalone_la_DEPENDENCIES) $(EXTRA_standalone_la_DEPENDENCIES) $(AM_V_CCLD)$(standalone_la_LINK) -rpath $(pkglibdir) $(standalone_la_OBJECTS) $(standalone_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f ../apache2/*.$(OBJEXT) -rm -f ../apache2/*.lo -rm -f ../apache2/libinjection/*.$(OBJEXT) -rm -f ../apache2/libinjection/*.lo distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-acmp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-apache2_config.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-apache2_io.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-apache2_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-mod_security2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-modsecurity.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-msc_crypt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-msc_geo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-msc_gsb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-msc_json.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-msc_logging.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-msc_lua.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-msc_multipart.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-msc_parsers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-msc_pcre.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-msc_release.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-msc_remote_rules.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-msc_reqbody.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-msc_status_engine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-msc_tree.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-msc_unicode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-msc_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-msc_xml.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-persist_dbm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-re.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-re_actions.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-re_operators.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-re_tfns.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/standalone_la-re_variables.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/libinjection/$(DEPDIR)/standalone_la-libinjection_html5.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/libinjection/$(DEPDIR)/standalone_la-libinjection_sqli.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/libinjection/$(DEPDIR)/standalone_la-libinjection_xss.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/standalone_la-api.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/standalone_la-buckets.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/standalone_la-config.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/standalone_la-filters.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/standalone_la-hooks.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/standalone_la-regex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/standalone_la-server.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< ../apache2/standalone_la-acmp.lo: ../apache2/acmp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-acmp.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-acmp.Tpo -c -o ../apache2/standalone_la-acmp.lo `test -f '../apache2/acmp.c' || echo '$(srcdir)/'`../apache2/acmp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-acmp.Tpo ../apache2/$(DEPDIR)/standalone_la-acmp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/acmp.c' object='../apache2/standalone_la-acmp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-acmp.lo `test -f '../apache2/acmp.c' || echo '$(srcdir)/'`../apache2/acmp.c ../apache2/standalone_la-apache2_config.lo: ../apache2/apache2_config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-apache2_config.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-apache2_config.Tpo -c -o ../apache2/standalone_la-apache2_config.lo `test -f '../apache2/apache2_config.c' || echo '$(srcdir)/'`../apache2/apache2_config.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-apache2_config.Tpo ../apache2/$(DEPDIR)/standalone_la-apache2_config.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/apache2_config.c' object='../apache2/standalone_la-apache2_config.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-apache2_config.lo `test -f '../apache2/apache2_config.c' || echo '$(srcdir)/'`../apache2/apache2_config.c ../apache2/standalone_la-apache2_io.lo: ../apache2/apache2_io.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-apache2_io.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-apache2_io.Tpo -c -o ../apache2/standalone_la-apache2_io.lo `test -f '../apache2/apache2_io.c' || echo '$(srcdir)/'`../apache2/apache2_io.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-apache2_io.Tpo ../apache2/$(DEPDIR)/standalone_la-apache2_io.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/apache2_io.c' object='../apache2/standalone_la-apache2_io.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-apache2_io.lo `test -f '../apache2/apache2_io.c' || echo '$(srcdir)/'`../apache2/apache2_io.c ../apache2/standalone_la-apache2_util.lo: ../apache2/apache2_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-apache2_util.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-apache2_util.Tpo -c -o ../apache2/standalone_la-apache2_util.lo `test -f '../apache2/apache2_util.c' || echo '$(srcdir)/'`../apache2/apache2_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-apache2_util.Tpo ../apache2/$(DEPDIR)/standalone_la-apache2_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/apache2_util.c' object='../apache2/standalone_la-apache2_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-apache2_util.lo `test -f '../apache2/apache2_util.c' || echo '$(srcdir)/'`../apache2/apache2_util.c ../apache2/libinjection/standalone_la-libinjection_html5.lo: ../apache2/libinjection/libinjection_html5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/libinjection/standalone_la-libinjection_html5.lo -MD -MP -MF ../apache2/libinjection/$(DEPDIR)/standalone_la-libinjection_html5.Tpo -c -o ../apache2/libinjection/standalone_la-libinjection_html5.lo `test -f '../apache2/libinjection/libinjection_html5.c' || echo '$(srcdir)/'`../apache2/libinjection/libinjection_html5.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/libinjection/$(DEPDIR)/standalone_la-libinjection_html5.Tpo ../apache2/libinjection/$(DEPDIR)/standalone_la-libinjection_html5.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/libinjection/libinjection_html5.c' object='../apache2/libinjection/standalone_la-libinjection_html5.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/libinjection/standalone_la-libinjection_html5.lo `test -f '../apache2/libinjection/libinjection_html5.c' || echo '$(srcdir)/'`../apache2/libinjection/libinjection_html5.c ../apache2/libinjection/standalone_la-libinjection_sqli.lo: ../apache2/libinjection/libinjection_sqli.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/libinjection/standalone_la-libinjection_sqli.lo -MD -MP -MF ../apache2/libinjection/$(DEPDIR)/standalone_la-libinjection_sqli.Tpo -c -o ../apache2/libinjection/standalone_la-libinjection_sqli.lo `test -f '../apache2/libinjection/libinjection_sqli.c' || echo '$(srcdir)/'`../apache2/libinjection/libinjection_sqli.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/libinjection/$(DEPDIR)/standalone_la-libinjection_sqli.Tpo ../apache2/libinjection/$(DEPDIR)/standalone_la-libinjection_sqli.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/libinjection/libinjection_sqli.c' object='../apache2/libinjection/standalone_la-libinjection_sqli.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/libinjection/standalone_la-libinjection_sqli.lo `test -f '../apache2/libinjection/libinjection_sqli.c' || echo '$(srcdir)/'`../apache2/libinjection/libinjection_sqli.c ../apache2/libinjection/standalone_la-libinjection_xss.lo: ../apache2/libinjection/libinjection_xss.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/libinjection/standalone_la-libinjection_xss.lo -MD -MP -MF ../apache2/libinjection/$(DEPDIR)/standalone_la-libinjection_xss.Tpo -c -o ../apache2/libinjection/standalone_la-libinjection_xss.lo `test -f '../apache2/libinjection/libinjection_xss.c' || echo '$(srcdir)/'`../apache2/libinjection/libinjection_xss.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/libinjection/$(DEPDIR)/standalone_la-libinjection_xss.Tpo ../apache2/libinjection/$(DEPDIR)/standalone_la-libinjection_xss.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/libinjection/libinjection_xss.c' object='../apache2/libinjection/standalone_la-libinjection_xss.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/libinjection/standalone_la-libinjection_xss.lo `test -f '../apache2/libinjection/libinjection_xss.c' || echo '$(srcdir)/'`../apache2/libinjection/libinjection_xss.c ../apache2/standalone_la-mod_security2.lo: ../apache2/mod_security2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-mod_security2.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-mod_security2.Tpo -c -o ../apache2/standalone_la-mod_security2.lo `test -f '../apache2/mod_security2.c' || echo '$(srcdir)/'`../apache2/mod_security2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-mod_security2.Tpo ../apache2/$(DEPDIR)/standalone_la-mod_security2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/mod_security2.c' object='../apache2/standalone_la-mod_security2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-mod_security2.lo `test -f '../apache2/mod_security2.c' || echo '$(srcdir)/'`../apache2/mod_security2.c ../apache2/standalone_la-modsecurity.lo: ../apache2/modsecurity.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-modsecurity.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-modsecurity.Tpo -c -o ../apache2/standalone_la-modsecurity.lo `test -f '../apache2/modsecurity.c' || echo '$(srcdir)/'`../apache2/modsecurity.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-modsecurity.Tpo ../apache2/$(DEPDIR)/standalone_la-modsecurity.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/modsecurity.c' object='../apache2/standalone_la-modsecurity.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-modsecurity.lo `test -f '../apache2/modsecurity.c' || echo '$(srcdir)/'`../apache2/modsecurity.c ../apache2/standalone_la-msc_status_engine.lo: ../apache2/msc_status_engine.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-msc_status_engine.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-msc_status_engine.Tpo -c -o ../apache2/standalone_la-msc_status_engine.lo `test -f '../apache2/msc_status_engine.c' || echo '$(srcdir)/'`../apache2/msc_status_engine.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-msc_status_engine.Tpo ../apache2/$(DEPDIR)/standalone_la-msc_status_engine.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_status_engine.c' object='../apache2/standalone_la-msc_status_engine.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-msc_status_engine.lo `test -f '../apache2/msc_status_engine.c' || echo '$(srcdir)/'`../apache2/msc_status_engine.c ../apache2/standalone_la-msc_crypt.lo: ../apache2/msc_crypt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-msc_crypt.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-msc_crypt.Tpo -c -o ../apache2/standalone_la-msc_crypt.lo `test -f '../apache2/msc_crypt.c' || echo '$(srcdir)/'`../apache2/msc_crypt.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-msc_crypt.Tpo ../apache2/$(DEPDIR)/standalone_la-msc_crypt.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_crypt.c' object='../apache2/standalone_la-msc_crypt.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-msc_crypt.lo `test -f '../apache2/msc_crypt.c' || echo '$(srcdir)/'`../apache2/msc_crypt.c ../apache2/standalone_la-msc_geo.lo: ../apache2/msc_geo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-msc_geo.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-msc_geo.Tpo -c -o ../apache2/standalone_la-msc_geo.lo `test -f '../apache2/msc_geo.c' || echo '$(srcdir)/'`../apache2/msc_geo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-msc_geo.Tpo ../apache2/$(DEPDIR)/standalone_la-msc_geo.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_geo.c' object='../apache2/standalone_la-msc_geo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-msc_geo.lo `test -f '../apache2/msc_geo.c' || echo '$(srcdir)/'`../apache2/msc_geo.c ../apache2/standalone_la-msc_gsb.lo: ../apache2/msc_gsb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-msc_gsb.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-msc_gsb.Tpo -c -o ../apache2/standalone_la-msc_gsb.lo `test -f '../apache2/msc_gsb.c' || echo '$(srcdir)/'`../apache2/msc_gsb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-msc_gsb.Tpo ../apache2/$(DEPDIR)/standalone_la-msc_gsb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_gsb.c' object='../apache2/standalone_la-msc_gsb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-msc_gsb.lo `test -f '../apache2/msc_gsb.c' || echo '$(srcdir)/'`../apache2/msc_gsb.c ../apache2/standalone_la-msc_json.lo: ../apache2/msc_json.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-msc_json.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-msc_json.Tpo -c -o ../apache2/standalone_la-msc_json.lo `test -f '../apache2/msc_json.c' || echo '$(srcdir)/'`../apache2/msc_json.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-msc_json.Tpo ../apache2/$(DEPDIR)/standalone_la-msc_json.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_json.c' object='../apache2/standalone_la-msc_json.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-msc_json.lo `test -f '../apache2/msc_json.c' || echo '$(srcdir)/'`../apache2/msc_json.c ../apache2/standalone_la-msc_logging.lo: ../apache2/msc_logging.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-msc_logging.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-msc_logging.Tpo -c -o ../apache2/standalone_la-msc_logging.lo `test -f '../apache2/msc_logging.c' || echo '$(srcdir)/'`../apache2/msc_logging.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-msc_logging.Tpo ../apache2/$(DEPDIR)/standalone_la-msc_logging.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_logging.c' object='../apache2/standalone_la-msc_logging.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-msc_logging.lo `test -f '../apache2/msc_logging.c' || echo '$(srcdir)/'`../apache2/msc_logging.c ../apache2/standalone_la-msc_lua.lo: ../apache2/msc_lua.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-msc_lua.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-msc_lua.Tpo -c -o ../apache2/standalone_la-msc_lua.lo `test -f '../apache2/msc_lua.c' || echo '$(srcdir)/'`../apache2/msc_lua.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-msc_lua.Tpo ../apache2/$(DEPDIR)/standalone_la-msc_lua.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_lua.c' object='../apache2/standalone_la-msc_lua.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-msc_lua.lo `test -f '../apache2/msc_lua.c' || echo '$(srcdir)/'`../apache2/msc_lua.c ../apache2/standalone_la-msc_multipart.lo: ../apache2/msc_multipart.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-msc_multipart.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-msc_multipart.Tpo -c -o ../apache2/standalone_la-msc_multipart.lo `test -f '../apache2/msc_multipart.c' || echo '$(srcdir)/'`../apache2/msc_multipart.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-msc_multipart.Tpo ../apache2/$(DEPDIR)/standalone_la-msc_multipart.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_multipart.c' object='../apache2/standalone_la-msc_multipart.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-msc_multipart.lo `test -f '../apache2/msc_multipart.c' || echo '$(srcdir)/'`../apache2/msc_multipart.c ../apache2/standalone_la-msc_parsers.lo: ../apache2/msc_parsers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-msc_parsers.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-msc_parsers.Tpo -c -o ../apache2/standalone_la-msc_parsers.lo `test -f '../apache2/msc_parsers.c' || echo '$(srcdir)/'`../apache2/msc_parsers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-msc_parsers.Tpo ../apache2/$(DEPDIR)/standalone_la-msc_parsers.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_parsers.c' object='../apache2/standalone_la-msc_parsers.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-msc_parsers.lo `test -f '../apache2/msc_parsers.c' || echo '$(srcdir)/'`../apache2/msc_parsers.c ../apache2/standalone_la-msc_pcre.lo: ../apache2/msc_pcre.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-msc_pcre.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-msc_pcre.Tpo -c -o ../apache2/standalone_la-msc_pcre.lo `test -f '../apache2/msc_pcre.c' || echo '$(srcdir)/'`../apache2/msc_pcre.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-msc_pcre.Tpo ../apache2/$(DEPDIR)/standalone_la-msc_pcre.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_pcre.c' object='../apache2/standalone_la-msc_pcre.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-msc_pcre.lo `test -f '../apache2/msc_pcre.c' || echo '$(srcdir)/'`../apache2/msc_pcre.c ../apache2/standalone_la-msc_release.lo: ../apache2/msc_release.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-msc_release.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-msc_release.Tpo -c -o ../apache2/standalone_la-msc_release.lo `test -f '../apache2/msc_release.c' || echo '$(srcdir)/'`../apache2/msc_release.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-msc_release.Tpo ../apache2/$(DEPDIR)/standalone_la-msc_release.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_release.c' object='../apache2/standalone_la-msc_release.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-msc_release.lo `test -f '../apache2/msc_release.c' || echo '$(srcdir)/'`../apache2/msc_release.c ../apache2/standalone_la-msc_remote_rules.lo: ../apache2/msc_remote_rules.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-msc_remote_rules.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-msc_remote_rules.Tpo -c -o ../apache2/standalone_la-msc_remote_rules.lo `test -f '../apache2/msc_remote_rules.c' || echo '$(srcdir)/'`../apache2/msc_remote_rules.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-msc_remote_rules.Tpo ../apache2/$(DEPDIR)/standalone_la-msc_remote_rules.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_remote_rules.c' object='../apache2/standalone_la-msc_remote_rules.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-msc_remote_rules.lo `test -f '../apache2/msc_remote_rules.c' || echo '$(srcdir)/'`../apache2/msc_remote_rules.c ../apache2/standalone_la-msc_reqbody.lo: ../apache2/msc_reqbody.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-msc_reqbody.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-msc_reqbody.Tpo -c -o ../apache2/standalone_la-msc_reqbody.lo `test -f '../apache2/msc_reqbody.c' || echo '$(srcdir)/'`../apache2/msc_reqbody.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-msc_reqbody.Tpo ../apache2/$(DEPDIR)/standalone_la-msc_reqbody.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_reqbody.c' object='../apache2/standalone_la-msc_reqbody.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-msc_reqbody.lo `test -f '../apache2/msc_reqbody.c' || echo '$(srcdir)/'`../apache2/msc_reqbody.c ../apache2/standalone_la-msc_tree.lo: ../apache2/msc_tree.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-msc_tree.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-msc_tree.Tpo -c -o ../apache2/standalone_la-msc_tree.lo `test -f '../apache2/msc_tree.c' || echo '$(srcdir)/'`../apache2/msc_tree.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-msc_tree.Tpo ../apache2/$(DEPDIR)/standalone_la-msc_tree.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_tree.c' object='../apache2/standalone_la-msc_tree.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-msc_tree.lo `test -f '../apache2/msc_tree.c' || echo '$(srcdir)/'`../apache2/msc_tree.c ../apache2/standalone_la-msc_unicode.lo: ../apache2/msc_unicode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-msc_unicode.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-msc_unicode.Tpo -c -o ../apache2/standalone_la-msc_unicode.lo `test -f '../apache2/msc_unicode.c' || echo '$(srcdir)/'`../apache2/msc_unicode.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-msc_unicode.Tpo ../apache2/$(DEPDIR)/standalone_la-msc_unicode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_unicode.c' object='../apache2/standalone_la-msc_unicode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-msc_unicode.lo `test -f '../apache2/msc_unicode.c' || echo '$(srcdir)/'`../apache2/msc_unicode.c ../apache2/standalone_la-msc_util.lo: ../apache2/msc_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-msc_util.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-msc_util.Tpo -c -o ../apache2/standalone_la-msc_util.lo `test -f '../apache2/msc_util.c' || echo '$(srcdir)/'`../apache2/msc_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-msc_util.Tpo ../apache2/$(DEPDIR)/standalone_la-msc_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_util.c' object='../apache2/standalone_la-msc_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-msc_util.lo `test -f '../apache2/msc_util.c' || echo '$(srcdir)/'`../apache2/msc_util.c ../apache2/standalone_la-msc_xml.lo: ../apache2/msc_xml.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-msc_xml.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-msc_xml.Tpo -c -o ../apache2/standalone_la-msc_xml.lo `test -f '../apache2/msc_xml.c' || echo '$(srcdir)/'`../apache2/msc_xml.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-msc_xml.Tpo ../apache2/$(DEPDIR)/standalone_la-msc_xml.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_xml.c' object='../apache2/standalone_la-msc_xml.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-msc_xml.lo `test -f '../apache2/msc_xml.c' || echo '$(srcdir)/'`../apache2/msc_xml.c ../apache2/standalone_la-persist_dbm.lo: ../apache2/persist_dbm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-persist_dbm.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-persist_dbm.Tpo -c -o ../apache2/standalone_la-persist_dbm.lo `test -f '../apache2/persist_dbm.c' || echo '$(srcdir)/'`../apache2/persist_dbm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-persist_dbm.Tpo ../apache2/$(DEPDIR)/standalone_la-persist_dbm.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/persist_dbm.c' object='../apache2/standalone_la-persist_dbm.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-persist_dbm.lo `test -f '../apache2/persist_dbm.c' || echo '$(srcdir)/'`../apache2/persist_dbm.c ../apache2/standalone_la-re_actions.lo: ../apache2/re_actions.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-re_actions.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-re_actions.Tpo -c -o ../apache2/standalone_la-re_actions.lo `test -f '../apache2/re_actions.c' || echo '$(srcdir)/'`../apache2/re_actions.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-re_actions.Tpo ../apache2/$(DEPDIR)/standalone_la-re_actions.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/re_actions.c' object='../apache2/standalone_la-re_actions.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-re_actions.lo `test -f '../apache2/re_actions.c' || echo '$(srcdir)/'`../apache2/re_actions.c ../apache2/standalone_la-re.lo: ../apache2/re.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-re.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-re.Tpo -c -o ../apache2/standalone_la-re.lo `test -f '../apache2/re.c' || echo '$(srcdir)/'`../apache2/re.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-re.Tpo ../apache2/$(DEPDIR)/standalone_la-re.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/re.c' object='../apache2/standalone_la-re.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-re.lo `test -f '../apache2/re.c' || echo '$(srcdir)/'`../apache2/re.c ../apache2/standalone_la-re_operators.lo: ../apache2/re_operators.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-re_operators.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-re_operators.Tpo -c -o ../apache2/standalone_la-re_operators.lo `test -f '../apache2/re_operators.c' || echo '$(srcdir)/'`../apache2/re_operators.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-re_operators.Tpo ../apache2/$(DEPDIR)/standalone_la-re_operators.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/re_operators.c' object='../apache2/standalone_la-re_operators.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-re_operators.lo `test -f '../apache2/re_operators.c' || echo '$(srcdir)/'`../apache2/re_operators.c ../apache2/standalone_la-re_tfns.lo: ../apache2/re_tfns.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-re_tfns.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-re_tfns.Tpo -c -o ../apache2/standalone_la-re_tfns.lo `test -f '../apache2/re_tfns.c' || echo '$(srcdir)/'`../apache2/re_tfns.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-re_tfns.Tpo ../apache2/$(DEPDIR)/standalone_la-re_tfns.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/re_tfns.c' object='../apache2/standalone_la-re_tfns.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-re_tfns.lo `test -f '../apache2/re_tfns.c' || echo '$(srcdir)/'`../apache2/re_tfns.c ../apache2/standalone_la-re_variables.lo: ../apache2/re_variables.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT ../apache2/standalone_la-re_variables.lo -MD -MP -MF ../apache2/$(DEPDIR)/standalone_la-re_variables.Tpo -c -o ../apache2/standalone_la-re_variables.lo `test -f '../apache2/re_variables.c' || echo '$(srcdir)/'`../apache2/re_variables.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/standalone_la-re_variables.Tpo ../apache2/$(DEPDIR)/standalone_la-re_variables.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/re_variables.c' object='../apache2/standalone_la-re_variables.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o ../apache2/standalone_la-re_variables.lo `test -f '../apache2/re_variables.c' || echo '$(srcdir)/'`../apache2/re_variables.c standalone_la-api.lo: api.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT standalone_la-api.lo -MD -MP -MF $(DEPDIR)/standalone_la-api.Tpo -c -o standalone_la-api.lo `test -f 'api.c' || echo '$(srcdir)/'`api.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/standalone_la-api.Tpo $(DEPDIR)/standalone_la-api.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api.c' object='standalone_la-api.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o standalone_la-api.lo `test -f 'api.c' || echo '$(srcdir)/'`api.c standalone_la-buckets.lo: buckets.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT standalone_la-buckets.lo -MD -MP -MF $(DEPDIR)/standalone_la-buckets.Tpo -c -o standalone_la-buckets.lo `test -f 'buckets.c' || echo '$(srcdir)/'`buckets.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/standalone_la-buckets.Tpo $(DEPDIR)/standalone_la-buckets.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='buckets.c' object='standalone_la-buckets.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o standalone_la-buckets.lo `test -f 'buckets.c' || echo '$(srcdir)/'`buckets.c standalone_la-config.lo: config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT standalone_la-config.lo -MD -MP -MF $(DEPDIR)/standalone_la-config.Tpo -c -o standalone_la-config.lo `test -f 'config.c' || echo '$(srcdir)/'`config.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/standalone_la-config.Tpo $(DEPDIR)/standalone_la-config.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config.c' object='standalone_la-config.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o standalone_la-config.lo `test -f 'config.c' || echo '$(srcdir)/'`config.c standalone_la-filters.lo: filters.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT standalone_la-filters.lo -MD -MP -MF $(DEPDIR)/standalone_la-filters.Tpo -c -o standalone_la-filters.lo `test -f 'filters.c' || echo '$(srcdir)/'`filters.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/standalone_la-filters.Tpo $(DEPDIR)/standalone_la-filters.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='filters.c' object='standalone_la-filters.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o standalone_la-filters.lo `test -f 'filters.c' || echo '$(srcdir)/'`filters.c standalone_la-hooks.lo: hooks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT standalone_la-hooks.lo -MD -MP -MF $(DEPDIR)/standalone_la-hooks.Tpo -c -o standalone_la-hooks.lo `test -f 'hooks.c' || echo '$(srcdir)/'`hooks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/standalone_la-hooks.Tpo $(DEPDIR)/standalone_la-hooks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hooks.c' object='standalone_la-hooks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o standalone_la-hooks.lo `test -f 'hooks.c' || echo '$(srcdir)/'`hooks.c standalone_la-regex.lo: regex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT standalone_la-regex.lo -MD -MP -MF $(DEPDIR)/standalone_la-regex.Tpo -c -o standalone_la-regex.lo `test -f 'regex.c' || echo '$(srcdir)/'`regex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/standalone_la-regex.Tpo $(DEPDIR)/standalone_la-regex.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='regex.c' object='standalone_la-regex.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o standalone_la-regex.lo `test -f 'regex.c' || echo '$(srcdir)/'`regex.c standalone_la-server.lo: server.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -MT standalone_la-server.lo -MD -MP -MF $(DEPDIR)/standalone_la-server.Tpo -c -o standalone_la-server.lo `test -f 'server.c' || echo '$(srcdir)/'`server.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/standalone_la-server.Tpo $(DEPDIR)/standalone_la-server.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='server.c' object='standalone_la-server.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(standalone_la_CPPFLAGS) $(CPPFLAGS) $(standalone_la_CFLAGS) $(CFLAGS) -c -o standalone_la-server.lo `test -f 'server.c' || echo '$(srcdir)/'`server.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf ../apache2/.libs ../apache2/_libs -rm -rf ../apache2/libinjection/.libs ../apache2/libinjection/_libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(pkglibdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f ../apache2/$(DEPDIR)/$(am__dirstamp) -rm -f ../apache2/$(am__dirstamp) -rm -f ../apache2/libinjection/$(DEPDIR)/$(am__dirstamp) -rm -f ../apache2/libinjection/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ../apache2/$(DEPDIR) ../apache2/libinjection/$(DEPDIR) ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-pkglibLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ../apache2/$(DEPDIR) ../apache2/libinjection/$(DEPDIR) ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkglibLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pkglibLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkglibLTLIBRARIES install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-pkglibLTLIBRARIES .PRECIOUS: Makefile # FIXME: Standalone does not mean that it will be a nginx build. # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: modsecurity-2.9.5/standalone/modules.mk0000664000175000017500000000137714147005233021360 0ustar mhsvierulamhsvierulaMOD_SECURITY2 = mod_security2 apache2_config apache2_io apache2_util \ re re_operators re_actions re_tfns re_variables \ msc_logging msc_xml msc_multipart modsecurity msc_parsers msc_util msc_pcre \ persist_dbm msc_reqbody pdf_protect msc_geo msc_gsb msc_unicode acmp msc_lua H = re.h modsecurity.h msc_logging.h msc_multipart.h msc_parsers.h \ msc_pcre.h msc_util.h msc_xml.h persist_dbm.h apache2.h pdf_protect.h \ msc_geo.h msc_gsb.h msc_unicode.h acmp.h utf8tables.h msc_lua.h ${MOD_SECURITY2:=.slo}: ${H} ${MOD_SECURITY2:=.lo}: ${H} ${MOD_SECURITY2:=.o}: ${H} mod_security2.la: ${MOD_SECURITY2:=.slo} $(SH_LINK) -rpath $(libexecdir) -module -avoid-version ${MOD_SECURITY2:=.lo} DISTCLEAN_TARGETS = modules.mk shared = mod_security2.la modsecurity-2.9.5/standalone/config.c0000664000175000017500000010663014147005233020766 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #include #include #include "http_core.h" #include "http_request.h" #include "modsecurity.h" #include "apache2.h" #include "http_main.h" #include "http_connection.h" #include "apr_optional.h" #include "mod_log_config.h" #include "msc_logging.h" #include "msc_util.h" #include "ap_mpm.h" #include "scoreboard.h" #include "apr_version.h" #include "apr_lib.h" #include "ap_config.h" #include "http_config.h" #include "apr_fnmatch.h" AP_DECLARE(int) ap_cfg_closefile(ap_configfile_t *cfp) { #ifdef DEBUG ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL, "Done with config file %s", cfp->name); #endif return (cfp->close == NULL) ? 0 : cfp->close(cfp->param); } #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 static apr_status_t cfg_close(void *param) { apr_file_t *cfp = (apr_file_t *) param; return (apr_file_close(cfp)); } static int cfg_getch(void *param) { char ch; apr_file_t *cfp = (apr_file_t *) param; if (apr_file_getc(&ch, cfp) == APR_SUCCESS) return ch; return (int)EOF; } static void *cfg_getstr(void *buf, size_t bufsiz, void *param) { apr_file_t *cfp = (apr_file_t *) param; apr_status_t rv; rv = apr_file_gets(buf, bufsiz, cfp); if (rv == APR_SUCCESS) { return buf; } return NULL; } #else /* we can't use apr_file_* directly because of linking issues on Windows */ static apr_status_t cfg_close(void *param) { return apr_file_close(param); } static apr_status_t cfg_getch(char *ch, void *param) { return apr_file_getc(ch, param); } static apr_status_t cfg_getstr(void *buf, apr_size_t bufsiz, void *param) { return apr_file_gets(buf, bufsiz, param); } #endif /* Read one line from open ap_configfile_t, strip LF, increase line number */ /* If custom handler does not define a getstr() function, read char by char */ #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 AP_DECLARE(int) ap_cfg_getline(char *buf, size_t bufsize, ap_configfile_t *cfp) { /* If a "get string" function is defined, use it */ if (cfp->getstr != NULL) { char *src, *dst; char *cp; char *cbuf = buf; size_t cbufsize = bufsize; while (1) { ++cfp->line_number; if (cfp->getstr(cbuf, cbufsize, cfp->param) == NULL) return 1; /* * check for line continuation, * i.e. match [^\\]\\[\r]\n only */ cp = cbuf; while (cp < cbuf+cbufsize && *cp != '\0') cp++; if (cp > cbuf && cp[-1] == LF) { cp--; if (cp > cbuf && cp[-1] == CR) cp--; if (cp > cbuf && cp[-1] == '\\') { cp--; if (!(cp > cbuf && cp[-1] == '\\')) { /* * line continuation requested - * then remove backslash and continue */ cbufsize -= (cp-cbuf); cbuf = cp; continue; } else { /* * no real continuation because escaped - * then just remove escape character */ for ( ; cp < cbuf+cbufsize && *cp != '\0'; cp++) cp[0] = cp[1]; } } } break; } /* * Leading and trailing white space is eliminated completely */ src = buf; while (apr_isspace(*src)) ++src; /* blast trailing whitespace */ dst = &src[strlen(src)]; while (--dst >= src && apr_isspace(*dst)) *dst = '\0'; /* Zap leading whitespace by shifting */ if (src != buf) for (dst = buf; (*dst++ = *src++) != '\0'; ) ; #ifdef DEBUG_CFG_LINES ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL, "Read config: %s", buf); #endif return 0; } else { /* No "get string" function defined; read character by character */ register int c; register size_t i = 0; buf[0] = '\0'; /* skip leading whitespace */ do { c = cfp->getch(cfp->param); } while (c == '\t' || c == ' '); if (c == EOF) return 1; if(bufsize < 2) { /* too small, assume caller is crazy */ return 1; } while (1) { if ((c == '\t') || (c == ' ')) { buf[i++] = ' '; while ((c == '\t') || (c == ' ')) c = cfp->getch(cfp->param); } if (c == CR) { /* silently ignore CR (_assume_ that a LF follows) */ c = cfp->getch(cfp->param); } if (c == LF) { /* increase line number and return on LF */ ++cfp->line_number; } if (c == EOF || c == 0x4 || c == LF || i >= (bufsize - 2)) { /* * check for line continuation */ if (i > 0 && buf[i-1] == '\\') { i--; if (!(i > 0 && buf[i-1] == '\\')) { /* line is continued */ c = cfp->getch(cfp->param); continue; } /* else nothing needs be done because * then the backslash is escaped and * we just strip to a single one */ } /* blast trailing whitespace */ while (i > 0 && apr_isspace(buf[i - 1])) --i; buf[i] = '\0'; #ifdef DEBUG_CFG_LINES ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL, "Read config: %s", buf); #endif return 0; } buf[i] = c; ++i; c = cfp->getch(cfp->param); } } } #else static apr_status_t ap_cfg_getline_core(char *buf, apr_size_t bufsize, ap_configfile_t *cfp) { apr_status_t rc; /* If a "get string" function is defined, use it */ if (cfp->getstr != NULL) { char *cp; char *cbuf = buf; apr_size_t cbufsize = bufsize; while (1) { ++cfp->line_number; rc = cfp->getstr(cbuf, cbufsize, cfp->param); if (rc == APR_EOF) { if (cbuf != buf) { *cbuf = '\0'; break; } else { return APR_EOF; } } if (rc != APR_SUCCESS) { return rc; } /* * check for line continuation, * i.e. match [^\\]\\[\r]\n only */ cp = cbuf; cp += strlen(cp); if (cp > cbuf && cp[-1] == LF) { cp--; if (cp > cbuf && cp[-1] == CR) cp--; if (cp > cbuf && cp[-1] == '\\') { cp--; /* * line continuation requested - * then remove backslash and continue */ cbufsize -= (cp-cbuf); cbuf = cp; continue; } } else if (cp - buf >= bufsize - 1) { return APR_ENOSPC; } break; } } else { /* No "get string" function defined; read character by character */ apr_size_t i = 0; if (bufsize < 2) { /* too small, assume caller is crazy */ return APR_EINVAL; } buf[0] = '\0'; while (1) { char c; rc = cfp->getch(&c, cfp->param); if (rc == APR_EOF) { if (i > 0) break; else return APR_EOF; } if (rc != APR_SUCCESS) return rc; if (c == LF) { ++cfp->line_number; /* check for line continuation */ if (i > 0 && buf[i-1] == '\\') { i--; continue; } else { break; } } else if (i >= bufsize - 2) { return APR_ENOSPC; } buf[i] = c; ++i; } buf[i] = '\0'; } return APR_SUCCESS; } static int cfg_trim_line(char *buf) { char *start, *end; /* * Leading and trailing white space is eliminated completely */ start = buf; while (apr_isspace(*start)) ++start; /* blast trailing whitespace */ end = &start[strlen(start)]; while (--end >= start && apr_isspace(*end)) *end = '\0'; /* Zap leading whitespace by shifting */ if (start != buf) memmove(buf, start, end - start + 2); #ifdef DEBUG_CFG_LINES ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, NULL, APLOGNO(00555) "Read config: '%s'", buf); #endif return end - start + 1; } AP_DECLARE(apr_status_t) ap_cfg_getline(char *buf, apr_size_t bufsize, ap_configfile_t *cfp) { apr_status_t rc = ap_cfg_getline_core(buf, bufsize, cfp); if (rc == APR_SUCCESS) cfg_trim_line(buf); return rc; } #endif static char *substring_conf(apr_pool_t *p, const char *start, int len, char quote) { char *result = apr_palloc(p, len + 2); char *resp = result; int i; for (i = 0; i < len; ++i) { if (start[i] == '\\' && (start[i + 1] == '\\' || (quote && start[i + 1] == quote))) *resp++ = start[++i]; else *resp++ = start[i]; } *resp++ = '\0'; #if RESOLVE_ENV_PER_TOKEN return (char *)ap_resolve_env(p,result); #else return result; #endif } AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p, const char **line) { const char *str = *line, *strend; char *res; char quote; while (*str && apr_isspace(*str)) ++str; if (!*str) { *line = str; return ""; } if ((quote = *str) == '"' || quote == '\'') { strend = str + 1; while (*strend && *strend != quote) { if (*strend == '\\' && strend[1] && (strend[1] == quote || strend[1] == '\\')) { strend += 2; } else { ++strend; } } res = substring_conf(p, str + 1, strend - str - 1, quote); if (*strend == quote) ++strend; } else { strend = str; while (*strend && !apr_isspace(*strend)) ++strend; res = substring_conf(p, str, strend - str, 0); } while (*strend && apr_isspace(*strend)) ++strend; *line = strend; return res; } /* Open a ap_configfile_t as FILE, return open ap_configfile_t struct pointer */ AP_DECLARE(apr_status_t) ap_pcfg_openfile(ap_configfile_t **ret_cfg, apr_pool_t *p, const char *name) { ap_configfile_t *new_cfg; apr_file_t *file = NULL; apr_finfo_t finfo; apr_status_t status; int exist_type; #ifdef DEBUG char buf[120]; #endif if (name == NULL) { ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "Internal error: pcfg_openfile() called with NULL filename"); return APR_EBADF; } status = apr_file_open(&file, name, APR_READ | APR_BUFFERED, APR_OS_DEFAULT, p); #ifdef DEBUG ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL, "Opening config file %s (%s)", name, (status != APR_SUCCESS) ? apr_strerror(status, buf, sizeof(buf)) : "successful"); #endif if (status != APR_SUCCESS) return status; status = apr_file_info_get(&finfo, APR_FINFO_TYPE, file); if (status != APR_SUCCESS) return status; exist_type = (finfo.filetype != APR_REG); #if defined(WIN32) || defined(OS2) || defined(NETWARE) exist_type = (exist_type && strcasecmp(apr_filepath_name_get(name), "nul") != 0); #else exist_type = (exist_type && strcmp(name, "/dev/null") != 0); #endif /* WIN32 || OS2 */ if (exist_type){ ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "Access to file %s denied by server: not a regular file", name); apr_file_close(file); return APR_EBADF; } #ifdef WIN32 /* Some twisted character [no pun intended] at MS decided that a * zero width joiner as the lead wide character would be ideal for * describing Unicode text files. This was further convoluted to * another MSism that the same character mapped into utf-8, EF BB BF * would signify utf-8 text files. * * Since MS configuration files are all protecting utf-8 encoded * Unicode path, file and resource names, we already have the correct * WinNT encoding. But at least eat the stupid three bytes up front. */ { unsigned char buf[4]; apr_size_t len = 3; status = apr_file_read(file, buf, &len); if ((status != APR_SUCCESS) || (len < 3) || memcmp(buf, "\xEF\xBB\xBF", 3) != 0) { apr_off_t zero = 0; apr_file_seek(file, APR_SET, &zero); } } #endif new_cfg = apr_palloc(p, sizeof(*new_cfg)); new_cfg->param = file; new_cfg->name = apr_pstrdup(p, name); #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 new_cfg->getch = (int (*)(void *)) cfg_getch; new_cfg->getstr = (void *(*)(void *, size_t, void *)) cfg_getstr; new_cfg->close = (int (*)(void *)) cfg_close; #else new_cfg->getch = cfg_getch; new_cfg->getstr = cfg_getstr; new_cfg->close = cfg_close; #endif new_cfg->line_number = 0; *ret_cfg = new_cfg; return APR_SUCCESS; } AP_CORE_DECLARE(const command_rec *) ap_find_command(const char *name, const command_rec *cmds) { while (cmds->name) { if (!strcasecmp(name, cmds->name)) return cmds; ++cmds; } return NULL; } #define AP_MAX_ARGC 64 static const char *invoke_cmd(const command_rec *cmd, cmd_parms *parms, void *mconfig, const char *args) { char *w, *w2, *w3; const char *errmsg = NULL; if ((parms->override & cmd->req_override) == 0) return apr_pstrcat(parms->pool, cmd->name, " not allowed here", NULL); parms->info = cmd->cmd_data; parms->cmd = cmd; switch (cmd->args_how) { case RAW_ARGS: #ifdef RESOLVE_ENV_PER_TOKEN args = ap_resolve_env(parms->pool,args); #endif return cmd->AP_RAW_ARGS(parms, mconfig, args); case TAKE_ARGV: { char *argv[AP_MAX_ARGC]; int argc = 0; do { w = ap_getword_conf(parms->pool, &args); if (*w == '\0' && *args == '\0') { break; } argv[argc] = w; argc++; } while (argc < AP_MAX_ARGC && *args != '\0'); return cmd->AP_TAKE_ARGV(parms, mconfig, argc, argv); } case NO_ARGS: if (*args != 0) return apr_pstrcat(parms->pool, cmd->name, " takes no arguments", NULL); return cmd->AP_NO_ARGS(parms, mconfig); case TAKE1: w = ap_getword_conf(parms->pool, &args); if (*w == '\0' || *args != 0) return apr_pstrcat(parms->pool, cmd->name, " takes one argument", cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL); return cmd->AP_TAKE1(parms, mconfig, w); case TAKE2: w = ap_getword_conf(parms->pool, &args); w2 = ap_getword_conf(parms->pool, &args); if (*w == '\0' || *w2 == '\0' || *args != 0) return apr_pstrcat(parms->pool, cmd->name, " takes two arguments", cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL); return cmd->AP_TAKE2(parms, mconfig, w, w2); case TAKE12: w = ap_getword_conf(parms->pool, &args); w2 = ap_getword_conf(parms->pool, &args); if (*w == '\0' || *args != 0) return apr_pstrcat(parms->pool, cmd->name, " takes 1-2 arguments", cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL); return cmd->AP_TAKE2(parms, mconfig, w, *w2 ? w2 : NULL); case TAKE3: w = ap_getword_conf(parms->pool, &args); w2 = ap_getword_conf(parms->pool, &args); w3 = ap_getword_conf(parms->pool, &args); if (*w == '\0' || *w2 == '\0' || *w3 == '\0' || *args != 0) return apr_pstrcat(parms->pool, cmd->name, " takes three arguments", cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL); return cmd->AP_TAKE3(parms, mconfig, w, w2, w3); case TAKE23: w = ap_getword_conf(parms->pool, &args); w2 = ap_getword_conf(parms->pool, &args); w3 = *args ? ap_getword_conf(parms->pool, &args) : NULL; if (*w == '\0' || *w2 == '\0' || *args != 0) return apr_pstrcat(parms->pool, cmd->name, " takes two or three arguments", cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL); return cmd->AP_TAKE3(parms, mconfig, w, w2, w3); case TAKE123: w = ap_getword_conf(parms->pool, &args); w2 = *args ? ap_getword_conf(parms->pool, &args) : NULL; w3 = *args ? ap_getword_conf(parms->pool, &args) : NULL; if (*w == '\0' || *args != 0) return apr_pstrcat(parms->pool, cmd->name, " takes one, two or three arguments", cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL); return cmd->AP_TAKE3(parms, mconfig, w, w2, w3); case TAKE13: w = ap_getword_conf(parms->pool, &args); w2 = *args ? ap_getword_conf(parms->pool, &args) : NULL; w3 = *args ? ap_getword_conf(parms->pool, &args) : NULL; if (*w == '\0' || (w2 && *w2 && !w3) || *args != 0) return apr_pstrcat(parms->pool, cmd->name, " takes one or three arguments", cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL); return cmd->AP_TAKE3(parms, mconfig, w, w2, w3); case ITERATE: while (*(w = ap_getword_conf(parms->pool, &args)) != '\0') { errmsg = cmd->AP_TAKE1(parms, mconfig, w); if (errmsg && strcmp(errmsg, DECLINE_CMD) != 0) return errmsg; } return errmsg; case ITERATE2: w = ap_getword_conf(parms->pool, &args); if (*w == '\0' || *args == 0) return apr_pstrcat(parms->pool, cmd->name, " requires at least two arguments", cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL); while (*(w2 = ap_getword_conf(parms->pool, &args)) != '\0') { errmsg = cmd->AP_TAKE2(parms, mconfig, w, w2); if (errmsg && strcmp(errmsg, DECLINE_CMD) != 0) return errmsg; } return errmsg; case FLAG: w = ap_getword_conf(parms->pool, &args); if (*w == '\0' || (strcasecmp(w, "on") && strcasecmp(w, "off"))) return apr_pstrcat(parms->pool, cmd->name, " must be On or Off", NULL); return cmd->AP_FLAG(parms, mconfig, strcasecmp(w, "off") != 0); default: return apr_pstrcat(parms->pool, cmd->name, " is improperly configured internally (server bug)", NULL); } } #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 static cmd_parms default_parms = {NULL, 0, -1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; #endif #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER > 3 static cmd_parms default_parms = {NULL, 0, 0, NULL, -1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; #endif typedef struct { const char *fname; } fnames; AP_DECLARE(int) ap_is_directory(apr_pool_t *p, const char *path) { apr_finfo_t finfo; if (apr_stat(&finfo, path, APR_FINFO_TYPE, p) != APR_SUCCESS) return 0; /* in error condition, just return no */ return (finfo.filetype == APR_DIR); } AP_DECLARE(char *) ap_make_full_path(apr_pool_t *a, const char *src1, const char *src2) { apr_size_t len1, len2; char *path; len1 = strlen(src1); len2 = strlen(src2); /* allocate +3 for '/' delimiter, trailing NULL and overallocate * one extra byte to allow the caller to add a trailing '/' */ path = (char *)apr_palloc(a, len1 + len2 + 3); if (len1 == 0) { *path = '/'; memcpy(path + 1, src2, len2 + 1); } else { char *next; memcpy(path, src1, len1); next = path + len1; if (next[-1] != '/') { *next++ = '/'; } memcpy(next, src2, len2 + 1); } return path; } static int fname_reversealphasort(const void *fn1, const void *fn2) { const fnames *f1 = fn1; const fnames *f2 = fn2; return strcmp(f2->fname,f1->fname); } int fnmatch_test(const char *pattern) { int nesting; nesting = 0; while (*pattern) { switch (*pattern) { case '?': case '*': return 1; /* case '\\': if (*++pattern == '\0') { return 0; } break;*/ // this breaks on Windows case '[': /* '[' is only a glob if it has a matching ']' */ ++nesting; break; case ']': if (nesting) { return 1; } break; } ++pattern; } return 0; } AP_DECLARE(const char *) process_resource_config(const char *fname, apr_array_header_t *ari, apr_pool_t *ptemp) { *(char **)apr_array_push(ari) = (char *)fname; return NULL; } static const char *process_resource_config_nofnmatch(const char *fname, apr_array_header_t *ari, apr_pool_t *p, apr_pool_t *ptemp, unsigned depth, int optional) { const char *error; apr_status_t rv; if (ap_is_directory(ptemp, fname)) { apr_dir_t *dirp; apr_finfo_t dirent; int current; apr_array_header_t *candidates = NULL; fnames *fnew; char *path = apr_pstrdup(ptemp, fname); if (++depth > 100) { return apr_psprintf(p, "Directory %s exceeds the maximum include " "directory nesting level of %u. You have " "probably a recursion somewhere.", path, 100); } /* * first course of business is to grok all the directory * entries here and store 'em away. Recall we need full pathnames * for this. */ rv = apr_dir_open(&dirp, path, ptemp); if (rv != APR_SUCCESS) { char errmsg[120]; return apr_psprintf(p, "Could not open config directory %s: %s", path, apr_strerror(rv, errmsg, sizeof errmsg)); } candidates = apr_array_make(ptemp, 1, sizeof(fnames)); while (apr_dir_read(&dirent, APR_FINFO_DIRENT, dirp) == APR_SUCCESS) { /* strip out '.' and '..' */ if (strcmp(dirent.name, ".") && strcmp(dirent.name, "..")) { fnew = (fnames *) apr_array_push(candidates); fnew->fname = ap_make_full_path(ptemp, path, dirent.name); } } apr_dir_close(dirp); if (candidates->nelts != 0) { qsort((void *) candidates->elts, candidates->nelts, sizeof(fnames), fname_reversealphasort); /* * Now recurse these... we handle errors and subdirectories * via the recursion, which is nice */ for (current = 0; current < candidates->nelts; ++current) { fnew = &((fnames *) candidates->elts)[current]; error = process_resource_config_nofnmatch(fnew->fname, ari, p, ptemp, depth, optional); if (error) { return error; } } } return NULL; } return process_resource_config(fname, ari, ptemp); } static const char *process_resource_config_fnmatch(const char *path, const char *fname, apr_array_header_t *ari, apr_pool_t *p, apr_pool_t *ptemp, unsigned depth, int optional) { const char *rest; apr_status_t rv; apr_dir_t *dirp; apr_finfo_t dirent; apr_array_header_t *candidates = NULL; fnames *fnew; int current; /* find the first part of the filename */ rest = ap_strchr_c(fname, '/'); if(rest == NULL) rest = ap_strchr_c(fname, '\\'); if (rest) { fname = apr_pstrndup(ptemp, fname, rest - fname); rest++; } /* optimisation - if the filename isn't a wildcard, process it directly */ if (!fnmatch_test(fname)) { path = ap_make_full_path(ptemp, path, fname); if (!rest) { return process_resource_config_nofnmatch(path, ari, p, ptemp, 0, optional); } else { return process_resource_config_fnmatch(path, rest, ari, p, ptemp, 0, optional); } } /* * first course of business is to grok all the directory * entries here and store 'em away. Recall we need full pathnames * for this. */ rv = apr_dir_open(&dirp, path, ptemp); if (rv != APR_SUCCESS) { char errmsg[120]; return apr_psprintf(p, "Could not open config directory %s: %s", path, apr_strerror(rv, errmsg, sizeof errmsg)); } candidates = apr_array_make(ptemp, 1, sizeof(fnames)); while (apr_dir_read(&dirent, APR_FINFO_DIRENT | APR_FINFO_TYPE, dirp) == APR_SUCCESS) { /* strip out '.' and '..' */ if (strcmp(dirent.name, ".") && strcmp(dirent.name, "..") && (apr_fnmatch(fname, dirent.name, APR_FNM_PERIOD | APR_FNM_NOESCAPE | APR_FNM_PATHNAME) == APR_SUCCESS)) { const char *full_path = ap_make_full_path(ptemp, path, dirent.name); /* If matching internal to path, and we happen to match something * other than a directory, skip it */ if (rest && (rv == APR_SUCCESS) && (dirent.filetype != APR_DIR)) { continue; } fnew = (fnames *) apr_array_push(candidates); fnew->fname = full_path; } } apr_dir_close(dirp); if (candidates->nelts != 0) { const char *error; qsort((void *) candidates->elts, candidates->nelts, sizeof(fnames), fname_reversealphasort); /* * Now recurse these... we handle errors and subdirectories * via the recursion, which is nice */ for (current = 0; current < candidates->nelts; ++current) { fnew = &((fnames *) candidates->elts)[current]; if (!rest) { error = process_resource_config_nofnmatch(fnew->fname, ari, p, ptemp, 0, optional); } else { error = process_resource_config_fnmatch(fnew->fname, rest, ari, p, ptemp, 0, optional); } if (error) { return error; } } } else { if (!optional) { return apr_psprintf(p, "No matches for the wildcard '%s' in '%s', failing " "(use IncludeOptional if required)", fname, path); } } return NULL; } AP_DECLARE(const char *) process_fnmatch_configs(apr_array_header_t *ari, const char *fname, apr_pool_t *p, apr_pool_t *ptemp, int optional) { if (!fnmatch_test(fname)) { return process_resource_config(fname, ari, p); } else { apr_status_t status; const char *rootpath, *filepath = fname; /* locate the start of the directories proper */ status = apr_filepath_root(&rootpath, &filepath, APR_FILEPATH_TRUENAME | APR_FILEPATH_NATIVE, ptemp); /* we allow APR_SUCCESS and APR_EINCOMPLETE */ if (APR_ERELATIVE == status) { return apr_pstrcat(p, "Include must have an absolute path, ", fname, NULL); } else if (APR_EBADPATH == status) { return apr_pstrcat(p, "Include has a bad path, ", fname, NULL); } /* walk the filepath */ return process_resource_config_fnmatch(rootpath, filepath, ari, p, ptemp, 0, optional); } } const char *populate_include_files(apr_pool_t *p, apr_pool_t *ptemp, apr_array_header_t *ari, const char *fname, int optional) { return process_fnmatch_configs(ari, fname, p, ptemp, optional); } const char *process_command_config(server_rec *s, void *mconfig, apr_pool_t *p, apr_pool_t *ptemp, const char *filename) { const char *errmsg; char *l = apr_palloc (ptemp, MAX_STRING_LEN); const char *args = l; char *cmd_name, *w; const command_rec *cmd; apr_array_header_t *arr = apr_array_make(p, 1, sizeof(cmd_parms)); apr_array_header_t *ari = apr_array_make(p, 1, sizeof(char *)); cmd_parms *parms; apr_status_t status; ap_directive_t *newdir; int optional; char *err = NULL; char *rootpath, *incpath; int li; errmsg = populate_include_files(p, ptemp, ari, filename, 0); if(errmsg != NULL) goto Exit; while(ari->nelts != 0 || arr->nelts != 0) { if(ari->nelts > 0) { char *fn = *(char **)apr_array_pop(ari); parms = (cmd_parms *)apr_array_push(arr); *parms = default_parms; parms->pool = p; parms->temp_pool = ptemp; parms->server = s; parms->override = (RSRC_CONF | OR_ALL) & ~(OR_AUTHCFG | OR_LIMIT); parms->override_opts = OPT_ALL | OPT_SYM_OWNER | OPT_MULTI; status = ap_pcfg_openfile(&parms->config_file, p, fn); if(status != APR_SUCCESS) { apr_array_pop(arr); errmsg = apr_pstrcat(p, "Cannot open config file: ", fn, NULL); goto Exit; } } if (arr->nelts > 1024) { errmsg = "Exceeded the maximum include directory nesting level. You have " "probably a recursion somewhere."; goto Exit; } parms = (cmd_parms *)apr_array_pop(arr); if(parms == NULL) break; while (!(ap_cfg_getline(l, MAX_STRING_LEN, parms->config_file))) { if (*l == '#' || *l == '\0') continue; args = l; cmd_name = ap_getword_conf(p, &args); if (*cmd_name == '\0') continue; if (!strcasecmp(cmd_name, "IncludeOptional")) { optional = 1; goto ProcessInclude; } if (!strcasecmp(cmd_name, "Include")) { optional = 0; ProcessInclude: w = ap_getword_conf(parms->pool, &args); if (*w == '\0' || *args != 0) { ap_cfg_closefile(parms->config_file); errmsg = apr_pstrcat(parms->pool, "Include takes one argument", NULL); goto Exit; } incpath = w; /* locate the start of the directories proper */ status = apr_filepath_root(&rootpath, &incpath, APR_FILEPATH_TRUENAME | APR_FILEPATH_NATIVE, ptemp); /* we allow APR_SUCCESS and APR_EINCOMPLETE */ if (APR_ERELATIVE == status) { rootpath = apr_pstrdup(ptemp, parms->config_file->name); li = strlen(rootpath) - 1; while(li >= 0 && rootpath[li] != '/' && rootpath[li] != '\\') rootpath[li--] = 0; w = apr_pstrcat(p, rootpath, w, NULL); } else if (APR_EBADPATH == status) { ap_cfg_closefile(parms->config_file); errmsg = apr_pstrcat(p, "Include file has a bad path, ", w, NULL); goto Exit; } errmsg = populate_include_files(p, ptemp, ari, w, optional); *(cmd_parms *)apr_array_push(arr) = *parms; if(errmsg != NULL) goto Exit; // we don't want to close the current file yet // parms = NULL; break; } cmd = ap_find_command(cmd_name, security2_module.cmds); if(cmd == NULL) { // unknown command, should error // ap_cfg_closefile(parms->config_file); errmsg = apr_pstrcat(p, "Unknown command in config: ", cmd_name, NULL); goto Exit; } newdir = apr_pcalloc(p, sizeof(ap_directive_t)); newdir->filename = parms->config_file->name; newdir->line_num = parms->config_file->line_number; newdir->directive = cmd_name; newdir->args = apr_pstrdup(p, args); parms->directive = newdir; #ifdef WIN32 // some config commands fail in APR when there are file // permission issues or other OS-specific problems // __try { #endif errmsg = invoke_cmd(cmd, parms, mconfig, args); #ifdef WIN32 } __except(EXCEPTION_EXECUTE_HANDLER) { errmsg = "Command failed to execute (check file/folder permissions, syntax, etc.)."; } #endif if(errmsg != NULL) break; } if(parms != NULL) ap_cfg_closefile(parms->config_file); if(errmsg != NULL) break; } if (errmsg) { err = (char *)apr_palloc(p, 1024); if(parms != NULL) apr_snprintf(err, 1024, "Syntax error in config file %s, line %d: %s", parms->config_file->name, parms->config_file->line_number, errmsg); else apr_snprintf(err, 1024, "Syntax error in config file: %s", errmsg); } errmsg = err; Exit: while((parms = (cmd_parms *)apr_array_pop(arr)) != NULL) { ap_cfg_closefile(parms->config_file); } return errmsg; } modsecurity-2.9.5/standalone/standalone.vcxproj.filters0000664000175000017500000001604714147005233024573 0ustar mhsvierulamhsvierula {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hpp;hxx;hm;inl;inc;xsd {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {2d4a2f57-e994-4dad-888a-e61a65029abf} ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources ModSecurity Sources Standalone Sources Standalone Sources Standalone Sources Standalone Sources Standalone Sources Standalone Sources Standalone Sources Standalone Sources ModSecurity Sources ModSecurity Sources ModSecurity Headers ModSecurity Headers ModSecurity Headers ModSecurity Headers ModSecurity Headers ModSecurity Headers ModSecurity Headers ModSecurity Headers ModSecurity Headers ModSecurity Headers ModSecurity Headers ModSecurity Headers ModSecurity Headers ModSecurity Headers ModSecurity Headers ModSecurity Headers ModSecurity Headers ModSecurity Headers ModSecurity Headers Standalone Sources ModSecurity Headers ModSecurity Headers modsecurity-2.9.5/standalone/api.c0000664000175000017500000005273214147005233020275 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #include #include #include "http_core.h" #include "http_request.h" #include "modsecurity.h" #include "apache2.h" #include "http_main.h" #include "http_connection.h" #include "apr_optional.h" #include "mod_log_config.h" #include "msc_logging.h" #include "msc_util.h" #include "ap_mpm.h" #include "scoreboard.h" #include "apr_version.h" #include "apr_lib.h" #include "ap_config.h" #include "http_config.h" #include "api.h" #ifdef WIN32 #include "msc_status_engine.h" #endif extern void *modsecLogObj; extern void (*modsecLogHook)(void *obj, int level, char *str); extern int (*modsecDropAction)(request_rec *r); apr_status_t (*modsecReadBody)(request_rec *r, char *buf, unsigned int length, unsigned int *readcnt, int *is_eos); apr_status_t (*modsecReadResponse)(request_rec *r, char *buf, unsigned int length, unsigned int *readcnt, int *is_eos); apr_status_t (*modsecWriteBody)(request_rec *r, char *buf, unsigned int length); apr_status_t (*modsecWriteResponse)(request_rec *r, char *buf, unsigned int length); extern const char *process_command_config(server_rec *s, void *mconfig, apr_pool_t *p, apr_pool_t *ptemp, const char *filename); #define DECLARE_EXTERNAL_HOOK(ns,link,ret,name,args) \ extern ns##_HOOK_##name##_t *hookfn_##name; #define DECLARE_HOOK(ret,name,args) \ DECLARE_EXTERNAL_HOOK(ap,AP,ret,name,args) DECLARE_HOOK(int,pre_config,(apr_pool_t *pconf,apr_pool_t *plog, apr_pool_t *ptemp)) DECLARE_HOOK(int,post_config,(apr_pool_t *pconf,apr_pool_t *plog, apr_pool_t *ptemp,server_rec *s)) DECLARE_HOOK(void,child_init,(apr_pool_t *pchild, server_rec *s)) DECLARE_HOOK(int,process_connection,(conn_rec *c)) DECLARE_HOOK(int,post_read_request,(request_rec *r)) DECLARE_HOOK(int,fixups,(request_rec *r)) DECLARE_HOOK(void, error_log, (const char *file, int line, int level, apr_status_t status, const server_rec *s, const request_rec *r, apr_pool_t *pool, const char *errstr)) DECLARE_HOOK(int,log_transaction,(request_rec *r)) DECLARE_HOOK(void,insert_filter,(request_rec *r)) DECLARE_HOOK(void,insert_error_filter,(request_rec *r)) char *sa_name = "standalone"; const char *sa_name_argv[] = { "standalone", NULL }; server_rec *server; apr_pool_t *pool = NULL; apr_status_t ap_http_in_filter(ap_filter_t *f, apr_bucket_brigade *b, ap_input_mode_t mode, apr_read_type_e block, apr_off_t readbytes); apr_status_t ap_http_out_filter(ap_filter_t *f, apr_bucket_brigade *b); server_rec *modsecInit() { apr_initialize(); apr_pool_create(&pool, NULL); apr_hook_global_pool = pool; server = apr_palloc(pool, sizeof(server_rec)); server->addrs = apr_palloc(pool, sizeof(server_addr_rec)); server->addrs->host_addr = apr_palloc(pool, sizeof(apr_sockaddr_t)); server->addrs->host_addr->addr_str_len = 16; server->addrs->host_addr->family = AF_INET; server->addrs->host_addr->hostname = sa_name; #ifdef WIN32 server->addrs->host_addr->ipaddr_len = sizeof(IN_ADDR); #else server->addrs->host_addr->ipaddr_len = sizeof(struct in_addr); #endif server->addrs->host_addr->ipaddr_ptr = &server->addrs->host_addr->sa.sin.sin_addr; server->addrs->host_addr->pool = pool; server->addrs->host_addr->port = 80; #ifdef WIN32 server->addrs->host_addr->sa.sin.sin_addr.S_un.S_addr = 0x0100007f; #else server->addrs->host_addr->sa.sin.sin_addr.s_addr = 0x0100007f; #endif server->addrs->host_addr->sa.sin.sin_family = AF_INET; server->addrs->host_addr->sa.sin.sin_port = 80; server->addrs->host_addr->salen = sizeof(server->addrs->host_addr->sa); server->addrs->host_addr->servname = sa_name; server->addrs->host_port = 80; server->error_fname = "error.log"; server->error_log = NULL; server->limit_req_fields = 1024; server->limit_req_fieldsize = 1024; server->limit_req_line = 1024; #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 server->loglevel = APLOG_DEBUG; #endif server->lookup_defaults = NULL; server->module_config = NULL; server->names = NULL; #ifdef WIN32 server->path = "c:\\inetpub\\wwwroot"; #else server->path = "/var/www"; #endif server->pathlen = strlen(server->path); server->port = 80; server->process = apr_palloc(pool, sizeof(process_rec)); server->process->argc = 1; server->process->argv = sa_name_argv; server->process->pconf = pool; server->process->pool = pool; server->process->short_name = sa_name; server->server_admin = sa_name; server->server_hostname = sa_name; server->server_scheme = ""; server->timeout = 60 * 1000000;// 60 seconds server->wild_names = NULL; server->is_virtual = 0; ap_server_config_defines = apr_array_make(pool, 1, sizeof(char *)); // here we should add scoreboard handling for multiple processes and threads // ap_scoreboard_image = (scoreboard *)apr_palloc(pool, sizeof(scoreboard)); memset(ap_scoreboard_image, 0, sizeof(scoreboard)); // ---------- security2_module.module_index = 0; security2_module.register_hooks(pool); ap_register_input_filter("HTTP_IN", ap_http_in_filter, NULL, AP_FTYPE_RESOURCE); ap_register_output_filter("HTTP_OUT", ap_http_out_filter, NULL, AP_FTYPE_CONTENT_SET); return server; } apr_status_t ap_http_in_filter(ap_filter_t *f, apr_bucket_brigade *bb_out, ap_input_mode_t mode, apr_read_type_e block, apr_off_t readbytes) { char *tmp = NULL; apr_bucket *e = NULL; unsigned int readcnt = 0; int is_eos = 0; apr_bucket_brigade *bb_in; apr_bucket *after; apr_status_t rv; bb_in = modsecGetBodyBrigade(f->r); /* use request brigade */ if (bb_in != NULL) { if (!APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(bb_in))) { e = apr_bucket_eos_create(f->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb_in, e); } rv = apr_brigade_partition(bb_in, readbytes, &after); if (rv != APR_SUCCESS && rv != APR_INCOMPLETE) { return rv; } for (e = APR_BRIGADE_FIRST(bb_in); e != after; e = APR_BRIGADE_FIRST(bb_in)) { APR_BUCKET_REMOVE(e); APR_BRIGADE_INSERT_TAIL(bb_out, e); } return APR_SUCCESS; } /* call the callback */ if(modsecReadBody != NULL) { tmp = (char *)apr_palloc(f->r->pool, readbytes); modsecReadBody(f->r, tmp, readbytes, &readcnt, &is_eos); e = apr_bucket_pool_create(tmp, readcnt, f->r->pool, f->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb_out, e); if(is_eos) { e = apr_bucket_eos_create(f->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb_out, e); } return APR_SUCCESS; } /* cannot read request body */ e = apr_bucket_eos_create(f->c->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb_out, e); return APR_SUCCESS; } apr_status_t ap_http_out_filter(ap_filter_t *f, apr_bucket_brigade *b) { apr_bucket_brigade *bb_out = (apr_bucket_brigade *)f->ctx; APR_BRIGADE_CONCAT(bb_out, b); return APR_SUCCESS; } void modsecTerminate() { apr_pool_destroy(pool); pool = NULL; apr_terminate(); } void modsecStartConfig() { apr_pool_t *ptemp = NULL; apr_pool_create(&ptemp, pool); hookfn_pre_config(pool, pool, ptemp); apr_pool_destroy(ptemp); } directory_config *modsecGetDefaultConfig() { return (directory_config *)security2_module.create_dir_config(pool, NULL); } const char *modsecProcessConfig(directory_config *config, const char *file, const char *dir) { apr_pool_t *ptemp = NULL; const char *err; apr_status_t status; const char *rootpath, *incpath; if(dir == NULL || strlen(dir) == 0) #ifdef WIN32 dir = "\\"; #else dir = "/"; #endif incpath = file; /* locate the start of the directories proper */ status = apr_filepath_root(&rootpath, &incpath, APR_FILEPATH_TRUENAME | APR_FILEPATH_NATIVE, config->mp); /* we allow APR_SUCCESS and APR_EINCOMPLETE */ if (APR_ERELATIVE == status) { int li = strlen(dir) - 1; if(dir[li] != '/' && dir[li] != '\\') #ifdef WIN32 file = apr_pstrcat(config->mp, dir, "\\", file, NULL); #else file = apr_pstrcat(config->mp, dir, "/", file, NULL); #endif else file = apr_pstrcat(config->mp, dir, file, NULL); } else if (APR_EBADPATH == status) { return apr_pstrcat(config->mp, "Config file has a bad path, ", file, NULL); } apr_pool_create(&ptemp, config->mp); err = process_command_config(server, config, config->mp, ptemp, file); apr_pool_destroy(ptemp); return err; } void modsecFinalizeConfig() { apr_pool_t *ptemp = NULL; apr_pool_create(&ptemp, pool); hookfn_post_config(pool, pool, ptemp, server); hookfn_post_config(pool, pool, ptemp, server); apr_pool_destroy(ptemp); } void modsecInitProcess() { hookfn_child_init(pool, server); } conn_rec *modsecNewConnection() { conn_rec *c; apr_pool_t *pc = NULL; apr_pool_create(&pc, pool); c = apr_pcalloc(pc, sizeof(conn_rec)); c->base_server = server; c->id = 1; c->local_addr = server->addrs->host_addr; c->local_host = sa_name; c->local_ip = "127.0.0.1"; c->pool = pc; c->remote_host = sa_name; #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 c->remote_ip = "127.0.0.1"; c->remote_addr = server->addrs->host_addr; #else c->client_ip = "127.0.0.1"; c->client_addr = server->addrs->host_addr; #endif c->input_filters = NULL; c->output_filters = NULL; c->bucket_alloc = apr_bucket_alloc_create(pc); return c; } void modsecProcessConnection(conn_rec *c) { hookfn_process_connection(c); } request_rec *modsecNewRequest(conn_rec *connection, directory_config *config) { request_rec *r; apr_pool_t *pr = NULL; apr_pool_create(&pr, connection->pool); r = apr_pcalloc(pr, sizeof(request_rec)); r->connection = connection; r->server = server; r->pool = pr; r->main = NULL; r->next = NULL; r->notes = apr_table_make(pr, 10); r->per_dir_config = apr_palloc(pr, sizeof(void *)); ((void **)r->per_dir_config)[0] = config; r->prev = NULL; r->subprocess_env = apr_table_make(pr, 10); apr_table_setn(r->subprocess_env, "UNIQUE_ID", "unique_id"); r->user = NULL; r->headers_in = apr_table_make(pr, 10); r->headers_out = apr_table_make(pr, 10); r->err_headers_out = apr_table_make(pr, 10); //apr_table_setn(r->headers_in, "Host", "www.google.com"); //apr_table_setn(r->headers_in, "", ""); r->the_request = "GET /../../index.html HTTP/1.1"; r->method = "GET"; r->method_number = M_GET; r->protocol = "HTTP/1.1"; r->uri = "http://www.google.com/../../index.html"; r->args = ""; r->filename = "/../../index.html"; r->handler = "IIS"; r->parsed_uri.scheme = "http"; r->parsed_uri.path = "/../../index.html"; r->parsed_uri.hostname = "www.google.com"; r->parsed_uri.is_initialized = 1; r->parsed_uri.port = 1234; r->parsed_uri.port_str = "1234"; r->parsed_uri.query = ""; r->parsed_uri.dns_looked_up = 0; r->parsed_uri.dns_resolved = 0; r->parsed_uri.password = NULL; r->parsed_uri.user = NULL; r->parsed_uri.fragment = ""; r->input_filters = NULL; r->output_filters = NULL; return r; } static modsec_rec *retrieve_msr(request_rec *r) { modsec_rec *msr = NULL; request_rec *rx = NULL; /* Look in the current request first. */ msr = (modsec_rec *)apr_table_get(r->notes, NOTE_MSR); if (msr != NULL) { msr->r = r; return msr; } /* If this is a subrequest then look in the main request. */ if (r->main != NULL) { msr = (modsec_rec *)apr_table_get(r->main->notes, NOTE_MSR); if (msr != NULL) { msr->r = r; return msr; } } /* If the request was redirected then look in the previous requests. */ rx = r->prev; while(rx != NULL) { msr = (modsec_rec *)apr_table_get(rx->notes, NOTE_MSR); if (msr != NULL) { msr->r = r; return msr; } rx = rx->prev; } return NULL; } int modsecProcessRequestHeaders(request_rec *r) { return hookfn_post_read_request(r); } int modsecProcessRequestBody(request_rec *r) { int status = DECLINED; modsec_rec *msr = NULL; ap_filter_t *f = ap_add_input_filter("HTTP_IN", NULL, r, r->connection); apr_bucket_brigade* bb_out; status = hookfn_fixups(r); ap_remove_input_filter(f); if (status != DECLINED) { return status; } hookfn_insert_filter(r); /* Find the transaction context first. */ msr = retrieve_msr(r); if (msr == NULL) return status; bb_out = modsecGetBodyBrigade(r); if (bb_out) { (void) apr_brigade_cleanup(bb_out); status = ap_get_brigade(r->input_filters, bb_out, AP_MODE_READBYTES, APR_BLOCK_READ, -1); if (status == APR_SUCCESS) { return DECLINED; } return status; } if(msr->stream_input_data != NULL && modsecWriteBody != NULL) { // target is responsible for copying the data into correctly managed buffer // modsecWriteBody(r, msr->stream_input_data, msr->stream_input_length); free(msr->stream_input_data); msr->stream_input_data = NULL; } // leftover code possibly for future use // //if(r->input_filters != NULL && r->input_filters->frec->filter_init_func != NULL) //r->input_filters->frec->filter_init_func(r->input_filters); //if(r->input_filters != NULL && r->input_filters->frec->filter_func.in_func != NULL) //r->input_filters->frec->filter_func.in_func(r->input_filters, NULL, 0, 0, 0); return status; } void modsecSetConfigForIISRequestBody(request_rec *r) { modsec_rec *msr = retrieve_msr(r); if(msr == NULL || msr->txcfg == NULL) return; if(msr->txcfg->reqbody_access) msr->txcfg->stream_inbody_inspection = 1; } int modsecContextState(request_rec *r) { modsec_rec *msr = retrieve_msr(r); if(msr == NULL || msr->txcfg == NULL) return NOT_SET; return msr->txcfg->is_enabled; } int modsecIsRequestBodyAccessEnabled(request_rec *r) { modsec_rec *msr = retrieve_msr(r); if(msr == NULL || msr->txcfg == NULL) return 0; return msr->txcfg->reqbody_access; } int modsecIsResponseBodyAccessEnabled(request_rec *r) { modsec_rec *msr = retrieve_msr(r); if(msr == NULL || msr->txcfg == NULL) return 0; return msr->txcfg->resbody_access; } int modsecProcessResponse(request_rec *r) { int status; modsec_rec *msr; apr_bucket *e; ap_filter_t *f; apr_bucket_brigade *bb_in, *bb_out, *bb; if(r->output_filters == NULL) { return DECLINED; } msr = (modsec_rec *)r->output_filters->ctx; if (msr == NULL) { ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r->server, "ModSecurity: Internal Error: msr is null in output filter."); ap_remove_output_filter(r->output_filters); return APR_EGENERAL; } msr->r = r; /* create input response brigade */ bb_in = apr_brigade_create(msr->mp, r->connection->bucket_alloc); if (bb_in == NULL) { msr_log(msr, 1, "Process response: Failed to create brigade."); return APR_EGENERAL; } /* get input response brigade */ bb = modsecGetResponseBrigade(r); if (bb != NULL) { APR_BRIGADE_CONCAT(bb_in, bb); if (!APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(bb_in))) { e = apr_bucket_eos_create(bb_in->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb_in, e); } } else if (modsecReadResponse != NULL) { unsigned int readcnt = 0; int is_eos = 0; char buf[8192]; while(!is_eos) { modsecReadResponse(r, buf, 8192, &readcnt, &is_eos); if(readcnt > 0) { char *tmp = (char *)apr_palloc(r->pool, readcnt); memcpy(tmp, buf, readcnt); e = apr_bucket_pool_create(tmp, readcnt, r->pool, r->connection->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb_in, e); } } e = apr_bucket_eos_create(r->connection->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb_in, e); } else { /* cannot read response body process header only */ e = apr_bucket_eos_create(r->connection->bucket_alloc); APR_BRIGADE_INSERT_TAIL(bb_in, e); } bb_out = bb ? bb : apr_brigade_create(msr->mp, r->connection->bucket_alloc); if (bb_out == NULL) { msr_log(msr, 1, "Process response: Failed to create brigade."); return APR_EGENERAL; } /* concat output bucket to bb_out */ f = ap_add_output_filter("HTTP_OUT", bb_out, r, r->connection); status = ap_pass_brigade(r->output_filters, bb_in); ap_remove_output_filter(f); if (status == APR_EGENERAL) { /* retrive response status from bb_out */ for(e = APR_BRIGADE_FIRST(bb_out); e != APR_BRIGADE_SENTINEL(bb_out); e = APR_BUCKET_NEXT(e)) { if (AP_BUCKET_IS_ERROR(e)) { return ((ap_bucket_error*) e->data)->status; } } return APR_EGENERAL; } if (status != DECLINED) { return status; } /* copy bb_out */ // is there a way to tell whether the response body was modified or not? if (modsecWriteResponse != NULL && (msr->txcfg->content_injection_enabled || msr->content_prepend_len != 0 || msr->content_append_len != 0) && msr->txcfg->resbody_access) { char *data = NULL; apr_size_t length; status = apr_brigade_pflatten(msr->of_brigade, &data, &length, msr->mp); if (status != APR_SUCCESS) { msr_log(msr, 1, "Output filter: Failed to flatten brigade (%d): %s", status, get_apr_error(msr->mp, status)); return APR_EGENERAL; } if ( modsecWriteResponse(msr->r, data, msr->stream_output_length) != APR_SUCCESS) { return APR_EGENERAL; } } return DECLINED; } int modsecFinishRequest(request_rec *r) { // run output filter //if(r->output_filters != NULL && r->output_filters->frec->filter_init_func != NULL) //r->output_filters->frec->filter_init_func(r->output_filters); hookfn_log_transaction(r); // make sure you cleanup before calling apr_terminate() // otherwise double-free might occur, because of the request body pool cleanup function // apr_pool_destroy(r->pool); return DECLINED; } // destroy only the connection pool int modsecFinishConnection(conn_rec *c) { apr_pool_destroy(c->pool); return 0; } void modsecSetLogHook(void *obj, void (*hook)(void *obj, int level, char *str)) { modsecLogObj = obj; modsecLogHook = hook; } void modsecSetReadBody(apr_status_t (*func)(request_rec *r, char *buf, unsigned int length, unsigned int *readcnt, int *is_eos)) { modsecReadBody = func; } void modsecSetReadResponse(apr_status_t (*func)(request_rec *r, char *buf, unsigned int length, unsigned int *readcnt, int *is_eos)) { modsecReadResponse = func; } void modsecSetWriteBody(apr_status_t (*func)(request_rec *r, char *buf, unsigned int length)) { modsecWriteBody = func; } void modsecSetWriteResponse(apr_status_t (*func)(request_rec *r, char *buf, unsigned int length)) { modsecWriteResponse = func; } void modsecSetDropAction(int (*func)(request_rec *r)) { modsecDropAction = func; } /* * Case SecServerSignature was used, this function returns the banner that * should be used, otherwise it returns NULL. */ const char *modsecIsServerSignatureAvailale(void) { return new_server_signature; } #ifdef VERSION_IIS void modsecStatusEngineCall() { if (status_engine_state != STATUS_ENGINE_DISABLED) { msc_status_engine_call(); } else { ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, NULL, "Status engine is currently disabled, enable it by set " \ "SecStatusEngine to On.\n"); } } void modsecReportRemoteLoadedRules() { #ifdef WITH_REMOTE_RULES if (remote_rules_server != NULL) { if (remote_rules_server->amount_of_rules == 1) { ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, NULL, "ModSecurity: Loaded %d rule from: '%s'.", remote_rules_server->amount_of_rules, remote_rules_server->uri); } else { ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, NULL, "ModSecurity: Loaded %d rules from: '%s'.", remote_rules_server->amount_of_rules, remote_rules_server->uri); } } #endif if (remote_rules_fail_message != NULL) { ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, NULL, "ModSecurity: " \ "Problems loading external resources: %s", remote_rules_fail_message); } } #endif modsecurity-2.9.5/standalone/regex.c0000664000175000017500000001023214147005233020623 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #include #include "http_core.h" #include "http_request.h" #include "modsecurity.h" #include "apache2.h" #include "http_main.h" #include "http_connection.h" #include "apr_optional.h" #include "mod_log_config.h" #include "msc_logging.h" #include "msc_util.h" #include "ap_mpm.h" #include "scoreboard.h" #include "apr_version.h" #include "apr_lib.h" #include "ap_config.h" #include "http_config.h" static apr_status_t regex_cleanup(void *preg) { ap_regfree((ap_regex_t *) preg); return APR_SUCCESS; } AP_DECLARE(ap_regex_t *) ap_pregcomp(apr_pool_t *p, const char *pattern, int cflags) { ap_regex_t *preg = apr_palloc(p, sizeof *preg); if (ap_regcomp(preg, pattern, cflags)) { return NULL; } apr_pool_cleanup_register(p, (void *) preg, regex_cleanup, apr_pool_cleanup_null); return preg; } AP_DECLARE(void) ap_regfree(ap_regex_t *preg) { (pcre_free)(preg->re_pcre); } AP_DECLARE(int) ap_regcomp(ap_regex_t *preg, const char *pattern, int cflags) { const char *errorptr; int erroffset; int options = 0; int nsub = 0; if ((cflags & AP_REG_ICASE) != 0) options |= PCRE_CASELESS; if ((cflags & AP_REG_NEWLINE) != 0) options |= PCRE_MULTILINE; preg->re_pcre = pcre_compile(pattern, options, &errorptr, &erroffset, NULL); preg->re_erroffset = erroffset; if (preg->re_pcre == NULL) return AP_REG_INVARG; pcre_fullinfo((const pcre *)preg->re_pcre, NULL, PCRE_INFO_CAPTURECOUNT, &nsub); preg->re_nsub = nsub; return 0; } #ifndef POSIX_MALLOC_THRESHOLD #define POSIX_MALLOC_THRESHOLD (10) #endif AP_DECLARE(int) ap_regexec(const ap_regex_t *preg, const char *string, apr_size_t nmatch, ap_regmatch_t pmatch[], int eflags) { int rc; int options = 0; int *ovector = NULL; int small_ovector[POSIX_MALLOC_THRESHOLD * 3]; int allocated_ovector = 0; if ((eflags & AP_REG_NOTBOL) != 0) options |= PCRE_NOTBOL; if ((eflags & AP_REG_NOTEOL) != 0) options |= PCRE_NOTEOL; ((ap_regex_t *)preg)->re_erroffset = (apr_size_t)(-1); /* Only has meaning after compile */ if (nmatch > 0) { if (nmatch <= POSIX_MALLOC_THRESHOLD) { ovector = &(small_ovector[0]); } else { ovector = (int *)malloc(sizeof(int) * nmatch * 3); if (ovector == NULL) return AP_REG_ESPACE; allocated_ovector = 1; } } rc = pcre_exec((const pcre *)preg->re_pcre, NULL, string, (int)strlen(string), 0, options, ovector, nmatch * 3); if (rc == 0) rc = nmatch; /* All captured slots were filled in */ if (rc >= 0) { apr_size_t i; for (i = 0; i < (apr_size_t)rc; i++) { pmatch[i].rm_so = ovector[i*2]; pmatch[i].rm_eo = ovector[i*2+1]; } if (allocated_ovector) free(ovector); for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1; return 0; } else { if (allocated_ovector) free(ovector); switch(rc) { case PCRE_ERROR_NOMATCH: return AP_REG_NOMATCH; case PCRE_ERROR_NULL: return AP_REG_INVARG; case PCRE_ERROR_BADOPTION: return AP_REG_INVARG; case PCRE_ERROR_BADMAGIC: return AP_REG_INVARG; case PCRE_ERROR_UNKNOWN_NODE: return AP_REG_ASSERT; case PCRE_ERROR_NOMEMORY: return AP_REG_ESPACE; #ifdef PCRE_ERROR_MATCHLIMIT case PCRE_ERROR_MATCHLIMIT: return AP_REG_ESPACE; #endif #ifdef PCRE_ERROR_BADUTF8 case PCRE_ERROR_BADUTF8: return AP_REG_INVARG; #endif #ifdef PCRE_ERROR_BADUTF8_OFFSET case PCRE_ERROR_BADUTF8_OFFSET: return AP_REG_INVARG; #endif default: return AP_REG_ASSERT; } } } modsecurity-2.9.5/standalone/filters.c0000664000175000017500000001614314147005233021170 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #include #include "http_core.h" #include "http_request.h" #include "modsecurity.h" #include "apache2.h" #include "http_main.h" #include "http_connection.h" #include "apr_optional.h" #include "mod_log_config.h" #include "msc_logging.h" #include "msc_util.h" #include "ap_mpm.h" #include "scoreboard.h" #include "apr_version.h" #include "apr_lib.h" #include "ap_config.h" #include "http_config.h" #define FILTER_POOL apr_hook_global_pool #include "apr_hooks.h" /* ** This macro returns true/false if a given filter should be inserted BEFORE ** another filter. This will happen when one of: 1) there isn't another ** filter; 2) that filter has a higher filter type (class); 3) that filter ** corresponds to a different request. */ #define INSERT_BEFORE(f, before_this) ((before_this) == NULL \ || (before_this)->frec->ftype > (f)->frec->ftype \ || (before_this)->r != (f)->r) apr_table_t *ms_input_filters = NULL; apr_table_t *ms_output_filters = NULL; void init_filter_tables() { if(ms_input_filters == NULL) { ms_input_filters = apr_table_make(FILTER_POOL, 10); ms_output_filters = apr_table_make(FILTER_POOL, 10); } } AP_DECLARE(ap_filter_rec_t *) ap_register_input_filter(const char *name, ap_in_filter_func filter_func, ap_init_filter_func filter_init, ap_filter_type ftype) { ap_filter_rec_t *f; init_filter_tables(); f = apr_palloc(FILTER_POOL, sizeof(ap_filter_rec_t)); f->filter_func.in_func = filter_func; f->filter_init_func = filter_init; f->ftype = ftype; f->name = name; apr_table_setn(ms_input_filters, name, (const char *)f); return f; } AP_DECLARE(ap_filter_rec_t *) ap_register_output_filter(const char *name, ap_out_filter_func filter_func, ap_init_filter_func filter_init, ap_filter_type ftype) { ap_filter_rec_t *f; init_filter_tables(); f = apr_palloc(FILTER_POOL, sizeof(ap_filter_rec_t)); f->filter_func.out_func = filter_func; f->filter_init_func = filter_init; f->ftype = ftype; f->name = name; apr_table_setn(ms_output_filters, name, (const char *)f); return f; } static ap_filter_t *add_any_filter_handle(ap_filter_rec_t *frec, void *ctx, request_rec *r, conn_rec *c, ap_filter_t **r_filters, ap_filter_t **p_filters, ap_filter_t **c_filters) { apr_pool_t* p = r ? r->pool : c->pool; ap_filter_t *f = apr_palloc(p, sizeof(*f)); ap_filter_t **outf; if (frec->ftype < AP_FTYPE_PROTOCOL) { if (r) { outf = r_filters; } else { ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "a content filter was added without a request: %s", frec->name); return NULL; } } else if (frec->ftype < AP_FTYPE_CONNECTION) { if (r) { outf = p_filters; } else { ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "a protocol filter was added without a request: %s", frec->name); return NULL; } } else { outf = c_filters; } f->frec = frec; f->ctx = ctx; f->r = r; f->c = c; f->next = NULL; if (INSERT_BEFORE(f, *outf)) { f->next = *outf; if (*outf) { ap_filter_t *first = NULL; if (r) { /* If we are adding our first non-connection filter, * Then don't try to find the right location, it is * automatically first. */ if (*r_filters != *c_filters) { first = *r_filters; while (first && (first->next != (*outf))) { first = first->next; } } } if (first && first != (*outf)) { first->next = f; } } *outf = f; } else { ap_filter_t *fscan = *outf; while (!INSERT_BEFORE(f, fscan->next)) fscan = fscan->next; f->next = fscan->next; fscan->next = f; } if (frec->ftype < AP_FTYPE_CONNECTION && (*r_filters == *c_filters)) { *r_filters = *p_filters; } return f; } AP_DECLARE(ap_filter_t *) ap_add_input_filter(const char *name, void *ctx, request_rec *r, conn_rec *c) { ap_filter_rec_t *f = (ap_filter_rec_t *)apr_table_get(ms_input_filters, name); if(f == NULL) return NULL; return add_any_filter_handle(f, ctx, r, c, r ? &r->input_filters : NULL, r ? &r->proto_input_filters : NULL, &c->input_filters); } AP_DECLARE(ap_filter_t *) ap_add_output_filter(const char *name, void *ctx, request_rec *r, conn_rec *c) { ap_filter_rec_t *f = (ap_filter_rec_t *)apr_table_get(ms_output_filters, name); if(f == NULL) return NULL; return add_any_filter_handle(f, ctx, r, c, r ? &r->output_filters : NULL, r ? &r->proto_output_filters : NULL, &c->output_filters); } static void remove_any_filter(ap_filter_t *f, ap_filter_t **r_filt, ap_filter_t **p_filt, ap_filter_t **c_filt) { ap_filter_t **curr = r_filt ? r_filt : c_filt; ap_filter_t *fscan = *curr; if (p_filt && *p_filt == f) *p_filt = (*p_filt)->next; if (*curr == f) { *curr = (*curr)->next; return; } while (fscan->next != f) { if (!(fscan = fscan->next)) { return; } } fscan->next = f->next; } AP_DECLARE(void) ap_remove_input_filter(ap_filter_t *f) { remove_any_filter(f, f->r ? &f->r->input_filters : NULL, f->r ? &f->r->proto_input_filters : NULL, &f->c->input_filters); } AP_DECLARE(void) ap_remove_output_filter(ap_filter_t *f) { remove_any_filter(f, f->r ? &f->r->output_filters : NULL, f->r ? &f->r->proto_output_filters : NULL, &f->c->output_filters); } modsecurity-2.9.5/standalone/buckets.c0000664000175000017500000001303614147005233021156 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #include #include "http_core.h" #include "http_request.h" #include "modsecurity.h" #include "apache2.h" #include "http_main.h" #include "http_connection.h" #include "apr_optional.h" #include "mod_log_config.h" #include "msc_logging.h" #include "msc_util.h" #include "ap_mpm.h" #include "scoreboard.h" #include "apr_version.h" #include "apr_lib.h" #include "ap_config.h" #include "http_config.h" #include "apr_buckets.h" AP_DECLARE(apr_status_t) ap_get_brigade(ap_filter_t *next, apr_bucket_brigade *bb, ap_input_mode_t mode, apr_read_type_e block, apr_off_t readbytes) { if (next) { return next->frec->filter_func.in_func(next, bb, mode, block, readbytes); } return AP_NOBODY_READ; } AP_DECLARE(apr_status_t) ap_pass_brigade(ap_filter_t *next, apr_bucket_brigade *bb) { if (next) { apr_bucket *e; if ((e = APR_BRIGADE_LAST(bb)) && APR_BUCKET_IS_EOS(e) && next->r) { /* This is only safe because HTTP_HEADER filter is always in * the filter stack. This ensures that there is ALWAYS a * request-based filter that we can attach this to. If the * HTTP_FILTER is removed, and another filter is not put in its * place, then handlers like mod_cgi, which attach their own * EOS bucket to the brigade will be broken, because we will * get two EOS buckets on the same request. */ next->r->eos_sent = 1; /* remember the eos for internal redirects, too */ if (next->r->prev) { request_rec *prev = next->r->prev; while (prev) { prev->eos_sent = 1; prev = prev->prev; } } } return next->frec->filter_func.out_func(next, bb); } return AP_NOBODY_WROTE; } AP_DECLARE(apr_status_t) ap_save_brigade(ap_filter_t *f, apr_bucket_brigade **saveto, apr_bucket_brigade **b, apr_pool_t *p) { apr_bucket *e; apr_status_t rv, srv = APR_SUCCESS; /* If have never stored any data in the filter, then we had better * create an empty bucket brigade so that we can concat. */ if (!(*saveto)) { *saveto = apr_brigade_create(p, f->c->bucket_alloc); } for (e = APR_BRIGADE_FIRST(*b); e != APR_BRIGADE_SENTINEL(*b); e = APR_BUCKET_NEXT(e)) { rv = apr_bucket_setaside(e, p); /* If the bucket type does not implement setaside, then * (hopefully) morph it into a bucket type which does, and set * *that* aside... */ if (rv == APR_ENOTIMPL) { const char *s; apr_size_t n; rv = apr_bucket_read(e, &s, &n, APR_BLOCK_READ); if (rv == APR_SUCCESS) { rv = apr_bucket_setaside(e, p); } } if (rv != APR_SUCCESS) { srv = rv; /* Return an error but still save the brigade if * ->setaside() is really not implemented. */ if (rv != APR_ENOTIMPL) { return rv; } } } APR_BRIGADE_CONCAT(*saveto, *b); return srv; } static apr_status_t error_bucket_read(apr_bucket *b, const char **str, apr_size_t *len, apr_read_type_e block) { *str = "Unknown error."; *len = strlen(*str); return APR_SUCCESS; } static void error_bucket_destroy(void *data) { ap_bucket_error *h = data; if (apr_bucket_shared_destroy(h)) { apr_bucket_free(h); } } AP_DECLARE_DATA const apr_bucket_type_t ap_bucket_type_error = { "ERROR", 5, APR_BUCKET_METADATA, error_bucket_destroy, error_bucket_read, apr_bucket_setaside_notimpl, apr_bucket_split_notimpl, apr_bucket_shared_copy }; AP_DECLARE(apr_bucket *) ap_bucket_error_make(apr_bucket *b, int error, const char *buf, apr_pool_t *p) { ap_bucket_error *h; h = apr_bucket_alloc(sizeof(*h), b->list); h->status = error; h->data = (buf) ? apr_pstrdup(p, buf) : NULL; b = apr_bucket_shared_make(b, h, 0, 0); b->type = &ap_bucket_type_error; return b; } AP_DECLARE(apr_bucket *) ap_bucket_error_create(int error, const char *buf, apr_pool_t *p, apr_bucket_alloc_t *list) { apr_bucket *b = apr_bucket_alloc(sizeof(*b), list); APR_BUCKET_INIT(b); b->free = apr_bucket_free; b->list = list; return ap_bucket_error_make(b, error, buf, p); } modsecurity-2.9.5/standalone/standalone.vcxproj0000664000175000017500000003563014147005233023123 0ustar mhsvierulamhsvierula Debug Win32 Debug x64 Release Win32 Release x64 {20EC871F-B6A0-4398-9B67-A33598A796E8} standalone Application true MultiByte Application true MultiByte Application false true MultiByte Application false true MultiByte Level3 Disabled C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2;c:\work\apache24\include _MBCS;%(PreprocessorDefinitions);WIN32;WINNT;inline=APR_INLINE;AP_DECLARE_STATIC;VERSION_STANDALONE 4244;4018 true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies);libapr-1.lib;libaprutil-1.lib;pcre.lib;libxml2.lib c:\drop\x86 Level3 Disabled C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2 _MBCS;%(PreprocessorDefinitions);WIN32;WINNT;inline=APR_INLINE;AP_DECLARE_STATIC 4244;4018 true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies);libapr-1.lib;libaprutil-1.lib;pcre.lib;libxml2.lib c:\drop\amd64 Level3 MaxSpeed true true C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2 true true true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies);libapr-1.lib;libaprutil-1.lib;pcre.lib;libxml2.lib c:\drop\x86 Level3 MaxSpeed true true C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2 true true true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies);libapr-1.lib;libaprutil-1.lib;pcre.lib;libxml2.lib c:\drop\amd64 C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;;..\apache2 C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;;..\apache2 C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;;..\apache2 C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2 C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2 C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2 C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2 C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2 C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2 C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2 C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2 C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2 C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2 C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2 C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2 C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2 C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2 C:\work\pcre-8.30\include;C:\work\pcre-8.30;C:\work\libxml2-2.7.7\include;C:\apache22\include;..\apache2 modsecurity-2.9.5/standalone/main.cpp0000664000175000017500000002062314147005233021002 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ //#undef inline #define inline inline #include #include #include "api.h" char *config_file = NULL; char *url_file = NULL; char *event_files[1024]; int event_file_cnt; char *event_file = NULL; int event_file_len = 0; char **event_file_lines; int event_line_cnt = 0; int event_file_blocks[256]; #define EVENT_FILE_MAX_SIZE (16*1024*1024) #define MAX_URLS 4096 char urls[MAX_URLS][4096]; int url_cnt = 0; void readeventfile(char *name) { if(event_file == NULL) { event_file = (char *)malloc(EVENT_FILE_MAX_SIZE); event_file_lines = (char **)malloc(EVENT_FILE_MAX_SIZE); } event_file_len = 0; event_line_cnt = 0; memset(event_file_blocks, -1, sizeof(int) * 256); FILE *fr = fopen(name, "rb"); if(fr == NULL) return; event_file_len = fread(event_file, 1, EVENT_FILE_MAX_SIZE - 1, fr); fclose(fr); event_file[event_file_len] = 0; } void parseeventfile() { if(event_file_len == 0 || event_file == NULL) return; char *t = event_file; char *e = event_file + event_file_len; int nocrlf = 1; while(t < e) { event_file_lines[event_line_cnt++] = t; while(t < e && *t != 10 && *t != 13) t++; char ct = *t; *t = 0; int i = event_line_cnt - 1; int l = strlen(event_file_lines[i]); if(l == 14 && event_file_lines[i][0] == '-' && event_file_lines[i][1] == '-' && event_file_lines[i][l-2] == '-' && event_file_lines[i][l-1] == '-') { char blk = event_file_lines[i][l-3]; event_file_blocks[blk] = i; if(blk == 'C' || blk == 'G') { nocrlf = 0; } else { nocrlf = 1; } } *t = ct; if(nocrlf) while(t < e && (*t == 10 || *t == 13)) *t++ = 0; else while(t < e && (*t == 10 || *t == 13)) t++; } } void parseargs(int argc, char *argv[]) { int i = 1; event_file_cnt = 0; while(i < argc) { if(argv[i][0] == '-') { if(argv[i][1] == 'c' && i < argc - 1) { config_file = argv[i + 1]; i += 2; continue; } if(argv[i][1] == 'u' && i < argc - 1) { url_file = argv[i + 1]; i += 2; continue; } i++; continue; } if(event_file_cnt == 1024) { fprintf(stderr, "Too many input files! (limit 1024)\n"); break; } event_files[event_file_cnt++] = argv[i++]; } } void log(void *obj, int level, char *str) { printf("%s\n", str); } unsigned int bodypos = 0; apr_status_t readbody(request_rec *r, char *buf, unsigned int length, unsigned int *readcnt, int *is_eos) { int j = event_file_blocks['C']; if(j < 0) { *is_eos = 1; return APR_SUCCESS; } j++; if(event_file_lines[j][0] == 0) { *is_eos = 1; return APR_SUCCESS; } unsigned int l = strlen(event_file_lines[j]); unsigned int size = length; if(bodypos + size > l) size = l - bodypos; memcpy(buf, &event_file_lines[j][bodypos], size); bodypos += size; *readcnt = size; if(bodypos == l) { *is_eos = 1; } return APR_SUCCESS; } unsigned int responsepos = 0; apr_status_t readresponse(request_rec *r, char *buf, unsigned int length, unsigned int *readcnt, int *is_eos) { int j = event_file_blocks['G']; if(j < 0) { *is_eos = 1; return APR_SUCCESS; } j++; if(event_file_lines[j][0] == 0) { *is_eos = 1; return APR_SUCCESS; } unsigned int l = strlen(event_file_lines[j]); unsigned int size = length; if(responsepos + size > l) size = l - responsepos; memcpy(buf, &event_file_lines[j][responsepos], size); responsepos += size; *readcnt = size; if(responsepos == l) *is_eos = 1; return APR_SUCCESS; } void main(int argc, char *argv[]) { directory_config *config; conn_rec *c; request_rec *r; parseargs(argc, argv); if(config_file == NULL || argc < 3) { printf("Usage:\n"); printf("standalone.exe -c [-u ] [ ...]\n"); return; } modsecSetLogHook(NULL, log); modsecSetReadBody(readbody); modsecSetReadResponse(readresponse); modsecInit(); modsecStartConfig(); config = modsecGetDefaultConfig(); const char * err = modsecProcessConfig(config, config_file, "c:\\inetpub\\wwwroot"); if(err != NULL) { printf("%s\n", err); } modsecFinalizeConfig(); modsecInitProcess(); if(url_file != NULL) { FILE *fr = fopen(url_file, "rb"); int i = 0; while(fgets(urls[i],4096,fr) != NULL) { urls[i][4095] = 0; int l = strlen(urls[i]) - 1; if(l < 8) continue; while(urls[i][l] == 10 || urls[i][l] == 13) l--; urls[i++][l + 1] = 0; } url_cnt = i; fclose(fr); } for(int i = 0; i < event_file_cnt; i++) { if(url_cnt == 0) { urls[0][0] = 0; url_cnt = 1; } for(int ui = 0; ui < url_cnt; ui++) { readeventfile(event_files[i]); parseeventfile(); bodypos = 0; responsepos = 0; c = modsecNewConnection(); modsecProcessConnection(c); r = modsecNewRequest(c, config); int j = event_file_blocks['B']; if(j < 0) continue; j++; if(event_file_lines[j][0] == 0) continue; char *method = event_file_lines[j]; char *url = strchr(method, 32); char *proto = strchr(url + 1, 32); if(url == NULL || proto == NULL) continue; *url++=0; *proto++=0; if(urls[ui][0] != 0) { url = urls[ui]; } #define SETMETHOD(m) if(strcmp(method,#m) == 0){ r->method = method; r->method_number = M_##m; } r->method = "INVALID"; r->method_number = M_INVALID; SETMETHOD(OPTIONS) SETMETHOD(GET) SETMETHOD(POST) SETMETHOD(PUT) SETMETHOD(DELETE) SETMETHOD(TRACE) SETMETHOD(CONNECT) SETMETHOD(MOVE) SETMETHOD(COPY) SETMETHOD(PROPFIND) SETMETHOD(PROPPATCH) SETMETHOD(MKCOL) SETMETHOD(LOCK) SETMETHOD(UNLOCK) r->protocol = proto; while(event_file_lines[++j][0] != 0) { char *value = strchr(event_file_lines[j], ':'); if(value == NULL) break; *value++ = 0; while(*value <=32 && *value != 0) value++; apr_table_setn(r->headers_in, event_file_lines[j], value); } r->content_encoding = apr_table_get(r->headers_in, "Content-Encoding"); r->content_type = apr_table_get(r->headers_in, "Content-Type"); r->hostname = apr_table_get(r->headers_in, "Host"); r->path_info = url; char *query = strchr(url, '?'); char *rawurl = url; if(query != NULL) { rawurl = (char *)apr_palloc(r->pool, strlen(url) + 1); strcpy(rawurl, url); *query++ = 0; r->args = query; } const char *lng = apr_table_get(r->headers_in, "Content-Languages"); if(lng != NULL) { r->content_languages = apr_array_make(r->pool, 1, sizeof(const char *)); *(const char **)apr_array_push(r->content_languages) = lng; } r->request_time = apr_time_now(); r->parsed_uri.scheme = "http"; r->parsed_uri.path = r->path_info; r->parsed_uri.hostname = (char *)r->hostname; r->parsed_uri.is_initialized = 1; r->parsed_uri.port = 80; r->parsed_uri.port_str = "80"; r->parsed_uri.query = r->args; r->parsed_uri.dns_looked_up = 0; r->parsed_uri.dns_resolved = 0; r->parsed_uri.password = NULL; r->parsed_uri.user = NULL; r->parsed_uri.fragment = NULL; r->unparsed_uri = rawurl; r->uri = r->unparsed_uri; r->the_request = (char *)apr_palloc(r->pool, strlen(r->method) + 1 + strlen(r->uri) + 1 + strlen(r->protocol) + 1); strcpy(r->the_request, r->method); strcat(r->the_request, " "); strcat(r->the_request, r->uri); strcat(r->the_request, " "); strcat(r->the_request, r->protocol); apr_table_setn(r->subprocess_env, "UNIQUE_ID", "1"); modsecProcessRequest(r); modsecProcessResponse(r); modsecFinishRequest(r); } } modsecTerminate(); getch(); } modsecurity-2.9.5/standalone/standalone.vcxproj.user0000664000175000017500000000155214147005233024074 0ustar mhsvierulamhsvierula -c d:\temp\antixss.conf -u d:\temp\modsec_urls.txt d:\temp\test1.dat WindowsLocalDebugger $(TargetPath) false NativeOnly -c d:\xss.conf d:\test.dat WindowsLocalDebugger modsecurity-2.9.5/standalone/standalone.sln0000664000175000017500000000233014147005233022213 0ustar mhsvierulamhsvierula Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "standalone", "standalone.vcxproj", "{20EC871F-B6A0-4398-9B67-A33598A796E8}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {20EC871F-B6A0-4398-9B67-A33598A796E8}.Debug|Win32.ActiveCfg = Debug|Win32 {20EC871F-B6A0-4398-9B67-A33598A796E8}.Debug|Win32.Build.0 = Debug|Win32 {20EC871F-B6A0-4398-9B67-A33598A796E8}.Debug|x64.ActiveCfg = Debug|x64 {20EC871F-B6A0-4398-9B67-A33598A796E8}.Debug|x64.Build.0 = Debug|x64 {20EC871F-B6A0-4398-9B67-A33598A796E8}.Release|Win32.ActiveCfg = Release|Win32 {20EC871F-B6A0-4398-9B67-A33598A796E8}.Release|Win32.Build.0 = Release|Win32 {20EC871F-B6A0-4398-9B67-A33598A796E8}.Release|x64.ActiveCfg = Release|x64 {20EC871F-B6A0-4398-9B67-A33598A796E8}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal modsecurity-2.9.5/standalone/api.h0000664000175000017500000000725614147005233020303 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #pragma once #include #include "http_core.h" #include "http_request.h" #include "modsecurity.h" #include "apache2.h" #include "http_main.h" #include "http_connection.h" #include "apr_optional.h" #include "mod_log_config.h" #include "msc_logging.h" #include "msc_util.h" #include "ap_mpm.h" #include "scoreboard.h" #include "apr_version.h" #include "apr_lib.h" #include "ap_config.h" #include "http_config.h" #ifdef __cplusplus extern "C" { #endif server_rec *modsecInit(); void modsecTerminate(); void modsecStartConfig(); directory_config *modsecGetDefaultConfig(); const char *modsecProcessConfig(directory_config *config, const char *file, const char *dir); void modsecFinalizeConfig(); void modsecInitProcess(); conn_rec *modsecNewConnection(); void modsecProcessConnection(conn_rec *c); int modsecFinishConnection(conn_rec *c); request_rec *modsecNewRequest(conn_rec *connection, directory_config *config); int modsecProcessRequestBody(request_rec *r); int modsecProcessRequestHeaders(request_rec *r); static inline int modsecProcessRequest(request_rec *r) { int status; status = modsecProcessRequestHeaders(r); if (status != DECLINED) { return status; } return modsecProcessRequestBody(r); } int modsecProcessResponse(request_rec *r); int modsecFinishRequest(request_rec *r); void modsecSetLogHook(void *obj, void (*hook)(void *obj, int level, char *str)); #define NOTE_MSR_BRIGADE_REQUEST "modsecurity-brigade-request" #define NOTE_MSR_BRIGADE_RESPONSE "modsecurity-brigade-response" static inline void modsecSetBodyBrigade(request_rec *r, apr_bucket_brigade *b) { apr_table_setn(r->notes, NOTE_MSR_BRIGADE_REQUEST, (char *)b); }; static inline apr_bucket_brigade * modsecGetBodyBrigade(request_rec *r) { return (apr_bucket_brigade *)apr_table_get(r->notes, NOTE_MSR_BRIGADE_REQUEST); }; static inline void modsecSetResponseBrigade(request_rec *r, apr_bucket_brigade *b) { apr_table_setn(r->notes, NOTE_MSR_BRIGADE_RESPONSE, (char *)b); }; static inline apr_bucket_brigade * modsecGetResponseBrigade(request_rec *r) { return (apr_bucket_brigade *)apr_table_get(r->notes, NOTE_MSR_BRIGADE_RESPONSE); }; void modsecSetReadBody(apr_status_t (*func)(request_rec *r, char *buf, unsigned int length, unsigned int *readcnt, int *is_eos)); void modsecSetReadResponse(apr_status_t (*func)(request_rec *r, char *buf, unsigned int length, unsigned int *readcnt, int *is_eos)); void modsecSetWriteBody(apr_status_t (*func)(request_rec *r, char *buf, unsigned int length)); void modsecSetWriteResponse(apr_status_t (*func)(request_rec *r, char *buf, unsigned int length)); void modsecSetDropAction(int (*func)(request_rec *r)); int modsecIsResponseBodyAccessEnabled(request_rec *r); int modsecIsRequestBodyAccessEnabled(request_rec *r); int modsecContextState(request_rec *r); void modsecSetConfigForIISRequestBody(request_rec *r); const char *modsecIsServerSignatureAvailale(void); #ifdef VERSION_IIS void modsecStatusEngineCall(void); void modsecReportRemoteLoadedRules(void); #endif #ifdef __cplusplus } #endif modsecurity-2.9.5/Makefile.am0000664000175000017500000000227114147005233017255 0ustar mhsvierulamhsvierulaACLOCAL_AMFLAGS = -I build SUBDIRS = @TOPLEVEL_SUBDIRS@ tests CLEANFILES = MAINTAINERCLEANFILES = CLEANFILES += tests/regression/server_root/conf/*.t_*.conf \ tests/regression/server_root/logs/*.log MAINTAINERCLEANFILES += $(CLEANFILES) \ aclocal.m4 \ alp2/Makefile.in \ apache2/Makefile.in \ build/config.guess \ build/config.sub \ build/depcomp \ build/libtool.m4 \ build/ltmain.sh \ build/lt~obsolete.m4 \ build/ltoptions.m4 \ build/ltsugar.m4 \ build/ltversion.m4 \ build/missing \ config.log \ config.status \ configure \ ext/Makefile.in \ Makefile \ Makefile.in \ mlogc/Makefile.in \ modsecurity_config_auto.h.in~ test: check test-regression: (cd tests && $(MAKE) test-regression) test-regression-nginx: (cd tests && $(MAKE) test-regression-nginx) cppcheck: cppcheck . --enable=all --force 2>&1 | sed 's/^/warning: /g' 1>&2; check-coding-style: for i in `(find . -iname "*.c" ; find . -iname "*.h")`; \ do echo $$i...; \ vera++ -rule L004 -param max-line-length=80 $$i 2>&1 | sed 's/^/warning: /g' 1>&2; \ vera++ -rule L001 $$i 2>&1 | sed 's/^/warning: /g' 1>&2; \ done; .PHONY: test modsecurity-2.9.5/.github/0000775000175000017500000000000014147005233016557 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/.github/ISSUE_TEMPLATE/0000775000175000017500000000000014147005020020734 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/.github/ISSUE_TEMPLATE/bug-report-for-version-2-x.md0000664000175000017500000000241514147005020026221 0ustar mhsvierulamhsvierula--- name: Bug report for version 2.x about: Create a report to help us improve --- **Describe the bug** A clear and concise description of what the bug is. **Logs and dumps** Output of: 1. DebugLogs (level 9) 2. AuditLogs 3. Error logs 4. If there is a crash, the core dump file. _Notice:_ Be carefully to not leak any confidential information. **To Reproduce** Steps to reproduce the behavior: A **curl** command line that mimics the original request and reproduces the problem. Or a ModSecurity v3 test case. [e.g: curl "modsec-full/ca/..\\..\\..\\..\\..\\..\\/\\etc/\\passwd" or [issue-394.json](https://github.com/SpiderLabs/ModSecurity/blob/v3/master/test/test-cases/regression/issue-394.json)] **Expected behavior** A clear and concise description of what you expected to happen. **Server (please complete the following information):** - ModSecurity version (and connector): [e.g. ModSecurity v3.0.1 with nginx-connector v1.0.0] - WebServer: [e.g. nginx-1.15.5] - OS (and distro): [e.g. Linux, archlinux] **Rule Set (please complete the following information):** - Running any public or commercial rule set? [e.g. SpiderLabs commercial rules] - What is the version number? [e.g. 2018-08-11] **Additional context** Add any other context about the problem here. modsecurity-2.9.5/.github/ISSUE_TEMPLATE/bug-report-for-version-3-x.md0000664000175000017500000000261114147005020026220 0ustar mhsvierulamhsvierula--- name: Bug report for version 3.x about: Create a report to help us improve. If you don't know a specific detail or piece of information leave it blank, if necessary we will help you to figure out. --- **Describe the bug** A clear and concise description of what the bug is. **Logs and dumps** Output of: 1. DebugLogs (level 9) 2. AuditLogs 3. Error logs 4. If there is a crash, the core dump file. _Notice:_ Be carefully to not leak any confidential information. **To Reproduce** Steps to reproduce the behavior: A **curl** command line that mimics the original request and reproduces the problem. Or a ModSecurity v3 test case. [e.g: curl "modsec-full/ca/..\\..\\..\\..\\..\\..\\/\\etc/\\passwd" or [issue-394.json](https://github.com/SpiderLabs/ModSecurity/blob/v3/master/test/test-cases/regression/issue-394.json)] **Expected behavior** A clear and concise description of what you expected to happen. **Server (please complete the following information):** - ModSecurity version (and connector): [e.g. ModSecurity v3.0.1 with nginx-connector v1.0.0] - WebServer: [e.g. nginx-1.15.5] - OS (and distro): [e.g. Linux, archlinux] **Rule Set (please complete the following information):** - Running any public or commercial rule set? [e.g. SpiderLabs commercial rules] - What is the version number? [e.g. 2018-08-11] **Additional context** Add any other context about the problem here. modsecurity-2.9.5/build/0000775000175000017500000000000014147005251016316 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/build/find_ssdeep.m40000664000175000017500000000270114147005233021043 0ustar mhsvierulamhsvieruladnl Check for SSDEEP Libraries dnl CHECK_SSDEEP(ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]) dnl Sets: dnl SSDEEP_CFLAGS dnl SSDEEP_LDFLAGS AC_DEFUN([CHECK_SSDEEP], [dnl SSDEEP_CFLAGS="" SSDEEP_LDFLAGS="" SSDEEP_LDADD="" AC_ARG_WITH( ssdeep, [AC_HELP_STRING([--with-ssdeep=PATH],[Path to ssdeep prefix])] ,, with_ssdeep=yes) AS_CASE(["${with_ssdeep}"], [no], [test_paths=], [yes], [test_paths="/usr/ /usr/local/ /usr/local/libfuzzy /usr/local/fuzzy /opt/libfuzzy /opt/fuzzy /opt /opt/local"], [test_paths="${with_ssdeep}"]) AS_IF([test "x${test_paths}" != "x"], [ AC_MSG_CHECKING([for ssdeep path]) SSDEEP_LIB_NAME="fuzzy" ssdeep_dir= if test -z "$withssdeep" -o "$withssdeep" = "yes"; then for i in ${test_paths}; do if test -f "$i/include/fuzzy.h"; then SSDEEP_CFLAGS="-I$i/include" ssdeep_dir=$i fi done else if test -f "$withssdeep/include/fuzzy.h"; then SSDEEP_CFLAGS="-I$withssdeep/include" ssdeep_dir=$withssdeep fi fi SSDEEP_LDFLAGS="-L$ssdeep_dir/lib -lfuzzy" SSDEEP_LDADD="-lfuzzy" ]) if test -z "${SSDEEP_CFLAGS}"; then AC_MSG_RESULT([no]) SSDEEP_LDFLAGS="" SSDEEP_LDADD="" AC_MSG_NOTICE([optional ssdeep library not found]) else SSDEEP_CFLAGS="-DWITH_SSDEEP ${SSDEEP_CFLAGS}" AC_MSG_RESULT([${SSDEEP_LDFLAGS} ${SSDEEP_CFLAGS}]) fi AC_SUBST(SSDEEP_LDFLAGS) AC_SUBST(SSDEEP_LDADD) AC_SUBST(SSDEEP_CFLAGS) ]) modsecurity-2.9.5/build/find_lua.m40000664000175000017500000001363114147005233020345 0ustar mhsvierulamhsvieruladnl Check for LUA Libraries dnl CHECK_LUA(ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]) dnl Sets: dnl LUA_CFLAGS dnl LUA_LIBS AC_DEFUN([CHECK_LUA], [dnl AC_REQUIRE([PKG_PROG_PKG_CONFIG]) LUA_CONFIG="" LUA_VERSION="" LUA_CFLAGS="" LUA_CPPFLAGS="" LUA_LDADD="" LUA_LDFLAGS="" LUA_CONFIG=${PKG_CONFIG} LUA_PKGNAMES="lua5.1 lua-5.1 lua_5.1 lua-51 lua_51 lua51 lua5 lua lua5.2 lua-5.2 lua_5.2 lua-52 lua_52 lua52 lua5.3 lua-5.3 lua_5.3 lua-53 lua_53 lua53 " LUA_SONAMES="so la sl dll dylib a" AC_ARG_WITH( lua, [AC_HELP_STRING([--with-lua=PATH],[Path to lua prefix or config script])] ,, with_lua=yes) AS_CASE(["${with_lua}"], [no], [test_paths=], [yes], [test_paths="/usr/local/liblua /usr/local/lua /usr/local /opt/liblua /opt/lua /opt /usr"], [test_paths="${with_lua}"]) AS_IF([test "x${test_paths}" != "x"], [ AC_MSG_CHECKING([for liblua config script]) for x in ${test_paths}; do dnl # Determine if the script was specified and use it directly if test ! -d "$x" -a -e "$x"; then LUA_CONFIG=$x break fi dnl # Try known config script names/locations for y in $LUA_CONFIG; do if test -e "${x}/bin/${y}"; then LUA_CONFIG="${x}/bin/${y}" lua_config="${LUA_CONFIG}" break elif test -e "${x}/${y}"; then LUA_CONFIG="${x}/${y}" lua_config="${LUA_CONFIG}" break fi done if test -n "${lua_config}"; then break fi done dnl # Try known package names if test -n "${LUA_CONFIG}"; then LUA_PKGNAME="" for x in ${LUA_PKGNAMES}; do if ${LUA_CONFIG} --exists ${x}; then LUA_PKGNAME="$x" break fi done fi if test -n "${LUA_PKGNAME}"; then AC_MSG_RESULT([${LUA_CONFIG}]) LUA_VERSION="`${LUA_CONFIG} ${LUA_PKGNAME} --modversion`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(lua VERSION: $LUA_VERSION); fi LUA_CFLAGS="`${LUA_CONFIG} ${LUA_PKGNAME} --cflags`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(lua CFLAGS: $LUA_CFLAGS); fi LUA_LDADD="`${LUA_CONFIG} ${LUA_PKGNAME} --libs-only-l`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(lua LDADD: $LUA_LDADD); fi LUA_LDFLAGS="`${LUA_CONFIG} ${LUA_PKGNAME} --libs-only-L --libs-only-other`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(lua LDFLAGS: $LUA_LDFLAGS); fi else AC_MSG_RESULT([no]) dnl Hack to just try to find the lib and include AC_MSG_CHECKING([for lua install]) for x in ${test_paths}; do for y in ${LUA_SONAMES}; do if test -e "${x}/liblua5.1.${y}"; then lua_lib_path="${x}" lua_lib_name="lua5.1" break elif test -e "${x}/lib/liblua5.1.${y}"; then lua_lib_path="${x}/lib" lua_lib_name="lua5.1" break elif test -e "${x}/lib64/liblua5.1.${y}"; then lua_lib_path="${x}/lib64" lua_lib_name="lua5.1" break elif test -e "${x}/lib32/liblua5.1.${y}"; then lua_lib_path="${x}/lib32" lua_lib_name="lua5.1" break elif test -e "${x}/liblua51.${y}"; then lua_lib_path="${x}" lua_lib_name="lua51" break elif test -e "${x}/lib/liblua51.${y}"; then lua_lib_path="${x}/lib" lua_lib_name="lua51" break elif test -e "${x}/lib64/liblua51.${y}"; then lua_lib_path="${x}/lib64" lua_lib_name="lua51" break elif test -e "${x}/lib32/liblua51.${y}"; then lua_lib_path="${x}/lib32" lua_lib_name="lua51" break elif test -e "${x}/liblua.${y}"; then lua_lib_path="${x}" lua_lib_name="lua" break elif test -e "${x}/lib/liblua.${y}"; then lua_lib_path="${x}/lib" lua_lib_name="lua" break elif test -e "${x}/lib64/liblua.${y}"; then lua_lib_path="${x}/lib64" lua_lib_name="lua" break elif test -e "${x}/lib32/liblua.${y}"; then lua_lib_path="${x}/lib32" lua_lib_name="lua" break else lua_lib_path="" lua_lib_name="" fi done if test -n "$lua_lib_path"; then break fi done for x in ${test_paths}; do if test -e "${x}/include/lua.h"; then lua_inc_path="${x}/include" break elif test -e "${x}/lua.h"; then lua_inc_path="${x}" break fi dnl # Check some sub-paths as well for lua_pkg_name in ${lua_lib_name} ${LUA_PKGNAMES}; do if test -e "${x}/include/${lua_pkg_name}/lua.h"; then lua_inc_path="${x}/include" break elif test -e "${x}/${lua_pkg_name}/lua.h"; then lua_inc_path="${x}" break else lua_inc_path="" fi done if test -n "$lua_inc_path"; then break fi done if test -n "${lua_lib_path}" -a -n "${lua_inc_path}"; then LUA_CONFIG="" AC_MSG_RESULT([${lua_lib_path} ${lua_inc_path}]) LUA_VERSION="5.1" LUA_CFLAGS="-I${lua_inc_path}" LUA_LDADD="-l${lua_lib_name}" LUA_LDFLAGS="-L${lua_lib_path}" else LUA_VERSION="" AC_MSG_RESULT([no]) fi fi ]) AC_SUBST(LUA_CFLAGS) AC_SUBST(LUA_LDADD) AC_SUBST(LUA_LDFLAGS) if test -z "${LUA_VERSION}"; then ifelse([$2], , AC_MSG_NOTICE([optional lua library not found]), $2) else AC_MSG_NOTICE([using lua v${LUA_VERSION}]) LUA_CFLAGS="-DWITH_LUA ${LUA_CFLAGS}" ifelse([$1], , , $1) fi ]) modsecurity-2.9.5/build/ar-lib0000755000175000017500000001330214147005250017406 0ustar mhsvierulamhsvierula#! /bin/sh # Wrapper for Microsoft lib.exe me=ar-lib scriptversion=2012-03-01.08; # UTC # Copyright (C) 2010-2017 Free Software Foundation, Inc. # Written by Peter Rosin . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # func_error message func_error () { echo "$me: $1" 1>&2 exit 1 } file_conv= # func_file_conv build_file # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv in mingw) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin) file=`cygpath -m "$file" || echo "$file"` ;; wine) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_at_file at_file operation archive # Iterate over all members in AT_FILE performing OPERATION on ARCHIVE # for each of them. # When interpreting the content of the @FILE, do NOT use func_file_conv, # since the user would need to supply preconverted file names to # binutils ar, at least for MinGW. func_at_file () { operation=$2 archive=$3 at_file_contents=`cat "$1"` eval set x "$at_file_contents" shift for member do $AR -NOLOGO $operation:"$member" "$archive" || exit $? done } case $1 in '') func_error "no command. Try '$0 --help' for more information." ;; -h | --h*) cat <, 1996 # Copyright (C) 1996-2015 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . PROGRAM=libtool PACKAGE=libtool VERSION="2.4.6 Debian-2.4.6-2" package_revision=2.4.6 ## ------ ## ## Usage. ## ## ------ ## # Run './libtool --help' for help with using this script from the # command line. ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # After configure completes, it has a better idea of some of the # shell tools we need than the defaults used by the functions shared # with bootstrap, so set those here where they can still be over- # ridden by the user, but otherwise take precedence. : ${AUTOCONF="autoconf"} : ${AUTOMAKE="automake"} ## -------------------------- ## ## Source external libraries. ## ## -------------------------- ## # Much of our low-level functionality needs to be sourced from external # libraries, which are installed to $pkgauxdir. # Set a version string for this script. scriptversion=2015-01-20.17; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 # Copyright (C) 2004-2015 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # As a special exception to the GNU General Public License, if you distribute # this file as part of a program or library that is built using GNU Libtool, # you may include this file under the same distribution terms that you use # for the rest of that program. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Please report bugs or propose patches to gary@gnu.org. ## ------ ## ## Usage. ## ## ------ ## # Evaluate this file near the top of your script to gain access to # the functions and variables defined here: # # . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh # # If you need to override any of the default environment variable # settings, do that before evaluating this file. ## -------------------- ## ## Shell normalisation. ## ## -------------------- ## # Some shells need a little help to be as Bourne compatible as possible. # Before doing anything else, make sure all that help has been provided! DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # NLS nuisances: We save the old values in case they are required later. _G_user_locale= _G_safe_locale= for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test set = \"\${$_G_var+set}\"; then save_$_G_var=\$$_G_var $_G_var=C export $_G_var _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Make sure IFS has a sensible default sp=' ' nl=' ' IFS="$sp $nl" # There are apparently some retarded systems that use ';' as a PATH separator! if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi ## ------------------------- ## ## Locate command utilities. ## ## ------------------------- ## # func_executable_p FILE # ---------------------- # Check that FILE is an executable regular file. func_executable_p () { test -f "$1" && test -x "$1" } # func_path_progs PROGS_LIST CHECK_FUNC [PATH] # -------------------------------------------- # Search for either a program that responds to --version with output # containing "GNU", or else returned by CHECK_FUNC otherwise, by # trying all the directories in PATH with each of the elements of # PROGS_LIST. # # CHECK_FUNC should accept the path to a candidate program, and # set $func_check_prog_result if it truncates its output less than # $_G_path_prog_max characters. func_path_progs () { _G_progs_list=$1 _G_check_func=$2 _G_PATH=${3-"$PATH"} _G_path_prog_max=0 _G_path_prog_found=false _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} for _G_dir in $_G_PATH; do IFS=$_G_save_IFS test -z "$_G_dir" && _G_dir=. for _G_prog_name in $_G_progs_list; do for _exeext in '' .EXE; do _G_path_prog=$_G_dir/$_G_prog_name$_exeext func_executable_p "$_G_path_prog" || continue case `"$_G_path_prog" --version 2>&1` in *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; *) $_G_check_func $_G_path_prog func_path_progs_result=$func_check_prog_result ;; esac $_G_path_prog_found && break 3 done done done IFS=$_G_save_IFS test -z "$func_path_progs_result" && { echo "no acceptable sed could be found in \$PATH" >&2 exit 1 } } # We want to be able to use the functions in this file before configure # has figured out where the best binaries are kept, which means we have # to search for them ourselves - except when the results are already set # where we skip the searches. # Unless the user overrides by setting SED, search the path for either GNU # sed, or the sed that truncates its output the least. test -z "$SED" && { _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for _G_i in 1 2 3 4 5 6 7; do _G_sed_script=$_G_sed_script$nl$_G_sed_script done echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed _G_sed_script= func_check_prog_sed () { _G_path_prog=$1 _G_count=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo '' >> conftest.nl "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin rm -f conftest.sed SED=$func_path_progs_result } # Unless the user overrides by setting GREP, search the path for either GNU # grep, or the grep that truncates its output the least. test -z "$GREP" && { func_check_prog_grep () { _G_path_prog=$1 _G_count=0 _G_path_prog_max=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo 'GREP' >> conftest.nl "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin GREP=$func_path_progs_result } ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # All uppercase variable names are used for environment variables. These # variables can be overridden by the user before calling a script that # uses them if a suitable command of that name is not already available # in the command search PATH. : ${CP="cp -f"} : ${ECHO="printf %s\n"} : ${EGREP="$GREP -E"} : ${FGREP="$GREP -F"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} ## -------------------- ## ## Useful sed snippets. ## ## -------------------- ## sed_dirname='s|/[^/]*$||' sed_basename='s|^.*/||' # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s|\([`"$\\]\)|\\\1|g' # Same as above, but do not quote variable references. sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' # Sed substitution that converts a w32 file name or path # that contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-'\' parameter expansions in output of sed_double_quote_subst that # were '\'-ed in input to the same. If an odd number of '\' preceded a # '$' in input to sed_double_quote_subst, that '$' was protected from # expansion. Since each input '\' is now two '\'s, look for any number # of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. _G_bs='\\' _G_bs2='\\\\' _G_bs4='\\\\\\\\' _G_dollar='\$' sed_double_backslash="\ s/$_G_bs4/&\\ /g s/^$_G_bs2$_G_dollar/$_G_bs&/ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g s/\n//g" ## ----------------- ## ## Global variables. ## ## ----------------- ## # Except for the global variables explicitly listed below, the following # functions in the '^func_' namespace, and the '^require_' namespace # variables initialised in the 'Resource management' section, sourcing # this file will not pollute your global namespace with anything # else. There's no portable way to scope variables in Bourne shell # though, so actually running these functions will sometimes place # results into a variable named after the function, and often use # temporary variables in the '^_G_' namespace. If you are careful to # avoid using those namespaces casually in your sourcing script, things # should continue to work as you expect. And, of course, you can freely # overwrite any of the functions or variables defined here before # calling anything to customize them. EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. # Allow overriding, eg assuming that you follow the convention of # putting '$debug_cmd' at the start of all your functions, you can get # bash to show function call trace with: # # debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name debug_cmd=${debug_cmd-":"} exit_cmd=: # By convention, finish your script with: # # exit $exit_status # # so that you can set exit_status to non-zero if you want to indicate # something went wrong during execution without actually bailing out at # the point of failure. exit_status=$EXIT_SUCCESS # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath=$0 # The name of this program. progname=`$ECHO "$progpath" |$SED "$sed_basename"` # Make sure we have an absolute progpath for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` progdir=`cd "$progdir" && pwd` progpath=$progdir/$progname ;; *) _G_IFS=$IFS IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS=$_G_IFS test -x "$progdir/$progname" && break done IFS=$_G_IFS test -n "$progdir" || progdir=`pwd` progpath=$progdir/$progname ;; esac ## ----------------- ## ## Standard options. ## ## ----------------- ## # The following options affect the operation of the functions defined # below, and should be set appropriately depending on run-time para- # meters passed on the command line. opt_dry_run=false opt_quiet=false opt_verbose=false # Categories 'all' and 'none' are always available. Append any others # you will pass as the first argument to func_warning from your own # code. warning_categories= # By default, display warnings according to 'opt_warning_types'. Set # 'warning_func' to ':' to elide all warnings, or func_fatal_error to # treat the next displayed warning as a fatal error. warning_func=func_warn_and_continue # Set to 'all' to display all warnings, 'none' to suppress all # warnings, or a space delimited list of some subset of # 'warning_categories' to display only the listed warnings. opt_warning_types=all ## -------------------- ## ## Resource management. ## ## -------------------- ## # This section contains definitions for functions that each ensure a # particular resource (a file, or a non-empty configuration variable for # example) is available, and if appropriate to extract default values # from pertinent package files. Call them using their associated # 'require_*' variable to ensure that they are executed, at most, once. # # It's entirely deliberate that calling these functions can set # variables that don't obey the namespace limitations obeyed by the rest # of this file, in order that that they be as useful as possible to # callers. # require_term_colors # ------------------- # Allow display of bold text on terminals that support it. require_term_colors=func_require_term_colors func_require_term_colors () { $debug_cmd test -t 1 && { # COLORTERM and USE_ANSI_COLORS environment variables take # precedence, because most terminfo databases neglect to describe # whether color sequences are supported. test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} if test 1 = "$USE_ANSI_COLORS"; then # Standard ANSI escape sequences tc_reset='' tc_bold=''; tc_standout='' tc_red=''; tc_green='' tc_blue=''; tc_cyan='' else # Otherwise trust the terminfo database after all. test -n "`tput sgr0 2>/dev/null`" && { tc_reset=`tput sgr0` test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` tc_standout=$tc_bold test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` } fi } require_term_colors=: } ## ----------------- ## ## Function library. ## ## ----------------- ## # This section contains a variety of useful functions to call in your # scripts. Take note of the portable wrappers for features provided by # some modern shells, which will fall back to slower equivalents on # less featureful shells. # func_append VAR VALUE # --------------------- # Append VALUE onto the existing contents of VAR. # We should try to minimise forks, especially on Windows where they are # unreasonably slow, so skip the feature probes when bash or zsh are # being used: if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then : ${_G_HAVE_ARITH_OP="yes"} : ${_G_HAVE_XSI_OPS="yes"} # The += operator was introduced in bash 3.1 case $BASH_VERSION in [12].* | 3.0 | 3.0*) ;; *) : ${_G_HAVE_PLUSEQ_OP="yes"} ;; esac fi # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # useable or anything else if it does not work. test -z "$_G_HAVE_PLUSEQ_OP" \ && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ && _G_HAVE_PLUSEQ_OP=yes if test yes = "$_G_HAVE_PLUSEQ_OP" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_append () { $debug_cmd eval "$1+=\$2" }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_append () { $debug_cmd eval "$1=\$$1\$2" } fi # func_append_quoted VAR VALUE # ---------------------------- # Quote VALUE and append to the end of shell variable VAR, separated # by a space. if test yes = "$_G_HAVE_PLUSEQ_OP"; then eval 'func_append_quoted () { $debug_cmd func_quote_for_eval "$2" eval "$1+=\\ \$func_quote_for_eval_result" }' else func_append_quoted () { $debug_cmd func_quote_for_eval "$2" eval "$1=\$$1\\ \$func_quote_for_eval_result" } fi # func_append_uniq VAR VALUE # -------------------------- # Append unique VALUE onto the existing contents of VAR, assuming # entries are delimited by the first character of VALUE. For example: # # func_append_uniq options " --another-option option-argument" # # will only append to $options if " --another-option option-argument " # is not already present somewhere in $options already (note spaces at # each end implied by leading space in second argument). func_append_uniq () { $debug_cmd eval _G_current_value='`$ECHO $'$1'`' _G_delim=`expr "$2" : '\(.\)'` case $_G_delim$_G_current_value$_G_delim in *"$2$_G_delim"*) ;; *) func_append "$@" ;; esac } # func_arith TERM... # ------------------ # Set func_arith_result to the result of evaluating TERMs. test -z "$_G_HAVE_ARITH_OP" \ && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ && _G_HAVE_ARITH_OP=yes if test yes = "$_G_HAVE_ARITH_OP"; then eval 'func_arith () { $debug_cmd func_arith_result=$(( $* )) }' else func_arith () { $debug_cmd func_arith_result=`expr "$@"` } fi # func_basename FILE # ------------------ # Set func_basename_result to FILE with everything up to and including # the last / stripped. if test yes = "$_G_HAVE_XSI_OPS"; then # If this shell supports suffix pattern removal, then use it to avoid # forking. Hide the definitions single quotes in case the shell chokes # on unsupported syntax... _b='func_basename_result=${1##*/}' _d='case $1 in */*) func_dirname_result=${1%/*}$2 ;; * ) func_dirname_result=$3 ;; esac' else # ...otherwise fall back to using sed. _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` if test "X$func_dirname_result" = "X$1"; then func_dirname_result=$3 else func_append func_dirname_result "$2" fi' fi eval 'func_basename () { $debug_cmd '"$_b"' }' # func_dirname FILE APPEND NONDIR_REPLACEMENT # ------------------------------------------- # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. eval 'func_dirname () { $debug_cmd '"$_d"' }' # func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT # -------------------------------------------------------- # Perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # For efficiency, we do not delegate to the functions above but instead # duplicate the functionality here. eval 'func_dirname_and_basename () { $debug_cmd '"$_b"' '"$_d"' }' # func_echo ARG... # ---------------- # Echo program name prefixed message. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname: $_G_line" done IFS=$func_echo_IFS } # func_echo_all ARG... # -------------------- # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_echo_infix_1 INFIX ARG... # ------------------------------ # Echo program name, followed by INFIX on the first line, with any # additional lines not showing INFIX. func_echo_infix_1 () { $debug_cmd $require_term_colors _G_infix=$1; shift _G_indent=$_G_infix _G_prefix="$progname: $_G_infix: " _G_message=$* # Strip color escape sequences before counting printable length for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" do test -n "$_G_tc" && { _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` } done _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes func_echo_infix_1_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_infix_1_IFS $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 _G_prefix=$_G_indent done IFS=$func_echo_infix_1_IFS } # func_error ARG... # ----------------- # Echo program name prefixed message to standard error. func_error () { $debug_cmd $require_term_colors func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 } # func_fatal_error ARG... # ----------------------- # Echo program name prefixed message to standard error, and exit. func_fatal_error () { $debug_cmd func_error "$*" exit $EXIT_FAILURE } # func_grep EXPRESSION FILENAME # ----------------------------- # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $debug_cmd $GREP "$1" "$2" >/dev/null 2>&1 } # func_len STRING # --------------- # Set func_len_result to the length of STRING. STRING may not # start with a hyphen. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_len () { $debug_cmd func_len_result=${#1} }' else func_len () { $debug_cmd func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } fi # func_mkdir_p DIRECTORY-PATH # --------------------------- # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { $debug_cmd _G_directory_path=$1 _G_dir_list= if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then # Protect directory names starting with '-' case $_G_directory_path in -*) _G_directory_path=./$_G_directory_path ;; esac # While some portion of DIR does not yet exist... while test ! -d "$_G_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. _G_dir_list=$_G_directory_path:$_G_dir_list # If the last portion added has no slash in it, the list is done case $_G_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` done _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` func_mkdir_p_IFS=$IFS; IFS=: for _G_dir in $_G_dir_list; do IFS=$func_mkdir_p_IFS # mkdir can fail with a 'File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$_G_dir" 2>/dev/null || : done IFS=$func_mkdir_p_IFS # Bail out if we (or some other process) failed to create a directory. test -d "$_G_directory_path" || \ func_fatal_error "Failed to create '$1'" fi } # func_mktempdir [BASENAME] # ------------------------- # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, BASENAME is the basename for that directory. func_mktempdir () { $debug_cmd _G_template=${TMPDIR-/tmp}/${1-$progname} if test : = "$opt_dry_run"; then # Return a directory name, but don't create it in dry-run mode _G_tmpdir=$_G_template-$$ else # If mktemp works, use that first and foremost _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` if test ! -d "$_G_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race _G_tmpdir=$_G_template-${RANDOM-0}$$ func_mktempdir_umask=`umask` umask 0077 $MKDIR "$_G_tmpdir" umask $func_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$_G_tmpdir" || \ func_fatal_error "cannot create temporary directory '$_G_tmpdir'" fi $ECHO "$_G_tmpdir" } # func_normal_abspath PATH # ------------------------ # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. func_normal_abspath () { $debug_cmd # These SED scripts presuppose an absolute path with a trailing slash. _G_pathcar='s|^/\([^/]*\).*$|\1|' _G_pathcdr='s|^/[^/]*||' _G_removedotparts=':dotsl s|/\./|/|g t dotsl s|/\.$|/|' _G_collapseslashes='s|/\{1,\}|/|g' _G_finalslash='s|/*$|/|' # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` while :; do # Processed it all yet? if test / = "$func_normal_abspath_tpath"; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result"; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_notquiet ARG... # -------------------- # Echo program name prefixed message only when not in quiet mode. func_notquiet () { $debug_cmd $opt_quiet || func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_relative_path SRCDIR DSTDIR # -------------------------------- # Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. func_relative_path () { $debug_cmd func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=$func_dirname_result if test -z "$func_relative_path_tlibdir"; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test -n "$func_stripname_result"; then func_append func_relative_path_result "/$func_stripname_result" fi # Normalisation. If bindir is libdir, return '.' else relative path. if test -n "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result" func_relative_path_result=$func_stripname_result fi test -n "$func_relative_path_result" || func_relative_path_result=. : } # func_quote_for_eval ARG... # -------------------------- # Aesthetically quote ARGs to be evaled later. # This function returns two values: # i) func_quote_for_eval_result # double-quoted, suitable for a subsequent eval # ii) func_quote_for_eval_unquoted_result # has all characters that are still active within double # quotes backslashified. func_quote_for_eval () { $debug_cmd func_quote_for_eval_unquoted_result= func_quote_for_eval_result= while test 0 -lt $#; do case $1 in *[\\\`\"\$]*) _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; *) _G_unquoted_arg=$1 ;; esac if test -n "$func_quote_for_eval_unquoted_result"; then func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" else func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" fi case $_G_unquoted_arg in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and variable expansion # for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") _G_quoted_arg=\"$_G_unquoted_arg\" ;; *) _G_quoted_arg=$_G_unquoted_arg ;; esac if test -n "$func_quote_for_eval_result"; then func_append func_quote_for_eval_result " $_G_quoted_arg" else func_append func_quote_for_eval_result "$_G_quoted_arg" fi shift done } # func_quote_for_expand ARG # ------------------------- # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { $debug_cmd case $1 in *[\\\`\"]*) _G_arg=`$ECHO "$1" | $SED \ -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; *) _G_arg=$1 ;; esac case $_G_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") _G_arg=\"$_G_arg\" ;; esac func_quote_for_expand_result=$_G_arg } # func_stripname PREFIX SUFFIX NAME # --------------------------------- # strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_stripname () { $debug_cmd # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary variable first. func_stripname_result=$3 func_stripname_result=${func_stripname_result#"$1"} func_stripname_result=${func_stripname_result%"$2"} }' else func_stripname () { $debug_cmd case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; esac } fi # func_show_eval CMD [FAIL_EXP] # ----------------------------- # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} func_quote_for_expand "$_G_cmd" eval "func_notquiet $func_quote_for_expand_result" $opt_dry_run || { eval "$_G_cmd" _G_status=$? if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_show_eval_locale CMD [FAIL_EXP] # ------------------------------------ # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} $opt_quiet || { func_quote_for_expand "$_G_cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || { eval "$_G_user_locale $_G_cmd" _G_status=$? eval "$_G_safe_locale" if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_tr_sh # ---------- # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { $debug_cmd case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_verbose ARG... # ------------------- # Echo program name prefixed message in verbose mode only. func_verbose () { $debug_cmd $opt_verbose && func_echo "$*" : } # func_warn_and_continue ARG... # ----------------------------- # Echo program name prefixed warning message to standard error. func_warn_and_continue () { $debug_cmd $require_term_colors func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 } # func_warning CATEGORY ARG... # ---------------------------- # Echo program name prefixed warning message to standard error. Warning # messages can be filtered according to CATEGORY, where this function # elides messages where CATEGORY is not listed in the global variable # 'opt_warning_types'. func_warning () { $debug_cmd # CATEGORY must be in the warning_categories list! case " $warning_categories " in *" $1 "*) ;; *) func_internal_error "invalid warning category '$1'" ;; esac _G_category=$1 shift case " $opt_warning_types " in *" $_G_category "*) $warning_func ${1+"$@"} ;; esac } # func_sort_ver VER1 VER2 # ----------------------- # 'sort -V' is not generally available. # Note this deviates from the version comparison in automake # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a # but this should suffice as we won't be specifying old # version formats or redundant trailing .0 in bootstrap.conf. # If we did want full compatibility then we should probably # use m4_version_compare from autoconf. func_sort_ver () { $debug_cmd printf '%s\n%s\n' "$1" "$2" \ | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n } # func_lt_ver PREV CURR # --------------------- # Return true if PREV and CURR are in the correct order according to # func_sort_ver, otherwise false. Use it like this: # # func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." func_lt_ver () { $debug_cmd test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: #! /bin/sh # Set a version string for this script. scriptversion=2014-01-07.03; # UTC # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 # Copyright (C) 2010-2015 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Please report bugs or propose patches to gary@gnu.org. ## ------ ## ## Usage. ## ## ------ ## # This file is a library for parsing options in your shell scripts along # with assorted other useful supporting features that you can make use # of too. # # For the simplest scripts you might need only: # # #!/bin/sh # . relative/path/to/funclib.sh # . relative/path/to/options-parser # scriptversion=1.0 # func_options ${1+"$@"} # eval set dummy "$func_options_result"; shift # ...rest of your script... # # In order for the '--version' option to work, you will need to have a # suitably formatted comment like the one at the top of this file # starting with '# Written by ' and ending with '# warranty; '. # # For '-h' and '--help' to work, you will also need a one line # description of your script's purpose in a comment directly above the # '# Written by ' line, like the one at the top of this file. # # The default options also support '--debug', which will turn on shell # execution tracing (see the comment above debug_cmd below for another # use), and '--verbose' and the func_verbose function to allow your script # to display verbose messages only when your user has specified # '--verbose'. # # After sourcing this file, you can plug processing for additional # options by amending the variables from the 'Configuration' section # below, and following the instructions in the 'Option parsing' # section further down. ## -------------- ## ## Configuration. ## ## -------------- ## # You should override these variables in your script after sourcing this # file so that they reflect the customisations you have added to the # option parser. # The usage line for option parsing errors and the start of '-h' and # '--help' output messages. You can embed shell variables for delayed # expansion at the time the message is displayed, but you will need to # quote other shell meta-characters carefully to prevent them being # expanded when the contents are evaled. usage='$progpath [OPTION]...' # Short help message in response to '-h' and '--help'. Add to this or # override it after sourcing this library to reflect the full set of # options your script accepts. usage_message="\ --debug enable verbose shell tracing -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -v, --verbose verbosely report processing --version print version information and exit -h, --help print short or long help message and exit " # Additional text appended to 'usage_message' in response to '--help'. long_help_message=" Warning categories include: 'all' show all warnings 'none' turn off all the warnings 'error' warnings are treated as fatal errors" # Help message printed before fatal option parsing errors. fatal_help="Try '\$progname --help' for more information." ## ------------------------- ## ## Hook function management. ## ## ------------------------- ## # This section contains functions for adding, removing, and running hooks # to the main code. A hook is just a named list of of function, that can # be run in order later on. # func_hookable FUNC_NAME # ----------------------- # Declare that FUNC_NAME will run hooks added with # 'func_add_hook FUNC_NAME ...'. func_hookable () { $debug_cmd func_append hookable_fns " $1" } # func_add_hook FUNC_NAME HOOK_FUNC # --------------------------------- # Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must # first have been declared "hookable" by a call to 'func_hookable'. func_add_hook () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not accept hook functions." ;; esac eval func_append ${1}_hooks '" $2"' } # func_remove_hook FUNC_NAME HOOK_FUNC # ------------------------------------ # Remove HOOK_FUNC from the list of functions called by FUNC_NAME. func_remove_hook () { $debug_cmd eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' } # func_run_hooks FUNC_NAME [ARG]... # --------------------------------- # Run all hook functions registered to FUNC_NAME. # It is assumed that the list of hook functions contains nothing more # than a whitespace-delimited list of legal shell function names, and # no effort is wasted trying to catch shell meta-characters or preserve # whitespace. func_run_hooks () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not support hook funcions.n" ;; esac eval _G_hook_fns=\$$1_hooks; shift for _G_hook in $_G_hook_fns; do eval $_G_hook '"$@"' # store returned options list back into positional # parameters for next 'cmd' execution. eval _G_hook_result=\$${_G_hook}_result eval set dummy "$_G_hook_result"; shift done func_quote_for_eval ${1+"$@"} func_run_hooks_result=$func_quote_for_eval_result } ## --------------- ## ## Option parsing. ## ## --------------- ## # In order to add your own option parsing hooks, you must accept the # full positional parameter list in your hook function, remove any # options that you action, and then pass back the remaining unprocessed # options in '_result', escaped suitably for # 'eval'. Like this: # # my_options_prep () # { # $debug_cmd # # # Extend the existing usage message. # usage_message=$usage_message' # -s, --silent don'\''t print informational messages # ' # # func_quote_for_eval ${1+"$@"} # my_options_prep_result=$func_quote_for_eval_result # } # func_add_hook func_options_prep my_options_prep # # # my_silent_option () # { # $debug_cmd # # # Note that for efficiency, we parse as many options as we can # # recognise in a loop before passing the remainder back to the # # caller on the first unrecognised argument we encounter. # while test $# -gt 0; do # opt=$1; shift # case $opt in # --silent|-s) opt_silent=: ;; # # Separate non-argument short options: # -s*) func_split_short_opt "$_G_opt" # set dummy "$func_split_short_opt_name" \ # "-$func_split_short_opt_arg" ${1+"$@"} # shift # ;; # *) set dummy "$_G_opt" "$*"; shift; break ;; # esac # done # # func_quote_for_eval ${1+"$@"} # my_silent_option_result=$func_quote_for_eval_result # } # func_add_hook func_parse_options my_silent_option # # # my_option_validation () # { # $debug_cmd # # $opt_silent && $opt_verbose && func_fatal_help "\ # '--silent' and '--verbose' options are mutually exclusive." # # func_quote_for_eval ${1+"$@"} # my_option_validation_result=$func_quote_for_eval_result # } # func_add_hook func_validate_options my_option_validation # # You'll alse need to manually amend $usage_message to reflect the extra # options you parse. It's preferable to append if you can, so that # multiple option parsing hooks can be added safely. # func_options [ARG]... # --------------------- # All the functions called inside func_options are hookable. See the # individual implementations for details. func_hookable func_options func_options () { $debug_cmd func_options_prep ${1+"$@"} eval func_parse_options \ ${func_options_prep_result+"$func_options_prep_result"} eval func_validate_options \ ${func_parse_options_result+"$func_parse_options_result"} eval func_run_hooks func_options \ ${func_validate_options_result+"$func_validate_options_result"} # save modified positional parameters for caller func_options_result=$func_run_hooks_result } # func_options_prep [ARG]... # -------------------------- # All initialisations required before starting the option parse loop. # Note that when calling hook functions, we pass through the list of # positional parameters. If a hook function modifies that list, and # needs to propogate that back to rest of this script, then the complete # modified list must be put in 'func_run_hooks_result' before # returning. func_hookable func_options_prep func_options_prep () { $debug_cmd # Option defaults: opt_verbose=false opt_warning_types= func_run_hooks func_options_prep ${1+"$@"} # save modified positional parameters for caller func_options_prep_result=$func_run_hooks_result } # func_parse_options [ARG]... # --------------------------- # The main option parsing loop. func_hookable func_parse_options func_parse_options () { $debug_cmd func_parse_options_result= # this just eases exit handling while test $# -gt 0; do # Defer to hook functions for initial option parsing, so they # get priority in the event of reusing an option name. func_run_hooks func_parse_options ${1+"$@"} # Adjust func_parse_options positional parameters to match eval set dummy "$func_run_hooks_result"; shift # Break out of the loop if we already parsed every option. test $# -gt 0 || break _G_opt=$1 shift case $_G_opt in --debug|-x) debug_cmd='set -x' func_echo "enabling shell trace mode" $debug_cmd ;; --no-warnings|--no-warning|--no-warn) set dummy --warnings none ${1+"$@"} shift ;; --warnings|--warning|-W) test $# = 0 && func_missing_arg $_G_opt && break case " $warning_categories $1" in *" $1 "*) # trailing space prevents matching last $1 above func_append_uniq opt_warning_types " $1" ;; *all) opt_warning_types=$warning_categories ;; *none) opt_warning_types=none warning_func=: ;; *error) opt_warning_types=$warning_categories warning_func=func_fatal_error ;; *) func_fatal_error \ "unsupported warning category: '$1'" ;; esac shift ;; --verbose|-v) opt_verbose=: ;; --version) func_version ;; -\?|-h) func_usage ;; --help) func_help ;; # Separate optargs to long options (plugins may need this): --*=*) func_split_equals "$_G_opt" set dummy "$func_split_equals_lhs" \ "$func_split_equals_rhs" ${1+"$@"} shift ;; # Separate optargs to short options: -W*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "$func_split_short_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-v*|-x*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; esac done # save modified positional parameters for caller func_quote_for_eval ${1+"$@"} func_parse_options_result=$func_quote_for_eval_result } # func_validate_options [ARG]... # ------------------------------ # Perform any sanity checks on option settings and/or unconsumed # arguments. func_hookable func_validate_options func_validate_options () { $debug_cmd # Display all warnings if -W was not given. test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" func_run_hooks func_validate_options ${1+"$@"} # Bail if the options were screwed! $exit_cmd $EXIT_FAILURE # save modified positional parameters for caller func_validate_options_result=$func_run_hooks_result } ## ----------------- ## ## Helper functions. ## ## ----------------- ## # This section contains the helper functions used by the rest of the # hookable option parser framework in ascii-betical order. # func_fatal_help ARG... # ---------------------- # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { $debug_cmd eval \$ECHO \""Usage: $usage"\" eval \$ECHO \""$fatal_help"\" func_error ${1+"$@"} exit $EXIT_FAILURE } # func_help # --------- # Echo long help message to standard output and exit. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message" exit 0 } # func_missing_arg ARGNAME # ------------------------ # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $debug_cmd func_error "Missing argument for '$1'." exit_cmd=exit } # func_split_equals STRING # ------------------------ # Set func_split_equals_lhs and func_split_equals_rhs shell variables after # splitting STRING at the '=' sign. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_equals () { $debug_cmd func_split_equals_lhs=${1%%=*} func_split_equals_rhs=${1#*=} test "x$func_split_equals_lhs" = "x$1" \ && func_split_equals_rhs= }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_equals () { $debug_cmd func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` func_split_equals_rhs= test "x$func_split_equals_lhs" = "x$1" \ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` } fi #func_split_equals # func_split_short_opt SHORTOPT # ----------------------------- # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_short_opt () { $debug_cmd func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"} }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_short_opt () { $debug_cmd func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` } fi #func_split_short_opt # func_usage # ---------- # Echo short help message to standard output and exit. func_usage () { $debug_cmd func_usage_message $ECHO "Run '$progname --help |${PAGER-more}' for full usage" exit 0 } # func_usage_message # ------------------ # Echo short help message to standard output. func_usage_message () { $debug_cmd eval \$ECHO \""Usage: $usage"\" echo $SED -n 's|^# || /^Written by/{ x;p;x } h /^Written by/q' < "$progpath" echo eval \$ECHO \""$usage_message"\" } # func_version # ------------ # Echo version message to standard output and exit. func_version () { $debug_cmd printf '%s\n' "$progname $scriptversion" $SED -n ' /(C)/!b go :more /\./!{ N s|\n# | | b more } :go /^# Written by /,/# warranty; / { s|^# || s|^# *$|| s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| p } /^# Written by / { s|^# || p } /^warranty; /q' < "$progpath" exit $? } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: # Set a version string. scriptversion='(GNU libtool) 2.4.6' # func_echo ARG... # ---------------- # Libtool also displays the current mode in messages, so override # funclib.sh func_echo with this custom definition. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" done IFS=$func_echo_IFS } # func_warning ARG... # ------------------- # Libtool warnings are not categorized, so override funclib.sh # func_warning with this simpler definition. func_warning () { $debug_cmd $warning_func ${1+"$@"} } ## ---------------- ## ## Options parsing. ## ## ---------------- ## # Hook in the functions to make sure our own options are parsed during # the option parsing loop. usage='$progpath [OPTION]... [MODE-ARG]...' # Short help message in response to '-h'. usage_message="Options: --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --mode=MODE use operation mode MODE --no-warnings equivalent to '-Wnone' --preserve-dup-deps don't remove duplicate dependency libraries --quiet, --silent don't print informational messages --tag=TAG use configuration variables from tag TAG -v, --verbose print more informational messages than default --version print version information -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -h, --help, --help-all print short, long, or detailed help message " # Additional text appended to 'usage_message' in response to '--help'. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. When passed as first option, '--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. Try '$progname --help --mode=MODE' for a more detailed description of MODE. When reporting a bug, please describe a test case to reproduce it and include the following information: host-triplet: $host shell: $SHELL compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) version: $progname $scriptversion Debian-2.4.6-2 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . GNU libtool home page: . General help using GNU software: ." exit 0 } # func_lo2o OBJECT-NAME # --------------------- # Transform OBJECT-NAME from a '.lo' suffix to the platform specific # object suffix. lo2o=s/\\.lo\$/.$objext/ o2lo=s/\\.$objext\$/.lo/ if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_lo2o () { case $1 in *.lo) func_lo2o_result=${1%.lo}.$objext ;; * ) func_lo2o_result=$1 ;; esac }' # func_xform LIBOBJ-OR-SOURCE # --------------------------- # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) # suffix to a '.lo' libtool-object suffix. eval 'func_xform () { func_xform_result=${1%.*}.lo }' else # ...otherwise fall back to using sed. func_lo2o () { func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` } func_xform () { func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` } fi # func_fatal_configuration ARG... # ------------------------------- # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func__fatal_error ${1+"$@"} \ "See the $PACKAGE documentation for more information." \ "Fatal configuration error." } # func_config # ----------- # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # ------------- # Display the features supported by this script. func_features () { echo "host: $host" if test yes = "$build_libtool_libs"; then echo "enable shared libraries" else echo "disable shared libraries" fi if test yes = "$build_old_libs"; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag TAGNAME # ----------------------- # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname=$1 re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf=/$re_begincf/,/$re_endcf/p # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # ------------------------ # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # libtool_options_prep [ARG]... # ----------------------------- # Preparation for options parsed by libtool. libtool_options_prep () { $debug_mode # Option defaults: opt_config=false opt_dlopen= opt_dry_run=false opt_help=false opt_mode= opt_preserve_dup_deps=false opt_quiet=false nonopt= preserve_args= # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Pass back the list of options. func_quote_for_eval ${1+"$@"} libtool_options_prep_result=$func_quote_for_eval_result } func_add_hook func_options_prep libtool_options_prep # libtool_parse_options [ARG]... # --------------------------------- # Provide handling for libtool specific options. libtool_parse_options () { $debug_cmd # Perform our own loop to consume as many options as possible in # each iteration. while test $# -gt 0; do _G_opt=$1 shift case $_G_opt in --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) func_config ;; --dlopen|-dlopen) opt_dlopen="${opt_dlopen+$opt_dlopen }$1" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) func_features ;; --finish) set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $_G_opt && break opt_mode=$1 case $1 in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $_G_opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_quiet=false func_append preserve_args " $_G_opt" ;; --no-warnings|--no-warning|--no-warn) opt_warning=false func_append preserve_args " $_G_opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $_G_opt" ;; --silent|--quiet) opt_quiet=: opt_verbose=false func_append preserve_args " $_G_opt" ;; --tag) test $# = 0 && func_missing_arg $_G_opt && break opt_tag=$1 func_append preserve_args " $_G_opt $1" func_enable_tag "$1" shift ;; --verbose|-v) opt_quiet=false opt_verbose=: func_append preserve_args " $_G_opt" ;; # An option not handled by this hook function: *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; esac done # save modified positional parameters for caller func_quote_for_eval ${1+"$@"} libtool_parse_options_result=$func_quote_for_eval_result } func_add_hook func_parse_options libtool_parse_options # libtool_validate_options [ARG]... # --------------------------------- # Perform any sanity checks on option settings and/or unconsumed # arguments. libtool_validate_options () { # save first non-option argument if test 0 -lt $#; then nonopt=$1 shift fi # preserve --debug test : = "$debug_cmd" || func_append preserve_args " --debug" case $host in # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match test yes != "$build_libtool_libs" \ && test yes != "$build_old_libs" \ && func_fatal_configuration "not configured to build any kind of library" # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test execute != "$opt_mode"; then func_error "unrecognized option '-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help=$help help="Try '$progname --help --mode=$opt_mode' for more information." } # Pass back the unparsed argument list func_quote_for_eval ${1+"$@"} libtool_validate_options_result=$func_quote_for_eval_result } func_add_hook func_validate_options libtool_validate_options # Process options as early as possible so that --help and --version # can return quickly. func_options ${1+"$@"} eval set dummy "$func_options_result"; shift ## ----------- ## ## Main. ## ## ----------- ## magic='%%%MAGIC variable%%%' magic_exe='%%%MAGIC EXE variable%%%' # Global variables. extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # func_generated_by_libtool # True iff stdin has been generated by Libtool. This function is only # a basic sanity check; it will hardly flush out determined imposters. func_generated_by_libtool_p () { $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p } # func_lalib_unsafe_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if 'file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case $lalib_p_line in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test yes = "$lalib_p" } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { test -f "$1" && $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $debug_cmd save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # 'FILE.' does not work on cygwin managed mounts. func_source () { $debug_cmd case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case $lt_sysroot:$1 in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result='='$func_stripname_result ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $debug_cmd if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with '--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=$1 if test yes = "$build_libtool_libs"; then write_lobj=\'$2\' else write_lobj=none fi if test yes = "$build_old_libs"; then write_oldobj=\'$3\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $debug_cmd # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result= if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result"; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $debug_cmd if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $debug_cmd # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $debug_cmd if test -z "$2" && test -n "$1"; then func_error "Could not determine host file name corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result=$1 fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $debug_cmd if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " '$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result=$3 fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $debug_cmd case $4 in $1 ) func_to_host_path_result=$3$func_to_host_path_result ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via '$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $debug_cmd $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $debug_cmd case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result=$1 } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result=$func_convert_core_msys_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result=$func_convert_core_file_wine_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via '$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $debug_cmd if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd=func_convert_path_$func_stripname_result fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $debug_cmd func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result=$1 } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_msys_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_path_wine_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_dll_def_p FILE # True iff FILE is a Windows DLL '.def' file. # Keep in sync with _LT_DLL_DEF_P in libtool.m4 func_dll_def_p () { $debug_cmd func_dll_def_p_tmp=`$SED -n \ -e 's/^[ ]*//' \ -e '/^\(;.*\)*$/d' \ -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ -e q \ "$1"` test DEF = "$func_dll_def_p_tmp" } # func_mode_compile arg... func_mode_compile () { $debug_cmd # Get the compilation command and the source file. base_compile= srcfile=$nonopt # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg=$arg arg_mode=normal ;; target ) libobj=$arg arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify '-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs=$IFS; IFS=, for arg in $args; do IFS=$save_ifs func_append_quoted lastarg "$arg" done IFS=$save_ifs func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg=$srcfile srcfile=$arg ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with '-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj=$func_basename_result } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from '$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test yes = "$build_libtool_libs" \ || func_fatal_configuration "cannot build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name '$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname=$func_basename_result xdir=$func_dirname_result lobj=$xdir$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test yes = "$build_old_libs"; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test no = "$compiler_c_o"; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext lockfile=$output_obj.lock else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test yes = "$need_locks"; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test warn = "$need_locks"; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test yes = "$build_libtool_libs"; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test no != "$pic_mode"; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test yes = "$suppress_opt"; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test yes = "$build_old_libs"; then if test yes != "$pic_mode"; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test yes = "$compiler_c_o"; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test no != "$need_locks"; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test compile = "$opt_mode" && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a '.o' file suitable for static linking -static only build a '.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a 'standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix '.c' with the library object suffix, '.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to '-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the '--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the 'install' or 'cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE use a list of object files found in FILE to specify objects -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with '-') are ignored. Every other argument is treated as a filename. Files ending in '.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in '.la', then a libtool library is created, only library objects ('.lo' files) may be specified, and '-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created using 'ar' and 'ranlib', or on Windows using 'lib'. If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode '$opt_mode'" ;; esac echo $ECHO "Try '$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test : = "$opt_help"; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | $SED -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | $SED '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $debug_cmd # The first argument is the command name. cmd=$nonopt test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "'$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "'$file' was not linked with '-export-dynamic'" continue fi func_dirname "$file" "" "." dir=$func_dirname_result if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir=$func_dirname_result ;; *) func_warning "'-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir=$absdir # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic=$magic # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file=$progdir/$program elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file=$progdir/$program fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if $opt_dry_run; then # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS else if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd=\$cmd$args fi } test execute = "$opt_mode" && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $debug_cmd libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "'$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument '$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and '=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_quiet && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the '-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the '$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the '$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the '$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test finish = "$opt_mode" && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $debug_cmd # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=false stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=: ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test X-m = "X$prev" && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the '$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=: if $isdir; then destdir=$dest destname= else func_dirname_and_basename "$dest" "" "." destdir=$func_dirname_result destname=$func_basename_result # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "'$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "'$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir=$func_dirname_result func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking '$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname=$1 shift srcname=$realname test -n "$relink_command" && srcname=${realname}T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme=$stripme case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme= ;; esac ;; os2*) case $realname in *_dll.a) tstripme= ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try 'ln -sf' first, because the 'ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib=$destdir/$realname func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name=$func_basename_result instname=$dir/${name}i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest=$destfile destfile= ;; *) func_fatal_help "cannot copy a libtool object to '$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test yes = "$build_old_libs"; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext= case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=.exe fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script '$wrapper'" finalize=: for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` if test -n "$libdir" && test ! -f "$libfile"; then func_warning "'$lib' has not been installed in '$libdir'" finalize=false fi done relink_command= func_source "$wrapper" outputname= if test no = "$fast_install" && test -n "$relink_command"; then $opt_dry_run || { if $finalize; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file=$func_basename_result outputname=$tmpdir/$file # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_quiet || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink '$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file=$outputname else func_warning "cannot relink '$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name=$func_basename_result # Set up the ranlib parameters. oldlib=$destdir/$name func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run '$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test install = "$opt_mode" && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $debug_cmd my_outputname=$1 my_originator=$2 my_pic_p=${3-false} my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms=${my_outputname}S.c else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist=$output_objdir/$my_outputname.nm func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* External symbol declarations for the compiler. */\ " if test yes = "$dlself"; then func_verbose "generating symbol list for '$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from '$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols=$output_objdir/$outputname.exp $opt_dry_run || { $RM $export_symbols eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from '$dlprefile'" func_basename "$dlprefile" name=$func_basename_result case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename= if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname"; then func_basename "$dlprefile_dlname" dlprefile_dlbasename=$func_basename_result else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename"; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi func_show_eval '$RM "${nlist}I"' if test -n "$global_symbol_to_import"; then eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[];\ " if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ static void lt_syminit(void) { LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; for (; symbol->name; ++symbol) {" $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" echo >> "$output_objdir/$my_dlsyms" "\ } }" fi echo >> "$output_objdir/$my_dlsyms" "\ LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = { {\"$my_originator\", (void *) 0}," if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ {\"@INIT@\", (void *) <_syminit}," fi case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) $my_pic_p && pic_flag_for_symtable=" $pic_flag" ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' # Transform the symbol file into the correct name. symfileobj=$output_objdir/${my_outputname}S.$objext case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for '$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $debug_cmd win32_libid_type=unknown win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then case $nm_interface in "MS dumpbin") if func_cygming_ms_implib_p "$1" || func_cygming_gnu_implib_p "$1" then win32_nmres=import else win32_nmres= fi ;; *) func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s|.*|import| p q } }'` ;; esac case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $debug_cmd sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $debug_cmd match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive that possess that section. Heuristic: eliminate # all those that have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $debug_cmd if func_cygming_gnu_implib_p "$1"; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1"; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result= fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $debug_cmd f_ex_an_ar_dir=$1; shift f_ex_an_ar_oldlib=$1 if test yes = "$lock_old_archive_extraction"; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test yes = "$lock_old_archive_extraction"; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $debug_cmd my_gentop=$1; shift my_oldlibs=${1+"$@"} my_oldobjs= my_xlib= my_xabs= my_xdir= for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib=$func_basename_result my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir=$my_gentop/$my_xlib_u func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` func_basename "$darwin_archive" darwin_base_archive=$func_basename_result darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches; do func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" cd "unfat-$$/$darwin_base_archive-$darwin_arch" func_extract_an_archive "`pwd`" "$darwin_base_archive" cd "$darwin_curdir" $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result=$my_oldobjs } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory where it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ that is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options that match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test yes = "$fast_install"; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else \$ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* declarations of non-ANSI functions */ #if defined __MINGW32__ # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined __CYGWIN__ # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined other_platform || defined ... */ #endif /* portability defines, excluding path handling macros */ #if defined _MSC_VER # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC #elif defined __MINGW32__ # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined __CYGWIN__ # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined other platforms ... */ #endif #if defined PATH_MAX # define LT_PATHMAX PATH_MAX #elif defined MAXPATHLEN # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ defined __OS2__ # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free (stale); stale = 0; } \ } while (0) #if defined LT_DEBUGWRAPPER static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; size_t tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined HAVE_DOS_BASED_FILE_SYSTEM if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined HAVE_DOS_BASED_FILE_SYSTEM } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = (size_t) (q - p); p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (STREQ (str, pat)) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else size_t len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { size_t orig_value_len = strlen (orig_value); size_t add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ size_t len = strlen (new_value); while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[--len] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $debug_cmd case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_suncc_cstd_abi # !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! # Several compiler flags select an ABI that is incompatible with the # Cstd library. Avoid specifying it if any are in CXXFLAGS. func_suncc_cstd_abi () { $debug_cmd case " $compile_command " in *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) suncc_use_cstd_abi=no ;; *) suncc_use_cstd_abi=yes ;; esac } # func_mode_link arg... func_mode_link () { $debug_cmd case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # what system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll that has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= os2dllname= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=false prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module=$wl-single_module func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test yes != "$build_libtool_libs" \ && func_fatal_configuration "cannot build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg=$1 shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir=$arg prev= continue ;; dlfiles|dlprefiles) $preload || { # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=: } case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test no = "$dlself"; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test dlprefiles = "$prev"; then dlself=yes elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test dlfiles = "$prev"; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols=$arg test -f "$arg" \ || func_fatal_error "symbol file '$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex=$arg prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir=$arg prev= continue ;; mllvm) # Clang does not use LLVM to link, so we can simply discard any # '-mllvm $arg' options when doing the link step. prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result if test none != "$pic_object"; then # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object fi # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file '$arg' does not exist" fi arg=$save_arg prev= continue ;; os2dllname) os2dllname=$arg prev= continue ;; precious_regex) precious_files_regex=$arg prev= continue ;; release) release=-$arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test rpath = "$prev"; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds=$arg prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg=$arg case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "'-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test X-export-symbols = "X$arg"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between '-L' and '$1'" else func_fatal_error "need path for '-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of '$dir'" dir=$absdir ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test X-lc = "X$arg" || test X-lm = "X$arg"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test X-lc = "X$arg" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc due to us having libc/libc_r. test X-lc = "X$arg" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test X-lc = "X$arg" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test X-lc = "X$arg" && continue ;; esac elif test X-lc_r = "X$arg"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -mllvm) prev=mllvm continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module=$wl-multi_module continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "'-no-install' is ignored for $host" func_warning "assuming '-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -os2dllname) prev=os2dllname continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # -fstack-protector* stack protector flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization # -specs=* GCC specs files # -stdlib=* select c++ std lib with clang # -fsanitize=* Clang/GCC memory and address sanitizer -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ -specs=*|-fsanitize=*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; -Z*) if test os2 = "`expr $host : '.*\(os2\)'`"; then # OS/2 uses -Zxxx to specify OS/2-specific options compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case $arg in -Zlinker | -Zstack) prev=xcompiler ;; esac continue else # Otherwise treat like 'Some other compiler flag' below func_quote_for_eval "$arg" arg=$func_quote_for_eval_result fi ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result test none = "$pic_object" || { # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object } # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test dlfiles = "$prev"; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test dlprefiles = "$prev"; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the '$prevarg' option requires an argument" if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname=$func_basename_result libobjs_save=$libobjs if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" # Definition is injected by LT_CONFIG during libtool generation. func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" func_dirname "$output" "/" "" output_objdir=$func_dirname_result$objdir func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test lib = "$linkmode"; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=false newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test lib,link = "$linkmode,$pass"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs=$tmp_deplibs fi if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass"; then libs=$deplibs deplibs= fi if test prog = "$linkmode"; then case $pass in dlopen) libs=$dlfiles ;; dlpreopen) libs=$dlprefiles ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test lib,dlpreopen = "$linkmode,$pass"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs=$dlprefiles fi if test dlopen = "$pass"; then # Collect dlpreopened libraries save_deplibs=$deplibs deplibs= fi for deplib in $libs; do lib= found=false case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test lib != "$linkmode" && test prog != "$linkmode"; then func_warning "'-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test lib = "$linkmode"; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib=$searchdir/lib$name$search_ext if test -f "$lib"; then if test .la = "$search_ext"; then found=: else found=false fi break 2 fi done done if $found; then # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll=$l done if test "X$ll" = "X$old_library"; then # only static version available found=false func_dirname "$lib" "" "." ladir=$func_dirname_result lib=$ladir/$old_library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi else # deplib doesn't seem to be a libtool library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi ;; # -l *.ltframework) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test conv = "$pass" && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi if test scan = "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "'-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test link = "$pass"; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=false case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=: fi ;; pass_all) valid_a_lib=: ;; esac if $valid_a_lib; then echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" else echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." fi ;; esac continue ;; prog) if test link != "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test conv = "$pass"; then deplibs="$deplib $deplibs" elif test prog = "$linkmode"; then if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=: continue ;; esac # case $deplib $found || test -f "$lib" \ || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "'$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir=$func_dirname_result dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass" || { test prog != "$linkmode" && test lib != "$linkmode"; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test conv = "$pass"; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for '$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done elif test prog != "$linkmode" && test lib != "$linkmode"; then func_fatal_error "'$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test yes = "$prefer_static_libs" || test built,no = "$prefer_static_libs,$installed"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib=$l done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for '$lib'" fi # This library was specified with -dlopen. if test dlopen = "$pass"; then test -z "$libdir" \ && func_fatal_error "cannot -dlopen a convenience library: '$lib'" if test -z "$dlname" || test yes != "$dlopen_support" || test no = "$build_libtool_libs" then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of '$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir=$ladir fi ;; esac func_basename "$lib" laname=$func_basename_result # Find the relevant object directory and library name. if test yes = "$installed"; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library '$lib' was moved." dir=$ladir absdir=$abs_ladir libdir=$abs_ladir else dir=$lt_sysroot$libdir absdir=$lt_sysroot$libdir fi test yes = "$hardcode_automatic" && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir=$ladir absdir=$abs_ladir # Remove this search path later func_append notinst_path " $abs_ladir" else dir=$ladir/$objdir absdir=$abs_ladir/$objdir # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test dlpreopen = "$pass"; then if test -z "$libdir" && test prog = "$linkmode"; then func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" fi case $host in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test lib = "$linkmode"; then deplibs="$dir/$old_library $deplibs" elif test prog,link = "$linkmode,$pass"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test prog = "$linkmode" && test link != "$pass"; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=false if test no != "$link_all_deplibs" || test -z "$library_names" || test no = "$build_libtool_libs"; then linkalldeplibs=: fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if $linkalldeplibs; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test prog,link = "$linkmode,$pass"; then if test -n "$library_names" && { { test no = "$prefer_static_libs" || test built,yes = "$prefer_static_libs,$installed"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then # Make sure the rpath contains only unique directories. case $temp_rpath: in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if $alldeplibs && { test pass_all = "$deplibs_check_method" || { test yes = "$build_libtool_libs" && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test built = "$use_static_libs" && test yes = "$installed"; then use_static_libs=no fi if test -n "$library_names" && { test no = "$use_static_libs" || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc* | *os2*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test no = "$installed"; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule= for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule=$dlpremoduletest break fi done if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then echo if test prog = "$linkmode"; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test lib = "$linkmode" && test yes = "$hardcode_into_libs"; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname=$1 shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname=$dlname elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc* | *os2*) func_arith $current - $age major=$func_arith_result versuffix=-$major ;; esac eval soname=\"$soname_spec\" else soname=$realname fi # Make a new name for the extract_expsyms_cmds to use soroot=$soname func_basename "$soroot" soname=$func_basename_result func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from '$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for '$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test prog = "$linkmode" || test relink != "$opt_mode"; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test no = "$hardcode_direct"; then add=$dir/$linklib case $host in *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; *-*-sysv4*uw2*) add_dir=-L$dir ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir=-L$dir ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we cannot # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library"; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add=$dir/$old_library fi elif test -n "$old_library"; then add=$dir/$old_library fi fi esac elif test no = "$hardcode_minus_L"; then case $host in *-*-sunos*) add_shlibpath=$dir ;; esac add_dir=-L$dir add=-l$name elif test no = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; relink) if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$dir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$absdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name elif test yes = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; *) lib_linked=no ;; esac if test yes != "$lib_linked"; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test prog = "$linkmode"; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test yes != "$hardcode_direct" && test yes != "$hardcode_minus_L" && test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test prog = "$linkmode" || test relink = "$opt_mode"; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$libdir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$libdir add=-l$name elif test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add=-l$name elif test yes = "$hardcode_automatic"; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib"; then add=$inst_prefix_dir$libdir/$linklib else add=$libdir/$linklib fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir=-L$libdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name fi if test prog = "$linkmode"; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test prog = "$linkmode"; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test unsupported != "$hardcode_direct"; then test -n "$old_library" && linklib=$old_library compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test yes = "$build_libtool_libs"; then # Not a shared library if test pass_all != "$deplibs_check_method"; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system cannot link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test yes = "$module"; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test lib = "$linkmode"; then if test -n "$dependency_libs" && { test yes != "$hardcode_into_libs" || test yes = "$build_old_libs" || test yes = "$link_static"; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs=$temp_deplibs fi func_append newlib_search_path " $absdir" # Link against this library test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test no != "$link_all_deplibs"; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path=$deplib ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of '$dir'" absdir=$dir fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names"; then for tmp in $deplibrary_names; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl"; then depdepl=$absdir/$objdir/$depdepl darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" path= fi fi ;; *) path=-L$absdir/$objdir ;; esac else eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "'$deplib' seems to be moved" path=-L$absdir fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test link = "$pass"; then if test prog = "$linkmode"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs=$newdependency_libs if test dlpreopen = "$pass"; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test dlopen != "$pass"; then test conv = "$pass" || { # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= } if test prog,link = "$linkmode,$pass"; then vars="compile_deplibs finalize_deplibs" else vars=deplibs fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Add Sun CC postdeps if required: test CXX = "$tagname" && { case $host_os in linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; solaris*) func_cc_basename "$CC" case $func_cc_basename_result in CC* | sunCC*) func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; esac } # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i= ;; esac if test -n "$i"; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test prog = "$linkmode"; then dlfiles=$newdlfiles fi if test prog = "$linkmode" || test lib = "$linkmode"; then dlprefiles=$newdlprefiles fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "'-R' is ignored for archives" test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "'-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "'-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs=$output func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form 'libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test no = "$module" \ && func_fatal_help "libtool library '$output' must begin with 'lib'" if test no != "$need_lib_prefix"; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test pass_all != "$deplibs_check_method"; then func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test no = "$dlself" \ || func_warning "'-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test 1 -lt "$#" \ && func_warning "ignoring multiple '-rpath's for a libtool library" install_libdir=$1 oldlibs= if test -z "$rpath"; then if test yes = "$build_libtool_libs"; then # Building a libtool convenience library. # Some compilers have problems with a '.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "'-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs=$IFS; IFS=: set dummy $vinfo 0 0 0 shift IFS=$save_ifs test -n "$7" && \ func_fatal_help "too many parameters to '-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major=$1 number_minor=$2 number_revision=$3 # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # that has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|freebsd-elf|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_revision ;; freebsd-aout|qnx|sunos) current=$number_major revision=$number_minor age=0 ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_minor lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type '$version_type'" ;; esac ;; no) current=$1 revision=$2 age=$3 ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT '$current' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION '$revision' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE '$age' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE '$age' is greater than the current interface number '$current'" func_fatal_error "'$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" # On Darwin other compilers case $CC in nagfor*) verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" ;; *) verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; esac ;; freebsd-aout) major=.$current versuffix=.$current.$revision ;; freebsd-elf) func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; irix | nonstopux) if test no = "$lt_irix_increment"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring=$verstring_prefix$major.$revision # Add in all the interfaces that we are compatible with. loop=$revision while test 0 -ne "$loop"; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring_prefix$major.$iface:$verstring done # Before this point, $major must not contain '.'. major=.$major versuffix=$major.$revision ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=.$current.$age.$revision verstring=$current.$age.$revision # Add in all the interfaces that we are compatible with. loop=$age while test 0 -ne "$loop"; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring:$iface.0 done # Make executables depend on our current version. func_append verstring ":$current.0" ;; qnx) major=.$current versuffix=.$current ;; sco) major=.$current versuffix=.$current ;; sunos) major=.$current versuffix=.$current.$revision ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 file systems. func_arith $current - $age major=$func_arith_result versuffix=-$major ;; *) func_fatal_configuration "unknown library version type '$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring=0.0 ;; esac if test no = "$need_version"; then versuffix= else versuffix=.0.0 fi fi # Remove version info from name if versioning should be avoided if test yes,no = "$avoid_version,$need_version"; then major= versuffix= verstring= fi # Check to see if the archive will have undefined symbols. if test yes = "$allow_undefined"; then if test unsupported = "$allow_undefined_flag"; then if test yes = "$build_old_libs"; then func_warning "undefined symbols not allowed in $host shared libraries; building static only" build_libtool_libs=no else func_fatal_error "can't build $host shared library unless -no-undefined is specified" fi fi else # Don't allow undefined symbols. allow_undefined_flag=$no_undefined_flag fi fi func_generate_dlsyms "$libname" "$libname" : func_append libobjs " $symfileobj" test " " = "$libobjs" && libobjs= if test relink != "$opt_mode"; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) if test -n "$precious_files_regex"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles=$dlfiles dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles=$dlprefiles dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test yes = "$build_libtool_libs"; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test yes = "$build_libtool_need_lc"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release= versuffix= major= newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib=$potent_lib while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | $SED 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib= ;; esac fi if test -n "$a_deplib"; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib=$potent_lib # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs= tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test yes = "$allow_libtool_libs_with_static_runtimes"; then for i in $predeps $postdeps; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test none = "$deplibs_check_method"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test yes = "$droppeddeps"; then if test yes = "$module"; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test no = "$allow_undefined"; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs=$new_libs # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test yes = "$build_libtool_libs"; then # Remove $wl instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test yes = "$hardcode_into_libs"; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath=$finalize_rpath test relink = "$opt_mode" || rpath=$compile_rpath$rpath for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath=$finalize_shlibpath test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname=$1 shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname=$realname fi if test -z "$dlname"; then dlname=$soname fi lib=$output_objdir/$realname linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols=$output_objdir/$libname.uexp func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile func_dll_def_p "$export_symbols" || { # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols=$export_symbols export_symbols= always_export_symbols=yes } fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs=$IFS; IFS='~' for cmd1 in $cmds; do IFS=$save_ifs # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test yes = "$try_normal_branch" \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=$output_objdir/$output_la.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS=$save_ifs if test -n "$export_symbols_regex" && test : != "$skipped_export"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test : != "$skipped_export" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs=$tmp_deplibs if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test yes = "$compiler_needs_object" && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test : != "$skipped_export" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then output=$output_objdir/$output_la.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then output=$output_objdir/$output_la.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test yes = "$compiler_needs_object"; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-$k.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test -z "$objlist" || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test 1 -eq "$k"; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-$k.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-$k.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi ${skipped_export-false} && { func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi } test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs=$IFS; IFS='~' for cmd in $concat_cmds; do IFS=$save_ifs $opt_quiet || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi ${skipped_export-false} && { if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi } libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs=$IFS; IFS='~' for cmd in $cmds; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs $opt_quiet || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs # Restore the uninstalled library and exit if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test yes = "$module" || test yes = "$export_dynamic"; then # On all known operating systems, these are identical. dlname=$soname fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "'-R' is ignored for objects" test -n "$vinfo" && \ func_warning "'-version-info' is ignored for objects" test -n "$release" && \ func_warning "'-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object '$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj=$output ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # if reload_cmds runs $LD directly, get rid of -Wl from # whole_archive_flag_spec and hope we can get by with turning comma # into space. case $reload_cmds in *\$LD[\ \$]*) wl= ;; esac if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags else gentop=$output_objdir/${obj}x func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test yes = "$build_libtool_libs" || libobjs=$non_pic_objects # Create the old-style object. reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs output=$obj func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi test yes = "$build_libtool_libs" || { if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS } if test -n "$pic_flag" || test default != "$pic_mode"; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output=$libobj func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "'-version-info' is ignored for programs" test -n "$release" && \ func_warning "'-release' is ignored for programs" $preload \ && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test CXX = "$tagname"; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " $wl-bind_at_load" func_append finalize_command " $wl-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs=$new_libs func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath=$rpath rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath=$rpath if test -n "$libobjs" && test yes = "$build_old_libs"; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" false # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=: case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=false ;; *cygwin* | *mingw* ) test yes = "$build_libtool_libs" || wrappers_required=false ;; *) if test no = "$need_relink" || test yes != "$build_libtool_libs"; then wrappers_required=false fi ;; esac $wrappers_required || { # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command=$compile_command$compile_rpath # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.$objext"; then func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' fi exit $exit_status } if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test yes = "$no_install"; then # We don't need to create a wrapper script. link_command=$compile_var$compile_command$compile_rpath # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi case $hardcode_action,$fast_install in relink,*) # Fast installation is not supported link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath func_warning "this platform does not like uninstalled shared libraries" func_warning "'$output' will be relinked during installation" ;; *,yes) link_command=$finalize_var$compile_command$finalize_rpath relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` ;; *,no) link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath ;; *,needless) link_command=$finalize_var$compile_command$finalize_rpath relink_command= ;; esac # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource=$output_path/$objdir/lt-$output_name.c cwrapper=$output_path/$output_name.exe $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host"; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do case $build_libtool_libs in convenience) oldobjs="$libobjs_save $symfileobj" addlibs=$convenience build_libtool_libs=no ;; module) oldobjs=$libobjs_save addlibs=$old_convenience build_libtool_libs=no ;; *) oldobjs="$old_deplibs $non_pic_objects" $preload && test -f "$symfileobj" \ && func_append oldobjs " $symfileobj" addlibs=$old_convenience ;; esac if test -n "$addlibs"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase=$func_basename_result case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj"; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test -z "$oldobjs"; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test yes = "$build_old_libs" && old_library=$libname.$libext func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test yes = "$hardcode_automatic"; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test yes = "$installed"; then if test -z "$install_libdir"; then break fi output=$output_objdir/${outputname}i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name=$func_basename_result func_resolve_sysroot "$deplib" eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs=$newdependency_libs newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles=$newdlprefiles else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles=$newdlprefiles fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test -n "$bindir"; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result/$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that cannot go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test no,yes = "$installed,$need_relink"; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } if test link = "$opt_mode" || test relink = "$opt_mode"; then func_mode_link ${1+"$@"} fi # func_mode_uninstall arg... func_mode_uninstall () { $debug_cmd RM=$nonopt files= rmforce=false exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic for arg do case $arg in -f) func_append RM " $arg"; rmforce=: ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir=$func_dirname_result if test . = "$dir"; then odir=$objdir else odir=$dir/$objdir fi func_basename "$file" name=$func_basename_result test uninstall = "$opt_mode" && odir=$dir # Remember odir for removal later, being careful to avoid duplicates if test clean = "$opt_mode"; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif $rmforce; then continue fi rmfiles=$file case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case $opt_mode in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test none != "$pic_object"; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test none != "$non_pic_object"; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test clean = "$opt_mode"; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.$objext" if test yes = "$fast_install" && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name"; then func_append rmfiles " $odir/lt-$noexename.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the $objdir's in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then func_mode_uninstall ${1+"$@"} fi test -z "$opt_mode" && { help=$generic_help func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode '$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # where we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: modsecurity-2.9.5/build/find_xml.m40000664000175000017500000000543614147005233020370 0ustar mhsvierulamhsvieruladnl Check for LIBXML2 Libraries dnl CHECK_LIBXML2(ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]) dnl Sets: dnl LIBXML2_CFLAGS dnl LIBXML2_LIBS LIBXML2_CONFIG="" LIBXML2_VERSION="" LIBXML2_CFLAGS="" LIBXML2_CPPFLAGS="" LIBXML2_LDADD="" LIBXML2_LDFLAGS="" AC_DEFUN([CHECK_LIBXML2], [dnl AC_ARG_WITH( libxml, [AC_HELP_STRING([--with-libxml=PATH],[Path to libxml2 prefix or config script])], [test_paths="${with_libxml}"], [test_paths="/usr/local/libxml2 /usr/local/xml2 /usr/local/xml /usr/local /opt/libxml2 /opt/libxml /opt/xml2 /opt/xml /opt /usr"]) AC_MSG_CHECKING([for libxml2 config script]) for x in ${test_paths}; do dnl # Determine if the script was specified and use it directly if test ! -d "$x" -a -e "$x"; then LIBXML2_CONFIG=$x libxml2_path="no" break fi dnl # Try known config script names/locations for LIBXML2_CONFIG in xml2-config xml-2-config xml-config; do if test -e "${x}/bin/${LIBXML2_CONFIG}"; then libxml2_path="${x}/bin" break elif test -e "${x}/${LIBXML2_CONFIG}"; then libxml2_path="${x}" break else libxml2_path="" fi done if test -n "$libxml2_path"; then break fi done if test -n "${libxml2_path}"; then if test "${libxml2_path}" != "no"; then LIBXML2_CONFIG="${libxml2_path}/${LIBXML2_CONFIG}" fi AC_MSG_RESULT([${LIBXML2_CONFIG}]) LIBXML2_VERSION=`${LIBXML2_CONFIG} --version | sed 's/^[[^0-9]][[^[:space:]]][[^[:space:]]]*[[[:space:]]]*//'` if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(xml VERSION: $LIBXML2_VERSION); fi LIBXML2_CFLAGS="`${LIBXML2_CONFIG} --cflags`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(xml CFLAGS: $LIBXML2_CFLAGS); fi LIBXML2_LDADD="`${LIBXML2_CONFIG} --libs`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(xml LDADD: $LIBXML2_LDADD); fi AC_MSG_CHECKING([if libxml2 is at least v2.6.29]) libxml2_min_ver=`echo 2.6.29 | awk -F. '{print (\$ 1 * 1000000) + (\$ 2 * 1000) + \$ 3}'` libxml2_ver=`echo ${LIBXML2_VERSION} | awk -F. '{print (\$ 1 * 1000000) + (\$ 2 * 1000) + \$ 3}'` if test "$libxml2_ver" -ge "$libxml2_min_ver"; then AC_MSG_RESULT([yes, $LIBXML2_VERSION]) else AC_MSG_RESULT([no, $LIBXML2_VERSION]) AC_MSG_ERROR([NOTE: libxml2 library must be at least 2.6.29]) fi else AC_MSG_RESULT([no]) fi AC_SUBST(LIBXML2_CONFIG) AC_SUBST(LIBXML2_VERSION) AC_SUBST(LIBXML2_CFLAGS) AC_SUBST(LIBXML2_CPPFLAGS) AC_SUBST(LIBXML2_LDADD) AC_SUBST(LIBXML2_LDFLAGS) if test -z "${LIBXML2_VERSION}"; then AC_MSG_NOTICE([*** xml library not found.]) ifelse([$2], , AC_MSG_ERROR([libxml2 is required]), $2) else AC_MSG_NOTICE([using libxml2 v${LIBXML2_VERSION}]) ifelse([$1], , , $1) fi ]) modsecurity-2.9.5/build/find_yajl.m40000664000175000017500000001047014147005233020521 0ustar mhsvierulamhsvieruladnl Check for YAJL Libraries dnl CHECK_YAJL(ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]) dnl Sets: dnl YAJL_CFLAGS dnl YAJL_LDADD dnl YAJL_LDFLAGS dnl YAJL_LIBS AC_DEFUN([CHECK_YAJL], [dnl AC_REQUIRE([PKG_PROG_PKG_CONFIG]) YAJL_CONFIG="" YAJL_VERSION="" YAJL_CFLAGS="" YAJL_CPPFLAGS="" YAJL_LDADD="" YAJL_LDFLAGS="" YAJL_CONFIG=${PKG_CONFIG} YAJL_PKGNAMES="yajl2 yajl" YAJL_SONAMES="so la sl dll dylib" AC_ARG_WITH( yajl, [AC_HELP_STRING([--with-yajl=PATH],[Path to yajl prefix or config script])] ,, with_yajl=yes) AS_CASE(["${with_yajl}"], [no], [test_paths=], [yes], [test_paths="/usr/local/libyajl /usr/local/yajl /usr/local /opt/libyajl /opt/yajl /opt /usr"], [test_paths="${with_yajl}"]) AS_IF([test "x${test_paths}" != "x"], [ AC_MSG_CHECKING([for libyajl config script]) for x in ${test_paths}; do dnl # Determine if the script was specified and use it directly if test ! -d "$x" -a -e "$x"; then YAJL_CONFIG=$x break fi dnl # Try known config script names/locations for y in $YAJL_CONFIG; do if test -e "${x}/bin/${y}"; then YAJL_CONFIG="${x}/bin/${y}" yajl_config="${YAJL_CONFIG}" break elif test -e "${x}/${y}"; then YAJL_CONFIG="${x}/${y}" yajl_config="${YAJL_CONFIG}" break fi done if test -n "${yajl_config}"; then break fi done dnl # Try known package names if test -n "${YAJL_CONFIG}"; then YAJL_PKGNAME="" for x in ${YAJL_PKGNAMES}; do if ${YAJL_CONFIG} --exists ${x}; then YAJL_PKGNAME="$x" break fi done fi if test -n "${YAJL_PKGNAME}"; then AC_MSG_RESULT([${YAJL_CONFIG}]) YAJL_VERSION="`${YAJL_CONFIG} ${YAJL_PKGNAME} --modversion`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(yajl VERSION: $YAJL_VERSION); fi YAJL_CFLAGS="`${YAJL_CONFIG} ${YAJL_PKGNAME} --cflags`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(yajl CFLAGS: $YAJL_CFLAGS); fi YAJL_LDADD="`${YAJL_CONFIG} ${YAJL_PKGNAME} --libs-only-l`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(yajl LDADD: $YAJL_LDADD); fi YAJL_LDFLAGS="`${YAJL_CONFIG} ${YAJL_PKGNAME} --libs-only-L --libs-only-other`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(yajl LDFLAGS: $YAJL_LDFLAGS); fi else AC_MSG_RESULT([no]) dnl Hack to just try to find the lib and include AC_MSG_CHECKING([for yajl install]) for x in ${test_paths}; do for y in ${YAJL_SONAMES}; do if test -e "${x}/libyajl.${y}"; then yajl_lib_path="${x}/" yajl_lib_name="yajl" break else yajl_lib_path="" yajl_lib_name="" fi done if test -n "$yajl_lib_path"; then break fi done for x in ${test_paths}; do if test -e "${x}/include/yajl_parse.h"; then yajl_inc_path="${x}/include" break elif test -e "${x}/yajl_parse.h"; then yajl_inc_path="${x}" break fi dnl # Check some sub-paths as well for yajl_pkg_name in ${yajl_lib_name} ${YAJL_PKGNAMES}; do if test -e "${x}/include/${yajl_pkg_name}/yajl_parse.h"; then yajl_inc_path="${x}/include" break elif test -e "${x}/${yajl_pkg_name}/yajl_parse.h"; then yajl_inc_path="${x}" break else yajl_inc_path="" fi done if test -n "$yajl_inc_path"; then break fi done if test -n "${yajl_lib_path}" -a -n "${yajl_inc_path}"; then YAJL_CONFIG="" AC_MSG_RESULT([${yajl_lib_path} ${yajl_inc_path}]) YAJL_VERSION="2" YAJL_CFLAGS="-I${yajl_inc_path}" YAJL_LDADD="-l${yajl_lib_name}" YAJL_LDFLAGS="-L${yajl_lib_path}" else YAJL_VERSION="" AC_MSG_RESULT([no]) fi fi ]) YAJL_LIBS=${YAJL_LDADD} AC_SUBST(YAJL_CFLAGS) AC_SUBST(YAJL_LDADD) AC_SUBST(YAJL_LIBS) AC_SUBST(YAJL_LDFLAGS) if test -z "${YAJL_VERSION}"; then ifelse([$2], , AC_MSG_NOTICE([optional yajl library not found]), $2) else AC_MSG_NOTICE([using yajl v${YAJL_VERSION}]) YAJL_CFLAGS="-DWITH_YAJL ${YAJL_CFLAGS}" ifelse([$1], , , $1) fi ]) modsecurity-2.9.5/build/missing0000755000175000017500000001533014147005250017714 0ustar mhsvierulamhsvierula#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2014 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: modsecurity-2.9.5/build/ltversion.m40000644000175000017500000000127314147005237020612 0ustar mhsvierulamhsvierula# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 4179 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.6]) m4_define([LT_PACKAGE_REVISION], [2.4.6]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.6' macro_revision='2.4.6' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) modsecurity-2.9.5/build/compile0000755000175000017500000001624514147005250017701 0ustar mhsvierulamhsvierula#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2014 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: modsecurity-2.9.5/build/lt~obsolete.m40000644000175000017500000001377414147005237021150 0ustar mhsvierulamhsvierula# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software # Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) modsecurity-2.9.5/build/config.sub0000755000175000017500000010645014147005250020304 0ustar mhsvierulamhsvierula#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-02-22' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ kopensolaris*-gnu* | cloudabi*-eabi* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo "$1" | sed 's/-[^-]*$//'` if [ "$basic_machine" != "$1" ] then os=`echo "$1" | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pru \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | wasm32 \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pru-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | wasm32-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-pc os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; asmjs) basic_machine=asmjs-unknown ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2*) basic_machine=m68k-bull os=-sysv3 ;; e500v[12]) basic_machine=powerpc-unknown os=$os"spe" ;; e500v[12]-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=$os"spe" ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; nsv-tandem) basic_machine=nsv-tandem ;; nsx-tandem) basic_machine=nsx-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh5el) basic_machine=sh5le-unknown ;; simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; x64) basic_machine=x86_64-pc ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases that might get confused # with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # es1800 is here to avoid being matched by es* (a different OS) -es1800*) os=-ose ;; # Now accept the basic system types. # The portable systems comes first. # Each alternative MUST end in a * to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ | -midnightbsd*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -xray | -os68k* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo "$os" | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo "$os" | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo "$os" | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4*) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -pikeos*) # Until real need of OS specific support for # particular features comes up, bare metal # configurations are quite functional. case $basic_machine in arm*) os=-eabi ;; *) os=-elf ;; esac ;; -nacl*) ;; -ios) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; pru-*) os=-elf ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"` ;; esac echo "$basic_machine$os" exit # Local variables: # eval: (add-hook 'write-file-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: modsecurity-2.9.5/build/libtool.m40000644000175000017500000112617114147005237020237 0ustar mhsvierulamhsvierula# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 2014 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . ]) # serial 58 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_PREPARE_CC_BASENAME # ----------------------- m4_defun([_LT_PREPARE_CC_BASENAME], [ # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in @S|@*""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } ])# _LT_PREPARE_CC_BASENAME # _LT_CC_BASENAME(CC) # ------------------- # It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, # but that macro is also expanded into generated libtool script, which # arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], [m4_require([_LT_PREPARE_CC_BASENAME])dnl AC_REQUIRE([_LT_DECL_SED])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl func_cc_basename $1 cc_basename=$func_cc_basename_result ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from 'configure', and 'config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # 'config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain=$ac_aux_dir/ltmain.sh ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the 'libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to 'config.status' so that its # declaration there will have the same value as in 'configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags='_LT_TAGS'dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into 'config.status', and then the shell code to quote escape them in # for loops in 'config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # '#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test 0 = "$lt_write_fail" && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ '$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test 0 != $[#] do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try '$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try '$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 _LT_COPYING _LT_LIBTOOL_TAGS # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE _LT_PREPARE_MUNGE_PATH_LIST _LT_PREPARE_CC_BASENAME # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS=$save_LDFLAGS ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[[012]][[,.]]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test yes = "$lt_cv_ld_force_load"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], [ if test yes != "$lt_cv_apple_cc_single_mod"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script that will find a shell with a builtin # printf (that we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case $ECHO in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], [Search for dependent libraries within DIR (or the compiler's sysroot if not specified).])], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([$with_sysroot]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and where our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test yes = "[$]$2"; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ]) if test yes = "[$]$2"; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n "$lt_cv_sys_max_cmd_len"; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes = "$cross_compiling"; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen=shl_load], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen=dlopen], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) ]) ]) ]) ]) ]) ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links=nottested if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test no = "$hard_links"; then AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", [Define to the sub-directory where libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_PREPARE_MUNGE_PATH_LIST # --------------------------- # Make sure func_munge_path_list() is defined correctly. m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], [[# func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x@S|@2 in x) ;; *:) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" ;; x:*) eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; *::*) eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" ;; *) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; esac } ]])# _LT_PREPARE_PATH_LIST # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown AC_ARG_VAR([LT_SYS_LIBRARY_PATH], [User-defined run-time library search path.]) case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a[(]lib.so.V[)]' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], [Detected run-time system search path for libraries]) _LT_DECL([], [configure_time_lt_sys_library_path], [2], [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program that can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$1"; then lt_cv_path_MAGIC_CMD=$ac_dir/"$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac]) MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program that can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], [if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi]) rm -f conftest.i conftest2.i conftest.out]) ])# _LT_PATH_DD # _LT_CMD_TRUNCATE # ---------------- # find command to truncate a binary pipe m4_defun([_LT_CMD_TRUNCATE], [m4_require([_LT_PATH_DD]) AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], [printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) _LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], [Command to truncate a binary pipe]) ])# _LT_CMD_TRUNCATE # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_MAGIC_METHOD], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) AC_CACHE_CHECK([how to recognize dependent libraries], lt_cv_deplibs_check_method, [lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[[4-9]]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[[45]]*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi]) if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # _LT_DLL_DEF_P([FILE]) # --------------------- # True iff FILE is a Windows DLL '.def' file. # Keep in sync with func_dll_def_p in the libtool script AC_DEFUN([_LT_DLL_DEF_P], [dnl test DEF = "`$SED -n dnl -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl -e q dnl Only consider the first "real" line $1`" dnl ])# _LT_DLL_DEF_P # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM=-lm) ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test yes = "$GCC"; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], [Transform the output of nm into a list of symbols to manually relocate]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([nm_interface], [lt_cv_nm_interface], [1], [The name lister interface]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test yes = "$GCC"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS=$save_LDFLAGS]) if test yes = "$lt_cv_irix_exported_symbol"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi _LT_TAGVAR(link_all_deplibs, $1)=no else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; osf3*) if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test yes = "$GCC"; then wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test yes,yes = "$GCC,$enable_shared"; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC=$CC AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report what library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC=$lt_save_CC ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(GCC, $1)=$GXX _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case @S|@2 in .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)=$prev$p else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)=$p else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)=$p else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test no = "$F77"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_F77"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$G77 _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_F77" AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test no = "$FC"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_FC"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_FC" AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code=$lt_simple_compile_test_code # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f "$lt_ac_sed" && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test 10 -lt "$lt_ac_count" && break lt_ac_count=`expr $lt_ac_count + 1` if test "$lt_ac_count" -gt "$lt_ac_max"; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine what file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS modsecurity-2.9.5/build/find_pcre.m40000664000175000017500000000465614147005233020524 0ustar mhsvierulamhsvieruladnl Check for PCRE Libraries dnl CHECK_PCRE(ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]) dnl Sets: dnl PCRE_CFLAGS dnl PCRE_LIBS PCRE_CONFIG="" PCRE_VERSION="" PCRE_CPPFLAGS="" PCRE_CFLAGS="" PCRE_LDFLAGS="" PCRE_LDADD="" PCRE_LD_PATH="" AC_DEFUN([CHECK_PCRE], [dnl AC_ARG_WITH( pcre, [AC_HELP_STRING([--with-pcre=PATH],[Path to pcre prefix or config script])], [test_paths="${with_pcre}"], [test_paths="/usr/local/libpcre /usr/local/pcre /usr/local /opt/libpcre /opt/pcre /opt /usr"]) AC_MSG_CHECKING([for libpcre config script]) dnl # Determine pcre lib directory if test -z "${with_pcre}"; then test_paths="/usr/local/pcre /usr/local /usr" else test_paths="${with_pcre}" fi for x in ${test_paths}; do dnl # Determine if the script was specified and use it directly if test ! -d "$x" -a -e "$x"; then PCRE_CONFIG=$x pcre_path="no" break fi dnl # Try known config script names/locations for PCRE_CONFIG in pcre-config; do if test -e "${x}/bin/${PCRE_CONFIG}"; then pcre_path="${x}/bin" break elif test -e "${x}/${PCRE_CONFIG}"; then pcre_path="${x}" break else pcre_path="" fi done if test -n "$pcre_path"; then break fi done if test -n "${pcre_path}"; then if test "${pcre_path}" != "no"; then PCRE_CONFIG="${pcre_path}/${PCRE_CONFIG}" fi AC_MSG_RESULT([${PCRE_CONFIG}]) PCRE_VERSION="`${PCRE_CONFIG} --version`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(pcre VERSION: $PCRE_VERSION); fi PCRE_CFLAGS="`${PCRE_CONFIG} --cflags`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(pcre CFLAGS: $PCRE_CFLAGS); fi PCRE_LDADD="`${PCRE_CONFIG} --libs`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(pcre LDADD: $PCRE_LDADD); fi PCRE_LD_PATH="/`${PCRE_CONFIG} --libs | cut -d'/' -f2,3,4,5,6 | cut -d ' ' -f1`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(pcre PCRE_LD_PATH: $PCRE_LD_PATH); fi else AC_MSG_RESULT([no]) fi AC_SUBST(PCRE_CONFIG) AC_SUBST(PCRE_VERSION) AC_SUBST(PCRE_CPPFLAGS) AC_SUBST(PCRE_CFLAGS) AC_SUBST(PCRE_LDFLAGS) AC_SUBST(PCRE_LDADD) AC_SUBST(PCRE_LD_PATH) if test -z "${PCRE_VERSION}"; then AC_MSG_NOTICE([*** pcre library not found.]) ifelse([$2], , AC_MSG_ERROR([pcre library is required]), $2) else AC_MSG_NOTICE([using pcre v${PCRE_VERSION}]) ifelse([$1], , , $1) fi ]) modsecurity-2.9.5/build/config.guess0000755000175000017500000012637314147005250020647 0ustar mhsvierulamhsvierula#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-02-24' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > "$dummy.c" ; for c in cc gcc c89 c99 ; do if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "$UNAME_SYSTEM" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval "$set_cc_for_build" cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" # If ldd exists, use it to detect musl libc. if command -v ldd >/dev/null && \ ldd --version 2>&1 | grep -q ^musl then LIBC=musl fi ;; esac # Note: order is significant - the case branches are not exclusive. case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ "/sbin/$sysctl" 2>/dev/null || \ "/usr/sbin/$sysctl" 2>/dev/null || \ echo unknown)` case "$UNAME_MACHINE_ARCH" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine="${arch}${endian}"-unknown ;; *) machine="$UNAME_MACHINE_ARCH"-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. case "$UNAME_MACHINE_ARCH" in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval "$set_cc_for_build" if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case "$UNAME_MACHINE_ARCH" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "$UNAME_VERSION" in Debian*) release='-gnu' ;; *) release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "$machine-${os}${release}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" exit ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" exit ;; *:MidnightBSD:*:*) echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" exit ;; *:ekkoBSD:*:*) echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" exit ;; *:SolidBSD:*:*) echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:MirBSD:*:*) echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:Sortix:*:*) echo "$UNAME_MACHINE"-unknown-sortix exit ;; *:Redox:*:*) echo "$UNAME_MACHINE"-unknown-redox exit ;; mips:OSF1:*.*) echo mips-dec-osf1 exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix"$UNAME_RELEASE" exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux"$UNAME_RELEASE" exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval "$set_cc_for_build" SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos"$UNAME_RELEASE" exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos"$UNAME_RELEASE" ;; sun4) echo sparc-sun-sunos"$UNAME_RELEASE" ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos"$UNAME_RELEASE" exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint"$UNAME_RELEASE" exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint"$UNAME_RELEASE" exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint"$UNAME_RELEASE" exit ;; m68k:machten:*:*) echo m68k-apple-machten"$UNAME_RELEASE" exit ;; powerpc:machten:*:*) echo powerpc-apple-machten"$UNAME_RELEASE" exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix"$UNAME_RELEASE" exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix"$UNAME_RELEASE" exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix"$UNAME_RELEASE" exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos"$UNAME_RELEASE" exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] then if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ [ "$TARGET_BINARY_INTERFACE"x = x ] then echo m88k-dg-dgux"$UNAME_RELEASE" else echo m88k-dg-dguxbcs"$UNAME_RELEASE" fi else echo i586-dg-dgux"$UNAME_RELEASE" fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi echo "$IBM_ARCH"-ibm-aix"$IBM_REV" exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` case "$UNAME_MACHINE" in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "$sc_cpu_version" in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "$sc_kernel_bits" in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi if [ "$HP_ARCH" = "" ]; then eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ "$HP_ARCH" = hppa2.0w ] then eval "$set_cc_for_build" # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi echo "$HP_ARCH"-hp-hpux"$HPUX_REV" exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux"$HPUX_REV" exit ;; 3050*:HI-UX:*:*) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo "$UNAME_MACHINE"-unknown-osf1mk else echo "$UNAME_MACHINE"-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi"$UNAME_RELEASE" exit ;; *:BSD/OS:*:*) echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case "$UNAME_PROCESSOR" in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; i*:CYGWIN*:*) echo "$UNAME_MACHINE"-pc-cygwin exit ;; *:MINGW64*:*) echo "$UNAME_MACHINE"-pc-mingw64 exit ;; *:MINGW*:*) echo "$UNAME_MACHINE"-pc-mingw32 exit ;; *:MSYS*:*) echo "$UNAME_MACHINE"-pc-msys exit ;; i*:PW*:*) echo "$UNAME_MACHINE"-pc-pw32 exit ;; *:Interix*:*) case "$UNAME_MACHINE" in x86) echo i586-pc-interix"$UNAME_RELEASE" exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix"$UNAME_RELEASE" exit ;; IA64) echo ia64-unknown-interix"$UNAME_RELEASE" exit ;; esac ;; i*:UWIN*:*) echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; *:GNU:*:*) # the GNU system echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" exit ;; i*86:Minix:*:*) echo "$UNAME_MACHINE"-pc-minix exit ;; aarch64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arm*:Linux:*:*) eval "$set_cc_for_build" if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi else echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf fi fi exit ;; avr32*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; cris:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; crisv32:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; e2k:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; frv:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; hexagon:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:Linux:*:*) echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; ia64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; k1om:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m32r*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m68*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } ;; mips64el:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-"$LIBC" exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; padre:Linux:*:*) echo sparc-unknown-linux-"$LIBC" exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-"$LIBC" exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; *) echo hppa-unknown-linux-"$LIBC" ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-"$LIBC" exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-"$LIBC" exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-"$LIBC" exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-"$LIBC" exit ;; riscv32:Linux:*:* | riscv64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" exit ;; sh64*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sh*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; tile*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; vax:Linux:*:*) echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) if objdump -f /bin/sh | grep -q elf32-x86-64; then echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32 else echo "$UNAME_MACHINE"-pc-linux-"$LIBC" fi exit ;; xtensa*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo "$UNAME_MACHINE"-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo "$UNAME_MACHINE"-unknown-stop exit ;; i*86:atheos:*:*) echo "$UNAME_MACHINE"-unknown-atheos exit ;; i*86:syllable:*:*) echo "$UNAME_MACHINE"-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos"$UNAME_RELEASE" exit ;; i*86:*DOS:*:*) echo "$UNAME_MACHINE"-pc-msdosdjgpp exit ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos"$UNAME_RELEASE" exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos"$UNAME_RELEASE" exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos"$UNAME_RELEASE" exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos"$UNAME_RELEASE" exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv"$UNAME_RELEASE" exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo "$UNAME_MACHINE"-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo "$UNAME_MACHINE"-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux"$UNAME_RELEASE" exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv"$UNAME_RELEASE" else echo mips-unknown-sysv"$UNAME_RELEASE" fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux"$UNAME_RELEASE" exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux"$UNAME_RELEASE" exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux"$UNAME_RELEASE" exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux"$UNAME_RELEASE" exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux"$UNAME_RELEASE" exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux"$UNAME_RELEASE" exit ;; SX-ACE:SUPER-UX:*:*) echo sxace-nec-superux"$UNAME_RELEASE" exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Rhapsody:*:*) echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval "$set_cc_for_build" if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-*:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk"$UNAME_RELEASE" exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk"$UNAME_RELEASE" exit ;; NSR-*:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk"$UNAME_RELEASE" exit ;; NSV-*:NONSTOP_KERNEL:*:*) echo nsv-tandem-nsk"$UNAME_RELEASE" exit ;; NSX-*:NONSTOP_KERNEL:*:*) echo nsx-tandem-nsk"$UNAME_RELEASE" exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo "$UNAME_MACHINE"-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux"$UNAME_RELEASE" exit ;; *:DragonFly:*:*) echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "$UNAME_MACHINE" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" exit ;; i*86:rdos:*:*) echo "$UNAME_MACHINE"-pc-rdos exit ;; i*86:AROS:*:*) echo "$UNAME_MACHINE"-pc-aros exit ;; x86_64:VMkernel:*:*) echo "$UNAME_MACHINE"-unknown-esx exit ;; amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; esac echo "$0: unable to guess system type" >&2 case "$UNAME_MACHINE:$UNAME_SYSTEM" in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 </dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = "$UNAME_MACHINE" UNAME_RELEASE = "$UNAME_RELEASE" UNAME_SYSTEM = "$UNAME_SYSTEM" UNAME_VERSION = "$UNAME_VERSION" EOF exit 1 # Local variables: # eval: (add-hook 'write-file-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: modsecurity-2.9.5/build/find_apr.m40000664000175000017500000000530414147005233020344 0ustar mhsvierulamhsvieruladnl Check for APR Libraries dnl CHECK_APR(ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]) dnl Sets: dnl APR_CFLAGS dnl APR_LDFLAGS dnl APR_LIBS dnl APR_LINK_LD APR_CONFIG="" APR_CFLAGS="" APR_CPPFLAGS="" APR_LDFLAGS="" APR_LDADD="" APR_INCLUDEDIR="" APR_LINKLD="" AC_DEFUN([CHECK_APR], [dnl AC_ARG_WITH( apr, [AC_HELP_STRING([--with-apr=PATH],[Path to apr prefix or config script])], [test_paths="${with_apr}"], [test_paths="/usr/local/libapr /usr/local/apr /usr/local /opt/libapr /opt/apr /opt /usr"]) AC_MSG_CHECKING([for libapr config script]) for x in ${test_paths}; do dnl # Determine if the script was specified and use it directly if test ! -d "$x" -a -e "$x"; then APR_CONFIG=$x apr_path=no break fi dnl # Try known config script names/locations for APR_CONFIG in apr-1-mt-config apr-1-config apr-config-1 apr-mt-config-1 apr-mt-config apr-config; do if test -e "${x}/bin/${APR_CONFIG}"; then apr_path="${x}/bin" break elif test -e "${x}/${APR_CONFIG}"; then apr_path="${x}" break else apr_path="" fi done if test -n "$apr_path"; then break fi done if test -n "${apr_path}"; then if test "${apr_path}" != "no"; then APR_CONFIG="${apr_path}/${APR_CONFIG}" fi AC_MSG_RESULT([${APR_CONFIG}]) APR_VERSION="`${APR_CONFIG} --version`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apr VERSION: $APR_VERSION); fi APR_CFLAGS="`${APR_CONFIG} --includes`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apr CFLAGS: $APR_CFLAGS); fi APR_CPPFLAGS="`${APR_CONFIG} --cppflags`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apr CPPFLAGS: $APR_CPPFLAGS); fi APR_LDFLAGS="`${APR_CONFIG} --libs`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apr LDFLAGS: $APR_LDFLAGS); fi APR_LDADD="`${APR_CONFIG} --link-libtool`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apr LDADD: $APR_LDADD); fi APR_INCLUDEDIR="`${APR_CONFIG} --includedir`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apr INCLUDEDIR: $APR_INCLUDEDIR); fi APR_LINKLD="`${APR_CONFIG} --link-ld`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apr LINKLD: $APR_LINKLD); fi else AC_MSG_RESULT([no]) fi AC_SUBST(APR_CONFIG) AC_SUBST(APR_VERSION) AC_SUBST(APR_CFLAGS) AC_SUBST(APR_CPPFLAGS) AC_SUBST(APR_LDFLAGS) AC_SUBST(APR_LDADD) AC_SUBST(APR_INCLUDEDIR) AC_SUBST(APR_LINKLD) if test -z "${APR_VERSION}"; then AC_MSG_NOTICE([*** apr library not found.]) ifelse([$2], , AC_MSG_ERROR([apr library is required]), $2) else AC_MSG_NOTICE([using apr v${APR_VERSION}]) ifelse([$1], , , $1) fi ]) modsecurity-2.9.5/build/ltoptions.m40000644000175000017500000003426214147005237020624 0ustar mhsvierulamhsvierula# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 8 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option '$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl 'shared' nor 'disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the 'shared' and # 'disable-shared' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the 'static' and # 'disable-static' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the 'fast-install' # and 'disable-fast-install' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_AIX_SONAME([DEFAULT]) # ---------------------------------- # implement the --with-aix-soname flag, and support the `aix-soname=aix' # and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT # is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. m4_define([_LT_WITH_AIX_SONAME], [m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[[5-9]]*,yes) AC_MSG_CHECKING([which variant of shared library versioning to provide]) AC_ARG_WITH([aix-soname], [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], [case $withval in aix|svr4|both) ;; *) AC_MSG_ERROR([Unknown argument to --with-aix-soname]) ;; esac lt_cv_with_aix_soname=$with_aix_soname], [AC_CACHE_VAL([lt_cv_with_aix_soname], [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) with_aix_soname=$lt_cv_with_aix_soname]) AC_MSG_RESULT([$with_aix_soname]) if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac _LT_DECL([], [shared_archive_member_spec], [0], [Shared archive member basename, for filename based shared library versioning on AIX])dnl ])# _LT_WITH_AIX_SONAME LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the 'pic-only' and 'no-pic' # LT_INIT options. # MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac], [pic_mode=m4_default([$1], [default])]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) modsecurity-2.9.5/build/find_curl.m40000664000175000017500000000663714147005233020541 0ustar mhsvierulamhsvieruladnl Check for CURL Libraries dnl CHECK_CURL(ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]) dnl Sets: dnl CURL_CFLAGS dnl CURL_LDADD dnl CURL_LIBS CURL_CONFIG="" CURL_VERSION="" CURL_CPPFLAGS="" CURL_CFLAGS="" CURL_LDFLAGS="" CURL_LDADD="" CURL_MIN_VERSION="7.15.1" AC_DEFUN([CHECK_CURL], [dnl AC_ARG_WITH( curl, [AC_HELP_STRING([--with-curl=PATH],[Path to curl prefix or config script])], [test_paths="${with_curl}"], [test_paths="/usr/local/libcurl /usr/local/curl /usr/local /opt/libcurl /opt/curl /opt /usr"]) AC_MSG_CHECKING([for libcurl config script]) for x in ${test_paths}; do dnl # Determine if the script was specified and use it directly if test ! -d "$x" -a -e "$x"; then CURL_CONFIG=$x curl_path="no" break fi dnl # Try known config script names/locations for CURL_CONFIG in curl-config; do if test -e "${x}/bin/${CURL_CONFIG}"; then curl_path="${x}/bin" break elif test -e "${x}/${CURL_CONFIG}"; then curl_path="${x}" break else curl_path="" fi done if test -n "$curl_path"; then break fi done if test -n "${curl_path}"; then if test "${curl_path}" != "no"; then CURL_CONFIG="${curl_path}/${CURL_CONFIG}" fi AC_MSG_RESULT([${CURL_CONFIG}]) CURL_VERSION=`${CURL_CONFIG} --version | sed 's/^[[^0-9]][[^[:space:]]][[^[:space:]]]*[[[:space:]]]*//' | tr '\r\n' ' '` if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(curl VERSION: $CURL_VERSION); fi CURL_CFLAGS="`${CURL_CONFIG} --cflags`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(curl CFLAGS: $CURL_CFLAGS); fi CURL_LIBS="`${CURL_CONFIG} --libs`" CURL_LDADD="${CURL_LIBS}" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(curl LDADD: $CURL_LIBS); fi dnl # Check version is ok AC_MSG_CHECKING([if libcurl is at least v${CURL_MIN_VERSION}]) curl_min_ver=`echo ${CURL_MIN_VERSION} | awk -F. '{print (\$ 1 * 1000000) + (\$ 2 * 1000) + \$ 3}'` curl_ver=`echo ${CURL_VERSION} | awk -F. '{print (\$ 1 * 1000000) + (\$ 2 * 1000) + \$ 3}'` if test "$curl_min_ver" -le "$curl_ver"; then AC_MSG_RESULT([yes, $CURL_VERSION]) curl_tlsv2_ver=`echo 7.34.0 | awk -F. '{print (\$ 1 * 1000000) + (\$ 2 * 1000) + \$ 3}'` if test "$curl_tlsv2_ver" -le "$curl_ver"; then CURL_CFLAGS="${CURL_CFLAGS} -DWITH_CURL_SSLVERSION_TLSv1_2" fi CURL_CFLAGS="${CURL_CFLAGS} -DWITH_CURL" else AC_MSG_RESULT([no, $CURL_VERSION]) AC_MSG_NOTICE([NOTE: curl library may be too old]) fi dnl # Check/warn if GnuTLS is used AC_MSG_CHECKING([if libcurl is linked with gnutls]) curl_uses_gnutls=`echo ${CURL_LIBS} | grep gnutls | wc -l` if test "$curl_uses_gnutls" -ne 0; then AC_MSG_RESULT([yes]) AC_MSG_NOTICE([NOTE: curl linked with gnutls may be buggy, openssl recommended]) CURL_USES_GNUTLS=yes else AC_MSG_RESULT([no]) CURL_USES_GNUTLS=no fi else AC_MSG_RESULT([no]) fi AC_SUBST(CURL_CONFIG) AC_SUBST(CURL_VERSION) AC_SUBST(CURL_CPPFLAGS) AC_SUBST(CURL_CFLAGS) AC_SUBST(CURL_LDFLAGS) AC_SUBST(CURL_LDADD) AC_SUBST(CURL_USES_GNUTLS) if test -z "${CURL_VERSION}"; then AC_MSG_NOTICE([*** curl library not found.]) ifelse([$2], , AC_MSG_NOTICE([NOTE: curl library is only required for building mlogc]), $2) else AC_MSG_NOTICE([using curl v${CURL_VERSION}]) ifelse([$1], , , $1) fi ]) modsecurity-2.9.5/build/apxs-wrapper.in0000775000175000017500000000054714147005233021310 0ustar mhsvierulamhsvierula#!@SHELL@ WRAPPED_OPTS="" for opt in "$@"; do case "$opt" in # Fix for -R not working w/apxs -R*) WRAPPED_OPTS="$WRAPPED_OPTS -Wl,$opt" ;; # OSF1 compiler option -pthread) WRAPPED_OPTS="$WRAPPED_OPTS -Wc,$opt" ;; # Unwrapped *) WRAPPED_OPTS="$WRAPPED_OPTS $opt" ;; esac done exec @APXS@ $WRAPPED_OPTS modsecurity-2.9.5/build/test-driver0000755000175000017500000001104014147005251020506 0ustar mhsvierulamhsvierula#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2013-07-13.22; # UTC # Copyright (C) 2011-2014 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then tweaked_estatus=1 else tweaked_estatus=$estatus fi case $tweaked_estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report the test outcome and exit status in the logs, so that one can # know whether the test passed or failed simply by looking at the '.log' # file, without the need of also peaking into the corresponding '.trs' # file (automake bug#11814). echo "$res $test_name (exit status: $estatus)" >>$log_file # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: modsecurity-2.9.5/build/install-sh0000755000175000017500000003546314147005250020332 0ustar mhsvierulamhsvierula#!/bin/sh # install - install a program, script, or datafile scriptversion=2014-09-12.12; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) # $RANDOM is not portable (e.g. dash); use it when possible to # lower collision chance tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 # As "mkdir -p" follows symlinks and we work in /tmp possibly; so # create the $tmpdir first (and fail if unsuccessful) to make sure # that nobody tries to guess the $tmpdir name. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: modsecurity-2.9.5/build/ltsugar.m40000644000175000017500000001044014147005237020242 0ustar mhsvierulamhsvierula# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59, which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) modsecurity-2.9.5/build/depcomp0000755000175000017500000005601714147005251017702 0ustar mhsvierulamhsvierula#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2016-01-11.22; # UTC # Copyright (C) 1999-2017 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: modsecurity-2.9.5/CHANGES0000664000175000017500000023477114147005233016230 0ustar mhsvierulamhsvierula22 Nov 2021 - 2.9.5 ------------------- * Support configurable limit on depth of JSON parsing [@theMiddleBlue, @airween, @dune73, @martinhsv] 21 Jun 2021 - 2.9.4 ------------------- * Add microsec timestamp resolution to the formatted log timestamp [Issue #2095 - @rainerjung] * Store temporaries in the request pool for regexes compiled per-request. [Issue #890, #2049 - @lightsey] * Fix other usage of the global pool for request temporaries in re_operators.c [Issue #890, #2049 - @lightsey] * Adds a sanity check before use ctl:ruleRemoveTargetById and ctl:ruleRemoveTargetByMsg. [Issue #2033 - @studersi] * Fix the order of error_msg validation [Issue #2128 - @marcstern, @zimmerle] * Added missing Geo Countries [Issue #2123, #2124 - @emphazer] * When the input filter finishes, check whether we returned data [Issue #2091, #2092 - @rainerjung] * fix: care non-null terminated chunk data [Issue #2097 - @orisano] * Fix for apr_global_mutex_create() crashes with mod_security [Issue #1957 - @blappm] * Fix inet addr handling on 64 bit big endian systems [Issue #1980 - @zimmerle, @airween] 05 Dec 2018 - 2.9.3 ------------------- * Enable optimization for large stream input by default on IIS [Issue #1299 - @victorhora, @zimmerle] * Allow 0 length JSON requests. [Issue #1822 - @allanbomsft, @zimmerle, @victorhora, @marcstern] * Include unanmed JSON values in unnamed ARGS [Issue #1577, #1576 - @marcstern, @victorhora, @zimmerle] * Fix buffer size for utf8toUnicode transformation [Issue #1208 - @katef, @victorhora] * Fix sanitizing JSON request bodies in native audit log format [p0pr0ck5, @victorhora] * IIS: Update Wix installer to bundle a supported CRS version (3.0) [@victorhora, @zimmerle] * IIS: Update dependencies for Windows build [Issue #1848 - @victorhora, @hsluoyz] * IIS: Set SecStreamInBodyInspection by default on IIS builds (#1299) [Issue #1299 - @victorhora] * IIS: Update modsecurity.conf [Issue #788 - @victorhora, @brianclark] * Add sanity check for a couple malloc() and make code more resilient [Issue #979 - @dogbert2, @victorhora, @zimmerl] * Fix NetBSD build by renaming the hmac function to avoid conflicts [Issue #1241 - @victorhora, @joerg, @sevan] * IIS: Windows build, fix duplicate YAJL dir in script [Issue #1612 - @allanbomsft, @victorhora] * IIS: Remove body prebuffering due to no locking in modsecProcessRequest [Issue #1917 - @allanbomsft, @victorhora] * Fix mpm-itk / mod_ruid2 compatibility [Issue #712 - @ju5t , @derhansen, @meatlayer, @victorhora] * Code cosmetics: checks if actionset is not null before use it [Issue #1556 - @marcstern, @zimmerle, @victorhora] * Only generate SecHashKey when SecHashEngine is On [Issue #1671 - @dmuey, @monkburger, @zimmerle] * Docs: Reformat README to Markdown and update dependencies [Issue #1857 - @hsluoyz, @victorhora] * IIS: no lock on ProcessRequest. No reload of config. [Issue #1826 - @allanbomsft] * IIS: buffer request body before taking lock [Issue #1651 - @allanbomsft] * good practices: Initialize variables before use it [Issue #1889 - Marc Stern] * Let body parsers observe SecRequestBodyNoFilesLimit [Issue #1613 - @allanbomsft] * potential off by one in parse_arguments [Issue #1799 - @tinselcity, @zimmerle] * Fix utf-8 character encoding conversion [Issue #1794 - @tinselcity, @zimmerle] * Fix ip tree lookup on netmask content [Issue #1793 - @tinselcity, @zimmerle] * IIS: set overrideModeDefault to Allow so that individual websites can add to their web.config file [Issue #1781 - @default-kramer] * modsecurity.conf-recommended: Fix spelling [Issue #1721 - @padraigdoran] * build: fix when multiple lines for curl version [Issue #1771 - @Artistan] * Fix arabic charset in unicode_mapping file [Issue #1619 - @alaa-ahmed-a] * Optionally preallocates memory when SecStreamInBodyInspection is on [Issue #1366 - @allanbomsft, @zimmerle] * Fixed typo in build_yajl.bat [Issue #1366 - @allanbomsft] * Fixes SecConnWriteStateLimit [Issue #1545 - @nicjansma] * Added "empy chunk" check [Issue #1347, #1446 - @gravagli, @bostrt, @zimmerle] * Add capture action to @detectXSS operator [Issue #1488, #1482 - @victorhora] * Fix for wildcard operator when loading conf files on Nginx / IIS [Issue #1486, #1285 - @victorhora and @thierry-f-78] * Set of fixies to make windows build workable with the buildbots [Commit 94fe3 - @zimmerle] * Uses LOG_NO_STOPWATCH instead of DLOG_NO_STOPWATCH [Issue #1510 - @marcstern] * Adds missing headers [Issue #1454 - @devnexen] 18 Jul 2017 - 2.9.2 ------------------- * IIS build refactoring and dependencies update [Issue #1487 - @victorhora] * Best practice: Initialize msre_var pointers [Commit fbd57 - Allan Boll] * nginx: Obtain port from r->connection->local_sockaddr. [Commit 51314 - @defanator] * Updates libinjection to v3.10.0 [Issue #1412 - @client9, @zimmerle and @bjdijk] * Avoid log flood while using SecConnEngine [Issue #1436 - @victorhora] * Make url path absolute for SecHashEngine only when it is relative in the first place. [Issue #752, #1071 - @hideaki] * Fix the hex digit size for SHA1 on msc_crypt implementation. [Issue #1354 - @zimmerle and @parthasarathi204] * Avoid to flush xml buffer while assembling the injected html. [Issue #742 - @zimmerle] * Avoid additional operator invokation if last transform of a multimatch doesn't modify the input [Issue #1086, #1087 - Daniel Stelter-Gliese] * Adds a sanity check before use ctl:ruleRemoveTargetByTag. [Issue #1353 - @LukeP21 and @zimmerle] * Uses an optional global lock while manipulating collections. [Issues #1224 - @mturk and @zimmerle] * Fix collection naming problem while merging collections. [Issue #1274 - Coty Sutherland and @zimmerle] * Fix --enable-docs adding missing Makefile, modifying autoconf and filenames [Issue #1322 - @victorhora] * Change from using rand() to thread-safe ap_random_pick. [Issue #1289 - Robert Bost] * Cosmetics: added comments on odd looking code to prevent future scrutiny [Issue #1279 - Coty Sutherland] * {dis|en}able-server-context-logging: Option to disable logging of server info (log producer, sanitized objects, ...) in audit log. [Issue #1069 - Marc Stern] * Allow drop to work with mod_http2 [Issue #1308, #992 - @bazzadp] * Fix SecConn(Read|Write)StateLimit on Apache 2.4 [Issue #1340, #1337, #786 - Sander Hoentjen] * {dis|en}able-stopwatch-logging: Option to disable logging of stopwatches in audit log. [Issue #1067 - Marc Stern] * {dis|en}able-dechunk-logging: Option to disable logging of dechunking in audit log when log level < 9. [Issue #1068 - Marc Stern] * Updates libinjection to: da027ab52f9cf14401dd92e34e6683d183bdb3b4 [ModSecurity team] * {dis|en}able-handler-logging: Option to disable logging of Apache handler in audit log [Issue #1070, #1381 - Marc Stern] * {dis|en}able-collection-delete-problem-logging: Option to disable logging of collection delete problem in audit log when log level < 9. [Issue #1380 - Marc Stern] * Adds rule id in logs whenever a rule fail. [Issue #1379, #391 - Marc Stern] * {dis|en}able-server-logging: Option to disable logging of "Server" in audit log when log level < 9. [Issue #1070 - Marc Stern] * {dis|en}able-filename-logging: Option to disable logging of filename in audit log. [Issue #1065 - Marc Stern] * Reads fuzzy hash databases on init [Issue #1339 - Robert Paprocki and @Rendername] * Changes the configuration to recognize soap+xml as XML [Issue #1374 - @emphazer and Chaim Sanders] * Fix building with nginx >= 1.11.11 [Issue #1373, #1359 - Andrei Belov and Thomas Deutschmann] * Using Czechia instea of Czech Republic [Issue #1258 - Michael Kjeldsen] * {dis|en}able-rule-id-validation: Option to disable rule id validation [Issue #1150 - Marc Stern and ModSecurity team] * JSON Log: Append a newline to concurrent JSON audit logs [Issue #1233 - Robert Paprocki] * JSON Log: Don't unnecessarily rename request body parts in cleanup [Issue #1223 - Robert Paprocki] * Fix error message inside audit logs [Issue #1216 and #1073 - Armin Abfalterer] * Remove port from IPV4 address when running under IIS. [Issue #1220, #1109 and #734 - Robert Culyer] * Remove logdata and msg fields from JSON audit log rule. [Issue #1190 and #1174 - Robert Paprocki] * Better handle the json parser cleanup [Issue #1204 - Ephraim Vider] * Fix status failing to report in Nginx auditlogs [Issue #977, #1171 - @charlymps and Chaim Sanders] * Fix file upload JSON audit log entry [Issue #1181 and #1173 - Robert Paprocki and Christian Folini] * configure: Fix detection whether libcurl is linked against gnutls and, move verbose_output declaration up to the beginning. [Issue #1158 - Thomas Deutschmann (@Whissi)] * Treat APR_INCOMPLETE as APR_EOF while receiving the request body. [Issue #1060, #334 - Alexey Sintsov] Security issues * Allan Boll reported an uninitialized variable that may lead to a crash on Windows platform. * Brian Adeloye reported an infinite loop on the version of libinjection used on ModSecurity 2.9.1. 09 Mar 2016 - 2.9.1 ------------------- * No changes. 03 Feb 2016 - 2.9.1-RC1 ----------------------- * Added support to generate audit logs in JSON format. [Issue #914, #897, #656 - Robert Paprocki] * Creating AuditLog serial file (or parallel index) respecting the permission configured with SecAuditLogFileMode. Previously, it was used only to save the transactions while in parallel mode. [Issue #852 - @littlecho and ModSecurity team] * Checking for hashing injection response, to report in case of failure. [Issue #1041 - ModSecurity team] * Stop buffering when the request is larger than SecRequestBodyLimit in ProcessPartial mode [Issue #709, #705, #728 - Justin Gerace and ModSecurity team] * Extended Lua support to include version 5.3 [Issue #837, #762, #814 - Athmane Madjoudj and ModSecurity team] * mlogc: Allows user to choose between TLS versions (TLSProtocol option introduced). [Issue #881 - Ishwor Gurung] * Allows mod_proxy's "nocanon" behavior to be specified in proxy actions [Issue #1031, #961, #763 - Mario D. Santana and ModSecurity team] * Refactoring conditional #if/#defs directives. [Issue #996 - Wesley M and ModSecurity team] * mlogc-batch-load.pl.in: fix searching SecAuditLogStorageDir files with Apache 2.4 [Issue #775 - Elia Pinto] * Understands IIS 10 as compatible on Windows installer. [Issue #931 - Anton Serbulov, Pavel Vasilevich and ModSecurity team] * Fix apache logging limitation by using correct Apache call. [Issue #840 - Christian Folini] * Fix apr_crypto.h check on 32-bit Linux platform [Issue #882, #883 - Kurt Newman] * Fix variable resolution duration (Content of the DURATION variable). [Issue #662 - Andrew Elble] * Fix crash while adding empty keys to persistent collections. [Issue #927 - Eugene Alekseev, Marc Stern and ModSecurity team] * Remove misguided call to srand() [Issues #778, #781 and #836 - Michael Bunk, @gilperon] * Fix compilation problem while ssdeep is installed in non-standard location. [Issue #872 - Kurt Newman] * Fix invalid storage reference by apr_psprintf at msc_crypt.c [Issue #609 - Jeff Trawick] 12 Feb 2015 - 2.9.0 ------------------- * Fix apr_crypto.h include, now checking if apr_crypto.h is available by checking the definition WITH_APU_CRYPTO. [martinjina and ModSecurity team] 15 Dez 2014 - 2.9.0-RC2 ----------------------- * OpenSSL dependency was removed on MS Windows builds. ModSecurity is now using the Windows certificate storage. [Gregg Smith, Steffen and ModSecurity team] * Informs about external resources loaded/failed while reloading Apache. [ModSecurity team] * Adds missing 'ModSecurity:' prefix in some warnings messages. [Walter Hop and ModSecurity team] * Refactoring external resources download warn messages. Holding the message to be displayed when Apache is ready to write on the error_log. [ModSecurity team] * Remote resources loading process is now failing in case of HTTP error. [Walter Hop and ModSecurity team] * Fixed start up crash on Apache with mod_ssl configured. Crash was happening during the download of remote resources. [Christian Folini, Walter Hop and ModSecurity team] * Curl is not a mandatory dependency to ModSecurity core anymore. [Rainer Jung and ModSecurity team] 18 Nov 2014 - 2.9.0-RC1 ----------------------- * `pmFromFile' and `ipMatchFromFile' operators are now accepting HTTPS served files as parameter. * `SecRemoteRules' directive - allows you to specify a HTTPS served file that may contain rules in the SecRule format to be loaded into your ModSecurity instance. * `SecRemoteRulesFailAction' directive - allows you to control whenever the user wants to Abort or just Warn when there is a problem while downloading rules specified with the directive: `SecRemoteRules'. * `fuzzyHash' operator - allows to match contents using fuzzy hashes. * `FILES_TMP_CONTENT' collection - make available the content of uploaded files. * InsecureNoCheckCert - option to validate or not a chain of SSL certificates on mlogc connections. * ModSecurityIIS: ModSecurity event ID was changed from 0 to 0x1. [Issue #676 - Kris Kater and ModSecurity team] * Fixed signature on "status call": ModSecurity is now using the original server signature. [Issues #702 - Linas and ModSecurity team] * YAJL version is printed while ModSecurity initialization. [Issue #703 - Steffen (Apache Lounge) and Mauro Faccenda] * Fixed subnet representation using slash notation on the @ipMatch operator. [Issue #706 - Walter Hop and ModSecurity team] * Limited the length of a status call. [Issue #714 - 'cpanelkurt' and ModSecurity team] * Added the missing -P option to nginx regression tests. [Issue #720 - Paul Yang] * Fixed automake scripts to do not use features which will be deprecated in the upcoming releases of automake. [Issue #760 - ModSecurity team] * apr-utils's LDFALGS is now considered while building ModSecurity. [Issue #782 - Daniel J. Luke] * IIS installer is not considering IIS 6 as compatible anymore. [Issue #790 - ModSecurity team] * Fixed yajl build script: now looking for the correct header file. [Issue #804 - 'rpfilomeno' and ModSecurity team] * mlgoc is now forced to use TLS 1.x. [Issue #806 - Josh Amishav-Zlatin and ModSecurity team] 14 Apr 2014 - 2.8.0 ------------------- Bug fix * Build issue: Now using autotools to idenfiy if sys/utsname.h is present. * Change configure.ac version to 2.8 31 Mar 2014 - 2.8.0-RC1 ----------------------- New features  * JSON Parser is no longer under tests. Now it is part of our mainline;  * Connection limits (SecConnReadStateLimit/SecConnWriteStateLimit) now support white and suspicious list;  * New variables: FULL_REQUEST and FULL_REQUEST_LENGTH were added, allowing the rules to access the full content of a request;  * ModSecurity status is now part of our mainline;  * New operator: @detectXSS was added. It makes usage of the newest libinjection XSS detection functionality;  * Append and prepend are now supported on nginx (Ref: #635);  * SecServerSignature is now available on nginx (Ref: #637). Improvements  * Regression tests are not able to expect different values according to the platform;  * Visual C++ 12/10 runtime dependencies are now part of the IIS installer, no need to have it installed prior ModSecurity installation (Ref: #627);  * New script was added to the IIS versions to identify whenever there is a missing dependency (available through the Application Menu);  * Memory usage improvement: using correct memory pools according to the context (Ref: #618, #620, #619);  * Independent API call to free the connection allocations, independently from the request objects, improvements on Nginx performance, vide issue for more information (Ref: #620, #648);  * IIS installer is now using the correct 32/64bits folders to install;  * IIS Installer 32bits now refuses to install on 64bits environments;  * IIS: Using new WiX options to build the package in the correct architecture;  * While installing IIS version the installer will remove old ModSecurityIIS configuration or files before proceed with the installation, avoiding further errors;  * CRS from IIS version was upgraded to 2.2.9;  * IIS installer does not support repair anymore, in fact it was not working already and it is now disabled;  * ModSecurity now warns the user who tries to use "proxy" in IIS or Nginx. Proxy is Apache only;  * Remove warnings from the build process (Ref: #617);  * Apache configuration in regression tests was changed making it more platform independent;  * Reduced the amount of warnings during the compilation (Ref: #385a2828e87897bd611bd2a519727ef88dc6d632, #1e63e49db4a592d28e08a33fc60750c37a3886fe); * Regression tests were refactored to be more Nginx friendly; * Fixed some regression tests that were not being flexible to handle multiple platforms: (Ref #636)         - Fixed config/00-load-modsec.t test case. Now it expects for Nginx loaded message as it does for Apache. (Ref: #643);         - Fixed mixed/10-misc-directives.t. Now it does not expect for SecServerSignature on the logs, just in the headers as the Nginx does in silence.         - Fixed tnf/10-tfn-cache.t, action/10-logging.t, config/10-misc-directives.t, config/10-request-directives.t, misc/00-multipart-parser.t , misc/10-tfn-cache.t, rule/20-exceptions.t, rule/00-basics.t, rule/10-xml.t;         - Increased the timeout while reading the auditlog;         - SecAuditLogType Concurrent was removed from the regression test case, not compatible with all ports yet;         - Regression tests were speeded up, as the number of tests are growing it is impossible to have it slow;         - Fixed regression tests scripts paths, to make it MacOS friendly;         - Avoiding dead locks on Nginx regression tests by enforcing a timeout whenever a request appears to fail;   * Updates to fix errors found by Parfait static code analysis (Ref: #612);  * Cleaning up on the repository, by removing unused files;  * IIS installer now supports to perform the installation without register the DLL on the system. It means that the user can download our MSI installer as it was a tarball archive (Ref #629, #624);  * IIS now support 32bits and 64bits pools, both are registered on IIS (Ref #628). Bug fix  * Correctly handling inet_pton in IIS version;  * Nginx was missing a terminator while the charset string was mounted (Ref: #148);  * Added mod_extract_forwarded.c to run before mod_security2.c (Ref: #594);  * Added missing environment variables to regression tests;  * Build system is now more flexible by looking at liblua at: /usr/local/lib;  * Fixed typo in README file.  * Removed the non standard compliant HTTP response status code 44 from modsecurity recommended file (Ref: #665);  * Fixed segmentation fault if it fails to write on the audit log (Ref: #668);  * Not rejecting a larger request with ProcessPartial. Regression tests were also added (Ref: #597);  * Fixed UF8 to unicode conversion. Regression tests were also added(Ref: #672);  * Avoiding segmentation fault by checking if a structure is null before access its members;  * Removed double charset-header that used happen due a hardcoded charset in Nginx implementation (Ref: #650);  * Now alerting the users that there is no memory to proceed loading the configuration instead of just die;  * If SecRuleEngine is set to Off and SecRequestBodyAccess On Nginx returns error 500. Standalone is now capable to identify whenever ModSecurity is enabled or disabled, independently of ModSecurity core (Ref: #645);   * Fixed missing headers on Nginx whenever SecResponseBodyAccess was set to On and happens to be a filter on phase equals or over 3. (Ref #634);  * IIS is now picking the correct version of AppCmd while uninstalling or installing ModSecurityISS. (Ref #632). 17 Dec 2013 - 2.7.7 ------------------- Fixes: - Changed release version to 2.7.7 - Got the configure scripts inside the release tarball 16 Dec 2013 - 2.7.6 ------------------- Improvements: - Organizes all Makefile.am - 1cde4d2dd9d96747536c1c25d06ba0677069477f Now using one file per line (sorted). This is the better way to handle it, since it reduces the possibility of merge conflicts. - nginx: generates config file using configure input. - 351b9cc357d439e30ebd61d89a9e38ecf55c6827 The nginx config file was looking for depedencies by its own, by doing that it was ignoring the options that were passed to configure script. This commit deletes this config file and adds a meta-config which is populated by configure whenever the standalone-module is enabled. - nginx: adds lua support - da16d9e5d51d4ef8734687514a4e1368e7fb4284 - iis: Cosmetics fixies on sqli. - 5046c8327ea21c69b4c0d0c0057c692b05b09fef This is needed to get it compiled with VS2011 on Windows8 - Regression tests: makes configuration compatible with 2.2 and 2.4 (try 2) - ae252ee8767069363906e5a611dff487b799b839 - nginx: Trying apxs and apxs2 while compiling nginx module - 65d9272fdc353e1263567b60604542d377d19672 - nginx: Trying apxs and apxs2 while compiling nginx module - 35fd75d859e4a8873b8843da1db13e04a1b08140 - macos: Using glibtoolize instead of libtoolize - 751a9f4e45213cd69f00c62c71edc9d7ad99b82d - regression-tests: makes configuration compatible with 2.2 and 2.4 - 6fc4cac37ab1be8d1232140042b58fe4bd93ee17 - Regression test: get it working with apache 2.4 - e9813cd0d9bfc5b0c9aa5832634ec1b39b805108 Changes in httpd.conf.in to get it working with apache 2.4 - Code cosmetics. - 7366f35c1d80772d739b35da8faa972f92a72b97 Changed to reduce the number of possible fails during Build Bot compilation. - iis: Waiting for 5 seconds before move curl directory - 9bf2959c919587ebc63f5a1b8c0785da8927bff5 Testing buildbot. - Redefines unixd_set_global_mutex_perms on tests - f70f6f4281b806627e0cf0dbb9c84ae5864bdb16 Avoding conflicts with the standalone implementation - Adds verbose quality check - 388943440cc9b8c6fdea09f5e365a2e5a3e792e2 Vera++ and ccpcheck are not outputing to the stderr instead stdout allowing the buildbot to extract some numbers about it. - Adds support for coding style and quality check - b77e90152d119609ac78a7028383c3b79898b2cf Initial effort to get the code on shape. This will be executed by the buildbots as soon as they get ready for it. - iis: New improvements on the Wix installer - 2ea5a74a7bfb00f21312e51e48aa6dac03d84600 * Now the installation is divided in modules: ModSecurity and CRS. * Added default configuration * Configuration was moved to "Program Files" folder * Build_msi script now using candle available in %PATH% - iis: Removes the installer helper dependency - 1a12648c9f6028f251af0f03c889397c7954b74c Now using appcmd directly with WiX instead of calling the installer helper. - iis: Remove readme.html - 550d5aae21cba696cac1ce75ab8113e5255d5a59 This HTML is about "Creating a Native Module for IIS7" not straight related to ModSecurity itself. - iis: Adds batch script to compile Wix - a2c5fc831baf0b324ebb66b0f878dacf1ec2f808 This batch script can be used to generate our msi installer. - iis: Adds Wix installer resources - 3604763e15a665eb7a6ecae1f7e7c65cebbb1d17 This is all about cosmetic changes. - iss: Removes Post-Build event. - 28bbde1bb218b004654cb865fc8563d69b848dc2 There was a copy on Post-Build event using a hard coded path. This patch removes this Post-Build event. - iis: Relative paths on the VS project file - 368617ddb2443f9b6036f80a648d467d07c9a054 There are a ModSecurityIIS solution and project files, those were using hard coded paths to meet the dependencies. As consequence of the last update in our build scripts, now we are able to built the dependencies and load it to our Visual Studio project using relative paths. - iis: Adds release script - 9477118903861ce80c4c27cb581bf3462315e98e - iis: fixies the Installer.cpp coding style - 79875b1af8e8571098345b91557bab9c06eb7c88 - iis: Removes AppWizard remade file - 91738f93bcc82b6ab756c550a66b6cf6af2fa9f8 Apparently the AppWizard was used to generate part of this Installer, the ReadMe.txt created by the AppWizard was removed by this commit - iss: Removes pre-compiled headers - adfbeb85dcfa9466b72eebb8d1bd8eb7728bab79 No need to use the pre-compiled headers in InstallerHelper, removing it, in order to keep the project lean. - iis: Moves installer to InstallerHelper - 6adf25667dd4bfa33010bd6d8ae3d35046a69967 To organize the folder the Installer application was renamed to installer helper. It is not the real installer, it is just an helper which is executed during the installation phase. - iss: Removes fart dependencies - 8c3b8d81b613aaa38f28472af1eb26c90c7fc9da This commit removes the dependency of the fart.exe utility. The utility was responsible to rename contents inside some dependencies build files. Those modifications are not longer needed. - iss: Better err handling in build scripts. - 192599bf63b6ae5aa08e4536a90d5d0a17f969f7 Now checking for errors in every step of the build phase - iis: Moves build_module.bat to build_modsecurity.bat - e25c6b2e85ced7beba4d41867dbdf30e9c1286d3 The build_modsecurity.bat is now on the iis sub-directory, not in the dependencies anymore. Its content was also changed fixing all the paths. - iis: Identifies arch before unzip apache - cf5de78dfb9fffd21edf17af9e1db8f2fd83c804 Currently we need the Apache binary which could be used in 32 or 64 bits. This patch makes usage of 'cl' to identify which architecture is set. - iis: Renamves winbuild to dependencies - 1447766e816a896e88c9c8f053fcc3f62797bac1 Since the directory becomes all about dependencies there is no need to call it winbuild anymore. - iis: Removes unnecessary files from winbuild dir - 9f8cbf6ed8034ba42aa4967699308df09864fd18 Those .mak files seems to be part of an old build system. Since the script are now working fine, this commit removes all those .mac files and also a CMakeList.txt and the Makefile.win. - iis: Improves the iis build system - b277e538f28c87c81c1b50925dd8b82996b88294 Now checking for common errors while building. Refactoring on the build scripts, now there is this build_dependencies.bat script on the iis sub-folder. By calling this script all the dependencies should be build under the winbuild/. This commit also removes build scripts that were not needed anymore. - iis: Fixes the vcxproj file - a946a163f0ad822c760af80ca32dda61f0e6b2a9 Versions of the dependencies were changed, as long as the version of the Visual Studio, now 12. - iis: Removes unecessary files from the build system - 26738d2e34bcc7620047bd23180e0e26a64c71ee The following files were removed: * VCVarsQueryRegistry.bat * vcvars64.bat * vsvars32.bat The visual studio files can be called direcltly, not necessary to distribute those files, at least in VS12. - iss: Changes httpd version 2.4.6 - 0a772cb0748aa51a01800e0473309b9de792b456 Apache version was changed to 2.4.6 to sync with the current apache lounge version. - iis: Changes the version of the dependencies - 3e6fb41d36b7a5e98a55d8f52b88b29d1bd50b64 * pcre from 8.30 to 8.33 * zlib from 1.2.7 to 1.2.8 * libxml2 from 2.7.7 to 2.9.1 * curl from 7.24 to 7.33.0 - Removes standalone/Makefile.in - e3c19d53d23c48fea337aae76a87b2a85c36a1f1 Makefile.in is recommended to be in the repository whenever it is edit manually, in our case the automatically generated Makefile.in is ok. Bug Fixes: - test: Avoids conflict of fuctions definition - cef72855e4106ce29e1d39103ebf9eb9ab28f17e - test: Makes the unit tests to work again - cc982ae42ec86c79a67be1a01c6ee35fb06c272c The unit tests was not working due to lack update. This patch adds the necessary stuff to have it work again. - iis: Avoids directory link while building - ad330a44bfa39430cf6340cb52971568cccdf1d6 Build scripts was creating links allowing the project to be loaded into Visual Studio without care about the dependencies versions. Sometimes windows refuse to delete those links leading the script to fail. This patch moves the sources directories instead of create links to it. - QA: Avoids the utilization of 3rd filedescriptor - 69c5ccac662f4e11a6eefd54a3e912583c067b9d No need to use a 3rd description on the quality check scripts. Stderr is now redirected to stdout and filtered as needed. - Supports WarningCountingShellCommand in cppcheck and vera - baaf502363e68c3240b60adb7f7c91f5b4f0ba03 WarningCountingShellCommand allow us to have some measurements on the buildbot waterfall. - iis: Using base_rules instead of activated_rules - 7b1537058fa451e0df7098cd907ef19f04102f9d - iis: Fix inet_pton build problem - a4202146b8d26b6615bbab986383fe0afae60d77 There is a function named inet_pton on windows API, with different signature. This patch just override the windows function and point the inet_pton to our implementation. - iis: Adds Wix installer xml file.c - b32cb7d9ab397160f0154aa4bd4e9638658b41e6 This commit adds the Wix template to our git repository. - iis: build_modsecurity.bat fixies - 7e03e3f840375ed682c35a5bb67932461cc77013 This commit enable a cleanup on the mod_security build directory avoiding symbols with different architectures. - iis: Fix mlogc build on windows - 9b7663fa79377a0685130a019916d810f31e7478 The libcurl path was not pointing to the correct directory - Fix #154, Uses addn instead of apr_table_setn - 1734221d9d3a78f9aafd68e35717da9ee1a4fe51 The headers are represented in the format of an apr_table, which is able to handle elements with the same key, however the function apr_table_setn checks if the key exists before add the element, if so it replaces the old value with the new one. This was making our implementation to just keep the last added Cookie. The apr_table_addn function, which is now used, just add a new item without check for olders one. - Merge pull request #579 from zimmerle/revert_139 - 61e54f2067ae760808359926ff91d57275df1aac Revert merge request #139 - Revert "Merge pull request #139 from chaizhenhua/remotes/trunk" - 7f7d00fa2c364716691df1b45779304b24a0debb This reverts commit 10fd40fb0d06f6c577d870b6f15d2f6e2a3a5b1b, reversing changes made to 414033aafa94cd50c9b310afd3f164740caccc94. - Merge pull request #578 from client9/remotes/trunk - b0c3977845f60747b15ae10531b7d20355a22627 libinjection sync to v3.8.0 - libinjection sync - a5f175d79fac1e69124da4e1e227b622e7e233d7 - Merge pull request #152 from client9/remotes/trunk - 88ebf8a0bdbc4db1be76f3a2e70df77cc52a5925 Sync to libinjection v3.7.1 - libinjection sync - fcb6dc13ed6efb066fb9b70405eecab8b83a2d96 - libinjection sync - f52242a013f301ca5c17e59b662124833cb7cc6d - Merge pull request #148 from zimmerle/bugfix_charset_missing_string_terminator - b76e26d81ddafc2b99bffad53d1426f8fd33080a Bugfix: missing string terminator while mounting the charset (nginx) - Bugfix: missing string terminator while mounting the charset (nginx) - ff19dcd5c53d4af61d0a9397d4616f47f80ee207 The charset in headers is mounted using ngx_snprintf which does not place the string terminator. This patch adds the terminator at the end of the string. The size was correctly allocated, just missing the terminator. - Merge pull request #141 from client9/remotes/trunk - 9a630eea23a7ead4e77617c86dc937fd7a421a57 libinjection sync to v3.6.0 - libinjection sync - 11217207e8f2e0cf15742273836399866971071a - Merge pull request #139 from chaizhenhua/remotes/trunk - 10fd40fb0d06f6c577d870b6f15d2f6e2a3a5b1b Fixed fd leackage after reload - Merge pull request #138 from client9/remotes/trunk - 414033aafa94cd50c9b310afd3f164740caccc94 libinjection sync - Fixed fd leackage after reload - e0993fcd7a166ce9e1a279a47d050af1311d9001 - libinjection sync - 2268626c20260e88cab9b7830f8a06101fa7172a - Fix logical disjunction and conjunction issues - 7e0a9ecf7d492e85650671a0cfcfd53e5f15df2c Security Issues: - Fix Chunked string case sensitive issue - CVE-2013-5705 - f8d441cd25172fdfe5b613442fedfc0da3cc333d (Thanks Martin Holst Swende - @mhswende) - Revert "Fix Chuncked string case sensitive issue" - 3901128f17e0763ac1a260106b79859d2aad6d90 This reverts commit 16a815a3c2735f62238ef99af26090a2b8430d3d. - Fix Chuncked string case sensitive issue - 16a815a3c2735f62238ef99af26090a2b8430d3d 23 Jul 2013 - 2.7.5 ------------------- Improvements: * SecUnicodeCodePage is deprecated. SecUnicodeMapFile now accepts the code page as a second parameter. * Updated Libinjection to version 3.4.1. Many improvements were made. * Severity action now supports strings (emergency, alert, critical, error, warning, notice, info, debug). Bug Fixes: * Fixed utf8toUnicode tfn null byte conversion. * Fixed NGINX crash when issue reload command. * Fixed flush output buffer before inject modified hashed response body. * Fixed url normalization for Hash Engine. * Fixed NGINX ap_unixd_set_global_perms_mutex compilation error with apache 2.4 devel files. Security Issues: 10 May 2013 - 2.7.4 ------------------- Improvements: * Added Libinjection project http://www.client9.com/projects/libinjection/ as a new operator @detectSQLi. (Thanks Nick Galbreath). * Added new variable SDBM_DELETE_ERROR that will be set to 1 when sdbm engine fails to delete entries. * NGINX is now set to STABLE. Thanks chaizhenhua and all the people in community who help the project testing, sending feedback and patches. Bug Fixes: * Fixed SecRulePerfTime storing unnecessary rules performance times. * Fixed Possible SDBM deadlock condition. * Fixed Possible @rsub memory leak. * Fixed REMOTE_ADDR content will receive the client ip address when mod_remoteip.c is present. * Fixed NGINX Audit engine in Concurrent mode was overwriting existing alert files because a issue with UNIQUE_ID. * Fixed CPU 100% issue in NGINX port. This is also related to an memory leak when loading response body. Security Issues: * Fixed Remote Null Pointer DeReference (CVE-2013-2765). When forceRequestBodyVariable action is triggered and a unknown Content-Type is used, mod_security will crash trying to manipulate msr->msc_reqbody_chunks->elts however msr->msc_reqbody_chunks is NULL. (Thanks Younes JAAIDI). 28 Mar 2013 - 2.7.3 ------------------- * Fixed IIS version race condition when module is initialized. * Fixed IIS version failing config commands in libapr. * Nginx version is now RC quality. The rule engine should works for all phases. We fixed many issues and missing features (for more information please check jira). Code is running well with latest Nginx 1.2.7 stable. Thanks chaizhenhua for your help. * Added MULTIPART_NAME and MULTIPART_FILENAME. Should be used soon by CRS and will help prevent attacks using multipart data. * Added --enable-htaccess-config configure option. It will allow the follow directives to be used into .htaccess files when AllowOverride Options is set: - SecAction - SecRule - SecRuleRemoveByMsg - SecRuleRemoveByTag - SecRuleRemoveById - SecRuleUpdateActionById - SecRuleUpdateTargetById - SecRuleUpdateTargetByTag - SecRuleUpdateTargetByMsg * Improvements in the ID duplicate code checking. Should be faster now. * SECURITY: Added SecXmlExternalEntity (On|Off - default it Off) that will disable by default the external entity load task executed by LibXml2. This is a security issue [CVE-2013-1915] reported by Timur Yunusov, Alexey Osipov (Positive Technologies). 21 Jan 2013 - 2.7.2 ------------------- * IIS version is now stable. * Fixed IIS version does not pass through POST data to ASP.NET when SecRequestBodyAccess is set to On (MODSEC-372). * Fixed IIS version HTTP Request Smuggling protection does not work (MODSEC-344). * Fixed IIS version PHP Injection Attack (958976) protection does not work (MODSEC-346). * Fixed IIS version Request limit protections are not working (MODSEC-349). * Fixed IIS version Outbound protections are not working (MODSEC-350). * Added IIS version better installer. * NGINX version removed ModSecurityPassCommand (Thanks chaizhenhua). * Fixed NGINX version ngx_http_read_client_request_body returned unexpected buffer type (Thanks chaizhenhua). * Fixed NGINX version INCS config directories on fedora (Thanks chaizhenhua). * Added NGINX version Added drop action for nginx (Thanks chaizhenhua). * Fixed bug in cpf_verify operator (Thanks Hideaki Hayashi). * Fixed build modsecurity under Arch Linux. * Fixed make test crashing when JIT pcre is enabled. * Fixed better cookie separator detection code. * Fixed mod_security displaying wrong ip address in error.log using apache 2.4 and mod_remoteip. * Fixed mod_security was not compiling when use apr without ipv6 support. * Fixed mod_security was not compiling when use lua 5.2. * Fixed issue when execute make install under Solaris. * Fixed ipmatchf operator was not working as expected. 01 Nov 2012 - 2.7.1 ------------------- * Changed "Encryption" name of directives and options related to hmac feature to "Hash". SecEncryptionEngine to SecHashEngine SecEncryptionKey to SecHashKey SecEncryptionParam to SecHashParam SecEncryptionMethodRx to SecHashMethodRx SecEncryptionMethodPm to SecHashMethodPm @validateEncryption to @validateHash ctl:EncryptionEnforcement to ctl:HashEnforcement ctl:EncryptionEngine to ctl:HashEngine * Added a better random bytes generator using apr_generate_random_bytes() to create the HMAC key. * Fixed byte conversion issue during logging under Linux s390x platform. * Fixed compilation bug with LibXML2 2.9.0 (Thanks Athmane Madjoudj). * Fixed parsing error with modsecurity-recommended.conf and Apache 2.4. * Fixed DROP action was disabled for Apache 2 module by mistake. * Fixed bug when use ctl:ruleRemoveTargetByTag. * Fixed IIS and NGINX modules bugs. * Fixed bug when @strmatch patterns use invalid escape sequence (Thanks Hideaki Hayashi). * Fixed bugs in @verifySSN (Thanks Hideaki Hayashi). * The doc/ directory now contains the instructions to access online documentation. 15 Oct 2012 - 2.7.0 ------------------- * Fixed Pause action should work as a disruptive action (MODSEC-297). * Fixed Problem loading mod_env variables in phase 2 (MODSEC-226). * Fixed Detect cookie v0 separator and use it for parsing (MODSEC-261). * Fixed Variable REMOTE_ADDR with wrong IP address in NGINX version (MODSEC-337). * Fixed Errors compiling NGINX version. * Added Include directive into standalone module. IIS and NGINX module should support Include directive like Apache2. * Added MULTIPART_INVALID_PART flag. Also used in rule id 200002 for multipart strict validation. https://www.sec-consult.com/fxdata/seccons/prod/temedia/advisories_txt/20121017-0_mod_security_ruleset_bypass.txt). * Updated Reference Manual. 25 Sep 2012 - 2.6.8 ------------------- * Fixed ctl:ruleRemoveTargetByID order issue (MODSEC-333). Thanks to Armadillo Dasypodidae. * Fixed variable HIGHEST_SEVERITY incorrectly gets reset in a chain rule (MODSEC-315). Thanks to Valery Reznic. 10 Sep 2012 - 2.7.0-rc3 ------------------- * Fixed requests bigger than SecRequestBodyNoFilesLimit were truncated even engine mode was detection only. * Fixed double close() for multipart temporary files (Thanks Seema Deepak). * Fixed many small issues reported by Coverity Scanner (Thanks Peter Vrabek). * Fixed format string issue in ngnix experimental code. (Thanks Eldar Zaitov). * Added ctl:ruleRemoveTargetByTag/Msg and removed ctl:ruleUpdateTargetByTag/Msg. * Added IIS and Ngnix platform code. * Added new transformation utf8toUnicode. 23 Jul 2012 - 2.6.7 ------------------- * Fixed explicit target replacement using SecUpdateTargetById was broken. * The ctl:ruleUpdateTargetById is deprecated and will be removed for future versions since there is no safe way to use it per-request. * Added ctl:ruleRemoveTargetById that can be used to exclude targets to be processed per-request. 22 Jun 2012 - 2.7.0-rc2 ------------------- * Fixed compilation errors and warnings under Windows platform. * Fixed SecEncryptionKey was not working as expected. 08 Jun 2012 - 2.7.0-rc1 ------------------- * Added SecEncryptionEngine. Initial crypt engine support, at the momment it will sign some Html and Response Header options. * Added SecEncryptionKey to define the a rand or static key for crypt engine. * Added SecEncryptionParam to define the new parameter name. * Added SecEncryptionMethodRx used with a regular expression to inspect the html in response body/header and decide what to protect. * Added SecEncryptionMethodPm used with multiple or single strings to inspect the html in response body/header and decide what to protect. * Added ctl encryptionEngine as a per transaction version of SecEncryptionEgine diretive. * Added ctl encryptionEnforcement that will allow the engine to sign the data but the enforcement is disabled. * Added validateEncryption operator to enforce the signed elements. * Added rsub operator supports the syntax |hex| allowing users to use special chars like \n \r. * Added SecRuleUpdateTargetById now supports id range. * Added SecRuleUpdateTargetByMsg and its ctl version (Thanks Scott Gifford). * Added SecRuleUpdateTargetByTag and its ctl version (Thanks Scott Gifford). * Added SecRulePerfTime when greater than zero it will fill rule id's execution time into PERF_RULE and log id=usec information in the new Perf-rule-info: line in part H. * Added PERF_RULES variable that contains rule execution time. * Added Engine-mode: section in part H. * Added ruleRemoveByMsg ctl version. * Added removeCommentsChar and removeComments now can work with style. * Added SecArgumentSeparator and SecCookieFormat can be used in different scope locations. * Added Rules must have ID action and must be numeric. * Added The use of tfns are deprecated in SecDefaultAction. Should be forbid in the future. * Added Macro expansion support to the action pause. * Added IpmatchFromFile/IpmatchF operator. * Added New setrsc action, the RESOURCE collection used SecWebAppId Name Space * Added Configure option --enable-cache-lua that allows reuse of Lua VM per transaction. It will only take any effect when ModSecurity has multiple scripts to run per transaction. * Added Configure option --enable-pcre-jit that allows ModSecurity regex engine to use PCRE Jit support. * Added Configure option --enable-request-early that allows ModSecurity run phase 1 in post_read_request hook. * Added RBL operator now support the httpBl api (http://www.projecthoneypot.org/httpbl_api.php). * Added SecHttpBlKey to be used with httpBl api. * Added SecSensorId will specify the modsecurity sensor name into audit log part H. * Added aliases to phase:2 (phase:request), phase:4 (phase:response) and phase:5 (phase:logging). * Added USERAGENT_IP variable. Created when Apache24 is used with mod_remoteip to know the real client ip address. ^ Added new rule metadata actions ver, maturity and accuracy. Also included into RULE collection. * Updated Reference manual into doc/ directory. * Fixed Variable DURATION contains the elapsed time in microseconds for compatible reasons with apache and other variables. * Fixed Preserve names/identity of the variables going into MATCHED_VARS. * Fixed Redirect macro expansion does not work in SecDefaultAction when SecRule uses block action. * Fixed rsub operator does not work as expect if regex contains parentheses (Thanks Jerome Freilinger). * Current Google Safe Browsing implementation is deprecated. Google changed the API and does not allow anymore the malware database for download. 08 Jun 2012 - 2.6.6 ------------------- * Added build system support for KfreeBSD and HURD. * Fixed a multipart bypass issue related to quote parsing Credits to Qualys Vulnerability & Malware Research Labs (VMRL). 20 Mar 2012 - 2.6.5 ------------------- * Fixed increased a specific message debug level in SBDM code (MODSEC-293). * Cleanup build system. 09 Mar 2012 - 2.6.4 ------------------- * Fixed Mlogc 100% CPU consume (Thanks Klaubert Herr and Ebrahim Khalilzadeh). * Fixed ModSecurity cannot load session and user sdbm data. * Fixed updateTargetById was creating rule unparsed content making apache memory grow. * Code cleanup. 23 Feb 2012 - 2.6.4-rc1 ------------------- * Fixed @rsub adding garbage data into stream variables. * Fixed regex for section A into mlogc-batch-load.pl (Thanks Ebrahim Khalilzadeh). * Fixed logdata cuts message without closing it with final chars. * Added sanitizeMatchedBytes support to verifyCPF, verifyCC and verifySSN. 06 Dec 2011 - 2.6.3-rc1 ------------------- * Fixed MATCHED_VARS does not correctly handle multiple VARS with the same name. * Fixed SDBM garbage collection was not working as expected, increasing the size of files. * Fixed wrong timestamp calculation for some time zones in log files. * Fixed SecUpdateTargetById failed to load multiple VARS (MODSEC-270). * Fixed Reverted hexDecode for hexEncode compatibility reason. * Added SecCollectionTimeout to set collection timeout, default is 3600. * Added sqlHexDecode transformation to decode sql hex data. Thanks Marc Stern. 30 Sep 2011 - 2.6.2 ------------------- * Fixed hexDecode test during make. * Updated the reference manual into doc/ directory. 5 Sep 2011 - 2.6.2-rc1 ------------------- * Added support to macro expansion for rx operator. * Added new transformations removeComments and removeCommentsChars * Fixed colletion names are not case-sensitive anymore. * Fixed compilation errors with apache 2.0. * Fixed build system was not using some libraries CFLAGS. * Fixed check for valid hex values into hexDecode transformation. * Fixed ctl:ruleUpdateTargetById appending multiple targets. 18 Jun 2011 - 2.6.1 ------------------- * Updated the reference manual into doc/ directory. 11 Jul 2011 - trunk ------------------- * Add HttpBl support to rbl operator. 30 Jun 2011 - 2.6.1-rc1 ------------------- * Fixed SecUploadFileMode doesn't work with the new build system. * Fixed building with Lua library (Thanks Diego Elio). * Fixed some ./configure --enable* features not being enabled in compilation time. * Improvements on GSB database add/search operations. * Log part K was removed from modsecurity.conf-recommended. * Added SecUnicodeMapFile directive. Must be use to load the unicode.mapping file. * Added SecUnicodeCodePage directive. Used to define the unicode code page. There are a few already available: 1250 (ANSI - Central Europe) 1251 (ANSI - Cyrillic) 1252 (ANSI - Latin I) 1253 (ANSI - Greek) 1254 (ANSI - Turkish) 1255 (ANSI - Hebrew) 1256 (ANSI - Arabic) 1257 (ANSI - Baltic) 1258 (ANSI/OEM - Viet Nam) 20127 (US-ASCII) 20261 (T.61) 20866 (Russian - KOI8) 28591 (ISO 8859-1 Latin I) 28592 (ISO 8859-2 Central Europe) 28605 (ISO 8859-15 Latin 9) 37 (IBM EBCDIC - U.S./Canada) 437 (OEM - United States) 500 (IBM EBCDIC - International) 850 (OEM - Multilingual Latin I) 860 (OEM - Portuguese) 861 (OEM - Icelandic) 863 (OEM - Canadian French) 865 (OEM - Nordic) 874 (ANSI/OEM - Thai) 932 (ANSI/OEM - Japanese Shift-JIS) 936 (ANSI/OEM - Simplified Chinese GBK) 949 (ANSI/OEM - Korean) 950 (ANSI/OEM - Traditional Chinese Big5) Also mapping some extra unicode chars defined at http://tools.ietf.org/html/rfc3490#section-3.1 * Fixed SecRequestBodyLimit was truncating the real request body. 18 May 2011 - 2.6.0 ------------------- * Added SecWriteStateLimit for Slow Post DoS mitigation. * Fix problem when buffering in input filter. * Fix memory leak when use MATCHED_VAR_NAMES. 2 May 2011 - 2.6.0-rc2 ------------------- * Added code optimizations - thanks Diego Elio. * Added support to AIX and HPUX in the build system (untested). * Renamed decodeBase64Ext to base64DecodeExt. * Build system improvements - thanks Diego Elio. * Improvements on gsblookup parser. * Fixed input filter bug when upload files and SecStreamInBodyInspect is enabled. * Logging improvements and bug fix. * Remove extra useless files when make clean and maintainer-clean 18 Apr 2011 - 2.6.0-rc1 ------------------- * Replaced previous GPLv2 License to Apachev2. * Added Google Safe Browsing lookups operator and directive. It should be used to extract and lookup urls from http packets. * Added Data Modification operator. It must be used with STREAM_* variables to replace/add/edit any data from http bodies. * Added STREAM_OUPUT_BODY and STREAM_INPUT_BODY variables to work with data modification operators. * Added fast ip address operator. It supports partial ip address, cidr for IPv4 and IPv6. Thanks Tom Donovan. * Added new sensitive data tracking verifyCPF and verifySSN. * Added MATCHED_VARS and MATCHED_VARS_NAMES. It is similiar to MATCHED_VAR, but now we should see all matched variables. * Added UNIQUE_ID variable. It holds the data created my mod_unique_id. * Added new tranformation cmdline. Thanks Marc Stern. * Added new exception handling operators and directives. It should help users reduce FN and FPs. The directives SecRuleUpdateTargetById, SecRuleRemoveByTag and its ctl actions were included. * Added SecStreamOutBodyInspection and SecStreamInBodyInspection to enable STREAM_* variables. * Added SecGsbLookupDB used to load Google Safe Browsing malware databse into memory. * Added the directive SecInterceptOnError to control what to do if a rule returns values less than zero. * Improvements in DetectionOnly engine mode. Also added SecRequestBodyLimitAction to control what to do if the engine receive a http request over a hard limit. Note that there is now many combinations with SecRuleEngine and the limit action directives for response and request data. Please see the reference manual. * Improvements under RBL operator. It now will parse return code values for some RBL lists. * Added new Log Part J. It should log some informations about uploaded files. * Added new sanitizeMatchedBytes action. It will give more flexibilty for user to sanitize logged data, also improving peformance when sanitize big amount of data. * Improvements on Logging phase. It is possible now see full chains, distinguish between simple rules, chain starters and chain nodes. * Improvements on AutoTools usage. * Improvements on pattern matching operators, pmf, pm and strmatch now supports more flexible input data allowing any kind of special char. * Improvements on SecRuleUpdateActionById to update chain nodes. * Many bugs were fixed. Please see the ModSecurity Jira for more details 19 Mar 2010 - trunk ------------------- * Added SecDisableBackendCompression, which disabled backend compression while keeping the frontend compression enabled (assuming mod_deflate in installed and configured in the proxy). [Ivan Ristic] * Added REQUEST_BODY_LENGTH, which contains the number of request body bytes read. [Ivan Ristic] * Integrate with mod_log_config using the %{VARNAME}M format string. (MODSEC-108) [Ivan Ristic] * Replaced the previous time-measuring mechanism with a new one, which provides the following information: request time, request duration, phase duration (for all 5 phases), time spent dealing with persistent storage, and time spent on audit logging. The new information is now available in the Stopwatch2 audit log header. The Stopwatch header remains for backward compatiblity, although it now only includes the request time and request duration values. Added the following variables: PERF_COMBINED, PERF_PHASE1, PERF_PHASE2, PERF_PHASE3, PERF_PHASE4, PERF_PHASE5, PERF_SREAD, PERF_SWRITE, PERF_LOGGING, PERF_GC. [Ivan Ristic] * Added DURATION, which contains the time ellapsed since the beginning of the current transaction, in milliseconds. [Ivan Ristic] * Adjusted phase 5 to execute just prior to mod_log_config. This should allow phase 5 rules to to implement conditional logging, as well as pave support for allowing access to all ModSecurity variables from mog_log_config. [Ivan Ristic] * Added the URLENCODED_ERROR flag, which is raised whenever invalid URL encoding is encountered in the query string or in the request body (but only if URLENCODED request body processor is used). (MODSEC-111) [Ivan Ristic] * Removed the obsolete PDF UXSS functionality. (MODSEC-96) [Ivan Ristic] * Renamed normalisePath to normalizePath and normalisePathWin to normalizePathWin. Kept the previous names for backward compatibility. (MODSEC-103) [Ivan Ristic] * Moved phase 1 to be run in the same Apache hook as phase 2. This means that you can now have phase 1 rules in tags and, more importantly, override server configuration in and others. (MODSEC-98) [Ivan Ristic] * Renamed the sanitise family of actions to sanitize. Kept the old variants for backward compatibility. (MODSEC-95) [Ivan Ristic] * Improve the logging of the ctl action. (MODSEC-99) [Ivan Ristic] * Cleanup build files that were from the Apache source. 14 Feb 2010 - 2.5.13-dev1 ------------------------- * Cleaned up some mlogc code and debugging output. * Remove the ability to use a relative path to a piped audit logger (i.e. mlogc) as Apache does not support it in their piped loggers and it was breaking Windows and probably other platforms that use spaces in filesystem paths. Discovered by Tom Donovan. * Fix memory leak freeing regex. Discovered by Tom Donovan. * Fix some portability issues on Windows. 04 Feb 2010 - 2.5.12 -------------------- * Fixed SecUploadFileMode to set the correct mode. * Fixed nolog,auditlog/noauditlog/nolog controls for disruptive actions. * Added additional file info definitions introduced in APR 0.9.5 so that build will work with older APRs (IBM HTTP Server v6). * Added SecUploadFileLimit to limit the number of uploaded file parts that will be processed in a multipart POST. The default is 100. * Fixed path normalization to better handle backreferences that extend above root directories. Reported by Sogeti/ESEC R&D. * Trim whitespace around phrases used with @pmFromFile and allow for both LF and CRLF terminated lines. * Allow for more robust parsing for multipart header folding. Reported by Sogeti/ESEC R&D. * Fixed failure to match internally set TX variables with regex (TX:/.../) syntax. * Fixed failure to log full internal TX variable names and populate MATCHED_VAR* vars. * Enabled PCRE "studying" by default. This is now a configure-time option. * Added PCRE match limits (SecPcreMatchLimit/SecPcreMatchLimitRecursion) to aide in REDoS type attacks. A rule that goes over the limits will set TX:MSC_PCRE_LIMITS_EXCEEDED. It is intended that the next major release of ModSecurity (2.6.x) will move these flags to a dedicated collection. * Reduced default PCRE match limits reducing impact of REDoS on poorly written regex rules. Reported by Sogeti/ESEC R&D. * Fixed memory leak in v1 cookie parser. Reported by Sogeti/ESEC R&D. * Now support macro expansion in numeric operators (@eq, @ge, @lt, etc.) * Update copyright to 2010. * Reserved 700,000-799,999 IDs for Ivan Ristic. * Fixed SecAction not working when CONNECT request method is used (MODSEC-110). [Ivan Ristic] * Do not escape quotes in macro resolution and only escape NUL in setenv values. 04 Nov 2009 - 2.5.11 -------------------- * Added a new multipart flag, MULTIPART_INVALID_QUOTING, which will be set true if any invalid quoting is found during multipart parsing. * Fixed parsing quoted strings in multipart Content-Disposition headers. Discovered by Stefan Esser. * Cleanup persistence database locking code. * Added warning during configure if libcurl is found linked against gnutls for SSL. The openssl lib is recommended as gnutls has proven to cause issues with mutexes and may crash. * Cleanup some mlogc (over)logging. * Do not log output filter errors in the error log. * Moved output filter to run before other stock filters (mod_deflate, mod_cache, mod_expires, mod_filter) to avoid analyzing modified data in the response. Patch originally submitted by Ivan Ristic. 18 Sep 2009 - 2.5.10 -------------------- * Cleanup mlogc so that it builds on Windows. * Added more detailed messages to replace "Unknown error" in filters. * Added SecAuditLogDirMode and SecAuditLogFileMode to allow fine tuning auditlog permissions (especially with mpm-itk). * Cleanup SecUploadFileMode implementation. * Cleanup build scripts. * Fixed crash on configuration if SecMarker is used before any rules. * Fixed SecRuleUpdateActionById so that it will work on chain starters. * Cleanup build system for mlogc. * Allow mlogc to periodically flush memory pools. * Using nolog,auditlog will now log the "Message:" line to the auditlog, but nothing to the error log. Prior versions dropped the "Message:" line from both logs. To do this now, just use "nolog" or "nolog,noauditlog". * Forced mlogc to use SSLv3 to avoid some potential auto negotiation issues with some libcurl versions. * Fixed mlogc issue seen on big endian machines where content type could be listed as zero. * Removed extra newline from audit log message line when logging XML errors. This was causing problems parsing audit logs. * Fixed @pm/@pmFromFile case insensitivity. * Truncate long parameters in log message for "Match of ... against ... required" messages. * Correctly resolve chained rule actions in logs. * Cleanup some code for portability. * AIX does not support hidden visibility with xlc compiler. * Allow specifying EXTRA_CFLAGS during configure to override gcc specific values for non-gcc compilers. * Populate GEO:COUNTRY_NAME and GEO:COUNTRY_CONTINENT as documented. * Handle a newer geo database more gracefully, avoiding a potential crash for new countries that ModSecurity is not yet aware. * Allow checking &GEO "@eq 0" for a failed @geoLookup. * Fixed mlogc global mutex locking issue and added more debugging output. * Cleaned up build dependencies and configure options. 05 Mar 2009 - 2.5.9 ------------------- * Fixed parsing multipart content with a missing part header name which would crash Apache. Discovered by "Internet Security Auditors" (isecauditors.com). * Added ability to specify the config script directly using --with-apr and --with-apu. * Updated copyright year to 2009. * Added macro expansion for append/prepend action. * Fixed race condition in concurrent updates of persistent counters. Updates are now atomic. * Cleaned up build, adding an option for verbose configure output and making the mlogc build more portable. 21 Nov 2008 - 2.5.8 ------------------- * Fixed PDF XSS issue where a non-GET request for a PDF file would crash the Apache httpd process. Discovered by Steve Grubb at Red Hat. * Removed an invalid "Internal error: Issuing "%s" for unspecified error." message that was logged when denying with nolog/noauditlog set and causing the request to be audited. 24 Sep 2008 - 2.5.7 ------------------- * Fixed XML DTD/Schema validation which will now fail after request body processing errors, even if the XML parser returns a document tree. * Added ctl:forceRequestBodyVariable=on|off which, when enabled, will force the REQUEST_BODY variable to be set when a request body processor is not set. Previously the REQUEST_BODY target was only populated by the URLENCODED request body processor. * Integrated mlogc source. * Fixed logging the hostname in the error_log which was logging the request hostname instead of the Apache resolved hostname. * Allow for disabling request body limit checks in phase:1. * Added transformations for processing parity for legacy protocols ported to HTTP(S): t:parityEven7bit, t:parityOdd7bit, t:parityZero7bit * Added t:cssDecode transformation to decode CSS escapes. * Now log XML parsing/validation warnings and errors to be in the debug log at levels 3 and 4, respectivly. 31 Jul 2008 - 2.5.6 ------------------- * Transformation caching has been deprecated, and is now off by default. We now advise against using transformation caching in production. * Fixed two separate transformation caching issues that could cause incorrect content inspection in some circumstances. * Fixed an issue with the transformation cache using too much RAM, potentially crashing Apache with a large number of cache entries. Two new configuration options have been added to allow for a finer control of caching: maxitems: Max number of items to cache (default 1024) incremental: Whether to cache incrementally (default off) * Added an experimental regression testing suite. The regression suite may be executed via "make test-regression", however it is strongly advised to only be executed on a non-production machine as it will startup the Apache web server that ModSecurity is compiled against with various configurations in which it will run tests. * Added a licensing exception so that ModSecurity can be used in a derivative work when that derivative is also under an approved open source license. * Updated mlogc to version 1.4.5 which adds a LockFile directive and fixes an issue in which the configuration file may be deleted. 05 Jun 2008 - 2.5.5 ------------------- * Fixed an issue where an alert was not logged in the error log unless "auditlog" was used. * Enable the "auditlog" action by default to help prevent a misconfiguration. The new default is now: "phase:2,log,auditlog,pass" * Improve request body processing error messages. * Handle lack of a new line after the final boundary in a multipart request. This fixes the reported WordPress Flash file uploader problem. * Fixed issue with multithreaded servers where concurrent XML processing could crash the web server (at least under Windows). * Fixed blocking in phase 3. * Force modules "mod_rpaf-2.0.c" and "mod_custom_header.c" to run before ModSecurity so that the correct IP is used. 07 May 2008 - 2.5.4 ------------------- * Fixed issue where transformation cache was using the SecDefaultAction value even when t:none was used within a rule. 24 Apr 2008 - 2.5.3 ------------------- * Fixed issue where the exec action may not be able to execute shell scripts. * Macros are now expanded in expirevar and deprecatevar. * Fixed crash if a persistent variable name was more than 126 characters. * Updated included Core Ruleset to version 1.6.1 which fixes some false negative issues in the migration to using some 2.5 features. 02 Apr 2008 - 2.5.2 ------------------- * Allow HTTP_* targets as an alias for REQUEST_HEADERS:*. * Make sure temporary filehandles are closed after a transaction. * Make sure the apache include directory is included during build. 02 Apr 2008 - 2.1.7 ------------------- * Make sure temporary filehandles are closed after a transaction. 14 Mar 2008 - 2.5.1 ------------------- * Fixed an issue where a match would not occur if transformation caching was enabled. * Using "severity" in a default action is now just a warning. * Cleaned up the "make test" target to better locate headers/libraries. * Now search /usr/lib64 and /usr/lib32 for lua libs. * No longer treat warnings as errors by default (use --enable-strict-compile). 19 Feb 2008 - 2.5.0 ------------------- * Updated included Core Ruleset to version 1.6.0 which uses 2.5 features. * Cleaned up and clarified some documentation. * Updated code to be more portable so it builds with MS VC++. * Added unit tests for most operators and transformations. * Fixed crash on startup when ENV is improperly used without a parameter. * Allow macro resolution in setenv action. * The default action is now a minimal "phase:2,log,pass" with no default transformations performed. * Implemented SecUploadFileMode to allow setting the mode for uploaded files. * Implemented "block" action. * Implemented SecRuleUpdateActionById. * Fixed removal of phase 5 rules via SecRuleRemoveBy* directives. * No longer log the query portion of the URI in the error log as it may contain sensitive data. * Build is now 'configure' based: ./configure && make && make install * Added support for Lua scripting in the following ways: SecRuleScript can be used to specify a script to execute as a rule, the exec action processes Lua scripts internally, as does the @inspectFile operator. Refer to the documentation for more details. * Changed how allow works. Used on its own it now allows phases 1-4. Used with parameter "phase" (e.g. SecAction allow:phase) it only affects the current phase. Used with parameter "request" it allows phases 1-2. * Fixed issue where only the first phase 5 rule would run when the request was intercepted in an earlier phase. * Stricter configuration parsing. Disruptive actions, meta actions and phases are no longer allowed in a chained rule. Disruptive actions, are no longer allowed in a logging phase (phase 5) rule, including inheriting from SecDefaultAction. * More efficient collection persistance. * Fixed t:escapeSeqDecode to better follow ANSI C escapes. * Added t:jsDecode to decode JavScript escape sequences. * Added IS_NEW built-in collection variables. * New audit log part 'K' logs all matching rules. * Implemented SecRequestBodyNoFilesLimit. * Enhance handling of the case where we run out of disk space while writing to audit log entry. * Added SecComponentSignature to allow other components the ability to append to the logged signature. * Added skipAfter: action to allow skipping all rules until a rule with a specified ID is reached. Rule execution then continues after the specified rule. * Added SecMarker directive to allow a fixed target for skipAfter. * Added ctl:ruleRemoveById action to allow rule removal on a match. * Added a @containsWord operator that will match a given string anywhere in the target value, but only on word boundaries. * Added a MATCHED_VAR_NAME variable to store the last matched variable name so that it can be more easily used by rules. * Added a MATCHED_VAR variable to store the last matched variable value so that it can be more easily used by rules. * Fixed expansion of macros when using relative changes with setvar. In addition, added support for expanding macros in the variable name. * Situations where ModSecurity will intercept, generate an error or log a level 1-3 message to the debug log are now marked as 'relevant' and may generate an audit log entry. * Fixed deprecatevar:var=N/S action so that it decrements N every S seconds as documented instead of decrementing by a rate. * Enable ModSecurity to look at partial response bodies. In previous versions, ModSecurity would respond with status code 500 when the response body was too long. Now, if SecResponseBodyLimitAction is set to "ProcessPartial", it will process the part of the response body received up until that point but send the rest without buffering. * ModSecurity will now process phases 3 and 4 even when request processing is interrupted (either by Apache - e.g. by responding with 400, 401 or 403, or by ModSecurity itself). * Fixed the base64decode transformation function to not return extra characters at the end. * Return from the output filter with an error in addition to setting up the HTTP error status in the output data. * Used new Apache API calls to get the server version/banner when available. * Added "logdata" meta action to allow logging of raw transaction data. * Added TX_SEVERITY that keeps track of the highest severity for any matched rules so far. * Added ARGS_GET, ARGS_POST, ARGS_GET_NAMES, ARGS_POST_NAMES variables to allow seperation of GET and POST arguments. * Added an Apache define (MODSEC_2.5) so that you can conditionally include directives based on the ModSecurity major/minor versions with IfDefine. * Added MODSEC_BUILD variable that contains the numeric build value based on the ModSecurity version. * Enhanced debug logging by displaying more data on rule execution. All invoked rules are now logged in the debug log at level 5. * Stricter validation for @validateUtf8Encoding. * No longer process Apache internal subrequests. * Fixed warnings on Solaris and/or 64bit builds. * Added @within string comparison operator with support for macro expansion. * Do not trigger "pause" action for internal requests. * Added matching rule filename and line number to audit log. * Added new phrase matching operators, @pm and @pmFromFile. These use an alternate set based matching engine (Aho-Corasick) to perform faster phrase type matches such as black/white lists, spam keywords, etc. * Allow caching transformations per-request/phase so they are not repeated. * Added Solaris and Cygwin to the list of platforms not supporting the hidden visibility attribute. * Fixed decoding full-width unicode in t:urlDecodeUni. * Add SecGeoLookupDB, @geoLookups and GEO collection to support geographical lookups by IP/host. * Do not try to intercept a request after a failed rule. This fixes the issue associated with an "Internal Error: Asked to intercept request but was_intercepted is zero" error message. * Removed extraneous exported symbols. * Merged the PDF XSS protection functionality into ModSecurity. * Exported API for registering custom variables. Example in api directory. * Added experimental support for content injection. Directive SecContentInjection (On|Off) controls whether injection is taking place. Actions "prepend" and "append" inject content when executed. Do note that it is your responsibility to make sure the response is of the appropriate content type (e.g. HTML, plain text, etc). * Added string comparison operators with support for macro expansion: @contains, @streq, @beginsWith and @endsWith. * Enhanced debug log output to log macro expansion, quote values and correctly display values that contained NULs. * Removed support for %0 - %9 capture macros as they were incorrectly expanding url encoded values. Use %{TX.0} - %{TX.9} instead. * Added t:length to transform a value to its character length. * Added t:trimLeft, t:trimRight, t:trim to remove whitespace from a value on the left, right or both. * Added SecAuditLog2 directive to allow redundent concurrent audit log index files. This will allow sending audit data to two consoles, etc. * Removed CGI style HTTP_* variables in favor of REQUEST_HEADERS:Header-Name. * Store filename/line for each rule and display it and the ID (if available) in the debug log when invoking a rule. Thanks to Christian Bockermann for the idea. * Do not log 'allow' action as intercepted in the debug log. * Fixed some collection variable names not printing with the parameter and/or counting operator in the debug log. 19 Feb 2008 - 2.1.6 ------------------- * Fixed crash on startup when ENV is improperly used without a parameter. * Allow macro resolution in setenv action. * Implemented SecUploadFileMode to allow setting the mode for uploaded files. * No longer log the query portion of the URI in the error log as it may contain sensitive data. 10 Jan 2008 - 2.1.5 ------------------- * Updated included Core Ruleset to version 1.5.1. * Phase 5 rules can now be removed via SecRuleRemoveBy* directives. * Fixed issue where only the first phase 5 rule would run when the request was intercepted in an earlier phase. * Fixed configuration parsing so that disruptive actions, meta actions and phases are not allowed in a chained rule (as originally intended). * Fixed t:escapeSeqDecode to better follow ANSI C escapes. 27 Nov 2007 - 2.1.4 ------------------- * Updated included Core Ruleset to version 1.5 and noted in the docs that XML support is required to use the rules without modification. * Fixed an evasion FP, mistaking a multipart non-boundary for a boundary. * Fixed multiple warnings on Solaris and/or 64bit builds. * Do not process subrequests in phase 2-4, but do hand off the request data. * Fixed a blocking FP in the multipart parser, which affected Safari. 11 Sep 2007 - 2.1.3 ------------------- * Updated multipart parsing code adding variables to allow checking for various parsing issues (request body abnormalities). * Allow mod_rpaf and mod_extract_forwarded2 to work before ModSecurity. * Quiet some compiler warnings. * Do not block internal ErrorDocument requests after blocking request. * Added ability to compile without an external API (use -DNO_MODSEC_API). 27 Jul 2007 - 2.1.2 ------------------- * Cleaned up and clarified some documentation. * Update included core rules to latest version (1.4.3). * Enhanced ability to alert/audit failed requests. * Do not trigger "pause" action for internal requests. * Fixed issue with requests that use internal requests. These had the potential to be intercepted incorrectly when other Apache httpd modules that used internal requests were used with mod_security. * Added Solaris and Cygwin to the list of platforms not supporting the hidden visibility attribute. * Fixed decoding full-width unicode in t:urlDecodeUni. * Lessen some overhead of debugging messages and calculations. * Do not try to intercept a request after a failed rule. This fixes the issue associated with an "Internal Error: Asked to intercept request but was_intercepted is zero" error message. * Added SecAuditLog2 directive to allow redundent concurrent audit log index files. This will allow sending audit data to two consoles, etc. * Small performance improvement in memory management for rule execution. 11 Apr 2007 - 2.1.1 ------------------- * Add the PCRE_DOLLAR_ENDONLY option when compiling regular expression for the @rx operator and variables. * Really set PCRE_DOTALL option when compiling the regular expression for the @rx operator as the docs state. * Fixed potential memory corruption when expanding macros. * Fixed error when a collection was retrieved from storage in the same second as creation by setting the rate to zero. * Fixed ASCIIZ (NUL) parsing for application/x-www-form-urlencoded forms. * Fixed the faulty REQUEST_FILENAME variable, which used to change the internal Apache structures by mistake. * Updates to quiet some compiler warnings. * Fixed some casting issues for compiling on NetWare (patch from Guenter Knauf). 23 Feb 2007 - 2.1.0 ------------------- * Removed the "Connection reset by peer" message, which has nothing to do with us. Actually the message was downgraded from ERROR to NOTICE so it will still appear in the debug log. * Removed the (harmless) message mentioning LAST_UPDATE_TIME missing. * It was not possible to remove a rule placed in phase 4 using SecRuleRemoveById or SecRuleRemoveByMsg. Fixed. * Fixed a problem with incorrectly setting requestBodyProcessor using the ctl action. * Bundled Core Rules 2.1-1.3.2b4. * Updates to the reference manual. * Reversed the return values of @validateDTD and @validateSchema, to make them consistent with other operators. * Added a few helpful debug messages in the XML validation area. * Updates to the reference manual. * Fixed the validateByteRange operator. * Default value for the status action is now 403 (as it was supposed to be but it was effectively 500). * Rule exceptions (removing using an ID range or an regular expression) is now applied to the current context too. (Previously it only worked on rules that are inherited from the parent context.) * Fix of a bug with expired variables. * Fixed regular expression variable selectors for many collections. * Performance improvements - up to two times for real-life work loads! * Memory consumption improvements (not measured but significant). * The allow action did not work in phases 3 and 4. Fixed. * Unlocked collections GLOBAL and RESOURCE. * Added support for variable expansion in the msg action. * New feature: It is now possible to make relative changes to the audit log parts with the ctl action. For example: "ctl:auditLogParts=+E". * New feature: "tag" action. To be used for event categorisation. * XML parser was not reporting errors that occured at the end of XML payload. * Files were not extracted from request if SecUploadKeepFiles was Off. Fixed. * Regular expressions that are too long are truncated to 256 characters before used in error messages. (In order to keep the error messages in the log at a reasonable size.) * Fixed the sha1 transformation function. * Fixed the skip action. * Fixed REQUEST_PROTOCOL, REMOTE_USER, and AUTH_TYPE. * SecRuleEngine did not work in child configuration contexts (e.g. ). * Fixed base64Decode and base64Encode. 15 Nov 2006 - 2.0.4 ------------------- * Fixed the "deprecatevar" action. * Decreasing variable values did not work. * Made "nolog" do what it is supposed to do - cause a rule match to not be logged. Also "nolog" now implies "noauditlog" but it's possible to follow "nolog" with "auditlog" and have the match not logged to the error log but logged to the auditlog. (Not something that strikes me as useful but it's possible.) * Relative paths given to SecDataDir will now be treated as relative to the Apache server root. * Added checks to make sure only correct actions are specified in SecDefaultAction (some actions are required, some don't make any sense) and in rules that are not chain starters (same). This should make the unhelpful "Internal Error: Failed to add rule to the ruleset" message go away. * Fixed the problem when "SecRuleInheritance Off" is used in a context with no rules defined. * Fixed a problem of lost input (request body) data on some redirections, for example when mod_rewrite is used. 26 Oct 2006 - 2.0.3 ------------------- * Fixed a memory leak (all platforms) and a concurrency control problem that could cause a crash (multithreaded platforms only). * Fixed a SecAuditLogRelevantStatus problem, which would not work properly unless the regular expression contained a subexpression. 19 Oct 2006 - 2.0.2 ------------------- * Fixed incorrect permissions on the global mutex, which prevented the mutex from working properly. * Fixed incorrect actionset merging where the status was copied from the child actionset even though it was not defined. * Fixed missing metadata information (in the logs) for warnings. 16 Oct 2006 - 2.0.1 ------------------- * Rules that used operator negation did not work. Fixed. * Fixed bug that prevented invalid regular expressions from being reported. 16 Oct 2006 - 2.0.0 ------------------- * First stable 2.x release. modsecurity-2.9.5/Makefile.in0000664000175000017500000007374214147005250017300 0ustar mhsvierulamhsvierula# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/find_apr.m4 \ $(top_srcdir)/build/find_apu.m4 \ $(top_srcdir)/build/find_curl.m4 \ $(top_srcdir)/build/find_lua.m4 \ $(top_srcdir)/build/find_pcre.m4 \ $(top_srcdir)/build/find_ssdeep.m4 \ $(top_srcdir)/build/find_xml.m4 \ $(top_srcdir)/build/find_yajl.m4 \ $(top_srcdir)/build/libtool.m4 \ $(top_srcdir)/build/ltoptions.m4 \ $(top_srcdir)/build/ltsugar.m4 \ $(top_srcdir)/build/ltversion.m4 \ $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/apache2/modsecurity_config_auto.h CONFIG_CLEAN_FILES = nginx/modsecurity/config build/apxs-wrapper \ tests/regression/misc/40-secRemoteRules.t \ tests/regression/misc/50-ipmatchfromfile-external.t \ tests/regression/misc/60-pmfromfile-external.t \ tests/regression/server_root/conf/httpd.conf CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/build/apxs-wrapper.in $(top_srcdir)/build/ar-lib \ $(top_srcdir)/build/compile $(top_srcdir)/build/config.guess \ $(top_srcdir)/build/config.sub $(top_srcdir)/build/install-sh \ $(top_srcdir)/build/ltmain.sh $(top_srcdir)/build/missing \ $(top_srcdir)/nginx/modsecurity/config.in \ $(top_srcdir)/tests/regression/misc/40-secRemoteRules.t.in \ $(top_srcdir)/tests/regression/misc/50-ipmatchfromfile-external.t.in \ $(top_srcdir)/tests/regression/misc/60-pmfromfile-external.t.in \ $(top_srcdir)/tests/regression/server_root/conf/httpd.conf.in \ build/ar-lib build/compile build/config.guess build/config.sub \ build/depcomp build/install-sh build/ltmain.sh build/missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APR_CFLAGS = @APR_CFLAGS@ APR_CONFIG = @APR_CONFIG@ APR_CPPFLAGS = @APR_CPPFLAGS@ APR_INCLUDEDIR = @APR_INCLUDEDIR@ APR_LDADD = @APR_LDADD@ APR_LDFLAGS = @APR_LDFLAGS@ APR_LINKLD = @APR_LINKLD@ APR_VERSION = @APR_VERSION@ APU_CFLAGS = @APU_CFLAGS@ APU_CONFIG = @APU_CONFIG@ APU_INCLUDEDIR = @APU_INCLUDEDIR@ APU_LDADD = @APU_LDADD@ APU_LDFLAGS = @APU_LDFLAGS@ APU_LINKLD = @APU_LINKLD@ APU_VERSION = @APU_VERSION@ APXS = @APXS@ APXS_BINDIR = @APXS_BINDIR@ APXS_CC = @APXS_CC@ APXS_CFLAGS = @APXS_CFLAGS@ APXS_EXTRA_CFLAGS = @APXS_EXTRA_CFLAGS@ APXS_HTTPD = @APXS_HTTPD@ APXS_INCLUDEDIR = @APXS_INCLUDEDIR@ APXS_INCLUDES = @APXS_INCLUDES@ APXS_LDFLAGS = @APXS_LDFLAGS@ APXS_LIBDIR = @APXS_LIBDIR@ APXS_LIBEXECDIR = @APXS_LIBEXECDIR@ APXS_LIBS = @APXS_LIBS@ APXS_LIBTOOL = @APXS_LIBTOOL@ APXS_MODULES = @APXS_MODULES@ APXS_PROGNAME = @APXS_PROGNAME@ APXS_SBINDIR = @APXS_SBINDIR@ APXS_WRAPPER = @APXS_WRAPPER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_CPPFLAGS = @CURL_CPPFLAGS@ CURL_LDADD = @CURL_LDADD@ CURL_LDFLAGS = @CURL_LDFLAGS@ CURL_USES_GNUTLS = @CURL_USES_GNUTLS@ CURL_VERSION = @CURL_VERSION@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENV_CMD = @ENV_CMD@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ LIBXML2_CONFIG = @LIBXML2_CONFIG@ LIBXML2_CPPFLAGS = @LIBXML2_CPPFLAGS@ LIBXML2_LDADD = @LIBXML2_LDADD@ LIBXML2_LDFLAGS = @LIBXML2_LDFLAGS@ LIBXML2_VERSION = @LIBXML2_VERSION@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LDADD = @LUA_LDADD@ LUA_LDFLAGS = @LUA_LDFLAGS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MODSEC_APXS_EXTRA_CFLAGS = @MODSEC_APXS_EXTRA_CFLAGS@ MODSEC_EXTRA_CFLAGS = @MODSEC_EXTRA_CFLAGS@ MSC_BASE_DIR = @MSC_BASE_DIR@ MSC_PKGBASE_DIR = @MSC_PKGBASE_DIR@ MSC_REGRESSION_CONF_DIR = @MSC_REGRESSION_CONF_DIR@ MSC_REGRESSION_DIR = @MSC_REGRESSION_DIR@ MSC_REGRESSION_DOCROOT_DIR = @MSC_REGRESSION_DOCROOT_DIR@ MSC_REGRESSION_LOGS_DIR = @MSC_REGRESSION_LOGS_DIR@ MSC_REGRESSION_SERVERROOT_DIR = @MSC_REGRESSION_SERVERROOT_DIR@ MSC_TEST_DIR = @MSC_TEST_DIR@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCRE_CFLAGS = @PCRE_CFLAGS@ PCRE_CONFIG = @PCRE_CONFIG@ PCRE_CPPFLAGS = @PCRE_CPPFLAGS@ PCRE_LDADD = @PCRE_LDADD@ PCRE_LDFLAGS = @PCRE_LDFLAGS@ PCRE_LD_PATH = @PCRE_LD_PATH@ PCRE_VERSION = @PCRE_VERSION@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSDEEP_CFLAGS = @SSDEEP_CFLAGS@ SSDEEP_LDADD = @SSDEEP_LDADD@ SSDEEP_LDFLAGS = @SSDEEP_LDFLAGS@ STRIP = @STRIP@ TOPLEVEL_SUBDIRS = @TOPLEVEL_SUBDIRS@ VERSION = @VERSION@ YAJL_CFLAGS = @YAJL_CFLAGS@ YAJL_LDADD = @YAJL_LDADD@ YAJL_LDFLAGS = @YAJL_LDFLAGS@ YAJL_LIBS = @YAJL_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I build SUBDIRS = @TOPLEVEL_SUBDIRS@ tests CLEANFILES = tests/regression/server_root/conf/*.t_*.conf \ tests/regression/server_root/logs/*.log MAINTAINERCLEANFILES = $(CLEANFILES) aclocal.m4 alp2/Makefile.in \ apache2/Makefile.in build/config.guess build/config.sub \ build/depcomp build/libtool.m4 build/ltmain.sh \ build/lt~obsolete.m4 build/ltoptions.m4 build/ltsugar.m4 \ build/ltversion.m4 build/missing config.log config.status \ configure ext/Makefile.in Makefile Makefile.in \ mlogc/Makefile.in modsecurity_config_auto.h.in~ all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): nginx/modsecurity/config: $(top_builddir)/config.status $(top_srcdir)/nginx/modsecurity/config.in cd $(top_builddir) && $(SHELL) ./config.status $@ build/apxs-wrapper: $(top_builddir)/config.status $(top_srcdir)/build/apxs-wrapper.in cd $(top_builddir) && $(SHELL) ./config.status $@ tests/regression/misc/40-secRemoteRules.t: $(top_builddir)/config.status $(top_srcdir)/tests/regression/misc/40-secRemoteRules.t.in cd $(top_builddir) && $(SHELL) ./config.status $@ tests/regression/misc/50-ipmatchfromfile-external.t: $(top_builddir)/config.status $(top_srcdir)/tests/regression/misc/50-ipmatchfromfile-external.t.in cd $(top_builddir) && $(SHELL) ./config.status $@ tests/regression/misc/60-pmfromfile-external.t: $(top_builddir)/config.status $(top_srcdir)/tests/regression/misc/60-pmfromfile-external.t.in cd $(top_builddir) && $(SHELL) ./config.status $@ tests/regression/server_root/conf/httpd.conf: $(top_builddir)/config.status $(top_srcdir)/tests/regression/server_root/conf/httpd.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ clean-libtool cscope cscopelist-am ctags ctags-am dist \ dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ dist-xz dist-zip distcheck distclean distclean-generic \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile test: check test-regression: (cd tests && $(MAKE) test-regression) test-regression-nginx: (cd tests && $(MAKE) test-regression-nginx) cppcheck: cppcheck . --enable=all --force 2>&1 | sed 's/^/warning: /g' 1>&2; check-coding-style: for i in `(find . -iname "*.c" ; find . -iname "*.h")`; \ do echo $$i...; \ vera++ -rule L004 -param max-line-length=80 $$i 2>&1 | sed 's/^/warning: /g' 1>&2; \ vera++ -rule L001 $$i 2>&1 | sed 's/^/warning: /g' 1>&2; \ done; .PHONY: test # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: modsecurity-2.9.5/mlogc/0000775000175000017500000000000014147005250016317 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/mlogc/Makefile.am0000664000175000017500000000062414147005233020356 0ustar mhsvierulamhsvierula bin_SCRIPTS = mlogc-batch-load.pl bin_PROGRAMS = mlogc mlogc_SOURCES = mlogc.c mlogc_CPPFLAGS = @APR_CPPFLAGS@ \ @PCRE_CPPFLAGS@ \ @CURL_CPPFLAGS@ \ -I$(top_srcdir)/apache2 mlogc_CFLAGS = @APR_CFLAGS@ \ @CURL_CFLAGS@ \ @PCRE_CFLAGS@ mlogc_LDFLAGS = @APR_LDFLAGS@ \ @CURL_LDFLAGS@ \ @PCRE_LDFLAGS@ mlogc_LDADD = @APR_LDADD@ \ @CURL_LDADD@ \ @PCRE_LDADD@ modsecurity-2.9.5/mlogc/mlogc-batch-load.pl.in0000775000175000017500000000644414147005233022372 0ustar mhsvierulamhsvierula#!@PERL@ # # ModSecurity for Apache 2.x, http://www.modsecurity.org/ # Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) # # You may not use this file except in compliance with # the License.  You may obtain a copy of the License at # #     http://www.apache.org/licenses/LICENSE-2.0 # # If any of the files related to licensing are missing or if you have any # other questions related to licensing please contact Trustwave Holdings, Inc. # directly using the email address security@modsecurity.org. use strict; use File::Find qw(find); use File::Spec::Functions qw(catfile); use Sys::Hostname qw(hostname); use Digest::MD5 qw(md5_hex); my $ROOTDIR = $ARGV[0] || ''; my $MLOGC = $ARGV[1] || ''; my $MLOGCCONF = $ARGV[2] || ''; my @AUDIT = (); if ($ROOTDIR eq '' or ! -e $MLOGC or ! -e $MLOGCCONF) { printf STDERR "\nUsage: $0 \n\n"; exit 1; } open(MLOGC, "|$MLOGC -f $MLOGCCONF") or die "ERROR: could not open '$MLOGC' - $!\n"; find( { wanted => sub { my($fn,$dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size); (($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = stat($_)) && -f _ && #### MODSEC-204 /^\d{8}-\d+-\w{24}$/s /^\d{8}-\d+-.{24,}$/s && (($fn = $File::Find::name) =~ s/^\Q$ROOTDIR\E//) && push(@AUDIT, [$fn, $size]); }, follow => 1, }, $ROOTDIR ); for my $audit (@AUDIT) { my $fn = $audit->[0]; my $line = ""; my $err = 0; my $ln = 0; my $sln = 0; my $sect = ""; my $data = ""; my %data = ( hostname => hostname(), remote_addr => "-", remote_user => "-", local_user => "-", logtime => "-", request => "-", response_status => "-", bytes_sent => "-", referer => "-", user_agent => "-", uniqueid => "-", sessionid => "-", audit_file => $fn, extra => "0", audit_size => $audit->[1], md5 => "-", ); ### Parse the audit file in an attempt to recreate the original log line open (AUDIT, "<".catfile($ROOTDIR,$fn)) or $err = 1; if ($err == 1) { print STDERR "ERROR: could not open '$fn' - $!\n"; next; } while($line = ) { $data .= $line; chop $line; $ln++; $sln++; if ($line =~ m%^--[0-9A-Fa-f]{8}-([A-Z])--$%) { $sect = $1; $sln = 0; next; }; if ($sect eq 'A') { if ($line =~ m%^(\[[^:]+:\d+:\d+:\d+ [^\]]+\]) (\S+) (\S+) (\d+) (\S+) (\d+)%) { $data{logtime} = $1; $data{uniqueid} = $2; $data{remote_addr} = $3; } next; } elsif ($sect eq 'B') { if ($sln == 1) { $data{request} = $line; } elsif ($line =~ m%^User=Agent: (.*)%i) { $data{user_agent} = $1; } elsif ($line =~ m%^Referer: (.*)%i) { $data{referer} = $1; } next; } elsif ($sect eq 'F') { if ($sln == 1 and $line =~ m%^\S+ (\d{3})\D?.*%) { $data{response_status} = $1; } elsif ($line =~ m%^Content-Length: (\d+)%i) { $data{bytes_sent} = $1; } next; } } $data{md5} = md5_hex($data); printf MLOGC ( "%s %s %s %s %s \"%s\" %s %s \"%s\" \"%s\" %s \"%s\" %s %s %s md5:%s\n", $data{hostname}, $data{remote_addr}, $data{remote_user}, $data{local_user}, $data{logtime}, $data{request}, $data{response_status}, $data{bytes_sent}, $data{referer}, $data{user_agent}, $data{uniqueid}, $data{sessionid}, $data{audit_file}, $data{extra}, $data{audit_size}, $data{md5}, ); } modsecurity-2.9.5/mlogc/Makefile.in0000664000175000017500000006545214147005250020400 0ustar mhsvierulamhsvierula# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = mlogc$(EXEEXT) subdir = mlogc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/find_apr.m4 \ $(top_srcdir)/build/find_apu.m4 \ $(top_srcdir)/build/find_curl.m4 \ $(top_srcdir)/build/find_lua.m4 \ $(top_srcdir)/build/find_pcre.m4 \ $(top_srcdir)/build/find_ssdeep.m4 \ $(top_srcdir)/build/find_xml.m4 \ $(top_srcdir)/build/find_yajl.m4 \ $(top_srcdir)/build/libtool.m4 \ $(top_srcdir)/build/ltoptions.m4 \ $(top_srcdir)/build/ltsugar.m4 \ $(top_srcdir)/build/ltversion.m4 \ $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/apache2/modsecurity_config_auto.h CONFIG_CLEAN_FILES = mlogc-batch-load.pl CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_mlogc_OBJECTS = mlogc-mlogc.$(OBJEXT) mlogc_OBJECTS = $(am_mlogc_OBJECTS) mlogc_DEPENDENCIES = AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = mlogc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(mlogc_CFLAGS) $(CFLAGS) \ $(mlogc_LDFLAGS) $(LDFLAGS) -o $@ am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } SCRIPTS = $(bin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/apache2 depcomp = $(SHELL) $(top_srcdir)/build/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(mlogc_SOURCES) DIST_SOURCES = $(mlogc_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in \ $(srcdir)/mlogc-batch-load.pl.in $(top_srcdir)/build/depcomp \ INSTALL DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APR_CFLAGS = @APR_CFLAGS@ APR_CONFIG = @APR_CONFIG@ APR_CPPFLAGS = @APR_CPPFLAGS@ APR_INCLUDEDIR = @APR_INCLUDEDIR@ APR_LDADD = @APR_LDADD@ APR_LDFLAGS = @APR_LDFLAGS@ APR_LINKLD = @APR_LINKLD@ APR_VERSION = @APR_VERSION@ APU_CFLAGS = @APU_CFLAGS@ APU_CONFIG = @APU_CONFIG@ APU_INCLUDEDIR = @APU_INCLUDEDIR@ APU_LDADD = @APU_LDADD@ APU_LDFLAGS = @APU_LDFLAGS@ APU_LINKLD = @APU_LINKLD@ APU_VERSION = @APU_VERSION@ APXS = @APXS@ APXS_BINDIR = @APXS_BINDIR@ APXS_CC = @APXS_CC@ APXS_CFLAGS = @APXS_CFLAGS@ APXS_EXTRA_CFLAGS = @APXS_EXTRA_CFLAGS@ APXS_HTTPD = @APXS_HTTPD@ APXS_INCLUDEDIR = @APXS_INCLUDEDIR@ APXS_INCLUDES = @APXS_INCLUDES@ APXS_LDFLAGS = @APXS_LDFLAGS@ APXS_LIBDIR = @APXS_LIBDIR@ APXS_LIBEXECDIR = @APXS_LIBEXECDIR@ APXS_LIBS = @APXS_LIBS@ APXS_LIBTOOL = @APXS_LIBTOOL@ APXS_MODULES = @APXS_MODULES@ APXS_PROGNAME = @APXS_PROGNAME@ APXS_SBINDIR = @APXS_SBINDIR@ APXS_WRAPPER = @APXS_WRAPPER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_CPPFLAGS = @CURL_CPPFLAGS@ CURL_LDADD = @CURL_LDADD@ CURL_LDFLAGS = @CURL_LDFLAGS@ CURL_USES_GNUTLS = @CURL_USES_GNUTLS@ CURL_VERSION = @CURL_VERSION@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENV_CMD = @ENV_CMD@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ LIBXML2_CONFIG = @LIBXML2_CONFIG@ LIBXML2_CPPFLAGS = @LIBXML2_CPPFLAGS@ LIBXML2_LDADD = @LIBXML2_LDADD@ LIBXML2_LDFLAGS = @LIBXML2_LDFLAGS@ LIBXML2_VERSION = @LIBXML2_VERSION@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LDADD = @LUA_LDADD@ LUA_LDFLAGS = @LUA_LDFLAGS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MODSEC_APXS_EXTRA_CFLAGS = @MODSEC_APXS_EXTRA_CFLAGS@ MODSEC_EXTRA_CFLAGS = @MODSEC_EXTRA_CFLAGS@ MSC_BASE_DIR = @MSC_BASE_DIR@ MSC_PKGBASE_DIR = @MSC_PKGBASE_DIR@ MSC_REGRESSION_CONF_DIR = @MSC_REGRESSION_CONF_DIR@ MSC_REGRESSION_DIR = @MSC_REGRESSION_DIR@ MSC_REGRESSION_DOCROOT_DIR = @MSC_REGRESSION_DOCROOT_DIR@ MSC_REGRESSION_LOGS_DIR = @MSC_REGRESSION_LOGS_DIR@ MSC_REGRESSION_SERVERROOT_DIR = @MSC_REGRESSION_SERVERROOT_DIR@ MSC_TEST_DIR = @MSC_TEST_DIR@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCRE_CFLAGS = @PCRE_CFLAGS@ PCRE_CONFIG = @PCRE_CONFIG@ PCRE_CPPFLAGS = @PCRE_CPPFLAGS@ PCRE_LDADD = @PCRE_LDADD@ PCRE_LDFLAGS = @PCRE_LDFLAGS@ PCRE_LD_PATH = @PCRE_LD_PATH@ PCRE_VERSION = @PCRE_VERSION@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSDEEP_CFLAGS = @SSDEEP_CFLAGS@ SSDEEP_LDADD = @SSDEEP_LDADD@ SSDEEP_LDFLAGS = @SSDEEP_LDFLAGS@ STRIP = @STRIP@ TOPLEVEL_SUBDIRS = @TOPLEVEL_SUBDIRS@ VERSION = @VERSION@ YAJL_CFLAGS = @YAJL_CFLAGS@ YAJL_LDADD = @YAJL_LDADD@ YAJL_LDFLAGS = @YAJL_LDFLAGS@ YAJL_LIBS = @YAJL_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ bin_SCRIPTS = mlogc-batch-load.pl mlogc_SOURCES = mlogc.c mlogc_CPPFLAGS = @APR_CPPFLAGS@ \ @PCRE_CPPFLAGS@ \ @CURL_CPPFLAGS@ \ -I$(top_srcdir)/apache2 mlogc_CFLAGS = @APR_CFLAGS@ \ @CURL_CFLAGS@ \ @PCRE_CFLAGS@ mlogc_LDFLAGS = @APR_LDFLAGS@ \ @CURL_LDFLAGS@ \ @PCRE_LDFLAGS@ mlogc_LDADD = @APR_LDADD@ \ @CURL_LDADD@ \ @PCRE_LDADD@ all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign mlogc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign mlogc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mlogc-batch-load.pl: $(top_builddir)/config.status $(srcdir)/mlogc-batch-load.pl.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list mlogc$(EXEEXT): $(mlogc_OBJECTS) $(mlogc_DEPENDENCIES) $(EXTRA_mlogc_DEPENDENCIES) @rm -f mlogc$(EXEEXT) $(AM_V_CCLD)$(mlogc_LINK) $(mlogc_OBJECTS) $(mlogc_LDADD) $(LIBS) install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mlogc-mlogc.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mlogc-mlogc.o: mlogc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mlogc_CPPFLAGS) $(CPPFLAGS) $(mlogc_CFLAGS) $(CFLAGS) -MT mlogc-mlogc.o -MD -MP -MF $(DEPDIR)/mlogc-mlogc.Tpo -c -o mlogc-mlogc.o `test -f 'mlogc.c' || echo '$(srcdir)/'`mlogc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mlogc-mlogc.Tpo $(DEPDIR)/mlogc-mlogc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mlogc.c' object='mlogc-mlogc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mlogc_CPPFLAGS) $(CPPFLAGS) $(mlogc_CFLAGS) $(CFLAGS) -c -o mlogc-mlogc.o `test -f 'mlogc.c' || echo '$(srcdir)/'`mlogc.c mlogc-mlogc.obj: mlogc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mlogc_CPPFLAGS) $(CPPFLAGS) $(mlogc_CFLAGS) $(CFLAGS) -MT mlogc-mlogc.obj -MD -MP -MF $(DEPDIR)/mlogc-mlogc.Tpo -c -o mlogc-mlogc.obj `if test -f 'mlogc.c'; then $(CYGPATH_W) 'mlogc.c'; else $(CYGPATH_W) '$(srcdir)/mlogc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mlogc-mlogc.Tpo $(DEPDIR)/mlogc-mlogc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mlogc.c' object='mlogc-mlogc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(mlogc_CPPFLAGS) $(CPPFLAGS) $(mlogc_CFLAGS) $(CFLAGS) -c -o mlogc-mlogc.obj `if test -f 'mlogc.c'; then $(CYGPATH_W) 'mlogc.c'; else $(CYGPATH_W) '$(srcdir)/mlogc.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(SCRIPTS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-binSCRIPTS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-binSCRIPTS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-binSCRIPTS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: modsecurity-2.9.5/mlogc/mlogc-default.conf0000664000175000017500000000734714147005233021725 0ustar mhsvierulamhsvierula########################################################################## # Required configuration # At a minimum, the items in this section will need to be adjusted to # fit your environment. The remaining options are optional. ########################################################################## # Points to the root of the installation. All relative # paths will be resolved with the help of this path. CollectorRoot "/var/log/mlogc" # ModSecurity Console receiving URI. You can change the host # and the port parts but leave everything else as is. ConsoleURI "https://CONSOLE_IP_ADDRESS:8888/rpc/auditLogReceiver" # Sensor credentials SensorUsername "SENSOR_USERNAME" SensorPassword "SENSOR_PASSWORD" # Base directory where the audit logs are stored. This can be specified # as a path relative to the CollectorRoot, or a full path. LogStorageDir "data" # Transaction log will contain the information on all log collector # activities that happen between checkpoints. The transaction log # is used to recover data in case of a crash (or if Apache kills # the process). TransactionLog "mlogc-transaction.log" # The file where the pending audit log entry data is kept. This file # is updated on every checkpoint. QueuePath "mlogc-queue.log" # The location of the error log. ErrorLog "mlogc-error.log" # The location of the lock file. LockFile "mlogc.lck" # Keep audit log entries after sending? (0=false 1=true) # NOTE: This is required to be set in SecAuditLog mlogc config if you # are going to use a secondary console via SecAuditLog2. KeepEntries 0 ########################################################################## # Optional configuration ########################################################################## # The error log level controls how much detail there # will be in the error log. The levels are as follows: # 0 - NONE # 1 - ERROR # 2 - WARNING # 3 - NOTICE # 4 - DEBUG # 5 - DEBUG2 # ErrorLogLevel 3 # How many concurrent connections to the server # are we allowed to open at the same time? Log collector uses # multiple connections in order to speed up audit log transfer. # This is especially needed when the communication takes place # over a slow link (e.g. not over a LAN). MaxConnections 10 # How many requests a worker will process before recycling itself. # This is to help prevent problems due to any memory leaks that may # exists. If this is set to 0, then no maximum is imposed. The default # is 1000 requests per worker (the number of workers is controlled by the # MaxConnections limit). MaxWorkerRequests 1000 # The time each connection will sit idle before being reused, # in milliseconds. Increase if you don't want ModSecurity Console # to be hit with too many log collector requests. TransactionDelay 50 # The time to wait before initialization on startup in milliseconds. # Increase if mlogc is starting faster then termination when the # sensor is reloaded. StartupDelay 5000 # How often is the pending audit log entry data going to be written # to a file. The default is 15 seconds. CheckpointInterval 15 # If the server fails all threads will back down until the # problem is sorted. The management thread will periodically # launch a thread to test the server. The default is to test # once in 60 seconds. ServerErrorTimeout 60 # The following two parameters are not used yet, but # reserved for future expansion. # KeepAlive 150 # KeepAliveTimeout 300 # When set to '0', mlogc will validate the certificate and the whole # chain, the root certificate most be trusted. If this check fail the # connection will be dropped. To ignore the SSL checks, set InsecureNoCheckCert # to '1' InsecureNoCheckCert 1 modsecurity-2.9.5/mlogc/mlogc.c0000664000175000017500000022513714147005233017577 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #if APR_HAVE_UNISTD_H #include /* for getpid() */ #endif #include #include #include #include #include #include "msc_release.h" static void logc_shutdown(int rc); static void create_new_worker(int lock); static void error_log(int level, void *thread, const char *text, ...) PRINTF_ATTRIBUTE(3,4); /* -- Constants -- */ /* Error log levels. */ #define LOG_ERROR 1 #define LOG_WARNING 2 #define LOG_NOTICE 3 #define LOG_DEBUG 4 #define LOG_DEBUG2 5 /* The management thread will wake up every five seconds. */ #define MANAGER_SLEEP 5000000 #define MANAGER_SUBSLEEP 10000 /* Hack to allow multiple mlogc with single delete */ #define KEEP_ENTRIES_REMOVE_HACK 2600 #define KEEP_ENTRIES_REMOVE_TIME 0l #ifdef TEST_HACK #define TEST_WITH_RAND_SLEEP(n) \ do { \ int sec = rand()/(RAND_MAX/n); \ error_log(LOG_DEBUG2, NULL, "TEST_HACK: Sleeping for %ds", sec); \ apr_sleep(apr_time_from_sec(sec)); \ } while(0) #else #define TEST_WITH_RAND_SLEEP(n) #endif #define CAPTUREVECTORSIZE 60 #define PIPE_BUF_SIZE 65536 #define MEMALLOC_ERROR_MSG "Memory allocation failed!" #define VERSION MODSEC_VERSION #define CMDLINE_OPTS "fvh" #define TXIN 0 #define TXOUT 1 #define STATUSBUF_SIZE 256 #define ISHEXCHAR(X) ( ((X >= '0')&&(X <= '9')) \ || ((X >= 'a')&&(X <= 'f')) \ || ((X >= 'A')&&(X <= 'F')) ) /* -- Regex Patterns -- */ /** * This regular expression is used to parse the entire * log line we receive from Apache. The REQUEST_LINE is * treated as a single parameter to allow for invalid * requests. */ static const char logline_pattern[] = "^(\\S+)" "\\ (\\S+)\\ (\\S+)\\ (\\S+)" "\\ \\[([^:]+):(\\d+:\\d+:\\d+)\\ ([^\\]]+)\\]" "\\ \"(.*)\"" "\\ (\\d+)\\ (\\S+)" "\\ \"(.*)\"\\ \"(.*)\"" "\\ (\\S+)\\ \"(.*)\"" "\\ /?(\\S+)\\ (\\d+)\\ (\\d+)" "\\ (\\S+)" "(.*)$"; /** * This regular expression can be used to parse * a REQUEST_LINE field into method, URI, and * protocol. */ static const char requestline_pattern[] = "(\\S+)\\ (.*?)\\ (\\S+)"; /* -- Structures -- */ typedef struct { unsigned long int id; const char *line; apr_size_t line_size; } entry_t; /* -- Global variables -- */ static pid_t logc_pid = 0; static const char *conffile = NULL; static const char *lockfile = NULL; static int have_read_data = 0; static int checkpoint_interval = 60; static apr_time_t checkpoint_time_last = 0; static const char *collector_root = NULL; static apr_table_t *conf = NULL; static const char *console_uri = NULL; static apr_array_header_t *curl_handles = NULL; static int current_workers = 0; static int management_thread_active = 0; static unsigned long int entry_counter = 1; static const char *error_log_path = NULL; static apr_file_t *error_log_fd = NULL; static int error_log_level = 2; static apr_hash_t *in_progress = NULL; static int keep_alive = 150; /* Not used yet. */ static int keep_alive_timeout = 300; /* Not used yet. */ static int keep_entries = 0; static const char *log_repository = NULL; static void *logline_regex = NULL; static int max_connections = 10; static int max_worker_requests = 1000; static apr_global_mutex_t *gmutex = NULL; static apr_thread_mutex_t *mutex = NULL; static apr_pool_t *pool = NULL; static apr_pool_t *thread_pool = NULL; static apr_pool_t *recv_pool = NULL; static apr_array_header_t *queue = NULL; static const char *queue_path = NULL; static int ssl_validation = 0; static int tlsprotocol = 1; static curl_version_info_data* curlversion = NULL; /* static apr_time_t queue_time = 0; */ static void *requestline_regex = NULL; static int running = 0; static const char *sensor_password = NULL; static const char *sensor_username = NULL; static int server_error = 0; static apr_time_t server_error_last_check_time = 0; static int server_error_timeout = 60; static int startup_delay = 100; static int transaction_delay = 100; static const char *transaction_log_path = NULL; static apr_file_t *transaction_log_fd = NULL; /* -- Commandline opts -- */ static int opt_force = 0; /* -- Code -- */ static char *_log_escape(apr_pool_t *mp, const char *input, apr_size_t input_len) { static const char c2x_table[] = "0123456789abcdef"; unsigned char *d = NULL; char *ret = NULL; unsigned long int i; if (input == NULL) return NULL; ret = apr_palloc(mp, input_len * 4 + 1); if (ret == NULL) return NULL; d = (unsigned char *)ret; i = 0; while(i < input_len) { switch(input[i]) { case '"' : *d++ = '\\'; *d++ = '"'; break; case '\b' : *d++ = '\\'; *d++ = 'b'; break; case '\n' : *d++ = '\\'; *d++ = 'n'; break; case '\r' : *d++ = '\\'; *d++ = 'r'; break; case '\t' : *d++ = '\\'; *d++ = 't'; break; case '\v' : *d++ = '\\'; *d++ = 'v'; break; case '\\' : *d++ = '\\'; *d++ = '\\'; break; default : if ((input[i] <= 0x1f)||(input[i] >= 0x7f)) { *d++ = '\\'; *d++ = 'x'; *d++ = c2x_table[input[i] >> 4]; *d++ = c2x_table[input[i] & 0x0f]; } else { *d++ = input[i]; } break; } i++; } *d = 0; return ret; } /** * Converts a byte given as its hexadecimal representation * into a proper byte. Handles uppercase and lowercase letters * but does not check for overflows. */ static unsigned char x2c(unsigned char *what) { register unsigned char digit; digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A') + 10 : (what[0] - '0')); digit *= 16; digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A') + 10 : (what[1] - '0')); return digit; } /** * URL Decodes a string in-place */ static int urldecode_inplace(unsigned char *input, apr_size_t input_len) { unsigned char *d = (unsigned char *)input; apr_size_t i; if (input == NULL) return 0; i = 0; while (i < input_len) { if (input[i] == '%') { /* Character is a percent sign. */ /* Are there enough bytes available? */ if (i + 2 < input_len) { char c1 = input[i + 1]; char c2 = input[i + 2]; if (ISHEXCHAR(c1) && ISHEXCHAR(c2)) { /* Valid encoding - decode it. */ *d++ = x2c(&input[i + 1]); i += 3; } else { /* Not a valid encoding, skip this % */ *d++ = input[i++]; } } else { /* Not enough bytes available, copy the raw bytes. */ *d++ = input[i++]; } } else { /* Character is not a percent sign. */ if (input[i] == '+') { *d++ = ' '; } else { *d++ = input[i]; } i++; } } *d = '\0'; return 1; } /** * Detect a relative path and merge it with the collector root * path. Leave absolute paths as they are. */ static const char *file_path(const char *path) { char *newpath = NULL; apr_status_t rc; if (path == NULL) return NULL; rc = apr_filepath_merge(&newpath, collector_root, path, APR_FILEPATH_TRUENAME, pool); if ((newpath != NULL) && (rc == APR_SUCCESS || APR_STATUS_IS_EPATHWILD(rc) || APR_STATUS_IS_ENOENT(rc) || APR_STATUS_IS_ENOTDIR(rc))) { return newpath; } else { return NULL; } } /** * Returns the current datetime as a string. */ static char *current_logtime(char *dest, int dlen) { apr_time_exp_t t; apr_size_t len; apr_time_exp_lt(&t, apr_time_now()); apr_strftime(dest, &len, dlen, "%a %b %d %H:%M:%S %Y", &t); return dest; } /** * Logs error to the error log (if available) or * to the stderr. */ static void error_log(int level, void *thread, const char *text, ...) { char msg1[4096] = ""; char msg2[4096] = ""; char datetime[100]; va_list ap; if (level > error_log_level) return; va_start(ap, text); apr_vsnprintf(msg1, sizeof(msg1), text, ap); apr_snprintf(msg2, sizeof(msg2), "[%s] [%d] [%" APR_PID_T_FMT "/%pp] %s\n", current_logtime(datetime, sizeof(datetime)), level, logc_pid, (thread ? thread : 0), msg1); if (error_log_fd != NULL) { apr_size_t nbytes_written; apr_size_t nbytes = strlen(msg2); apr_file_write_full(error_log_fd, msg2, nbytes, &nbytes_written); } else { fprintf(stderr, "%s", msg2); } va_end(ap); } /** * Adds one entry to the internal queue. It will (optionally) start * a new thread to handle it. */ static void add_entry(const char *data, int start_worker) { entry_t *entry = NULL; entry = (entry_t *)malloc(sizeof(entry_t)); entry->id = 0; entry->line = strdup(data); entry->line_size = strlen(entry->line); error_log(LOG_DEBUG, NULL, "Queue locking thread mutex."); if (APR_STATUS_IS_EBUSY(apr_thread_mutex_trylock(mutex))) { error_log(LOG_DEBUG, NULL, "Queue waiting on thread mutex."); apr_thread_mutex_lock(mutex); } /* Assign unique ID to this log entry. */ entry->id = entry_counter++; /* Add the new audit log entry to the queue. */ *(entry_t **)apr_array_push(queue) = entry; /* Create a new worker if we can, but not if there is a * known problem with the server. */ if ( (start_worker != 0) && (current_workers < max_connections)&&(server_error == 0)) { create_new_worker(0); } error_log(LOG_DEBUG, NULL, "Queue unlocking thread mutex."); apr_thread_mutex_unlock(mutex); } /** * Read the queue entries. */ static int read_queue_entries(apr_file_t *fd, apr_time_t *queue_time) { char linebuf[4100]; int line_count = -1; int line_size = 0; apr_status_t rc = 0; char *p = NULL; for(;;) { memset(linebuf, 0, 4100); rc = apr_file_gets(linebuf, 4096, fd); if (rc == APR_EOF) break; if (rc != APR_SUCCESS) { error_log(LOG_ERROR, NULL, "Error reading from the queue file."); logc_shutdown(1); } if (line_count < 0) { /* First line contains the queue time. */ *queue_time = (apr_time_t)apr_atoi64(linebuf); line_count = 0; continue; } p = &linebuf[0]; line_size = strlen(p); /* Remove the \n from the end of the line. */ while(*p != '\0' && line_size > 0) { if (*p == '\n') { *p = '\0'; break; } p++; line_size--; } if (linebuf[0] == '#') { /* Ignore comments. */ continue; } add_entry((const char *)&linebuf, 0); line_count++; } apr_file_close(fd); return line_count; } /** * Initialise the transaction log. This code should be * executed only once at startup. */ static void transaction_log_init(void) { /* ENH: These big enough? */ char new_queue_path[256]; char old_queue_path[256]; apr_file_t *queue_fd = NULL; apr_time_t queue_time; apr_snprintf(new_queue_path, sizeof(new_queue_path), "%s.new", queue_path); apr_snprintf(old_queue_path, sizeof(old_queue_path), "%s.old", queue_path); /* Put a lock in place to ensure exclusivity. */ error_log(LOG_DEBUG, NULL, "Transaction initialization locking global mutex."); if (APR_STATUS_IS_EBUSY(apr_global_mutex_trylock(gmutex))) { error_log(LOG_DEBUG, NULL, "Transaction initialization waiting on global mutex."); apr_global_mutex_lock(gmutex); } error_log(LOG_DEBUG, NULL, "Transaction initialization started."); /* Delete .new file if there is one. */ apr_file_remove(new_queue_path, pool); /* Read in the data from the queue. */ if (apr_file_open(&queue_fd, queue_path, APR_READ | APR_FILE_NOCLEANUP, 0, pool) == APR_SUCCESS) { int line_count = read_queue_entries(queue_fd, &queue_time); apr_file_close(queue_fd); if (line_count > 0) { error_log(LOG_NOTICE, NULL, "Loaded %d entries from the queue file.", line_count); } } /* Try the old queue file. */ else if (apr_file_open(&queue_fd, old_queue_path, APR_READ | APR_FILE_NOCLEANUP, 0, pool) == APR_SUCCESS) { int line_count = read_queue_entries(queue_fd, &queue_time); apr_file_close(queue_fd); error_log(LOG_NOTICE, NULL, "Loaded %d entries from the OLD queue file.", line_count); apr_file_rename(old_queue_path, queue_path, pool); } else { error_log(LOG_NOTICE, NULL, "Queue file not found. New one will be created."); } /* Delete the old queue file. */ apr_file_remove(old_queue_path, pool); checkpoint_time_last = apr_time_now(); /* Start fresh with the transaction log. Do note that * we do not truncate the transaction log on purpose. Apache * will start copies of piped logging binaries during configuration * testing. Truncating would erase the log of a currently running * instance. */ if (apr_file_open(&transaction_log_fd, transaction_log_path, APR_WRITE | APR_CREATE | APR_APPEND | APR_XTHREAD, APR_OS_DEFAULT, pool) != APR_SUCCESS) { error_log(LOG_ERROR, NULL, "Failed to open the transaction log: %s\n", transaction_log_path); error_log(LOG_DEBUG, NULL, "Transaction initialization unlocking global mutex."); apr_global_mutex_unlock(gmutex); logc_shutdown(1); } error_log(LOG_DEBUG, NULL, "Transaction initialization completed."); /* Unlock */ error_log(LOG_DEBUG, NULL, "Transaction initialization unlocking global mutex."); apr_global_mutex_unlock(gmutex); } /** * Log entry event (incoming or outgoing) to the transaction log. */ static void transaction_log(int direction, const char *entry) { apr_size_t nbytes, nbytes_written; char msg[8196] = ""; apr_snprintf(msg, sizeof(msg), "%u %s: %s\n", (unsigned int)apr_time_sec(apr_time_now()), (direction == TXIN ? "IN" : "OUT"), entry); nbytes = strlen(msg); apr_file_write_full(transaction_log_fd, msg, nbytes, &nbytes_written); } /** * Executes a checkpoint, which causes the current queue to be * written to a file and the transaction log to be truncated. */ static void transaction_checkpoint(void) { /* ENH: These big enough? */ char new_queue_path[256]; char old_queue_path[256]; apr_file_t *queue_fd = NULL; apr_hash_index_t *hi = NULL; char msg[256]; int i; apr_pool_t *cpool; apr_snprintf(new_queue_path, sizeof(new_queue_path), "%s.new", queue_path); apr_snprintf(old_queue_path, sizeof(old_queue_path), "%s.old", queue_path); apr_snprintf(msg, sizeof(msg), "%u\n", (unsigned int)apr_time_sec(apr_time_now())); if (! have_read_data) { error_log(LOG_DEBUG, NULL, "Checkpoint not required."); return; } /* Put a lock in place to ensure exclusivity. */ error_log(LOG_DEBUG, NULL, "Checkpoint locking global mutex."); if (APR_STATUS_IS_EBUSY(apr_global_mutex_trylock(gmutex))) { error_log(LOG_DEBUG, NULL, "Checkpoint waiting on global mutex."); apr_global_mutex_lock(gmutex); } error_log(LOG_DEBUG, NULL, "Checkpoint started."); apr_pool_create(&cpool, NULL); /* Dump active entries into a new queue file. */ if (apr_file_open(&queue_fd, new_queue_path, APR_WRITE | APR_CREATE | APR_EXCL | APR_TRUNCATE | APR_FILE_NOCLEANUP, APR_OS_DEFAULT, cpool) != APR_SUCCESS) { error_log(LOG_ERROR, NULL, "Failed to create file: %s", new_queue_path); error_log(LOG_DEBUG, NULL, "Checkpoint unlocking global mutex."); apr_pool_destroy(cpool); apr_global_mutex_unlock(gmutex); return; } /* Write the time first. */ apr_file_write_full(queue_fd, msg, strlen(msg), NULL); /* Dump the entries sitting in the queue first. */ for (i = 0; i < queue->nelts; i++) { entry_t *entry = ((entry_t **)queue->elts)[i]; apr_file_write_full(queue_fd, entry->line, entry->line_size, NULL); apr_file_write_full(queue_fd, &"\n", 1, NULL); } error_log(LOG_DEBUG2, NULL, "Checkpoint wrote %d queued entries to new queue.", i); /* Then dump the ones that are currently being processed. */ i = 0; for (hi = apr_hash_first(NULL, in_progress); hi != NULL; hi = apr_hash_next(hi))\ { void *e; entry_t *entry = NULL; i++; apr_hash_this(hi, NULL, NULL, &e); entry = e; /* quiet type-punned warning */ apr_file_write_full(queue_fd, entry->line, entry->line_size, NULL); apr_file_write_full(queue_fd, &"\n", 1, NULL); } error_log(LOG_DEBUG2, NULL, "Checkpoint wrote %d additional entries to new queue.", i); apr_file_close(queue_fd); /* Switch the files and truncate the transaction log file. */ apr_file_remove(old_queue_path, cpool); apr_file_rename(queue_path, old_queue_path, cpool); apr_file_rename(new_queue_path, queue_path, cpool); apr_file_remove(old_queue_path, cpool); apr_file_trunc(transaction_log_fd, 0); error_log(LOG_DEBUG, NULL, "Checkpoint completed."); apr_pool_destroy(cpool); /* Unlock and exit. */ error_log(LOG_DEBUG, NULL, "Checkpoint unlocking global mutex."); apr_global_mutex_unlock(gmutex); } /** * Parse one confguration line and add it to the * configuration table. */ static void parse_configuration_line(const char *line, int line_count) { char *start = NULL, *command = NULL; char *p = NULL; /* Remove the trailing newline character. */ p = (char *)line; while(*p != '\0') p++; if ((p > start)&&(*(p - 1) == '\n')) *(p - 1) = '\0'; p = (char *)line; /* Ignore whitespace at the beginning of the line. */ while(apr_isspace(*p)) p++; /* Ignore empty lines and comments. */ if ((*p == '\0')||(*p == '#')) return; start = p; while(!apr_isspace(*p)&&(*p != '\0')) p++; command = apr_pstrmemdup(pool, start, p - start); while(apr_isspace(*p)) p++; /* Remove whitespace at the end. */ start = p; while(*p != '\0') p++; if (p > start) { p--; while(apr_isspace(*p)) { *p-- = '\0'; } } /* Remove quotes, but only if we have matching */ if ((*start == '"') && (p > start) && (*p == '"')) { start++; *p-- = '\0'; } /* Take the last directive */ /* ENH: Error on dup directives? */ apr_table_set(conf, command, start); } /** * Reads configuration from a file. */ static void read_configuration(void) { char linebuf[4096]; apr_status_t rc; apr_file_t *fd; int line_count; conf = apr_table_make(pool, 32); if (conf == NULL) { error_log(LOG_ERROR, NULL, MEMALLOC_ERROR_MSG); logc_shutdown(1); } rc = apr_file_open(&fd, conffile, APR_READ | APR_FILE_NOCLEANUP, 0, pool); if (rc != APR_SUCCESS) { error_log(LOG_ERROR, NULL, "Unable to open configuration file: %s", conffile); logc_shutdown(1); } line_count = 0; for(;;) { rc = apr_file_gets(linebuf, 4096, fd); if (rc == APR_EOF) return; if (rc != APR_SUCCESS) { error_log(LOG_ERROR, NULL, "Error reading from the configuration file."); logc_shutdown(1); } line_count++; parse_configuration_line(linebuf, line_count); } apr_file_close(fd); } /** * Initialize the configuration. */ static void init_configuration(void) { char errstr[1024]; apr_status_t rc = 0; const char *s = NULL; /* Other values may be based off the collector root. */ s = apr_table_get(conf, "CollectorRoot"); if (s != NULL) { collector_root = s; } /* Error Log */ s = apr_table_get(conf, "ErrorLog"); if (s != NULL) { error_log_path = file_path(s); } s = apr_table_get(conf, "ErrorLogLevel"); if (s != NULL) { error_log_level = atoi(s); } if ((rc = apr_file_open(&error_log_fd, error_log_path, APR_WRITE | APR_CREATE | APR_APPEND, APR_OS_DEFAULT, pool)) != APR_SUCCESS) { error_log(LOG_ERROR, NULL, "Failed to open the error log %s: %s\n", error_log_path, apr_strerror(rc, errstr, 1024)); logc_shutdown(1); } error_log(LOG_NOTICE, NULL, "Configuring ModSecurity Audit Log Collector %s.", VERSION); /* Startup Delay */ s = apr_table_get(conf, "StartupDelay"); if (s != NULL) { startup_delay = atoi(s); } /* TLS Protocol - TLSv1(0) TLSv1.1(1) TLSv1.2(2) (SSLv3 not supported) */ s = apr_table_get(conf, "TLSProtocol"); if (s != NULL) { int num = atoi(s); switch (num) { case 0: tlsprotocol = 0; break; case 1: tlsprotocol = 1; break; case 2: tlsprotocol = 2; break; default: tlsprotocol = 2; /* Default is TLSv1.2 */ } } curlversion = curl_version_info(CURLVERSION_NOW); if ( startup_delay > 0 ) { error_log(LOG_NOTICE, NULL, "Delaying execution for %dms.", startup_delay); apr_sleep(startup_delay * 1000); error_log(LOG_DEBUG, NULL, "Continuing execution after %dms delay.", startup_delay); } /* Remaining Configuration */ error_log(LOG_DEBUG2, NULL, "CollectorRoot=%s", collector_root); error_log(LOG_DEBUG2, NULL, "ErrorLog=%s", error_log_path); error_log(LOG_DEBUG2, NULL, "ErrorLogLevel=%d", error_log_level); error_log(LOG_DEBUG2, NULL, "StartupDelay=%d", startup_delay); error_log(LOG_DEBUG2, NULL, "TLSProtocol=%d", tlsprotocol); error_log(LOG_DEBUG2, NULL, "cURL version=%s", curlversion->version); s = apr_table_get(conf, "CheckpointInterval"); if (s != NULL) { checkpoint_interval = atoi(s); error_log(LOG_DEBUG2, NULL, "CheckpointInterval=%d", checkpoint_interval); } s = apr_table_get(conf, "InsecureNoCheckCert"); if (s != NULL) { int num = atoi(s); if (num) { ssl_validation = 0; } else { ssl_validation = 1; } error_log(LOG_DEBUG2, NULL, "InsecureNoCheckCert=%d", num); } s = apr_table_get(conf, "QueuePath"); if (s != NULL) { queue_path = file_path(s); error_log(LOG_DEBUG2, NULL, "QueuePath=%s", queue_path); } else { error_log(LOG_ERROR, NULL, "QueuePath not defined in the configuration file."); logc_shutdown(1); } s = apr_table_get(conf, "LockFile"); if (s != NULL) { lockfile = file_path(s); error_log(LOG_DEBUG2, NULL, "LockFile=%s", lockfile); } s = apr_table_get(conf, "ServerErrorTimeout"); if (s != NULL) { server_error_timeout = atoi(s); error_log(LOG_DEBUG2, NULL, "ServerErrorTimeout=%d", server_error_timeout); } s = apr_table_get(conf, "TransactionDelay"); if (s != NULL) { transaction_delay = atoi(s); error_log(LOG_DEBUG2, NULL, "TransactionDelay=%d", transaction_delay); } s = apr_table_get(conf, "TransactionLog"); if (s != NULL) { transaction_log_path = file_path(s); error_log(LOG_DEBUG2, NULL, "TransactionLog=%s", transaction_log_path); } s = apr_table_get(conf, "MaxConnections"); if (s != NULL) { int v = atoi(s); if (v >= 0) max_connections = v; error_log(LOG_DEBUG2, NULL, "MaxConnections=%d", max_connections); } s = apr_table_get(conf, "MaxWorkerRequests"); if (s != NULL) { int v = atoi(s); if (v >= 0) max_worker_requests = v; error_log(LOG_DEBUG2, NULL, "MaxWorkerRequests=%d", max_worker_requests); } s = apr_table_get(conf, "KeepAlive"); if (s != NULL) { int v = atoi(s); if (v >= 0) keep_alive = v; error_log(LOG_DEBUG2, NULL, "KeepAlive=%d", keep_alive); } s = apr_table_get(conf, "KeepAliveTimeout"); if (s != NULL) { int v = atoi(s); if (v >= 0) keep_alive_timeout = v; error_log(LOG_DEBUG2, NULL, "KeepAliveTimeout=%d", keep_alive_timeout); } s = apr_table_get(conf, "LogStorageDir"); if (s != NULL) { log_repository = file_path(s); error_log(LOG_DEBUG2, NULL, "LogStorageDir=%s", log_repository); } else { error_log(LOG_ERROR, NULL, "Missing mandatory parameter LogStorageDir.\n"); logc_shutdown(1); } s = apr_table_get(conf, "ConsoleURI"); if (s != NULL) { console_uri = s; error_log(LOG_DEBUG2, NULL, "ConsoleURI=%s", console_uri); } else { error_log(LOG_ERROR, NULL, "Missing mandatory parameter ConsoleURI.\n"); logc_shutdown(1); } s = apr_table_get(conf, "SensorUsername"); if (s != NULL) { sensor_username = s; error_log(LOG_DEBUG2, NULL, "SensorUsername=%s", sensor_username); } else { error_log(LOG_ERROR, NULL, "Missing mandatory parameter SensorUsername.\n"); logc_shutdown(1); } s = apr_table_get(conf, "SensorPassword"); if (s != NULL) { sensor_password = s; error_log(LOG_DEBUG2, NULL, "SensorPassword=%s", sensor_password); } else { error_log(LOG_ERROR, NULL, "Missing mandatory parameter SensorPassword.\n"); logc_shutdown(1); } s = apr_table_get(conf, "KeepEntries"); if (s != NULL) { keep_entries = atoi(s); } else { keep_entries = 0; } error_log(LOG_DEBUG2, NULL, "KeepEntries=%d", keep_entries); } /** * Clean-up resources before process shutdown. */ static void logc_cleanup(void) { curl_global_cleanup(); } /** * Shutdown the logger. */ static void logc_shutdown(int rc) { /* Tell the threads to shut down. */ running = 0; error_log(LOG_DEBUG, NULL, "Shutting down"); /* Wait for the management thread to stop */ /* ENH: Need a fixed timeout if this never happens */ while(management_thread_active != 0) { apr_sleep(10 * 1000); } if (rc == 0) { error_log(LOG_NOTICE, NULL, "ModSecurity Audit Log Collector %s terminating normally.", VERSION); } else { error_log(LOG_NOTICE, NULL, "ModSecurity Audit Log Collector %s " "terminating with error %d", VERSION, rc); } if (error_log_fd != NULL) { apr_file_flush(error_log_fd); } exit(rc); } /** * Handle signals. */ static int handle_signals(int signum) { switch (signum) { case SIGINT: error_log(LOG_NOTICE, NULL, "Caught SIGINT, shutting down."); logc_shutdown(0); case SIGTERM: error_log(LOG_NOTICE, NULL, "Caught SIGTERM, shutting down."); logc_shutdown(0); #ifndef WIN32 case SIGHUP: error_log(LOG_NOTICE, NULL, "Caught SIGHUP, ignored."); /* ENH: reload config? */ return 0; case SIGALRM: error_log(LOG_DEBUG, NULL, "Caught SIGALRM, ignored."); return 0; case SIGTSTP: error_log(LOG_DEBUG, NULL, "Caught SIGTSTP, ignored."); return 0; #endif /* WIN32 */ } #ifndef WIN32 error_log(LOG_NOTICE, NULL, "Caught unexpected signal %d: %s", signum, apr_signal_description_get(signum)); #else error_log(LOG_NOTICE, NULL, "Caught unexpected signal %d", signum); #endif /* WIN32 */ logc_shutdown(1); return 0; /* should never reach */ } #ifdef WIN32 /** * This function is invoked by Curl to read the source file on Windows */ static size_t curl_readfunction(void *ptr, size_t size, size_t nmemb, void *stream) { return fread(ptr, size, nmemb, (FILE *)stream); } #endif /** * This function is invoked by Curl to read the response * body. Since we don't care about the response body the function * pretends it is retrieving data where it isn't. */ static size_t curl_writefunction(void *ptr, size_t size, size_t nmemb, void *stream) { unsigned char *data = (unsigned char *)ptr; unsigned char *status = (unsigned char *)stream; /* Grab the status line text from the first line of output */ if ((status[0] == 0) && (status[1] == 1)) { apr_size_t i, j; int ismsg = 0; status[1] = 0; /* reset hidden init flag */ for (i = 0, j = 0; i < STATUSBUF_SIZE; i++) { /* We found a line ending so we are done */ if ( data[i] == '\r' ) { break; } /* Skip to after the first space (where msg is) */ if (ismsg < 3) { if ((ismsg == 1) && !isspace(data[i])) { ismsg++; } else if (isspace(data[i])) { ismsg++; } continue; } /* Copy data (msg) from data to status */ status[j++] = data[i]; } status[j] = '\0'; urldecode_inplace(status, j); } /* do nothing */ return (size * nmemb); } /** * This function is invoked by Curl whenever it has something * to say. We forward its messages to the error log at level * DEBUG or DEBUG2 depending on the verbosity. */ static int curl_debugfunction(CURL *curl, curl_infotype infotype, char *data, size_t datalen, void *ourdata) { apr_size_t i, effectivelen; apr_thread_t *thread = (apr_thread_t *)ourdata; if (error_log_level < LOG_DEBUG) return 0; effectivelen = datalen; for(i = 0; i < datalen; i++) { if ((data[i] == 0x0a)||(data[i] == 0x0d)) { effectivelen = i; break; } } switch (infotype) { case CURLINFO_TEXT: /* More verbose data starts with an indent */ if (apr_isspace(data[0])) { char *dataptr = data + 1; /* Skip initial whitespace (indent) */ while ( ((size_t)(dataptr - data) > datalen) && apr_isspace(*dataptr)) dataptr++; dataptr++; error_log(LOG_DEBUG2, thread, "CURL: %s", _log_escape(apr_thread_pool_get(thread), dataptr, effectivelen - (dataptr - data))); } else { error_log(LOG_DEBUG, thread, "CURL: %s", _log_escape(apr_thread_pool_get(thread), data, effectivelen)); } break; case CURLINFO_HEADER_IN: error_log(LOG_DEBUG, thread, "CURL: HEADER_IN %s", _log_escape(apr_thread_pool_get(thread), data, effectivelen)); break; case CURLINFO_HEADER_OUT: error_log(LOG_DEBUG, thread, "CURL: HEADER_OUT %s", _log_escape(apr_thread_pool_get(thread), data, effectivelen)); break; case CURLINFO_DATA_IN: error_log(LOG_DEBUG2, thread, "CURL: DATA_IN %s", _log_escape(apr_thread_pool_get(thread), data, effectivelen)); break; case CURLINFO_DATA_OUT: error_log(LOG_DEBUG2, thread, "CURL: DATA_OUT %s", _log_escape(apr_thread_pool_get(thread), data, effectivelen)); break; default: /* Ignore anything else */ break; } return 0; } /** * Initialise the necessary resources and structures. */ static void logc_init(void) { char errstr[1024]; apr_status_t rc = 0; const char *errptr = NULL; int i, erroffset; /* cURL major, minor and patch version */ short cmaj, cmin, cpat = 0; queue = apr_array_make(pool, 64, sizeof(entry_t *)); if (queue == NULL) { error_log(LOG_ERROR, NULL, MEMALLOC_ERROR_MSG); logc_shutdown(1); } in_progress = apr_hash_make(pool); if (in_progress == NULL) { error_log(LOG_ERROR, NULL, MEMALLOC_ERROR_MSG); logc_shutdown(1); } if ((rc = apr_global_mutex_create(&gmutex, lockfile, APR_LOCK_DEFAULT, pool)) != APR_SUCCESS) { error_log(LOG_ERROR, NULL, "Failed to create global mutex: %s", apr_strerror(rc, errstr, 1024)); logc_shutdown(1); } if ((rc = apr_thread_mutex_create(&mutex, APR_THREAD_MUTEX_UNNESTED, pool)) != APR_SUCCESS) { error_log(LOG_ERROR, NULL, "Failed to create thread mutex: %s", apr_strerror(rc, errstr, 1024)); logc_shutdown(1); } entry_counter = 1; curl_handles = apr_array_make(pool, max_connections, sizeof(CURL *)); if (curl_handles == NULL) { error_log(LOG_ERROR, NULL, MEMALLOC_ERROR_MSG); logc_shutdown(1); } /* Initialise a number of Curl handles. */ for(i = 0; i < max_connections; i++) { CURL *curl = NULL; /* Create cURL handle. */ curl = curl_easy_init(); /* Pre-configure the handle. */ curl_easy_setopt(curl, CURLOPT_UPLOAD, TRUE); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *)NULL); curl_easy_setopt(curl, CURLOPT_URL, console_uri); curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); if (ssl_validation) { curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1); } else { curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0); } /* Seems like CURL_SSLVERSION_TLSv1_2 is not supported on libcurl * < v7.34.0 * * version_num is a 24 bit number created like this: * <8 bits major number> | <8 bits minor number> | <8 bits patch number>. */ switch (tlsprotocol) { case 0: curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_0); break; case 1: curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_1); break; case 2: curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); break; default: curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); break; } cmaj = curlversion->version_num >> 16; cmin = (curlversion->version_num & 0x00ff00) >> 8; cpat = (curlversion->version_num & 0x0000ff); /* If cURL version < v7.34.0, use TLS v1.x */ if (cmaj <= 7 && cmin < 34) { curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); } curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 15); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, TRUE); curl_easy_setopt(curl, CURLOPT_HEADER, TRUE); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_writefunction); *(CURL **)apr_array_push(curl_handles) = curl; } if (cmaj <= 7 && cmin < 34) { error_log(LOG_DEBUG2, NULL, "TLSv1.2 is unsupported in cURL %d.%d.%d", cmaj, cmin, cpat); } logline_regex = pcre_compile(logline_pattern, PCRE_CASELESS, &errptr, &erroffset, NULL); if (logline_regex == NULL) { error_log(LOG_ERROR, NULL, "Failed to compile pattern: %s\n", logline_pattern); logc_shutdown(1); } requestline_regex = pcre_compile(requestline_pattern, PCRE_CASELESS, &errptr, &erroffset, NULL); if (requestline_regex == NULL) { error_log(LOG_ERROR, NULL, "Failed to compile pattern: %s\n", requestline_pattern); logc_shutdown(1); } } /** * HACK: To allow two mlogcs running against a single dataset we use the * mtime as a flag for deletion. * * 1) Check file date. * 2) If it is KEEP_ENTRIES_REMOVE_TIME, then remove the file. * 3) Otherwise set the date and let the other mlogc remove it. */ static void keep_entries_hack(apr_pool_t *mp, apr_thread_t *thread, const char *fn) { apr_file_t *f = NULL; apr_finfo_t finfo; char errstr[1024]; apr_status_t rc; /* Opening for write as required for exclusive lock */ if ((rc = apr_file_open(&f, fn, APR_READ|APR_WRITE|APR_APPEND, APR_OS_DEFAULT, mp)) != APR_SUCCESS) { error_log(LOG_ERROR, thread, "Could not open \"%s\": %s", fn, apr_strerror(rc, errstr, 1024)); return; } if ((rc = apr_file_lock(f, APR_FLOCK_EXCLUSIVE|APR_FLOCK_NONBLOCK)) != APR_SUCCESS) { error_log(LOG_DEBUG2, thread, "Waiting for lock on \"%s\": %s", fn, apr_strerror(rc, errstr, 1024)); if ((rc = apr_file_lock(f, APR_FLOCK_EXCLUSIVE)) != APR_SUCCESS) { error_log(LOG_ERROR, thread, "Could not lock \"%s\": %s", fn, apr_strerror(rc, errstr, 1024)); apr_file_close(f); return; } } error_log(LOG_DEBUG2, thread, "Locked: %s", fn); /* For testing only */ TEST_WITH_RAND_SLEEP(2); if ((rc = apr_stat(&finfo, fn, APR_FINFO_MIN, mp)) != APR_SUCCESS) { error_log(LOG_ERROR, thread, "Could not stat \"%s\": %s", fn, apr_strerror(rc, errstr, 1024)); error_log(LOG_DEBUG2, thread, "Unlocked: %s", fn); apr_file_close(f); return; } if (error_log_level >= LOG_DEBUG) { error_log(LOG_DEBUG, thread, "STAT \"%s\" {" "uid=%d; gid=%d; size=%" APR_OFF_T_FMT "; " "csize=%" APR_OFF_T_FMT "; atime=%" APR_TIME_T_FMT "; " "ctime=%" APR_TIME_T_FMT "; mtime=%" APR_TIME_T_FMT "}", fn, finfo.user, finfo.group, finfo.size, finfo.csize, finfo.atime, finfo.ctime, finfo.mtime); } if (finfo.mtime != KEEP_ENTRIES_REMOVE_TIME) { error_log(LOG_DEBUG2, thread, "Set mtime: %s", fn); if ((rc = apr_file_mtime_set(fn, (apr_time_t)KEEP_ENTRIES_REMOVE_TIME, mp)) != APR_SUCCESS) { error_log(LOG_ERROR, thread, "Could not set mtime on \"%s\": %s", fn, apr_strerror(rc, errstr, 1024)); } error_log(LOG_DEBUG2, thread, "Unlocked: %s", fn); apr_file_close(f); return; } error_log(LOG_DEBUG, thread, "Removing: %s", fn); error_log(LOG_DEBUG2, thread, "Unlocked: %s", fn); apr_file_close(f); apr_file_remove(fn, mp); } /** * Worker thread. Works in a loop, fetching jobs from the queue, * until the queue is empty or it is otherwise told to quit. */ static void * APR_THREAD_FUNC thread_worker(apr_thread_t *thread, void *data) { unsigned int loop_count = 0; CURL *curl = (CURL *)data; entry_t **entryptr = NULL; entry_t *entry = NULL; apr_status_t rc; apr_finfo_t finfo; int capturevector[CAPTUREVECTORSIZE]; int take_new = 1; apr_pool_t *tpool; struct curl_slist *headerlist = NULL; char curl_error_buffer[CURL_ERROR_SIZE] = ""; int num_requests = 0; /* There is no need to do the sleep if this was an invalid entry * as the sleep is just to protect flooding the console server * with rapid requests. With an invalid entry we never hit the * server, so we should not delay processing the next event. */ int nodelay = 0; error_log(LOG_DEBUG, thread, "Worker thread starting."); /* Each worker uses its own pool to manage memory. To avoid * memory leaks the pool is cleared after each processed * entry. */ apr_pool_create(&tpool, thread_pool); /* Process jobs in a queue until there are no more jobs to process. */ for(;;) { nodelay = 0; /* Do we need to shut down? */ if (running == 0) { error_log(LOG_DEBUG, thread, "We were told to shut down."); goto THREAD_SHUTDOWN; } /* Is there a problem with the server? We need * to shut down if there is. Except that we don't * want to shut down if we were launched to investigate * if the server came back online (loop_count will be * zero in that case). */ if ((server_error == 1)&&(loop_count != 0)) { error_log(LOG_DEBUG, thread, "Shutting down due to server error."); goto THREAD_SHUTDOWN; } loop_count++; /* Get a new entry, but only if we need one. */ if (take_new) { error_log(LOG_DEBUG, thread, "Worker fetch locking thread mutex."); if (APR_STATUS_IS_EBUSY(apr_thread_mutex_trylock(mutex))) { error_log(LOG_DEBUG, thread, "Worker fetch waiting on thread mutex."); apr_thread_mutex_lock(mutex); } error_log(LOG_DEBUG, thread, "Worker fetch started."); /* Deal with the previous entry. */ if (entry != NULL) { error_log(LOG_DEBUG, thread, "Removing previous entry from storage."); transaction_log(TXOUT, entry->line); /* Remove previous entry from storage. */ apr_hash_set(in_progress, &entry->id, sizeof(entry->id), NULL); /* Release the memory it used to occupy. */ free((void *)entry->line); free(entry); entry = NULL; } error_log(LOG_DEBUG, thread, "Getting one entry from the queue."); /* Get one entry. */ entryptr = (entry_t **)apr_array_pop(queue); if (entryptr == NULL) { error_log(LOG_DEBUG, thread, "Worker fetch unlocking thread mutex."); apr_thread_mutex_unlock(mutex); error_log(LOG_DEBUG, thread, "No more work for this thread, exiting."); goto THREAD_SHUTDOWN; } entry = *entryptr; apr_hash_set(in_progress, &entry->id, sizeof(entry->id), entry); error_log(LOG_DEBUG, thread, "Worker fetch completed."); error_log(LOG_DEBUG, thread, "Worker fetch unlocking thread mutex."); apr_thread_mutex_unlock(mutex); } /* Send one entry. */ error_log(LOG_DEBUG, thread, "Processing entry."); take_new = 0; /* Keep track of requests processed if we need to */ if (max_worker_requests > 0) { num_requests++; } rc = pcre_exec(logline_regex, NULL, entry->line, entry->line_size, 0, 0, capturevector, CAPTUREVECTORSIZE); if (rc == PCRE_ERROR_NOMATCH) { /* No match. */ error_log(LOG_WARNING, thread, "Invalid entry (failed to match regex): %s", _log_escape(tpool, entry->line, entry->line_size)); take_new = 1; nodelay = 1; } else if (rc < 0) { /* Error condition. */ error_log(LOG_WARNING, thread, "Invalid entry (PCRE error %d): %s", rc, _log_escape(tpool, entry->line, entry->line_size)); take_new = 1; nodelay = 1; } else { /* We have a match. */ char *uniqueid = NULL; char *auditlogentry = NULL; char *hash = NULL; char *summary = NULL; char *credentials = NULL; error_log(LOG_DEBUG, thread, "Regular expression matched."); /* For testing only */ TEST_WITH_RAND_SLEEP(2); uniqueid = apr_psprintf(tpool, "%.*s", (capturevector[2*13+1] - capturevector[2*13]), (entry->line + capturevector[2*13])); auditlogentry = apr_psprintf(tpool, "%s/%.*s", log_repository, (capturevector[2*15+1] - capturevector[2*15]), (entry->line + capturevector[2*15])); hash = apr_psprintf(tpool, "X-Content-Hash: %.*s", (capturevector[2*18+1] - capturevector[2*15]), (entry->line + capturevector[2*18])); summary = apr_psprintf(tpool, "X-ForensicLog-Summary: %s", entry->line); credentials = apr_psprintf(tpool, "%s:%s", sensor_username, sensor_password); rc = apr_stat(&finfo, auditlogentry, APR_FINFO_SIZE, tpool); if (rc == APR_SUCCESS) { FILE *hd_src; char response_buf[STATUSBUF_SIZE]; CURLcode res; if (error_log_level >= LOG_DEBUG) { error_log(LOG_DEBUG, thread, "STAT \"%s\" {" "uid=%d; gid=%d; size=%" APR_OFF_T_FMT "; " "csize=%" APR_OFF_T_FMT "; " "atime=%" APR_TIME_T_FMT "; " "ctime=%" APR_TIME_T_FMT "; " "mtime=%" APR_TIME_T_FMT "}", auditlogentry, finfo.user, finfo.group, finfo.size, finfo.csize, finfo.atime, finfo.ctime, finfo.mtime); } /* Initialize the respone buffer with a hidden value */ response_buf[0] = 0; response_buf[1] = 1; if (finfo.size == 0) { error_log(LOG_WARNING, thread, "File found (%" APR_OFF_T_FMT " bytes), skipping.", finfo.size); take_new = 1; nodelay = 1; goto THREAD_CLEANUP; } else { error_log(LOG_DEBUG, thread, "File found (%" APR_OFF_T_FMT " bytes), activating cURL.", finfo.size); } curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, curl_debugfunction); curl_easy_setopt(curl, CURLOPT_DEBUGDATA, thread); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_error_buffer); curl_easy_setopt(curl, CURLOPT_USERPWD, credentials); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (char *)response_buf); headerlist = curl_slist_append(headerlist, "Expect:"); headerlist = curl_slist_append(headerlist, hash); headerlist = curl_slist_append(headerlist, summary); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist); hd_src = fopen(auditlogentry, "rb"); if (hd_src == NULL) { error_log(LOG_WARNING, thread, "Invalid entry (failed to open file for " "reading): %s", auditlogentry); take_new = 1; nodelay = 1; goto THREAD_CLEANUP; } curl_easy_setopt(curl, CURLOPT_READDATA, hd_src); curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, finfo.size); #ifdef WIN32 /* Mandatory on win32 */ curl_easy_setopt(curl, CURLOPT_READFUNCTION, curl_readfunction); #endif res = curl_easy_perform(curl); fclose(hd_src); if (res == 0) { long response_code = 0; res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code); error_log(LOG_DEBUG, thread, "Request returned with status \"%ld %s\": %s", response_code, response_buf, uniqueid); if (response_code == 0) { /* Assume problem with connection */ error_log(LOG_WARNING, thread, "Flagging server as errored after failure " "to retrieve response code for entry %s " "(cURL code %d): Possible SSL negotiation " "error", uniqueid, res); apr_sleep(1000 * 1000); take_new = 0; server_error = 1; server_error_last_check_time = apr_time_now(); } else if (res != 0) { error_log(LOG_WARNING, thread, "Flagging server as errored after failure " "to retrieve response code for entry %s " "(cURL code %d): %s", uniqueid, res, curl_error_buffer); apr_sleep(1000 * 1000); take_new = 0; server_error = 1; server_error_last_check_time = apr_time_now(); } else { if (response_code == 200) { double total_time, upload_size; if (server_error == 1) { error_log(LOG_NOTICE, thread, "Clearing the server error flag " "after successful entry " "submission: %s", uniqueid); } server_error = 0; server_error_last_check_time = 0; curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &total_time); curl_easy_getinfo(curl, CURLINFO_SIZE_UPLOAD, &upload_size); if (!keep_entries) { error_log(LOG_DEBUG, thread, "Removing: %s", auditlogentry); apr_file_remove(auditlogentry, tpool); } else if (keep_entries == KEEP_ENTRIES_REMOVE_HACK) { keep_entries_hack(tpool, thread, auditlogentry); } error_log(LOG_NOTICE, thread, "Entry completed (%.3f seconds, %.0f " "bytes): %s", total_time, upload_size, uniqueid); take_new = 1; } else if (response_code == 409) { /* Assume problem with audit log entry. */ error_log(LOG_WARNING, thread, "Failed to submit entry with " "\"409 %s\": %s", response_buf, uniqueid); take_new = 1; } else { /* Assume problem with server. */ error_log(LOG_WARNING, thread, "Flagging server as errored after " "failure to submit entry %s with " "HTTP response code %ld: %s", uniqueid, response_code, response_buf); server_error = 1; server_error_last_check_time = apr_time_now(); take_new = 0; } } } else { /* Something isn't right. */ error_log(LOG_WARNING, thread, "Flagging server as errored after " "failure to submit entry %s " "(cURL code %d): %s", uniqueid, res, curl_error_buffer); server_error = 1; server_error_last_check_time = apr_time_now(); take_new = 0; } } else { error_log(LOG_WARNING, thread, "Invalid entry (file not found %d): %s", rc, auditlogentry); take_new = 1; nodelay = 1; } /* If we are tracking num_requests, then shutdown if we are * over our threshold. */ if (num_requests && (num_requests >= max_worker_requests)) { error_log(LOG_NOTICE, thread, "Reached max requests (%d) for this worker, exiting.", max_worker_requests); goto THREAD_SHUTDOWN; } } THREAD_CLEANUP: /* Sleep if we sent data to the server so we do not flood */ /* ENH: Need to sleep for 1ms in a loop checking for shutdown */ if ((nodelay == 0) && (transaction_delay > 0)) { error_log(LOG_DEBUG, thread, "Sleeping for %d msec.", transaction_delay); apr_sleep(transaction_delay * 1000); } if (headerlist != NULL) { curl_slist_free_all(headerlist); headerlist = NULL; } apr_pool_clear(tpool); error_log(LOG_DEBUG, thread, "Worker processing completed."); } THREAD_SHUTDOWN: error_log(LOG_DEBUG, thread, "Worker shutdown locking thread mutex."); if (APR_STATUS_IS_EBUSY(apr_thread_mutex_trylock(mutex))) { error_log(LOG_DEBUG, thread, "Worker shutdown waiting on thread mutex."); apr_thread_mutex_lock(mutex); } /* Deal with the previous entry, if any. */ if (entry != NULL) { apr_hash_set(in_progress, &entry->id, sizeof(entry->id), NULL); if (take_new == 0) { /* Not done. */ *(entry_t **)apr_array_push(queue) = entry; } else { transaction_log(TXOUT, entry->line); free((void *)entry->line); free(entry); } entry = NULL; } /* Return curl handle to the pool for reuse. */ *(CURL **)apr_array_push(curl_handles) = curl; /* No more work, exit. */ current_workers--; error_log(LOG_DEBUG, thread, "Worker shutdown unlocking thread mutex."); apr_thread_mutex_unlock(mutex); apr_pool_destroy(tpool); error_log(LOG_DEBUG, thread, "Worker thread completed."); apr_thread_exit(thread, 0); return NULL; } /** * Creates one new worker, giving it one of the available * Curl handles to work with. */ static void create_new_worker(int lock) { apr_thread_t *thread = NULL; CURL **curlptr = NULL; if (lock) { error_log(LOG_DEBUG, NULL, "Worker creation locking thread mutex."); if (APR_STATUS_IS_EBUSY(apr_thread_mutex_trylock(mutex))) { error_log(LOG_DEBUG, NULL, "Worker creation waiting on thread mutex."); apr_thread_mutex_lock(mutex); } } error_log(LOG_DEBUG, NULL, "Worker creation started."); /* A sanity check: this part executes under lock and * we want to make *sure* we don't create more threads * than we are allowed. */ if (current_workers >= max_connections) { if (lock) { error_log(LOG_DEBUG, NULL, "Worker creation unlocking thread mutex."); apr_thread_mutex_unlock(mutex); } return; } /* Cleanup thread pool when idle */ if (current_workers <= 0) { if (thread_pool != NULL) { error_log(LOG_DEBUG, NULL, "Destroying thread_pool."); apr_pool_destroy(thread_pool); thread_pool = NULL; } error_log(LOG_DEBUG, NULL, "Creating thread_pool."); apr_pool_create(&thread_pool, NULL); } curlptr = (CURL **)apr_array_pop(curl_handles); if (curlptr != NULL) { apr_threadattr_t *thread_attrs; apr_status_t rc; apr_threadattr_create(&thread_attrs, thread_pool); apr_threadattr_detach_set(thread_attrs, 1); apr_threadattr_stacksize_set(thread_attrs, 1024); rc = apr_thread_create(&thread, thread_attrs, thread_worker, *curlptr, thread_pool); if (rc != APR_SUCCESS) { if (lock) { error_log(LOG_DEBUG, NULL, "Worker creation unlocking thread mutex."); apr_thread_mutex_unlock(mutex); } error_log(LOG_ERROR, NULL, "Failed to create new worker thread: %d", rc); logc_shutdown(1); } current_workers++; } else { if (lock) { error_log(LOG_DEBUG, NULL, "Worker creation unlocking thread mutex."); apr_thread_mutex_unlock(mutex); } error_log(LOG_ERROR, NULL, "No more cURL handles (Internal Error)."); logc_shutdown(1); } error_log(LOG_DEBUG, NULL, "Worker creation completed: %pp", thread); if (lock) { error_log(LOG_DEBUG, NULL, "Worker creation unlocking thread mutex."); apr_thread_mutex_unlock(mutex); } } /** * This function implements the management thread. */ static void * APR_THREAD_FUNC thread_manager(apr_thread_t *thread, void *data) { apr_time_t last = 0; apr_time_t now = 0; error_log(LOG_DEBUG, thread, "Management thread: Starting."); for(;;) { now = apr_time_now(); /* Should we stop running? */ if (running == 0) { /* We need to be last */ error_log(LOG_DEBUG, thread, "Management thread: Waiting for worker " "threads to finish."); while(current_workers > 0) { apr_sleep(10 * 1000); } if (have_read_data) { error_log(LOG_NOTICE, thread, "Running final transaction checkpoint."); transaction_checkpoint(); } error_log(LOG_DEBUG, thread, "Management thread: Exiting."); management_thread_active = 0; apr_thread_exit(thread, 0); } /* Sleep for a while, but wake up often to check running status */ if ((last > 0) && ((now - last) < MANAGER_SLEEP)) { apr_sleep(MANAGER_SUBSLEEP); continue; } last = now; error_log(LOG_DEBUG2, thread, "Management thread: Processing"); /* When the server is flagged errored we need to * create a worker thread from time to time to * investigate. */ if (server_error) { if ((current_workers == 0)&& (apr_time_sec(now - server_error_last_check_time) > server_error_timeout)) { server_error_last_check_time = now; error_log(LOG_DEBUG, thread, "Management thread: Creating worker thread to " "investigate server."); create_new_worker(1); } } else { if ( (current_workers < max_connections) && (queue->nelts > current_workers) ) { error_log(LOG_DEBUG, thread, "Management thread: Creating worker thread to " "catch up with the queue."); create_new_worker(1); } } /* Initiate a transaction log checkpoint if enough time passed * since the last one. */ if (apr_time_sec(now - checkpoint_time_last) > checkpoint_interval) { error_log(LOG_DEBUG, thread, "Management thread: Initiating a checkpoint " "(previous was %" APR_TIME_T_FMT " seconds ago).", apr_time_sec(now - checkpoint_time_last)); checkpoint_time_last = now; transaction_checkpoint(); } else { error_log(LOG_DEBUG2, thread, "Management thread: Last checkpoint was %" APR_TIME_T_FMT " seconds ago.", apr_time_sec(now - checkpoint_time_last)); } } return NULL; } #ifndef WIN32 /** * Thread to handle all signals */ static void * APR_THREAD_FUNC thread_signals(apr_thread_t *thread, void *data) { apr_status_t rc; error_log(LOG_DEBUG, thread, "Signal thread: Starting."); rc = apr_signal_thread(handle_signals); if (rc != APR_SUCCESS) { error_log(LOG_DEBUG, thread, "Signal thread: Error %d", rc); logc_shutdown(1); } return NULL; } #endif /* WIN32 */ /** * The main loop where we receive log entries from * Apache and add them to the queue, sometimes creating * new worker threads to handle them. */ static void receive_loop(void) { apr_file_t *fd_stdin; apr_size_t nbytes = PIPE_BUF_SIZE; char *buf = apr_palloc(pool, PIPE_BUF_SIZE + 1); char errstr[1024]; apr_size_t evnt = 0; /* Index in buf to first event char */ apr_size_t curr = 0; /* Index in buf to current processing char */ apr_size_t next = 0; /* Index in buf to next unused char */ int done = 0; int drop_next = 0; int buffered_events = 0; int count = 0; apr_pool_t *tmp_pool; /* Open stdin. */ if (apr_file_open_stdin(&fd_stdin, pool) != APR_SUCCESS) { error_log(LOG_ERROR, NULL, "Unable to open stdin for reading"); logc_shutdown(1); } /* Always want this NUL terminated */ buf[PIPE_BUF_SIZE] = '\0'; apr_pool_create(&tmp_pool, NULL); /* Loop forever receiving entries from stdin. */ while(!done || (curr < next)) { apr_status_t rc; if (error_log_level >= LOG_DEBUG2) { error_log(LOG_DEBUG2, NULL, "Internal state: " "[evnt \"%" APR_SIZE_T_FMT "\"]" "[curr \"%" APR_SIZE_T_FMT "\"]" "[next \"%" APR_SIZE_T_FMT "\"]" "[nbytes \"%" APR_SIZE_T_FMT "\"]", evnt, curr, next, nbytes); } /* If we are not done and have the space, read more */ if (!done && (nbytes > 0)) { buffered_events = 0; nbytes = PIPE_BUF_SIZE - next; rc = apr_file_read(fd_stdin, (buf + next), &nbytes); if (rc != APR_SUCCESS) { if (have_read_data) { error_log(LOG_NOTICE, NULL, "No more data to read, emptying buffer: %s", apr_strerror(rc, errstr, 1024)); } done = 1; } else { have_read_data = 1; if (error_log_level == LOG_DEBUG) { error_log(LOG_DEBUG, NULL, "Read %" APR_SIZE_T_FMT " bytes from pipe", nbytes); } else { error_log(LOG_DEBUG2, NULL, "Read %" APR_SIZE_T_FMT " bytes from pipe: `%s'", nbytes, _log_escape(tmp_pool, (buf + next), nbytes)); } } next += nbytes; } /** * Each chunk of data we receive can contain one or more lines for * which we need to find the EOL marker and then queue the event * up to that. So, find/queue as many lines in the buffer as we * can. Any remaining data will get shifted back to the beginning * of the buffer and the buffer size for the next read adjusted. */ while(curr < next) { /* Look for EOL so we can parse the event */ while((curr < next) && (buf[curr] != 0x0a)) { curr++; } if (buf[curr] == 0x0a) { buf[curr] = '\0'; /* We may have to drop this one if it previously failed */ if (drop_next) { error_log(LOG_ERROR, NULL, "Dropping remaining portion of failed " "event: `%s'", _log_escape(tmp_pool, (buf + evnt), (curr - evnt))); drop_next = 0; } else { transaction_log(TXIN, buf + evnt); error_log(LOG_DEBUG2, NULL, "Received audit log entry " "(count %lu queue %d workers %d): %s", entry_counter, queue->nelts, current_workers, _log_escape(tmp_pool, (buf + evnt), strlen(buf + evnt))); add_entry(buf + evnt, 1); buffered_events++; } /* Advance indexes to next event in buf */ evnt = curr = curr + 1; } else { error_log(LOG_DEBUG2, NULL, "Event buffer contains partial event: `%s'", _log_escape(tmp_pool, (buf + evnt), (next - evnt))); break; } } if (buffered_events > 0) { error_log(LOG_DEBUG, NULL, "Processed %d entries from buffer.", buffered_events); /* Move the unused portion of the buffer to the beginning */ next -= evnt; curr -= evnt; memmove(buf, (buf + evnt), next); error_log(LOG_DEBUG2, NULL, "Shifted buffer back %" APR_SIZE_T_FMT " and offset %" APR_SIZE_T_FMT " bytes for next read: `%s'", evnt, next, _log_escape(tmp_pool, buf, next)); evnt = 0; } else if (next == PIPE_BUF_SIZE) { /** * There is a chance we could fill the buffer, but not have finished * reading the event (no EOL yet), so we need to say so and drop * all data until we find the end of the event that is too large. */ if (drop_next) { error_log(LOG_ERROR, NULL, "Event continuation too large, " "dropping it as well: `%s'", _log_escape(tmp_pool, buf, PIPE_BUF_SIZE)); } else { error_log(LOG_ERROR, NULL, "Event too large, dropping event: `%s'", _log_escape(tmp_pool, buf, PIPE_BUF_SIZE)); } /* Rewind buf and mark that we need to drop up to the next event */ evnt = curr = next = 0; drop_next = 1; } nbytes = PIPE_BUF_SIZE - next; if (count++ > 1000) { count = 0; error_log(LOG_DEBUG, NULL, "Recycling tmp_pool."); apr_pool_destroy(tmp_pool); apr_pool_create(&tmp_pool, NULL); } else { apr_pool_clear(tmp_pool); } } /* Wait for queue to empty if specified */ if ((server_error == 0) && (opt_force != 0) && (queue->nelts > 0)) { error_log(LOG_NOTICE, NULL, "Waiting for queue to empty (%d active).", queue->nelts); while ((server_error == 0) && (opt_force != 0) && (queue->nelts > 0)) { apr_sleep(10 * 1000); } if (queue->nelts > 0) { error_log(LOG_ERROR, NULL, "Could not empty queue (%d active).", queue->nelts); } } } /** * Creates the management thread. */ static void start_management_thread(void) { apr_thread_t *thread = NULL; apr_threadattr_t *thread_attrs; apr_status_t rc; apr_threadattr_create(&thread_attrs, pool); apr_threadattr_detach_set(thread_attrs, 1); apr_threadattr_stacksize_set(thread_attrs, 1024); management_thread_active = 1; rc = apr_thread_create(&thread, thread_attrs, thread_manager, NULL, pool); if (rc != APR_SUCCESS) { error_log(LOG_ERROR, NULL, "Failed to create new management thread: %d", rc); management_thread_active = 0; logc_shutdown(1); } } #ifndef WIN32 /** * Creates a thread to handle all signals */ static void start_signal_thread(void) { apr_thread_t *thread = NULL; apr_threadattr_t *thread_attrs; apr_status_t rc; apr_threadattr_create(&thread_attrs, pool); apr_threadattr_detach_set(thread_attrs, 1); apr_threadattr_stacksize_set(thread_attrs, 1024); rc = apr_thread_create(&thread, thread_attrs, thread_signals, NULL, pool); if (rc != APR_SUCCESS) { error_log(LOG_ERROR, NULL, "Failed to create new signal thread: %d", rc); logc_shutdown(1); } } #endif /* WIN32 */ /** * Usage text. */ static void usage(void) { fprintf(stderr, "ModSecurity Log Collector (mlogc) v%s\n", VERSION); fprintf(stderr, " Usage: mlogc [options] /path/to/the/mlogc.conf\n"); fprintf(stderr, "\n"); fprintf(stderr, " Options:\n"); fprintf(stderr, " -f Force depletion of queue on exit\n"); fprintf(stderr, " -v Version information\n"); fprintf(stderr, " -h This help\n\n"); } /** * Version text. */ static void version(void) { fprintf(stderr, "ModSecurity Log Collector (mlogc) v%s\n", VERSION); fprintf(stderr, " APR: compiled=\"%s\"; " "loaded=\"%s\"\n", APR_VERSION_STRING, apr_version_string()); fprintf(stderr, " PCRE: compiled=\"%d.%d\"; " "loaded=\"%s\"\n", PCRE_MAJOR, PCRE_MINOR, pcre_version()); fprintf(stderr, " cURL: compiled=\"%s\"; " "loaded=\"%s\"\n", LIBCURL_VERSION, curl_version()); fprintf(stderr, "\n"); } /** * This is the main entry point. */ int main(int argc, const char * const argv[]) { apr_getopt_t *opt; apr_status_t rc; apr_app_initialize(&argc, &argv, NULL); atexit(apr_terminate); curl_global_init(CURL_GLOBAL_ALL); atexit(logc_cleanup); logc_pid = getpid(); apr_pool_create(&pool, NULL); apr_pool_create(&recv_pool, NULL); #ifndef WIN32 apr_setup_signal_thread(); #else apr_signal(SIGINT, handle_signals); apr_signal(SIGTERM, handle_signals); #endif /* WIN32 */ if (argc < 2) { usage(); logc_shutdown(1); } /* Commandline opts */ rc = apr_getopt_init(&opt, pool, argc, argv); if (rc != APR_SUCCESS) { usage(); logc_shutdown(1); } do { char ch; const char *val; rc = apr_getopt(opt, CMDLINE_OPTS, &ch, &val); switch (rc) { case APR_SUCCESS: switch (ch) { case 'f': opt_force = 1; break; case 'v': version(); logc_shutdown(0); case 'h': usage(); logc_shutdown(0); } break; case APR_BADCH: case APR_BADARG: usage(); logc_shutdown(1); } } while (rc != APR_EOF); /* Conf file is last */ conffile = argv[argc - 1]; read_configuration(); init_configuration(); logc_init(); transaction_log_init(); running = 1; server_error = 0; start_management_thread(); #ifndef WIN32 start_signal_thread(); #endif /* WIN32 */ /* Process stdin until EOF */ receive_loop(); logc_shutdown(0); return 0; } modsecurity-2.9.5/mlogc/INSTALL0000664000175000017500000000533114147005233017353 0ustar mhsvierulamhsvierulaModSecurity Audit Log Collector (mlogc) Mlogc is used to connect a ModSecurity sensor to the central audit log repository. To Install: =========== 1) Copy the mlogc executable to an appropriate location. A good location might be /usr/local/bin, /opt/mlogc/bin, etc. 2) Create sensor in the central audit log repository. Note the username and the password (SENSOR_USERNAME, SENSOR_PASSWORD). Also note the IP address central repository listens on (CONSOLE_IP_ADDRESS). 3) Configure the ModSecurity sensor to use mlogc # Use ReleventOnly auditing SecAuditEngine RelevantOnly # Must use concurrent logging SecAuditLogType Concurrent # Send all audit log parts SecAuditLogParts ABIDEFGHZ # Use the same /CollectorRoot/LogStorageDir as in mlogc.conf SecAuditLogStorageDir /var/log/mlogc/data # Pipe audit log to mlogc with your configuration SecAuditLog "|/usr/local/bin/mlogc /etc/mlogc.conf" 4) Using the mlogc-default.conf as a template, configure the logger. Typically these are the only directives that will need to be modified to conform to your site: # Points to the root of the installation. All relative # paths configured in this file will be resolved with the # help of this path (LogStorageDir, TransactionLog, etc.) # # Typically, this will be the parent directory that is configured # in ModSecurity for the SecAuditLogStorageDirectory. So, if # your SecAuditLogStorageDirectory is set to /var/log/mlogc/data, # then set this to /var/log/mlogc. CollectorRoot "/var/log/mlogc" # ModSecurity Console receiving URI. You can change the host # and the port parts but leave everything else as is. ConsoleURI https://CONSOLE_IP_ADDRESS:8886/rpc/auditLogReceiver # Sensor credentials SensorUsername "SENSOR_USERNAME" SensorPassword "SENSOR_PASSWORD" # Base directory where the audit logs are stored. This can be specified # as a path relative to the CollectorRoot, or a full path. It should # resolve to the same path as ModSecurity's SecAuditLogStorageDirectory. LogStorageDir "data" See the mlogc-default.conf configuration file for details on other configuration directives. 5) Restart the ModSecurity sensor. From now on every audit log generated will go to the repository. Make sure you create an alert. Transactions without alerts will be recorded but not displayed on the home page. To troubleshoot, generate alerts and observe file "mlogc-error.log". If mlogc fails to connect to the server it will pause for a period of time (60 seconds by default) before it will try again. modsecurity-2.9.5/mlogc/Makefile.win0000775000175000017500000000264514147005233020566 0ustar mhsvierulamhsvierula########################################################################### ### You Will need to modify the following variables for your system ########################################################################### ########################################################################### # Path to Apache httpd installation BASE = %APACHE% # Paths to required libraries PCRE = %PCRE% CURL = %CURL% # Linking libraries LIBS = $(BASE)\lib\libapr-1.lib \ $(BASE)\lib\libaprutil-1.lib \ $(PCRE)\pcre.lib \ $(CURL)\libcurl.lib \ wsock32.lib ########################################################################### ########################################################################### CC = cL MT = mt DEFS = /nologo /O2 /W3 -DWIN32 -DWINNT -Dinline=APR_INLINE -D_CONSOLE -D$(VERSION) EXE = mlogc.exe INCLUDES = -I. -I..\apache2 \ -I$(PCRE)\include -I$(PCRE) \ -I$(CURL)\include -I$(CURL) \ -I$(BASE)\include CFLAGS= -MT $(INCLUDES) $(DEFS) LDFLAGS = OBJS = mlogc.obj all: $(EXE) .c.obj: $(CC) $(CFLAGS) -c $< -Fo$@ .cpp.obj: $(CC) $(CFLAGS) -c $< -Fo$@ $(EXE): $(OBJS) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) /link /NODEFAULTLIB:MSVCRT.lib /subsystem:console install: $(EXE) copy $(EXE) $(BASE)\bin clean: del $(OBJS) $(EXE) *.dll *.lib *.pdb *.idb *.ilk *.exp *.res *.rc *.bin *.manifest modsecurity-2.9.5/LICENSE0000664000175000017500000002500414147005233016225 0ustar mhsvierulamhsvierula Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS Copyright 2016 ModSecurity Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. modsecurity-2.9.5/configure.ac0000664000175000017500000006317414147005233017520 0ustar mhsvierulamhsvieruladnl dnl Autoconf configuration for ModSecurity dnl dnl Use ./autogen.sh to produce a configure script dnl AC_PREREQ(2.63) AC_INIT([modsecurity], [2.9], [support@modsecurity.org]) AC_CONFIG_MACRO_DIR([build]) AC_CONFIG_SRCDIR([LICENSE]) AC_CONFIG_HEADERS([apache2/modsecurity_config_auto.h]) AC_CONFIG_AUX_DIR([build]) AC_PREFIX_DEFAULT([/usr/local/modsecurity]) AM_INIT_AUTOMAKE([-Wall foreign subdir-objects]) m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) LT_PREREQ([2.2]) LT_INIT([dlopen]) # Checks for programs. AC_PROG_AWK AC_PROG_CC AC_PROG_CPP AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET AC_PROG_GREP AC_PATH_PROGS(PERL, [perl perl5], ) AC_PATH_PROGS(ENV_CMD, [env printenv], ) # Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([fcntl.h limits.h stdlib.h string.h unistd.h sys/types.h sys/stat.h sys/utsname.h]) # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_C_INLINE AC_C_RESTRICT AC_TYPE_PID_T AC_TYPE_SIZE_T AC_STRUCT_TM AC_TYPE_UINT8_T # Checks for library functions. AC_FUNC_MALLOC AC_FUNC_MEMCMP AC_CHECK_FUNCS([atexit getcwd memmove memset strcasecmp strchr strdup strerror strncasecmp strrchr strstr strtol fchmod strcasestr]) # Some directories MSC_BASE_DIR=`pwd` MSC_PKGBASE_DIR="$MSC_BASE_DIR/.." MSC_TEST_DIR="$MSC_BASE_DIR/tests" MSC_REGRESSION_DIR="$MSC_TEST_DIR/regression" MSC_REGRESSION_SERVERROOT_DIR="$MSC_REGRESSION_DIR/server_root" MSC_REGRESSION_CONF_DIR="$MSC_REGRESSION_SERVERROOT_DIR/conf" MSC_REGRESSION_LOGS_DIR="$MSC_REGRESSION_SERVERROOT_DIR/logs" MSC_REGRESSION_DOCROOT_DIR="$MSC_REGRESSION_SERVERROOT_DIR/htdocs" AC_SUBST(MSC_BASE_DIR) AC_SUBST(MSC_PKGBASE_DIR) AC_SUBST(MSC_TEST_DIR) AC_SUBST(MSC_REGRESSION_DIR) AC_SUBST(MSC_REGRESSION_SERVERROOT_DIR) AC_SUBST(MSC_REGRESSION_CONF_DIR) AC_SUBST(MSC_REGRESSION_LOGS_DIR) AC_SUBST(MSC_REGRESSION_DOCROOT_DIR) ### Configure Options # Verbose output AC_ARG_ENABLE(verbose-output, AS_HELP_STRING([--enable-verbose-output], [Enable more verbose configure output.]), [ if test "$enableval" != "no"; then verbose_output=1 else verbose_output=0 fi ], [ verbose_output=0 ]) #OS type AC_CANONICAL_HOST CANONICAL_HOST=$host AH_TEMPLATE([AIX], [Define if the operating system is AIX]) AH_TEMPLATE([LINUX], [Define if the operating system is LINUX]) AH_TEMPLATE([OPENBSD], [Define if the operating system is OpenBSD]) AH_TEMPLATE([SOLARIS], [Define if the operating system is SOLARIS]) AH_TEMPLATE([HPUX], [Define if the operating system is HPUX]) AH_TEMPLATE([MACOSX], [Define if the operating system is Macintosh OSX]) AH_TEMPLATE([FREEBSD], [Define if the operating system is FREEBSD]) AH_TEMPLATE([NETBSD], [Define if the operating system is NetBSD]) case $host in *-*-aix*) echo "Checking platform... Identified as AIX" aixos=true ;; *-*-hpux*) echo "Checking platform... Identified as HPUX" hpuxos=true ;; *-*-darwin*) echo "Checking platform... Identified as Macintosh OS X" macos=true ;; *-*-linux*) echo "Checking platform... Identified as Linux" linuxos=true case "${host_cpu}" in s390x) cpu_type="-DLINUX_S390" ;; esac ;; *-*-solaris*) echo "Checking platform... Identified as Solaris" solarisos=true ;; *-*-freebsd*) echo "Checking platform... Identified as FreeBSD" freebsdos=true ;; *-*-netbsd*) echo "Checking platform... Identified as NetBSD" netbsdos=true ;; *-*-openbsd*) echo "Checking platform... Identified as OpenBSD" openbsdos=true ;; *-*-kfreebsd*) echo "Checking platform... Identified as kFreeBSD, treating as linux" linuxos=true ;; *-*-gnu*.*) echo "Checking platform... Identified as HURD, treating as linux" linuxos=true ;; *) echo "Unknown CANONICAL_HOST $host" exit ;; esac AM_CONDITIONAL([AIX], [test x$aixos = xtrue]) AM_CONDITIONAL([HPUX], [test x$hpuxos = xtrue]) AM_CONDITIONAL([MACOSX], [test x$macos = xtrue]) AM_CONDITIONAL([LINUX], [test x$linuxos = xtrue]) AM_CONDITIONAL([LINUX390], [test x$linuxos390 = xtrue]) AM_CONDITIONAL([SOLARIS], [test x$solarisos = xtrue]) AM_CONDITIONAL([FREEBSD], [test x$freebsdos = xtrue]) AM_CONDITIONAL([OPENBSD], [test x$openbsdos = xtrue]) AM_CONDITIONAL([NETBSD], [test x$netbsdos = xtrue]) #Subdirs TOPLEVEL_SUBDIRS="tools" # Apache2 Module AC_ARG_ENABLE(apache2-module, AS_HELP_STRING([--disable-apache2-module], [Disable building Apache2 module.]), [ if test "$enableval" != "no"; then build_apache2_module=1 else build_apache2_module=0 fi ], [ build_apache2_module=1 ]) AM_CONDITIONAL([BUILD_APACHE2_MODULE], [test "$build_apache2_module" -eq 1]) if test "$build_apache2_module" -eq 1; then TOPLEVEL_SUBDIRS="$TOPLEVEL_SUBDIRS apache2" fi # Standalone Module AC_ARG_ENABLE(standalone-module, AS_HELP_STRING([--enable-standalone-module], [Enable building standalone module.]), [ if test "$enableval" != "no"; then build_standalone_module=1 else build_standalone_module=0 fi ], [ build_standalone_module=0 ]) AM_CONDITIONAL([BUILD_STANDALONE_MODULE], [test "$build_standalone_module" -eq 1]) if test "$build_standalone_module" -eq 1; then TOPLEVEL_SUBDIRS="$TOPLEVEL_SUBDIRS standalone" fi # Extensions AC_ARG_ENABLE(extentions, AS_HELP_STRING([--enable-extentions], [Enable building extension.]), [ if test "$enableval" != "no"; then build_extentions=1 else build_extentions=0 fi ], [ build_extentions=0 ]) AM_CONDITIONAL([BUILD_extentions], [test "$build_extentions" -eq 1]) if test "$build_extentions" -eq 1; then TOPLEVEL_SUBDIRS="$TOPLEVEL_SUBDIRS ext" fi # Mlogc AC_ARG_ENABLE(mlogc, AS_HELP_STRING([--disable-mlogc], [Disable building mlogc.]), [ if test "$enableval" != "no"; then build_mlogc=1 else build_mlogc=0 fi ], [ build_mlogc=1 ]) CHECK_CURL() if test -z "${CURL_VERSION}"; then AC_MSG_NOTICE([NOTE: mlgoc compilation was disabled.]) build_mlogc=0 fi AM_CONDITIONAL([BUILD_MLOGC], [test "$build_mlogc" -eq 1]) if test "$build_mlogc" -eq 1; then TOPLEVEL_SUBDIRS="$TOPLEVEL_SUBDIRS mlogc" fi # Audit Log Parser v2 (ALP2) AC_ARG_ENABLE(alp2, AS_HELP_STRING([--enable-alp2], [Enable building audit log parser lib.]), [ if test "$enableval" != "no"; then build_alp2=1 else build_alp2=0 fi ], [ build_alp2=0 ]) AM_CONDITIONAL([BUILD_ALP2], [test "$build_alp2" -eq 1]) if test "$build_alp2" -eq 1; then TOPLEVEL_SUBDIRS="$TOPLEVEL_SUBDIRS alp2" fi # Documentation AC_ARG_ENABLE(docs, AS_HELP_STRING([--enable-docs], [Enable building documentation.]), [ if test "$enableval" != "no"; then build_docs=1 else build_docs=0 fi ], [ build_docs=0 ]) AM_CONDITIONAL([BUILD_DOCS], [test "$build_docs" -eq 1]) if test "$build_docs" -eq 1; then TOPLEVEL_SUBDIRS="$TOPLEVEL_SUBDIRS doc" AC_CHECK_PROGS([DOXYGEN], [doxygen]) if test -z "$DOXYGEN"; then AC_MSG_WARN([Doxygen not found - continue without Doxygen support]) fi if test "$build_apache2_module" -eq 1; then AC_CONFIG_FILES([doc/doxygen-apache]) fi if test "$build_standalone_module" -eq 1; then AC_CONFIG_FILES([doc/doxygen-nginx]) AC_CONFIG_FILES([doc/doxygen-iis]) AC_CONFIG_FILES([doc/doxygen-standalone]) fi AC_CONFIG_FILES([doc/Makefile]) fi # Add PCRE Studying AC_ARG_ENABLE(pcre-study, AS_HELP_STRING([--enable-pcre-study], [Enable PCRE regex studying during configure.]), [ if test "$enableval" != "no"; then pcre_study='-DWITH_PCRE_STUDY' MODSEC_EXTRA_CFLAGS="$MODSEC_EXTRA_CFLAGS $pcre_study" else pcre_study='' fi ], [ pcre_study='-DWITH_PCRE_STUDY' ]) # Add PCRE JIT AC_ARG_ENABLE(pcre-jit, AS_HELP_STRING([--enable-pcre-jit], [Enable PCRE regex jit support during configure.]), [ if test "$enableval" != "no"; then pcre_jit='-DWITH_PCRE_JIT' MODSEC_EXTRA_CFLAGS="$MODSEC_EXTRA_CFLAGS $pcre_jit" else pcre_jit='' fi ], [ pcre_jit='' ]) # Limit PCRE matching AC_ARG_ENABLE(pcre-match-limit, AS_HELP_STRING([--enable-pcre-match-limit], [Enable PCRE regex match limit during configure.]), [ if test "$enableval" = "yes"; then AC_MSG_ERROR([PCRE match limits require a numeric value]) elif test "$enableval" = "no"; then pcre_match_limit='' else pcre_match_limit="-DMODSEC_PCRE_MATCH_LIMIT=$enableval" MODSEC_EXTRA_CFLAGS="$MODSEC_EXTRA_CFLAGS $pcre_match_limit" fi ], [ pcre_match_limit='-DMODSEC_PCRE_MATCH_LIMIT=1500' ]) # Limit PCRE matching recursion AC_ARG_ENABLE(pcre-match-limit-recursion, AS_HELP_STRING([--enable-pcre-match-limit-recursion], [Enable PCRE regex match limit recursion during configure.]), [ if test "$enableval" = "yes"; then AC_MSG_ERROR([PCRE match limits require a numeric value]) elif test "$enableval" = "no"; then pcre_match_limit_recursion='' else pcre_match_limit_recursion="-DMODSEC_PCRE_MATCH_LIMIT_RECURSION=$enableval" MODSEC_EXTRA_CFLAGS="$MODSEC_EXTRA_CFLAGS $pcre_match_limit_recursion" fi ], [ pcre_match_limit_recursion='-DMODSEC_PCRE_MATCH_LIMIT_RECURSION=1500' ]) # Enable Lua per transaction cache AC_ARG_ENABLE(lua-cache, AS_HELP_STRING([--enable-lua-cache], [Enable Lua per transaction cache.]), [ if test "$enableval" != "no"; then lua_cache="-DCACHE_LUA" MODSEC_EXTRA_CFLAGS="$MODSEC_EXTRA_CFLAGS $lua_cache" else lua_cache= fi ], [ lua_cache= ]) # Enable phase-1 in post_read_request AC_ARG_ENABLE(htaccess-config, AS_HELP_STRING([--enable-htaccess-config], [Enable some mod_security directives into htaccess files.]), [ if test "$enableval" != "no"; then htaccess_config="-DHTACCESS_CONFIG" MODSEC_EXTRA_CFLAGS="$MODSEC_EXTRA_CFLAGS $htaccess_config" else htaccess_config= fi ], [ htaccess_config= ]) # Enable phase-1 in post_read_request AC_ARG_ENABLE(request-early, AS_HELP_STRING([--enable-request-early], [Place phase1 into post_read_request hook. default is hook_request_early]), [ if test "$enableval" != "no"; then request_early="-DREQUEST_EARLY" MODSEC_EXTRA_CFLAGS="$MODSEC_EXTRA_CFLAGS $request_early" else request_early= fi ], [ request_early='-DREQUEST_EARLY' ]) # Enable duplicate rules id AC_ARG_ENABLE(rule-id-validation, AS_HELP_STRING([--enable-rule-id-validation], [Forbid duplicate rule ids and missing ones. This is the default]), [ if test "$enableval" != "no"; then unique_id= else unique_id="-DALLOW_ID_NOT_UNIQUE" MODSEC_EXTRA_CFLAGS="$MODSEC_EXTRA_CFLAGS $unique_id" fi ], [ unique_id='' ]) # Disable logging of filename AC_ARG_ENABLE(filename-logging, AS_HELP_STRING([--enable-filename-logging], [Enable logging of filename in audit log. This is the default]), [ if test "$enableval" != "no"; then log_filename= else log_filename="-DLOG_NO_FILENAME" fi ], [ log_filename='' ]) # Disable logging of "Server" AC_ARG_ENABLE(server-logging, AS_HELP_STRING([--enable-server-logging], [Enable logging of "Server" in audit log when log level < 9. This is the default]), [ if test "$enableval" != "no"; then log_server= else log_server="-DLOG_NO_SERVER" fi ], [ log_server='' ]) # Disable logging of problem when deleting collection AC_ARG_ENABLE(collection-delete-problem-logging, AS_HELP_STRING([--enable-collection-delete-problem-logging], [Enable logging of collection delete problem even when log level is < 9. This is the default]), [ if test "$enableval" != "no"; then log_collection_delete_problem= else log_collection_delete_problem="-DLOG_NO_COLL_DELET_PB" fi ], [ log_collection_delete_problem='' ]) # Disable logging of Apache handler AC_ARG_ENABLE(handler-logging, AS_HELP_STRING([--enable-handler-logging], [Enable logging of Apache handler in audit log even when log level is < 9. This is the default]), [ if test "$enableval" != "no"; then log_handler= else log_handler="-DLOG_NO_HANDLER" fi ], [ log_handler='' ]) # Disable logging of dechunking AC_ARG_ENABLE(dechunk-logging, AS_HELP_STRING([--enable-dechunk-logging], [Enable logging of dechunking even when log level is < 9. This is the default]), [ if test "$enableval" != "no"; then log_dechunk= else log_dechunk="-DLOG_NO_DECHUNK" fi ], [ log_dechunk='' ]) # Disable logging of stopwatches AC_ARG_ENABLE(stopwatch-logging, AS_HELP_STRING([--enable-stopwatch-logging], [Enable logging of stopwatches even when log level is < 9. This is the default]), [ if test "$enableval" != "no"; then log_stopwatch= else log_stopwatch="-DLOG_NO_STOPWATCH" fi ], [ log_stopwatch='' ]) # Disable logging of server context AC_ARG_ENABLE(server-context-logging, AS_HELP_STRING([--enable-server-context-logging], [Enable logging of server info (log producer, sanitized objects, ...) in audit log even when log level < 9. This is the default]), [ if test "$enableval" != "no"; then log_server_context= else log_server_context="-DLOG_NO_SERVER_CONTEXT" fi ], [ log_server_context='' ]) # Enable collection's global lock AC_ARG_ENABLE(collection-global-lock, AS_HELP_STRING([--enable-collection-global-lock], [Enable collection correctness by using a global lock. May reduce performance significatively. This is disabled by default]), [ if test "$enableval" != "yes"; then collection_global_lock="" else collection_global_lock="-DGLOBAL_COLLECTION_LOCK" fi ], [ collection_global_lock='' ]) # Ignore configure errors AC_ARG_ENABLE(errors, AS_HELP_STRING([--disable-errors], [Disable errors during configure.]), [ if test "$enableval" != "no"; then report_errors=1 else report_errors=0 fi ], [ report_errors=1 ]) # Strict Compile AC_ARG_ENABLE(strict-compile, AS_HELP_STRING([--enable-strict-compile], [Enable strict compilation (warnings are errors).]), [ if test "$enableval" != "no"; then strict_compile="-std=c99 -Wstrict-overflow=1 -Wextra -Wno-missing-field-initializers -Wshadow -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes -Wno-unused-parameter -Wformat -Wformat-security -Werror -fstack-protector -D_FORTIFY_SOURCE=2" MODSEC_EXTRA_CFLAGS="$MODSEC_EXTRA_CFLAGS $strict_compile" else strict_compile= fi ], [ strict_compile= ]) # DEBUG_CONF AC_ARG_ENABLE(debug-conf, AS_HELP_STRING([--enable-debug-conf], [Enable debug during configuration.]), [ if test "$enableval" != "no"; then debug_conf="-DDEBUG_CONF" MODSEC_EXTRA_CFLAGS="$MODSEC_EXTRA_CFLAGS $debug_conf" else debug_conf= fi ], [ debug_conf= ]) # CACHE_DEBUG AC_ARG_ENABLE(debug-cache, AS_HELP_STRING([--enable-debug-cache], [Enable debug for transformation caching.]), [ if test "$enableval" != "no"; then debug_cache="-DCACHE_DEBUG" MODSEC_EXTRA_CFLAGS="$MODSEC_EXTRA_CFLAGS $debug_cache" else debug_cache= fi ], [ debug_cache= ]) # DEBUG_ACMP AC_ARG_ENABLE(debug-acmp, AS_HELP_STRING([--enable-debug-acmp], [Enable debugging acmp code.]), [ if test "$enableval" != "no"; then debug_acmp="-DDEBUG_ACMP" MODSEC_EXTRA_CFLAGS="$MODSEC_EXTRA_CFLAGS $debug_acmp" else debug_acmp= fi ], [ debug_acmp= ]) # DEBUG_MEM AC_ARG_ENABLE(debug-mem, AS_HELP_STRING([--enable-debug-mem], [Enable debug during configuration.]), [ if test "$enableval" != "no"; then debug_mem="-DDEBUG_MEM" MODSEC_EXTRA_CFLAGS="$MODSEC_EXTRA_CFLAGS $debug_mem" else debug_mem= fi ], [ debug_mem= ]) # PERFORMANCE_MEASUREMENT AC_ARG_ENABLE(performance-measurement, AS_HELP_STRING([--enable-performance-measurement], [Enable performance-measurement stats.]), [ if test "$enableval" != "no"; then perf_meas="-DPERFORMANCE_MEASUREMENT" MODSEC_EXTRA_CFLAGS="$MODSEC_EXTRA_CFLAGS $perf_meas" else perf_meas= fi ], [ perf_meas= ]) # NO_MODSEC_API AC_ARG_ENABLE(modsec-api, AS_HELP_STRING([--disable-modsec-api], [Disable the API; compiling against some older Apache versions require this.]), [ if test "$enableval" != "yes"; then modsec_api="-DNO_MODSEC_API" MODSEC_EXTRA_CFLAGS="$MODSEC_EXTRA_CFLAGS $modsec_api" else modsec_api= fi ], [ modsec_api= ]) # MSC_LARGE_STREAM_INPUT AC_ARG_ENABLE(large-stream-input, AS_HELP_STRING([--enable-large-stream-input], [Enable optimization for large stream input]), [ if test "$enableval" == "yes"; then large_stream_input="-DMSC_LARGE_STREAM_INPUT" MODSEC_EXTRA_CFLAGS="$MODSEC_EXTRA_CFLAGS $large_stream_input" else large_stream_input= fi ], [ large_stream_input= ]) # Find apxs AC_MSG_NOTICE(looking for Apache module support via DSO through APXS) AC_ARG_WITH(apxs, [AS_HELP_STRING([[--with-apxs=FILE]], [FILE is the path to apxs; defaults to "apxs".])], [ if test "$withval" = "yes"; then APXS=apxs else APXS="$withval" fi ]) if test -z "$APXS"; then for i in /usr/local/apache22/bin \ /usr/local/apache2/bin \ /usr/local/apache/bin \ /usr/local/sbin \ /usr/local/bin \ /usr/sbin \ /usr/bin; do if test -f "$i/apxs2"; then APXS="$i/apxs2" break elif test -f "$i/apxs"; then APXS="$i/apxs" break fi done fi # arbitrarily picking the same version subversion looks for, don't know how # accurate this really is, but at least it'll force us to have apache2... HTTPD_WANTED_MMN=20020903 if test -n "$APXS" -a "$APXS" != "no" -a -x "$APXS" ; then APXS_INCLUDE="`$APXS -q INCLUDEDIR`" if test -r $APXS_INCLUDE/httpd.h; then AC_MSG_NOTICE(found apxs at $APXS) AC_MSG_NOTICE(checking httpd version) AC_EGREP_CPP(VERSION_OK, [ #include "$APXS_INCLUDE/ap_mmn.h" #if AP_MODULE_MAGIC_AT_LEAST($HTTPD_WANTED_MMN,0) VERSION_OK #endif], [AC_MSG_NOTICE(httpd is recent enough)], [ if test "$report_errors" -eq 1; then AC_MSG_ERROR(apache is too old, mmn must be at least $HTTPD_WANTED_MMN) else AC_MSG_NOTICE(apache is too old, mmn must be at least $HTTPD_WANTED_MMN) fi ]) fi APXS_INCLUDEDIR="`$APXS -q INCLUDEDIR`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apxs INCLUDEDIR: $APXS_INCLUDEDIR); fi # Make sure the include dir is used if test -n "$APXS_INCLUDEDIR"; then APXS_INCLUDES="-I${APXS_INCLUDEDIR} `$APXS -q INCLUDES` `$APXS -q EXTRA_INCLUDES`" else APXS_INCLUDES="`$APXS -q INCLUDES` `$APXS -q EXTRA_INCLUDES`" fi if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apxs INCLUDES: $APXS_INCLUDES); fi APXS_CFLAGS=-I`$APXS -q INCLUDEDIR` if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apxs CFLAGS: $APXS_CFLAGS); fi APXS_LDFLAGS= if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apxs LDFLAGS: $APXS_LDFLAGS); fi APXS_LIBDIR="`$APXS -q LIBDIR`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apxs LIBDIR: $APXS_LIBDIR); fi # Make sure the lib dir is used if test -n "$APXS_LIBDIR"; then APXS_LIBS="-L${APXS_LIBDIR} `$APXS -q LIBS` `$APXS -q EXTRA_LIBS`" else APXS_LIBS="`$APXS -q LIBS` `$APXS -q EXTRA_LIBS`" fi if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apxs LIBS: $APXS_LIBS); fi APXS_LIBTOOL="`$APXS -q LIBTOOL`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apxs LIBTOOL: $APXS_LIBTOOL); fi APXS_CC="`$APXS -q CC`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apxs CC: $APXS_CC); fi APXS_BINDIR="`$APXS -q BINDIR`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apxs BINDIR: $APXS_BINDIR); fi APXS_SBINDIR="`$APXS -q SBINDIR`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apxs SBINDIR: $APXS_SBINDIR); fi APXS_PROGNAME="`$APXS -q PROGNAME`" if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apxs PROGNAME: $APXS_PROGNAME); fi APXS_LIBEXECDIR="`$APXS -q LIBEXECDIR`" if test "xx$APXS_LIBEXECDIR" = "xx"; then APXS_LIBEXECDIR="`$APXS -q LIBDIR`/modules"; fi if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apxs LIBEXECDIR: $APXS_LIBEXECDIR); fi APXS_MODULES=$APXS_LIBEXECDIR if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apxs MODULES: $APXS_MODULES); fi if test "$APXS_SBINDIR" = "/"; then APXS_HTTPD="$APXS_SBINDIR/$APXS_PROGNAME" else APXS_HTTPD="$APXS_SBINDIR/$APXS_PROGNAME" fi if test "$verbose_output" -eq 1; then AC_MSG_NOTICE(apxs HTTPD: $APXS_HTTPD); fi else if test "$report_errors" -eq 1; then AC_MSG_ERROR(couldn't find APXS) else AC_MSG_NOTICE(couldn't find APXS) fi fi ### Build *EXTRA_CFLAGS vars # Allow overriding EXTRA_CFLAGS if $ENV_CMD | $GREP "^EXTRA_CFLAGS" > /dev/null 2>&1; then if test -z "$debug_mem"; then EXTRA_CFLAGS="$EXTRA_CFLAGS $strict_compile" fi else if test -n "$debug_mem"; then EXTRA_CFLAGS="-O0 -g -Wall" else EXTRA_CFLAGS="-O2 -g -Wall $strict_compile" fi fi MODSEC_EXTRA_CFLAGS="$pcre_study $pcre_match_limit $pcre_match_limit_recursion $pcre_jit $request_early $htaccess_config $lua_cache $debug_conf $debug_cache $debug_acmp $debug_mem $perf_meas $modsec_api $cpu_type $unique_id $log_filename $log_server $log_collection_delete_problem $log_dechunk $log_stopwatch $log_handler $log_server_context $collection_global_lock $large_stream_input" APXS_WRAPPER=build/apxs-wrapper APXS_EXTRA_CFLAGS="" for f in $EXTRA_CFLAGS; do APXS_EXTRA_CFLAGS="$APXS_EXTRA_CFLAGS -Wc,$f" done; MODSEC_APXS_EXTRA_CFLAGS="" for f in $MODSEC_EXTRA_CFLAGS; do MODSEC_APXS_EXTRA_CFLAGS="$MODSEC_APXS_EXTRA_CFLAGS -Wc,$f" done; ### Substitute the vars AC_SUBST(TOPLEVEL_SUBDIRS) AC_SUBST(EXTRA_CFLAGS) AC_SUBST(MODSEC_EXTRA_CFLAGS) AC_SUBST(APXS) AC_SUBST(APXS_WRAPPER) AC_SUBST(APXS_INCLUDEDIR) AC_SUBST(APXS_INCLUDES) AC_SUBST(APXS_EXTRA_CFLAGS) AC_SUBST(MODSEC_APXS_EXTRA_CFLAGS) AC_SUBST(APXS_LDFLAGS) AC_SUBST(APXS_LIBS) AC_SUBST(APXS_CFLAGS) AC_SUBST(APXS_LIBTOOL) AC_SUBST(APXS_CC) AC_SUBST(APXS_LIBDIR) AC_SUBST(APXS_BINDIR) AC_SUBST(APXS_SBINDIR) AC_SUBST(APXS_PROGNAME) AC_SUBST(APXS_LIBEXECDIR) AC_SUBST(APXS_MODULES) AC_SUBST(APXS_HTTPD) CHECK_PCRE() if test "$build_apache2_module" -ne 0 -o "$build_mlogc" -ne 0; then CHECK_APR() CHECK_APU() fi CHECK_LIBXML2() CHECK_LUA() #if test "$build_mlogc" -ne 0; then #CHECK_CURL() #fi # Check for YAJL libs (for JSON body processor) CHECK_YAJL() #AC_SEARCH_LIBS([yajl_alloc], [yajl]) CHECK_SSDEEP() #AC_SEARCH_LIBS([fuzzy_hash_buf], [fuzzy]) # Temporarily set cflags for apr_crypto check, then restore # since it's already used correctly to compile modsecurity module. ORIG_CFLAGS="$CFLAGS $APU_CFLAGS" ORIG_CPPFLAGS="$CPPFLAGS" CFLAGS="$CFLAGS $APR_CFLAGS" CPPFLAGS="$CPPFLAGS $APR_CPPFLAGS" AC_TRY_COMPILE( [#include ], [ #if APU_HAVE_CRYPTO == 0 #error APR util was not compiled with crypto support. #endif ], [ AC_DEFINE([WITH_APU_CRYPTO], [1], [APR util was compiled with crypto support]) MODSEC_EXTRA_CFLAGS="$MODSEC_EXTRA_CFLAGS -DWITH_APU_CRYPTO" ], [ AC_MSG_WARN([APR util was not compiled with crypto support. SecRemoteRule will not support the parameter 'crypto']) ] ) # Restore env vars so that we don't clutter with duplicates that # are eventually appended later on CFLAGS="$ORIG_CFLAGS" CPPFLAGS="$ORIG_CPPFLAGS" # Current our unique download backend is curl, furhter we can support more. if test ! -z "${CURL_VERSION}"; then AC_DEFINE([WITH_REMOTE_RULES], [1], [Enables SecRemoteRules support]) MODSEC_EXTRA_CFLAGS="$MODSEC_EXTRA_CFLAGS -DWITH_REMOTE_RULES" fi AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([tools/Makefile]) if test "$build_alp2" -ne 0; then AC_CONFIG_FILES([alp2/Makefile]) fi if test "$build_apache2_module" -ne 0; then AC_CONFIG_FILES([apache2/Makefile]) fi if test "$build_standalone_module" -ne 0; then AC_CONFIG_FILES([standalone/Makefile]) AC_CONFIG_FILES([nginx/modsecurity/config]) fi if test "$build_extentions" -ne 0; then AC_CONFIG_FILES([ext/Makefile]) fi AC_CONFIG_FILES([build/apxs-wrapper], [chmod +x build/apxs-wrapper]) if test -e "$PERL"; then if test "$build_mlogc" -ne 0; then AC_CONFIG_FILES([mlogc/mlogc-batch-load.pl], [chmod +x mlogc/mlogc-batch-load.pl]) AC_CONFIG_FILES([tests/regression/misc/40-secRemoteRules.t]) AC_CONFIG_FILES([tests/regression/misc/50-ipmatchfromfile-external.t]) AC_CONFIG_FILES([tests/regression/misc/60-pmfromfile-external.t]) fi AC_CONFIG_FILES([tests/run-unit-tests.pl], [chmod +x tests/run-unit-tests.pl]) AC_CONFIG_FILES([tests/run-regression-tests.pl], [chmod +x tests/run-regression-tests.pl]) AC_CONFIG_FILES([tests/gen_rx-pm.pl], [chmod +x tests/gen_rx-pm.pl]) AC_CONFIG_FILES([tests/csv_rx-pm.pl], [chmod +x tests/csv_rx-pm.pl]) AC_CONFIG_FILES([tests/regression/server_root/conf/httpd.conf]) # Perl based tools AC_CONFIG_FILES([tools/rules-updater.pl], [chmod +x tools/rules-updater.pl]) fi if test "$build_mlogc" -ne 0; then AC_CONFIG_FILES([mlogc/Makefile]) fi AC_CONFIG_FILES([tests/Makefile]) AC_OUTPUT modsecurity-2.9.5/stamp-h10000664000175000017500000000005014147005233016567 0ustar mhsvierulamhsvierulatimestamp for modsecurity_config_auto.h modsecurity-2.9.5/tests/0000775000175000017500000000000014147005251016361 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/gen_rx-pm.pl.in0000775000175000017500000000354214147005233021226 0ustar mhsvierulamhsvierula#!@PERL@ # # Generates a test file for comparing @rx and @pm speed. # use strict; use Regexp::Assemble; srand(424242); # We want this static, so we can compare different runs my $MIN = $ARGV[0] || 0; my $MAX = $ARGV[1] || 5000; my $INC = $ARGV[2] || int($MAX * .05); my $ITERATIONS = 10000; my $MINSTRLEN = 2; my $MAXSTRLEN = 8; my $match = join '', ('a' .. 'z'); my @param = (); my $i=$MIN; while ($i <= $MAX) { my $ra = Regexp::Assemble->new; while (@param < $i) { unshift @param, rndstr(); } $ra->add(@param); printf ( "# rx: %6d\n". "{\n". " comment => \"rx1 %6d item(s)\",\n". " type => \"op\",\n". " name => \"rx\",\n". " param => qr/%s/,\n". " input => \"%s\",\n". " ret => " . (@param ? 0 : 1) . ",". " iterations => %d,\n". "},\n", $i, $i, (@param ? '(?:' . join('|', @param) . ')' : ""), $match, $ITERATIONS, ); printf ( "# rx-optimized: %6d\n". "{\n". " comment => \"rx2 %6d item(s)\",\n". " type => \"op\",\n". " name => \"rx\",\n". " param => qr/%s/,\n". " input => \"%s\",\n". " ret => " . (@param ? 0 : 1) . ",". " iterations => %d,\n". "},\n", $i, $i, (@param ? $ra->as_string : ""), $match, $ITERATIONS, ); printf ( "# pm: %6d\n". "{\n". " comment => \"pm1 %6d item(s)\",\n". " type => \"op\",\n". " name => \"pm\",\n". " param => \"%s\",\n". " input => \"%s\",\n". " ret => 0,". " iterations => %d,\n". "},\n", $i, $i, join(' ', @param ? @param : ("''")), $match, $ITERATIONS, ); $i = ($i == $MIN) ? ($i + $INC) - ($i % $INC) : $i + $INC; } sub rndstr { my @c = ('a' .. 'z'); my $rndstr; my $max = int(rand($MAXSTRLEN - $MINSTRLEN)) + $MINSTRLEN; foreach (1 .. $max) { $rndstr .= $c[rand @c]; } # We need a string that is not in another string for "last" if ($match =~ m/$rndstr/) { $rndstr = rndstr(); } return $rndstr; } modsecurity-2.9.5/tests/Makefile.am0000664000175000017500000000404614147005233020421 0ustar mhsvierulamhsvierulacheck_PROGRAMS = msc_test msc_test_SOURCES = msc_test.c \ ../apache2/acmp.c \ ../apache2/libinjection/libinjection_html5.c \ ../apache2/libinjection/libinjection_sqli.c \ ../apache2/libinjection/libinjection_xss.c \ ../apache2/modsecurity.c \ ../apache2/msc_status_engine.c \ ../apache2/msc_remote_rules.c \ ../apache2/msc_crypt.c \ ../apache2/msc_geo.c \ ../apache2/msc_gsb.c \ ../apache2/msc_json.c \ ../apache2/msc_logging.c \ ../apache2/msc_lua.c \ ../apache2/msc_multipart.c \ ../apache2/msc_parsers.c \ ../apache2/msc_pcre.c \ ../apache2/msc_release.c \ ../apache2/msc_reqbody.c \ ../apache2/msc_tree.c \ ../apache2/msc_unicode.c \ ../apache2/msc_util.c \ ../apache2/msc_xml.c \ ../apache2/persist_dbm.c \ ../apache2/re_actions.c \ ../apache2/re.c \ ../apache2/re_operators.c \ ../apache2/re_tfns.c \ ../apache2/re_variables.c \ ../standalone/regex.c \ ../standalone/server.c \ ../standalone/config.c msc_test_CFLAGS = @APR_CFLAGS@ \ @APU_CFLAGS@ \ @APXS_CFLAGS@ \ @CURL_CFLAGS@ \ @LIBXML2_CFLAGS@ \ @LUA_CFLAGS@ \ @MODSEC_EXTRA_CFLAGS@ \ @PCRE_CFLAGS@ \ @YAJL_CFLAGS@ \ @SSDEEP_CFLAGS@ msc_test_CPPFLAGS = -I$(top_srcdir)/apache2 \ @APR_CPPFLAGS@ \ @CURL_CPPFLAGS@ \ @LIBXML2_CFLAGS@ \ @LIBXML2_CPPFLAGS@ \ @PCRE_CPPFLAGS@ msc_test_LDADD = @APR_LDADD@ \ @APU_LDADD@ \ @CURL_LDADD@ \ @LIBXML2_CFLAGS@ \ @LIBXML2_LDADD@ \ @LUA_LDADD@ \ @PCRE_LDADD@ \ @YAJL_LDADD@ \ @SSDEEP_CFLAGS@ msc_test_LDFLAGS = @APR_LDFLAGS@ \ @APU_LDFLAGS@ \ @APXS_LDFLAGS@ \ @CURL_LDFLAGS@ \ @LIBXML2_LDFLAGS@ \ @LUA_LDFLAGS@ \ @PCRE_LDFLAGS@ \ @YAJL_LDFLAGS@ \ @SSDEEP_LDFLAGS@ check_SCRIPTS = run-unit-tests.pl TESTS = $(check_SCRIPTS) test: check test-regression: run-regression-tests.pl $(PERL) run-regression-tests.pl test-regression-nginx: run-regression-tests-nginx.pl $(PERL) run-regression-tests-nginx.pl .PHONY: test test-regression modsecurity-2.9.5/tests/Makefile.in0000664000175000017500000035014014147005251020431 0ustar mhsvierulamhsvierula# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = msc_test$(EXEEXT) subdir = tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/find_apr.m4 \ $(top_srcdir)/build/find_apu.m4 \ $(top_srcdir)/build/find_curl.m4 \ $(top_srcdir)/build/find_lua.m4 \ $(top_srcdir)/build/find_pcre.m4 \ $(top_srcdir)/build/find_ssdeep.m4 \ $(top_srcdir)/build/find_xml.m4 \ $(top_srcdir)/build/find_yajl.m4 \ $(top_srcdir)/build/libtool.m4 \ $(top_srcdir)/build/ltoptions.m4 \ $(top_srcdir)/build/ltsugar.m4 \ $(top_srcdir)/build/ltversion.m4 \ $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/apache2/modsecurity_config_auto.h CONFIG_CLEAN_FILES = run-unit-tests.pl run-regression-tests.pl \ gen_rx-pm.pl csv_rx-pm.pl CONFIG_CLEAN_VPATH_FILES = am__dirstamp = $(am__leading_dot)dirstamp am_msc_test_OBJECTS = msc_test-msc_test.$(OBJEXT) \ ../apache2/msc_test-acmp.$(OBJEXT) \ ../apache2/libinjection/msc_test-libinjection_html5.$(OBJEXT) \ ../apache2/libinjection/msc_test-libinjection_sqli.$(OBJEXT) \ ../apache2/libinjection/msc_test-libinjection_xss.$(OBJEXT) \ ../apache2/msc_test-modsecurity.$(OBJEXT) \ ../apache2/msc_test-msc_status_engine.$(OBJEXT) \ ../apache2/msc_test-msc_remote_rules.$(OBJEXT) \ ../apache2/msc_test-msc_crypt.$(OBJEXT) \ ../apache2/msc_test-msc_geo.$(OBJEXT) \ ../apache2/msc_test-msc_gsb.$(OBJEXT) \ ../apache2/msc_test-msc_json.$(OBJEXT) \ ../apache2/msc_test-msc_logging.$(OBJEXT) \ ../apache2/msc_test-msc_lua.$(OBJEXT) \ ../apache2/msc_test-msc_multipart.$(OBJEXT) \ ../apache2/msc_test-msc_parsers.$(OBJEXT) \ ../apache2/msc_test-msc_pcre.$(OBJEXT) \ ../apache2/msc_test-msc_release.$(OBJEXT) \ ../apache2/msc_test-msc_reqbody.$(OBJEXT) \ ../apache2/msc_test-msc_tree.$(OBJEXT) \ ../apache2/msc_test-msc_unicode.$(OBJEXT) \ ../apache2/msc_test-msc_util.$(OBJEXT) \ ../apache2/msc_test-msc_xml.$(OBJEXT) \ ../apache2/msc_test-persist_dbm.$(OBJEXT) \ ../apache2/msc_test-re_actions.$(OBJEXT) \ ../apache2/msc_test-re.$(OBJEXT) \ ../apache2/msc_test-re_operators.$(OBJEXT) \ ../apache2/msc_test-re_tfns.$(OBJEXT) \ ../apache2/msc_test-re_variables.$(OBJEXT) \ ../standalone/msc_test-regex.$(OBJEXT) \ ../standalone/msc_test-server.$(OBJEXT) \ ../standalone/msc_test-config.$(OBJEXT) msc_test_OBJECTS = $(am_msc_test_OBJECTS) msc_test_DEPENDENCIES = AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = msc_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(msc_test_CFLAGS) \ $(CFLAGS) $(msc_test_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/apache2 depcomp = $(SHELL) $(top_srcdir)/build/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(msc_test_SOURCES) DIST_SOURCES = $(msc_test_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/csv_rx-pm.pl.in \ $(srcdir)/gen_rx-pm.pl.in $(srcdir)/run-regression-tests.pl.in \ $(srcdir)/run-unit-tests.pl.in $(top_srcdir)/build/depcomp \ $(top_srcdir)/build/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APR_CFLAGS = @APR_CFLAGS@ APR_CONFIG = @APR_CONFIG@ APR_CPPFLAGS = @APR_CPPFLAGS@ APR_INCLUDEDIR = @APR_INCLUDEDIR@ APR_LDADD = @APR_LDADD@ APR_LDFLAGS = @APR_LDFLAGS@ APR_LINKLD = @APR_LINKLD@ APR_VERSION = @APR_VERSION@ APU_CFLAGS = @APU_CFLAGS@ APU_CONFIG = @APU_CONFIG@ APU_INCLUDEDIR = @APU_INCLUDEDIR@ APU_LDADD = @APU_LDADD@ APU_LDFLAGS = @APU_LDFLAGS@ APU_LINKLD = @APU_LINKLD@ APU_VERSION = @APU_VERSION@ APXS = @APXS@ APXS_BINDIR = @APXS_BINDIR@ APXS_CC = @APXS_CC@ APXS_CFLAGS = @APXS_CFLAGS@ APXS_EXTRA_CFLAGS = @APXS_EXTRA_CFLAGS@ APXS_HTTPD = @APXS_HTTPD@ APXS_INCLUDEDIR = @APXS_INCLUDEDIR@ APXS_INCLUDES = @APXS_INCLUDES@ APXS_LDFLAGS = @APXS_LDFLAGS@ APXS_LIBDIR = @APXS_LIBDIR@ APXS_LIBEXECDIR = @APXS_LIBEXECDIR@ APXS_LIBS = @APXS_LIBS@ APXS_LIBTOOL = @APXS_LIBTOOL@ APXS_MODULES = @APXS_MODULES@ APXS_PROGNAME = @APXS_PROGNAME@ APXS_SBINDIR = @APXS_SBINDIR@ APXS_WRAPPER = @APXS_WRAPPER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_CPPFLAGS = @CURL_CPPFLAGS@ CURL_LDADD = @CURL_LDADD@ CURL_LDFLAGS = @CURL_LDFLAGS@ CURL_USES_GNUTLS = @CURL_USES_GNUTLS@ CURL_VERSION = @CURL_VERSION@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENV_CMD = @ENV_CMD@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ LIBXML2_CONFIG = @LIBXML2_CONFIG@ LIBXML2_CPPFLAGS = @LIBXML2_CPPFLAGS@ LIBXML2_LDADD = @LIBXML2_LDADD@ LIBXML2_LDFLAGS = @LIBXML2_LDFLAGS@ LIBXML2_VERSION = @LIBXML2_VERSION@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LDADD = @LUA_LDADD@ LUA_LDFLAGS = @LUA_LDFLAGS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MODSEC_APXS_EXTRA_CFLAGS = @MODSEC_APXS_EXTRA_CFLAGS@ MODSEC_EXTRA_CFLAGS = @MODSEC_EXTRA_CFLAGS@ MSC_BASE_DIR = @MSC_BASE_DIR@ MSC_PKGBASE_DIR = @MSC_PKGBASE_DIR@ MSC_REGRESSION_CONF_DIR = @MSC_REGRESSION_CONF_DIR@ MSC_REGRESSION_DIR = @MSC_REGRESSION_DIR@ MSC_REGRESSION_DOCROOT_DIR = @MSC_REGRESSION_DOCROOT_DIR@ MSC_REGRESSION_LOGS_DIR = @MSC_REGRESSION_LOGS_DIR@ MSC_REGRESSION_SERVERROOT_DIR = @MSC_REGRESSION_SERVERROOT_DIR@ MSC_TEST_DIR = @MSC_TEST_DIR@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCRE_CFLAGS = @PCRE_CFLAGS@ PCRE_CONFIG = @PCRE_CONFIG@ PCRE_CPPFLAGS = @PCRE_CPPFLAGS@ PCRE_LDADD = @PCRE_LDADD@ PCRE_LDFLAGS = @PCRE_LDFLAGS@ PCRE_LD_PATH = @PCRE_LD_PATH@ PCRE_VERSION = @PCRE_VERSION@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSDEEP_CFLAGS = @SSDEEP_CFLAGS@ SSDEEP_LDADD = @SSDEEP_LDADD@ SSDEEP_LDFLAGS = @SSDEEP_LDFLAGS@ STRIP = @STRIP@ TOPLEVEL_SUBDIRS = @TOPLEVEL_SUBDIRS@ VERSION = @VERSION@ YAJL_CFLAGS = @YAJL_CFLAGS@ YAJL_LDADD = @YAJL_LDADD@ YAJL_LDFLAGS = @YAJL_LDFLAGS@ YAJL_LIBS = @YAJL_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ msc_test_SOURCES = msc_test.c \ ../apache2/acmp.c \ ../apache2/libinjection/libinjection_html5.c \ ../apache2/libinjection/libinjection_sqli.c \ ../apache2/libinjection/libinjection_xss.c \ ../apache2/modsecurity.c \ ../apache2/msc_status_engine.c \ ../apache2/msc_remote_rules.c \ ../apache2/msc_crypt.c \ ../apache2/msc_geo.c \ ../apache2/msc_gsb.c \ ../apache2/msc_json.c \ ../apache2/msc_logging.c \ ../apache2/msc_lua.c \ ../apache2/msc_multipart.c \ ../apache2/msc_parsers.c \ ../apache2/msc_pcre.c \ ../apache2/msc_release.c \ ../apache2/msc_reqbody.c \ ../apache2/msc_tree.c \ ../apache2/msc_unicode.c \ ../apache2/msc_util.c \ ../apache2/msc_xml.c \ ../apache2/persist_dbm.c \ ../apache2/re_actions.c \ ../apache2/re.c \ ../apache2/re_operators.c \ ../apache2/re_tfns.c \ ../apache2/re_variables.c \ ../standalone/regex.c \ ../standalone/server.c \ ../standalone/config.c msc_test_CFLAGS = @APR_CFLAGS@ \ @APU_CFLAGS@ \ @APXS_CFLAGS@ \ @CURL_CFLAGS@ \ @LIBXML2_CFLAGS@ \ @LUA_CFLAGS@ \ @MODSEC_EXTRA_CFLAGS@ \ @PCRE_CFLAGS@ \ @YAJL_CFLAGS@ \ @SSDEEP_CFLAGS@ msc_test_CPPFLAGS = -I$(top_srcdir)/apache2 \ @APR_CPPFLAGS@ \ @CURL_CPPFLAGS@ \ @LIBXML2_CFLAGS@ \ @LIBXML2_CPPFLAGS@ \ @PCRE_CPPFLAGS@ msc_test_LDADD = @APR_LDADD@ \ @APU_LDADD@ \ @CURL_LDADD@ \ @LIBXML2_CFLAGS@ \ @LIBXML2_LDADD@ \ @LUA_LDADD@ \ @PCRE_LDADD@ \ @YAJL_LDADD@ \ @SSDEEP_CFLAGS@ msc_test_LDFLAGS = @APR_LDFLAGS@ \ @APU_LDFLAGS@ \ @APXS_LDFLAGS@ \ @CURL_LDFLAGS@ \ @LIBXML2_LDFLAGS@ \ @LUA_LDFLAGS@ \ @PCRE_LDFLAGS@ \ @YAJL_LDFLAGS@ \ @SSDEEP_LDFLAGS@ check_SCRIPTS = run-unit-tests.pl TESTS = $(check_SCRIPTS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): run-unit-tests.pl: $(top_builddir)/config.status $(srcdir)/run-unit-tests.pl.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ run-regression-tests.pl: $(top_builddir)/config.status $(srcdir)/run-regression-tests.pl.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ gen_rx-pm.pl: $(top_builddir)/config.status $(srcdir)/gen_rx-pm.pl.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ csv_rx-pm.pl: $(top_builddir)/config.status $(srcdir)/csv_rx-pm.pl.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list ../apache2/$(am__dirstamp): @$(MKDIR_P) ../apache2 @: > ../apache2/$(am__dirstamp) ../apache2/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ../apache2/$(DEPDIR) @: > ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-acmp.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/libinjection/$(am__dirstamp): @$(MKDIR_P) ../apache2/libinjection @: > ../apache2/libinjection/$(am__dirstamp) ../apache2/libinjection/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ../apache2/libinjection/$(DEPDIR) @: > ../apache2/libinjection/$(DEPDIR)/$(am__dirstamp) ../apache2/libinjection/msc_test-libinjection_html5.$(OBJEXT): \ ../apache2/libinjection/$(am__dirstamp) \ ../apache2/libinjection/$(DEPDIR)/$(am__dirstamp) ../apache2/libinjection/msc_test-libinjection_sqli.$(OBJEXT): \ ../apache2/libinjection/$(am__dirstamp) \ ../apache2/libinjection/$(DEPDIR)/$(am__dirstamp) ../apache2/libinjection/msc_test-libinjection_xss.$(OBJEXT): \ ../apache2/libinjection/$(am__dirstamp) \ ../apache2/libinjection/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-modsecurity.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-msc_status_engine.$(OBJEXT): \ ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-msc_remote_rules.$(OBJEXT): \ ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-msc_crypt.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-msc_geo.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-msc_gsb.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-msc_json.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-msc_logging.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-msc_lua.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-msc_multipart.$(OBJEXT): \ ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-msc_parsers.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-msc_pcre.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-msc_release.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-msc_reqbody.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-msc_tree.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-msc_unicode.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-msc_util.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-msc_xml.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-persist_dbm.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-re_actions.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-re.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-re_operators.$(OBJEXT): \ ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-re_tfns.$(OBJEXT): ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../apache2/msc_test-re_variables.$(OBJEXT): \ ../apache2/$(am__dirstamp) \ ../apache2/$(DEPDIR)/$(am__dirstamp) ../standalone/$(am__dirstamp): @$(MKDIR_P) ../standalone @: > ../standalone/$(am__dirstamp) ../standalone/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ../standalone/$(DEPDIR) @: > ../standalone/$(DEPDIR)/$(am__dirstamp) ../standalone/msc_test-regex.$(OBJEXT): ../standalone/$(am__dirstamp) \ ../standalone/$(DEPDIR)/$(am__dirstamp) ../standalone/msc_test-server.$(OBJEXT): \ ../standalone/$(am__dirstamp) \ ../standalone/$(DEPDIR)/$(am__dirstamp) ../standalone/msc_test-config.$(OBJEXT): \ ../standalone/$(am__dirstamp) \ ../standalone/$(DEPDIR)/$(am__dirstamp) msc_test$(EXEEXT): $(msc_test_OBJECTS) $(msc_test_DEPENDENCIES) $(EXTRA_msc_test_DEPENDENCIES) @rm -f msc_test$(EXEEXT) $(AM_V_CCLD)$(msc_test_LINK) $(msc_test_OBJECTS) $(msc_test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f ../apache2/*.$(OBJEXT) -rm -f ../apache2/libinjection/*.$(OBJEXT) -rm -f ../standalone/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-acmp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-modsecurity.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-msc_crypt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-msc_geo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-msc_gsb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-msc_json.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-msc_logging.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-msc_lua.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-msc_multipart.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-msc_parsers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-msc_pcre.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-msc_release.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-msc_remote_rules.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-msc_reqbody.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-msc_status_engine.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-msc_tree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-msc_unicode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-msc_util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-msc_xml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-persist_dbm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-re.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-re_actions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-re_operators.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-re_tfns.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/$(DEPDIR)/msc_test-re_variables.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_html5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_sqli.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_xss.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../standalone/$(DEPDIR)/msc_test-config.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../standalone/$(DEPDIR)/msc_test-regex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@../standalone/$(DEPDIR)/msc_test-server.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msc_test-msc_test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< msc_test-msc_test.o: msc_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT msc_test-msc_test.o -MD -MP -MF $(DEPDIR)/msc_test-msc_test.Tpo -c -o msc_test-msc_test.o `test -f 'msc_test.c' || echo '$(srcdir)/'`msc_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/msc_test-msc_test.Tpo $(DEPDIR)/msc_test-msc_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='msc_test.c' object='msc_test-msc_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o msc_test-msc_test.o `test -f 'msc_test.c' || echo '$(srcdir)/'`msc_test.c msc_test-msc_test.obj: msc_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT msc_test-msc_test.obj -MD -MP -MF $(DEPDIR)/msc_test-msc_test.Tpo -c -o msc_test-msc_test.obj `if test -f 'msc_test.c'; then $(CYGPATH_W) 'msc_test.c'; else $(CYGPATH_W) '$(srcdir)/msc_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/msc_test-msc_test.Tpo $(DEPDIR)/msc_test-msc_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='msc_test.c' object='msc_test-msc_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o msc_test-msc_test.obj `if test -f 'msc_test.c'; then $(CYGPATH_W) 'msc_test.c'; else $(CYGPATH_W) '$(srcdir)/msc_test.c'; fi` ../apache2/msc_test-acmp.o: ../apache2/acmp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-acmp.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-acmp.Tpo -c -o ../apache2/msc_test-acmp.o `test -f '../apache2/acmp.c' || echo '$(srcdir)/'`../apache2/acmp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-acmp.Tpo ../apache2/$(DEPDIR)/msc_test-acmp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/acmp.c' object='../apache2/msc_test-acmp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-acmp.o `test -f '../apache2/acmp.c' || echo '$(srcdir)/'`../apache2/acmp.c ../apache2/msc_test-acmp.obj: ../apache2/acmp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-acmp.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-acmp.Tpo -c -o ../apache2/msc_test-acmp.obj `if test -f '../apache2/acmp.c'; then $(CYGPATH_W) '../apache2/acmp.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/acmp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-acmp.Tpo ../apache2/$(DEPDIR)/msc_test-acmp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/acmp.c' object='../apache2/msc_test-acmp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-acmp.obj `if test -f '../apache2/acmp.c'; then $(CYGPATH_W) '../apache2/acmp.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/acmp.c'; fi` ../apache2/libinjection/msc_test-libinjection_html5.o: ../apache2/libinjection/libinjection_html5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/libinjection/msc_test-libinjection_html5.o -MD -MP -MF ../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_html5.Tpo -c -o ../apache2/libinjection/msc_test-libinjection_html5.o `test -f '../apache2/libinjection/libinjection_html5.c' || echo '$(srcdir)/'`../apache2/libinjection/libinjection_html5.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_html5.Tpo ../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_html5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/libinjection/libinjection_html5.c' object='../apache2/libinjection/msc_test-libinjection_html5.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/libinjection/msc_test-libinjection_html5.o `test -f '../apache2/libinjection/libinjection_html5.c' || echo '$(srcdir)/'`../apache2/libinjection/libinjection_html5.c ../apache2/libinjection/msc_test-libinjection_html5.obj: ../apache2/libinjection/libinjection_html5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/libinjection/msc_test-libinjection_html5.obj -MD -MP -MF ../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_html5.Tpo -c -o ../apache2/libinjection/msc_test-libinjection_html5.obj `if test -f '../apache2/libinjection/libinjection_html5.c'; then $(CYGPATH_W) '../apache2/libinjection/libinjection_html5.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/libinjection/libinjection_html5.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_html5.Tpo ../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_html5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/libinjection/libinjection_html5.c' object='../apache2/libinjection/msc_test-libinjection_html5.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/libinjection/msc_test-libinjection_html5.obj `if test -f '../apache2/libinjection/libinjection_html5.c'; then $(CYGPATH_W) '../apache2/libinjection/libinjection_html5.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/libinjection/libinjection_html5.c'; fi` ../apache2/libinjection/msc_test-libinjection_sqli.o: ../apache2/libinjection/libinjection_sqli.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/libinjection/msc_test-libinjection_sqli.o -MD -MP -MF ../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_sqli.Tpo -c -o ../apache2/libinjection/msc_test-libinjection_sqli.o `test -f '../apache2/libinjection/libinjection_sqli.c' || echo '$(srcdir)/'`../apache2/libinjection/libinjection_sqli.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_sqli.Tpo ../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_sqli.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/libinjection/libinjection_sqli.c' object='../apache2/libinjection/msc_test-libinjection_sqli.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/libinjection/msc_test-libinjection_sqli.o `test -f '../apache2/libinjection/libinjection_sqli.c' || echo '$(srcdir)/'`../apache2/libinjection/libinjection_sqli.c ../apache2/libinjection/msc_test-libinjection_sqli.obj: ../apache2/libinjection/libinjection_sqli.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/libinjection/msc_test-libinjection_sqli.obj -MD -MP -MF ../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_sqli.Tpo -c -o ../apache2/libinjection/msc_test-libinjection_sqli.obj `if test -f '../apache2/libinjection/libinjection_sqli.c'; then $(CYGPATH_W) '../apache2/libinjection/libinjection_sqli.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/libinjection/libinjection_sqli.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_sqli.Tpo ../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_sqli.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/libinjection/libinjection_sqli.c' object='../apache2/libinjection/msc_test-libinjection_sqli.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/libinjection/msc_test-libinjection_sqli.obj `if test -f '../apache2/libinjection/libinjection_sqli.c'; then $(CYGPATH_W) '../apache2/libinjection/libinjection_sqli.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/libinjection/libinjection_sqli.c'; fi` ../apache2/libinjection/msc_test-libinjection_xss.o: ../apache2/libinjection/libinjection_xss.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/libinjection/msc_test-libinjection_xss.o -MD -MP -MF ../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_xss.Tpo -c -o ../apache2/libinjection/msc_test-libinjection_xss.o `test -f '../apache2/libinjection/libinjection_xss.c' || echo '$(srcdir)/'`../apache2/libinjection/libinjection_xss.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_xss.Tpo ../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_xss.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/libinjection/libinjection_xss.c' object='../apache2/libinjection/msc_test-libinjection_xss.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/libinjection/msc_test-libinjection_xss.o `test -f '../apache2/libinjection/libinjection_xss.c' || echo '$(srcdir)/'`../apache2/libinjection/libinjection_xss.c ../apache2/libinjection/msc_test-libinjection_xss.obj: ../apache2/libinjection/libinjection_xss.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/libinjection/msc_test-libinjection_xss.obj -MD -MP -MF ../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_xss.Tpo -c -o ../apache2/libinjection/msc_test-libinjection_xss.obj `if test -f '../apache2/libinjection/libinjection_xss.c'; then $(CYGPATH_W) '../apache2/libinjection/libinjection_xss.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/libinjection/libinjection_xss.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_xss.Tpo ../apache2/libinjection/$(DEPDIR)/msc_test-libinjection_xss.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/libinjection/libinjection_xss.c' object='../apache2/libinjection/msc_test-libinjection_xss.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/libinjection/msc_test-libinjection_xss.obj `if test -f '../apache2/libinjection/libinjection_xss.c'; then $(CYGPATH_W) '../apache2/libinjection/libinjection_xss.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/libinjection/libinjection_xss.c'; fi` ../apache2/msc_test-modsecurity.o: ../apache2/modsecurity.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-modsecurity.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-modsecurity.Tpo -c -o ../apache2/msc_test-modsecurity.o `test -f '../apache2/modsecurity.c' || echo '$(srcdir)/'`../apache2/modsecurity.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-modsecurity.Tpo ../apache2/$(DEPDIR)/msc_test-modsecurity.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/modsecurity.c' object='../apache2/msc_test-modsecurity.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-modsecurity.o `test -f '../apache2/modsecurity.c' || echo '$(srcdir)/'`../apache2/modsecurity.c ../apache2/msc_test-modsecurity.obj: ../apache2/modsecurity.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-modsecurity.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-modsecurity.Tpo -c -o ../apache2/msc_test-modsecurity.obj `if test -f '../apache2/modsecurity.c'; then $(CYGPATH_W) '../apache2/modsecurity.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/modsecurity.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-modsecurity.Tpo ../apache2/$(DEPDIR)/msc_test-modsecurity.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/modsecurity.c' object='../apache2/msc_test-modsecurity.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-modsecurity.obj `if test -f '../apache2/modsecurity.c'; then $(CYGPATH_W) '../apache2/modsecurity.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/modsecurity.c'; fi` ../apache2/msc_test-msc_status_engine.o: ../apache2/msc_status_engine.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_status_engine.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_status_engine.Tpo -c -o ../apache2/msc_test-msc_status_engine.o `test -f '../apache2/msc_status_engine.c' || echo '$(srcdir)/'`../apache2/msc_status_engine.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_status_engine.Tpo ../apache2/$(DEPDIR)/msc_test-msc_status_engine.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_status_engine.c' object='../apache2/msc_test-msc_status_engine.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_status_engine.o `test -f '../apache2/msc_status_engine.c' || echo '$(srcdir)/'`../apache2/msc_status_engine.c ../apache2/msc_test-msc_status_engine.obj: ../apache2/msc_status_engine.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_status_engine.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_status_engine.Tpo -c -o ../apache2/msc_test-msc_status_engine.obj `if test -f '../apache2/msc_status_engine.c'; then $(CYGPATH_W) '../apache2/msc_status_engine.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_status_engine.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_status_engine.Tpo ../apache2/$(DEPDIR)/msc_test-msc_status_engine.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_status_engine.c' object='../apache2/msc_test-msc_status_engine.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_status_engine.obj `if test -f '../apache2/msc_status_engine.c'; then $(CYGPATH_W) '../apache2/msc_status_engine.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_status_engine.c'; fi` ../apache2/msc_test-msc_remote_rules.o: ../apache2/msc_remote_rules.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_remote_rules.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_remote_rules.Tpo -c -o ../apache2/msc_test-msc_remote_rules.o `test -f '../apache2/msc_remote_rules.c' || echo '$(srcdir)/'`../apache2/msc_remote_rules.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_remote_rules.Tpo ../apache2/$(DEPDIR)/msc_test-msc_remote_rules.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_remote_rules.c' object='../apache2/msc_test-msc_remote_rules.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_remote_rules.o `test -f '../apache2/msc_remote_rules.c' || echo '$(srcdir)/'`../apache2/msc_remote_rules.c ../apache2/msc_test-msc_remote_rules.obj: ../apache2/msc_remote_rules.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_remote_rules.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_remote_rules.Tpo -c -o ../apache2/msc_test-msc_remote_rules.obj `if test -f '../apache2/msc_remote_rules.c'; then $(CYGPATH_W) '../apache2/msc_remote_rules.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_remote_rules.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_remote_rules.Tpo ../apache2/$(DEPDIR)/msc_test-msc_remote_rules.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_remote_rules.c' object='../apache2/msc_test-msc_remote_rules.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_remote_rules.obj `if test -f '../apache2/msc_remote_rules.c'; then $(CYGPATH_W) '../apache2/msc_remote_rules.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_remote_rules.c'; fi` ../apache2/msc_test-msc_crypt.o: ../apache2/msc_crypt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_crypt.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_crypt.Tpo -c -o ../apache2/msc_test-msc_crypt.o `test -f '../apache2/msc_crypt.c' || echo '$(srcdir)/'`../apache2/msc_crypt.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_crypt.Tpo ../apache2/$(DEPDIR)/msc_test-msc_crypt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_crypt.c' object='../apache2/msc_test-msc_crypt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_crypt.o `test -f '../apache2/msc_crypt.c' || echo '$(srcdir)/'`../apache2/msc_crypt.c ../apache2/msc_test-msc_crypt.obj: ../apache2/msc_crypt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_crypt.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_crypt.Tpo -c -o ../apache2/msc_test-msc_crypt.obj `if test -f '../apache2/msc_crypt.c'; then $(CYGPATH_W) '../apache2/msc_crypt.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_crypt.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_crypt.Tpo ../apache2/$(DEPDIR)/msc_test-msc_crypt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_crypt.c' object='../apache2/msc_test-msc_crypt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_crypt.obj `if test -f '../apache2/msc_crypt.c'; then $(CYGPATH_W) '../apache2/msc_crypt.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_crypt.c'; fi` ../apache2/msc_test-msc_geo.o: ../apache2/msc_geo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_geo.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_geo.Tpo -c -o ../apache2/msc_test-msc_geo.o `test -f '../apache2/msc_geo.c' || echo '$(srcdir)/'`../apache2/msc_geo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_geo.Tpo ../apache2/$(DEPDIR)/msc_test-msc_geo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_geo.c' object='../apache2/msc_test-msc_geo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_geo.o `test -f '../apache2/msc_geo.c' || echo '$(srcdir)/'`../apache2/msc_geo.c ../apache2/msc_test-msc_geo.obj: ../apache2/msc_geo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_geo.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_geo.Tpo -c -o ../apache2/msc_test-msc_geo.obj `if test -f '../apache2/msc_geo.c'; then $(CYGPATH_W) '../apache2/msc_geo.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_geo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_geo.Tpo ../apache2/$(DEPDIR)/msc_test-msc_geo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_geo.c' object='../apache2/msc_test-msc_geo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_geo.obj `if test -f '../apache2/msc_geo.c'; then $(CYGPATH_W) '../apache2/msc_geo.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_geo.c'; fi` ../apache2/msc_test-msc_gsb.o: ../apache2/msc_gsb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_gsb.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_gsb.Tpo -c -o ../apache2/msc_test-msc_gsb.o `test -f '../apache2/msc_gsb.c' || echo '$(srcdir)/'`../apache2/msc_gsb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_gsb.Tpo ../apache2/$(DEPDIR)/msc_test-msc_gsb.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_gsb.c' object='../apache2/msc_test-msc_gsb.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_gsb.o `test -f '../apache2/msc_gsb.c' || echo '$(srcdir)/'`../apache2/msc_gsb.c ../apache2/msc_test-msc_gsb.obj: ../apache2/msc_gsb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_gsb.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_gsb.Tpo -c -o ../apache2/msc_test-msc_gsb.obj `if test -f '../apache2/msc_gsb.c'; then $(CYGPATH_W) '../apache2/msc_gsb.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_gsb.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_gsb.Tpo ../apache2/$(DEPDIR)/msc_test-msc_gsb.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_gsb.c' object='../apache2/msc_test-msc_gsb.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_gsb.obj `if test -f '../apache2/msc_gsb.c'; then $(CYGPATH_W) '../apache2/msc_gsb.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_gsb.c'; fi` ../apache2/msc_test-msc_json.o: ../apache2/msc_json.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_json.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_json.Tpo -c -o ../apache2/msc_test-msc_json.o `test -f '../apache2/msc_json.c' || echo '$(srcdir)/'`../apache2/msc_json.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_json.Tpo ../apache2/$(DEPDIR)/msc_test-msc_json.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_json.c' object='../apache2/msc_test-msc_json.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_json.o `test -f '../apache2/msc_json.c' || echo '$(srcdir)/'`../apache2/msc_json.c ../apache2/msc_test-msc_json.obj: ../apache2/msc_json.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_json.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_json.Tpo -c -o ../apache2/msc_test-msc_json.obj `if test -f '../apache2/msc_json.c'; then $(CYGPATH_W) '../apache2/msc_json.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_json.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_json.Tpo ../apache2/$(DEPDIR)/msc_test-msc_json.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_json.c' object='../apache2/msc_test-msc_json.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_json.obj `if test -f '../apache2/msc_json.c'; then $(CYGPATH_W) '../apache2/msc_json.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_json.c'; fi` ../apache2/msc_test-msc_logging.o: ../apache2/msc_logging.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_logging.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_logging.Tpo -c -o ../apache2/msc_test-msc_logging.o `test -f '../apache2/msc_logging.c' || echo '$(srcdir)/'`../apache2/msc_logging.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_logging.Tpo ../apache2/$(DEPDIR)/msc_test-msc_logging.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_logging.c' object='../apache2/msc_test-msc_logging.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_logging.o `test -f '../apache2/msc_logging.c' || echo '$(srcdir)/'`../apache2/msc_logging.c ../apache2/msc_test-msc_logging.obj: ../apache2/msc_logging.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_logging.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_logging.Tpo -c -o ../apache2/msc_test-msc_logging.obj `if test -f '../apache2/msc_logging.c'; then $(CYGPATH_W) '../apache2/msc_logging.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_logging.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_logging.Tpo ../apache2/$(DEPDIR)/msc_test-msc_logging.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_logging.c' object='../apache2/msc_test-msc_logging.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_logging.obj `if test -f '../apache2/msc_logging.c'; then $(CYGPATH_W) '../apache2/msc_logging.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_logging.c'; fi` ../apache2/msc_test-msc_lua.o: ../apache2/msc_lua.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_lua.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_lua.Tpo -c -o ../apache2/msc_test-msc_lua.o `test -f '../apache2/msc_lua.c' || echo '$(srcdir)/'`../apache2/msc_lua.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_lua.Tpo ../apache2/$(DEPDIR)/msc_test-msc_lua.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_lua.c' object='../apache2/msc_test-msc_lua.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_lua.o `test -f '../apache2/msc_lua.c' || echo '$(srcdir)/'`../apache2/msc_lua.c ../apache2/msc_test-msc_lua.obj: ../apache2/msc_lua.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_lua.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_lua.Tpo -c -o ../apache2/msc_test-msc_lua.obj `if test -f '../apache2/msc_lua.c'; then $(CYGPATH_W) '../apache2/msc_lua.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_lua.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_lua.Tpo ../apache2/$(DEPDIR)/msc_test-msc_lua.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_lua.c' object='../apache2/msc_test-msc_lua.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_lua.obj `if test -f '../apache2/msc_lua.c'; then $(CYGPATH_W) '../apache2/msc_lua.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_lua.c'; fi` ../apache2/msc_test-msc_multipart.o: ../apache2/msc_multipart.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_multipart.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_multipart.Tpo -c -o ../apache2/msc_test-msc_multipart.o `test -f '../apache2/msc_multipart.c' || echo '$(srcdir)/'`../apache2/msc_multipart.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_multipart.Tpo ../apache2/$(DEPDIR)/msc_test-msc_multipart.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_multipart.c' object='../apache2/msc_test-msc_multipart.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_multipart.o `test -f '../apache2/msc_multipart.c' || echo '$(srcdir)/'`../apache2/msc_multipart.c ../apache2/msc_test-msc_multipart.obj: ../apache2/msc_multipart.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_multipart.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_multipart.Tpo -c -o ../apache2/msc_test-msc_multipart.obj `if test -f '../apache2/msc_multipart.c'; then $(CYGPATH_W) '../apache2/msc_multipart.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_multipart.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_multipart.Tpo ../apache2/$(DEPDIR)/msc_test-msc_multipart.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_multipart.c' object='../apache2/msc_test-msc_multipart.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_multipart.obj `if test -f '../apache2/msc_multipart.c'; then $(CYGPATH_W) '../apache2/msc_multipart.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_multipart.c'; fi` ../apache2/msc_test-msc_parsers.o: ../apache2/msc_parsers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_parsers.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_parsers.Tpo -c -o ../apache2/msc_test-msc_parsers.o `test -f '../apache2/msc_parsers.c' || echo '$(srcdir)/'`../apache2/msc_parsers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_parsers.Tpo ../apache2/$(DEPDIR)/msc_test-msc_parsers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_parsers.c' object='../apache2/msc_test-msc_parsers.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_parsers.o `test -f '../apache2/msc_parsers.c' || echo '$(srcdir)/'`../apache2/msc_parsers.c ../apache2/msc_test-msc_parsers.obj: ../apache2/msc_parsers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_parsers.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_parsers.Tpo -c -o ../apache2/msc_test-msc_parsers.obj `if test -f '../apache2/msc_parsers.c'; then $(CYGPATH_W) '../apache2/msc_parsers.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_parsers.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_parsers.Tpo ../apache2/$(DEPDIR)/msc_test-msc_parsers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_parsers.c' object='../apache2/msc_test-msc_parsers.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_parsers.obj `if test -f '../apache2/msc_parsers.c'; then $(CYGPATH_W) '../apache2/msc_parsers.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_parsers.c'; fi` ../apache2/msc_test-msc_pcre.o: ../apache2/msc_pcre.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_pcre.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_pcre.Tpo -c -o ../apache2/msc_test-msc_pcre.o `test -f '../apache2/msc_pcre.c' || echo '$(srcdir)/'`../apache2/msc_pcre.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_pcre.Tpo ../apache2/$(DEPDIR)/msc_test-msc_pcre.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_pcre.c' object='../apache2/msc_test-msc_pcre.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_pcre.o `test -f '../apache2/msc_pcre.c' || echo '$(srcdir)/'`../apache2/msc_pcre.c ../apache2/msc_test-msc_pcre.obj: ../apache2/msc_pcre.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_pcre.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_pcre.Tpo -c -o ../apache2/msc_test-msc_pcre.obj `if test -f '../apache2/msc_pcre.c'; then $(CYGPATH_W) '../apache2/msc_pcre.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_pcre.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_pcre.Tpo ../apache2/$(DEPDIR)/msc_test-msc_pcre.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_pcre.c' object='../apache2/msc_test-msc_pcre.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_pcre.obj `if test -f '../apache2/msc_pcre.c'; then $(CYGPATH_W) '../apache2/msc_pcre.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_pcre.c'; fi` ../apache2/msc_test-msc_release.o: ../apache2/msc_release.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_release.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_release.Tpo -c -o ../apache2/msc_test-msc_release.o `test -f '../apache2/msc_release.c' || echo '$(srcdir)/'`../apache2/msc_release.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_release.Tpo ../apache2/$(DEPDIR)/msc_test-msc_release.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_release.c' object='../apache2/msc_test-msc_release.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_release.o `test -f '../apache2/msc_release.c' || echo '$(srcdir)/'`../apache2/msc_release.c ../apache2/msc_test-msc_release.obj: ../apache2/msc_release.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_release.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_release.Tpo -c -o ../apache2/msc_test-msc_release.obj `if test -f '../apache2/msc_release.c'; then $(CYGPATH_W) '../apache2/msc_release.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_release.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_release.Tpo ../apache2/$(DEPDIR)/msc_test-msc_release.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_release.c' object='../apache2/msc_test-msc_release.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_release.obj `if test -f '../apache2/msc_release.c'; then $(CYGPATH_W) '../apache2/msc_release.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_release.c'; fi` ../apache2/msc_test-msc_reqbody.o: ../apache2/msc_reqbody.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_reqbody.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_reqbody.Tpo -c -o ../apache2/msc_test-msc_reqbody.o `test -f '../apache2/msc_reqbody.c' || echo '$(srcdir)/'`../apache2/msc_reqbody.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_reqbody.Tpo ../apache2/$(DEPDIR)/msc_test-msc_reqbody.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_reqbody.c' object='../apache2/msc_test-msc_reqbody.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_reqbody.o `test -f '../apache2/msc_reqbody.c' || echo '$(srcdir)/'`../apache2/msc_reqbody.c ../apache2/msc_test-msc_reqbody.obj: ../apache2/msc_reqbody.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_reqbody.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_reqbody.Tpo -c -o ../apache2/msc_test-msc_reqbody.obj `if test -f '../apache2/msc_reqbody.c'; then $(CYGPATH_W) '../apache2/msc_reqbody.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_reqbody.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_reqbody.Tpo ../apache2/$(DEPDIR)/msc_test-msc_reqbody.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_reqbody.c' object='../apache2/msc_test-msc_reqbody.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_reqbody.obj `if test -f '../apache2/msc_reqbody.c'; then $(CYGPATH_W) '../apache2/msc_reqbody.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_reqbody.c'; fi` ../apache2/msc_test-msc_tree.o: ../apache2/msc_tree.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_tree.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_tree.Tpo -c -o ../apache2/msc_test-msc_tree.o `test -f '../apache2/msc_tree.c' || echo '$(srcdir)/'`../apache2/msc_tree.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_tree.Tpo ../apache2/$(DEPDIR)/msc_test-msc_tree.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_tree.c' object='../apache2/msc_test-msc_tree.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_tree.o `test -f '../apache2/msc_tree.c' || echo '$(srcdir)/'`../apache2/msc_tree.c ../apache2/msc_test-msc_tree.obj: ../apache2/msc_tree.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_tree.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_tree.Tpo -c -o ../apache2/msc_test-msc_tree.obj `if test -f '../apache2/msc_tree.c'; then $(CYGPATH_W) '../apache2/msc_tree.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_tree.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_tree.Tpo ../apache2/$(DEPDIR)/msc_test-msc_tree.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_tree.c' object='../apache2/msc_test-msc_tree.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_tree.obj `if test -f '../apache2/msc_tree.c'; then $(CYGPATH_W) '../apache2/msc_tree.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_tree.c'; fi` ../apache2/msc_test-msc_unicode.o: ../apache2/msc_unicode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_unicode.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_unicode.Tpo -c -o ../apache2/msc_test-msc_unicode.o `test -f '../apache2/msc_unicode.c' || echo '$(srcdir)/'`../apache2/msc_unicode.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_unicode.Tpo ../apache2/$(DEPDIR)/msc_test-msc_unicode.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_unicode.c' object='../apache2/msc_test-msc_unicode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_unicode.o `test -f '../apache2/msc_unicode.c' || echo '$(srcdir)/'`../apache2/msc_unicode.c ../apache2/msc_test-msc_unicode.obj: ../apache2/msc_unicode.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_unicode.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_unicode.Tpo -c -o ../apache2/msc_test-msc_unicode.obj `if test -f '../apache2/msc_unicode.c'; then $(CYGPATH_W) '../apache2/msc_unicode.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_unicode.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_unicode.Tpo ../apache2/$(DEPDIR)/msc_test-msc_unicode.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_unicode.c' object='../apache2/msc_test-msc_unicode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_unicode.obj `if test -f '../apache2/msc_unicode.c'; then $(CYGPATH_W) '../apache2/msc_unicode.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_unicode.c'; fi` ../apache2/msc_test-msc_util.o: ../apache2/msc_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_util.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_util.Tpo -c -o ../apache2/msc_test-msc_util.o `test -f '../apache2/msc_util.c' || echo '$(srcdir)/'`../apache2/msc_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_util.Tpo ../apache2/$(DEPDIR)/msc_test-msc_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_util.c' object='../apache2/msc_test-msc_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_util.o `test -f '../apache2/msc_util.c' || echo '$(srcdir)/'`../apache2/msc_util.c ../apache2/msc_test-msc_util.obj: ../apache2/msc_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_util.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_util.Tpo -c -o ../apache2/msc_test-msc_util.obj `if test -f '../apache2/msc_util.c'; then $(CYGPATH_W) '../apache2/msc_util.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_util.Tpo ../apache2/$(DEPDIR)/msc_test-msc_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_util.c' object='../apache2/msc_test-msc_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_util.obj `if test -f '../apache2/msc_util.c'; then $(CYGPATH_W) '../apache2/msc_util.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_util.c'; fi` ../apache2/msc_test-msc_xml.o: ../apache2/msc_xml.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_xml.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_xml.Tpo -c -o ../apache2/msc_test-msc_xml.o `test -f '../apache2/msc_xml.c' || echo '$(srcdir)/'`../apache2/msc_xml.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_xml.Tpo ../apache2/$(DEPDIR)/msc_test-msc_xml.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_xml.c' object='../apache2/msc_test-msc_xml.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_xml.o `test -f '../apache2/msc_xml.c' || echo '$(srcdir)/'`../apache2/msc_xml.c ../apache2/msc_test-msc_xml.obj: ../apache2/msc_xml.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-msc_xml.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-msc_xml.Tpo -c -o ../apache2/msc_test-msc_xml.obj `if test -f '../apache2/msc_xml.c'; then $(CYGPATH_W) '../apache2/msc_xml.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_xml.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-msc_xml.Tpo ../apache2/$(DEPDIR)/msc_test-msc_xml.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/msc_xml.c' object='../apache2/msc_test-msc_xml.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-msc_xml.obj `if test -f '../apache2/msc_xml.c'; then $(CYGPATH_W) '../apache2/msc_xml.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/msc_xml.c'; fi` ../apache2/msc_test-persist_dbm.o: ../apache2/persist_dbm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-persist_dbm.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-persist_dbm.Tpo -c -o ../apache2/msc_test-persist_dbm.o `test -f '../apache2/persist_dbm.c' || echo '$(srcdir)/'`../apache2/persist_dbm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-persist_dbm.Tpo ../apache2/$(DEPDIR)/msc_test-persist_dbm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/persist_dbm.c' object='../apache2/msc_test-persist_dbm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-persist_dbm.o `test -f '../apache2/persist_dbm.c' || echo '$(srcdir)/'`../apache2/persist_dbm.c ../apache2/msc_test-persist_dbm.obj: ../apache2/persist_dbm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-persist_dbm.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-persist_dbm.Tpo -c -o ../apache2/msc_test-persist_dbm.obj `if test -f '../apache2/persist_dbm.c'; then $(CYGPATH_W) '../apache2/persist_dbm.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/persist_dbm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-persist_dbm.Tpo ../apache2/$(DEPDIR)/msc_test-persist_dbm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/persist_dbm.c' object='../apache2/msc_test-persist_dbm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-persist_dbm.obj `if test -f '../apache2/persist_dbm.c'; then $(CYGPATH_W) '../apache2/persist_dbm.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/persist_dbm.c'; fi` ../apache2/msc_test-re_actions.o: ../apache2/re_actions.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-re_actions.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-re_actions.Tpo -c -o ../apache2/msc_test-re_actions.o `test -f '../apache2/re_actions.c' || echo '$(srcdir)/'`../apache2/re_actions.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-re_actions.Tpo ../apache2/$(DEPDIR)/msc_test-re_actions.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/re_actions.c' object='../apache2/msc_test-re_actions.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-re_actions.o `test -f '../apache2/re_actions.c' || echo '$(srcdir)/'`../apache2/re_actions.c ../apache2/msc_test-re_actions.obj: ../apache2/re_actions.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-re_actions.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-re_actions.Tpo -c -o ../apache2/msc_test-re_actions.obj `if test -f '../apache2/re_actions.c'; then $(CYGPATH_W) '../apache2/re_actions.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/re_actions.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-re_actions.Tpo ../apache2/$(DEPDIR)/msc_test-re_actions.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/re_actions.c' object='../apache2/msc_test-re_actions.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-re_actions.obj `if test -f '../apache2/re_actions.c'; then $(CYGPATH_W) '../apache2/re_actions.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/re_actions.c'; fi` ../apache2/msc_test-re.o: ../apache2/re.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-re.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-re.Tpo -c -o ../apache2/msc_test-re.o `test -f '../apache2/re.c' || echo '$(srcdir)/'`../apache2/re.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-re.Tpo ../apache2/$(DEPDIR)/msc_test-re.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/re.c' object='../apache2/msc_test-re.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-re.o `test -f '../apache2/re.c' || echo '$(srcdir)/'`../apache2/re.c ../apache2/msc_test-re.obj: ../apache2/re.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-re.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-re.Tpo -c -o ../apache2/msc_test-re.obj `if test -f '../apache2/re.c'; then $(CYGPATH_W) '../apache2/re.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/re.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-re.Tpo ../apache2/$(DEPDIR)/msc_test-re.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/re.c' object='../apache2/msc_test-re.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-re.obj `if test -f '../apache2/re.c'; then $(CYGPATH_W) '../apache2/re.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/re.c'; fi` ../apache2/msc_test-re_operators.o: ../apache2/re_operators.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-re_operators.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-re_operators.Tpo -c -o ../apache2/msc_test-re_operators.o `test -f '../apache2/re_operators.c' || echo '$(srcdir)/'`../apache2/re_operators.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-re_operators.Tpo ../apache2/$(DEPDIR)/msc_test-re_operators.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/re_operators.c' object='../apache2/msc_test-re_operators.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-re_operators.o `test -f '../apache2/re_operators.c' || echo '$(srcdir)/'`../apache2/re_operators.c ../apache2/msc_test-re_operators.obj: ../apache2/re_operators.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-re_operators.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-re_operators.Tpo -c -o ../apache2/msc_test-re_operators.obj `if test -f '../apache2/re_operators.c'; then $(CYGPATH_W) '../apache2/re_operators.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/re_operators.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-re_operators.Tpo ../apache2/$(DEPDIR)/msc_test-re_operators.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/re_operators.c' object='../apache2/msc_test-re_operators.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-re_operators.obj `if test -f '../apache2/re_operators.c'; then $(CYGPATH_W) '../apache2/re_operators.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/re_operators.c'; fi` ../apache2/msc_test-re_tfns.o: ../apache2/re_tfns.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-re_tfns.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-re_tfns.Tpo -c -o ../apache2/msc_test-re_tfns.o `test -f '../apache2/re_tfns.c' || echo '$(srcdir)/'`../apache2/re_tfns.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-re_tfns.Tpo ../apache2/$(DEPDIR)/msc_test-re_tfns.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/re_tfns.c' object='../apache2/msc_test-re_tfns.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-re_tfns.o `test -f '../apache2/re_tfns.c' || echo '$(srcdir)/'`../apache2/re_tfns.c ../apache2/msc_test-re_tfns.obj: ../apache2/re_tfns.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-re_tfns.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-re_tfns.Tpo -c -o ../apache2/msc_test-re_tfns.obj `if test -f '../apache2/re_tfns.c'; then $(CYGPATH_W) '../apache2/re_tfns.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/re_tfns.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-re_tfns.Tpo ../apache2/$(DEPDIR)/msc_test-re_tfns.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/re_tfns.c' object='../apache2/msc_test-re_tfns.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-re_tfns.obj `if test -f '../apache2/re_tfns.c'; then $(CYGPATH_W) '../apache2/re_tfns.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/re_tfns.c'; fi` ../apache2/msc_test-re_variables.o: ../apache2/re_variables.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-re_variables.o -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-re_variables.Tpo -c -o ../apache2/msc_test-re_variables.o `test -f '../apache2/re_variables.c' || echo '$(srcdir)/'`../apache2/re_variables.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-re_variables.Tpo ../apache2/$(DEPDIR)/msc_test-re_variables.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/re_variables.c' object='../apache2/msc_test-re_variables.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-re_variables.o `test -f '../apache2/re_variables.c' || echo '$(srcdir)/'`../apache2/re_variables.c ../apache2/msc_test-re_variables.obj: ../apache2/re_variables.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../apache2/msc_test-re_variables.obj -MD -MP -MF ../apache2/$(DEPDIR)/msc_test-re_variables.Tpo -c -o ../apache2/msc_test-re_variables.obj `if test -f '../apache2/re_variables.c'; then $(CYGPATH_W) '../apache2/re_variables.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/re_variables.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../apache2/$(DEPDIR)/msc_test-re_variables.Tpo ../apache2/$(DEPDIR)/msc_test-re_variables.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../apache2/re_variables.c' object='../apache2/msc_test-re_variables.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../apache2/msc_test-re_variables.obj `if test -f '../apache2/re_variables.c'; then $(CYGPATH_W) '../apache2/re_variables.c'; else $(CYGPATH_W) '$(srcdir)/../apache2/re_variables.c'; fi` ../standalone/msc_test-regex.o: ../standalone/regex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../standalone/msc_test-regex.o -MD -MP -MF ../standalone/$(DEPDIR)/msc_test-regex.Tpo -c -o ../standalone/msc_test-regex.o `test -f '../standalone/regex.c' || echo '$(srcdir)/'`../standalone/regex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../standalone/$(DEPDIR)/msc_test-regex.Tpo ../standalone/$(DEPDIR)/msc_test-regex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../standalone/regex.c' object='../standalone/msc_test-regex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../standalone/msc_test-regex.o `test -f '../standalone/regex.c' || echo '$(srcdir)/'`../standalone/regex.c ../standalone/msc_test-regex.obj: ../standalone/regex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../standalone/msc_test-regex.obj -MD -MP -MF ../standalone/$(DEPDIR)/msc_test-regex.Tpo -c -o ../standalone/msc_test-regex.obj `if test -f '../standalone/regex.c'; then $(CYGPATH_W) '../standalone/regex.c'; else $(CYGPATH_W) '$(srcdir)/../standalone/regex.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../standalone/$(DEPDIR)/msc_test-regex.Tpo ../standalone/$(DEPDIR)/msc_test-regex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../standalone/regex.c' object='../standalone/msc_test-regex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../standalone/msc_test-regex.obj `if test -f '../standalone/regex.c'; then $(CYGPATH_W) '../standalone/regex.c'; else $(CYGPATH_W) '$(srcdir)/../standalone/regex.c'; fi` ../standalone/msc_test-server.o: ../standalone/server.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../standalone/msc_test-server.o -MD -MP -MF ../standalone/$(DEPDIR)/msc_test-server.Tpo -c -o ../standalone/msc_test-server.o `test -f '../standalone/server.c' || echo '$(srcdir)/'`../standalone/server.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../standalone/$(DEPDIR)/msc_test-server.Tpo ../standalone/$(DEPDIR)/msc_test-server.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../standalone/server.c' object='../standalone/msc_test-server.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../standalone/msc_test-server.o `test -f '../standalone/server.c' || echo '$(srcdir)/'`../standalone/server.c ../standalone/msc_test-server.obj: ../standalone/server.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../standalone/msc_test-server.obj -MD -MP -MF ../standalone/$(DEPDIR)/msc_test-server.Tpo -c -o ../standalone/msc_test-server.obj `if test -f '../standalone/server.c'; then $(CYGPATH_W) '../standalone/server.c'; else $(CYGPATH_W) '$(srcdir)/../standalone/server.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../standalone/$(DEPDIR)/msc_test-server.Tpo ../standalone/$(DEPDIR)/msc_test-server.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../standalone/server.c' object='../standalone/msc_test-server.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../standalone/msc_test-server.obj `if test -f '../standalone/server.c'; then $(CYGPATH_W) '../standalone/server.c'; else $(CYGPATH_W) '$(srcdir)/../standalone/server.c'; fi` ../standalone/msc_test-config.o: ../standalone/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../standalone/msc_test-config.o -MD -MP -MF ../standalone/$(DEPDIR)/msc_test-config.Tpo -c -o ../standalone/msc_test-config.o `test -f '../standalone/config.c' || echo '$(srcdir)/'`../standalone/config.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../standalone/$(DEPDIR)/msc_test-config.Tpo ../standalone/$(DEPDIR)/msc_test-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../standalone/config.c' object='../standalone/msc_test-config.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../standalone/msc_test-config.o `test -f '../standalone/config.c' || echo '$(srcdir)/'`../standalone/config.c ../standalone/msc_test-config.obj: ../standalone/config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -MT ../standalone/msc_test-config.obj -MD -MP -MF ../standalone/$(DEPDIR)/msc_test-config.Tpo -c -o ../standalone/msc_test-config.obj `if test -f '../standalone/config.c'; then $(CYGPATH_W) '../standalone/config.c'; else $(CYGPATH_W) '$(srcdir)/../standalone/config.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ../standalone/$(DEPDIR)/msc_test-config.Tpo ../standalone/$(DEPDIR)/msc_test-config.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='../standalone/config.c' object='../standalone/msc_test-config.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(msc_test_CPPFLAGS) $(CPPFLAGS) $(msc_test_CFLAGS) $(CFLAGS) -c -o ../standalone/msc_test-config.obj `if test -f '../standalone/config.c'; then $(CYGPATH_W) '../standalone/config.c'; else $(CYGPATH_W) '$(srcdir)/../standalone/config.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) $(check_SCRIPTS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? run-unit-tests.pl.log: run-unit-tests.pl @p='run-unit-tests.pl'; \ b='run-unit-tests.pl'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(check_SCRIPTS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f ../apache2/$(DEPDIR)/$(am__dirstamp) -rm -f ../apache2/$(am__dirstamp) -rm -f ../apache2/libinjection/$(DEPDIR)/$(am__dirstamp) -rm -f ../apache2/libinjection/$(am__dirstamp) -rm -f ../standalone/$(DEPDIR)/$(am__dirstamp) -rm -f ../standalone/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ../apache2/$(DEPDIR) ../apache2/libinjection/$(DEPDIR) ../standalone/$(DEPDIR) ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ../apache2/$(DEPDIR) ../apache2/libinjection/$(DEPDIR) ../standalone/$(DEPDIR) ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am .PRECIOUS: Makefile test: check test-regression: run-regression-tests.pl $(PERL) run-regression-tests.pl test-regression-nginx: run-regression-tests-nginx.pl $(PERL) run-regression-tests-nginx.pl .PHONY: test test-regression # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: modsecurity-2.9.5/tests/csv_rx-pm.pl.in0000775000175000017500000000101114147005233021235 0ustar mhsvierulamhsvierula#!@PERL@ # # Example to generate CSV performance data from test results taken from # test generated by gen_rx-pm.pl. # use strict; my %H = (); while (<>) { chomp; my ($op, $label, $n, $i, $value) = (m/\s*\d+\)\s+\S+\s+"([^"]*)"\s+(\S+)\s+(\d+) item\(s\): passed\s+\((\d+)\s+\@\s+([-\+\d\.E]+) msec\s.*/); next unless defined($value); $H{$n}{$label} = $value; } printf "%s, %s, %s, %s\n", qw(N rx1 rx2 pm1); for (sort {$a <=> $b} keys %H) { printf "%s, %s, %s, %s\n", $_, $H{$_}{rx1}, $H{$_}{rx2}, $H{$_}{pm1} }; modsecurity-2.9.5/tests/regression/0000775000175000017500000000000014147005233020541 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/server_root/0000775000175000017500000000000014147005233023112 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/server_root/htdocs/0000775000175000017500000000000014147005233024376 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/server_root/htdocs/test2.txt0000664000175000017500000000000714147005233026175 0ustar mhsvierulamhsvierulaTEST 2 modsecurity-2.9.5/tests/regression/server_root/htdocs/index.html0000664000175000017500000000000614147005233026367 0ustar mhsvierulamhsvierulaINDEX modsecurity-2.9.5/tests/regression/server_root/htdocs/8k.txt0000664000175000017500000002000014147005233025451 0ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/server_root/htdocs/test.txt0000664000175000017500000000000514147005233026111 0ustar mhsvierulamhsvierulaTEST modsecurity-2.9.5/tests/regression/server_root/htdocs/test.pdf0000664000175000017500000003605614147005233026062 0ustar mhsvierulamhsvierula%PDF-1.4 %äüöß 2 0 obj <> stream x=L 0 )r:lm7(mP d0ojEBGUqP\xJ ctu> stream x|{\\9{.go%LH , %k [jZ/5nZAެjVjkަmj91myf晙g9Dl4Th(;dqº _?с[7ɿ8>04ֿ5BBY}`W; !50ƢA03&Pv '*l(P:BP憃WEwkP p ?ռ6|H<ч)^"X(!p P )3H, JoX,&NdD(.)gV>oE-lGP @t4ZB݉( Q#z91hb@1{tP3z`&EYȟfQR]t a}i\ހ7#u= .C[OSԃu ўV=~[oȟDCS/(#} }8DӌmDG(_Do \RP0+f~J7ZЭ~+q%>+›(| c(.ťL6 FhCG ܌;4~}P\2SLSHPj`h`&DfQB\v:Xa::^>.s-+)H YP5mF@>~?a@gRlR{AKh a阃UTx]x d$M/-S50R2üv i}8{aECL#\0/3o7Do99OR{l9a= R3 ǿ''4VJmc;/w?a.ŇWRͩyPk Eኡkuh vtuG/_ߢA[0> Vw# 1!~?&c,bf3ם u}qcb!HBWEKB#{u{{|a殙fژȋ|~z,)#ݿ3X ovh/+Z/k\fµ / VUzk{?1~?2` d b+m`3-:\Q&l =a2Av.<"FjEEE/^!Dl7% -{$Kޗ|*H[=kIS2'Dú\%/8Sto@bboc!gXavkvlodckװ‡wDz|]1иH/^>B̯P O3?dgO=jw1 Nt@W ~΄]T!A_^|Cg|DU"s%LJ ftoCQUO)#x5m%5g*P3zʜa6HNC]3'4p'S1 ɫ  x^~*ZXaհ'©Qn]^ԕ?u@S@ݞDf-G{!n@oA9ZFaz]z8e 4 zP*3@ݒjUVwQ ۬Ŝg223tZMZTeRX2y˺d~wRo_K TUt'9Z&uS2n!e(/ 9JjQ5ٹ|y;6;iՀ[Ёk2 6rI5%mV* !׃+*KfۣqL&0dj`*kolJ IK^hZ;$n$}iR$N4$t.LVr={nҢn=;n1})" khy~dsg\[$1sYe0- ў7„YYtorR-ݠ=In:8:r=mvkh6g=Ǝ-^am:/iQ#6Qr5+&W9$^8iÚIF{z >z%@᤼{굤Rڹ=!п kBĩXɜA,tEE@ Qq -Wz=ۧ= Vmo ($/o1N@#t2>2׽v'esmVF`Mg}Nsoo^oo|s;״[msۂ^=&`o'ENJ;޺ep p51c, I]E9%20`ZeIm >PXdҋf kJָ/(/`OELs={ ږAڳg[{Op*5c=Gv}O{VSc{et"qu1\pg,Ek3ipn2'X4| )yD|B$[~\{vlspXӭNH0숟r1N `K`K;6Bgx+5oYVlXm|DQj6o`MQh֮[ SlZg,W+1W;iV2Vԅf 3[U9 :ń,1ԆJ4uVJvn.0V6D 3a>϶}(,1juc:V4Qd߉c,K)++e ʹ`VЅE.6~gK͹&WFjXq 8UqDR_RV({r/_L__wyO=}~ zvy+ fO/,|Pe٤\LXw\l#ggGۆljiSpm/.ZSթg~rǖUjWoy7w7+r[ntDӶ{5inhe4< ]lD=n",GO)X[, Ujuu"ixk Γ)Ҥ͊ʕU 5+/ۤP(AqRӖu}cce娢Wx RO hhԪZULnlJFPo1t"ذhijZ(2BO qt7n'*WTO@N(3͏s) 88q'v>4QIf`@l,Ji~N*Z)>#ŭR,mX02|1p 7dk䯏;as<{T6N.ß&8zQ5#2Fbq6FRs(=/Ätڄmb U*8\Yԙ&fFRk"ABآ"1pmtPx;(D),7:9Si*K\CE%iN0U*+ C.ო;%R~g} lٳ mZT'W$P,ձ貮/ _p:g>S,NzbNѪ|qcs񪍎6WV8QhYqgJյw5ށ;ks<] S+zG:~^] S?}q񬩜s\ܢjQwP``\$x6L-a,QU<ewֳP%< |y<&a,x< mF2c:D IFna_γΝN#}[B)N/r q>\+A#_/wY}E_{ Eͼw;zz˻zAkVxE>y":u]&Q&c9.CgN7|p&?+`[3+VU, VWa3lBrT.S+%[$7ho{9dx25M[ڳ xL+ʺݲ(8nsҟhHU",UcHf۰HY.o1m&؝?[o)dOʓ3`N*2e'IOHN:!=(MJEҝLT'f..PH7*¢ԉL?D$,EJFltK/ɲ\F& GvebffplBƔޑZY@K%e'e٣izM7$-֚Ƣ4mƞIi93on:km[~'d!h6; KoiH"qOofi4?!AauЀD>4$ERLi^@FvE_goJ KrZ zm?K95 ݂!lbLeN+۲I}}7oks7GڜEgH^]hM:pnzk"rGMeoԐ0&L׸c9~m-$@sŮpA7S\S_ŏOofx ןS璥Y2 [R]c1vy\u;cKE,=#t(W[ȍsWWW|8Ki `&>/8w{ nZzFKv;א{|f;@aWgLl//$9Ei'5rVC+Zj/bd,XN-Dp`WZ˲ [5.4)yIir]+nh+oe83:n8Ֆ;Dɫ:\ Чc,dE/4*n~UKxv{{2_0VfHeYߜe3I,FdI-F՞mͱLhL-:tZ+tbJsvvk6[و*!7>MJ=׬kfi#Cnو9Isun+_(HNkkk9otd@| ˞{칙_>.qg5<=3uDŽlgo nx UξEr\,fqs&OD(QqTKK6.ɤ y#TS8?yc&2 )%YVb̷Bal/#ŸW΂|&+[Vv= 1*,) F EE[8J͓; cd)S{b?yvsC=7!H .n1Ü mWBi}CMW+8OIc%mzf6sjTrl Ng)w5;3wuZb߂8/d/_?mdU+rndoT&] Ʉ>}I\+J.7c=anOS,`sÙݭp.)*ԥK@[Z؈#;|bN:_nŐJ>XG°{ӇYʯNz);`B 5@]e?.g7\M,QZl@W_&dÿp)zpg^p9+٫\b y jkF:s|njH9-aXO Z0K3?|/ 5~jچ)[p?'Da5A9'Lh¨C$N@sSI .oCڱHKvP ᥶< A͘ ]5)}sh5]rAڋˬqw/ 1*=/Ym8Ք>AG#Tq3HǍѕ kAy텔5A:Vxh&h=TW0De^jw!׈ϳ!5L#!K%z7OT2y1mV"oܼeqT?}R Q|- 1zyD|;=/a^F##su$Ҩ (^7B_}g[v}uL;6s6wr|_Rj9]G풗ÈJ>}޺GF9[XdŕVGLx/f>FQΆh8]`uTAaޘT pK:Ø *KH`jJC,e~  % Q]ّ4GG:[@G%ի C1Ȁ\>5[O:Ŕ~F/4A#ዔ⨋{cs{owPM/i_g@-e4z&Y)9,-mCjp~3[?8/D)En=e޶f9{wΟ GY~x75"\[a6ۅCwXعydfd;Rx^ yOb" ->H?:1z;/JK>k9,( sSJ!.>7a3! (lX"9gyI裒c~ͻOQsKjF1xeSl;OZ=J%N[|$/ޫ} mVt>VҵVs{![ R\>?2Y_;;8hv<'C~p_zů !Y/uy)v^#sv=#'}r₻AmBΠjK.dj(KZ* !hE(3ζ_ m,osm!nMd$*!FbD82Ez}\c0o`(s+G__Ⅴ q8.Ŷá86[ c\ 5C8W]ƹք{cx?Qx|2-u hbp0:Xh Ob>.<%tz55\K qxh F Eb  aP[ ƀX8pýH[F px!,{B\bVX<PP,_8qudV4v {ps}xx`$㸕 nj=жQah FC\d$D# Ź0 C572hX@x$8s;@X0 .B0z"z. (`n}< :BXdt`…JF!Xdhh,BXm m'AYV"Y}L4YG Ka\`$G{@4'=[Ch(1:IAa^`c\d'@Xhpo FɈ7@744D<6 '`'H,x כ}!PhHdk24^ yPHC% ǣC1o{(hMq;| }`:Ń6yp+AT##d!bږV6ԷlY˵,VlhZ_iM6B30V1_e°d1(NCod0 7@,"qm0ʊ$ afH$˅y%XNDB%$ba0s L̉b3An{ph`<J6Gͮ$DB0 z`"]9R$6>@ďctO-%05 N_|L&G+#; @ d0$q Z8#^.N F)q|02  mÆBl'tnnL/?cuŇ,u &j+ joIEI\*KJK+* *U+j?uFR*أ~7zIn MVc A>ٶه};kaY8Qإ+^\zr bҋK/V.XbҋK/V.XbҋK/V.Xʂ Xۻ -x.Ÿ/>yeYT*j-] $QR!_ NYDbt#<.9JYa|w45 wh>*, gw`@;YFҥGyީWo?0;`gL*0{-`, [`P}#q%h)pJ0N/~鐅}}RhyHZz"!=p E؇.}R @1@ aɿCZ  BmP#dw"={;h-s!&ԛ!$? M,]H-WvvKA6>ih ؝ ;!0e9kNuHvNANNNN$kfii5@s \4׀TJ8'_eT  8ȝ'!8Aot );@nvˤF6p({Q#9yeΗ b Іhk\EjCGr֧ ʄP b{'ŖcZ4,C4.fKK,*iĺlj!0IE@PhU|\j圼Dve-l1[Ƕ]|/UZSN\RS>k3?1ǓSz=>WHoB ?joM^G_7MFGCIOzg fY;&=!}3پI'apdm>T Ch{!f\#A4!Sa^ YlGt:ˤ.2&dLiXCW#e`S>M>š,{ַ eiSxe3%)?i9 BN-<|N[C+@r}eʓ<60x#4wxXV,sNahdz ב,#H*9LQfij6 i@۟m(XN9 9bb4N>&ӹG 6 ^ 't/U @z F2c[vz `?Mkd]^ÒoOol[F孶#n _|I$ND܉ۍ /{D hmt%a] endstream endobj 6 0 obj 13186 endobj 7 0 obj <> endobj 8 0 obj <> stream x]n <b"::?1:3p$·/\mspH(Wy R ^,(I3*$w w>u$ۮQ.KJ7g{x ɋ`n}.|QF  4!jp1~/|ԟs> endobj 10 0 obj <> endobj 11 0 obj <> endobj 1 0 obj <>/Contents 2 0 R>> endobj 4 0 obj <> endobj 12 0 obj <> endobj 13 0 obj < /Producer /CreationDate(D:20081006142251-07'00')>> endobj xref 0 14 0000000000 65535 f 0000014396 00000 n 0000000019 00000 n 0000000224 00000 n 0000014539 00000 n 0000000244 00000 n 0000013515 00000 n 0000013537 00000 n 0000013735 00000 n 0000014091 00000 n 0000014309 00000 n 0000014341 00000 n 0000014638 00000 n 0000014735 00000 n trailer < <9DF444F8B9A94D3A8214330AA876A2A6> ] /DocChecksum /046AAD787AFCAEA02E1D68CA0DC6D18F >> startxref 14922 %%EOF modsecurity-2.9.5/tests/regression/server_root/data/0000775000175000017500000000000014147005233024023 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/server_root/data/ip.dir0000664000175000017500000000000014147005233025121 0ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/server_root/data/.empty0000664000175000017500000000000014147005233025150 0ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/server_root/logs/0000775000175000017500000000000014147005233024056 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/server_root/logs/audit/0000775000175000017500000000000014147005233025164 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/server_root/logs/audit/.empty0000664000175000017500000000000014147005233026311 0ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/server_root/logs/subdir/0000775000175000017500000000000014147005233025346 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/server_root/logs/subdir/.empty0000664000175000017500000000000014147005233026473 0ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/server_root/tmp/0000775000175000017500000000000014147005233023712 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/server_root/tmp/.empty0000664000175000017500000000000014147005233025037 0ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/server_root/conf/0000775000175000017500000000000014147005233024037 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/server_root/conf/test.lua0000664000175000017500000000055414147005233025525 0ustar mhsvierulamhsvierula-- Test Lua Script to just print debug messages function main() m.log(1, "Test message."); m.log(2, "Test message."); m.log(3, "Test message."); m.log(4, "Test message."); m.log(5, "Test message."); m.log(6, "Test message."); m.log(7, "Test message."); m.log(8, "Test message."); m.log(9, "Test message."); return nil; end modsecurity-2.9.5/tests/regression/server_root/conf/SoapEnvelope.xsd0000664000175000017500000001375314147005233027170 0ustar mhsvierulamhsvierula Prose in the spec does not specify that attributes are allowed on the Body element 'encodingStyle' indicates any canonicalization conventions followed in the contents of the containing element. For example, the value 'http://schemas.xmlsoap.org/soap/encoding/' indicates the pattern described in SOAP specification Fault reporting structure modsecurity-2.9.5/tests/regression/server_root/conf/SoapEnvelope.dtd0000664000175000017500000000032214147005233027131 0ustar mhsvierulamhsvierula modsecurity-2.9.5/tests/regression/server_root/conf/SoapEnvelope-bad.xsd0000664000175000017500000001375214147005233027713 0ustar mhsvierulamhsvierula Prose in the spec does not specify that attributes are allowed on the Body element 'encodingStyle' indicates any canonicalization conventions followed in the contents of the containing element. For example, the value 'http://schemas.xmlsoap.org/soap/encoding/' indicates the pattern described in SOAP specification Fault reporting structure modsecurity-2.9.5/tests/regression/server_root/conf/SoapEnvelope-bad.dtd0000664000175000017500000000032114147005233027654 0ustar mhsvierulamhsvierula modsecurity-2.9.5/tests/regression/server_root/conf/httpd.conf.in0000664000175000017500000000250114147005233026434 0ustar mhsvierulamhsvierula### Base configuration for starting Apache httpd LoadModule proxy_module @APXS_LIBEXECDIR@/mod_proxy.so LoadModule proxy_http_module @APXS_LIBEXECDIR@/mod_proxy_http.so LoadModule unique_id_module @APXS_LIBEXECDIR@/mod_unique_id.so # TODO: Need to have these configurable LoadModule security2_module @MSC_BASE_DIR@/apache2/.libs/mod_security2.so LoadModule version_module @APXS_LIBEXECDIR@/mod_version.so = 2.4> LoadModule unixd_module @APXS_LIBEXECDIR@/mod_unixd.so LoadModule mpm_worker_module @APXS_LIBEXECDIR@/mod_mpm_worker.so LoadModule access_compat_module @APXS_LIBEXECDIR@/mod_access_compat.so LoadModule authn_core_module @APXS_LIBEXECDIR@/mod_authn_core.so LoadModule authz_core_module @APXS_LIBEXECDIR@/mod_authz_core.so ServerName localhost CoreDumpDirectory @MSC_REGRESSION_SERVERROOT_DIR@/tmp LogLevel debug ErrorLog @MSC_REGRESSION_LOGS_DIR@/error.log # File locations PidFile @MSC_REGRESSION_LOGS_DIR@/httpd.pid ScoreBoardFile @MSC_REGRESSION_LOGS_DIR@/httpd.scoreboard DocumentRoot @MSC_REGRESSION_DOCROOT_DIR@ Options +Indexes +FollowSymLinks modsecurity-2.9.5/tests/regression/server_root/conf/match.lua0000664000175000017500000000060714147005233025641 0ustar mhsvierulamhsvierula-- Test matching Lua Script to just print debug messages function main() m.log(1, "Test message."); m.log(2, "Test message."); m.log(3, "Test message."); m.log(4, "Test message."); m.log(5, "Test message."); m.log(6, "Test message."); m.log(7, "Test message."); m.log(8, "Test message."); m.log(9, "Test message."); return "Lua script matched."; end modsecurity-2.9.5/tests/regression/server_root/conf/ssdeep.txt0000664000175000017500000000050614147005233026064 0ustar mhsvierulamhsvierulassdeep,1.1--blocksize:hash:hash,filename 96:MbQ1L0LDX8GPI8ov3D2D9zd6/gz2wZhFvV0O598La8Kqvfi0znNa8Xi5SM7XRWCK:KvL8Gg8rWIz2ZKqvfjzQ55RpRHjftQ++,"modsecurity.conf-recommended" 192:b8B5UQvywcMIJuavpde/Yyz/U/vF+vGCoCvrQr/dw:afcnrvp8zqUvGrzr6,"README_WINDOWS.TXT" 96:+qK8Z4gA165/hquKNMi68zuEyMM9qNB26x:+RG4z6c1LyZOB26x,"README.TXT" modsecurity-2.9.5/tests/regression/server_root/upload/0000775000175000017500000000000014147005233024376 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/server_root/upload/.empty0000664000175000017500000000000014147005233025523 0ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/rule/0000775000175000017500000000000014147005233021510 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/rule/00-basics.t0000664000175000017500000000474714147005233023372 0ustar mhsvierulamhsvierula### Tests for basic rule components # SecAction { type => "rule", comment => "SecAction (override default)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 4 SecAction "nolog,id:500001" ), match_log => { -error => [ qr/500001/, 1 ], -audit => [ qr/./, 1 ], debug => [ qr/Warning\. Unconditional match in SecAction\./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # SecRule { type => "rule", comment => "SecRule (no action)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 5 SecDefaultAction "phase:2,deny,status:403" SecRule ARGS:test "value" "id:500032" ), match_log => { error => [ qr/500032/, 1 ], debug => [ qr/Rule [0-9a-f]+: SecRule "ARGS:test" "\@rx value" "phase:2,deny,status:403,id:500032"$/m, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?test=value", ), }, { type => "rule", comment => "SecRule (action)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 5 SecDefaultAction "phase:2,pass" SecRule ARGS:test "value" "deny,status:403,id:500033" ), match_log => { error => [ qr/ModSecurity: /, 1 ], debug => [ qr/Rule [0-9a-f]+: SecRule "ARGS:test" "\@rx value" "phase:2,deny,status:403,id:500033"$/m, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?test=value", ), }, { type => "rule", comment => "SecRule (chain)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 5 SecDefaultAction "phase:2,log,noauditlog,pass,tag:foo" SecRule ARGS:test "value" "chain,phase:2,deny,status:403,id:500034" SecRule &ARGS "\@eq 1" "chain,setenv:tx.foo=bar" SecRule REQUEST_METHOD "\@streq GET" ), match_log => { error => [ qr/ModSecurity: /, 1 ], debug => [ qr/Rule [0-9a-f]+: SecRule "ARGS:test" "\@rx value" "phase:2,log,noauditlog,tag:foo,chain,deny,status:403,id:500034"\r?\n.*Rule [0-9a-f]+: SecRule "&ARGS" "\@eq 1" "chain,setenv:tx.foo=bar"\r?\n.*Rule [0-9a-f]+: SecRule "REQUEST_METHOD" "\@streq GET"\r?\n/s, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?test=value", ), }, modsecurity-2.9.5/tests/regression/rule/10-xml.t0000664000175000017500000003467414147005233022731 0ustar mhsvierulamhsvierula### Test for XML operator rules ### Validate Scheme # OK { type => "rule", comment => "validateSchema (validate ok)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecXmlExternalEntity On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule REQUEST_HEADERS:Content-Type "^text/xml\$" "id:500005, \\ phase:1,t:none,t:lowercase,nolog,pass,ctl:requestBodyProcessor=XML" SecRule REQBODY_PROCESSOR "!^XML\$" nolog,pass,skipAfter:12345,id:500006 SecRule XML "\@validateSchema $ENV{CONF_DIR}/SoapEnvelope.xsd" "id:500007, \\ phase:3:,deny" ), match_log => { debug => [ qr/XML: Initialising parser.*XML: Parsing complete \(well_formed 1\).*Target value: "\[XML document tree\]".*Successfully validated payload against Schema/s, 1 ], -debug => [ qr/XML parser error|validation failed|Failed to load/, 1 ], -error => [ qr/XML parser error|validation failed|Failed to load/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "text/xml", ], normalize_raw_request_data( q( 12123 ), ), ), }, # Failed attribute value { type => "rule", comment => "validateSchema (validate attribute value failed)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecXmlExternalEntity On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecRule REQUEST_HEADERS:Content-Type "^text/xml\$" "id:500008, \\ phase:1,t:none,t:lowercase,nolog,pass,ctl:requestBodyProcessor=XML" SecRule REQBODY_PROCESSOR "!^XML\$" nolog,pass,skipAfter:12345,id:500009 SecRule XML "\@validateSchema $ENV{CONF_DIR}/SoapEnvelope.xsd" "id:500010 \\ phase:2,deny,log,auditlog,id:12345" ), match_log => { debug => [ qr/XML: Initialising parser.*XML: Parsing complete \(well_formed 1\).*Target value: "\[XML document tree\]".*'badval' is not a valid value of the local atomic type.*Schema validation failed/s, 1 ], -debug => [ qr/Successfully validated payload against Schema|\n\r?\n/, 1 ], audit => [ qr/^Message: Element.*'badval' is not a valid value of the local atomic type\.\nMessage:/m, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "text/xml", ], normalize_raw_request_data( q( 12123 ), ), ), }, # Failed validation { type => "rule", comment => "validateSchema (validate failed)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecXmlExternalEntity On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecRule REQUEST_HEADERS:Content-Type "^text/xml\$" "id:500011, \\ phase:1,t:none,t:lowercase,nolog,pass,ctl:requestBodyProcessor=XML" SecRule REQBODY_PROCESSOR "!^XML\$" nolog,pass,skipAfter:12345,id:500012 SecRule XML "\@validateSchema $ENV{CONF_DIR}/SoapEnvelope.xsd" "id:500013 \\ phase:2,deny,id:12345" ), match_log => { debug => [ qr/XML: Initialising parser.*XML: Parsing complete \(well_formed 1\).*Target value: "\[XML document tree\]".*element is not expected/s, 1 ], -debug => [ qr/XML parser error|Failed to load/, 1 ], -error => [ qr/XML parser error|Failed to load/, 1 ], audit => [ qr/^Message: Element.*This element is not expected.*\nMessage:/m, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "text/xml", ], normalize_raw_request_data( q( 12123 ), ), ), }, # Bad XML { type => "rule", comment => "validateSchema (bad XML)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecXmlExternalEntity On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecRule REQUEST_HEADERS:Content-Type "^text/xml\$" "id:500014, \\ phase:1,t:none,t:lowercase,nolog,pass,ctl:requestBodyProcessor=XML" SecRule REQBODY_PROCESSOR "!^XML\$" nolog,pass,skipAfter:12345,id:500015 SecRule XML "\@validateSchema $ENV{CONF_DIR}/SoapEnvelope.xsd" "id:500016, \\ phase:2,deny,id:12345" ), match_log => { debug => [ qr/XML: Initialising parser.*XML: Parsing complete \(well_formed 0\).*XML parser error.*validation failed because content is not well formed/s, 1 ], -debug => [ qr/Failed to load|Successfully validated/, 1 ], -error => [ qr/Failed to load|Successfully validated/, 1 ], audit => [ qr/^Message: .*Failed parsing document.*\nMessage:/m, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "text/xml", ], normalize_raw_request_data( q( 12123 ), ), ), }, # Bad schema { type => "rule", comment => "validateSchema (bad schema)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecXmlExternalEntity On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecRule REQUEST_HEADERS:Content-Type "^text/xml\$" "id:500017 \\ phase:1,t:none,t:lowercase,nolog,pass,ctl:requestBodyProcessor=XML" SecRule REQBODY_PROCESSOR "!^XML\$" nolog,pass,skipAfter:12345,id:500018 SecRule XML "\@validateSchema $ENV{CONF_DIR}/SoapEnvelope-bad.xsd" "id:500019 \\ phase:2,deny,id:12345" ), match_log => { debug => [ qr/XML: Initialising parser.*XML: Parsing complete \(well_formed 1\).*Target value: "\[XML document tree\]".*Failed to parse the XML resource.*Failed to load Schema/s, 1 ], audit => [ qr/^Message: .*Failed to parse the XML resource.*\nMessage: Rule processing failed/m, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "text/xml", ], normalize_raw_request_data( q( 12123 ), ), ), }, # Validate DTD # OK { type => "rule", comment => "validateDTD (validate ok)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecXmlExternalEntity On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule REQUEST_HEADERS:Content-Type "^text/xml\$" "id:500020, \\ phase:1,t:none,t:lowercase,nolog,pass,ctl:requestBodyProcessor=XML" SecRule REQBODY_PROCESSOR "!^XML\$" nolog,pass,skipAfter:12345,id:500021 SecRule XML "\@validateDTD $ENV{CONF_DIR}/SoapEnvelope.dtd" "id:500022, \\ phase:2,deny,id:12345" ), match_log => { debug => [ qr/XML: Initialising parser.*XML: Parsing complete \(well_formed 1\).*Target value: "\[XML document tree\]".*Successfully validated payload against DTD/s, 1 ], -debug => [ qr/XML parser error|validation failed|Failed to load/, 1 ], -error => [ qr/XML parser error|validation failed|Failed to load/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "text/xml", ], normalize_raw_request_data( q( 12123 ), ), ), }, # Failed validation { type => "rule", comment => "validateDTD (validate failed)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecXmlExternalEntity On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule REQUEST_HEADERS:Content-Type "^text/xml\$" "id:500023, \\ phase:1,t:none,t:lowercase,nolog,pass,ctl:requestBodyProcessor=XML" SecRule REQBODY_PROCESSOR "!^XML\$" nolog,pass,skipAfter:12345,id:500024 SecRule XML "\@validateDTD $ENV{CONF_DIR}/SoapEnvelope.dtd" "id:500025, \\ phase:2,deny,id:12345" ), match_log => { debug => [ qr/XML: Initialising parser.*XML: Parsing complete \(well_formed 1\).*Target value: "\[XML document tree\]".*content does not follow the DTD/s, 1 ], -debug => [ qr/XML parser error|Failed to load/, 1 ], -error => [ qr/XML parser error|Failed to load/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "text/xml", ], normalize_raw_request_data( q( 12123 ), ), ), }, # Bad XML { type => "rule", comment => "validateDTD (bad XML)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecXmlExternalEntity On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule REQUEST_HEADERS:Content-Type "^text/xml\$" "id:500026, \\ phase:1,t:none,t:lowercase,nolog,pass,ctl:requestBodyProcessor=XML" SecRule REQBODY_PROCESSOR "!^XML\$" nolog,pass,skipAfter:12345,id:500027 SecRule XML "\@validateDTD $ENV{CONF_DIR}/SoapEnvelope.dtd" "id:500028, \\ phase:2,deny,id:12345" ), match_log => { debug => [ qr/XML: Initialising parser.*XML: Parsing complete \(well_formed 0\).*XML parser error.*validation failed because content is not well formed/s, 1 ], -debug => [ qr/Failed to load|Successfully validated/, 1 ], -error => [ qr/Failed to load|Successfully validated/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "text/xml", ], normalize_raw_request_data( q( 12123 ), ), ), }, # Bad DTD { type => "rule", comment => "validateDTD (bad DTD)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecXmlExternalEntity On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule REQUEST_HEADERS:Content-Type "^text/xml\$" "id:500029, \\ phase:1,t:none,t:lowercase,nolog,pass,ctl:requestBodyProcessor=XML" SecRule REQBODY_PROCESSOR "!^XML\$" nolog,pass,skipAfter:12345,id:500030 SecRule XML "\@validateDTD $ENV{CONF_DIR}/SoapEnvelope-bad.dtd" "id:500031 \\ phase:2,deny,id:12345" ), match_log => { debug => [ qr/XML: Initialising parser.*XML: Parsing complete \(well_formed 1\).*Target value: "\[XML document tree\]".*Failed to load DTD/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "text/xml", ], normalize_raw_request_data( q( 12123 ), ), ), }, modsecurity-2.9.5/tests/regression/rule/15-json.t0000664000175000017500000001434114147005233023074 0ustar mhsvierulamhsvierula### Test for JSON parser ### # OK { type => "rule", comment => "json parser", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule REQUEST_HEADERS:Content-Type "application/json" \\ "id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON" SecRule ARGS:foo "bar" "id:'200441',phase:3,log" ), match_log => { error => [ qr/ModSecurity: Warning. Pattern match "bar" at ARGS:foo.|ModSecurity: JSON support was not enabled/s, 1 ], debug => [ qr/Adding JSON argument 'foo' with value 'bar'|JSON support was not enabled/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/json", ], normalize_raw_request_data( q( { "foo":"bar", "mod":"sec" } ), ), ), }, { type => "rule", comment => "json parser - issue #1576 - 1", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule REQUEST_HEADERS:Content-Type "application/json" \\ "id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON" SecRule ARGS "bar" "id:'200441',phase:3,log" ), match_log => { error => [ qr/ModSecurity: Warning. Pattern match "bar" at ARGS:foo.|ModSecurity: JSON support was not enabled/s, 1 ], debug => [ qr/ARGS:foo|ARGS:mod|ARGS:ops.ops.ops|ARGS:ops.ops.ops|ARGS:ops.ops|ARGS:ops.ops|ARGS:ops.ops.eins.eins|ARGS:ops.ops.eins.eins|ARGS:whee/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/json", ], normalize_raw_request_data( q( { "foo":"bar", "mod":"sec", "ops":[ [ "um", "um e meio" ], "dois", "tres", { "eins":[ "zwei", "drei" ] } ], "whee":"lhebs" } ), ), ), }, { type => "rule", comment => "json parser - issue #1576 - 2", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule REQUEST_HEADERS:Content-Type "application/json" \\ "id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON" SecRule ARGS "um" "id:'200441',phase:3,log" ), match_log => { error => [ qr/ModSecurity: Warning. Pattern match "um" at ARGS:array.array|ModSecurity: JSON support was not enabled/s, 1 ], debug => [ qr/ARGS:array.array|ARGS:array.array/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/json", ], normalize_raw_request_data( q( [ "um", "um e meio" ] ), ), ), }, { type => "rule", comment => "json parser - issue #1576 - 3", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule REQUEST_HEADERS:Content-Type "application/json" \\ "id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON" SecRule ARGS "seis" "id:'200441',phase:3,log" ), match_log => { error => [ qr/ModSecurity: Warning. Pattern match "seis" at ARGS:array.array.cinco.|ModSecurity: JSON support was not enabled/s, 1 ], debug => [ qr/ARGS:array.array|ARGS:array.array|ARGS:array.array.tres|ARGS:array.array.cinco/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/json", ], normalize_raw_request_data( q( [ "um", "um e meio", { "tres": "quatro", "cinco": "seis" } ] ), ), ), }, { type => "rule", comment => "json parser - parsing depth not exceeded", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyJsonDepthLimit 5 SecRule REQUEST_HEADERS:Content-Type "application/json" \\ "id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON" SecRule REQBODY_ERROR "!\@eq 0" "id:'200442',phase:2,log,deny,status:403,msg:'Failed to parse request body'" ), match_log => { debug => [ qr/key/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/json", ], normalize_raw_request_data( q( { "key1":{"key2":{"key3":{"key4":{"key5":"thevalue"}}}} } ), ), ), }, { type => "rule", comment => "json parser - parsing depth exceeded", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecDebugLog $ENV{DEBUG_LOG} SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecDebugLogLevel 9 SecRequestBodyJsonDepthLimit 3 SecRule REQUEST_HEADERS:Content-Type "application/json" \\ "id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON" SecRule REQBODY_ERROR "!\@eq 0" "id:'200443',phase:2,log,deny,status:403,msg:'Failed to parse request body'" ), match_log => { audit => [ qr/JSON parsing error: JSON depth limit exceeded/s, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/json", ], normalize_raw_request_data( q( { "key1":{"key2":{"key3":{"key4":{"key5":"thevalue"}}}} } ), ), ), } modsecurity-2.9.5/tests/regression/rule/00-script.t0000664000175000017500000000266514147005233023427 0ustar mhsvierulamhsvierula### Test for SecRuleScript # Lua { type => "rule", comment => "SecRuleScript (lua absolute nomatch)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 1 SecRuleScript "$ENV{CONF_DIR}/test.lua" "phase:2,deny" ), match_log => { -error => [ qr/Lua script matched\./, 1 ], debug => [ qr/Test message\./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "rule", comment => "SecRuleScript (lua relative nomatch)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 1 SecRuleScript "test.lua" "phase:2,deny" ), match_log => { -error => [ qr/Lua script matched\./, 1 ], debug => [ qr/Test message\./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "rule", comment => "SecRuleScript (lua relative match)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 1 SecRuleScript "match.lua" "phase:2,deny" ), match_log => { error => [ qr/ModSecurity: Access denied with code 403 \(phase 2\)\. Lua script matched\./, 1 ], debug => [ qr/Test message\./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, modsecurity-2.9.5/tests/regression/rule/00-inheritance.t0000664000175000017500000000007714147005233024407 0ustar mhsvierulamhsvierula### Tests for rule inheritance ### TODO: # SecRuleInheritance modsecurity-2.9.5/tests/regression/rule/20-exceptions.t0000664000175000017500000001164314147005233024302 0ustar mhsvierulamhsvierula### Tests for rule exceptions # SecRuleRemoveById { type => "rule", comment => "SecRuleRemoveById (single)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule REQUEST_URI "test" "phase:1,deny,status:500,id:101010" SecRuleRemoveById 101010 ), match_log => { -error => [ qr/101010/, 1 ], -audit => [ qr/./, 1 ], debug => [ qr/Starting phase REQUEST_HEADERS\..*This phase consists of 0 rule.*Starting phase RESPONSE_HEADERS\./s, 1 ], -debug => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "rule", comment => "SecRuleRemoveById (multiple)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule REQUEST_URI "test" "phase:1,deny,status:500,id:101010" SecRule REQUEST_URI "test" "phase:1,deny,status:500,id:202020" SecRule REQUEST_URI "test" "phase:1,deny,status:500,id:303030" SecRuleRemoveById 101010 202020 303030 ), match_log => { -error => [ qr/101010|202020|303030/, 1 ], -audit => [ qr/./, 1 ], debug => [ qr/Starting phase REQUEST_HEADERS\..*This phase consists of 0 rule.*Starting phase RESPONSE_HEADERS\./s, 1 ], -debug => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "rule", comment => "SecRuleRemoveById (range)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule REQUEST_URI "test" "phase:1,deny,status:500,id:101010" SecRule REQUEST_URI "test" "phase:1,deny,status:500,id:202020" SecRule REQUEST_URI "test" "phase:1,deny,status:500,id:303030" SecRuleRemoveById 101010-303030 ), match_log => { -error => [ qr/101010|202020|303030/, 1 ], -audit => [ qr/./, 1 ], debug => [ qr/Starting phase REQUEST_HEADERS\..*This phase consists of 0 rule.*Starting phase RESPONSE_HEADERS\./s, 1 ], -debug => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "rule", comment => "SecRuleRemoveById (multiple + range)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule REQUEST_URI "test" "phase:1,deny,status:500,id:101010" SecRule REQUEST_URI "test" "phase:1,deny,status:500,id:202020" SecRule REQUEST_URI "test" "phase:1,deny,status:500,id:303030" SecRule REQUEST_URI "test" "phase:1,deny,status:500,id:404040" SecRuleRemoveById 101010 202020-404040 ), match_log => { -error => [ qr/101010|202020|303030|404040/, 1 ], -audit => [ qr/./, 1 ], debug => [ qr/Starting phase REQUEST_HEADERS\..*This phase consists of 0 rule.*Starting phase RESPONSE_HEADERS\./s, 1 ], -debug => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # SecRuleRemoveByMsg { type => "rule", comment => "SecRuleRemoveByMsg", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule REQUEST_URI "test" "phase:1,deny,status:500,msg:'testing rule',id:500001" SecRuleRemoveByMsg "testing rule" ), match_log => { -error => [ qr/500001/, 1 ], -audit => [ qr/./, 1 ], debug => [ qr/Starting phase REQUEST_HEADERS\..*This phase consists of 0 rule.*Starting phase RESPONSE_HEADERS\./s, 1 ], -debug => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # SecRuleUpdateActionById { type => "rule", comment => "SecRuleUpdateActionById", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule REQUEST_URI "test" "phase:1,deny,status:500,msg:'testing rule',id:500002" SecRuleUpdateActionById 500002 "pass,nolog" ), match_log => { -error => [ qr/500002/, 1 ], -audit => [ qr/./, 1 ], debug => [ qr/id:500002,pass,nolog/, 1 ], -debug => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "rule", comment => "SecRuleUpdateActionById (chain)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule REQUEST_URI "test" "phase:1,deny,status:500,msg:'testing rule',chain,id:500003" SecRule ARGS "bar" SecRuleUpdateActionById 500003 "pass,nolog" ), match_log => { -error => [ qr/500003/, 1 ], -audit => [ qr/./, 1 ], debug => [ qr/id:500003,pass,nolog/, 1 ], -debug => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?foo=bar", ), }, modsecurity-2.9.5/tests/regression/misc/0000775000175000017500000000000014147005233021474 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/misc/30-fuzzyHash.t0000664000175000017500000001325514147005233024102 0ustar mhsvierulamhsvierula### libinjection. { type => "misc", comment => "fuzzyHash test", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule REQUEST_BODY "\@fuzzyHash $ENV{CONF_DIR}/ssdeep.txt 1" "id:192372,log,deny" ), match_log => { error => [ qr/ModSecurity: Access denied with code 403 \(phase 2\)\. Fuzzy hash of REQUEST_BODY matched with 96:MbQ1L0LDX8GPI8ov3D2D9zd6.*"modsecurity.conf-recommended"|ModSecurity was not compiled with ssdeep support./, 1], debug => [ qr/Access denied with code 403 \(phase 2\)\. Fuzzy hash of REQUEST_BODY matched with 96:MbQ1L0LDX8GPI8ov3D2D9zd6.*"modsecurity.conf-recommended"|ModSecurity was not compiled with ssdeep support./, 1], }, match_response => { status => qr/^403|200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/index.html", [ "Content-Type" => "application/x-www-form-urlencoded", ], # Args " # -- Rule engine initialization ---------------------------------------------- # Enable ModSecurity, attaching it to every transaction. Use detection # only to start with, because that minimises the chances of post-installation # disruption. # SecRuleEngine DetectionOnly # -- Request body handling --------------------------------------------------- # Allow ModSecurity to access request bodies. If you don't, ModSecurity # won't be able to see any POST parameters, which opens a large security # hole for attackers to exploit. # SecRequestBodyAccess On # Enable XML request body parser. # Initiate XML Processor in case of xml content-type # SecRule REQUEST_HEADERS:Content-Type \"text/xml\" \ \"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML\" # Enable JSON request body parser. # Initiate JSON Processor in case of JSON content-type; change accordingly # if your application does not use 'application/json' # SecRule REQUEST_HEADERS:Content-Type \"application/json\" \ \"id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON\" # Maximum request body size we will accept for buffering. If you support # file uploads then the value given on the first line has to be as large # as the largest file you are willing to accept. The second value refers # to the size of data, with files excluded. You want to keep that value as # low as practical. # SecRequestBodyLimit 13107200 SecRequestBodyNoFilesLimit 131072 # Store up to 128 KB of request body data in memory. When the multipart # parser reachers this limit, it will start using your hard disk for # storage. That is slow, but unavoidable. # SecRequestBodyInMemoryLimit 131072 # What do do if the request body size is above our configured limit. # Keep in mind that this setting will automatically be set to ProcessPartial # when SecRuleEngine is set to DetectionOnly mode in order to minimize # disruptions when initially deploying ModSecurity. # SecRequestBodyLimitAction Reject # Verify that we've correctly processed the request body. # As a rule of thumb, when failing to process a request body # you should reject the request (when deployed in blocking mode) # or log a high-severity alert (when deployed in detection-only mode). # SecRule REQBODY_ERROR \"!\@eq 0\" \ \"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\" " ), }, { type => "misc", comment => "fuzzyHash test", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule REQUEST_BODY "\@fuzzyHash $ENV{CONF_DIR}/ssdeep.txt 1" "id:192372,log,deny" ), match_log => { -error => [ qr/Fuzzy hash of REQUEST_BODY matched/, 1], -debug => [ qr/Fuzzy hash of REQUEST_BODY matched/, 1], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/index.html", [ "Content-Type" => "application/x-www-form-urlencoded", ], # Args " wheee " ), }, { type => "misc", comment => "fuzzy hash with FILES_TMP_CONTENT", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecUploadKeepFiles On SecRule FILES_TMP_CONTENT "\@fuzzyHash $ENV{CONF_DIR}/ssdeep.txt 1" "id:192372,log,deny" ), match_log => { debug => [ qr/operator \"fuzzyHash\" with param \".*ssdeep.txt 1\" against FILES_TMP_CONTENT:image1/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary=0000), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image1"; filename="image1.jpg" Content-Type: image/jpeg BINARYDATA1 --0000 Content-Disposition: form-data; name="image2"; filename="image2.jpg" Content-Type: image/jpeg BINARYDATA2 --0000 Content-Disposition: form-data; name="image3"; filename="image3.jpg" Content-Type: image/jpeg BINARYDATA3 --0000 Content-Disposition: form-data; name="test" This is test data. --0000-- ), ), ), }, modsecurity-2.9.5/tests/regression/misc/40-secRemoteRules.t.in0000664000175000017500000000225414147005233025453 0ustar mhsvierulamhsvierula### SecRemoteRules { type => "misc", comment => "SecRemoteRules load", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRemoteRules 123 "https://www.modsecurity.org/modsecurity-regression-test-secremoterules.txt" ), match_log => { error => [ qr/ModSecurity: Loaded 1 rule/, 1], }, }, { type => "misc", comment => "SecRemoteRules apply some remote rules", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRemoteRules 123 "https://www.modsecurity.org/modsecurity-regression-test-secremoterules.txt" ), match_log => { error => [ qr/ModSecurity: Warning. Matched phrase \"127.0.0.1\" at REQUEST_FILENAME./, 1], debug => [ qr/Matched phrase \"127.0.0.1\" at REQUEST_FILENAME/, 1 ], }, match_response => { status => qr/^404$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/127.0.0.1.html", [ "Content-Type" => "application/x-www-form-urlencoded", ], # Args "some_variable=-1' and 1=1 union/* foo */select load_file('/etc/passwd')--" ), }, modsecurity-2.9.5/tests/regression/misc/50-ipmatchfromfile-external.t.in0000664000175000017500000000462014147005233027503 0ustar mhsvierulamhsvierula### ipMatchFromFile external resource { type => "misc", comment => "ipMatchFromFile", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule REMOTE_ADDR "\@ipMatchFromFile https://www.modsecurity.org/modsecurity-regression-test.txt" "id:10500,pass" ), match_log => { error => [ qr/ModSecurity: Warning. IPmatchFromFile: \"127.0.0.1\" matched at REMOTE_ADDR./, 1], debug => [ qr/IPmatchFromFile: \"127.0.0.1\" matched at REMOTE_ADDR./, 1 ], -error => [ qr/ModSecurity: Problems loading external resources:/, 1], }, match_response => { status => qr/^404$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/127.0.0.1.html", [ "Content-Type" => "application/x-www-form-urlencoded", ], # Args "some_variable=-1' and 1=1 union/* foo */select load_file('/etc/passwd')--" ), }, { type => "misc", comment => "ipMatchFromFile - 404 download", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRemoteRulesFailAction Warn SecRule REMOTE_ADDR "\@ipMatchFromFile https://www.modsecurity.org/modsecurity-regression-test-404.txt" "id:10500,pass" ), match_log => { error => [ qr/ModSecurity: Problems loading external resources: Failed to download: \"https:\/\/www.modsecurity.org\/modsecurity-regression-test-404.txt\" error: HTTP response code said error./, 1], }, match_response => { status => qr/^404$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/127.0.0.1.html", [ "Content-Type" => "application/x-www-form-urlencoded", ], # Args "some_variable=-1' and 1=1 union/* foo */select load_file('/etc/passwd')--" ), }, { type => "misc", comment => "ipMatchFromFile - bad certificate name", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRemoteRulesFailAction Warn SecRule REMOTE_ADDR "\@ipMatchFromFile https://status.modsecurity.org/modsecurity-regression-test-huge-ip-list.txt" "id:10500,pass" ), match_log => { error => [ qr/ModSecurity: Problems loading external resources: Failed to download: \"https:\/\/status.modsecurity.org\/modsecurity-regression-test-huge-ip-list.txt\" error: [SSL peer certificate or SSH remote key was not OK.|Couldn't connect to server.]/, 1], }, }, modsecurity-2.9.5/tests/regression/misc/60-pmfromfile-external.t.in0000664000175000017500000000530714147005233026476 0ustar mhsvierulamhsvierula### pmfromfile external resource { type => "misc", comment => "pmfromfile", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule REQUEST_FILENAME "\@pmFromFile https://www.modsecurity.org/modsecurity-regression-test.txt" "id:'123',phase:2,log,pass,t:none" ), match_log => { error => [ qr/ModSecurity: Warning. Matched phrase \"127.0.0.1\" at REQUEST_FILENAME./, 1], debug => [ qr/Matched phrase \"127.0.0.1\" at REQUEST_FILENAME/, 1 ], -error => [ qr/ModSecurity: Problems loading external resources:/, 1], }, match_response => { status => qr/^404$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/127.0.0.1.html", [ "Content-Type" => "application/x-www-form-urlencoded", ], # Args "some_variable=-1' and 1=1 union/* foo */select load_file('/etc/passwd')--" ), }, { type => "misc", comment => "pmfromfile - 404 download", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRemoteRulesFailAction Warn SecRule REQUEST_FILENAME "\@pmFromFile https://www.modsecurity.org/modsecurity-regression-test-404.txt" "id:'123',phase:2,log,pass,t:none" ), match_log => { error => [ qr/ModSecurity: Problems loading external resources: Failed to download: \"https:\/\/www.modsecurity.org\/modsecurity-regression-test-404.txt\" error: HTTP response code said error./, 1], }, match_response => { status => qr/^404$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/127.0.0.1.html", [ "Content-Type" => "application/x-www-form-urlencoded", ], # Args "some_variable=-1' and 1=1 union/* foo */select load_file('/etc/passwd')--" ), }, { type => "misc", comment => "pmfromfile - bad certificate name", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRemoteRulesFailAction Warn SecRule REQUEST_FILENAME "\@pmFromFile https://status.modsecurity.org/modsecurity-regression-test.txt" "id:'123',phase:2,log,pass,t:none" ), match_log => { error => [ qr/ModSecurity: Problems loading external resources: Failed to download: \"https:\/\/status.modsecurity.org\/modsecurity-regression-test.txt\" error: [SSL peer certificate or SSH remote key was not OK.|Couldn't connect to server.]/, 1], }, match_response => { status => qr/^404$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/127.0.0.1.html", [ "Content-Type" => "application/x-www-form-urlencoded", ], # Args "some_variable=-1' and 1=1 union/* foo */select load_file('/etc/passwd')--" ), }, modsecurity-2.9.5/tests/regression/misc/10-tfn-cache.t0000664000175000017500000001351514147005233023734 0ustar mhsvierulamhsvierula### Transformation Caching { type => "misc", comment => "tfncache (simple fully cached)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 # We need to make this work no matter what the defaults may change to SecCacheTransformations On "minlen:1,maxlen:0" # This should cache it SecRule ARGS_GET "WillNotMatch" "phase:1,t:none,t:removeWhiteSpace,t:lowercase,pass,nolog,id:500037" # This should use the cached value SecRule ARGS_GET:test "foobar" "phase:1,t:none,t:removeWhiteSpace,t:lowercase,deny,id:500038" ), match_log => { debug => [ qr/removeWhiteSpace,lowercase: "foobar" .*cached/, 1 ], -debug => [ qr/partially cached/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/index.html?test=Foo+Bar", ), }, { type => "misc", comment => "tfncache (simple partially cached)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 # We need to make this work no matter what the defaults may change to SecCacheTransformations On "minlen:1,maxlen:0,incremental:off,maxitems:0" # This should cache it SecRule ARGS_GET "WillNotMatch" "phase:1,t:none,t:removeWhiteSpace,pass,nolog,id:500039" # This should use the partially cached value SecRule ARGS_GET:test "foobar" "phase:1,t:none,t:removeWhiteSpace,t:lowercase,deny,id:500040" ), match_log => { debug => [ qr/removeWhiteSpace: "FooBar" .*partially cached/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/index.html?test=Foo+Bar", ), }, { type => "misc", comment => "tfncache (separate phases)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 # We need to make this work no matter what the defaults may change to SecCacheTransformations On "minlen:1,maxlen:0" # This should cache it SecRule ARGS_GET "WillNotMatch" "phase:1,t:none,t:removeWhiteSpace,t:lowercase,pass,nolog,id:500041" # This should use the cached value SecRule ARGS_GET:test "foobar" "phase:2,t:none,t:removeWhiteSpace,t:lowercase,deny,id:500042" ), match_log => { -debug => [ qr/removeWhiteSpace,lowercase: "foobar" .*cached/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/index.html?test=Foo+Bar", ), }, { type => "misc", comment => "tfncache (non-modifying tfns cached)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 # We need to make this work no matter what the defaults may change to SecCacheTransformations On "minlen:1,maxlen:0" # This should cache it SecRule ARGS_GET "WillNotMatch" "phase:1,t:none,t:removeWhiteSpace,t:lowercase,pass,nolog,id:500043" # This should use the cached value SecRule ARGS_GET:test "foobar" "phase:1,t:none,t:removeWhiteSpace,t:lowercase,deny,id:500044" ), match_log => { debug => [ qr/removeWhiteSpace,lowercase: "foobar" .*cached/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/index.html?test=foo+bar", ), }, { type => "misc", comment => "tfncache (unique keys)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On # We need to make this work no matter what the defaults may change to SecCacheTransformations On "minlen:1,maxlen:0" # This should cache it SecRule ARGS "WillNotMatch" "phase:2,t:none,t:removeWhiteSpace,t:lowercase,pass,id:500045" # This should see cached versions of *both* ARGS_GET SecRule ARGS:test "queryval" "phase:2,t:none,t:removeWhiteSpace,t:lowercase,deny,chain,id:500046" SecRule ARGS:test "firstval" "t:none,t:removeWhiteSpace,t:lowercase,chain" SecRule ARGS:test "secondval" "t:none,t:removeWhiteSpace,t:lowercase" ), match_log => { debug => [ qr/removeWhiteSpace,lowercase: "queryval" .*removeWhiteSpace,lowercase: "firstval" .*cached.*removeWhiteSpace,lowercase: "secondval" .*cached/s, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/index.html?test=Query+Val", [ "Content-Type" => "application/x-www-form-urlencoded", ], # Args "test=First+Val&test=Second+Val", ), }, { type => "misc", comment => "tfncache (large cache)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRequestBodyNoFilesLimit 1048576 SecRequestBodyInMemoryLimit 131072 SecResponseBodyLimit 1048576 # We need to make this work no matter what the defaults may change to SecCacheTransformations On "minlen:1,maxlen:0,maxitems:0" # This should cache it in all phases SecRule ARGS "WillNotMatch" "phase:1,t:none,t:removeWhiteSpace,t:lowercase,pass,nolog,id:500048" SecRule ARGS "WillNotMatch" "phase:2,t:none,t:removeWhiteSpace,t:lowercase,pass,nolog,id:500049" SecRule ARGS "WillNotMatch" "phase:3,t:none,t:removeWhiteSpace,t:lowercase,pass,nolog,id:500050" SecRule ARGS "WillNotMatch" "phase:4,t:none,t:removeWhiteSpace,t:lowercase,pass,nolog,id:500051" # This should use the cached value SecRule ARGS "foobar" "phase:4,t:none,t:removeWhiteSpace,t:lowercase,deny,id:500052" ), match_log => { debug => [ qr/Adding request argument \(BODY\): name "test", value "Foo Bar"/, 60, "Waiting for httpd to process request: "], -error => [ qr/segmentation fault/i, 60 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/index.html", [ "Content-Type" => "application/x-www-form-urlencoded", ], # 1000 Args join("&", map { sprintf "arg%08d=0123456789abcdef+0123456789ABCDEF+0123456789abcdef", $_ } (1 .. 1000))."&test=Foo+Bar", ), }, modsecurity-2.9.5/tests/regression/misc/20-status-engine.t0000664000175000017500000000571014147005233024671 0ustar mhsvierulamhsvierula### Test the SecStatusEngine # On { type => "misc", comment => "Setting SecStatusEngine to On", conf => qq( SecRuleEngine On SecStatusEngine On ), match_log => { error => [ qr/ModSecurity: StatusEngine call successfully sent/, 1], -error => [ qr/Status engine is currently disabled, enable it by set SecStatusEngine to On/, 1], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, # Off { type => "misc", comment => "Setting SecStatusEngine to Off", conf => qq( SecRuleEngine On SecStatusEngine Off ), match_log => { -error => [ qr/ModSecurity: StatusEngine call successfully sent/, 1], error => [ qr/Status engine is currently disabled, enable it by set SecStatusEngine to On/, 1], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, # On and SecServerSignature { type => "misc", comment => "SecStatusEngine On using SecServerSignature", conf => qq( SecRuleEngine On SecServerSignature "SpiderServer v0.1a" SecStatusEngine On ), match_log => { error => [ qr/ModSecurity: StatusEngine call successfully sent/, 1], -error => [ qr/StatusEngine call: .*SpiderServer v0.1a.*/, 1], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, # On and SecServerSignature { type => "misc", comment => "SecStatusEngine On/SecServerSignature - checking signature", conf => qq( SecRuleEngine On SecServerSignature "SpiderServer v0.1a" SecStatusEngine On ), match_log => { error => { apache => [ qr/StatusEngine call: \"[0-9]+.[0-9]+.[0-9]+[-RC]*[0-9]*\,Apache/, 1], nginx => [ qr/StatusEngine call: \"[0-9]+.[0-9]+.[0-9]+[-RC]*[0-9]*\,nginx/, 1], } }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, # On and SecServerSignature { type => "misc", comment => "SecStatusEngine On - checking signature", conf => qq( SecStatusEngine On ), match_log => { error => { apache => [ qr/StatusEngine call: \"[0-9]+.[0-9]+.[0-9]+[-RC]*[0-9]*\,Apache/, 1], nginx => [ qr/StatusEngine call: \"[0-9]+.[0-9]+.[0-9]+[-RC]*[0-9]*\,nginx/, 1], } }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, modsecurity-2.9.5/tests/regression/misc/00-phases.t0000664000175000017500000001075114147005233023365 0ustar mhsvierulamhsvierula### Test the phases # Phase 1 (request headers) { type => "misc", comment => "phase 1", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType text/plain null SecRule REQUEST_LINE "^POST" "phase:1,pass,log,auditlog,id:500169" SecRule ARGS "val1" "phase:1,pass,log,auditlog,id:500170" SecRule RESPONSE_HEADERS:Last-Modified "." "phase:1,pass,log,auditlog,id:500171" SecRule RESPONSE_BODY "TEST" "phase:1,pass,log,auditlog,id:500172" ), match_log => { error => [ qr/Pattern match "\^POST" at REQUEST_LINE/, 1 ], -error => [ qr/Pattern match .* (ARGS|RESPONSE)/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, # Phase 2 (request body) { type => "misc", comment => "phase 2", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType text/plain null SecRule REQUEST_LINE "^POST" "phase:2,pass,log,auditlog,id:500173" SecRule ARGS "val1" "phase:2,pass,log,auditlog,id:500174" SecRule RESPONSE_HEADERS:Last-Modified "." "phase:2,pass,log,auditlog,id:500175" SecRule RESPONSE_BODY "TEST" "phase:2,pass,log,auditlog,id:500176" ), match_log => { error => [ qr/Pattern match "\^POST" at REQUEST_LINE.*Pattern match "val1" at ARGS/s, 1 ], -error => [ qr/Pattern match .* RESPONSE/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, # Phase 3 (response headers) { type => "misc", comment => "phase 3", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType text/plain null SecRule REQUEST_LINE "^POST" "phase:3,pass,log,auditlog,id:500177" SecRule ARGS "val1" "phase:3,pass,log,auditlog,id:500178" SecRule RESPONSE_HEADERS:Last-Modified "." "phase:3,pass,log,auditlog,id:500179" SecRule RESPONSE_BODY "TEST" "phase:3,pass,log,auditlog,id:500180" ), match_log => { error => [ qr/Pattern match "\^POST" at REQUEST_LINE.*Pattern match "val1" at ARGS.*Pattern match "\." at RESPONSE_HEADERS/s, 1 ], -error => [ qr/Pattern match .* RESPONSE_BODY/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, # Phase 4 (response body) { type => "misc", comment => "phase 4", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType text/plain null SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecRule REQUEST_LINE "^POST" "phase:4,pass,log,auditlog,id:500181" SecRule ARGS "val1" "phase:4,pass,log,auditlog,id:500182" SecRule RESPONSE_HEADERS:Last-Modified "." "phase:4,pass,log,auditlog,id:500183" SecRule RESPONSE_BODY "TEST" "phase:4,pass,log,auditlog,id:500184" ), match_log => { error => [ qr/Pattern match "\^POST" at REQUEST_LINE.*Pattern match "val1" at ARGS.*Pattern match "\." at RESPONSE_HEADERS.*Pattern match "TEST" at RESPONSE_BODY/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, # Phase 5 (logging) { type => "misc", comment => "phase 5", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType text/plain null SecRule REQUEST_LINE "^POST" "phase:5,pass,log,auditlog,id:500185" SecRule ARGS "val1" "phase:5,pass,log,auditlog,id:500186" SecRule RESPONSE_HEADERS:Last-Modified "." "phase:5,pass,log,auditlog,id:500187" SecRule RESPONSE_BODY "TEST" "phase:5,pass,log,auditlog,id:500188" ), match_log => { error => [ qr/Pattern match "\^POST" at REQUEST_LINE.*Pattern match "val1" at ARGS.*Pattern match "\." at RESPONSE_HEADERS.*Pattern match "TEST" at RESPONSE_BODY/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, modsecurity-2.9.5/tests/regression/misc/25-libinjection.t0000664000175000017500000000515314147005233024562 0ustar mhsvierulamhsvierula### libinjection. { type => "misc", comment => "libinjection SQLi - with SQLi", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule REQUEST_BODY "\@detectSQLi" "id:192372,log,deny" ), match_log => { error => [ qr/detected SQLi using libinjection/, 1], debug => [ qr/detected SQLi using libinjection/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/index.html", [ "Content-Type" => "application/x-www-form-urlencoded", ], # Args "some_variable=-1' and 1=1 union/* foo */select load_file('/etc/passwd')--" ), }, { type => "misc", comment => "libinjection SQLi - without SQLi", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule REQUEST_BODY "\@detectSQLi" "id:192372,log,deny" ), match_log => { -error => [ qr/detected SQLi using libinjection/, 1], -debug => [ qr/detected SQLi using libinjection/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/index.html", [ "Content-Type" => "application/x-www-form-urlencoded", ], # Args "some_variable=hello cruel world" ), }, { type => "misc", comment => "libinjection XSS - with XSS", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule REQUEST_BODY "\@detectXSS" "id:192372,log,deny" ), match_log => { error => [ qr/detected XSS using libinjection/, 1], debug => [ qr/detected XSS using libinjection/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/index.html", [ "Content-Type" => "application/x-www-form-urlencoded", ], # Args "some_variable=" ), }, { type => "misc", comment => "libinjection XSS - without XSS", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule REQUEST_BODY "\@detectXSS" "id:192372,log,deny" ), match_log => { -error => [ qr/detected XSS using libinjection/, 1], -debug => [ qr/detected XSS using libinjection/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/index.html", [ "Content-Type" => "application/x-www-form-urlencoded", ], # Args "some_variable=hello cruel world" ), } modsecurity-2.9.5/tests/regression/misc/00-multipart-parser.t0000664000175000017500000016542114147005233025422 0ustar mhsvierulamhsvierula### Multipart parser tests # Normal { type => "misc", comment => "multipart parser (normal)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500055" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500056" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500057" ), match_log => { debug => [ qr/Added file part [0-9a-h]+ to the list: name "image" file name "image.jpg" \(offset 258, length 10\).*Adding request argument \(BODY\): name "name", value "Brian Rectanus".*Adding request argument \(BODY\): name "email", value "brian.rectanus\@breach.com"/s, 1 ], -debug => [ qr/Multipart.*(?i:error|warning)/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary=0000), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --0000-- ), ), ), }, # Final CRLF or not, we should still work { type => "misc", comment => "multipart parser (final CRLF)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500058" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500059" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500060" ), match_log => { debug => [ qr/Adding request argument \(BODY\): name "a", value "1".*Adding request argument \(BODY\): name "b", value "2"/s, 1 ], -debug => [ qr/Multipart error:/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "multipart/form-data; boundary=---------------------------69343412719991675451336310646", ], normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1 -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" 2 -----------------------------69343412719991675451336310646-- ), ), ), }, # No final CRLF { type => "misc", comment => "multipart parser (no final CRLF)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500061" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500062" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500063" ), match_log => { debug => [ qr/Adding request argument \(BODY\): name "a", value "1".*Adding request argument \(BODY\): name "b", value "2"/s, 1 ], -debug => [ qr/Multipart error:/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "multipart/form-data; boundary=---------------------------69343412719991675451336310646", ], normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1 -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" 2 -----------------------------69343412719991675451336310646--), ), ), }, # Should work with a boundary of "boundary" { type => "misc", comment => "multipart parser (boundary contains \"boundary\")", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500064" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500065" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500066" ), match_log => { debug => [ qr/Adding request argument \(BODY\): name "a", value "1".*Adding request argument \(BODY\): name "b", value "2"/s, 1 ], -debug => [ qr/Multipart error:/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "multipart/form-data; boundary=------------------------------------------------boundary", ], normalize_raw_request_data( q( --------------------------------------------------boundary Content-Disposition: form-data; name="a" 1 --------------------------------------------------boundary Content-Disposition: form-data; name="b" 2 --------------------------------------------------boundary-- ), ), ), }, { type => "misc", comment => "multipart parser (boundary contains \"bOuNdArY\")", note => q( KHTML Boundary ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500067" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500068" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500069" ), match_log => { debug => [ qr/Adding request argument \(BODY\): name "a", value "1".*Adding request argument \(BODY\): name "b", value "2"/s, 1 ], -debug => [ qr/Multipart error:/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "multipart/form-data; boundary=--------0xKhTmLbOuNdArY", ], normalize_raw_request_data( q( ----------0xKhTmLbOuNdArY Content-Disposition: form-data; name="a" 1 ----------0xKhTmLbOuNdArY Content-Disposition: form-data; name="b" 2 ----------0xKhTmLbOuNdArY-- ), ), ), }, # We should handle data starting with a "--" { type => "misc", comment => "multipart parser (data contains \"--\")", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500070" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500071" ), match_log => { debug => [ qr/Adding request argument \(BODY\): name "a", value "--test".*Adding request argument \(BODY\): name "b", value "--"/s, 1 ], -debug => [ qr/Multipart error:/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "multipart/form-data; boundary=---------------------------69343412719991675451336310646", ], normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" --test -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" -- -----------------------------69343412719991675451336310646--), ), ), }, # We should emit warnings for parsing errors { type => "misc", comment => "multipart parser error (no final boundary)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecAuditLog "$ENV{AUDIT_LOG}" SecAuditEngine RelevantOnly ), match_log => { debug => [ qr/Final boundary missing/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "multipart/form-data; boundary=---------------------------69343412719991675451336310646", ], normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1 -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" 2 ), ), ), }, { type => "misc", comment => "multipart parser error (no disposition)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecAuditLog "$ENV{AUDIT_LOG}" SecAuditEngine RelevantOnly ), match_log => { -debug => [ qr/Multipart error:/, 1 ], audit => [ qr/Part missing Content-Disposition header/, 1 ], debug => [ qr/Part missing Content-Disposition header/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "multipart/form-data; boundary=---------------------------69343412719991675451336310646", ], normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 1 -----------------------------69343412719991675451336310646 2 -----------------------------69343412719991675451336310646-- ), ), ), }, { type => "misc", comment => "multipart parser error (bad disposition)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecAuditLog "$ENV{AUDIT_LOG}" SecAuditEngine RelevantOnly ), match_log => { audit => [ qr/Invalid Content-Disposition header/, 1 ], debug => [ qr/Invalid Content-Disposition header/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "multipart/form-data; boundary=---------------------------69343412719991675451336310646", ], normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data name="a" 1 -----------------------------69343412719991675451336310646 Content-Disposition: form-data name="b" 2 -----------------------------69343412719991675451336310646-- ), ), ), }, { type => "misc", comment => "multipart parser error (no disposition name)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecAuditLog "$ENV{AUDIT_LOG}" SecAuditEngine RelevantOnly ), match_log => { -debug => [ qr/Multipart error:/, 1 ], audit => [ qr/Content-Disposition header missing name field/, 1 ], debug => [ qr/Content-Disposition header missing name field/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "multipart/form-data; boundary=---------------------------69343412719991675451336310646", ], normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; 1 -----------------------------69343412719991675451336310646 Content-Disposition: form-data; 2 -----------------------------69343412719991675451336310646-- ), ), ), }, # Zero length part name should not crash { type => "misc", comment => "multipart parser (zero length part name)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "!\@eq 1" "phase:2,deny,id:500072" SecRule REQBODY_PROCESSOR_ERROR "!\@eq 1" "phase:2,deny,id:500073" ), match_log => { debug => [ qr/name: a.*variable: 1.*Invalid part header \(header name missing\)/s, 1 ], -debug => [ qr/Adding request argument \(BODY\): name "b"/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "multipart/form-data; boundary=---------------------------69343412719991675451336310646", ], normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1 -----------------------------69343412719991675451336310646 : -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" 2 -----------------------------69343412719991675451336310646-- ), ), ), }, # Part header folding { type => "misc", comment => "multipart parser (part header folding - space)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "!\@eq 1" "phase:2,deny,status:403,id:500074" SecRule MULTIPART_HEADER_FOLDING "!\@eq 1" "phase:2,deny,status:403,id:500075" SecRule MULTIPART_INVALID_HEADER_FOLDING "!\@eq 0" "phase:2,deny,status:403,id:500076" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,status:403,id:500077" ), match_log => { debug => [ qr/name: a.*variable: 1.*name: b.*variable: 2/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "multipart/form-data; boundary=---------------------------69343412719991675451336310646", ], normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1 -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" 2 -----------------------------69343412719991675451336310646-- ), ), ), }, { type => "misc", comment => "multipart parser (part header folding - tab)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "!\@eq 1" "phase:2,deny,status:403,id:500078" SecRule MULTIPART_HEADER_FOLDING "!\@eq 1" "phase:2,deny,status:403,id:500079" SecRule MULTIPART_INVALID_HEADER_FOLDING "!\@eq 0" "phase:2,deny,status:403,id:500080" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,status:403,id:500081" ), match_log => { debug => [ qr/name: a.*variable: 1.*name: b.*variable: 2/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "multipart/form-data; boundary=---------------------------69343412719991675451336310646", ], normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1 -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" 2 -----------------------------69343412719991675451336310646-- ), ), ), }, { type => "misc", comment => "multipart parser (part header folding - mixed)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "!\@eq 1" "phase:2,deny,status:403,id:500082" SecRule MULTIPART_HEADER_FOLDING "!\@eq 1" "phase:2,deny,status:403,id:500083" SecRule MULTIPART_INVALID_HEADER_FOLDING "!\@eq 0" "phase:2,deny,status:403,id:500084" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,status:403,id:500085" ), match_log => { debug => [ qr/name: a.*variable: 1.*name: b.*variable: 2/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "multipart/form-data; boundary=---------------------------69343412719991675451336310646", ], normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1 -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" 2 -----------------------------69343412719991675451336310646-- ), ), ), }, { type => "misc", comment => "multipart parser (part header folding - invalid)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "!\@eq 1" "phase:2,deny,status:403,id:500086" SecRule MULTIPART_HEADER_FOLDING "!\@eq 1" "phase:2,deny,status:403,id:500087" SecRule MULTIPART_INVALID_HEADER_FOLDING "!\@eq 1" "phase:2,deny,status:403,id:500088" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,status:403,id:500089" ), match_log => { debug => [ qr/name: a.*variable: 1.*name: b.*variable: 2/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "multipart/form-data; boundary=---------------------------69343412719991675451336310646", ], normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1 -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" 2 -----------------------------69343412719991675451336310646-- ), ), ), }, { type => "misc", comment => "multipart parser (part header folding - mixed invalid)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "!\@eq 1" "phase:2,deny,status:403,id:500090" SecRule MULTIPART_HEADER_FOLDING "!\@eq 1" "phase:2,deny,status:403,id:500091" SecRule MULTIPART_INVALID_HEADER_FOLDING "!\@eq 1" "phase:2,deny,status:403,id:500092" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,status:403,id:500093" ), match_log => { debug => [ qr/name: a.*variable: 1.*name: b.*variable: 2/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "multipart/form-data; boundary=---------------------------69343412719991675451336310646", ], normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1 -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" 2 -----------------------------69343412719991675451336310646-- ), ), ), }, # Data following final boundary should set flag { type => "misc", comment => "multipart parser (data after final boundary)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_DATA_AFTER "\@eq 1" "phase:2,deny,status:403,id:500094" ), match_log => { debug => [ qr/name: a.*variable: 1.*Ignoring data after last boundary/s, 1 ], -debug => [ qr/Adding request argument \(BODY\): name "b"/s, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "multipart/form-data; boundary=---------------------------69343412719991675451336310646", ], normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1 -----------------------------69343412719991675451336310646-- -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" 2 -----------------------------69343412719991675451336310646-- ), ), ), }, # Single quoted data is invalid { type => "misc", comment => "multipart parser (C-D uses single quotes)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "!\@eq 1" "phase:2,deny,id:500095" SecRule MULTIPART_INVALID_QUOTING "!\@eq 1" "phase:2,deny,id:500096" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "chain,phase:2,deny,id:500097" ), match_log => { debug => [ qr/name: a.*variable: 1.*Duplicate Content-Disposition name/s, 1 ], -debug => [ qr/Adding request argument \(BODY\): name "b/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "multipart/form-data; boundary=---------------------------69343412719991675451336310646", ], normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1 -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name=';filename="dummy';name=b;" 2 -----------------------------69343412719991675451336310646-- ), ), ), }, # Invalid boundary separators { type => "misc", comment => "multipart parser (invalid C-T boundary separator - comma)", note => q( PHP 5.2.3 - no effect. ), conf => qq( SecRuleEngine On SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500098" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500099" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500100" ), match_log => { error => [ qr/Invalid boundary in C-T \(malformed\)/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data, boundary=0000), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --0000-- ), ), ), }, { type => "misc", comment => "multipart parser (invalid C-T boundary separator - space)", note => q( PHP 5.2.3 - no effect. ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500101" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500102" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500103" ), match_log => { }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data boundary=0000), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --0000-- ), ), ), }, # Invalid boundary parameter names { type => "misc", comment => "multipart parser (invalid C-T boundary parameter name - case)", note => q( PHP 5.2.3 - does not recognise boundary. ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500104" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500105" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500106" ), match_log => { error => [ qr/Invalid boundary in C-T \(case sensitivity\)/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; bOundAry=0000), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --0000-- ), ), ), }, { type => "misc", comment => "multipart parser (invalid C-T boundary parameter name - trailing chars)", note => q( PHP 5.2.3 - does not recognise boundary. ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500107" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500108" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500109" ), match_log => { error => [ qr/Invalid boundary in C-T \(parameter name\)/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary123=0000), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --0000-- ), ), ), }, # Invalid boundaries { type => "misc", comment => "multipart parser (multiple C-T boundaries - first quoted)", note => q( PHP 5.2.3 - uses first boundary. ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500110" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500111" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500112" ), match_log => { debug => [ qr/Multiple boundary parameters in C-T/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary="0000"; boundary=1111), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --0000-- ), ), ), }, { type => "misc", comment => "multipart parser (multiple C-T boundaries - comma separated)", note => q( PHP 5.2.3 - uses first boundary. ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500113" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500114" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500115" ), match_log => { debug => [ qr/Multiple boundary parameters in C-T/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary=0000, boundary=1111), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --0000-- ), ), ), }, { type => "misc", comment => "multipart parser (boundary whitespace in C-T - after name)", note => q( PHP 5.2.3 - no effect. ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500116" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500117" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500118" ), match_log => { }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary =0000), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --0000-- ), ), ), }, { type => "misc", comment => "multipart parser (boundary whitespace in C-T - before value)", note => q( PHP 5.2.3 - uses " 0000" as boundary. We should probably interpret it as "0000" and just flag a strict error. ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500119" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500120" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500121" ), match_log => { debug => [ qr/boundary whitespace in C-T header/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary= 0000), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --0000-- ), ), ), }, { type => "misc", comment => "multipart parser (boundary whitespace in C-T - after value)", note => q( PHP 5.2.3 - no effect. Apache just silently removes the trailing whitespace for us. ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500122" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500123" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500124" ), match_log => { debug => [ qr/Added file part [0-9a-h]+ to the list: name "image" file name "image.jpg" \(offset 258, length 10\).*Adding request argument \(BODY\): name "name", value "Brian Rectanus".*Adding request argument \(BODY\): name "email", value "brian.rectanus\@breach.com"/s, 1 ], -debug => [ qr/Multipart.*(?i:error|warning)/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary=0000 ), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --0000-- ), ), ), }, # Special chars { type => "misc", comment => "multipart parser (boundary special char - trailing whitespace+token)", note => q( PHP 5.2.3 - uses "0000 1111" as boundary. ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500125" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500126" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500127" ), match_log => { debug => [ qr/No boundaries found in payload/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary=0000 1111), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --0000-- ), ), ), }, { type => "misc", comment => "multipart parser (boundary special char - trailing comma+token)", note => q( PHP 5.2.3 - uses "0000" as boundary. ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500128" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500129" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500130" ), match_log => { debug => [ qr/Invalid boundary in C-T \(characters\)/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary=0000,1111), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --0000-- ), ), ), }, # Quoting { type => "misc", comment => "multipart parser (quoted boundary - normal)", note => q( PHP 5.2.3 - no effect. ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500131" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500132" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500133" ), match_log => { debug => [ qr/boundary was quoted/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary="0000"), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --0000-- ), ), ), }, { type => "misc", comment => "multipart parser (quoted boundary value - whitespace before)", note => q( PHP 5.2.3 - uses " 0000" as boundary. ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500134" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500135" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500136" ), match_log => { debug => [ qr/boundary was quoted.*No boundaries found in payload/s, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary=" 0000"), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --0000-- ), ), ), }, { type => "misc", comment => "multipart parser (quoted boundary value - whitespace after)", note => q( PHP 5.2.3 - uses "0000 " as boundary. Trailing whitespace violates RFC as well. ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500137" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500138" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500139" ), match_log => { debug => [ qr/boundary was quoted.*No boundaries found in payload/s, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary="0000 "), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --0000-- ), ), ), }, { type => "misc", comment => "multipart parser (quoted boundary value - whitespace between)", note => q( PHP 5.2.3 - uses "0000 " as boundary. ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500140" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500141" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500142" ), match_log => { debug => [ qr/boundary was quoted/s, 1 ], -debug => [ qr/No boundaries found in payload/s, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary="0000 1111"), ], normalize_raw_request_data( q( --0000 1111 Content-Disposition: form-data; name="name" Brian Rectanus --0000 1111 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 1111 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --0000 1111-- ), ), ), }, { type => "misc", comment => "multipart parser (quoted boundary value - contained quote)", note => q( PHP 5.2.3 - uses "0000 " as boundary. ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500143" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500144" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500145" ), match_log => { debug => [ qr/Invalid boundary in C-T \(characters\)/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary="00\"00"), ], normalize_raw_request_data( q( --00"00 Content-Disposition: form-data; name="name" Brian Rectanus --00"00 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --00"00 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --00"00-- ), ), ), }, { type => "misc", comment => "multipart parser (quoted boundary value - two quoted values)", note => q( PHP 5.2.3 - does not work, uses "00" as boundary. ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500146" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500147" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500148" ), match_log => { debug => [ qr/Invalid boundary in C-T \(characters\)/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary="00""00"), ], normalize_raw_request_data( q( --00"00 Content-Disposition: form-data; name="name" Brian Rectanus --00"00 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --00"00 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --00"00-- ), ), ), }, { type => "misc", comment => "multipart parser (partial quoted boundary value - only start quote)", note => q( PHP 5.2.3 - breaks parsing. ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500149" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500150" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500151" ), match_log => { debug => [ qr/Invalid boundary in C-T \(quote\)/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary="0000), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --0000-- ), ), ), }, { type => "misc", comment => "multipart parser (partial quoted boundary value - only end quote)", note => q( PHP 5.2.3 - breaks parsing. ), conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500152" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500153" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500154" ), match_log => { debug => [ qr/Invalid boundary in C-T \(quote\)/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary=0000"), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image"; filename="image.jpg" Content-Type: image/jpeg BINARYDATA --0000-- ), ), ), }, # Multipart mixed { type => "misc", comment => "multipart parser (multipart mixed - normal)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500155" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500156" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500157" ), match_log => { debug => [ qr/Invalid Content-Disposition header/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary=0000), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: attachment Content-Type: multipart/mixed; boundary=BbC04y --BbC04y Content-Disposition: file; filename="file1.txt" Content-Type: text/plain ... contents of file1.txt ... --BbC04y Content-Disposition: file; filename="file2.gif Content-Type: image/jpeg Content-Transfer-Encoding: binary ...contents of file2.gif... --0000-- ), ), ), }, { type => "misc", comment => "multipart parser (multipart mixed - missing disposition)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRule MULTIPART_STRICT_ERROR "\@eq 1" "phase:2,deny,id:500158" SecRule MULTIPART_UNMATCHED_BOUNDARY "\@eq 1" "phase:2,deny,id:500159" SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500160" ), match_log => { debug => [ qr/Part missing Content-Disposition header/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary=0000), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Type: multipart/mixed; boundary=BbC04y --BbC04y Content-Disposition: file; filename="file1.txt" Content-Type: text/plain ... contents of file1.txt ... --BbC04y Content-Disposition: file; filename="file2.gif Content-Type: image/jpeg Content-Transfer-Encoding: binary ...contents of file2.gif... --0000-- ), ), ), }, # File limits { type => "misc", comment => "multipart parser (normal)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecTmpDir "$ENV{TEMP_DIR}" SecUploadDir "$ENV{UPLOAD_DIR}" SecUploadKeepFiles On SecUploadFileLimit 2 # These should be set SecRule MULTIPART_STRICT_ERROR "!\@eq 1" "phase:2,deny,id:500161" SecRule MULTIPART_FILE_LIMIT_EXCEEDED "!\@eq 1" "phase:2,deny,id:500162" # This should not be set SecRule REQBODY_PROCESSOR_ERROR "\@eq 1" "phase:2,deny,id:500163" # Theses should still be accurate SecRule &FILES "!\@eq 3" "phase:2,deny,id:500164" SecRule &FILES_NAMES "!\@eq 3" "phase:2,deny,id:500165" SecRule &FILES_SIZES "!\@eq 3" "phase:2,deny,id:500166" SecRule FILES_SIZES:/^image/ "\@eq 0" "phase:2,deny,id:500167" # This should be the SecUploadFileLimit SecRule &FILES_TMPNAMES "!\@eq 2" "phase:2,deny,id:500168" ), match_log => { debug => [ qr/Multipart: Upload file limit exceeded.*name: test.*variable: This is test data/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => q(multipart/form-data; boundary=0000), ], normalize_raw_request_data( q( --0000 Content-Disposition: form-data; name="name" Brian Rectanus --0000 Content-Disposition: form-data; name="email" brian.rectanus@breach.com --0000 Content-Disposition: form-data; name="image1"; filename="image1.jpg" Content-Type: image/jpeg BINARYDATA1 --0000 Content-Disposition: form-data; name="image2"; filename="image2.jpg" Content-Type: image/jpeg BINARYDATA2 --0000 Content-Disposition: form-data; name="image3"; filename="image3.jpg" Content-Type: image/jpeg BINARYDATA3 --0000 Content-Disposition: form-data; name="test" This is test data. --0000-- ), ), ), }, modsecurity-2.9.5/tests/regression/misc/10-pcre.t0000664000175000017500000021616714147005233023045 0ustar mhsvierulamhsvierula### PCRE Limits { type => "misc", comment => "PCRE limits", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRequestBodyLimit 1000000 SecRequestBodyInMemoryLimit 1000000 # Set Limits low SecPcreMatchLimit 100 SecPcreMatchLimitRecursion 100 # Poor REGEX SecRule ARGS "(?:(.{2,})\\1{32,})" "phase:2,deny,capture,msg:'REDoS',id:500053" # Detect PCRE limits exceeded SecRule TX:MSC_PCRE_LIMITS_EXCEEDED "!\@streq 0" "phase:2,deny,msg:'ModSecurity Internal Error Flagged: %{MATCHED_VAR_NAME}',id:500054" ), match_log => { debug => [ qr/PCRE limits exceeded/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/index.html", [ "Content-Type" => "application/x-www-form-urlencoded", ], # Args "test=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad", ), }, modsecurity-2.9.5/tests/regression/action/0000775000175000017500000000000014147005233022016 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/action/00-misc.t0000664000175000017500000000057214147005233023357 0ustar mhsvierulamhsvierula### Test misc actions # TODO: block # TODO: capture # TODO: chain # TODO: deprecatevar # TODO: exec # TODO: expirevar # TODO: initcol # TODO: multiMatch # TODO: pause # TODO: sanitiseArg # TODO: sanitiseMatched # TODO: sanitiseRequestHeader # TODO: sanitiseResponseHeader # TODO: setuid # TODO: setsid # TODO: setenv # TODO: setvar # TODO: skip # TODO: skipAfter # TODO: xmlns modsecurity-2.9.5/tests/regression/action/10-detectiononly-actions.t0000664000175000017500000003453714147005233026753 0ustar mhsvierulamhsvierula### Tests all of the actions in each phase in detection only mode # Pass { type => "action", comment => "pass in phase:1", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAction "phase:1,pass,msg:'PASSED',id:500057" SecAction "phase:1,deny,msg:'DENIED',id:500058" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction.*PASSED/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "pass in phase:2", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:2,pass,msg:'PASSED',id:500059" SecAction "phase:2,deny,msg:'DENIED',id:500060" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction.*PASSED/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "pass in phase:3", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 4 SecAction "phase:3,pass,msg:'PASSED',id:500061" SecAction "phase:3,deny,msg:'DENIED',id:500062" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction.*PASSED/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "pass in phase:4", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 4 SecAction "phase:4,pass,msg:'PASSED',id:500063" SecAction "phase:4,deny,msg:'DENIED',id:500064" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction.*PASSED/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # Allow { type => "action", comment => "allow in phase:1", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:1,allow,msg:'ALLOWED',id:500065" SecAction "phase:1,deny,msg:'DENIED',id:500066" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction.*ALLOWED/, 1 ], -error => [ qr/Access allowed/, 1 ], # TODO: Allow should probably stop rule execution # -error => [ qr/DENIED/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "allow in phase:2", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:2,allow,msg:'ALLOWED',id:500067" SecAction "phase:2,deny,msg:'DENIED',id:500068" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction.*ALLOWED/, 1 ], -error => [ qr/Access allowed/, 1 ], # TODO: Allow should probably stop rule execution # -error => [ qr/DENIED/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "allow in phase:3", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:3,allow,msg:'ALLOWED',id:500069" SecAction "phase:3,deny,msg:'DENIED',id:500070" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction.*ALLOWED/, 1 ], -error => [ qr/Access allowed/, 1 ], # TODO: Allow should probably stop rule execution # -error => [ qr/DENIED/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "allow in phase:4", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:4,allow,msg:'ALLOWED',id:500071" SecAction "phase:4,deny,msg:'DENIED',id:500072" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction.*ALLOWED/, 1 ], -error => [ qr/Access allowed/, 1 ], # TODO: Allow should probably stop rule execution # -error => [ qr/DENIED/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # Deny { type => "action", comment => "deny in phase:1", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:1,deny,msg:'DENIED',id:500073" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction.*DENIED/, 1 ], -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "deny in phase:2", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:2,deny,msg:'DENIED',id:500074" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction.*DENIED/, 1 ], -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "deny in phase:3", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:3,deny,msg:'DENIED',id:500075" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction.*DENIED/, 1 ], -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "deny in phase:4", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:4,deny,msg:'DENIED',id:500076" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction.*DENIED/, 1 ], -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # Drop { type => "action", comment => "drop in phase:1", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:1,drop,msg:'DROPPED',id:500077" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction.*DROPPED/, 1 ], -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "drop in phase:2", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:2,drop,msg:'DROPPED',id:500078" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction.*DROPPED/, 1 ], -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "drop in phase:3", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:3,drop,msg:'DROPPED',id:500079" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction.*DROPPED/, 1 ], -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "drop in phase:4", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:4,drop,msg:'DROPPED',id:500080" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction.*DROPPED/, 1 ], -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # Redirect { type => "action", comment => "redirect in phase:1 (get)", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecRule REQUEST_URI "\@streq /test2.txt" "phase:1,redirect:'http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt',msg:'REDIRECTED',id:500009" ), match_log => { error => [ qr/ModSecurity: Warning. String match "\/test2.txt" at REQUEST_URI.*REDIRECTED/, 1 ], -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, content => qr/^TEST 2$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test2.txt", ), }, { type => "action", comment => "redirect in phase:2 (get)", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecRule REQUEST_URI "\@streq /test2.txt" "phase:2,redirect:'http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt',msg:'REDIRECTED',id:500010" ), match_log => { error => [ qr/ModSecurity: Warning. String match "\/test2.txt" at REQUEST_URI.*REDIRECTED/, 1 ], -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, content => qr/^TEST 2$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test2.txt", ), }, { type => "action", comment => "redirect in phase:3 (get)", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecRule REQUEST_URI "\@streq /test2.txt" "phase:3,redirect:'http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt',msg:'REDIRECTED',id:500011" ), match_log => { error => [ qr/ModSecurity: Warning. String match "\/test2.txt" at REQUEST_URI.*REDIRECTED/, 1 ], -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, content => qr/^TEST 2$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test2.txt", ), }, { type => "action", comment => "redirect in phase:4 (get)", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecRule REQUEST_URI "\@streq /test2.txt" "phase:4,redirect:'http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt',msg:'REDIRECTED',id:500012" ), match_log => { error => [ qr/ModSecurity: Warning. String match "\/test2.txt" at REQUEST_URI.*REDIRECTED/, 1 ], -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, content => qr/^TEST 2$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test2.txt", ), }, # Proxy { type => "action", comment => "proxy in phase:1 (get)", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecRule REQUEST_URI "\@streq /test2.txt" "phase:1,proxy:'http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt',msg:'PROXIED',id:500013" ), match_log => { error => [ qr/ModSecurity: Warning. String match "\/test2.txt" at REQUEST_URI.*PROXIED/, 1 ], -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, content => qr/^TEST 2$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test2.txt", ), }, { type => "action", comment => "proxy in phase:2 (get)", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecRule REQUEST_URI "\@streq /test2.txt" "phase:2,proxy:'http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt',msg:'PROXIED',id:500014" ), match_log => { error => [ qr/ModSecurity: Warning. String match "\/test2.txt" at REQUEST_URI.*PROXIED/, 1 ], -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, content => qr/^TEST 2$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test2.txt", ), }, { type => "action", comment => "proxy in phase:3 (get)", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 4 SecRule REQUEST_URI "\@streq /test2.txt" "phase:3,proxy:'http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt',msg:'PROXIED',id:500015" ), match_log => { error => [ qr/ModSecurity: Warning. String match "\/test2.txt" at REQUEST_URI.*PROXIED/, 1 ], -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test2.txt", ), }, { type => "action", comment => "proxy in phase:4 (get)", conf => qq( SecRuleEngine DetectionOnly SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 4 SecRule REQUEST_URI "\@streq /test2.txt" "phase:4,proxy:'http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt',msg:'PROXIED',id:500016" ), match_log => { error => [ qr/ModSecurity: Warning. String match "\/test2.txt" at REQUEST_URI.*PROXIED/, 1 ], -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test2.txt", ), }, modsecurity-2.9.5/tests/regression/action/00-transformations.t0000664000175000017500000000024114147005233025646 0ustar mhsvierulamhsvierula### Transformation tests # NOTE: individual tests done in unit tests # TODO: t:none to override default # TODO: t:none inline # TODO: combined # TODO: caching modsecurity-2.9.5/tests/regression/action/00-disruptive-actions.t0000664000175000017500000003600314147005233026256 0ustar mhsvierulamhsvierula### Tests all of the actions in each phase # Pass { type => "action", comment => "pass in phase:1", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:1,pass,id:500033" SecAction "phase:1,deny,id:500034" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "pass in phase:2", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:2,pass,id:500035" SecAction "phase:2,deny,id:500036" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "pass in phase:3", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 4 SecAction "phase:3,pass,id:500037" SecAction "phase:3,deny,id:500038" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "pass in phase:4", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 4 SecAction "phase:4,pass,id:500039" SecAction "phase:4,deny,id:500040" ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction/, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # Allow { type => "action", comment => "allow in phase:1", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:1,allow,id:500041" SecAction "phase:1,deny,id:500042" ), match_log => { error => [ qr/ModSecurity: Access allowed \(phase 1\). Unconditional match in SecAction/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "allow in phase:2", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:2,allow,id:500043" SecAction "phase:2,deny,id:500044" ), match_log => { error => [ qr/ModSecurity: Access allowed \(phase 2\). Unconditional match in SecAction/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "allow in phase:3", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 4 SecAction "phase:3,allow,id:500045" SecAction "phase:3,deny,id:500046" ), match_log => { error => [ qr/ModSecurity: Access allowed \(phase 3\). Unconditional match in SecAction/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "allow in phase:4", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 4 SecAction "phase:4,allow,id:500047" SecAction "phase:4,deny,id:500048" ), match_log => { error => [ qr/ModSecurity: Access allowed \(phase 4\). Unconditional match in SecAction/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # Deny { type => "action", comment => "deny in phase:1", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:1,deny,id:500049" ), match_log => { error => [ qr/Access denied with code 403 \(phase 1\). Unconditional match in SecAction./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "deny in phase:2", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:2,deny,id:500050" ), match_log => { error => [ qr/Access denied with code 403 \(phase 2\). Unconditional match in SecAction./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "deny in phase:3", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 4 SecAction "phase:3,deny,id:500051" ), match_log => { error => [ qr/Access denied with code 403 \(phase 3\). Unconditional match in SecAction./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "deny in phase:4", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 4 SecAction "phase:4,deny,id:500052" ), match_log => { error => [ qr/Access denied with code 403 \(phase 4\). Unconditional match in SecAction./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # Drop { type => "action", comment => "drop in phase:1", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:1,drop,id:500053" ), match_log => { error => [ qr/Access denied with connection close \(phase 1\). Unconditional match in SecAction./, 1 ], }, match_response => { status => qr/^500$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "drop in phase:2", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecAction "phase:2,drop,id:500054" ), match_log => { error => [ qr/Access denied with connection close \(phase 2\). Unconditional match in SecAction./, 1 ], }, match_response => { status => qr/^500$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "drop in phase:3", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 4 SecAction "phase:3,drop,id:500055" ), match_log => { error => [ qr/Access denied with connection close \(phase 3\). Unconditional match in SecAction./, 1 ], }, match_response => { status => qr/^500$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "drop in phase:4", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 4 SecAction "phase:4,drop,id:500056" ), match_log => { error => [ qr/Access denied with connection close \(phase 4\). Unconditional match in SecAction./, 1 ], }, match_response => { status => qr/^500$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # Redirect { type => "action", comment => "redirect in phase:1 (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecRule REQUEST_URI "\@streq /test2.txt" "phase:1,redirect:'http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt',id:500001" ), match_log => { error => [ qr/ModSecurity: Access denied with redirection to .* using status 302 \(phase 1\)/, 1 ], }, match_response => { status => qr/^200$/, content => qr/^TEST$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test2.txt", ), }, { type => "action", comment => "redirect in phase:2 (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecRule REQUEST_URI "\@streq /test2.txt" "phase:2,redirect:'http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt',id:500002" ), match_log => { error => [ qr/ModSecurity: Access denied with redirection to .* using status 302 \(phase 2\)/, 1 ], }, match_response => { status => qr/^200$/, content => qr/^TEST$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test2.txt", ), }, { type => "action", comment => "redirect in phase:3 (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 4 SecRule REQUEST_URI "\@streq /test2.txt" "phase:3,redirect:'http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt',id:500003" ), match_log => { error => [ qr/ModSecurity: Access denied with redirection to .* using status 302 \(phase 3\)/, 1 ], }, match_response => { status => qr/^200$/, content => qr/^TEST$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test2.txt", ), }, { type => "action", comment => "redirect in phase:4 (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 4 SecRule REQUEST_URI "\@streq /test2.txt" "phase:4,redirect:'http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt',id:500004" ), match_log => { error => [ qr/ModSecurity: Access denied with redirection to .* using status 302 \(phase 4\)/, 1 ], }, match_response => { status => qr/^200$/, content => qr/^TEST$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test2.txt", ), }, # Proxy { type => "action", comment => "proxy in phase:1 (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecRule REQUEST_URI "\@streq /test2.txt" "phase:1,proxy:'http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt',id:500005" ), match_log => { error => { apache => [qr/ModSecurity: Access denied using proxy to \(phase 1\)/, 1], nginx => [qr/ModSecurity: Access denied with code 500 \(phase 1\) \(Configuration Error: Proxy action to .* requested but proxy is only available in Apache version\)./, 1], }, }, match_response => { status => { apache => qr/^200$/, nginx => qr/^500$/, }, content => { apache => qr/^TEST$/, nginx => qr/^*$/, }, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test2.txt", ), }, { type => "action", comment => "nocanon proxy in phase:1 (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecRule REQUEST_URI "\@streq /test2.txt" "phase:1,proxy:'[nocanon]http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt',id:500005" ), match_log => { error => { apache => [qr/ModSecurity: Access denied using proxy to \(phase 1\)/, 1], nginx => [qr/ModSecurity: Access denied with code 500 \(phase 1\) \(Configuration Error: Proxy action to .* requested but proxy is only available in Apache version\)./, 1], }, }, match_response => { status => { apache => qr/^200$/, nginx => qr/^500$/, }, content => { apache => qr/^TEST$/, nginx => qr/^*$/, }, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test2.txt", ), }, { type => "action", comment => "proxy in phase:2 (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecRule REQUEST_URI "\@streq /test2.txt" "phase:2,proxy:'http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt',id:500006" ), match_log => { error => { apache => [qr/ModSecurity: Access denied using proxy to \(phase 2\)/, 1], nginx => [qr/ModSecurity: Access denied with code 500 \(phase 2\) \(Configuration Error: Proxy action to .* requested but proxy is only available in Apache version\)./, 1], }, }, match_response => { status => { apache => qr/^200$/, nginx => qr/^500$/, }, content => { apache => qr/^TEST$/, nginx => qr/^*$/, }, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test2.txt", ), }, { type => "action", comment => "proxy in phase:3 (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 4 SecRule REQUEST_URI "\@streq /test2.txt" "phase:3,proxy:'http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt',id:500007" ), match_log => { error => { apache => [qr/ModSecurity: Access denied with code 500 \(phase 3\) \(Configuration Error: Proxy action requested but it does not work in output phases\)./, 1], nginx => [qr/ModSecurity: Access denied with code 500 \(phase 3\) \(Configuration Error: Proxy action to .* requested but proxy is only available in Apache version\)./, 1], } }, match_response => { status => { apache => qr/^500$/, nginx => qr/^500$/, }, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test2.txt", ), }, { type => "action", comment => "proxy in phase:4 (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 4 SecRule REQUEST_URI "\@streq /test2.txt" "phase:4,proxy:'http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt',id:500008" ), match_log => { error => { apache => [qr/ModSecurity: Access denied with code 500 \(phase 4\) \(Configuration Error: Proxy action requested but it does not work in output phases\)./, 1], nginx => [qr/ModSecurity: Access denied with code 500 \(phase 4\) \(Configuration Error: Proxy action to .* requested but proxy is only available in Apache version\)./, 1], } }, match_response => { status => { apache => qr/^500$/, nginx => qr/^500$/, }, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test2.txt", ), }, modsecurity-2.9.5/tests/regression/action/00-meta.t0000664000175000017500000000014714147005233023350 0ustar mhsvierulamhsvierula### Test meta actions # TODO: id # TODO: logdata # TODO: msg # TODO: rev # TODO: severity # TODO: tag modsecurity-2.9.5/tests/regression/action/10-append-prepend.t0000664000175000017500000000220614147005233025323 0ustar mhsvierulamhsvierula# TODO: Need more tests here ### append { type => "action", comment => "append content", conf => qq( SecRuleEngine On SecContentInjection On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAction "phase:1,setvar:tx.test=test,id:500002" SecAction "phase:2,append:'APPEND: \%{tx.test}',id:500003" ), match_log => { debug => [ "Added content to bottom: APPEND: test", 1 ], }, match_response => { status => qr/^200$/, content => qr/APPEND: test$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, ### prepend { type => "action", comment => "prepend content", conf => qq( SecRuleEngine On SecContentInjection On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAction "phase:1,setvar:tx.test=test,id:500004" SecAction "phase:2,prepend:'PREPEND: \%{tx.test}',id:500005" ), match_log => { debug => [ "Added content to top: PREPEND: test", 1 ], }, match_response => { status => qr/^200$/, content => qr/^PREPEND: test/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, modsecurity-2.9.5/tests/regression/action/10-logging.t0000664000175000017500000003401414147005233024051 0ustar mhsvierulamhsvierula### Logging tests # log/nolog (pass) { type => "action", comment => "log (pass)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,pass,log,id:500006" ), match_log => { error => [ qr/ModSecurity: Warning\. Unconditional match in SecAction\./, 1 ], audit => [ qr/Message: Warning\. Unconditional match in SecAction\./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "nolog (pass)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,pass,nolog,id:500007" ), match_log => { -error => [ qr/500007/, 1 ], -audit => [ qr/./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # log/nolog (deny) { type => "action", comment => "log (deny)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,deny,status:403,log,id:500008" ), match_log => { error => [ qr/ModSecurity: Access denied with code 403 \(phase 1\)\. Unconditional match in SecAction\./, 1 ], audit => [ qr/Message: Access denied with code 403 \(phase 1\)\. Unconditional match in SecAction\./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "nolog (deny)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,deny,status:403,nolog,id:500009" ), match_log => { -error => [ qr/500009/, 1 ], -audit => [ qr/./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # auditlog/noauditlog (pass) { type => "action", comment => "auditlog (pass)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,pass,auditlog,id:500010" ), match_log => { error => [ qr/ModSecurity: Warning\. Unconditional match in SecAction\./, 1 ], audit => [ qr/Message: Warning\. Unconditional match in SecAction\./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "noauditlog (pass)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,pass,noauditlog,id:500011" ), match_log => { error => [ qr/ModSecurity: Warning\. Unconditional match in SecAction\./, 1 ], -audit => [ qr/./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # auditlog/noauditlog (deny) { type => "action", comment => "auditlog (deny)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,deny,status:403,auditlog,id:500012" ), match_log => { error => [ qr/ModSecurity: Access denied with code 403 \(phase 1\)\. Unconditional match in SecAction\./, 1 ], audit => [ qr/Message: Access denied with code 403 \(phase 1\)\. Unconditional match in SecAction\./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "noauditlog (deny)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,deny,status:403,noauditlog,id:500013" ), match_log => { error => [ qr/ModSecurity: Access denied with code 403 \(phase 1\)\. Unconditional match in SecAction\./, 1 ], -audit => [ qr/./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # All log/nolog auditlog/noauditlog combos (pass) { type => "action", comment => "log,auditlog (pass)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,pass,log,auditlog,id:500014" ), match_log => { error => [ qr/ModSecurity: Warning\. Unconditional match in SecAction\./, 1 ], audit => [ qr/Message: Warning\. Unconditional match in SecAction\./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "log,noauditlog (pass)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,pass,log,noauditlog,id:500015" ), match_log => { error => [ qr/ModSecurity: Warning\. Unconditional match in SecAction\./, 1 ], -audit => [ qr/./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "nolog,auditlog (pass)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,pass,nolog,auditlog,id:500016" ), match_log => { audit => [ qr/-H--\s+Message: .*Stopwatch: /s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "nolog,noauditlog (pass)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,pass,nolog,noauditlog,id:500017" ), match_log => { -error => [ qr/500017/, 1 ], -audit => [ qr/./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "auditlog,log (pass)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,pass,auditlog,log,id:500018" ), match_log => { error => [ qr/ModSecurity: Warning\. Unconditional match in SecAction\./, 1 ], audit => [ qr/Message: Warning\. Unconditional match in SecAction\./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "auditlog,nolog (pass)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,pass,auditlog,nolog,id:500019" ), match_log => { -error => [ qr/500019/, 1 ], -audit => [ qr/./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "noauditlog,log (pass)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,pass,noauditlog,log,id:500020" ), match_log => { error => [ qr/ModSecurity: Warning\. Unconditional match in SecAction\./, 1 ], -audit => [ qr/./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "noauditlog,nolog (pass)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,pass,noauditlog,nolog,id:500021" ), match_log => { -error => [ qr/500021/, 1 ], -audit => [ qr/./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # All log/nolog auditlog/noauditlog combos (deny) { type => "action", comment => "log,auditlog (deny)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,deny,status:403,log,auditlog,id:500022" ), match_log => { error => [ qr/ModSecurity: Access denied with code 403 \(phase 1\)\. Unconditional match in SecAction\./, 1 ], audit => [ qr/Message: Access denied with code 403 \(phase 1\)\. Unconditional match in SecAction\./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "log,noauditlog (deny)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,deny,status:403,log,noauditlog,id:500023" ), match_log => { error => [ qr/ModSecurity: Access denied with code 403 \(phase 1\)\. Unconditional match in SecAction\./, 1 ], -audit => [ qr/./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "nolog,auditlog (deny)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,deny,status:403,nolog,auditlog,id:500024" ), match_log => { audit => [ qr/-H--\s+Message: .*Stopwatch: /s, 1 ], }, match_response => { -error => [ qr/ModSecurity: /, 1 ], status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "nolog,noauditlog (deny)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,deny,status:403,nolog,noauditlog,id:500025" ), match_log => { -error => [ qr/500025/, 1 ], -audit => [ qr/./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "auditlog,log (deny)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,deny,status:403,auditlog,log,id:500026" ), match_log => { error => [ qr/ModSecurity: Access denied with code 403 \(phase 1\)\. Unconditional match in SecAction\./, 1 ], audit => [ qr/Message: Access denied with code 403 \(phase 1\)\. Unconditional match in SecAction\./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "auditlog,nolog (deny)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,deny,status:403,auditlog,nolog,id:500027" ), match_log => { -error => [ qr/500027/, 1 ], -audit => [ qr/./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "noauditlog,log (deny)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,deny,status:403,noauditlog,log,id:500028" ), match_log => { error => [ qr/ModSecurity: Access denied with code 403 \(phase 1\)\. Unconditional match in SecAction\./, 1 ], -audit => [ qr/./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "noauditlog,nolog (deny)", conf => qq( SecRuleEngine On SecDebugLog "$ENV{DEBUG_LOG}" SecDebugLogLevel 9 SecAuditLogRelevantStatus xxx SecAuditEngine RelevantOnly SecAuditLog "$ENV{AUDIT_LOG}" SecAction "phase:1,deny,status:403,noauditlog,nolog,id:500029" ), match_log => { -error => [ qr/500029/, 1 ], -audit => [ qr/./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, modsecurity-2.9.5/tests/regression/action/10-ctl.t0000664000175000017500000000221014147005233023176 0ustar mhsvierulamhsvierula### ctl ### ruleRemoveById { type => "action", comment => "ruleRemoveById existing rule across phases", conf => qq( SecRuleEngine On SecAction "phase:2,id:666,deny" SecAction "phase:1,pass,ctl:ruleRemoveById=666,id:500030" ), match_log => { }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "ruleRemoveById future rule across phases", conf => qq( SecRuleEngine On SecAction "phase:1,pass,ctl:ruleRemoveById=666,id:500031" SecAction "phase:2,id:666,deny" ), match_log => { }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "action", comment => "ruleRemoveById future rule same phase", conf => qq( SecRuleEngine On SecAction "phase:1,pass,ctl:ruleRemoveById=666,id:500032" SecAction "phase:1,id:666,deny" ), match_log => { }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, modsecurity-2.9.5/tests/regression/target/0000775000175000017500000000000014147005233022027 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/target/00-targets.t0000664000175000017500000005205414147005233024110 0ustar mhsvierulamhsvierula### Test basic targets # ARGS { type => "target", comment => "ARGS (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule ARGS "val1" "phase:2,log,pass,id:500189" SecRule ARGS "val2" "phase:2,log,pass,id:500190" ), match_log => { error => [ qr/Pattern match "val1" at ARGS.*Pattern match "val2" at ARGS/s, 1 ], debug => [ qr/Adding request argument \(QUERY_STRING\): name "arg1", value "val1".*Adding request argument \(QUERY_STRING\): name "arg2", value "val2"/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?arg1=val1&arg2=val2", ), }, { type => "target", comment => "ARGS (post)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule ARGS "val1" "phase:2,log,pass,id:500191" SecRule ARGS "val2" "phase:2,log,pass,id:500192" ), match_log => { error => [ qr/Pattern match "val1" at ARGS.*Pattern match "val2" at ARGS/s, 1 ], debug => [ qr/Adding request argument \(BODY\): name "arg1", value "val1".*Adding request argument \(BODY\): name "arg2", value "val2"/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, # ARGS_COMBINED_SIZE { type => "target", comment => "ARGS_COMBINED_SIZE (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecRule ARGS_COMBINED_SIZE "\@eq 16" "phase:2,log,pass,id:500193" ), match_log => { error => [ qr/Operator EQ matched 16 at ARGS_COMBINED_SIZE\./s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?arg1=val1&arg2=val2", ), }, { type => "target", comment => "ARGS_COMBINED_SIZE (post)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecRule ARGS_COMBINED_SIZE "\@eq 16" "phase:2,log,pass,id:500194" ), match_log => { error => [ qr/Operator EQ matched 16 at ARGS_COMBINED_SIZE\./s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, # ARGS_NAMES { type => "target", comment => "ARGS_NAMES (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule ARGS_NAMES "arg1" "phase:2,log,pass,id:500195" SecRule ARGS_NAMES "arg2" "phase:2,log,pass,id:500196" ), match_log => { error => [ qr/Pattern match "arg1" at ARGS.*Pattern match "arg2" at ARGS/s, 1 ], debug => [ qr/Adding request argument \(QUERY_STRING\): name "arg1", value "val1".*Adding request argument \(QUERY_STRING\): name "arg2", value "val2"/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?arg1=val1&arg2=val2", ), }, { type => "target", comment => "ARGS_NAMES (post)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule ARGS_NAMES "arg1" "phase:2,log,pass,id:500197" SecRule ARGS_NAMES "arg2" "phase:2,log,pass,id:500198" ), match_log => { error => [ qr/Pattern match "arg1" at ARGS_NAMES.*Pattern match "arg2" at ARGS_NAMES/s, 1 ], debug => [ qr/Adding request argument \(BODY\): name "arg1", value "val1".*Adding request argument \(BODY\): name "arg2", value "val2"/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, # ARGS_GET { type => "target", comment => "ARGS_GET (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule ARGS_GET "val1" "phase:2,log,pass,id:500199" SecRule ARGS_GET "val2" "phase:2,log,pass,id:500200" ), match_log => { error => [ qr/Pattern match "val1" at ARGS_GET.*Pattern match "val2" at ARGS_GET/s, 1 ], debug => [ qr/Adding request argument \(QUERY_STRING\): name "arg1", value "val1".*Adding request argument \(QUERY_STRING\): name "arg2", value "val2"/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?arg1=val1&arg2=val2", ), }, { type => "target", comment => "ARGS_GET (post)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule ARGS_GET "val1" "phase:2,log,pass,id:500201" SecRule ARGS_GET "val2" "phase:2,log,pass,id:500202" ), match_log => { -error => [ qr/Pattern match/, 1 ], debug => [ qr/Adding request argument \(BODY\): name "arg1", value "val1".*Adding request argument \(BODY\): name "arg2", value "val2"/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, # ARGS_GET_NAMES { type => "target", comment => "ARGS_GET_NAMES (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule ARGS_GET_NAMES "arg1" "phase:2,log,pass,id:500203" SecRule ARGS_GET_NAMES "arg2" "phase:2,log,pass,id:500204" ), match_log => { error => [ qr/Pattern match "arg1" at ARGS_GET.*Pattern match "arg2" at ARGS_GET/s, 1 ], debug => [ qr/Adding request argument \(QUERY_STRING\): name "arg1", value "val1".*Adding request argument \(QUERY_STRING\): name "arg2", value "val2"/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?arg1=val1&arg2=val2", ), }, { type => "target", comment => "ARGS_GET_NAMES (post)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule ARGS_GET_NAMES "arg1" "phase:2,log,pass,id:500205" SecRule ARGS_GET_NAMES "arg2" "phase:2,log,pass,id:500206" ), match_log => { -error => [ qr/Pattern match/, 1 ], debug => [ qr/Adding request argument \(BODY\): name "arg1", value "val1".*Adding request argument \(BODY\): name "arg2", value "val2"/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, # ARGS_POST { type => "target", comment => "ARGS_POST (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule ARGS_POST "val1" "phase:2,log,pass,id:500207" SecRule ARGS_POST "val2" "phase:2,log,pass,id:500208" ), match_log => { -error => [ qr/Pattern match/, 1 ], debug => [ qr/Adding request argument \(QUERY_STRING\): name "arg1", value "val1".*Adding request argument \(QUERY_STRING\): name "arg2", value "val2"/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?arg1=val1&arg2=val2", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=b", ), }, { type => "target", comment => "ARGS_POST (post)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule ARGS_POST "val1" "phase:2,log,pass,id:500209" SecRule ARGS_POST "val2" "phase:2,log,pass,id:500210" ), match_log => { error => [ qr/Pattern match "val1" at ARGS_POST.*Pattern match "val2" at ARGS_POST/s, 1 ], debug => [ qr/Adding request argument \(BODY\): name "arg1", value "val1".*Adding request argument \(BODY\): name "arg2", value "val2"/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, # ARGS_POST_NAMES { type => "target", comment => "ARGS_POST_NAMES (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule ARGS_POST_NAMES "arg1" "phase:2,log,pass,id:500211" SecRule ARGS_POST_NAMES "arg2" "phase:2,log,pass,id:500212" ), match_log => { -error => [ qr/Pattern match/, 1 ], debug => [ qr/Adding request argument \(QUERY_STRING\): name "arg1", value "val1".*Adding request argument \(QUERY_STRING\): name "arg2", value "val2"/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?arg1=val1&arg2=val2", ), }, { type => "target", comment => "ARGS_POST_NAMES (post)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule ARGS_POST_NAMES "arg1" "phase:2,log,pass,id:500213" SecRule ARGS_POST_NAMES "arg2" "phase:2,log,pass,id:500214" ), match_log => { error => [ qr/Pattern match "arg1" at ARGS_POST.*Pattern match "arg2" at ARGS_POST/s, 1 ], debug => [ qr/Adding request argument \(BODY\): name "arg1", value "val1".*Adding request argument \(BODY\): name "arg2", value "val2"/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, # FULL_REQUEST { type => "target", comment => "FULL_REQUEST (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule FULL_REQUEST "arg1" "phase:4,log,pass,id:500211" SecRule FULL_REQUEST "arg2" "phase:4,log,pass,id:500212" ), match_log => { error => [ qr/Pattern match "arg1" at FULL_REQUEST.*Pattern match "arg2" at FULL_REQUEST/s, 1 ], debug => [ qr/against FULL_REQUEST.*Target value: "GET \/test.txt\?arg1=val1\&arg2=val2 HTTP\/1.1\\n\\nTE: deflate,gzip;q=0.3\\nConnection: TE, close\\nHost: localhost:[0-9]+\\nUser-Agent: ModSecurity Regression Tests\/1.2.3\\n\\n\\x00"/s, 1], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?arg1=val1&arg2=val2", ), }, { type => "target", comment => "FULL_REQUEST (post)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule FULL_REQUEST "arg1" "phase:4,log,pass,id:500213" SecRule FULL_REQUEST "arg2" "phase:4,log,pass,id:500214" ), match_log => { error => [ qr/Pattern match "arg1" at FULL_REQUEST.*Pattern match "arg2" at FULL_REQUEST/s, 1 ], debug => [ qr/against FULL_REQUEST.*Target value: "POST \/test.txt HTTP\/1.1\\n\\nTE: deflate,gzip;q=0.3\\nConnection: TE, close\\nHost: localhost:[0-9]+\\nUser-Agent: ModSecurity Regression Tests\/1.2.3\\nContent-Type: application\/x-www-form-urlencoded\\nContent-Length: 19\\n\\narg1=val1&arg2=val2\\x00"/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, # FULL_REQUEST_LENGTH { type => "target", comment => "FULL_REQUEST_LENGTH (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule FULL_REQUEST_LENGTH "\@eq 1" "phase:4,log,pass,id:500211" SecRule FULL_REQUEST_LENGTH "\@eq 115" "phase:4,log,pass,id:500212" ), match_log => { error => [ qr/Operator EQ matched 115 at FULL_REQUEST_LENGTH./s, 1 ], debug => [ qr/against FULL_REQUEST_LENGTH.*Target value: "115"/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?arg1=val1&arg2=val2", ), }, { type => "target", comment => "FULL_REQUEST_LENGTH (post)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule FULL_REQUEST_LENGTH "\@eq 1" "phase:4,log,pass,id:500213" SecRule FULL_REQUEST_LENGTH "\@eq 201" "phase:4,log,pass,id:500214" ), match_log => { error => [ qr/Operator EQ matched 201 at FULL_REQUEST_LENGTH./s, 1 ], debug => [ qr/against FULL_REQUEST_LENGTH.*Target value: "201"/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "arg1=val1&arg2=val2", ), }, { type => "target", comment => "REQUEST_BASENAME (get)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType null SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule REQUEST_BASENAME "index.html" "phase:2,log,pass,id:500189" ), match_log => { error => [ qr/Pattern match "index.html" at REQUEST_BASENAME.*/s, 1 ], debug => [ qr/Pattern match "index.html" at REQUEST_BASENAME.*/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/index.html?apath=/my/cool/path.com", ), }, # AUTH_TYPE #{ # type => "target", # comment => "AUTH_TYPE", # conf => qq( # = 2.2> # # LoadModule authn_file_module modules/mod_authn_file.so # # ## ## ## LoadModule auth_module modules/mod_auth.so ## ## # # AuthType Basic # AuthName Test # AuthUserFile "$ENV{CONF_DIR}/htpasswd" # Require user nobody # # SecRuleEngine On # SecRequestBodyAccess On # SecResponseBodyAccess On # SecResponseBodyMimeType null ## SecDebugLog $ENV{DEBUG_LOG} ## SecDebugLogLevel 9 # SecRule REQUEST_HEADERS:Authorization "Basic (.*)" "phase:2,log,pass,capture,chain" # SecRule TX:1 "nobody:test" "t:none,t:base64Decode,chain" # SecRule AUTH_TYPE "Basic" # ), # match_log => { # error => [ qr/Pattern match "Basic" at AUTH_TYPE/s, 1 ], # }, # match_response => { # status => qr/^200$/, # }, # request => new HTTP::Request( # GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", # [ # "Authorization" => "Basic bm9ib2R5OnRlc3Q=" # ], # ), #}, ## ENH: We cannot include this test as we cannot distribute the database. ## Instead we should create a simple test DB of our own. ## GEO #{ # type => "target", # comment => "GEO (ip)", # conf => qq( # SecRuleEngine On # SecDebugLog $ENV{DEBUG_LOG} # SecDebugLogLevel 9 # SecGeoLookupDB GeoLiteCity.dat # SecRule ARGS:ip "\@geoLookup" "phase:2,log,pass,t:none" # SecRule GEO:COUNTRY_CODE "\@streq US" "phase:2,log,pass,t:none" # SecRule GEO:COUNTRY_CODE3 "\@streq USA" "phase:2,log,pass,t:none" # SecRule GEO:COUNTRY_NAME "\@streq United States" "phase:2,log,pass,t:none" # # ENH: Not in this database? # SecRule GEO:COUNTRY_CONTINENT "\@streq NA" "phase:2,log,pass,t:none" # SecRule GEO:REGION "\@streq CA" "phase:2,log,pass,t:none" # SecRule GEO:CITY "\@streq San Diego" "phase:2,log,pass,t:none" # SecRule GEO:POSTAL_CODE "\@streq 92123" "phase:2,log,pass,t:none" # SecRule GEO:LATITUDE "\@beginsWith 32.8" "phase:2,log,pass,t:none" # SecRule GEO:LONGITUDE "\@beginsWith 117.1" "phase:2,log,pass,t:none" # SecRule GEO:DMA_CODE "\@streq 825" "phase:2,log,pass,t:none" # SecRule GEO:AREA_CODE "\@streq 858" "phase:2,log,pass,t:none" # ), # match_log => { # debug => [ qr/Geo lookup for "216.75.21.122" succeeded.*match "US" at GEO:COUNTRY_CODE.*match "USA" at GEO:COUNTRY_CODE3.*match "United States" at GEO:COUNTRY_NAME.*match "NA" at GEO:COUNTRY_CONTINENT.*match "CA" at GEO:REGION.*match "San Diego" at GEO:CITY.*match "92123" at GEO:POSTAL_CODE.*match "32.8" at GEO:LATITUDE.*match "825" at GEO:DMA_CODE.*match "858" at GEO:AREA_CODE/si, 1 ], # }, # match_response => { # status => qr/^200$/, # }, # request => new HTTP::Request( # GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?ip=216.75.21.122", # ), #}, #{ # type => "target", # comment => "GEO (host)", # conf => qq( # SecRuleEngine On # SecDebugLog $ENV{DEBUG_LOG} # SecDebugLogLevel 9 # SecGeoLookupDB GeoLiteCity.dat # SecRule ARGS:host "\@geoLookup" "phase:2,log,pass,t:none" # SecRule GEO:COUNTRY_CODE "\@streq US" "phase:2,log,pass,t:none" # SecRule GEO:COUNTRY_CODE3 "\@streq USA" "phase:2,log,pass,t:none" # SecRule GEO:COUNTRY_NAME "\@streq United States" "phase:2,log,pass,t:none" # # ENH: Not in this database? # SecRule GEO:COUNTRY_CONTINENT "\@streq NA" "phase:2,log,pass,t:none" # SecRule GEO:REGION "\@streq CA" "phase:2,log,pass,t:none" # SecRule GEO:CITY "\@streq San Diego" "phase:2,log,pass,t:none" # SecRule GEO:POSTAL_CODE "\@streq 92123" "phase:2,log,pass,t:none" # SecRule GEO:LATITUDE "\@beginsWith 32.8" "phase:2,log,pass,t:none" # SecRule GEO:LONGITUDE "\@beginsWith 117.1" "phase:2,log,pass,t:none" # SecRule GEO:DMA_CODE "\@streq 825" "phase:2,log,pass,t:none" # SecRule GEO:AREA_CODE "\@streq 858" "phase:2,log,pass,t:none" # ), # match_log => { # debug => [ qr/Using address "\d+\.\d+\.\d+\.\d+".*Geo lookup for "www\.modsecurity\.org" succeeded.*match "US" at GEO:COUNTRY_CODE.*match "USA" at GEO:COUNTRY_CODE3.*match "United States" at GEO:COUNTRY_NAME.*match "NA" at GEO:COUNTRY_CONTINENT.*match "CA" at GEO:REGION.*match "San Diego" at GEO:CITY.*match "92123" at GEO:POSTAL_CODE.*match "32.8" at GEO:LATITUDE.*match "825" at GEO:DMA_CODE.*match "858" at GEO:AREA_CODE/si, 1 ], # }, # match_response => { # status => qr/^200$/, # }, # request => new HTTP::Request( # GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?host=www.modsecurity.org", # ), #}, #{ # type => "target", # comment => "GEO (failed lookup)", # conf => qq( # SecRuleEngine On # SecDebugLog $ENV{DEBUG_LOG} # SecDebugLogLevel 9 # SecGeoLookupDB GeoLiteCity.dat # SecRule ARGS:ip "\@geoLookup" "phase:2,log,pass,t:none" # SecRule \&GEO "\@eq 0" "phase:2,log,deny,status:403,t:none" # SecRule ARGS:badip "\@geoLookup" "phase:2,log,pass,t:none" # SecRule \&GEO "!\@eq 0" "phase:2,log,deny,status:403,t:none" # ), # match_log => { # -debug => [ qr/Geo lookup for "127\.0\.0\.1" succeeded/si, 1 ], # }, # match_response => { # status => qr/^200$/, # }, # request => new HTTP::Request( # GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?ip=216.75.21.122&badip=127.0.0.1", # ), #}, # TODO: ENV # TODO: FILES # TODO: FILES_COMBINED_SIZE # TODO: FILES_NAMES # TODO: FILES_SIZES # TODO: FILES_TMPNAMES # TODO: HIGHEST_SEVERITY # TODO: MATCHED_VAR # TODO: MATCHED_VAR_NAME # TODO: MODSEC_BUILD # TODO: MULTIPART_CRLF_LF_LINES # TODO: MULTIPART_STRICT_ERROR # TODO: MULTIPART_UNMATCHED_BOUNDARY # TODO: PATH_INFO # TODO: QUERY_STRING # TODO: REMOTE_ADDR # TODO: REMOTE_HOST # TODO: REMOTE_PORT # TODO: REMOTE_USER # TODO: REQBODY_PROCESSOR # TODO: REQBODY_PROCESSOR_ERROR # TODO: REQBODY_PROCESSOR_ERROR_MSG # TODO: REQUEST_BASENAME # TODO: REQUEST_BODY # TODO: REQUEST_COOKIES # TODO: REQUEST_COOKIES_NAMES # TODO: REQUEST_FILENAME # TODO: REQUEST_HEADERS # TODO: REQUEST_HEADERS_NAMES # TODO: REQUEST_LINE # TODO: REQUEST_METHOD # TODO: REQUEST_PROTOCOL # TODO: REQUEST_URI # TODO: REQUEST_URI_RAW # TODO: RESPONSE_BODY # TODO: RESPONSE_CONTENT_LENGTH # TODO: RESPONSE_CONTENT_TYPE # TODO: RESPONSE_HEADERS # TODO: RESPONSE_HEADERS_NAMES # TODO: RESPONSE_PROTOCOL # TODO: RESPONSE_STATUS # TODO: RULE # TODO: SCRIPT_BASENAME # TODO: SCRIPT_FILENAME # TODO: SCRIPT_GID # TODO: SCRIPT_GROUPNAME # TODO: SCRIPT_MODE # TODO: SCRIPT_UID # TODO: SCRIPT_USERNAME # TODO: SERVER_ADDR # TODO: SERVER_NAME # TODO: SERVER_PORT # TODO: SESSION # TODO: SESSIONID # TODO: TIME # TODO: TIME_DAY # TODO: TIME_EPOCH # TODO: TIME_HOUR # TODO: TIME_MIN # TODO: TIME_MON # TODO: TIME_SEC # TODO: TIME_WDAY # TODO: TIME_YEAR # TODO: TX # TODO: USERID # TODO: WEBAPPID # TODO: WEBSERVER_ERROR_LOG # TODO: XML modsecurity-2.9.5/tests/regression/config/0000775000175000017500000000000014147005233022006 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/config/10-audit-directives.t0000664000175000017500000001403314147005233025657 0ustar mhsvierulamhsvierula### SecAudit* directive tests # SecAuditEngine { type => "config", comment => "SecAuditEngine On", conf => qq( SecAuditEngine On SecAuditLog $ENV{AUDIT_LOG} ), match_log => { audit => [ qr/./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "config", comment => "SecAuditEngine Off", conf => qq( SecAuditEngine Off SecAuditLog $ENV{AUDIT_LOG} ), match_log => { -audit => [ qr/./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "config", comment => "SecAuditEngine RelevantOnly (pos)", conf => qq( SecRuleEngine On SecAuditEngine RelevantOnly SecAuditLog $ENV{AUDIT_LOG} SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecResponseBodyAccess On SecDefaultAction "phase:2,log,auditlog,pass" SecRule REQUEST_URI "." "phase:4,deny,id:500251" ), match_log => { audit => [ qr/./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "config", comment => "SecAuditEngine RelevantOnly (neg)", conf => qq( SecAuditEngine RelevantOnly SecAuditLog $ENV{AUDIT_LOG} SecResponseBodyAccess On SecDefaultAction "phase:2,log,auditlog,pass" ), match_log => { -audit => [ qr/./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # SecAuditLogType & SecAuditLogStorageDir { type => "config", comment => "SecAuditLogType Serial", conf => qq( SecAuditEngine On SecAuditLog $ENV{AUDIT_LOG} SecAuditLogType Serial ), match_log => { audit => [ qr/./, 1 ], }, match_response => { status => qr/^404$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/bogus", ), }, { type => "config", comment => "SecAuditLogType Concurrent", conf => qq( SecAuditEngine On SecAuditLog $ENV{AUDIT_LOG} SecAuditLogType Concurrent SecAuditLogStorageDir "$ENV{LOGS_DIR}/audit" ), test => sub { ### Perl code to parse the audit log entry and verify ### that the concurrent audit log exists and contains ### the correct data. ### ### TODO: Need some API for this :) ### ### FIXME: Just workable with apache, the timing to load auditlog from nginx ### is not correct, so the test is failing even when it should pass. ### Disabling it for now until we figure out a way to handle that. # Parse log #my $alogre = qr/^(?:\S+)\ (?:\S+)\ (?:\S+)\ (?:\S+)\ \[(?:[^:]+):(?:\d+:\d+:\d+)\ (?:[^\]]+)\]\ \"(?:.*)\"\ (?:\d+)\ (?:\S+)\ \"(?:.*)\"\ \"(?:.*)\"\ (\S+)\ \"(?:.*)\"\ (\S+)\ (?:\d+)\ (?:\d+)\ (?:\S+)(?:.*)$/m; #my $alog = match_log("audit", $alogre, 1); #chomp $alog; #dbg("Alog: $alog\n"); #my @log = ($alog =~ m/$alogre/); #my($id, $fn) = ($log[0], $log[1]); #if (!$id or !$fn) { #dbg("LOG ENTRY: $alog"); #die "Failed to parse audit log: $ENV{AUDIT_LOG}\n"; #} # Verify concurrent log exists #my $alogdatafn = "$ENV{LOGS_DIR}/audit$fn"; #if (! -e "$alogdatafn") { #die "Audit log does not exist: $alogdatafn\n"; #} # Verify concurrent log contents #if (defined match_file($alogdatafn, qr/^--[^-]+-A--.*$id.*-Z--$/s)) { #return 0; #} # Error #dbg("LOGDATA: \"$FILE{$alogdatafn}{buf}\""); #die "Audit log data did not match.\n"; return 0; }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # SecAuditLogRelevantStatus { type => "config", comment => "SecAuditLogRelevantStatus (pos)", conf => qq( SecAuditEngine RelevantOnly SecAuditLog $ENV{AUDIT_LOG} SecAuditLogRelevantStatus "^4" ), match_log => { audit => [ qr/./, 1 ], }, match_response => { status => qr/^404$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/bogus", ), }, { type => "config", comment => "SecAuditLogRelevantStatus (neg)", conf => qq( SecAuditEngine RelevantOnly SecAuditLog $ENV{AUDIT_LOG} SecAuditLogRelevantStatus "^4" ), match_log => { -audit => [ qr/./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # SecAuditLogParts { type => "config", comment => "SecAuditLogParts (minimal)", conf => qq( SecAuditEngine On SecAuditLog $ENV{AUDIT_LOG} SecRequestBodyAccess On SecResponseBodyAccess On SecAuditLogParts "AZ" ), match_log => { audit => [ qr/-A--.*-Z--/s, 1 ], -audit => [ qr/-[B-Y]--/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1r&=2", ), }, { type => "config", comment => "SecAuditLogParts (default)", conf => qq( SecAuditEngine On SecAuditLog $ENV{AUDIT_LOG} SecRequestBodyAccess On SecResponseBodyAccess On ), match_log => { audit => [ qr/-A--.*-B--.*-F--.*-H--.*-Z--/s, 1 ], -audit => [ qr/-[DEGIJK]--/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1r&=2", ), }, { type => "config", comment => "SecAuditLogParts (all)", conf => qq( SecRuleEngine On SecAuditEngine On SecAuditLog $ENV{AUDIT_LOG} SecRequestBodyAccess On SecResponseBodyAccess On SecAuditLogParts "ABCDEFGHIJKZ" SecAction "phase:4,log,auditlog,allow,id:500086" ), match_log => { audit => [ qr/-A--.*-B--.*-C--.*-F--.*-E--.*-H--.*-K--.*-Z--/s, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1r&=2", ), }, modsecurity-2.9.5/tests/regression/config/20-chroot.t0000664000175000017500000000136114147005233023711 0ustar mhsvierulamhsvierula### SecChroot tests # TODO: Will not work as we need root access #{ # type => "config", # comment => "SecChroot", # httpd_opts => qw( # -DCHROOT # ), # conf => qq( # # These will be in the chroot # PidFile /logs/httpd.pid # ScoreBoardFile /logs/httpd.scoreboard # User nobody # Group nogroup # # SecAuditEngine On # SecDebugLog $ENV{DEBUG_LOG} # SecDebugLogLevel 9 # SecAuditLog $ENV{AUDIT_LOG} # SecAuditLogStorageDir "/logs/audit" # SecAuditLogType Concurrent # SecChrootDir "$ENV{TEST_SERVER_ROOT}" # ), # match_log => { # debug => [ qr/./, 1 ], # audit => [ qr/./, 1 ], # }, # match_response => { # status => qr/^200$/, # }, # request => new HTTP::Request( # GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", # ), #}, modsecurity-2.9.5/tests/regression/config/10-misc-directives.t0000664000175000017500000000702114147005233025503 0ustar mhsvierulamhsvierula### Misc directive tests ### TODO: # SecTmpDir # SecUploadKeepFiles # SecChrootDir # SecGuardianLog # SecDefaultAction { type => "config", comment => "SecDefaultAction", conf => qq( SecRuleEngine on SecDefaultAction "phase:1,deny,status:500" SecRule REQUEST_URI "test.txt" "id:500241" ), match_log => { error => [ qr/ModSecurity: Access denied with code 500 \(phase 1\)/, 1 ], }, match_response => { status => qr/^500$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # SecServerSignature { type => "config", comment => "SecServerSignature On", conf => qq( SecServerSignature "NewServerSignature" ), match_response => { status => qr/^200$/, raw => qr/^Server: +NewServerSignature$/m, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # SecDataDir { type => "config", comment => "SecDataDir", conf => qq( SecRuleEngine On SecDataDir "$ENV{DATA_DIR}" SecAction initcol:ip=%{REMOTE_ADDR},setvar:ip.dummy=1,pass,id:500085 ), match_log => { error => [ qr/ModSecurity: Warning. Unconditional match in SecAction\./, 1 ], }, match_file => { "$ENV{DATA_DIR}/ip.pag" => qr/\x00\x06dummy\x00\x00\x021\x00/, }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # SecTmpDir/SecUploadDir/SecUploadKeepFiles { type => "config", comment => "SecTmpDir/SecUploadDir/SecUploadKeepFiles", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 4 SecTmpDir "$ENV{TEMP_DIR}" SecUploadKeepFiles On SecUploadDir "$ENV{UPLOAD_DIR}" ), test => sub { # Get the filename and make sure the file exists my $fn = match_log(debug => qr/Moved file from .* to ".*"\./, 5); die "Failed to determine uploaded filename\n" unless (defined $fn); $fn =~ s/Moved file from .* to "(.*)"\..*/$1/; die "File does not exist: $fn\n" unless (-e $fn); # Check the contents of the file return 0 if (match_file($fn, qr/^TESTFILE$/m)); msg("Failed to match contents of uploaded file: $fn"); return 1; }, match_log => { debug => [ qr/Created temporary file.*$ENV{TEMP_DIR}/, 1 ], -debug => [ qr/Failed to /, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "multipart/form-data; boundary=---------------------------19813181771830765643996187206", ], q(-----------------------------19813181771830765643996187206 Content-Disposition: form-data; name="upload-file"; filename="test" Content-Type: application/octet-stream TESTFILE -----------------------------19813181771830765643996187206 Content-Disposition: form-data; name="file" Upload File -----------------------------19813181771830765643996187206--), ), }, # SecWebAppId { type => "config", comment => "SecWebAppId", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 4 SecAuditLog "$ENV{AUDIT_LOG}" SecAuditEngine RelevantOnly SecWebAppId "app-1" SecAction "pass,log,auditlog,id:1" ), match_log => { error => [ qr/Warning\. Unconditional match in SecAction\./, 1 ], debug => [ qr/Warning\. Unconditional match in SecAction\./, 1 ], audit => [ qr/^WebApp-Info: "app-1"/m, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, modsecurity-2.9.5/tests/regression/config/10-debug-directives.t0000664000175000017500000001401014147005233025632 0ustar mhsvierulamhsvierula### SecDebug* directive tests { type => "config", comment => "SecDebugLog (pos)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 ), match_log => { debug => [ qr/./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "config", comment => "SecDebugLog (neg)", conf => qq( SecRuleEngine On ), match_log => { -debug => [ qr/./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "config", comment => "SecDebugLogLevel 0", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 0 SecRule REQUEST_URI "." "phase:1,deny,id:500241" ), match_log => { -debug => [ qr/./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "config", comment => "SecDebugLogLevel 1", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 1 SecRuleScript "test.lua" "phase:1" SecRule REQUEST_URI "(.)" "phase:4,deny,deprecatevar:bogus,id:500242" ), match_log => { debug => [ qr/\]\[[1]\] /, 1 ], -debug => [ qr/\]\[[2-9]\] /, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1&b=2", ), }, { type => "config", comment => "SecDebugLogLevel 2", conf => qq( SecRuleEngine DetectionOnly SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 2 SecRuleScript "test.lua" "phase:1" SecRule REQUEST_URI "(.)" "phase:4,deny,deprecatevar:bogus,id:500243" ), match_log => { debug => [ qr/\]\[2\] /, 1 ], -debug => [ qr/\]\[[3-9]\] /, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1&b=2", ), }, { type => "config", comment => "SecDebugLogLevel 3", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 3 SecRuleScript "test.lua" "phase:1" SecRule REQUEST_URI "(.)" "phase:4,deny,deprecatevar:bogus,id:500244" ), match_log => { debug => [ qr/\]\[3\] /, 1 ], -debug => [ qr/\]\[[4-9]\] /, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1&b=2", ), }, { type => "config", comment => "SecDebugLogLevel 4", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 4 SecRuleScript "test.lua" "phase:1" SecRule REQUEST_URI "(.)" "phase:4,deny,deprecatevar:bogus,id:500245" ), match_log => { debug => [ qr/\]\[4\] /, 1 ], -debug => [ qr/\]\[[5-9]\] /, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1&b=2", ), }, { type => "config", comment => "SecDebugLogLevel 5", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 5 SecRuleScript "test.lua" "phase:1" SecRule REQUEST_URI "(.)" "phase:4,deny,deprecatevar:bogus,id:500246" ), match_log => { debug => [ qr/\]\[5\] /, 1 ], -debug => [ qr/\]\[[6-9]\] /, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1&b=2", ), }, { type => "config", comment => "SecDebugLogLevel 6", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 6 SecRuleScript "test.lua" "phase:1" SecRule REQUEST_URI "(.)" "phase:4,deny,deprecatevar:bogus,id:500247" ), match_log => { debug => [ qr/\]\[6\] /, 1 ], -debug => [ qr/\]\[[7-9]\] /, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1&b=2", ), }, { type => "config", comment => "SecDebugLogLevel 7", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 7 SecRuleScript "test.lua" "phase:1" SecRule REQUEST_URI "(.)" "phase:4,deny,deprecatevar:bogus,id:500248" ), match_log => { debug => [ qr/\]\[7\] /, 1 ], -debug => [ qr/\]\[[8-9]\] /, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1&b=2", ), }, { type => "config", comment => "SecDebugLogLevel 8", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 8 SecRuleScript "test.lua" "phase:1" SecRule REQUEST_URI "(.)" "phase:4,deny,deprecatevar:bogus,id:500249" ), match_log => { debug => [ qr/\]\[8\] /, 1 ], -debug => [ qr/\]\[9\] /, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1&b=2", ), }, { type => "config", comment => "SecDebugLogLevel 9", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRuleScript "test.lua" "phase:1" SecRule REQUEST_URI "(.)" "phase:4,deny,deprecatevar:bogus,id:500250" ), match_log => { debug => [ qr/\]\[9\] /, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1&b=2", ), }, modsecurity-2.9.5/tests/regression/config/00-load-modsec.t0000664000175000017500000000132114147005233024574 0ustar mhsvierulamhsvierula{ type => "config", comment => "module loaded", match_log => { error => { apache => [ qr/ModSecurity for Apache.* configured\./, 10 ], nginx => [ qr/ModSecurity for nginx.* configured\./, 10 ], }, }, }, { type => "config", comment => "minimal config", conf => sub { # Open the minimal conf file, substituting the # relative log paths with full paths. open(C, "<$ENV{DIST_ROOT}/modsecurity.conf-minimal") or die "$!\n"; (my $conf = join('', )) =~ s#Log logs/#Log $ENV{TEST_SERVER_ROOT}/logs/#g; close C; return $conf; }, match_log => { error => { apache => [ qr/ModSecurity for Apache.* configured\./, 10 ], nginx => [ qr/ModSecurity for nginx.* configured\./, 10 ], }, }, }, modsecurity-2.9.5/tests/regression/config/10-request-directives.t0000664000175000017500000004133214147005233026243 0ustar mhsvierulamhsvierula### Tests for directives altering how a request is handled # SecArgumentSeparator { type => "config", comment => "SecArgumentSeparator (get-pos)", conf => q( SecRuleEngine On SecArgumentSeparator ";" SecRule ARGS:a "@streq 1" "phase:1,deny,chain,id:500215" SecRule ARGS:b "@streq 2" "" ), match_log => { error => [ qr/Access denied with code 403 \(phase 1\)\. String match "2" at ARGS:b\./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?a=1;b=2", ), }, { type => "config", comment => "SecArgumentSeparator (get-neg)", conf => q( SecRuleEngine On SecRule ARGS:a "@streq 1" "phase:1,deny,chain,id:500217" SecRule ARGS:b "@streq 2" "" ), match_log => { -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt?a=1;b=2", ), }, { type => "config", comment => "SecArgumentSeparator (post-pos)", conf => q( SecRuleEngine On SecRequestBodyAccess On SecArgumentSeparator ";" SecRule ARGS:a "@streq 1" "phase:2,deny,chain,id:500219" SecRule ARGS:b "@streq 2" "" ), match_log => { error => [ qr/Access denied with code 403 \(phase 2\)\. String match "2" at ARGS:b\./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1;b=2", ), }, { type => "config", comment => "SecArgumentSeparator (post-neg)", conf => q( SecRuleEngine On SecRequestBodyAccess On SecRule ARGS:a "@streq 1" "phase:2,deny,id:500221" SecRule ARGS:b "@streq 2" "phase:2,deny,id:500222" ), match_log => { -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1;b=2", ), }, # SecRequestBodyAccess { type => "config", comment => "SecRequestBodyAccess (pos)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecRule ARGS:a "\@streq 1" "phase:2,deny,chain,id:500223" SecRule ARGS:b "\@streq 2" "" ), match_log => { error => [ qr/Access denied with code 403 \(phase 2\)\. String match "2" at ARGS:b\./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1&b=2", ), }, { type => "config", comment => "SecRequestBodyAccess (neg)", conf => qq( SecRuleEngine On SecRequestBodyAccess Off SecRule ARGS:a "\@streq 1" "phase:2,deny,id:500225" SecRule ARGS:b "\@streq 2" "phase:2,deny,id:500226" ), match_log => { -error => [ qr/Access denied/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1&b=2", ), }, # SecRequestBodyLimit { type => "config", comment => "SecRequestBodyLimit (equal)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecRequestBodyLimit 7 ), match_log => { -error => [ qr/Request body is larger than the configured limit/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1&b=2", ), }, { type => "config", comment => "SecRequestBodyLimit (greater)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecRequestBodyLimit 5 ), match_log => { error => [ qr/Request body .*is larger than the configured limit \(5\)\./, 1 ], }, match_response => { status => qr/^413$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1&b=2", ), }, { type => "config", comment => "SecRequestBodyLimit (equal - chunked)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecRequestBodyLimit 276 ), match_log => { -error => [ qr/Request body is larger than the configured limit/, 1 ], }, match_response => { status => qr/^200$/, }, request => normalize_raw_request_data( qq( POST /test.txt HTTP/1.1 Host: $ENV{SERVER_NAME}:$ENV{SERVER_PORT} User-Agent: $ENV{USER_AGENT} Content-Type: multipart/form-data; boundary=---------------------------69343412719991675451336310646 Transfer-Encoding: chunked ), ) .encode_chunked( normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1 -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" 2 -----------------------------69343412719991675451336310646-- ) ), 1024 ), }, { type => "config", comment => "SecRequestBodyLimit (greater - chunked)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecRequestBodyLimit 256 ), match_log => { error => [ qr/Request body .*is larger than the configured limit \(256\)\./, 1 ], }, match_response => { status => qr/^413$/, }, request => normalize_raw_request_data( qq( POST /test.txt HTTP/1.1 Host: $ENV{SERVER_NAME}:$ENV{SERVER_PORT} User-Agent: $ENV{USER_AGENT} Content-Type: multipart/form-data; boundary=---------------------------69343412719991675451336310646 Transfer-Encoding: chunked ), ) .encode_chunked( normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1 -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" 2 -----------------------------69343412719991675451336310646-- ) ), 1024 ), }, { type => "config", comment => "SecRequestBodyLimit (ctl:ruleEngine=off)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecRequestBodyLimit 5 SecAction "phase:1,pass,nolog,ctl:ruleEngine=off,id:500081" SecRule REQUEST_BODY "." "phase:2,deny,id:500227" ), match_log => { -error => [ qr/Request body .*is larger than the configured limit/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1&b=2", ), }, { type => "config", comment => "SecRequestBodyLimit (ctl:requestBodyAccess=off)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecRequestBodyLimit 5 SecAction "phase:1,pass,nolog,ctl:requestBodyAccess=off,id:500082" SecRule REQUEST_BODY "." "phase:2,deny,id:500228" ), match_log => { -error => [ qr/Request body .*is larger than the configured limit/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/x-www-form-urlencoded", ], "a=1&b=2", ), }, { type => "config", comment => "SecRequestBodyLimit (ctl:ruleEngine=off - chunked)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecRequestBodyLimit 256 SecAction "phase:1,pass,nolog,ctl:ruleEngine=off,id:500083" SecRule REQUEST_BODY "." "phase:2,deny,id:500229" ), match_log => { -error => [ qr/Request body .*is larger than the configured limit/, 1 ], }, match_response => { status => qr/^200$/, }, request => normalize_raw_request_data( qq( POST /test.txt HTTP/1.1 Host: $ENV{SERVER_NAME}:$ENV{SERVER_PORT} User-Agent: $ENV{USER_AGENT} Content-Type: multipart/form-data; boundary=---------------------------69343412719991675451336310646 Transfer-Encoding: chunked ), ) .encode_chunked( normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1 -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" 2 -----------------------------69343412719991675451336310646-- ) ), 1024 ), }, { type => "config", comment => "SecRequestBodyLimit (ctl:requestBodyAccess=off - chunked)", conf => qq( SecRuleEngine On SecRequestBodyAccess On SecRequestBodyLimit 256 SecAction "phase:1,pass,nolog,ctl:requestBodyAccess=off,id:500084" SecRule REQUEST_BODY "." "phase:2,deny,id:500230" ), match_log => { -error => [ qr/Request body .*is larger than the configured limit \(256\)\./, 1 ], }, match_response => { status => qr/^200$/, }, request => normalize_raw_request_data( qq( POST /test.txt HTTP/1.1 Host: $ENV{SERVER_NAME}:$ENV{SERVER_PORT} User-Agent: $ENV{USER_AGENT} Content-Type: multipart/form-data; boundary=---------------------------69343412719991675451336310646 Transfer-Encoding: chunked ), ) .encode_chunked( normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1 -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" 2 -----------------------------69343412719991675451336310646-- ) ), 1024 ), }, # SecRequestBodyInMemoryLimit { type => "config", comment => "SecRequestBodyInMemoryLimit (equal)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRequestBodyLimit 1000 SecRequestBodyInMemoryLimit 276 ), match_log => { -debug => [ qr/Input filter: Request too large to store in memory, switching to disk\./, 1 ], }, match_response => { status => qr/^200$/, }, request => normalize_raw_request_data( qq( POST /test.txt HTTP/1.1 Host: $ENV{SERVER_NAME}:$ENV{SERVER_PORT} User-Agent: $ENV{USER_AGENT} Content-Type: multipart/form-data; boundary=---------------------------69343412719991675451336310646 Transfer-Encoding: chunked ), ) .encode_chunked( normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1 -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" 2 -----------------------------69343412719991675451336310646-- ) ), 1024 ), }, { type => "config", comment => "SecRequestBodyInMemoryLimit (greater)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRequestBodyLimit 1000 SecRequestBodyInMemoryLimit 16 ), match_log => { debug => [ qr/Input filter: Request too large to store in memory, switching to disk\./, 1 ], }, match_response => { status => qr/^200$/, }, request => normalize_raw_request_data( qq( POST /test.txt HTTP/1.1 Host: $ENV{SERVER_NAME}:$ENV{SERVER_PORT} User-Agent: $ENV{USER_AGENT} Content-Type: multipart/form-data; boundary=---------------------------69343412719991675451336310646 Transfer-Encoding: chunked ), ) .encode_chunked( normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1 -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" 2 -----------------------------69343412719991675451336310646-- ) ), 1024 ), }, { type => "config", comment => "SecRequestBodyLimitAction Reject (multipart/greater - chunked)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRequestBodyLimitAction Reject SecRequestBodyLimit 20 ), match_log => { debug => [ qr/Request body is larger than the configured limit \(20\).. Deny with code \(413\)/, 1 ], }, match_response => { status => qr/^413$/, }, request => normalize_raw_request_data( qq( POST /test.txt HTTP/1.1 Host: $ENV{SERVER_NAME}:$ENV{SERVER_PORT} User-Agent: $ENV{USER_AGENT} Content-Type: multipart/form-data; boundary=---------------------------69343412719991675451336310646 Transfer-Encoding: chunked ), ) .encode_chunked( normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1 -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" 2 -----------------------------69343412719991675451336310646-- ) ), 1024 ), }, { type => "config", comment => "SecRequestBodyLimitAction Reject (plain/greater)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRequestBodyLimitAction Reject SecRequestBodyLimit 131072 ), match_log => { -debug => [ qr/Request body is larger than the configured limit \(131072\).. Deny with code \(413\)/, 1 ], }, match_response => { status => qr/^413$/, }, request => new HTTP::Request( POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Content-Type" => "application/json", ], normalize_raw_request_data( q( { ) . "'abcdefghijlmnopq'='abcdefghijlmnopqrstuvxz',\\n" x 99000 . q( }, ), ), ), }, { type => "config", comment => "SecRequestBodyLimitAction ProcessPartial (multipart/greater - chunked)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRequestBodyAccess On SecRequestBodyLimitAction ProcessPartial SecRequestBodyLimit 131072 ), match_log => { -debug => [ qr/Request body is larger than the configured limit/, 1], }, match_response => { status => qr/^200$/, }, request => normalize_raw_request_data( qq( POST /test.txt HTTP/1.1 Host: $ENV{SERVER_NAME}:$ENV{SERVER_PORT} User-Agent: $ENV{USER_AGENT} Content-Type: multipart/form-data; boundary=---------------------------69343412719991675451336310646 Transfer-Encoding: chunked ), ) .encode_chunked( normalize_raw_request_data( q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="a" 1) . "a" x 131072 . q( -----------------------------69343412719991675451336310646 Content-Disposition: form-data; name="b" 2) . "b" x 131072 . q( -----------------------------69343412719991675451336310646-- ) ), 131072*3 ), }, # Known issue on nginx, disable it for now. #{ # type => "config", # comment => "SecRequestBodyLimitAction ProcessPartial (plain/greater)", # conf => qq( # SecRuleEngine On # SecDebugLog $ENV{DEBUG_LOG} # SecDebugLogLevel 9 # SecRequestBodyAccess On # SecRequestBodyLimitAction ProcessPartial # SecRequestBodyLimit 131072 # ), # match_log => { # -debug => [ qr/Request body is larger than the configured limit/, 1], # }, # match_response => { # status => qr/^200$/, # }, # request => new HTTP::Request( # POST => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", # [ # "Content-Type" => "application/json", # ], # normalize_raw_request_data( # q( # { # ) . "'abcdefghijlmnopq'='abcdefghijlmnopqrstuvxz',\\n" x 99000 . q( # }, # ), # ), # ), #}, # SecCookieFormat { type => "config", comment => "SecCookieFormat (pos)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 5 SecCookieFormat 1 SecRule REQUEST_COOKIES_NAMES "\@streq SESSIONID" "phase:1,deny,chain,id:500231" SecRule REQUEST_COOKIES:\$SESSIONID_PATH "\@streq /" "chain" SecRule REQUEST_COOKIES:SESSIONID "\@streq cookieval" ), match_log => { error => [ qr/Access denied with code 403 \(phase 1\)\. String match "cookieval" at REQUEST_COOKIES:SESSIONID\./, 1 ], debug => [ qr(Adding request cookie: name "\$SESSIONID_PATH", value "/"), 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Cookie" => q($Version="1"; SESSIONID="cookieval"; $PATH="/"), ], undef, ), }, { type => "config", comment => "SecCookieFormat (neg)", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 5 SecCookieFormat 0 SecRule REQUEST_COOKIES_NAMES "\@streq SESSIONID" "phase:1,deny,chain,id:500234" SecRule REQUEST_COOKIES:\$SESSIONID_PATH "\@streq /" "chain" SecRule REQUEST_COOKIES:SESSIONID "\@streq cookieval" ), match_log => { -error => [ qr/Access denied/, 1 ], -debug => [ qr(Adding request cookie: name "\$SESSIONID_PATH", value "/"), 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", [ "Cookie" => q($Version="1"; SESSIONID="cookieval"; $PATH="/"), ], undef, ), }, modsecurity-2.9.5/tests/regression/config/10-response-directives.t0000664000175000017500000001016514147005233026411 0ustar mhsvierulamhsvierula### Tests for directives altering how a response is handled # SecResponseBodyMimeTypesClear { type => "config", comment => "SecResponseBodyMimeTypesClear", conf => qq( SecRuleEngine On SecResponseBodyAccess On SecResponseBodyMimeTypesClear SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecRule RESPONSE_BODY "TEST" "phase:4,deny,id:500237" ), match_log => { -error => [ qr/Access denied/, 1 ], debug => [ qr/Not buffering response body for unconfigured MIME type/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # SecResponseBodyAccess & SecResponseBodyMimeType { type => "config", comment => "SecResponseBodyAccess On", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecResponseBodyAccess On SecResponseBodyMimeType text/plain null SecRule RESPONSE_BODY "TEST" "phase:4,deny,id:500238" ), match_log => { error => [ qr/Access denied with code 403 \(phase 4\)\. Pattern match "TEST" at RESPONSE_BODY\./, 1 ], }, match_response => { status => qr/^403$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, { type => "config", comment => "SecResponseBodyAccess Off", conf => qq( SecRuleEngine On SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 9 SecResponseBodyAccess Off SecResponseBodyMimeType text/plain null SecRule RESPONSE_BODY "TEST" "phase:4,deny,id:500239" ), match_log => { -error => [ qr/Access denied/, 1 ], debug => [ qr/Response body buffering is not enabled\./, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/test.txt", ), }, # SecResponseBodyLimit { type => "config", comment => "SecResponseBodyLimit (equal)", conf => qq( SecRuleEngine On SecResponseBodyAccess On SecResponseBodyMimeType text/plain null SecResponseBodyLimit 8192 ), match_log => { -error => [ qr/Content-Length \(\d+\) over the limit/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/8k.txt", ), }, { type => "config", comment => "SecResponseBodyLimit (less)", conf => qq( SecRuleEngine On SecResponseBodyAccess On SecResponseBodyMimeType text/plain null SecResponseBodyLimit 9000 ), match_log => { -error => [ qr/Content-Length \(\d+\) over the limit/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/8k.txt", ), }, { type => "config", comment => "SecResponseBodyLimit (greater)", conf => qq( SecRuleEngine On SecResponseBodyAccess On SecResponseBodyMimeType text/plain null SecResponseBodyLimit 8000 ), match_log => { error => [ qr/Content-Length \(\d+\) over the limit \(8000\)\./, 1 ], }, match_response => { status => qr/^500$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/8k.txt", ), }, # ResponseBodyLimitAction { type => "config", comment => "SecResponseBodyLimitAction Reject", conf => qq( SecRuleEngine On SecResponseBodyAccess On SecResponseBodyMimeType text/plain null SecResponseBodyLimit 5 SecResponseBodyLimitAction Reject ), match_log => { error => [ qr/Content-Length \(\d+\) over the limit \(5\)\./, 1 ], }, match_response => { status => qr/^500$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/8k.txt", ), }, { type => "config", comment => "SecResponseBodyLimitAction ProcessPartial", conf => qq( SecRuleEngine On SecResponseBodyAccess On SecResponseBodyMimeType text/plain null SecResponseBodyLimit 5 SecDebugLog $ENV{DEBUG_LOG} SecDebugLogLevel 4 SecResponseBodyLimitAction ProcessPartial ), match_log => { -error => [ qr/Content-Length \(\d+\) over the limit/, 1 ], debug => [ qr/Processing partial response body \(limit 5\)/, 1 ], }, match_response => { status => qr/^200$/, }, request => new HTTP::Request( GET => "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}/8k.txt", ), }, modsecurity-2.9.5/tests/regression/nginx/0000775000175000017500000000000014147005233021664 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/nginx/conf/0000775000175000017500000000000014147005233022611 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/nginx/conf/test.lua0000664000175000017500000000055414147005233024277 0ustar mhsvierulamhsvierula-- Test Lua Script to just print debug messages function main() m.log(1, "Test message."); m.log(2, "Test message."); m.log(3, "Test message."); m.log(4, "Test message."); m.log(5, "Test message."); m.log(6, "Test message."); m.log(7, "Test message."); m.log(8, "Test message."); m.log(9, "Test message."); return nil; end modsecurity-2.9.5/tests/regression/nginx/conf/SoapEnvelope.xsd0000664000175000017500000001375314147005233025742 0ustar mhsvierulamhsvierula Prose in the spec does not specify that attributes are allowed on the Body element 'encodingStyle' indicates any canonicalization conventions followed in the contents of the containing element. For example, the value 'http://schemas.xmlsoap.org/soap/encoding/' indicates the pattern described in SOAP specification Fault reporting structure modsecurity-2.9.5/tests/regression/nginx/conf/SoapEnvelope.dtd0000664000175000017500000000032214147005233025703 0ustar mhsvierulamhsvierula modsecurity-2.9.5/tests/regression/nginx/conf/SoapEnvelope-bad.xsd0000664000175000017500000001375214147005233026465 0ustar mhsvierulamhsvierula Prose in the spec does not specify that attributes are allowed on the Body element 'encodingStyle' indicates any canonicalization conventions followed in the contents of the containing element. For example, the value 'http://schemas.xmlsoap.org/soap/encoding/' indicates the pattern described in SOAP specification Fault reporting structure modsecurity-2.9.5/tests/regression/nginx/conf/SoapEnvelope-bad.dtd0000664000175000017500000000032114147005233026426 0ustar mhsvierulamhsvierula modsecurity-2.9.5/tests/regression/nginx/conf/empty.conf0000664000175000017500000000000014147005233024604 0ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/regression/nginx/conf/nginx.conf.template0000664000175000017500000000045714147005233026423 0ustar mhsvierulamhsvierula user root; worker_processes 1; daemon on; error_log logs/error.log debug; events { worker_connections 1024; } http { ModSecurityEnabled [% enable %]; ModSecurityConfig [% config %]; server { listen [% listen %]; server_name localhost; location / { error_page 405 = $uri; } } } modsecurity-2.9.5/tests/regression/nginx/conf/match.lua0000664000175000017500000000060714147005233024413 0ustar mhsvierulamhsvierula-- Test matching Lua Script to just print debug messages function main() m.log(1, "Test message."); m.log(2, "Test message."); m.log(3, "Test message."); m.log(4, "Test message."); m.log(5, "Test message."); m.log(6, "Test message."); m.log(7, "Test message."); m.log(8, "Test message."); m.log(9, "Test message."); return "Lua script matched."; end modsecurity-2.9.5/tests/regression/nginx/conf/ssdeep.txt0000664000175000017500000000050614147005233024636 0ustar mhsvierulamhsvierulassdeep,1.1--blocksize:hash:hash,filename 96:MbQ1L0LDX8GPI8ov3D2D9zd6/gz2wZhFvV0O598La8Kqvfi0znNa8Xi5SM7XRWCK:KvL8Gg8rWIz2ZKqvfjzQ55RpRHjftQ++,"modsecurity.conf-recommended" 192:b8B5UQvywcMIJuavpde/Yyz/U/vF+vGCoCvrQr/dw:afcnrvp8zqUvGrzr6,"README_WINDOWS.TXT" 96:+qK8Z4gA165/hquKNMi68zuEyMM9qNB26x:+RG4z6c1LyZOB26x,"README.TXT" modsecurity-2.9.5/tests/tfn/0000775000175000017500000000000014147005233017150 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/tfn/urlDecodeUni.t0000664000175000017500000003036214147005233021723 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "urlDecodeUni", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "urlDecodeUni", input => "TestCase", output => "TestCase", ret => 0, }, { type => "tfn", name => "urlDecodeUni", input => "Test\0Case", output => "Test\0Case", ret => 0, }, ### Valid { type => "tfn", name => "urlDecodeUni", input => "+%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f%20%21%22%23%24%25%26%27%28%29%2a%2b%2c%2d%2e%2f%30%31%32%33%34%35%36%37%38%39%3a%3b%3c%3d%3e%3f%40%41%42%43%44%45%46%47%48%49%4a%4b%4c%4d%4e%4f%50%51%52%53%54%55%56%57%58%59%5a%5b%5c%5d%5e%5f%60%61%62%63%64%65%66%67%68%69%6a%6b%6c%6d%6e%6f%70%71%72%73%74%75%76%77%78%79%7a%7b%7c%7d%7e%7f%80%81%82%83%84%85%86%87%88%89%8a%8b%8c%8d%8e%8f%90%91%92%93%94%95%96%97%98%99%9a%9b%9c%9d%9e%9f%a0%a1%a2%a3%a4%a5%a6%a7%a8%a9%aa%ab%ac%ad%ae%af%b0%b1%b2%b3%b4%b5%b6%b7%b8%b9%ba%bb%bc%bd%be%bf%c0%c1%c2%c3%c4%c5%c6%c7%c8%c9%ca%cb%cc%cd%ce%cf%d0%d1%d2%d3%d4%d5%d6%d7%d8%d9%da%db%dc%dd%de%df%e0%e1%e2%e3%e4%e5%e6%e7%e8%e9%ea%eb%ec%ed%ee%ef%f0%f1%f2%f3%f4%f5%f6%f7%f8%f9%fa%fb%fc%fd%fe%ff", output => " \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f \x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff", ret => 1, }, { type => "tfn", name => "urlDecodeUni", input => "Test+Case", output => "Test Case", ret => 1, }, { type => "tfn", name => "urlDecodeUni", input => "+%u0000%u0001%u0002%u0003%u0004%u0005%u0006%u0007%u0008%u0009%u000a%u000b%u000c%u000d%u000e%u000f%u0010%u0011%u0012%u0013%u0014%u0015%u0016%u0017%u0018%u0019%u001a%u001b%u001c%u001d%u001e%u001f%u0020%u0021%u0022%u0023%u0024%u0025%u0026%u0027%u0028%u0029%u002a%u002b%u002c%u002d%u002e%u002f%u0030%u0031%u0032%u0033%u0034%u0035%u0036%u0037%u0038%u0039%u003a%u003b%u003c%u003d%u003e%u003f%u0040%u0041%u0042%u0043%u0044%u0045%u0046%u0047%u0048%u0049%u004a%u004b%u004c%u004d%u004e%u004f%u0050%u0051%u0052%u0053%u0054%u0055%u0056%u0057%u0058%u0059%u005a%u005b%u005c%u005d%u005e%u005f%u0060%u0061%u0062%u0063%u0064%u0065%u0066%u0067%u0068%u0069%u006a%u006b%u006c%u006d%u006e%u006f%u0070%u0071%u0072%u0073%u0074%u0075%u0076%u0077%u0078%u0079%u007a%u007b%u007c%u007d%u007e%u007f%u0080%u0081%u0082%u0083%u0084%u0085%u0086%u0087%u0088%u0089%u008a%u008b%u008c%u008d%u008e%u008f%u0090%u0091%u0092%u0093%u0094%u0095%u0096%u0097%u0098%u0099%u009a%u009b%u009c%u009d%u009e%u009f%u00a0%u00a1%u00a2%u00a3%u00a4%u00a5%u00a6%u00a7%u00a8%u00a9%u00aa%u00ab%u00ac%u00ad%u00ae%u00af%u00b0%u00b1%u00b2%u00b3%u00b4%u00b5%u00b6%u00b7%u00b8%u00b9%u00ba%u00bb%u00bc%u00bd%u00be%u00bf%u00c0%u00c1%u00c2%u00c3%u00c4%u00c5%u00c6%u00c7%u00c8%u00c9%u00ca%u00cb%u00cc%u00cd%u00ce%u00cf%u00d0%u00d1%u00d2%u00d3%u00d4%u00d5%u00d6%u00d7%u00d8%u00d9%u00da%u00db%u00dc%u00dd%u00de%u00df%u00e0%u00e1%u00e2%u00e3%u00e4%u00e5%u00e6%u00e7%u00e8%u00e9%u00ea%u00eb%u00ec%u00ed%u00ee%u00ef%u00f0%u00f1%u00f2%u00f3%u00f4%u00f5%u00f6%u00f7%u00f8%u00f9%u00fa%u00fb%u00fc%u00fd%u00fe%u00ff", output => " \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f \x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff", ret => 1, }, { type => "tfn", name => "urlDecodeUni", input => "+%u1100%u1101%u1102%u1103%u1104%u1105%u1106%u1107%u1108%u1109%u110a%u110b%u110c%u110d%u110e%u110f%u1110%u1111%u1112%u1113%u1114%u1115%u1116%u1117%u1118%u1119%u111a%u111b%u111c%u111d%u111e%u111f%u1120%u1121%u1122%u1123%u1124%u1125%u1126%u1127%u1128%u1129%u112a%u112b%u112c%u112d%u112e%u112f%u1130%u1131%u1132%u1133%u1134%u1135%u1136%u1137%u1138%u1139%u113a%u113b%u113c%u113d%u113e%u113f%u1140%u1141%u1142%u1143%u1144%u1145%u1146%u1147%u1148%u1149%u114a%u114b%u114c%u114d%u114e%u114f%u1150%u1151%u1152%u1153%u1154%u1155%u1156%u1157%u1158%u1159%u115a%u115b%u115c%u115d%u115e%u115f%u1160%u1161%u1162%u1163%u1164%u1165%u1166%u1167%u1168%u1169%u116a%u116b%u116c%u116d%u116e%u116f%u1170%u1171%u1172%u1173%u1174%u1175%u1176%u1177%u1178%u1179%u117a%u117b%u117c%u117d%u117e%u117f%u1180%u1181%u1182%u1183%u1184%u1185%u1186%u1187%u1188%u1189%u118a%u118b%u118c%u118d%u118e%u118f%u1190%u1191%u1192%u1193%u1194%u1195%u1196%u1197%u1198%u1199%u119a%u119b%u119c%u119d%u119e%u119f%u11a0%u11a1%u11a2%u11a3%u11a4%u11a5%u11a6%u11a7%u11a8%u11a9%u11aa%u11ab%u11ac%u11ad%u11ae%u11af%u11b0%u11b1%u11b2%u11b3%u11b4%u11b5%u11b6%u11b7%u11b8%u11b9%u11ba%u11bb%u11bc%u11bd%u11be%u11bf%u11c0%u11c1%u11c2%u11c3%u11c4%u11c5%u11c6%u11c7%u11c8%u11c9%u11ca%u11cb%u11cc%u11cd%u11ce%u11cf%u11d0%u11d1%u11d2%u11d3%u11d4%u11d5%u11d6%u11d7%u11d8%u11d9%u11da%u11db%u11dc%u11dd%u11de%u11df%u11e0%u11e1%u11e2%u11e3%u11e4%u11e5%u11e6%u11e7%u11e8%u11e9%u11ea%u11eb%u11ec%u11ed%u11ee%u11ef%u11f0%u11f1%u11f2%u11f3%u11f4%u11f5%u11f6%u11f7%u11f8%u11f9%u11fa%u11fb%u11fc%u11fd%u11fe%u11ff", output => " \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f \x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff", ret => 1, }, # Full Width ASCII { type => "tfn", name => "urlDecodeUni", input => "%uff01%uff02%uff03%uff04%uff05%uff06%uff07%uff08%uff09%uff0a%uff0b%uff0c%uff0d%uff0e%uff0f%uff10%uff11%uff12%uff13%uff14%uff15%uff16%uff17%uff18%uff19%uff1a%uff1b%uff1c%uff1d%uff1e%uff1f%uff20%uff21%uff22%uff23%uff24%uff25%uff26%uff27%uff28%uff29%uff2a%uff2b%uff2c%uff2d%uff2e%uff2f%uff30%uff31%uff32%uff33%uff34%uff35%uff36%uff37%uff38%uff39%uff3a%uff3b%uff3c%uff3d%uff3e%uff3f%uff40%uff41%uff42%uff43%uff44%uff45%uff46%uff47%uff48%uff49%uff4a%uff4b%uff4c%uff4d%uff4e%uff4f%uff50%uff51%uff52%uff53%uff54%uff55%uff56%uff57%uff58%uff59%uff5a%uff5b%uff5c%uff5d%uff5e", output => "\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e", ret => 1, }, # Invalid Full Width ASCII { type => "tfn", name => "urlDecodeUni", input => "%uff00%uff7f%uff80%uff81%uff82%uff83%uff84%uff85%uff86%uff87%uff88%uff89%uff8a%uff8b%uff8c%uff8d%uff8e%uff8f%uff90%uff91%uff92%uff93%uff94%uff95%uff96%uff97%uff98%uff99%uff9a%uff9b%uff9c%uff9d%uff9e%uff9f%uffa0%uffa1%uffa2%uffa3%uffa4%uffa5%uffa6%uffa7%uffa8%uffa9%uffaa%uffab%uffac%uffad%uffae%uffaf%uffb0%uffb1%uffb2%uffb3%uffb4%uffb5%uffb6%uffb7%uffb8%uffb9%uffba%uffbb%uffbc%uffbd%uffbe%uffbf%uffc0%uffc1%uffc2%uffc3%uffc4%uffc5%uffc6%uffc7%uffc8%uffc9%uffca%uffcb%uffcc%uffcd%uffce%uffcf%uffd0%uffd1%uffd2%uffd3%uffd4%uffd5%uffd6%uffd7%uffd8%uffd9%uffda%uffdb%uffdc%uffdd%uffde%uffdf%uffe0%uffe1%uffe2%uffe3%uffe4%uffe5%uffe6%uffe7%uffe8%uffe9%uffea%uffeb%uffec%uffed%uffee%uffef%ufff0%ufff1%ufff2%ufff3%ufff4%ufff5%ufff6%ufff7%ufff8%ufff9%ufffa%ufffb%ufffc%ufffd%ufffe%uffff", output => "\x00\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff", ret => 1, }, ### Partial Invalid { type => "tfn", name => "urlDecodeUni", input => "%+", output => "% ", ret => 1, }, { type => "tfn", name => "urlDecodeUni", input => "%%20", output => "% ", ret => 1, }, { type => "tfn", name => "urlDecodeUni", input => "%0g%20", output => "%0g ", ret => 1, }, { type => "tfn", name => "urlDecodeUni", input => "%0%20", output => "%0 ", ret => 1, }, { type => "tfn", name => "urlDecodeUni", input => "%g0%20", output => "%g0 ", ret => 1, }, { type => "tfn", name => "urlDecodeUni", input => "%g%20", output => "%g ", ret => 1, }, { type => "tfn", name => "urlDecodeUni", input => "%%u0020", output => "% ", ret => 1, }, { type => "tfn", name => "urlDecodeUni", input => "%0g%u0020", output => "%0g ", ret => 1, }, { type => "tfn", name => "urlDecodeUni", input => "%0%u0020", output => "%0 ", ret => 1, }, { type => "tfn", name => "urlDecodeUni", input => "%g0%u0020", output => "%g0 ", ret => 1, }, { type => "tfn", name => "urlDecodeUni", input => "%u%u0020", output => "%u ", ret => 1, }, { type => "tfn", name => "urlDecodeUni", input => "%u0%u0020", output => "%u0 ", ret => 1, }, { type => "tfn", name => "urlDecodeUni", input => "%u00%u0020", output => "%u00 ", ret => 1, }, { type => "tfn", name => "urlDecodeUni", input => "%u000%u0020", output => "%u000 ", ret => 1, }, { type => "tfn", name => "urlDecodeUni", input => "%u000g%u0020", output => "%u000g ", ret => 1, }, ### Invalid { type => "tfn", name => "urlDecodeUni", input => "%0%1%2%3%4%5%6%7%8%9%0%a%b%c%d%e%f", output => "%0%1%2%3%4%5%6%7%8%9%0%a%b%c%d%e%f", ret => 0, }, { type => "tfn", name => "urlDecodeUni", input => "%g0%g1%g2%g3%g4%g5%g6%g7%g8%g9%g0%ga%gb%gc%gd%ge%gf", output => "%g0%g1%g2%g3%g4%g5%g6%g7%g8%g9%g0%ga%gb%gc%gd%ge%gf", ret => 0, }, { type => "tfn", name => "urlDecodeUni", input => "%0g%1g%2g%3g%4g%5g%6g%7g%8g%9g%0g%ag%bg%cg%dg%eg%fg", output => "%0g%1g%2g%3g%4g%5g%6g%7g%8g%9g%0g%ag%bg%cg%dg%eg%fg", ret => 0, }, { type => "tfn", name => "urlDecodeUni", input => "%", output => "%", ret => 0, }, { type => "tfn", name => "urlDecodeUni", input => "%0", output => "%0", ret => 0, }, { type => "tfn", name => "urlDecodeUni", input => "%%", output => "%%", ret => 0, }, { type => "tfn", name => "urlDecodeUni", input => "%0g", output => "%0g", ret => 0, }, { type => "tfn", name => "urlDecodeUni", input => "%gg", output => "%gg", ret => 0, }, modsecurity-2.9.5/tests/tfn/htmlEntityDecode.t0000664000175000017500000000216414147005233022605 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "htmlEntityDecode", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "htmlEntityDecode", input => "TestCase", output => "TestCase", ret => 0, }, { type => "tfn", name => "htmlEntityDecode", input => "Test\0Case", output => "Test\0Case", ret => 0, }, ### Valid # With ; { type => "tfn", name => "htmlEntityDecode", input => "�� � \0d"&<> ", output => "\0\0\x20\x20\0\x20\0\x64\"&<>\xa0", ret => 1, }, # Without ; { type => "tfn", name => "htmlEntityDecode", input => "�� � \0d"&<> ", output => "\0\0\x20\x20\0\x20\0\x64\"&<>\xa0", ret => 1, }, ### Invalid { type => "tfn", name => "htmlEntityDecode", input => "&#xg;&#Xg;&#xg0;g;&#a;\0&#a2;a&#a00;a0; a;&foo;", output => "&#xg;&#Xg;&#xg0;\x02g;&#a;\0&#a2;\x03a&#a00;\x01a0;\x0aa;&foo;", ret => 1, }, { type => "tfn", name => "htmlEntityDecode", input => "&#xg&#Xg&#xg0g&#a\0&#a2a&#a00a0 a&foo", output => "&#xg&#Xg&#xg0\x02g&#a\0&#a2\x03a&#a00\x01a0\x0aa&foo", ret => 1, }, modsecurity-2.9.5/tests/tfn/replaceComments.t0000664000175000017500000000466214147005233022466 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "replaceComments", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "replaceComments", input => "TestCase", output => "TestCase", ret => 0, }, { type => "tfn", name => "replaceComments", input => "Test\0Case", output => "Test\0Case", ret => 0, }, ### Basics { type => "tfn", name => "replaceComments", input => "/* TestCase */", output => " ", ret => 1, }, { type => "tfn", name => "replaceComments", input => "/*TestCase*/", output => " ", ret => 1, }, { type => "tfn", name => "replaceComments", input => "/* TestCase*/", output => " ", ret => 1, }, { type => "tfn", name => "replaceComments", input => "/*TestCase */", output => " ", ret => 1, }, { type => "tfn", name => "replaceComments", input => "Before/* TestCase */After", output => "Before After", ret => 1, }, { type => "tfn", name => "replaceComments", input => "Before /* TestCase */ After", output => "Before After", ret => 1, }, { type => "tfn", name => "replaceComments", input => "/* Test\nCase */", output => " ", ret => 1, }, { type => "tfn", name => "replaceComments", input => "/* Test\x0d\x0aCase */", output => " ", ret => 1, }, { type => "tfn", name => "replaceComments", input => "/* Test\x0aCase */", output => " ", ret => 1, }, { type => "tfn", name => "replaceComments", input => "/* Test\x0dCase */", output => " ", ret => 1, }, ### Broken Comments { type => "tfn", name => "replaceComments", input => "Before/* Test\x0d\x0aCase ", output => "Before ", ret => 1, }, { type => "tfn", name => "replaceComments", input => "Before /* Test\x0aCase ", output => "Before ", ret => 1, }, { type => "tfn", name => "replaceComments", input => "Before/* Test\x0d\x0aCase ", output => "Before ", ret => 1, }, { type => "tfn", name => "replaceComments", input => "Before /* Test\x0aCase ", output => "Before ", ret => 1, }, { type => "tfn", name => "replaceComments", input => "Test\x0d\x0aCase */After", output => "Test\x0d\x0aCase */After", ret => 0, }, { type => "tfn", name => "replaceComments", input => "Test\x0aCase */ After", output => "Test\x0aCase */ After", ret => 0, }, { type => "tfn", name => "replaceComments", input => "Test\x0d\x0aCase */After", output => "Test\x0d\x0aCase */After", ret => 0, }, { type => "tfn", name => "replaceComments", input => "Test\x0aCase */ After", output => "Test\x0aCase */ After", ret => 0, }, modsecurity-2.9.5/tests/tfn/jsDecode.t0000664000175000017500000000426014147005233021057 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "jsDecode", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "jsDecode", input => "TestCase", output => "TestCase", ret => 0, }, { type => "tfn", name => "jsDecode", input => "Test\0Case", output => "Test\0Case", ret => 0, }, ### Valid Sequences { type => "tfn", name => "jsDecode", input => "\\a\\b\\f\\n\\r\\t\\v\\?\\'\\\"\\0\\12\\123\\x00\\xff\\u0021\\uff01", output => "\a\b\f\x0a\x0d\t\x0b?'\"\x00\x0a\x53\x00\xff\x21\x21", ret => 1, }, { type => "tfn", name => "jsDecode", input => "\\a\\b\\f\\n\\r\\t\\v\0\\?\\'\\\"\\0\\12\\123\\x00\\xff\\u0021\\uff01", output => "\a\b\f\x0a\x0d\t\x0b\0?'\"\x00\x0a\x53\x00\xff\x21\x21", ret => 1, }, ### Invalid Sequences # \8 and \9 are not octal # \666 is \66 + '6' (JS does not allow the overflow as C does) # \u00ag, \u00ga, \u0zaa, \uz0aa are not hex # \xag and \xga are not hex, # \0123 is \012 + '3' { type => "tfn", name => "jsDecode", input => "\\8\\9\\666\\u00ag\\u00ga\\u0zaa\\uz0aa\\xag\\xga\\0123\\u00a", output => "89\x366u00agu00gau0zaauz0aaxagxga\x0a3u00a", ret => 1, }, # \x, \x0 lack enough hex digits { type => "tfn", name => "jsDecode", input => "\\x", output => "x", ret => 1, }, { type => "tfn", name => "jsDecode", input => "\\x\\x0", output => "xx0", ret => 1, }, { type => "tfn", name => "jsDecode", input => "\\x\\x0\0", output => "xx0\0", ret => 1, }, # \u, \u0 \u01, \u012 lack enough hex digits { type => "tfn", name => "jsDecode", input => "\\u", output => "u", ret => 1, }, { type => "tfn", name => "jsDecode", input => "\\u\\u0", output => "uu0", ret => 1, }, { type => "tfn", name => "jsDecode", input => "\\u\\u0\\u01", output => "uu0u01", ret => 1, }, { type => "tfn", name => "jsDecode", input => "\\u\\u0\\u01\\u012", output => "uu0u01u012", ret => 1, }, { type => "tfn", name => "jsDecode", input => "\\u\\u0\\u01\\u012\0", output => "uu0u01u012\0", ret => 1, }, # A forward slash with nothing after { type => "tfn", name => "jsDecode", input => "\\", output => "\\", ret => 0, }, # A forward slash with NUL after { type => "tfn", name => "jsDecode", input => "\\\0", output => "\0", ret => 1, }, modsecurity-2.9.5/tests/tfn/parityZero7bit.t0000664000175000017500000000125214147005233022273 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "parityZero7bit", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "parityZero7bit", input => "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", output => "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", ret => 0, }, { type => "tfn", name => "parityZero7bit", input => "abcdefghijklmnopqrstuvwxyz\x000123456789\x00ABCDEFGHIJKLMNOPQRSTUVWXYZ", output => "abcdefghijklmnopqrstuvwxyz\x000123456789\x00ABCDEFGHIJKLMNOPQRSTUVWXYZ", ret => 0, }, ### Basic { type => "tfn", name => "parityZero7bit", input => "\x80\x00\x8f\xff", output => "\x00\x00\x0f\x7f", ret => 1, }, modsecurity-2.9.5/tests/tfn/cssDecode.t0000664000175000017500000000204614147005233021233 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "cssDecode", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "cssDecode", input => "TestCase", output => "TestCase", ret => 0, }, { type => "tfn", name => "cssDecode", input => "Test\0Case", output => "Test\0Case", ret => 0, }, ### Valid Sequences { type => "tfn", name => "cssDecode", input => "test\\a\\b\\f\\n\\r\\t\\v\\?\\'\\\"\\0\\12\\123\\1234\\12345\\123456\\ff01\\ff5e\\\n\\0 string", output => qq(test\x0a\x0b\x0fnrtv?'"\x00\x12\x23\x34\x45\x56\x21\x7e\x00 string), ret => 1, }, ### Invalid Sequences # Trailing escape == line continuation with no line following (ie nothing) { type => "tfn", name => "cssDecode", input => "test\\", output => "test", ret => 1, }, # Edge cases # "\1A" == "\x1A" # "\1 A" == "\x01A" # "\1234567" == "\x567" # "\123456 7" == "\x567" # "\1x" == "\x01x" # "\1 x" == "\x01 x" { type => "tfn", name => "cssDecode", input => "\\1A\\1 A\\1234567\\123456 7\\1x\\1 x", output => "\x1A\x01A\x567\x567\x01x\x01x", ret => 1, }, modsecurity-2.9.5/tests/tfn/compressWhitespace.t0000664000175000017500000000171014147005233023204 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "compressWhitespace", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "compressWhitespace", input => "TestCase", output => "TestCase", ret => 0, }, { type => "tfn", name => "compressWhitespace", input => "Test\0Case", output => "Test\0Case", ret => 0, }, { type => "tfn", name => "compressWhitespace", input => "Test Case", output => "Test Case", ret => 0, }, ### Compress space/tab { type => "tfn", name => "compressWhitespace", input => " Test \t Case ", output => " Test Case ", ret => 1, }, ### Pretty much everything in one { type => "tfn", name => "compressWhitespace", input => "This is a test case with a tab \t, vtab \x0b, newline \x0a, return \x0d, formfeed \f, and a NUL\0 in it with a CRLF at the end.\x0d\x0a", output => "This is a test case with a tab , vtab , newline , return , formfeed , and a NUL\0 in it with a CRLF at the end. ", ret => 1, }, modsecurity-2.9.5/tests/tfn/utf8toUnicode.t0000664000175000017500000002703414147005233022103 0ustar mhsvierulamhsvierula# Latin extended { type => "tfn", name => "utf8toUnicode", input => "Ā ā Ă ă Ą ą Ć ć Ĉ ĉ Ċ ċ Č č Ď ď Đ đ Ē ē Ĕ ĕ Ė ė Ę ę Ě ě Ĝ ĝ Ğ ğ Ġ ġ Ģ ģ Ĥ ĥ Ħ ħ Ĩ ĩ Ī ī Ĭ ĭ Į į İ ı IJ ij Ĵ ĵ Ķ ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ ŀ Ł ł Ń ń Ņ ņ Ň ň ʼn Ŋ ŋ Ō ō Ŏ ŏ Ő ő Œ œ Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ŝ ŝ Ş ş Š š Ţ ţ Ť ť Ŧ ŧ Ũ ũ Ū ū Ŭ ŭ Ů ů Ű ű Ų ų Ŵ ŵ Ŷ ŷ Ÿ Ź ź Ż ż Ž ž ſ", output => "%u0100 %u0101 %u0102 %u0103 %u0104 %u0105 %u0106 %u0107 %u0108 %u0109 %u010a %u010b %u010c %u010d %u010e %u010f %u0110 %u0111 %u0112 %u0113 %u0114 %u0115 %u0116 %u0117 %u0118 %u0119 %u011a %u011b %u011c %u011d %u011e %u011f %u0120 %u0121 %u0122 %u0123 %u0124 %u0125 %u0126 %u0127 %u0128 %u0129 %u012a %u012b %u012c %u012d %u012e %u012f %u0130 %u0131 %u0132 %u0133 %u0134 %u0135 %u0136 %u0137 %u0138 %u0139 %u013a %u013b %u013c %u013d %u013e %u013f %u0140 %u0141 %u0142 %u0143 %u0144 %u0145 %u0146 %u0147 %u0148 %u0149 %u014a %u014b %u014c %u014d %u014e %u014f %u0150 %u0151 %u0152 %u0153 %u0154 %u0155 %u0156 %u0157 %u0158 %u0159 %u015a %u015b %u015c %u015d %u015e %u015f %u0160 %u0161 %u0162 %u0163 %u0164 %u0165 %u0166 %u0167 %u0168 %u0169 %u016a %u016b %u016c %u016d %u016e %u016f %u0170 %u0171 %u0172 %u0173 %u0174 %u0175 %u0176 %u0177 %u0178 %u0179 %u017a %u017b %u017c %u017d %u017e %u017f", ret => 1, }, # Greek - Coptic - Hebrew { type => "tfn", name => "utf8toUnicode", input => "Ѐ Ё Ђ Ѓ Є Ѕ І Ї Ј Љ Њ Ћ Ќ Ѝ Ў Џ А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я ѐ ё ђ ѓ є ѕ і ї ј љ њ ћ ќ ѝ ў џ Ѡ ѡ Ѣ ѣ Ѥ ѥ Ѧ ѧ Ѩ ѩ Ѫ ѫ Ѭ ѭ Ѯ ѯ Ѱ ѱ Ѳ ѳ Ѵ ѵ Ѷ ѷ Ѹ ѹ Ѻ ѻ Ѽ ѽ Ѿ ѿ Ҁ ҁ ҂ ҈ ҉ Ҋ ҋ Ҍ ҍ Ҏ ҏ Ґ ґ Ғ ғ Ҕ ҕ Җ җ Ҙ ҙ Қ қ Ҝ ҝ Ҟ ҟ Ҡ ҡ Ң ң Ҥ ҥ Ҧ ҧ Ҩ ҩ Ҫ ҫ Ҭ ҭ Ү ү Ұ ұ Ҳ ҳ Ҵ ҵ Ҷ ҷ Ҹ ҹ Һ һ Ҽ ҽ Ҿ ҿ Ӏ Ӂ ӂ Ӄ ӄ Ӆ ӆ Ӈ ӈ Ӊ ӊ Ӌ ӌ Ӎ ӎ ӏ Ӑ ӑ Ӓ ӓ Ӕ ӕ Ӗ ӗ Ә ә Ӛ ӛ Ӝ ӝ Ӟ ӟ Ӡ ӡ Ӣ ӣ Ӥ ӥ Ӧ ӧ Ө ө Ӫ ӫ Ӭ ӭ Ӯ ӯ Ӱ ӱ Ӳ ӳ Ӵ ӵ Ӷ ӷ Ӹ ӹ Ӻ ӻ Ӽ ӽ Ӿ ӿ ͵ ͺ ͻ ͼ ͽ ΄ ΅ Ά Έ Ή Ί Ό Ύ Ώ ΐ Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω Ϊ Ϋ ά έ ή ί ΰ α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ ς σ τ υ φ χ ψ ω ϊ ϋ ό ύ ώ ϐ ϑ ϒ ϓ ϔ ϕ ϖ ϗ Ϙ ϙ Ϛ ϛ Ϝ ϝ Ϟ ϟ Ϡ ϡ Ϣ ϣ Ϥ ϥ Ϧ ϧ Ϩ ϩ Ϫ ϫ Ϭ ϭ Ϯ ϯ ϰ ϱ ϲ ϳ ϴ ϵ ϶ Ϸ ϸ Ϲ Ϻ ϻ ϼ Ͻ Ͼ Ͽ ־ ׀ ׃ ׆ א ב ג ד ה ו ז ח ט י ך כ ל ם מ ן נ ס ע ף פ ץ צ ק ר ש ת װ ױ ײ ׳ ״", output => "%u0400 %u0401 %u0402 %u0403 %u0404 %u0405 %u0406 %u0407 %u0408 %u0409 %u040a %u040b %u040c %u040d %u040e %u040f %u0410 %u0411 %u0412 %u0413 %u0414 %u0415 %u0416 %u0417 %u0418 %u0419 %u041a %u041b %u041c %u041d %u041e %u041f %u0420 %u0421 %u0422 %u0423 %u0424 %u0425 %u0426 %u0427 %u0428 %u0429 %u042a %u042b %u042c %u042d %u042e %u042f %u0430 %u0431 %u0432 %u0433 %u0434 %u0435 %u0436 %u0437 %u0438 %u0439 %u043a %u043b %u043c %u043d %u043e %u043f %u0440 %u0441 %u0442 %u0443 %u0444 %u0445 %u0446 %u0447 %u0448 %u0449 %u044a %u044b %u044c %u044d %u044e %u044f %u0450 %u0451 %u0452 %u0453 %u0454 %u0455 %u0456 %u0457 %u0458 %u0459 %u045a %u045b %u045c %u045d %u045e %u045f %u0460 %u0461 %u0462 %u0463 %u0464 %u0465 %u0466 %u0467 %u0468 %u0469 %u046a %u046b %u046c %u046d %u046e %u046f %u0470 %u0471 %u0472 %u0473 %u0474 %u0475 %u0476 %u0477 %u0478 %u0479 %u047a %u047b %u047c %u047d %u047e %u047f %u0480 %u0481 %u0482 %u0488 %u0489 %u048a %u048b %u048c %u048d %u048e %u048f %u0490 %u0491 %u0492 %u0493 %u0494 %u0495 %u0496 %u0497 %u0498 %u0499 %u049a %u049b %u049c %u049d %u049e %u049f %u04a0 %u04a1 %u04a2 %u04a3 %u04a4 %u04a5 %u04a6 %u04a7 %u04a8 %u04a9 %u04aa %u04ab %u04ac %u04ad %u04ae %u04af %u04b0 %u04b1 %u04b2 %u04b3 %u04b4 %u04b5 %u04b6 %u04b7 %u04b8 %u04b9 %u04ba %u04bb %u04bc %u04bd %u04be %u04bf %u04c0 %u04c1 %u04c2 %u04c3 %u04c4 %u04c5 %u04c6 %u04c7 %u04c8 %u04c9 %u04ca %u04cb %u04cc %u04cd %u04ce %u04cf %u04d0 %u04d1 %u04d2 %u04d3 %u04d4 %u04d5 %u04d6 %u04d7 %u04d8 %u04d9 %u04da %u04db %u04dc %u04dd %u04de %u04df %u04e0 %u04e1 %u04e2 %u04e3 %u04e4 %u04e5 %u04e6 %u04e7 %u04e8 %u04e9 %u04ea %u04eb %u04ec %u04ed %u04ee %u04ef %u04f0 %u04f1 %u04f2 %u04f3 %u04f4 %u04f5 %u04f6 %u04f7 %u04f8 %u04f9 %u04fa %u04fb %u04fc %u04fd %u04fe %u04ff %u0375 %u037a %u037b %u037c %u037d %u0384 %u0385 %u0386 %u0388 %u0389 %u038a %u038c %u038e %u038f %u0390 %u0391 %u0392 %u0393 %u0394 %u0395 %u0396 %u0397 %u0398 %u0399 %u039a %u039b %u039c %u039d %u039e %u039f %u03a0 %u03a1 %u03a3 %u03a4 %u03a5 %u03a6 %u03a7 %u03a8 %u03a9 %u03aa %u03ab %u03ac %u03ad %u03ae %u03af %u03b0 %u03b1 %u03b2 %u03b3 %u03b4 %u03b5 %u03b6 %u03b7 %u03b8 %u03b9 %u03ba %u03bb %u03bc %u03bd %u03be %u03bf %u03c0 %u03c1 %u03c2 %u03c3 %u03c4 %u03c5 %u03c6 %u03c7 %u03c8 %u03c9 %u03ca %u03cb %u03cc %u03cd %u03ce %u03d0 %u03d1 %u03d2 %u03d3 %u03d4 %u03d5 %u03d6 %u03d7 %u03d8 %u03d9 %u03da %u03db %u03dc %u03dd %u03de %u03df %u03e0 %u03e1 %u03e2 %u03e3 %u03e4 %u03e5 %u03e6 %u03e7 %u03e8 %u03e9 %u03ea %u03eb %u03ec %u03ed %u03ee %u03ef %u03f0 %u03f1 %u03f2 %u03f3 %u03f4 %u03f5 %u03f6 %u03f7 %u03f8 %u03f9 %u03fa %u03fb %u03fc %u03fd %u03fe %u03ff %u05be %u05c0 %u05c3 %u05c6 %u05d0 %u05d1 %u05d2 %u05d3 %u05d4 %u05d5 %u05d6 %u05d7 %u05d8 %u05d9 %u05da %u05db %u05dc %u05dd %u05de %u05df %u05e0 %u05e1 %u05e2 %u05e3 %u05e4 %u05e5 %u05e6 %u05e7 %u05e8 %u05e9 %u05ea %u05f0 %u05f1 %u05f2 %u05f3 %u05f4", ret => 1, }, # Arabic - Syriac { type => "tfn", name => "utf8toUnicode", input => "ب ة ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ـ ف ق ك ل م ن ه و ى ي ٖ ٗ ٘ ٙ ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ ٪ ٫ ٬ ٭ ٮ ٯ ٱ ٲ ٳ ٴ ٵ ٶ ٷ ٸ ٹ ٺ ٻ ټ ٽ پ ٿ ڀ ځ ڂ ڃ ڄ څ چ ڇ ڈ ډ ڊ ڋ ڌ ڍ ڎ ڏ ڐ ڑ ڒ ړ ڔ ڕ ږ ڗ ژ ڙ ښ ڛ ڜ ڝ ڞ ڟ ڠ ڡ ڢ ڣ ڤ ڥ ڦ ڧ ڨ ک ڪ ګ ڬ ڭ ڮ گ ڰ ڱ ڲ ڳ ڴ ڵ ڶ ڷ ڸ ڹ ں ڻ ڼ ڽ ھ ڿ ۀ ہ ۂ ۃ ۄ ۅ ۆ ۇ ۈ ۉ ۊ ۋ ی ۍ ێ ۏ ې ۑ ے ۓ ۔ ە ۝ ۞ ۥ ۦ ۩ ۮ ۯ ۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۺ ۻ ۼ ۽ ۾ ", output => "%u0628 %u0629 %u062a %u062b %u062c %u062d %u062e %u062f %u0630 %u0631 %u0632 %u0633 %u0634 %u0635 %u0636 %u0637 %u0638 %u0639 %u063a %u0640 %u0641 %u0642 %u0643 %u0644 %u0645 %u0646 %u0647 %u0648 %u0649 %u064a %u0656 %u0657 %u0658 %u0659 %u0660 %u0661 %u0662 %u0663 %u0664 %u0665 %u0666 %u0667 %u0668 %u0669 %u066a %u066b %u066c %u066d %u066e %u066f %u0671 %u0672 %u0673 %u0674 %u0675 %u0676 %u0677 %u0678 %u0679 %u067a %u067b %u067c %u067d %u067e %u067f %u0680 %u0681 %u0682 %u0683 %u0684 %u0685 %u0686 %u0687 %u0688 %u0689 %u068a %u068b %u068c %u068d %u068e %u068f %u0690 %u0691 %u0692 %u0693 %u0694 %u0695 %u0696 %u0697 %u0698 %u0699 %u069a %u069b %u069c %u069d %u069e %u069f %u06a0 %u06a1 %u06a2 %u06a3 %u06a4 %u06a5 %u06a6 %u06a7 %u06a8 %u06a9 %u06aa %u06ab %u06ac %u06ad %u06ae %u06af %u06b0 %u06b1 %u06b2 %u06b3 %u06b4 %u06b5 %u06b6 %u06b7 %u06b8 %u06b9 %u06ba %u06bb %u06bc %u06bd %u06be %u06bf %u06c0 %u06c1 %u06c2 %u06c3 %u06c4 %u06c5 %u06c6 %u06c7 %u06c8 %u06c9 %u06ca %u06cb %u06cc %u06cd %u06ce %u06cf %u06d0 %u06d1 %u06d2 %u06d3 %u06d4 %u06d5 %u06dd %u06de %u06e5 %u06e6 %u06e9 %u06ee %u06ef %u06f0 %u06f1 %u06f2 %u06f3 %u06f4 %u06f5 %u06f6 %u06f7 %u06f8 %u06f9 %u06fa %u06fb %u06fc %u06fd %u06fe ", ret => 1, }, # Geomtric shapes { type => "tfn", name => "utf8toUnicode", input => "■ □ ▢ ▣ ▤ ▥ ▦ ▧ ▨ ▩ ▪ ▫ ▬ ▭ ▮ ▯ ▰ ▱ ▲ △ ▴ ▵ ▶ ▷ ▸ ▹ ► ▻ ▼ ▽ ▾ ▿ ◀ ◁ ◂ ◃ ◄ ◅ ◆ ◇ ◈ ◉ ◊ ○ ◌ ◍ ◎ ● ◐ ◑ ◒ ◓ ◔ ◕ ◖ ◗ ◘ ◙ ◚ ◛ ◜ ◝ ◞ ◟ ◠ ◡ ◢ ◣ ◤ ◥ ◦ ◧ ◨ ◩ ◪ ◫ ◬ ◭ ◮ ◯ ◰ ◱ ◲ ◳ ◴ ◵ ◶ ◷ ◸ ◹ ◺ ◻ ◼ ◽ ◾ ◿", output => "%u25a0 %u25a1 %u25a2 %u25a3 %u25a4 %u25a5 %u25a6 %u25a7 %u25a8 %u25a9 %u25aa %u25ab %u25ac %u25ad %u25ae %u25af %u25b0 %u25b1 %u25b2 %u25b3 %u25b4 %u25b5 %u25b6 %u25b7 %u25b8 %u25b9 %u25ba %u25bb %u25bc %u25bd %u25be %u25bf %u25c0 %u25c1 %u25c2 %u25c3 %u25c4 %u25c5 %u25c6 %u25c7 %u25c8 %u25c9 %u25ca %u25cb %u25cc %u25cd %u25ce %u25cf %u25d0 %u25d1 %u25d2 %u25d3 %u25d4 %u25d5 %u25d6 %u25d7 %u25d8 %u25d9 %u25da %u25db %u25dc %u25dd %u25de %u25df %u25e0 %u25e1 %u25e2 %u25e3 %u25e4 %u25e5 %u25e6 %u25e7 %u25e8 %u25e9 %u25ea %u25eb %u25ec %u25ed %u25ee %u25ef %u25f0 %u25f1 %u25f2 %u25f3 %u25f4 %u25f5 %u25f6 %u25f7 %u25f8 %u25f9 %u25fa %u25fb %u25fc %u25fd %u25fe %u25ff", ret => 1, }, # Dingbats { type => "tfn", name => "utf8toUnicode", input => " ✁ ✂ ✃ ✄ ✅ ✆ ✇ ✈ ✉ ✊ ✋ ✌ ✍ ✎ ✏ ✐ ✑ ✒ ✓ ✔ ✕ ✖ ✗ ✘ ✙ ✚ ✛ ✜ ✝ ✞ ✟ ✠ ✡ ✢ ✣ ✤ ✥ ✦ ✧ ✨ ✩ ✪ ✫ ✬ ✭ ✮ ✯ ✰ ✱ ✲ ✳ ✴ ✵ ✶ ✷ ✸ ✹ ✺ ✻ ✼ ✽ ✾ ✿ ❀ ❁ ❂ ❃ ❄ ❅ ❆ ❇ ❈ ❉ ❊ ❋ ❌ ❍ ❎ ❏ ❐ ❑ ❒ ❓ ❔ ❕ ❖ ❗ ❘ ❙ ❚ ❛ ❜ ❝ ❣ ❤ ❥ ❦ ❧ ❨ ❩ ❪ ❫ ❬ ❭ ❮ ❯ ❰ ❱ ❲ ❳ ❴ ❵ ❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿ ➀ ➁ ➂ ➃ ➄ ➅ ➆ ➇ ➈ ➉ ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ ➓ ➔ ➘ ➙ ➚ ➛ ➜ ➝ ➞ ➟ ➠ ➡ ➢ ➣ ➤ ➥ ➦ ➧ ➨ ➩ ➪ ➫ ➬ ➭ ➮ ➯ ➰ ➱ ➲ ➳ ➴ ➵ ➶ ➷ ➸ ➹ ➺ ➻ ➼ ➽ ➾ ➿", output => " %u2701 %u2702 %u2703 %u2704 %u2705 %u2706 %u2707 %u2708 %u2709 %u270a %u270b %u270c %u270d %u270e %u270f %u2710 %u2711 %u2712 %u2713 %u2714 %u2715 %u2716 %u2717 %u2718 %u2719 %u271a %u271b %u271c %u271d %u271e %u271f %u2720 %u2721 %u2722 %u2723 %u2724 %u2725 %u2726 %u2727 %u2728 %u2729 %u272a %u272b %u272c %u272d %u272e %u272f %u2730 %u2731 %u2732 %u2733 %u2734 %u2735 %u2736 %u2737 %u2738 %u2739 %u273a %u273b %u273c %u273d %u273e %u273f %u2740 %u2741 %u2742 %u2743 %u2744 %u2745 %u2746 %u2747 %u2748 %u2749 %u274a %u274b %u274c %u274d %u274e %u274f %u2750 %u2751 %u2752 %u2753 %u2754 %u2755 %u2756 %u2757 %u2758 %u2759 %u275a %u275b %u275c %u275d %u2763 %u2764 %u2765 %u2766 %u2767 %u2768 %u2769 %u276a %u276b %u276c %u276d %u276e %u276f %u2770 %u2771 %u2772 %u2773 %u2774 %u2775 %u2776 %u2777 %u2778 %u2779 %u277a %u277b %u277c %u277d %u277e %u277f %u2780 %u2781 %u2782 %u2783 %u2784 %u2785 %u2786 %u2787 %u2788 %u2789 %u278a %u278b %u278c %u278d %u278e %u278f %u2790 %u2791 %u2792 %u2793 %u2794 %u2798 %u2799 %u279a %u279b %u279c %u279d %u279e %u279f %u27a0 %u27a1 %u27a2 %u27a3 %u27a4 %u27a5 %u27a6 %u27a7 %u27a8 %u27a9 %u27aa %u27ab %u27ac %u27ad %u27ae %u27af %u27b0 %u27b1 %u27b2 %u27b3 %u27b4 %u27b5 %u27b6 %u27b7 %u27b8 %u27b9 %u27ba %u27bb %u27bc %u27bd %u27be %u27bf", ret => 1, }, # Math { type => "tfn", name => "utf8toUnicode", input => " ⟀ ⟁ ⟂ ⟃ ⟄ ⟅ ⟆ ⟇ ⟈ ⟉ ⟊ ⟌ ⟐ ⟑ ⟒ ⟓ ⟔ ⟕ ⟖ ⟗ ⟘ ⟙ ⟚ ⟛ ⟜ ⟝ ⟞ ⟟ ⟠ ⟡ ⟢ ⟣ ⟤ ⟥ ⟦ ⟧ ⟨ ⟩ ⟪ ⟫ ⟬ ⟭ ⟮ ⟯", output => " %u27c0 %u27c1 %u27c2 %u27c3 %u27c4 %u27c5 %u27c6 %u27c7 %u27c8 %u27c9 %u27ca %u27cc %u27d0 %u27d1 %u27d2 %u27d3 %u27d4 %u27d5 %u27d6 %u27d7 %u27d8 %u27d9 %u27da %u27db %u27dc %u27dd %u27de %u27df %u27e0 %u27e1 %u27e2 %u27e3 %u27e4 %u27e5 %u27e6 %u27e7 %u27e8 %u27e9 %u27ea %u27eb %u27ec %u27ed %u27ee %u27ef", ret => 1, }, # Arrows { type => "tfn", name => "utf8toUnicode", input => " ⟰ ⟱ ⟲ ⟳ ⟴ ⟵ ⟶ ⟷ ⟸ ⟹ ⟺ ⟻ ⟼ ⟽ ⟾ ⟿", output => " %u27f0 %u27f1 %u27f2 %u27f3 %u27f4 %u27f5 %u27f6 %u27f7 %u27f8 %u27f9 %u27fa %u27fb %u27fc %u27fd %u27fe %u27ff", ret => 1, }, modsecurity-2.9.5/tests/tfn/trimLeft.t0000664000175000017500000000176114147005233021130 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "trimLeft", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "trimLeft", input => "TestCase", output => "TestCase", ret => 0, }, { type => "tfn", name => "trimLeft", input => "Test\0Case", output => "Test\0Case", ret => 0, }, { type => "tfn", name => "trimLeft", input => "TestCase ", output => "TestCase ", ret => 0, }, ### Basics { type => "tfn", name => "trimLeft", input => " TestCase", output => "TestCase", ret => 1, }, { type => "tfn", name => "trimLeft", input => " TestCase ", output => "TestCase ", ret => 1, }, { type => "tfn", name => "trimLeft", input => " Test Case ", output => "Test Case ", ret => 1, }, { type => "tfn", name => "trimLeft", input => " Test \0 Case ", output => "Test \0 Case ", ret => 1, }, { type => "tfn", name => "trimLeft", input => " Test \0 Case \r\n ", output => "Test \0 Case \r\n ", ret => 1, }, modsecurity-2.9.5/tests/tfn/urlEncode.t0000664000175000017500000000705614147005233021265 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "urlEncode", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "urlEncode", input => "TestCase", output => "TestCase", ret => 0, }, ### Valid { type => "tfn", name => "urlEncode", input => " \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff", output => "+%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f+%21%22%23%24%25%26%27%28%29*%2b%2c%2d%2e%2f0123456789%3a%3b%3c%3d%3e%3f%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5b%5c%5d%5e%5f%60abcdefghijklmnopqrstuvwxyz%7b%7c%7d%7e%7f%80%81%82%83%84%85%86%87%88%89%8a%8b%8c%8d%8e%8f%90%91%92%93%94%95%96%97%98%99%9a%9b%9c%9d%9e%9f%a0%a1%a2%a3%a4%a5%a6%a7%a8%a9%aa%ab%ac%ad%ae%af%b0%b1%b2%b3%b4%b5%b6%b7%b8%b9%ba%bb%bc%bd%be%bf%c0%c1%c2%c3%c4%c5%c6%c7%c8%c9%ca%cb%cc%cd%ce%cf%d0%d1%d2%d3%d4%d5%d6%d7%d8%d9%da%db%dc%dd%de%df%e0%e1%e2%e3%e4%e5%e6%e7%e8%e9%ea%eb%ec%ed%ee%ef%f0%f1%f2%f3%f4%f5%f6%f7%f8%f9%fa%fb%fc%fd%fe%ff", ret => 1, }, { type => "tfn", name => "urlEncode", input => "Test Case", output => "Test+Case", ret => 1, }, ### Partial Invalid { type => "tfn", name => "urlEncode", input => "% ", output => "%25+", ret => 1, }, { type => "tfn", name => "urlEncode", input => "%0g ", output => "%250g+", ret => 1, }, { type => "tfn", name => "urlEncode", input => "%0 ", output => "%250+", ret => 1, }, { type => "tfn", name => "urlEncode", input => "%g0 ", output => "%25g0+", ret => 1, }, { type => "tfn", name => "urlEncode", input => "%g ", output => "%25g+", ret => 1, }, ### Invalid { type => "tfn", name => "urlEncode", input => "%0%1%2%3%4%5%6%7%8%9%0%a%b%c%d%e%f", output => "%250%251%252%253%254%255%256%257%258%259%250%25a%25b%25c%25d%25e%25f", ret => 1, }, { type => "tfn", name => "urlEncode", input => "%g0%g1%g2%g3%g4%g5%g6%g7%g8%g9%g0%ga%gb%gc%gd%ge%gf", output => "%25g0%25g1%25g2%25g3%25g4%25g5%25g6%25g7%25g8%25g9%25g0%25ga%25gb%25gc%25gd%25ge%25gf", ret => 1, }, { type => "tfn", name => "urlEncode", input => "%0g%1g%2g%3g%4g%5g%6g%7g%8g%9g%0g%ag%bg%cg%dg%eg%fg", output => "%250g%251g%252g%253g%254g%255g%256g%257g%258g%259g%250g%25ag%25bg%25cg%25dg%25eg%25fg", ret => 1, }, { type => "tfn", name => "urlEncode", input => "%", output => "%25", ret => 1, }, { type => "tfn", name => "urlEncode", input => "%0", output => "%250", ret => 1, }, { type => "tfn", name => "urlEncode", input => "%%", output => "%25%25", ret => 1, }, { type => "tfn", name => "urlEncode", input => "%0g", output => "%250g", ret => 1, }, { type => "tfn", name => "urlEncode", input => "%gg", output => "%25gg", ret => 1, }, modsecurity-2.9.5/tests/tfn/trimRight.t0000664000175000017500000000176014147005233021312 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "trimRight", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "trimRight", input => "TestCase", output => "TestCase", ret => 0, }, { type => "tfn", name => "trimRight", input => "Test\0Case", output => "Test\0Case", ret => 0, }, { type => "tfn", name => "trimRight", input => " TestCase", output => " TestCase", ret => 0, }, ### Basics { type => "tfn", name => "trimRight", input => "TestCase ", output => "TestCase", ret => 1, }, { type => "tfn", name => "trimRight", input => " TestCase ", output => " TestCase", ret => 1, }, { type => "tfn", name => "trimRight", input => " Test Case ", output => " Test Case", ret => 1, }, { type => "tfn", name => "trimRight", input => " Test \0 Case ", output => " Test \0 Case", ret => 1, }, { type => "tfn", name => "trimRight", input => " Test \0 Case \r\n ", output => " Test \0 Case", ret => 1, }, modsecurity-2.9.5/tests/tfn/parityOdd7bit.t0000664000175000017500000000157614147005233022073 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "parityOdd7bit", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "parityOdd7bit", input => "abdghkmnpsuvyz12478CEFIJLOQRTW", output => "abdghkmnpsuvyz12478CEFIJLOQRTW", ret => 0, }, ### Parity { type => "tfn", name => "parityOdd7bit", input => "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", output => "ab\xe3d\xe5\xe6gh\xe9\xeak\xecmn\xefp\xf1\xf2s\xf4uv\xf7\xf8yz\xb012\xb34\xb5\xb678\xb9\xc1\xc2C\xc4EF\xc7\xc8IJ\xcbL\xcd\xceO\xd0QR\xd3T\xd5\xd6WX\xd9\xda", ret => 1, }, { type => "tfn", name => "parityOdd7bit", input => "abcdefghijklmnopqrstuvwxyz\x000123456789\x00ABCDEFGHIJKLMNOPQRSTUVWXYZ", output => "ab\xe3d\xe5\xe6gh\xe9\xeak\xecmn\xefp\xf1\xf2s\xf4uv\xf7\xf8yz\x80\xb012\xb34\xb5\xb678\xb9\x80\xc1\xc2C\xc4EF\xc7\xc8IJ\xcbL\xcd\xceO\xd0QR\xd3T\xd5\xd6WX\xd9\xda", ret => 1, }, modsecurity-2.9.5/tests/tfn/parityEven7bit.t0000664000175000017500000000160414147005233022252 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "parityEven7bit", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "parityEven7bit", input => "cefijloqrtwx03569ABDGHKMNPSUVYZ", output => "cefijloqrtwx03569ABDGHKMNPSUVYZ", ret => 0, }, ### Parity { type => "tfn", name => "parityEven7bit", input => "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", output => "\xe1\xe2c\xe4ef\xe7\xe8ij\xebl\xed\xeeo\xf0qr\xf3t\xf5\xf6wx\xf9\xfa0\xb1\xb23\xb456\xb7\xb89AB\xc3D\xc5\xc6GH\xc9\xcaK\xccMN\xcfP\xd1\xd2S\xd4UV\xd7\xd8YZ", ret => 1, }, { type => "tfn", name => "parityEven7bit", input => "abcdefghijklmnopqrstuvwxyz\x000123456789\x00ABCDEFGHIJKLMNOPQRSTUVWXYZ", output => "\xe1\xe2c\xe4ef\xe7\xe8ij\xebl\xed\xeeo\xf0qr\xf3t\xf5\xf6wx\xf9\xfa\x000\xb1\xb23\xb456\xb7\xb89\x00AB\xc3D\xc5\xc6GH\xc9\xcaK\xccMN\xcfP\xd1\xd2S\xd4UV\xd7\xd8YZ", ret => 1, }, modsecurity-2.9.5/tests/tfn/md5.t0000664000175000017500000000077214147005233020030 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "md5", input => "", output => "\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\x09\x98\xec\xf8\x42\x7e", ret => 1, }, ### Basic { type => "tfn", name => "md5", input => "TestCase", output => "\xc9\xab\xa2\xc3\xe6\x01\x26\x16\x9e\x80\xe9\xa2\x6b\xa2\x73\xc1", ret => 1, }, ### Binary w/NUL { type => "tfn", name => "md5", input => "\x00\x01\x02\x03\x04\x05\x06\x07\x08", output => "\xa6\xe7\xd3\xb4\x6f\xdf\xaf\x0b\xde\x2a\x1f\x83\x2a\x00\xd2\xde", ret => 1, }, modsecurity-2.9.5/tests/tfn/removeNulls.t0000664000175000017500000000152414147005233021652 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "removeNulls", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "removeNulls", input => "TestCase", output => "TestCase", ret => 0, }, { type => "tfn", name => "removeNulls", input => "Test\x01Case", output => "Test\x01Case", ret => 0, }, ### Basics { type => "tfn", name => "removeNulls", input => "\0TestCase", output => "TestCase", ret => 1, }, { type => "tfn", name => "removeNulls", input => "Test\0Case", output => "TestCase", ret => 1, }, { type => "tfn", name => "removeNulls", input => "Test\0\0Case", output => "TestCase", ret => 1, }, { type => "tfn", name => "removeNulls", input => "TestCase\0", output => "TestCase", ret => 1, }, { type => "tfn", name => "removeNulls", input => "\0Test\0Case\0", output => "TestCase", ret => 1, }, modsecurity-2.9.5/tests/tfn/length.t0000664000175000017500000000110414147005233020612 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "length", input => "", output => "0", ret => 1, }, ### Basic normal and large { type => "tfn", name => "length", input => "0123456789abcdef", output => "16", ret => 1, }, # ENH: This sometimes fails w/4096 length #{ # type => "tfn", # name => "length", # input => ('x' x 8192), # output => "8192", # ret => 1, #}, ### With TAB { type => "tfn", name => "length", input => "0123456789\tabcdef", output => "17", ret => 1, }, ### With NUL { type => "tfn", name => "length", input => "Test\0Case", output => "9", ret => 1, }, modsecurity-2.9.5/tests/tfn/escapeSeqDecode.t0000664000175000017500000000360514147005233022356 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "escapeSeqDecode", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "escapeSeqDecode", input => "TestCase", output => "TestCase", ret => 0, }, { type => "tfn", name => "escapeSeqDecode", input => "Test\0Case", output => "Test\0Case", ret => 0, }, ### Valid Sequences { type => "tfn", name => "escapeSeqDecode", input => "\\a\\b\\f\\n\\r\\t\\v\\?\\'\\\"\\0\\12\\123\\x00\\xff", output => "\a\b\f\x0a\x0d\t\x0b?'\"\x00\x0a\x53\x00\xff", ret => 1, }, { type => "tfn", name => "escapeSeqDecode", input => "\\a\\b\\f\\n\\r\\t\\v\0\\?\\'\\\"\\0\\12\\123\\x00\\xff", output => "\a\b\f\x0a\x0d\t\x0b\0?'\"\x00\x0a\x53\x00\xff", ret => 1, }, ### Invalid Sequences # \8 and \9 are not octal # \666 is a byte overflow (0x1b6) and should be truncated to a byte as 0xb6 # \xag and \xga are not hex, # \0123 is \012 + '3' { type => "tfn", name => "escapeSeqDecode", input => "\\8\\9\\666\\xag\\xga\\0123", output => "89\xb6xagxga\x0a3", ret => 1, }, # \x, \x0 lack enough hex digits { type => "tfn", name => "escapeSeqDecode", input => "\\x", output => "x", ret => 1, }, { type => "tfn", name => "escapeSeqDecode", input => "\\x\\x0", output => "xx0", ret => 1, }, { type => "tfn", name => "escapeSeqDecode", input => "\\x\\x0\0", output => "xx0\0", ret => 1, }, # Octal at end { type => "tfn", name => "escapeSeqDecode", input => "\\0", output => "\x00", ret => 1, }, { type => "tfn", name => "escapeSeqDecode", input => "\\01", output => "\x01", ret => 1, }, { type => "tfn", name => "escapeSeqDecode", input => "\\012", output => "\x0a", ret => 1, }, # A forward slash with nothing after { type => "tfn", name => "escapeSeqDecode", input => "\\", output => "\\", ret => 0, }, # A forward slash with NUL after { type => "tfn", name => "escapeSeqDecode", input => "\\\0", output => "\0", ret => 1, }, modsecurity-2.9.5/tests/tfn/replaceNulls.t0000664000175000017500000000136614147005233021774 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "replaceNulls", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "replaceNulls", input => "TestCase", output => "TestCase", ret => 0, }, ### Basics { type => "tfn", name => "replaceNulls", input => "\0TestCase", output => " TestCase", ret => 1, }, { type => "tfn", name => "replaceNulls", input => "Test\0Case", output => "Test Case", ret => 1, }, { type => "tfn", name => "replaceNulls", input => "Test\0\0Case", output => "Test Case", ret => 1, }, { type => "tfn", name => "replaceNulls", input => "TestCase\0", output => "TestCase ", ret => 1, }, { type => "tfn", name => "replaceNulls", input => "\0Test\0Case\0", output => " Test Case ", ret => 1, }, modsecurity-2.9.5/tests/tfn/normalisePath.t0000664000175000017500000000667514147005233022161 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "normalisePath", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "normalisePath", input => "/foo/bar/baz", output => "/foo/bar/baz", ret => 0, }, { type => "tfn", name => "normalisePath", input => "/foo/bar\0/baz", output => "/foo/bar\0/baz", ret => 0, }, ### Basic { type => "tfn", name => "normalisePath", input => "x", output => "x", ret => 0, }, { type => "tfn", name => "normalisePath", input => ".", output => "", ret => 1, }, { type => "tfn", name => "normalisePath", input => "./", output => "", ret => 1, }, { type => "tfn", name => "normalisePath", input => "./..", output => "..", ret => 1, }, { type => "tfn", name => "normalisePath", input => "./../", output => "../", ret => 1, }, { type => "tfn", name => "normalisePath", input => "..", output => "..", ret => 0, }, { type => "tfn", name => "normalisePath", input => "../", output => "../", ret => 0, }, { type => "tfn", name => "normalisePath", input => "../.", output => "..", ret => 1, }, { type => "tfn", name => "normalisePath", input => ".././", output => "../", ret => 1, }, { type => "tfn", name => "normalisePath", input => "../..", output => "../..", ret => 0, }, { type => "tfn", name => "normalisePath", input => "../../", output => "../../", ret => 0, }, { type => "tfn", name => "normalisePath", input => "/dir/foo//bar", output => "/dir/foo/bar", ret => 1, }, { type => "tfn", name => "normalisePath", input => "dir/foo//bar/", output => "dir/foo/bar/", ret => 1, }, { type => "tfn", name => "normalisePath", input => "dir/../foo", output => "foo", ret => 1, }, { type => "tfn", name => "normalisePath", input => "dir/../../foo", output => "../foo", ret => 1, }, { type => "tfn", name => "normalisePath", input => "dir/./.././../../foo/bar", output => "../../foo/bar", ret => 1, }, { type => "tfn", name => "normalisePath", input => "dir/./.././../../foo/bar/.", output => "../../foo/bar", ret => 1, }, { type => "tfn", name => "normalisePath", input => "dir/./.././../../foo/bar/./", output => "../../foo/bar/", ret => 1, }, { type => "tfn", name => "normalisePath", input => "dir/./.././../../foo/bar/..", output => "../../foo", ret => 1, }, { type => "tfn", name => "normalisePath", input => "dir/./.././../../foo/bar/../", output => "../../foo/", ret => 1, }, { type => "tfn", name => "normalisePath", input => "dir/./.././../../foo/bar/", output => "../../foo/bar/", ret => 1, }, { type => "tfn", name => "normalisePath", input => "dir//.//..//.//..//..//foo//bar", output => "../../foo/bar", ret => 1, }, { type => "tfn", name => "normalisePath", input => "dir//.//..//.//..//..//foo//bar//", output => "../../foo/bar/", ret => 1, }, { type => "tfn", name => "normalisePath", input => "dir/subdir/subsubdir/subsubsubdir/../../..", output => "dir", ret => 1, }, { type => "tfn", name => "normalisePath", input => "dir/./subdir/./subsubdir/./subsubsubdir/../../..", output => "dir", ret => 1, }, { type => "tfn", name => "normalisePath", input => "dir/./subdir/../subsubdir/../subsubsubdir/..", output => "dir", ret => 1, }, { type => "tfn", name => "normalisePath", input => "/dir/./subdir/../subsubdir/../subsubsubdir/../", output => "/dir/", ret => 1, }, ### With NUL { type => "tfn", name => "normalisePath", input => "/./.././../../../../../../../\0/../etc/./passwd", output => "/etc/passwd", ret => 1, }, modsecurity-2.9.5/tests/tfn/lowercase.t0000664000175000017500000000101114147005233021312 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "lowercase", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "lowercase", input => "testcase", output => "testcase", ret => 0, }, { type => "tfn", name => "lowercase", input => "test\0case", output => "test\0case", ret => 0, }, ### Basic { type => "tfn", name => "lowercase", input => "TestCase", output => "testcase", ret => 1, }, { type => "tfn", name => "lowercase", input => "Test\0Case", output => "test\0case", ret => 1, }, modsecurity-2.9.5/tests/tfn/trim.t0000664000175000017500000000165614147005233020320 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "trim", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "trim", input => "TestCase", output => "TestCase", ret => 0, }, { type => "tfn", name => "trim", input => "Test\0Case", output => "Test\0Case", ret => 0, }, ### Basics { type => "tfn", name => "trim", input => " TestCase", output => "TestCase", ret => 1, }, { type => "tfn", name => "trim", input => "TestCase ", output => "TestCase", ret => 1, }, { type => "tfn", name => "trim", input => " TestCase ", output => "TestCase", ret => 1, }, { type => "tfn", name => "trim", input => " Test Case ", output => "Test Case", ret => 1, }, { type => "tfn", name => "trim", input => " Test \0 Case ", output => "Test \0 Case", ret => 1, }, { type => "tfn", name => "trim", input => " Test \0 Case \r\n ", output => "Test \0 Case", ret => 1, }, modsecurity-2.9.5/tests/tfn/base64Decode.t0000664000175000017500000000144414147005233021530 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "base64Decode", input => "", output => "", ret => 0, }, ### Test values with varying lengths to check padding { type => "tfn", name => "base64Decode", input => "VGVzdENhc2U=", output => "TestCase", ret => 1, }, { type => "tfn", name => "base64Decode", input => "VGVzdENhc2Ux", output => "TestCase1", ret => 1, }, { type => "tfn", name => "base64Decode", input => "VGVzdENhc2UxMg==", output => "TestCase12", ret => 1, }, ### Check with a NUL { type => "tfn", name => "base64Decode", input => "VGVzdABDYXNl", output => "Test\0Case", ret => 1, }, ### Invalid # What should happen here? Probably just fail and leave alone. { type => "tfn", name => "base64Decode", input => "VGVzdENhc2U=\0VGVzdENhc2U=", output => "TestCase", ret => 1, }, modsecurity-2.9.5/tests/tfn/normalisePathWin.t0000664000175000017500000000731114147005233022623 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "normalisePathWin", input => "", output => "", ret => 0, }, ### Nothing but switch slashes { type => "tfn", name => "normalisePathWin", input => "\\foo\\bar\\baz", output => "/foo/bar/baz", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "\\foo\\bar\0\\baz", output => "/foo/bar\0/baz", ret => 1, }, ### Basics { type => "tfn", name => "normalisePathWin", input => "x", output => "x", ret => 0, }, { type => "tfn", name => "normalisePathWin", input => ".", output => "", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => ".\\", output => "", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => ".\\..", output => "..", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => ".\\..\\", output => "../", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "..", output => "..", ret => 0, }, { type => "tfn", name => "normalisePathWin", input => "..\\", output => "../", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "..\\.", output => "..", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "..\\.\\", output => "../", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "..\\..", output => "../..", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "..\\..\\", output => "../../", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "\\dir\\foo\\\\bar", output => "/dir/foo/bar", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "dir\\foo\\\\bar\\", output => "dir/foo/bar/", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "dir\\..\\foo", output => "foo", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "dir\\..\\..\\foo", output => "../foo", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "dir\\.\\..\\.\\..\\..\\foo\\bar", output => "../../foo/bar", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "dir\\.\\..\\.\\..\\..\\foo\\bar\\.", output => "../../foo/bar", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "dir\\.\\..\\.\\..\\..\\foo\\bar\\.\\", output => "../../foo/bar/", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "dir\\.\\..\\.\\..\\..\\foo\\bar\\..", output => "../../foo", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "dir\\.\\..\\.\\..\\..\\foo\\bar\\..\\", output => "../../foo/", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "dir\\.\\..\\.\\..\\..\\foo\\bar\\", output => "../../foo/bar/", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "dir\\\\.\\\\..\\\\.\\\\..\\\\..\\\\foo\\\\bar", output => "../../foo/bar", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "dir\\\\.\\\\..\\\\.\\\\..\\\\..\\\\foo\\\\bar\\\\", output => "../../foo/bar/", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "dir\\subdir\\subsubdir\\subsubsubdir\\..\\..\\..", output => "dir", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "dir\\.\\subdir\\.\\subsubdir\\.\\subsubsubdir\\..\\..\\..", output => "dir", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "dir\\.\\subdir\\..\\subsubdir\\..\\subsubsubdir\\..", output => "dir", ret => 1, }, { type => "tfn", name => "normalisePathWin", input => "\\dir\\.\\subdir\\..\\subsubdir\\..\\subsubsubdir\\..\\", output => "/dir/", ret => 1, }, ### With NUL { type => "tfn", name => "normalisePathWin", input => "\\.\\..\\.\\..\\..\\..\\..\\..\\..\\..\\\0\\..\\etc\\.\\passwd", output => "/etc/passwd", ret => 1, }, modsecurity-2.9.5/tests/tfn/hexDecode.t0000664000175000017500000000141314147005233021224 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "hexDecode", input => "", output => "", ret => 1, }, ### Basic { type => "tfn", name => "hexDecode", input => "5465737443617365", output => "TestCase", ret => 1, }, ### Basic w/NULL { type => "tfn", name => "hexDecode", input => "546573740043617365", output => "Test\0Case", ret => 1, }, ### Invalid # What should happen here? Probably just fail and leave alone. { type => "tfn", name => "hexDecode", input => "01234567890a0z01234567890a", output => "\x01#Eg\x89\x0a#\x01#Eg\x89\x0a", ret => 1, }, { type => "tfn", name => "hexDecode", input => "01234567890az", output => "\x01#Eg\x89\x0a", ret => 1, }, { type => "tfn", name => "hexDecode", input => "01234567890a0", output => "\x01#Eg\x89\x0a", ret => 1, }, modsecurity-2.9.5/tests/tfn/urlDecode.t0000664000175000017500000000736714147005233021260 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "urlDecode", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "urlDecode", input => "TestCase", output => "TestCase", ret => 0, }, { type => "tfn", name => "urlDecode", input => "Test\0Case", output => "Test\0Case", ret => 0, }, ### Valid { type => "tfn", name => "urlDecode", input => "+%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f%20%21%22%23%24%25%26%27%28%29%2a%2b%2c%2d%2e%2f%30%31%32%33%34%35%36%37%38%39%3a%3b%3c%3d%3e%3f%40%41%42%43%44%45%46%47%48%49%4a%4b%4c%4d%4e%4f%50%51%52%53%54%55%56%57%58%59%5a%5b%5c%5d%5e%5f%60%61%62%63%64%65%66%67%68%69%6a%6b%6c%6d%6e%6f%70%71%72%73%74%75%76%77%78%79%7a%7b%7c%7d%7e%7f%80%81%82%83%84%85%86%87%88%89%8a%8b%8c%8d%8e%8f%90%91%92%93%94%95%96%97%98%99%9a%9b%9c%9d%9e%9f%a0%a1%a2%a3%a4%a5%a6%a7%a8%a9%aa%ab%ac%ad%ae%af%b0%b1%b2%b3%b4%b5%b6%b7%b8%b9%ba%bb%bc%bd%be%bf%c0%c1%c2%c3%c4%c5%c6%c7%c8%c9%ca%cb%cc%cd%ce%cf%d0%d1%d2%d3%d4%d5%d6%d7%d8%d9%da%db%dc%dd%de%df%e0%e1%e2%e3%e4%e5%e6%e7%e8%e9%ea%eb%ec%ed%ee%ef%f0%f1%f2%f3%f4%f5%f6%f7%f8%f9%fa%fb%fc%fd%fe%ff", output => " \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f \x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff", ret => 1, }, { type => "tfn", name => "urlDecode", input => "Test+Case", output => "Test Case", ret => 1, }, ### Partial Invalid { type => "tfn", name => "urlDecode", input => "%+", output => "% ", ret => 1, }, { type => "tfn", name => "urlDecode", input => "%%20", output => "% ", ret => 1, }, { type => "tfn", name => "urlDecode", input => "%0g%20", output => "%0g ", ret => 1, }, { type => "tfn", name => "urlDecode", input => "%0%20", output => "%0 ", ret => 1, }, { type => "tfn", name => "urlDecode", input => "%g0%20", output => "%g0 ", ret => 1, }, { type => "tfn", name => "urlDecode", input => "%g%20", output => "%g ", ret => 1, }, ### Invalid { type => "tfn", name => "urlDecode", input => "%0%1%2%3%4%5%6%7%8%9%0%a%b%c%d%e%f", output => "%0%1%2%3%4%5%6%7%8%9%0%a%b%c%d%e%f", ret => 0, }, { type => "tfn", name => "urlDecode", input => "%g0%g1%g2%g3%g4%g5%g6%g7%g8%g9%g0%ga%gb%gc%gd%ge%gf", output => "%g0%g1%g2%g3%g4%g5%g6%g7%g8%g9%g0%ga%gb%gc%gd%ge%gf", ret => 0, }, { type => "tfn", name => "urlDecode", input => "%0g%1g%2g%3g%4g%5g%6g%7g%8g%9g%0g%ag%bg%cg%dg%eg%fg", output => "%0g%1g%2g%3g%4g%5g%6g%7g%8g%9g%0g%ag%bg%cg%dg%eg%fg", ret => 0, }, { type => "tfn", name => "urlDecode", input => "%", output => "%", ret => 0, }, { type => "tfn", name => "urlDecode", input => "%0", output => "%0", ret => 0, }, { type => "tfn", name => "urlDecode", input => "%%", output => "%%", ret => 0, }, { type => "tfn", name => "urlDecode", input => "%0g", output => "%0g", ret => 0, }, { type => "tfn", name => "urlDecode", input => "%gg", output => "%gg", ret => 0, }, modsecurity-2.9.5/tests/tfn/hexEncode.t0000664000175000017500000000052414147005233021240 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "hexEncode", input => "", output => "", ret => 1, }, ### Basic { type => "tfn", name => "hexEncode", input => "TestCase", output => "5465737443617365", ret => 1, }, ### Basic w/NULL { type => "tfn", name => "hexEncode", input => "Test\0Case", output => "546573740043617365", ret => 1, }, modsecurity-2.9.5/tests/tfn/sha1.t0000664000175000017500000000105514147005233020172 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "sha1", input => "", output => "\xda\x39\xa3\xee\x5e\x6b\x4b\x0d\x32\x55\xbf\xef\x95\x60\x18\x90\xaf\xd8\x07\x09", ret => 1, }, ### Basic { type => "tfn", name => "sha1", input => "TestCase", output => "\xa7\x0c\xe3\x83\x89\xe3\x18\xbd\x2b\xe1\x8a\x01\x11\xc6\xdc\x76\xbd\x2c\xd9\xed", ret => 1, }, ### Binary w/NUL { type => "tfn", name => "sha1", input => "\x00\x01\x02\x03\x04\x05\x06\x07\x08", output => "\x63\xbf\x60\xc7\x10\x5a\x07\xa2\xb1\x25\xbb\xf8\x9e\x61\xab\xda\xbc\x69\x78\xc2", ret => 1, }, modsecurity-2.9.5/tests/tfn/removeWhitespace.t0000664000175000017500000000145714147005233022656 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "removeWhitespace", input => "", output => "", ret => 0, }, ### Nothing { type => "tfn", name => "removeWhitespace", input => "TestCase", output => "TestCase", ret => 0, }, { type => "tfn", name => "removeWhitespace", input => "Test\0Case", output => "Test\0Case", ret => 0, }, ### Remove space/tab { type => "tfn", name => "removeWhitespace", input => " Test \t Case ", output => "TestCase", ret => 1, }, ### Pretty much everything in one { type => "tfn", name => "removeWhitespace", input => "This is a test case with a tab \t, vtab \x0b, newline \x0a, return \x0d, formfeed \f, and a NUL\0 in it with a CRLF at the end.\x0d\x0a", output => "Thisisatestcasewithatab,vtab,newline,return,formfeed,andaNUL\0initwithaCRLFattheend.", ret => 1, }, modsecurity-2.9.5/tests/tfn/base64Encode.t0000664000175000017500000000113614147005233021540 0ustar mhsvierulamhsvierula### Empty { type => "tfn", name => "base64Encode", input => "", output => "", ret => 0, }, ### Test values with varying lengths to check padding { type => "tfn", name => "base64Encode", input => "TestCase", output => "VGVzdENhc2U=", ret => 1, }, { type => "tfn", name => "base64Encode", input => "TestCase1", output => "VGVzdENhc2Ux", ret => 1, }, { type => "tfn", name => "base64Encode", input => "TestCase12", output => "VGVzdENhc2UxMg==", ret => 1, }, ### Check with a NUL { type => "tfn", name => "base64Encode", input => "Test\0Case", output => "VGVzdABDYXNl", ret => 1, }, modsecurity-2.9.5/tests/action/0000775000175000017500000000000014147005233017636 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/action/.empty0000664000175000017500000000000014147005233020763 0ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/run-unit-tests.pl.in0000775000175000017500000000776414147005233022265 0ustar mhsvierulamhsvierula#!@PERL@ # # Run unit tests. # # Syntax: # All: run-tests.pl # All in file: run-tests.pl file # Nth in file: run-tests.pl file N # use strict; use POSIX qw(WIFEXITED WEXITSTATUS WIFSIGNALED WTERMSIG); use File::Basename qw(basename dirname); use FileHandle; use IPC::Open2 qw(open2); my @TYPES = qw(tfn op action); my $TEST = "./msc_test"; my $SCRIPT = basename($0); my $SCRIPTDIR = dirname($0); my $PASSED = 0; my $TOTAL = 0; my $DEBUG = $ENV{MSC_TEST_DEBUG} || 0; if (defined $ARGV[0]) { runfile(dirname($ARGV[0]), basename($ARGV[0]), $ARGV[1]); done(); } for my $type (sort @TYPES) { my $dir = "$SCRIPTDIR/$type"; my @cfg = (); # Get test names opendir(DIR, "$dir") or quit(1, "Failed to open \"$dir\": $!"); @cfg = grep { /\.t$/ && -f "$dir/$_" } readdir(DIR); closedir(DIR); for my $cfg (sort @cfg) { runfile($dir, $cfg); } } done(); sub runfile { my($dir, $cfg, $testnum) = @_; my $fn = "$dir/$cfg"; my @data = (); my $edata; my @C = (); my @test = (); my $teststr; my $n = 0; my $pass = 0; open(CFG, "<$fn") or quit(1, "Failed to open \"$fn\": $!"); @data = ; $edata = q/@C = (/ . join("", @data) . q/)/; eval $edata; quit(1, "Failed to read test data \"$cfg\": $@") if ($@); unless (@C) { msg("\nNo tests defined for $fn"); return; } msg("\nLoaded ".@C." tests from $fn"); for my $t (@C) { $n++; next if (defined $testnum and $n != $testnum); my %t = %{$t || {}}; my $id = sprintf("%6d", $n); my $in = (exists($t{input}) and defined($t{input})) ? $t{input} : ""; my $out; my $test_in = new FileHandle(); my $test_out = new FileHandle(); my $test_pid; my $rc = 0; my $param; if ($t{type} eq "tfn") { $param = escape($t{output}); } elsif ($t{type} eq "op") { $param = escape($t{param}); } elsif ($t{type} eq "action") { $param = escape($t{param}); } else { quit(1, "Unknown type \"$t{type}\" - should be one of: " . join(",",@TYPES)); } @test = ("-t", $t{type}, "-n", $t{name}, "-p", $param, "-D", "$DEBUG", (exists($t{ret}) ? ("-r", $t{ret}) : ()), (exists($t{iterations}) ? ("-I", $t{iterations}) : ()), (exists($t{prerun}) ? ("-P", $t{prerun}) : ())); $teststr = "$TEST " . join(" ", map { "\"$_\"" } @test); $test_pid = open2($test_out, $test_in, $TEST, @test) or quit(1, "Failed to execute test: $teststr\": $!"); print $test_in "$in"; close $test_in; $out = join("\\n", split(/\n/, <$test_out>)); close $test_out; waitpid($test_pid, 0); $rc = $?; if ( WIFEXITED($rc) ) { $rc = WEXITSTATUS($rc); } elsif( WIFSIGNALED($rc) ) { msg("Test exited with signal " . WTERMSIG($rc) . "."); msg("Executed: $teststr"); $rc = -1; } else { msg("Test exited with unknown error."); $rc = -1; } if ($rc == 0) { $pass++; } msg(sprintf("%s) %s \"%s\"%s: %s%s", $id, $t{type}, $t{name}, (exists($t{comment}) ? " $t{comment}" : ""), ($rc ? "failed" : "passed"), ((defined($out) && $out ne "")? " ($out)" : ""))); } $TOTAL += $testnum ? 1 : $n; $PASSED += $pass; msg(sprintf("Passed: %2d; Failed: %2d", $pass, $testnum ? (1 - $pass) : ($n - $pass))); } sub escape { my @new = (); for my $c (split(//, $_[0])) { push @new, ((ord($c) >= 0x20 and ord($c) <= 0x7e) ? $c : sprintf("\\x%02x", ord($c))); } join('', @new); } sub msg { print STDOUT "@_\n" if (@_); } sub quit { my($ec,$msg) = @_; $ec = 0 unless (defined $_[0]); msg("$msg") if (defined $msg); exit $ec; } sub done { if ($PASSED != $TOTAL) { quit(1, "\n$PASSED/$TOTAL tests passed."); } quit(0, "\nAll tests passed ($TOTAL)."); } modsecurity-2.9.5/tests/run-regression-tests-nginx.pl0000775000175000017500000004256614147005233024201 0ustar mhsvierulamhsvierula#!/usr/bin/env perl # # Run regression tests. # # Syntax: run-regression-tests.pl [options] [file [N]] # # All: run-regression-tests.pl # All in file: run-regression-tests.pl file # Nth in file: run-regression-tests.pl file N # use strict; use Time::HiRes qw(gettimeofday sleep); use POSIX qw(WIFEXITED WEXITSTATUS WIFSIGNALED WTERMSIG); use File::Spec qw(rel2abs); use File::Basename qw(basename dirname); use File::Path qw(make_path); use FileHandle; use IPC::Open2 qw(open2); use IPC::Open3 qw(open3); use Getopt::Std; use Data::Dumper; use IO::Socket; use LWP::UserAgent; use Cwd 'abs_path'; use Template; use File::Copy::Recursive qw(dircopy); my @TYPES = qw(action config misc rule target); my $SCRIPT = basename($0); my $SCRIPT_DIR = File::Spec->rel2abs(dirname($0)); my $REG_DIR = "$SCRIPT_DIR/regression"; my $NGINX_DIR = "$REG_DIR/nginx"; my $NGINX_CONF_TEMP = "$REG_DIR/nginx/conf/nginx.conf.template"; my $NGINX = q(/usr/local/nginx/sbin/nginx); my $SROOT_DIR = "$REG_DIR/server_root"; my $TEMP_DIR = "$SROOT_DIR/tmp"; my $DATA_DIR = "$SROOT_DIR/data"; my $UPLOAD_DIR = "$SROOT_DIR/upload"; my $PASSED = 0; my $TOTAL = 0; my $BUFSIZ = 32768; my %C = (); my %FILE = (); my $UA_NAME = "ModSecurity Regression Tests/1.2.3"; my $UA = LWP::UserAgent->new; $UA->agent($UA_NAME); $SIG{TERM} = $SIG{INT} = \&handle_interrupt; my $platform = "nginx"; my %opt; getopts('A:E:D:C:T:H:a:p:dvh', \%opt); if ($opt{d}) { $Data::Dumper::Indent = 1; $Data::Dumper::Terse = 1; $Data::Dumper::Pad = ""; $Data::Dumper::Quotekeys = 0; } sub usage { print stderr <<"EOT"; @_ Usage: $SCRIPT [options] [file [N]] Options: -P path Specify nginx prefix path (default: $NGINX_DIR) -a file Specify nginx binary (default: $NGINX) -p port Specify nginx port (default: 8088) -v Enable verbose output (details on failure). -d Enable debugging output. -h This help. EOT exit(1); } usage() if ($opt{h}); ### Check nginx binary if (defined $opt{a}) { $NGINX = $opt{a}; } else { $opt{a} = $NGINX; } usage("Invalid Apache startup script: $NGINX\n") unless (-e $NGINX); ### Defaults $opt{P} = "$NGINX_DIR" unless (defined $opt{P}); my $CONF_DIR = "$opt{P}/conf"; my $FILES_DIR = "$opt{P}/logs"; my $PID_FILE = "$FILES_DIR/nginx.pid"; $opt{A} = "$FILES_DIR/modsec_audit.log"; $opt{D} = "$FILES_DIR/modsec_debug.log"; $opt{E} = "$FILES_DIR/error.log"; $opt{C} = "$CONF_DIR/nginx.conf"; $opt{p} = 8088 unless (defined $opt{p}); $opt{v} = 1 if ($opt{d}); if ( !-d "$opt{P}" ) { make_path($opt{P}) or die $!; } if ( !-d "$opt{P}/logs" ) { make_path("$opt{P}/logs") or die $!; } if ( !-d "$opt{P}/html" ) { make_path("$opt{P}/html") or die $!; } dircopy("$REG_DIR/server_root/htdocs","$opt{P}/html") or die $!; %ENV = ( %ENV, $NGINX_DIR => $opt{P}, SERVER_PORT => $opt{p}, SERVER_NAME => "localhost", # TEST_NGX_PREFIX => $NGINX_DIR, DATA_DIR => $DATA_DIR, TEMP_DIR => $TEMP_DIR, UPLOAD_DIR => $UPLOAD_DIR, CONF_DIR => $CONF_DIR, # MODULES_DIR => $MODULES_DIR, LOGS_DIR => $FILES_DIR, SCRIPT_DIR => $SCRIPT_DIR, REGRESSION_DIR => $REG_DIR, DIST_ROOT => File::Spec->rel2abs(dirname("$SCRIPT_DIR/../../..")), AUDIT_LOG => $opt{A}, DEBUG_LOG => $opt{D}, ERROR_LOG => $opt{E}, NGINX_CONF => $opt{C}, # HTDOCS => $opt{H}, USER_AGENT => $UA_NAME, ); #dbg("OPTIONS: ", \%opt); if (-e "$PID_FILE") { msg("Shutting down previous instance: $PID_FILE"); nginx_stop(); } if (defined $ARGV[0]) { runfile(dirname($ARGV[0]), basename($ARGV[0]), $ARGV[1]); done(); } for my $type (@TYPES) { my $dir = "$SCRIPT_DIR/regression/$type"; my @cfg = (); # Get test names opendir(DIR, "$dir") or quit(1, "Failed to open \"$dir\": $!"); @cfg = grep { /\.t$/ && -f "$dir/$_" } readdir(DIR); closedir(DIR); for my $cfg (sort @cfg) { runfile($dir, $cfg); } } done(); sub runfile { my($dir, $cfg, $testnum) = @_; my $fn = "$dir/$cfg"; my @data = (); my $edata; my @C = (); my @test = (); my $teststr; my $n = 0; my $pass = 0; open(CFG, "<$fn") or quit(1, "Failed to open \"$fn\": $!"); @data = ; $edata = q/@C = (/ . join("", @data) . q/)/; eval $edata; quit(1, "Failed to read test data \"$cfg\": $@") if ($@); unless (@C) { msg("\nNo tests defined for $fn"); return; } msg("\nLoaded ".@C." tests from $fn"); for my $t (@C) { $n++; next if (defined $testnum and $n != $testnum); my $nginx_up = 0; my %t = %{$t || {}}; my $id = sprintf("%3d", $n); my $out = ""; my $rc = 0; my $conf_fn; # Startup nginx with optionally included conf. if (exists $t{conf} and defined $t{conf}) { $conf_fn = sprintf "%s/%s_%s_%06d.conf", $CONF_DIR, $t{type}, $cfg, $n; #dbg("Writing test config to: $conf_fn"); open(CONF, ">$conf_fn") or die "Failed to open conf \"$conf_fn\": $!\n"; print CONF (ref $t{conf} eq "CODE" ? eval { &{$t{conf}} } : $t{conf}); msg("$@") if ($@); close CONF; my %conf=(config => $conf_fn, enable => "on"); $nginx_up = nginx_start($t, \%conf) ? 0 : 1; } else { $nginx_up = nginx_start($t) ? 0 : 1; } # Run any prerun setup if ($rc == 0 and exists $t{prerun} and defined $t{prerun}) { vrb("Executing perl prerun..."); $rc = &{$t{prerun}}; vrb("Perl prerun returned: $rc"); } if ($nginx_up) { # Perform the request and check response if (exists $t{request}) { my $resp = do_request($t{request}); if (!$resp) { msg("invalid response"); vrb("RESPONSE: ", $resp); $rc = 1; } else { for my $key (keys %{ $t{match_response} || {}}) { my($neg,$mtype) = ($key =~ m/^(-?)(.*)$/); my $m = $t{match_response}{$key}; if (ref($m) eq "HASH") { if ($m->{$platform}) { $m = $m->{$platform}; } else { my $ap = join(", ", keys %{$m}); msg("Warning: trying to match response. Nothing " . "to match in current platform: $platform. " . "This test only contains cotent for: $ap."); last; } } my $match = match_response($mtype, $resp, $m); if ($neg and defined $match) { $rc = 1; msg("response $mtype matched: $m"); vrb($resp); last; } elsif (!$neg and !defined $match) { $rc = 1; msg("response $mtype failed to match: $m"); vrb($resp); last; } } } } # Run any arbitrary perl tests if ($rc == 0 and exists $t{test} and defined $t{test}) { dbg("Executing perl test(s)..."); $rc = eval { &{$t{test}} }; if (! defined $rc) { msg("Error running test: $@"); $rc = -1; } dbg("Perl tests returned: $rc"); } # Search for all log matches if ($rc == 0 and exists $t{match_log} and defined $t{match_log}) { for my $key (keys %{ $t{match_log} || {}}) { my($neg,$mtype) = ($key =~ m/^(-?)(.*)$/); my $m = $t{match_log}{$key}; if (ref($m) eq "HASH") { if ($m->{$platform}) { $m = $m->{$platform}; } else { my $ap = join(", ", keys %{$m}); msg("Warning: trying to match: $mtype. Nothing " . "to match in current platform: $platform. " . "This test only contains cotent for: $ap."); last; } } my $match = match_log($mtype, @{$m || []}); if ($neg and defined $match) { $rc = 1; msg("$mtype log matched: $m->[0]"); last; } elsif (!$neg and !defined $match) { $rc = 1; msg("$mtype log failed to match: $m->[0]"); last; } } } # Search for all file matches if ($rc == 0 and exists $t{match_file} and defined $t{match_file}) { sleep 1; # Make sure the file exists for my $key (keys %{ $t{match_file} || {}}) { my($neg,$fn) = ($key =~ m/^(-?)(.*)$/); my $m = $t{match_file}{$key}; my $match = match_file($fn, $m); if ($neg and defined $match) { $rc = 1; msg("$fn file matched: $m"); last; } elsif (!$neg and !defined $match) { $rc = 1; msg("$fn file failed match: $m"); last; } } } } else { msg("Failed to start nginx."); $rc = 1; } if ($rc == 0) { $pass++; } else { vrb("Test Config: $conf_fn"); vrb("Debug Log: $FILE{debug}{fn}"); dbg(escape("$FILE{debug}{buf}")); vrb("Error Log: $FILE{error}{fn}"); dbg(escape("$FILE{error}{buf}")); } msg(sprintf("%s) %s%s: %s%s", $id, $t{type}, (exists($t{comment}) ? " - $t{comment}" : ""), ($rc ? "failed" : "passed"), ((defined($out) && $out ne "")? " ($out)" : ""))); if ($nginx_up) { $nginx_up = nginx_stop(\%t) ? 0 : 1; } } $TOTAL += $testnum ? 1 : $n; $PASSED += $pass; msg(sprintf("Passed: %2d; Failed: %2d", $pass, $testnum ? (1 - $pass) : ($n - $pass))); } # Take out any indenting and translate LF -> CRLF sub normalize_raw_request_data { my $r = $_[0]; # Allow for indenting in test file $r =~ s/^[ \t]*\x0d?\x0a//s; my($indention) = ($r =~ m/^([ \t]*)/s); # indention taken from first line $r =~ s/^$indention//mg; $r =~ s/(\x0d?\x0a)[ \t]+$/$1/s; # Translate LF to CRLF $r =~ s/^\x0a/\x0d\x0a/mg; $r =~ s/([^\x0d])\x0a/$1\x0d\x0a/mg; return $r; } sub do_raw_request { my $sock = new IO::Socket::INET( Proto => "tcp", PeerAddr => "localhost", PeerPort => $opt{p}, ) or msg("Failed to connect to localhost:$opt{p}: $@"); return unless ($sock); my $timeo = pack("qq", 2, 0); $sock->sockopt(SO_RCVTIMEO, $timeo); # Join togeather the request my $r = join("", @_); dbg($r); # Write to socket print $sock "$r"; $sock->shutdown(1); # Read from socket my @resp = <$sock>; $sock->close(); return HTTP::Response->parse(join("", @resp)); } sub do_request { my $r = $_[0]; # Allow test to execute code if (ref $r eq "CODE") { $r = eval { &$r }; msg("$@") unless (defined $r); } if (ref $r eq "HTTP::Request") { my $resp = $UA->request($r); dbg($resp->request()->as_string()) if ($opt{d}); return $resp } else { return do_raw_request($r); } return; } sub match_response { my($name, $resp, $re) = @_; msg("Warning: Empty regular expression.") if (!defined $re or $re eq ""); if ($name eq "status") { return $& if ($resp->code =~ m/$re/); } elsif ($name eq "content") { return $& if ($resp->content =~ m/$re/m); } elsif ($name eq "raw") { return $& if ($resp->as_string =~ m/$re/m); } return; } sub read_log { my($name, $timeout, $graph) = @_; return match_log($name, undef, $timeout, $graph); } sub match_log { my($name, $re, $timeout, $graph) = @_; my $t0 = gettimeofday; my($fh,$rbuf) = ($FILE{$name}{fd}, \$FILE{$name}{buf}); my $n = length($$rbuf); my $rc = undef; unless (defined $fh) { msg("Error: File \"$name\" is not opened for matching."); return; } $timeout = 1 unless (defined $timeout); if ($timeout == 1) { $timeout = 0.5; } # Audit logs are taking too long to be written on the disk. One of the # consequence of that is to have tests that demands to read from audit # log failing. Increase the timeout here, make it wait a little bit # more for the logs before gave up. if ($name eq "audit") { $timeout = 8; } my $i = 0; my $graphed = 0; READ: { do { my $nbytes = $fh->sysread($$rbuf, $BUFSIZ, $n); if (!defined($nbytes)) { msg("Error: Could not read \"$name\" log: $!"); last; } elsif (!defined($re) and $nbytes == 0) { last; } # Remove APR pool debugging $$rbuf =~ s/POOL DEBUG:[^\n]+PALLOC[^\n]+\n//sg; $n = length($$rbuf); #dbg("Match \"$re\" in $name \"$$rbuf\" ($n)"); if ($$rbuf =~ m/$re/m) { $rc = $&; # print "bonga\n"; last; } # TODO: Use select()/poll() sleep 0.1 unless ($nbytes == $BUFSIZ); if ($graph and $opt{d}) { $i++; if ($i == 10) { $graphed++; $i=0; print STDERR $graph if ($graphed == 1); print STDERR "." } } system("sync"); } while (gettimeofday - $t0 < $timeout); } print STDERR "\n" if ($graphed); return $rc; } sub match_file { my($neg,$fn) = ($_[0] =~ m/^(-?)(.*)$/); unless (exists $FILE{$fn}) { eval { $FILE{$fn}{fn} = $fn; $FILE{$fn}{fd} = new FileHandle($fn, O_RDONLY) or die "$!\n"; $FILE{$fn}{fd}->blocking(0); $FILE{$fn}{buf} = ""; }; if ($@) { msg("Warning: Failed to open file \"$fn\": $@"); return; } } return match_log($_[0], $_[1]); # timeout makes no sense } sub quote_shell { my($s) = @_; return $s unless ($s =~ m|[^\w!%+,\-./:@^]|); $s =~ s/(['\\])/\\$1/g; return "'$s'"; } sub escape { my @new = (); for my $c (split(//, $_[0])) { my $oc = ord($c); push @new, ((($oc >= 0x20 and $oc <= 0x7e) or $oc == 0x0a or $oc == 0x0d) ? $c : sprintf("\\x%02x", ord($c))); } join('', @new); } sub dbg { return unless(@_ and $opt{d}); my $out = join "", map { (ref $_ ne "" ? Dumper($_) : $_) } @_; $out =~ s/^/DBG: /mg; print STDOUT "$out\n"; } sub vrb { return unless(@_ and $opt{v}); msg(@_); } sub msg { return unless(@_); my $out = join "", map { (ref $_ ne "" ? Dumper($_) : $_) } @_; print STDOUT "$out\n"; } sub handle_interrupt { $SIG{TERM} = $SIG{INT} = \&handle_interrupt; msg("Interrupted via SIG$_[0]. Shutting down tests..."); nginx_stop(); quit(1); } sub quit { my($ec,$msg) = @_; $ec = 0 unless (defined $_[0]); msg("$msg") if (defined $msg); exit $ec; } sub done { if ($PASSED != $TOTAL) { quit(1, "\n$PASSED/$TOTAL tests passed."); } quit(0, "\nAll tests passed ($TOTAL)."); } sub nginx_stop { my $t = shift; my @p = ( $NGINX, -p => $opt{P}, -s => "quit", ); my $nginx_out; my $nginx_pid = open3(undef, $nginx_out, undef, @p) or quit(1); my $out = join("\\n", grep(!/POOL DEBUG/, (<$nginx_out>))); close $nginx_out; waitpid($nginx_pid, 0); my $rc = $?; if ( WIFEXITED($rc) ) { $rc = WEXITSTATUS($rc); vrb("Nginx stop returned with $rc.") if ($rc); } elsif( WIFSIGNALED($rc) ) { msg("Nginx stop failed with signal " . WTERMSIG($rc) . "."); $rc = -1; } else { msg("Nginx stop failed with unknown error."); $rc = -1; } unless (defined match_log("error", qr/signal [0-9]+ \(SIGCHLD\) received/, 60, "exited with code 0")) { vrb(join(" ", map { quote_shell($_) } @p)); msg("nginx server failed to shutdown."); sleep 0.5; return -1; } if (-e $PID_FILE) { msg("nginx server failed to shutdown."); return -1; } return $rc; } sub nginx_reset_fd { my($t) = @_; # Cleanup for my $key (keys %FILE) { if (exists $FILE{$key}{fd} and defined $FILE{$key}{fd}) { $FILE{$key}{fd}->close(); } delete $FILE{$key}; } # Error eval { $FILE{error}{fn} = $opt{E}; $FILE{error}{fd} = new FileHandle($opt{E}, O_RDWR|O_CREAT) or die "$!\n"; $FILE{error}{fd}->blocking(0); $FILE{error}{fd}->sysseek(0, 2); $FILE{error}{buf} = ""; }; if ($@) { msg("Warning: Failed to open file \"$opt{E}\": $@"); return undef; } # Audit eval { $FILE{audit}{fn} = $opt{A}; $FILE{audit}{fd} = new FileHandle($opt{A}, O_RDWR|O_CREAT) or die "$!\n"; $FILE{audit}{fd}->blocking(0); $FILE{audit}{fd}->sysseek(0, 2); $FILE{audit}{buf} = ""; }; if ($@) { msg("Warning: Failed to open file \"$opt{A}\": $@"); return undef; } # Debug eval { $FILE{debug}{fn} = $opt{D}; $FILE{debug}{fd} = new FileHandle($opt{D}, O_RDWR|O_CREAT) or die "$!\n"; $FILE{debug}{fd}->blocking(0); $FILE{debug}{fd}->sysseek(0, 2); $FILE{debug}{buf} = ""; }; if ($@) { msg("Warning: Failed to open file \"$opt{D}\": $@"); return undef; } # Any extras listed in "match_log" if ($t and exists $t->{match_log}) { for my $k (keys %{ $t->{match_log} || {} }) { my($neg,$fn) = ($k =~ m/^(-?)(.*)$/); next if (!$fn or exists $FILE{$fn}); eval { $FILE{$fn}{fn} = $fn; $FILE{$fn}{fd} = new FileHandle($fn, O_RDWR|O_CREAT) or die "$!\n"; $FILE{$fn}{fd}->blocking(0); $FILE{$fn}{fd}->sysseek(0, 2); $FILE{$fn}{buf} = ""; }; if ($@) { msg("Warning: Failed to open file \"$fn\": $@"); return undef; } } } } sub encode_chunked { my($data, $size) = @_; $size = 128 unless ($size); my $chunked = ""; my $n = 0; my $bytes = length($data); while ($bytes >= $size) { $chunked .= sprintf "%x\x0d\x0a%s\x0d\x0a", $size, substr($data, $n, $size); $n += $size; $bytes -= $size; } if ($bytes) { $chunked .= sprintf "%x\x0d\x0a%s\x0d\x0a", $bytes, substr($data, $n, $bytes); } $chunked .= "0\x0d\x0a\x0d\x0a" } sub nginx_start { my ($t) = shift; my($C) = shift; my %conf = ( listen => "$opt{p}", config => "$REG_DIR/nginx/conf/empty.conf", enable => "off", ); while(my($k,$v)= each %$C){ $conf{$k}=$v; } my ($tt) = Template->new(INCLUDE_PATH => "$REG_DIR/nginx/conf/"); my ($output); $tt->process("nginx.conf.template", \%conf, \$output) || die $tt->error; open (OUTFILE, ">$opt{C}"); print OUTFILE "$output"; close(OUTFILE); nginx_reset_fd($t); my @p = ($NGINX, -p => $opt{P}); my $nginx_out; my $nginx_pid = open3(undef, $nginx_out, undef, @p) or quit(1); my $out = join("\\n", grep(!/POOL DEBUG/, (<$nginx_out>))); close $nginx_out; waitpid($nginx_pid, 0); my $rc = $?; if ( WIFEXITED($rc) ) { $rc = WEXITSTATUS($rc); vrb("Nginx start returned with $rc.") if ($rc); } elsif( WIFSIGNALED($rc) ) { msg("Nginx start failed with signal " . WTERMSIG($rc) . "."); $rc = -1; } else { msg("Nginx start failed with unknown error."); $rc = -1; } # Look for startup msworker cycleg unless (defined match_log("error", qr/start worker process/, 60)) { vrb(join(" ", map { quote_shell($_) } @p)); msg("Nginx server failed to start."); nginx_stop(); return -1; } return $rc; } modsecurity-2.9.5/tests/op/0000775000175000017500000000000014147005233016777 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tests/op/eq.t0000664000175000017500000000217614147005233017577 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "eq", param => "0", input => "", ret => 1, }, { type => "op", name => "eq", param => "5", input => "", ret => 0, }, ### Invalid # xxx interpreted as 0 { type => "op", name => "eq", param => "xxx", input => "0", ret => 1, }, # xxx interpreted as 0 { type => "op", name => "eq", param => "xxx", input => "5", ret => 0, }, # xxx interpreted as 0 { type => "op", name => "eq", param => "xxx", input => "-1", ret => 0, }, # xxx interpreted as 0 { type => "op", name => "eq", param => "0", input => "xxx", ret => 1, }, # xxx interpreted as 0 { type => "op", name => "eq", param => "5", input => "xxx", ret => 0, }, ### General { type => "op", name => "eq", param => "0", input => "-5", ret => 0, }, { type => "op", name => "eq", param => "0", input => "0", ret => 1, }, { type => "op", name => "eq", param => "0", input => "5", ret => 0, }, { type => "op", name => "eq", param => "5", input => "0", ret => 0, }, { type => "op", name => "eq", param => "5", input => "5", ret => 1, }, { type => "op", name => "eq", param => "5", input => "10", ret => 0, }, modsecurity-2.9.5/tests/op/gt.t0000664000175000017500000000203214147005233017573 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "gt", param => "0", input => "", ret => 0, }, { type => "op", name => "gt", param => "5", input => "", ret => 0, }, ### Invalid # xxx interpreted as 0 { type => "op", name => "gt", param => "xxx", input => "5", ret => 1, }, # xxx interpreted as 0 { type => "op", name => "gt", param => "xxx", input => "-1", ret => 0, }, # xxx interpreted as 0 { type => "op", name => "gt", param => "-1", input => "xxx", ret => 1, }, # xxx interpreted as 0 { type => "op", name => "gt", param => "5", input => "xxx", ret => 0, }, ### General { type => "op", name => "gt", param => "0", input => "-5", ret => 0, }, { type => "op", name => "gt", param => "0", input => "0", ret => 0, }, { type => "op", name => "gt", param => "0", input => "5", ret => 1, }, { type => "op", name => "gt", param => "5", input => "0", ret => 0, }, { type => "op", name => "gt", param => "5", input => "5", ret => 0, }, { type => "op", name => "gt", param => "5", input => "10", ret => 1, }, modsecurity-2.9.5/tests/op/lt.t0000664000175000017500000000203214147005233017600 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "lt", param => "0", input => "", ret => 0, }, { type => "op", name => "lt", param => "5", input => "", ret => 1, }, ### Invalid # xxx interpreted as 0 { type => "op", name => "lt", param => "xxx", input => "5", ret => 0, }, # xxx interpreted as 0 { type => "op", name => "lt", param => "xxx", input => "-1", ret => 1, }, # xxx interpreted as 0 { type => "op", name => "lt", param => "-1", input => "xxx", ret => 0, }, # xxx interpreted as 0 { type => "op", name => "lt", param => "5", input => "xxx", ret => 1, }, ### General { type => "op", name => "lt", param => "0", input => "-5", ret => 1, }, { type => "op", name => "lt", param => "0", input => "0", ret => 0, }, { type => "op", name => "lt", param => "0", input => "5", ret => 0, }, { type => "op", name => "lt", param => "5", input => "0", ret => 1, }, { type => "op", name => "lt", param => "5", input => "5", ret => 0, }, { type => "op", name => "lt", param => "5", input => "10", ret => 0, }, modsecurity-2.9.5/tests/op/contains.t0000664000175000017500000000165614147005233021012 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "contains", param => "", input => "", ret => 1, }, { type => "op", name => "contains", param => "TestCase", input => "", ret => 0, }, { type => "op", name => "contains", param => "", input => "TestCase", ret => 1, }, ### General { type => "op", name => "contains", param => "abc", input => "abcdefghi", ret => 1, }, { type => "op", name => "contains", param => "def", input => "abcdefghi", ret => 1, }, { type => "op", name => "contains", param => "ghi", input => "abcdefghi", ret => 1, }, { type => "op", name => "contains", param => "ghij", input => "abcdefghi", ret => 0, }, { type => "op", name => "contains", param => "x", input => "x", ret => 1, }, { type => "op", name => "contains", param => "y", input => "xyz", ret => 1, }, { type => "op", name => "contains", param => "hiding", input => "hidinX<-not quite, but is later on->hiding", ret => 1, }, modsecurity-2.9.5/tests/op/pm.t0000664000175000017500000001243214147005233017602 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "pm", param => "TestCase", input => "", ret => 0, }, ### General { type => "op", name => "pm", param => "abc", input => "abcdefghi", ret => 1, }, { type => "op", name => "pm", param => "def", input => "abcdefghi", ret => 1, }, { type => "op", name => "pm", param => "ghi", input => "abcdefghi", ret => 1, }, { type => "op", name => "pm", param => "ghij", input => "abcdefghi", ret => 0, }, ### Multiple { type => "op", name => "pm", param => "abc def ghi", input => "abcxxxyyy", ret => 1, }, { type => "op", name => "pm", param => "abc def ghi", input => "xxxabcyyy", ret => 1, }, { type => "op", name => "pm", param => "abc def ghi", input => "xxxyyyabc", ret => 1, }, { type => "op", name => "pm", param => "abc def ghi", input => "defxxxyyy", ret => 1, }, { type => "op", name => "pm", param => "abc def ghi", input => "xxxdefyyy", ret => 1, }, { type => "op", name => "pm", param => "abc def ghi", input => "xxxyyydef", ret => 1, }, { type => "op", name => "pm", param => "abc def ghi", input => "ghixxxyyy", ret => 1, }, { type => "op", name => "pm", param => "abc def ghi", input => "xxxghiyyy", ret => 1, }, { type => "op", name => "pm", param => "abc def ghi", input => "xxxyyyghi", ret => 1, }, ### Long { type => "op", name => "pm", param => "000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999", input => "xxxyyy999", ret => 1, }, modsecurity-2.9.5/tests/op/detectXSS.t0000664000175000017500000000042014147005233021026 0ustar mhsvierulamhsvierula{ type => "op", name => "detectXSS", input => "", ret => 0 }, { type => "op", name => "detectXSS", input => "this is not an XSS", ret => 0 }, { type => "op", name => "detectXSS", input => ")", ret => 1 } modsecurity-2.9.5/tests/op/validateUtf8Encoding.t0000664000175000017500000001217214147005233023176 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "validateUtf8Encoding", param => "", input => "", ret => 0, }, ### Valid "I can eat glass and it does not hurt me." # Greek { type => "op", name => "validateUtf8Encoding", param => "", input => "ὕαλον ϕαγεῖν δύναμαι· τοῦτο οὔ με βλάπτει.", ret => 0, }, # French { type => "op", name => "validateUtf8Encoding", param => "", input => "Je peux manger du verre, ça ne me fait pas de mal.", ret => 0, }, # Spanish { type => "op", name => "validateUtf8Encoding", param => "", input => "Puedo comer vidrio, no me hace daño.", ret => 0, }, # Esparanto { type => "op", name => "validateUtf8Encoding", param => "", input => "Mi povas manĝi vitron, ĝi ne damaĝas min.", ret => 0, }, # Latin { type => "op", name => "validateUtf8Encoding", param => "", input => "Ic mæg glæs eotan ond hit ne hearmiað me.", ret => 0, }, # Serbian { type => "op", name => "validateUtf8Encoding", param => "", input => "Могу јести стакло а да ми не шкоди.", ret => 0, }, # Russian { type => "op", name => "validateUtf8Encoding", param => "", input => "Я могу есть стекло, оно мне не вредит.", ret => 0, }, # Armenian { type => "op", name => "validateUtf8Encoding", param => "", input => "Կրնամ ապակի ուտել և ինծի անհանգիստ չըներ։", ret => 0, }, # Turkish { type => "op", name => "validateUtf8Encoding", param => "", input => "جام ييه بلورم بڭا ضررى طوقونمز", ret => 0, }, # Hindi { type => "op", name => "validateUtf8Encoding", param => "", input => "मैं काँच खा सकता हूँ, मुझे उस से कोई पीडा नहीं होती.", ret => 0, }, # Arabic { type => "op", name => "validateUtf8Encoding", param => "", input => "أنا قادر على أكل الزجاج و هذا لا يؤلمني.", ret => 0, }, # Hebrew { type => "op", name => "validateUtf8Encoding", param => "", input => "אני יכול לאכול זכוכית וזה לא מזיק לי.", ret => 0, }, # Japanese { type => "op", name => "validateUtf8Encoding", param => "", input => "私はガラスを食べられます。それは私を傷つけません。", ret => 0, }, # Thai { type => "op", name => "validateUtf8Encoding", param => "", input => "ฉันกินกระจกได้ แต่มันไม่ทำให้ฉันเจ็บ", ret => 0, }, # Korean { type => "op", name => "validateUtf8Encoding", param => "", input => "나는 유리를 먹을 수 있어요. 그래도 아프지 않아요", ret => 0, }, # Navajo { type => "op", name => "validateUtf8Encoding", param => "", input => "Tsésǫʼ yishą́ągo bííníshghah dóó doo shił neezgai da.", ret => 0, }, # Icelandic { type => "op", name => "validateUtf8Encoding", param => "", input => "Ég get etið gler án þess að meiða mig.", ret => 0, }, # Sanskrit { type => "op", name => "validateUtf8Encoding", param => "", input => "काचं शक्नोम्यत्तुम् । नोपहिनस्ति माम् ॥", ret => 0, }, # English Braille { type => "op", name => "validateUtf8Encoding", param => "", input => "⠊⠀⠉⠁⠝⠀⠑⠁⠞⠀⠛⠇⠁⠎⠎⠀⠁⠝⠙⠀⠊⠞⠀⠙⠕⠑⠎⠝⠞⠀⠓⠥⠗⠞⠀⠍⠑", ret => 0, }, # Danish { type => "op", name => "validateUtf8Encoding", param => "", input => "Jeg kan spise glas, det gør ikke ondt på mig.", ret => 0, }, # Hungarian { type => "op", name => "validateUtf8Encoding", param => "", input => "Meg tudom enni az üveget, nem lesz tőle bajom.", ret => 0, }, # Estonian { type => "op", name => "validateUtf8Encoding", param => "", input => "Ma võin klaasi süüa, see ei tee mulle midagi.", ret => 0, }, # Czech { type => "op", name => "validateUtf8Encoding", param => "", input => "Mohu jíst sklo, neublíží mi.", ret => 0, }, # Slovak { type => "op", name => "validateUtf8Encoding", param => "", input => "Môžem jesť sklo. Nezraní ma.", ret => 0, }, # Polish { type => "op", name => "validateUtf8Encoding", param => "", input => "Mogę jeść szkło i mi nie szkodzi.", ret => 0, }, # Symbols { type => "op", name => "validateUtf8Encoding", param => "", input=>"∮E⋅da=Qn→∞∑f(i)=∏g(i)∀x∈ℝ:⌈x⌉=−⌊−x⌋α∧¬β=¬(¬α∨β)ℕ⊆ℕ₀⊂ℤ⊂ℚ⊂ℝ⊂ℂ⊥ 0, }, ### Invalid # Umlauted a { type => "op", name => "validateUtf8Encoding", param => "", input => "\x00\xe4", ret => 1, }, # Umlauted a { type => "op", name => "validateUtf8Encoding", param => "", input => "\xe4", ret => 1, }, # { type => "op", name => "validateUtf8Encoding", param => "", input => "\x03\xbf", ret => 1, }, # { type => "op", name => "validateUtf8Encoding", param => "", input => "\xc9\x3b", ret => 1, }, ### Invalid Full width # { type => "op", name => "validateUtf8Encoding", param => "", input => "\xFF\x00", ret => 1, }, modsecurity-2.9.5/tests/op/pmFromFile.t0000664000175000017500000000126514147005233021230 0ustar mhsvierulamhsvierula### No Match { type => "op", name => "pmFromFile", param => "op/pmFromFile-01.dat", input => "xxxyyyzzz", ret => 0, }, ### Multiple { type => "op", name => "pmFromFile", param => "op/pmFromFile-01.dat", input => "defxxxyyy", ret => 1, }, { type => "op", name => "pmFromFile", param => "op/pmFromFile-01.dat", input => "xxxdefyyy", ret => 1, }, { type => "op", name => "pmFromFile", param => "op/pmFromFile-01.dat", input => "xxxyyydef", ret => 1, }, { type => "op", name => "pmFromFile", param => "op/pmFromFile-01.dat", input => "xxx yyy zzz", ret => 1, }, { type => "op", name => "pmFromFile", param => "op/pmFromFile-01.dat", input => "xxx yyy", ret => 0, }, modsecurity-2.9.5/tests/op/within.t0000664000175000017500000000117214147005233020467 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "within", param => "", input => "", ret => 1, }, { type => "op", name => "within", param => "TestCase", input => "", ret => 1, }, { type => "op", name => "within", param => "", input => "TestCase", ret => 0, }, ### General { type => "op", name => "within", param => "abcdefghi", input => "abc", ret => 1, }, { type => "op", name => "within", param => "abcdefghi", input => "def", ret => 1, }, { type => "op", name => "within", param => "abcdefghi", input => "ghi", ret => 1, }, { type => "op", name => "within", param => "abcdefghi", input => "ghij", ret => 0, }, modsecurity-2.9.5/tests/op/unconditionalMatch.t0000664000175000017500000000045114147005233023007 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "unconditionalMatch", param => "", input => "", ret => 1, }, { type => "op", name => "unconditionalMatch", param => "TestCase", input => "", ret => 1, }, { type => "op", name => "unconditionalMatch", param => "", input => "TestCase", ret => 1, }, modsecurity-2.9.5/tests/op/rbl.t0000664000175000017500000000000114147005233017732 0ustar mhsvierulamhsvierula modsecurity-2.9.5/tests/op/ge.t0000664000175000017500000000203114147005233017553 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "ge", param => "0", input => "", ret => 1, }, { type => "op", name => "ge", param => "5", input => "", ret => 0, }, ### Invalid # xxx interpreted as 0 { type => "op", name => "ge", param => "xxx", input => "5", ret => 1, }, # xxx interpreted as 0 { type => "op", name => "ge", param => "xxx", input => "-1", ret => 0, }, # xxx interpreted as 0 { type => "op", name => "ge", param => "0", input => "xxx", ret => 1, }, # xxx interpreted as 0 { type => "op", name => "ge", param => "5", input => "xxx", ret => 0, }, ### General { type => "op", name => "ge", param => "0", input => "-5", ret => 0, }, { type => "op", name => "ge", param => "0", input => "0", ret => 1, }, { type => "op", name => "ge", param => "0", input => "5", ret => 1, }, { type => "op", name => "ge", param => "5", input => "0", ret => 0, }, { type => "op", name => "ge", param => "5", input => "5", ret => 1, }, { type => "op", name => "ge", param => "5", input => "10", ret => 1, }, modsecurity-2.9.5/tests/op/validateUrlEncoding.t0000664000175000017500000000255414147005233023115 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "validateUrlEncoding", param => "", input => "", ret => 0, }, ### General { type => "op", name => "validateUrlEncoding", param => "", input => "Hello%20World!", ret => 0, }, { type => "op", name => "validateUrlEncoding", param => "", input => "Hello+World!", ret => 0, }, { type => "op", name => "validateUrlEncoding", param => "", input => "HelloWorld!", ret => 0, }, { type => "op", name => "validateUrlEncoding", param => "", input => "%00Hello%20World!", ret => 0, }, { type => "op", name => "validateUrlEncoding", param => "", input => "Hello%20World!%00", ret => 0, }, { type => "op", name => "validateUrlEncoding", param => "", input => "%00", ret => 0, }, { type => "op", name => "validateUrlEncoding", param => "", input => "%ff", ret => 0, }, { type => "op", name => "validateUrlEncoding", param => "", input => "%0", ret => 1, }, { type => "op", name => "validateUrlEncoding", param => "", input => "%f", ret => 1, }, { type => "op", name => "validateUrlEncoding", param => "", input => "%", ret => 1, }, { type => "op", name => "validateUrlEncoding", param => "", input => "%0z", ret => 1, }, { type => "op", name => "validateUrlEncoding", param => "", input => "%z0", ret => 1, }, { type => "op", name => "validateUrlEncoding", param => "", input => "%0%", ret => 1, }, modsecurity-2.9.5/tests/op/detectSQLi.t0000664000175000017500000000043114147005233021163 0ustar mhsvierulamhsvierula{ type => "op", name => "detectSQLi", input => "", ret => 0 }, { type => "op", name => "detectSQLi", input => "this is not isqli", ret => 0 }, { type => "op", name => "detectSQLi", input => "ascii(substring(version() from 1 for 1))", ret => 1 } modsecurity-2.9.5/tests/op/pmFromFile-01.dat0000664000175000017500000000003014147005233021740 0ustar mhsvierulamhsvierulaabc def ghi xxx yyy zzz modsecurity-2.9.5/tests/op/geoLookup.t0000664000175000017500000000106214147005233021127 0ustar mhsvierulamhsvierula### Empty # NOTE: All will return 0 because of lacking DB { type => "op", name => "geoLookup", param => "", input => "", ret => 0, }, { type => "op", name => "geoLookup", param => "TestCase", input => "", ret => 0, }, # Failed Lookup { type => "op", name => "geoLookup", param => "", input => "127.0.0.1", ret => 0, }, # Good { type => "op", name => "geoLookup", param => "", input => "216.75.21.122", #ret => 1, ret => 0, }, { type => "op", name => "geoLookup", param => "", input => "www.modsecurity.org", #ret => 1, ret => 0, }, modsecurity-2.9.5/tests/op/containsWord.t0000664000175000017500000000270514147005233021642 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "containsWord", param => "", input => "", ret => 1, }, { type => "op", name => "containsWord", param => "TestCase", input => "", ret => 0, }, { type => "op", name => "containsWord", param => "", input => "TestCase", ret => 1, }, ### General { type => "op", name => "containsWord", param => "abc", input => "abcdefghi", ret => 0, }, { type => "op", name => "containsWord", param => "def", input => "abcdefghi", ret => 0, }, { type => "op", name => "containsWord", param => "ghi", input => "abcdefghi", ret => 0, }, { type => "op", name => "containsWord", param => "abc", input => "abc def ghi", ret => 1, }, { type => "op", name => "containsWord", param => "def", input => "abc def ghi", ret => 1, }, { type => "op", name => "containsWord", param => "ghi", input => "abc def ghi", ret => 1, }, { type => "op", name => "containsWord", param => "abc", input => "abc\0def ghi", ret => 1, }, { type => "op", name => "containsWord", param => "def", input => "abc\0def ghi", ret => 1, }, { type => "op", name => "containsWord", param => "x", input => "x", ret => 1, }, { type => "op", name => "containsWord", param => "x", input => " x ", ret => 1, }, { type => "op", name => "containsWord", param => "y", input => "xyz", ret => 0, }, { type => "op", name => "containsWord", param => "hiding", input => "hidingX<-not on word boundary, but is later on->hiding", ret => 1, }, modsecurity-2.9.5/tests/op/streq.t0000664000175000017500000000117014147005233020321 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "streq", param => "", input => "", ret => 1, }, { type => "op", name => "streq", param => "TestCase", input => "", ret => 0, }, { type => "op", name => "streq", param => "", input => "TestCase", ret => 0, }, ### General { type => "op", name => "streq", param => "abc", input => "abcdefghi", ret => 0, }, { type => "op", name => "streq", param => "def", input => "abcdefghi", ret => 0, }, { type => "op", name => "streq", param => "ghi", input => "abcdefghi", ret => 0, }, { type => "op", name => "streq", param => "abcdefghi", input => "abcdefghi", ret => 1, }, modsecurity-2.9.5/tests/op/strmatch.t0000664000175000017500000000073714147005233021020 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "strmatch", param => "TestCase", input => "", ret => 0, }, ### General { type => "op", name => "strmatch", param => "abc", input => "abcdefghi", ret => 1, }, { type => "op", name => "strmatch", param => "def", input => "abcdefghi", ret => 1, }, { type => "op", name => "strmatch", param => "ghi", input => "abcdefghi", ret => 1, }, { type => "op", name => "strmatch", param => "ghij", input => "abcdefghi", ret => 0, }, modsecurity-2.9.5/tests/op/rx.t0000664000175000017500000000142414147005233017616 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "rx", param => "", input => "", ret => 1, }, { type => "op", name => "rx", param => "TestCase", input => "", ret => 0, }, { type => "op", name => "rx", param => "", input => "TestCase", ret => 1, }, ### General { type => "op", name => "rx", param => "abc", input => "abcdefghi", ret => 1, }, { type => "op", name => "rx", param => "def", input => "abcdefghi", ret => 1, }, { type => "op", name => "rx", param => "ghi", input => "abcdefghi", ret => 1, }, { type => "op", name => "rx", param => "ghij", input => "abcdefghi", ret => 0, }, ### Complex regex { type => "op", name => "rx", param => "(?i:(sleep\\((\\s*?)(\\d*?)(\\s*?)\\)|benchmark\\((.*?)\\,(.*?)\\)))", input => "SELECT pg_sleep(10);", ret => 1, }, modsecurity-2.9.5/tests/op/ipMatch.t0000664000175000017500000200471514147005233020562 0ustar mhsvierulamhsvierula # This file was based on Dartware, LLC IPv6 regular expression test. # IPv6 regular expression courtesy of Dartware, LLC (http://intermapper.com) # For full details see http://intermapper.com/ipv6regex # ipv4 # 1 { type => "op", name => "ipMatch", param => "10.10.10.10", input => "10.10.10.10", ret => 1 }, # 2 { type => "op", name => "ipMatch", param => "10.10.10.10", input => "10.10.10.11", ret => 0 }, # 3 { type => "op", name => "ipMatch", param => "10.10.10.0/21", input => "10.10.10.11", ret => 1 }, # 4 { type => "op", name => "ipMatch", param => "10.10.10.0/21", # min valid: 10.10.8.1 input => "10.10.7.254", ret => 0 }, # 5 { type => "op", name => "ipMatch", param => "10.10.10.0/21", input => "10.10.8.1", ret => 1 }, # 6 { type => "op", name => "ipMatch", param => "10.10.10.0/21", # max valid: 10.10.15.254 input => "10.10.16.1", ret => 0 }, # 7 { type => "op", name => "ipMatch", param => "10.10.10.0/21", input => "10.10.15.254", ret => 1 }, # 8 { type => "op", name => "ipMatch", param => "192.168.1.0/24", input => "192.168.1.254", ret => 1 }, # 9 { type => "op", name => "ipMatch", param => "156.149.249.1/8", input => "10.10.10.11", ret => 0 }, # 10 { type => "op", name => "ipMatch", param => "156.149.249.1/8", input => "156.149.152.152", ret => 1 }, # 11 { type => "op", name => "ipMatch", param => "10.0.0.0/24", input => "10.10.10.11", ret => 0 }, # 12 { type => "op", name => "ipMatch", param => "10.0.0.0/24", input => "10.0.0.11", ret => 1 }, # 13 { type => "op", name => "ipMatch", param => "10.0.0.0/8", input => "10.10.10.11", ret => 1 }, # 14 { type => "op", name => "ipMatch", param => "10.0.0.0/8", input => "10.10.10.11", ret => 1 }, # 15 { type => "op", name => "ipMatch", param => "10.0.0.0/4", input => "10.10.10.11", ret => 1 }, # 16 { type => "op", name => "ipMatch", param => "10.0.0.0/2", input => "10.10.10.11", ret => 1 }, # 17 { type => "op", name => "ipMatch", param => "10.0.0.0/100", input => "10.10.10.11", ret => 0 }, # ipv6 # 18 { type => "op", name => "ipMatch", param => "2001:db8::/32", input => "2001:0db8:ffff:ffff:ffff:ffff:ff00:00ff", ret => 1 }, # 19 { type => "op", name => "ipMatch", param => "2001:db8::/63", input => "2001:0db8:ffff:ffff:ffff:ffff:ff00:00ff", ret => 0 }, { type => "op", name => "ipMatch", param => "::1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::", input => "::", ret => 1, }, { type => "op", name => "ipMatch", param => "::/43", input => "0000:0000:001f:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::/43", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::/43", input => "0000:0000:0020:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::/43", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::/71", input => "0000:0000:0000:0000:01ff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::/71", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::/71", input => "0000:0000:0000:0000:0200:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::/71", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0:1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0:0:0:0:0:0:0:1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0:1", input => "0:0:0:0:0:0:0:1", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0:0", input => "0:0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:DB8:0:0:8:800:200C:417A", input => "2001:0db8:0000:0000:0008:0800:200c:417a", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0008:0800:200c:417a", input => "2001:DB8:0:0:8:800:200C:417A", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0008:0800:200c:417a", input => "2001:0db8:0000:0000:0008:0800:200c:417a", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:DB8:0:0:8:800:200C:417A", input => "2001:DB8:0:0:8:800:200C:417A", ret => 1, }, { type => "op", name => "ipMatch", param => "FF01:0:0:0:0:0:0:101", input => "ff01:0000:0000:0000:0000:0000:0000:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "ff01:0000:0000:0000:0000:0000:0000:0101", input => "FF01:0:0:0:0:0:0:101", ret => 1, }, { type => "op", name => "ipMatch", param => "ff01:0000:0000:0000:0000:0000:0000:0101", input => "ff01:0000:0000:0000:0000:0000:0000:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "FF01:0:0:0:0:0:0:101", input => "FF01:0:0:0:0:0:0:101", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:DB8::8:800:200C:417A", input => "2001:0db8:0000:0000:0008:0800:200c:417a", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0008:0800:200c:417a", input => "2001:DB8::8:800:200C:417A", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0008:0800:200c:417a", input => "2001:0db8:0000:0000:0008:0800:200c:417a", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:DB8::8:800:200C:417A", input => "2001:DB8::8:800:200C:417A", ret => 1, }, { type => "op", name => "ipMatch", param => "FF01::101", input => "ff01:0000:0000:0000:0000:0000:0000:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "ff01:0000:0000:0000:0000:0000:0000:0101", input => "FF01::101", ret => 1, }, { type => "op", name => "ipMatch", param => "ff01:0000:0000:0000:0000:0000:0000:0101", input => "ff01:0000:0000:0000:0000:0000:0000:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "FF01::101", input => "FF01::101", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::217:f2ff:fe07:ed62", input => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", input => "fe80::217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", input => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::217:f2ff:fe07:ed62", input => "fe80::217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0000:1234:0000:0000:C1C0:ABCD:0876", input => "2001:0000:1234:0000:0000:c1c0:abcd:0876", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0000:1234:0000:0000:c1c0:abcd:0876", input => "2001:0000:1234:0000:0000:C1C0:ABCD:0876", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0000:1234:0000:0000:c1c0:abcd:0876", input => "2001:0000:1234:0000:0000:c1c0:abcd:0876", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0000:1234:0000:0000:C1C0:ABCD:0876", input => "2001:0000:1234:0000:0000:C1C0:ABCD:0876", ret => 1, }, { type => "op", name => "ipMatch", param => "3ffe:0b00:0000:0000:0001:0000:0000:000a", input => "3ffe:0b00:0000:0000:0001:0000:0000:000a", ret => 1, }, { type => "op", name => "ipMatch", param => "3ffe:0b00:0000:0000:0001:0000:0000:000a", input => "3ffe:0b00:0000:0000:0001:0000:0000:000a", ret => 1, }, { type => "op", name => "ipMatch", param => "3ffe:0b00:0000:0000:0001:0000:0000:000a", input => "3ffe:0b00:0000:0000:0001:0000:0000:000a", ret => 1, }, { type => "op", name => "ipMatch", param => "3ffe:0b00:0000:0000:0001:0000:0000:000a", input => "3ffe:0b00:0000:0000:0001:0000:0000:000a", ret => 1, }, { type => "op", name => "ipMatch", param => "FF02:0000:0000:0000:0000:0000:0000:0001", input => "ff02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02:0000:0000:0000:0000:0000:0000:0001", input => "FF02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02:0000:0000:0000:0000:0000:0000:0001", input => "ff02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "FF02:0000:0000:0000:0000:0000:0000:0001", input => "FF02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2::10", input => "0002:0000:0000:0000:0000:0000:0000:0010", ret => 1, }, { type => "op", name => "ipMatch", param => "0002:0000:0000:0000:0000:0000:0000:0010", input => "2::10", ret => 1, }, { type => "op", name => "ipMatch", param => "0002:0000:0000:0000:0000:0000:0000:0010", input => "0002:0000:0000:0000:0000:0000:0000:0010", ret => 1, }, { type => "op", name => "ipMatch", param => "2::10", input => "2::10", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02::1", input => "ff02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02:0000:0000:0000:0000:0000:0000:0001", input => "ff02::1", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02:0000:0000:0000:0000:0000:0000:0001", input => "ff02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02::1", input => "ff02::1", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/127", input => "fe80:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/127", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/127", input => "fe80:0000:0000:0000:0000:0000:0000:0002", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/127", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/26", input => "fe80:003f:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/26", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/26", input => "fe80:0040:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/26", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2002::", input => "2002:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2002:0000:0000:0000:0000:0000:0000:0000", input => "2002::", ret => 1, }, { type => "op", name => "ipMatch", param => "2002:0000:0000:0000:0000:0000:0000:0000", input => "2002:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::", input => "2002::", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/52", input => "2002:0000:0000:0fff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/52", input => "2002:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/52", input => "2002:0000:0000:1000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "2002::/52", input => "2001:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2002::/110", input => "2002:0000:0000:0000:0000:0000:0003:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/110", input => "2002:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/110", input => "2002:0000:0000:0000:0000:0000:0004:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "2002::/110", input => "2001:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:db8::", input => "2001:0db8:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:0000:0000", input => "2001:db8::", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:0000:0000", input => "2001:0db8:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::", input => "2001:db8::", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::/113", input => "2001:0db8:0000:0000:0000:0000:0000:7fff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::/113", input => "2001:0db8:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::/113", input => "2001:0db8:0000:0000:0000:0000:0000:8000", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:db8::/113", input => "2001:0db7:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234::", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::", input => "2001:0db8:1234::", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/81", input => "2001:0db8:1234:0000:0000:7fff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/81", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/81", input => "2001:0db8:1234:0000:0000:8000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/81", input => "2001:0db8:1233:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/106", input => "2001:0db8:1234:0000:0000:0000:003f:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/106", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/106", input => "2001:0db8:1234:0000:0000:0000:0040:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/106", input => "2001:0db8:1233:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "::ffff:0:0", input => "0000:0000:0000:0000:0000:ffff:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0000:0000", input => "::ffff:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0000:0000", input => "0000:0000:0000:0000:0000:ffff:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:0:0", input => "::ffff:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6:7:8", input => "0001:0002:0003:0004:0005:0006:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0007:0008", input => "1:2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0007:0008", input => "0001:0002:0003:0004:0005:0006:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6:7:8", input => "1:2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::8", input => "0001:0002:0003:0004:0005:0006:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0000:0008", input => "1:2:3:4:5:6::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0000:0008", input => "0001:0002:0003:0004:0005:0006:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::8", input => "1:2:3:4:5:6::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::8", input => "0001:0002:0003:0004:0005:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0000:0008", input => "1:2:3:4:5::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0000:0008", input => "0001:0002:0003:0004:0005:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::8", input => "1:2:3:4:5::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::8", input => "0001:0002:0003:0004:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0000:0008", input => "1:2:3:4::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0000:0008", input => "0001:0002:0003:0004:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::8", input => "1:2:3:4::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::8", input => "0001:0002:0003:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0000:0008", input => "1:2:3::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0000:0008", input => "0001:0002:0003:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::8", input => "1:2:3::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::8", input => "0001:0002:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0000:0008", input => "1:2::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0000:0008", input => "0001:0002:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::8", input => "1:2::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1::8", input => "0001:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0008", input => "1::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0008", input => "0001:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1::8", input => "1::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5:6:7", input => "0001:0000:0002:0003:0004:0005:0006:0007", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0002:0003:0004:0005:0006:0007", input => "1::2:3:4:5:6:7", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0002:0003:0004:0005:0006:0007", input => "0001:0000:0002:0003:0004:0005:0006:0007", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5:6:7", input => "1::2:3:4:5:6:7", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5:6", input => "0001:0000:0000:0002:0003:0004:0005:0006", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0002:0003:0004:0005:0006", input => "1::2:3:4:5:6", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0002:0003:0004:0005:0006", input => "0001:0000:0000:0002:0003:0004:0005:0006", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5:6", input => "1::2:3:4:5:6", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5", input => "0001:0000:0000:0000:0002:0003:0004:0005", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0002:0003:0004:0005", input => "1::2:3:4:5", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0002:0003:0004:0005", input => "0001:0000:0000:0000:0002:0003:0004:0005", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5", input => "1::2:3:4:5", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4", input => "0001:0000:0000:0000:0000:0002:0003:0004", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0002:0003:0004", input => "1::2:3:4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0002:0003:0004", input => "0001:0000:0000:0000:0000:0002:0003:0004", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4", input => "1::2:3:4", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3", input => "0001:0000:0000:0000:0000:0000:0002:0003", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0002:0003", input => "1::2:3", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0002:0003", input => "0001:0000:0000:0000:0000:0000:0002:0003", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3", input => "1::2:3", ret => 1, }, { type => "op", name => "ipMatch", param => "1::8", input => "0001:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0008", input => "1::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0008", input => "0001:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1::8", input => "1::8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7:8", input => "::2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7:8", input => "::2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7:8", input => "::2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7:8", input => "::2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7", input => "0000:0000:0002:0003:0004:0005:0006:0007", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0002:0003:0004:0005:0006:0007", input => "::2:3:4:5:6:7", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0002:0003:0004:0005:0006:0007", input => "0000:0000:0002:0003:0004:0005:0006:0007", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7", input => "::2:3:4:5:6:7", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6", input => "0000:0000:0000:0002:0003:0004:0005:0006", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0002:0003:0004:0005:0006", input => "::2:3:4:5:6", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0002:0003:0004:0005:0006", input => "0000:0000:0000:0002:0003:0004:0005:0006", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6", input => "::2:3:4:5:6", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5", input => "0000:0000:0000:0000:0002:0003:0004:0005", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0002:0003:0004:0005", input => "::2:3:4:5", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0002:0003:0004:0005", input => "0000:0000:0000:0000:0002:0003:0004:0005", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5", input => "::2:3:4:5", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4", input => "0000:0000:0000:0000:0000:0002:0003:0004", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0002:0003:0004", input => "::2:3:4", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0002:0003:0004", input => "0000:0000:0000:0000:0000:0002:0003:0004", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4", input => "::2:3:4", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3", input => "0000:0000:0000:0000:0000:0000:0002:0003", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0002:0003", input => "::2:3", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0002:0003", input => "0000:0000:0000:0000:0000:0000:0002:0003", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3", input => "::2:3", ret => 1, }, { type => "op", name => "ipMatch", param => "::8", input => "0000:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0008", input => "::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0008", input => "0000:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "::8", input => "::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::", input => "0001:0002:0003:0004:0005:0006:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0000:0000", input => "1:2:3:4:5:6::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0000:0000", input => "0001:0002:0003:0004:0005:0006:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::", input => "1:2:3:4:5:6::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::", input => "0001:0002:0003:0004:0005:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0000:0000", input => "1:2:3:4:5::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0000:0000", input => "0001:0002:0003:0004:0005:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::", input => "1:2:3:4:5::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::/116", input => "0001:0002:0003:0004:0005:0000:0000:0fff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::/116", input => "0001:0002:0003:0004:0005:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::/116", input => "0001:0002:0003:0004:0005:0000:0000:1000", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::/116", input => "0001:0002:0003:0004:0004:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::/109", input => "0001:0002:0003:0004:0005:0000:0007:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::/109", input => "0001:0002:0003:0004:0005:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::/109", input => "0001:0002:0003:0004:0005:0000:0008:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::/109", input => "0001:0002:0003:0004:0004:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4::", input => "0001:0002:0003:0004:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0000:0000", input => "1:2:3:4::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0000:0000", input => "0001:0002:0003:0004:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::", input => "1:2:3:4::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::", input => "0001:0002:0003:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0000:0000", input => "1:2:3::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0000:0000", input => "0001:0002:0003:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::", input => "1:2:3::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::/117", input => "0001:0002:0003:0000:0000:0000:0000:07ff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::/117", input => "0001:0002:0003:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::/117", input => "0001:0002:0003:0000:0000:0000:0000:0800", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3::/117", input => "0001:0002:0002:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3::/119", input => "0001:0002:0003:0000:0000:0000:0000:01ff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::/119", input => "0001:0002:0003:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::/119", input => "0001:0002:0003:0000:0000:0000:0000:0200", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3::/119", input => "0001:0002:0002:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2::", input => "0001:0002:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0000:0000", input => "1:2::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0000:0000", input => "0001:0002:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::", input => "1:2::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::/126", input => "0001:0002:0000:0000:0000:0000:0000:0003", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::/126", input => "0001:0002:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::/126", input => "0001:0002:0000:0000:0000:0000:0000:0004", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2::/126", input => "0001:0001:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2::/76", input => "0001:0002:0000:0000:000f:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::/76", input => "0001:0002:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::/76", input => "0001:0002:0000:0000:0010:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2::/76", input => "0001:0001:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1::", input => "0001:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0000", input => "1::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0000", input => "0001:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1::", input => "1::", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/48", input => "0001:0000:0000:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/48", input => "0001:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/48", input => "0001:0000:0001:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1::/48", input => "0000:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1::/47", input => "0001:0000:0001:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/47", input => "0001:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/47", input => "0001:0000:0002:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1::/47", input => "0000:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::7:8", input => "0001:0002:0003:0004:0005:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0007:0008", input => "1:2:3:4:5::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0007:0008", input => "0001:0002:0003:0004:0005:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::7:8", input => "1:2:3:4:5::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::7:8", input => "0001:0002:0003:0004:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0007:0008", input => "1:2:3:4::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0007:0008", input => "0001:0002:0003:0004:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::7:8", input => "1:2:3:4::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::7:8", input => "0001:0002:0003:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0007:0008", input => "1:2:3::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0007:0008", input => "0001:0002:0003:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::7:8", input => "1:2:3::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::7:8", input => "0001:0002:0000:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0007:0008", input => "1:2::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0007:0008", input => "0001:0002:0000:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::7:8", input => "1:2::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1::7:8", input => "0001:0000:0000:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0007:0008", input => "1::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0007:0008", input => "0001:0000:0000:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1::7:8", input => "1::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1::7:8/127", input => "0001:0000:0000:0000:0000:0000:0007:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "1::7:8/127", input => "0001:0000:0000:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1::7:8/127", input => "0001:0000:0000:0000:0000:0000:0007:000a", ret => 0, }, { type => "op", name => "ipMatch", param => "1::7:8/127", input => "0001:0000:0000:0000:0000:0000:0007:0007", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6:1.2.3.4", input => "0001:0002:0003:0004:0005:0006:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0102:0304", input => "1:2:3:4:5:6:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0102:0304", input => "0001:0002:0003:0004:0005:0006:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6:1.2.3.4", input => "1:2:3:4:5:6:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::1.2.3.4", input => "0001:0002:0003:0004:0005:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0102:0304", input => "1:2:3:4:5::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0102:0304", input => "0001:0002:0003:0004:0005:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::1.2.3.4", input => "1:2:3:4:5::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::1.2.3.4", input => "0001:0002:0003:0004:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0102:0304", input => "1:2:3:4::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0102:0304", input => "0001:0002:0003:0004:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::1.2.3.4", input => "1:2:3:4::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::1.2.3.4", input => "0001:0002:0003:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0102:0304", input => "1:2:3::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0102:0304", input => "0001:0002:0003:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::1.2.3.4", input => "1:2:3::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::1.2.3.4", input => "0001:0002:0000:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0102:0304", input => "1:2::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0102:0304", input => "0001:0002:0000:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::1.2.3.4", input => "1:2::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1::1.2.3.4", input => "0001:0000:0000:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0102:0304", input => "1::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0102:0304", input => "0001:0000:0000:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1::1.2.3.4", input => "1::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::5:1.2.3.4", input => "0001:0002:0003:0004:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0005:0102:0304", input => "1:2:3:4::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0005:0102:0304", input => "0001:0002:0003:0004:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::5:1.2.3.4", input => "1:2:3:4::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::5:1.2.3.4", input => "0001:0002:0003:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0005:0102:0304", input => "1:2:3::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0005:0102:0304", input => "0001:0002:0003:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::5:1.2.3.4", input => "1:2:3::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::5:1.2.3.4", input => "0001:0002:0000:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0005:0102:0304", input => "1:2::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0005:0102:0304", input => "0001:0002:0000:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::5:1.2.3.4", input => "1:2::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1::5:1.2.3.4", input => "0001:0000:0000:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0005:0102:0304", input => "1::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0005:0102:0304", input => "0001:0000:0000:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1::5:1.2.3.4", input => "1::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1::5:11.22.33.44", input => "0001:0000:0000:0000:0000:0005:0b16:212c", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0005:0b16:212c", input => "1::5:11.22.33.44", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0005:0b16:212c", input => "0001:0000:0000:0000:0000:0005:0b16:212c", ret => 1, }, { type => "op", name => "ipMatch", param => "1::5:11.22.33.44", input => "1::5:11.22.33.44", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::217:f2ff:254.7.237.98", input => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", input => "fe80::217:f2ff:254.7.237.98", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", input => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::217:f2ff:254.7.237.98", input => "fe80::217:f2ff:254.7.237.98", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.168.1.26", input => "0000:0000:0000:0000:0000:ffff:c0a8:011a", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c0a8:011a", input => "::ffff:192.168.1.26", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c0a8:011a", input => "0000:0000:0000:0000:0000:ffff:c0a8:011a", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.168.1.26", input => "::ffff:192.168.1.26", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.168.1.1", input => "0000:0000:0000:0000:0000:ffff:c0a8:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c0a8:0101", input => "::ffff:192.168.1.1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c0a8:0101", input => "0000:0000:0000:0000:0000:ffff:c0a8:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.168.1.1", input => "::ffff:192.168.1.1", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:13.1.68.3", input => "0000:0000:0000:0000:0000:0000:0d01:4403", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0d01:4403", input => "0:0:0:0:0:0:13.1.68.3", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0d01:4403", input => "0000:0000:0000:0000:0000:0000:0d01:4403", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:13.1.68.3", input => "0:0:0:0:0:0:13.1.68.3", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:FFFF:129.144.52.38", input => "0000:0000:0000:0000:0000:ffff:8190:3426", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:8190:3426", input => "0:0:0:0:0:FFFF:129.144.52.38", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:8190:3426", input => "0000:0000:0000:0000:0000:ffff:8190:3426", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:FFFF:129.144.52.38", input => "0:0:0:0:0:FFFF:129.144.52.38", ret => 1, }, { type => "op", name => "ipMatch", param => "::13.1.68.3", input => "0000:0000:0000:0000:0000:0000:0d01:4403", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0d01:4403", input => "::13.1.68.3", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0d01:4403", input => "0000:0000:0000:0000:0000:0000:0d01:4403", ret => 1, }, { type => "op", name => "ipMatch", param => "::13.1.68.3", input => "::13.1.68.3", ret => 1, }, { type => "op", name => "ipMatch", param => "::FFFF:129.144.52.38", input => "0000:0000:0000:0000:0000:ffff:8190:3426", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:8190:3426", input => "::FFFF:129.144.52.38", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:8190:3426", input => "0000:0000:0000:0000:0000:ffff:8190:3426", ret => 1, }, { type => "op", name => "ipMatch", param => "::FFFF:129.144.52.38", input => "::FFFF:129.144.52.38", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0:0:0:204:61ff:254.157.241.86", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0:0:0:204:61ff:254.157.241.86", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0:0:0:204:61ff:254.157.241.86", input => "fe80:0:0:0:204:61ff:254.157.241.86", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::204:61ff:254.157.241.86", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80::204:61ff:254.157.241.86", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::204:61ff:254.157.241.86", input => "fe80::204:61ff:254.157.241.86", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:12.34.56.78", input => "0000:0000:0000:0000:0000:ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0c22:384e", input => "::ffff:12.34.56.78", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0c22:384e", input => "0000:0000:0000:0000:0000:ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:12.34.56.78", input => "::ffff:12.34.56.78", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.0.2.128", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c000:0280", input => "::ffff:192.0.2.128", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c000:0280", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.0.2.128", input => "::ffff:192.0.2.128", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.0.2.128/124", input => "0000:0000:0000:0000:0000:ffff:c000:028f", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.0.2.128/124", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.0.2.128/124", input => "0000:0000:0000:0000:0000:ffff:c000:0290", ret => 0, }, { type => "op", name => "ipMatch", param => "::ffff:192.0.2.128/124", input => "0000:0000:0000:0000:0000:ffff:c000:027f", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0:0:0:204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0:0:0:204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0:0:0:204:61ff:fe9d:f156", input => "fe80:0:0:0:204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80::204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::204:61ff:fe9d:f156", input => "fe80::204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/70", input => "fe80:0000:0000:0000:03ff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/70", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/70", input => "fe80:0000:0000:0000:0400:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/70", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/76", input => "fe80:0000:0000:0000:000f:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/76", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/76", input => "fe80:0000:0000:0000:0010:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/76", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::1", input => "fe80:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0001", input => "fe80::1", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0001", input => "fe80:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::1", input => "fe80::1", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:c000:280", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c000:0280", input => "::ffff:c000:280", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c000:0280", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:c000:280", input => "::ffff:c000:280", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:85a3:0:0:8a2e:370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:db8:85a3:0:0:8a2e:370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:85a3:0:0:8a2e:370:7334", input => "2001:db8:85a3:0:0:8a2e:370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:85a3::8a2e:370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:db8:85a3::8a2e:370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:85a3::8a2e:370:7334", input => "2001:db8:85a3::8a2e:370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000::1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000::1428:57ab", input => "2001:0db8:0000:0000:0000::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0:0:0:0:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0:0:0:0:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0:0:0:0:1428:57ab", input => "2001:0db8:0:0:0:0:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0:0::1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0:0::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0:0::1428:57ab", input => "2001:0db8:0:0::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8::1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8::1428:57ab", input => "2001:0db8::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:db8::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::1428:57ab", input => "2001:db8::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:0c22:384e", input => "0000:0000:0000:0000:0000:ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0c22:384e", input => "::ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0c22:384e", input => "0000:0000:0000:0000:0000:ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:0c22:384e", input => "::ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", input => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", input => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", input => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", input => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:a::123", input => "2001:0db8:000a:0000:0000:0000:0000:0123", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:000a:0000:0000:0000:0000:0123", input => "2001:db8:a::123", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:000a:0000:0000:0000:0000:0123", input => "2001:0db8:000a:0000:0000:0000:0000:0123", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:a::123", input => "2001:db8:a::123", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/52", input => "fe80:0000:0000:0fff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/52", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/52", input => "fe80:0000:0000:1000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/52", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/9", input => "feff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/9", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/9", input => "ff00:0000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/9", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777:8888", input => "1111:2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777:8888", input => "1111:2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777:8888", input => "1111:2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777:8888", input => "1111:2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777::", input => "1111:2222:3333:4444:5555:6666:7777::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777::", input => "1111:2222:3333:4444:5555:6666:7777::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777::", input => "1111:2222:3333:4444:5555:6666:7777::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777::", input => "1111:2222:3333:4444:5555:6666:7777::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::", input => "1111:2222:3333:4444:5555:6666:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:0000:0000", input => "1111:2222:3333:4444:5555:6666::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:0000:0000", input => "1111:2222:3333:4444:5555:6666:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::", input => "1111:2222:3333:4444:5555:6666::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::/111", input => "1111:2222:3333:4444:5555:6666:0001:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::/111", input => "1111:2222:3333:4444:5555:6666:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::/111", input => "1111:2222:3333:4444:5555:6666:0002:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::/111", input => "1111:2222:3333:4444:5555:6665:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::", input => "1111:2222:3333:4444:5555:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:0000:0000", input => "1111:2222:3333:4444:5555::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:0000:0000", input => "1111:2222:3333:4444:5555:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::", input => "1111:2222:3333:4444:5555::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::", input => "1111:2222:3333:4444:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:0000:0000", input => "1111:2222:3333:4444::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:0000:0000", input => "1111:2222:3333:4444:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::", input => "1111:2222:3333:4444::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::", input => "1111:2222:3333:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:0000:0000", input => "1111:2222:3333::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:0000:0000", input => "1111:2222:3333:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::", input => "1111:2222:3333::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/55", input => "1111:2222:3333:01ff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/55", input => "1111:2222:3333:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/55", input => "1111:2222:3333:0200:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/55", input => "1111:2222:3332:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222::", input => "1111:2222:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:0000:0000", input => "1111:2222::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:0000:0000", input => "1111:2222:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::", input => "1111:2222::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::/111", input => "1111:2222:0000:0000:0000:0000:0001:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::/111", input => "1111:2222:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::/111", input => "1111:2222:0000:0000:0000:0000:0002:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222::/111", input => "1111:2221:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::", input => "1111:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:0000:0000", input => "1111::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:0000:0000", input => "1111:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::", input => "1111::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::/39", input => "1111:0000:01ff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::/39", input => "1111:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::/39", input => "1111:0000:0200:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::/39", input => "1110:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::8888", input => "1111:2222:3333:4444:5555:6666:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:0000:8888", input => "1111:2222:3333:4444:5555:6666::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:0000:8888", input => "1111:2222:3333:4444:5555:6666:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::8888", input => "1111:2222:3333:4444:5555:6666::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::8888", input => "1111:2222:3333:4444:5555:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:0000:8888", input => "1111:2222:3333:4444:5555::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:0000:8888", input => "1111:2222:3333:4444:5555:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::8888", input => "1111:2222:3333:4444:5555::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::8888", input => "1111:2222:3333:4444:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:0000:8888", input => "1111:2222:3333:4444::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:0000:8888", input => "1111:2222:3333:4444:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::8888", input => "1111:2222:3333:4444::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::8888", input => "1111:2222:3333:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:0000:8888", input => "1111:2222:3333::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:0000:8888", input => "1111:2222:3333:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::8888", input => "1111:2222:3333::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::8888", input => "1111:2222:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:0000:8888", input => "1111:2222::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:0000:8888", input => "1111:2222:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::8888", input => "1111:2222::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::8888", input => "1111:0000:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:0000:8888", input => "1111::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:0000:8888", input => "1111:0000:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::8888", input => "1111::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::8888", input => "0000:0000:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:8888", input => "::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:8888", input => "0000:0000:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::8888", input => "::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::7777:8888", input => "1111:2222:3333:4444:5555:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:7777:8888", input => "1111:2222:3333:4444:5555::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:7777:8888", input => "1111:2222:3333:4444:5555:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::7777:8888", input => "1111:2222:3333:4444:5555::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::7777:8888", input => "1111:2222:3333:4444:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:7777:8888", input => "1111:2222:3333:4444::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:7777:8888", input => "1111:2222:3333:4444:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::7777:8888", input => "1111:2222:3333:4444::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::7777:8888", input => "1111:2222:3333:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:7777:8888", input => "1111:2222:3333::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:7777:8888", input => "1111:2222:3333:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::7777:8888", input => "1111:2222:3333::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::7777:8888", input => "1111:2222:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:7777:8888", input => "1111:2222::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:7777:8888", input => "1111:2222:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::7777:8888", input => "1111:2222::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::7777:8888", input => "1111:0000:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:7777:8888", input => "1111::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:7777:8888", input => "1111:0000:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::7777:8888", input => "1111::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::7777:8888", input => "0000:0000:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:7777:8888", input => "::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:7777:8888", input => "0000:0000:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::7777:8888", input => "::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::7777:8888/125", input => "0000:0000:0000:0000:0000:0000:7777:888f", ret => 1, }, { type => "op", name => "ipMatch", param => "::7777:8888/125", input => "0000:0000:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::7777:8888/125", input => "0000:0000:0000:0000:0000:0000:7777:8890", ret => 0, }, { type => "op", name => "ipMatch", param => "::7777:8888/125", input => "0000:0000:0000:0000:0000:0000:7777:8887", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::6666:7777:8888", input => "1111:2222:3333:4444:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:6666:7777:8888", input => "1111:2222:3333:4444::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:6666:7777:8888", input => "1111:2222:3333:4444:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::6666:7777:8888", input => "1111:2222:3333:4444::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:7777:8888", input => "1111:2222:3333:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:6666:7777:8888", input => "1111:2222:3333::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:6666:7777:8888", input => "1111:2222:3333:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:7777:8888", input => "1111:2222:3333::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::6666:7777:8888", input => "1111:2222:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:6666:7777:8888", input => "1111:2222::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:6666:7777:8888", input => "1111:2222:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::6666:7777:8888", input => "1111:2222::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::6666:7777:8888", input => "1111:0000:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:6666:7777:8888", input => "1111::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:6666:7777:8888", input => "1111:0000:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::6666:7777:8888", input => "1111::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::6666:7777:8888", input => "0000:0000:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:6666:7777:8888", input => "::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:6666:7777:8888", input => "0000:0000:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::6666:7777:8888", input => "::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::5555:6666:7777:8888", input => "1111:2222:3333:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:5555:6666:7777:8888", input => "1111:2222:3333::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:5555:6666:7777:8888", input => "1111:2222:3333:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::5555:6666:7777:8888", input => "1111:2222:3333::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:7777:8888", input => "1111:2222:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:5555:6666:7777:8888", input => "1111:2222::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:5555:6666:7777:8888", input => "1111:2222:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:7777:8888", input => "1111:2222::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::5555:6666:7777:8888", input => "1111:0000:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:5555:6666:7777:8888", input => "1111::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:5555:6666:7777:8888", input => "1111:0000:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::5555:6666:7777:8888", input => "1111::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::5555:6666:7777:8888", input => "0000:0000:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:5555:6666:7777:8888", input => "::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:5555:6666:7777:8888", input => "0000:0000:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::5555:6666:7777:8888", input => "::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:7777:8888", input => "1111:2222:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:4444:5555:6666:7777:8888", input => "1111:2222::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:4444:5555:6666:7777:8888", input => "1111:2222:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:7777:8888", input => "1111:2222::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::4444:5555:6666:7777:8888", input => "1111:0000:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:4444:5555:6666:7777:8888", input => "1111::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:4444:5555:6666:7777:8888", input => "1111:0000:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::4444:5555:6666:7777:8888", input => "1111::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:7777:8888", input => "0000:0000:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:4444:5555:6666:7777:8888", input => "::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:4444:5555:6666:7777:8888", input => "0000:0000:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:7777:8888", input => "::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::3333:4444:5555:6666:7777:8888", input => "1111:0000:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:3333:4444:5555:6666:7777:8888", input => "1111::3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:3333:4444:5555:6666:7777:8888", input => "1111:0000:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::3333:4444:5555:6666:7777:8888", input => "1111::3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::3333:4444:5555:6666:7777:8888", input => "0000:0000:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:3333:4444:5555:6666:7777:8888", input => "::3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:3333:4444:5555:6666:7777:8888", input => "0000:0000:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::3333:4444:5555:6666:7777:8888", input => "::3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:7777:8888", input => "::2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:7777:8888", input => "::2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:7777:8888", input => "::2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:7777:8888", input => "::2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:123.123.123.123", input => "1111:2222:3333:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7b7b:7b7b", input => "1111:2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7b7b:7b7b", input => "1111:2222:3333:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:123.123.123.123", input => "1111:2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::123.123.123.123", input => "1111:2222:3333:4444:5555:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:7b7b:7b7b", input => "1111:2222:3333:4444:5555::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:7b7b:7b7b", input => "1111:2222:3333:4444:5555:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::123.123.123.123", input => "1111:2222:3333:4444:5555::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::123.123.123.123", input => "1111:2222:3333:4444:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:7b7b:7b7b", input => "1111:2222:3333:4444::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:7b7b:7b7b", input => "1111:2222:3333:4444:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::123.123.123.123", input => "1111:2222:3333:4444::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::123.123.123.123", input => "1111:2222:3333:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:7b7b:7b7b", input => "1111:2222:3333::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:7b7b:7b7b", input => "1111:2222:3333:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::123.123.123.123", input => "1111:2222:3333::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::123.123.123.123", input => "1111:2222:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:7b7b:7b7b", input => "1111:2222::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:7b7b:7b7b", input => "1111:2222:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::123.123.123.123", input => "1111:2222::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::123.123.123.123", input => "1111:0000:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:7b7b:7b7b", input => "1111::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:7b7b:7b7b", input => "1111:0000:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::123.123.123.123", input => "1111::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::123.123.123.123", input => "0000:0000:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:7b7b:7b7b", input => "::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:7b7b:7b7b", input => "0000:0000:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "::123.123.123.123", input => "::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::6666:123.123.123.123", input => "1111:2222:3333:4444:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:6666:7b7b:7b7b", input => "1111:2222:3333:4444::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:6666:7b7b:7b7b", input => "1111:2222:3333:4444:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::6666:123.123.123.123", input => "1111:2222:3333:4444::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:123.123.123.123", input => "1111:2222:3333:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:6666:7b7b:7b7b", input => "1111:2222:3333::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:6666:7b7b:7b7b", input => "1111:2222:3333:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:123.123.123.123", input => "1111:2222:3333::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::6666:123.123.123.123", input => "1111:2222:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:6666:7b7b:7b7b", input => "1111:2222::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:6666:7b7b:7b7b", input => "1111:2222:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::6666:123.123.123.123", input => "1111:2222::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::6666:123.123.123.123", input => "1111:0000:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:6666:7b7b:7b7b", input => "1111::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:6666:7b7b:7b7b", input => "1111:0000:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::6666:123.123.123.123", input => "1111::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::6666:123.123.123.123", input => "0000:0000:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:6666:7b7b:7b7b", input => "::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:6666:7b7b:7b7b", input => "0000:0000:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "::6666:123.123.123.123", input => "::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::5555:6666:123.123.123.123", input => "1111:2222:3333:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:5555:6666:7b7b:7b7b", input => "1111:2222:3333::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:5555:6666:7b7b:7b7b", input => "1111:2222:3333:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::5555:6666:123.123.123.123", input => "1111:2222:3333::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:123.123.123.123", input => "1111:2222:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:5555:6666:7b7b:7b7b", input => "1111:2222::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:5555:6666:7b7b:7b7b", input => "1111:2222:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:123.123.123.123", input => "1111:2222::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::5555:6666:123.123.123.123", input => "1111:0000:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:5555:6666:7b7b:7b7b", input => "1111::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:5555:6666:7b7b:7b7b", input => "1111:0000:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::5555:6666:123.123.123.123", input => "1111::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::5555:6666:123.123.123.123", input => "0000:0000:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:5555:6666:7b7b:7b7b", input => "::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:5555:6666:7b7b:7b7b", input => "0000:0000:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "::5555:6666:123.123.123.123", input => "::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:123.123.123.123", input => "1111:2222:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:4444:5555:6666:7b7b:7b7b", input => "1111:2222::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:4444:5555:6666:7b7b:7b7b", input => "1111:2222:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:123.123.123.123", input => "1111:2222::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::4444:5555:6666:123.123.123.123", input => "1111:0000:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:4444:5555:6666:7b7b:7b7b", input => "1111::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:4444:5555:6666:7b7b:7b7b", input => "1111:0000:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::4444:5555:6666:123.123.123.123", input => "1111::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:123.123.123.123", input => "0000:0000:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:4444:5555:6666:7b7b:7b7b", input => "::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:4444:5555:6666:7b7b:7b7b", input => "0000:0000:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:123.123.123.123", input => "::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::3333:4444:5555:6666:123.123.123.123", input => "1111:0000:3333:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:3333:4444:5555:6666:7b7b:7b7b", input => "1111::3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:3333:4444:5555:6666:7b7b:7b7b", input => "1111:0000:3333:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::3333:4444:5555:6666:123.123.123.123", input => "1111::3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:123.123.123.123", input => "::2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:123.123.123.123", input => "::2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:123.123.123.123", input => "::2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:123.123.123.123", input => "::2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0:0", input => "::0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0:0", input => "::0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0:0", input => "::0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0:0", input => "::0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0", input => "::0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/52", input => "0000:0000:0000:0fff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/52", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/52", input => "0000:0000:0000:1000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/52", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/51", input => "0000:0000:0000:1fff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/51", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/51", input => "0000:0000:0000:2000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/51", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0", input => "::0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/48", input => "0000:0000:0000:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/48", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/48", input => "0000:0000:0001:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/48", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/28", input => "0000:000f:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/28", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/28", input => "0000:0010:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/28", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0", input => "::0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/34", input => "0000:0000:3fff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/34", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/34", input => "0000:0000:4000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/34", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/64", input => "0000:0000:0000:0000:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/64", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/64", input => "0000:0000:0000:0001:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/64", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0", input => "::0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/35", input => "0000:0000:1fff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/35", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/35", input => "0000:0000:2000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0/35", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/16", input => "0000:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/16", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/16", input => "0001:0000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0/16", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0", input => "::0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/94", input => "0000:0000:0000:0000:0000:0003:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/94", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/94", input => "0000:0000:0000:0000:0000:0004:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0/94", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/64", input => "0000:0000:0000:0000:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/64", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/64", input => "0000:0000:0000:0001:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0/64", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0", input => "::0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/74", input => "0000:0000:0000:0000:003f:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/74", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/74", input => "0000:0000:0000:0000:0040:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0/74", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/18", input => "0000:3fff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/18", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/18", input => "0000:4000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0/18", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0::", input => "0:0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0::", input => "0:0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0::", input => "0:0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0::", input => "0:0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::", input => "0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/118", input => "0000:0000:0000:0000:0000:0000:0000:03ff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/118", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/118", input => "0000:0000:0000:0000:0000:0000:0000:0400", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/118", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/121", input => "0000:0000:0000:0000:0000:0000:0000:007f", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/121", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/121", input => "0000:0000:0000:0000:0000:0000:0000:0080", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/121", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::", input => "0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/51", input => "0000:0000:0000:1fff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/51", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/51", input => "0000:0000:0000:2000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/51", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/91", input => "0000:0000:0000:0000:0000:001f:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/91", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/91", input => "0000:0000:0000:0000:0000:0020:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/91", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::", input => "0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/4", input => "0fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/4", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/4", input => "1000:0000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/4", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/6", input => "03ff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/6", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/6", input => "0400:0000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/6", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::", input => "0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/44", input => "0000:0000:000f:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/44", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/44", input => "0000:0000:0010:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0::/44", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/4", input => "0fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/4", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/4", input => "1000:0000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0::/4", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::", input => "0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/80", input => "0000:0000:0000:0000:0000:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/80", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/80", input => "0000:0000:0000:0000:0001:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0::/80", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/87", input => "0000:0000:0000:0000:0000:01ff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/87", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/87", input => "0000:0000:0000:0000:0000:0200:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0::/87", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0::", input => "0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/58", input => "0000:0000:0000:003f:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/58", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/58", input => "0000:0000:0000:0040:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0::/58", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/78", input => "0000:0000:0000:0000:0003:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/78", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/78", input => "0000:0000:0000:0000:0004:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0::/78", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:a:b:c:d:e:f::", input => "0:a:b:c:d:e:f::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:a:b:c:d:e:f::", input => "0:a:b:c:d:e:f::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:a:b:c:d:e:f::", input => "0:a:b:c:d:e:f::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:a:b:c:d:e:f::", input => "0:a:b:c:d:e:f::", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:a:b:c:d:e:f", input => "::0:a:b:c:d:e:f", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:a:b:c:d:e:f", input => "::0:a:b:c:d:e:f", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:a:b:c:d:e:f", input => "::0:a:b:c:d:e:f", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:a:b:c:d:e:f", input => "::0:a:b:c:d:e:f", ret => 1, }, { type => "op", name => "ipMatch", param => "a:b:c:d:e:f:0::", input => "a:b:c:d:e:f:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "a:b:c:d:e:f:0::", input => "a:b:c:d:e:f:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "a:b:c:d:e:f:0::", input => "a:b:c:d:e:f:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "a:b:c:d:e:f:0::", input => "a:b:c:d:e:f:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0:1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0:0:0:0:0:0:0:1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0:1", input => "0:0:0:0:0:0:0:1", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0:0", input => "0:0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:DB8:0:0:8:800:200C:417A", input => "2001:0db8:0000:0000:0008:0800:200c:417a", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0008:0800:200c:417a", input => "2001:DB8:0:0:8:800:200C:417A", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0008:0800:200c:417a", input => "2001:0db8:0000:0000:0008:0800:200c:417a", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:DB8:0:0:8:800:200C:417A", input => "2001:DB8:0:0:8:800:200C:417A", ret => 1, }, { type => "op", name => "ipMatch", param => "FF01:0:0:0:0:0:0:101", input => "ff01:0000:0000:0000:0000:0000:0000:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "ff01:0000:0000:0000:0000:0000:0000:0101", input => "FF01:0:0:0:0:0:0:101", ret => 1, }, { type => "op", name => "ipMatch", param => "ff01:0000:0000:0000:0000:0000:0000:0101", input => "ff01:0000:0000:0000:0000:0000:0000:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "FF01:0:0:0:0:0:0:101", input => "FF01:0:0:0:0:0:0:101", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:DB8::8:800:200C:417A", input => "2001:0db8:0000:0000:0008:0800:200c:417a", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0008:0800:200c:417a", input => "2001:DB8::8:800:200C:417A", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0008:0800:200c:417a", input => "2001:0db8:0000:0000:0008:0800:200c:417a", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:DB8::8:800:200C:417A", input => "2001:DB8::8:800:200C:417A", ret => 1, }, { type => "op", name => "ipMatch", param => "FF01::101", input => "ff01:0000:0000:0000:0000:0000:0000:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "ff01:0000:0000:0000:0000:0000:0000:0101", input => "FF01::101", ret => 1, }, { type => "op", name => "ipMatch", param => "ff01:0000:0000:0000:0000:0000:0000:0101", input => "ff01:0000:0000:0000:0000:0000:0000:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "FF01::101", input => "FF01::101", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::217:f2ff:fe07:ed62", input => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", input => "fe80::217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", input => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::217:f2ff:fe07:ed62", input => "fe80::217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0000:1234:0000:0000:C1C0:ABCD:0876", input => "2001:0000:1234:0000:0000:c1c0:abcd:0876", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0000:1234:0000:0000:c1c0:abcd:0876", input => "2001:0000:1234:0000:0000:C1C0:ABCD:0876", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0000:1234:0000:0000:c1c0:abcd:0876", input => "2001:0000:1234:0000:0000:c1c0:abcd:0876", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0000:1234:0000:0000:C1C0:ABCD:0876", input => "2001:0000:1234:0000:0000:C1C0:ABCD:0876", ret => 1, }, { type => "op", name => "ipMatch", param => "3ffe:0b00:0000:0000:0001:0000:0000:000a", input => "3ffe:0b00:0000:0000:0001:0000:0000:000a", ret => 1, }, { type => "op", name => "ipMatch", param => "3ffe:0b00:0000:0000:0001:0000:0000:000a", input => "3ffe:0b00:0000:0000:0001:0000:0000:000a", ret => 1, }, { type => "op", name => "ipMatch", param => "3ffe:0b00:0000:0000:0001:0000:0000:000a", input => "3ffe:0b00:0000:0000:0001:0000:0000:000a", ret => 1, }, { type => "op", name => "ipMatch", param => "3ffe:0b00:0000:0000:0001:0000:0000:000a", input => "3ffe:0b00:0000:0000:0001:0000:0000:000a", ret => 1, }, { type => "op", name => "ipMatch", param => "FF02:0000:0000:0000:0000:0000:0000:0001", input => "ff02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02:0000:0000:0000:0000:0000:0000:0001", input => "FF02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02:0000:0000:0000:0000:0000:0000:0001", input => "ff02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "FF02:0000:0000:0000:0000:0000:0000:0001", input => "FF02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2::10", input => "0002:0000:0000:0000:0000:0000:0000:0010", ret => 1, }, { type => "op", name => "ipMatch", param => "0002:0000:0000:0000:0000:0000:0000:0010", input => "2::10", ret => 1, }, { type => "op", name => "ipMatch", param => "0002:0000:0000:0000:0000:0000:0000:0010", input => "0002:0000:0000:0000:0000:0000:0000:0010", ret => 1, }, { type => "op", name => "ipMatch", param => "2::10", input => "2::10", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02::1", input => "ff02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02:0000:0000:0000:0000:0000:0000:0001", input => "ff02::1", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02:0000:0000:0000:0000:0000:0000:0001", input => "ff02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02::1", input => "ff02::1", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/94", input => "fe80:0000:0000:0000:0000:0003:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/94", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/94", input => "fe80:0000:0000:0000:0000:0004:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/94", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2002::", input => "2002:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2002:0000:0000:0000:0000:0000:0000:0000", input => "2002::", ret => 1, }, { type => "op", name => "ipMatch", param => "2002:0000:0000:0000:0000:0000:0000:0000", input => "2002:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::", input => "2002::", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/45", input => "2002:0000:0007:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/45", input => "2002:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/45", input => "2002:0000:0008:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "2002::/45", input => "2001:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2002::/103", input => "2002:0000:0000:0000:0000:0000:01ff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/103", input => "2002:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/103", input => "2002:0000:0000:0000:0000:0000:0200:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "2002::/103", input => "2001:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:db8::", input => "2001:0db8:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:0000:0000", input => "2001:db8::", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:0000:0000", input => "2001:0db8:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::", input => "2001:db8::", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::/118", input => "2001:0db8:0000:0000:0000:0000:0000:03ff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::/118", input => "2001:0db8:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::/118", input => "2001:0db8:0000:0000:0000:0000:0000:0400", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:db8::/118", input => "2001:0db7:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234::", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::", input => "2001:0db8:1234::", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/69", input => "2001:0db8:1234:0000:07ff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/69", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/69", input => "2001:0db8:1234:0000:0800:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/69", input => "2001:0db8:1233:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/110", input => "2001:0db8:1234:0000:0000:0000:0003:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/110", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/110", input => "2001:0db8:1234:0000:0000:0000:0004:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/110", input => "2001:0db8:1233:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "::ffff:0:0", input => "0000:0000:0000:0000:0000:ffff:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0000:0000", input => "::ffff:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0000:0000", input => "0000:0000:0000:0000:0000:ffff:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:0:0", input => "::ffff:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6:7:8", input => "0001:0002:0003:0004:0005:0006:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0007:0008", input => "1:2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0007:0008", input => "0001:0002:0003:0004:0005:0006:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6:7:8", input => "1:2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::8", input => "0001:0002:0003:0004:0005:0006:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0000:0008", input => "1:2:3:4:5:6::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0000:0008", input => "0001:0002:0003:0004:0005:0006:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::8", input => "1:2:3:4:5:6::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::8", input => "0001:0002:0003:0004:0005:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0000:0008", input => "1:2:3:4:5::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0000:0008", input => "0001:0002:0003:0004:0005:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::8", input => "1:2:3:4:5::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::8", input => "0001:0002:0003:0004:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0000:0008", input => "1:2:3:4::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0000:0008", input => "0001:0002:0003:0004:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::8", input => "1:2:3:4::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::8", input => "0001:0002:0003:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0000:0008", input => "1:2:3::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0000:0008", input => "0001:0002:0003:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::8", input => "1:2:3::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::8", input => "0001:0002:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0000:0008", input => "1:2::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0000:0008", input => "0001:0002:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::8", input => "1:2::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1::8", input => "0001:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0008", input => "1::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0008", input => "0001:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1::8", input => "1::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5:6:7", input => "0001:0000:0002:0003:0004:0005:0006:0007", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0002:0003:0004:0005:0006:0007", input => "1::2:3:4:5:6:7", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0002:0003:0004:0005:0006:0007", input => "0001:0000:0002:0003:0004:0005:0006:0007", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5:6:7", input => "1::2:3:4:5:6:7", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5:6", input => "0001:0000:0000:0002:0003:0004:0005:0006", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0002:0003:0004:0005:0006", input => "1::2:3:4:5:6", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0002:0003:0004:0005:0006", input => "0001:0000:0000:0002:0003:0004:0005:0006", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5:6", input => "1::2:3:4:5:6", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5", input => "0001:0000:0000:0000:0002:0003:0004:0005", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0002:0003:0004:0005", input => "1::2:3:4:5", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0002:0003:0004:0005", input => "0001:0000:0000:0000:0002:0003:0004:0005", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5", input => "1::2:3:4:5", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4", input => "0001:0000:0000:0000:0000:0002:0003:0004", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0002:0003:0004", input => "1::2:3:4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0002:0003:0004", input => "0001:0000:0000:0000:0000:0002:0003:0004", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4", input => "1::2:3:4", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3", input => "0001:0000:0000:0000:0000:0000:0002:0003", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0002:0003", input => "1::2:3", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0002:0003", input => "0001:0000:0000:0000:0000:0000:0002:0003", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3", input => "1::2:3", ret => 1, }, { type => "op", name => "ipMatch", param => "1::8", input => "0001:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0008", input => "1::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0008", input => "0001:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1::8", input => "1::8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7:8", input => "::2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7:8", input => "::2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7:8", input => "::2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7:8", input => "::2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7", input => "0000:0000:0002:0003:0004:0005:0006:0007", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0002:0003:0004:0005:0006:0007", input => "::2:3:4:5:6:7", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0002:0003:0004:0005:0006:0007", input => "0000:0000:0002:0003:0004:0005:0006:0007", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7", input => "::2:3:4:5:6:7", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6", input => "0000:0000:0000:0002:0003:0004:0005:0006", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0002:0003:0004:0005:0006", input => "::2:3:4:5:6", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0002:0003:0004:0005:0006", input => "0000:0000:0000:0002:0003:0004:0005:0006", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6", input => "::2:3:4:5:6", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5", input => "0000:0000:0000:0000:0002:0003:0004:0005", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0002:0003:0004:0005", input => "::2:3:4:5", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0002:0003:0004:0005", input => "0000:0000:0000:0000:0002:0003:0004:0005", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5", input => "::2:3:4:5", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4", input => "0000:0000:0000:0000:0000:0002:0003:0004", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0002:0003:0004", input => "::2:3:4", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0002:0003:0004", input => "0000:0000:0000:0000:0000:0002:0003:0004", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4", input => "::2:3:4", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3", input => "0000:0000:0000:0000:0000:0000:0002:0003", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0002:0003", input => "::2:3", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0002:0003", input => "0000:0000:0000:0000:0000:0000:0002:0003", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3", input => "::2:3", ret => 1, }, { type => "op", name => "ipMatch", param => "::8", input => "0000:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0008", input => "::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0008", input => "0000:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "::8", input => "::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::", input => "0001:0002:0003:0004:0005:0006:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0000:0000", input => "1:2:3:4:5:6::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0000:0000", input => "0001:0002:0003:0004:0005:0006:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::", input => "1:2:3:4:5:6::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::", input => "0001:0002:0003:0004:0005:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0000:0000", input => "1:2:3:4:5::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0000:0000", input => "0001:0002:0003:0004:0005:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::", input => "1:2:3:4:5::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::", input => "0001:0002:0003:0004:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0000:0000", input => "1:2:3:4::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0000:0000", input => "0001:0002:0003:0004:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::", input => "1:2:3:4::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/68", input => "0001:0002:0003:0004:0fff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/68", input => "0001:0002:0003:0004:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/68", input => "0001:0002:0003:0004:1000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/68", input => "0001:0002:0003:0003:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/84", input => "0001:0002:0003:0004:0000:0fff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/84", input => "0001:0002:0003:0004:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/84", input => "0001:0002:0003:0004:0000:1000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/84", input => "0001:0002:0003:0003:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3::", input => "0001:0002:0003:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0000:0000", input => "1:2:3::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0000:0000", input => "0001:0002:0003:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::", input => "1:2:3::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::/116", input => "0001:0002:0003:0000:0000:0000:0000:0fff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::/116", input => "0001:0002:0003:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::/116", input => "0001:0002:0003:0000:0000:0000:0000:1000", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3::/116", input => "0001:0002:0002:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2::", input => "0001:0002:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0000:0000", input => "1:2::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0000:0000", input => "0001:0002:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::", input => "1:2::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::/59", input => "0001:0002:0000:001f:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::/59", input => "0001:0002:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::/59", input => "0001:0002:0000:0020:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2::/59", input => "0001:0001:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2::/119", input => "0001:0002:0000:0000:0000:0000:0000:01ff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::/119", input => "0001:0002:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::/119", input => "0001:0002:0000:0000:0000:0000:0000:0200", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2::/119", input => "0001:0001:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1::", input => "0001:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0000", input => "1::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0000", input => "0001:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1::", input => "1::", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/101", input => "0001:0000:0000:0000:0000:0000:07ff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/101", input => "0001:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/101", input => "0001:0000:0000:0000:0000:0000:0800:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1::/101", input => "0000:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1::/94", input => "0001:0000:0000:0000:0000:0003:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/94", input => "0001:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/94", input => "0001:0000:0000:0000:0000:0004:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1::/94", input => "0000:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::7:8", input => "0001:0002:0003:0004:0005:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0007:0008", input => "1:2:3:4:5::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0007:0008", input => "0001:0002:0003:0004:0005:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::7:8", input => "1:2:3:4:5::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::7:8", input => "0001:0002:0003:0004:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0007:0008", input => "1:2:3:4::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0007:0008", input => "0001:0002:0003:0004:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::7:8", input => "1:2:3:4::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::7:8", input => "0001:0002:0003:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0007:0008", input => "1:2:3::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0007:0008", input => "0001:0002:0003:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::7:8", input => "1:2:3::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::7:8/127", input => "0001:0002:0003:0000:0000:0000:0007:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::7:8/127", input => "0001:0002:0003:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::7:8/127", input => "0001:0002:0003:0000:0000:0000:0007:000a", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3::7:8/127", input => "0001:0002:0003:0000:0000:0000:0007:0007", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2::7:8", input => "0001:0002:0000:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0007:0008", input => "1:2::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0007:0008", input => "0001:0002:0000:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::7:8", input => "1:2::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1::7:8", input => "0001:0000:0000:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0007:0008", input => "1::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0007:0008", input => "0001:0000:0000:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1::7:8", input => "1::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6:1.2.3.4", input => "0001:0002:0003:0004:0005:0006:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0102:0304", input => "1:2:3:4:5:6:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0102:0304", input => "0001:0002:0003:0004:0005:0006:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6:1.2.3.4", input => "1:2:3:4:5:6:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::1.2.3.4", input => "0001:0002:0003:0004:0005:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0102:0304", input => "1:2:3:4:5::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0102:0304", input => "0001:0002:0003:0004:0005:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::1.2.3.4", input => "1:2:3:4:5::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::1.2.3.4", input => "0001:0002:0003:0004:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0102:0304", input => "1:2:3:4::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0102:0304", input => "0001:0002:0003:0004:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::1.2.3.4", input => "1:2:3:4::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::1.2.3.4", input => "0001:0002:0003:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0102:0304", input => "1:2:3::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0102:0304", input => "0001:0002:0003:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::1.2.3.4", input => "1:2:3::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::1.2.3.4", input => "0001:0002:0000:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0102:0304", input => "1:2::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0102:0304", input => "0001:0002:0000:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::1.2.3.4", input => "1:2::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::1.2.3.4/126", input => "0001:0002:0000:0000:0000:0000:0102:0307", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::1.2.3.4/126", input => "0001:0002:0000:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::1.2.3.4/126", input => "0001:0002:0000:0000:0000:0000:0102:0308", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2::1.2.3.4/126", input => "0001:0002:0000:0000:0000:0000:0102:0303", ret => 0, }, { type => "op", name => "ipMatch", param => "1::1.2.3.4", input => "0001:0000:0000:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0102:0304", input => "1::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0102:0304", input => "0001:0000:0000:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1::1.2.3.4", input => "1::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::5:1.2.3.4", input => "0001:0002:0003:0004:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0005:0102:0304", input => "1:2:3:4::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0005:0102:0304", input => "0001:0002:0003:0004:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::5:1.2.3.4", input => "1:2:3:4::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::5:1.2.3.4", input => "0001:0002:0003:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0005:0102:0304", input => "1:2:3::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0005:0102:0304", input => "0001:0002:0003:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::5:1.2.3.4", input => "1:2:3::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::5:1.2.3.4", input => "0001:0002:0000:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0005:0102:0304", input => "1:2::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0005:0102:0304", input => "0001:0002:0000:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::5:1.2.3.4", input => "1:2::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1::5:1.2.3.4", input => "0001:0000:0000:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0005:0102:0304", input => "1::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0005:0102:0304", input => "0001:0000:0000:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1::5:1.2.3.4", input => "1::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1::5:11.22.33.44", input => "0001:0000:0000:0000:0000:0005:0b16:212c", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0005:0b16:212c", input => "1::5:11.22.33.44", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0005:0b16:212c", input => "0001:0000:0000:0000:0000:0005:0b16:212c", ret => 1, }, { type => "op", name => "ipMatch", param => "1::5:11.22.33.44", input => "1::5:11.22.33.44", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::217:f2ff:254.7.237.98", input => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", input => "fe80::217:f2ff:254.7.237.98", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", input => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::217:f2ff:254.7.237.98", input => "fe80::217:f2ff:254.7.237.98", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.168.1.26", input => "0000:0000:0000:0000:0000:ffff:c0a8:011a", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c0a8:011a", input => "::ffff:192.168.1.26", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c0a8:011a", input => "0000:0000:0000:0000:0000:ffff:c0a8:011a", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.168.1.26", input => "::ffff:192.168.1.26", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.168.1.1", input => "0000:0000:0000:0000:0000:ffff:c0a8:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c0a8:0101", input => "::ffff:192.168.1.1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c0a8:0101", input => "0000:0000:0000:0000:0000:ffff:c0a8:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.168.1.1", input => "::ffff:192.168.1.1", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:13.1.68.3", input => "0000:0000:0000:0000:0000:0000:0d01:4403", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0d01:4403", input => "0:0:0:0:0:0:13.1.68.3", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0d01:4403", input => "0000:0000:0000:0000:0000:0000:0d01:4403", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:13.1.68.3", input => "0:0:0:0:0:0:13.1.68.3", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:FFFF:129.144.52.38", input => "0000:0000:0000:0000:0000:ffff:8190:3426", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:8190:3426", input => "0:0:0:0:0:FFFF:129.144.52.38", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:8190:3426", input => "0000:0000:0000:0000:0000:ffff:8190:3426", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:FFFF:129.144.52.38", input => "0:0:0:0:0:FFFF:129.144.52.38", ret => 1, }, { type => "op", name => "ipMatch", param => "::13.1.68.3", input => "0000:0000:0000:0000:0000:0000:0d01:4403", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0d01:4403", input => "::13.1.68.3", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0d01:4403", input => "0000:0000:0000:0000:0000:0000:0d01:4403", ret => 1, }, { type => "op", name => "ipMatch", param => "::13.1.68.3", input => "::13.1.68.3", ret => 1, }, { type => "op", name => "ipMatch", param => "::FFFF:129.144.52.38", input => "0000:0000:0000:0000:0000:ffff:8190:3426", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:8190:3426", input => "::FFFF:129.144.52.38", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:8190:3426", input => "0000:0000:0000:0000:0000:ffff:8190:3426", ret => 1, }, { type => "op", name => "ipMatch", param => "::FFFF:129.144.52.38", input => "::FFFF:129.144.52.38", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0:0:0:204:61ff:254.157.241.86", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0:0:0:204:61ff:254.157.241.86", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0:0:0:204:61ff:254.157.241.86", input => "fe80:0:0:0:204:61ff:254.157.241.86", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::204:61ff:254.157.241.86", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80::204:61ff:254.157.241.86", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::204:61ff:254.157.241.86", input => "fe80::204:61ff:254.157.241.86", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:12.34.56.78", input => "0000:0000:0000:0000:0000:ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0c22:384e", input => "::ffff:12.34.56.78", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0c22:384e", input => "0000:0000:0000:0000:0000:ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:12.34.56.78", input => "::ffff:12.34.56.78", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.0.2.128", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c000:0280", input => "::ffff:192.0.2.128", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c000:0280", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.0.2.128", input => "::ffff:192.0.2.128", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0:0:0:204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0:0:0:204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0:0:0:204:61ff:fe9d:f156", input => "fe80:0:0:0:204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80::204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::204:61ff:fe9d:f156", input => "fe80::204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/37", input => "fe80:0000:07ff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/37", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/37", input => "fe80:0000:0800:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/37", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::1", input => "fe80:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0001", input => "fe80::1", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0001", input => "fe80:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::1", input => "fe80::1", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:c000:280", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c000:0280", input => "::ffff:c000:280", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c000:0280", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:c000:280", input => "::ffff:c000:280", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:85a3:0:0:8a2e:370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:db8:85a3:0:0:8a2e:370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:85a3:0:0:8a2e:370:7334", input => "2001:db8:85a3:0:0:8a2e:370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:85a3::8a2e:370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:db8:85a3::8a2e:370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:85a3::8a2e:370:7334", input => "2001:db8:85a3::8a2e:370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000::1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000::1428:57ab", input => "2001:0db8:0000:0000:0000::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0:0:0:0:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0:0:0:0:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0:0:0:0:1428:57ab", input => "2001:0db8:0:0:0:0:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0:0::1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0:0::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0:0::1428:57ab", input => "2001:0db8:0:0::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8::1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8::1428:57ab", input => "2001:0db8::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:db8::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::1428:57ab", input => "2001:db8::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:0c22:384e", input => "0000:0000:0000:0000:0000:ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0c22:384e", input => "::ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0c22:384e", input => "0000:0000:0000:0000:0000:ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:0c22:384e", input => "::ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", input => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", input => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", input => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", input => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:a::123", input => "2001:0db8:000a:0000:0000:0000:0000:0123", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:000a:0000:0000:0000:0000:0123", input => "2001:db8:a::123", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:000a:0000:0000:0000:0000:0123", input => "2001:0db8:000a:0000:0000:0000:0000:0123", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:a::123", input => "2001:db8:a::123", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/92", input => "fe80:0000:0000:0000:0000:000f:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/92", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/92", input => "fe80:0000:0000:0000:0000:0010:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/92", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/35", input => "fe80:0000:1fff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/35", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/35", input => "fe80:0000:2000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/35", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777:8888", input => "1111:2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777:8888", input => "1111:2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777:8888", input => "1111:2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777:8888", input => "1111:2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777::", input => "1111:2222:3333:4444:5555:6666:7777::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777::", input => "1111:2222:3333:4444:5555:6666:7777::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777::", input => "1111:2222:3333:4444:5555:6666:7777::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777::", input => "1111:2222:3333:4444:5555:6666:7777::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::", input => "1111:2222:3333:4444:5555:6666:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:0000:0000", input => "1111:2222:3333:4444:5555:6666::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:0000:0000", input => "1111:2222:3333:4444:5555:6666:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::", input => "1111:2222:3333:4444:5555:6666::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::", input => "1111:2222:3333:4444:5555:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:0000:0000", input => "1111:2222:3333:4444:5555::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:0000:0000", input => "1111:2222:3333:4444:5555:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::", input => "1111:2222:3333:4444:5555::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::/95", input => "1111:2222:3333:4444:5555:0001:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::/95", input => "1111:2222:3333:4444:5555:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::/95", input => "1111:2222:3333:4444:5555:0002:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::/95", input => "1111:2222:3333:4444:5554:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::", input => "1111:2222:3333:4444:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:0000:0000", input => "1111:2222:3333:4444::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:0000:0000", input => "1111:2222:3333:4444:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::", input => "1111:2222:3333:4444::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::/72", input => "1111:2222:3333:4444:00ff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::/72", input => "1111:2222:3333:4444:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::/72", input => "1111:2222:3333:4444:0100:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::/72", input => "1111:2222:3333:4443:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::", input => "1111:2222:3333:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:0000:0000", input => "1111:2222:3333::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:0000:0000", input => "1111:2222:3333:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::", input => "1111:2222:3333::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/93", input => "1111:2222:3333:0000:0000:0007:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/93", input => "1111:2222:3333:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/93", input => "1111:2222:3333:0000:0000:0008:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/93", input => "1111:2222:3332:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222::", input => "1111:2222:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:0000:0000", input => "1111:2222::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:0000:0000", input => "1111:2222:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::", input => "1111:2222::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::/109", input => "1111:2222:0000:0000:0000:0000:0007:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::/109", input => "1111:2222:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::/109", input => "1111:2222:0000:0000:0000:0000:0008:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222::/109", input => "1111:2221:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222::/119", input => "1111:2222:0000:0000:0000:0000:0000:01ff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::/119", input => "1111:2222:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::/119", input => "1111:2222:0000:0000:0000:0000:0000:0200", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222::/119", input => "1111:2221:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::", input => "1111:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:0000:0000", input => "1111::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:0000:0000", input => "1111:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::", input => "1111::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::/36", input => "1111:0000:0fff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::/36", input => "1111:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::/36", input => "1111:0000:1000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::/36", input => "1110:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::/86", input => "1111:0000:0000:0000:0000:03ff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::/86", input => "1111:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::/86", input => "1111:0000:0000:0000:0000:0400:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::/86", input => "1110:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::8888", input => "1111:2222:3333:4444:5555:6666:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:0000:8888", input => "1111:2222:3333:4444:5555:6666::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:0000:8888", input => "1111:2222:3333:4444:5555:6666:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::8888", input => "1111:2222:3333:4444:5555:6666::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::8888/125", input => "1111:2222:3333:4444:5555:6666:0000:888f", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::8888/125", input => "1111:2222:3333:4444:5555:6666:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::8888/125", input => "1111:2222:3333:4444:5555:6666:0000:8890", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::8888/125", input => "1111:2222:3333:4444:5555:6666:0000:8887", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::8888", input => "1111:2222:3333:4444:5555:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:0000:8888", input => "1111:2222:3333:4444:5555::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:0000:8888", input => "1111:2222:3333:4444:5555:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::8888", input => "1111:2222:3333:4444:5555::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::8888", input => "1111:2222:3333:4444:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:0000:8888", input => "1111:2222:3333:4444::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:0000:8888", input => "1111:2222:3333:4444:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::8888", input => "1111:2222:3333:4444::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::8888", input => "1111:2222:3333:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:0000:8888", input => "1111:2222:3333::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:0000:8888", input => "1111:2222:3333:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::8888", input => "1111:2222:3333::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::8888", input => "1111:2222:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:0000:8888", input => "1111:2222::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:0000:8888", input => "1111:2222:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::8888", input => "1111:2222::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::8888", input => "1111:0000:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:0000:8888", input => "1111::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:0000:8888", input => "1111:0000:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::8888", input => "1111::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::8888", input => "0000:0000:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:8888", input => "::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:8888", input => "0000:0000:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::8888", input => "::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::7777:8888", input => "1111:2222:3333:4444:5555:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:7777:8888", input => "1111:2222:3333:4444:5555::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:7777:8888", input => "1111:2222:3333:4444:5555:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::7777:8888", input => "1111:2222:3333:4444:5555::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::7777:8888", input => "1111:2222:3333:4444:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:7777:8888", input => "1111:2222:3333:4444::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:7777:8888", input => "1111:2222:3333:4444:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::7777:8888", input => "1111:2222:3333:4444::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::7777:8888", input => "1111:2222:3333:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:7777:8888", input => "1111:2222:3333::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:7777:8888", input => "1111:2222:3333:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::7777:8888", input => "1111:2222:3333::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::7777:8888", input => "1111:2222:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:7777:8888", input => "1111:2222::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:7777:8888", input => "1111:2222:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::7777:8888", input => "1111:2222::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::7777:8888/125", input => "1111:2222:0000:0000:0000:0000:7777:888f", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::7777:8888/125", input => "1111:2222:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::7777:8888/125", input => "1111:2222:0000:0000:0000:0000:7777:8890", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222::7777:8888/125", input => "1111:2222:0000:0000:0000:0000:7777:8887", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::7777:8888", input => "1111:0000:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:7777:8888", input => "1111::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:7777:8888", input => "1111:0000:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::7777:8888", input => "1111::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::7777:8888", input => "0000:0000:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:7777:8888", input => "::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:7777:8888", input => "0000:0000:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::7777:8888", input => "::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::6666:7777:8888", input => "1111:2222:3333:4444:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:6666:7777:8888", input => "1111:2222:3333:4444::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:6666:7777:8888", input => "1111:2222:3333:4444:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::6666:7777:8888", input => "1111:2222:3333:4444::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:7777:8888", input => "1111:2222:3333:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:6666:7777:8888", input => "1111:2222:3333::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:6666:7777:8888", input => "1111:2222:3333:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:7777:8888", input => "1111:2222:3333::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::6666:7777:8888", input => "1111:2222:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:6666:7777:8888", input => "1111:2222::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:6666:7777:8888", input => "1111:2222:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::6666:7777:8888", input => "1111:2222::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::6666:7777:8888", input => "1111:0000:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:6666:7777:8888", input => "1111::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:6666:7777:8888", input => "1111:0000:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::6666:7777:8888", input => "1111::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::6666:7777:8888", input => "0000:0000:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:6666:7777:8888", input => "::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:6666:7777:8888", input => "0000:0000:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::6666:7777:8888", input => "::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::5555:6666:7777:8888", input => "1111:2222:3333:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:5555:6666:7777:8888", input => "1111:2222:3333::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:5555:6666:7777:8888", input => "1111:2222:3333:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::5555:6666:7777:8888", input => "1111:2222:3333::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:7777:8888", input => "1111:2222:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:5555:6666:7777:8888", input => "1111:2222::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:5555:6666:7777:8888", input => "1111:2222:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:7777:8888", input => "1111:2222::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:7777:8888/125", input => "1111:2222:0000:0000:5555:6666:7777:888f", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:7777:8888/125", input => "1111:2222:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:7777:8888/125", input => "1111:2222:0000:0000:5555:6666:7777:8890", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:7777:8888/125", input => "1111:2222:0000:0000:5555:6666:7777:8887", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::5555:6666:7777:8888", input => "1111:0000:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:5555:6666:7777:8888", input => "1111::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:5555:6666:7777:8888", input => "1111:0000:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::5555:6666:7777:8888", input => "1111::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::5555:6666:7777:8888", input => "0000:0000:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:5555:6666:7777:8888", input => "::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:5555:6666:7777:8888", input => "0000:0000:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::5555:6666:7777:8888", input => "::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:7777:8888", input => "1111:2222:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:4444:5555:6666:7777:8888", input => "1111:2222::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:4444:5555:6666:7777:8888", input => "1111:2222:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:7777:8888", input => "1111:2222::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::4444:5555:6666:7777:8888", input => "1111:0000:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:4444:5555:6666:7777:8888", input => "1111::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:4444:5555:6666:7777:8888", input => "1111:0000:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::4444:5555:6666:7777:8888", input => "1111::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:7777:8888", input => "0000:0000:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:4444:5555:6666:7777:8888", input => "::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:4444:5555:6666:7777:8888", input => "0000:0000:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:7777:8888", input => "::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::3333:4444:5555:6666:7777:8888", input => "1111:0000:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:3333:4444:5555:6666:7777:8888", input => "1111::3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:3333:4444:5555:6666:7777:8888", input => "1111:0000:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::3333:4444:5555:6666:7777:8888", input => "1111::3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::3333:4444:5555:6666:7777:8888", input => "0000:0000:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:3333:4444:5555:6666:7777:8888", input => "::3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:3333:4444:5555:6666:7777:8888", input => "0000:0000:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::3333:4444:5555:6666:7777:8888", input => "::3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:7777:8888", input => "::2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:7777:8888", input => "::2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:7777:8888", input => "::2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:7777:8888", input => "::2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:123.123.123.123", input => "1111:2222:3333:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7b7b:7b7b", input => "1111:2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7b7b:7b7b", input => "1111:2222:3333:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:123.123.123.123", input => "1111:2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::123.123.123.123", input => "1111:2222:3333:4444:5555:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:7b7b:7b7b", input => "1111:2222:3333:4444:5555::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:7b7b:7b7b", input => "1111:2222:3333:4444:5555:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::123.123.123.123", input => "1111:2222:3333:4444:5555::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::123.123.123.123", input => "1111:2222:3333:4444:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:7b7b:7b7b", input => "1111:2222:3333:4444::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:7b7b:7b7b", input => "1111:2222:3333:4444:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::123.123.123.123", input => "1111:2222:3333:4444::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::123.123.123.123", input => "1111:2222:3333:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:7b7b:7b7b", input => "1111:2222:3333::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:7b7b:7b7b", input => "1111:2222:3333:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::123.123.123.123", input => "1111:2222:3333::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::123.123.123.123", input => "1111:2222:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:7b7b:7b7b", input => "1111:2222::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:7b7b:7b7b", input => "1111:2222:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::123.123.123.123", input => "1111:2222::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::123.123.123.123", input => "1111:0000:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:7b7b:7b7b", input => "1111::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:7b7b:7b7b", input => "1111:0000:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::123.123.123.123", input => "1111::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::123.123.123.123", input => "0000:0000:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:7b7b:7b7b", input => "::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:7b7b:7b7b", input => "0000:0000:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "::123.123.123.123", input => "::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::6666:123.123.123.123", input => "1111:2222:3333:4444:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:6666:7b7b:7b7b", input => "1111:2222:3333:4444::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:6666:7b7b:7b7b", input => "1111:2222:3333:4444:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::6666:123.123.123.123", input => "1111:2222:3333:4444::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:123.123.123.123", input => "1111:2222:3333:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:6666:7b7b:7b7b", input => "1111:2222:3333::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:6666:7b7b:7b7b", input => "1111:2222:3333:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:123.123.123.123", input => "1111:2222:3333::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::6666:123.123.123.123", input => "1111:2222:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:6666:7b7b:7b7b", input => "1111:2222::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:6666:7b7b:7b7b", input => "1111:2222:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::6666:123.123.123.123", input => "1111:2222::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::6666:123.123.123.123", input => "1111:0000:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:6666:7b7b:7b7b", input => "1111::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:6666:7b7b:7b7b", input => "1111:0000:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::6666:123.123.123.123", input => "1111::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::6666:123.123.123.123", input => "0000:0000:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:6666:7b7b:7b7b", input => "::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:6666:7b7b:7b7b", input => "0000:0000:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "::6666:123.123.123.123", input => "::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::5555:6666:123.123.123.123", input => "1111:2222:3333:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:5555:6666:7b7b:7b7b", input => "1111:2222:3333::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:5555:6666:7b7b:7b7b", input => "1111:2222:3333:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::5555:6666:123.123.123.123", input => "1111:2222:3333::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:123.123.123.123", input => "1111:2222:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:5555:6666:7b7b:7b7b", input => "1111:2222::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:5555:6666:7b7b:7b7b", input => "1111:2222:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:123.123.123.123", input => "1111:2222::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::5555:6666:123.123.123.123", input => "1111:0000:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:5555:6666:7b7b:7b7b", input => "1111::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:5555:6666:7b7b:7b7b", input => "1111:0000:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::5555:6666:123.123.123.123", input => "1111::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::5555:6666:123.123.123.123", input => "0000:0000:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:5555:6666:7b7b:7b7b", input => "::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:5555:6666:7b7b:7b7b", input => "0000:0000:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "::5555:6666:123.123.123.123", input => "::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:123.123.123.123", input => "1111:2222:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:4444:5555:6666:7b7b:7b7b", input => "1111:2222::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:4444:5555:6666:7b7b:7b7b", input => "1111:2222:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:123.123.123.123", input => "1111:2222::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::4444:5555:6666:123.123.123.123", input => "1111:0000:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:4444:5555:6666:7b7b:7b7b", input => "1111::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:4444:5555:6666:7b7b:7b7b", input => "1111:0000:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::4444:5555:6666:123.123.123.123", input => "1111::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:123.123.123.123", input => "0000:0000:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:4444:5555:6666:7b7b:7b7b", input => "::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:4444:5555:6666:7b7b:7b7b", input => "0000:0000:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:123.123.123.123", input => "::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::3333:4444:5555:6666:123.123.123.123", input => "1111:0000:3333:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:3333:4444:5555:6666:7b7b:7b7b", input => "1111::3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:3333:4444:5555:6666:7b7b:7b7b", input => "1111:0000:3333:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::3333:4444:5555:6666:123.123.123.123", input => "1111::3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:123.123.123.123", input => "::2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:123.123.123.123", input => "::2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:123.123.123.123", input => "::2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:123.123.123.123", input => "::2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0:0", input => "::0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0:0", input => "::0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0:0", input => "::0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0:0", input => "::0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0", input => "::0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/45", input => "0000:0000:0007:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/45", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/45", input => "0000:0000:0008:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/45", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/3", input => "1fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/3", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/3", input => "2000:0000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/3", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0", input => "::0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/96", input => "0000:0000:0000:0000:0000:0000:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/96", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/96", input => "0000:0000:0000:0000:0000:0001:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/96", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/40", input => "0000:0000:00ff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/40", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/40", input => "0000:0000:0100:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/40", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0", input => "::0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/116", input => "0000:0000:0000:0000:0000:0000:0000:0fff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/116", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/116", input => "0000:0000:0000:0000:0000:0000:0000:1000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/116", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/88", input => "0000:0000:0000:0000:0000:00ff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/88", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/88", input => "0000:0000:0000:0000:0000:0100:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/88", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0", input => "::0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/120", input => "0000:0000:0000:0000:0000:0000:0000:00ff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/120", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/120", input => "0000:0000:0000:0000:0000:0000:0000:0100", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0/120", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/67", input => "0000:0000:0000:0000:1fff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/67", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/67", input => "0000:0000:0000:0000:2000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0/67", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0", input => "::0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/34", input => "0000:0000:3fff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/34", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/34", input => "0000:0000:4000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0/34", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/88", input => "0000:0000:0000:0000:0000:00ff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/88", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/88", input => "0000:0000:0000:0000:0000:0100:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0/88", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0", input => "::0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/92", input => "0000:0000:0000:0000:0000:000f:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/92", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/92", input => "0000:0000:0000:0000:0000:0010:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0/92", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/18", input => "0000:3fff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/18", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/18", input => "0000:4000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0/18", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0::", input => "0:0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0::", input => "0:0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0::", input => "0:0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0::", input => "0:0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::", input => "0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/7", input => "01ff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/7", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/7", input => "0200:0000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/7", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/60", input => "0000:0000:0000:000f:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/60", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/60", input => "0000:0000:0000:0010:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/60", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::", input => "0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/126", input => "0000:0000:0000:0000:0000:0000:0000:0003", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/126", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/126", input => "0000:0000:0000:0000:0000:0000:0000:0004", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/126", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/76", input => "0000:0000:0000:0000:000f:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/76", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/76", input => "0000:0000:0000:0000:0010:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/76", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::", input => "0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/63", input => "0000:0000:0000:0001:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/63", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/63", input => "0000:0000:0000:0002:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/63", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/11", input => "001f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/11", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/11", input => "0020:0000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/11", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::", input => "0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/71", input => "0000:0000:0000:0000:01ff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/71", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/71", input => "0000:0000:0000:0000:0200:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0::/71", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/72", input => "0000:0000:0000:0000:00ff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/72", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/72", input => "0000:0000:0000:0000:0100:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0::/72", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::", input => "0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/23", input => "0000:01ff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/23", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/23", input => "0000:0200:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0::/23", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/76", input => "0000:0000:0000:0000:000f:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/76", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/76", input => "0000:0000:0000:0000:0010:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0::/76", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0::", input => "0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/102", input => "0000:0000:0000:0000:0000:0000:03ff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/102", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/102", input => "0000:0000:0000:0000:0000:0000:0400:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0::/102", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/42", input => "0000:0000:003f:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/42", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/42", input => "0000:0000:0040:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0::/42", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:a:b:c:d:e:f::", input => "0:a:b:c:d:e:f::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:a:b:c:d:e:f::", input => "0:a:b:c:d:e:f::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:a:b:c:d:e:f::", input => "0:a:b:c:d:e:f::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:a:b:c:d:e:f::", input => "0:a:b:c:d:e:f::", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:a:b:c:d:e:f", input => "::0:a:b:c:d:e:f", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:a:b:c:d:e:f", input => "::0:a:b:c:d:e:f", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:a:b:c:d:e:f", input => "::0:a:b:c:d:e:f", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:a:b:c:d:e:f", input => "::0:a:b:c:d:e:f", ret => 1, }, { type => "op", name => "ipMatch", param => "a:b:c:d:e:f:0::", input => "a:b:c:d:e:f:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "a:b:c:d:e:f:0::", input => "a:b:c:d:e:f:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "a:b:c:d:e:f:0::", input => "a:b:c:d:e:f:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "a:b:c:d:e:f:0::", input => "a:b:c:d:e:f:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::", input => "::", ret => 1, }, { type => "op", name => "ipMatch", param => "::/100", input => "0000:0000:0000:0000:0000:0000:0fff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::/100", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::/100", input => "0000:0000:0000:0000:0000:0000:1000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::/100", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::/59", input => "0000:0000:0000:001f:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::/59", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::/59", input => "0000:0000:0000:0020:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::/59", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0:1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0:0:0:0:0:0:0:1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0:1", input => "0:0:0:0:0:0:0:1", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0:0", input => "0:0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:DB8:0:0:8:800:200C:417A", input => "2001:0db8:0000:0000:0008:0800:200c:417a", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0008:0800:200c:417a", input => "2001:DB8:0:0:8:800:200C:417A", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0008:0800:200c:417a", input => "2001:0db8:0000:0000:0008:0800:200c:417a", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:DB8:0:0:8:800:200C:417A", input => "2001:DB8:0:0:8:800:200C:417A", ret => 1, }, { type => "op", name => "ipMatch", param => "FF01:0:0:0:0:0:0:101", input => "ff01:0000:0000:0000:0000:0000:0000:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "ff01:0000:0000:0000:0000:0000:0000:0101", input => "FF01:0:0:0:0:0:0:101", ret => 1, }, { type => "op", name => "ipMatch", param => "ff01:0000:0000:0000:0000:0000:0000:0101", input => "ff01:0000:0000:0000:0000:0000:0000:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "FF01:0:0:0:0:0:0:101", input => "FF01:0:0:0:0:0:0:101", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:DB8::8:800:200C:417A", input => "2001:0db8:0000:0000:0008:0800:200c:417a", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0008:0800:200c:417a", input => "2001:DB8::8:800:200C:417A", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0008:0800:200c:417a", input => "2001:0db8:0000:0000:0008:0800:200c:417a", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:DB8::8:800:200C:417A", input => "2001:DB8::8:800:200C:417A", ret => 1, }, { type => "op", name => "ipMatch", param => "FF01::101", input => "ff01:0000:0000:0000:0000:0000:0000:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "ff01:0000:0000:0000:0000:0000:0000:0101", input => "FF01::101", ret => 1, }, { type => "op", name => "ipMatch", param => "ff01:0000:0000:0000:0000:0000:0000:0101", input => "ff01:0000:0000:0000:0000:0000:0000:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "FF01::101", input => "FF01::101", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::217:f2ff:fe07:ed62", input => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", input => "fe80::217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", input => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::217:f2ff:fe07:ed62", input => "fe80::217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0000:1234:0000:0000:C1C0:ABCD:0876", input => "2001:0000:1234:0000:0000:c1c0:abcd:0876", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0000:1234:0000:0000:c1c0:abcd:0876", input => "2001:0000:1234:0000:0000:C1C0:ABCD:0876", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0000:1234:0000:0000:c1c0:abcd:0876", input => "2001:0000:1234:0000:0000:c1c0:abcd:0876", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0000:1234:0000:0000:C1C0:ABCD:0876", input => "2001:0000:1234:0000:0000:C1C0:ABCD:0876", ret => 1, }, { type => "op", name => "ipMatch", param => "3ffe:0b00:0000:0000:0001:0000:0000:000a", input => "3ffe:0b00:0000:0000:0001:0000:0000:000a", ret => 1, }, { type => "op", name => "ipMatch", param => "3ffe:0b00:0000:0000:0001:0000:0000:000a", input => "3ffe:0b00:0000:0000:0001:0000:0000:000a", ret => 1, }, { type => "op", name => "ipMatch", param => "3ffe:0b00:0000:0000:0001:0000:0000:000a", input => "3ffe:0b00:0000:0000:0001:0000:0000:000a", ret => 1, }, { type => "op", name => "ipMatch", param => "3ffe:0b00:0000:0000:0001:0000:0000:000a", input => "3ffe:0b00:0000:0000:0001:0000:0000:000a", ret => 1, }, { type => "op", name => "ipMatch", param => "FF02:0000:0000:0000:0000:0000:0000:0001", input => "ff02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02:0000:0000:0000:0000:0000:0000:0001", input => "FF02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02:0000:0000:0000:0000:0000:0000:0001", input => "ff02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "FF02:0000:0000:0000:0000:0000:0000:0001", input => "FF02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2::10", input => "0002:0000:0000:0000:0000:0000:0000:0010", ret => 1, }, { type => "op", name => "ipMatch", param => "0002:0000:0000:0000:0000:0000:0000:0010", input => "2::10", ret => 1, }, { type => "op", name => "ipMatch", param => "0002:0000:0000:0000:0000:0000:0000:0010", input => "0002:0000:0000:0000:0000:0000:0000:0010", ret => 1, }, { type => "op", name => "ipMatch", param => "2::10", input => "2::10", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02::1", input => "ff02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02:0000:0000:0000:0000:0000:0000:0001", input => "ff02::1", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02:0000:0000:0000:0000:0000:0000:0001", input => "ff02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02::1", input => "ff02::1", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/111", input => "fe80:0000:0000:0000:0000:0000:0001:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/111", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/111", input => "fe80:0000:0000:0000:0000:0000:0002:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/111", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/57", input => "fe80:0000:0000:007f:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/57", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/57", input => "fe80:0000:0000:0080:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/57", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2002::", input => "2002:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2002:0000:0000:0000:0000:0000:0000:0000", input => "2002::", ret => 1, }, { type => "op", name => "ipMatch", param => "2002:0000:0000:0000:0000:0000:0000:0000", input => "2002:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::", input => "2002::", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/125", input => "2002:0000:0000:0000:0000:0000:0000:0007", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/125", input => "2002:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/125", input => "2002:0000:0000:0000:0000:0000:0000:0008", ret => 0, }, { type => "op", name => "ipMatch", param => "2002::/125", input => "2001:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2002::/94", input => "2002:0000:0000:0000:0000:0003:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/94", input => "2002:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/94", input => "2002:0000:0000:0000:0000:0004:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "2002::/94", input => "2001:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:db8::", input => "2001:0db8:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:0000:0000", input => "2001:db8::", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:0000:0000", input => "2001:0db8:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::", input => "2001:db8::", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::/100", input => "2001:0db8:0000:0000:0000:0000:0fff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::/100", input => "2001:0db8:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::/100", input => "2001:0db8:0000:0000:0000:0000:1000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:db8::/100", input => "2001:0db7:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234::", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::", input => "2001:0db8:1234::", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/70", input => "2001:0db8:1234:0000:03ff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/70", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/70", input => "2001:0db8:1234:0000:0400:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::/70", input => "2001:0db8:1233:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "::ffff:0:0", input => "0000:0000:0000:0000:0000:ffff:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0000:0000", input => "::ffff:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0000:0000", input => "0000:0000:0000:0000:0000:ffff:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:0:0", input => "::ffff:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6:7:8", input => "0001:0002:0003:0004:0005:0006:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0007:0008", input => "1:2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0007:0008", input => "0001:0002:0003:0004:0005:0006:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6:7:8", input => "1:2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::8", input => "0001:0002:0003:0004:0005:0006:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0000:0008", input => "1:2:3:4:5:6::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0000:0008", input => "0001:0002:0003:0004:0005:0006:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::8", input => "1:2:3:4:5:6::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::8", input => "0001:0002:0003:0004:0005:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0000:0008", input => "1:2:3:4:5::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0000:0008", input => "0001:0002:0003:0004:0005:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::8", input => "1:2:3:4:5::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::8", input => "0001:0002:0003:0004:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0000:0008", input => "1:2:3:4::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0000:0008", input => "0001:0002:0003:0004:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::8", input => "1:2:3:4::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::8", input => "0001:0002:0003:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0000:0008", input => "1:2:3::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0000:0008", input => "0001:0002:0003:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::8", input => "1:2:3::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::8", input => "0001:0002:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0000:0008", input => "1:2::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0000:0008", input => "0001:0002:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::8", input => "1:2::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1::8", input => "0001:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0008", input => "1::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0008", input => "0001:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1::8", input => "1::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5:6:7", input => "0001:0000:0002:0003:0004:0005:0006:0007", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0002:0003:0004:0005:0006:0007", input => "1::2:3:4:5:6:7", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0002:0003:0004:0005:0006:0007", input => "0001:0000:0002:0003:0004:0005:0006:0007", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5:6:7", input => "1::2:3:4:5:6:7", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5:6", input => "0001:0000:0000:0002:0003:0004:0005:0006", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0002:0003:0004:0005:0006", input => "1::2:3:4:5:6", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0002:0003:0004:0005:0006", input => "0001:0000:0000:0002:0003:0004:0005:0006", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5:6", input => "1::2:3:4:5:6", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5", input => "0001:0000:0000:0000:0002:0003:0004:0005", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0002:0003:0004:0005", input => "1::2:3:4:5", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0002:0003:0004:0005", input => "0001:0000:0000:0000:0002:0003:0004:0005", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5", input => "1::2:3:4:5", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4", input => "0001:0000:0000:0000:0000:0002:0003:0004", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0002:0003:0004", input => "1::2:3:4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0002:0003:0004", input => "0001:0000:0000:0000:0000:0002:0003:0004", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4", input => "1::2:3:4", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3", input => "0001:0000:0000:0000:0000:0000:0002:0003", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0002:0003", input => "1::2:3", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0002:0003", input => "0001:0000:0000:0000:0000:0000:0002:0003", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3", input => "1::2:3", ret => 1, }, { type => "op", name => "ipMatch", param => "1::8", input => "0001:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0008", input => "1::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0008", input => "0001:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1::8", input => "1::8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7:8", input => "::2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7:8", input => "::2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7:8", input => "::2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7:8", input => "::2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7", input => "0000:0000:0002:0003:0004:0005:0006:0007", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0002:0003:0004:0005:0006:0007", input => "::2:3:4:5:6:7", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0002:0003:0004:0005:0006:0007", input => "0000:0000:0002:0003:0004:0005:0006:0007", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7", input => "::2:3:4:5:6:7", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6", input => "0000:0000:0000:0002:0003:0004:0005:0006", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0002:0003:0004:0005:0006", input => "::2:3:4:5:6", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0002:0003:0004:0005:0006", input => "0000:0000:0000:0002:0003:0004:0005:0006", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6", input => "::2:3:4:5:6", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5", input => "0000:0000:0000:0000:0002:0003:0004:0005", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0002:0003:0004:0005", input => "::2:3:4:5", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0002:0003:0004:0005", input => "0000:0000:0000:0000:0002:0003:0004:0005", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5", input => "::2:3:4:5", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4", input => "0000:0000:0000:0000:0000:0002:0003:0004", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0002:0003:0004", input => "::2:3:4", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0002:0003:0004", input => "0000:0000:0000:0000:0000:0002:0003:0004", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4", input => "::2:3:4", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3", input => "0000:0000:0000:0000:0000:0000:0002:0003", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0002:0003", input => "::2:3", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0002:0003", input => "0000:0000:0000:0000:0000:0000:0002:0003", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3", input => "::2:3", ret => 1, }, { type => "op", name => "ipMatch", param => "::8", input => "0000:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0008", input => "::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0008", input => "0000:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "::8", input => "::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::", input => "0001:0002:0003:0004:0005:0006:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0000:0000", input => "1:2:3:4:5:6::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0000:0000", input => "0001:0002:0003:0004:0005:0006:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::", input => "1:2:3:4:5:6::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::", input => "0001:0002:0003:0004:0005:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0000:0000", input => "1:2:3:4:5::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0000:0000", input => "0001:0002:0003:0004:0005:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::", input => "1:2:3:4:5::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::", input => "0001:0002:0003:0004:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0000:0000", input => "1:2:3:4::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0000:0000", input => "0001:0002:0003:0004:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::", input => "1:2:3:4::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/94", input => "0001:0002:0003:0004:0000:0003:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/94", input => "0001:0002:0003:0004:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/94", input => "0001:0002:0003:0004:0000:0004:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/94", input => "0001:0002:0003:0003:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/114", input => "0001:0002:0003:0004:0000:0000:0000:3fff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/114", input => "0001:0002:0003:0004:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/114", input => "0001:0002:0003:0004:0000:0000:0000:4000", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/114", input => "0001:0002:0003:0003:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3::", input => "0001:0002:0003:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0000:0000", input => "1:2:3::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0000:0000", input => "0001:0002:0003:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::", input => "1:2:3::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::/120", input => "0001:0002:0003:0000:0000:0000:0000:00ff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::/120", input => "0001:0002:0003:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::/120", input => "0001:0002:0003:0000:0000:0000:0000:0100", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3::/120", input => "0001:0002:0002:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2::", input => "0001:0002:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0000:0000", input => "1:2::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0000:0000", input => "0001:0002:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::", input => "1:2::", ret => 1, }, { type => "op", name => "ipMatch", param => "1::", input => "0001:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0000", input => "1::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0000", input => "0001:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1::", input => "1::", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/37", input => "0001:0000:07ff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/37", input => "0001:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/37", input => "0001:0000:0800:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1::/37", input => "0000:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1::/90", input => "0001:0000:0000:0000:0000:003f:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/90", input => "0001:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/90", input => "0001:0000:0000:0000:0000:0040:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1::/90", input => "0000:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::7:8", input => "0001:0002:0003:0004:0005:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0007:0008", input => "1:2:3:4:5::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0007:0008", input => "0001:0002:0003:0004:0005:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::7:8", input => "1:2:3:4:5::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::7:8", input => "0001:0002:0003:0004:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0007:0008", input => "1:2:3:4::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0007:0008", input => "0001:0002:0003:0004:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::7:8", input => "1:2:3:4::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::7:8/125", input => "0001:0002:0003:0004:0000:0000:0007:000f", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::7:8/125", input => "0001:0002:0003:0004:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::7:8/125", input => "0001:0002:0003:0004:0000:0000:0007:0010", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4::7:8/125", input => "0001:0002:0003:0004:0000:0000:0007:0007", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3::7:8", input => "0001:0002:0003:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0007:0008", input => "1:2:3::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0007:0008", input => "0001:0002:0003:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::7:8", input => "1:2:3::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::7:8", input => "0001:0002:0000:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0007:0008", input => "1:2::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0007:0008", input => "0001:0002:0000:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::7:8", input => "1:2::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1::7:8", input => "0001:0000:0000:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0007:0008", input => "1::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0007:0008", input => "0001:0000:0000:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1::7:8", input => "1::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6:1.2.3.4", input => "0001:0002:0003:0004:0005:0006:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0102:0304", input => "1:2:3:4:5:6:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0102:0304", input => "0001:0002:0003:0004:0005:0006:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6:1.2.3.4", input => "1:2:3:4:5:6:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::1.2.3.4", input => "0001:0002:0003:0004:0005:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0102:0304", input => "1:2:3:4:5::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0102:0304", input => "0001:0002:0003:0004:0005:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::1.2.3.4", input => "1:2:3:4:5::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::1.2.3.4", input => "0001:0002:0003:0004:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0102:0304", input => "1:2:3:4::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0102:0304", input => "0001:0002:0003:0004:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::1.2.3.4", input => "1:2:3:4::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::1.2.3.4", input => "0001:0002:0003:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0102:0304", input => "1:2:3::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0102:0304", input => "0001:0002:0003:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::1.2.3.4", input => "1:2:3::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::1.2.3.4", input => "0001:0002:0000:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0102:0304", input => "1:2::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0102:0304", input => "0001:0002:0000:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::1.2.3.4", input => "1:2::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1::1.2.3.4", input => "0001:0000:0000:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0102:0304", input => "1::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0102:0304", input => "0001:0000:0000:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1::1.2.3.4", input => "1::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1::1.2.3.4/127", input => "0001:0000:0000:0000:0000:0000:0102:0305", ret => 1, }, { type => "op", name => "ipMatch", param => "1::1.2.3.4/127", input => "0001:0000:0000:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1::1.2.3.4/127", input => "0001:0000:0000:0000:0000:0000:0102:0306", ret => 0, }, { type => "op", name => "ipMatch", param => "1::1.2.3.4/127", input => "0001:0000:0000:0000:0000:0000:0102:0303", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4::5:1.2.3.4", input => "0001:0002:0003:0004:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0005:0102:0304", input => "1:2:3:4::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0005:0102:0304", input => "0001:0002:0003:0004:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::5:1.2.3.4", input => "1:2:3:4::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::5:1.2.3.4/127", input => "0001:0002:0003:0004:0000:0005:0102:0305", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::5:1.2.3.4/127", input => "0001:0002:0003:0004:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::5:1.2.3.4/127", input => "0001:0002:0003:0004:0000:0005:0102:0306", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4::5:1.2.3.4/127", input => "0001:0002:0003:0004:0000:0005:0102:0303", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3::5:1.2.3.4", input => "0001:0002:0003:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0005:0102:0304", input => "1:2:3::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0005:0102:0304", input => "0001:0002:0003:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::5:1.2.3.4", input => "1:2:3::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::5:1.2.3.4", input => "0001:0002:0000:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0005:0102:0304", input => "1:2::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0005:0102:0304", input => "0001:0002:0000:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::5:1.2.3.4", input => "1:2::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1::5:1.2.3.4", input => "0001:0000:0000:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0005:0102:0304", input => "1::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0005:0102:0304", input => "0001:0000:0000:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1::5:1.2.3.4", input => "1::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1::5:11.22.33.44", input => "0001:0000:0000:0000:0000:0005:0b16:212c", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0005:0b16:212c", input => "1::5:11.22.33.44", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0005:0b16:212c", input => "0001:0000:0000:0000:0000:0005:0b16:212c", ret => 1, }, { type => "op", name => "ipMatch", param => "1::5:11.22.33.44", input => "1::5:11.22.33.44", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::217:f2ff:254.7.237.98", input => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", input => "fe80::217:f2ff:254.7.237.98", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", input => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::217:f2ff:254.7.237.98", input => "fe80::217:f2ff:254.7.237.98", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.168.1.26", input => "0000:0000:0000:0000:0000:ffff:c0a8:011a", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c0a8:011a", input => "::ffff:192.168.1.26", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c0a8:011a", input => "0000:0000:0000:0000:0000:ffff:c0a8:011a", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.168.1.26", input => "::ffff:192.168.1.26", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.168.1.1", input => "0000:0000:0000:0000:0000:ffff:c0a8:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c0a8:0101", input => "::ffff:192.168.1.1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c0a8:0101", input => "0000:0000:0000:0000:0000:ffff:c0a8:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.168.1.1", input => "::ffff:192.168.1.1", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:13.1.68.3", input => "0000:0000:0000:0000:0000:0000:0d01:4403", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0d01:4403", input => "0:0:0:0:0:0:13.1.68.3", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0d01:4403", input => "0000:0000:0000:0000:0000:0000:0d01:4403", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:13.1.68.3", input => "0:0:0:0:0:0:13.1.68.3", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:FFFF:129.144.52.38", input => "0000:0000:0000:0000:0000:ffff:8190:3426", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:8190:3426", input => "0:0:0:0:0:FFFF:129.144.52.38", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:8190:3426", input => "0000:0000:0000:0000:0000:ffff:8190:3426", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:FFFF:129.144.52.38", input => "0:0:0:0:0:FFFF:129.144.52.38", ret => 1, }, { type => "op", name => "ipMatch", param => "::13.1.68.3", input => "0000:0000:0000:0000:0000:0000:0d01:4403", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0d01:4403", input => "::13.1.68.3", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0d01:4403", input => "0000:0000:0000:0000:0000:0000:0d01:4403", ret => 1, }, { type => "op", name => "ipMatch", param => "::13.1.68.3", input => "::13.1.68.3", ret => 1, }, { type => "op", name => "ipMatch", param => "::FFFF:129.144.52.38", input => "0000:0000:0000:0000:0000:ffff:8190:3426", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:8190:3426", input => "::FFFF:129.144.52.38", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:8190:3426", input => "0000:0000:0000:0000:0000:ffff:8190:3426", ret => 1, }, { type => "op", name => "ipMatch", param => "::FFFF:129.144.52.38", input => "::FFFF:129.144.52.38", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0:0:0:204:61ff:254.157.241.86", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0:0:0:204:61ff:254.157.241.86", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0:0:0:204:61ff:254.157.241.86", input => "fe80:0:0:0:204:61ff:254.157.241.86", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::204:61ff:254.157.241.86", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80::204:61ff:254.157.241.86", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::204:61ff:254.157.241.86", input => "fe80::204:61ff:254.157.241.86", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:12.34.56.78", input => "0000:0000:0000:0000:0000:ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0c22:384e", input => "::ffff:12.34.56.78", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0c22:384e", input => "0000:0000:0000:0000:0000:ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:12.34.56.78", input => "::ffff:12.34.56.78", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:12.34.56.78/127", input => "0000:0000:0000:0000:0000:ffff:0c22:384f", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:12.34.56.78/127", input => "0000:0000:0000:0000:0000:ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:12.34.56.78/127", input => "0000:0000:0000:0000:0000:ffff:0c22:3850", ret => 0, }, { type => "op", name => "ipMatch", param => "::ffff:12.34.56.78/127", input => "0000:0000:0000:0000:0000:ffff:0c22:384d", ret => 0, }, { type => "op", name => "ipMatch", param => "::ffff:192.0.2.128", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c000:0280", input => "::ffff:192.0.2.128", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c000:0280", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.0.2.128", input => "::ffff:192.0.2.128", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.0.2.128/127", input => "0000:0000:0000:0000:0000:ffff:c000:0281", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.0.2.128/127", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.0.2.128/127", input => "0000:0000:0000:0000:0000:ffff:c000:0282", ret => 0, }, { type => "op", name => "ipMatch", param => "::ffff:192.0.2.128/127", input => "0000:0000:0000:0000:0000:ffff:c000:027f", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0:0:0:204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0:0:0:204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0:0:0:204:61ff:fe9d:f156", input => "fe80:0:0:0:204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80::204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::204:61ff:fe9d:f156", input => "fe80::204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/75", input => "fe80:0000:0000:0000:001f:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/75", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/75", input => "fe80:0000:0000:0000:0020:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/75", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/112", input => "fe80:0000:0000:0000:0000:0000:0000:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/112", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/112", input => "fe80:0000:0000:0000:0000:0000:0001:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/112", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::1", input => "fe80:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0001", input => "fe80::1", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0001", input => "fe80:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::1", input => "fe80::1", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:c000:280", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c000:0280", input => "::ffff:c000:280", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c000:0280", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:c000:280", input => "::ffff:c000:280", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:85a3:0:0:8a2e:370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:db8:85a3:0:0:8a2e:370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:85a3:0:0:8a2e:370:7334", input => "2001:db8:85a3:0:0:8a2e:370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:85a3::8a2e:370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:db8:85a3::8a2e:370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:85a3::8a2e:370:7334", input => "2001:db8:85a3::8a2e:370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000::1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000::1428:57ab", input => "2001:0db8:0000:0000:0000::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0:0:0:0:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0:0:0:0:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0:0:0:0:1428:57ab", input => "2001:0db8:0:0:0:0:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0:0::1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0:0::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0:0::1428:57ab", input => "2001:0db8:0:0::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8::1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8::1428:57ab", input => "2001:0db8::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:db8::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::1428:57ab", input => "2001:db8::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:0c22:384e", input => "0000:0000:0000:0000:0000:ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0c22:384e", input => "::ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0c22:384e", input => "0000:0000:0000:0000:0000:ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:0c22:384e", input => "::ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", input => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", input => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", input => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", input => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:a::123", input => "2001:0db8:000a:0000:0000:0000:0000:0123", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:000a:0000:0000:0000:0000:0123", input => "2001:db8:a::123", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:000a:0000:0000:0000:0000:0123", input => "2001:0db8:000a:0000:0000:0000:0000:0123", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:a::123", input => "2001:db8:a::123", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777:8888", input => "1111:2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777:8888", input => "1111:2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777:8888", input => "1111:2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777:8888", input => "1111:2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777::", input => "1111:2222:3333:4444:5555:6666:7777::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777::", input => "1111:2222:3333:4444:5555:6666:7777::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777::", input => "1111:2222:3333:4444:5555:6666:7777::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777::", input => "1111:2222:3333:4444:5555:6666:7777::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::", input => "1111:2222:3333:4444:5555:6666:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:0000:0000", input => "1111:2222:3333:4444:5555:6666::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:0000:0000", input => "1111:2222:3333:4444:5555:6666:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::", input => "1111:2222:3333:4444:5555:6666::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::", input => "1111:2222:3333:4444:5555:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:0000:0000", input => "1111:2222:3333:4444:5555::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:0000:0000", input => "1111:2222:3333:4444:5555:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::", input => "1111:2222:3333:4444:5555::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::/84", input => "1111:2222:3333:4444:5555:0fff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::/84", input => "1111:2222:3333:4444:5555:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::/84", input => "1111:2222:3333:4444:5555:1000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::/84", input => "1111:2222:3333:4444:5554:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::", input => "1111:2222:3333:4444:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:0000:0000", input => "1111:2222:3333:4444::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:0000:0000", input => "1111:2222:3333:4444:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::", input => "1111:2222:3333:4444::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::/114", input => "1111:2222:3333:4444:0000:0000:0000:3fff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::/114", input => "1111:2222:3333:4444:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::/114", input => "1111:2222:3333:4444:0000:0000:0000:4000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::/114", input => "1111:2222:3333:4443:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::/87", input => "1111:2222:3333:4444:0000:01ff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::/87", input => "1111:2222:3333:4444:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::/87", input => "1111:2222:3333:4444:0000:0200:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::/87", input => "1111:2222:3333:4443:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::", input => "1111:2222:3333:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:0000:0000", input => "1111:2222:3333::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:0000:0000", input => "1111:2222:3333:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::", input => "1111:2222:3333::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/79", input => "1111:2222:3333:0000:0001:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/79", input => "1111:2222:3333:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/79", input => "1111:2222:3333:0000:0002:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/79", input => "1111:2222:3332:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/78", input => "1111:2222:3333:0000:0003:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/78", input => "1111:2222:3333:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/78", input => "1111:2222:3333:0000:0004:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/78", input => "1111:2222:3332:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222::", input => "1111:2222:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:0000:0000", input => "1111:2222::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:0000:0000", input => "1111:2222:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::", input => "1111:2222::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::/94", input => "1111:2222:0000:0000:0000:0003:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::/94", input => "1111:2222:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::/94", input => "1111:2222:0000:0000:0000:0004:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222::/94", input => "1111:2221:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::", input => "1111:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:0000:0000", input => "1111::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:0000:0000", input => "1111:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::", input => "1111::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::/52", input => "1111:0000:0000:0fff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::/52", input => "1111:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::/52", input => "1111:0000:0000:1000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::/52", input => "1110:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::/44", input => "1111:0000:000f:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::/44", input => "1111:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::/44", input => "1111:0000:0010:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::/44", input => "1110:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::8888", input => "1111:2222:3333:4444:5555:6666:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:0000:8888", input => "1111:2222:3333:4444:5555:6666::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:0000:8888", input => "1111:2222:3333:4444:5555:6666:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::8888", input => "1111:2222:3333:4444:5555:6666::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::8888/125", input => "1111:2222:3333:4444:5555:6666:0000:888f", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::8888/125", input => "1111:2222:3333:4444:5555:6666:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::8888/125", input => "1111:2222:3333:4444:5555:6666:0000:8890", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::8888/125", input => "1111:2222:3333:4444:5555:6666:0000:8887", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::8888", input => "1111:2222:3333:4444:5555:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:0000:8888", input => "1111:2222:3333:4444:5555::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:0000:8888", input => "1111:2222:3333:4444:5555:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::8888", input => "1111:2222:3333:4444:5555::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::8888", input => "1111:2222:3333:4444:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:0000:8888", input => "1111:2222:3333:4444::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:0000:8888", input => "1111:2222:3333:4444:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::8888", input => "1111:2222:3333:4444::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::8888", input => "1111:2222:3333:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:0000:8888", input => "1111:2222:3333::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:0000:8888", input => "1111:2222:3333:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::8888", input => "1111:2222:3333::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::8888", input => "1111:2222:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:0000:8888", input => "1111:2222::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:0000:8888", input => "1111:2222:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::8888", input => "1111:2222::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::8888/125", input => "1111:2222:0000:0000:0000:0000:0000:888f", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::8888/125", input => "1111:2222:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::8888/125", input => "1111:2222:0000:0000:0000:0000:0000:8890", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222::8888/125", input => "1111:2222:0000:0000:0000:0000:0000:8887", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::8888", input => "1111:0000:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:0000:8888", input => "1111::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:0000:8888", input => "1111:0000:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::8888", input => "1111::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::8888", input => "0000:0000:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:8888", input => "::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:8888", input => "0000:0000:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::8888", input => "::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::7777:8888", input => "1111:2222:3333:4444:5555:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:7777:8888", input => "1111:2222:3333:4444:5555::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:7777:8888", input => "1111:2222:3333:4444:5555:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::7777:8888", input => "1111:2222:3333:4444:5555::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::7777:8888", input => "1111:2222:3333:4444:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:7777:8888", input => "1111:2222:3333:4444::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:7777:8888", input => "1111:2222:3333:4444:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::7777:8888", input => "1111:2222:3333:4444::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::7777:8888", input => "1111:2222:3333:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:7777:8888", input => "1111:2222:3333::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:7777:8888", input => "1111:2222:3333:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::7777:8888", input => "1111:2222:3333::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::7777:8888", input => "1111:2222:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:7777:8888", input => "1111:2222::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:7777:8888", input => "1111:2222:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::7777:8888", input => "1111:2222::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::7777:8888", input => "1111:0000:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:7777:8888", input => "1111::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:7777:8888", input => "1111:0000:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::7777:8888", input => "1111::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::7777:8888", input => "0000:0000:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:7777:8888", input => "::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:7777:8888", input => "0000:0000:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::7777:8888", input => "::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::6666:7777:8888", input => "1111:2222:3333:4444:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:6666:7777:8888", input => "1111:2222:3333:4444::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:6666:7777:8888", input => "1111:2222:3333:4444:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::6666:7777:8888", input => "1111:2222:3333:4444::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:7777:8888", input => "1111:2222:3333:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:6666:7777:8888", input => "1111:2222:3333::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:6666:7777:8888", input => "1111:2222:3333:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:7777:8888", input => "1111:2222:3333::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:7777:8888/125", input => "1111:2222:3333:0000:0000:6666:7777:888f", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:7777:8888/125", input => "1111:2222:3333:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:7777:8888/125", input => "1111:2222:3333:0000:0000:6666:7777:8890", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:7777:8888/125", input => "1111:2222:3333:0000:0000:6666:7777:8887", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222::6666:7777:8888", input => "1111:2222:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:6666:7777:8888", input => "1111:2222::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:6666:7777:8888", input => "1111:2222:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::6666:7777:8888", input => "1111:2222::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::6666:7777:8888", input => "1111:0000:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:6666:7777:8888", input => "1111::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:6666:7777:8888", input => "1111:0000:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::6666:7777:8888", input => "1111::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::6666:7777:8888", input => "0000:0000:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:6666:7777:8888", input => "::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:6666:7777:8888", input => "0000:0000:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::6666:7777:8888", input => "::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::5555:6666:7777:8888", input => "1111:2222:3333:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:5555:6666:7777:8888", input => "1111:2222:3333::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:5555:6666:7777:8888", input => "1111:2222:3333:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::5555:6666:7777:8888", input => "1111:2222:3333::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:7777:8888", input => "1111:2222:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:5555:6666:7777:8888", input => "1111:2222::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:5555:6666:7777:8888", input => "1111:2222:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:7777:8888", input => "1111:2222::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::5555:6666:7777:8888", input => "1111:0000:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:5555:6666:7777:8888", input => "1111::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:5555:6666:7777:8888", input => "1111:0000:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::5555:6666:7777:8888", input => "1111::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::5555:6666:7777:8888", input => "0000:0000:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:5555:6666:7777:8888", input => "::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:5555:6666:7777:8888", input => "0000:0000:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::5555:6666:7777:8888", input => "::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:7777:8888", input => "1111:2222:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:4444:5555:6666:7777:8888", input => "1111:2222::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:4444:5555:6666:7777:8888", input => "1111:2222:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:7777:8888", input => "1111:2222::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:7777:8888/127", input => "1111:2222:0000:4444:5555:6666:7777:8889", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:7777:8888/127", input => "1111:2222:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:7777:8888/127", input => "1111:2222:0000:4444:5555:6666:7777:888a", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:7777:8888/127", input => "1111:2222:0000:4444:5555:6666:7777:8887", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::4444:5555:6666:7777:8888", input => "1111:0000:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:4444:5555:6666:7777:8888", input => "1111::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:4444:5555:6666:7777:8888", input => "1111:0000:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::4444:5555:6666:7777:8888", input => "1111::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:7777:8888", input => "0000:0000:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:4444:5555:6666:7777:8888", input => "::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:4444:5555:6666:7777:8888", input => "0000:0000:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:7777:8888", input => "::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::3333:4444:5555:6666:7777:8888", input => "1111:0000:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:3333:4444:5555:6666:7777:8888", input => "1111::3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:3333:4444:5555:6666:7777:8888", input => "1111:0000:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::3333:4444:5555:6666:7777:8888", input => "1111::3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::3333:4444:5555:6666:7777:8888", input => "0000:0000:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:3333:4444:5555:6666:7777:8888", input => "::3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:3333:4444:5555:6666:7777:8888", input => "0000:0000:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::3333:4444:5555:6666:7777:8888", input => "::3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:7777:8888", input => "::2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:7777:8888", input => "::2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:7777:8888", input => "::2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:7777:8888", input => "::2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:123.123.123.123", input => "1111:2222:3333:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7b7b:7b7b", input => "1111:2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7b7b:7b7b", input => "1111:2222:3333:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:123.123.123.123", input => "1111:2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::123.123.123.123", input => "1111:2222:3333:4444:5555:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:7b7b:7b7b", input => "1111:2222:3333:4444:5555::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:7b7b:7b7b", input => "1111:2222:3333:4444:5555:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::123.123.123.123", input => "1111:2222:3333:4444:5555::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::123.123.123.123", input => "1111:2222:3333:4444:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:7b7b:7b7b", input => "1111:2222:3333:4444::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:7b7b:7b7b", input => "1111:2222:3333:4444:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::123.123.123.123", input => "1111:2222:3333:4444::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::123.123.123.123", input => "1111:2222:3333:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:7b7b:7b7b", input => "1111:2222:3333::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:7b7b:7b7b", input => "1111:2222:3333:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::123.123.123.123", input => "1111:2222:3333::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::123.123.123.123", input => "1111:2222:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:7b7b:7b7b", input => "1111:2222::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:7b7b:7b7b", input => "1111:2222:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::123.123.123.123", input => "1111:2222::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::123.123.123.123", input => "1111:0000:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:7b7b:7b7b", input => "1111::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:7b7b:7b7b", input => "1111:0000:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::123.123.123.123", input => "1111::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::123.123.123.123", input => "0000:0000:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:7b7b:7b7b", input => "::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:7b7b:7b7b", input => "0000:0000:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "::123.123.123.123", input => "::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::6666:123.123.123.123", input => "1111:2222:3333:4444:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:6666:7b7b:7b7b", input => "1111:2222:3333:4444::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:6666:7b7b:7b7b", input => "1111:2222:3333:4444:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::6666:123.123.123.123", input => "1111:2222:3333:4444::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:123.123.123.123", input => "1111:2222:3333:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:6666:7b7b:7b7b", input => "1111:2222:3333::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:6666:7b7b:7b7b", input => "1111:2222:3333:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:123.123.123.123", input => "1111:2222:3333::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::6666:123.123.123.123", input => "1111:2222:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:6666:7b7b:7b7b", input => "1111:2222::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:6666:7b7b:7b7b", input => "1111:2222:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::6666:123.123.123.123", input => "1111:2222::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::6666:123.123.123.123", input => "1111:0000:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:6666:7b7b:7b7b", input => "1111::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:6666:7b7b:7b7b", input => "1111:0000:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::6666:123.123.123.123", input => "1111::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::6666:123.123.123.123", input => "0000:0000:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:6666:7b7b:7b7b", input => "::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:6666:7b7b:7b7b", input => "0000:0000:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "::6666:123.123.123.123", input => "::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::5555:6666:123.123.123.123", input => "1111:2222:3333:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:5555:6666:7b7b:7b7b", input => "1111:2222:3333::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:5555:6666:7b7b:7b7b", input => "1111:2222:3333:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::5555:6666:123.123.123.123", input => "1111:2222:3333::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:123.123.123.123", input => "1111:2222:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:5555:6666:7b7b:7b7b", input => "1111:2222::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:5555:6666:7b7b:7b7b", input => "1111:2222:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:123.123.123.123", input => "1111:2222::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::5555:6666:123.123.123.123", input => "1111:0000:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:5555:6666:7b7b:7b7b", input => "1111::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:5555:6666:7b7b:7b7b", input => "1111:0000:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::5555:6666:123.123.123.123", input => "1111::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::5555:6666:123.123.123.123", input => "0000:0000:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:5555:6666:7b7b:7b7b", input => "::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:5555:6666:7b7b:7b7b", input => "0000:0000:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "::5555:6666:123.123.123.123", input => "::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:123.123.123.123", input => "1111:2222:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:4444:5555:6666:7b7b:7b7b", input => "1111:2222::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:4444:5555:6666:7b7b:7b7b", input => "1111:2222:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:123.123.123.123", input => "1111:2222::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::4444:5555:6666:123.123.123.123", input => "1111:0000:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:4444:5555:6666:7b7b:7b7b", input => "1111::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:4444:5555:6666:7b7b:7b7b", input => "1111:0000:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::4444:5555:6666:123.123.123.123", input => "1111::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:123.123.123.123", input => "0000:0000:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:4444:5555:6666:7b7b:7b7b", input => "::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:4444:5555:6666:7b7b:7b7b", input => "0000:0000:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:123.123.123.123", input => "::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::3333:4444:5555:6666:123.123.123.123", input => "1111:0000:3333:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:3333:4444:5555:6666:7b7b:7b7b", input => "1111::3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:3333:4444:5555:6666:7b7b:7b7b", input => "1111:0000:3333:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::3333:4444:5555:6666:123.123.123.123", input => "1111::3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:123.123.123.123", input => "::2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:123.123.123.123", input => "::2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:123.123.123.123", input => "::2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:123.123.123.123", input => "::2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0:0", input => "::0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0:0", input => "::0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0:0", input => "::0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0:0", input => "::0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0", input => "::0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/25", input => "0000:007f:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/25", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/25", input => "0000:0080:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/25", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/103", input => "0000:0000:0000:0000:0000:0000:01ff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/103", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/103", input => "0000:0000:0000:0000:0000:0000:0200:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/103", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0", input => "::0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/35", input => "0000:0000:1fff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/35", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/35", input => "0000:0000:2000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/35", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/38", input => "0000:0000:03ff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/38", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/38", input => "0000:0000:0400:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/38", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0", input => "::0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/100", input => "0000:0000:0000:0000:0000:0000:0fff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/100", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/100", input => "0000:0000:0000:0000:0000:0000:1000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/100", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/46", input => "0000:0000:0003:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/46", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/46", input => "0000:0000:0004:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/46", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0", input => "::0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/15", input => "0001:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/15", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/15", input => "0002:0000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0/15", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/115", input => "0000:0000:0000:0000:0000:0000:0000:1fff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/115", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/115", input => "0000:0000:0000:0000:0000:0000:0000:2000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0/115", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0", input => "::0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/72", input => "0000:0000:0000:0000:00ff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/72", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/72", input => "0000:0000:0000:0000:0100:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0/72", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/81", input => "0000:0000:0000:0000:0000:7fff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/81", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/81", input => "0000:0000:0000:0000:0000:8000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0/81", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0", input => "::0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/119", input => "0000:0000:0000:0000:0000:0000:0000:01ff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/119", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/119", input => "0000:0000:0000:0000:0000:0000:0000:0200", ret => 0, }, { type => "op", name => "ipMatch", param => "::0/119", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/15", input => "0001:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/15", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/15", input => "0002:0000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0/15", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0::", input => "0:0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0::", input => "0:0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0::", input => "0:0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0::", input => "0:0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::", input => "0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/34", input => "0000:0000:3fff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/34", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/34", input => "0000:0000:4000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/34", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/114", input => "0000:0000:0000:0000:0000:0000:0000:3fff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/114", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/114", input => "0000:0000:0000:0000:0000:0000:0000:4000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/114", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::", input => "0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/54", input => "0000:0000:0000:03ff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/54", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/54", input => "0000:0000:0000:0400:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/54", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/72", input => "0000:0000:0000:0000:00ff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/72", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/72", input => "0000:0000:0000:0000:0100:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/72", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::", input => "0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/12", input => "000f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/12", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/12", input => "0010:0000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/12", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/17", input => "0000:7fff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/17", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/17", input => "0000:8000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/17", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::", input => "0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/63", input => "0000:0000:0000:0001:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/63", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/63", input => "0000:0000:0000:0002:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0::/63", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/83", input => "0000:0000:0000:0000:0000:1fff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/83", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/83", input => "0000:0000:0000:0000:0000:2000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0::/83", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::", input => "0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/62", input => "0000:0000:0000:0003:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/62", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/62", input => "0000:0000:0000:0004:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0::/62", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/95", input => "0000:0000:0000:0000:0000:0001:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/95", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/95", input => "0000:0000:0000:0000:0000:0002:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0::/95", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0::", input => "0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/13", input => "0007:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/13", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/13", input => "0008:0000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0::/13", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/56", input => "0000:0000:0000:00ff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/56", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/56", input => "0000:0000:0000:0100:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0::/56", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:a:b:c:d:e:f::", input => "0:a:b:c:d:e:f::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:a:b:c:d:e:f::", input => "0:a:b:c:d:e:f::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:a:b:c:d:e:f::", input => "0:a:b:c:d:e:f::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:a:b:c:d:e:f::", input => "0:a:b:c:d:e:f::", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:a:b:c:d:e:f", input => "::0:a:b:c:d:e:f", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:a:b:c:d:e:f", input => "::0:a:b:c:d:e:f", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:a:b:c:d:e:f", input => "::0:a:b:c:d:e:f", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:a:b:c:d:e:f", input => "::0:a:b:c:d:e:f", ret => 1, }, { type => "op", name => "ipMatch", param => "a:b:c:d:e:f:0::", input => "a:b:c:d:e:f:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "a:b:c:d:e:f:0::", input => "a:b:c:d:e:f:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "a:b:c:d:e:f:0::", input => "a:b:c:d:e:f:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "a:b:c:d:e:f:0::", input => "a:b:c:d:e:f:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::", input => "::", ret => 1, }, { type => "op", name => "ipMatch", param => "::/40", input => "0000:0000:00ff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::/40", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::/40", input => "0000:0000:0100:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::/40", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::/13", input => "0007:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::/13", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::/13", input => "0008:0000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::/13", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0:1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0:0:0:0:0:0:0:1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0:1", input => "0:0:0:0:0:0:0:1", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0:0", input => "0:0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:DB8:0:0:8:800:200C:417A", input => "2001:0db8:0000:0000:0008:0800:200c:417a", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0008:0800:200c:417a", input => "2001:DB8:0:0:8:800:200C:417A", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0008:0800:200c:417a", input => "2001:0db8:0000:0000:0008:0800:200c:417a", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:DB8:0:0:8:800:200C:417A", input => "2001:DB8:0:0:8:800:200C:417A", ret => 1, }, { type => "op", name => "ipMatch", param => "FF01:0:0:0:0:0:0:101", input => "ff01:0000:0000:0000:0000:0000:0000:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "ff01:0000:0000:0000:0000:0000:0000:0101", input => "FF01:0:0:0:0:0:0:101", ret => 1, }, { type => "op", name => "ipMatch", param => "ff01:0000:0000:0000:0000:0000:0000:0101", input => "ff01:0000:0000:0000:0000:0000:0000:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "FF01:0:0:0:0:0:0:101", input => "FF01:0:0:0:0:0:0:101", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:DB8::8:800:200C:417A", input => "2001:0db8:0000:0000:0008:0800:200c:417a", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0008:0800:200c:417a", input => "2001:DB8::8:800:200C:417A", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0008:0800:200c:417a", input => "2001:0db8:0000:0000:0008:0800:200c:417a", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:DB8::8:800:200C:417A", input => "2001:DB8::8:800:200C:417A", ret => 1, }, { type => "op", name => "ipMatch", param => "FF01::101", input => "ff01:0000:0000:0000:0000:0000:0000:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "ff01:0000:0000:0000:0000:0000:0000:0101", input => "FF01::101", ret => 1, }, { type => "op", name => "ipMatch", param => "ff01:0000:0000:0000:0000:0000:0000:0101", input => "ff01:0000:0000:0000:0000:0000:0000:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "FF01::101", input => "FF01::101", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::217:f2ff:fe07:ed62", input => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", input => "fe80::217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", input => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::217:f2ff:fe07:ed62", input => "fe80::217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0000:1234:0000:0000:C1C0:ABCD:0876", input => "2001:0000:1234:0000:0000:c1c0:abcd:0876", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0000:1234:0000:0000:c1c0:abcd:0876", input => "2001:0000:1234:0000:0000:C1C0:ABCD:0876", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0000:1234:0000:0000:c1c0:abcd:0876", input => "2001:0000:1234:0000:0000:c1c0:abcd:0876", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0000:1234:0000:0000:C1C0:ABCD:0876", input => "2001:0000:1234:0000:0000:C1C0:ABCD:0876", ret => 1, }, { type => "op", name => "ipMatch", param => "3ffe:0b00:0000:0000:0001:0000:0000:000a", input => "3ffe:0b00:0000:0000:0001:0000:0000:000a", ret => 1, }, { type => "op", name => "ipMatch", param => "3ffe:0b00:0000:0000:0001:0000:0000:000a", input => "3ffe:0b00:0000:0000:0001:0000:0000:000a", ret => 1, }, { type => "op", name => "ipMatch", param => "3ffe:0b00:0000:0000:0001:0000:0000:000a", input => "3ffe:0b00:0000:0000:0001:0000:0000:000a", ret => 1, }, { type => "op", name => "ipMatch", param => "3ffe:0b00:0000:0000:0001:0000:0000:000a", input => "3ffe:0b00:0000:0000:0001:0000:0000:000a", ret => 1, }, { type => "op", name => "ipMatch", param => "FF02:0000:0000:0000:0000:0000:0000:0001", input => "ff02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02:0000:0000:0000:0000:0000:0000:0001", input => "FF02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02:0000:0000:0000:0000:0000:0000:0001", input => "ff02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "FF02:0000:0000:0000:0000:0000:0000:0001", input => "FF02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2::10", input => "0002:0000:0000:0000:0000:0000:0000:0010", ret => 1, }, { type => "op", name => "ipMatch", param => "0002:0000:0000:0000:0000:0000:0000:0010", input => "2::10", ret => 1, }, { type => "op", name => "ipMatch", param => "0002:0000:0000:0000:0000:0000:0000:0010", input => "0002:0000:0000:0000:0000:0000:0000:0010", ret => 1, }, { type => "op", name => "ipMatch", param => "2::10", input => "2::10", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02::1", input => "ff02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02:0000:0000:0000:0000:0000:0000:0001", input => "ff02::1", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02:0000:0000:0000:0000:0000:0000:0001", input => "ff02:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "ff02::1", input => "ff02::1", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/9", input => "feff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/9", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/9", input => "ff00:0000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/9", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/47", input => "fe80:0000:0001:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/47", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/47", input => "fe80:0000:0002:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/47", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2002::", input => "2002:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2002:0000:0000:0000:0000:0000:0000:0000", input => "2002::", ret => 1, }, { type => "op", name => "ipMatch", param => "2002:0000:0000:0000:0000:0000:0000:0000", input => "2002:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::", input => "2002::", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/16", input => "2002:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/16", input => "2002:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/16", input => "2003:0000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "2002::/16", input => "2001:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2002::/25", input => "2002:007f:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/25", input => "2002:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2002::/25", input => "2002:0080:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "2002::/25", input => "2001:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:db8::", input => "2001:0db8:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:0000:0000", input => "2001:db8::", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:0000:0000", input => "2001:0db8:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::", input => "2001:db8::", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::/105", input => "2001:0db8:0000:0000:0000:0000:007f:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::/105", input => "2001:0db8:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::/105", input => "2001:0db8:0000:0000:0000:0000:0080:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:db8::/105", input => "2001:0db7:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:db8::/122", input => "2001:0db8:0000:0000:0000:0000:0000:003f", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::/122", input => "2001:0db8:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::/122", input => "2001:0db8:0000:0000:0000:0000:0000:0040", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:db8::/122", input => "2001:0db7:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234::", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234::", input => "2001:0db8:1234::", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:0:0", input => "0000:0000:0000:0000:0000:ffff:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0000:0000", input => "::ffff:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0000:0000", input => "0000:0000:0000:0000:0000:ffff:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:0:0", input => "::ffff:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:0:0/114", input => "0000:0000:0000:0000:0000:ffff:0000:3fff", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:0:0/114", input => "0000:0000:0000:0000:0000:ffff:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:0:0/114", input => "0000:0000:0000:0000:0000:ffff:0000:4000", ret => 0, }, { type => "op", name => "ipMatch", param => "::ffff:0:0/114", input => "0000:0000:0000:0000:0000:fffe:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "::1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6:7:8", input => "0001:0002:0003:0004:0005:0006:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0007:0008", input => "1:2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0007:0008", input => "0001:0002:0003:0004:0005:0006:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6:7:8", input => "1:2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::8", input => "0001:0002:0003:0004:0005:0006:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0000:0008", input => "1:2:3:4:5:6::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0000:0008", input => "0001:0002:0003:0004:0005:0006:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::8", input => "1:2:3:4:5:6::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::8", input => "0001:0002:0003:0004:0005:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0000:0008", input => "1:2:3:4:5::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0000:0008", input => "0001:0002:0003:0004:0005:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::8", input => "1:2:3:4:5::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::8", input => "0001:0002:0003:0004:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0000:0008", input => "1:2:3:4::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0000:0008", input => "0001:0002:0003:0004:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::8", input => "1:2:3:4::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::8", input => "0001:0002:0003:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0000:0008", input => "1:2:3::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0000:0008", input => "0001:0002:0003:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::8", input => "1:2:3::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::8", input => "0001:0002:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0000:0008", input => "1:2::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0000:0008", input => "0001:0002:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::8", input => "1:2::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1::8", input => "0001:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0008", input => "1::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0008", input => "0001:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1::8", input => "1::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5:6:7", input => "0001:0000:0002:0003:0004:0005:0006:0007", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0002:0003:0004:0005:0006:0007", input => "1::2:3:4:5:6:7", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0002:0003:0004:0005:0006:0007", input => "0001:0000:0002:0003:0004:0005:0006:0007", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5:6:7", input => "1::2:3:4:5:6:7", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5:6", input => "0001:0000:0000:0002:0003:0004:0005:0006", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0002:0003:0004:0005:0006", input => "1::2:3:4:5:6", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0002:0003:0004:0005:0006", input => "0001:0000:0000:0002:0003:0004:0005:0006", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5:6", input => "1::2:3:4:5:6", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5", input => "0001:0000:0000:0000:0002:0003:0004:0005", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0002:0003:0004:0005", input => "1::2:3:4:5", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0002:0003:0004:0005", input => "0001:0000:0000:0000:0002:0003:0004:0005", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4:5", input => "1::2:3:4:5", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4", input => "0001:0000:0000:0000:0000:0002:0003:0004", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0002:0003:0004", input => "1::2:3:4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0002:0003:0004", input => "0001:0000:0000:0000:0000:0002:0003:0004", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3:4", input => "1::2:3:4", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3", input => "0001:0000:0000:0000:0000:0000:0002:0003", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0002:0003", input => "1::2:3", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0002:0003", input => "0001:0000:0000:0000:0000:0000:0002:0003", ret => 1, }, { type => "op", name => "ipMatch", param => "1::2:3", input => "1::2:3", ret => 1, }, { type => "op", name => "ipMatch", param => "1::8", input => "0001:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0008", input => "1::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0008", input => "0001:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1::8", input => "1::8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7:8", input => "::2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7:8", input => "::2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7:8", input => "::2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7:8", input => "::2:3:4:5:6:7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7", input => "0000:0000:0002:0003:0004:0005:0006:0007", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0002:0003:0004:0005:0006:0007", input => "::2:3:4:5:6:7", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0002:0003:0004:0005:0006:0007", input => "0000:0000:0002:0003:0004:0005:0006:0007", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6:7", input => "::2:3:4:5:6:7", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6", input => "0000:0000:0000:0002:0003:0004:0005:0006", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0002:0003:0004:0005:0006", input => "::2:3:4:5:6", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0002:0003:0004:0005:0006", input => "0000:0000:0000:0002:0003:0004:0005:0006", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5:6", input => "::2:3:4:5:6", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5", input => "0000:0000:0000:0000:0002:0003:0004:0005", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0002:0003:0004:0005", input => "::2:3:4:5", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0002:0003:0004:0005", input => "0000:0000:0000:0000:0002:0003:0004:0005", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4:5", input => "::2:3:4:5", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4", input => "0000:0000:0000:0000:0000:0002:0003:0004", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0002:0003:0004", input => "::2:3:4", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0002:0003:0004", input => "0000:0000:0000:0000:0000:0002:0003:0004", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3:4", input => "::2:3:4", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3", input => "0000:0000:0000:0000:0000:0000:0002:0003", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0002:0003", input => "::2:3", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0002:0003", input => "0000:0000:0000:0000:0000:0000:0002:0003", ret => 1, }, { type => "op", name => "ipMatch", param => "::2:3", input => "::2:3", ret => 1, }, { type => "op", name => "ipMatch", param => "::8", input => "0000:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0008", input => "::8", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0008", input => "0000:0000:0000:0000:0000:0000:0000:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "::8", input => "::8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::", input => "0001:0002:0003:0004:0005:0006:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0000:0000", input => "1:2:3:4:5:6::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0000:0000", input => "0001:0002:0003:0004:0005:0006:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::", input => "1:2:3:4:5:6::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::/106", input => "0001:0002:0003:0004:0005:0006:003f:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::/106", input => "0001:0002:0003:0004:0005:0006:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::/106", input => "0001:0002:0003:0004:0005:0006:0040:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6::/106", input => "0001:0002:0003:0004:0005:0005:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::", input => "0001:0002:0003:0004:0005:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0000:0000", input => "1:2:3:4:5::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0000:0000", input => "0001:0002:0003:0004:0005:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::", input => "1:2:3:4:5::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::", input => "0001:0002:0003:0004:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0000:0000", input => "1:2:3:4::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0000:0000", input => "0001:0002:0003:0004:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::", input => "1:2:3:4::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/68", input => "0001:0002:0003:0004:0fff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/68", input => "0001:0002:0003:0004:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/68", input => "0001:0002:0003:0004:1000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4::/68", input => "0001:0002:0003:0003:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3::", input => "0001:0002:0003:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0000:0000", input => "1:2:3::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0000:0000", input => "0001:0002:0003:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::", input => "1:2:3::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::/56", input => "0001:0002:0003:00ff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::/56", input => "0001:0002:0003:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::/56", input => "0001:0002:0003:0100:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3::/56", input => "0001:0002:0002:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3::/65", input => "0001:0002:0003:0000:7fff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::/65", input => "0001:0002:0003:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::/65", input => "0001:0002:0003:0000:8000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3::/65", input => "0001:0002:0002:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2::", input => "0001:0002:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0000:0000", input => "1:2::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0000:0000", input => "0001:0002:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::", input => "1:2::", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::/32", input => "0001:0002:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::/32", input => "0001:0002:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::/32", input => "0001:0003:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2::/32", input => "0001:0001:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2::/79", input => "0001:0002:0000:0000:0001:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::/79", input => "0001:0002:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::/79", input => "0001:0002:0000:0000:0002:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2::/79", input => "0001:0001:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1::", input => "0001:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0000", input => "1::", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0000:0000", input => "0001:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1::", input => "1::", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/103", input => "0001:0000:0000:0000:0000:0000:01ff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/103", input => "0001:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/103", input => "0001:0000:0000:0000:0000:0000:0200:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1::/103", input => "0000:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1::/36", input => "0001:0000:0fff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/36", input => "0001:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1::/36", input => "0001:0000:1000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1::/36", input => "0000:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::7:8", input => "0001:0002:0003:0004:0005:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0007:0008", input => "1:2:3:4:5::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0007:0008", input => "0001:0002:0003:0004:0005:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::7:8", input => "1:2:3:4:5::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::7:8", input => "0001:0002:0003:0004:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0007:0008", input => "1:2:3:4::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0007:0008", input => "0001:0002:0003:0004:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::7:8", input => "1:2:3:4::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::7:8", input => "0001:0002:0003:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0007:0008", input => "1:2:3::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0007:0008", input => "0001:0002:0003:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::7:8", input => "1:2:3::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::7:8", input => "0001:0002:0000:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0007:0008", input => "1:2::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0007:0008", input => "0001:0002:0000:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::7:8", input => "1:2::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::7:8/126", input => "0001:0002:0000:0000:0000:0000:0007:000b", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::7:8/126", input => "0001:0002:0000:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::7:8/126", input => "0001:0002:0000:0000:0000:0000:0007:000c", ret => 0, }, { type => "op", name => "ipMatch", param => "1:2::7:8/126", input => "0001:0002:0000:0000:0000:0000:0007:0007", ret => 0, }, { type => "op", name => "ipMatch", param => "1::7:8", input => "0001:0000:0000:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0007:0008", input => "1::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0007:0008", input => "0001:0000:0000:0000:0000:0000:0007:0008", ret => 1, }, { type => "op", name => "ipMatch", param => "1::7:8", input => "1::7:8", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6:1.2.3.4", input => "0001:0002:0003:0004:0005:0006:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0102:0304", input => "1:2:3:4:5:6:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0006:0102:0304", input => "0001:0002:0003:0004:0005:0006:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5:6:1.2.3.4", input => "1:2:3:4:5:6:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::1.2.3.4", input => "0001:0002:0003:0004:0005:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0102:0304", input => "1:2:3:4:5::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0005:0000:0102:0304", input => "0001:0002:0003:0004:0005:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4:5::1.2.3.4", input => "1:2:3:4:5::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::1.2.3.4", input => "0001:0002:0003:0004:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0102:0304", input => "1:2:3:4::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0000:0102:0304", input => "0001:0002:0003:0004:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::1.2.3.4", input => "1:2:3:4::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::1.2.3.4", input => "0001:0002:0003:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0102:0304", input => "1:2:3::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0000:0102:0304", input => "0001:0002:0003:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::1.2.3.4", input => "1:2:3::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::1.2.3.4", input => "0001:0002:0000:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0102:0304", input => "1:2::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0000:0102:0304", input => "0001:0002:0000:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::1.2.3.4", input => "1:2::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1::1.2.3.4", input => "0001:0000:0000:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0102:0304", input => "1::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0000:0102:0304", input => "0001:0000:0000:0000:0000:0000:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1::1.2.3.4", input => "1::1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::5:1.2.3.4", input => "0001:0002:0003:0004:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0005:0102:0304", input => "1:2:3:4::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0004:0000:0005:0102:0304", input => "0001:0002:0003:0004:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3:4::5:1.2.3.4", input => "1:2:3:4::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::5:1.2.3.4", input => "0001:0002:0003:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0005:0102:0304", input => "1:2:3::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0003:0000:0000:0005:0102:0304", input => "0001:0002:0003:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2:3::5:1.2.3.4", input => "1:2:3::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::5:1.2.3.4", input => "0001:0002:0000:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0005:0102:0304", input => "1:2::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0002:0000:0000:0000:0005:0102:0304", input => "0001:0002:0000:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1:2::5:1.2.3.4", input => "1:2::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1::5:1.2.3.4", input => "0001:0000:0000:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0005:0102:0304", input => "1::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0005:0102:0304", input => "0001:0000:0000:0000:0000:0005:0102:0304", ret => 1, }, { type => "op", name => "ipMatch", param => "1::5:1.2.3.4", input => "1::5:1.2.3.4", ret => 1, }, { type => "op", name => "ipMatch", param => "1::5:11.22.33.44", input => "0001:0000:0000:0000:0000:0005:0b16:212c", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0005:0b16:212c", input => "1::5:11.22.33.44", ret => 1, }, { type => "op", name => "ipMatch", param => "0001:0000:0000:0000:0000:0005:0b16:212c", input => "0001:0000:0000:0000:0000:0005:0b16:212c", ret => 1, }, { type => "op", name => "ipMatch", param => "1::5:11.22.33.44", input => "1::5:11.22.33.44", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::217:f2ff:254.7.237.98", input => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", input => "fe80::217:f2ff:254.7.237.98", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", input => "fe80:0000:0000:0000:0217:f2ff:fe07:ed62", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::217:f2ff:254.7.237.98", input => "fe80::217:f2ff:254.7.237.98", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.168.1.26", input => "0000:0000:0000:0000:0000:ffff:c0a8:011a", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c0a8:011a", input => "::ffff:192.168.1.26", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c0a8:011a", input => "0000:0000:0000:0000:0000:ffff:c0a8:011a", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.168.1.26", input => "::ffff:192.168.1.26", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.168.1.1", input => "0000:0000:0000:0000:0000:ffff:c0a8:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c0a8:0101", input => "::ffff:192.168.1.1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c0a8:0101", input => "0000:0000:0000:0000:0000:ffff:c0a8:0101", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.168.1.1", input => "::ffff:192.168.1.1", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:13.1.68.3", input => "0000:0000:0000:0000:0000:0000:0d01:4403", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0d01:4403", input => "0:0:0:0:0:0:13.1.68.3", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0d01:4403", input => "0000:0000:0000:0000:0000:0000:0d01:4403", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:13.1.68.3", input => "0:0:0:0:0:0:13.1.68.3", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:FFFF:129.144.52.38", input => "0000:0000:0000:0000:0000:ffff:8190:3426", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:8190:3426", input => "0:0:0:0:0:FFFF:129.144.52.38", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:8190:3426", input => "0000:0000:0000:0000:0000:ffff:8190:3426", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:FFFF:129.144.52.38", input => "0:0:0:0:0:FFFF:129.144.52.38", ret => 1, }, { type => "op", name => "ipMatch", param => "::13.1.68.3", input => "0000:0000:0000:0000:0000:0000:0d01:4403", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0d01:4403", input => "::13.1.68.3", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0d01:4403", input => "0000:0000:0000:0000:0000:0000:0d01:4403", ret => 1, }, { type => "op", name => "ipMatch", param => "::13.1.68.3", input => "::13.1.68.3", ret => 1, }, { type => "op", name => "ipMatch", param => "::FFFF:129.144.52.38", input => "0000:0000:0000:0000:0000:ffff:8190:3426", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:8190:3426", input => "::FFFF:129.144.52.38", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:8190:3426", input => "0000:0000:0000:0000:0000:ffff:8190:3426", ret => 1, }, { type => "op", name => "ipMatch", param => "::FFFF:129.144.52.38", input => "::FFFF:129.144.52.38", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0:0:0:204:61ff:254.157.241.86", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0:0:0:204:61ff:254.157.241.86", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0:0:0:204:61ff:254.157.241.86", input => "fe80:0:0:0:204:61ff:254.157.241.86", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::204:61ff:254.157.241.86", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80::204:61ff:254.157.241.86", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::204:61ff:254.157.241.86", input => "fe80::204:61ff:254.157.241.86", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:12.34.56.78", input => "0000:0000:0000:0000:0000:ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0c22:384e", input => "::ffff:12.34.56.78", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0c22:384e", input => "0000:0000:0000:0000:0000:ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:12.34.56.78", input => "::ffff:12.34.56.78", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.0.2.128", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c000:0280", input => "::ffff:192.0.2.128", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c000:0280", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:192.0.2.128", input => "::ffff:192.0.2.128", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0:0:0:204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0:0:0:204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0:0:0:204:61ff:fe9d:f156", input => "fe80:0:0:0:204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80::204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", input => "fe80:0000:0000:0000:0204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::204:61ff:fe9d:f156", input => "fe80::204:61ff:fe9d:f156", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/51", input => "fe80:0000:0000:1fff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/51", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/51", input => "fe80:0000:0000:2000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/51", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::1", input => "fe80:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0001", input => "fe80::1", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0001", input => "fe80:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::1", input => "fe80::1", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:c000:280", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c000:0280", input => "::ffff:c000:280", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:c000:0280", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:c000:280", input => "::ffff:c000:280", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:c000:280/126", input => "0000:0000:0000:0000:0000:ffff:c000:0283", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:c000:280/126", input => "0000:0000:0000:0000:0000:ffff:c000:0280", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:c000:280/126", input => "0000:0000:0000:0000:0000:ffff:c000:0284", ret => 0, }, { type => "op", name => "ipMatch", param => "::ffff:c000:280/126", input => "0000:0000:0000:0000:0000:ffff:c000:027f", ret => 0, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:85a3:0:0:8a2e:370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:db8:85a3:0:0:8a2e:370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:85a3:0:0:8a2e:370:7334", input => "2001:db8:85a3:0:0:8a2e:370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:85a3::8a2e:370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:db8:85a3::8a2e:370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", input => "2001:0db8:85a3:0000:0000:8a2e:0370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:85a3::8a2e:370:7334", input => "2001:db8:85a3::8a2e:370:7334", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000::1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000::1428:57ab", input => "2001:0db8:0000:0000:0000::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0:0:0:0:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0:0:0:0:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0:0:0:0:1428:57ab", input => "2001:0db8:0:0:0:0:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0:0::1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0:0::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0:0::1428:57ab", input => "2001:0db8:0:0::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8::1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8::1428:57ab", input => "2001:0db8::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:db8::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:0000:0000:0000:0000:1428:57ab", input => "2001:0db8:0000:0000:0000:0000:1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8::1428:57ab", input => "2001:db8::1428:57ab", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0001", input => "0000:0000:0000:0000:0000:0000:0000:0001", ret => 1, }, { type => "op", name => "ipMatch", param => "::1", input => "::1", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:0c22:384e", input => "0000:0000:0000:0000:0000:ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0c22:384e", input => "::ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:ffff:0c22:384e", input => "0000:0000:0000:0000:0000:ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "::ffff:0c22:384e", input => "::ffff:0c22:384e", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:0000:0000:0000:0000:0000", input => "2001:0db8:1234:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", input => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", input => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", input => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", input => "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:a::123", input => "2001:0db8:000a:0000:0000:0000:0000:0123", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:000a:0000:0000:0000:0000:0123", input => "2001:db8:a::123", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:0db8:000a:0000:0000:0000:0000:0123", input => "2001:0db8:000a:0000:0000:0000:0000:0123", ret => 1, }, { type => "op", name => "ipMatch", param => "2001:db8:a::123", input => "2001:db8:a::123", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80:0000:0000:0000:0000:0000:0000:0000", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::", input => "fe80::", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/13", input => "fe87:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/13", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/13", input => "fe88:0000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/13", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/44", input => "fe80:0000:000f:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/44", input => "fe80:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "fe80::/44", input => "fe80:0000:0010:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "fe80::/44", input => "fe7f:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777:8888", input => "1111:2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777:8888", input => "1111:2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777:8888", input => "1111:2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777:8888", input => "1111:2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777::", input => "1111:2222:3333:4444:5555:6666:7777::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777::", input => "1111:2222:3333:4444:5555:6666:7777::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777::", input => "1111:2222:3333:4444:5555:6666:7777::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7777::", input => "1111:2222:3333:4444:5555:6666:7777::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::", input => "1111:2222:3333:4444:5555:6666:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:0000:0000", input => "1111:2222:3333:4444:5555:6666::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:0000:0000", input => "1111:2222:3333:4444:5555:6666:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::", input => "1111:2222:3333:4444:5555:6666::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::/120", input => "1111:2222:3333:4444:5555:6666:0000:00ff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::/120", input => "1111:2222:3333:4444:5555:6666:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::/120", input => "1111:2222:3333:4444:5555:6666:0000:0100", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::/120", input => "1111:2222:3333:4444:5555:6665:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::", input => "1111:2222:3333:4444:5555:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:0000:0000", input => "1111:2222:3333:4444:5555::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:0000:0000", input => "1111:2222:3333:4444:5555:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::", input => "1111:2222:3333:4444:5555::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::/85", input => "1111:2222:3333:4444:5555:07ff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::/85", input => "1111:2222:3333:4444:5555:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::/85", input => "1111:2222:3333:4444:5555:0800:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::/85", input => "1111:2222:3333:4444:5554:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::", input => "1111:2222:3333:4444:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:0000:0000", input => "1111:2222:3333:4444::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:0000:0000", input => "1111:2222:3333:4444:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::", input => "1111:2222:3333:4444::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::", input => "1111:2222:3333:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:0000:0000", input => "1111:2222:3333::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:0000:0000", input => "1111:2222:3333:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::", input => "1111:2222:3333::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/50", input => "1111:2222:3333:3fff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/50", input => "1111:2222:3333:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/50", input => "1111:2222:3333:4000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::/50", input => "1111:2222:3332:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222::", input => "1111:2222:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:0000:0000", input => "1111:2222::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:0000:0000", input => "1111:2222:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::", input => "1111:2222::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::/88", input => "1111:2222:0000:0000:0000:00ff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::/88", input => "1111:2222:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::/88", input => "1111:2222:0000:0000:0000:0100:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222::/88", input => "1111:2221:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::", input => "1111:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:0000:0000", input => "1111::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:0000:0000", input => "1111:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::", input => "1111::", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::/37", input => "1111:0000:07ff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::/37", input => "1111:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::/37", input => "1111:0000:0800:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::/37", input => "1110:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::/54", input => "1111:0000:0000:03ff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::/54", input => "1111:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::/54", input => "1111:0000:0000:0400:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::/54", input => "1110:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::8888", input => "1111:2222:3333:4444:5555:6666:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:0000:8888", input => "1111:2222:3333:4444:5555:6666::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:0000:8888", input => "1111:2222:3333:4444:5555:6666:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666::8888", input => "1111:2222:3333:4444:5555:6666::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::8888", input => "1111:2222:3333:4444:5555:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:0000:8888", input => "1111:2222:3333:4444:5555::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:0000:8888", input => "1111:2222:3333:4444:5555:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::8888", input => "1111:2222:3333:4444:5555::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::8888", input => "1111:2222:3333:4444:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:0000:8888", input => "1111:2222:3333:4444::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:0000:8888", input => "1111:2222:3333:4444:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::8888", input => "1111:2222:3333:4444::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::8888", input => "1111:2222:3333:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:0000:8888", input => "1111:2222:3333::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:0000:8888", input => "1111:2222:3333:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::8888", input => "1111:2222:3333::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::8888/127", input => "1111:2222:3333:0000:0000:0000:0000:8889", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::8888/127", input => "1111:2222:3333:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::8888/127", input => "1111:2222:3333:0000:0000:0000:0000:888a", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::8888/127", input => "1111:2222:3333:0000:0000:0000:0000:8887", ret => 0, }, { type => "op", name => "ipMatch", param => "1111:2222::8888", input => "1111:2222:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:0000:8888", input => "1111:2222::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:0000:8888", input => "1111:2222:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::8888", input => "1111:2222::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::8888", input => "1111:0000:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:0000:8888", input => "1111::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:0000:8888", input => "1111:0000:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::8888", input => "1111::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::8888", input => "0000:0000:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:8888", input => "::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:8888", input => "0000:0000:0000:0000:0000:0000:0000:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::8888", input => "::8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::7777:8888", input => "1111:2222:3333:4444:5555:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:7777:8888", input => "1111:2222:3333:4444:5555::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:7777:8888", input => "1111:2222:3333:4444:5555:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::7777:8888", input => "1111:2222:3333:4444:5555::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::7777:8888", input => "1111:2222:3333:4444:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:7777:8888", input => "1111:2222:3333:4444::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:7777:8888", input => "1111:2222:3333:4444:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::7777:8888", input => "1111:2222:3333:4444::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::7777:8888", input => "1111:2222:3333:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:7777:8888", input => "1111:2222:3333::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:7777:8888", input => "1111:2222:3333:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::7777:8888", input => "1111:2222:3333::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::7777:8888", input => "1111:2222:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:7777:8888", input => "1111:2222::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:7777:8888", input => "1111:2222:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::7777:8888", input => "1111:2222::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::7777:8888", input => "1111:0000:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:7777:8888", input => "1111::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:7777:8888", input => "1111:0000:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::7777:8888", input => "1111::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::7777:8888", input => "0000:0000:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:7777:8888", input => "::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:7777:8888", input => "0000:0000:0000:0000:0000:0000:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::7777:8888", input => "::7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::6666:7777:8888", input => "1111:2222:3333:4444:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:6666:7777:8888", input => "1111:2222:3333:4444::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:6666:7777:8888", input => "1111:2222:3333:4444:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::6666:7777:8888", input => "1111:2222:3333:4444::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:7777:8888", input => "1111:2222:3333:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:6666:7777:8888", input => "1111:2222:3333::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:6666:7777:8888", input => "1111:2222:3333:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:7777:8888", input => "1111:2222:3333::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::6666:7777:8888", input => "1111:2222:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:6666:7777:8888", input => "1111:2222::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:6666:7777:8888", input => "1111:2222:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::6666:7777:8888", input => "1111:2222::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::6666:7777:8888", input => "1111:0000:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:6666:7777:8888", input => "1111::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:6666:7777:8888", input => "1111:0000:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::6666:7777:8888", input => "1111::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::6666:7777:8888", input => "0000:0000:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:6666:7777:8888", input => "::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:6666:7777:8888", input => "0000:0000:0000:0000:0000:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::6666:7777:8888", input => "::6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::5555:6666:7777:8888", input => "1111:2222:3333:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:5555:6666:7777:8888", input => "1111:2222:3333::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:5555:6666:7777:8888", input => "1111:2222:3333:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::5555:6666:7777:8888", input => "1111:2222:3333::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:7777:8888", input => "1111:2222:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:5555:6666:7777:8888", input => "1111:2222::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:5555:6666:7777:8888", input => "1111:2222:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:7777:8888", input => "1111:2222::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::5555:6666:7777:8888", input => "1111:0000:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:5555:6666:7777:8888", input => "1111::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:5555:6666:7777:8888", input => "1111:0000:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::5555:6666:7777:8888", input => "1111::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::5555:6666:7777:8888", input => "0000:0000:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:5555:6666:7777:8888", input => "::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:5555:6666:7777:8888", input => "0000:0000:0000:0000:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::5555:6666:7777:8888", input => "::5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:7777:8888", input => "1111:2222:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:4444:5555:6666:7777:8888", input => "1111:2222::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:4444:5555:6666:7777:8888", input => "1111:2222:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:7777:8888", input => "1111:2222::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::4444:5555:6666:7777:8888", input => "1111:0000:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:4444:5555:6666:7777:8888", input => "1111::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:4444:5555:6666:7777:8888", input => "1111:0000:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::4444:5555:6666:7777:8888", input => "1111::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:7777:8888", input => "0000:0000:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:4444:5555:6666:7777:8888", input => "::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:4444:5555:6666:7777:8888", input => "0000:0000:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:7777:8888", input => "::4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:7777:8888/126", input => "0000:0000:0000:4444:5555:6666:7777:888b", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:7777:8888/126", input => "0000:0000:0000:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:7777:8888/126", input => "0000:0000:0000:4444:5555:6666:7777:888c", ret => 0, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:7777:8888/126", input => "0000:0000:0000:4444:5555:6666:7777:8887", ret => 0, }, { type => "op", name => "ipMatch", param => "1111::3333:4444:5555:6666:7777:8888", input => "1111:0000:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:3333:4444:5555:6666:7777:8888", input => "1111::3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:3333:4444:5555:6666:7777:8888", input => "1111:0000:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::3333:4444:5555:6666:7777:8888", input => "1111::3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::3333:4444:5555:6666:7777:8888", input => "0000:0000:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:3333:4444:5555:6666:7777:8888", input => "::3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:3333:4444:5555:6666:7777:8888", input => "0000:0000:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::3333:4444:5555:6666:7777:8888", input => "::3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:7777:8888", input => "::2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:7777:8888", input => "::2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:7777:8888", input => "::2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:7777:8888", input => "::2222:3333:4444:5555:6666:7777:8888", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:123.123.123.123", input => "1111:2222:3333:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7b7b:7b7b", input => "1111:2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:7b7b:7b7b", input => "1111:2222:3333:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:6666:123.123.123.123", input => "1111:2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::123.123.123.123", input => "1111:2222:3333:4444:5555:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:7b7b:7b7b", input => "1111:2222:3333:4444:5555::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555:0000:7b7b:7b7b", input => "1111:2222:3333:4444:5555:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:5555::123.123.123.123", input => "1111:2222:3333:4444:5555::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::123.123.123.123", input => "1111:2222:3333:4444:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:7b7b:7b7b", input => "1111:2222:3333:4444::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:0000:7b7b:7b7b", input => "1111:2222:3333:4444:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::123.123.123.123", input => "1111:2222:3333:4444::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::123.123.123.123", input => "1111:2222:3333:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:7b7b:7b7b", input => "1111:2222:3333::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:0000:7b7b:7b7b", input => "1111:2222:3333:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::123.123.123.123", input => "1111:2222:3333::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::123.123.123.123", input => "1111:2222:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:7b7b:7b7b", input => "1111:2222::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:0000:7b7b:7b7b", input => "1111:2222:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::123.123.123.123", input => "1111:2222::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::123.123.123.123", input => "1111:0000:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:7b7b:7b7b", input => "1111::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:0000:7b7b:7b7b", input => "1111:0000:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::123.123.123.123", input => "1111::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::123.123.123.123", input => "0000:0000:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:7b7b:7b7b", input => "::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:7b7b:7b7b", input => "0000:0000:0000:0000:0000:0000:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "::123.123.123.123", input => "::123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::6666:123.123.123.123", input => "1111:2222:3333:4444:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:6666:7b7b:7b7b", input => "1111:2222:3333:4444::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444:0000:6666:7b7b:7b7b", input => "1111:2222:3333:4444:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:4444::6666:123.123.123.123", input => "1111:2222:3333:4444::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:123.123.123.123", input => "1111:2222:3333:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:6666:7b7b:7b7b", input => "1111:2222:3333::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:0000:6666:7b7b:7b7b", input => "1111:2222:3333:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::6666:123.123.123.123", input => "1111:2222:3333::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::6666:123.123.123.123", input => "1111:2222:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:6666:7b7b:7b7b", input => "1111:2222::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:0000:6666:7b7b:7b7b", input => "1111:2222:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::6666:123.123.123.123", input => "1111:2222::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::6666:123.123.123.123", input => "1111:0000:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:6666:7b7b:7b7b", input => "1111::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:0000:6666:7b7b:7b7b", input => "1111:0000:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::6666:123.123.123.123", input => "1111::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::6666:123.123.123.123", input => "0000:0000:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:6666:7b7b:7b7b", input => "::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:6666:7b7b:7b7b", input => "0000:0000:0000:0000:0000:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "::6666:123.123.123.123", input => "::6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::5555:6666:123.123.123.123", input => "1111:2222:3333:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:5555:6666:7b7b:7b7b", input => "1111:2222:3333::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333:0000:5555:6666:7b7b:7b7b", input => "1111:2222:3333:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:3333::5555:6666:123.123.123.123", input => "1111:2222:3333::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:123.123.123.123", input => "1111:2222:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:5555:6666:7b7b:7b7b", input => "1111:2222::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:0000:5555:6666:7b7b:7b7b", input => "1111:2222:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::5555:6666:123.123.123.123", input => "1111:2222::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::5555:6666:123.123.123.123", input => "1111:0000:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:5555:6666:7b7b:7b7b", input => "1111::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:0000:5555:6666:7b7b:7b7b", input => "1111:0000:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::5555:6666:123.123.123.123", input => "1111::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::5555:6666:123.123.123.123", input => "0000:0000:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:5555:6666:7b7b:7b7b", input => "::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:5555:6666:7b7b:7b7b", input => "0000:0000:0000:0000:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "::5555:6666:123.123.123.123", input => "::5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:123.123.123.123", input => "1111:2222:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:4444:5555:6666:7b7b:7b7b", input => "1111:2222::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222:0000:4444:5555:6666:7b7b:7b7b", input => "1111:2222:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:2222::4444:5555:6666:123.123.123.123", input => "1111:2222::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::4444:5555:6666:123.123.123.123", input => "1111:0000:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:4444:5555:6666:7b7b:7b7b", input => "1111::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:0000:4444:5555:6666:7b7b:7b7b", input => "1111:0000:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::4444:5555:6666:123.123.123.123", input => "1111::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:123.123.123.123", input => "0000:0000:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:4444:5555:6666:7b7b:7b7b", input => "::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:4444:5555:6666:7b7b:7b7b", input => "0000:0000:0000:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "::4444:5555:6666:123.123.123.123", input => "::4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::3333:4444:5555:6666:123.123.123.123", input => "1111:0000:3333:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:3333:4444:5555:6666:7b7b:7b7b", input => "1111::3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "1111:0000:3333:4444:5555:6666:7b7b:7b7b", input => "1111:0000:3333:4444:5555:6666:7b7b:7b7b", ret => 1, }, { type => "op", name => "ipMatch", param => "1111::3333:4444:5555:6666:123.123.123.123", input => "1111::3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:123.123.123.123", input => "::2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:123.123.123.123", input => "::2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:123.123.123.123", input => "::2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::2222:3333:4444:5555:6666:123.123.123.123", input => "::2222:3333:4444:5555:6666:123.123.123.123", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0:0", input => "::0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0:0", input => "::0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0:0", input => "::0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0:0", input => "::0:0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0", input => "::0:0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/34", input => "0000:0000:3fff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/34", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/34", input => "0000:0000:4000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/34", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/91", input => "0000:0000:0000:0000:0000:001f:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/91", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/91", input => "0000:0000:0000:0000:0000:0020:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0:0/91", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0", input => "::0:0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/24", input => "0000:00ff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/24", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/24", input => "0000:0100:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/24", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/52", input => "0000:0000:0000:0fff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/52", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/52", input => "0000:0000:0000:1000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0:0/52", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0", input => "::0:0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/3", input => "1fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/3", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/3", input => "2000:0000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/3", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/29", input => "0000:0007:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/29", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/29", input => "0000:0008:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0:0/29", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0", input => "::0:0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/88", input => "0000:0000:0000:0000:0000:00ff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/88", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/88", input => "0000:0000:0000:0000:0000:0100:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0/88", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/78", input => "0000:0000:0000:0000:0003:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/78", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0:0/78", input => "0000:0000:0000:0000:0004:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0:0/78", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0", input => "::0:0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/47", input => "0000:0000:0001:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/47", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/47", input => "0000:0000:0002:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0/47", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/30", input => "0000:0003:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/30", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:0/30", input => "0000:0004:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0:0/30", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "::0", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0", input => "::0", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/39", input => "0000:0000:01ff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/39", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/39", input => "0000:0000:0200:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0/39", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/63", input => "0000:0000:0000:0001:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/63", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "::0/63", input => "0000:0000:0000:0002:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "::0/63", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0::", input => "0:0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0::", input => "0:0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0::", input => "0:0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0:0::", input => "0:0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::", input => "0:0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/33", input => "0000:0000:7fff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/33", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/33", input => "0000:0000:8000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/33", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/33", input => "0000:0000:7fff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/33", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/33", input => "0000:0000:8000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0:0::/33", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::", input => "0:0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/55", input => "0000:0000:0000:01ff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/55", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/55", input => "0000:0000:0000:0200:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/55", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/97", input => "0000:0000:0000:0000:0000:0000:7fff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/97", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/97", input => "0000:0000:0000:0000:0000:0000:8000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0:0::/97", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::", input => "0:0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/13", input => "0007:ffff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/13", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/13", input => "0008:0000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/13", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/22", input => "0000:03ff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/22", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/22", input => "0000:0400:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0:0::/22", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::", input => "0:0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/89", input => "0000:0000:0000:0000:0000:007f:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/89", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/89", input => "0000:0000:0000:0000:0000:0080:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0::/89", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/90", input => "0000:0000:0000:0000:0000:003f:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/90", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0:0::/90", input => "0000:0000:0000:0000:0000:0040:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0:0::/90", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::", input => "0:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/105", input => "0000:0000:0000:0000:0000:0000:007f:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/105", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/105", input => "0000:0000:0000:0000:0000:0000:0080:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0::/105", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/19", input => "0000:1fff:ffff:ffff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/19", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0:0::/19", input => "0000:2000:0000:0000:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0:0::/19", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0::", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0000:0000:0000:0000:0000:0000:0000:0000", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0::", input => "0::", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/73", input => "0000:0000:0000:0000:007f:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/73", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/73", input => "0000:0000:0000:0000:0080:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0::/73", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/53", input => "0000:0000:0000:07ff:ffff:ffff:ffff:ffff", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/53", input => "0000:0000:0000:0000:0000:0000:0000:0000", ret => 1, }, { type => "op", name => "ipMatch", param => "0::/53", input => "0000:0000:0000:0800:0000:0000:0000:0000", ret => 0, }, { type => "op", name => "ipMatch", param => "0::/53", input => "0000:0000:0000:0000:0000:0000:0000:0009", ret => 1, }, { type => "op", name => "ipMatch", param => "0:a:b:c:d:e:f::", input => "0:a:b:c:d:e:f::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:a:b:c:d:e:f::", input => "0:a:b:c:d:e:f::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:a:b:c:d:e:f::", input => "0:a:b:c:d:e:f::", ret => 1, }, { type => "op", name => "ipMatch", param => "0:a:b:c:d:e:f::", input => "0:a:b:c:d:e:f::", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:a:b:c:d:e:f", input => "::0:a:b:c:d:e:f", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:a:b:c:d:e:f", input => "::0:a:b:c:d:e:f", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:a:b:c:d:e:f", input => "::0:a:b:c:d:e:f", ret => 1, }, { type => "op", name => "ipMatch", param => "::0:a:b:c:d:e:f", input => "::0:a:b:c:d:e:f", ret => 1, }, { type => "op", name => "ipMatch", param => "a:b:c:d:e:f:0::", input => "a:b:c:d:e:f:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "a:b:c:d:e:f:0::", input => "a:b:c:d:e:f:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "a:b:c:d:e:f:0::", input => "a:b:c:d:e:f:0::", ret => 1, }, { type => "op", name => "ipMatch", param => "a:b:c:d:e:f:0::", input => "a:b:c:d:e:f:0::", ret => 1, }, modsecurity-2.9.5/tests/op/beginsWith.t0000664000175000017500000000106714147005233021273 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "beginsWith", param => "", input => "", ret => 1, }, { type => "op", name => "beginsWith", param => "TestCase", input => "", ret => 0, }, { type => "op", name => "beginsWith", param => "", input => "TestCase", ret => 1, }, ### General { type => "op", name => "beginsWith", param => "abcdef", input => "abcdef", ret => 1, }, { type => "op", name => "beginsWith", param => "abcdef", input => "abcdefghi", ret => 1, }, { type => "op", name => "beginsWith", param => "abcdef", input => "abc", ret => 0, }, modsecurity-2.9.5/tests/op/validateByteRange.t0000664000175000017500000000137114147005233022560 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "validateByteRange", param => "0-255", input => "", ret => 0, }, { type => "op", name => "validateByteRange", param => "", input => "TestCase", ret => 1, }, ### Invalid { type => "op", name => "validateByteRange", param => "xxx", input => "TestCase", ret => 1, }, { type => "op", name => "validateByteRange", param => "xxx", input => "\x00", ret => 0, }, ### General { type => "op", name => "validateByteRange", param => "0-255", input => "abcdefghi", ret => 0, }, { type => "op", name => "validateByteRange", param => ord("a")."-".ord("i"), input => "abcdefghi", ret => 0, }, { type => "op", name => "validateByteRange", param => ord("a")."-".ord("i"), input => "abcdefghij", ret => 1, }, modsecurity-2.9.5/tests/op/le.t0000664000175000017500000000203114147005233017560 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "le", param => "0", input => "", ret => 1, }, { type => "op", name => "le", param => "5", input => "", ret => 1, }, ### Invalid # xxx interpreted as 0 { type => "op", name => "le", param => "xxx", input => "5", ret => 0, }, # xxx interpreted as 0 { type => "op", name => "le", param => "xxx", input => "-1", ret => 1, }, # xxx interpreted as 0 { type => "op", name => "le", param => "0", input => "xxx", ret => 1, }, # xxx interpreted as 0 { type => "op", name => "le", param => "5", input => "xxx", ret => 1, }, ### General { type => "op", name => "le", param => "0", input => "-5", ret => 1, }, { type => "op", name => "le", param => "0", input => "0", ret => 1, }, { type => "op", name => "le", param => "0", input => "5", ret => 0, }, { type => "op", name => "le", param => "5", input => "0", ret => 1, }, { type => "op", name => "le", param => "5", input => "5", ret => 1, }, { type => "op", name => "le", param => "5", input => "10", ret => 0, }, modsecurity-2.9.5/tests/op/validateDTD.t0000664000175000017500000000000114147005233021300 0ustar mhsvierulamhsvierula modsecurity-2.9.5/tests/op/verifyCC.t0000664000175000017500000002227114147005233020702 0ustar mhsvierulamhsvierula### Empty # empty w/re not matching empty { type => "op", name => "verifyCC", param => "\d+", input => "", ret => 0, }, # empty w/re matching empty { type => "op", name => "verifyCC", param => '\d*', input => "", ret => 0, }, ### Non-matching { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "TestCase", ret => 0, }, ### No digits in match { type => "op", name => "verifyCC", param => 'TestCase', input => "TestCase", ret => 0, }, ### Too generic RE w/no matchs (Luhn will be called until all fail) { type => "op", name => "verifyCC", param => '.*', input => "TestCase", ret => 0, }, ### Test Good CC# # Mastercard { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "5484605089158216", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "5574407071707154", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "5351341509714210", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "5585166974020647", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "5492180332479256", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "5111178142162816", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "5511424748431031", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "5259964281562326", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "5138342589974385", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "5362069587634979", ret => 1, }, # VISA 16 digit { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "4916545704601136", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "4539501231827691", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "4556338049595394", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "4929326438756024", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "4485432027326322", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "4532104980682081", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "4485974616349298", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "4916580487207199", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "4532009746910413", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "4024007144622932", ret => 1, }, # VISA 13 digit { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "4556324125126", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "4067482954141", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "4532402654980", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "4539709679875", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "4024007182237", ret => 1, }, # American Express { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "343918934573386", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "344881778330710", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "345439478558905", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "346465614421111", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "372263817755618", ret => 1, }, # Discover { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "6011402777433576", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "6011890045362751", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "6011439091242416", ret => 1, }, # Diners Club { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "30162519308318", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "30311556856867", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "36850112043985", ret => 1, }, # enRoute { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "201427829075664", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "201434726660424", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "201453368666085", ret => 1, }, # JCB 15 digit { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "210091499965007", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "210072739882947", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "180013970064072", ret => 1, }, # JCB 16 digit { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "3096676276259096", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "3158726040010070", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "3096531217494742", ret => 1, }, # Voyager { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "869974262335041", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "869905005856398", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "869950500085465", ret => 1, }, ### Test Bad CC# { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d+)(?:[^\d]|$)', input => "1234567890012345", ret => 0, }, ### Test regex + Luhn # from http://www.merriampark.com/anatomycc.htm { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d{4}\-?\d{4}\-?\d{2}\-?\d{2}\-?\d{1,4})(?:[^\d]|$)', input => "4417123456789113", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d{4}\-?\d{4}\-?\d{2}\-?\d{2}\-?\d{1,4})(?:[^\d]|$)', input => "4408041234567893", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d{4}\-?\d{4}\-?\d{2}\-?\d{2}\-?\d{1,4})(?:[^\d]|$)', input => "4408041234567890", ret => 0, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d{4}\-?\d{4}\-?\d{2}\-?\d{2}\-?\d{1,4})(?:[^\d]|$)', input => "4417123456789112", ret => 0, }, # on word boundary { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d{4}\-?\d{4}\-?\d{2}\-?\d{2}\-?\d{1,4})(?:[^\d]|$)', input => "a5484605089158216", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d{4}\-?\d{4}\-?\d{2}\-?\d{2}\-?\d{1,4})(?:[^\d]|$)', input => "a5484605089158216b", ret => 1, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d{4}\-?\d{4}\-?\d{2}\-?\d{2}\-?\d{1,4})(?:[^\d]|$)', input => "5484605089158216b", ret => 1, }, # valid patterns { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d{4}\-?\d{4}\-?\d{2}\-?\d{2}\-?\d{1,4})(?:[^\d]|$)', input => "5484-6050-8915-8216", ret => 1, }, # changed digit from table above { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d{4}\-?\d{4}\-?\d{2}\-?\d{2}\-?\d{1,4})(?:[^\d]|$)', input => "5484605089158217", ret => 0, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d{4}\-?\d{4}\-?\d{2}\-?\d{2}\-?\d{1,4})(?:[^\d]|$)', input => "5574407071807154", ret => 0, }, # wrong patterns { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d{4}\-?\d{4}\-?\d{2}\-?\d{2}\-?\d{1,4})(?:[^\d]|$)', input => "5-484-6050-8915-8216", ret => 0, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d{4}\-?\d{4}\-?\d{2}\-?\d{2}\-?\d{1,4})(?:[^\d]|$)', input => "5484 6050 8915 8216", ret => 0, }, # not on digits boundary { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d{4}\-?\d{4}\-?\d{2}\-?\d{2}\-?\d{1,4})(?:[^\d]|$)', input => "15484605089158216", ret => 0, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d{4}\-?\d{4}\-?\d{2}\-?\d{2}\-?\d{1,4})(?:[^\d]|$)', input => "154846050891582162", ret => 0, }, { type => "op", name => "verifyCC", param => '(?:^|[^\d])(\d{4}\-?\d{4}\-?\d{2}\-?\d{2}\-?\d{1,4})(?:[^\d]|$)', input => "54846050891582162", ret => 0, }, modsecurity-2.9.5/tests/op/inspectFile.t0000664000175000017500000000000114147005233021420 0ustar mhsvierulamhsvierula modsecurity-2.9.5/tests/op/endsWith.t0000664000175000017500000000121114147005233020744 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "endsWith", param => "", input => "", ret => 1, }, { type => "op", name => "endsWith", param => "TestCase", input => "", ret => 0, }, { type => "op", name => "endsWith", param => "", input => "TestCase", ret => 1, }, ### General { type => "op", name => "endsWith", param => "abc", input => "abcdefghi", ret => 0, }, { type => "op", name => "endsWith", param => "def", input => "abcdefghi", ret => 0, }, { type => "op", name => "endsWith", param => "ghi", input => "abcdefghi", ret => 1, }, { type => "op", name => "endsWith", param => "ghi", input => "abcdef\0ghi", ret => 1, }, modsecurity-2.9.5/tests/op/validateSchema.t0000664000175000017500000000000114147005233022065 0ustar mhsvierulamhsvierula modsecurity-2.9.5/tests/op/noMatch.t0000664000175000017500000000041014147005233020550 0ustar mhsvierulamhsvierula### Empty { type => "op", name => "noMatch", param => "", input => "", ret => 0, }, { type => "op", name => "noMatch", param => "TestCase", input => "", ret => 0, }, { type => "op", name => "noMatch", param => "", input => "TestCase", ret => 0, }, modsecurity-2.9.5/tests/run-regression-tests.pl.in0000775000175000017500000005356214147005233023463 0ustar mhsvierulamhsvierula#!@PERL@ # # Run regression tests. # # Syntax: run-regression-tests.pl [options] [file [N]] # # All: run-regression-tests.pl # All in file: run-regression-tests.pl file # Nth in file: run-regression-tests.pl file N # use strict; use Time::HiRes qw(gettimeofday sleep); use POSIX qw(WIFEXITED WEXITSTATUS WIFSIGNALED WTERMSIG); use File::Spec qw(rel2abs); use File::Basename qw(basename dirname); use FileHandle; use IPC::Open2 qw(open2); use IPC::Open3 qw(open3); use Getopt::Std; use Data::Dumper; use IO::Socket; use LWP::UserAgent; my @TYPES = qw(config misc action target rule); my $SCRIPT = basename($0); my $SCRIPT_DIR = File::Spec->rel2abs(dirname($0)); my $REG_DIR = "$SCRIPT_DIR/regression"; my $SROOT_DIR = "$REG_DIR/server_root"; my $DATA_DIR = "$SROOT_DIR/data"; my $TEMP_DIR = "$SROOT_DIR/tmp"; my $UPLOAD_DIR = "$SROOT_DIR/upload"; my $CONF_DIR = "$SROOT_DIR/conf"; my $MODULES_DIR = q(@APXS_LIBEXECDIR@); my $FILES_DIR = "$SROOT_DIR/logs"; my $PID_FILE = "$FILES_DIR/httpd.pid"; my $HTTPD = q(@APXS_HTTPD@); my $PASSED = 0; my $TOTAL = 0; my $BUFSIZ = 32768; my %C = (); my %FILE = (); my $UA_NAME = "ModSecurity Regression Tests/1.2.3"; my $UA = LWP::UserAgent->new; $UA->agent($UA_NAME); # Hack for testing the script w/o configure if ($HTTPD eq "\@APXS_HTTPD\@") { $HTTPD = "/usr/local/apache2/bin/httpd"; $MODULES_DIR = "/usr/local/apache2/modules"; } $SIG{TERM} = $SIG{INT} = \&handle_interrupt; my $platform = "apache"; my %opt; getopts('A:E:D:C:T:H:a:p:dvh', \%opt); if ($opt{d}) { $Data::Dumper::Indent = 1; $Data::Dumper::Terse = 1; $Data::Dumper::Pad = ""; $Data::Dumper::Quotekeys = 0; } sub usage { print stderr <<"EOT"; @_ Usage: $SCRIPT [options] [file [N]] Options: -A file Specify ModSecurity audit log to read. -D file Specify ModSecurity debug log to read. -E file Specify Apache httpd error log to read. -C file Specify Apache httpd base conf file to generate/reload. -H path Specify Apache httpd htdocs path. -S path Specify Apache httpd server root path. -a file Specify Apache httpd binary (default: httpd) -p port Specify Apache httpd port (default: 8088) -v Enable verbose output (details on failure). -d Enable debugging output. -h This help. EOT exit(1); } usage() if ($opt{h}); ### Check httpd binary if (defined $opt{a}) { $HTTPD = $opt{a}; } else { $opt{a} = $HTTPD; } usage("Invalid Apache startup script: $HTTPD\n") unless (-e $HTTPD); ### Defaults $opt{A} = "$FILES_DIR/modsec_audit.log" unless (defined $opt{A}); $opt{D} = "$FILES_DIR/modsec_debug.log" unless (defined $opt{D}); $opt{E} = "$FILES_DIR/error.log" unless (defined $opt{E}); $opt{C} = "$CONF_DIR/httpd.conf" unless (defined $opt{C}); $opt{H} = "$SROOT_DIR/htdocs" unless (defined $opt{H}); $opt{p} = 8088 unless (defined $opt{p}); $opt{v} = 1 if ($opt{d}); unless (defined $opt{S}) { my $httpd_root = `$HTTPD -V`; ($opt{S} = $httpd_root) =~ s/.*-D HTTPD_ROOT="([^"]*)".*/$1/sm; } %ENV = ( %ENV, SERVER_ROOT => $opt{S}, SERVER_PORT => $opt{p}, SERVER_NAME => "localhost", TEST_SERVER_ROOT => $SROOT_DIR, DATA_DIR => $DATA_DIR, TEMP_DIR => $TEMP_DIR, UPLOAD_DIR => $UPLOAD_DIR, CONF_DIR => $CONF_DIR, MODULES_DIR => $MODULES_DIR, LOGS_DIR => $FILES_DIR, SCRIPT_DIR => $SCRIPT_DIR, REGRESSION_DIR => $REG_DIR, DIST_ROOT => File::Spec->rel2abs(dirname("$SCRIPT_DIR/../../..")), AUDIT_LOG => $opt{A}, DEBUG_LOG => $opt{D}, ERROR_LOG => $opt{E}, HTTPD_CONF => $opt{C}, HTDOCS => $opt{H}, USER_AGENT => $UA_NAME, ); #dbg("OPTIONS: ", \%opt); if (-e "$PID_FILE") { msg("Shutting down previous instance: $PID_FILE"); httpd_stop(); } if (defined $ARGV[0]) { runfile(dirname($ARGV[0]), basename($ARGV[0]), $ARGV[1]); done(); } for my $type (@TYPES) { my $dir = "$SCRIPT_DIR/regression/$type"; my @cfg = (); # Get test names opendir(DIR, "$dir") or quit(1, "Failed to open \"$dir\": $!"); @cfg = grep { /\.t$/ && -f "$dir/$_" } readdir(DIR); closedir(DIR); for my $cfg (sort @cfg) { runfile($dir, $cfg); } } done(); sub runfile { my($dir, $cfg, $testnum) = @_; my $fn = "$dir/$cfg"; my @data = (); my $edata; my @C = (); my @test = (); my $teststr; my $n = 0; my $pass = 0; open(CFG, "<$fn") or quit(1, "Failed to open \"$fn\": $!"); @data = ; $edata = q/@C = (/ . join("", @data) . q/)/; eval $edata; quit(1, "Failed to read test data \"$cfg\": $@") if ($@); unless (@C) { msg("\nNo tests defined for $fn"); return; } msg("\nLoaded ".@C." tests from $fn"); for my $t (@C) { $n++; next if (defined $testnum and $n != $testnum); my $httpd_up = 0; my %t = %{$t || {}}; my $id = sprintf("%3d", $n); my $out = ""; my $rc = 0; my $conf_fn; # Startup httpd with optionally included conf. if (exists $t{conf} and defined $t{conf}) { $conf_fn = sprintf "%s/%s_%s_%06d.conf", $CONF_DIR, $t{type}, $cfg, $n; #dbg("Writing test config to: $conf_fn"); open(CONF, ">$conf_fn") or die "Failed to open conf \"$conf_fn\": $!\n"; print CONF (ref $t{conf} eq "CODE" ? eval { &{$t{conf}} } : $t{conf}); msg("$@") if ($@); close CONF; $httpd_up = httpd_start(\%t, "Include $conf_fn") ? 0 : 1; } else { $httpd_up = httpd_start(\%t) ? 0 : 1; } # Run any prerun setup if ($rc == 0 and exists $t{prerun} and defined $t{prerun}) { vrb("Executing perl prerun..."); $rc = &{$t{prerun}}; vrb("Perl prerun returned: $rc"); } if ($httpd_up) { # Perform the request and check response if (exists $t{request}) { my $resp = do_request($t{request}); if (!$resp) { msg("invalid response"); vrb("RESPONSE: ", $resp); $rc = 1; } else { for my $key (keys %{ $t{match_response} || {}}) { my($neg,$mtype) = ($key =~ m/^(-?)(.*)$/); my $m = $t{match_response}{$key}; if (ref($m) eq "HASH") { if ($m->{$platform}) { $m = $m->{$platform}; } else { my $ap = join(", ", keys %{$m}); msg("Warning: trying to match: $mtype. Nothing " . "to match in current platform: $platform. " . "This test only contains cotent for: $ap."); last; } } my $match = match_response($mtype, $resp, $m); if ($neg and defined $match) { $rc = 1; msg("response $mtype matched: $m"); vrb($resp); last; } elsif (!$neg and !defined $match) { $rc = 1; msg("response $mtype failed to match: $m"); vrb($resp); last; } } } } # Run any arbitrary perl tests if ($rc == 0 and exists $t{test} and defined $t{test}) { dbg("Executing perl test(s)..."); $rc = eval { &{$t{test}} }; if (! defined $rc) { msg("Error running test: $@"); $rc = -1; } dbg("Perl tests returned: $rc"); } # Search for all log matches if ($rc == 0 and exists $t{match_log} and defined $t{match_log}) { for my $key (keys %{ $t{match_log} || {}}) { my($neg,$mtype) = ($key =~ m/^(-?)(.*)$/); my $m = $t{match_log}{$key}; if (ref($m) eq "HASH") { if ($m->{$platform}) { $m = $m->{$platform}; } else { my $ap = join(", ", keys %{$m}); msg("Warning: trying to match: $mtype. Nothing " . "to match in current platform: $platform. " . "This test only contains cotent for: $ap."); last; } } my $match = match_log($mtype, @{$m || []}); if ($neg and defined $match) { $rc = 1; msg("$mtype log matched: $m->[0]"); last; } elsif (!$neg and !defined $match) { $rc = 1; msg("$mtype log failed to match: $m->[0]"); last; } } } # Search for all file matches if ($rc == 0 and exists $t{match_file} and defined $t{match_file}) { sleep 1; # Make sure the file exists for my $key (keys %{ $t{match_file} || {}}) { my($neg,$fn) = ($key =~ m/^(-?)(.*)$/); my $m = $t{match_file}{$key}; my $match = match_file($fn, $m); if ($neg and defined $match) { $rc = 1; msg("$fn file matched: $m"); last; } elsif (!$neg and !defined $match) { $rc = 1; msg("$fn file failed match: $m"); last; } } } } else { msg("Failed to start httpd."); $rc = 1; } if ($rc == 0) { $pass++; } else { vrb("Test Config: $conf_fn"); vrb("Debug Log: $FILE{debug}{fn}"); dbg(escape("$FILE{debug}{buf}")); vrb("Error Log: $FILE{error}{fn}"); dbg(escape("$FILE{error}{buf}")); } msg(sprintf("%s) %s%s: %s%s", $id, $t{type}, (exists($t{comment}) ? " - $t{comment}" : ""), ($rc ? "failed" : "passed"), ((defined($out) && $out ne "")? " ($out)" : ""))); if ($httpd_up) { $httpd_up = httpd_stop(\%t) ? 0 : 1; } } $TOTAL += $testnum ? 1 : $n; $PASSED += $pass; msg(sprintf("Passed: %2d; Failed: %2d", $pass, $testnum ? (1 - $pass) : ($n - $pass))); } # Take out any indenting and translate LF -> CRLF sub normalize_raw_request_data { my $r = $_[0]; # Allow for indenting in test file $r =~ s/^[ \t]*\x0d?\x0a//s; my($indention) = ($r =~ m/^([ \t]*)/s); # indention taken from first line $r =~ s/^$indention//mg; $r =~ s/(\x0d?\x0a)[ \t]+$/$1/s; # Translate LF to CRLF $r =~ s/^\x0a/\x0d\x0a/mg; $r =~ s/([^\x0d])\x0a/$1\x0d\x0a/mg; return $r; } sub do_raw_request { my $sock = new IO::Socket::INET( Proto => "tcp", PeerAddr => "localhost", PeerPort => $opt{p}, ) or msg("Failed to connect to localhost:$opt{p}: $@"); return unless ($sock); # Join togeather the request my $r = join("", @_); dbg($r); # Write to socket print $sock "$r"; $sock->shutdown(1); # Read from socket my @resp = <$sock>; $sock->close(); return HTTP::Response->parse(join("", @resp)); } sub do_request { my $r = $_[0]; # Allow test to execute code if (ref $r eq "CODE") { $r = eval { &$r }; msg("$@") unless (defined $r); } if (ref $r eq "HTTP::Request") { my $resp = $UA->request($r); dbg($resp->request()->as_string()) if ($opt{d}); return $resp } else { return do_raw_request($r); } return; } sub match_response { my($name, $resp, $re) = @_; msg("Warning: Empty regular expression.") if (!defined $re or $re eq ""); if ($name eq "status") { return $& if ($resp->code =~ m/$re/); } elsif ($name eq "content") { return $& if ($resp->content =~ m/$re/m); } elsif ($name eq "raw") { return $& if ($resp->as_string =~ m/$re/m); } return; } sub read_log { my($name, $timeout, $graph) = @_; return match_log($name, undef, $timeout, $graph); } sub match_log { my($name, $re, $timeout, $graph) = @_; my $t0 = gettimeofday; my($fh,$rbuf) = ($FILE{$name}{fd}, \$FILE{$name}{buf}); my $n = length($$rbuf); my $rc = undef; unless (defined $fh) { msg("Error: File \"$name\" is not opened for matching."); return; } $timeout = 0 unless (defined $timeout); my $i = 0; my $graphed = 0; READ: { do { my $nbytes = $fh->sysread($$rbuf, $BUFSIZ, $n); if (!defined($nbytes)) { msg("Error: Could not read \"$name\" log: $!"); last; } elsif (!defined($re) and $nbytes == 0) { last; } # Remove APR pool debugging $$rbuf =~ s/POOL DEBUG:[^\n]+PALLOC[^\n]+\n//sg; $n = length($$rbuf); #dbg("Match \"$re\" in $name \"$$rbuf\" ($n)"); if ($$rbuf =~ m/$re/m) { $rc = $&; last; } # TODO: Use select()/poll() sleep 0.1 unless ($nbytes == $BUFSIZ); if ($graph and $opt{d}) { $i++; if ($i == 10) { $graphed++; $i=0; print STDERR $graph if ($graphed == 1); print STDERR "." } } } while (gettimeofday - $t0 < $timeout); } print STDERR "\n" if ($graphed); return $rc; } sub match_file { my($neg,$fn) = ($_[0] =~ m/^(-?)(.*)$/); unless (exists $FILE{$fn}) { eval { $FILE{$fn}{fn} = $fn; $FILE{$fn}{fd} = new FileHandle($fn, O_RDONLY) or die "$!\n"; $FILE{$fn}{fd}->blocking(0); $FILE{$fn}{buf} = ""; }; if ($@) { msg("Warning: Failed to open file \"$fn\": $@"); return; } } return match_log($_[0], $_[1]); # timeout makes no sense } sub quote_shell { my($s) = @_; return $s unless ($s =~ m|[^\w!%+,\-./:@^]|); $s =~ s/(['\\])/\\$1/g; return "'$s'"; } sub escape { my @new = (); for my $c (split(//, $_[0])) { my $oc = ord($c); push @new, ((($oc >= 0x20 and $oc <= 0x7e) or $oc == 0x0a or $oc == 0x0d) ? $c : sprintf("\\x%02x", ord($c))); } join('', @new); } sub dbg { return unless(@_ and $opt{d}); my $out = join "", map { (ref $_ ne "" ? Dumper($_) : $_) } @_; $out =~ s/^/DBG: /mg; print STDOUT "$out\n"; } sub vrb { return unless(@_ and $opt{v}); msg(@_); } sub msg { return unless(@_); my $out = join "", map { (ref $_ ne "" ? Dumper($_) : $_) } @_; print STDOUT "$out\n"; } sub handle_interrupt { $SIG{TERM} = $SIG{INT} = \&handle_interrupt; msg("Interrupted via SIG$_[0]. Shutting down tests..."); httpd_stop(); quit(1); } sub quit { my($ec,$msg) = @_; $ec = 0 unless (defined $_[0]); msg("$msg") if (defined $msg); exit $ec; } sub done { if ($PASSED != $TOTAL) { quit(1, "\n$PASSED/$TOTAL tests passed."); } quit(0, "\nAll tests passed ($TOTAL)."); } sub httpd_start { my $t = shift; httpd_reset_fd($t); my @p = ( $HTTPD, -d => $opt{S}, -f => $opt{C}, (map { (-c => $_) } ("Listen localhost:$opt{p}", @_)), -k => "start", ); my $httpd_out; my $httpd_pid = open3(undef, $httpd_out, undef, @p) or quit(1); my $out = join("\\n", grep(!/POOL DEBUG/, (<$httpd_out>))); close $httpd_out; waitpid($httpd_pid, 0); my $rc = $?; if ( WIFEXITED($rc) ) { $rc = WEXITSTATUS($rc); vrb("Httpd start returned with $rc.") if ($rc); } elsif( WIFSIGNALED($rc) ) { msg("Httpd start failed with signal " . WTERMSIG($rc) . "."); $rc = -1; } else { msg("Httpd start failed with unknown error."); $rc = -1; } if (defined $out and $out ne "") { vrb(join(" ", map { quote_shell($_) } @p)); msg("Httpd start failed with error messages:\n$out"); httpd_stop(); return -1 } # Look for startup msg unless (defined match_log("error", qr/resuming normal operations/, 60, "Waiting on httpd to start: ")) { vrb(join(" ", map { quote_shell($_) } @p)); vrb(match_log("error", qr/(^.*ModSecurity: .*)/sm, 10)); msg("Httpd server failed to start."); httpd_stop(); return -1; } return $rc; } sub httpd_stop { my $t = shift; my @p = ( $HTTPD, -d => $opt{S}, -f => $opt{C}, (map { (-c => $_) } ("Listen localhost:$opt{p}", @_)), -k => "stop", ); my $httpd_out; my $httpd_pid = open3(undef, $httpd_out, undef, @p) or quit(1); my $out = join("\\n", grep(!/POOL DEBUG/, (<$httpd_out>))); close $httpd_out; waitpid($httpd_pid, 0); if (defined $out and $out ne "") { msg("Httpd stop failed with error messages:\n$out"); return -1 } my $rc = $?; if ( WIFEXITED($rc) ) { $rc = WEXITSTATUS($rc); vrb("Httpd stop returned with $rc.") if ($rc); } elsif( WIFSIGNALED($rc) ) { msg("Httpd stop failed with signal " . WTERMSIG($rc) . "."); $rc = -1; } else { msg("Httpd stop failed with unknown error."); $rc = -1; } # Look for startup msg unless (defined match_log("error", qr/caught SIG[A-Z]+, shutting down/, 60, "Waiting on httpd to stop: ")) { vrb(join(" ", map { quote_shell($_) } @p)); msg("Httpd server failed to shutdown."); sleep 0.5; return -1; } sleep 0.5; return $rc; } sub httpd_reload { my $t = shift; httpd_reset_fd($t); my @p = ( $HTTPD, -d => $opt{S}, -f => $opt{C}, (map { (-c => $_) } ("Listen localhost:$opt{p}", @_)), -k => "graceful", ); my $httpd_out; my $httpd_pid = open3(undef, $httpd_out, undef, @p) or quit(1); my $out = join("\\n", grep(!/POOL DEBUG/, (<$httpd_out>))); close $httpd_out; waitpid($httpd_pid, 0); if (defined $out and $out ne "") { msg("Httpd reload failed with error messages:\n$out"); return -1 } my $rc = $?; if ( WIFEXITED($rc) ) { $rc = WEXITSTATUS($rc); vrb("Httpd reload returned with $rc.") if ($rc); } elsif( WIFSIGNALED($rc) ) { msg("Httpd reload failed with signal " . WTERMSIG($rc) . "."); $rc = -1; } else { msg("Httpd reload failed with unknown error."); $rc = -1; } # Look for startup msg unless (defined match_log("error", qr/resuming normal operations/, 60, "Waiting on httpd to restart: ")) { vrb(join(" ", map { quote_shell($_) } @p)); msg("Httpd server failed to reload."); return -1; } return $rc; } sub httpd_reset_fd { my($t) = @_; # Cleanup for my $key (keys %FILE) { if (exists $FILE{$key}{fd} and defined $FILE{$key}{fd}) { $FILE{$key}{fd}->close(); } delete $FILE{$key}; } # Error eval { $FILE{error}{fn} = $opt{E}; $FILE{error}{fd} = new FileHandle($opt{E}, O_RDWR|O_CREAT) or die "$!\n"; $FILE{error}{fd}->blocking(0); $FILE{error}{fd}->sysseek(0, 2); $FILE{error}{buf} = ""; }; if ($@) { msg("Warning: Failed to open file \"$opt{E}\": $@"); return undef; } # Audit eval { $FILE{audit}{fn} = $opt{A}; $FILE{audit}{fd} = new FileHandle($opt{A}, O_RDWR|O_CREAT) or die "$!\n"; $FILE{audit}{fd}->blocking(0); $FILE{audit}{fd}->sysseek(0, 2); $FILE{audit}{buf} = ""; }; if ($@) { msg("Warning: Failed to open file \"$opt{A}\": $@"); return undef; } # Debug eval { $FILE{debug}{fn} = $opt{D}; $FILE{debug}{fd} = new FileHandle($opt{D}, O_RDWR|O_CREAT) or die "$!\n"; $FILE{debug}{fd}->blocking(0); $FILE{debug}{fd}->sysseek(0, 2); $FILE{debug}{buf} = ""; }; if ($@) { msg("Warning: Failed to open file \"$opt{D}\": $@"); return undef; } # Any extras listed in "match_log" if ($t and exists $t->{match_log}) { for my $k (keys %{ $t->{match_log} || {} }) { my($neg,$fn) = ($k =~ m/^(-?)(.*)$/); next if (!$fn or exists $FILE{$fn}); eval { $FILE{$fn}{fn} = $fn; $FILE{$fn}{fd} = new FileHandle($fn, O_RDWR|O_CREAT) or die "$!\n"; $FILE{$fn}{fd}->blocking(0); $FILE{$fn}{fd}->sysseek(0, 2); $FILE{$fn}{buf} = ""; }; if ($@) { msg("Warning: Failed to open file \"$fn\": $@"); return undef; } } } } sub encode_chunked { my($data, $size) = @_; $size = 128 unless ($size); my $chunked = ""; my $n = 0; my $bytes = length($data); while ($bytes >= $size) { $chunked .= sprintf "%x\x0d\x0a%s\x0d\x0a", $size, substr($data, $n, $size); $n += $size; $bytes -= $size; } if ($bytes) { $chunked .= sprintf "%x\x0d\x0a%s\x0d\x0a", $bytes, substr($data, $n, $bytes); } $chunked .= "0\x0d\x0a\x0d\x0a" } modsecurity-2.9.5/tests/msc_test.c0000664000175000017500000007102414147005233020352 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #include #include #include "modsecurity.h" #include "re.h" #define ISHEX(X) (((X >= '0')&&(X <= '9')) || ((X >= 'a')&&(X <= 'f')) || ((X >= 'A')&&(X <= 'F'))) #define BUFLEN 32768 #define RESULT_SUCCESS 0 #define RESULT_ERROR -1 #define RESULT_MISMATCHED -2 #define RESULT_WRONGSIZE -3 #define RESULT_WRONGRET -4 #define DEFAULT_ACTION "phase:2,log,auditlog,pass" #define CMDLINE_OPTS "t:n:p:P:r:I:D:Nh" /* Types */ typedef struct tfn_data_t tfn_data_t; typedef struct op_data_t op_data_t; typedef struct action_data_t action_data_t; struct tfn_data_t { const char *name; const char *param; unsigned char *input; apr_size_t input_len; msre_tfn_metadata *metadata; }; struct op_data_t { const char *name; const char *param; unsigned char *input; apr_size_t input_len; msre_ruleset *ruleset; msre_rule *rule; msre_var *var; msre_op_metadata *metadata; }; struct action_data_t { const char *name; unsigned char *input; apr_size_t input_len; msre_ruleset *ruleset; msre_rule *rule; msre_var *var; msre_actionset *actionset; msre_action *action; }; /* Globals */ static int debuglog_level = 0; static char *test_name = NULL; static apr_pool_t *g_mp = NULL; static modsec_rec *g_msr = NULL; static unsigned char buf[BUFLEN]; msc_engine *modsecurity = NULL; unsigned long int DSOLOCAL msc_pcre_match_limit = 0; unsigned long int DSOLOCAL msc_pcre_match_limit_recursion = 0; char DSOLOCAL *real_server_signature = NULL; int DSOLOCAL remote_rules_fail_action = REMOTE_RULES_ABORT_ON_FAIL; char DSOLOCAL *remote_rules_fail_message = NULL; module AP_MODULE_DECLARE_DATA security2_module = { NULL, NULL, NULL, NULL, NULL, NULL, NULL }; /* Stubs */ char *format_error_log_message(apr_pool_t *mp, error_message_t *em) { return "FAKE ERROR LOG MESSAGE"; } apr_status_t send_error_bucket(modsec_rec *msr, ap_filter_t *f, int status) { return APR_SUCCESS; } int apache2_exec(modsec_rec *msr, const char *command, const char **argv, char **output) { return 0; } char *get_apr_error(apr_pool_t *p, apr_status_t rc) { char *text = apr_pcalloc(p, 201); if (text == NULL) return NULL; apr_strerror(rc, text, 200); return text; } void msr_log(modsec_rec *msr, int level, const char *text, ...) { va_list ap; char str1[1024] = ""; char str2[1256] = ""; if ((msr == NULL) || (level > msr->txcfg->debuglog_level)) { return; } if (msr->txcfg->debuglog_fd == NOT_SET_P) { if (apr_file_open(&msr->txcfg->debuglog_fd, msr->txcfg->debuglog_name, APR_READ|APR_WRITE|APR_CREATE|APR_APPEND|APR_BINARY, APR_OS_DEFAULT, g_mp) != APR_SUCCESS) { fprintf(stderr, "ERROR: failed to create unit test debug log \"%s\".\n", msr->txcfg->debuglog_name); msr->txcfg->debuglog_fd = NULL; } } va_start(ap, text); if (msr->txcfg->debuglog_fd != NULL) { apr_size_t nbytes_written = 0; apr_vsnprintf(str1, sizeof(str1), text, ap); apr_snprintf(str2, sizeof(str2), "%lu: [%d] [%s] %s\n", (unsigned long)getpid(), level, test_name, str1); apr_file_write_full(msr->txcfg->debuglog_fd, str2, strlen(str2), &nbytes_written); } va_end(ap); } void msr_log_error(modsec_rec *msr, const char *text, ...) { va_list ap; int level = 3; char str1[1024] = ""; char str2[1256] = ""; if ((msr == NULL) || (level > msr->txcfg->debuglog_level)) { return; } if (msr->txcfg->debuglog_fd == NOT_SET_P) { if (apr_file_open(&msr->txcfg->debuglog_fd, msr->txcfg->debuglog_name, APR_READ|APR_WRITE|APR_CREATE|APR_APPEND|APR_BINARY, APR_OS_DEFAULT, g_mp) != APR_SUCCESS) { fprintf(stderr, "ERROR: failed to create unit test debug log \"%s\".\n", msr->txcfg->debuglog_name); msr->txcfg->debuglog_fd = NULL; } } va_start(ap, text); if (msr->txcfg->debuglog_fd != NULL) { apr_size_t nbytes_written = 0; apr_vsnprintf(str1, sizeof(str1), text, ap); apr_snprintf(str2, sizeof(str2), "%lu: [%d] [%s] %s\n", (unsigned long)getpid(), level, test_name, str1); apr_file_write_full(msr->txcfg->debuglog_fd, str2, strlen(str2), &nbytes_written); } va_end(ap); } void msr_log_warn(modsec_rec *msr, const char *text, ...) { va_list ap; int level = 4; char str1[1024] = ""; char str2[1256] = ""; if ((msr == NULL) || (level > msr->txcfg->debuglog_level)) { return; } if (msr->txcfg->debuglog_fd == NOT_SET_P) { if (apr_file_open(&msr->txcfg->debuglog_fd, msr->txcfg->debuglog_name, APR_READ|APR_WRITE|APR_CREATE|APR_APPEND|APR_BINARY, APR_OS_DEFAULT, g_mp) != APR_SUCCESS) { fprintf(stderr, "ERROR: failed to create unit test debug log \"%s\".\n", msr->txcfg->debuglog_name); msr->txcfg->debuglog_fd = NULL; } } va_start(ap, text); if (msr->txcfg->debuglog_fd != NULL) { apr_size_t nbytes_written = 0; apr_vsnprintf(str1, sizeof(str1), text, ap); apr_snprintf(str2, sizeof(str2), "%lu: [%d] [%s] %s\n", (unsigned long)getpid(), level, test_name, str1); apr_file_write_full(msr->txcfg->debuglog_fd, str2, strlen(str2), &nbytes_written); } va_end(ap); } #define ap_get_remote_host(a, b, c, d) test_ap_get_remote_host(a, b, c, d) const char *test_ap_get_remote_host(conn_rec *conn, void *dir_config, int type, int *str_is_ip) { return "FAKE-REMOTE-HOST"; } char *get_env_var(request_rec *r, char *name) { return "FAKE-ENV-VAR"; } #define unixd_set_global_mutex_perms(a) my_unixd_set_global_mutex_perms(a) apr_status_t my_unixd_set_global_mutex_perms(apr_global_mutex_t *gmutex) { return APR_SUCCESS; } #define unixd_set_proc_mutex_perms(a) my_unixd_set_proc_mutex_perms(a) apr_status_t my_unixd_set_proc_mutex_perms(apr_proc_mutex_t *pmutex) { return APR_SUCCESS; } /* Escaping functions */ static unsigned char hex2dec(unsigned char *what) { register unsigned char digit; digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A') + 10 : (what[0] - '0')); digit *= 16; digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A') + 10 : (what[1] - '0')); return digit; } static unsigned char *unescape_inplace(unsigned char *str, apr_size_t *len) { apr_size_t i, j; for (i = j = 0; i < *len; j++) { if ((str[i] == '\\') && (i + 3 < *len) && (str[i + 1] == 'x') && ISHEX(str[i + 2]) && ISHEX(str[i + 3]) ) { str[j] = hex2dec(str + i + 2); i += 4; } else { str[j] = str[i++]; } } *len = j; while (j < i) { str[j++] = '\0'; } return str; } static char *escape(unsigned char *str, apr_size_t *len) { char *new = apr_pcalloc(g_mp, (*len * 4) + 1); apr_size_t i, j; for (i = j = 0; i < *len; i++) { if ((str[i] >= 0x20) && (str[i] <= 0x7e)) { new[j++] = str[i]; } else { sprintf(new + j, "\\x%02x", str[i]); j += 4; } } *len = j; return new; } /* Testing functions */ static int init_tfn(tfn_data_t *data, const char *name, unsigned char *input, apr_size_t input_len, char **errmsg) { *errmsg = NULL; data->name = name; data->input = apr_pmemdup(g_mp, input, input_len); data->input_len = input_len; data->metadata = msre_engine_tfn_resolve(modsecurity->msre, name); if (data->metadata == NULL) { *errmsg = apr_psprintf(g_mp, "Failed to fetch tfn \"%s\".", name); return -1; } return 0; } static int test_tfn(tfn_data_t *data, unsigned char **rval, apr_size_t *rval_len, char **errmsg) { int rc = -1; *errmsg = NULL; /* Execute the tfn */ rc = data->metadata->execute(g_mp, data->input, (long)(data->input_len), (char **)rval, (long *)rval_len); if (rc < 0) { *errmsg = apr_psprintf(g_mp, "Failed to execute tfn \"%s\".", data->name); } return rc; } static int init_op(op_data_t *data, const char *name, const char *param, unsigned char *input, apr_size_t input_len, char **errmsg) { const char *args = apr_psprintf(g_mp, "@%s %s", name, param); char *conf_fn; int rc = -1; *errmsg = NULL; data->name = name; data->param = param; data->input = input; data->input_len = input_len; if ( apr_filepath_merge(&conf_fn, NULL, "unit-test.conf", APR_FILEPATH_TRUENAME, g_mp) != APR_SUCCESS) { *errmsg = apr_psprintf(g_mp, "Failed to build a conf filename."); return -1; } /* Register UNIT_TEST variable */ msre_engine_variable_register(modsecurity->msre, "UNIT_TEST", VAR_SIMPLE, 0, 0, NULL, NULL, VAR_DONT_CACHE, PHASE_REQUEST_HEADERS ); /* Lookup the operator */ data->metadata = msre_engine_op_resolve(modsecurity->msre, name); if (data->metadata == NULL) { *errmsg = apr_psprintf(g_mp, "Failed to fetch op \"%s\".", name); return -1; } /* Create a ruleset/rule */ data->ruleset = msre_ruleset_create(modsecurity->msre, g_mp); if (data->ruleset == NULL) { *errmsg = apr_psprintf(g_mp, "Failed to create ruleset for op \"%s\".", name); return -1; } data->rule = msre_rule_create(data->ruleset, RULE_TYPE_NORMAL, conf_fn, 1, "UNIT_TEST", args, DEFAULT_ACTION, errmsg); if (data->rule == NULL) { *errmsg = apr_psprintf(g_mp, "Failed to create rule for op \"%s\": %s", name, *errmsg); return -1; } /* Create a fake variable */ data->var = (msre_var *)apr_pcalloc(g_mp, sizeof(msre_var)); data->var->name = "UNIT_TEST"; data->var->value = apr_pstrmemdup(g_mp, (char *)input, input_len); data->var->value_len = input_len; data->var->metadata = msre_resolve_var(modsecurity->msre, data->var->name); if (data->var->metadata == NULL) { *errmsg = apr_psprintf(g_mp, "Failed to resolve variable for op \"%s\": %s", name, data->var->name); return -1; } /* Initialize the operator parameter */ if (data->metadata->param_init != NULL) { rc = data->metadata->param_init(data->rule, errmsg); if (rc <= 0) { *errmsg = apr_psprintf(g_mp, "Failed to init op \"%s\": %s", name, *errmsg); return rc; } } return 0; } static int test_op(op_data_t *data, char **errmsg) { int rc = -1; *errmsg = NULL; /* Execute the operator */ if (data->metadata->execute != NULL) { rc = data->metadata->execute(g_msr, data->rule, data->var, errmsg); if (rc < 0) { *errmsg = apr_psprintf(g_mp, "Failed to execute op \"%s\": %s", data->name, *errmsg); } } return rc; } static int init_action(action_data_t *data, const char *name, const char *param, char **errmsg) { const char *action_string = NULL; char *conf_fn; *errmsg = NULL; if ((param == NULL) || (strcmp("", param) == 0)) { action_string = apr_psprintf(g_mp, "%s", name); } else { action_string = apr_psprintf(g_mp, "%s:%s", name, param); } if (action_string == NULL) { *errmsg = apr_psprintf(g_mp, "Failed to build action string for action: \"%s\".", name); return -1; } if ( apr_filepath_merge(&conf_fn, NULL, "unit-test.conf", APR_FILEPATH_TRUENAME, g_mp) != APR_SUCCESS) { *errmsg = apr_psprintf(g_mp, "Failed to build a conf filename."); return -1; } /* Register UNIT_TEST variable */ msre_engine_variable_register(modsecurity->msre, "UNIT_TEST", VAR_SIMPLE, 0, 0, NULL, NULL, VAR_DONT_CACHE, PHASE_REQUEST_HEADERS ); /* Create a ruleset/rule */ data->ruleset = msre_ruleset_create(modsecurity->msre, g_mp); if (data->ruleset == NULL) { *errmsg = apr_psprintf(g_mp, "Failed to create ruleset for action \"%s\".", name); return -1; } data->rule = msre_rule_create(data->ruleset, RULE_TYPE_NORMAL, conf_fn, 1, "UNIT_TEST", "@unconditionalMatch", action_string, errmsg); if (data->rule == NULL) { *errmsg = apr_psprintf(g_mp, "Failed to create rule for action \"%s\": %s", name, *errmsg); return -1; } /* Get the actionset/action */ data->actionset = data->rule->actionset; if (data->actionset == NULL) { *errmsg = apr_psprintf(g_mp, "Failed to fetch actionset for action \"%s\"", name); return -1; } data->action = (msre_action *)apr_table_get(data->actionset->actions, name); if (data->action == NULL) { *errmsg = apr_psprintf(g_mp, "Failed to fetch action for action \"%s\"", name); return -1; } return 0; } static int test_action(action_data_t *data, char **errmsg) { int rc = -1; *errmsg = NULL; /* Execute the action */ if (data->action->metadata->execute != NULL) { rc = data->action->metadata->execute(g_msr, g_mp, data->rule, data->action); if (rc < 0) { *errmsg = apr_psprintf(g_mp, "Failed to execute action \"%s\": %d", data->name, rc); } } return rc; } /* Initialization */ static void init_msr(void) { directory_config *dcfg = NULL; request_rec *r = NULL; r = (request_rec *)apr_pcalloc(g_mp, sizeof(request_rec)); dcfg = (directory_config *)apr_pcalloc(g_mp, sizeof(directory_config)); dcfg->is_enabled = 0; dcfg->reqbody_access = 0; dcfg->reqbody_buffering = 0; dcfg->reqbody_inmemory_limit = REQUEST_BODY_DEFAULT_INMEMORY_LIMIT; dcfg->reqbody_limit = REQUEST_BODY_DEFAULT_LIMIT; dcfg->reqbody_no_files_limit = REQUEST_BODY_NO_FILES_DEFAULT_LIMIT; dcfg->resbody_access = 0; dcfg->of_limit = RESPONSE_BODY_DEFAULT_LIMIT; dcfg->of_limit_action = RESPONSE_BODY_LIMIT_ACTION_REJECT; dcfg->debuglog_fd = NOT_SET_P; dcfg->debuglog_name = "msc-test-debug.log"; dcfg->debuglog_level = debuglog_level; dcfg->cookie_format = 0; dcfg->argument_separator = '&'; dcfg->rule_inheritance = 0; dcfg->auditlog_flag = 0; dcfg->auditlog_type = AUDITLOG_SERIAL; dcfg->auditlog_fd = NULL; dcfg->auditlog2_fd = NULL; dcfg->auditlog_name = NULL; dcfg->auditlog2_name = NULL; dcfg->auditlog_storage_dir = NULL; dcfg->auditlog_parts = "ABCFHZ"; dcfg->auditlog_relevant_regex = NULL; dcfg->tmp_dir = guess_tmp_dir(g_mp); dcfg->upload_dir = NULL; dcfg->upload_keep_files = KEEP_FILES_OFF; dcfg->upload_validates_files = 0; dcfg->data_dir = "."; dcfg->webappid = "default"; dcfg->content_injection_enabled = 0; dcfg->geo = NULL; dcfg->cache_trans = MODSEC_CACHE_ENABLED; dcfg->cache_trans_min = 15; dcfg->cache_trans_max = 0; dcfg->request_encoding = NULL; g_msr = (modsec_rec *)apr_pcalloc(g_mp, sizeof(modsec_rec)); g_msr->modsecurity = modsecurity; g_msr->mp = g_mp; g_msr->r = r; g_msr->r_early = r; g_msr->request_time = apr_time_now(); g_msr->dcfg1 = NULL; g_msr->usercfg = NULL; g_msr->txcfg = dcfg; g_msr->txid = "FAKE-TXID"; g_msr->error_messages = NULL; g_msr->alerts = NULL; g_msr->server_software = "FAKE-SERVER-SOFTWARE"; g_msr->local_addr = "127.0.0.1"; g_msr->local_port = 80; g_msr->remote_addr = "127.0.0.1"; g_msr->remote_port = 1080; g_msr->request_line = "GET /unit-tests HTTP/1.1"; g_msr->request_uri = "http://localhost/unit-tests"; g_msr->request_method = "GET"; g_msr->query_string = ""; g_msr->request_protocol = "HTTP/1.1"; g_msr->request_headers = NULL; g_msr->hostname = "localhost"; g_msr->msc_rule_mptmp = g_mp; g_msr->tx_vars = apr_table_make(g_mp, 1); g_msr->collections_original = apr_table_make(g_mp, 1); g_msr->collections = apr_table_make(g_mp, 1); g_msr->collections_dirty = apr_table_make(g_mp, 1); } /** * Usage text. */ static void usage(void) { fprintf(stderr, "ModSecurity Unit Tester v%s\n", MODSEC_VERSION); fprintf(stderr, " Usage: msc_test [options]\n"); fprintf(stderr, "\n"); fprintf(stderr, " Options:\n"); fprintf(stderr, " -t Type (required)\n"); fprintf(stderr, " -n Name (required)\n"); fprintf(stderr, " -p Parameter (required)\n"); fprintf(stderr, " -P Prerun (optional for actions)\n"); fprintf(stderr, " -r Function return code (required for some types)\n"); fprintf(stderr, " -I Iterations (default 1)\n"); fprintf(stderr, " -D Debug log level (default 0)\n"); fprintf(stderr, " -N No input on stdin.\n\n"); fprintf(stderr, " -h This help\n\n"); fprintf(stderr, "\n"); fprintf(stderr, "Input is from stdin unless -N is used.\n"); } /* Main */ int main(int argc, const char * const argv[]) { apr_getopt_t *opt; apr_file_t *fd; apr_size_t nbytes = 0; const char *type = NULL; const char *name = NULL; unsigned char *param = NULL; unsigned char *prerun = NULL; const char *returnval = NULL; int iterations = 1; char *errmsg = NULL; unsigned char *out = NULL; apr_size_t param_len = 0; apr_size_t prerun_len = 0; apr_size_t out_len = 0; int noinput = 0; int rc = 0; int result = 0; int ec = 0; int i; apr_time_t T0 = 0; apr_time_t T1 = 0; tfn_data_t tfn_data; op_data_t op_data; action_data_t action_data; int ret = 0; memset(&tfn_data, 0, sizeof(tfn_data_t)); memset(&op_data, 0, sizeof(op_data_t)); memset(&action_data, 0, sizeof(action_data_t)); apr_app_initialize(&argc, &argv, NULL); atexit(apr_terminate); apr_pool_create(&g_mp, NULL); rc = apr_getopt_init(&opt, g_mp, argc, argv); if (rc != APR_SUCCESS) { fprintf(stderr, "Failed to initialize.\n\n"); usage(); exit(1); } do { char ch; const char *val; rc = apr_getopt(opt, CMDLINE_OPTS, &ch, &val); switch (rc) { case APR_SUCCESS: switch (ch) { case 't': type = val; break; case 'n': name = val; break; case 'p': param_len = strlen(val); param = apr_pmemdup(g_mp, val, param_len + 1); unescape_inplace(param, ¶m_len); break; case 'P': prerun_len = strlen(val); prerun = apr_pmemdup(g_mp, val, prerun_len + 1); unescape_inplace(prerun, &prerun_len); break; case 'r': returnval = val; break; case 'I': iterations = atoi(val); break; case 'D': debuglog_level = atoi(val); break; case 'N': noinput = 1; break; case 'h': usage(); exit(0); } break; case APR_BADCH: case APR_BADARG: usage(); exit(1); } } while (rc != APR_EOF); rc = apr_getopt_init(&opt, g_mp, argc, argv); if (!type || !name || !param) { usage(); exit(1); } modsecurity = modsecurity_create(g_mp, MODSEC_OFFLINE); test_name = apr_psprintf(g_mp, "%s/%s", type, name); if (noinput == 0) { if (apr_file_open_stdin(&fd, g_mp) != APR_SUCCESS) { fprintf(stderr, "Failed to open stdin\n"); exit(1); } /* Read in the input */ nbytes = BUFLEN; memset(buf, 0, nbytes); rc = apr_file_read(fd, buf, &nbytes); if ((rc != APR_EOF) && (rc != APR_SUCCESS)) { fprintf(stderr, "Failed to read data\n"); exit(1); } if (nbytes < 0) { fprintf(stderr, "Error reading data\n"); exit(1); } apr_file_close(fd); } if (strcmp("tfn", type) == 0) { ret = returnval ? atoi(returnval) : -8888; rc = init_tfn(&tfn_data, name, buf, nbytes, &errmsg); if (rc < 0) { fprintf(stderr, "ERROR: %s\n", errmsg); result = RESULT_ERROR; } } else if (strcmp("op", type) == 0) { if (!returnval) { fprintf(stderr, "Return value required for type \"%s\"\n", type); exit(1); } ret = atoi(returnval); init_msr(); rc = init_op(&op_data, name, (const char *)param, buf, nbytes, &errmsg); if (rc < 0) { fprintf(stderr, "ERROR: %s\n", errmsg); result = RESULT_ERROR; } } else if (strcmp("action", type) == 0) { if (!returnval) { fprintf(stderr, "Return value required for type \"%s\"\n", type); exit(1); } ret = atoi(returnval); init_msr(); if (prerun) { action_data_t paction_data; char *pname = apr_pstrdup(g_mp, (const char *)prerun); char *pparam = NULL; if ((pparam = strchr((const char *)pname, ':'))) { pparam[0] = '\0'; pparam++; } rc = init_action(&paction_data, pname, (const char *)pparam, &errmsg); if (rc < 0) { fprintf(stderr, "ERROR: prerun - %s\n", errmsg); exit(1); } rc = test_action(&paction_data, &errmsg); if (rc < 0) { fprintf(stderr, "ERROR: prerun - %s\n", errmsg); exit(1); } } rc = init_action(&action_data, name, (const char *)param, &errmsg); if (rc < 0) { fprintf(stderr, "ERROR: %s\n", errmsg); result = RESULT_ERROR; } } if (iterations > 1) { apr_time_clock_hires (g_mp); T0 = apr_time_now(); } for (i = 1; i <= iterations; i++) { #ifdef VERBOSE if (i % 100 == 0) { if (i == 100) { fprintf(stderr, "Iterations/100: ."); } else { fprintf(stderr, "."); } } #endif if (strcmp("tfn", type) == 0) { /* Transformations */ rc = test_tfn(&tfn_data, &out, &out_len, &errmsg); if (rc < 0) { fprintf(stderr, "ERROR: %s\n", errmsg); result = RESULT_ERROR; } else if ((ret != -8888) && (rc != ret)) { fprintf(stderr, "Returned %d (expected %d)\n", rc, ret); result = RESULT_WRONGRET; } else if (param_len != out_len) { fprintf(stderr, "Length %" APR_SIZE_T_FMT " (expected %" APR_SIZE_T_FMT ")\n", out_len, param_len); result = RESULT_WRONGSIZE; } else { result = memcmp(param, out, param_len) ? RESULT_MISMATCHED : RESULT_SUCCESS; } if (result != RESULT_SUCCESS) { apr_size_t s0len = nbytes; const char *s0 = escape(buf, &s0len); apr_size_t s1len = out_len; const char *s1 = escape(out, &s1len); apr_size_t s2len = param_len; const char *s2 = escape(param, &s2len); fprintf(stderr, " Input: '%s' len=%" APR_SIZE_T_FMT "\n" "Output: '%s' len=%" APR_SIZE_T_FMT "\n" "Expect: '%s' len=%" APR_SIZE_T_FMT "\n", s0, nbytes, s1, out_len, s2, param_len); ec = 1; } } else if (strcmp("op", type) == 0) { /* Operators */ rc = test_op(&op_data, &errmsg); if (rc < 0) { fprintf(stderr, "ERROR: %s\n", errmsg); result = RESULT_ERROR; } else if (rc != ret) { fprintf(stderr, "Returned %d (expected %d)\n", rc, ret); result = RESULT_WRONGRET; } else { result = RESULT_SUCCESS; } if (result != RESULT_SUCCESS) { apr_size_t s0len = nbytes; const char *s0 = escape(buf, &s0len); fprintf(stderr, " Test: '@%s %s'\n" "Input: '%s' len=%" APR_SIZE_T_FMT "\n", name, param, s0, nbytes); ec = 1; } } else if (strcmp("action", type) == 0) { /* Actions */ int n; const apr_array_header_t *arr; apr_table_entry_t *te; rc = test_action(&action_data, &errmsg); if (rc < 0) { fprintf(stderr, "ERROR: %s\n", errmsg); result = RESULT_ERROR; } else if (rc != ret) { fprintf(stderr, "Returned %d (expected %d)\n", rc, ret); result = RESULT_WRONGRET; } else { result = RESULT_SUCCESS; } if (result != RESULT_SUCCESS) { fprintf(stderr, " Test: '%s:%s'\n" "Prerun: '%s'\n", name, param, (prerun ? (const char *)prerun : "")); ec = 1; } /* Store any collections that were initialized and changed */ arr = apr_table_elts(g_msr->collections); te = (apr_table_entry_t *)arr->elts; for (n = 0; n < arr->nelts; n++) { apr_table_t *col = (apr_table_t *)te[n].val; // apr_table_t *orig_col = NULL; if (g_msr->txcfg->debuglog_level >= 9) { msr_log(g_msr, 9, "Found loaded collection: %s", te[n].key); } /* Only store those collections that changed. */ if (apr_table_get(g_msr->collections_dirty, te[n].key)) { int x = collection_store(g_msr, col); if (g_msr->txcfg->debuglog_level >= 9) { msr_log(g_msr, 9, "Stored collection: %s (%d)", te[n].key, x); } } #if 0 /* Re-populate the original values with the new ones. */ if ((orig_col = (apr_table_t *)apr_table_get(g_msr->collections_original, te[n].key)) != NULL) { const apr_array_header_t *orig_arr = apr_table_elts(orig_col); apr_table_entry_t *orig_te = (apr_table_entry_t *)orig_arr->elts; int m; for (m = 0; m < orig_arr->nelts; m++) { msc_string *mstr = (msc_string *)apr_table_get(col, orig_te[m].key); if (g_msr->txcfg->debuglog_level >= 9) { msr_log(g_msr, 9, "Updating original collection: %s.%s=%s", te[n].key, mstr->name, mstr->value); } //apr_table_setn(orig_col, orig_te[m].key, (void *)mstr ); collection_original_setvar(g_msr, te[n].key, mstr); } } #endif } apr_table_clear(g_msr->collections_dirty); apr_table_clear(g_msr->collections_original); } else { fprintf(stderr, "Unknown type: \"%s\"\n", type); exit(1); } if (ec != 0) { fprintf(stdout, "%s\n", errmsg ? errmsg : ""); return ec; } } if (iterations > 1) { double dT; T1 = apr_time_now(); dT = apr_time_as_msec(T1 - T0); #ifdef VERBOSE if (i >= 100) { fprintf(stderr, "\n"); } #endif fprintf(stdout, "%d @ %.4f msec per iteration.\n", iterations, dT / iterations); } fprintf(stdout, "%s\n", errmsg ? errmsg : ""); return ec; } modsecurity-2.9.5/iis/0000775000175000017500000000000014147005233016003 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/iis/build_msi.bat0000664000175000017500000000227014147005233020443 0ustar mhsvierulamhsvierula set PATH="%PATH%;C:\Program Files (x86)\WiX Toolset v3.11\bin;C:\Program Files (x86)\WiX Toolset v3.8\bin;C:\Program Files (x86)\WiX Toolset v3.7\bin;" set CURRENT_DIR=%cd% del installer.wix* "C:\Program Files (x86)\WiX Toolset v3.11\bin\candle.exe" -ext WixUtilExtension -ext WixUIExtension "%CURRENT_DIR%\installer.wxs" -out "%CURRENT_DIR%\installer.wixobj" -arch x64 @if NOT (%ERRORLEVEL%) == (0) goto build_failed "C:\Program Files (x86)\WiX Toolset v3.11\bin\light.exe" -ext WixUtilExtension -ext WixUIExtension "%CURRENT_DIR%\installer.wixobj" -out "%CURRENT_DIR%\installer-64.msi" @if NOT (%ERRORLEVEL%) == (0) goto build_failed "C:\Program Files (x86)\WiX Toolset v3.11\bin\candle.exe" -ext WixUtilExtension -ext WixUIExtension "%CURRENT_DIR%\installer.wxs" -out "%CURRENT_DIR%\installer.wixobj" -arch x86 @if NOT (%ERRORLEVEL%) == (0) goto build_failed "C:\Program Files (x86)\WiX Toolset v3.11\bin\light.exe" -ext WixUtilExtension -ext WixUIExtension "%CURRENT_DIR%\installer.wixobj" -out "%CURRENT_DIR%\installer-32.msi" @if NOT (%ERRORLEVEL%) == (0) goto build_failed exit /B 0 :build_failed @echo Problems during the building phase @goto failed :failed @cd %CURRENT_DIR% @exit /B 1 modsecurity-2.9.5/iis/installer.wxs0000664000175000017500000017021014147005233020544 0ustar mhsvierulamhsvierula VersionNT64 NOT VersionNT64 (NOT &ModSec64=3) AND (NOT &ModSec32=3) &ModSec64=3 OR &ModSec32=3 (NOT &ModSec32=3) &ModSec32=3 1 Installed Installed 1 1 DisableButton = 1 DisableButton = 0 1 Installed Installed 1 1 1 1 NOT Installed Installed AND PATCH 1 LicenseAccepted = "1" Installed NOT Installed &ModSec64=3 OR &ModSec32=3 (NOT &ModSec64=3) AND (NOT &ModSec32=3) &ModSec32=3 NOT Installed OR WixUI_InstallMode = "Change" NOT Installed OR WixUI_InstallMode = "Change" Installed AND PATCH NOT Installed OR WixUI_InstallMode = "Change" Installed AND NOT PATCH Installed AND PATCH 1 1 1 1 1 NOT Installed NOT Installed modsecurity-2.9.5/iis/ModSecurity.xml0000664000175000017500000000055614147005233021002 0ustar mhsvierulamhsvierula modsecurity-2.9.5/iis/build_release.bat0000664000175000017500000000412414147005233021273 0ustar mhsvierulamhsvierula echo "Building release..." set RELEASE_DIR=release set OUTPUT_DIR=%cd%\dependencies\release_files set CURRENT_DIR=%cd% set AMD64=%RELEASE_DIR%\amd64 set X86=%RELEASE_DIR%\x86 mkdir "%RELEASE_DIR%" mkdir "%AMD64%" mkdir "%X86%" set VCARGS32="C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\vcvars32.bat" set VCARGS64="C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64\vcvarsx86_amd64.bat" set SSDEEP_ARCH="x64" call build_dependencies.bat %VCARGS64% @if NOT (%ERRORLEVEL%) == (0) goto build_failed call build_modsecurity.bat %VCARGS64% @if NOT (%ERRORLEVEL%) == (0) goto build_failed copy "%OUTPUT_DIR%\libapr-1.dll" "%AMD64%" copy "%OUTPUT_DIR%\libapriconv-1.dll" "%AMD64%" copy "%OUTPUT_DIR%\libaprutil-1.dll" "%AMD64%" copy "%OUTPUT_DIR%\libcurl.dll" "%AMD64%" copy "%OUTPUT_DIR%\libxml2.dll" "%AMD64%" copy "%OUTPUT_DIR%\lua5.1.dll" "%AMD64%" copy "%OUTPUT_DIR%\mlogc.exe" "%AMD64%" copy "%OUTPUT_DIR%\ModSecurityIIS.dll" "%AMD64%" copy "%OUTPUT_DIR%\pcre.dll" "%AMD64%" copy "%OUTPUT_DIR%\zlib1.dll" "%AMD64%" copy "%OUTPUT_DIR%\yajl.dll" "%AMD64%" copy "%OUTPUT_DIR%\fuzzy.dll" "%AMD64%" set SSDEEP_ARCH="x86" call build_dependencies.bat %VCARGS32% @if NOT (%ERRORLEVEL%) == (0) goto build_failed call build_modsecurity.bat %VCARGS32% @if NOT (%ERRORLEVEL%) == (0) goto build_failed copy "%OUTPUT_DIR%\libapr-1.dll" "%X86%" copy "%OUTPUT_DIR%\libapriconv-1.dll" "%X86%" copy "%OUTPUT_DIR%\libaprutil-1.dll" "%X86%" copy "%OUTPUT_DIR%\libcurl.dll" "%X86%" copy "%OUTPUT_DIR%\libxml2.dll" "%X86%" copy "%OUTPUT_DIR%\lua5.1.dll" "%X86%" copy "%OUTPUT_DIR%\mlogc.exe" "%X86%" copy "%OUTPUT_DIR%\ModSecurityIIS.dll" "%X86%" copy "%OUTPUT_DIR%\pcre.dll" "%X86%" copy "%OUTPUT_DIR%\zlib1.dll" "%X86%" copy "%OUTPUT_DIR%\yajl.dll" "%X86%" copy "%OUTPUT_DIR%\fuzzy.dll" "%X86%" :: copy %OUTPUT_DIR%\Installer.exe %RELEASE_DIR% :: copy %OUTPUT_DIR%\ModSecurity.xml %RELEASE_DIR% :: copy %OUTPUT_DIR%\owasp_csr.zip %RELEASE_DIR% :: copy %OUTPUT_DIR%\README.txt %RELEASE_DIR% exit /B 0 :build_failed @echo Problems during the building phase @goto failed :failed @cd %CURRENT_DIR% @exit /B 1 modsecurity-2.9.5/iis/ModSecurityIIS.sln0000664000175000017500000001205514147005233021340 0ustar mhsvierulamhsvierula Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Express 2013 for Windows Desktop VisualStudioVersion = 12.0.21005.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ModSecurityIIS", "ModSecurityIIS.vcxproj", "{D1F7201F-064B-48AB-868C-FED22464841C}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mlogc", "mlogc.vcxproj", "{DD595511-33F2-475A-B36F-2A6B27E03FA0}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Custom Debug|Mixed Platforms = Custom Debug|Mixed Platforms Custom Debug|Win32 = Custom Debug|Win32 Custom Debug|x64 = Custom Debug|x64 Custom Debug|x86 = Custom Debug|x86 Debug|Mixed Platforms = Debug|Mixed Platforms Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Release|Mixed Platforms = Release|Mixed Platforms Release|Win32 = Release|Win32 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {D1F7201F-064B-48AB-868C-FED22464841C}.Custom Debug|Mixed Platforms.ActiveCfg = Custom Debug|Win32 {D1F7201F-064B-48AB-868C-FED22464841C}.Custom Debug|Mixed Platforms.Build.0 = Custom Debug|Win32 {D1F7201F-064B-48AB-868C-FED22464841C}.Custom Debug|Win32.ActiveCfg = Custom Debug|Win32 {D1F7201F-064B-48AB-868C-FED22464841C}.Custom Debug|Win32.Build.0 = Custom Debug|Win32 {D1F7201F-064B-48AB-868C-FED22464841C}.Custom Debug|x64.ActiveCfg = Custom Debug|x64 {D1F7201F-064B-48AB-868C-FED22464841C}.Custom Debug|x64.Build.0 = Custom Debug|x64 {D1F7201F-064B-48AB-868C-FED22464841C}.Custom Debug|x86.ActiveCfg = Custom Debug|Win32 {D1F7201F-064B-48AB-868C-FED22464841C}.Custom Debug|x86.Build.0 = Custom Debug|Win32 {D1F7201F-064B-48AB-868C-FED22464841C}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 {D1F7201F-064B-48AB-868C-FED22464841C}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {D1F7201F-064B-48AB-868C-FED22464841C}.Debug|Win32.ActiveCfg = Debug|Win32 {D1F7201F-064B-48AB-868C-FED22464841C}.Debug|Win32.Build.0 = Debug|Win32 {D1F7201F-064B-48AB-868C-FED22464841C}.Debug|x64.ActiveCfg = Debug|x64 {D1F7201F-064B-48AB-868C-FED22464841C}.Debug|x64.Build.0 = Debug|x64 {D1F7201F-064B-48AB-868C-FED22464841C}.Debug|x86.ActiveCfg = Debug|Win32 {D1F7201F-064B-48AB-868C-FED22464841C}.Release|Mixed Platforms.ActiveCfg = Release|x64 {D1F7201F-064B-48AB-868C-FED22464841C}.Release|Mixed Platforms.Build.0 = Release|x64 {D1F7201F-064B-48AB-868C-FED22464841C}.Release|Win32.ActiveCfg = Release|Win32 {D1F7201F-064B-48AB-868C-FED22464841C}.Release|Win32.Build.0 = Release|Win32 {D1F7201F-064B-48AB-868C-FED22464841C}.Release|x64.ActiveCfg = Release|x64 {D1F7201F-064B-48AB-868C-FED22464841C}.Release|x64.Build.0 = Release|x64 {D1F7201F-064B-48AB-868C-FED22464841C}.Release|x86.ActiveCfg = Release|Win32 {D1F7201F-064B-48AB-868C-FED22464841C}.Release|x86.Build.0 = Release|Win32 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Custom Debug|Mixed Platforms.ActiveCfg = Custom Debug|Win32 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Custom Debug|Mixed Platforms.Build.0 = Custom Debug|Win32 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Custom Debug|Win32.ActiveCfg = Custom Debug|Win32 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Custom Debug|Win32.Build.0 = Custom Debug|Win32 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Custom Debug|x64.ActiveCfg = Custom Debug|x64 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Custom Debug|x64.Build.0 = Custom Debug|x64 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Custom Debug|x86.ActiveCfg = Custom Debug|Win32 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Custom Debug|x86.Build.0 = Custom Debug|Win32 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Debug|Win32.ActiveCfg = Debug|Win32 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Debug|Win32.Build.0 = Debug|Win32 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Debug|x64.ActiveCfg = Debug|x64 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Debug|x64.Build.0 = Debug|x64 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Debug|x86.ActiveCfg = Debug|Win32 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Debug|x86.Build.0 = Debug|Win32 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Release|Mixed Platforms.ActiveCfg = Release|Win32 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Release|Mixed Platforms.Build.0 = Release|Win32 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Release|Win32.ActiveCfg = Release|Win32 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Release|Win32.Build.0 = Release|Win32 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Release|x64.ActiveCfg = Release|x64 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Release|x64.Build.0 = Release|x64 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Release|x86.ActiveCfg = Release|Win32 {DD595511-33F2-475A-B36F-2A6B27E03FA0}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal modsecurity-2.9.5/iis/ModSecurityIIS.vcxproj.filters0000775000175000017500000001733714147005233023721 0ustar mhsvierulamhsvierula ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity Standalone Standalone Standalone Standalone Standalone Standalone Standalone ModSecurity ModSecurity ModSecurity\libinjection ModSecurity\libinjection ModSecurity\libinjection ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity ModSecurity Standalone Standalone ModSecurity ModSecurity ModSecurity\libinjection ModSecurity\libinjection ModSecurity ModSecurity {ba9b4453-b351-4739-9f9d-3d56d6b27bbc} {ba6117ea-f101-4d23-85f2-d1af0235e22a} {6e3cb6bd-89fa-413c-ba35-71d6733e3708} modsecurity-2.9.5/iis/moduleconfig.h0000664000175000017500000000554714147005233020642 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #pragma once #define MODSECURITY_SECTION L"system.webServer/ModSecurity" #define MODSECURITY_SECTION_ENABLED L"enabled" #define MODSECURITY_SECTION_CONFIGFILE L"configFile" extern IHttpServer * g_pHttpServer; extern PVOID g_pModuleContext; class MODSECURITY_STORED_CONTEXT : public IHttpStoredContext { public: MODSECURITY_STORED_CONTEXT(); ~MODSECURITY_STORED_CONTEXT(); static HRESULT GetConfig( IHttpContext * pContext, MODSECURITY_STORED_CONTEXT ** ppModuleConfig ); // virtual VOID CleanupStoredContext( VOID ) { delete this; } BOOL GetIsEnabled() { return m_bIsEnabled; } WCHAR* GetPath() { return m_pszPath; } HRESULT Initialize( IHttpContext * pW3Context, IAppHostConfigException ** ppException ); DWORD GlobalWideCharToMultiByte( WCHAR* pSource, DWORD dwLengthSource, CHAR** ppszDestination, USHORT* pdwLengthDestination ); void* m_Config; private: HRESULT GetBooleanPropertyValue( IAppHostElement* pElement, WCHAR* pszPropertyName, IAppHostPropertyException** pException, BOOL* pBoolValue ); HRESULT GetDWORDPropertyValue( IAppHostElement* pElement, WCHAR* pszPropertyName, IAppHostPropertyException** pException, DWORD* pnValue ); HRESULT GetTimeSpanPropertyValue( IAppHostElement* pElement, WCHAR* pszPropertyName, IAppHostPropertyException** pException, ULONGLONG* pnValue ); HRESULT GetStringPropertyValue( IAppHostElement* pElement, WCHAR* pszPropertyName, IAppHostPropertyException** pException, WCHAR** ppszValue ); BOOL m_bIsEnabled; WCHAR* m_pszPath; }; modsecurity-2.9.5/iis/mymodule.cpp0000664000175000017500000011146214147005233020347 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #define WIN32_LEAN_AND_MEAN #undef inline #define inline inline // IIS7 Server API header file #include #include #include #include "httpserv.h" // Project header files #include "mymodule.h" #include "mymodulefactory.h" #include "api.h" #include "moduleconfig.h" #include "winsock2.h" class REQUEST_STORED_CONTEXT : public IHttpStoredContext { public: REQUEST_STORED_CONTEXT() { m_pConnRec = NULL; m_pRequestRec = NULL; m_pHttpContext = NULL; m_pProvider = NULL; m_pResponseBuffer = NULL; m_pResponseLength = 0; m_pResponsePosition = 0; } ~REQUEST_STORED_CONTEXT() { FinishRequest(); } // virtual VOID CleanupStoredContext( VOID ) { FinishRequest(); delete this; } void FinishRequest() { if(m_pRequestRec != NULL) { modsecFinishRequest(m_pRequestRec); m_pRequestRec = NULL; } if(m_pConnRec != NULL) { modsecFinishConnection(m_pConnRec); m_pConnRec = NULL; } } conn_rec *m_pConnRec; request_rec *m_pRequestRec; IHttpContext *m_pHttpContext; IHttpEventProvider *m_pProvider; char *m_pResponseBuffer; ULONGLONG m_pResponseLength; ULONGLONG m_pResponsePosition; }; //---------------------------------------------------------------------------- char *GetIpAddr(apr_pool_t *pool, PSOCKADDR pAddr) { const char *format = "%15[0-9.]:%5[0-9]"; char ip[16] = { 0 }; // ip4 addresses have max len 15 char port[6] = { 0 }; // port numbers are 16bit, ie 5 digits max DWORD len = 50; char *buf = (char *)apr_palloc(pool, len); if(buf == NULL) return ""; buf[0] = 0; WSAAddressToString(pAddr, sizeof(SOCKADDR), NULL, buf, &len); // test for IPV4 with port on the end if (sscanf(buf, format, ip, port) == 2) { // IPV4 but with port - remove the port char* input = ":"; char* ipv4 = strtok(buf, input); return ipv4; } return buf; } apr_sockaddr_t *CopySockAddr(apr_pool_t *pool, PSOCKADDR pAddr) { apr_sockaddr_t *addr = (apr_sockaddr_t *)apr_palloc(pool, sizeof(apr_sockaddr_t)); int adrlen = 16, iplen = 4; if(pAddr->sa_family == AF_INET6) { adrlen = 46; iplen = 16; } addr->addr_str_len = adrlen; addr->family = pAddr->sa_family; addr->hostname = "unknown"; #ifdef WIN32 addr->ipaddr_len = sizeof(IN_ADDR); #else addr->ipaddr_len = sizeof(struct in_addr); #endif addr->ipaddr_ptr = &addr->sa.sin.sin_addr; addr->pool = pool; addr->port = 80; #ifdef WIN32 memcpy(&addr->sa.sin.sin_addr.S_un.S_addr, pAddr->sa_data, iplen); #else memcpy(&addr->sa.sin.sin_addr.s_addr, pAddr->sa_data, iplen); #endif addr->sa.sin.sin_family = pAddr->sa_family; addr->sa.sin.sin_port = 80; addr->salen = sizeof(addr->sa); addr->servname = addr->hostname; return addr; } //---------------------------------------------------------------------------- char *ZeroTerminate(const char *str, size_t len, apr_pool_t *pool) { char *_n = (char *)apr_palloc(pool, len + 1); memcpy(_n, str, len); _n[len] = 0; return _n; } //---------------------------------------------------------------------------- // FUNCTION: ConvertUTF16ToUTF8 // DESC: Converts Unicode UTF-16 (Windows default) text to Unicode UTF-8. //---------------------------------------------------------------------------- char *ConvertUTF16ToUTF8( __in const WCHAR * pszTextUTF16, size_t cchUTF16, apr_pool_t *pool ) { // // Special case of NULL or empty input string // if ( (pszTextUTF16 == NULL) || (*pszTextUTF16 == L'\0') || cchUTF16 == 0 ) { // Return empty string return ""; } // // Get size of destination UTF-8 buffer, in CHAR's (= bytes) // int cbUTF8 = ::WideCharToMultiByte( CP_UTF8, // convert to UTF-8 0, // specify conversion behavior pszTextUTF16, // source UTF-16 string static_cast( cchUTF16 ), // total source string length, in WCHAR's, NULL, // unused - no conversion required in this step 0, // request buffer size NULL, NULL // unused ); if ( cbUTF8 == 0 ) { return ""; } // // Allocate destination buffer for UTF-8 string // int cchUTF8 = cbUTF8; // sizeof(CHAR) = 1 byte char *pszUTF8 = (char *)apr_palloc(pool, cchUTF8 + 1 ); // // Do the conversion from UTF-16 to UTF-8 // int result = ::WideCharToMultiByte( CP_UTF8, // convert to UTF-8 0, // specify conversion behavior pszTextUTF16, // source UTF-16 string static_cast( cchUTF16 ), // total source string length, in WCHAR's, // including end-of-string \0 pszUTF8, // destination buffer cbUTF8, // destination buffer size, in bytes NULL, NULL // unused ); if ( result == 0 ) { return ""; } pszUTF8[cchUTF8] = 0; return pszUTF8; } void Log(void *obj, int level, char *str) { CMyHttpModule *mod = (CMyHttpModule *)obj; WORD logcat = EVENTLOG_INFORMATION_TYPE; level &= APLOG_LEVELMASK; if(level <= APLOG_ERR) logcat = EVENTLOG_ERROR_TYPE; if(level == APLOG_WARNING || strstr(str, "Warning.") != NULL) logcat = EVENTLOG_WARNING_TYPE; mod->WriteEventViewerLog(str, logcat); } #define NOTE_IIS "iis-tx-context" void StoreIISContext(request_rec *r, REQUEST_STORED_CONTEXT *rsc) { apr_table_setn(r->notes, NOTE_IIS, (const char *)rsc); } REQUEST_STORED_CONTEXT *RetrieveIISContext(request_rec *r) { REQUEST_STORED_CONTEXT *msr = NULL; request_rec *rx = NULL; /* Look in the current request first. */ msr = (REQUEST_STORED_CONTEXT *)apr_table_get(r->notes, NOTE_IIS); if (msr != NULL) { //msr->r = r; return msr; } /* If this is a subrequest then look in the main request. */ if (r->main != NULL) { msr = (REQUEST_STORED_CONTEXT *)apr_table_get(r->main->notes, NOTE_IIS); if (msr != NULL) { //msr->r = r; return msr; } } /* If the request was redirected then look in the previous requests. */ rx = r->prev; while(rx != NULL) { msr = (REQUEST_STORED_CONTEXT *)apr_table_get(rx->notes, NOTE_IIS); if (msr != NULL) { //msr->r = r; return msr; } rx = rx->prev; } return NULL; } HRESULT CMyHttpModule::ReadFileChunk(HTTP_DATA_CHUNK *chunk, char *buf) { OVERLAPPED ovl; DWORD dwDataStartOffset; ULONGLONG bytesTotal = 0; BYTE * pIoBuffer = NULL; HANDLE hIoEvent = INVALID_HANDLE_VALUE; HRESULT hr = S_OK; pIoBuffer = (BYTE *)VirtualAlloc(NULL, 1, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); if (pIoBuffer == NULL) { hr = HRESULT_FROM_WIN32(GetLastError()); goto Done; } hIoEvent = CreateEvent(NULL, // security attr FALSE, // manual reset FALSE, // initial state NULL); // name if (hIoEvent == NULL) { hr = HRESULT_FROM_WIN32(GetLastError()); goto Done; } while(bytesTotal < chunk->FromFileHandle.ByteRange.Length.QuadPart) { DWORD bytesRead = 0; int was_eof = 0; ULONGLONG offset = chunk->FromFileHandle.ByteRange.StartingOffset.QuadPart + bytesTotal; ZeroMemory(&ovl, sizeof ovl); ovl.hEvent = hIoEvent; ovl.Offset = (DWORD)offset; dwDataStartOffset = ovl.Offset & (m_dwPageSize - 1); ovl.Offset &= ~(m_dwPageSize - 1); ovl.OffsetHigh = offset >> 32; if (!ReadFile(chunk->FromFileHandle.FileHandle, pIoBuffer, m_dwPageSize, &bytesRead, &ovl)) { DWORD dwErr = GetLastError(); switch (dwErr) { case ERROR_IO_PENDING: // // GetOverlappedResult can return without waiting for the // event thus leaving it signalled and causing problems // with future use of that event handle, so just wait ourselves // WaitForSingleObject(ovl.hEvent, INFINITE); // == WAIT_OBJECT_0); if (!GetOverlappedResult( chunk->FromFileHandle.FileHandle, &ovl, &bytesRead, TRUE)) { dwErr = GetLastError(); switch(dwErr) { case ERROR_HANDLE_EOF: was_eof = 1; break; default: hr = HRESULT_FROM_WIN32(dwErr); goto Done; } } break; case ERROR_HANDLE_EOF: was_eof = 1; break; default: hr = HRESULT_FROM_WIN32(dwErr); goto Done; } } bytesRead -= dwDataStartOffset; if (bytesRead > chunk->FromFileHandle.ByteRange.Length.QuadPart) { bytesRead = (DWORD)chunk->FromFileHandle.ByteRange.Length.QuadPart; } if ((bytesTotal + bytesRead) > chunk->FromFileHandle.ByteRange.Length.QuadPart) { bytesRead = chunk->FromFileHandle.ByteRange.Length.QuadPart - bytesTotal; } memcpy(buf, pIoBuffer + dwDataStartOffset, bytesRead); buf += bytesRead; bytesTotal += bytesRead; if(was_eof != 0) chunk->FromFileHandle.ByteRange.Length.QuadPart = bytesTotal; } Done: if(NULL != pIoBuffer) { VirtualFree(pIoBuffer, 0, MEM_RELEASE); } if(INVALID_HANDLE_VALUE != hIoEvent) { CloseHandle(hIoEvent); } return hr; } REQUEST_NOTIFICATION_STATUS CMyHttpModule::OnSendResponse( IN IHttpContext * pHttpContext, IN ISendResponseProvider * pResponseProvider ) { REQUEST_STORED_CONTEXT *rsc = NULL; rsc = (REQUEST_STORED_CONTEXT *)pHttpContext->GetModuleContextContainer()->GetModuleContext(g_pModuleContext); EnterCriticalSection(&m_csLock); // here we must check if response body processing is enabled // if(rsc == NULL || rsc->m_pRequestRec == NULL || rsc->m_pResponseBuffer != NULL || !modsecIsResponseBodyAccessEnabled(rsc->m_pRequestRec)) { goto Exit; } HRESULT hr = S_OK; IHttpResponse *pHttpResponse = NULL; HTTP_RESPONSE *pRawHttpResponse = NULL; HTTP_BYTE_RANGE *pFileByteRange = NULL; HTTP_DATA_CHUNK *pSourceDataChunk = NULL; LARGE_INTEGER lFileSize; REQUEST_NOTIFICATION_STATUS ret = RQ_NOTIFICATION_CONTINUE; ULONGLONG ulTotalLength = 0; DWORD c; request_rec *r = rsc->m_pRequestRec; pHttpResponse = pHttpContext->GetResponse(); pRawHttpResponse = pHttpResponse->GetRawHttpResponse(); // here we must add handling of chunked response // apparently IIS 7 calls this handler once per chunk // see: http://stackoverflow.com/questions/4385249/how-to-buffer-and-process-chunked-data-before-sending-headers-in-iis7-native-mod if(pRawHttpResponse->EntityChunkCount == 0) goto Exit; // here we must transfer response headers // USHORT ctcch = 0; char *ct = (char *)pHttpResponse->GetHeader(HttpHeaderContentType, &ctcch); char *ctz = ZeroTerminate(ct, ctcch, r->pool); // assume HTML if content type not set // without this output filter would not buffer response and processing would hang // if(ctz[0] == 0) ctz = "text/html"; r->content_type = ctz; #define _TRANSHEADER(id,str) if(pRawHttpResponse->Headers.KnownHeaders[id].pRawValue != NULL) \ {\ apr_table_setn(r->headers_out, str, \ ZeroTerminate(pRawHttpResponse->Headers.KnownHeaders[id].pRawValue, pRawHttpResponse->Headers.KnownHeaders[id].RawValueLength, r->pool)); \ } _TRANSHEADER(HttpHeaderCacheControl, "Cache-Control"); _TRANSHEADER(HttpHeaderConnection, "Connection"); _TRANSHEADER(HttpHeaderDate, "Date"); _TRANSHEADER(HttpHeaderKeepAlive, "Keep-Alive"); _TRANSHEADER(HttpHeaderPragma, "Pragma"); _TRANSHEADER(HttpHeaderTrailer, "Trailer"); _TRANSHEADER(HttpHeaderTransferEncoding, "Transfer-Encoding"); _TRANSHEADER(HttpHeaderUpgrade, "Upgrade"); _TRANSHEADER(HttpHeaderVia, "Via"); _TRANSHEADER(HttpHeaderWarning, "Warning"); _TRANSHEADER(HttpHeaderAllow, "Allow"); _TRANSHEADER(HttpHeaderContentLength, "Content-Length"); _TRANSHEADER(HttpHeaderContentType, "Content-Type"); _TRANSHEADER(HttpHeaderContentEncoding, "Content-Encoding"); _TRANSHEADER(HttpHeaderContentLanguage, "Content-Language"); _TRANSHEADER(HttpHeaderContentLocation, "Content-Location"); _TRANSHEADER(HttpHeaderContentMd5, "Content-Md5"); _TRANSHEADER(HttpHeaderContentRange, "Content-Range"); _TRANSHEADER(HttpHeaderExpires, "Expires"); _TRANSHEADER(HttpHeaderLastModified, "Last-Modified"); _TRANSHEADER(HttpHeaderAcceptRanges, "Accept-Ranges"); _TRANSHEADER(HttpHeaderAge, "Age"); _TRANSHEADER(HttpHeaderEtag, "Etag"); _TRANSHEADER(HttpHeaderLocation, "Location"); _TRANSHEADER(HttpHeaderProxyAuthenticate, "Proxy-Authenticate"); _TRANSHEADER(HttpHeaderRetryAfter, "Retry-After"); _TRANSHEADER(HttpHeaderServer, "Server"); _TRANSHEADER(HttpHeaderSetCookie, "Set-Cookie"); _TRANSHEADER(HttpHeaderVary, "Vary"); _TRANSHEADER(HttpHeaderWwwAuthenticate, "Www-Authenticate"); #undef _TRANSHEADER for(int i = 0; i < pRawHttpResponse->Headers.UnknownHeaderCount; i++) { apr_table_setn(r->headers_out, ZeroTerminate(pRawHttpResponse->Headers.pUnknownHeaders[i].pName, pRawHttpResponse->Headers.pUnknownHeaders[i].NameLength, r->pool), ZeroTerminate(pRawHttpResponse->Headers.pUnknownHeaders[i].pRawValue, pRawHttpResponse->Headers.pUnknownHeaders[i].RawValueLength, r->pool)); } r->content_encoding = apr_table_get(r->headers_out, "Content-Encoding"); //r->content_type = apr_table_get(r->headers_out, "Content-Type"); -- already set above const char *lng = apr_table_get(r->headers_out, "Content-Languages"); if(lng != NULL) { r->content_languages = apr_array_make(r->pool, 1, sizeof(const char *)); *(const char **)apr_array_push(r->content_languages) = lng; } // Disable kernel caching for this response // Probably we don't have to do it for ModSecurity //pHttpContext->GetResponse()->DisableKernelCache( // IISCacheEvents::HTTPSYS_CACHEABLE::HANDLER_HTTPSYS_UNFRIENDLY); for(c = 0; c < pRawHttpResponse->EntityChunkCount; c++ ) { pSourceDataChunk = &pRawHttpResponse->pEntityChunks[ c ]; switch( pSourceDataChunk->DataChunkType ) { case HttpDataChunkFromMemory: ulTotalLength += pSourceDataChunk->FromMemory.BufferLength; break; case HttpDataChunkFromFileHandle: pFileByteRange = &pSourceDataChunk->FromFileHandle.ByteRange; // // File chunks may contain by ranges with unspecified length // (HTTP_BYTE_RANGE_TO_EOF). In order to send parts of such a chunk, // its necessary to know when the chunk is finished, and // we need to move to the next chunk. // if ( pFileByteRange->Length.QuadPart == HTTP_BYTE_RANGE_TO_EOF) { if ( GetFileType( pSourceDataChunk->FromFileHandle.FileHandle ) == FILE_TYPE_DISK ) { if ( !GetFileSizeEx( pSourceDataChunk->FromFileHandle.FileHandle, &lFileSize ) ) { DWORD dwError = GetLastError(); hr = HRESULT_FROM_WIN32(dwError); goto Finished; } // put the resolved file length in the chunk, replacing // HTTP_BYTE_RANGE_TO_EOF pFileByteRange->Length.QuadPart = lFileSize.QuadPart - pFileByteRange->StartingOffset.QuadPart; } else { hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); goto Finished; } } ulTotalLength += pFileByteRange->Length.QuadPart; break; default: // TBD: consider implementing HttpDataChunkFromFragmentCache, // and HttpDataChunkFromFragmentCacheEx hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); goto Finished; } } rsc->m_pResponseBuffer = (char *)apr_palloc(rsc->m_pRequestRec->pool, ulTotalLength); ulTotalLength = 0; for(c = 0; c < pRawHttpResponse->EntityChunkCount; c++ ) { pSourceDataChunk = &pRawHttpResponse->pEntityChunks[ c ]; switch( pSourceDataChunk->DataChunkType ) { case HttpDataChunkFromMemory: memcpy(rsc->m_pResponseBuffer + ulTotalLength, pSourceDataChunk->FromMemory.pBuffer, pSourceDataChunk->FromMemory.BufferLength); ulTotalLength += pSourceDataChunk->FromMemory.BufferLength; break; case HttpDataChunkFromFileHandle: pFileByteRange = &pSourceDataChunk->FromFileHandle.ByteRange; if(ReadFileChunk(pSourceDataChunk, rsc->m_pResponseBuffer + ulTotalLength) != S_OK) { DWORD dwErr = GetLastError(); hr = HRESULT_FROM_WIN32(dwErr); goto Finished; } ulTotalLength += pFileByteRange->Length.QuadPart; break; default: // TBD: consider implementing HttpDataChunkFromFragmentCache, // and HttpDataChunkFromFragmentCacheEx hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); goto Finished; } } rsc->m_pResponseLength = ulTotalLength; // // If there's no content-length set, we need to set it to avoid chunked transfer mode // We can only do it if there is it's the only response to be sent. // DWORD dwFlags = pResponseProvider->GetFlags(); if (pResponseProvider->GetHeadersBeingSent() && (dwFlags & HTTP_SEND_RESPONSE_FLAG_MORE_DATA) == 0 && pHttpContext->GetResponse()->GetHeader(HttpHeaderContentLength) == NULL) { CHAR szLength[21]; //Max length for a 64 bit int is 20 ZeroMemory(szLength, sizeof(szLength)); hr = StringCchPrintfA( szLength, sizeof(szLength) / sizeof(CHAR) - 1, "%d", ulTotalLength); if(FAILED(hr)) { goto Finished; } hr = pHttpContext->GetResponse()->SetHeader( HttpHeaderContentLength, szLength, (USHORT)strlen(szLength), TRUE); if(FAILED(hr)) { goto Finished; } } Finished: int status = modsecProcessResponse(rsc->m_pRequestRec); // the logic here is temporary, needs clarification // if(status != 0 && status != -1) { pHttpContext->GetResponse()->Clear(); pHttpContext->GetResponse()->SetStatus(status, "ModSecurity Action"); pHttpContext->SetRequestHandled(); rsc->FinishRequest(); LeaveCriticalSection(&m_csLock); return RQ_NOTIFICATION_FINISH_REQUEST; } Exit: // temporary hack, in reality OnSendRequest theoretically could possibly come before OnEndRequest // if(rsc != NULL) rsc->FinishRequest(); LeaveCriticalSection(&m_csLock); return RQ_NOTIFICATION_CONTINUE; } REQUEST_NOTIFICATION_STATUS CMyHttpModule::OnPostEndRequest( IN IHttpContext * pHttpContext, IN IHttpEventProvider * pProvider ) { REQUEST_STORED_CONTEXT *rsc = NULL; rsc = (REQUEST_STORED_CONTEXT *)pHttpContext->GetModuleContextContainer()->GetModuleContext(g_pModuleContext); // only finish request if OnSendResponse have been called already // if(rsc != NULL && rsc->m_pResponseBuffer != NULL) { EnterCriticalSection(&m_csLock); rsc->FinishRequest(); LeaveCriticalSection(&m_csLock); } return RQ_NOTIFICATION_CONTINUE; } REQUEST_NOTIFICATION_STATUS CMyHttpModule::OnBeginRequest( IN IHttpContext * pHttpContext, IN IHttpEventProvider * pProvider ) { HRESULT hr = S_OK; IHttpRequest* pRequest = NULL; MODSECURITY_STORED_CONTEXT* pConfig = NULL; UNREFERENCED_PARAMETER ( pProvider ); EnterCriticalSection(&m_csLock); if ( pHttpContext == NULL ) { hr = E_UNEXPECTED; goto Finished; } pRequest = pHttpContext->GetRequest(); if ( pRequest == NULL ) { hr = E_UNEXPECTED; goto Finished; } hr = MODSECURITY_STORED_CONTEXT::GetConfig(pHttpContext, &pConfig ); if ( FAILED( hr ) ) { //hr = E_UNEXPECTED; hr = S_OK; goto Finished; } // If module is disabled, dont go any further // if( pConfig->GetIsEnabled() == false ) { goto Finished; } if(pConfig->m_Config == NULL) { char *path; USHORT pathlen; hr = pConfig->GlobalWideCharToMultiByte(pConfig->GetPath(), wcslen(pConfig->GetPath()), &path, &pathlen); if ( FAILED( hr ) ) { hr = E_UNEXPECTED; goto Finished; } pConfig->m_Config = modsecGetDefaultConfig(); PCWSTR servpath = pHttpContext->GetApplication()->GetApplicationPhysicalPath(); char *apppath; USHORT apppathlen; hr = pConfig->GlobalWideCharToMultiByte((WCHAR *)servpath, wcslen(servpath), &apppath, &apppathlen); if ( FAILED( hr ) ) { delete path; hr = E_UNEXPECTED; goto Finished; } if(path[0] != 0) { const char * err = modsecProcessConfig((directory_config *)pConfig->m_Config, path, apppath); if(err != NULL) { WriteEventViewerLog(err, EVENTLOG_ERROR_TYPE); delete apppath; delete path; goto Finished; } modsecReportRemoteLoadedRules(); if (this->status_call_already_sent == false) { this->status_call_already_sent = true; modsecStatusEngineCall(); } } delete apppath; delete path; } conn_rec *c; request_rec *r; c = modsecNewConnection(); modsecProcessConnection(c); r = modsecNewRequest(c, (directory_config *)pConfig->m_Config); // on IIS we force input stream inspection flag, because its absence does not add any performance gain // it's because on IIS request body must be restored each time it was read // modsecSetConfigForIISRequestBody(r); REQUEST_STORED_CONTEXT *rsc = new REQUEST_STORED_CONTEXT(); rsc->m_pConnRec = c; rsc->m_pRequestRec = r; rsc->m_pHttpContext = pHttpContext; rsc->m_pProvider = pProvider; pHttpContext->GetModuleContextContainer()->SetModuleContext(rsc, g_pModuleContext); StoreIISContext(r, rsc); HTTP_REQUEST *req = pRequest->GetRawHttpRequest(); r->hostname = ConvertUTF16ToUTF8(req->CookedUrl.pHost, req->CookedUrl.HostLength / sizeof(WCHAR), r->pool); r->path_info = ConvertUTF16ToUTF8(req->CookedUrl.pAbsPath, req->CookedUrl.AbsPathLength / sizeof(WCHAR), r->pool); if(r->hostname == NULL) { if(req->Headers.KnownHeaders[HttpHeaderHost].pRawValue != NULL) r->hostname = ZeroTerminate(req->Headers.KnownHeaders[HttpHeaderHost].pRawValue, req->Headers.KnownHeaders[HttpHeaderHost].RawValueLength, r->pool); } int port = 0; char *port_str = NULL; if(r->hostname != NULL) { int k = 0; char *ptr = (char *)r->hostname; while(*ptr != 0 && *ptr != ':') ptr++; if(*ptr == ':') { *ptr = 0; port_str = ptr + 1; port = atoi(port_str); } } if(req->CookedUrl.pQueryString != NULL && req->CookedUrl.QueryStringLength > 0) r->args = ConvertUTF16ToUTF8(req->CookedUrl.pQueryString + 1, (req->CookedUrl.QueryStringLength / sizeof(WCHAR)) - 1, r->pool); #define _TRANSHEADER(id,str) if(req->Headers.KnownHeaders[id].pRawValue != NULL) \ {\ apr_table_setn(r->headers_in, str, \ ZeroTerminate(req->Headers.KnownHeaders[id].pRawValue, req->Headers.KnownHeaders[id].RawValueLength, r->pool)); \ } _TRANSHEADER(HttpHeaderCacheControl, "Cache-Control"); _TRANSHEADER(HttpHeaderConnection, "Connection"); _TRANSHEADER(HttpHeaderDate, "Date"); _TRANSHEADER(HttpHeaderKeepAlive, "Keep-Alive"); _TRANSHEADER(HttpHeaderPragma, "Pragma"); _TRANSHEADER(HttpHeaderTrailer, "Trailer"); _TRANSHEADER(HttpHeaderTransferEncoding, "Transfer-Encoding"); _TRANSHEADER(HttpHeaderUpgrade, "Upgrade"); _TRANSHEADER(HttpHeaderVia, "Via"); _TRANSHEADER(HttpHeaderWarning, "Warning"); _TRANSHEADER(HttpHeaderAllow, "Allow"); _TRANSHEADER(HttpHeaderContentLength, "Content-Length"); _TRANSHEADER(HttpHeaderContentType, "Content-Type"); _TRANSHEADER(HttpHeaderContentEncoding, "Content-Encoding"); _TRANSHEADER(HttpHeaderContentLanguage, "Content-Language"); _TRANSHEADER(HttpHeaderContentLocation, "Content-Location"); _TRANSHEADER(HttpHeaderContentMd5, "Content-Md5"); _TRANSHEADER(HttpHeaderContentRange, "Content-Range"); _TRANSHEADER(HttpHeaderExpires, "Expires"); _TRANSHEADER(HttpHeaderLastModified, "Last-Modified"); _TRANSHEADER(HttpHeaderAccept, "Accept"); _TRANSHEADER(HttpHeaderAcceptCharset, "Accept-Charset"); _TRANSHEADER(HttpHeaderAcceptEncoding, "Accept-Encoding"); _TRANSHEADER(HttpHeaderAcceptLanguage, "Accept-Language"); _TRANSHEADER(HttpHeaderAuthorization, "Authorization"); _TRANSHEADER(HttpHeaderCookie, "Cookie"); _TRANSHEADER(HttpHeaderExpect, "Expect"); _TRANSHEADER(HttpHeaderFrom, "From"); _TRANSHEADER(HttpHeaderHost, "Host"); _TRANSHEADER(HttpHeaderIfMatch, "If-Match"); _TRANSHEADER(HttpHeaderIfModifiedSince, "If-Modified-Since"); _TRANSHEADER(HttpHeaderIfNoneMatch, "If-None-Match"); _TRANSHEADER(HttpHeaderIfRange, "If-Range"); _TRANSHEADER(HttpHeaderIfUnmodifiedSince, "If-Unmodified-Since"); _TRANSHEADER(HttpHeaderMaxForwards, "Max-Forwards"); _TRANSHEADER(HttpHeaderProxyAuthorization, "Proxy-Authorization"); _TRANSHEADER(HttpHeaderReferer, "Referer"); _TRANSHEADER(HttpHeaderRange, "Range"); _TRANSHEADER(HttpHeaderTe, "TE"); _TRANSHEADER(HttpHeaderTranslate, "Translate"); _TRANSHEADER(HttpHeaderUserAgent, "User-Agent"); #undef _TRANSHEADER for(int i = 0; i < req->Headers.UnknownHeaderCount; i++) { apr_table_setn(r->headers_in, ZeroTerminate(req->Headers.pUnknownHeaders[i].pName, req->Headers.pUnknownHeaders[i].NameLength, r->pool), ZeroTerminate(req->Headers.pUnknownHeaders[i].pRawValue, req->Headers.pUnknownHeaders[i].RawValueLength, r->pool)); } r->content_encoding = apr_table_get(r->headers_in, "Content-Encoding"); r->content_type = apr_table_get(r->headers_in, "Content-Type"); const char *lng = apr_table_get(r->headers_in, "Content-Languages"); if(lng != NULL) { r->content_languages = apr_array_make(r->pool, 1, sizeof(const char *)); *(const char **)apr_array_push(r->content_languages) = lng; } switch(req->Verb) { case HttpVerbUnparsed: case HttpVerbUnknown: case HttpVerbInvalid: case HttpVerbTRACK: // used by Microsoft Cluster Server for a non-logged trace case HttpVerbSEARCH: default: r->method = "INVALID"; r->method_number = M_INVALID; break; case HttpVerbOPTIONS: r->method = "OPTIONS"; r->method_number = M_OPTIONS; break; case HttpVerbGET: case HttpVerbHEAD: r->method = "GET"; r->method_number = M_GET; break; case HttpVerbPOST: r->method = "POST"; r->method_number = M_POST; break; case HttpVerbPUT: r->method = "PUT"; r->method_number = M_PUT; break; case HttpVerbDELETE: r->method = "DELETE"; r->method_number = M_DELETE; break; case HttpVerbTRACE: r->method = "TRACE"; r->method_number = M_TRACE; break; case HttpVerbCONNECT: r->method = "CONNECT"; r->method_number = M_CONNECT; break; case HttpVerbMOVE: r->method = "MOVE"; r->method_number = M_MOVE; break; case HttpVerbCOPY: r->method = "COPY"; r->method_number = M_COPY; break; case HttpVerbPROPFIND: r->method = "PROPFIND"; r->method_number = M_PROPFIND; break; case HttpVerbPROPPATCH: r->method = "PROPPATCH"; r->method_number = M_PROPPATCH; break; case HttpVerbMKCOL: r->method = "MKCOL"; r->method_number = M_MKCOL; break; case HttpVerbLOCK: r->method = "LOCK"; r->method_number = M_LOCK; break; case HttpVerbUNLOCK: r->method = "UNLOCK"; r->method_number = M_UNLOCK; break; } if(HTTP_EQUAL_VERSION(req->Version, 0, 9)) r->protocol = "HTTP/0.9"; else if(HTTP_EQUAL_VERSION(req->Version, 1, 0)) r->protocol = "HTTP/1.0"; else r->protocol = "HTTP/1.1"; r->request_time = apr_time_now(); r->parsed_uri.scheme = "http"; r->parsed_uri.path = r->path_info; r->parsed_uri.hostname = (char *)r->hostname; r->parsed_uri.is_initialized = 1; r->parsed_uri.port = port; r->parsed_uri.port_str = port_str; r->parsed_uri.query = r->args; r->parsed_uri.dns_looked_up = 0; r->parsed_uri.dns_resolved = 0; r->parsed_uri.password = NULL; r->parsed_uri.user = NULL; r->parsed_uri.fragment = NULL; r->unparsed_uri = ZeroTerminate(req->pRawUrl, req->RawUrlLength, r->pool); r->uri = r->unparsed_uri; r->the_request = (char *)apr_palloc(r->pool, strlen(r->method) + 1 + req->RawUrlLength + 1 + strlen(r->protocol) + 1); strcpy(r->the_request, r->method); strcat(r->the_request, " "); strcat(r->the_request, r->uri); strcat(r->the_request, " "); strcat(r->the_request, r->protocol); HTTP_REQUEST_ID httpRequestID; char *pszValue = (char *)apr_palloc(r->pool, 24); httpRequestID = pRequest->GetRawHttpRequest()->RequestId; _ui64toa(httpRequestID, pszValue, 10); apr_table_setn(r->subprocess_env, "UNIQUE_ID", pszValue); PSOCKADDR pAddr = pRequest->GetRemoteAddress(); #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3 c->remote_addr = CopySockAddr(r->pool, pAddr); c->remote_ip = GetIpAddr(r->pool, pAddr); #else c->client_addr = CopySockAddr(r->pool, pAddr); c->client_ip = GetIpAddr(r->pool, pAddr); #endif c->remote_host = NULL; LeaveCriticalSection(&m_csLock); int status = modsecProcessRequest(r); EnterCriticalSection(&m_csLock); if(status != DECLINED) { pHttpContext->GetResponse()->SetStatus(status, "ModSecurity Action"); pHttpContext->SetRequestHandled(); hr = E_FAIL; goto Finished; } Finished: LeaveCriticalSection(&m_csLock); if ( FAILED( hr ) ) { return RQ_NOTIFICATION_FINISH_REQUEST; } return RQ_NOTIFICATION_CONTINUE; } apr_status_t ReadBodyCallback(request_rec *r, char *buf, unsigned int length, unsigned int *readcnt, int *is_eos) { REQUEST_STORED_CONTEXT *rsc = RetrieveIISContext(r); *readcnt = 0; if (rsc == NULL) { *is_eos = 1; return APR_SUCCESS; } IHttpContext *pHttpContext = rsc->m_pHttpContext; IHttpRequest *pRequest = pHttpContext->GetRequest(); if (pRequest->GetRemainingEntityBytes() == 0) { *is_eos = 1; return APR_SUCCESS; } HRESULT hr = pRequest->ReadEntityBody(buf, length, false, (DWORD *)readcnt, NULL); if (FAILED(hr)) { // End of data is okay. if (ERROR_HANDLE_EOF != (hr & 0x0000FFFF)) { // Set the error status. rsc->m_pProvider->SetErrorStatus(hr); } *is_eos = 1; } return APR_SUCCESS; } apr_status_t WriteBodyCallback(request_rec *r, char *buf, unsigned int length) { REQUEST_STORED_CONTEXT *rsc = RetrieveIISContext(r); if(rsc == NULL || rsc->m_pRequestRec == NULL) return APR_SUCCESS; IHttpContext *pHttpContext = rsc->m_pHttpContext; IHttpRequest *pHttpRequest = pHttpContext->GetRequest(); CHAR szLength[21]; //Max length for a 64 bit int is 20 ZeroMemory(szLength, sizeof(szLength)); HRESULT hr = StringCchPrintfA( szLength, sizeof(szLength) / sizeof(CHAR) - 1, "%d", length); if(FAILED(hr)) { // not possible } hr = pHttpRequest->SetHeader( HttpHeaderContentLength, szLength, (USHORT)strlen(szLength), TRUE); if(FAILED(hr)) { // possible, but there's nothing we can do } // since we clean the APR pool at the end of OnSendRequest, we must get IIS-managed memory chunk // void *reqbuf = pHttpContext->AllocateRequestMemory(length); memcpy(reqbuf, buf, length); pHttpRequest->InsertEntityBody(reqbuf, length); return APR_SUCCESS; } apr_status_t ReadResponseCallback(request_rec *r, char *buf, unsigned int length, unsigned int *readcnt, int *is_eos) { REQUEST_STORED_CONTEXT *rsc = RetrieveIISContext(r); *readcnt = 0; if(rsc == NULL || rsc->m_pResponseBuffer == NULL) { *is_eos = 1; return APR_SUCCESS; } unsigned int size = length; if(size > rsc->m_pResponseLength - rsc->m_pResponsePosition) size = rsc->m_pResponseLength - rsc->m_pResponsePosition; memcpy(buf, rsc->m_pResponseBuffer + rsc->m_pResponsePosition, size); *readcnt = size; rsc->m_pResponsePosition += size; if(rsc->m_pResponsePosition >= rsc->m_pResponseLength) *is_eos = 1; return APR_SUCCESS; } apr_status_t WriteResponseCallback(request_rec *r, char *buf, unsigned int length) { REQUEST_STORED_CONTEXT *rsc = RetrieveIISContext(r); if(rsc == NULL || rsc->m_pRequestRec == NULL || rsc->m_pResponseBuffer == NULL) return APR_SUCCESS; IHttpContext *pHttpContext = rsc->m_pHttpContext; IHttpResponse *pHttpResponse = pHttpContext->GetResponse(); HTTP_RESPONSE *pRawHttpResponse = pHttpResponse->GetRawHttpResponse(); HTTP_DATA_CHUNK *pDataChunk = (HTTP_DATA_CHUNK *)apr_palloc(rsc->m_pRequestRec->pool, sizeof(HTTP_DATA_CHUNK)); pRawHttpResponse->EntityChunkCount = 0; // since we clean the APR pool at the end of OnSendRequest, we must get IIS-managed memory chunk // void *reqbuf = pHttpContext->AllocateRequestMemory(length); memcpy(reqbuf, buf, length); pDataChunk->DataChunkType = HttpDataChunkFromMemory; pDataChunk->FromMemory.pBuffer = reqbuf; pDataChunk->FromMemory.BufferLength = length; CHAR szLength[21]; //Max length for a 64 bit int is 20 ZeroMemory(szLength, sizeof(szLength)); HRESULT hr = StringCchPrintfA( szLength, sizeof(szLength) / sizeof(CHAR) - 1, "%d", length); if(FAILED(hr)) { // not possible } hr = pHttpResponse->SetHeader( HttpHeaderContentLength, szLength, (USHORT)strlen(szLength), TRUE); if(FAILED(hr)) { // possible, but there's nothing we can do } pHttpResponse->WriteEntityChunkByReference(pDataChunk); return APR_SUCCESS; } CMyHttpModule::CMyHttpModule() { // Open a handle to the Event Viewer. m_hEventLog = RegisterEventSource( NULL, "ModSecurity" ); SYSTEM_INFO sysInfo; GetSystemInfo(&sysInfo); m_dwPageSize = sysInfo.dwPageSize; this->status_call_already_sent = false; InitializeCriticalSection(&m_csLock); modsecSetLogHook(this, Log); modsecSetReadBody(ReadBodyCallback); modsecSetReadResponse(ReadResponseCallback); modsecSetWriteBody(WriteBodyCallback); modsecSetWriteResponse(WriteResponseCallback); server_rec *s = modsecInit(); char *compname = (char *)malloc(128); DWORD size = 128; GetComputerName(compname, &size); s->server_hostname = compname; modsecStartConfig(); modsecFinalizeConfig(); modsecInitProcess(); } CMyHttpModule::~CMyHttpModule() { // ModSecurity registers APR pool cleanups, which interfere with APR pool tear down process // this causes crashes and since we are exiting the process here, so this is a temporary solution // //modsecTerminate(); //WriteEventViewerLog("Module deleted."); // Test whether the handle for the Event Viewer is open. if (NULL != m_hEventLog) { // Close the handle to the Event Viewer. DeregisterEventSource( m_hEventLog ); m_hEventLog = NULL; DeleteCriticalSection(&m_csLock); } } void CMyHttpModule::Dispose() { } BOOL CMyHttpModule::WriteEventViewerLog(LPCSTR szNotification, WORD category) { // Test whether the handle for the Event Viewer is open. if (NULL != m_hEventLog) { // Write any strings to the Event Viewer and return. return ReportEvent( m_hEventLog, category, 0, 0x1, NULL, 1, 0, &szNotification, NULL ); } return FALSE; } modsecurity-2.9.5/iis/curl-ca-bundle.crt0000664000175000017500000075376614147005233021342 0ustar mhsvierulamhsvierula## ## Bundle of CA Root Certificates ## ## Certificate data from Mozilla downloaded on: Thu Sep 4 06:31:22 2014 ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates ## file (certdata.txt). This file can be found in the mozilla source tree: ## http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt ## ## It contains the certificates in PEM format and therefore ## can be directly used with curl / libcurl / php_curl, or with ## an Apache+mod_ssl webserver for SSL client authentication. ## Just configure this file as the SSLCACertificateFile. ## ## Conversion done with mk-ca-bundle.pl verison 1.22. ## SHA1: c4540021427a6fa29e5f50db9f12d48c97d33889 ## GTE CyberTrust Global Root ========================== -----BEGIN CERTIFICATE----- MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ -----END CERTIFICATE----- Thawte Server CA ================ -----BEGIN CERTIFICATE----- MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl /Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= -----END CERTIFICATE----- Thawte Premium Server CA ======================== -----BEGIN CERTIFICATE----- MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf 8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t UCemDaYj+bvLpgcUQg== -----END CERTIFICATE----- Equifax Secure CA ================= -----BEGIN CERTIFICATE----- MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW 8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 70+sB3c4 -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority - G2 ============================================================ -----BEGIN CERTIFICATE----- MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT 1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 -----END CERTIFICATE----- GlobalSign Root CA ================== -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- GlobalSign Root CA - R2 ======================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- Verisign Class 3 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- Verisign Class 4 Public Primary Certification Authority - G3 ============================================================ -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM 8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== -----END CERTIFICATE----- Entrust.net Premium 2048 Secure Server CA ========================================= -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= -----END CERTIFICATE----- Baltimore CyberTrust Root ========================= -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- Equifax Secure Global eBusiness CA ================================== -----BEGIN CERTIFICATE----- MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV -----END CERTIFICATE----- Equifax Secure eBusiness CA 1 ============================= -----BEGIN CERTIFICATE----- MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ 1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ KpYrtWKmpj29f5JZzVoqgrI3eQ== -----END CERTIFICATE----- AddTrust Low-Value Services Root ================================ -----BEGIN CERTIFICATE----- MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= -----END CERTIFICATE----- AddTrust External Root ====================== -----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- AddTrust Public Services Root ============================= -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB /zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL +YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= -----END CERTIFICATE----- AddTrust Qualified Certificates Root ==================================== -----BEGIN CERTIFICATE----- MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx 64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= -----END CERTIFICATE----- Entrust Root Certification Authority ==================================== -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- RSA Security 2048 v3 ==================== -----BEGIN CERTIFICATE----- MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP +Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj 0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA pKnXwiJPZ9d37CAFYd4= -----END CERTIFICATE----- GeoTrust Global CA ================== -----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm Mw== -----END CERTIFICATE----- GeoTrust Global CA 2 ==================== -----BEGIN CERTIFICATE----- MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF H4z1Ir+rzoPz4iIprn2DQKi6bA== -----END CERTIFICATE----- GeoTrust Universal CA ===================== -----BEGIN CERTIFICATE----- MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI P/rmMuGNG2+k5o7Y+SlIis5z/iw= -----END CERTIFICATE----- GeoTrust Universal CA 2 ======================= -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- America Online Root Certification Authority 1 ============================================= -----BEGIN CERTIFICATE----- MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP 8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft 3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 -----END CERTIFICATE----- America Online Root Certification Authority 2 ============================================= -----BEGIN CERTIFICATE----- MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn 6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p +DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh 1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= -----END CERTIFICATE----- Visa eCommerce Root =================== -----BEGIN CERTIFICATE----- MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt 398znM/jra6O1I7mT1GvFpLgXPYHDw== -----END CERTIFICATE----- Certum Root CA ============== -----BEGIN CERTIFICATE----- MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ 89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ 0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== -----END CERTIFICATE----- Comodo AAA Services root ======================== -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- Comodo Secure Services root =========================== -----BEGIN CERTIFICATE----- MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP 9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm 4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H RR3B7Hzs/Sk= -----END CERTIFICATE----- Comodo Trusted Services root ============================ -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y /9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB /zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O 9y5Xt5hwXsjEeLBi -----END CERTIFICATE----- QuoVadis Root CA ================ -----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi 5nrQNiOKSnQ2+Q== -----END CERTIFICATE----- QuoVadis Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- QuoVadis Root CA 3 ================== -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- Security Communication Root CA ============================== -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi FL39vmwLAw== -----END CERTIFICATE----- Sonera Class 2 Root CA ====================== -----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH llpwrN9M -----END CERTIFICATE----- Staat der Nederlanden Root CA ============================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== -----END CERTIFICATE----- UTN DATACorp SGC Root CA ======================== -----BEGIN CERTIFICATE----- MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA 9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv 33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI -----END CERTIFICATE----- UTN USERFirst Hardware Root CA ============================== -----BEGIN CERTIFICATE----- MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 nfhmqA== -----END CERTIFICATE----- Camerfirma Chambers of Commerce Root ==================================== -----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 erfutGWaIZDgqtCYvDi1czyL+Nw= -----END CERTIFICATE----- Camerfirma Global Chambersign Root ================================== -----BEGIN CERTIFICATE----- MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J 1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl 6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c 8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== -----END CERTIFICATE----- NetLock Notary (Class A) Root ============================= -----BEGIN CERTIFICATE----- MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC /tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM 8CgHrTwXZoi1/baI -----END CERTIFICATE----- XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- Go Daddy Class 2 CA =================== -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b vZ8= -----END CERTIFICATE----- Starfield Class 2 CA ==================== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- StartCom Certification Authority ================================ -----BEGIN CERTIFICATE----- MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT 37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh 3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl 1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro g14= -----END CERTIFICATE----- Taiwan GRCA =========== -----BEGIN CERTIFICATE----- MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS -----END CERTIFICATE----- Swisscom Root CA 1 ================== -----BEGIN CERTIFICATE----- MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn 7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW NY6E0F/6MBr1mmz0DlP5OlvRHA== -----END CERTIFICATE----- DigiCert Assured ID Root CA =========================== -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- DigiCert Global Root CA ======================= -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- DigiCert High Assurance EV Root CA ================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K -----END CERTIFICATE----- Certplus Class 2 Primary CA =========================== -----BEGIN CERTIFICATE----- MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 l7+ijrRU -----END CERTIFICATE----- DST Root CA X3 ============== -----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- DST ACES CA X6 ============== -----BEGIN CERTIFICATE----- MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 oKfN5XozNmr6mis= -----END CERTIFICATE----- TURKTRUST Certificate Services Provider Root 1 ============================================== -----BEGIN CERTIFICATE----- MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ 8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H -----END CERTIFICATE----- TURKTRUST Certificate Services Provider Root 2 ============================================== -----BEGIN CERTIFICATE----- MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr 5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P 9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 UrbnBEI= -----END CERTIFICATE----- SwissSign Gold CA - G2 ====================== -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- SwissSign Silver CA - G2 ======================== -----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- GeoTrust Primary Certification Authority ======================================== -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= -----END CERTIFICATE----- thawte Primary Root CA ====================== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G5 ============================================================ -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- SecureTrust CA ============== -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- Secure Global CA ================ -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- COMODO Certification Authority ============================== -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== -----END CERTIFICATE----- Network Solutions Certificate Authority ======================================= -----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- WellsSecure Public Root Certificate Authority ============================================= -----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ tylv2G0xffX8oRAHh84vWdw+WNs= -----END CERTIFICATE----- COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- IGC/A ===== -----BEGIN CERTIFICATE----- MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF 0mBWWg== -----END CERTIFICATE----- Security Communication EV RootCA1 ================================= -----BEGIN CERTIFICATE----- MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO /VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK 9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 -----END CERTIFICATE----- OISTE WISeKey Global Root GA CA =============================== -----BEGIN CERTIFICATE----- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ /yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 +vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= -----END CERTIFICATE----- Microsec e-Szigno Root CA ========================= -----BEGIN CERTIFICATE----- MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA 4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a 86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= -----END CERTIFICATE----- Certigna ======== -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- TC TrustCenter Class 2 CA II ============================ -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB 7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk vQ== -----END CERTIFICATE----- TC TrustCenter Class 3 CA II ============================ -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo 6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk 2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB 7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal 092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc 5A== -----END CERTIFICATE----- TC TrustCenter Universal CA I ============================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG 1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a 7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY -----END CERTIFICATE----- Deutsche Telekom Root CA 2 ========================== -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- ComSign Secured CA ================== -----BEGIN CERTIFICATE----- MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs 49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH 7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP 51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== -----END CERTIFICATE----- Cybertrust Global Root ====================== -----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW 0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin 89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT 8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi 5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW WL1WMRJOEcgh4LMRkWXbtKaIOM5V -----END CERTIFICATE----- ePKI Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 ============================================================================================================================= -----BEGIN CERTIFICATE----- MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR 6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= -----END CERTIFICATE----- Buypass Class 2 CA 1 ==================== -----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV 1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt 7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho -----END CERTIFICATE----- Buypass Class 3 CA 1 ==================== -----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c 1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 -----END CERTIFICATE----- EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 ========================================================================== -----BEGIN CERTIFICATE----- MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK 1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt 2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT -----END CERTIFICATE----- certSIGN ROOT CA ================ -----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD -----END CERTIFICATE----- CNNIC ROOT ========== -----BEGIN CERTIFICATE----- MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m mxE= -----END CERTIFICATE----- ApplicationCA - Japanese Government =================================== -----BEGIN CERTIFICATE----- MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g /DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL rosot4LKGAfmt1t06SAZf7IbiVQ= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G3 ============================================= -----BEGIN CERTIFICATE----- MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr 2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt -----END CERTIFICATE----- thawte Primary Root CA - G2 =========================== -----BEGIN CERTIFICATE----- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== -----END CERTIFICATE----- thawte Primary Root CA - G3 =========================== -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC +BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY 7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC 8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= -----END CERTIFICATE----- GeoTrust Primary Certification Authority - G2 ============================================= -----BEGIN CERTIFICATE----- MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 npaqBA+K -----END CERTIFICATE----- VeriSign Universal Root Certification Authority =============================================== -----BEGIN CERTIFICATE----- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj 1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 mJO37M2CYfE45k+XmCpajQ== -----END CERTIFICATE----- VeriSign Class 3 Public Primary Certification Authority - G4 ============================================================ -----BEGIN CERTIFICATE----- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- NetLock Arany (Class Gold) Főtanúsítvány ============================================ -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- Staat der Nederlanden Root CA - G2 ================================== -----BEGIN CERTIFICATE----- MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ 5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz +51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm 66+KAQ== -----END CERTIFICATE----- CA Disig ======== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA 4Z7CRneC9VkGjCFMhwnN5ag= -----END CERTIFICATE----- Juur-SK ======= -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC +Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 yyqcjg== -----END CERTIFICATE----- Hongkong Post Root CA 1 ======================= -----BEGIN CERTIFICATE----- MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== -----END CERTIFICATE----- SecureSign RootCA11 =================== -----BEGIN CERTIFICATE----- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- ACEDICOM Root ============= -----BEGIN CERTIFICATE----- MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz 4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU 9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== -----END CERTIFICATE----- Microsec e-Szigno Root CA 2009 ============================== -----BEGIN CERTIFICATE----- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi LXpUq3DDfSJlgnCW -----END CERTIFICATE----- E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi =================================================== -----BEGIN CERTIFICATE----- MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY 8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk 9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX -----END CERTIFICATE----- GlobalSign Root CA - R3 ======================= -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r kpeDMdmztcpHWD9f -----END CERTIFICATE----- Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V -----END CERTIFICATE----- Izenpe.com ========== -----BEGIN CERTIFICATE----- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- Chambers of Commerce Root - 2008 ================================ -----BEGIN CERTIFICATE----- MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ 0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH 3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF 9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ -----END CERTIFICATE----- Global Chambersign Root - 2008 ============================== -----BEGIN CERTIFICATE----- MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB /gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp 1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG /5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg 9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B -----END CERTIFICATE----- Go Daddy Root Certificate Authority - G2 ======================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 -----END CERTIFICATE----- Starfield Root Certificate Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- Starfield Services Root Certificate Authority - G2 ================================================== -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 -----END CERTIFICATE----- AffirmTrust Commercial ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- AffirmTrust Networking ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- AffirmTrust Premium =================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== -----END CERTIFICATE----- AffirmTrust Premium ECC ======================= -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM eQ== -----END CERTIFICATE----- Certum Trusted Network CA ========================= -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- Certinomis - Autorité Racine ============================= -----BEGIN CERTIFICATE----- MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw 2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g 530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna 4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ vgt2Fl43N+bYdJeimUV5 -----END CERTIFICATE----- Root CA Generalitat Valenciana ============================== -----BEGIN CERTIFICATE----- MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt +GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= -----END CERTIFICATE----- A-Trust-nQual-03 ================ -----BEGIN CERTIFICATE----- MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 ahq97BvIxYSazQ== -----END CERTIFICATE----- TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- Security Communication RootCA2 ============================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- EC-ACC ====== -----BEGIN CERTIFICATE----- MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw 0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D 5EI= -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2011 ======================================================= -----BEGIN CERTIFICATE----- MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI 1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa 71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u 8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH 3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD /md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N 7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 -----END CERTIFICATE----- Actalis Authentication Root CA ============================== -----BEGIN CERTIFICATE----- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- Trustis FPS Root CA =================== -----BEGIN CERTIFICATE----- MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P 8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl iB6XzCGcKQENZetX2fNXlrtIzYE= -----END CERTIFICATE----- StartCom Certification Authority ================================ -----BEGIN CERTIFICATE----- MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT 37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA 2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= -----END CERTIFICATE----- StartCom Certification Authority G2 =================================== -----BEGIN CERTIFICATE----- MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG 4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K 2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG /+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm 7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm obp573PYtlNXLfbQ4ddI -----END CERTIFICATE----- Buypass Class 2 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN rJgWVqA= -----END CERTIFICATE----- Buypass Class 3 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi Cp/HuZc= -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 3 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== -----END CERTIFICATE----- EE Certification Centre Root CA =============================== -----BEGIN CERTIFICATE----- MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw 93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU 3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM dcGWxZ0= -----END CERTIFICATE----- TURKTRUST Certificate Services Provider Root 2007 ================================================= -----BEGIN CERTIFICATE----- MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK poRq0Tl9 -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 2009 ============================== -----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 EV 2009 ================================= -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv w9y4AyHqnxbxLFS1 -----END CERTIFICATE----- PSCProcert ========== -----BEGIN CERTIFICATE----- MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA 3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2 0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH 0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/ AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG 9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52 ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1 n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo 5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq 3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5 poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km -----END CERTIFICATE----- China Internet Network Information Center EV Certificates Root ============================================================== -----BEGIN CERTIFICATE----- MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV 98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23 KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC 7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5 0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM 7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0 5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8= -----END CERTIFICATE----- Swisscom Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2 MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3 qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ 82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o +sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX 5OfNeOI5wSsSnqaeG8XmDtkx2Q== -----END CERTIFICATE----- Swisscom Root EV CA 2 ===================== -----BEGIN CERTIFICATE----- MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/ BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7 XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH 59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/ 23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc= -----END CERTIFICATE----- CA Disig Root R1 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy 3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8 u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2 m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6 vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ 04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85 YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ a7+h89n07eLw4+1knj0vllJPgFOL -----END CERTIFICATE----- CA Disig Root R2 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa 5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV 7+ZtsH8tZ/3zbBt1RqPlShfppNcL -----END CERTIFICATE----- ACCVRAIZ1 ========= -----BEGIN CERTIFICATE----- MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p EfbRD0tVNEYqi4Y7 -----END CERTIFICATE----- TWCA Global Root CA =================== -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= -----END CERTIFICATE----- TeliaSonera Root CA v1 ====================== -----BEGIN CERTIFICATE----- MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- E-Tugra Certification Authority =============================== -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB /wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G C7TbO6Orb1wdtn7os4I07QZcJA== -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 2 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== -----END CERTIFICATE----- Atos TrustedRoot 2011 ===================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed -----END CERTIFICATE----- QuoVadis Root CA 1 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV 7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX 9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP +V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh 3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV hMJKzRwuJIczYOXD -----END CERTIFICATE----- QuoVadis Root CA 2 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD 6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr O3jtZsSOeWmD3n+M -----END CERTIFICATE----- QuoVadis Root CA 3 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe 6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX 0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 PpxxVJkES/1Y+Zj0 -----END CERTIFICATE----- DigiCert Assured ID Root G2 =========================== -----BEGIN CERTIFICATE----- MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo IhNzbM8m9Yop5w== -----END CERTIFICATE----- DigiCert Assured ID Root G3 =========================== -----BEGIN CERTIFICATE----- MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy 1vUhZscv6pZjamVFkpUBtA== -----END CERTIFICATE----- DigiCert Global Root G2 ======================= -----BEGIN CERTIFICATE----- MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl MrY= -----END CERTIFICATE----- DigiCert Global Root G3 ======================= -----BEGIN CERTIFICATE----- MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 VOKa5Vt8sycX -----END CERTIFICATE----- DigiCert Trusted Root G4 ======================== -----BEGIN CERTIFICATE----- MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy 7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN 5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb /UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa 5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP 82Z+ -----END CERTIFICATE----- WoSign ====== -----BEGIN CERTIFICATE----- MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX 2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5 KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR +ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2 8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R 8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC 2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes 5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/ EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w== -----END CERTIFICATE----- WoSign China ============ -----BEGIN CERTIFICATE----- MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k 8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5 uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85 dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5 Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc 76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m +Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6 yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115 j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97 qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO kI26oQ== -----END CERTIFICATE----- modsecurity-2.9.5/iis/build_modsecurity.bat0000664000175000017500000000364614147005233022232 0ustar mhsvierulamhsvierula set DEPENDENCIES_DIR=dependencies\build_dir set OUTPUT_DIR=dependencies\release_files set CURRENT_DIR=%cd% @echo Checking for vcargs... %1 @if NOT (%1) == "" call %1 @if (%ERRORLEVEL%) == (1) goto build_wrong_vcarg @echo Deleting old stuff... @del *.obj *.dll *.lib @echo apache2... cd ..\apache2 del *.obj *.dll *.lib del libinjection\*.obj libinjection\*.dll libinjection\*.lib NMAKE -f Makefile.win APACHE=..\iis\%DEPENDENCIES_DIR%\Apache24 PCRE=..\iis\%DEPENDENCIES_DIR%\pcre LIBXML2=..\iis\%DEPENDENCIES_DIR%\libxml2 LUA=..\iis\%DEPENDENCIES_DIR%\lua\src VERSION=VERSION_IIS YAJL=..\iis\%DEPENDENCIES_DIR%\yajl\build\yajl-2.1.0 SSDEEP=..\iis\%DEPENDENCIES_DIR%\ssdeep CURL=..\iis\%DEPENDENCIES_DIR%\curl IIS_BUILD=yes @if NOT (%ERRORLEVEL%) == (0) goto build_failed @echo mlogc... cd ..\mlogc del *.obj *.dll *.lib nmake -f Makefile.win clean nmake -f Makefile.win APACHE=..\iis\%DEPENDENCIES_DIR%\Apache24 PCRE=..\iis\%DEPENDENCIES_DIR%\pcre CURL=..\iis\%DEPENDENCIES_DIR%\curl YAJL=..\iis\%DEPENDENCIES_DIR%\yajl\build\yajl-2.1.0 SSDEEP=..\iis\%DEPENDENCIES_DIR%\ssdeep VERSION=VERSION_IIS @if NOT (%ERRORLEVEL%) == (0) goto build_failed @echo iis... cd ..\iis del *.obj *.dll *.lib nmake -f Makefile.win clean NMAKE -f Makefile.win APACHE=..\iis\%DEPENDENCIES_DIR%\Apache24 PCRE=..\iis\%DEPENDENCIES_DIR%\pcre LIBXML2=..\iis\%DEPENDENCIES_DIR%\libxml2 LUA=..\iis\%DEPENDENCIES_DIR%\lua\src VERSION=VERSION_IIS YAJL=..\iis\%DEPENDENCIES_DIR%\yajl\build\yajl-2.1.0 SSDEEP=..\iis\%DEPENDENCIES_DIR%\ssdeep CURL=..\iis\%DEPENDENCIES_DIR%\curl @if NOT (%ERRORLEVEL%) == (0) goto build_failed cd %CURRENT_DIR% @echo Copy... copy /y ..\mlogc\mlogc.exe %OUTPUT_DIR% copy /y ..\iis\modsecurityiis.dll %OUTPUT_DIR% copy /y ..\iis\modsecurityiis.pdb %OUTPUT_DIR% exit /B 0 :build_wrong_vcargs @echo Please specify a valid vcargs @goto failed :build_failed @echo Problems during the building phase @goto failed :failed @cd %CURRENT_DIR% @exit /B 1 modsecurity-2.9.5/iis/mymodulefactory.h0000664000175000017500000000361114147005233021400 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #ifndef __MODULE_FACTORY_H__ #define __MODULE_FACTORY_H__ // Factory class for CMyHttpModule. // This class is responsible for creating instances // of CMyHttpModule for each request. class CMyHttpModuleFactory : public IHttpModuleFactory { CMyHttpModule * m_pModule; CRITICAL_SECTION m_csLock; public: CMyHttpModuleFactory() { m_pModule = NULL; InitializeCriticalSection(&m_csLock); } virtual HRESULT GetHttpModule( OUT CHttpModule **ppModule, IN IModuleAllocator * ) { HRESULT hr = S_OK; if ( ppModule == NULL ) { hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER ); goto Finished; } EnterCriticalSection(&m_csLock); if(m_pModule == NULL) { m_pModule = new CMyHttpModule(); if ( m_pModule == NULL ) { hr = HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY ); goto Finished; } } LeaveCriticalSection(&m_csLock); *ppModule = m_pModule; Finished: return hr; } virtual void Terminate() { if ( m_pModule != NULL ) { //m_pModule->WriteEventViewerLog("Module terminated."); delete m_pModule; m_pModule = NULL; } delete this; } }; #endif modsecurity-2.9.5/iis/mymodule.h0000664000175000017500000000312514147005233020010 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #ifndef __MY_MODULE_H__ #define __MY_MODULE_H__ // The module implementation. // This class is responsible for implementing the // module functionality for each of the server events // that it registers for. class CMyHttpModule : public CHttpModule { public: HANDLE m_hEventLog; DWORD m_dwPageSize; CRITICAL_SECTION m_csLock; REQUEST_NOTIFICATION_STATUS OnBeginRequest( IN IHttpContext * pHttpContext, IN IHttpEventProvider * pProvider ); REQUEST_NOTIFICATION_STATUS OnSendResponse( IN IHttpContext * pHttpContext, IN ISendResponseProvider * pProvider ); REQUEST_NOTIFICATION_STATUS OnPostEndRequest( IN IHttpContext * pHttpContext, IN IHttpEventProvider * pProvider ); HRESULT ReadFileChunk(HTTP_DATA_CHUNK *chunk, char *buf); CMyHttpModule(); ~CMyHttpModule(); void Dispose(); BOOL WriteEventViewerLog(LPCSTR szNotification, WORD category = EVENTLOG_INFORMATION_TYPE); BOOL status_call_already_sent; }; #endif modsecurity-2.9.5/iis/mlogc.vcxproj.filters0000664000175000017500000000165714147005233022201 0ustar mhsvierulamhsvierula {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx {93995380-89BD-4b04-88EB-625FBE52EBFB} h;hh;hpp;hxx;hm;inl;inc;xsd {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms Source Files modsecurity-2.9.5/iis/ModSecurityIIS.vcxproj0000775000175000017500000005445714147005233022256 0ustar mhsvierulamhsvierula Custom Debug Win32 Custom Debug x64 Debug Win32 Debug x64 Release Win32 Release x64 {D1F7201F-064B-48AB-868C-FED22464841C} ModSecurityIIS ModSecurityIIS Application v120 Application v120 DynamicLibrary v120 DynamicLibrary v120 DynamicLibrary v120 DynamicLibrary v120 <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)$(Configuration)\ $(SolutionDir)$(Configuration)\ $(SolutionDir)$(Configuration)\ $(SolutionDir)\$(Configuration)\ $(Configuration)\ $(Configuration)\ $(Configuration)\ $(Configuration)\ $(Configuration)\ $(Configuration)\ AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset AllRules.ruleset .dll .dll .dll .dll Build true Disabled dependencies\build_dir\pcre\include;dependencies\build_dir\pcre;dependencies\build_dir\libxml2\include;dependencies\build_dir\apache24\include;..\apache2;..\standalone;dependencies\build_dir\lloyd-yajl-f4b2b1a\build\yajl-2.0.1\include; _MBCS;%(PreprocessorDefinitions);WIN32;WINNT;inline=APR_INLINE;AP_DECLARE_STATIC;VERSION_IIS NotUsing precomp.h $(IntDir)$(TargetName).pch ProgramDatabase mymodule.def true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies);dependencies\build_dir\apache24\lib\libapr-1.lib;dependencies\build_dir\apache24\lib\libaprutil-1.lib;dependencies\build_dir\pcre\pcre.lib;dependencies\build_dir\libxml2\win32\bin.msvc\libxml2.lib;dependencies\build_dir\yajl\build\yajl-2.0.1\lib\yajl.lib Disabled dependencies\build_dir\pcre\include;dependencies\build_dir\pcre;dependencies\build_dir\libxml2\include;dependencies\build_dir\apache24\include;..\apache2;..\standalone;dependencies\build_dir\lloyd-yajl-f4b2b1a\build\yajl-2.0.1\include; _MBCS;%(PreprocessorDefinitions);WIN32;WINNT;inline=APR_INLINE;AP_DECLARE_STATIC;VERSION_IIS NotUsing precomp.h $(IntDir)$(TargetName).pch ProgramDatabase mymodule.def true kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies);dependencies\build_dir\apache24\lib\libapr-1.lib;dependencies\build_dir\apache24\lib\libaprutil-1.lib;dependencies\build_dir\pcre\pcre.lib;dependencies\build_dir\libxml2\win32\bin.msvc\libxml2.lib;dependencies\build_dir\yajl\build\yajl-2.0.1\lib\yajl.lib Disabled dependencies\build_dir\pcre\include;dependencies\build_dir\pcre;dependencies\build_dir\libxml2\include;..\apache2;..\standalone;dependencies\build_dir\apache24\include;dependencies\build_dir\lloyd-yajl-f4b2b1a\build\yajl-2.0.1\include; _MBCS;%(PreprocessorDefinitions);WIN32;WINNT;inline=APR_INLINE;AP_DECLARE_STATIC NotUsing precomp.h $(IntDir)$(TargetName).pch ProgramDatabase mymodule.def true kernel32.lib;IPHLPAPI.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies);dependencies\build_dir\apache24\lib\libapr-1.lib;dependencies\build_dir\apache24\lib\libaprutil-1.lib;dependencies\build_dir\pcre\pcre.lib;dependencies\build_dir\libxml2\win32\bin.msvc\libxml2.lib;dependencies\build_dir\yajl\build\yajl-2.0.1\lib\yajl.lib; Disabled dependencies\build_dir\pcre\include;dependencies\build_dir\pcre;dependencies\build_dir\libxml2\include;..\apache2;..\standalone;dependencies\build_dir\apache24\include;dependencies\build_dir\lloyd-yajl-f4b2b1a\build\yajl-2.0.1\include; _MBCS;%(PreprocessorDefinitions);WIN32;WINNT;inline=APR_INLINE;AP_DECLARE_STATIC NotUsing precomp.h $(IntDir)$(TargetName).pch ProgramDatabase mymodule.def true kernel32.lib;IPHLPAPI.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies);dependencies\build_dir\apache24\lib\libapr-1.lib;dependencies\build_dir\apache24\lib\libaprutil-1.lib;dependencies\build_dir\pcre\pcre.lib;dependencies\build_dir\libxml2\win32\bin.msvc\libxml2.lib;dependencies\build_dir\yajl\build\yajl-2.0.1\lib\yajl.lib; net stop W3SVC /y copy $(SolutionDir)\$(Configuration)\ModSecurityIIS.dll C:\Windows\System32\inetsrv\ copy "$(SolutionDir)\$(Configuration)\ModSecurityIIS.dll" "C:\Windows\Sysnative\inetsrv\ModSecurityIIS.dll" copy "$(SolutionDir)\$(Configuration)\ModSecurityIIS.dll" "C:\Windows\SysWOW64\inetsrv\ModSecurityIIS.dll" echo "$(SolutionDir)\$(Configuration)\ModSecurityIIS.dll" "C:\Windows\Sysnative\inetsrv\ModSecurityIIS.dll" echo "$(SolutionDir)\$(Configuration)\ModSecurityIIS.dll" "C:\Windows\SysWOW64\inetsrv\ModSecurityIIS.dll" net start W3SVC /y _MBCS;%(PreprocessorDefinitions);WIN32;WINNT;inline=APR_INLINE;AP_DECLARE_STATIC;VERSION_IIS NotUsing dependencies\build_dir\pcre\include;dependencies\build_dir\pcre;dependencies\build_dir\libxml2\include;..\apache2;..\standalone;dependencies\build_dir\lloyd-yajl-f4b2b1a\build\yajl-2.0.1\include; mymodule.def kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies);dependencies\build_dir\apache24\lib\libapr-1.lib;dependencies\build_dir\apache24\lib\libaprutil-1.lib;dependencies\build_dir\pcre\pcre.lib;dependencies\build_dir\libxml2\win32\bin.msvc\libxml2.lib;dependencies\build_dir\yajl\build\yajl-2.0.1\lib\yajl.lib _MBCS;%(PreprocessorDefinitions);WIN32;WINNT;inline=APR_INLINE;AP_DECLARE_STATIC NotUsing dependencies\build_dir\pcre\include;dependencies\build_dir\pcre;dependencies\build_dir\libxml2\include;..\apache2;..\standalone;dependencies\build_dir\apache24\include;dependencies\build_dir\lloyd-yajl-f4b2b1a\build\yajl-2.0.1\include; mymodule.def kernel32.lib;IPHLPAPI.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies);dependencies\build_dir\apache24\lib\libapr-1.lib;dependencies\build_dir\apache24\lib\libaprutil-1.lib;dependencies\build_dir\pcre\pcre.lib;dependencies\build_dir\libxml2\win32\bin.msvc\libxml2.lib;dependencies\build_dir\yajl\build\yajl-2.0.1\lib\yajl.lib; false Designer true modsecurity-2.9.5/iis/main.cpp0000664000175000017500000000606714147005233017444 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #define WIN32_LEAN_AND_MEAN #undef inline #define inline inline // IIS7 Server API header file #include "httpserv.h" // Project header files #include "mymodule.h" #include "mymodulefactory.h" // Global server instance IHttpServer * g_pHttpServer = NULL; // Global module context id PVOID g_pModuleContext = NULL; // The RegisterModule entrypoint implementation. // This method is called by the server when the module DLL is // loaded in order to create the module factory, // and register for server events. HRESULT __stdcall RegisterModule( DWORD dwServerVersion, IHttpModuleRegistrationInfo * pModuleInfo, IHttpServer * pHttpServer ) { HRESULT hr = S_OK; CMyHttpModuleFactory * pFactory = NULL; //IHttpModuleRegistrationInfo2 * pModuleInfo2; if ( pModuleInfo == NULL || pHttpServer == NULL ) { hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER ); goto Finished; } /*hr = HttpGetExtendedInterface( g_pGlobalInfo, pModuleInfo, &pModuleInfo2 ); if ( FAILED ( hr ) ) { goto Finished; }*/ // step 1: save the IHttpServer and the module context id for future use // g_pModuleContext = pModuleInfo->GetId(); g_pHttpServer = pHttpServer; // step 2: create the module factory // pFactory = new CMyHttpModuleFactory(); if ( pFactory == NULL ) { hr = HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY ); goto Finished; } // step 3: register for server events // hr = pModuleInfo->SetRequestNotifications( pFactory, /* module factory */ RQ_BEGIN_REQUEST | RQ_SEND_RESPONSE /* server event mask */, RQ_END_REQUEST /* server post event mask */); if ( FAILED( hr ) ) { goto Finished; } hr = pModuleInfo->SetPriorityForRequestNotification(RQ_BEGIN_REQUEST, PRIORITY_ALIAS_FIRST); hr = pModuleInfo->SetPriorityForRequestNotification(RQ_SEND_RESPONSE, PRIORITY_ALIAS_LAST); // reverted! //hr = pModuleInfo2->SetPriorityForPostRequestNotification(RQ_END_REQUEST, PRIORITY_ALIAS_LAST); pFactory = NULL; Finished: /* if ( pFactory != NULL ) { delete pFactory; pFactory = NULL; } */ return hr; } modsecurity-2.9.5/iis/build_dependencies.bat0000664000175000017500000000705514147005233022307 0ustar mhsvierulamhsvierula:: Those variables should be edited as needed. :: Use full paths. :: General paths @set WORK_DIR=%cd%\dependencies\build_dir @set OUTPUT_DIR=%cd%\dependencies\release_files @set SOURCE_DIR=%USERPROFILE%\Downloads :: Dependencies @set CMAKE=cmake-3.12.4-win32-x86.zip @set PCRE=pcre-8.41.zip @set ZLIB=zlib-1.2.11.tar.gz @set LIBXML2=libxml2-2.9.11.tar.gz @set LUA=lua-5.3.6.tar.gz @set CURL=curl-7.77.0.zip @set APACHE_SRC=httpd-2.4.48.tar.gz @set APACHE_BIN32=httpd-2.4.48-win32-VS16.zip @set APACHE_BIN64=httpd-2.4.48-win64-VS16.zip @set YAJL=yajl-2.1.0.zip @set SSDEEP=ssdeep-2.14.1.tar.gz @set SSDEEP_BIN=ssdeep-2.14.1.zip @set CMAKE_DIR=%WORK_DIR%\%CMAKE:~0,-4%\bin :: Aditional paths. @set PATH=%PATH%;%CMAKE_DIR%;"c:\program files\7-zip" :: @set VCARGS32="C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\vcvars32.bat" :: @set VCARGS64="C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64\vcvarsx86_amd64.bat" :: Do not edit bellow this line. @set CURRENT_DIR=%cd% @echo Cleaning directories... if EXIST "%WORK_DIR%" @rmdir /s /q "%WORK_DIR%" if EXIST "%OUTPUT_DIR%" @rmdir /s /q "%OUTPUT_DIR%" @mkdir "%WORK_DIR%" @if NOT (%ERRORLEVEL%) == (0) goto failed_to_cleanup @mkdir "%OUTPUT_DIR%" @if NOT (%ERRORLEVEL%) == (0) goto failed_to_cleanup @echo Checking for vcargs... %1 @if NOT (%1) == "" call %1 @if (%ERRORLEVEL%) == (1) goto build_wrong_vcargs set APACHE_BIN=%APACHE_BIN32% call cl 2>&1 | findstr /C:"x64" @if (%ERRORLEVEL%) == (0) set APACHE_BIN=%APACHE_BIN64% @echo Starting with the depdendencies... @echo # CMake. - %CMAKE% @call dependencies/build_cmake.bat @if NOT (%ERRORLEVEL%) == (0) goto build_failed_cmake @cd "%CURRENT_DIR%" @echo # Apache - %HTTPD%/%APACHE24_ZIP% @call dependencies/build_apache.bat @if NOT (%ERRORLEVEL%) == (0) goto build_failed_apache @cd "%CURRENT_DIR%" @echo # pcre. - %PCRE% @call dependencies/build_pcre.bat @if NOT (%ERRORLEVEL%) == (0) goto build_failed_pcre @cd "%CURRENT_DIR% @echo # zlib - %ZLIB% @call dependencies/build_zlib.bat @if NOT (%ERRORLEVEL%) == (0) goto build_failed_zlib @cd "%CURRENT_DIR%" @echo # libxml2 - %LIBXML2% @call dependencies/build_libxml2.bat @if NOT (%ERRORLEVEL%) == (0) goto build_failed_libxml2 @cd "%CURRENT_DIR%" @echo # lua - %LUA% @call dependencies/build_lua.bat @if NOT (%ERRORLEVEL%) == (0) goto build_failed_lua @cd "%CURRENT_DIR%" @echo # curl - %CURL% @call dependencies/build_curl.bat @if NOT (%ERRORLEVEL%) == (0) goto build_failed_curl @cd "%CURRENT_DIR%" @echo # yajl - %YAJL% @call dependencies/build_yajl.bat @if NOT (%ERRORLEVEL%) == (0) goto build_failed_yajl @cd "%CURRENT_DIR%" @echo # ssdeep - %SSDEEP% @call dependencies/build_ssdeep.bat @if NOT (%ERRORLEVEL%) == (0) goto build_failed_ssdeep @cd "%CURRENT_DIR%" @echo All dependencies were built successfully. @cd "%CURRENT_DIR%" @exit /B 0 :failed_to_cleanup @echo Failed to cleanup @goto failed :build_wrong_vcargs @echo Please specify a valid vcargs @goto failed :build_failed_apache @echo Failed to setup %HTTPD%/%APACHE24_ZIP%... @goto failed :build_failed_pcre @echo Failed to setup %PCRE%... @goto failed :build_failed_zlib @echo Failed to setup %ZLIB%... @goto failed :build_failed_libxml2 @echo Failed to setup %LIBXML2%... @goto failed :build_failed_lua @echo Failed to setup %LUA%... @goto failed :build_failed_curl @echo Failed to setup %CURL%... @goto failed :build_failed_yajl @echo Failed to setup %YAJL%... @goto failed :build_failed_ssdeep @echo Failed to setup %SSDEEP%... @goto failed :build_failed_cmake @echo Failed to setup %CMAKE%... @goto failed :failed @cd %CURRENT_DIR% @exit /B 1 modsecurity-2.9.5/iis/wix/0000775000175000017500000000000014147005233016612 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/iis/wix/modsecurity_iis.conf0000664000175000017500000000003114147005233022666 0ustar mhsvierulamhsvierulaInclude modsecurity.conf modsecurity-2.9.5/iis/wix/Microsoft_VC120_CRT_x64.msm0000664000175000017500000304000014147005233023316 0ustar mhsvierulamhsvierulaࡱ>   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry F0ҞEBB=ACG: C1B7H ˤ SummaryInformation(@H?CAED1H @HDDrDhD7H !$@H C5BErED/H1<@H??wElDj;E$HKMsiDigitalSignatureEx.:DigitalSignature$  *+,-./023456789փm?Y:9m'Pyl#e:ؙt<$@/o6}SKqKXS Y`uÛ<[υp9EZ6Gf)tntSݖ~W0 /'WfOd(CÌH}!c xL=#ۗa7N(Ips֝/<ᎩI 1 w|rV_ %WC˼op:G^>}gڰDDwy}_a%tO0Y{ZuwGrD]/%Wgŗj9J+(d 4lBcd}G+|^r.n0"ґ`5M` ;C 0Z`8&EIx߷Yȏ.$kL.oW" `Ԫw)0l-KJ5{r.kYd-m?[ ,??]+?dFpsF?k9Nz/]:>g-E6fE"5{O\ Zyfӆ|Fv! AN*,EUhjw` '5"Q46$ _f}UVpKhP*ԃHJZJΟju<b ;ŋwYkI+ЌDXԟ"8$L8>"d`1b& m@_vRn0dMD ' Ff!FJVpG-qNhڅ ^bFP __mXLʒ2bf(_|ǂdΕ)eF>Qs!˒?duwͣߥWPe!sSל)%=CZ';4/qm8y$\S="9Ajcj8E`:tre 9TP D4(cul[9n8nZ݁FQ V0R`X^ߓtեE}5(2 *ߝ$s$3yE~뒠d%[(_U&qA\ )iVƁnU$X=eRZa4tc4hD3[a1MkKSr> o4e֒Bc3Ej[Az]سqՋ$zA-)=+:|A>*:=؈N ЫZw>:bP_ʩ02в%MM|tj0#/ W1:i J7hBPQI|neI۩Ue{jy8wh' [?A}nz> `p ZGn*LYkIt_XsWEx\E`1 u qI.G[o xӅiNf^.7?į+b *.7韵uPJ0mܥa2-˶{֢=@Ⱥ6ף)@VPy0T琊,몫s>iTū|҂ ;"/JUMIUUU%w6dc>zTp.UR) ) |sB*ߝgTĽJ~" [|A_DUumyE|QVuず<;tSzE7L-xF@ɞL&==GL0Ó˱/ǐdnKsjPsPL;ɣ^mQ {󳒋b :N:ӵ@+9_+Z`}Y!yD5ϔ)pcCIL^vLՠXs:Pؘк(bk96P&w mz'?QM`cY?1Q ]b/y3'1܊V,5r+.l}餯/?s+{i+"b HsWw+.Y#;o{2韰{z|cjP)aGs6դT#?ѕNk}} Lg0My a"q9ȟ]L_4斦¬ld)#n)g5(ihi^iDXeF ]3\yiy+P=VBA<,|2`T$l~7!CQ7:j&ߍRǘֲB&JF-*_S:euO9:FQ<έ1ZO(2c I\V+scƍQR#0GiҢb-Sݜ1Z'~Cr3{RnLh&5, 6  rx02'j#lO%+]T -Hϳ5-F%Cb4ڒ^myz߭`Gz=pugXCK5&nɺ=Du󂾷݂>cƳV=<9%%:|U,?Ն5 XE)gݹXR%׻CIw͛y0oiO˛-o>6&CSBhx=CsYq396Y9jd2|J-O|η|֧ss !&q~/]TC[=C6YN- +ߣ@u= /֑LJ +3}=V!==E0V`Ul=c{%XJ~?lEy/ mjo4[x ںlݲZsau1WX]l<Ű3'&xY욨e[X$3dQXtг]lu?jA^ֲ#ky/k.tl_/*`GvzGdlbt9tr.T7!3ŵ^VH5J KxS:X{wv@ӯWE_y'b]|gq|Q[g,`gh7ώ1BHÉcFb+m3(n?iߦ鑷[ԁ(uHhi=}ߝB: : F,Kx{&VA 1u=i MSCFˤ ,= DCL F_CENTRAL_msvcp120_x64.05F0B5F5_44A8_3793_976B_A4F17AECF92C DCL F_CENTRAL_msvcr120_x64.05F0B5F5_44A8_3793_976B_A4F17AECF92Cp@DCL F_CENTRAL_vccorlib120_x64.05F0B5F5_44A8_3793_976B_A4F17AECF92Co4CK} xExO2&`ԨqU6P0NH"=fҬw sޖxxL$! t!ҿ^Up/NwիwT57W Ga3g=(u& G>YT| w;'N{['9Kq~3kH6WbbdCNPicLt0K;=0~>NגOsu(]G>$!/[n?N`YpCL0"ߛjy&1ҿ uIo_ZnF_@{AE4 uwr"^8H[ ͚qBQaa\𽼓Jpq!a@]&x'BcO\,ap;^ L\c B?*bD#*p߲xb<M^D!pnD%"4*7NxjZ<>yz@v_]+aXѷ1]#S7d[57tǧ# ͽ:%$S9 :e˷4x͂D /⭔)c#މacbx:t;z#:|Ӿ ]+Nu7-&yF,zNsAگN4e48MAl.J4LqϠУ4 N:!4 "ls3&P˴ ٤Mes9|*/ ]6/2:at<4Ӡtf :v Cv& :`tL c k9m A:D h#S}8Jpx߸1qIBdz}lu/͍=kܱW!1VovvkߟIZKc9A=^63s l~ ݓIoS8fn0qNVy sgY<ON@ɱ:}=axtexd+xAxf-q,L=]teosBq|ѢcGkJޡd(耻>+ ۃvY-pԍSW~jUgG:|.2.ϙC:dO9O"F_8ӂ:{VTcp~LynKgw2Ey(DEXROi&JQ*rMV@IT oQxrPc n"ŃtMX^gDQ,m'*pmu7CgGym>`j/`@2vX~am=Z!8 @MCԖE]WBmSK@d9nYN3: [b(ʘ6pi`H٫:fU`V@H2p0ȟǐGCߕcŦ@C~ ($^}UVZccp~Y6Q(#h9HAÔhߨDeSo"\v=eͰr&d"\+M@R+,#/򏽝p)vYSो^^_l0ǻ[]XkLȢ~(<>A)?) ,N^ > օ_4+@0`mb W}f >;уwlB=u:@9j-)TЄRr0Mrˏ&5:1cV8N<5-8Y)Ɩ y_ A#}%!fXM_8 ض&Ơ7 %n reί-sFTs'+*{lC/m,9-ʇyueq겛MZ,/*'wf?=02} z^vSכqX;˚}vRs_AsU. u 4˹MH!CP3!dGC.Ţ-#f4y 7X3n cz^ޜ-.n|-7I4#4 V’`fBLAy/OrfW]Ko[`uI Pm/j~1hZh-C-PJnfu؜N,nRj v'*/'Gv;'רr"=H)du6c rIz6MHKAI2GlZG:%_9QrWΣYGu%4za~ֺ0ۉG~az}ERp!ԅp^:qx bA Tr4\ d{t4$K^ ڒ f\Q6兘{3lyUwr_/ _">wO1ߒ>On<>8S gl2yNq>fϸm8]EɮS4[1ll >S@׹L՝O҅)d p"Ug9\?cի$MUQ *#T $=㑫!=.5z)L"I.|T/ˏؐ>\9RR (Q"8p@3BIex2` G"u˜L>i-A$Z?֦#"͞g(VP2w39Qf@д.V* ZH'lp+9pU?;,Vqk@YN[+br?b%0u{E_5MжMQ3PgX]R{W /6L#M`+j158ІRhW,v?\S6qvݻ"0ꥸ]s 4w'S,36f}&X}nRh}n' ) ?0lq WuC76ϯg0m Ʌir? Ȓ]]})&TAYҪB(zzwuHY<0sqNqO#§D&΀ 1d) p sDJ.\st@( ^#g:$- 0n+ֿ Nhn/VLO/ 5(}К|={mЛd*zڄxIk_8*8!g24ƹLܢV`K#:Z)4&>9.lWӂG_5GM D,^iq$ϮC>ː%jׂCio$P-K5VvFJrXyfl[8.ùO i c7 GC8-Co9-P^? W( _\\ d]yMsy>Ld=[ToRZZc S6:oG6%-xkUuSn =7(WfcdNrU}XXe6%9N(um&W,C~ +4pI>#!5VA R>)Y,dŌb/kؼ~ܴœ+yo te0G"xG/Ь_,j- GMkY-ޔ2\/|~F_$?.zfaNbΊX.(83pP 䕬>SAu:[X v@cuY` 0Vݷ9rxyľY$x%8 ~;Sbm_Uj?F6p)6夾BlQ3| 8"mg+?F5czotqXy5{עD>!r Lp;@$)yxkѦ|cT;%&f0 ߤ/aE߭N:Q^nM0i´L>, F;mYqT(x4^vwO{g`K֣3< t!jΨb@[׏ ׏CClxgԓg5Oǭ氦/桶Ʃ3a>+g'aI#._DFx}2F/X*XU2ZJʕH҃>ȳًx$Uu N٪N)m3oxECi3;,;~~@/ ش(:J9yCi~JEI&d2B&ff..B}pl6v,fţ}f-ΧĿ|n\YtH 3kEZ}c˅ȶ\[lҊ&:%s]J^\p!v5Bh郋]mWIsO45G ekgpۑYqVMjK;*bS[Qgbgr˿&zvny7=x#ǹԳ-COI^};JpX)1O3䨓O5rodbnc41e"L^v|D`gQdkLw M)~ُ (K%-`ZO& 3Zݢ"^*T_r!|;1x$a4"k`yG.a`XX6/W^gXjwxxT\r,a%)Wcƣ=sf;n/`JfzZʎ(~,8߳M(MpWc}/h>Q rյ$U,eIFkk9Q*IHBuݞ?lk;,ي魼ڣ#ڣͩgkS=͞3T@?'P97v MI4~#s?ъ߭"Dso=r 7k| qdJ+5'Qj$[䥤B|15j]QsԼ|я$j7gwVٝrvX~?Na?ąf-,gE9r+kYZ&ʖ1g]3:syQ4鿟o4Y2p8Dg)U9z>Y晝?#쬎<s}Mk+w?BWI}/j"?}x"-u'D&%{+'EsUϫȏ?)PwFw$Mj/1kӟ۱;&d9[- r/fcF R999I"ِ+oIϷu"8}kD'%kvDzg9+9ߜ nErl8n=E5 n֤\-a]n]G]wȾv S6([YίrA_lS,|ӊ|Qv?:mg/ä[faj& 5~M~uauԤXPóo:4҈s@oK#5μ,0w 7t t \,xu|P6ԬWK`?k,?t˸u%e(L3llRX["􊛾 ͞ދ=3mӺrU7H]nIϴgMR( ؍R!䜖dD2ʢ`+R+X/?˶"P},h9.9UXiB̨OI[Vz\(Pn~(LX*1p{~ v +ZvQN|OƇ۸3_9;"N4 9}^_QǗoȄ8nCLjDIQu~t.\ɔ@ߛʆg/NRs3 rAX#~ҷċur @d\>7rҬI>wncj' f̢_Ms+/~lW?6&)-,}/Ҟ蛴CU} TIc@=~?ɿ+"0ZPGmn'C3ƂI9rٔm;'O S䠜1%()rniugrz~rkroȩ?Ú.ߡ֩< NOJ7|BRݿ IMIɐB[ےy:0%t1vYɭO'9ltϒw15- cn@5 Kg ' _Vf5qp ':죔"p8~,3oi!۫=fM15F}+2-c KhA9Ÿ6Spn^Ef%H1}kb" Ց_a (4R0V 2 WgkD^_/"2=(cvkd\V?t^dka8S-x> s2oP!ܘn|.ͿQγue y$QW.eYީkt*Qa_c:WjZ4lѴMY9+x]sfG\!,ȓ"QObtg?OoLIf ^;,&zާxy4F~I#S#/zێ\qL%/jLQ\85WDTp!c'x†NQPjOJi}DY*|o o*\T+$[W=JpC \ Fp! \ 7:pnWP6SsjGF$ڕ$ܥgCxjG  I~3aGewS$",;觃#ӺnB&KnvSp2ocmm$QUWD(a-wCCM_q4\nCE;46}T,D>JaL )i 4@>jERkddvm:d /Mʻb ,dQ6n2Ld%P{~ST7iw&gWg'8x-0z>?wg%u3eVsf'DEXB'ԏ CWﵨ>E}^4>6 }|(3\Cyua64K6/#hm0:WP|XA 1@,pp'N}Yتŝ=;rN_] #{fOߥMܴ>i7惞ޛe Z vvuy 7eihKz AUŸ:V%)97fp߻3qK+Uݢۉ9ŕu'QHbPw@ Ԣ4kZFUtnw)̱N.Hj? ؊$Ⱦ`yb/݈.+)͊\↨$| h7d%)IN[EP&QnlLsoIkO*~NQe"m^vUx1;7{w4~tƟRi|4~9i#;z 4z] rhx/ ufLx]U&Ăʺ/MLq͏r?[,?t)Cuy`i@iDQi^ B@^I(bn$CFp J%$i䛀xֿ]@݀&8kz՜Šn+@}/*._170RHNn (AM\gҁ[LD Tltxu{O9LMA] XW]JJɞSEƦ%n|'MҵhT'qߗ|w*ئ4'ߣwwW|S~;|/c{(_oYfcGO#\i3$o)=ҺUMD`|oQ1osmٺ7-3 {b Z'TN2nִդ&~[tԞZ0ј#Gr.<,VO9vR(J{[Qi70"E8So&]~}3&C@v˛&KBX#] ksȦ灲۝G]vvpsJ73z7nuiz!bELZ lUI֎cRivO4! V_8 o2uMݍ=iO5G*cPi:եҨ-*ZGh<[ihTF{QK鲞F}ՠQ :VQ]A̠A(Gڱ53TZf*=&A٬!L=W*rұ¾gIhH%]~st:AR" HR['^I@: oZN 48`R8sd9"')\]F4It8ZBuxl .J p/`⿂:Yh2Q_@a82yhԶ宲h9C-:3γ3dvjjw%b@9J xrdboiIHFOYXI>ƾ_A龱=={>X9zEl$=@T͒8*z.RSJ+D(M41=S-B_E^dMJߓpZ&m@Lji ʅmB# hp"dZ HvNxc@ _EX"s+ny~Ժxc,'{\c) Hzui8w9SCufj5Pkw@J06;_i% o?Wbb$%F(j`o0$}˺(_}B_EBF@P7v( %"lsyDZ홀e.X:edD(Vu__wVw 3D Ͼ6,6gmE, ):7_Gi{4ys>Hc]y0AS輢 \+`3;s_YWE@OB(_N鼈̶/n~k n ?##ŶJZKZ̀׆g8n3 $k$n_k[?_ճi[A \ <% A[ܠOl4OCORC?%~U"Iμ0IBI蕱֑Awc@:^3Enz ̼EVr`?3=$ Ṋp CIj=` J`J%J}Ku{fȻA>v%*+8#$^O|w {bKI9/_ -N(0HnT™N͙'9ېȟ84ّt@i wF#wh2v>XmD(Rc3!;ވt`+sUb# ]vǖߤ FE~N,mv5rz #'0F>=R]<mdH̼6wrDk4DkI3-H0n4(&Ӭ$x4 {>#Sk%C&:&x q̲~vcd^XYg0SN\D#WB!U&C1 /K[q͐g-t½{yhxL`0+(턱/*1BJʒPJ@*K4 Z xФK x* p~;~Un X0:S o/R~DdLr -j-KD( 9oJ J 8kmpʁsBf/M͊61M*;X֏yY~N-L̪ H$pܳ@GQeQ!(h842fqHUR- $bP:a)wVqݙqggv~ :*D$AThq"!AIUIggY Uޫ݌S\|q YzZnR^%y3³d njzF/2\|u31 wN?C)˙vr2

84gd~lB|t^Thuct!VEpy. hvť^ڋuN `+{9nFf~+qr3O+tDw+U*H)b卅VA5E@t3bS/'WL6{gqxxU_(Qk.wgF^.o=4G>B;v$nib5:B&Ԋddn|Jky>g<jw1qxSg! >na©>.p'ikYH+`XH06_ql8&ٜ3$pQy±sQɶI'o>n߂9u+IՇ+,UR2@9f~5nڡq~JX5ƻjH E(a Zj:^}:cRLTS,4.^1g&;ۢF:ҭd쀭4vR4uPUm-/_%G1v ״ڽ6RTeݸJߛF*!S}% V85,r |xyD+H NJ%~_U;E9k|2|wym=3O0z qQ_7)/}Sf2;j0<{k 89AE,t'74սkt^ ">Z׈n@F2άJE+kU/p3T'B&)Q7 # &/Ka2]7XiGJ42@[7Vődf@d:/'YYy^jU[܎`oo.bd\{ &ԊDWWV%NQz4ף"{uitD7N嵛PTmׄw1k[)J 4c;*5h.L׼| ,(+2sŞ|C0?9=S2#k5o k7耔PrxE|m.@9Sqc<@ q"\9_s|%LvRu{k'y$T_t3UF"cD~upMR|@$0*"=ш( D g ԦLՐPpAeV+T_A:`Bs>jk||uMӞF0&AQKcy74 gxmhݍ%];q**Ax4P Qe+i1bq.ءycS `)fP1-fDp1: (}Z j;d:d0s3OigB+sf1?jfG_5/4,i.mjI1x3{í*Τ0FcV@p01g& nLA'3vZ 눀ۄBpkFp{hsn"VS\nZ}7|BnG1pOp{̨ ܤx.&p{hܺSCpVMAe5!nۇ/lW}V.z/M6{v(?gkl?{) u_nU;oUmW]A:yo=|_0ǚف4MU3[賭^ՁMQ1p#Y];㷒Чe[6ZPM[GP*b-C%a_Ŗtћuim&lg |wrTmTQ4c#p!͇9p<#Ox@_ Қ'W_1<69)1޻G=bیZTPY} &odq` <u KI}ȇʻA<}g)vteD Nx L0 }h_52l̼/߭%.XDE D[A7RSN 1‚!-2ǻkgcLfyYd܏j0@K̓]{C.Nʓ x={wB?<Q&z!CmU^JUq1ɵf[p{?:*,Fn4!Z2ID,,/BJ` Q:(]Bv eӓ U6Z=}6 as"(x7NA *HGY`P#pp:χ|l?f>>2l:k^geT[:B" \>؄e~tP0u^be+/0AʫM*z<+:.}[xG}ArZD&0?^*#,L'f׬ _J_Cgm}9zM]Znn :}ZpGȯ>UlޟdقTMK^`YW=+rU|ZG'>o1jR)׷[>Sdô(Xtv/0{4Gl7,Ml\Gl$lyB )*?SK.* ^QU5?We3?;\ *v[L` %oC9 <`T\pND?q)V&|hl}>QxGBe)RpFoW!UOXVNVp@O! `DΪRtUr)Ҹgg}&;ɤ yh~l`7#1BgUx%?ijTÊC}#^ (SVm3WGa ˹V|q=b:ORS}5 Cd(+,V=OL!e<$S[<V (4d]Iy&&2+oE%0H[Bwie;z0u|'¤  VSm+!,^M?=Y8Ѳc}rM`˼j;[r\@ X|tn?81w;Z%kB~5 UZԆac]f. ,3H[>Zkq\Ӹ~SA8 yv'2: MX(vncro7E: D($\L|잉o(]{)'S8py9]槟0鴄c0 Ƞm{qn"<(2#| 6ˠҫ=FXTr`@&]l!iӱ!W5 M'@.fFP϶Nu`\Y|T vgbw`(y\?Y.H yg4JER;ʰR`#pJ'e͍p3UYKe%ms8\UzUJYJI ıJÕXBVCc]za$ҿ_kD^Ke'n*5_p€&Q@4AׅٛßrD6]Y;yE6;Es.sqyȼr$y<#PLaAµ2Iم$ {Dd_! mRG%E`u9|08 *`m5цtYЫ [:M,b&y%;uBc PZ#X/[@|F5V[@U =_kwvQB$ 5 EnvK}O׾öRځ ODGo3諰kI( :la"]rsEq׾`B;DSgP`LjRM.8ֽ?ߠT7y:78|Ԭ^7F`j͔2^ 0MWJ`Q2?_D~%F1$ #څ%U ΃ @`S$ [QAiU۫#C(=vAcH#羋\oS1E%}S/^ T!j%}*5Is`sQ:i;h+MÃʶFDU+j.GS'y8GaX4(QfAG]tmD%Kճ8ڃ\criԎO)V~!C͂ &JvDq(Pϭ1h$5Gt\*Xll5ljɠ:`3qӀ+D`&ǐOp^ji HMEsQQn_'AGP9I'J?`h ʦҖHEڲT,3C1niN \A>㲘qe[m7 ɦ«jAɠʔ5,90[CQX}pOc{i}|V , 5y4- mK4 bt2$; ?PcKgDۜNg{;ʟDXҟCv$v?@lyt R_3'$e&;z/P6cr?j8g\R/<LQo ,e+sM1r7PxZ=hDo#8ob_$Mny]E>k]ֺ_-9 `D1eLI|F'|#` CZ51 Hbe36Pd@MǴž)sBVNȀs*+"Waf:-hr)}ɎLhWMة>7զcM&kM G'$޾ .4@T%J(sy-6_Tz7ζ4IIG&-3_B$?bBNM睯$gmo<4֋$qp4h.GSGZ6 d1F}^aDQbj[ ë -e/ _IҐC@E+)Y'X_SWtV&0U`5Sg*R ~t;$ ev3 \~/HSl! pտГ>U(bPPN xvu[~V3H0]""7#I_V??!!7ѓ>`HV(&Svq@QwgAyV4ALN8(D]@WIPoq%q[DIM(@+`NeTuYͨށH; 7>S+;OF։f߶4la}Bi3 E=@4V6C@߂㨋BW$ 9+^(I/cj @wGpLdU`P0j[I|;ܹBۣ!FYs{%PIExw 曊Nin>'$g&:K@Ys-.?\)RK+"(zln XF2VR蛛 ڻ oƶk'nϤP}%]@~ý p7<z &sϕ`#YjO."g*2nJ8l\MW%s 0b΅q`I8 )oiTcY(KM ~m_'Nmj֫!߀ :kuO9{gG=nOqޞm:]Ď2G'yRjr\&7xrDShͳ/uzFj V&]Ǽt)t~,@p0zmzP3@4B(NѹAXEF%}wh1߾߄EDJ~~mjqWW=tvCT8]up9-4_XIJ;8{k5Z9!j9{i~U<`E;Z 0X#~VF-o`D砮FoӢ-fr*gYw*Ri0jvcO[*ÈVnj]Hn`Wko =SZ`u*~.GT78ږ8J[ZڄBKa%-@fA,uӷ# 29h`2bgUU cgJv;e`#)< FҺ ]ȁܔivhuhϨ:0jGTN9 HtϢ g.?sFʋʋTC ȋ'ݭ&,O#4~^,Ga~~aI$?ui_?^ Kb%綗6k'K*l^f=/A̼Zr]4ؼ,+8TϧhD]r=E Jz@>.f).V+io^Oa q'1v /KhZ e'3aN2p"J̗0n`Q2xAoxND+[o7' כfZq+8ћҞ!HW4n/* sw"HAxHY+[vB1C'X5['RށLl۽7v@}K܁UGSl5*氪]g@]u_c]h+/&t:G)]ʨuHVP|J~8IjxNY}X1"q< ПEhbb拭~,&u +I,}^6-`#},%=} V G&/:Ƭyȡb~qQ?C_BA[ӆc#gR7\0?;%5uIM yZQ?r)o/gXP߆k}Avko7>oϜo8pF.ZFMߠ@'p =0'?פ Cf 7bS̿4Pߋ[ K)ƖE¼ۥҗFm 8Wm씁}FNcxm[Vyp"` 3//BW@'\h׋QЮ.AYY_6i7 09v}T]mtekPgD+R-' +ʋ*<⌶߈}j{K5Q5-VeV 8t=šf^#΍I9Jr=5 "V]A~UK1U=2;ۯuQa^k_()[,3H#w0 n+-t| +A:٢AvC7r7~[;YS ҈o >e A;yi- g.,;)Ǚ9p$CK]{xSUO>£$ TR^꣥&MJZR.ࣉP0eLz̈^% R J"SH9wINR |Z{~Ka{ϰ2 h| xdL=2E⮧{bCmd G4,-8D>͚pӖD|Ʋt>KC!e2V>/xH0``9xʇdVpce2a̒?] LEUApG^n^20aCțG!yY:rasY%q?-I% k~B!!F!ͰNRI֞m5 Y·*ttobڡ?Ϫ]%\{kf?=cOol]lNuFaH%8Z%QLl%;5Fģq y {Ⱦk*yRu{P\f| k["2)|Sw  g8c \5E7ٚ}ez.v6; aqyʡ;ҪV 'XF:xj ELJ'+vCuaS“8C 6Ϩ,*= KVQk>^u<\^ [OZx ӆ,!n0N~]lC.)(ȼpG6^]A\-.RW0 C-:%c9cXUƊꓱeH Gf,9!DTX~| q4"5;R 2LT3,L#ouuu+s"W4g!hJfWpeHH!~hBE#1cqP ; x//c=h6DqېO{dzlt)w/nn-*W--^wQDs})~Ra4ZD^(p~Eaݨ^}Ѱ8kDާ}x?<aGspղ_Qr!ja-b~K #,D5 4,|g92ϣ3d{8hio~&8vΡG@,1|,@Hc9TR]G™Ȇ0RI9:aT!Nh ߮k#SpPYq4xc[g"r݀קwt ,9׾PdͤvL7So+_k<};?i8d$Y32L$zf){Cf d6I^` /ݮTFH9F;^tE 2Gy |Z.KH!|BC|Z<Ձ]kO2<vv\+ `mЧ/.0) 40XŠ 6ɩj,>i`9Iv1嶏[{ I{@ &`u4t4[*YR|y^fEΰϜ+eJ\۵b}_`zlYG]GL0m7q\HZmgv5~d4K A_p<8C1~W!r\COz&%R I i2PSq&6Tí욡ꏴR J3$ۨ%4?Y-uxqF#+U'`2<[E?zUkD! 0ay y2/ !`dY,#pҷf89&΀g1|SLmz!V-u0%ә[fyh^!5R/RH9-(ILRr({*L`dv&j){5"V`c`#lҏ-1:O%FK Q{VE7FhpD@ Pp XEBt[]5ڣyi$WV6Y֐MURj0%g0prT9Kh,]fY?Zv`h>' .z90X}9^w܍{`Y! Ԙ}9_w:2uoQ:na5n jJ>WPSfS+yt(毜-+g}{ u'Ym#~9' 4 ( %a\퍈D_3w||ԭpZ +'\Fչ}pL~.1>#P&W_< FS\\l~[u#/SgPWq!h6XnK+u{P{N00~C+-ഠ#a!'Tn8] 25 7FYQKX^0%Sk;.tSXPeL6͔LG:ēCNبmߪFr'/D麗ߤ5'7]7]N[X7<sv:#;W}O;3^x.G٥JVmQߧSrt H3e{<^~o'ȟc3DqiZL2x\I镽߿+%v1DޮV6WIC:>&Ͱ` l}\K|aF0V 86[#9ed DgC1RI<xtX\+U!˱de4 ]i$ O0 ^ :% ͭ0/\\p9T^("cmfkΑETe1ㄿ,;!"lB&jjb4溆x-˾27p3T+ӺX/m',͊VpGc)҉+ ɰ*DsfatWD$M (VfBigaPzX-KnиD^ð;6׵]< ĕ}=m3Okά@13M➱@.E ڄ`bSڲ\.B) ޣ`_9snxlUrӞ+5z\Z }_j=E 61/.-Zɒ~ZWvKߦdMdxkgEs ^ \&ܶH9v&[^:&[|K>@8A8/K֮-$,I;~gXƹ4l+ӨzMi9JKE?ra?)XΫO_yWr~9p^B߼!Rw.VL.;rR]a[lL0( }|!m[% qGaK-C-SԿEؚ;b=%= % y_ha\f{t"}GBFotb^D#߳P};#gwk g_J#_m' l\b4v }5-)gCm%ӻB<cjו)YU5n/ o O"f &A%,{1u cս|{VC2Y#3c}V ̬>R_ ՗+׷~ַ@8MIk>#._Ю 3m)λׅ\RG'.hh3qHy'_i-P8>_~Dk?L\pw>tن%?&3iS'MR-Kύ$x&"">6w %Dq$~ɤg qW($'N؁l GA@DY 7{r*VY)xo&>pLT5עu;63۩Qo;|3+em(^ۮLN~rmWQ=oZێ{[o[Uok![qSJ跉q npK[D[:ۘu2nܦQCƶLn^Fq۵-Q&][[*&OmBҕF aDu#f íZ[ZJR!c}%W/fnjBH2+5mQ6pBnyp[Jq[ᶪ$[uqn6nnGW3qX/nor9qsn c2tۊ7T-­+!,9nq{m=6p{~d.m ,Wp{p 7!!&]6un+]QMJqTza|n/206/(zHEuvO Vm&܆R_SopM!ܚ])n?e, 6[6b%mJ7]2n7]n=mÖn%I[*3p-­nϮR0jaQp{p;͏L3v>p{9E+e5ӧmZ5n¾ n/׷(έᖶɱ>i8|i 9c5;U@zz^?.*:qgy,I*n > ܷJf=dKaNf i&\ 80puobmڃ&f fG,2(a|@%CvMy7bjX`Y.AhJvhѦ0$RrmTG@ny{wͽw5L9|}>=w$ulɈ++7!WV]h5J>C{F?w{z#g¨k~@H*Ӵ\,$$" ɘtm WKunv|*| Wcn|qyUM*kl#C<.ȉ,96IrX>9yhweb̑NĶѯ'G:sg<0Y̷zr_Lj9R#gWls-yrpiS.K$Ш?O ۨEC4On$خjjIAw֠=yRwH˛'ˮzezZϓxNz}yH@|HRni#& rDOg(C蠧ỹZ }-ɁE+uZaźf!tZGzYJo#_t;YC&!E|@}ȚzED&*=[sb}8 &=Eޭ=E/>_תZ9Tg 1fV!dx2BdHnQp mئjٵ*!'e㷡SFA~N$4-w˝`Ff4`VαҾjURUrf|*5bU6W7qkn:veJR-+SÇ}jͲ*G۠hl"T5} # .؏f&*)Gn-u@} Ϡv[A(+%!\+YY\ ?o(, &hvxm`-7AH}|)eD'jQ\'j2!c9#ḇIZ,G1Xb45l/@Y1A^fڂy[#Aw\_DhQmdDZ<~ wN66Jʌ,#6r61c#űo3qPknc6ZFQHmlUc)63vExڸmCm*s H>FjyO^e=J.P0eߖ8<pH$k8r 00ߔDrXey#S9l-QpG p8Y!pH$|$ )r#^n?IX[ DsYL95i_z`'TOM2]iGgJ:HlVSN6v9NI6EsH ^cVIs ZlDZDx&̪CK NWlKXS- @v-a6~ !~%plbhw yEUaZ?E"ipWɛ:A#Ɵ"3ܕ_xVџdoY+J71܉v*dXC ;@f[z \mW%%Fϕsj%ͮ/g>ߤ3Y,w^g68Yoe(!"oZM\(䴁K5礵!j* :=; <Le?UF_0Zsp%w)`lAMb,Xk{"慒<}GRǔr#<`ڙ@ƊF @Vj(I&'%՗籸2;@r*OJT?оk"E?K+8pTh w:fj15'HB>>y"QIE@߻!MEIkR!$K: :W*  +.Ǐ-ǚd{ dMdRVBKx.ٕ4FW9a8Л~y)Lh:<ڀN ckԩ7ӣdmJބ]9wĖq:<[p@؁1An wxG*@W'cp; )8uh 0IcvNYgD:~`s R_H})[{ ΍|Ao~O^/{̞a˷/6';|1;-Ll|Uo 4Ɓw [b{x=FE]Öc9{{&ֹÖ{vWjm[Öo[l|pk;o67-EokV̷a0#|j훉{il|88n.u`G38?^~i9>P hXHdԅ$K,Vsq`uZ'05QQTo ෰Gi`Be[nD;`p 97Bw3Е9?${[? JB|6Z-˃BX*;/RiWtOzfdv{\'5[ON#uz`zfWgg831dy>+#ޔx?O-rkm|?HgO7K4nc3ʍ7+]|gO|?Hg>tsN-{G.;őVL)|ouhw3.;+\CK xUǓWr@bQ Ri RJjAP;ئc\(R(_[. ;w3'ɭӄ4>.d{wyg&33i}bůޣ4?'<[?T_g 4ϋ_Mx^}&F_]ϖg^ o[w GLL de7hjNb65aT'LM LMJ8ogTT%)2,y{ڛ!47ilK3"7J2Cd^*n9a'C*s^59lν8Nc΁T9ҎۉߵV{=?5|$m6vqtќmw]ni^yQ_봜% y(:ORzvcK:tZ9Rw/[7EyoBxOli^O7hi^G=V'p'{-k'EyHxoi^<{f_Q% u4SӼ+ִ#|ҼΓy=!ۻ-_ҼΩm<ͻsoQޟP[y'u"Nuצ:_tﳝf}-$%pxX* g[`|d:o\O(ỹy?׽,5`ߗ9N(D#3Xk4R (}Qhv$FNTd(& fE< F#02b 1no0\MPI{ apNfp7췜f[&+v #|l`e6f<}vЋt}!>΃n3>D{-0űm=ɟpNtOǹ̚F jgr 桑0>cq_`<힐 1ƹ2{C9PV>pPn,c,`\GȘ s8e|㋭ O2vRV{/ʅS{y̞b3{2`U1y¥h\An?k~lUStiGG]ۏjp r3qά#Vz`s 9=bk +<9휿%B:sl]{:q>^M87tyH%pNCy^'7svSs>n*SXޤ>!g&i=(?.*삲t }P؞ ^0)0Ip}{<ۙ%Ԛ j8Wb!v;mtmp%}9r[t9KNg>˩2 >jkъyS[n߅ rAt:g>$Wo朹!G Y!li ]a}_[uyf~'1&6{cKH.a)y]1,kD8).6)n1tmBJ>aXM k.jJaFO(dUr06eM3Dzs.r.7v.iiφgõ,_14Is e{+{)rJɌ&9wKN '̌Vn> >b'ҷ=.k)!:oOp%ƹ:-sv88o-r˭x dbӯf7 gl"~U<섐s?[9;H<Sޘr=W"myz1*Y-Clu`=.=1.X6!F^!C%|먐o8CՋx.G 氤 G,uM0m9<wFs Bέj=F }<'λQXUՋx'KY`BOV2wWY/k#̓4q}:W{_ ]a@!v X<$dWX>\lµG>_7?)GL[/,5_k>b)q=I8o}o s!s_U{ 49~܍Si`SzIN]zt>$#qMt/]]NOirAm?LPxK$qa hVZK& !is4he/Fi8Vxk >urPNيʡeɶn\^NPJڔ{N달}j.L дm۹rPK-gmzrIa~T1dZJk}=Sc||$"O V*a (xEP=){c#^ ? |r.=]QGGG,B\5Po?ZYToU:)[B ̎uK5ainC2u 팿õ֊+u_#{hULP7Ra-܈tNu-oQuک2'zg_֓z7 fh_֍ Fi#ˑ˞Jֻ̺48Bc/G;՘lY e]fqCOjVcJڇB6Y5U>fF=Ut BRLXf Nkg @chƅuBiζոe )W5xVqCiFok;k:߆qwo |C<,r14Z Qt)@\0yKލ(Ih\[#8RcNjd1e4eB?ZjƏS]X :,4v&;#}߽Uj|Nj+xL$uW V#ǂQ㞥Qr6ʮ:X*4ehe@NXM4UTM9VnWiPR)ڬi.9&ML^4ݟm4&9BSY?nN^^ o~pm'аBa@_v 4t4~J5jxBÍJgL޴P5Ұ^+2%suBT7%Y&W8[9)NɾHl{SS588gvS >$> 3o0>N>΂FǙķ8O7:}^>N*6q^FqLX?0k%5 ^-;}a0YJgoGWޠOޤc.hb19#uIxjZ7ZUԃtc ^G2BMɭ؛/C'DiB,lߢP:eoE3a[h   !6.LoT4L=!n*U%4+9<JS!ħY]WKl7ľ㣙bYT'2u8CP\ QQ:FG8 m(J" nca$~/l6QW*o`Wa]^׊?INtq f[t_ZO뉹HmI##jmFK(r&ꞂTuI Lt F$,HZI$uƎ3: (h$RՈ$ 9^ڄ/A ,H$$ycpI;'_. GH6>:@6dH  JR0?dSz>ASL%rU̯LnQoPF$$$$J2HP>rY$1?ILGбw ՗$">yLguC*TP34h%I+ӢCZ z Eu+БxҏAv iBPUJ>WjT3ooj* ,Oҍe_@D=H*-L6BBZNȂΔ~,PHM4ކP/a^GE^bT.y)ռyoH^x^JK7xTEA&K>jt^z$dҖgܑ>|^6=y)dRGK{9iN祉ӜK]SER+ -D4/)ƛ_[߸ы`7Uhwq7yW/g^ fSp]gim*2G{p6{Ab GmX~SRmS S-0a?^mx6T ;S,P65)ZQ`]E E $4]+(Uv*7%Ǻ$m|*nQt)rk OWR]R`!߼3sNNғ4-I?B.3y}睙!0_Qap1Ta{p,a? 8Q@! _>-XW?d?sXPM!L@Xs 1X%FgA>-sA|)E0.BuSoL '`Z/I`Z4L|b :O96_#?P,[P+<%x{Ӕ+gyF̐`po`:euO,yew< yr'7z2%GK )`y> ,hwaP=W?)`yn\B2#pBӞJC8%p{ĨPFr(d1}} q^p'{=r,7;w>q {$[}qOuSl,6-)œ+rQpXcf+g6(EoÜz; ]2y%̙o F @/qI^H҂Np@`_*BCsQ2KLNcI_ /'?XA9_g0j6WԳ\*C, TK67XZ(Gx`MRaK"5w:&(.9Tψl**M>\K8@.5w\k3%-| 9<:-#sjkֵ23:M6Vp  \(n ;U 'WkK)p`hllwn^~l:Yי͸ǭ/^C@lhѯJwFim/5sFssqn*c &wKeHKnj>>9-+K'Cf8g3Y!7Vm-,Quxt Tk$DCb5?YgS֩g ̅ }@izF@YMgmZ>hD;hGA;FbhTDXx4Gc!輁PK?A{$ ;-5!> ŵ}5S;WӢEKa+Ӣ35+TLNlނ4g6:z 3UI♪]!T"eY8V g+v.eV6%BREe98O`shK> zq%Nፐ_EKqv4ttԌ6,!l2`w 0ؾi-FJ"3©S u E_9H4'+,'JGC˧gbCd(.ZҶdV2\*CZ.1zcܭB7g1P7v +:@ 0rXeM[oZЮL/cei_pz"yP7Id4ª}:M52$SKsͬJJ> Ttߣe]>'0_]"b2l.Պ=%M9bKf&X7T %@}1L4VLvR*ebݧO}9PHUC Ru\P7J%-z?iZѸ:hGaWðKzt%M^JܨP;w ;dҚZ3HJu%K=$*}^?N|VNL Gړ݈mۨHW?!Y6"OU\T1,y|\ɨE"<5%ˈL>Ndr}H #A&OJdr'D EjG8>[=1VSh*_7c1gU5ܔ=)b}}B*M[%#UD('a|"mهIZ7Ҍ Euz+ec8E6)!MP._H-g]T}PR6!e㊛_5\|[}"T`}I{^}T$ݣWA>Z_v ؿl=6 35A ؇%`*=]$`|k? D/Zms ث<}ۂwXGϰcPH\p`%v'D-q&*ޔ:ęH"D_y2DvX}9TSgٴb_⳩^|m߷ǗXSYĖ߉}տ]_Rb|~U _釺/J%zo|'~}I^|5w]—%n_"Y!K4| N%Ʃĺwl_puK4%f.mm_b]—7×8J|Z_K<]y='%Ll[A_"lԗH\ަ/HVħFpJ oFgjGkUJ_[\nc0;»_S2 6N'iTٸWh4%2t*K< 6L0U~Յp 6uN0cC ) ǴjLWGEIn2]7&*Oo3̋}xyZS`*K#M禎|謱EoFjaChVۀQqֲyp@*cܖ..Mvb^g/.؂p5Fuwݢޒt|}ʭ?9 [9TPHmi{lagfڴUf^3mf>lֱ[~s2M؊.Z\ڞp"L-C vt Ug5pyEXe~2|ZM1V?`]&=4MIH^xr$r X8M4r$K-&MYKg[.4\P~$-bEF 4]EkW܏ `d ~K7puW>tԣ>_󃁙}qiN4ޛJ->Q2\7Nc`B_a4M8㤐D:[L"ѯf t 4 \i3cdf5MFQH"}=?/&cM ^G}LUeGէ^G3 Rnm7 k}zf*[wV85R)mAaPPk:햏 tT }lOA)R[!0i熣"=8{|Ąʞ\kMM:g㡜u66%|YGNiajnI8eS[ -MB&" MapbqBn2#3gTe8 >Eufacb6B|t@ҟ5 $] $; t-̄` 4Mox,-&Z>T <1>Z[(P+)=9ņsrvr5/ _-.=ǥc|ĥzhIWėI\}ڣSSp$@=л<j'WP/~mz5H(.5aAwMq e\> CqO lcZ%H\!_=I@0//`/C^P%寤"JD+WR5dd{"ŭ󉻗P:)k/dꆏF^X.rd?a"w?l(pPNc~Ąmr%:7 eR[`2 ,air1A"//(D|Xؒ;&?_#4]c|q;]o_OWvrY:g 39!0~5,W-T ޯ rbɣ&?vwtEc|mb )wrEzGd E/PCPؗGe=CI@ԞH@]ŚpXϭLy&(/FeUAӲ(X;0\lѲ7Sx ͯV_kU 'D\]3O oQ- o{m-9 4WcLώ]poj[,18|ξetϵQ+6ml΂8A4gh_k#:fx&ixZF>_äwubz `! =µqPm:~vbquu>-4ͯ 5te9%VZ,J}<^ W[Cu3WYhB֛`X/ܬn-4l!t0||#߻tO3X.)iSq隃F&3n;sHꩮjfڦ!e&ﵗYRI&MlhKTaeh >L"h4ZR5Gu%HY4y nBJ}H|=sϽ ck_v'Ӗ L{_yV߆Dx+2ϛ7(g+DV´EJ5rf'K Lo{._zf^FV=-k`ԫqKn$}6/¹w*įѲ?`oaps>k.hiXe$8~>C /<ߧWOqO9fn"r6&AʱL'!lY\n)Vu8PG19f.͒A%?u.s?#c2eJևP!It!7% U"E([ 76?>I}v#V^:-\!-w ◮&M%iN~~;[vikC#*&Y\*S6,b˭9}3$3Ć&d>D*ȖKZ*$M,[$m ۫gcU- CFMMa+]c0~4@+E3ّ\,v'lHʜb7F΀k S/y"}&+:Pq\Zέ>dI3yՌc4(7cSNB.G[a)1un|ߌw~c<.R8)e1НhŕPxcRS+f&"8It6\rGD'7\voä#dU&;B{}0HF1Y_ǵm z%`<&D'oxCp+*􇐛q{CP 6SM[qt#yhhhp8~ Lj޸I87so󀸂b+<Cħn*A7ui{,z+mt16F5]c 'TMi#H14A]^d)_,z8Ⱦ.fqE6߇:T96>apscvcW brr7w,uIn+TpnIP[Z2$QC˚>@^{p %,q"򻈈<%iiUFLGz¶E\Ed *)ֵc~ˆ=A] DirY?dڰ %i>ߛƩ[La=PݑQ=2j#5z1;Mw #0XX0a[E~P1ɐ=d\V}}lM;(:d!*L"o 0:O,rSڞB݀' m.r~I.YBk6':XF9sp\Sk7.)=`q(Rh GI~l? m;۱Dp64(r?zy8qeZb.JQ zes*$v4K\bZ_uM7#qWM#WZA;댰ڃ %_ΔyJf#`6740.MZFĝ:^}=-F!"5baT-!=x8XmB߹lZ~ĞW쉩A|񏿉h](ilY뀇FǗf/|9W-y3Y0!y?HKkn*b=PrP ˙ { Q)[LU/AX_mgnLU5ڮ\+z"e僲eUT:%<\C0yxoa߸8 y~c0Er vsù㟁D(<)Xdg#P[<7g`jy;K+ ݟ!³x/3c9)K2᏿_x<<=5/5tx`bIatڸ^KFu\M2SLvI> H ʽCK]{@Tu97q Cљ@%A)MK9q2ee'I)+P$!OIdZIAӹc ;Q##P&9nJpNSJƶBp ~q,zBr%Ŵh4dJ+"0`90RK_%<£Oa *%aĚ8XO"R-F-X,vSl;vp|2y,b\韛9 d>/އqH;G ]] CZyibSq~I]2wN/pf<_!QO|!2`]GD03ajal `A|wH #wwg":EҐMBߤ5~ڙW,攟۔%w `VN,M|b|n;C6~\wƺ@$L SA|mTSUٌN(׸Ѕ)y&t:;iUtrFHb#!qNQH\KH P Eַ3$nZµg}?7|Ҥ-qjo52ťQ3gZG-;*/L[pѭ(wCцB-ؘf셗|H4>*џÐ9!Aulj%5(Rݢ5붧B3ݤB[3R[d;aU/Cɻ 呩My*S?,Su*Oݿ 5NydS($UndvzygȪD;˪խƫ^t +&$%BZ3 !%g3vv,.N:Q:. (`>b.㌨8BmmՠCT;2`F#Dv5& NlS4:$8dㆤF%{"b bs~h;S y_\% 5ru_r+].9V*Gu+%_R\)Ed@ cf`sfT<1밅f6o*(l &[LF7^/9R}Jvt'RF/] '5w?sÜud#a[ 4\ l儳+V]6jd^gsJ';bgNg03M/xa] zo{+7/ݍ̑_mXf-łd#)zgq\bT`VYzvX=ļQmݾ`͙0PȂ1݁7Cකal~7qrzOvtħEiK?0vjc4^=ڣS.-;"[|ɏ=DZ%~thZ6UFXZƌ"#%DȂ0=H5Te)'^D̛d}O!I?Q'8R'1dda#ʎBu#[C1P`҆.NƤaԹ튵'W}GΈ_%wH^/Y!tj̎%ou'xQ~OHO>$%/#rK.Q.KvtԥHKNWHe[ed[y[y\Iyw*y-yH[ܾ8ngH ļtb +Mq7m.diyI_B}%WIKyɺǥ%#K!|},1򒞛;"`_rˣ\ˬr9>yIs^8/gQ , P5G+'e=t(.;iMA\v2k%>\f'=p'P7MYO \r9'' 7v6岋]2nj̆ Ǘ>^HNBE >BۊQ҂ g(ѓdVk,JFy+(&S26\wex 9(G&,TaUTE g*8TeP &=wFb;Έ}tZ2oHGWXYU!#E>-5>>&ѿxx%)y:"+rxGT)LrPwNrS.pb[DgSy▧lq}!wb<!Or<Oyʛ񝙧,wrV_ӆ{dN9(·#% Erk`&OSb_U\ZUdi5`?H1@!H2@8+NpI4}PmC?h͒ vm1ؼ9h- CjY/XseB|]t)*of(\noe:h97nG.=~YL&YJJd*gЗe r<ZVQ,GЎ!؍!! TqԨ<O?g BZO\ :#Ϊ K$$(ɇ:G@y\57|,4!E3R~)Gt͚POK\+Fa>`pUw$-&> E ';Q/vRAX?Y$ZZ2ZMe\@n'ewbeHf cY/,*5AJg'zO4Y?by+{b}4=Yc_YՆ:o3oL>) PB_9|!`c+}zkiu!u֩ߗ}ckbd;mkI:]:uߊk4u_cr5%_Fv׊o~5ߗ+nB_swܿ>?Fm_-s9udRI)Ck5_}S[y $e;jޝ+2f@̒J8? fNΓ<4|ix{|0 $FP?.}`kob'5plǔ| LzTu&-Lר5O"1fs8"(c;qfV՝Wm*Pw)9#G[i{$#Jۦ)K[w)}A /plcpvn)}Xىax7aC P`lY]-s0]dvs/ 3d԰Bǔn?t$@͡p>vT7!נ \6'C`f"BN~CPKnZ&$8uNf/C=eև %ANS2GqTm]sû^yP9:`ܼYw%LTZ 9d0փwnRSG)U#; hNo׸dgR .QC=.ÑD>|;V*'䄤&dy]|Ɲ -tz(]o{A1fc뾞cƀ{]v[GlE/>7XEl~˻ٓ)gy#`b&G܃߬AW,1QN`v<;DOĻ(AHHI"ٸQxs`^$~-5tX\M<o;Cc^ҁm"s#;mvމx.ᆪ) xbF'4$;C7w3A@6t)~:);跶K5oxe24/ lрڱZ/9p[&BX):ʇa} 0[ȌͣJrvDWX{nIe]H@|jPӷAӲr&R!8!n8 =+Y8iT:Ϩtt>pΟeۮ#=KѢtQ,|^URjկz0f_C΁$a@֮@L}E0b@ 8pOI/]}[ #:daIHcmEWWcWac/}㌨"BQeN*u1OMy^ _n d[eXZUnU%- Rz< *d -{"^爕Y<"8 yy]<'gN\G:MlvKhV5 ).^OfnYmVDKQ9Za2L)"浡t5X́-M▯ŋ0a?wlf@ MylraiL$Vr+HV-}"0t|qL4 .W&562Q_DMO4껉8H&VLG"dD9gk. >G]=Mŧo@Ucns񩧋O/]Ӂ|zױ5;G^mvi3V*nWq# ]^,>Z\JȀzN>jդeBi)Չ%{; -ϯ(T. s<-\*md{mjƫgC٤iT ~/,¸SuN 'wc{˖RtxEZ~Ftfwۢ;Fp}ӐR$qܟ8S5[ȗRǣ JKװ)Oh}2LͿG<{Iӥ1cJfQ|zxz6w#E^N.l?3R\0IqM?g++wNq`V6$w)JrsQnZ $Ɓm9t26Φ 2N8F83-h5x~geI2<ع"@R?>=!vƧ׎R)+'/:ԛoZ)zSk},"'OJƷ ؤ2rFP* $^a _ w&$!H.+ ?K K?*!yu Ǟ&Sz|K14\Vq*Aui@e9Gk>Z({CTpKxK_UmP7j|gp {lp~x{C[ktU&*vKέļن>oJtU4I nHWe?֐]frAa~z̄]Waz<(%=n*ε`P8 8M82ay S7e_gGZR_]8̲KI;.33g Qb 4X=R4Eٵ[PNevJ6񶩹s)'"h}ľ.; CK]{|SUϣдnPpFʬ[-jJu̥ @8ZĪSmBˈ4ʈ0w@ؔRtV8qۍ:;;rh>v#漾w~*.㞐#l'`Qcvt~Iq#RTRU:'f`(>lI|uJA:TTl2i 1as^u%| .#ii—r4b |cQܮ i?Ə0 A5 0 9Q4S_Q)>GYaґs@c iy<57nfk7 :?]o~(jkJ{PpyiKzĶ]A=ޢWn4uY#Y>ڦn${loVk#&uV4\ ^]eV..; Nqǜeg4Wb;'w&mlƞ)~ڻzߠ=niV&g ӊE׃kE|YLМ_C.Oegp")B-A9xow?+A6cnuT'8\8Cҽߣ[ fyOnl*#9r1#D#[&`ymDV Rtz:9W1=ܷGQ4 EI8xZ0ڹ trԨ>'7݆Vτp&t.O~6BGAHs"ˑPiR׉8bJbب'X2: RzA42tjϐ.t%jE-d[{F&qObX+&-I~I;yn")`wxĻ©OȋʮDFv's> MZd.AԞNb:ۈXAbz3R\rA;8)T|K٩|# x 3L}huFR5n@&ܭǤDXN,2[ӏNȳ{:'LRuuGaFcnN3,y@VWv&2>|jdy]~SCz :Q=&u1a!6C0S7L5@巚{xt+2/B%v'6dQʞ/ m`jsrO=A5ZGveT1^Q;w6sK\J_o;l~:EKűyv?Nd^nfVqy@g#29A!2:+Qz $LLMv7+~d8^|x~y燒?ߐ%O' X u˿Vo/=;xoy3˒cPYƬ?&:q|vG-T۳óW;`yӁ}Ջ o4yaECw]=y 5YZ')gǨ ?!&9W7Mr,Ks%?o*HK|I:ODEzek&s[pxq {śLpYb& qN?1$742XZoMYhJu,Of<)WL [2{QpP2Y7L,1\Xi@C*@tЧPXsks81l{qYl! %1x1WGep[2޼dlEGL)p(h 3n#ⶐ@(՛w!(C4`>r: 7:b&;?N'@) $矱 pU I . ?SUŕ&2Ltɉ7p ~JK`3''!>FH3*u@ >BWŰlc2tTSS⩓|erL/|H^cMW`PJlLmԠխO:DzY6xVف8+1Tչ:/p@ !?a\4#t=@NbFecXt*@Vo q43hK03Vqf-KSV, SO(buBDݙ*+7`M)XC~^6%+ϐ(Zhctʒ Nx W*V#EҊVjydJQ{ [w?qI+)[6]AsTSY P+KO^.Qf`Ho=2{\Nw|ugV5 վaH8xsS^sZKFf|>g5lEԿQe"nj 0\LčGob[^ul&"=l^@Y5}^1rw1~b&M8T:7NH0YXluR(TQX U# \;؂ c\z49x) kjHWE5Z8u(,)ANᑷM }Pbc|*}Sb5>V]D*~A޶[Ce:ߎ D 4Wzo`p`tp[!y9Dfx|7Xȏ'<̆m/P]̗Tdf>BG )Oދ*r+k~$r-:rlorU6zOfX|Tq7? C̤˘ - ١+bElW!>j6ZZ6٩dد;(ٌmXCo I%$/dr!qgoVklp'Օ]9ٰ)Ħ/P͘73>X)滟y|mmZ1&`FQJ 'ho1FfqPֵX{ŭA]VS(p#56'|*P1wI(,tQcZG~;e`b;6ar6a;D-9\~,[4;-V}l }MqBat ܚRw\{'1awUE/Odrv5O1ۣ|4l=`@1 S@Cco" c-n/[T8"ܷו]E.ʇٰ 0 b l=AOsbDy" ņ2FZ1N .OVD ϼP xf6,l檱wm6qj#E<^!~PnXJRKTLmmLgӤ#1,$ WHRa_$WX*ָH;٦ miBڐ9]Jwa" $*yZ[BZh j{(%ViJ/ӤjjpN=6 ͥvՃRuk;PaTI;NE,đ""x6i^fЍԪm?h"Z-\%^kX{ƄxX0MC[D )14\O-kgCl&q)bE>D8upm[ybުTg^[-;:cU aljh2 S?Iw=ׄ4B,V0+;B&Aa!^q$G11b~4`Dv23 *~!K D6!Xp\n~$Z"9IԄ(hbV(ɻX)z9P]p"ǴuZkOhe4~5kܾZn*V ފ{q t27]0 7f˾؝[v tB*mٷs ` [8_ f_g}^4%xM33{ndzaFpt~2q3#XX=@ІY&xm&jHۡe֖g>; :Z\+TIfhq}dHGU 2jŤ]ueJ^.k3݌wp]mth}|m5'e.ڵJum f߽VQڡGJ}Kc };vR Wuߝ_}B}' 9WtBn{靍 XNgyt{w?N vÑOíTeB=] ٩n?.´TWFBu*mvpj RCRbf ۥ*!ĔE]u[}u+XQűDH0L}^MK FI` - I ]4d8mT}{{?]3, Ê"h'^eŀKQoz9{C/4VԖk4C+j17r>mqN )Nw+Ǩ40I 7dz K֍EæPh0/Cg@ r0/?:R~1|rX^UP \ciw˼^6l24F`J7KzC"!y;m04?T EUq[z"ꮺ*GVTs4ׅZV[d v]mˉ) )q8i$T}NB>~Bjڨ0\!WMu 1& a Ҙ๟ GE[@EӍyĽVc k`p!&Lt^LS笍(1tX<]=CeYSx L~QisY8]z.h`d?\PKw>ǒ2{I,2u>LPo.Zʒ[Rr[wK䢒4j2J#JW։q}=|hEPQ/K99VBX""Βq 'R.: 2Aʢ۬tXLtDG,:]bDǥ9;ƄGL$53wȯ; f=ڼW[O47-NʄLocb4ʉE9ux4Ak7x\=M$k,1i3ZF8BCtݍg-&=3{=`w3[pk兛۫\ nshBL0۰m"?9=ڕ6ޔ>~?{ɆP~o a̔pEbPFl|J~F%oU98Ce˸nx>w7++گ +B[o\V(B WS``mǥ19q(:x1BE+YGS}Īl>fh52mRdj齶;bB9yg~} 3Tr|3sy,&CCkD-6Ҟai6'+^Fl01T]lD0|=٫u@rTruh@KN-0.0/n0˖]VO>˖B(3,Ŀ,H趀7t@H5QTGC%ぃJ\{?j0 S-P{ʆ1ryE%S!C }kpcwme؎ECõWG/ -̽~7̂vkScؗSQԝ)W$>-3iۧ,s:?Afu=p^}'FPn Ra͒KJLtU' 0t+jyR7ufD!+"Dmsr>"(k쉖H{> r^J1%*YT>!tzV=0OՁPdb?u{}- X!20e a**ͱ _][q +ncp]o?sD) "ߑ( fzbĊJΏQ4?[c̐M҇G 랯=\Fm)&`m8bE(M= ^ޅ"x,֍OBqxI_ uvIF}Yh [(39HLkg=C/}$fOoYxh2Gm/bI/dB'}!5B|*OQԻܒkQЍEvpֶ%J4KakF8qwTn/[0> uX|l|Y[';CK]y|SUOڦ eE'P@U˒ЄZEFq`A0`YD\QfDE2)Ֆ* O} }ܛ"G8799=k>D- VVR'.VnRVȥuvIRy4$nsh9/vzr/;l]aLb@qh]G W95w8 DU!(_%hg ܛ]an=~b,o$cYMNV)R ,1WFeZ_f/2WuF1zcRh~X/X 1sM!z<1v-؁Xc1+eRzY-kxb6XkьY[NgX4xg7#)"kALRD.[CbURg7b$5sIWY3sF!BNWBqf["ˡ;AͱʼF)Jתe4)e&ƻ*5J*);QMS=pTe8nelPHY>hBB9͑.}$sET$B,Z֭jY[C[Gx='ok)ZMLBMl¸W5[Y+Y.ʑ!h_O;ScqE'7,F^i4yq7tD4l,J KwR}TZDk5yxo>:[ЧQKXXXxts& @Txz cĮ,߶ߓ8M=*1Mh;S:IN:3e" r}y9Lg(sɼ?3po3ZRP WrίLLA:A<*{қ1Dm=Yfܕ@uB_߉Mʏz7HR io.l֭Wi '[cƼ60_ՠ0RK^@"g+) 94O3<'Nx:|@$ӣ/F(5,HmoՑ|OU(:^݆Q@xh7hb)s4h6jTXm>-ۀ6bR6'\-}Űvd 2!G/$2πG_×YSsh߸lcx 8p0i'k%& tq WGE蕲:ҥ#A/y>8ǞsW"7ICQzRϑ"71, 477)J,$;Q‰ÖI_R;Cg6®~/i>Q^_ ǝ_"euP_XXJVZL/=\VٱS2xl{4}0jzs"^Dո>[Ip0)~4H YzʏX}  J@V;ߘKA;i2x[-ZOg;4N=AuP'k[鶠mZڤfy[P=%J2,X(XHR41bSYs VHGpB@OZ?-9gnyTmCw#dG(Ѷs\)2_&Z)bqaNNG~Ǧ9 1tl &k-Ch-]Z]̆a,lFyguS9}8`lNQ7,FoCg(?w! 8l"{>Rted2gAmRN.hkp³,p8gP`bXra&K3XhaIʰdO`'.DƆ䝛 K~IŒM(,3qXA[KyX- K^檰d?6cə Kð?XuK`U,Tkn% I\|w̿@EOZmN׋eX^p95 ],?.664H%lդ}׈T)5{|+IՠDmW\\Og]54/lP ~ꤧM<)9ni_9,:{O=Y9|VC5=II`*Ưg}261d @+O`\Gc^!J.$iMZ0qc>x$`\Z+W5zn;wl$y8'p6'ʢh" rh(*bZcr❩WU>GݙJ<زv4 E$ ԞLY1iJ~9"- q7t/{f1}'WS#RWRZ,C^ uZN>0a4V@$dkU$ CN$+YͫPLZ ôh%~vWx09 %k3f( K%:ZdJЄ؞E{jZ:ÔaU~E7w -`%/LDb PpUH)w5.U"'('~̿:>ihD9wſcSIdH+ TC% ?Jv"bT;n wX(0{z{6n>[B$.oM>%`úv׼5`!$77Pz"Eel"saU=BCT,Fz>*T-LEYsT3˅F 5c_}<]Eq:@MFg& DNLBo^+)7gڈ@wW"N?>."Hg:kid¾[ӶcE,,eZՕw$eAتCږU,5w bRbJ-R*wQ͓.[V>NG;맔ey_τ oRP ǠvksG8j _zcXB1z pG.H6bl~5_w-GbmhjAБLgD:2"ЈiYFCXNO҄IEqA櫀 rc#k{DO?{)CRy-Zʜ_EP >7'[k9a^C%wA%tz˻sY|^CyJIffI`նvRH zD׆u(sun觛p4dPV^ܔDxfw" $trsz cؕ6SDƥ U%`$0]S$AYkvԃbݙO7k@V2lR(-KaB=U;kESP?>y&&XCyg/34y+|Yx' ,wa0g$B(-to_=2 j{% <|YM>oGcV"&% zjl`Ɋ>f×&̄LĆL#:m; {$ i[rQ@_kT4I i@ZbdMTZ_(^&ZB!-43:/7<:^enZzZ. A, m*9'iq $^{^{a:Edvc\F* EcC|/0)w`0-r%U:P;܁1iȓ\)y$Ȭ nBg /껓d }w>@Gev?^yu=] @]]߾|?f]gݖx#FN۱=Wt Iv?> ' Ip-I{.K,h~k$D8G4kH2g;ĹL^-[|!"$'2iUGppSqOX쮈'L]) Q\4]1"ߟ%SG.2"gb7dԾM"n+SC_^h&>אۇWc= eV6(2kŕQ "-Y Sk3tw%X) n]g3 +ۼ4*ƵnC@λ3ÛY ͒eryx>bk.:c.:k;LZ>JD;3ùE3T(XӥCpkCDCt\X__:A"gM:HHG:!uY3kHAWFOgosWI0s'3 ^rI# 0]QI=+O®`dsX+ҙ,+elۤyPױܢ3FWY cY&^ 34FyQPL0٤ #-ވiqz (P%A&{\Uŧ;i8ALŖ}^#:ZYPzKv!RǶ0f p@yFop%mftIhܝT%-e 3`U WIE&eE\XMJb8y czҫM:p4Ρ`au쌴7TT%;gŒg I:פCeodFO2\(j* l+j^Ks4`iGQ5v259AL†bf~ M7daD ͤ E)9B1) 9{N*apɝ|v' kS{pA|eBժvۚB+6#%%jzMգa ߒnHRq^B}cmlgfGis /q9^|:1S>>xH\ "gဂ^b -i i+%>`ejDxG,R|:ngՊIF6T4:[ .,Kd _h` 8:[T,]qɲ~{x;_&0, k׺ddZxܜT<~}|fS':d"v//|ǟ|fz1f-v'{1! (_wjkԀ4ĩҲX4qviCU<PdA4`T{yaWO!< ]\hxZ%絙izb V2yET. 3Nި3v`"W8-hE!ƈDU,z@ CL(֌J}BA\|!-N7SxD=mm6nbz )~17@sƼdž2%Ky8[E2Q"/ݿ- wm-yB)ѽN80:%rk-!qڌ#xwY'Y l rٛ}):oe%wV#vn˻iK:X UK$Q\i0J(ŎWh;AS$t!v|=y+Ya~Z2m#oO!/XLv2wJ̅^t; [yEo,:[1̌|<=1E$iq]6o@kbPKz!/䌸RAFT{qaNe :?! 7&f&&8wM4{(Ơ]%2f 6w[%+0(?3u_0ri)PDЪVT(V<ٵY3.o 60Z@{-f$uW#5sIˉ3nR ҤҜ씆ƒ fCj)Y-hrsbj*UcsH0ˇd yWI m^"~qt,!\b[ b[u J^:ys!$X lb=<IRb3 u.\u2sꬃ&CY[viə=a`4Doԗ+7 (nN̔j7'D&R"٘+ XX<r;+lہ. xX7Vo#oywYtu,Q5s``f U zFfAHI?ڤb&9K.`:rH(ɧK`08#Ld-QΗ3:Qdem0DN2HGԧξBm: A|D\4tshCE\^1L eF!p,B4Z4D]C% Pڰz FW!yn`?URbAc>e#6n ^[pJt-D> vCqFBm+~O.Ҷ6لD$TTcbCU5՜7-a& Ce#3!"-!#fpE@KӒ`ƴy |mvK ;[(|'l 8ɲ?6HV]n衏n e!gܿ]IcĿæPLom LOv=6yq^QgYԥk&w Va8꣘E,LǶ`tҋ\$.:1e|'`3Jg&=YL-%UO_GST:Sz z61ՔwRDIcVϳ$$֌:uba KhKh I1Ѽ{[<k"|ZWo&b~> JtN*@yR Smq b"ƃds7`'//ײmڮ@}4G݅wfĨL{ T% o罓݁A[]=yO/ޤK}ƳdcU it^7|>0_sLu"/QLWzwD9ߧ$)Yvңatb 0=|+GG(\t qiI \pq"㭮pwn#WiWX*TwǎxV$eX$A_k^Sˤۮ˅ ;{pMA@3D\~Zspa3;J=GߓDYV\>9l6o}pw^nc5;Ҽ)pJfWAF-Q"§TQdt C1WHrxr}]L(u59<¡.3%akmre"+ڕІWAلjPuIpD4M~vP4b3ۃgeD)RB3VaFHT{@rY=\y}Cv}_@;%FW62>as0} 73ڗ7=cl̲> ödʄ[RÖz'I z˂Σ%o 2#} 7@KƸ!0bm0.lׯ ݼ.ۅm>tp_5!e w 6Cr]~0w?sjہ K\! fqx"aꝏ̲3-cYN` [JA=@z<+e388WP@\0j/yiz:/WHq0`/5_ I *뼞,^2\`9f1q3x^v$W[]2'Hosbko$L umY)GBTtnK$ >sLhvv.B$Ҧ%R'"qAGzHCIԘ#8Bs/^N4}ހWS% /@S' \2^_`8rCJ\WG=Mkԑ%1!%|hH*LY.XфޗȮ0 ,)o`/L4Hr=aKˆ!WK5K?V?3 K _pH-Y V0o22I{1#-ƥćY? y_*Yᕰm$_vŀ?U+skPV0cru>"!{lxRT=8 i u1">T*@fjhr/Kgc&vmZ=b|+i2fBcߧ&@m_^ǣ#Iw0;<@s2yg-HN'Lٱ: k+r`pQINwyȧ##w I~qVT5j@uZn__s+B/qUy'hq;{E3'@TӥK=t ~uq/eI:K,턤*hμH{EZksN*4yC\''mru2g$i6'R.Ø2};(h4#@;Rjkz\yk-,lddCh1 4߀SP◙ekoJ 'ZA6fg;+d^^;y^] um$94~UQv񹿑 ze '9U "))qأ)F@8ӧ`zyo8wuW%t&Cs.@/`46} aL:=8xU{MYbWK/ƪ!7zNbzMjI: ckͰ.>#MD hHeXx-0B=i\eSgӓ R1O^j` TrHs̺E}VtJ,fݾ%U?E^q_vn#;!,余…4sx>mF"{J65lP9S 3_Qxj; > Lkfi?/³z?.}+Z|NM)v@Z!MHO7\v+=P @"kmԯiPn3g_g MtZ\phyZ;Ŕ!-4Tg~&>yMBkfH/d@+Tn@CyI:}^~A!BUkٮ8 ՆB kgݠ?{,S)=MԞx BO|(W:O;}>tĠd!fwuDR,Tfg*)lTAڋڿ tPڋBhGD{A&Lf)G&¦3jO<}C:PvM}{<]5囮CtC\2h MƇqm6.\EX K&9j^5ězx5]Lao]9(.Puv[]uˈ.tW\Fk[6$C7o,u&e[E8BBB*Zk;{(so͌Utm\0XXd 'lBs|Ohc!h46!YfMڼ&[! > VIoYnv%pݽ*U]q"=vB ?ߓ̀, ӳP4dhvD$7_t0cyɒ9uw:Pޗo<,mt96cG!r_ $Klx%evA(x ZzU_3aHCgLR)F3E$AZ:#T$XYQIZ[,"sd;3ǧf[qyqTK-W(W6ՏzZӷ<|uV7x}*LRxWzEN6!v96࿥^)գӭo,gэ- tC?[k!j* ;ubغ}fغ[wx-9-5nry3_OwI:*Kfҽ?BI?VD!ozP}C:od\PN1-:֊Y(rh\iFWuo6A%(2 0ҡw:t+(>wt,(\:OuU 5]D-i3ٴSLu_1=6?Cf?%.O}D1bkc'֑W5u+Fp3ݏFi+1AfO*1^cg<6Zj#? nm۴ FF n'\=6o}5MNlyۇtM!q~77kng.ӄےu 3;.:m 'uܳ7-n~Vq+k9MmOܢCp;Sq<}u<۴!9E=8p{ȵ nS[nGI n 5XnDC'o ǂ-Y[ ͱ6(mQ5 n߭nVs^Pq6piۥs6 Ttfq+ob:m7?7n zz˫!ɧWw37l-n UO# WpgTܞoY42nmoun/5nmGmS[C#vHn#mO*ng ܖNVpsR[i;oin]nUncnbe-qRpqm67y/n&)Mip 蔊nn[kvp{p{#2nx!ֳ;%!M[97'ܸܚۿ,ngno lAn%  ~5 52nw(%!ɷth nULTpk8;p}Y/ 5AW'ά`?p9$gەz_+[qӍ6MSgU'n2v^8[&:CA6p۔p 2n7_p[= ovNPG '*;`nUbnjn'q;ۀZ­&「<7p"{M:~#eۃw~Pq{/pS̡}vL葛-A>uvp[fݿ6f˭6I~=bм3*nfnە*nSs=, X_n-gW3Zeܦ.WpH$ۗwm߫HMPp+k BpM+o1q{`Yn n12(L!jnpX#=vZ|:a7Q[|unR۽n oϢ 0@%IF^!GQ >*{)i Z>P -up򆏋{Ϝ3̌>:~3{֔9a?|V(a32 ~c{-蕋vP?է (wRE f_[pt܌b@ lc㮁Tx;QpEY B,@zI\ϴn|Mlo+`{^fƯ=ڄ[H9ɔB>WjEޛ5E)-]o(F>LZk};NUq穴#Bj2h0t+yWW_{`2M lPMh1Ucp+ S qM ze)rJmiUgWqqa}cp,2aWKqdW(#sJaCxJ&ae*(d`*јk1q._w2MaLUR > ;ߞCfMrϗj4 '_T_W[_|?5x{7=_/IW/mW>ߧU =5z}\bG6WlJLMTA-Ӵ"eY1K oX'Q{T6Kr2|u|Mz!vt~;Jv/M,k2--|fOh/(*ğLEd\aV\[$[v%[iޗ?Dy6Qk NB@"֬VE/+PxП;!\_[PƄG i,-D1 1V ~ޗaP)63@0'T-&m0 )&-?2O(XG ELYRki; ol'mBP,bd@΃Xc06>I3QY6?@Bso;gMzp,ZrDf&+*[v`/(ܙo]'}DS8u [c "lՖ ,:V'ZxI1hK-aMMD`Zy3Xʫ4wk(y%ȉrc=N@(w;{ 9w wqeT>Ѹ=ݟH@lv Z@%+Y-]3 Mo.|mNɃo ʩ#ξV|hE1N1>p)3ȹmxp^9xve#F/*=|34Xg'4š/"a5 R"Rȓo7ܝYUDrAᮍCw6zwSli;jqO[QS\mH(4F4Be1rG<_a#pMtM-HM(laf>~j. /vT6!!C>zvc=MëldtrdUeBMkCϪ-MaܽAЦmD6Œ&Lkhktn[ mMπ|2 >@=/^!sᖇG r//0s0ww/k P-+|(Om>no. a-0. OT`)Bk[VGC.Sc<=|21X 1N;~0>al Q8*">S2dpwQ{i*h=C߅%d'I*Q%"ŒT<hlUsC^z0<\"v$wry侀%lp: KPÝ#èGEc0`⑗#y# -sZםGRydފ RI>S ՚jGɑJa~ yFU7B<^ 6ǤQu3uDcPJXT[B!O5"QQXǍUoZKnU3u?^CyCW2v~wu9 %W/YQ]gcY aӽښpYfJR<[d\C/uL}ʹ~., 謝Ժ8O&?{e m MdܪT;m8(sA05czt^j,.uqUS0;]ŒKh/\ck̍1;;l2JmF+,QMd&KSj*sa=0S[~+6j*$?56RjM- YӞזl"WȪR0v=MfXc+` «XښI*baIxbq+!;ߏ=t{!Dm=Url^fщ߿ w>n "cF ?4Mi _ZLbFWjҿčY`V(kGߺ^qQ'Vs?}|~|r$>?ݟ<>]|^Rݡ+{]!>o'竒ab_wH2y|1G|~Ge :m|~0?r|^M|s|-,lrϧґ|+<*GdyZ|m7\[.>\.>ߘ)>Op|zܾ{_s|CQg5&m?+>?rH_'~@<~<>ix:.@JbNU*݋5lBV]X8 %hԌSRr\mQ 0%I-ɦ1JB~ñPa8%^oǬA:^}AآZԙ쾋ͩls|u[AtÔ?B~>qg}'^3DLv*mWo?lTGa݀`>T@H2FۃGA #HDG.83~5AS8HB''C"k O7 J|.:vUooM+/x+: WGK\WS//߸zp ?U W_w:\-6|mxƔWW0BrH_~8-x>VGd(3` ^IAJ^/˯*>Ӡ}gd27rpG&z 2z$`rz$Hqn7Zߖ62 :d]OeU.eFrY˹հP4e',itkojrV]}`Ľԅ9/A 9#ƱT 2P,<X?,y3RBgV!܋N'Sp@XT gffpYrYkV!\T n,U W#[+GJNv0KK2Yʔy7)Ӌ-MqX`R(L[\(.kJKK`/I&2b6f0$k7e!$jvnl/- oֵ@z10=o%2$# rQTLK0ø+]c*%n+#"Ww-9pt_N0b _}frq|s~ELiSm1Sz Whv1H*+`1.u+ p3ֺ1Ьkr* m wmoLչӇcS'ѾJrMMIT֡ET־ELV9u ъ(Zf)>ur5nӖ&;iX1T\gBYe7\rR*L)ՋI3-R RD9X/ .a<˕YȔ.GW``!ӉV&e#D mL;_xߛ(~%;83x?DY/y¯3qQ{)l3!$E~RDO3Y7sY1\fߥmR$- K92x,Bx OS juu:y;Zj=v!zBui={)Z`10kNn%(Sdf2o2CKt}oKfuJ y֤ e `~ ߢ$=AJun n n{n˗ NoHsY2Y;.%9>r}"qq`<ǧtwї2Ҷ'44AIrSu|A֬)$n#p=hG-b۩ZOO0iEviT S *UZÔJbJ?5 Dt\&JeX\M*jcfhKebal1Tv#UG=wΓ\C:3K-x-p~*e}5Ɋ*AOPhQb;vJ;!N1;!ΚE2b YBoC)Cpclsf08e FC{\]bm"FE1 l0e6_s'_lf {d^ "؈ 6blVebwrJe)My )ZT1F3fZ3S=>,}^ˢs]b̆瘬'b01s".]nb4y'e@ӎm D?0&*>(r =(%SQLfeNf+.9nctilASrK d \쥎D~$-B)4-RK҂efw߻L D`z,u&27QGnqc:SK DWD"zTQ #)I#ү{ڻ=e@卬.1Q݌G7Z!)#fBcRS("ʧDY[EY[6c pr% /9هqbq]|JKV22i!)9yk.\2No5G*^Ⱥ6\fShoSc}B덌7=C?0X?x!0NC#{b}jPU/'o&ѡ%ѿT}]u/뗪+֏W]GBF7?'֟pX?Z~ty/^QkXc5b=敔/-Q">ty9m}yJ[JXAMV0uօY{,fǩm/Ș&Ֆ`Fgd^#{isʭ@vu3[0X# +fL* fā1c<7R.D?3I3Q jy]}mX-]'5R^@Nm->>B件'@U,7`wKl9NvҟCGFNFLž̻ يMs[=0Tx傷™58ad#v20 c#k^rDZ=lH5O픊=#>3OXxGK>ݝ5‚֎&!ur)W4#P_._-(p 6-!eua h2 YMI$Gjf<6;![o["rIes>  >EFhiA 15O‚ ߬?Eddؓj4)=>`O^=ml=yO=%i?Ӟ/'٭=q:Ɩ]G=8^o9|^klyml|{٤̓VoYuI[ﯱZIp(;Yo-dׂ>hXNSV#=DyZ*/ەp&;y{yA{:Ҽ2;+kse;8kdhjg wo~ *ld4/p݋q%?/Z 〱~|-MÌlD6nKQ:TPY=3/ 6sW10X#Z14ڌ8޺qg,=(B[l`'DBңkس{ep_@+񕺱4kS\;0 uJkխLop Ɇ zG +?e(x0 ;wb4@V`P,oh>SM#rUTيiՙ6wCs +'V U(V`~}dqZ_lo]aI@/^# Zrb?EGgvdJF,42ae_eOIe=D/k,%;lJ̞_޷Wll?nֆq{eϢY!"n^>$4v nqJ] ӏpX[ m͖CpX887cgLp{vm"q9qphy/.mCmICD2egִ\-"M^Jyp^q[&-\Hp{p!ͬq[v:4 n %O`qJ3(IZ_.eN.3A&| =If|Df-!|BM/͔ 91n_yWpS, mQ3mbۋ~.b۩8 'q"n1x ߉ ܾ] eIt "noV  n ,[?n78 v5a0Xϳ0n_Ćv~?KVtDm#2ܞB6YDplLn-¸}CϿΧ_Sލq{i1ᖕFV[n6㰈۬2ͳT!|oeS~}}k 8Ew^Gsb"Â$uK0 $R)LǷצkq>7Γ^:@yol _sd|L_gq\o|mu.]v:#=7fNObbo4u8 ͱ8wi: I@|\O:ąC96/.uY*[u&C8nYx8ݫ~_{JSkDkJ6}tb+@D`N:Kv7_DOnM*Fx4":ޱ;p94p^‹]ÔKPrJ-n^¼SdHzEap4õ|H[!v"">62$|P@h!4ɐ4Y=$MnVɅ2Z[Z $Xvx~.[S;zL *\/'"K_+ 9]IJ`iu&!IwKEdѺY1;:'(z._9;ph{%RUzByf W8$"> WKoEb{A[UoU/³~¼: '5 EюR}*I+K1ΥϓXXܿJ>niqvDP)bIiXڿJ^_#)YTl{TN+DƩ ^&쯂«}*yr Z7 [#5uNbyoYg+1۲g{k7CK]{xSU?M7p;(JLPBshJבEi"jZis9kEQ+ohڡ-h E)zY/zow(18i F<s~32+1b)*=ad&5S!+g;̚4bg'ح1FSP‘/zZ٭> %*IZnR* JkeK>\uÅ8gS|s`2 wpEÅKa$N|ؿkVN&<΄^5Iڸ||wC|]nja6Uvbi/\Ch<8GvcF fkǘx zhhmt?Ƥ{g#n#w"ùIv'$YKOdsFf"AFk$[$&qŭp5YaX9$lK*51Q Cnr g (hX>.ITpz;ɞe6Bq {s9{#8{?؛7n:^'jVQ3ZWrZ-Fi]ⴺ$h'տ!*nVM \?ƑOdy<*AF@Ղi+\u1qj\j\$]! Fk$k"-Phv(t+nG7EjtB°?8`@)jqEjؾW!оFg:$SQŦIJJ:YxB;Mi b,P=%Rnv ,4Ț4hQ_"88R_TzrgD-ۦqH‰=;1VmV^+Mc*hн0ҧ+ JSm{7)~+ fDDL9ۗ]FeaoVZ S8څ !AJ_?MO>UR!VSH{tpݭ py*e˺݄g+3XN=4xhDhQV7NM1ߤ px[eD+&!S0pq<<0 IIA~3|A& yVVe`12†+ǕRlHZ|l< ז>ǡy(uFvPa%LX0&A. B&A ZA M q3ҳ]9x@hϺ 5,4zy|7w 8Wf*Ӟr+9";:"8S EKʀ^HЖVi'HO#42V3S-`4bciFhj_[Tsa U|>:bsx$ =_D=k 2wAZ(W^{MBBΓ|PLh_A6 :Rwfuc]4'fތUF-rߢ,yUiתlpWL!:7.llleQac]V8 L(2y0 2_wŧz@KcDj(?=τzEsI@{]'"/EIO73ϷV'DE_`EWegŇ5V=VpJR2 ͎'LJ  |=i7$SYɃ:ģ@mC̢)`r$I"bW2"zu"q 8>]Z 8D "aC8w@t34-vkDF-?q 8yh:" $6*j08_ĔEbCq-KEU/.s Ch(wbaP L!ʔlq5^:Є[6ۄ S~C@2t㈩4@@t06 Ye`ҍE> 7tݢ2XwMo I82~bXA.\b@O7wS^nL?{?FHGɭeEw|7.+W{](`6PbUgb3Wc)jnŭy\Vvö:RKo>fafa! {Ȱ,W_=\=1?6 jP6FjArwo( 4pv4_)؏^٫KƮ +y'`W%`fd6ؼGV˿Fο>RsT!dwSYvqKRiy:k0F xc:G@Xxfn[1Ju(-AML-xjp+hF1XqV=V\M OΏ34:m6K+Ot]W?k0m$e`pXV4pYᡬp"tziSLk6iPMJa5<BS29G5ɱ:`Q;DtqdeKbQ&֥T5ʒuG`{q lw8I6ٓElp !fRcV}hFdw68GCW buB3ؙ쨪L̅0C6խNIa&"[H Y!L.uϛ> /௎09|ubyg4,ݙtoڜѵbg-.cIضv0=.*j0vk*ܢ{alooڎ8T i T9ZQk*|la66NL@[E&-LGaǣTT˿ལbVL X=uWPRoecT7~(uYً6mSZ0fze~3:x^AVX-RUq3A@ņ⫁_2e_y+9eAheb@3P$L˲粼0!#i]f,W"lz4MIcC2B4s9->WSbE0͋r^,?wZڗ$m_`S7voic7v@L/]gY F'{蚀fyOco?~Ws=+<m|N _m_dfWL(﬑gO~C`9u䇀hR0$4ٹ3s\!7@ n']lT#۟yjHs\X`qV%b(87\rfՉh6vt3z;n*ؒj?O2 x16N@b7v4 MXT>ixLZ/::-,c_k n2'n6f̶5BgFKf[2v{l #톄~fkU̖*Xl\Ŭ7 #>oĬcsp&x)]MAv yej5ܡ~6k f6k&5tӱA;}Bl,E;uV fl8tF/Nܛ9{9[>ةWʙ@H^NC ]xI,?b`k',Hڂ"4ꐺcTii?%,(ݫ)0ƹ/F+_Rc.{\n a(TWWa>pxxPޮ>&Vqĩ,qBq]F M'KĬ08~4@6{:KAr1aw#KRc珵vm˹b{ؑoWz=W(|4-H)_;p Tv8Mv4-NڻXu}㾧W 9᪘фv7&+3נ`AZ$%0Yr`9uԉX Z4-ҁŬ/oJ^SQF>.,9WV '$k3h㊇9r'~`-ر#ڣ|w;i JH HDB4` KCG#Qa  "H$NclTEg\p< T2 To $@jUݝ=zHֽnݺ_\N*8[2{RT#0rA-\A3۠'@?%Id}Yce8zHm$ 4_`(h\΀ sD(c)H LԄztep$APx[{yx TvGYkwKwzȆYKߩwd_!#J:MdCn|: y W/=2nDԂmiW=y6ƴE `{nFzz(嚒ox1ή 8\?!ȞԹs܋Z^xv{ogui\t_sq)B?.vLHQ?qF< eE<*mG`~)C;hpw:!փLdZF0<(y 'Yp`rd@nFُ$ v`ƹ$} fZ0v$oSu5NŒ!A@is=N Vxl L z_G' 5qK>:, ʼ$^Ks}K ⡐(F*z0ENQRK ZZў64j뒶xO=|tEgO+6N;t݈y @.>k1AlcΗL&k16[wQ{10. -7ȐW a?ZYgz: FcDH1y;ǹd-T=7'%d`Ai)A"nV ڰoY/&DV*_}ЍtqED7H^q̫,DcEh%< 7ru+n竘sS#6F!*?~G$]#ks*xH'AnD mZQFDI׍(t3C1̥F %#^mD4Q^ҷ*Q6AM݈&JI#5'ekhB諫ӣHkȏ|.I GuGɏ,bLMPZfџN?z?Sѽժ(Kuc^d4!Ud$7r.D|GyRG;qj 6B X-S93Zjl<  Un{$ H$c$IIܩ$ C$a[m_HT"ǫVc$#*Ē>D@+ʒt,iPXRe%M "KjTuI*4 #%HӺѤsaT}mC[r8ɩM-}5 po"#*{b5Rc(%P>I3CRQ_$iuB0H{#IQ3D0F-(#.BjFP@YҴ2t nZlaԕ 0P>\D7#ڀbӓ20 kЬ,IxW?Y&]ov8['lbM۹KNy':;$/ӏ1'0{uOe/.g3`f{7?Y?c<=gwNvϳ+J q'mIFּwEWYX@"?R= ɚo.r[t;?I;W wNh'V|/~UBBu8܀ӝ2'Xc+LQJv0ȋC8GЩٱJ\n%<C5<|6һv'GC&mo xh3 F)ՔOĤ^nQ6H9㮃Q~Z֏ұl+Nbc) @(:=>@ 7"r lZ6>K+M E=c@[\ :ZCQtHTd,le %-+%d)X2(h\C岞]$)/Uɑcċ|aME+Cibi0iP&GE`K`ac6l.Efѡ›#&6aF賘i- aN/ф@"`O%:cs|Mz]dwl%-=V<zug 3fjWwHICz&\ zz衭_i~>Gˑ7|CK ɬYYƀ8FKڱ-v4}]4>W#wPqo8U'r&u5u|b]`,lk4P4,U،BJh`KVh4[KQVvйQ}|xڧ^􅿧/+;w?:ҡpPsvl?@ >0[ˆKF ⰶ8atJpJygEv7 TGFw O &gSeTWnKcm-  E)>x`0%6v>)'> ]E9 ߣRPN?K']ػN:,Wtaro:}Ğ֧Qt:#III\NeNZI]:N:?C's\̛bD7pRPN1OȘ@Lv  //ؘ x4Tl]28& AupLPupO|+__OFUrTOW"57t5hFj@R~ocFt|߽1W.鿾:O}Hk篨~g髯K_u5D꫏WFoꫩ+~(WWKb꓆k뫿ن諏>}uԾ.꩖k^"-a}uXOW_W"9~Cs~z<e!}uS!}5:U95IFNHˋx 8|=)&>l'wSל:8 <>|$ ٝRyXBŨ&_)qp~?@fah#("F56 U¸m{emN/6`8'eLID[qy!e %?X'若vK. 4Otn{Ih\@C4o)آi7)!(vS&jL#93;G6K󩤯ij$|vё!M$5mk _|QO]oov\jԭ;yvǔq[2:b$PvoL=p}ˡ-"ȩ)<:ұw' fy^,-5B,[,oiܗ)+1Mty_[I w.pIPѰ^r\gea3E}jF WYj.lz\Ȧ =>fwxzcel~.;Gtqy:YRM݇ M05Ѳcl T@`#" QfM6G?Fn*=PGV+'< zZ~* G5j2lg46\*ixDpc?!׵@KB3`t8bЀ롎5)"4OGbfvQ\ _YX+=ƂpGmWwq4*@0H.Z\'@7ShP7b\l(0r wLql\{&Cb#JtW7uq$׀ M@7ڮT,??T+6I b[lLKM 0i:  M :IPlAxH'==ISxڻ޽#b9\[Xv,+gENַfCxkYںM6>5ul֐(ʲ8aEcLo!I}XCl\죜t^\\8rnҩ[+ͺws5K܅x<_MgY QB>l$k^ xq?܏4$SV5OX ;8OQ@ Ow<`D:L.g\0} c. OBz5?ZUɾmacIpҾ25!=/f9 IͼxͬШ[6~_)j5FUP/,{-<vrmgt_[*`^+D ːN/5Q6DU?Ok+"F>O MQAE5GH"YBüYI6E{WI=6OyL[q: :ư.:t*)/$=c{ xǬ2Eb*C.4EvKܗs#lC= hF(WhNQ͏g eWgF*sD((R['GTK3j7}[T,S ݪJ;EBxKx3Ēl?KdJ5/ )*A64r>8#F;Ǝ/qY}Xw.ͻezOHB^eef4kh<=00T["'lYN4i{l[ D5,:m_A[c4Z}vo+b_DP_:Ҝ_lj o:tL¾n{ء/BPbB%._8e[DER5V)4/O>A5Ñ`Owl9>!$}pm >m94/2oןMuy fd iu5 C@6MP]̂H< GWH O3* 6PaTpɆ/6O|!s1W?~Vhm_0^~`1H9MR^dh,`L|>ʞy49rZLqna]@i+g_{wGRqR7-Ic4ݘpu:xcj: 1%#@[,M]*I"(xCX%JI(Y6Jy:O׹vywଢ଼"*?W|1% :],N H!O<]+% nɃGDD}B xt7 9hsZțkdk GvōZk09MB6HFA&1 voȿS/D#%4 ?(r{@>&ZFU^FJf ďiB@a_CKiXǺGCp 1HHI(!n& mA0l#wTDD@@4[4Fs]151.prSH{as17/5 ik#9Aܰ/m|TO̖2`yn$Rjn(fsQ1ȘE`9ݼk>1g|'57{{ْݼ%ȘDh9u9-sfK9m+95D挥XbIj-E>戅kK"sݴ#Ϳ/%f/j͡E柗sK#Df{ٍ|=gʘwQ]\ln91+5#Df/v7+y6n!Jbn:'5{n"LvDb1ڝ\lޗDOJ3Ef/y.y*b^*cϢ,jnZlj fyknffIɼUy n'1Z86qN&6k9lGʨ-VBl9g6oMn؆P[I4mc*՜ڢE1추4b.c.g%!R[@[V%x(ٶ$غتKm5-ve2W>ɣOͅ1LZVpßu\mxJk:,_Og~Jz)-jq$ڹ6HUd{ݶu#]Gm;̶ R[6ݖSۉf[bԖ,Me y2D:fAƶmۺRhvB!lK$9:xub+cc/g"Kmm2-u'N=J&uh?7'üq鼑Wcҩ?ãpsLv1ٖC?mY(ٖK?تm5(~9"ylm6LVGmd<,El.춬b&c>J۝jms."ۀ\zz}8QDlV2Զݶز6Om>bR%:~M+aZ>u*!R:uʡ uzWJ7mK ~b+RjӈlmEU[6UaۥC"aYKomNrkb'wQw_gs#͍{,4ܱI7 [,ԆNFwѶ/ Hꀪ:̗?˽ ..k.+ZKA|+5tti3qFto)~3 ICf1@cpEB;6q9Zhl?egl폨\}1NFdЊ54>t:Ϭ Ki4~OL_͵A 4>__مP'YgIgo7lŧV *xx wS㡠BŶ V ŶQlPlPG(oZN\5#%F?ʡXS9Y^PB(V,* p?z{|N;Es:{[nG(Sh;4XB!_Zؗ Bnh06z.o7t_: =}`#E)J^4PuIt&I#1ǧ`C0LgTS$Zk$iE?V\#eMn&OῈMB*K`;nU>H`Tv *'ՎeTn݌, #UKWQ,maR*]6D^T-RUѯJ /n$LA](^b _ ?4;'FƢmj͎XzbmQR6ƴ'?bWf3j%xL I[(Jg DmmB,u?1;m6 Wa@v̆=[4 -@ZAX+JjtЮ?'yx~Cލ;W/Kwlj։i}6ø)m1^_TDxE1rZ|Y$:ipͮ? n_Wapk'\*Ѹ![&^ W.`4N2kǽؙ~B<%ɻurhaǣ̸㳽e/0ܥvXjƎ4ڞްFq;иJpYcF~vrvB/Hh;ivlvBh .@S!GD;Փ8fԞI*6pFxGy5:>p9: t>n^y9^_k`/3~ۇs`?W'W e0q qTҎrݤ.HB;=o5rGbǯqF@i&8; qܑ]9fAIcHQ&[+1<>jxȿǎh+tϴ^1t&{=;w嶭 9]INa_3q\uEK| 99aGvi2q짩L 9: 9ݹm5v 4h8KSv3iWQ;7vjn> 9ܑ#˝DqqLKݑ#(8~?Asx΁9a, kiſݺz_O:X랗n'ɞ3 (P^"`"p 0X<>|*@588q^m\` $h8 ~>` x h7<`*S5AXus׀]1 f`54`<0,|T| hu`0X6=%0++j`0  Z}^+eB`.0^X)o o`_`60U' 0`t0a?h@0xx  `T ݡ^ C1`:hgMz-xg! T ;t`&p_h |G-3%LwQl1O/g0y!ޔMN_@)UiïvpT}y(}S͞oOG|rP5/}Wwt5'!\!>b/ UsUNѿx'.v*gM. N)UC a[ħ|]ppQbb,F^/L*TGUwxtЯu&JunŬ)}1 G!P^/3g,˽^-w4lmټ6sG {̭[è!s\9z%۽ٮӫg9.?0aT/WKnLs|gu -_PMѥ#zT;mٶ-Y}EOTY;9ӧ+aQ!~v獈ӟ8%nvk΃v1qd䶋UAQ N2_UriZ|.|4#>])Nok^*8C>]JOgww^jgn|&W *4Юٓqkq|8_t8_s?gzӧm˅omtxش lƴ߉4v*'_5`- z>Wb^ !G>@|ǀc@a_ XH~BU1f?&r.1DxL!?)>մܐȒRr,_xvr]@;G=KӅ‚5zmJ@RFDNX^WjBy kCze&DkV|}LsG4~zNx&||m8H4@Sjz&( eh=tڀ\vNŕU䳶Eh~\h #\é3ׯx|/ŋk;OC:h= Ŋ3DxJ PFD*5O}jf֐;ta舐;~1:r>W8(4"2 /{hCt1J}_(NԛV,({M  kz ruotpF9'jaN"sh^sB'jDOig843[:M[ڦS:a ,p3͂ iƚBq eaX *JQE5*hԨQFE5h,XdrNr=3ɻ8s~9.g>Xt]k1.=e_tɡn}#+d#٧c-2:?axa2iMGh²UJi_scՠytn\;׊s^s|u{mַ^ }{kpCJ.Vj~.528YYoJ\K3Bo'%gQq7`]sa]- xu3o;E ;>s}1ت6hP+Xk႙T,E^.P?UkkzۗD[S(@ashǩbB9NN8yq6.9W+-r# 55B[m-:3zMfqFM7+Ѽư<6)iY`hKWhWYֆmfIWbyLy37cy3zK~$O{pyGcx^ϧ+ݜ?/#@Gp,⌋ƹ޻H~'>w?ڵ.mVؿK*ˍ6GֲVBbk]l?n,sLԛWzTsV ϣ4 jpNxgb[ku{x0M2o(HGϮ7y"ֽyS\yh]z-Jd=rR⽁1w 2>&`r% (p4g9\1' % ϡ\<:t{8 ڟ&Moȕ&I\4:Gp0_nncncnkY0~c1ݥ9==߽BNfJp|Ӝ1'jp'O =ᵯ:\PE҅$Myy5t7vL=f'pz yUo)3>3g?Ny222?sO.op//K./o"K.+o8[O|/9_纗"_Ͻr"@9r19@ 2orBO,kÊWEė!˞$/iR#>%ry疐KKHިIUoCw{R;B/wa~˨~NWtHFԎ#oH'W坹]]W ss2|jQ]P&JYs;!I_pMKW_!Z!7`7ARWR.}(w\^41zҼ._*m|nI,(JykEy:e4<({2jWZ^bN5NZz).e໶NmW/j k7kE;^PZP~FW`k{}UjڙZujYf}ot麚5jѧ{]tE.\yEWS}^j7 jvܠfgd6F5; 촾@N{ ZZimiPNG tN5mk=^]Q󐚼 wU/HLϧwHM/Er"_^.WT{e,86ц濜5]+ߔ̧?8yU?u-Wqge&~'h_1Ѽh9?A^A^n=!$z>ykH~:oG|~wLO|p3׳=w'F%zDG;. h;ψf#_"5~d/"!Dz??xQ} /~ vo@}oAo 6a'}D/D_G\n70It;Et鍟="v-';<:x#G<߇&ƦiQo9 Iq\+ Mʿn=v{֑ܼr !3-Dlԫ|~/Dt$ۻo|hÎQ~?_ez{.C#?Ȏ*]@CqlkqC;tLn뵯<f}MZkBqc]ޝ)N˫Ъ:Wk37+l }zK ؿzmvbH o["b )|<=gD$mZQ*Ֆ^+ڵeM_ɦw9ݿ04]fg:T=un[2_}wہs=o( ؆l-s/Bcǁ9v;H?d_l2[}ng? jߵ:K,?/8_?6Y6lUtݦl__cƿ2*\  8| pxZ^?৸gov7? x?a1 ǁ~X~x x7pp-p;ޞwK=ڋt<,p**&EK^ w5$E{? p+p7q>|#I1rlw<hj^o"[=1WoxO{s^ag{?t]]W߾x Hhx?;Er3n/"ϸ>Ǜ^~Eoo?ҟ=ޞK_}n+yl:HI"l5Vg9]8yφGR:Qz0qzԈQws"֡i/5Zl7~<獶&v6ӭRe,5%ˊ%"p4bn9{OxAosHö 'ZؙSIRYY}kv_437e遐n`GLӂMYE/f!g;~}Yl3;>%h=W6 L뭧n$V9yV,u0Ot(gcN`VoPo`bL_5h[v9GA=eca@L_Vm~B/t }L-ϊ&E }|.UhK_d8ʦy,NSi?ׂ#M#eGOK>oS>Ӡ1/¶10 dz#7K&ipKK"J`{zri\V9\@t KVPq*Қ^Pҧd|eK/ά&cm`Jm/97M(73Pڟ5ء?k}s;m7=%4O|6˟'h㏈~:gjb5L*ꧼDM?Q?) ׏o9󺨟V۾[ϯlM\ߡYϚ*z{u=>y_g~ĵuzXc6ѷBSڕIWߊtƳ)×%7)Mϴ'p_UO?' 3ǃmph,8q/oŋ-\П#Ox2W\<٧hN2o)-Nd܏ܺH7|]TsO֟1)Nji>fgeqLmӥ2u.̰M;[l틓<кURkGp9|o뒼oemCWYU>swSrV[ػ[&T;"ߨOo{~#[d{={jhZ;J5yjTJ5TڑW{mpYg UjYfÊW+kT;w,u!%XozцB|Ey>$cl|kf0}hwduE|O=R9ݝr[< cTmVS6;%u@-3ww.3md]*SNʾnjV\Pn=d)' q,&Z\p: Nb Aآ v0bbGE ̓'u3I짙R8ȮCqd`Dzy|q88w@m:y@-Ԩը;zk5yGAq~q]z_Z;zC|b|QuXs=Vba^;\3;z\4pWj+ʛT+9hE|<]C{gE[x%_͛G _նGPշ}RoJ/ݥrߝrfWdimNۧ=MiSLeM9M7ŗO]K&^{}׸v6JJ*|cZüj65O?d&r&i?FYAYp%KM}_ ^TZOƴ#hXOD@Bh6=c`4nh$xuL|Ժ˯z3>Y#D>zH"5Y/+?1mKWϞo7؃i"!?Q#Wxĭ:ԲXG3B>fY@ϞnQQWD Q; KXBz &>cc<աp-= gF/=0PRyw,6|QӾX"9Eysw{`F'w߿wvwVg(70ѦZ|1M" ߍnm|QPX9h1 }~>G4kMGD};2i'~̓V؅_l8ӎv=c/_#7CLϩ[\$1 +xշvtmay@lY,ꣶ lӌ&}x_U72=: ':ƥ^} Zy(h%jY/r\O콽{U8/)=}gf!nL^;O3hq85???{ױC|ytty_K߻ c y}ߏ S&^ߗ .j)eCdtt[MUYYQ[y)2i{ykmP 60P6 E1 CQEQ̻{I98Ӟ曧9yνɽȾX:Ex?=[w|Y\w 0.It@+:6{FӢsn^]7{|d~74=̕M5]E[أgɁ.|cY~K]a7]^i*??ߞH\qԒƵQ?>O{/NK/}~kM^vuÁWNͤ?8ɦ?l;Nnћ3O7_iO4w/wCV])_;~wGjhKHdn#Ϳ3qjCo} i4}:YN@|蒛jcJU1ݧ_&Z^dv):>dyΗ rC7w?i]_?QzϢ!zDUꢫAlcW3\_M_] uoBxn _JF Bp#*^_D/Z")|OX=%뱗U t~(/FY~wa~ă~8*}_6廇≑w1U^x c_öx6Ϩ;#k6GUgy6t|9#o||؎Qmqp?8*53u83'F O/a'RxRResv8b J* Egubk2eD^/T!Hֵ;#:||fO[e>MQM6|s¼Fs[dM*E/.癩 >/ίf؟%D7S⿑A #Ko!~|17&6570iՍ:׺ |<_r~uGj;eAot6B+Y󸚏.)ߗv:Eۊ$G .HOZwᢒE:׬2{CYk[ꤺ޾3mzT?YU-LD3~ehS!ivUʵ߃l4|r*\j?dej5Z?/#CK= p[q4!@@J) eP !2 $6l+)cwZud`Z7FOIim8)q=H;Ӣv4c :t =~{f4{}{Ur OOm^UlQϟ8#-z;$ |N7y&C\#G h\ Lh#wmxp~=b 9\ r& z92|>F` O49Iγg!(6L-`Xd*94ȗxq nU0j[~hmx>O~h]cjhAFeJ3 p~ !}lVxs8qU( 6$xY oNSm8A[ZpEy#@xb>?J|R)凬F4K|@ :xB@[nE<.3Y#ŵ eq0,sW>-Xo/.;XS'n:~ .߮xMK|v/_Kƿe.^rU+sFd,=-KjysrG% 4R5jx46Y( /eMdXv^KaZc.˴OXqx.SKh . ~-7w\xU$N S. QBKS_a7dIjәde0/^=5y+]n⻃R\!Ov\-GhZn6r$r$5r]a;r%xxM{óB-GhcFl+HkwTkJh^B_Zdd#GA!GV#+M|精ౕz9'- lV!GN#GhB׻J/GTmH*Hxf~${i{TՏF0D`.<&~GxDWkhJϭ kKVaFh1 nO ueA[g%ս삼98& .'gvIjA6&'o"/ӭ9_c6g%,|0øbfY ^?Fl_16rHȓ9@[k3_G2÷Vk%XΆT?6{BV&|CwMBg᳝\ݭ4u&>[\uuzY 8iC]l4ˑ99'9@1J9G:߂qo/ \tsS}%jiN #3qV.-Pyx~Tz'Gya_z}$xj}mq9S)!z87Ho^.%E #Aoo4M|>Omq-+Υ6<#ji}wIӝRIӏ =I糀78Mz?z'G3y4A٬o-Α7jy@xfM-zY'4rā&|[r$xFBM"gܱUhzNoUyR*Ӝ,V;`ߪ | Ҁ3;#g-ȃjogT#zOJ{y=G<(O55)?&Oܭ@6>gOagV~\㤴|_jb>Zw?7/gۇOW߱g%Vg=U_3aw<߇휰]ܲƥj~Yź4rgc>|~t7M}R~| ~ϮS`i3`@mp&׳M“F9:n~PowGa7پc~sXq6/w6`?ǙcuuK~?h:\w ޥSl1xG-rZ5o!Cރ䋅~0g:cnkZyЀwcMzOT^NT@cZʑnI?o;Kw0w/w /UYGgoUi0wquu/n}>Wl"e,k?ۧ`4سyQ硨'k۴ܷQ}$o9_DqV"S&ˢo!>Zq,'ٽz~l\OI}G#'3rs=+9js%zA>7m}vOBm >KV.߼)_k۫Ώ))Gs~wD=Gֵjؗai .\=ڡK&A:T1j{J<۫h*=/8+=OT!fa uw-w')57%X7r6x\bi'x9K^ [ms V?`ӿI>vYh}Hҿ&``4"X=n)GLߣ]' ?S4qzxq<ě7_;g:x~F[uȊrU;{5} aI*ͯ'gWO:{a> {q <¯=*YEM{ogl4g11G~T|79ƽw,\NM 13nYU<]bxFžXW4_@{똒|o{$?qT)XĜS]& vTg(qn'k#7N'lG~yLW9煏/I7Gw>H᧪g#!&I>>ab*F[q;NNBIӧ簇B> 3{?q(iDnҜw)U #a?`=C~R>hjA?"RApo0;<ɏG`Ӭ>^I<{r16~ '5/iz!A<s w'JW9?C4}$3A*} +I>'vDžOI+,Yb{f/`M|c͵N%s[,H <"/h~zϣa>˿Ȼ?N>]m~>_od*uyV;_ۇg}scT+43Ǥg;o l;{?WH|Ӽ- ն.Vl>=q)5ǡav$_y7uF!wcb!5?59#o8g?痒"NC|~qσ8VY;-a&Ys> }f|y@_d䙹;!uI^R97@8b4|>xY/bKؿn&UDp~l9 }f] 3k (9Q~QcT_C^H]#%%m拏c2'/_1quJ^{ΞR`4Fv3ZjVn]i͆h9N`2k024;מte.(]N?/7}-ea3q1[Bnqt"~c qMz9@e:6:@Eki+ "3ž~0:kwJ+5 e>2CyA[WݶUD7JЭm0] .&o yǬ7ގ}/MEGތ 7$:0CQcFOX`,]k0"?s=hOm<83W8-dM:t|{KУ]T{Ǻ,]/uѳ20svv7tӻt~Qg?,ovҺ1??/[/;^' B0sג>AqZV uFSѱX3X=f[d^6s\~w@qF7.Ƈާz}?%q-1[G<3HYG2P={=d{Co-xh _8t5@7Mr;)v8MIϭ|Rl WiM6m3.5˱}b;_Ge3oL, Ks҂(lzSز*Wɦ[`Lo!>l!|j+٭dm%[,4?nsB1-Fs;]h_Pg?WFt˷ۅGz!_x ^%VFJv_J< B^÷|?oǜpA EM}E6;`#ɰ4x@X0VN:CK˗ ?4o}PӠ VyR/I^5ȟ;a,>݇֯&slapun͊y7]5:BxGD"|}Hun >k$5{$3pz >>bs|AFøI8 h4bNQs5|}@=wl?1#p(uCyLtG&|[q\'vyx '}xq'qOuj4zIp'E}>YCQ{A|]vW1yG02X-}@QDŽ!1N\'1 x\9Es"x)G,skp>!XdtL.n1:нҒ<ա[u =G:G<W|3B' lCDBvnr!WS^^k&/&B:nr=nk3Q bBy_|V|OCb/W>C^7о p~&h/ t s쯂̿+/ f𳀟#:"|FG]ؒo90O {S*/bxrqn TߠZx'`uI\?!g`r}RK#!쿍P<0JtãT3cToj柏(y4F{1䘰gO32L,3V-5`7C;X  +b[1~OǸ8V'_'] 8.s*.wQ?L\ En^ 19mK^ M),z %M-P5{GW7i]{P ,. a kNL[PhGi4 uWƭ\v@ĊVhڦ>i'5G iE[̝sek-퓁yT-BlWQk4'sΚ-|ix^7 |I_{b7^$̛):![ bX {+!hb_;yO tǫ]_;5 o7.¿?u&A3A?7>oEY:yOk]WK\MxϾ w?[X4|۵<4w1>8>s||\a0.AʸYsL߷\þ\feKPaKuY է}+3r}_@Ȥg9kIO J9ت_r*TB및5w8 >UΫW*J}%֜-|~zw~@5iW6ϑ}sෳ ~OIY ʘ wOhTZy7TVҿbՏf 5Te憏úKc^CsǬ27< Y[yz~{czRvNjU}Am+vegσy8*I|OZc X|fotK|S4%RKuָ["eo,_0;i?\2rrrrrr].}1䋭&򼾂{+v7pSjzgV}nޗVoJ.][+ϮBWw*uъ擌y_^䛶cd1Ӏ>߀8܀Oh%#;<@jaUwSjFOiF/j 'sv17&` F=@ J[usŠ,2W&dxB+(:zփ7sEcA*{ԘyYnTw$@HȟyFv%^-u[ޥ{BfWF #s N yѕw$a/r`J [֐=Nҕ5͜W׸'r[_OQcQul& ϘKLj :l %.ж5"oS> gbV/nCwl 5HlyVr?l7ֈ_"^A٤fPuމk/% =3dv9mvVش;yiף/F]nx:žw޺sgC3f̝5'}82<#za'}6sD|OȽ߲mFsP&_&X}F3<~OL+*ה*Y @E2K>NQK{"!ꞌq|:o&2#--؂5:i{I==i~$Ү90A\zxsw·O ﳋ"o7A7x;qy őx ୠʻƤm7 <ҫIn0OF~xC, .Wt Ț&r: ^:#ܧ%}kͣ5r̒Ri oީ!o4&bZވJ #q }z\;ɤ[c;}&m0c14`CjDbx 㐩8 Isr'@=q(}HKz>\xv@o)1T2'R}N7F5 5m {륑1aLŸg rϿrt q1>>?))*A]6=o)0aJ{IA~qq ӲHV0>1h9,ud&Q[kiȴQ }r&+W r3J\O< xd'/|cf sg)>➯w<2V&9}@9|::G06&06}7g zzJz*oʸ{nq]Oy ?t2,*Sr`gWJ gByabl 5^WΛȸ0Λ|6=;<3Ƚ?wnQ2[aȶݒUBR e]]ڴtA9H<K7>Kk񎃯FB3=F3h`*9kr|N7oH\{%lTT5au`p0r^f$1'x 7x1j=ĮP{ MJ7(CK]k@T\FEruD435yR oe*JT4T5P, o :**" (*ر ϡOomGe=|>wϳ^kS:FjogG{ff%Ŋk!W}<5%Bm/,Vwx-ZJ C,\$U]u Wh mk"VE%vD;^R7ζ6-oѦ3Ydcd]v~ίwvn V>vb|}Cptv6BךgayǓ!vR/1OyU}Vrj/ MCĕǚ.jwQ۸Z}Kw!bKʽVEslJ*膶;!V7gNR'z!9]֜颍t_?@|= =jxj5մ"H=vkж63y遰 _5L-.^.!GWQ bGkJsNFbvaN~O=C'H*VZ߈wykXN6WGNftd:bOomŹEasEw}D}r|y4 m휆˦)Og,%X|XS.sykaj~/Ue8ʿTWyq[H?=C{In;g d N2 1" f>\#ޯ翰E[h;β;9DM={b? #-%,J*Ѓq_/{8lC gq6m}#aV 18(r/8K_أ֙Mϭ/2׶Tvq{6tf#>S;E?i [:sNV%o_1w,N?p8ta71 ~,롸+Zoe?=8ZG?&y l߾Z~z£9?09=?f7wGo1./{b\ߞO/"#:ڻ!Vca3p970̲]>sokE쟙T͸4~F{qy$Hf6^B$aZo"bZq/hAܘ/[37Jr<]۾s82qP q ]Z F+E>GzJql O k೗|O(B3S{x*TwS/{S1>ʉN_ |f+88>q|ɡ:s p'x '2'pYkg3ZjL|Z! y++nߕ++8oO_O8a gFܟb#^~>QV>( A(̧SyPgbu9~`9Eq|9;_Xs^ؾW5Hߐ"~P߼Z sݹ}߹_n!/~Q+-_si4~!aA>h^~YN29b *";qj'cTw?gNWC0'yLWNTIOqcoqEO.q}+|0Nj9?XjFL~hؑQyL }mXy/7+WDQ/;@C 8ʭݱ2h/O^|Wq>Q?oW?GϰM1"׷yX[>kҁMG!τYG|hx}SCn"E oB7pY 1[y~G7pɥ0)P? /](Ui=#ˁ?f`$q:|l;}H=Y+lkY?6aFޓ#UA# glpRrM6}ZCܵg M礠Ř{gnvľݴo$}wZ~yH_>rlN~Y]\-sJe]s? h}&yvڼDB?cHZ~G;Mh.];փvoq~ec3/.A %5vScy?Wطy,c Ϭ"ppU8ǍEO1p>+me~`zی|(YX 5lDμfgF IzTsl8Δ./YHe5Ҫ]Wּ;H^Nqm#1Қ6kB9/* 9m?km]cXM_yQBJ&$\]-pͶX2/'$!'ڦ>/ OC{Ak ^{3#9mG>yNB?J a?;i~ѸfF}l4vmC=RH4Y`=¾qt#A C;3Œv.Ym %gp 6V'Xim"܊þ!P2FMqW' N:Zا^ۈtasUaRY |罨sZa ]"u=)%p> ~W9mMtњtP2떞x9SگG?[wťsqW_h-qM3fuOIl صW} -VI=M>֣=97 |#r'xK.!Ƀ}+cp_p z"Iy״]=s|'v<%=z^ss C|PAO=Yԣ3hw멥zs''x^>Z2z3ϴ|}='l-gq. n2_E!Z=Fg#}rK_O1dem =6{5{g5=/f̣#PΈcOzBv=7kGQ=7¾cWg/P#VF=S#sS =M%sAO< 9٬ޜ54fDO,>5#Tw3g">=1!4jcN'V#"H.wmm$񚦙1޲ dpsl/Ssr5ju"UaDO >wГP'?"}z*-e1`LzJi0'lK~+ws1+}s>1q!qF# ~'{rs_@O#z^)^K]W ȼ<(k#vS.J۵>V Z vS >./h?/ ^Gȵ.{lQ6}ཛྷ5bknXCQįDžolJwQߒ82JL ķo>Q ےdkLm况z%mJ}S0־ba;=?xm &|dϘb6$ sD0mǮ V6&-~G؏`qK$N6[dJz35si=% |~=]C_ϘK8szѧ =\&ςYxs&{ܯ[F8ýp gZO}=q {|s/@O1 3"^aƜFiG此g8|E<3׳zJ:_Kagq%g>FDS#}ֳT_O`Q=i &@j豨~9?G&~[AO=Գ>gbϨ'oc-&vzf}?3LU5S@= Ϥye $\q~==SWs@_G8#zj>Gs=RO-97'|WD ˘o|C!ȼj)zn61@e"qei ߖ(3/ 0#VD=/|tD_)Շ:Όև1i! b|2x} [G L߬:1Vخ]°Nv)XMXua}X"Z`{&Yԟ\3c$u*#w}M3_/晖s3q'UIZy؏u:d$뒧#*c^Ĝ3ߔr]T=)ħˡ0Kys@/&NQX 1'zޣfzJ_f"0XYC|73f>7QeDO ܣEoz+t =Z{-$: ٣7x2ކzRɡ73 =:ID; gBO qQv cΒ1=9FTSwi0COi}=?QO=ߡǡg4qq)'8b@@6zFgBi=5 [V_+k3DN~:cƐw(i1Gk3=̘~aMuYYg#³P=U\eA}&Jifq;a͍z2T=s2s!H|UA[I]oMx$I7"; yˢ}c'LO>x7:~3N==<=]*Wq #Iīdѣ =iUzPGw|oVB]bг4pioa XUe1lH)N>V3-1rPIm&+Kab"ADx-i3&=3Tf]fNek?kv=Oݬoo]B>cbsg`r>w3n9rD=rTwۮJL^ifޞ=(MxuTB9l&п~ tz`ϾOL.F{Oe3' o-G~q+•j&~Ϫ8^|O{½+݉Y>'>nAYG4+%6>^kOlvCr}g?<\w& +j6>e~>SǫMϻáe߃~>=j ׋ __cIr32Tn,ۉuMp]5uNQ/^ݻy j>u5Kɷ^sr3-97xۏ-tNC%=Tq_2rilb}h c53u/3W>sʕ+9Q9c;Tx.wЧuHgpXVF:$G|^3o|ސG?<-E_\̹*w;gz'Q Vwf_q31 \r\E'1OX ?]L<K7h%{jwBϵ뀯@l}64}.=x)W 0 ﯴsAAA|6|rqqkX|#>^ȼ FW-ytBʍ 䣗, +UWW|oBp ;P| [r<Ϣe7܆o|\W{q}I7Q|-"Mt$ץa\?܍.6/Z i_r]miǙ\5žfvϾ@~CgP}$JKZB!iK_B 4#\}&-?O<1fW}s/9ΥQZ(窧]T#< LOT8&7GHyD^2!4+ !+_.u}G7:JeW^ [f'Wc3{|ϩ>w y!>;σ߰pU+|AFyiGyp%/x>:z+\uӵM*砎'ggYԡm׆;f̕銝&S6:vg h!-jCucXN oI{& џG$Y\tAg}H l7'k2l&-/Uh*QK^ܛɼMGO&{~?Z[Fwch8fS3qx|W!3QΕS0Zѻя8c v ׼|Yi̷mϸSީ}~V߿H$6Eߧt_٦e0>C2C?:1v9J!6E_ϡ/KwVX| x"QZF-7Q⨽qY͒,qAzF9W( }':oEb- 82FWt1|#DKQ^"U%8]r1weҤyr~c7i'i.Ҿ-ywZ=sylfk6}lgswk;v:V<Թ'S2LbϘOMz&re'yƎ_x7e.z-~l[nuߚ|5GsXOB?/=>N'CtJ^ը;QϷ9\ }kEou2J\DM(qGuoJm AK6 ;*glǕ?%jF(8^MFu k62>g_I|I7cʵuxJkǫ>~98WR~fK+\<߸Y|DY|uש\:o]~Ȃ/W_#\{s3!Nsz"lLt}^ϸ sk Pɳ)ҿ)gv\#N|6|M]+Nbv'<]_K|wo3f~X?BFϋkk j{k3_=||a9a<"=mBs]^xElgsM:kMg=kϚ ۅK?zF9sRBaf8tyhA+T|:9uE}6ud^1oWP'Y82tzE~uc  cFuˏ 4R'F99s<N[s@"Ugxc7{<ضߩjC,iGkM",OݷĜ"X"b0%Y'RH?>r$D\6lzEosNmq뼈S<<┧Fch--Fk1%3KR,51p >uUߛ9%"r8gw,q<ߛ.Fc9W86<[^-eg0;{`3uPJJjuPq\ѳj/'N.[fĔE',b51pC/bS~0s|Cw-.|81grOINbYK{9bÞƻR,ǙRAcr11c;lu9uK68bkcSe^We^Weǘ \]McS,<]eqkkoJ>a+YUV3;B|WJo9o9 nw6ߠ@3iJ \7W/}j}3,\pQ|lsޅsŕ/'+S*ƯT1~}+Ռ_V/8i >Ê/Cu .7Nd5W+k+5*׉/8?,/kzOuxɾ2"eB8CK]{XU9ps9MQ4kȰPQQ&5RJ2o)ec*+. 98^'8zO9GaZ{^{n+b\Z 3V{XjakktLsŽ:9wwkhg=8vtxb/=6g7iأ$)ke\rAS.SC mpO|7dz{qhktdts FyZ* *qf-tC %|0Ezڧt@]9!'l4 DB}%6|bv_QW2 S}qTE[>ļ䍝Qve2 D dk l3|sby:M>DU7n;xVgFyVeAut3춡e1w_93V=oVU2;MKoĻg#1 QxotQ|8 2~36qYm&B(_BJ(PO'np${'q[?r[y7cZ.!KMl"kZIR_xV:V-OSBw0B.:YTk*=E&<&l'Kڼ']ah/rޢ)OIy:Z:ƃx~|K]-ϼOWޚaQƵ8c Gq'ϛ*m ~'sOF{~^lХFlWV];߫BZ,[BGB!g0 67hio2~ }LxI= 43'OcN/z&'*6 [,a+>+b7VoNxVS- ǞIcVcފAz3<_ֹ-ecAn=wvlW m$q2h;O"U춨氦}.>. ~A $?ޚdQqGI05ՙMYYЬ]auRO{ESyT;6շH~y~6c7煂D1xZsUд2t-5?9ڎ_DMfuzs7m$4wc88/ f11}ެ*'ӌ'.0_үDӯx+y|u/S}x8EmL~:O?F?SO?cg:^\Os?4Z| >O;6,pMَRi7l/hn vdGe'曉Xh3pПFxR%+zMRZs|VC 8ZMy2)Tf5$JOvo׮!Z0%Zkd< AKEP~t[σ~ O QI; UӬiUikdIA}n ײ-6?^zto WbowA%.|ٻyB3K/*Ztȩ(k ϳ|T,1Y"k] ,~,N*/Y7<. u Θ8W{om6چ{Y2_=,7^ f?2vB%;a hA*2N|n׾%6IW2m@L*$ݦBkiZTRCu.88ǵiY,2zwu!PZN6Qtz-ލ TE~&c6mҦUEli7l~o?+.PΦ=Wڑ3-!b mqY.4aڷ+yx7|I{Y6β&3)m[ gx8rϙG9פּ/3wE4IxBk X殱f?QLH?<{]͢l7[CTp>u '6®C^ݵ5M7w hpBs{_\処ҮĖ-&ozUTYd͎9πw'|*QZN͍x/Fi7|'\~#*^k{d[97Ft]K ?:o52Vw=d:'e9I Z6W_=fU6B׆BֽE !ۀ6S~dYo'9{:p7Nm@mm3s}~+9(67$"D;*e^O#|'1I(RCuIyZN7Q}!e`.LV R1 |C?7Ci&,tk3 hte#y_QЕFo}4aZ^,Ѱ-{]>;flΆc& /HU_-/>q6XY!Bԡ))E`*_q0r2#pZY%eC0?ܾ$NJ8)!߃n 'G+=m,>3{ Mh+f Z48-$u1 Mo-g٢X:/|ϛQ%t S9}'p hƠb Jϰ~} dy!ƻ,y·&}n_.e?i`Xs 0?'~-u3vZs*^3-W x_Uywldjt\亝ΚX,7ډ仝*srM,MVkb~?λ@w^ǚx􎭅MNg:ro^47N?Zυ*0pv<6u|cM]V}MؑDM-XfuZW# nzzdѹ1󅮎1<\*`%2u&/Y'͂/Uw5J3t\gtl-kX~|g;пMZ8&Ml'qgyQQv7gkr};Ř莁@\~e}dIk}=倽~;nw{ ߪԿ ׷jIg4/0Y|co'^C?kAmo9(s߁`NF1E0ճª+R]#Tl=q,1:;r[/iYnċ2'xYVuݳ/> _E&:)#3݄G}s&z)Z;ϵ+d?x˖0Y-K0..q%Vv i}ۑ}'qK=c*_7xo[5zxO<GcDV}\ [=VpK>qc^<~Iۢ<#=qyl⽴t%u,Nz9Hrgߟ07`\A>=oRYyCfcWq/Sq3 ffևcC11!W޵;p'QI̟D] xa5=uZ|V{;ubS<ԧ̃I;Bȱbtv,i9\9V?ok' !gYG'ͯ>} Vz8-p!,qX;Ynfv.՞\!V5uԯMaӋGuп6وj#}=PK=]ʴruXtb?OꦶqyqIP.f[׀A#8. lee`?iguYۅot.l?.լsLY%M5kd̻,·}|nwB?EY#q;Od}b~cf} @9?<05-?&#[%VVȰ2TUKêBhek0φѰVMMFKѦ|n۹^׏sszy:W{-h Z>mHRw]iWbf~3'u~Ұ}ô{x͞5"Jvn|?wc[OifnK2?lU<\WjNEմ4Ƒu84n*Ril<=U0 $ kJ75j/S8A% h h +,; vr<=ݮ6ݳdzTeo!ن[˼K+n[~c4~&k~m*c. G{6y U?.A,jR7 ׳nޅvy 3a>*ݻ4"-/po\JCUNz]N|9L{ d}D/U^tpj~Cp*UgR5)}[&M̿#6lrg?O듂n~cizWsҹaK`XݫOO#ocy"nrIq_\ԓQU깂bƗyx$=՜Vsj|]\vg'ӂ}&U fjgo~>=??jSt~E##S&w(=tHIW]-u8żWI"4dcɃ SGW^,罆0Uz?Q榜+>w}NyrzAwwlPwݛ{F|Ue;.*^'~.$ μ0(J"9R2M!=YxLPiue#diM'2}·78w]h3=Cȡ=k󣒁dGV>}au|Ne3^_sD9.1 #"E -5 EbE^tl_\ <EOqfqXنB 0 &!f;i!t3$D m>~/"r],f}"2z̻y<皂4#d I#f_}ΣLgoc a-!۱+HjNM~H&.E6ךŜ!&^e(pMN}(\\&cQ-e&ї53C῎vߵ_ëU>Qތ1/q-Wli qj%h sեsSGͳ},y.74HCpd]sZy sYfmbO`0Y"'0p KXfJnuwRE;)2l+*SSb5i?󞖬wuiʜeY_3ׅy6<X 'pc03^x0F?]Hgya|:M2xq;"_܏%}YW|1,SwPq])xbjk&yM$mܕyn 5qO$7t r 1- Qyuy{gd\Tʻd5{T+toO5\tB#Sq}'u)|#MXlezI&$( ,{M#"'kƘU)A"SÛl`HEf[s"&_輕s!L=&!9 08(t%y㓓 cbdCޗNMJlL XsD8UW `±Nf]b5l, G8WH+xJY[a 】ߖ/^K4-ӵy&a٬̡Ϙ˺yZBk@KB-IZi\LYd-KiX5 Y%8UK*j-k~-:Ҿut\.k3G5s֚yc_=Z]l@3!3cЌ )m)({m߾c2„fN{+N.BRJ& /0syO;{=T)6ϫYHlPȲ[i|xcQ̲!LA<&! f_ْL|@?N\=Y(GK~§VJc{PTa#6"،-؆f㌹AȮS+îo(XM_;''nB=rBs12g[J[!&.Yg\:>|"4B`5JR)J1Xܕzn՛t;53T`[3'c 2 =I#E:G<={{̼YqJ0+gR[\=V\9vkհ)e3y[\=bNGbVo U[$Nsݯ։#LL?I/~{߯Gr_H]S29whlGihCONw8f8xqCqg9$'lq s2ۡrN@ 琎Xh萑8sxfC-tH/kC^6x,r[S8gǓ!kQgCZc%x|퐇+Ǐ:)Cb-~%YHV* o8+/ +!x+pV9⑃ᶚSx#wq،iU!/` J!o" gb= HC6 n{9X&‘yC& X"! 'rC^|+!(?ΡOyK+d?,7!XKxg<9d"xw8|G4V$Sf͸VLC6G>_P\4?Fc+' /LA1{9pO;d<6/a/j%_68a CJ9~B".[p 2GrA.xa66"!p-7c62q /oa `V0Ýw3Ŵ?X:3`.2^f +Eheϗ8^ߤ1 cUq"+KHle+KdY /%S`X>~#a#1۲d79-iXӒMxK]-ٌwjY2ն0bX͒LDԵd:q-o)Da:~m8_wKD .z|oqշdjn]x <,yp X`1%a؅,I~м%Q;,Y\(/K"} RqٚGt%ihĒX rЪ%CF͹v P%yǻHßcwY jOq m[kI{ -y1pCC1؍x 68,ó<g[Kc*WjgɫHqK=2 G.}\wd,yB% /8h a0&C3߁:؇0#ףuC|(?:,AlIGHn8m؅Ӱ XOr<0$$ZR~؆8StD62>MX.'(l%jX#nx#c\hѝ:A܋6܃\A&܂i~v\3|B%c \> s?_]cL I(hx'Nl"p|v_Z2)8{ӗai]p|E]tԟ=zWfӷ91K0s<1̷K iI\3."Ϙp12e90,}` JT*1"VsPf(¬4α"qun=ulzoD>1 iE3 <6[xl d~[) 3qOlc.C0E-}J+\D식hcv/`YeG|Goq mw3.a19+ǒW#ֽF9; duu㐉Hx,xiȥ> QG ajD؃zCʣ b.ac pmahO>u1]Gi8Ȁe-0m$m]Oq\3Iz0~e<31B< N=@Y"؋ԃKbnA22}&Q.%Xb<7}2v+{ خ?/gQ_&c?) ZvJEh+CH`0 IXqq @C}DS^t@ a:"؏|FjC@c4C'y Fs2lN!@!9\q+<mᏎxP0c1_a y8#x1 b c =rqqWh74@>twq;gJME\Ԗ:&uVMܥ! 4Oi,wx˝DJ3i.-]J_i-HNrOy@<,#(Agy\'%Ptnt !=˳y^^>*}(% /@yE^$L2X ySޒy[;)Ce (yWޓ%Z>H%I#ce|*eLd\ RJLd̐2KfK̑2Oe,$d,dY*kIBVJղFdA6&Fel!d|+Cv.ɒd|/쑽#+H(?Aɓ"rXQ)cr\NI9%匜s&r^~ R$!\D+r˯V6eW.r(K9UMurUTmUGVurWT}uP TCHy奼՝j檅j|][FWWz@=Rê#QWO'UzJ=zFuWAz`zNV!yBU_O^QT^WUzCRm5D"P5L WQ]z_EQ#(U5FUԧj&$5YMQ8RMUjJMW3L5KV jD5_-P UZ%*Y-U*E-W+JVjJSk:^mP&JWUemjVejڥwj^eW}j:rՏ'uP婟!WuTc:NS:ΪsW*T*R%*V/UVWUZ۴]ڡ-5-Uҵu[m]C7 u#;w&nwVn[{tv^^ߧ~Hw뎺ЏGc~\?ԁ)n]9[ }u?_z~E_az~] ~KGC0=\Gw{}?#:FԣG:VO=Vӟz?ӓd=EK=Ui+=]3,=['9z|@/Iz^dT/_|z?CK]utHngL98I(rāz@t:vj;icffffffffff$[Y`I{fvg5Yv#nav'a {=a ${=͞aϲ"{^a &{a!}>a %};a߲#~a'aʩ!`@aXa XaXaXVaXVa XւaXփ 6 a#6Ma3-a+?@-`2La@L 4BZ`CtBLv> ;a" a&̂!C$ HA200̇=a/}a? 8C08#(8c88N$8NS48΀3,8΁s<8. ".K2+*k:n&n[6;.{>!xG1x')xg9x^%x^W5xހ7-xށw=x>#>O3/+o;~'~_7?/BЇ "(.$.K2,. "+**&k:.cnF1nf9n[VX~Z 8'd[6-nc= Al& a3`+4l.;`7=؋}؏3p'w]q7qw F0L1gc0I94fpGq.1{^7~?Ax0ax8GQx4qx<'Ix2ix:gYx6yx>^Ex1^ex9^WUx5^ux=ހ7Mx3ނmx;ށw]x7ރ}x?>C0>c8>OS4>s~G1~g9~_W5~w=?O3o;_7eBG "(-F$-EK2,-G "D+**F&Ek:.GSm@F1mBf9mA[VTM~Z 4&dB[6-mGS= JAj& Q3P+4j.N;P7H=K}O3h'ڙv]i7iw E(J LE1ڃfS(AI94ehFi.ͣ1O{^7C~?@At0Bat8AGQt4Cqt<@'It2Bit:AgYt6Cyt>]@Et1]Bet9]AWUt5]Cut=@7Mt3Bmt;Aw]t7C}t?=@C0=Bc8=AOS4=Cs<@/K2Bk:Ao[6C{>}@G1}Bg9}A_W5}Cw=@?O3Bo;A_7CEB>-[ķo1%|K-[Ʒo9|+V[ŷo55|k[;_Se4_}}2xZLlHgJ![_KgRRxh`dPeT8L ȬpJ̤±LZ LTJni ž@cC8-%_v2*ĚgbN+'91X-N%2] 4k$y4p:cɴutZ\zY3+h2&~YXegWxVA7sMZ6BZU%[,]bN pP(WruAGYqƆ||eҋܘЫ8{"9=1gl v+M탞B. Z ~]3P-Q^&VEA7**0uߠN-N-U%"}Z2ڵTUV%urْL%BA Vj"HUE9=rhf9?fC L ̣qy5,Q<'hLCdrAk+ueZQ,!hge;!P o%|CT_Eǧ $&n7C37C 7C+7C7C;7C7C'7CagD䏇s>&.WOlxf̽#vss7C37C 7C+7C7C;7C7C'7ys@"C9sCB;*$6:n^~l#G-pzGptzaш^F"8"΃)=1۵ P{;qwxT{M|!>f>>V>6>v>>N>uMk2vO즁 r^ " ,fEdzOOOOOO3|궓xmObڙqX3KbvD+A̒گ KKKKKK:y l'j۵|ĢY!r_!"%IϱbGtKmM)l ,BبjMg+&:=W.НAM9i8IQQwjZ/ Kdgdgd|f|fded|e|^6`$.#,^6`&_A߂p+(mARv6m^ U' ZN֡'䅞EN>cY=L'E\JZA{!/1AAjL_֖J "dE!)!cHKT3Ԑ+3-NGS+2P9$UO')*M)_ }KHݱVYw0" #Ji,CÙ1{U&/]wyب=f}mC%ͩ|爹 |R:'|+NA+B`̸#؇*``IT RA &e6QCMr(ń죶PCj~HߢRsBj}th+Lq[Ψ{-TZݝTIUDcQ:M}XT 4iE>Vn>2(c(va&(Z y2K2Dl.12C+|jF|qi 0ItV\\J>ʾ(~ky|ݡb^&5;\)x:3dUϯxo2sHqŅfr!K7ZvP@Z'ъJnZO>z7y>Ihխ &8oӣ- (t|ĴjF^ޘ9{]opj/^|SVxl5ZbX +˟6 ^Aq7%!(|u3$syfJǟ|J槰e+u =6QQ XlfbKTB$~ [J9w 㳭l`3G *lv~fŋs ;Dm -Bg8Z _& kh#o*ZPR\ 6Kj m;6*БH}s9Wn|w< ;-ͩƂtkM"s]la~!GկOO׿hM aq&ɬPW,GAGt U]V6Dq|vAnCOm˟Su B̆Uz8q*~ <#}QLn-r(@Ԍ}Tk[&5NnžFCEszpAcKLYFriVrcd8u.2NU֩~ΪG[ ToYlfח+ʙU]Sjw,փ_!IMԂ4'OWd-rԔUJN߬ʶ뭵-Z˃}ťy>ǵu:yu *w:s{jm=-jm@N9죝'zbWսu╙w^8gCOC\~W` *mi+S!>q?ĹB fbaJP\|+9bOWS;]\̓k1ٝ\壑?Rz_! !&A=ǵ(ZDjעe^+Dp}tJF(_4z:4 ku([.XhBكI&[61K& vd4~ 8oYH3ù~\%8Ϣ{ji21C7q]] V@H@Gbp4T~Gt#M'r7TrSЊJ3](`lu% &wcl3=zclش|6(.wͼ4#y^~v $ZRx-G қ%g]z\xO\Dڊ^DQ˖-³8*¡f&\@A-4D|jjleX)IQ~|ZZ]>~ CK]n8|@{ bN",ЦB5Xۿ_Qٞ/!^Li/۶{'N,3O~m-@h5.5MrO;swd W*,CPh*yIf$mM;VM)vTU|:\L3qI w۫aWr 5MӦ][:s0VG |Zzn3&9q SݻBb" .KZszϜlj!+n_pHd8(dnk%\ W(z x[IvjO<͗7802 ozg NA!G H0p~sn[w'߽p~N1b`9R?̈́ w+B8?^8?+'>A }b( #Hρ9\ɳ@bÏc(# }p>L嬇 GSA*l *kmLT^Ř L#غL#wDFaSr4dȽ%^%X}$RȽ L!F}!@!:Ƚ 4] l8n~)(/H ,wk=ێվ?h]1$_.ᣋ`$̋|R1@. <&mÓw'l7[|jz($zsy'IIҁi-kVUuVQiF2bK8ۆc3a/QR!\_\^rNy 2aCo\LEFq 0C 6PH0Psr El#t$n.;퍚7o~݋ (CSWKuKfI}d-Q,s15HHAt;}FÜraa#Œ(0<V-iړ@vS+t[٦q 8" 6}._a"I+Hb.z$G0kfʚӓ;x#i|/G& pNTIJaEu$e/T٫zQ]V)˵ǁhS4#jjmAܔ|W{>Y)KRc}!^˘Nj,&~Sކtv{*wN7 *.:'04)dׇ#@I݇!d g*<2pg e|eP[7|X?4NHr"/`aR^؅zV`,9lZ`"-2[yl BA0KBAr޸o05rUaFeQe/3)O4_J*E|+wӦ[`O;o??Ag?_z5u3iN-ocfVLNtd5+Sv-cjgR<^lã(4k}>{cQh?Qi[ǧ3[ ggE{ Y^OmR8\$}{LjpOF&حTbwRK%MJPpNH#GgHV*1My/<%v@YKT? \z o{NC%|x(c8`mHO*?,ŬXEQB)lRīS"w=A)Wk < q>SýWs{\=Jub9+lX'.ޫdHbxyʒcGh WM$\S 9$zĭM Dax Dayj]f;f"biEo: aCsefՊ|<ԟS~0`Ay98N둗Mp$<|ЊE~M'\HPtX@G2}_pg %c-ryX > ?:pZm.G-.yztBtLBylߘy]]x^llr]x, ?`]kju`=eLH#zӡ0c@ҁP}äf#6ޘfOjkN-CK]{$Yٻ[?q"0cpǏ>>o}wݽ#{kf{ݳ;kmPbX& ``PC9YȀY'BB᫪{^لHݯe52黿މ=9o MƤƤBz{P LqLNBx.T^Y 'HXYHtĦa4+.j%-|V=')Qg\,ǐe>\`1L|n9υvk_jlt}(kڛ^l\RNLHsc å:x@곕\\jlrٳ^M/ŦnvRg:dߗ:3E+R,ҝT2t,K2|AeȘcdrp;I:Od;TOdRS>RZMI&%p_oCZtzjf#*YZ TϼԲX1d_<V2pG23xtʦɢkGC/eRTa2>X3=!ٕ͉)Ӛvo4]LMM˩ X҄_e Մi_5 jg3C_Ti9&7ic:םFP.1-St!]i[~ܵYA fdNPK_5W|)E}ɲH46}!\@K=KW{[."."Z/YY/i `ڳ`pdgDZ^U<؆Zq58{_l88&RE(E5[D 2XW/vbJ$tm.Pq뀦 q =إf>xGVċņD]KB)^Klm[V*J5ePSNa6٪5 U30!]2 j`0P; !>^7+,tu\g?%#Uc? DuY;b!V%"ĪTq*(N-NST7.NEST TSA*B"RUB*TPJTPJ(U%JU RUT6:6|WGD]CoE]IG=剘[ u} c!!~){ v6<* x}捈Q'JFDCP[@ih!ࣀ7-x-dmU"nnUǰO!u|2@k2a&yǴ1hqEi#j qSܰ`0j7v lPa}X -;:+, Q@@BHh"GyGhi6.qPìVLݴ,Ӌ- @'*(j] 2q \A.FwpkHKk/" ރxx=╈o7/!>⣈;?xq0ⵈW"}o!x 񫈟CA|CK'0?!^~L5B&U G\C| yw?z\b" >x 9ė&ۈdx= u{ ^D|qħ_D|{%!~ q M{#_GIħC|m?D|9 _7̣E|7E|߂1<;EC| uk0?O"~eG'ޅEG@Ⳉ/" kGQA4]_DO">!x?- N"ހxUqWA|8x0F;3oW_F|ӈ$} uZg;i;f;aF\=>[95S !p7V``G>?j95JCJөզ͍VBrGiX }Pm4]U>Q/Ie?"ҮV]J B@o򣗁jQbqwB-P5 6w&o{W^C,DRh 4gt943;lG G!.7iW̉AH$߆'?VA<1ZZMhKQ #FZeG"{gQxSiV'.< & sqdOn1 izɝ]"WfU5,ǚ.TZG{iFx"?KN}&$$D%e>=Om]C%5M2nhZtS.y1 "׷Ž 6 x"*xu` c^ǖ\w=i60Iڏs+܉=LnoˉCnʱqDlQ>z!iUP+Xˤ{ \{ȱqb(ȹ(!N[oU:c-0Ƀ0n?=v)\`[.h[_:&_%J]v n,wWlԖ73/=ɼSo0`ڵ2yT*Z#/`ІVCWT,75σ b/V|? +Yi %X>ƣB&8_Q1я" yj'!I#[zk~rn OaX{c^q,SWL9B>+Aϊ]u:7=BAKC1PAQ Q;ko=V2:)!*g9 WfTO0e&|Cnv|W{啵3?g?5ȧmȈZ5h&3J[Gs|Iz3s|sd LpYˤc͊R2oM~c}ZHcxF~5|^~f5!3aFtO2!1 HzoU_svochiѹ{zMWөʷx}bPYK g?obu/ fQ)_[S،rѓfPb ;sy?;kKGG!ye9=lƖ(>mzq~"Ʌ0m6^bJ!|5g`QKdLT^Y::zLJfW<$df6h);'9τ&jr.L-/γ5?"S+B %|Q="Kb}9o: [?6x=aTY3}iDX,Y'Y#g# =lz USFC<@VF$o4s: 'ɩZݫ #|AvXwEnTVumǹ@gle=xf,.iz1`;Lj !ȁ ROQ _{_`<;oE +о_8}ykMGhVot9gt~[s? N #;d<e6}aOh!ˋPn^ B0'~QKJlӕ N;ؖ񁎸M9-EPy?~my>oPXXp#b}+Hoy-y>i@\ .A9whRwo\Cwr@"üH7ŬNxEe ߸u\=& [n?>)R/U֎~dl͂A-uo G fTY߅17el}eŅ#|/L~~7|EcϥυRwLs=I?_Z/O 1wn"?9Re!\Wⵈ~[?̖?.Xg2 ':DѻF[=#E&X~һKSKnk?-=ďͭ.O&dyfjEiFF*j)4\!iORҸHGn lf/~Ge䞸-S2?<'9JmD30~͍10)2zs# 2D K ا-@r,To/HovHlG^hI (%C+?_sO"%Ay67mwFv$_l7/~{g R󥕵9vN+.O)s B}+W('-c=NN-ucZ)*3SB SQөizTj%]&~A4+mIHANʟTmO5志/{CB|K6Tߧq(Ĕ1uS:U^=:S43goPTy6q"jsOZ{G&=Fb2WKOӓS(TqPS*-N5:a|*T@ u<? *uJ_gd{"G̓RO$' PztRLu(N)(U'/yhUg Q3tҩ|q@&gin:@C%)?I{N)(hTZbkV0~4?=L'olkخ.MDnK{u2KۆoI¼)jR[瘗+Xp$/u3x|yDAfͮ'NObgj .Mngz)%g{r߰_=WSWwie|tT2_x%pD?~2]I:b[{&j?g\9jJ/hZ~) ԅ$ӲK *-W#d'jy%#Q~͠N)1`[*>-\INLXY<7w 8||b!o߿5oK?Xa<(8ڗQy}MsBUezBf?NIOn#c!MRKPGI8:8z%qBz~Vcp}Nܓ}go 0 i: 85 DԖ 2]5*iK+!:TaA"B ydAHȃBo` `kpD3/mFEn6#otƿnM.rKH]%7cɝ3߬F{]>c~ ϙ.yzOE򬰼MtE.&Nc}uͽdU,͋یwp3"@gp>X:w5>k(a*jkp;]ŠugICK XM[?֡"E!f)BH%!$EBS!UjuBE!J!߹{ϳ\u|h1Ƽ=1\͜vXVs5`qeq Y&pZ^o9]:,]82,s9Ͳ,%nT4 NreYj#W;7~x -02>Vn`"2p$<Ü+Aؓ-KS0OХiȫX㠳8< t( b ȕo9]r |lc!}&f) c/!+Xce3t,v1]`)).Av)xf[U`2&V˹Z-k q,`E6-[NeI"}t4 N4"N4K YQg8ϭsʲ*ۂUBj;br rZZ ܺ;0!(&uwЅzh}e=ԟ2PiQ7:,6PƀǹBPCUA:`̦k#Z.Ksr6_ Nxu.8"@9̭)a9T;B~ޯsʎ=^u9JZǸ%eqZG@B8~>? B"%닰~DJ8Mi;,g8f@n<` WF2,m\O,x"|ULu8J/ᬲLHr)[_!dUVc-ah}ʸ=|\Fw^ZXL1hwc-$8&S07Ѝm wtx{w=+2{GVV1ׁ8#ms\|{ށC܂P x]~ cZn9TY{qA;>'ȃ1p :0QG^픁9Plv(m_DJv'=ڏal(^c 2[̭187~^ ?5Rybo;] ."<S`\yt-/Y:y\yq`1LC@]Ux\ )N9Q̀0vdɕ/yل iH-+&jq6ZTG9ZN.,"%ZH#t-(hI]{4S/<[V}OP5`<<"A`wگ-hQҤ=H;u%ԉtuANA`=))&S2_<w]h=8؀00ǀY~5}1<Vk]y$+40I(mly&&`^Oi2|p1A'{C@5sQ!V2ق}x؃V<<q:k9tXb.yqWbmp_С`@qx` 7kv?(a.أðsi؏J7NCy8atp@@; |sD|BNMRr>GTQx ] rXhy|5#m0{"j r5#߂;a xpX<+:'Rr8Y0p+pr 8sK0\ oMB{Cx$_ ,YvM8ځ#.~v<tk\k0l}=B9XkXQ(!~+1>b_6b]vbtT7ЎXL Ў*r>+4CmB;jȟ`f܋qŽ:pVhTC_b mG<)i1 {,{ 8~7rkS*g/[0eys>ZvND;N kRfai/g[y'G_!i:|# vYXw"%e] ,o,DZ>{CX,VFA)Y]<q8\Gn~ ?8u' 9Z!|{-x!83%x,Y \_~~*Ÿ5#ht2*v|{Yuw,n Ǝ刉-\t5S]ŅX8;W`nN<{+Ji T= ,+h] r ؋16gt^BkZC/^^pKnr\sՆQNS^SP-S~[ל'S swTyO5=N>P&sZ#Oց m_Wx3Œp&q o(&n`,N_LΟ9K9 pd# ·,#"p#3~b;7nS}xݛIc{w%'w8SOٽ'wcL->͡9"]|ToGkBm>1Ͳ =eC+>qT3A+ڎ8ԱWNs 5b.kS$sQ s!徸}L'I`|> P/L_W0I8L)i\ ܶO 80t94|2V4!)M/p;A*>!T[k&LـrC8Ow8]l:RbՖM\|3 %jC[8] o+c;*|:vZ,AYNɍLI#/sW4C9Yمʾ=m8ˁ=p 18d/Cۃp-b%fYi$kIJmƉku@d0>@T'"烙i|ȱvρbPI5h,p-4˜l>р/쵠 G`;Ovclk>BI)tu`-о@Y2G9vD,'Gn [ PqRbjK$4ts661AG|҈u N|GO01T4K|vX~5v\qq?h Y6qYyyA;U=c{"c ރ!>׿:Ѐamځ>R #i}c/|"E_i9KoTKf\;`guŞbzjܫvB ր%9sl)-/p~KUaVR JaJ6-ǘ 0-mW&PN@"Yh/ P]( #$XFwІCУl/ 3@ǁoO'H4NA!Bp.vZ t(gZc[@s70B\P݂^x@=KXmHI+}E\5Xlyf9F@<` H 4ˑ0ݲ3PfqM$ _^X$fb/ x ]Vw5``̍\|F >(x07\05L1ԃ(_ pz9/OEJm)&bۄ{8#Vq^o,_w8QWp4|~1IHI3"%],9YqTi[p!8Ͳ+F7}$NJNu;=9ͲxPc)ඉ9Ιq`DZR\,x NϵJM"%aw//-c[%[@ ǜ>(ǜ2`_sj :Z98j 8uZc]?q \0s N @>9-6705lt=x#>9AІ1t]Ho0!a1NBiN/r4\@Ufa!Əef96L@qn /\@J[X1Z@K0˟"%E}/ H>Ẃs+K)-s,>Ǽ!w!\ vr慵[kaW!^Glo"nvktJNbZ<M5Ku zGB7`쵁Ơs,uXZl1 :nm\ox ~שU@ozc_' h})x-A;?ϲq-g ݠJNorah\v'L ߧ׀]nRm>Isr-ZN뻁/\ׁ[-/ː[tCN%h~[pmp íw.?W*0S^+P~\Nǝa{Z%.]-KtoqǴr@R |%dܮJ@NUEj NxBc`_A9r#VR^+JzN4xF`af'lY=uZjiH`-m3\ lϲ ZnxAǃ_9:{о | ޮ<~.}nnO΄`e0uJ?_["/}CoQn <L;gO亾bR ,gIp_HѾ Z $7KnDo65ʅ8Ws<<:kP,NO}oT{)VAjg 8 /OpS:~{p3:~GtZ:քRK1׺열P [Zz:Nǀo_:~, µ`4}i})-bu1 1w~^X9t,hۀ=:6/0 e3]O'D̄CXAx* &_64Kj8҇ӕ ѿ%"\~TH%hP+ 줦B"2EE`Ku@Dys (@;=HX#0{ oX]hΰ"%C9Ĥesc`5,R &" y 0;1 8Eb ^о%iEI5hvԱf0"۠q+ j"&' ƭvSaѯDC~w_IU[bM&[9RGBQ" 6>Y Ysl`=#ګٰz;0KYnY)Y&p `'QX*DL V!jTH9t0 &FZUPK}勔plU<tFx0f+"gv]Tȹt1*.~#L~QD4 T XX,KD8P\ `<ء "":UI?TAHNjk+ ?`ѥfy832={G`.D0qsbX=VVT(" q1DdxFwX;3"%p-8ZDy"rRDlͰ#"~+ia؀f s.SH МjB6*<c"%zHIss{0XI)VgTKb)ӛ*X\|@Wb"+%&A9Z>H}vw"r5yp l$bk|UDBX~ r,ؽ|BL[aF0`3=0f>54+p-sHDF{aE$lENBB`Edրv>N1"2̇E<Ź1|a#{I8 Vbcm=0F2:<!ss5Ch \a2S*t(-_J9Ͳ,se{-0<3< sߖa*0ZCN8P= 4˽fy,rZ<\١#ő4tNuغl?Ze{ Ƹύ7a*C.O3?vQӕ#e#pf)ۇP^oG 1T 7̀?E&%s ]lj|4UZZZZZZZZژJT$i:iiFiLu]cKGW_ZPZXZdZtZlZ|4MVVVVVVVV֘Fr\G/73rkQ"UB_a` ;ER)aHE"V*\EHQU+$K5KedYge9fdydyeeeeEfEgfgIYYYEYYeYYYYYY$[5[md[ge;fd{d{eeeeGfGgfgKٹEeٕٵٍ$G5GcX8xxDDHs999E99e999999lęMwRUD#՗IN(uzH~ i4R-KR4WZ -KˤJi^(%kߑhy<^.yX^&WkF9IWM3v.tyznzAzQzqzYzEzezmz}zc:Ppˈ̈Έ͈ϐf3r3 2j333g<{#G{h$Z'%:&$z$z%%%%F&F'&'J剹Eʼne$I5Id$Y'%9&$y$y%%%%E&E'&'IIIIEIIeIIIIII$Y5Yl$['%;&${${%%%%G&G'&'KɹEeɕɵɍD*td2##e.2O$ EʢexT& dEbYBV)e$E5E'E?INqLqIJKLNSRSR*R*SjSSSHj$U'U?(INKuLuIHJK J KLNbw-Z5C'(:퇹<1:F֙~aљ̂̊ZD*"ږc]+*XFX͎X~XXrbZZUX#VG0x lUG#EGC?h?9^1]-]sx>TތƢwr\183B9"[ш+9bTXRE!?~hč1SxE"N#UsN!Ex>EΠf?VGW_zPzrƦ5+\c6̧f"p\y&̵>f|a]0^ {$f>s/be q/V!FQ'exvB|v_wg^]V=LŌr'PeA)a,6%^;Va^O8)iT"“y/"o7Fbg(ATSs/sK?(G؋}`38_G%gڙY/0*LwpzWjʮ2るf*{ڍ緖e3:2kS/ͺV8"hSnѭ=o4ePkۺm}xxvfϋ Ӌ?¸@$LL?xA_`h215Nbf6HfGs3 v0xg;T^Cv-t v`w/FR_GLu?2V0gںKN ~Q#79p]]}-#~?xo%+ 'k@i)!|,pZEVnS2Y!1堿v?^h3FK9]c\ !1rRWE=GGT1?2Θox6B|rHw}rL7#;\kk/gJ}/n{Zlol*<2ifmPd$l\(DaZqO!yBe8^g[~lnW{V0~Ԋ/F\MeZ(/;;vnY}bq̉ ^3e8ͦ es%92Hʿd1A]0Ci<2fn9Jti ^;734K&f.񑝧(:K'< :^~)_h9%A䫺9+&OF( z.LW9! >}dmzW=eQ۪WnITetq?wOFz۳Jx%)D3^"0{i ˣ5ɶk׼d|DwӮ:bǯWז,fm6̲}#iݞLygrY3f=t.(y K6J;8 &}mY~W[n[;u5;ޓv̩]rng-a|RkokܴytǗG''6pkʦ&}I 65eOzwW3~FXf_ޙWyT?,v#1|f=fweUZ᭚E_z|.qx}䑁s&ns: 6[TquڵR+ZYԞ=`]SOe o}y<ږ>&97t~z(Ҍ07]q)ay ݺV{ASs<䘮oW]|U1%8U~S_Z_l˴Wz:?ٳbTĊfNvw(L6>`䏗2o3Ư/1?>i15{BҬΪպ<}ݥiʿcqc)m~,Bnqiaͦ!./H*?'x m?^ӑ?o; ^0/P䣧:oӃ #(0pҴ}6rn{|;ՆI™3>>ccGi| *Ny|tĤޣ>l8ȭ~;?.2?J\ygK&Ga}^iU.#?qવfEK~3Z_կ,=mڡ r=3o"|ӡdQ,(s 2FQ em/175Ys Ӈa&]߸Q%qXAa⯮ro1+ NVh:#ʱ~KuH/r*N[,d:ѩO邭#u* {~S(>[Zf}IWZY`V/7\yml oyZ{;\v*e0+8<4(_dhn἟cX?}4Js+y~<6i묪cH#mtS9cfƽ14kifi|kf%{Fh-[V:ZyuV;Gwz~wwqߔLwzwfVgYwOJQU9ueV|/F43/y"ϸorP횶t(t#IbsǠgl}',yfggWw 0!%rҽY?OnToɼMô<m SįL|^[m>S]MtoNȼ!KJ\'J*mi~;o/GЗ]ٗ=ΝUy { hA5~,{[[1}}MfXN0cc=|F>>f}}m?/qEfTF۾}+7l8Oc0a0_NWa{]( !g^ Uf>Sp dQAq?zlfZV+{<w+ks}QX.V?;S>od˪6f6 &?w>nL Reuq͝LB=ݫ^ZyDGO~fڡΟf[n4Rt}n+t_7lq>mF/as-/oݻ)N{BP'oK{ޮS531l-jJfyyb<ߴ};.Y紩ӷgsncʂ߯I+[Mp|3fkCc_Lh:H},sBιy=IFYZl7yyN]n>ɾdݗ"!}h1Lo;%OuYa{0/-wꏹ;n}`pZ\eR\WqScnggؼ'q-.r8Ue:\;w݉no?괵m*yxMOdujd[oծէ_k>ͅ/fT{{Cv+XI Csk]X3}l+G3_ߵk.kDwVż((c{t?C9/&d -?a9ZV[%-ke6:p r9%z׃jgs^,Ύګ|\3U]Rq`A߇s?LlpG1ϧOXtFsv<k Oq\T{ɸo=5I7(iqpe~GV~=tʻK.Y1Sj׍Y}Ě& a~3O0n48}K>]Yz,yV;U lsŒ׷_|#M(5mgæ4]ugBEFF^=kx]1Vۯ;|yP5{kOھ{Ur>7aGn4 F?~/^!fO^߽u 67z誗iͮd&m;3F:J:r+N[Z,wi4ssf7nŒe*'2+ɬcVlI8&2~kcV!3Ӄg d?6M*BHo3*67zww5)n{߬eU3cpӾzl<|}'ժ]jxz3Nu铲sإ\Whl~!ƕ~dw=tH)?qQM a >h/M ]r7C3%e*{^}]sP9N3ϛfeC5/;Os.{A+gQZ߫w\l.6߽ ?8q߼#gTDFi^7c庁K[Ԯo)ל8j>4o{Օeod8a@"uсzNN~“_2z״nDvÉv4(WFz?'eаE\._e~nq_9GF~ }˾uFgYצ #_ib^ 7=~`-u=T.a-;/~;XoRٔӉ{&w8hHɞ"|ܹKƅhk.vb] yҔ8˾@;-_5t;}{ NǕiٍ{mhvy]co.^y' k<;{{+{~jdK7}dmq<5۴ɺV庎e43M.M$S-p1zplS4]_8vzCkM3痔3_zgٓ2=Sw[귤ܜy[m%Ǹ.2tA}ɻޟۿ~a{u6-p@l_u InϰE9ZFykҦ6Q#(m+̢Pf7(#7@tJxBi5 %\ӫ& x C2.y㤐c9??]hRхREZ`]dFCK} xSնISRP& P BhEizMP&e*V B%-&Wd{QPAQ@j""NxJ@ J)"t`}iN{^^{OXf2|]5?@ks{,6Ѹ޽{?u%0-bZy7} bXdm#cCf?!S4ôr Y6l׌Ǎz`?罸d};܂ggtU/cLLюoͶ<챦g6,yBn}fЂ5ְWsΈ䅱yǎ}L͇ްwGVؿwn=V6損omոύYyz/,^ܼz:~sS21%ּys8ݗzۿO, ~Vi>O;k잛L'+ RcߋطDx_Uxg S|?ʾnMiNZ%ȵ:w3{Ɇ>;/;`mؖzp#|skٶyvš|مY&ѝؔ3g]]QԽuY|ѷҦWC~z̰gLϥ=j@?l}סnV=vRm}2u;N:}tkgbS08L { <yj}nl}{U:[M=NƟ1=V ]\vECQo;m'{g?};ac3$13&k?ߏW?^n_7;.8gZEZ3K,.W EO4.w[I5~ʺvt |OG]ǎɋݻpz~Nqvf͙ԒlيEKG ˛r/ߦ?/M15n!:!$[/%>f=d^oR +2kN/˭}kI6ut͙/CܷkS>F?q|>٬פ$6]tӂ4۝a uHξĝvչ{L2netޏ&hK||.(;41}cj8civ4qrFZS:S(?3nz.Ԩzt5=b @\/. {ɞRO{ʂFM$@|Ao]kcW%t飯?kLl`͜uRO _ib9i[.;guooZ]8}Kց1msJM;uqtg_p2vS6n]EgrVcw^Ӌ';M])WڏdmCuy$_/Es[Nvo1y)zB{127n4rr篝?X`k!ukz ?W#ٴzz&([|qwylޓC~iGOyoqInz5u{n1زk5OZ#{ǫkr}8۫Q5/M*E-| G2NAQvs~}RIc1[{2by1(ĺeZf3^=?>zS6έֳOh?^Vëw>8=38ӕ~A]֠)_íJŝ}bG癱E P#Vq.y4Zmir6@Y/N31~ؗc'Ml7>781$e@Ϗ]҄_>~^k~F>:_ɯ3{ЋYDzY90w` 帬`{q^^ 8Iᔈ zxu}]>k0.o9'͟pv@e8ӳ z@l(]`n9fhg丌nSkqoǫ)Lqܠke9p,a쀽wswf a0aÛ:mj&\Swh71GiKt+L S_UșypL;i8-V"OrBk{`O\h@%l?kp Hhش`.m$hXm4'!n$4Z KӈizT \?Lnݩ v 1r$A \Cp3_r!bў퉪(b- ZG >sjBnoZoi}h(qAm*xo($L1]ٕNidNAWǝ+.gt$6p\|D Ε)Jk?EЛa#p4:t+@R$t# \#4Q%&أR&0)0F~4)ꪺ(J/i8`eG Rg"lq $"fFd7/^ ,$(x!YUlc#v$BucY[Toຉh|J1yZ6hRq+ơ:$J<-_+:ިv5b.QcabTЕ:m%^JFu%&Ai]Ber?gWf>DdѣGy/JN ^Ӛ]scD[ȯq&wK]s sPy27V/@A ]CuN~,FQNpmյ_b󪁣CQ=2{ujn' FE ^y8z~1hk ?"ڿX #  ׁ&F>!q *FǬxc~H Wp c' xj4ޟ[R7ރF$iԞJI&)`tA/zIa\Ҷk WS#PwZT9#To;\MBsH>[ƴ*4 Z~5^{NMRQٵ4 g7aIP2bOCl`ٔ*vgyO9B aÛ&I]Dv"eNFj[-A#HL@eIԽjѼUE 8(aHTLVrb':5. _|$~^4j`W %MS ЮL' *r[ct*g%nTҜ 'ī"D5/PR@&yR YyS  )7gDɎq>\#E2zI$?#njfc?̸+-!&|u5n~(Xck@ Z^hE oL^w*iia!Ъ\vV-wR^r^~Ag^vo-HmڂwG˿PG,s`)CQh]P`!^5 FHOp,蛃;%ZVE4wsn^Ne_2-ni|%s2zN+05|'9|nuhw y[s쁩h(yF89{'jZ @H8Z ι15NI'Q6GrZ^[b#M6ga|#e T0\N7БR7rǥ+"9XD”TP " !24ɣ(er~o X, 8GE?o?X᠜Vj}qh^/j~ &rv)$; B>HKJIB? GΏGQ/ oӻ$`؏ Q^4//$b醖3=f{?>`nn r ?+@:zD _vv'.3ӿlHJz7|P~?ї/|B{sN('(h~ q_yV!T $lU(T2$SJ]&0ㅍR S ho65*{;I;YxGz}}3 ; }Р܂FA1ϙ0K˼0n!>U'ǵP~~7[^ߍ} ~gq!42p$]+m&vBx(` jlQqn:Ъ8P2~B){SIM|8̏cQjMo H)OF%oMaJQڨ| ܹSxii>ZqK|4%3׻/ҟ1%q>|m:Ke"WJ_~A? 1D?-ŕF h0lEAc/gAsW&ņj]jQ"/>J8aھ(pԲQ32:gjscOLh\:~H9 G3SN jUF|?7ȺNDKtpiPƧ|3x|d'KtV(ĬirKan!54+(}V,Wѿ;-}mvѿnK+4k\p^AZqh l.-5_giO߉w\Hcۤr̭\.kg><}26g > /ë\l.|| pϹ.W3VpAHꡁ/c) V+T@;>N(DFEp@Σ"!6,GP6%41H,M{ l-Fs, g5|qw*᤟ m~ K{nt29ي=.KAl5޸3E8Q€"?PpAѣh *hH I|XNO`asA;Y#N&+:s1AHP#U[j!-*VͅXw%:7-ϭϟw@U9@7mުBc'R \U4Ѥ @YH-iFAN.ۙD2oL30(c$2]eqN_|X8mFS:TR%.U6tflp&%Rڢz%T$`U-w/^.[T;Wl%v`tJSJnadܸ_6 o6g+QK*oDR0NY&щ!vb@Q4QR<)\&,^ ?2@'ZgW +R(B!4kwFM_逳1TX| JZis&WN3(hQR3:j; Rref#n-09k Tar#H)έU1h9h8$TOS?ƪUn1M6bFs{œb?)ɣng2K$KoT)FOg#]Ku .׻Ura]yWAT!KJa. BS+A(>p˒>ʖ?J8MƁ'XDfm G-@@sXLcoJj^Q`_\IpEn7wSqRP#don$9OKZhLDE yNT->y.r 1e;A@2R3Ӽ9*IUdw H ?p?RIH뺁D@Ga c[B/GV9NA sjrWS6? {!0.R@NaN:mFc7Dֵ4ʱGpYL }:c*;( y.56q| ڞ1rЏ)DE1"ނdg.R?̑e ꍻhܖP SM8bןW"`md:(i?G^1ijUr{A`G [¾IC3n,GJl\]]#|ί\DIvF*=wu!Sx-&Ν__4%l)OGQ܂X']du^!8` 8^OKR-,HRP&>7[Kٯد5FLCRIo9!(O<IL4k(߁&hxM&p@#yXUKroAdXmRۺ.~Moc] s>֏UxB}Z,]/y@!;1g'J~V:C5ŊƩh椁C9ʔ۱F~aUT3ZҲq=6E_rm=-35>kl.Rs Ut 'FG /]sEwE$t ;gX\19Gk&VKki4,;]ܷΫN.aXڜ+|E>lmE59sE}'w;0 3gosL2y+q9= ö4(8A$5= eU"NE)d~BfĄ9z}Ԭ(l}}575ZQ3bY V08͌nN[ҀQ,l$ ֲ4[Hz,t[ 䊥c%!il5]up'k.IYBfJks.A5(]8yLChH"b^nee)[@ |0c5ާDvA\CM I Y\0lBާ@`VwL" 9^3 )J$YH2% HlB_ZYܬ34@TՊ+ׇqqGhk V"[" ޼*7Tϭ]#/.Sr=,?biqU cX,+EB \,"n#2)/i5rtW:.ɉ-Xl\af5fAy:KMB$LրR" W/εb=2+sN<"t+{vwboKPy!^2W$WUKvJTeQ&O>l&M6ؤQR,ciuTomJ7EC*A N&.$Hز3a4I}+]V>L+MdH#P竮=QG}r7 It9N$i:a5X:H2t,y1gbL綎nJd.s@-Ko!_H C\)<6*JO FەAH1MXC1AJ Sui@zԨ%:f՛'n[*)Q,nsfJ8s5xy%atJ1mQю1uRkDJ__[5x>g~ѸO6?Z!c&y@̓@ČBuF1; c|PXpfndӲ|UryQ]KNne" Ѐ9ՈzN?ʑu|g"xpL 00`Nѫk%MfpO67uB< oFZ|jC}wHc5_tחΌ=:-lh@fN{\٧X0!7넳k:zjhz%ЋqM 6i`qPl#|%S b|5ykJ3T0Ǫ*V$(h;g=4%]A G-OK[Kv_eyBӃkW89/u _⃹Xοm"k8 CU9};tR(U[Ns~-iEdEzwz{TlR}T{2>WHv vVKۘͩˌMtCFJul^v%M쥢.NQ a1/Э")0_q޸BĐ^q;kUT7K4qrd5g7;mP:FwoYsZh}Z~V 1[ E,UH%YMXIo'űʠM*LY2^ yu`z"o*iX'`zr`#{`\ 3!E ;*2F q?7'$K<7Qtcw۲g#\T1'dXCuzA:yW@ǽi5xcK cJs\;Y^v[ZsyyoԚ mRUjM D-"+,{9y[1{%kwhӝ !yP-v\]](L|hۈUԌ0dV4}uCC2 )ӭuVXw0մ`*TfrvhYl0> CmU9븲d*O vc#WlR%ղ,t(M O ט(M=V" 0PU&JΟb0I~e"Y-(z U#6lCA-DwBzzmo`ـ5 C6T"OlFbmCG6.49#j{}i.>JCsMdQr_ܫUw2`%#9܂Cw䇍|K Ųm8/Mι #DW[r,}{; kie]e*4nlQ,LFoDc^8nDOLy}t'H`._(dȑ1p4' [Bq >@t! z1@BlMӏ-/+,oaO輺%Q)L$g=}Rf@:bx*q$bޙ(: #Tק,SQlb4X[pRUypb\}_CC\ Gc:3<Ó¶jjI YA/Ĕ}@>@wy^ơ)8K ޺Xu׏)FbMrT}ӊU.B _W%s\-?e#Tu 9"pDiOY9>^>+S.^q/u Ђy_Dr((tkָ- 0h@u3JCI,.ƝwiWmj{2łv5&:y](3a Y2N&gR<L[6)[Lj,8! E<>VC3y@nPKUfK4mXՓ(]~ kg[ωW1Ňcʦ0~},VQ6n(nRYI>TΜ_MFxR N~R .'838KᴁUy ]酤< 1l<ǎ?3 cKWuIb'jG T a6s(L{M#fP$w_<"~\~>VER[?Yރ;f{=rr3PpS<̈́. ß k~턧>)l敫K-$آsHR_7HՋaxmt gAG}K֢u5XTԥuhDHR,Fx~Eߏn3 }7x  qUhm1_kٱA!YK l QDl Afj#ԠѻQ`qu0l>ZA3 ܛ$]NI&OR*]GCL:c0ӥ {3a| S'd<qt |\&D쑲7dtBKXn;`p^T:b&33X^ԂG}n]k *|1b KE­&dPEq2I`2MwǔB?} xX3u" _.@4PC & \ ~q PGSWۂX8O^6[̋n:њ̟'QZeI+?Mӽ#6}hƼʡ4'I_H -"~ Iѣ7!Yz!i#by <a{V6]>0rel{5+L3x]޻xS35ٹ~&]ÓhC eoX¯k<5Ie{:Wα&k<ދ=ƻ5i}_<6c߽xo1x^ k75eM<kʚ~_6O`2x# X=meM~_{_5Y{ǚ/x/ƽ_so=䣔5q_ў5~MgM|܃~1xE>>/=k2&`{%Jl[of˒ʽ|(Mb ʘ0D) R)Eax+`ҋވH&Z?7{:@A;D>ˣ)F\ՕhVcT2={Qt6 EjIFڿ.:lMt@Xg֌LkC*PG%6 ֋ynX̡[,J-9ܸl,_όI~uz׿[dyO:Nr6m54+2\p0z0#adHW7_R*ld`|"Ht|~#I$%+,捷"ٛXj9DQ#Lsɞ#z;01ǟXNtkSdu`:5&ZqB.L8g +`# h$? qG_ŏ #]Q<)&FސNݥ=Ķ @ R,H'(p \%=|D'3?ʂZ'3~ =q@8Rr٤9h剽cP4VlK_76`}p& 3Dع0xD#.+H4+^@()t#b@YCy~*ۙVUN!^;Dd -y̢zkb3H y*&-@Zx#&>#z#{!/p)C Lz|a 'T9J~P[,W 4Aaz:p!$9iuNZιVs_%o$/Z,d 0fv.w7)8K<A&BK%6ܒ4q su@ oC)v}Dp\;&\WqŻ[YVֿl5WWd!*e~cN!mڢڈ■T7ҁJ*`I^V?G| 5.|SÞG/Pi9`],߈o>Awc?;'~?CvTqo}?U4ӈI\n)9.!h_2_6I%/Pri^Ōs Rkh \,i $%^4`+jm0rΌh+Wf6QPI[%f\t](g;)_v6'0Ec:{tΪ%ف[D~)J:k)%P%i^0S"xhU\{tf)4]z5UTAp>=\-=p|B^GȵJt'R@o)[rZ"pTGu,+Ivs%:/•Ϛ탗9i=Zy˯#G-3XA>Z\5[KU\ tceȸ793 (ǡ1 e3KNsjVyE =.9b&]|; zF}V=>v QQ =s5}zQuglv\;cQKBÎlvSWCgyocQT9Z nA8]B#Hp5r|˖Ъл[qY_{F jVi>zB}^@s3?f3JCK} xUpw;tHB5h m j$QӖhWREIGTHCdoq33"Y a ^E#(P?N'}kus=sςq&Fr/ԖN=ådMn:E=4w \:[W6eg=b"22KoA7y$>ךfnʩ\ dLMG^Sen3?D3 Qe* PeboލAp9(vWo2zE&tul85f3X%R&μqJĶ ̲z2:K$?:.gЉ/M whW0b2@y4LD/L![ |>T֡? Got=߼ʞ}ny9?J=DClԪ?[ltԬY4@ i g-(r2 Cᒇ8><xL*B0>[hCj'ɱ q\y{kr W&Jd`XQW„]8Dѡ*" ' Rd/03׸+M`Zwkl4Y0 0u65)G+,W:SCDEߍ.G%d$ &UYsIˣtZ 0Kܦaf 7{X2㘿S({FTI͋яnT_UڝnI<JXGJʌqYuGہlY .52mwDaS~vZ5"(8O~"_OS^S\wObnj^[.EE K]fcOcXMkJ 1Į*~_mrW&P2QQaIv3kn8)Pw?4@:Fm)T^9/ n7r\_7ϼ!{7"uFP07w݆Dğfhp6$Qj*1;ԋ_[C%׻Nv I1X` jCl[eu-Kc[{QUA h &Mpބo;i},eH^Є0|Pu>!oX>v" o6SfoĴ!"(xvhvIδZ:O Tn_Pl aE0E(ivis5:̕Y]J_lhnB̻5 <( ʂi%x3 d퉠7̓!@])j1UuT]xMSb,UY\}-Oq^)+tir3 entHM @]OaXX6 -ZEE=F=hF)Y'wtl{byRnjdaM^3Pc,M?EEciӬIŜF5L"6[ XFڐߡ#)33K$h62?NAX;*8fQ&-@kn͇EZ7M蒅u5mה#pm*` I#7u]ePB=V3*$Y*OnY7l{XB5?9}V!|yBlH5K)DZ^UQ~*[ EFnJhS%&eQ@ ?&@ŀfy܊GY`~4'0 P <FB9 ȀVvM"Ok9'+a FoɃR_+ۃ3tG׳~, Mf+3ƭ3ϜYf6՜s7Hi̅\> !csz콸 .gOQ1굴; J,0k 2QMB/2yB1BGME<ʜwZ7RQt1*&ԮG-(]JuGRt =/e7.AW4CR;_2Uu$2FJϋ[~.lPjR#*z RU0u6.QՖDM ueYݡPZL $ݚe} d:tA k7}|&X1蚃~yl}+e *ggrYN+3 bG |6"d& 'MeM u0Qܦ5%K[叓"H)"5!dbbX*zHmQO~wN>tĝLH /7[,C&$&*a}?4tXajuM=形K3sAf@R#sZ}.^y0V,A/.dK}+Lgg홈;O+'"f4Ak;Hx@MQsj 3%V]^,/9_Q,f$ C?,VĊ^ 7/Ʈo$ƣ|.S mn uBx''V "#7yS) >!k|ʺaߥMU"+KJVLמť\%< ƃ-X[u4ĥx|5h}l ϒ㱇84Ӧtڻ8pe1=gX.; 4c"h%鎴LT=7]Õu! l-u^%| y8ObE]AD[i,Xo7[>xb ĆsCw2{u4\,}zGå[ysF2h?M^=F}{c>cn([}BKLI% U9 /k2Hqat3-NI!r$FibJEŰ ROhd,as!kS߶Fp̨"ITNCo=Fx֤Y=tʔYHW_}1u&ߩ_W:#3gBG W6HQ[CEfI4T526Qhw NK>@EoW]QU ]L*0DoSkךPl4kAB>"@ Hj-3@W4Ck6; /%)uªV KG߬ky--*πE7q,ZG?ri8,ehHݗfBm.FK șcDO@X pηD[0! /uPzӱT2~&M.F.pc'Cg )w)3o9gc;D#f0g9ky@blIRoD$dB3#[E/C+s8:pp |H ùgNl8)9p]`x ZOwpBBߠ6)Lmń;#| 50zn 6 vxNjZxh~Ι1yoep$2MJmUyè=+qibR^l?o)7Q^vT \w|2G/ /a־t.׹M9iP#Rzlo {i7YbPdgJ7W $za]ڝ66Wب6D;vdmaޏu3\?i6ЯIݭ{EٴtC3.mTS'd\(}+- czIT :FPU69CZCORek$7c|7/<ʅoqaE5_ަ j.au' Y`Fz5Ւn«Ѡt.˷R&zQêpi+YyѨ7?,LOdU0U|Q6£wBpP>sAV jNmqV%343']JB(|%)kR0i۴´$<, cޅ"Up 9d>PHsNsLg T # l5 W4% wj;3:\ߛDƥ5XZ\KouOΕG0 m  O+KCd\|tfXJfl<Ӊ,G^I(+Na- pS6Rv=jl$aO)&wP[ĹըkcU;Gœ ,&fʌy9W1 \+/ˢRxq`8WF`m50*k,+P3rqs9hDkT6L{iÝ-:FwϥAab]ߝpbWaҨ܎}zg>/XPs w"̌Vf#=P,x?.&E67 "+(ƻRFQ]Gx.dL#+I e#e#~qcX"]ћ42o8p!Š+bCxO'r^<^OҎg'J:de$#,ƈ^259oc^q{HKdmFـFhy,}Їl-X_(`k8 tzmM^TAt;StCnA4 xs^k,NQ.CkI#<f3T-xeKző;z5҆gԱ5yН[Ucؕ>"c Fc𕰁ar%`?G{K1oa5521"5_6mw $Hv^1Q222$8v1#bKpkK!ݔV-Cω@Rj:1jlEvÖ'|&h;B.M7Z5[_K17}&ixc1\Z$֤>>N:/Gw 5HacM|=L}\'X7sŅ,R* Җ\R\Nح8?Pو<9ثJ &cR@رKϳ!ĐVk Bv;VbyQ֮DۛOa shEȍÎG.YfX' #!;$f Z`qvwL"fXF<@52݉r#gkΖbҊZq~sH Bk(fdK Rf;޻1-!D*hc#b{!6*l ȴ&TR+g{Iz\Cw/J?]&hQ~$ljCՔ|XWUA)wFfE-qu'A +;)o;܁}?hBkN#+捘,BwX D^lKz\aޮg? yM,1Ǔ8FL"Ң;i»NgPBO!B* DSA5#3ÄCm~L1{alqp<wE?g[ {9j99j4nj*8};+oΑl-h6:Yv3:9Cns${*hsz?aC5 uVD@ &+BHf#d"٪,؞9nS\sYBرb7浭C-~YT#~~m@b]%6Z; WExop<{zgq4ǘ P"CI!0OX֠Zu(@Kǖ!m,663dpQ'I<.g#&`ENb*YzcΏƟc Ӛ-=o[p K#&@C+v$-N<Ņh7yxxgy輻Ϟcm,Rvo4{՞'8{SR68( C|eb@`uncH02JD$S֖-Jw|?s {U&!q^ufIH/b_dnC϶o0LI{6&]R_R~-srׯJ3ذ;t TVԃk%.Ѹgr:L]zO:#8 ]񪗻C۱j8W7<aކ1RV|VB)wvQLxv.-x :WOSz۟)?J0g7?nD6#V4k&z8tbc$-.|!;/T S[uZX 8U 1 5*#/qX3fB4졼%#/˂Jk)\of'g}*s4}qeꚅ2ZRlӆ MV|$EQXQ<&"v1\J2vN.o}@N>'K0 &R잧Y%G)]suw]q=}u='{=qiD^'2h1ȒXÊ6o'^$'ٛ9#lH†W% dTpΨ͏kP@' aC DSP{MNhjɘ+WN- (𽉱G%NYZ| E(j@x(+VFTjw++vbҼ@ÄnH[,{g;+ڟda`iTj:S6|mm?%y'qt''jFW4jK}kq;ldq!*߿`_'3l|V&q9Fݖhs0t.q6\|E.y4+V y5ScVsdkn]HCO!k3Ɗ;rqq]r#|IGj9Zbx߿Qc$VzK̼z'$HF5-*/cTAУ zRg!^HSg,}azlu@D`*r~6k.mĜsٕ sdr|N:d.=M_>gE<'aVn\q#-F}Sw^`vqXz#|Œh$SN۾ȗc, l;[1z1ł>ȜԔ\_xjrb-}1;,q.o 6s̤qz[~zvoxޕyw%o!-oqv/x?s`L. I݂C7f(lNbɰ5 U[qw+/EVWI6IxC&2<P}K$61j 4A$Bpn,7<ݢ7 Ic4cczXc1GRnJGWbQ PmX[Rl+gKi/!+1y^f:1_R9J OqL#kK7Cs99 BѳgvjguirNtẕxs#s9ٗ7n=s5ƭ̭3(HG?zuhSC=(}6> 1W|8i~. II}g=bHF][M6852>N%?Z4Gğ99J,>OKa@D@ӭF&r:$CAԁrdUa[ 6VMhrϕE %hb۪-+ .{0P)Tm nX6@Uf߭jz;<_b0:<;OM15/yӊ1b_F*}bL#o$cbMj 6D!v)[<{OSVb "l-0hCE6l)ESQQsۦEh!zu$p2[1CcSۡ{PlO冲B;,mԲYz:'7bH+?=[˟ ?e.`,=Dx-1ʇHٟu5^DC3 } Ca%1?h"e{W{$j/?_oD 1G̊+W{"k-jݼ|8eכzKN{F/o\jd7cd,4 4njMR8v9ͽ6B70 -uL=9G5rjow ֐yJIdAWCn[,j]_: $o \GSi[w=|X9؇^cDx>c Cq- +y"˰% V :Jx| `~_k?9 "gd)}"r>$qjCg1IJF먂3ѨSp72;ƻ>`8%@@)2w6̡1iM՜|Qۀf2{JbY1,$u=??侭ѲH PYo*6[=<98We$[zTq'gw f2',삿 | wӝDZ+ ࠹kUʯEbܡF ~[Cs?LuKF]j؜1{mbE&|I|!ݼg͞@\=xWL"c96 H=}+k/ ~Vy}ۭ0QXl<7l"}k~ϒm'a\ɶN? mB?ŃKA0z^&`P!ևcPx`+6]ueLDͿVՐewC{)Z&' _ NLPw.z` wDn~ H"Ӭ0r-bslѣ~kzt~/IRXi` zg9CxTXMW55p[?Y#[unаd(.kÞ3JvEPK:`m>& @] ?ٕaGXuԧgcfYs 8ϩwCsms-)FO߼Jm"x9v'w8[<$< mfxѭP ˴Pe5)9&agiNcٌ|%@dVEI(h%I6+;2ZR}NE>ײP j?ڡXU`" }$ {ʁ\[$VW; x evDfQau:] 0ڂ3ZTtur9Ffwd†TmWPW:qI aeIe{&A9PehʦCTV@]c=0FbSP[ɪ]I^lSS  FPB^H}3j:MҊҴ1'Ѱ.Y8Dl|r?{y'"t6v{WYy 3smMk7ˊoql&a5IJBߢI4U?y>dB$Asa5f6؟'[&LZnNc_ģs mN x1[E Xv CRu 8p/#(Xd9&ix2Sf"XE"W]=6X]9`6hNeYwVVuQM05".I=[JPm8.j`Sz-1!X]Yũٕ8}$xXQ_LX>瑧 D<FDO*د1Io6LpoE000%`'*X=.45+v c| hS#>ޮ }Nk D-0s V )c|H46.bKFn%0th' ;LcpaP-cX?j! vtU t%Z+_:`> ZAnDB}اuSaӞ6^GWN;,m26' &} ~kJ(z_UflYċJ5BO23$-<֠Ե [wHxV`+%vL*;FӢW$U$E2Y {ޢd Fr+?dPXK6>maK٠B}lIqtaVk"Wp$C'm6b' EE3}K[xg1^YY7:d(qa9xF(z9]|} 6*{,50_xgf3ȶ+s.Yٖ)L5Oblf=ȩ,nr2~XpVNS5C;n9&u/gĎ UH ?;5YZ#.riy'c E=1fƓP2a/B#RdA;JN\~^&.Yܿ6|1F|l;!MEW(O ,0(HGɬ$fIsEl (e|PZ~>p\Xyh1sJ=i' _ʤ4 =Oa:,pUX= }0"lC'D^;+_|H?o!2)IMwJB9-\Ȓm,>uϋ#4ٶW}"*1l@_%#r/5"0үǾɌF(Ҹ8wQTJn>OnakϼSҪggmar:p4[V!; }%El>/Xd4Z!#i/S؁.aauFp0^ g<@}O]-٣UP;T)~&؃؃ j ɼ _+L,5>HZ=Vt2>臖gC*zL\{ƶ.9x xM@>z44Sfv_ Ĕѷ?2ZN M #rwHH1LdPl oQ/Jڊ#i6o8 0؍0(E4ROSj&{٫M4NpUNc! gBUJZ`GR+m3N:v%wcÐg8G {?q5ޟhsol(Suˑ;tcFߺ# IޑV [Tfm 0{JQ$`SvJ{T?)dqQZehlq||(Pc,({%(:c&?`}Q:uˌԲ8dS`:4Opʲ;䶱Fq ̳Q/dʡ_Ef'`>h;.5A$,j6xe*CjVm{`0.Gh&5y3X*|\nB(܆ޅJ.)\~ FYfyD_ؤЯUwhIC2D*,wB 2xS>l( a\5zK0 { '𰼅< g;puB\J+ޥ(l &ȦAǍ|Ż`@b,G֦2jNIZ*WNmq"' Ic_ ㏡U}rgj\撄b!AXbv{hx;?E #:4ӾDamf}Lcm%v?1w 0f I-eD ^K|O~ٻ@[hfc:a{=`+:d^мp,S28J ! qg2OxBwL:0ͭxgW dD2@j@!Y]^\ʲ%90Rfo-P\m47c'Rd!*~~6e\ TNf&yEu?1Hxu 7?.c VtfV4b$3]a  (2jViu@)bK93\R$.u;ACΪbw5a{~vI]/El fHlIf*ivf"#XVA(HU`.;U.KVayς:mٽK"GqU-1 慽I~!&!~lDOTBwmw\Aь٣lܾŎ$fi+=z d⯄E.u yvRac 6ףqũ[[T^!{)9&rPTrVrO(/PJ/R@ 8#BZOQK$Һ_pP~JWlc D+u_-GC?ѥ<` l NEde%ʹ1 ")yiFu mc@,zq cqJ"{s %VcL1Qwg'$L,3y@AWZ-OsDyyЧ+iIoXcbq?J4L)fw0B{J DQGCKͽ tSU?4 %%A$J:ű[ UTQҤ&r9qa2/I mxq)@ϽiR֟J=>{(2MXa%* /L1]44& (M5pOh@[ؖwE~Jbopn_ te2?{݇B;gfyidKB[d$"ubj Y6AJsoo;ω쬬M3jhHSdx?FQ~g+NWcpy#?ɫ8" k8}u}ΆfwItȂ57SÓgh.c*Lj̧I|ڏgf=$S@d`" cL`W+gb;<&1! fSWrr|VYJaTM<"~/KaRmMlhx0xa>l|8Z9'SbHkI]/o6r1m,ǘ# TֽGD>J"1l 4nUcP]:_SCs+laq/3G8c0 -gXkɆB{ٽf( xl>m/{ǻ|'vx=Ʊٿٿ-DΩS̸i"HԌt`kR¦>b~hg{QiM/v+59bZwM(?uZ\S(&.\{tѾ/[pfK}4p(E _tz tB^?ka U]Tlg1nOs %E2z􄟫CpA+`T:vXdg*{ Ĉ5CaA"'SlΩAȯQ0*tVzp1]&!RcqVij<"s|Y t)FxO]g0 uuj6{DؗPJRN.akq[-.=lP{P^&gpw;Sc P`{?8D>11|P5 Ԋ΍|"_yʭhAs`G=b0ܾ4VkdiwwYi+0\? hG^7UF-Y%L< b.#v<8{nAmJwYg3m=u9v"iXվM NbkJ-;&:O>a88+3@ 05 $?ƒ1ġc U`JExOA-Pxk>N+&xcf6lZLZjv [v7&/))e=[D~zj* rBrݜ^.0M,B0l4Rjdְchu.0uNC0ᒍS_{/`Ki#L}Esr_#$'5Hн;b%C 9pO z,J<Sr}HUv&O"m":Wkm#YtD!u8rȥlA5 F !) \dE2yj|ER t[Y8vװ:BZM.- ?HgO@)LP$kCU;9B@04,e C. ͙cȢlAGKKCi!:ufc?aل;Ra b&Hld\@Cti9K6H>5Դ 4g9 )TcX:s;#9Bu7d7>?L>e.ne_K_{z\->yZ~qn9 g{€\g?(? B@/&ޱIb2kCyRQ^X6Z,z~y EyV1%> Y<.lQ<˰&9E|0Q0RO#<?KPdn/Rgr zf 'Wu0[BAn9e6cWYr%ƻށ3~\-Vm%+d"?@ߞJ7Xe@O'=srdk({zvU;ފkmzvO/;N?td.wi~_DQAۮQ 4IӤυ6*vpۋ|y1)s/ϬQL\9(#_1N|zd!G'ZpT(#jm1]z:rr~*fsc y0GFFAj(TPenS  ڨ% 6uzzMF 5wW[HyURJ?@l|lͭxh V9 ْfت ;R$Pv4o*Yni^ Xsjޔ0Ri}IxTt\ L5i#/գ1lt:f(<&Sc{c~v yj_ܔ͆a\ 0a{(Oq|u~|9{'P6SoϜbKXԻ>9]a՜q•y4šVb Lrȁu$9If9+8\ILIح%D5wiՂCGCEZ|y~ JْV:Rrt&,'( <T#C5Tb?9i U~Fqz.JxE' hCX0:q"n(:+[3ODš5):AR,l*P5h<86np#0ݕEe*̲us 58]JԠCl(4/FAJ*S_gq6%RE6lgw/{ sDCZw: M!>4/OQDH\|ql:\F) /"Ne~qj\hä/~MGvz~,([I*w)%4g#ws?kØQDj#wǂ|cs`gDɁ^̖`. Mt%Aa0f8 ;rnŝ~0kF\ Pr 8CKa9o_h+C;|j[ҧPE t ;\ڧj,sYSxtҾړ5;=g_/c;bш;#v }<#f1b36f;ؑEi}183}PSU2J@j c'5#W{Wؗq!P}5h>6 gK>*Cȫb>sw:L&mj&bba#r=BKf4ys)ҳß0^?a[fǰ f?Uwj6wZe\ l5gE @G KVؼӦ Blp) ihcOiC[x.`LR!UVn!4(?s|wzXlk#^Őt/aZ4[nĹɪ&sB`׸[0:mn|0 0DOy%}JSټDT3WgaJ R+ y%$e+NKΓ8C%o9Pcޛ5G 6Kb+˭ΆY3QOm1i) gOFaUrgvj?\kVG_8 Ob\jF^15#wRtX,H:))s "ZP}k7h#qIOQ M?4ؒuvJ~ߊR?2ًu5VW`A/Dh;"@6Hrx`{ Lf 2km< `\v;vO9fBj/}$U9 <>,8Q )O  ڸ]8j0gU\DbҺR]\w /vbd?NWzny 'Y nž َ.Ɖ!3Sjx=U?~wWhĦ&yO"?tѫ}9i$w[Z0 >}T k +*zqL!h*R1tޑZ@j){W.AB[=Vai]h0>9&|iod6OHG}.-]=ɇˇYFtc ҩE"%y,P1An^G^S]}-;CH=5iaI}zK4>QZ0~4m2M%7XӾamo5P߾q5tv2އ=S:yϮzbyާ>1޽zT_eZOT_{Y_+oeu7c}G>zg^r z]A! juԈ] .;^"D}\vL^~43Rq;ql$ >,D]^ƠC"EJk9kvyx|9g*_y|P/hyOB4/ Zݟ= &1ZFG/\9 6Cl+D==,:ڞw2dz FJ0Ec/o|e-iǻ~QJp1`C jIʇcu&];_%ka32xV Ăf5]&6=~Jpbja a'>`WqF`T؄"ku{e3z}\-*NYӟ 2"C} T L6[te9e9HCY@Eя5f _ۙ A\]92²/mR [bkS))zϸ7\S4ד9%mF]vpE논qJCE/zCʇ?S.gvDgK.;S0k2z<ί0"걡j9s5п}z ߶mIסDB7aaWe=b!l%qTx YaEQ'6kv뜍" '<}%p3#x3BRr/Xa<^X*4zlzh0?hO8OQ6 6bF7oz>6Ox7T3C=6=4ұLDHUnCsB;4eO+~[,s$<'p]uWs<|y *~kpŸ$ W7FEyLHF ސ7Fgֻ@ax)IJ~3{) DmVQ!68Gꅝ58險[g| Wk2\`5ܐf-tc6JiV~OVbQ3^=XUvA_ʡKxJYo-!;3\-Eo5j*͔ZYlВ3-ɪ%5mish{[Ii`@f[\%LE #ĝp42}:ҩ4b'Xer-|{d%MJ9₭PqQ9/$Q8RZe E( &)&b ~Q_{@I'gn#Mtye0ok wʖqL畭϶SϏNqG^p8d/a(v|ȦY];ռu.7@n"C(7D, _M^]tS^n0lAR9Gs?jKhvC Ǚrr鲲w{h?whJe gږ*f l%q }(Ȕ\5}H0ҀQjO-7cRⳋȼF?~ _5Xٔ&chW2yoMqBXD˟9svYn`j-¯ބhRUp( =%M72,6zc1 T'`.Z :ҭ"iekVgM?ʾq6|k1 PG# PV9[C5Ԩex5ށgQ3KE"x34㠏bH-]M܊}_r?JJ$EFƛ/ƷMӂs;Ҍ3 >o͉?m/?QL(.p!*M|Jȃ(ۊz(#֦]hMWi yv/Tivep!!h5Ҏ:`Yp׾Jul@EF#^1/'Qb): UhYpyՐA]GY8i%KEm9m69!`ϑX`oIhˡO.xY碈30VlBt8Z|תJ+SNa(?k\,˧אe2E G}&=._pl]BAFgڋH'!/|}#.liw7"J䆄!ñ0IoRᡸ],Om oYh2/ ]];MHW^VpN<=5o}!pVU-"vUNFj9AǾt ivn8j<4Lg׽^A@SlL\!*{-˻(@St}K6r-#אGQ_ǒڠru/[v~je(Z v>dwHJi˝0?$xO-5Hw^ FHmO/q6-ɥ8f0W%!,Oqϻg|6rW͍Zcg- fBx'iB%V]{ҫz,XGNq9sJ'#~vuRE$Z63QqR`l`&9}.)WQ1;@o K)4FGy0`Gy{#3:׃܏#(dtq E:n-0bFżyncH<6ԈWfG;l`^WA ]7 MM7;8XɏSdzPɾz)6 ڇlSG2J/4LeX 7d P'4\tG3rufIu\3&44?Gr7(45*8JK .XLK-^PmJHEL(n-*CM{ EC؎₿Mb: Rt(,wG8n-Gѧ;9X%"lF(f<ųh8wT R5SR`iNB6'{Q8'м0c_Cl2)OR-EM[65\V(&DlߴF8{OoI,C-՞IH2ɂ$7R&+6oJ W2epqsO|V'ZEl )nGu!_}t{M9ؔ;ͤgB!MaGu+ AQUuAEݰL1cҢ ֤ՔPi{ĖJ<z~ bmNBDZgp!J@?4"/iTE ][CB NIEt{XC)딧2V&/66&tfd4{_\7]"[E5/a;xL{q {;gӌ#x >C|haޏ:9ـ(Ҽ~e S=lZg1kYuQMM_H;e_DʧVL-1UhS5DIŷoKÎIvpƽ~L -fX[@Wk!?Gcο\GK/ B,܇B?HF"@s{,z~ftpF5ωejmON'H>Ai$mË&*{fUR^'?,w0)|I~y7ţȒG'vI]DI6GZhu֐jfq8#9ȃk Klbk`-%Z4DF 5#(VKpHW DFyKPzOa+OʹU>7KBw8nz1 H`a46(DKA,EbP^,OVd(EK&45fhuR`^-51G7Z^1\n1h4Q5Hy(3WoVK\Fů//Ѯ~`KFE. _~DB*оY 9~AH,W2,~$o) NzX6"ϡGܑcC61t*LOӣ#xP{VJ^rwBU_{>ǂ ǃJ eWF8)ho3k:LֿSJO/0wjֿ9״7)!A,k8~L \`k$Zzӭ+om1^冿NA]ߤZLn`2qLNT ]43)d,>Ȁƿ/"e1UtY>cecqJ`bOEun#gڣ'x؋[pXT^$}-Y\0v]/L;aoZE2 \HB]Z@rEռ = @$4)]7*g _Go~V XY>*ÐBx;.B\AЕmHEˌ-?uȢaO@X11F.ÔToʞ=PIqB0hZ㿸Y)-ahE83LGDo:ZƆ/XEl%H >[Qn14#F4K] OCqlYzЦG!րQϫjunb$[݁g𘑐6.pN{P_N{P}Hˉ LB~Ǝ sYC*4gt p swYflhV8E4A}'ݲ [N]-cM8r| V-:ԼcXʾ͋g0| '|A/\ Yd;/Z*C3ykԡHW#n6W"EIprsqrb^t_hIi u_H.5\Xm>m -G 6L7jߧΪy.B~H}t=]~0<43Q/:O\s GXkҲM i8+O]T5'1 )Ź'R8Mz5om_}ZAy~MjjĎ ej<)<}\|muP'"oܩlO#f"H_88hGQ_M@5=f 06Gf1R(]y,*ϴl臭i<"~V]7.PA8d\mRd̉']QeA{lto^[±BE|ڹp]jA+bAMɎa1xj\  b* *ߥ4!GS6w|7*""JxW?qUL }]Khgcg:JbK})򲇰R|!Ipի@w"55~U\H+Y&dۨ0K)С0Oe0š}/4H;g7>Dbpւ4! (o~^^tryTvJupӐa\YD6eRBE]R4p\)rռ SQՁ!J)ŒM،5~J}l n < 8\>7Q]< ],ʑu[}>{Sʱ7dbMf)  ҙWRjO>琍>ڠxgo;AS(>>J(Ctlɽ>Ɋ3-JIOw< 0)o9-ѣ=ȒF)+w[uh3dnvKKn/=/8_'$ `y lwE?2aˈOJEx`0N[L SD苴Z 9.WbEϢYy D&JeJ~e gz#Lmن1s}Ol0;9<'¤BA wc2zW RLp7 MOP`CxusQ^,|_聎-69M100kQ}d%w0@n_v*O h~{l%GdM \Y3t oEP{KlkEGܯʨOf'jS9s߃ _*XSnH̆cYg %),.5ROm mRv4\wmG 3|gwl] ϓ39gT;phikxuc>r}]/R.~,>a_܉٥sn1B@,'9 TNKƓh~Z9dx>b3n+6 8HY>{b4"`U/_51"3Ϻ lRr'o$}H++hJ0\D\t4W<08" diHEt!ծ@W1Ilq(qzQVX6 FQ,e Uםq򓡁^wњ4y0zA_ũS>j:Yl O:`tPಂ=7 K=sAe,OӚmۅ}ja:;K$M0ppX>'=]iέd[rqŨ4mlf`%yUdHl$Z[;7?H16}~OQwM;LEle/,]1CVi'![i8ԋښ0$=4`bC',hr漇>mkUA$/&H#y1?wbd:@?~$r&I̾ўZA?I1AY/.I8xʬ>WP&iRtǏE_I`%j=ƌO8P)[dKW-JjRAF>٠+<-5bi-5$Du0S-@8E6^՝AV⮻c8#/,bp Hv sYow@J4eTbY9ǤA+Q[.-G:R(:8rQLXZ*7h}kmܛ綥π++FwFMIFojFӛ rA soso;ZgxnEvXE7ǧ|O4_Qm"B[YRAh|ww8Or{`LOw>WDzG)LX4vn(7ͥ߸|(2ѭ5m"E X*X1vG6j>ǓȦ),8zi_Q`dž.fE † ײZnFo/ۧ5/jY֑pggFڹGjEtæO*4]| rЋC\+dm|s~x磄b3[[j(6)o@-`! H j v sٍc7!+:w9 lh' ;&=X#fl2rf߷/K{ۣLoO;Zf6CnTMz;..띪'4tw7 6B2/ʙe%s;F2$޳:e\[u<-ω(ό dI]屯ܪbUvG} 훕9!'nɒ(fdw.#dל3ͷjw1J졯C⓻rjhM#Y2CnRsm Yl+vhבs 8F};) lFYrBuOMtֲn{E7/S˺ge/=GKeGnGjpYABiCCw}B=Pc,( ;5|ۥ{Y7HsfZLˏ-o~`3(4 2uS }9j7T^>c8[Ί)j%7k Ih?Cثbm >5vZR+>G'\U;| O>Yl3s+ ao63ǃ|Ж(gr'cߌC9< E J[9:@QY$A~۵mޏFY'O`^ nĨR6 >Df%i/cIj2uDn'e41go=<#5ȝw nbTŪ*s0C>Vn P8rB˜G%6 rwhu3Β]>?&oL_KV:WҊP2HF Nevʬ…1@(0 K'8C .~Rね1?Gl<Ê3PNmVόe4QrQ[k%$a7L yW@oo)=/EFb"i+@xHws浤JDCK} |SU$4l5 FkJQZ& PhUu"/ZB@WUuqW]u *XVBcwq--̹7I`{s=gΜ93sfnl])ݕ.,BySF XcrƬu_$*a=h_# 'O#Fhc1{_1S?ʐcbcl݃.]Ǜxrx}JcWyظжϑC;'pw^:啯"il#~d_2柖Wv[^ mUq`{^F:#&fKl &4]KYyT YKh՞ß KsKfuXYAICwS}̖BBP* c^i=`By`ζmDUucUV`lA@s(qV`.nۋA؎zE{m [Oz{B+IJD"A[ƻoSkKLyn3t'zhhF/(P:x4$wCuJCb>Dn'lYHSY0+n(-㡡,>r  FlDv;B얬A~#Oq?eMUZkW5DL0 a;QIN>Dr{ EonefaNznxE÷("יt ?kr($2m06iDLE|i\s@Ny% 3+l bÿ Ŝo |rynb/QhX̆A*Q"-:me6 {:jA&D#b*OGbG|˺] V$s!yw_R;0LhhSJhOJNiyw/,=%XF\v\R^;[n I'`H޵B/d25k h$6UQ #Wr=)`"\~ HEa[z;UH3qT}S;?48rr@oM9YJttLo@&0( 1ڽҢ \6Q`E$OfM=Ug> bl`![L3Ex&x_ y]D/ח#o Qz0G.dC;n6Wtڢ%ug^v6Pt' /XQn>c3ˢB#1ܞ&V*{=jb"Mmqٚ ATFu{.G/QVVWQ'<:x4;s/`>3ѽ_%gK|WIy"{Uv27W`5d唭tKDzYDspN) JDtY9yܖZZ5V$AiRrJ9UZO %?ivxc|`f<$ WDP.8:윏YNa+om?Qh>u۷=%+بsz'[ }( (PlwH[Y+qBguB\^åDKoF.wMZuQTKXuA1'w-GB=Fҹsw+NQ٧g_ =y@T3\e*OfOUT`O[1<=#gXWK d'Om_^B?91CqD"̟䲇aD)Szaaz:o bӡ:3:#f D6kFT#=gMbVXZ+U|af&,35RXØ/SPYW6ѶjiaP"P=rz {! \,fىPv*c+!< 1P^ 7z >k6w={ ڏc~u>|9;WgqM%(Q.Xf}| >}}en"Z#mjϵݍJ ^@Mܱl͞$IdޅJ_c~=_ca7۝K`ese%V(v &gCBiIP%ӍUSp? V%'X%'lyhwK~m٭Ŏ 9P=vtf*٫/2|,6W I".l9 7ԫ J[UÖR@exCXoǡE:Ǵ1qSz% |׌irNeRƥ|N '@nȂNU cu7'2nid?4EM#Mx~G>v h3 "xK+(AὸW1h%& RvXSjçKHv;uj6 ZK(٥4S,]aGu#c޲NBR06"3ʸYP]Vz~3쿦`k()/Qz{"گ(fs;.8Q^ota}j~}braIҎJz`y];4%,$%JrB 9eQ h!M)v$vaJn*u]`|CC RڊS`#FmäS}ۼڬy>)4%"Uc-R~~U%dkmw܆C|͝Ys%0lgxn-BȦ# ̽oTe86_Ly?‡f1<f.es_P6sWBUM/@/j5w(g}y'> qǴTl3;AiKv_&zJ6 $r^SP*ڽO F5yǍ1C F}:qpО]|O~"P`Ov ^:eTN`auN5Tr$T 3\"_NQ:G`=L6}y@kT^N)r*AX6ӱC?ES!4td #lի3)]#TYh4x0\b-lP~`10hbYئ& Vg$[^sڅԆ4%y*'*4RWzObjOtUhH#wb6[·ed[#M7'Shy6ɟ؆Tt:PB@j}!L;džpGE,iƳ6mz"ecyIgKE`B ٲ,k?*V(| `W0fN=e zB] Di[+ܲ N!dfA٫$ȋHX5јqCGr/7KI#]OzN#ƾg42%p]lܨss!1ުS.J9M w=4fqa/f" ,3Y-WzcM.Դy&XJo5/5GׇЃ@>M@B܀ܹ~%L3 .f;ҩQa7LGlepi鑢4@W UL?!D他__cPúa5 ⠱dƹ掺$P7k"(mBq~T=IpW@5 ͑m$式&c %3^qOA*뿋Rxo hasW2[Cy /y "\p__c~nc s,1Cܕ%|Kv_gĤaغcTOhvW F ;0کvfl"̮1e} qȞS8>tDqy1ef+1)(6~3Qmn' f'Khc|Di#zV67 h.ؓtS= igv Ta=ݽo=lMXl! ƃBhypp7DV;N^G9o87Zo]q?ڍl^(WJQٵ_9xK kɵ^lt/[ "+Nț:mI'OU} *}Ͽ(RqR)D 7k@R}l\T% N8P8TyFoDwaFFn+D]U/8?BSpâ '!t떠Tc[)  m)_5:f]P$- -_ZۛeۄCQjzOc|F~5Ki .Dk/Hӄ=iz)m4?>O@wS:HwJ|#_ Ao>ة{##NUՎ7$E<~>~s-~(Q7;j.@ϟ{I!zm=j'qk` <@ČB&=,!:v;)6JG@G9On-N9N踌ڥ#G %s|XyQ߈ ` lGy;Wl<h`׺[ūG"3,F{4PL?HF 8'C[M>IxnU'-` | @W,pV[sؽll$'Cm%9ZWGcص2~vJeӒ_ NS'|C_YꀕZ$߈#⩝j*.h DV*GX-j | М(+5;̌c*_*@ddu4V1r < (TRvVRGZ]~x>pPABƹ ȹ5 ^\\Q߿2 : Aи`J PlNpi}8`oNqrpYc\SMliO,0; YOEˆl rx*Vz0|`81Bz֪FAY98\@ڋrWݿ  #q{ l\m<٠qlpOa0X,K\s5fඕO*-bXYA ?_~A0myGYA w0+ Xaw6KkZ8Z( t]YP Zڛ>=Fy8 @SX863Yg2p[(`70SoЦڰ6Z!,ɳdh)&{JW Ym C.\=U{`n9M¬Uu/TBVF霍a7ëtsy帤U/`~(VwU*}`^ vᜭӉCf<3X03J>vU OllA0_CsOHa~ ,hY}{s/~7O$~7]#`9WG $=Y8<cgJ#|U !wœ{*O J,TỳΟtN8  I}`k/aqlCZ[7v7S}>,'\=՛ T|cwmۑa@'|"֚Á>*Ɔa:Z9g#,/ȿDcB[X<">)úQȜ:˽P1(8g M.WB%{"qxaϸ.d?@lN3h=O+~)7wRzX`6 %f@Tyj2N׎Bot٪? jZ˺Ol|Ȁp.=G:$\%.Hi8mmM ql .8 />gNu%$/>;a@^|ڨIٗ(p ,;slVN+}●L?'"b%=o 9N4^R܇aTU苀Y!bb+ÈJI2y>/5k6 |c$A {䠿cAɼ:M 1tbubi|'RXⷄ['bY1بԉgkjvƯNR¬LE͚`/zLi4tji=>n 6 }hG7ʏJ.=<lj,x?D1P,$AA0;3ʂK/}^Wj|[If̔(%E!5Gxh?ل|gk#lVAVڶmC&m2}]De&%}Go3_5‬T"`0}fM:dN\=Jd̾DTr]a\ٖy\~G:NR.絫[ɡ" Wz2YJܿuq3<Û俥pmFTb bT8xwrq/DB]fAD!Pqo+="C'E6mzpi&! ȌiGxfoHC}I|y?J|VMP/erܸFQ[iq5[ fS7ɮ5`n3":$MJw&0li.{˴!L #FS쁂\{`i:16vk4Ł錊%밼 pj4OQXM * ~c^oB$sz #e_p9m0/Fi;s#Ȉ-)fu-ߨ‘i$.>u"6k*Qhf$BttgjOA#5*1OMˋqkvQZ?Q_uQ.]J n}Ւ}~X=Nq}vz!L}UmB8=P p[ EBiݿb%F;qu\'Ҩxz։ ^w̶9Dr<|ƨԔK;̅9 9!‹NޕY)n`GL;:!5rI[XPّnc'+^74VZ=6 幕tt f>AUoE1CSlR*X\zLvh,Zw:^9^^@+㯼{8KPnOZY1ޤJs׽2\#K%r!yK2:6LjԮbզDM ?-]B}'&$ _˯߁ s\T:)[&AmlZlLMTUwD)obІDBo ! k5R*:H2Yڕ)@ FxÖ"\,;p_C8(1XbՕN> ^ѱ nH^Y2i/fhlJ:_-7uA>VԭDžp~>4T{(*>CnUtyWx͝8°67k%. \\VU.3r%eN$AFnr;lr@z 3 bHR X}“kzp2B2WUCK! elI!ujs$qeB˿3+rxA ޺~rdK^W0 D hRhPq ,ffpynp8IVeFCjW-ۖ;V y gA :"5Ґi€qc"8:[a8_wvZA?\5*-ܦ$8k#`;[@q\mܝh![@`|gچ+^VM/mӵF Wp읹HU8RmUp3J(k=3 v y@~Om^ P#X%Ab7z{tC3-ZZ[+L‰tzJD}uө"B P{eR/f fA!\7:˴|k]",YPFu]Sm|QW1&Caz lƭV j'%p/Ee;/`|SK<KFgR|4kiV3Llc7ǁ%&A!n Z 񄒒Xtۻ[` X`~}Z՟"fof_`Bs0La0o0^^bRs3׀QvNTb }aɇ#b BAsz%V:G,(f[p& ux"a qXTA$! Wf|(|n \*n+ {.BgBsR]GAև2"6 }1^J:J>#^3.ڥ`.SQglAe.D35'NQԚB5T&~c\t:aJ9C,^> lB}Ai8 bHڳɡdtiupw&۹c|~4B =d#ck.jhա ]AZ=i@E<+]^<\-o0ӀA֣#0*B#>kp8]cz1|)UmLB}MN i/.'g4Tۑ>?Lzįm;<2?^}R8+ 1pJC/CC ?2qu{qՒ,e65(rgfS5[{I4)"MDw/l93 ጪOe)| 1ZTC9DrW~ mC<ְ/~QyHFvPxd{[ ][TQ| ;lEXMȏ(dW_#1oIRʀf U˧Av0; b3gxh΁UX7ӑi"ۉ^WMFa8x-`t&CzkQG`x?@y w"E /N@S`Xe=5s|td[|j!ނn˶I8t~R^^niuQJFuR]OD⒉Ec{, z*y\ jz)e}/PI];3ܨނKHX*skMx&sp3 K.EX*"$VFD(?P)A\fq RQE:߷CVƹ/%H[ w`6 ʭf4ʱ]$7|Fbط:DݜtM EL7g[7+#t gLo%D^܅5ݼB v%b|9v/N<100Aaa]=B=XHwB\s $D#nWsӫp- {A5(.7{Rn |]^.(@y{x"dY ̯0F6S;E^H\BpK^O{NptXC{ J~-q-+oe6[)o1F2`%XrvP{2{y C8ϬzP+9ď!Vαg`n&[ H)U\Vjz~k̅QҠH)>}CˬCK3X fkja{j;"EV }sֳ^yiX= /rWV6 ek|lf0BGoT"igl;W:xVaj+X3\3790y/KQbU%bK/E cpQ6T'/w [^LeBY3V7:km[GH`-~#5Ɲ| 4!%- d3@bS`b7ɯÝQ?0 P9v bE:ˏC5lRO`r(3>1ub֪X9} b0'h4; ;'lO{TY`&Hőpg)0bB$V4pO8Vè]0#}-o)!7s=]FrTG*) \ }:AhMSl5i!O,Z¾,< -I T<FWhBTB=&<["c8Gz3xkyvӭp0?Λ]a&ۉh~;*Z(6pVHLK&ݛؐov_N#mbsOyJ>g[})A|ȃ`k:K6w"3yO/{3r Yd~)2SҲR* f,%H*+]V,i!$&?W lKNAڴ+%RhY^9Q ulfIu~5}㤘&0.,x(QMZ`~x/OttQTxs$RpXަpv9?&G߂]t bp>UC<\QܠH~y5犗RhYklS{Vf<, ۸^^߅dI ޝz<ע.[r:_[-AY,YܮcYxjgcl^M/anȬq: )~1V h. W!e1/5k.`ȋȳBUl^Y˚q5ux =d~G]o-#G 8"O7x-RQh >0q-tA?|#(%g.\9ёtہ<9\dZ8M "'0QÎ}kG{H o;Gw./Le%QiA[nJC"~*p^>ǽN73-˵65VRgL[n1S"ZCJ XmS|Cp9g"X ZU Jx!Y&L䵔q3(i{48)/ "M7%!MǺ*e QZ ƥEY#ftcщb )wT[a32 0OǚYO[9b z3ΗCoqBdɞmPJ!|o|̃,o*j,S[54Xvp;?d.Ƭ빮eֹN=҇3u􈷍B*5M \Pi@f0w^  D졖-fgB$OڗO@qPcT^gFKOJ(:h"o9~Wnd14"0? C3ښN뷗P ʅ{G^KS:Js^뿾]WPl]#(icվzwT#VBm]q1XoSOζ_DD݁VyܓA#MQՊ9N5dSFiUgt s+C;dV b)6iOiJ.5{GTrk6[r)l,x.(8dP.>ҭ%H\ॊ^FG7p6*M3_ ~V*qwZe׫n!>HuDW[_C; %~q| 薎Kd8pp8<*:pwƕ{*x@P YegUV.YSP?TCIE2>R\l}=OM7 %nƊكS]OmZ+%mS(ړ\({ Q/:558ฝTy?(J6?F -? k-a^&'RP;Wۻڋ\+:Lۀ\HM85Gm@,ٌCO֙$4!w+bXQ=_ɊERVfVKeZPʓи?[wWNdVٚTOa6*[ah$Z|(a:,n"ڽl16’7,$Oo,fFjH 贿|V%lrզ]6㏯c^Sq &bi7< A&All8;w Ԭx,J`~q\ݭmV#3tX 혈=q/)iF^b*D鈠dNY], d\݅Zbq߸N}\ ' Ncb}zml}꓆LKyR= $C@e>i{0caؗAҕMf]̭ AUҒ~cYH@YMx/e L,ofj7}$@wGGrٻ?޵|~ ]t|`?V]ix:8 =n٭7? @sk;˃);(qJ!Eb戫 q[#kюwY%g'[Y RmKIۃa}6؎wŵMpw\C`(i)17{ xcfrCkʨ}GG#} LTisv XXzH_!҄h|߯ǟ)'4uv`y .')t -}ҨFnq!SdR xQ;^ ~D+HBk(. O'Z`ɓ Q@j:dS H^{R2ILv^@2.n<4LE^x'3aO|PM#zfmGoգCƲ7ap(iWsz z18ږ`-vhq>Ex@f*N,G 6&tOĐg)'`lgDZ%F:uS8ݲ/TJ] Q-ze|lےt%ϛ"Qạ{M)Цџtl EI-:١G fJHas8|t>PW=@JRAͽBvW> E;T@JZ0w'˗+&ߙA}vJn5;Nȇ@rd_?4?+b6FFҾ&ұHk_Q;#~n:ºY4A:=(͆DP8'l{clY\kW&huN >S$cgн7(\&^xq=GBpz3c%*Vx?ҧCt %MGCDbJz]/cXZWcdo(9`Mzj(5yգ'w$/۟*N)9/2` 80=8p^ܰ*ӥW'N_O^^4Wvvr,ogխ=3kJ}`_@`E|OXھ>@kmTLU nZhn*(ć A{0Cg(- YZn߁%F$(˻pUbJ(])cC^H&'7Ct/@o[(]C#e2Gky$_З =|o]8lCص@i2n^0(%<vzDOQ">W#%eK/S<%<)Kv~?im)tAFXVj$zsK]ݡ{ ̰JX 5b1 L.VHm tgP q#v@YN2aYĈ 4C[ WGnmu0Cǰၹ\4#1L0iF1Cj=&rׂa~$߂0ȸ(A'* Ԇ!)Mkg{w# »g=GQrGE䩣'.u-w-mBEe97QިR\rTHyD~ZԇόHBkqߟ8 O^8j.8vm(qTZ^duªv؊03w+Rgں˥'y @nX 6C +eqm~sʡ`uX6_IdKKH;!$=?JoPMR9X;2 J r*ʀ'I֏oڧ M+{ںsϡuˡUL;~HɎqR{ Rأa̕j(xA[Z:"L, 9/c#ҝQ]ۿ6-JM޼O J~"~ y}OD]ڼn=4`?r/]d BMQy0“s*WqSȫ48d}j> kXZ'[F?ZXҹO=Z)_)[w_)d^n_)X\`}^rڎ*ekCwdfr@U|Fx.Ʀ0+8ͪ&g`v@ia} lW5XM/rWH3l l*`ad%P,jo upc7/O[A->e/^^)9 NqW#w$Vݶ9lkkyRvnI[DE&HCLɩCv^xyOl}P]f))js/ 3LB,&XpA5_TNUWk qMa+W.4_:TdƎb])HI a Ro)v$}mN è'P II)T`\[&7w\ <ɉ'Mji{ >=AYݦmmDlUzs}b@"W pwxP3V5O.k:.h`sw7۶rĝ=7xbh$a?$&VO7pgyzZG$Tͷv<0\*Wwz҆6(*R;e[: :uɊcf:ۧ⏩I*^oq74_n(wvonHυM&p-fV2, gX4埖aA`ol+K c`Ο)b1z~oXwߖ).鉉l:gP;#n1 5{58?aQ}N ?ώyqKvz@Q V4픠.!{y4кZzp[:$PJkL' : /JZ( h?\ ^PJ*Yz˫&īpWWqG1Ψ\NvBBj9?PG(3jOU;9=ZuCPU(zVPj]zAu;hԭV  j"*S&jP/j&CݤB4Pp۴PmjJrP@-PZWj g *F u A-PjjzӊP8ԏ) ( tABѳ5C-BMPp=*;Zkj=ڢB@P'5CEáB QA"(!(zt27~i$?ソ; !W_ ģ@0/^]ϫ^z~9L˺r.cy틩vn/r/P$=Tw9Pn?XN=a{ K։Y)I=,^{t=z82$>`.Y]yC٩*1GWJgT/v>W_,ko䵏t=jaxvTLwڙ,)՞kw{c}>զnr *0?69f a(V]s.0Q+#JI~L@nm"ж56 &[S`N҂Aٚ o9O!C> I[Sr9NSY("T% [MT+Naš3>[ee/t^A5Dɘ IT4w2$Id̆΂C~2{Y7K ihP<Øueȶz}?=Q 'sW["gPV`DmO}&b;,#1L~:O<V#ta$\6yS`DNs{+'&kZ ]:07ݰxT> ؐ<{B&Q(=j~N_'M3p_ߵzt~:;w;̀~ޕ)Oeʵ+:'9W\%j #z1ݿI'O]# I7XҬ@S|^''uC }VƎ |.K>7E'xMux&nhq饉[LK0H4 + ~^Jy7fi\MW"6Ŭ7稷0E6 N=%#|g=Ɨ!m,2t(ÔOBc ԕ; [%&t<K2P#<ݣ,oPrqIB:w47+E(3]oPW6Հs@26|WnĚI@y:U'5#M Q{q=@q".L}#ѥDәhݗ@Fg":uo,գˠI_,P8 ʻ . āv~Ad% IhOGق4Ean[VE-ee8%6$UbIE -V]Vr-Ngqvtq`9 2s#x+E\"n0勒< ƪ4Mȉ?F; >'A1A 6r35wI2?t ڠ+F 6% #Nqп hx`Ǻx;ܡ853O'*L-YX?݃\z ~fzAqP8&Cq% ,jX!\sL̃l&l.M^}(d~A5#&m Q- W6f ɮ(??cbR C*#?@_#:Nz0W"(wHͲu5lF.g@3  Gv LjPeI<[þG}ebAb~Z3k*b%,k|rh`F7u/5`@V.}?5M-=, &&%}Q_)0frHbǠ _ m#\(}dIX 93H"y/ށ  /P+ *#a=] ~WmMte6*t6 յ]I%;Qc@;|l5-B})sF ՠUIPI?|FP#gxx`Ј=~忻d'U}(\s _Mn}G9DŨR֩c~_b _c^J] SC`ь}'ZԒq{|¦ KaFʸu 3$mbm?<{?fasu>$2 {mi0t۶Big+f&e"OCM] ):*2I-ȥY5wە߸<@"ݵczC@Wqb hf]~xE[n}OBk}4#|u vV=܊(2$l-ZJ& KՎBAt7%Vf^X mAUiD+ԓ*JP O@ |_޲As6rrPV+H0I+y$^Υ327n+~04+V X{R7&%ӕ\Ikl#zxvۿݠmuK_RaQ sB=+# >^X1b >_ Ek쏧0nZ~%ѺSבz[? 頋v64[%f4؆@C!i7 oMUt6=̀+ͤ.+a E-w1?V#q{{]Ba+Ň"u*M5u@!uVıe[P`zIƿ#Fڿ%Fqxd  ;Ad/6X군Th#?@7 (\˛8ȳ}/NxII6(d͛q& XTCț4|um&ڶ𕰝f`? p0O레^É$@yh8~~E!08 YL%c ?bʘN5vR"`c ?W~TzXK%`O TH6'yp@8_v+jMG-LtBWyo~WX "2&b,LcI Ťӌež(} =[y#Oϡy@ޑlO ̆fcwlSi6^E_Rd&4@I|y_iY#p.;l}񶏔å [ϱORPe< V7Ma/qaS6pc;H!B~c=|wth0GμjA(!Hfv뼱u֧:-/htOEA3|/Q!r:%aE };0 ]|S> e][oӊnLvHI0|:Ɵ}n{ 孛 ?`,{t2\%=kl|J{8 Ex:nHe!YR >H, Lv&CG/BK1ѕp`6a9 JE#?k4޸ b|? Xa<!Gls}ݐdmUWW^%.uIyeb h߷}>cr%:Fr.0E ӣ4ϨsdU ܨIt·e(GNpqp@+ت+5 S[u Ntȱ+W[6|FPj U_v: {_:e$AyPk^3^#Sy\86lR Vk =8 뚽' teà`0BjM>n! F BwUu7H)xO>`"G@Ȟy]㭣O8#}6ʡ_kNx64e)'caqt/p7xGby^8b.OeHΎ"OӉi?-OS)j'L96_<[^эPHBlaOѐ$mQ v9O$WiƲe R.rv5HEQK|M %@C39b݆CJx A5"M2K} HIH Qv?; .`@Cjrz`Ҟ ➲*ݕ㜡qAc09P/kKJDGGC~Gnx'm!_vY))u~u3иYlϦ)nh:F[v$ɶ@Q s^3~c0}]g:O~B̑^sk(a{!>3L?f8ߙJ)sId_5LmvF}?Ə ںrmY{hz}L>#/>WbqKxh_yc[^r6E}5npJxڭ|+)Qͷ#p2>o%yn5[ 6 -uԚۇ!}9' /SfĚi/;CL̛u%?$1'(,u^QBP]t bӎdx=oUVӫѶ*" Uka<'hyP#2qh &Vh}Gr3TRŁ÷x@Xꦱg=硸kʗv޶\9ʋQTߣw/z-< p|t]VB!Pt.o/mU8wI_2 ERnʵ0Vu_񝭺W$gG B%Q1iɓ6h*dO[> h\gx2Q|I+ .rW]JW`ccG. n1whmОMX0{?GKM#[f4 poJ,Qh_ۼ 5e$,(ł@vnVQ5^%3yK'xH,Sގ){*C.bQEoz׺u& :9N47+*O$0iu1b hd4_)ˆE^}X' !a8P!o-öW+sH-xc`p h?g^>ZB^s!j<36^NĀ ~C8u ro@'f"Ⱦd<0^ȏ@w@s7 azy:XqJ|M !R]s轚+AgD`34jmcH#vZO B赗Bֈ#au*-{1WǸ? =fmD4Fnzz̒sǸQ1 m>SzcƇ2ح΃3geĐ.sPUeNj#?fSJA-mc0o_[uaEGnڃPwi%|[PHI| 0)`<|=7m~> nT`fߢn3u4n-afh{c5Nh:SQӁ_D1tN݊cFMBj cUq@!CENj<*: hU(CP`0Xrڮ%-bn2sQd?L5Aw'C;L!LuKj~Lb{uOjlX:PzGuu#hI%*pNUwɡ}vYK7YV]7Yg0[jeuWn9^${!{F+9Pk6Rk]:R0BM "w D\"{wMn1D^Vϧ|w߀&l(hρVeC ?c6BX.Q\}B%]1GLyPpfZ79}Vg{ER#n(}y F:3v0MA/eKѐ,_h!1op mށ[(lI'[REvZMUx_?8#SzdN*ʻDUb`62u1'cX:~\qJڡCj M"߭v_hX+G mDZmM74GO$>t?ԍV&\ʺ!>_B{/7__¿6Vi͜}ﱧ5-ߟl$^J5Ts*Sc䧩W1St +0mLb*Oq;x cfjH۝[1{f::/P1{NٯQ ~}Miv̄! "" љ}fCwfh]K7Dc`m.QPK2崲Ԭ1|9#gCDix-=hwGaymІ@q t}7YwI@k6oA@8zp>'ol& "Juo蚢{70r @ OWZ{7 60hsZ 5~%_24xQ={˿¦@G.[ 4DZRN? #39+lX%;/d.Lɤ`&cB3e}1|]fdrhB[%nsa \vʆҊldni[?1ɐuf+ XvJUnsXMVfY&>V|[!yA vIm5Al.W($bZMvGSR"۝?{k8 SBh昄HYD(/?ww}86 GⵇT̲qT$lI: ?6x(Qn$zN:pE?)} ÷,_MUL1Z$!$|+q$\@Oqk 3":`:,8i-{ctJ>nw _džݡ %K>mA{-5++Q\{n sJx/*3Z>[j__i>OrUEWLeL <%7zuJZbo6Ὄ䕱5kYdƷsm-U ޸mjiaz[IR:.\rx =Ņ֪e? jyMqVM(̔$*hj ^ҔgjҔdjij鏧+nP>KlZ e-:O-݄Gґj3>q@B4]eL4|oݤԿm7Ei|ڊ}NjNwN'fA8R{&*N:#sDM.Vg5EB%7;FbNů2 js).y헎JKnrTyߎ>.JVY3.S!͢>fyHuI ua 4;GUQirPRd]V͚x*Ο4 -~ui̵U;|'S2%\ ޢA#"=Cehjd p#eeC:N}X,vN,e} *j)y^\*m \z׭ *8- LfvuI0bg[: k0 ]m[V|`)0M|==r 8Q)8*8J[tU~S߽`}kgkC 7}CpT8ٿKi~?8ÿ5#`k"|aO͒O /cK|JSR=Xaw4a,}97-%^S]DDKKCo?xDyDuxD7:kxdӒyG]2%?dZ Q͗LJ VL ^Tv}Z9GkUYk]>3 wjbЗ5LO6RIZY,8h$:NT䵾k(/%^S$ xaKly8Qȧ2ߋx>wVlr;͛f̀YK.łi_ ;k Zԭ%_Rΐ0"Niد6$æMi81غ&t M7 LDA4/p7{,/TL Jxr#h[nez")>%x"GIA.DW' Z~=)JDi2l Spf鬲 cPi_aM->\LCޙjdU:[;+zl>o][6T |ޞƃB ~31z{46=+B8Xs^.e^iE1/EUGpTmZm^Z9qG$s^9/*ܻ& (;δ!C}|o]_ܧ.^$^$7fOܙ$D%T8-\L42vG/42>NC#A#:9*{hdi`I#ON#WFzt>'Sv:'|N.O9䈱77zǩ҈PKyH2im1F9*/KoK2OKvmG62-!tD}jr??tQr77=MO5A.<80诬XqXLv<]z@ KjIuz2PA?;/Aupk0˒o0Z(9zl [<8Z03 igV1r!KK!j(MݮUeBD콈-`*Sw9q="&| B*0:^ET"`ݡԎ3`{3C{C;psotIgKϙGYbz/tVg[H:_Y鬳K Myr"'bL-|Iø33QJaM> R;4괞7ke@#BY, [$%ig_zA fj0#C}K~*!i`(VuYufoq\[ncV 8RVnA'9ELv/AF5Dd vf0CHL7`{& {~C #bj3pPe {S8ndZ/i<ڝ mEj]yzW% @S'W[#~Jd}}zxSYo* {F|Nw\TGNuL2"M@Bt`L]0|E}A|z ^vWGE (оdHf v#+]8̬v$iD(Qv|;l[X2pb! &YNc{DDQcS6[^6qӉK'üQyJs1pnu|ιݭpνk{k۵DiM6_WWjp~({Ox`A&/#'eٗ)ïzQuxQ\Y{SCi/[c'[a"bn`,,y2:b"bX<#F:-:,JhHXO)`Nv߻,(|db(VNtPk&Y"OfTx\! ~n~2bWxǤ 7+v`{H }kp '4C3=C!<'A ocM=a{kgh{XD-2=CK}y`SU."A `}D,€V68(K1Hx槣8.踡2ʀ R-.ZdkY 7d"sKҦ:?y۽={Q ez0Ki76Τ0؁N䘿(_ ;_i$~/ _mE6Tb :;nuoHR͑2RRӉQ+5t9=~ׅo&ꖎY9UP GD&iwNQ>°+gS'M&|Y1$XrkBOTz>6j̦-\1 xPOO$1ߢŐ uJl2~uTݳB7Oxͣ[ܲҩA9B^#KZlEYa3pAڛW= Q GfSKM/=\4O@5UOm6lQaї\nrBzh<{_,^ r5͆0*erۺox1eed-\EXF_Nl]΍vFKE`3mm>R9ĿOGb.U ^Pã’v9'l #_.ȯ޷3[J7ǝ۷61:{`ףǭcJ?o)XNrA5 {CV\tifDXݕ,7ӵQ*;{IQWOq,>e^rNyܦS:]OSX.B 3H]sEtUNxN-=¯?5DxNp4~nʎwy7A:fCU2gTdjթdZ\7ẊqYhchn>Ԉ:qE/Bun 릜9Nxq'q-'qKgp8>akׇF#mt.#@[t$ W@g'@7%( ﹫,%sN%>V7@ud-9*>νХY(O @k N'%wi'": @yW+>g cNa9ͯ^,7?>`bƶ p6Hh?3|{3uG#֑):=A]!ۥA%D=7laAbkhΩby-o!1&,VF1}w[aRGi!IJ3Gjiݳ8#RS!׿_:-ǜ;Gc8Έd{PJi7W (^F^F uRm .h6+RawkgVnlsbA(Է?BF1Bn~"c+H|E_FGMtF;k4hWNAդndoAI^zo{tP)#)zuL6p?-٠lŹfy"u^㼷 l[+< 5K3hЎ 4JT动rq&SpsX'Ԫ/{G6Xzt#ęƭE( ;ϏR6g1%؉L, ;egYl@nz'`R7>>LXvQoUG': Ϩ]K+(/di)>֛f.9Ms0 L*fxq^ǽq>.[!ҡ./P8<5ਧ aV|z }9gU:78dћ_@n6G)R556ڐf@^ >K);#Ĵ2j-F!u$qH$T$1B-ys@gP߯G}45$,{?: =u1w tRƂЁr1:'HvۜntřZAZT'8g%n3PpfW;@${:#.H }#gyO dd%{0oݦH5vPgzk5%]C0J N*2:i7<D8EwW.kRI װpsQ$۳ơ7 N2,tBYjzeQEa6mOd/<ν9Cz0ۍ͝Ycu8ܓ+')]Æ=\L^>bW%ڼ"sNT2ܞV#w.SsF9 S@JP}S 3>GGL7:痘S}N~}鹲%y,KI2euڣ1L#PHf&Aj}U+瞎;3J͂4Yo-(順G P@9 f)SN'ى 'LX'R}6LXM-Bs1OEjZ,%W)ŻI%V) ]»kY%KdSbQjm;2R)Or&$Q><دES%jƹhG F+} 9ʜv7,m_pH%]zJݭ {]1.ƨfMwςi v39[7wXh:uKtuNyWVHk9ZƒYQ :ҪۙU?tHnYI.2%'MsbT9y:Ϳւ>8'H7v$6WB)uT8vP*r`/G,$٩/N5; 2:m^gcK1Ҏf-W2]@m/N~,sŇܾyٟA/3Ype^r,@OJ qr2R4m^r?ÔV++o#N=npقC&)&5/.1L_%9ƅW9_Dl@di#Aʞ9r S*-οh9NX]RXC!8P[_wscgjnF`uʣ~t<0(F,IC7F(I; aZ#;k^_.Ip\Xe9 .GUrmcZg E0dY=DiRYF."բXW6냑b&'5*\OIW:O!RjI!-Q?,I{U)GǥoI.\r)10_q+)hЌ%>%=(ؗwer+O@Mb7Ar+~]j^y2'-3{1Je$ljE&?Bf CYαnpm(?Ƥ?jX J= c KI_ncwʤU5wCy:A8TH+'6\E[0j,~/Vq`rɄji" }׌PB'RЬ%ﯡFv.^#-1M|R-3+d5d@HX32Bϲ&c gp$ ُ;a~21Xa4<=*@-Ear='r>XTPJMi}+8gKP.1t7:ZiZ1PV8ZO`?t ^6y',Eqs`dDCg̏/it`Kp*Zײze!u冺bRhbO .c[gp*<ϷYػ(6Jb̍^'l%7onrx-ɷV{\Wmv>W%5$J3'%i>/j&wHӂ,_kEe,֤?V2Ůt;6i+wf];1#8~0KX3zffV:!ÍU6ٗe7K=5AXJ)fNw2.@֮6} {k5Z/t\Z :VR><|.tg `Fơ `\^Z>5{-qG~QRm%5cHtu>NJf}ʧ.=~RB:UhiW=>F t-4; p5d ~L6~EL bÚ ?:8w6[iXą %jo[?Hc G8'((&"EN@BN7>7'I\Od#+p!LS5I.Y+wJm"E=yƼ9(2`U6.V4i#a;V 2hOPn MwANAߣżc)OTMߗ=Xg]1'Ԧ&PBsk e+F\ٓ0/_0}pkM~~jp'?ƪ5_46w ebڅ2oT.&bD)(׼q`pkл+C4HFg iS`\KLp~4aI؇hwUp.iEk+y$hƥ%nD$pCIc"dvxf-xkqZg0_X;ve{ yE ޛCp B Z6* QUk#ΰO !g1c4LTҔxs*FcQYsQe17"`_t',#$1BRaXU +׷0$:1} Z);'*)8aAIvFVśטе,qf 9 $YHDK>qSҩAmyn0m{vF0HC2;&231ѳ3U`[ʒXZ"4$d)T>1Fc l07d93*8G_R>^ m_.yg/{~i^J& +ЃzWHf| J& BS`h;mI68 :DoEᦾ%`цP.xеU):Bs[qsj,3ߦuNʜ%}e| : -Z)6[~@?Zc/`fg& ²됌 emVf. b ]-H󏚥v( B }]Qktb-۪AV ƋdwDTOg*[qb qDc;<¾y54_CHP[B4~cF ]:hi2rwK"clyqRpOQ[׷D*pDᖗRJקpÞ M5Inlݾ)~ؽ&ܡk;GMoPTrb kNrU3:mMVdY׵%Y|2"6n=[ I-2LMDkU.-ɶj*8E6VDU"2E6]sY"$Ke9*g7vx-vW6m-dsN~M _/32R1,a` 4bYP}-]f$lň%m\Y7Wkr/[]0Vn&4WQ^gMxٯfo{n?n i4w2WYn;m|h*S7`p%AHFBs 3) )KsV)$0Ce$Tmsm͝6XWzz5d%va&j.?]nbnGuRz[ =Zu'nVxC^^|Ey]2WqoE]Z-!t~P-Jwh/FˈUgW+~O_qOnrwtnؘ-sL~>h(cf:2nFw==mib/:E/ л 2ͮ{)\mƉD- Ē p :ށw)# (fQ ^jW>{FTi-(R=l)uxiFG||K2-jU+Un42ͤ-RdǶf~9׽-eVe\*=]YWlPg.ы-27M$jIʳsUY]tzPh[L†nڌ Σ4G-71)B}I |rtyӦ*|J^UׅO_~g67鸗F|I5 (Iɋ|`Ji~Tf }3|ޕbpB=)q fYPDo}܆,zFYI;F Bn`0`fwRͷm|}K3~ܦ\63yMsNIZ>Jݍ6bJp򩗐&p.@' c8)j"Qcw(|QpQS 3S} Y~7fcwpr%^um-ŒuS^tw܎*tZRH_ӗOOc W_^:cYias,ՇMX6]qDuz@@J2GIv9% BBppf_J^+y{hd2k ' mIF7$w#d9}e8ɿ}LsK8Icc/'9c/'c|)')8s5I߻g\ߎiKgd Z - }{G EoĄF@B\[s45}*⻷Lߊ@^6}Kp#XfWv$X@9fvEWߙE%{3X;MG/*K|"{;*SIXG_{daN AavyHT5b4"65|L'Etlf'?nC6Dn__@I9&g;_yBk"eZ/[sYbWj)#.(mtq+ULG_ySy^yG[*+;o(LrS.IM:7eMkwW>t1-2˥<{9By֚JHTe^(LNDq]oM'e<{Rz-Bc_E4.xqIahNP|%K$|*GaxV )h&+M8JS͞0r(IF[Ӄo/WL&†t+_t/po,oAǐkXCe، $X!;˜: "Wg"I oAxw4nA/R {Y0ӾmN%Ѹ{'t]4ER>I+Yk,@++C~{9o|ڦ+7u CUJ.G"3}>kI!%C8dgskDg2Kť3_i%1&WBvAW4m`|Ě% :*G-9?1Pj+ƵBs@ Ow"L=FĘ(~P:Un/GMSqSg~04 p=**˨(+)omSTX\BZ>utStkǵLΫ'n{h.iojsCyF֛x~dl:ʡ_%)#S%R%G/u*1O]BGYZ8 jV[EȯDJbq;T"F)~ ߘ GUnR \\)ƐGݟ?`blbԫ1Q#x;k$;SO' TEw^EjKL ya:U¥^KmՀԶ\m)51oVR#%)񅁩 G3Q;eOV cAiy(MMTf|1ڻ SӒ-e2nB=!; }+|_+3z҅Q|9ڐ_1VH#dmRE8rmNhp~ iB oˇiεOTಟ&K5t^~i=TQBU%~z9m8tH*9˵ެ'+x=2jX(l, ,z!.:Ǡ#֖VfuT?>֑:cE9^3<2P5>cZ yЉ8)}vj;,ч'\L0jiethVnk-'?p! E#.8D;y˼ǻLF'7Jǟ}YFpgK%&C^7-â22 Y^k뵸pCgKGQtXYB aO`QHX-YJ9 TO``VZ{ZOXc%Uȧ$!HW !hfgg,s ;s+/pƄT::s(],?bB1mb(șx?aI#c拏Ĩp߃ڟoUᾰ B4T-T#ۢWv*42Ldɧz 'KyȃxVqA}[#.=ft~2ㅛ|W`K2`.,qʈ\ֵ#^tW}i5Zk}ĢlPOy_V0ub̵I#J;@F[ͷm hI?ASe/I;uВ]ԀS;OM%7z(%^JRJTo(I,)4iHjEs:-N-5ZT۴ 8)- MWOShb2bK/Z$0Z$!1OGӮOW/!Ɩ(1.Rbl`je>M\J z%H>ZN&}v vx4>XQⅽ̭ۻf ߸ y1&dv.9RZ:ePO  (6B- BL*S;4nyljiM8Rkԙ&K I")Y" [u1|،^,:W-{dlL1sY%_Oz3qX"ȷuP_ֈ 2,͎CvN9dFʗo@l7{E[Reu 7a&kY9XM |$ x$M] iL9._ϗaIuqt(=s:oBr:Jk7A|s4@x}V |E-Ȑ3;+fv؅֫-sis&so껴ofg?VB?mCh6hMcM,d:lM&2RIf˻RK7``r)fԱ[Cߞ0b()qwh>JrWYIaW$M^loBuՠHɓe#(MNlCk_evf:vE/͎?gd9"&<Lr +//2jv4|1%SpH3C2l5OFI=(Ab0ыv.Rv8p:S3CN-tKS(P3+_ ݬ|:U0 God%?vݽdQ_::<N,vYC_^hvRqNXOxEB06ҽ1:O3 ƨ3"ӛ|smN2cLZJ`j$&o/*[,uJ Y9G\`JӤ.Pd["YCrEMe8 L3wÎ[Jfi!PԂz.eߒ)1QȤy|E u7~omQX=AMaUU':J!_Dq!Y5%v܀^@] SX˥VGaDwZy}J׈f?<$3MnSJE*B]B&acJ3?I(%P-K8s 0 0*k}+\ӓ9ʰ0&>ڙ !h;q,}:0LwC{LCr{H-LފdCH@`ѧFgaaHMW0X.Qyw{yĤ]>.D,WG{#A!&`3#K4k_Jmc _7V*3OX Fm&`$Fk]Ʌ\ڹl@FR\ZnzϿ;FttB͒/F#0z!oNV@BzEA3/i$NAa)-ȩǼ^C0 K-P鑬qc42pa<[#F9`-vQ_|![G'7DVfEFZ|)0-)-fvKT\kwڦFyr6ESΉ;1us֯/"S:IvJlc{oc]"**DenHMLŠ4k":|7.7Q MhX%^yYG g$L|þLڮ_u;ΎVA(: oW;[Gg}:<ijhSeM{RfCLgUAy#asiF꼑q_B)_a9+JUh\)xw@!kR̹DkO3\@yh*ͦ|~a<-.1 `,u sOd!Lk񫓨Jŵyt9|EmMQ)CLM_8= ,2ޒcC4FrQG?7T0ȫi9E.$fS  ߭Аa!vw jT6tSa|N#%کM*YGq\sכi5HȋQRXI n{DF?~bWH 1}d/|2<CK={|SeIGZ" ctЖPiJRn " Y)pFddgk6M8M;BѠV13l MdgQi/F`-bYt:Փe)IxNy{oQE:4^|5[g䭞i8czy7.Cm@xɚԲ[g,ʫZc0,k`,m"2PHmj֬qzԬ7 t? x5 (FܗE6["px =Ei7z=)~FFyAs0)t5t@0_2+[Jٷ֕K)U/㍻JOk @|Ô#FrmfW:8LKgaYt/_dpZ0ZcioqAk`t|hczL#` {]8$VZRcjav78 !be!U|`݋.9延 %=M9 N8;ED@JL/S]KR{≼xhW3:^DU2ÆtGgqy'42iYQU=FQqquq5xMjxʞVPy:x|z<6Hsd/gu4bjq^Ԇbm|c(Eyzo<ӖsMRF/z]fjAh9Ģ> ] Fj%80M:YE!'#Tֽ~ Jƶ!_*r+ `OΣ;[rPzHz2ʗ첋Ə[--2gM⏶$ M1/q(zHU/n7c6qEAuܾWr{YnxG3 t[{/%N1 >O55#akSS"L86 ;eg$5 \ oI ~Wc}/OK :'s<~KCxDzrYV̏*jM9 6dI^: ˪WuWg$upXx@f~yzc>5y xmIp}\x=ע9R< Vy ֢d۴φ :}Aa8 +k5WCMqjku4!9u!̑cG-eޣ#_mToDI+j۩wSrSYA]iaeK;ZE(m=]YBЮ6 A}򵲾SG'Qpd)Tr)B9n5F$)~]x WB]1Q*} Y(ֆOaڙ2&Z5<&U|a 9|~!wz܇0pJ *;=uEtnj;VHτtv;ja[_@Shq2^׊ōjpU nX?z^j2Vjt|]1Bk-b &1 j|`t&@j!*&:ܓ:y?74"wHA dgk1>R z Jםj3{2_-b)'ߋ}Q+Rpúm}[ Yb²mܞ*}>n!Rµ梦+kF,"dzv8n5Эc\7z8M`x:@2r| 5|hmܞoAi0[|*^ t RAukww~#3~y Lsaw˽0}Sg \ؽhkb5YP:}#?O-gS^%pM"-="(ru-Vv rq^~z䧗hXMr\C| !vv>|I"l3bAwXrɆQ3۸٦P4U9nM KpƂ}?>^s(T7=ΟɟQ?5hg҅Fsb4g*PkQ7] #[=iX\S8&&@; )#0OsIO#s'݅o k?Kx1~_n b\%ƣw7@ W9\ :|t?it'ތ1=QK?%HKL dc "Y=X6TY؜t6uH')@z[\d j,]]&rMxEJ^cd]D/D?_xi7,-U>%H@Hgq.LO/kqa{6]W'$ꁢ(t/Nt/Nqe%{)pn |:żԎ:빰0Oy3C(yȇ9TLwc"F_hBۭ@/`ncUS?/kpϬ|lؿGBoI5űhyaX \4)3A65=VSx>A:.i5mb3]YдʂYI^\Y)V15O^a|#} *[8)^1 ҿ@6 ԏ~ GũF? ]V,v Sc47 8H̏MTQH&Jv6%-`nS 1kdeK'N'UCT`v aUi3a"3l^-EL%u8|0[i3U?9mAz`1ge8HF!%]T0edf_ApW30q]ϵ& ><o?ޟ>]=3! xu)jWt1x-0zzx]^S`b:[;i?xԠ6a=0|^vl0 |'מ,'{krhHiSdx<7 d0$6LSAba H)Al#ƫZ{*`)[ف~~dY?aus>]͏tߩ9~|Tg,D*)c5D ۵~6oGjSc'<hByLBe9@ǩ],7:V5i-X[Ii3^7QbBSXhYfxkD]W+@Pj~fQ"Xq8`-#4{y/Ejùp+"$댳V_UM/[(䦽\M&cWɱ;1֖NtHG_p4,}}WƝM KBLXi%Ĭ5Ė 9[~ $νU'5KQF0gOI[F g|if9ܮva¥n;t7oaO6;61 clS@ؘL`uU:ǙoySwqc0-$;v)RI?f՝Œ v?L3oI{|ȡ340av0ZWp*Wȯ]8d 'mڄ&$t5`84'`S d(o^Iݣz:hc v8*懔 }{NsW,̨c&(T?R ;g$qƁӟѰ!PfIt+~wC5ʛ:?_?=BEw*Hj{'x>'^l\e ſ*¦PCJ-ˣ9 LWP./aٖcp@;{iף{r5@16ig?9Cَw kЏx՘jugc<o?IXaIB\|Hr*-d,c~>%ɔA+Ӂ}<;?`˝nkiؓ9^B}A Ea}jnPr%R͵mj9jW=!Mj嬅xfq'?N 峜C[619 ^7F̞֯|΀y"8reܲD91 7aY8{w"Qb)4ФQvvdvz%MlȤFڡq$g {B\/59#bVn3eE)rad)1!f<yѣ|n {P"QcjV d+;4eL_wPjwEFcyØxi- _1p"4:oƟJE@OuWYQ8Yw:ہ{s>)JV,]Y_0o^$zQͰ ;D/E.5sM|i.)kL?sf3ܐPu gg=+P]26w{]kY/x UŨvn%ki * F:~:{#W*?jv7Oo3^îp9`u SxQW|Yu8]<} E yΜpaăz!ܔ`OC2ၛI7_ ۃٞ8,2w31<>Olfq שqi9.m".may()%d,CI\Yz 9E[32Jj| tqq{E[ [w6G>jqMtƸ@(f6U\EtOC.:!ȃ C"S#lJ|p؏o?UxrU䙍wDI_jp %oRwՔ)  \_(DEG|V(mT{rAڨ+TO!VHuN@MY[ѝP%f ix냵íebWF*Vnna ҮيX FWAoڞ֍kR*T6`XKXg1D5N|KuLfFݝ@k#xWжqr ņzS̬1qRn$]&cKjril͒z~)J!|@::o Yf/Aގ}yM8[ Yz{融ziM95S3}]\/Z`uJ4O-ia {#Cne>V (8Jj :o8")CV0 -hw g`tPaf ycٽ>O|mL{JTV$i)UL0*SN^o0M 0e7ݗ!c_jps;nWJ1bRnB+V7A(#v{K⁠~RV#I ѤA?DSOS5R6Y0 8R*Px@Mytzp=Crz8s:7,di.[xLGȽ_z:8=YQ{;߯QͽK d)Q7QT]DZϾޞػֵqmJ!hacJ\_9X}ͤJR^bR@>\bvKR\-ŊeFaloD)PHUV r S ]jIm[X5IT)PDY0.&w=ˢL񲞮 QBȲկgz?zWO5X.׭p )0n6{Ed3"I R81+ݐTP&ݘJy&%RoJΣmqL-OwoD@sPɘ ,{vB^Y,l%aCU*E*czT/~A60Y9^_3w{zZ!שj8p/]s<Ӑ|P{d5t{qz2_:lqb*ǚE^"[.=Ό&Pot̏Q"tǒx,'G[9)} 'ß EXz2˷$H)G<"?J-ڬ۩e8qS!YMVhOcØrx7@fz0*b{NNcDQ;0)9CR5yPly=Q^̀L ox01~2'^JlL3(t# Ξ>~=t,V_{ucN1NYtvFq:Ŏa>9H:gKQ<)xuuJX I6W$hc)Ї(쁺ڎj4 bך!=(Ě: !îϗ G_<[/_J޵BtP~5{EG߹Bѿ*/+fm: vf-4[愶&V}A:O$m:t9k{/J^/>,oW#N0YNeX!XC,Yڃnl濛ʭ}~o׼; _-%e<$}9-}1xe?NW .+Zky^,#Sxer@ ^\$S^7+sSтogʓwQ, q̄QoD^]?ls!EdmA9SCG!V1T[#hGRq$ڋAK5e634;΍웍F_Y,K܊M Te}?TKC5gj9 X o厢o%}RKJ$[&=3)b"J$)|Xk8Ѽ|&hFk<ɕpl?JAN\ᨂ"꾂T'LxzY׃9(!j;*^V0 |$ )ZOFQBЙQCRPEb%A%ۢ{V_cwgk^rtC[}dgYü\:qaQ:f4F,:'C)θG}!Sm- ,TǠ85FjvGoA̸VH?:xXFv |c_4\dv[ ]IgGF|>1#@KNC^;u]M΁baB7y' 6x2V CLgjhA˳Yl$/nrX᝵t'\v8< 79 j&X ygp3h+ua ,s3-F6c/ SAbvK Ѣb!h,hL`z,>E %`ywb7,O#?7=?UڙˎĚJ~3 m 1a}mIt77mt9*LQހzS5N{upC 4Ι`8Jq ^TgMIczp4/<yJeVvUT"T.EeZ0#8%iOng7lo2 v:ӐϰvăLci0:]IZK.Ң#-3jW4̀VMq37K؅h^(o-eƘRB8LΜ0q3Ovbg)0?[è4h1'P׉2[E^d~@I4|%> ԻZZz-XW ڧ^E+0(:ŋ*/B(KOENNh-0atS{"S|FJm'50gddɿ(;~\r $DF%'-Ν2ʈ"3*]!f.wLkñ-DnmsaZ@Jvϥ~-K3}{}{o^^~'<#^>a+xy7xy|H^agHY_1HbibuOo/<`'CV7w.Zk+B|9cVnFtїoy+R1_*yjl~NhG_ut:5K+_qCdngN/zi2}E5*R/=xg6REIttyR2&o3Grꨩ>y'*/uԯϪ{SI$촶WxX$ FMw6>ee)z4TT>  7rߚ-?vW$ ﺪv|ncO'Jf6x c\d^G3T&.|| ȈcFJ\/qQ)%iOG?VXfà#HD9o]2hnXCœ)BT5govdt{/iA^Г?r/kPihddq<?QqxtQ<$}*vy0} ޕѢ;bk8VaAN3&NOpjKQ)F[]~[)FM(ٝOTP("#7 ~f#kͯ9FP)xb05us>.Q% fˋJ:Cy.~hL|2A)su"@t\?lK "Ldq"&ٯ/;mLvơmz } ?j(蚊r\9+3xeSsckׯO/Y^V4ޓ[b=ilOsg8YZuZ^Z>Eys,D6H^᱾,J.kH)ݣcbnZ/RjmN,2uBqU6.ɲ[R0\zI \ #\߶]Pp%u6R`W3~a"|^مEPkP=v-(뿯W0'e; IKWSVT;P2 5:; b?AxeX6Fpgß8>}<Ȇ4Ip1;wѳ1r$4,)/0ĶSoDt(X|6" $(9{tP#F$*KqM* b!+Mtb:`>u/I^pUPVnP^ǩڐ1S sM9iPOteDж "R  #zhjd9STϑD1B9 2@f 贇j"jԩһb\Po]9WC=M;r>1 V"}xT9 X("&:P'6`f3ـ@ )!WU q6s y GCfED>MXgba0}T G@JVp"N0Źbg'0._U-)n/]vC5#Rz}z/,~W m j㌿ѮٽЩ1c+4\\36Yfsh3eec:ft\g@70#r~:=pbvT;'7ɾl% EGWY9+@xgHymw}Pt}`Z*ZS50f>L6 ?/d9E26&tשה4@C*hfmHb@}qh;T$j !OY!`noU@&Kn.Ye?4ǂcK9hav $Z7-F*bR=T[F--2CեbRhݦ-uAy %4t 5 ['l5eCI^Hñ χ ,t sxj>P C#gx3A>ߔ/ '|ؒqߢN~hUa>|M =zv0"FP`C1#U zmVc@}&.1Sω Z)e\1Ңr.wOC^'D9\9U-Ni-ZZ>dr_H1.CӮy"|-(o$Mbmǣ#mņަAd^skK 8qC*rQd\'RŽ:.DI,a;N.E6aJ4?8 ,ЃBShB0,uÎ *ć$0eKF`ͻ4YYGl eIj;IZ41#pϠ|b"(wu7k5,QہKLq@^'&<$&W.?{ tUF݌-Z(Nt1Oi}WoՃ͊7re"ܤA#A[K"A`c╹"^ rMTʄ Bp!27ԁKtM48M^Zxg06a0J:VCrqeKBt 0B7ʵTΊIhi+fi|oB@C'h0HIR;*.{/m1kB^,}u;A^{ pv%%Zbaxʇ^e|#工6 R600O]X2."҃P: (\b:T o Z۽_U}\M]o8$(c᳎&F{߄K{kag9`03@T@]J=G9nzQt C=#EyJ@DK& ut,]fbzmoJg[rwQ xe<CK} |nl2@xU3 $ | hl*TB%a\U׶~վJ} l_N\J9& ׏s_{.%c74p1[X?&+O%J (ruaX{@3?C@,xD.M/y( &\'RQY| h +eAY޼e}! @քLU 7j7+jѪX(mLuĹi !{ccxbT ̓8MB&:Tl/W;B=Iyºyv'V &WxGq1)uXUGx '9~(A,HV|O#H1}EnWyV'uIÞUƿǰo>c|~f 4;,6h@bcj̵3e^52n{"nw i̺ak!h *Ю/z@3 5% Q ZhMjt~L[n`!WaO8Q N ^(}zBcf<-nB7P^fsyEgZ, {Q'GCP!L<$ݤzHx>C'Meh7ߏ:lUu\>p_i>X?̔6<flx\L{--MG1úL%QP1iDC|>e"ayӶ\1j̊&`\1a? #p), tglAs%_ .Lpė<~VҲ`5S lte>WO'Km?z5A>XQZѠ9kl>2"xണVπ왘?5M,HogIo9/1)5ZL/uH A6'hHA].SșH-L;$03PHUDϸƇ@Y@˴-_$?M" OqRZ0SVF]Ƈ9y&u )mMߴ%9ɘT}S}C|lz4?z>wl@{kOߗGd[O_pv͙伴sZQ⯥#K$K.$p3` #3u9nreQ#/-bj;U-ُ|9?A~o1XOهua*GC*;lw'OB\y (SBkH lrtgLJ!SQ0Y͜8Y-oY[QRGj+_{\k^B3NpZ5!=@H4Ck\ BB .2#b6f!f$Hq%\y&)JiUWb1(G,UruϓJ"|3~a]xEsnrϴ+B2j0Wgw}]`0]ITu4&Pޫp`(#/SB*?+_"#Z؉}`{|`*_${GZLPƪU}6GljaD׿w&;1JE#&<flUp&4 fPioLn}w"EJm"ci&#~[:H'<6 Li]!#0kFJB~&CGF%8I'MOu+瘶)Z`^#UNzXWmgVڙ]J`jP̕lػ&5=R,ulK bFZ'؄̒X/EZ%JXWD:)X 2=yeZUr7KgXW7iUO1wSjHPw'F|< u: \oId)0),J8pt BJIjHlp}}eف\S:rgqSS Gn@ܝǹH5K]I.jFѲU~Ǘ'e9%5q _=)D__"R{IYzkL1Tao@;j[pv 9?q<劀 LSeMU9-|APVU" !%i -sL, JUvhx ]q]m'%!T#ʁr*;\ W榳b6t\F_TwҘn6|T OGtn9/J(EAnXz`#QewMdSj#y> 4uUоJ {\|m0j3H 305) hVYዞT zۍaUiChe ͫKeGC7C*,cI >#~9]>ʚ#*UYg(*O.¿[UA9+lJUeN @ܗ_. Dt}~PN=3h6nR3@ R3@ b7.x-a!19dQ"! H@ Bptw(T9-Kuᤔ"s@7͸3;Yud6!V9%wV$vZٲnKoCiIaL}?fɶ:&"2tE)e͞]o7p`˿d/2ig !Um/Ho#cpjc !\=:e6E]Uf. H4eFRfXZ)i.+1Yyɉb#$sJ!5`UF! lsX &t[5Zw%iC->vX=IW]w4ht4~)N'Oon*U ?m^EfFOUyvn:5D̤-\t=A}DD8w +46bdQ3VLHKӧ?~[rߤ?rص QR5 : &zj;<\u/dK@Ǩ3sW ~(_;1#BD}53W{㶠ʦHX<vIE^Q>4w ^Zdt5ZQ}sp9e! JhkeRAkje4*V ෗O ovo!pOS `7K^p%` \ot(z^JNx Ȍ׎_uͻ::ϒ5' ZE +X+9@?Szҕ[<+~XklwsbGM4p:Y`K;>YqSI_3xl\OL?hVfc*xBTwh&O@|0Q:ح '"vLD2g rjDtp)NvC#5UݺFP1 agons_ ؜'h&r޶R"ȲkUge U>DF>ˌ߫}i{-wݿ,Ş CO>0](^I]U0 L +¸1rq^K,X,ǿ9fPMߢ&$}$_EnUʹ X1 ?VؚۘܒbrxR4Y?y[ h^,}ίL8 s4:r^͑F4mĻ"ˇ?stYC zcd;.H 5 <OEf"qw{4c5n;&\cv)W!=U;Nxw oûm~C)4$dRx ![WĂHR|nM-lŮPCQ-}~q[ J\5#_b6Sd?úur^7,]BRY<;EOַT7Oծ%ܖJr`h=>.p5Wኒ nt\W)A~A=:6A'o]KUBxy)!8i?N9h!oj!Xu-^Ա32ƐL] Eo9+ٕ~ʈzS#s -0= Qd8} I[qfGdEhhtxT;0WC g O #!ȌJ9 c= 0B8Hi셑H"M@=Bp#RaH5)%<,ܐWLf*4+4V p$3BIVSaE +xg"0QtJDWxـ% ԿUŚP iɳЙZo+&_"‹Dw1Rҽy.mhZ ^rz{Flz_H}AY{5Kr=>nsh$>'jYI=WMi<]-oٹxlb>|* RMT3ȩM˓%1꒘tIHbGIɒp$kyT*Yj_YL.yO|gKe`|fkxg» {Rx,SRx՛,FAIS)|,Ge1^$f,-)^#| >^e1cj-^B7-,f+ ǘomJ=I6]&ٲ-,朶`o俭c vڂlKDM #e_MU,ka2SݚE؎d)a%,~{DakEKC0I3t-d"-" Ȧ%vX[,W^N4.A gmy ^$`^Xb+ZIQwzHRhC;L^&eB^`@x;gF9Νo |ϝk$[M?oNjf1c)b)`l6ɔnn [LU}(Κ;ק]%!,..o(1)8:J|qR9U>loOjsE>^-@s[_Ϗ +r/(3J }@}D T+Kz"'ktjn]i!ܶRCBWבFiUeǜF++2}"U+ViAxf^!of 9suM-Ōz[}:߱*gCm(΄?DZ@/YaU>|F.bldjǦ]iq󢎓y#N-;Ҩ^lY&&0M|7 4UހSۗ8v8vzX qǒ7ǿiNm__?5k/?W1o='1:Qz=Cyf.^l_9*$PT`lϱ0s_*~9' +VbHw^#t5ҼDuَ%-ʧD0U[POx ApPhX0xޗ(U!܏Ja z#VgGqj6)zxBz'Ù轢if-_Ԡ?UoPth(OnD&d!uYr?YE| D_>j!'C!ڊ_@tf+A@@k }94LB̴-a%9ASKFFĬ ȩsfF'0I^S+20.+_}ŌtxA#rhb+c(1\ ó%\$x]ІfOMZ ۴.%L>zk9-WvCyNß9{*|OR/AӶ to/{=C&O=ow<&0yeYrA7}(NK$262 ԱN,kUhw!D<,>RċM 6  dBVQ["j4U+R.).U8Ր| 9V}=4/I" 8hOf܍|ЯYп*SgDj8&MYI+܈jǠ};'">&9 d+-xg&Yk'hg;""j%ԫb0OuDa+[(:W=XLg *o(/U9F,,K>& *j5b&YUdg+z7jYh}YRJ@Y/ ̡e~ 9׎ֵt-Q_"JX`ɤKOWđߧ641s~瓵NR>Ɓ>®9VLzjмwPFVɪSdt{=IIAIM.%KpuLLFR NV#8:[WO4HRd}Ef}z42sk8"T&o7)\atTT$UQGE`:g1V0q!+m(a[ݡb Mfʹ2^Y5V 7y1Q^Im1AX~ pEќydۼhޮC0X;֝>j9ɰsIa?X&r}2k-L<FAnٙ|XAZ`6}rV.={)/ëy+f|LػUwz%,e蓯+/sut@:[GUc ^"ņ/?kIdgx,DF&T%$֠kqu\CJ+Vg0*uRP_y:h6AY p`yWֶ-:0 ѹ;X+^9t{ N@NLɃ;BZ ɐ1ybi?-n7 -NW9YE(b==yX?b0PGgtѣPAK e\q4crK8pKɗFr" \ /$?L9\tK 0*p ,Fjɧٲzd2*%6KV" Z EZR;Z؎.Z T-D*V ?eY ǹ3xt\c*1fKT0jf?+wO~BnF|_Y\*xpw>w^\"_P|Қ*cȍZF+Dt o5"mVBhbn[B 6mw4wZ|a^pV,@>ks t@ڸGgoDRjgzo hV0T3RF)ni{ȃ 5d_mڏW#e*F̂'% OpiwwC梹T]u_6_\=h4yZ h/]Z,W6A3ތoE" U7a@kh}3DĮM_P+ڊD/$B3%+?^@kD0v>2n_hOgsCx f:Jʱck5FU B"#]B >:" *>[F'vۗ +B%_ԸJzKރhscXj&=`Y305GPDWslpe(seVE /EiBe gYy >3Bʧ*+/$8sg>x"6k\>uy<^Ng RC:h *w&V@T}v%ޝiV`xxn,5&( )yt7[Jo< Ztht]dķf3ܧdԖSʮ^G?S:jP9+YK0}x//[crˍmf1WɌS%5{1TE~mw h383Gr[7W +co>d̗ /wo|P)6E ~B%J2[<){(69T?h]+bRi)U)T|јB(j 0gXKZ$~x&8}a/w|wh*//:W6T}7WY"`Q+4۱)Pzd͋`TSZ>1W夊yt19YxҙKiz\Q}w#5d|>5_:l5zm'(:1]Nv@uW5`U\AoCUi[٥v=AHO,XL N# .z0[H dw>45/N.(yl,L#$ņ3򆩳.P[i,gR 86_Ǧ1&>"kuZWTbWz=3Mu<鴮ڎx8ģpn'ey,/| 1x fgrnw ?챪t x!V $  0}W);CK] tU_2Bt45'qu&Lg6$j; m{>@4Ѵp@4m"QYԇ&k/ch*TihrWGu+ѥTyTv5#v;:AMqRiķu<*;T]^Gc W^ Zn.13 EV%k3IggPdSQA>VB/ p+ w'~ B>۫%# dcuOUaQPKfC,Wg|4[\dl! Aa%<foM $o<|KQq/`@Os|=+16=O~w[^<ě"js>_ֶnUʗoQGVHE[jCk QHGhVG"I w.ƏGcXL0in=DՑyy4؆D=l/Hp0l' =jgv. Z_>le(8&̋܇Ezp/OTbqeaO\l֦<ɩjv.bfO1G;OLI"P OvIN骏s S^z䖞E<\'\>9u A7gN@/I w`fjbPA~U[7n1K@ZLဍk2,QAv~( KĹe`Z@kB̲t.-5`u9v-I3ʼ"45#G%1qCo%es>Pʇp*b$*ި֜O[5?VGʮurdsq we1 >fs7/G2QϠ(C=?QaO>fW;2x-o&KZ ]X\9.`"`qd_ZzW %xSe,tW|EDP(+E |G1/VV>yD~x>T1/m4? >u?]B׎x- )iCE p(Ll[VFo`![03ۙw@m4+iWQuS:㾆:5g[.?Ȑ1Los9ͼd$ L&L| %n}17G C+(g= ^ qB@ Gءb *fA cHW'֕drGA31)B /}G o剫[+ڰAjCDs̕'~l~xj<X_h9t"QњbGnzX>W[L6 l SLf[%pʋrTE>E2}VToT_ vpmh%r(܆6 Fx؍^ 4{V+N@2\"i34ED ݌I/)Mdr)g6tP Y`Gj{~7=uP+tF˳JuR/cju?.?._ Pl m<uHslOazwUI ү. ~<Ņ 75 VAVC߁{<Ŋ4;zɳjv,ѵF5&$:}D-qۅt- =) eM/S9;ЂO=Xi;4f >j-Av+z;D7Xowck~qQ߁ DNA#j2'R4Q~n4&V%A.? ,+% zE;K4wOT"۟']; `,S_hY+iВ ,.RIH/Q'ID]ef~У̏l5 I F\|d)Κt/- /dN6lH '#i3k?LpLx.Iq CAyu Uꈞ;<3OooZc_̃?wfqn[!f|umtÝC3U\?6NQABy-f)3t,-)th48cG&л{ŏ/h,*O3wj@aOgwGwX/Cg.ZyEga={y:EAf^:^Go޸6b֒2|<}}g!!}r+@:,B<PL|5:jzz/Ŵmtob˚ee-zWcZe_˲>}i}J gqC7m oXMo˘ضآm1EĜmٗdl~ l,?9I.\ nomh$]pO4hnUXMl@9x P>0аo7c^Z3gQ!BV۷xiZ_`hWg3 02+F dS_,K1E^I’ޜV^]%2gzs:Ϛ'6m_FRΚLuvLn=R$ }h jpK\ӎ WáONKA[h`@mbZ"Εvu+ Ǝж2ОS^ٞlPQKcȒ)(-/njT\.FV%kd|;V>ԩ+ki`VXbQ$mL*G3W6U]6 02vz*\0\`lȹn)$/7-05bc[oA9p=dj1YK0\-?-Aq-h}<Zx%k :Np *\OÁ{##|y\V"ݙu5,9l~|YƚL\հĺ=P5/nI\QiCR~wu3S fh(HTK>y ~G;d fIy0M(SB*LQt2w޼(sNQ\ p̏^){c_vɪU /rK֥_I2Lrrϥթ91bd;WvD1]Iqy\ؽo(Jp%Hpгs^ gR?_aUvVx#/MM4u6 0gXي}lCqe}Ud!lۅpb㛠- ?3 g,™ʧfSGS*Sr\'eL7oc`tc AF*!R%xp8rފzgL)B.y h.#6WJF4ɶ"hf\/UZhtKpWA%;+5τ'7H-G& XۙNLoEr|7LIg~)x}^Ce4n M%i:ăcUReTфGuU/өwp1Yκ";QTi߃-fR/M` (r(*~5tqH4ܱј@7,nqOm~I?+U;1cXⱺwpc5e#hcC<QKtmR#ɳnSo$!4wj%7Rm5cͮN"y`- >*jn,wM %kk])] t;AʿsC5%+`svMU>iIEDyGJB")(#_EF| HC=\t|\ N~8-(D ̡")0 =w+MB}{~^{K,k >;pzg.S^D_ -JK kT&:m-|7 In eΫ.>VȻNִhW#A3PxQ2?1-$_XsPL"\ͤD'FVEJ-5]DHCg\PX0 Įa : /o,>iJ1N-aK{(!ENL!RLxn9P_a--+ǦCu$$1҄PÏu) p>J_W5,ɁąS½1x{ir#])timZX){3^\u .w {v[wӿ%%o9?<rŏN8]+S2?J+nSBZ'`w;dp7py>SQ2T,Ơ.) xVw1bTRGFA߀ّmBZ;,vgCiW)0RMr!Ä|6Z-ǍajҺq:qCcP*vW= bűŠi@=ԓzwa&q9VC^qAk 1(NndH }Q ;+DqM֥G,72nO狵o)*|8U"4@NKkߺ.g8l23X~|D8鵟)䪻 `RG㵟*?v8\3<7 LRJi.%Bng0ڠdc-8- -s?m%yS+ a+۸JLSlK*XwU9t~>5rIuq AS]5FCJGMjUZ\5/ vBTٱL:%pLiK(#u}CPљ(q?>f]b秴Hv˶pA]_1Kϣ$M=#P=sC`TFO,TCEq&A_1o%ҥM| F[лg5nt7]to (,+ 8\71T)gR SdV`miz䀙+_9:Ii~V:iln21;nCO_o6OC RytJk\ h6`mU{<5m Op[jY6bbdXu?KXÔȘB0+EM c!CO~ oei.)m.3&F;WR )M rՙЇ)De WXRZi_K_]@6BHJSX3fWbqjۼk"0*v. ߗ7MqܫLY=ftKu¢`Bdb0NйՔ^?6;2E7io`Ҵi1#=%$Ig yqJ%7:-UL*}wWL&p daʝmN/I5NV}W<WL0-oUT飒Z=NoWio~7f]#ʃa T5HUw:v+ np[w>nv[a^X 4$c:5n,QLW 0k+u]%pQ*5GwMf)n8j ,7 @.00 NQT0{'ssGJyN\v;.ӹ?Sji"ඐ/Hx#5ZF<}%-͈jǴ)eCIO5J-ͬ5!lv5PkJ\>JDH@q\Rvj;f.Fxr*'!p{^'So<1GI OnrxH,j%NW;@es30t]PpǏԻ:Űa &kp|Pp 㒪 Fi'lqsEcAƵج ->0T.͹tY).Y67(HD╞e=@ 1H'/$!|@, &!-WJ|h,[ο^ɟ:NvWuKosi, &JPuoB#ˢ)KTڽ_\W7XE:*4PHbͫLD!Vu^c쥝.mc8C6Ι~|~eRtRa]Tȍ8@M/PVEk;*9^e J”pKP//u% 8@FkH~Y<38d2%`[ u83f rڥlv4,,m &|WwUޕe$LSCC:)9a1wq zO(/W& ^t4|$6FLzw nNĵE| =E _9ܖfi6OERW ⃂ ydp@TXBTZ$tBrDarut{3l꓇,K}>y8xv3d(@nTF"! DZiigm^ M:(2Ҧ~ZS˪Q@^{lѯ@3 eTma0npdw^3^)]Uf}mo_r"|lD# N,}-* `bns8,_mz teSRfKk!J1F h1AwNhOA_Üraf_1sFMTU0"$v_c`.a *f?m! 8k+R٭~XR8ӥ#kI2Grr[jo+L^57M;RGZs}fnǒRti;|:|f)eB)V|#48iI)/uX6u6F+&ʥE_^!-f3qq#bqY>{0+.#`VԏYZ`.4ֆSKcPbs>+nBrzjm|*U.m 9,3 W3b;dXx=s|y4_Ѥ}Ҿ($.×-e|im4_R &1x3ZFDEJQ  ́*%Ɓre)׌* me(7dى?T?^C>Vni'|m3)BIr)qMkQ ;u꾎?֧vq?P62g )xlk޹[yZTW M-) V̽b #Ws6O:B/:i8$,ûYTv`oqc/ˋ _i^˔@J^PGhT${@PxQn@Y\y WpW`pa*J]H'ܯp8Zĉ-ÉsՄɉqW*dМǯ =gs9\"-`,[:%>G=Mt) 32/UT{*b,(O:b#Kb6̽f/VB?adksr`&d72 ;uw\NwEĥ!wKQ[?ݠv>\U&_'.#fi2ZGzNpagYy6 G#82IO2pD?~+\"d^ rf_q- BʇT>$AS T\w{++w[t5^F[+2HʔϔNVD~lZJґcI y,k >L}ۀ]+ GXs-(K13E>< nn*{Epf&;§,V~ӛ+WO~cЂBk:ƫjA=1/kt9O~09K^gbWEi2@[!%ky}@Zi;g1q2YJG_\khXy>()iI'.ѻpitJ#h4}Mϫ8蓂i`݃Er`LR *e Df^.ʜ#q5ޘ@ *Wڣ9GGe$'[ ݚq;钃wR{~GQnsI.!yikpz xvN/jۤ &$u%tLmght4̐;! $VClM؛Xb \f}o.Z}}{G~KlPV=)g?<2Bt*@箓p$2'I(*ӊ"䜍MOMb߇zhZ=ξPjB4y*< xb8nmh^hTF?.f-O&{ճkٌ_bۑ}E*QpO6m.6iL/⿆A[LnE FWЯxӯIQy4 6GOٜJ@#׊ЗVb]izYU谺 9hy;+]g^ ;@g{qAof Wpx`axL|mՔX&wD)5 e K7 D*hR̮1Rlrwq٪e bB+P Xo]Rp @P {|Q9WX2nyrP,?;eEWz& ڤ蜖i.T?H55&SC>iԹCo]\7ʢ)aW)1|Uaq1g bE)[P:km @ǐ/m^HE8Z`Q} *Zv?4۲J ϬL̻#$}놾ﳙ.3U 0[BiצZ~7ǹg5V>$TU}~:(YLv,r<.\Ϲb&S7啓}\XL&擣؀e{f@1]!irsWN]T&؎/+It 6k9j:FtǢ+qu`1ƥd+vM+ޥ#MF^ÅpSh\4A2(=o_fbgI$/[0`_|61Boa<V}~W /ÿcr-=>'NFu+i5BbGXfV)`fYP A YLӍAi~.?C P_Q)RRj98f47+Vs^-\R J+T>XKi^7fTm3}D:j^x ^I6"{YEd΋?C<\p|OtENˉ f筥_Z-Qyl klV+ej뤱kIIc1 þ4'G[#z!Okfp3,3!3LeH+Lj `z@A EVqnnN R_= Jh7_0$^XEXYs{%Πnm0ݻY"95xmtH[ + JzP"}Tb?zJ>GYfH3%`,C~}m*pL/'7)fakp [_oFs J5nݐ(#O͸_ߵ•= 3\ObH|į}% #>+h^~'> Ik7T8G#+ 5;E%mu1xSun-DCˣi`İ; j xV9aPC>#ܭ9^#~qyBH;}|S$ut吐^9t",8G{93A] ͸h SP1̈́OѤGU?@}7.?mGu$[\f8k4Gm7E=e޿ols&Jxc,.>h5<7_u?)1Oir;J-~[S.>Njқʡt1'աDvפ/iKn-eIM B")R؞l$]` 'cqM#t&~1d'H2W:!P[_rzj? ٽYeA~7/5i PHwSWi5@*t\XK tIjRݘKOn\F淦zc;b~fVea~;zG5Ƴr5ؼBc_`;yknY H KB%)lP-h"ok|jNfr4㋩ o9})ϭ@ j>' 5"*3oF %ب#u]Q֝Mlru[A{Vy:ė'W@½FvJr02BO8?JïFl>f_(~v%)q=Pؖ noC쾽@CK} |Tյ<2yqRD >`P9xL@ф4s$cgqC->b[U ȃgJ63Zk3$v} "\v){IWh.{>RV~մ(ur?VoYBJS)؇ N*TU겟lq倔 TDeiXvykqGvGyhֿ)7oFHb eE)$RJz#4ŢlԺu!$J7IBSAB债{?hػ-QGVhm9x9LY@'t ĕqt~ `}`XMFqƫ$@b`//|@J LP*Üz4'y9"4ӋCӭܜaZ+?eڿ0o #U=(BCDIav@Bvbh4ӵZ{4O|ON^rҊ bp&sڤ AQhIPtq[qMQ8Q;FG!ZV ؾaZ+Fy_îK  |Bx!t;15r^.ə\]~oyo^Y"l?Bߎ; '{f */q1<#wA=!OD~&Ngpc&\A]WiڃCMxe 0})OT./̯%%(}u0?PwF؏>j??:l~t80L_*-E|0C7}gT qp|OOh .؜|:M|};Bz:ߋ;<8MǓ];ԒQh;[=ZkL@&oC yMt?,bgO@ dY %z@ވ> *m~t }(}J o3bIDH$@F6;A.y ypN-okcAA7"7$}N+h8~90iwP J]G#4Db|}][Yԟ͍h)4¨ωFȺX4Jd5y:_=#ſXq?Pp^pG[]Ken5RHLlRp2 Ah~[j>Zp8WR輸2Lnj?Cv-i@uM~,Ql5v6iKEi6l_90s#p*PECȰCAoh!&v4o4pN)pD(pKpx2J8D MZJ$~@8L!Qix)<7sX,Bb:e3mp/` XGeXj ,C 0 0fq XwT[ M܃Pwhs=X0fxԢ ʡ2wI;4 cˤ$5sAܤ ~1KmɶkٓmFG{jX}舵j]ϐxޤ#ڑkP[BC1鈥; A( &.3x, Pˋ {1>i U *v c&MtmC7$p3hٱYgBnGf fBTcKh(i${ IARDGD{ Jtneu]Dzx.\3x^1d}ꉡ׳yY8l# ^Ŭ]61z¡MH,_)4糹=ڊB+·Vd^|Wv+kw?=f; eB_1E2uH'Q\P 'L~,~ WO?/@Q0֚DQ2+Ą~H=! /#buM,c)QJG-K);* *\Q4$0ĔY㹊r7qJ a]A "+ʣ2HTcFe0cp\<r `5aźnJLE&AQ LE~ } Z4d*n؎ Q2_P9'YuG x^ũ]m-Ira|EV"6 Ufw nnvi/8߹.poM V AԂ?EZmO=2w6;.pOw%Ӫ"= 7|@,y7aV&㼧jw`G$"TaTTER%(z~cGr$#288vƑ~;$q$HZ)J/Q!nܬ/V=[9rv[M+pPyGTyU+txNck;y,ctbEnCG/gt+x:q۟h]PK tы!I|MA$F`uJ'Nx;8։Q,m8҂>D02G.6L6?XL{;]e[]emЈV&m=j:iSvbE /4-S).}@'AJ.nq9 ;ɨڢ<19pIShi8bVp7%?Ӫk9F]\sAŅˋ[9$*a}֋Q2 k:w}xZh; cvx.W3h[Xp+vy K/rpmG-=4>VZ({RcY vIz:Ŝ?ri-X0jl]UpW|AˡR] iF y8((ͼrs#8\p#i |&%.ޕ9%3U\C] jGkd'MݶPd5,w4W)hGwoSω֤-L˱ҸXҿO7XZ8wpR"c esV~Yt6R,MJJ\"erT%r*Rgٻ7Kݛaވlc)rZņzF!?f޼^GmROpGjyb#կ>0̶f"Pg>uU( Un$S&"h.NPK0󵈡uz(gv~7_ Pm &u҇A eb $ўafKWHg N$"^6A)l`n3,ďR$fɫu롨3f`z2E f0Z Cozv2z?kgr X,r2"sTd@ ظ7tM]>#SR-b7\'~E lڋ`/vw+s[q 0`"bcP~D'k/(UpgVxN|IZ `-Vԙ P~o\]Td9B)PoX־w]$B X?\& 53X)%rC<1Tu>5` c&Tls?qq-Z~_7lȴXj s8=W΅^$v)Rt;F4 ַߟd;?ͰS y/^ |Ͱ'Ym9q2 o0p\V`zPȦu5jUloۡ1'CՂsKiK`ܦ>ʧ lH^xm֞$RQ'5Րr nu).ļJmm|JE3n!=Jq* `31`/ih>OnYnᮢLhUS4N~KD2NMCag5Jz2!Y{d|q^"vWFkds=mz&{D?6RI"^i< cbVxt6m<%6l:šdH\9*Iݚv;c+d8G 6^ƶR Φ[jɖ+)-ȢGжޢ}1T#[\3M=g5EN[c"p`N̟nMfb$lKzM ~.V?bX'~9PXOD{IQbf0P9/.PMFXS7r-CTOjJb=p2/~/*VLD@Ԉ n䏬H敳z*=]fejVO%e{8 Ƣ VL{}bDÜo5b|Dx `.79VGqUix@t@5R =r_^,CȒo-fRoA*ۧ"vVJ7"C< uˋt\FoPlԳY+IiP'p.502x,>.k61{k+O6AY]P&YWg0t65ﮉ qV[$'/$3ƸRp(^.чUK^.A3ϥB OpF> %EsU;_B I橸u!9 RZ p =\.IǶ4hمhi@WSƊXodw(竱Eb)q㣥u' d&q~JZll>؅q6\,}>+"\";ҵ,;YKe^}'^z,+#[;?{_׮TQmm;<x$^+\ĺ9p%x*SYBvQ6ɢIڻhY8-]CWܚu+[5OZ_]W \bGû|ʲ|̃lL[ NV-R@"f"6eP&%7n^}Ҕt$/wu5e'"}RQ4! m#O7Rv$4iě۹5[Y|Bv P[nX$`6;.WYXκ=]j @F$0",)p\=o滜cRbEU:i 4p5Va?y@{hȵ8 ýEaΟoUϟoE A"H'4NAC/Ύ_}"'\`=߸#d\yǿa=tŠ(c=)A5>}NK޳ΗJ}]FG&]Y}ukZm'6*Qfm wеF_lmtU_} ^xmtw]Mbh;&%o\xmt;6\}׵;&6Zr EFk=Kk/D"Qfwց(ВhPJ:#kWI&hz#)qPC$gimإޔO!Tmƌ]2q%ɖl9?8Ӗ\o31g=mc#\ êҜ3\Z?Ǜr^ɼ;MCPr@ClHAEĘGNw.@^{xߌ5ߚUoU^Ow&|dXF+UPԁ>>^ ƫjWeP-79b> q"!:^>C[yT5 BpQX!N.m: ̃.COG[m v |e\UEI17%M;U Ј0 9hM|tÀs7o#s%WJFKc.!v MHAS[_@qAoύ*S0~ۏqTȗGO\'^tcq <4!o;o;L^{p*5 )ֹs`APi֍!|m%Dԡ"[oF'ғ>tհOhUW4X>݆ox7:RoL1np :CǢó5pո7Ց/mL2XScpiYCiMޗѕj8$v2G_x ;F濮uzt0>\DcbH!q@8T[Ȇ'[mD΁o#Ԡ$u$:KO`b:lMPbKVQ0@X zD^Y!#ңHZE~i)`znm }ySAһl\;oK};Fswf?px?ᕇB=G+1[_RA莏SlXV k(:bC8{-Ρ7i<_=邭0 *Bw賥!$7M m!~%p{3e: _ 63t{J'+q^  LT#-65ّPh_3-Μo5mj#uc*@̛NصAĴ'+ / 1\ȼ EkbAC H88B5p)5!ax ГP'̡XZ%0mJS 9'm1"Mg{b w6о2F䑡ۺ+ȵB_X#Os+QbqA$ 벇(y>8puEb\AjN rLȉC7$ӹ@H0&Lbz&wD1)]Vq6$Ғ#{)1 G!쩍tW&r[l*ڮH) 3n)Z+XtƼZ\Wkwu1m6cU := '45$@q!6 -vqDf:z3M+ 敆*ah b=Oѡ{@î$t0d5pš $BWsջ=hwV\$aemofl  u3<@[07Ǐ)3JؕS57Xq春}HMu״P+ɾC]koTd9*2u^HR/":xJ% D6ɈɆz|^42d?EZ2a-ǛaϠ0e[aZjWСىtg ^w"ݜN( tb *܆RK8' G8(a3Y$ 2 mWfh*~zq=%|+ H;*إw}eǒ2ҡݍ(1\!?b+\ z|;0'oD :gͲ۸t lUċΰ`'*J{;]J:S7eQh/w)@iE+݂ ).;0鷄#2.ϙ9=6sAΩ1s48؀DzW. .wpi-E%Wu1){xwjQiA52H(;; }᝶N.>x')ǥ~oNC" PGRB+i~:ҵbQ\%%I|Oˆ2J#P.D>2I3ɧ6|6|Zi S%OG|m'|o*F>O jRkZ{*o2H1)`PONF=܀;EPseZz,pVzH穻5zr%RO1ɥ>7$s)D=&䜞ʹXF%Fk}b-69D2r!L5]6ފL]0i(Frd'FTѪ2h`"u IicVO2m22prd9(b3A8j)s +O7'3MN^G8DŽ E$ZܰAh[rFhDkԻBsKѿe,aPP]X[&7VZ{Q(,Iuw'E zFhQ*S\|ڧm*F5ǤܓQM䞨wRg:ݜ6i8㹧q.=3xe?kZGE0WzXoR<|Y ܓMIQz%*i= S)2~ڗH?]S ͠KOH3/~:PoѼ%ʞuRmRS)J)2x~fR%QotMLJM2HNARL2H$$+#2jPK-؅XE5FM-]fxjjQS."5򻐝S󞍲SU$ȧht+L;LUT$4ሡ5H*$U?#XaB8Hk+9RIUT^䋪T?Ӣ~Ul$G#DT=IN 'IhREi9DSiߵS,b}qYФ0*We` W8rJ4Zcyj3fu)|0H2ux vf 퀡u߆Ir>)¢G#eQ9׳c%S}g+Fmyj1",RxҸDm)_^ƝQ/u٧D LHҭD%=mX:p{_ 1;'n{1"uJ/rA&˝Sҹska xD}:l>:uXwZlZXoV|ء ]m'9J")Tofo2m6'ւ164o,%2wR*#\6%u0GFs/6xcK؞aW~$ak0=a|ORP~~NB3vdEomj7A`6&Bל!q? m\1q%b%)ػA'!Z`n.HFq[|gi*nS~!p[6tK3ڠ)VTm!TɈK`q97aKXyq`hgܲ^ 3OU/ l1~bnǷG[ᄌ 6fҔuIt:\-GZuBۊt|ROoS j ְ5WQϖizcݴ}3 wlX P<|'zgDV2t ᨏfTtoJ|χ+BTBZgn󏬸M+Vĺbt8(bl([p--BN%ِЫ~)2#Yɱ'p)NN]+yOt E]7 ܼoth:6sq@I$G݌z8 oM2{p X?5JN3̊cT)D?&b8fޓoM!ۼ:NOtR"3!39RZ=J ^ܩ*2>|inr>>։#ɍybՌIq27]0ZRΈߍ_Lq` nJ'.7XħBH @5Pw'Yȉ^ԙfZCY#W`KYcE_vcHuVՈ-] p$L'j(6lsΥSuA"ly2mh$) =ҵlQIJ,Cu}MK28飧C/u ^h@dFVj9O«̧vzV7H h@_1j(j#CXcDIinoox|7i_ވMy-UT#:EVL,q V܁zRZH.P\ 64C$stm^Id1IQZjMVm 'J8`Rc )nMOM/$tmTuF̋ING₫a1XdbD z;b#E9F~+s܆YYn0t.t>M[w  yMlJMnӯn[-XQԲ< w0iи.M9<jUPvA No&cS Ey+G([&? x|LY4|vxܷUdzz~vnMdxO|`lcu';Wz(?7BZksXJ6F㘦rWqoozL4;WE;TD@ZvhvuLki;0T{a>a }/%[@Cn͞јvB:6c tQ\SR8Auog^޼ww66!P8?FrLF?ѰT[t1>]3+ ͊"*|dh ,EQ鶀'\JwQz#ܢbې:t;w1sEJ{ haPx7iۡ zM)n' 9kF (6z/Q Ae<ɛ]socJoJO5C=b? j,F>?/H_,/0F$=uDz-&:AG)v> pExy[J"OF'`{`{9TόwQͨ{Ǹ4gY+uh/CAU\=x8`1 GUFcf{\bk lL<cY 'x2@[N2CfmEz AqQpJ$ã%^ xMBa@'4 FøZ;Fԣ_G(.߱ew)c} LS~U À0&C)3X-P̮pbbuaL7ĒQ7hϚIHHZ2{Vк2P-Cg[wQ$.2~S‹bLߋƽH';֥`}uB{&B|cEggq';<)WE}[x+:FQ#$5O';w^ٍ˦ZՅ_҅Hqzt\> K}~ kTrPE{LAmE+6Ģjhչyx\ghkX¸j9ՖDdׁ s a?Q hBK [(9*uԯ6 Bt0!zH<άäpl0E|"BP I͆fAK*4&4RJu,m sV7d~?aX0VhF,Oi 4'*X pLgV!L xzR`GR2w;alK7@J)Z¿VR(\^X M򛉡ef?oM^$E;xφ 3-2kUECފg=)DȭڦSZG" jGA=n,Zk'2&?8x:CK} xUv;+TXTPF ` $H 4:3cf薨tZqupFtFū?0@X *Al[NUWwN]}SgVFNA{ژi'q%Ō[ČgY1cqNwČ?jc_;3>3mmDO5:)d2h'jƳsL>'aۣž9Z4*Z,'\HK{:UF= ".<^ď(~>(~?![ŏfx?&Ѱ?6"~t?NvJwcǷ|(~񀏭qBKqˮㄏ>V~Ixρ>eF:ot%f /3OFS3||:4Ƅ1UN>5|zKA\5xg&qqH { =5, % {ww{fv %cB!kXpE XM>{%_3_-Ǽ^Q?o#yuUyR` 8OyeLTgO@L!䍂jt(Rs0[ɘ6wVER &;zw21w_wp==se|kF]LӔ8l dSzO߈,#fGR?<NY["q$x8\M \%2<&Gpi"g(at>K}Qo'#[URa#_\g(di%h4ڤj5k7cs/)pg^0•Ί޴/Ä\ksLTn@ݫ'IZcG8}nH3f>[Ud|;_wU떏fb7"?vv^:]*9#ZqEjn(e5dOovG;Ϳb{i^".O'K9;rdѢ8-)аu^0+kG&lvȐP?6lZOe^:›Y i5;#36s #1JW7T*l_/nmnWk6mn#=)HqVm)V|뱿ZWIp3#g8ۀ҄Оeu;r}olB_⃋TьhG[t`gtt3Ψ3;tF<%484./jM(M哝(Mާ<$̶xW3u_2l7 5ךlY8|"+tҢr9q qz/ 3#|#aZUGuyI-E&WLL\C?mK-"PfL& K8c+M%iM3R;|A/X҆BqΝBO =g<65.k+ǠՌA~Ġ$F댜V-]hު@qlUx.h3¢W41-J$,ڤxhbA7s].hn'0ZNc;ZVu}ˏDy! Zgѫa~ȃ~>bT`ieDoKxr1ܢ XJfP!hBv)KvEk/@%-=35נ[?:.885((A/RR gaxj:~|PZ"@$˞z$.BrmnŔbr.3(]nTuJ&Rs(&uƠRR_ ~D&]{M4V!`2%1PQOOA?#{xOFB`AFN`&F&3&\P@ɡk6]Kth*Qy_AKPk2I> F@B*YaIsR72R*u#<qaӟsqX`)e2u,,s3++Ϛʗ; (/EiB;BW.C&@s̫.Y;rvEFAAٺJԩG/|X-~9!}NkA.l5>R.ArjGGըJ4!3w}%} ?td#-ܼͽ-Zii"b珣s+bQ@\"ЛKyj 3b 1wD̗ A`:P`#\bx8&ק!nkY'܌3\s6#ijݸ9rӤA?P:;_ Pu6l$PW @vOGkQu">;nDb';rl|Q SWeUZ0(OZyC.x&jxk?+F0Av{"+ D$&ҩ~ h#.  DKGL;47SnЯnA?>AU7_ Q6 @^Uk[ U"?SVp6V9Nr?bg,Os8~'vA!yÿ :.۸l΢\ nC:-{tmۼ;_5V|D_>a=qW@cE130&&.P鑔3#C˰}'Pc~S4'N1}AE횽&U;MAtldGL#HOXt[.22e'ef#u)eH+#^b%e6JHk%rՏ-/⍯sR?yC*%nV(@`(f\ aX[, W V'卩w_zl^84&vD(nƃm8)`-0nHUP;D4HN6ө J@-|i V:p%t %\>5F؀GO a-mHmx{䖓acbf ׄS_3"#5{ohMe,_*kdiN 'JRQ.2|a cXvٜ%$ bzRB+g9qh+W"yOb E]G:>}wu5t3iV)$3)aHKcm)N#˻ҘLR#kf&ОR4$#ar Ȯ+Ŏ ?/V|PhܹU܂bm'k+U]1+bm?K `V ć \vn0ְ|ʴ[bP[Qrz2"?I(edjjE+9]w0{OX˪ΰ~n\TP gcCѹ?b\#ՄSn4B t ؓ`cཾ@|}vוG{`[Rn`?,k  R. sKVqa&ztaCu"uu+-B#z <+:G 3Ea`[WQ$遝[MN3x `Y3*VS$Jfe(bP0'c=A<:q譗{3lx}3ZhW5ZsUD8qϳ\ {,ڗjx,ڇ7`vk1#kq;O9#Zr`NjӺ9sӥMq8lֹhÝ^ZTIDI?%GQZ4kQwjׁ`ə7]nC\㞏D&Ia$&b e&#pb28zqkMj5m#Dէ&D1:iwdj +٦Oem֝;ːPpB߻-NAB$ԯ$L곎2 0.O"Q暡;W0콝i"bc#8TIFw."vu)qXFQxYLڏ&";Ji}“W~DifMHS"у\HN#C7ޅUVߓ9;! sH)"TD4X7&F17yW~biS7c -c3ɭ07O}cr6dž qzPbƵL]b3u8"rO숗럂2=V& b pޓX5ls1 Hxo04OP`wF9b> k  xaqupw`/YC Q(*7ǡ'~%BO_j?iq7@us7GN3S1^_O*!%΍neS$ *.~ ZȋڲQKt49 *q&QG #'_Xh4O4MsAt?@fD9N_D4 {"kDaqA^ d$e/{/fGA\#~ iWƊH a~!?of75sbD` ) }鄜rMR x6jbQJ̉m-Z'4̧ay) h}61yq#2+IZ:\5\h k,pXe t>1[~Kh0(N7Oxv|s_Dv_kˣ;bEY5a^Wn{$)OD9?b_U:#YHZD|eقN7VGث_3l5oD1Te-yGtF_uUՀ*vbsEV돱כϚ^M'ԓ_gV(*PO%Ikܭ8bIѓWG,=y=7l KK){5YA}wgw buvVT-| bF_vXۓΌ[%rᩰy<ű_m__,SO(I_m_r% +- 7D%?@_N|<+aiOUȀƭQ2`ja9Cd- 9M|FV,? ;iW]"ԿLHK\l)ZY[="=~=R ",d0PpM)OM XQsWA; #`yB&v yuծBƼ4Qh^Eэ£hFut؛׭#{>riW?Wiy)Qn[zBA߈^J}ӏu!64QDW/S18%[e '[]Rf"n<:|I\ s>.ThF9k+u%,by;qhn*] ]Nt^<|M>1cIcyrx1?d1-~(pn V N6ȯfF| gUwGhZqR6fGΈ#G!!T;kZ־ `>I힐symUV p[/eOujZŴDdVK\y}]4he5S W^XHZp^ KyQձZY3bjeDȯJYgLuznP[wZeoY B2KN򱇤Axβ)f=_ofƅY*nMnd dсY H 9˔zC˄ZVC[X<`V:BjY^0X)&⎖˒m8s .; Cy# Ub5˩%07Q^ʟeؿeYDB9uW=8 Y^湊sc,G4se/K%(/K/x׼,ve9_e1Eï~ȼ;]?nE˲kTV f\aS +2"Xa>O?̚Xw9[-T}]%6b%<~r%N9aY~7{9 47)-9L>btN)!j`'~4jᇒZ:AS@W;I?dUoD aod㏂Eyms(΅|K$>?QmFS16 wgOm(r܉ч,wgTpMno?3kTVM&3L^,xy=CNBzz1td)2FG!+n^ϻ K,| L[;)(o/pEHn8CVGy| gF %`<_aGe,}X-a*[qDF{)'X6\-9$,ԗD@+fgC`ɪ ͛B4"\jʣ/ *Dt|IO/?¸EF孚K 9sUG0HX2 r!21i"-uYؓ"+"ZltTIZq@ު/O= UuX`BS])W}>t}TNG;B{ZpWN't2©Bٛza}ocaFPGg_Nk$#j8mUUb$st^Hni1ݓ7]Mc)*=kX.+5H$26?$)g9%ѱ[ hg4#Lw$Ԉ`s{vb0h`盀<\=<Ĭ$YEmjSLrsfm IoKED7FҫvmsI5.]p8ǒdl)dmF-Φ֙\IӍ.aE[g[SR$zӂ?}!aP7: 7r)\Ý@?#xC=MJnoo; .>.-ՋYj3FԴ9cI6"ICW wSFQc&q:M Pvl@AKsv.W*":iC^"`PDTšab4尃\s .ܡ3PTGv{T3{[&?([5!pw=uU\BCѳ|)=COo= 㘐w N|(yxJFIԅ{2!u]s5iЗ d5F"wy-vQ5M^tJj{` rG^^ Pqg>h F8eeƝ (x={ fy3box :*"٘EMJ􆓘-q2AֹN$xB鋕p2QC&mxB\j__E4rpPʴNʆ+F _wb@|1 Zl@7zbzKm>/:doC ~ ?ӻL l?Qg>:G?8h/,#/Jl<#3P9 3+zzOzfz>Y hiuOO5&͚?Zb?#Sn)¾^G@9O}It!O]s">W_g E|]gDvVbӲњ>]$jJ}yWqo nu}ĺ>SNs/9MH\ɺ>aSקU;(mjCd7UvAI#vtK#0Q5LZJ]; +)N {ꪖ@=.f˲hU=fVb b19Ф}3dE Mh`&1GЦp lpM_=ڄCFUvjCٌdS&.vM\)0`4T0Ƽ0R) AFC |DvyR6v,%Fpk%(V6ݟ􌘴RZ\7)a6q.07dR5 nCXH{I -KW9`% L8#<)ImET9]&GDFLۋoDBؗ"I38!,^T%m1h&=e4P2dd_?, -㯪v ąnD-{qً25kT$SqzPMU$ZxߣvXO6ӫ39 L7ߋj|S,جjZr/1 "{O)M+$7uv@!W B kUF 873YSeЃrZi6&D1Z &R׷4⻩jjs(3kn}8tXQw^LǥrXm8vF665jM7V]D)%}șhI{ ?)Z; Y>heX19b!8O,yVEh1% :bc =(AmM$7MzZ%!Éb-hM䲵P.[*B\!0SJc.aQ0:)V;YFncc^> #Ț>Ҙ_-myLbscbQv R0tt>`⁰:٠(ͣ,M$>^p5 jF{H-rux >oBӛXȠVUfS;=}v}Ro"T=x{iFf}3b`Escd7Ƣ to=h0F/ߎ0LKk *NeZb2ML/PƗ}Bq@_heہDPƉh 7@"Ϧjy6~V)0֕<ۺ ѳܦ%[S,7\t5JߌUb4#^u!xn9ZUuGM\k\]Z}\kwk\뵛,zI͵JeO:R4pʗX2-4T++?hXl2'Ve!|'),bk sG|m3d%. T-Ryo{*@%@j@*P]Y@eYR*:IThb~|m&ISLw"GR<Ɠ\CU<;{-Rv!$PsF].t)p]RVu)Hr^FGO&]JTPio8|hfURW.0.%)鞎).y.(V,VS)N)+& Dbw՞~_{[PB&@!{Q{Ӵ'Ǵ'? P{2iO&шDp ϰ4O^{BV(HzD&ɾ*?sKaiQkEy(Z2Ԣl5duQu G)Pé]*G/e*Gy|&GK ,S$QrPPeZ"o?߉'>![dAdK\|2OfpU|2OFr bSQK$?Is-ŷ W BWlWN]OjSp-`*o@럁Av>:LjL!;;Fsǽb[y<OūD|"J776)Y尰\mX)oXqX kxW<*-v)Xv`tVVKA,;\Rl%gpoc۔tѕBOGK:1\|e6<+8!=& 5YkRդ% *dRW`m*k*9JE}w*8x~t›&ON[|J52HWTA>!x<~=rAu~&D4D靓0yBh = U ~0Rȹbߝ63JjSPj':[-9-q= Å&)#И TaN>oѪ3xa^lb#;jYteOCfOĸ(/bObMEe$iBkI'n*3*)`ݠbVѕ>0UgYV.D˲-!huuڳAk梂NWy4\|pSJ*3~V/@d3+3ғxP pnx@vj].8+׀*ӅM0vvӵžV ҡsVKа5@f{KZj,g`^{j KoMcx6F#(嶺Ji >67=Ћ0 ߕ됋K~z'4xUk2SM0MRqmJ5mN}8. ˙MҷSz\{Y4!@|X eA{xf84R7b@HH .PɩCڥl]NL.%h]< @"^~GnH2>K*Qh2 2C{5ǖk–bA9Hs00vkѡ6<"!Ӱ}udN%<ܔ^D PY)*ndvq1S ..>r3aFV3?mŪv9ff=Ѥc}U̺ba֢-:f%5u ޠ1S~0kE]5bC<Y8fiYj[Ŭ1%:fmjԼxS,f 5f=8cV1hsJGvl)IC4hO7Z=GH:;go/6O4BpZAVb~P_u?76x,P&@fY͂]ʆRsizHw}ibz?]̗mYe.8᳏hhH-̞uvpf/2ɔq~>.iI\OAl(\` 1691K7 W,!@x@-gtLj@_Nt{yT`DC2@ *mxnh/ȩdO` RG)y ?֊^z>/C.<%<]+NUn*`R _<hRDI? I\8E 6{y-Uj 4Pr*]Yx}=|Si6)uנJˏӋu}X$^6T{yoSIP v(7{CΗR^}/!6#%!`8lqr\#W-h 9arNPq9( =3TX %HZBjuzp޼jd_qY2'XN ojZ&1V U+f) & S jt!R v]H7_HP vnA,C qVl87 Fn37Ъ^렫9msk4;Ae0 ` 4a|c03OumZC V"72-lnPqԯ⨋GLCOc`(' l5k+Gj60a_ul 0Qĕ٢:Bl>kabR֘x- i!̓Å]쓤b3ť?^pm݊@ Xgu}sy-F(|=)}P+\uN_9PMeyL_.[BW#MA4Np<JwC$\ch7jXB".qbϨk}Y{. @{fJ;vp_)ޱbXfڣ$ .z1i"Қ^ãԦ+9]p!^gkIc˹^9%h-fVaBۓ9Dlqxf075BW ON5^ vHo%IoTxhoP{kU7;ۺUt6۽s+m{Fu't_9|}3n^2e#U~5nzUZA*t)(mzZ_b᱘^EA'~X=0sL/ 4zﱅj[;i71t8#{u]½a^ξ;^\8'Uv>vS<\0b AhBh _ |ʁ<.(“ÏN #¼ҵٕIg6s\ bdfac6!ABJBo~_+Z.G&˴ׯ9倐臤/}/'sف7pAwz=^Dj!Ԗj{$´Pkc*NdZ䤚l+X)ӷ[e鏃 ÿHS/Dь{Pԛ"$Djc+}m٭".$Ζǥ;ء>/r[>4dnfK>Y҇׎kjo(BּoŚOϚKz3tlƋ:kkqin=4iz Zlťy4v\2WtoG>/+}W_p7a2U:-/SҰ3L5+}/%ŨY k{j^Hz!fl!>ʈnq6<^kF,R-Mz].VB.zA I)F/e"Aӆ|(m*n%, $>Xf]\%w](Hj=`|tw%U>>mBIV#e VC}眹لH޹3gf̜9s藖}-U痴쿴SV<G2؛= ~צ a5q2LfGj(:qbŷiI.A?B@¿QSzG! W[zr;DDY KaRxʑS}5ϗ+Hu:K|:S,cf4@G׫måUl8,x1@I-#Nޅ1#*1@ $aO2|؉]ɑ6Nsl|x?C?!>NGb,A }3=RWYŭKoJe?ꉘ z hGIgڋs-Ʃ)::hL )bGpD7CÆeg!Ჩ\`Cӝ1I6}G;hFte&:gIW%G2st%C<^?9[[Υ}?@:<~lj T>FU`.)+ҥ- }J:kvB2 zk-Y& Y N6IVȉ  $AGUec$o -CA=&܁s>I u?,N Q4t26;DH Ķ9pSg#e"<֌NP꣹(FM)3&׷8D}oѰ%LJ)8&1_!};Bx/R 4 PX'ۯ4YBR|fmGI<|p(.)/S0tPiJHWGψy4DMYѝ*KVe|X`Di(I"R=?3Tҙj ɀ1qx1`x( oQ|| CE:bbm2}\; uy nBa85- \Y.~uCc 2mǝؽanlzB>-W5Xm crֆ> Isƪf7y67B4eIdTᔊp 8ꏱS>gdʊ ODn2P!f~p';Qѿܠq F;eJ"+e Kmz47^u>W.Iiq#m4 f@JV|HYq.D&)BqV\N$t PX#k""a^[ ٴ $d+< <qWՈfth+@7mv5*nLx^'2&\ (t/`=p+"ڗfV2+K>bt LSJjsݣivU86c\= ,BJKھБOHi]aV`ftNf%'}6~'揚m#;|_-gE%JB3TTI!0spo,ch`4'Bvtx`H. ՂP[]E#'蔛SM5 q}<>[)tqM >KL福uwo(ގPqPզUfu>ΟyS(?ѕ~D&e\JaEAJ,kPUA(rDf#/k9ҙ.27 VL7/_&?GĿ׌0dx^pW)EPLNȁFL©!"Zxbц%=x+G ЌI0,yak"m L7֤5)+|YxJ)"`3_PwؚVӁ$>`؉Wu`y `;:= tx&C+0}xN^Y /eNzq%t1݄8 [Q0HpVDaE/ܢ^% c2`p(\KEaL f{,F|! E=F/adz_9ў$0w5.oU$PK3ΐW\%oWҽrtsT镔镰A+ '*Wb+qJJBTfe`z6͍k.}$L-$>?|NOQU@n!^+ R k:xS__!6 !)a(k{@Ts71IxϤ[/1޿, fo4AS4uEN4:hjO`]4AS:hjàMgԹ$,}8W³#-^*zط|L J)"sJ!H"I_.5 ^IQOXAhT'n9 v(==R%UnF*8:qu`wi/pOJ\ *_@7f*u5iz 8W`4&V໶7Xc6ږq?q=MǺl=)-_a#-^7f3f K^ )aa|hh/ߧG)auo}5Nmqo?n#:{1) )k$V].g|*h$z|1|}Y!x"C g 6 ^oq2 !Ed- kI=h891/cռ'FIh1WDsMhp| [bAwcT" DФUgwoY۫FF4e9 oJ1.wԀ`25[o0ϧPk@&̸}@䏾,]U <""EsmK/.x[kC)m/nBαt$+[KUW.a-V" GBkF^5eJ}Sɸ5%M|{^2n۞Y [6Oeg/m"Eda+``zw#]ksLNn)U8[fEpi]M{ 6,9ţŒZ-> Ӻʊ;Y[hK== PF} dz3l{[y[5d_O'bi^p[UvH1w |rIX?'X+:۫ijQ s ,<9г.ve!=uoppY1u7}ھ${W@bjE<pA("hCڔ,cm5œ$kRKѸiZS^WH4Y&kL55c]loXHM閞}7Ӹ_;C5ulVSh]Ǔ@.*fnMIj {B57JRY |.\Baׇ|f D-\\Z;'+|\KF8ƒtd`>YEI^JAbN[wW9C+*V57. =9Kz ߁U^Id3>Xo6qǥغԱstȡ'c@m)vib >1Ibp_QPd*6*3"&]\3S$:#gq<zOk5++4]3I襕 ?0HTkEV PXSMK کꭶmftKV]:UTmj$*[(.xE[2hU{NնLa  *a ˿s|ZatľXxىk$"K|=) ;>/X,]/*ip7HI1,nh MM iLWţу7+=fBZ煟G?:|%[~"-stBǙctE.L?%ǧD tX߇sIlF3:9]* Bhyeb=%,(ªʔXBT[aa[*+eP< _fͻ5X(Ϫ! .9T{R \o" {ln^ʟ 5%Rccڀ@`KYΰo 03\'+aeffP#un2[~bt0(^%zVc\"`|D]l"Wj汹}ZXIK|%1ּjF y ܉l$;u{ uwsޠa|53UqJ`m?*oJAH6#vIFZqf}.8<‚ⶒjZUS({IA7|w%oCJBJٕl^Sy‡_fB ^EHEL4MF=i4V<ޥw +~5k[k+d_&>r jVtMk7>ԭSiqtyǮ't7J2'as?wEF <, !Y%{)b?Pve2 U>Ioџ?pn*h=0oކԆ6m򿪉qRmHN 1;N ,W]*n j٠'r4sHH1@Tʟ-:3FXk>)C0?4) N%g_%yOJʵ6컊뗈Z/S8W8kp9{ `~Y:A #4ty/mp>4[(O)yѐwXb|0+y"\վQEeeQS'rT3E.ȼĸD, +>mB;ܞS@q̭W͋Ov?E֊S )54D@ F2nvY>NJ 7 =)MXlv kKGQA]M&bo"Q#B>gcE{s# V#U"WE3|;+qC}T>K`{R 4w*liQ=&oŠjV+Zt˟R+he'M1[l WP:^cimidZ?0i@SH`|M>D,7W9 gMJrZN1L,UyR9Ro Ԛċ"! tfzGh-NxWd6g(Z0T;l[]$̨UX(;:>ŭY kXd~%|bb}A.UauuD'܋^b NzZT4_ x(m)65qL}(^AITY;II'y/a|g >! CxAnKK#B}J3zx1PNSxV ӕ>IVEwM=u&G1'J%(=`򭩺NBLqh_nUd^if%2ߦvS'Sҟͅ1)Aړn偪fGo<˔i>s0ݗ*TXj_"t\tز/S:D+hW%t5CrLoӣ ^QӓbS D- 2he_ oJxYU PDŽeGХ+fe.Tn-aW{Yx췡x\.Ky82;99Yyjx }44TVLlt[kxRfUجegZUg<2)*co8vgɎUꟐrv{@-R}V~e|XscV,'<+lwU#.|{ ؇r bJe,wb"f6+2פ㏥"%0#U@o|_[js:IlnZ첹v1e}qVE$m[r8Ed9>\ka\t(^A1, 9kSu>|q%@Xҝ01tosIZ:^k`Y,ؕ~>ع?'{,)aݵ;VATXiI =t!ܘf58M}EA:M_p5C2ɺݲɼ_mE ǀWKI0t j$B(UQqDQAdRkK6" Sy-'̗P[}[AҷxSf7Gn4]iY^3y|sEi<' MI#8Wk4R΅bxJ{9I,TI@Kk42,7pk)4nZ"..sQTxC,q`šnl$]HI;BtƋ\7c'#Q\(vi)d-^>&6L2[VhF2f6$F9;uߋ,Ⱥ&Hh($,]`P }+fU(q6֋!oЏ1WV۔Yb/nyY 6+BqwxExɈb($w<ף.Ck}IK/8tbA 5hk"_\uw[6wx]':WT}\^!7q/Y!&Bj*l9\ر 4v.,(8;Ne)[n*u_ALT- w^kT_ (l%RULw(FnK:>F)R~B,+.GY)Fцn[/H [!8+ ^]/ԷLw$yJL-ޥ2ϜG( BFCccasu[ p,k~)N}!k^T@+1!nKhjŭNO-W Si0/:h1HCK} |SEx$$["E+-& | hXy.Pw]C m(Q8!* Ι{o'ͽsgΜ9s̙3={v%q7wVЂLה4#%:f4ZV=L=ƙQ $)_BŽVM8ȝCQ;uK '\l;5U{ 2Ŏ D nl {r:d$wpgWgVLnkb2i!ŕ$s.Φ?hI GR{KMu$`c:;m'W vm#"Ovm[شWZyzm|:eDaB :5iިd~4Jq[|"Y{H.JUNY{ :DbJYhV]M|at0OL84ݗȒ4F-<&r/*Q%y)ϣ rY9ĎyoJgk?=R~k׮ij ~Y&p#n?~SRؿMqkĖ$m$#--mc8$*5.hrN9H)sV%5j6g8k:#/189ԔI oD8 MDew'TU)WݤYmPJpIR}rIɱJr,RaJp_<]zH&ttǡvj V2u[+2ss+a  3v(֥5b|V)T2oij9-HJ1?WRޘPƓ; deX_vq+UYl2ȃ.wSKAh;5ːĖ\V0;fN1c~aY|#'cS$لOk4Sd}`Qm?NM:Uk_y=ܯbnMec(\ '}XZSD^+*`{ϗ&&b{e1u)v$Cw ( AL;AĀMfygD s2q<EncdbrY#Mq];9(9F~,o>ۓg_ߴd^Rf!yhN@ԋ7uޏPZ| *)7~+m1{߄ ~=DW6&'^h!'a)HO+4ZxAL=oA[UeԫW# kdС5QzCoih%?ߤ1Z`Ap9^ i1X_jX16;V<U YbԦ!zZH`NĞ(wn^[.uv}}kN4Dg9N,밷Kk,Gf*+#T]'rܹAZ=+I*:/l'sjs"UҖ9 uR9CQi$T9o+zYXvXꇡޕV20c?:> q qbtW ]ZbQDt8&?5-:Yљ( 63glO#|^N鏔l~jGi&C ӣK'A xTr<3 ] hZjI9"$3W5Dt:`TC57R-3%3$µ%;A`NR8<SJ:aagSdje_'@|U ^h)x: / cZ#l^L5za $zj IoZ+7CR; 5D&kh( [2$YC ?#lqk֛Ҳ6I(:t9[A" \~41vN)b3Ղd hX`p/|JH$E + 'y;daoŃض 6-?\zV,%hI9-emgD9^~>~4AZI 3ZO(cF YLbݝQ.󜎖=}e.w*3f5#{Oր x?tmrzO⎾ I9r;@= ݤE^"܄ ZR4~xF @0`l}€1%`bʱXx~Wk@B>FnmEuA]*r ߈NKAEsv}Xḵ%!#@vVؙE;ϟp?7bx09lnװ16Q$TA/oѽ5 _=k{_M0iع+TYpLޘE TqnȅmbFĖ{gx2(wה.4Wk8PYV m HS+l.%_4ûbz$ ̢6;_([EWJjIԐBԍIPB]LćE> E@dӅҌ}%) |#]1eVs9F'ic+ Le8OyrTf G/8PxFl؀D5YA6!fU9t&9P7?Cփ#:T &#Ĕh1sdTP.W79g4dlPqY]m#4Dr7h=wrZ9xj[2( {N2t&U}Lo:l,ߣn RڋuldKBNZ^r]ﰃm ~$Ğ"Y4u!?1>рP Uu5 P$YyzLVaPv@VoE_[.]kI.kL/NDh[Q8QB:-kkޣgp(F^uW.lN)HI/í< Pp/_d By!P I y$( CgVRv]lȡ[#ԄB7}1ַlN|M(t$kV"ގ\J;Z<˷9㓓) !Csy]x76 t63poSa۴{{(:@CPBwAƢE{~h}C9iיv7[g{aP2#Zoq(؊%P̧ll|#t )oumYՁQ^yM?WgAJ%n#0ej3xTk0n,`c%ѝg1XP#NT_4jcagwXTiEXUO*YXATPX =X1]&'&?kN'_s;kȷ^rGU( p<‡4xC2> d8;-cfM)q3$dv*0 ^85$)=JS rSSt %TNų ΆqHݙލFˡT5&_*Qir9x: 8Ҕ&JQ~'wbBnawRcF; B!:VJ@G' 5TXIB$#9zl"M)l]%&b·nCo DB4jP1z}n\UVj UQ#aB(3Vi5M@zVj،UsZb ӉU,s6o)uwRΨꭐH ]!#~h։[D.=hV/ QZp=,| 3p2)ԝCf^DA0]6KC,,N^*G9ʪ$޳Jk.E,ShrPTtcկcK*ݸdN4VEIW7dsfX*[MDȁ2CxZvD<>im.uҳ*pSd3+OA |'|I` !^ f"KT)_cүYBn:2G}79.~TyVq$QY_9*p_]Rv Ba=P_Eu-нOEe SywگZTTlV;y*.flw&i;Vͼѳc1@/jTr)iG޲ ;UЖ;CMv)Qw*vu8MCYc*421kC]#ú3@"㎒Fkue$F#5Ҿ( . l%$혉qh8%qC,Z»yJ(${..έ+7D$ ?RZׅ|Gz0]cuT-4XQYB`;ATOo6]M);Rke~o *߱W3‹Ba"otk̍~+e:Z_aXx{lst5B5* }zM@TyMQ>纵񺵩/3̭ w ujٰj# w6smȨNsXaVP?{F[@*׳`+ֻZ 󄨦#6S]83㧘̌EN%(0Al}uz%=kީ:!;37\6v&bp9v(4IQCY#UgalMtxXE+ʉ䘁䩚kc i9du{dqͨ\kW$%TJ<1֚KDpæT)\۪ݶkpTv s[Q `NT.,$%.yhPYtw~>~[gFvxVmgT-3EmJ'_;M@4<'F<eUuj1=ouP N,-GGמ)#[KToͺ傸4p)ǝZz!Sޥ@B(r%CGx;?Y"<zT%É8 j`$2%_q;/,+F [UZDE1~"zQxf )Y+8Uro~OvZ=":N#Koh=吨Kw&Q^xB-@ͫ~?Q\U>VKئl !< G(:~+#?u֝E(SRczQ AVn똥% OƣUgͯ$!U4g&.z_Kѕ;n0jzٴ ҉@b N'i?A.N:6(9ccpFs 網T~B=mi{oD,r"_0a^xpPx7 \]`!`m8|5| G'r)[e^rf]t*ϓK-?Iӿl4$K) UH~N|Ad=3_uE j`Y`: ;KaSe@px`wKꌐOw9 A9=Zv7:%^|VkQȍ )O ul"sx1J-(w:C؅!K3UoA9&IM_:2Dn"הӈVi^A\ug~C5BAs+=|Rscsx=3ec=,7"Tk%xLnHV7?)Y>ܻiG>7b̥K\7|M0Kn5مUh zA%RWv\C yqB^}Jv(Je4Rkr,k%,EMwyK'Xza; MjDLc&V}Edk$4Q Bjpx\-.w ;kJ{# XB 5 +\9ZxルzHk9 uHٞZKBq<R6m3'>t;?sx`4YKq品AJ(oZ~΄T(2@l0xjBe/bT{GQ7INNt9y(ZB^B^E}@XYOeO) +Q LWHss|N_8a}q>{R+I;b?2_ QϟNqw0 @ݐvCz28}w7mēM\T;?kz9{.tr>a q͍Kz}iJ7P#m횉 mrYWdmdrjR\U€( ;A^Eջ8UB_1n}xZoMW-7a#ur2Kar<5-H?hoAnoz]Q+lc'ƢȡNoDG7ܹK (w0 :"6q'6:Άޡ_y/Q~DB~:)c/] 0^|AZe#ڗu!kz vx7>''謫:*LD=qĬ ZQ4,p֪1eBݻ1eQTm=*iKkE2xZ) e`<A6n'tٛ\Y֣PH /η?˽죐qqc-:NqmLSUr;C]ˤO(2Q%])̵:zbPYwf(=r1DEuoxlüC^,c|37mД Ke127T}rYќ̛̛8=]#G<65،R '*ȧ/pzajՒir)/;ҙ'Sӡc:t*^5{8юjղIj\#w55anMfY->< X: `6u|z4Vӫ[lvmWӵwzBw DrU*$;W0ހ&u@Tv<5D-mF(y_tQѼ*.'q>-;cbcA,VbUCA;xweUsARjȘHy?r8qq cOsûT{Ӽ񍦢ߖIUNJ1lL*T;r1rU Fbÿ/$$E*Uň$MŚoZ_=# c ju;ޚ- /|,mxg:W'zw6U/#vz=HGqg "\wFXN}m8o=[c ?͏k=~M@ǝTr3>k+'{|% tΞiXx<7>GArޣXN0- S!O c M(@ު:~=0h5L[蒦+ך#JeĶT])4O;6yS̊Bncbdhr$u'LL> { ǢTzYs;85t iUWf:QފPJr%dHۣCYr9ZԆpgPbn")&aُSTs|T|{v-Hi_YGT]3 M yցη;8?Xt䔡 =lxQNUkQXnv ~T=BdT +?kqz{ $P7M\bo_v)PЬ𲵼MbGb_E#o/v(Źn}w[d+=؛T*-w޾U6JnJ ±].xF س6 -}qj}E4M|-tTO`m2j,lp!hC+*ZF(h"~ M!0ZgM| KPyP̾:4<%DMtɑIĶ^!viW1/ zsPɡ=\ (}3@APEO:NDPyn@ ;(%>|-'@.DD ZO[ ^ ?*`'r'&rNu%A "\z=<REG-wmix^ @!hXH-΢r$eau.\΃+!PXN /?pw8g/)*j'I|RXFmF0N+k,I@+gE:JN^_c~~@G -1rP"ۜ_c_h?^!.kTx[v:s$ln5 %a CW FBA;pz:Xb= t~;e IX/4(D[2]!Cp%r{a۹vZ9IvU٤m 5l4|1Ah fR7:@Uy;vAߘpR3&R̾J-Bow4@}SO}" ~7X۽耈NdhMᣰ  q|; .Gm0fOHSBfA·< %L8g b Bu4`3n;^u/%8!(`PO\2]IWB'MD= KؙkPPB/mA4rw!*^EW]hS|rNu&NE!ANF3m]P%s=[~b[9ɼ y/zJVWi[T7-h5#ivAwPV;Abɻ9mnK̦G ᝘{R9NŢ.n ?S~]8qM:WGx QA =M2VpU8߫,ַTxB_9#kTAT  .3k8{{mozHCzniW6Dzu-_mg9ѭXam)v]rrOl?A.:}3u9;Pe f't-\ c<*w،o%k{4|)e )z# 'V[:s!4H{d1R uYv9.{ܧZE9<4`yC[M6W ;ǹS;>ۀ4mhqpbsߦbxַfJe;iq[>`+a柨E.U{'0x#F_)}τ?"jQs ~pmz#obXź6ӈEZZʎҪj_hVvŽYYz1_]Dq"&~ޠNU3j*L7+IE”/Fm? S;Hm<?MѸ03j3 ZRg %ePA r+=j͐VW6c0 V4GVK)_)H6  Oˆ:³IAjwAQkar]uM {ج`dbo!j&jWh//k?zb T^lO(բby;e/{>1fe-[qHy{ar& |:v30J YxfW_ X'j=3!A+tס+'xl8w I"aidK0Hyaܕ1 6t6zt!# Z#0 ej(*Yh&E`-\$F[# #H}kKqT[6~0o` њ9Ye$|G߶(ŻRVrHj8;cƠmiG0^MmcX-Xc@FMRwQuOR1pR |P#h'N7G6[!!N;(o̱4)ܷȩ)](vUlHUI."ۭT EQ܂/4[T( \{fI7YMVx3p 6 %JG>nG yˬ㛣hFtZ kvi'UcIy;0 vu?BM*JnOȯŸjC>L2rUjG7 "ڈ luSM,n~whg7?0ݛDCӛ7wlwL]|i_ZjmK>=EȔ6Ugێ#wMcJD/\IA BdJ"U[ d5җtmuÕs3gV]kqK̞_$S%31R'8W< Hb8}()KGlGtt9'Lc9cDicGs[3qf-+)Pz1Fl`{2dF;^^gNw:ֶڶm WDސDCK |06InL&UK-̔&jQP|ibI\YZb\{oAAB PlRܘ0(E wιIR}~43ܹ9{R%)8cXޢ,_{IM[b\'L  6`=Si,*Fe1&bxrxOȨMTjޡTTY`S55z=J1[;*Jl=/P ucMxMp>ǚJ|T<-Pl~Z<-@|BioGqԧ7 KEHOUNԵ?NUsR򶦦fhyȺ݅Y%;:\|ٚ@1CGx9VJ ~0 )6{pAQ#XS558[~f<$(glXgWGlszg˜VpgC6c'c3J* ;=-`妣23서Oa8̉e-\y#Z.Gɞ-%Y[N#/4ygԉ.[61+}oI^4a<W:;N t &(-Rt,:y˖LnȔ,2^CF_FW&{%p53-4D;swf**wf dR[:^U  ob"Y[LF%% vg3icbt>0@ף1鷹b1*1iUg|Lδ9ms V ]hO٧g飐ZmKmVONeÔO| xBf"=]z.?vn8~<[ץEkVE_esTq.;;Mwb>`$Ŀ-ע)m_c#֗Hǧ<Upགྷ3e^a*qZe:0GjemnfwL1:a:!DYdxzč|r i({Ijyfex Bvvn֘ mhwZi6jP|Vjfk&-Bf; ҤMʄ!"P0/1n@p7 Cl/DWW4ga8&\$y@_NjY|1l,B?Û 0f(&mTPֹ.  L7 = G=Y~hbT=dx}#cQe,_ ,qykRI4?ʻ|^2y*X׭ؖ9\] \-sNnYcR6~ ^o TEa~H&U([o6]܈Ës@%ᡏl$T\&Q5eM<"c޵_Oɮpvf9"6pO垼X''bˋhA^1yU N:5]8{]+aE5zX6aV7o&zx|-+;k˚]ˌZge/m'8tskJ3x $ {ǭ1q~ 2sX_4@dt* ƥ'Mq+]w48k"K x~M %)xkFʁAK-0p WX*yqﶱѥͮPH`A(,JR?')@<@\pM:B|Nd?bvIK㙊S:刍R"ca,Be+e2W oq8)-'^l8VOJ MTVl+JwӜb~t^ϕ旽{΋J|iA1(N't(%u55@UL|Sd ).Rz. = N%W!6Bc'[jFh_G|qw~w~Y6FJPg$ ډO<skз~5x ـa9WF|FƸ޻p7W$&i uƕv0b%<+jPvK}ɼpȕ#.oMlE}HU,~k(+740C? W+Ii5< SpI6F<}7 nfA4(v0xhl{ՏNi И-uAW-t{Y{1[qb]=O |G\3S{ J\ '~s[_Yz884?I@"aGԚrּo,a5Y@"#:t֧~dVc*> CA_+xI=PJN98xol\~a_5i|A3:2݁h#\&>CrmV| 5 :7#\ %\&<́hP^#DuOrnȟc@:#rZ$"5ȼZs@5.ȱ iogJWkj'[s0  sO8_soᭅ^.mO6ũx{Wo銷Kocx;cpWM0} M=~ZLA9' uy ~f]Pvҿ(XoZ1|z$^ϐ:SZ߅T߰;OE_^B{j{Ÿ37kn!#dxىQ:{:}P=J}eu\9:泌>%D'SlUO\_SHCK`!.V -H.C{vOSl@߶@ iCEF,ݪK:҈5H?C5%JcBvM$;8,S ;%kؘ8 Nqs / %fM@.ºP%nh,1zG`,NLe(9}iW`ƉG>C0wm =-EI}}%Fd`}Vhla,)Wv.<< OCwn?ɭ\>eRJQ bŀ|]g.V_!}<$1R [ Tɐ#_2>jÏrOF5 _ }W#yTt]K:yk2A|4@|nb;#z.}]Y!;}y;jUK(#$96@Wi}/E睲_?aYTkG`yaFGh~{ˇ߲{d 9 )ZxJ=۲kq\q|v_! GwCV0C_*@6΃7-̐>?Wz֑ծrTșhii;^Tv;(˸th]}c^P:js~ 7}OOsw 2W:ٴ\+SҭY٧bAw`<ָzІ'(hW91-$AQV[ډQ"xM( Ѹ0Q\9d~Yߢ/v G,NesҰ/dP6pٟ'7HҹV%-o0Ҙg/D#+- Qr<'Zms<'3GbiroֽcɝҨ$\ܚg!<wŬk{6Noa7_--/GOK8 PDRB+t%׻ Sh9 %FLj"Olx.cÎ6Ki99&ZOBO[RQ{5㏖|NKT|-s1$o&yPl.B [3QF;:-Rnd7HztWپH"MP,B;4tVұ,=풪 m8ÎVىX5*0!VMgU#Ch2aS|!%e8JW3k4u0gJ+Лި}De=93GBoo XSBpaKR|]Yq-B<($R@6VfI1PpŕaT`؉v vN;uMGGWoNv7NwY-{KҖ/ >ޣ4f2yr/P]iBՓ#_qVD vr +zGhC4brvmzS5m@>TY$;z=Xm#NKئ"nKAQ*AJ~ءMr*eGA5pgf݌rIOlPl4}n$pϲ<͍ۍx#.bfTINxJeT)XCK: 2-$S+)k=Z@A4MwI 0P47FS1W=?A.f by%S)F6A$bx>N;DgN1T$)S\qxXZΆ͋;lߖUɭ-D n)\iL H 9Ź(/އ㹧*AYĔ 95_f3;˝wڽƈ`IG,Q5y\q?UwRBd{h۬ fdщA '%q8I}zRa|zFUZy.bA^F9vnZ;"K?8I?Χۧv: i!BL#- RoFXI7]99`JGŻ&X2_%Joh+$|qeTҌ;hӤ }v^6>+=Vц'B{@C[bE#/^|*ƕ5Qgzxm  }yϦh\.`&o,wbg~g:{;|:}B\QP𺈯v`إK,yX6BJhBQge/ΨE^)d~hlLڹ&:֯Q#"C P$*EꮍP2j=l|ɐٍc[OgR[rK:1§0>$ 9 .uvBX׉MSUUr\Rļ+k`nz$+G1N,ſ9.%n{.22BU6 ?pq`^m#W?ί{Ke@pty0:hNn9egwRÙ)a}j8UJmB^];L>_pFQ錴tV(R 24 ۉnz؀x14M؃F,}W]Z?zn aştyZӌVلIr l(h25x)O2hkPE<qy6iQ&F;*{1Jd[ m& u&X O6cwMk䝛#SGzF?? аѯšnQw` '+Y[eet-cpeioYgtVPn~LL:\Rң`){PBNahWsՃs<4K6+'kxTUtS+I HX#R,Eq&yt<1_3yi*sbQ,9+xHʭ~E>q\$} *[e3@LUCð#dd|M3*|:VNJl`=IKJ#'.{=C8*&:w8d_dVO29}ڏudyRϋ m9=]f^IwO[bёĀ7ůG(xO2lғ&|owRgqykO03kct*$ @i,) 'zJH/6Vtزsz c#1F:)xقw!]7dR<]qQȤ}xJRt `k-;d } &&C`%R|!, }3J,!ㅊfqYivCA%l-~_ճFw;m2ʆ;!h> y/\C\h=ײPwhx| <Nx\}I'ƥJNb (4`n{x^Xz1KaE{߭Z\SuaҲi)H΁8*gra/1Y?欤>ܪc0]P*V{bZ΂J)p)>R*ֻ݂w~޺Z)\U7+&tҳ'bNDĤ^ڢE~L,eb#C^**v*VHrZ.QTfI79i6;7,F53"Pg.:s!_h'_3$C휤?К=|Qh'U 2:.&Jߨ#| J_aګI?@7[ZAx\:84iӻ{ޫ"-;a8cæc(QBH=jAz!0(EwHN+ZށxoC&yhFITi\#i@=Sw\TURz}:>=lzNGS6=\P3&nuO63A:OG"C1P}XQ7|R0;̋]lﱩ9^hjML P٠?u؋qa~l9sGoGo'V%8̃F i%rZuZ0_Tlq3AV=uTzXn+5 'cIT]w56mfXɒQ1ГQc(wB]Z?Wlz`"FFBe2%rTlb&~wiH$].I<,Rq7`&.|ZvZӈ#Y j8Kw}ϔCZtN=^vBF#r{D8?B@ |֎+_ !?\zMw-OZgPI86a9 _۹MxW]&Qxdym$)띠[ēm$ljOhkE>a<8LE߱NrS_0@ZD)~`E5op=Pa=e o%h٫]ޜXIo|Bmf)]<>$EtPЪ2OR5HRo }N9f:+R[En8eEy>c;= ;9Q_}Ǽ4H Ԣև'\Ʀwj57uع\J%9ĕtQ^Q)t/_Vƭ@Pp86oO+-!Q ;DLcȚKOjVseovl>␘!y'4ŵ-7fVyl<2\YBzkMlqX~s#-> 4QKKLE0 c ]A* W^ÚT ˸èqډBoIFc˃z.ݏ//"hPC[p:Gw? }EC6w5^A7Vm(&7\҄PF4 @鳗Z_VuG Q#LJÆDWƜ ĶƋGق@~_RQVWI;jzI:Dg*iOZRxe-RނT0:gqz `rcF!x|j,"ۭVgdae3Z~F\6ݭF[*[K<铭4ݝo=hc9 s) n*Ҝ* [یGcC0 ~B}]-3 m^u=Ǣq?2s+n&-yQ4M+ I+'&+ *ɒZ+hRoEh'Eq{&aC58BbWc-z 5݌0 75Az 1:H5`Q;,tkd?e?*۪}.+`dm-L|+Xr#k4>_=veDL@饟`?Fe&gap*zjFW?J#0܌Ɇ~_Գk'}B2ĵzX`5~XD>'݋k@tU+)¦=oQ=} JqbwaY-XZa:|wS}i[ӗR BnA\נ}Bu*|8RC(E 9u ]ĻuZ:Wu&1ƱuNa5A[5Z>hӅkJ m}F.vBRe7~t5(zImMcfgK!]@dZUK/CMrk M87TXi8GR+7!j2 `Qz9 J.P OPM&u_*-``a ,& +*v;r,[JXfǺϧHh,c+E_{ؙ>p 0uK-}Z9k@zJ6b2Y焗/+[OZ~wU}8&B Hȕ^ _&@ hH_W=)yNe!(WX5 `_ j,c&}RRFc;,BIPP[ q}A"Ak|w3h_MӠK Ϡq A2M` BI=FЖ ʠ+5%md Lt- :WFEA֠GF"=̠tAg1!A+ ˠA;MgЯt}1 tA(5L7oҫ9Kk sРAw3UOy AӠ6^= Aq&h]Ϡmc}GVt/j 9>͠wkG 2>à>3 zE[à)tAm A[#z>àd;53}a)'^Ds9<AD㉉~lnO vN$LPk |/:QS~ ;wVbM5꺝I .uS4K֒ۙcOY(IzVhys2+Tq6.F6-?VqލK8S1O_r/"Nt}nnA>Lw}*T=&;e6 )HxWu-S"&Ȍ^FIZJs-(n n}&9 jSxc6t@4] \s<8HO Թn$$w/B:8=sRI.,}1q(k{囇|3)7,_6廇b!|ɔo`+ρWґb~1}0NPr\7?|}g1큏2lyʪǏ3|r_SGp_VCG@}ydP4tI4ε5n 9_9Mqz8dJurj bMGoQ)6Imس{5^ݐKQӕmy\Ve,Eid} rn*ٝ2f\T ܗa~_ChaXߜfW &co-xtDAo %U9Z7,tnVE麽OfrV LƠ.A}'[&"ky'G)sv%6z"sIHaг'XY.VD( 3/Mf!i=9 h,-5gX4=qQ<]uv43Hm!aa_6N¯r7 "]]J0Cg1~oA scTYIOȹVEg)ͶcwSؒ 7uyox_5&Q]5%-Qغ\7i3')n4QP1i^S/\ܒ,k|D&"gl4pW6cMiR%(]w#eNbK8~ek 'E~'S:0ތ(ۄS8b].AtQ"2$=[fJFBM B 1r*N=YTI/1VB07^o9]$ұב>pEv2@Yu$Fz,6Iޥe `ꭩ:^?xs,< 3A'+敏бp|^=ߝb4`@ 9YȂ,;5 /YZОՈu;CiӫvoU?]+}[a-q?CK} xUh/$," ` ,(&4hJ:P l 0IwE t4E83ˌ@ k7Q@n۠ BsnUuw=Ousv!XsdgxZ'=o:Ͳ#L{vơ 3'Ii O2?jLG:Vs' c$&vI1H% 6epդK1FCZ򲓽?W/:{,ca%oCZ8 ュ֐2zAx%dOu,i-/\l{Ѕ75ՔƐ={{ %nI㘝 z7@מֿ|+*G9?7wƋJNm 'i/:S?&?[͋j3wN]~F*0Ry=9h|Va吩'f`rS*`Aaai3.x_aӆf?ϓ =f`Ea֘Q,*A3'~E1.쌁Ok8Rp5Hٷz䭁T*)w;?\m"NIfpY-ҳqM(埇_H D 'Ms((SnҽPnkT5z/&Qs]z_d=\ly#(v#߯[LbqtLJGs^|!Rcm1<<ۉrDtЌYڵFSL`?WGf3EʾcGMz<Yȗ 9_ w-~ӃzWe3DQ;U!{'7VXw&)mӺIM,B\(-դZ92rOד[~K̝la]d-p%qd r| %֒x4Uf|~+%G|Kz!~HФF pWI>n`@;s5X)'skV6[Ylz[k]Gj|yL8L*Z! 竳'}`ITUaB~yEg*8{ ަ+8Ee؆,K:QN%kRHl,Z*wq;NWPfC3>{E [)hIN+?hVKEĻAWz$}!\j-* _ Iĺ`oBp 9 L7e9Yv8֣5Z7=HVIȽFU}S]ޣ}І:jIRJn\}f\k!Z 3[Ah>uȊ?_i<ڥBzfM"sTO8 [B-!I-*hZd3JR5b0pXpn,bRD3bO&Bpb6Y{gvw"yie1&ގVG=׋lD'"M8*L XbD)ZBą',/:@JtJv#.  t""qC!}փGc| {ƒDzRSٯ-Jr%AuTE<\0N!B\ k8Ç.D {UzBB^qBQ.>#=N) EL_XbVJ>ωr34E&}4;xSgل2-< ,I~":RcʲB"Wf.mCm#SIdT)^F}B) ˔IwքOsz: R)C1i)gfg1Iݪ+&o%Dzehmx'B[Y{5:K&.Lwhq+ƑMу !sE롼\;}Hʋ8=qmvժNTxYH;Y;J}> h"^ 4~(J@N*D=ǣi@ta%RѦo^`JeUeh:g֞\ħg-8\$!_79L^?&)MsI,xf5%ogN'"φo`VgƇގ{n( g$ŷyڹ߳JdINI# n kŎ&#Qpy#)jаqD)lNvQUB\̣!][fyl;Y$@|޾@'Yr<7K$i_qefLhEc $^.?KJҞ=W]KXA3ްE9 E|jo-19.ܗ GQwU$0ET6^JP(> Wٰww 'Kp;{-@E5 u'/ivX%v;+ӝн]ܢg)/mf2Fse'{ovs;y%#Z~j"KxosIw||qP|W]rCQhn&_)QH=~@Jd@J@HL )1e2r[˜ֽ~V?Ѡ$>db3X#I lɠBr]ÛK.GM+.6zHp\gIy@m$ 6xN2ľ`r"b+葉׊D am_+f>G)pɧ7`t@K&#T*k?MpV(Db+GІ3 &*?HK,C{W}tj-tyex];V2f}z>D_pʛ6k& e&]_%Hޏ7؏ZRߤ5dtUi[y9f[Æ^&!* ̢h"Nr'-썍 y R74a7K>/#E!@KWK̈g޺fzG&patMLcH1aM)"s+OatnX[v4- ɍƷw0pap14w^v'm9#i@AAX-zZPZn7N|fdz'3Y@[Z5(w{+m1c{[_V7%` y*~~xYRD _A{&[>(cٻwUO)KơΠQ1.}7avI:/. ıv(l{^%5-Qt)/K1,FZ*㼪4OEH*Sq']NEԹ|U5[YυH.9 @'Za:k)Nfn/nsbhjb;琿<]Іkוepp˺wɬ+'#EHpטϛ_ pV֗  F?,0c]gk{l2>;Q&_ cw[Oȁ`,Oӂstf}8twcM[q`J=`˨`u(_LVn~۬ E|vD^|drِ/[^V;nv#0OR2p2*ak٥fھ0o2+f(IC po!Y.9Wܼǩ3 ]Amf(R`O}wKQ$MS@n{FwU J]SAg*Zrj^39wH4m1 劳BZmЅ;$;(/=B3)?,4N2^AKut70/5ݎӛɁpCBd8rO}7kS𴉓wyL!PCH`cb +_?Y #)C\dDw,mzeUswzo @Wm=CE jxur|?$)OCCb?Sb#%rf*dpʳsSޥ;6(9`P{iH _}jeOao/#:oO7I% =-J$EȚ:9c"*3P=1G{aOmڂc?&읊./\TK!ϊ0q(Wm}D5Nūj hz$|X`gd?;g*@p?=xKj2" YeDٖkH!BX%|"Fnk)M8yܼ_hժy3$I.=ف~e4@MDD*u0O, )Bj|Ol`4 PGXw;\'E+&/qpZ@q0s*DqY9eXU-b뼍Idu:}\YИP,dFErdcY;u/kٳK\*m/ FSY`=zٗsfPSz*uĠڵP2IOE-#TN0h'nLGR} XOj(rbUv.VV0o.W*d+8GW;Hk4;9%pȍe~G԰PH;5펯vzgWt5ob t};2ԘP+1p>݉h]*K#vJ;P0 (>E!o`rh7 _di(/qd#:a至.I4b+qr @±nwUl#"Wث!&BE2Õ(JuC dX Ę]J^O.o9|o4eTv*yZoP$5|[Պk d5)1kZGPa[b#bIh9ϦA^`j𚠤Z*ʎk:|5u@,ҕ4X|#TsP^G(|VQ BV 3FQMyk zH(6rREt8N܅2Oo<ʦF,nNk!3h a"_:W%Ib5%:ZȾ'b|B2ȕ aMӖ)WvNL,EִPn7Sr2nlyšr H*bsg`Hnue|oLbH8: R9hUj۾~3VSe+ߪʟ?7X=Ŷ(oC2%. '9>4l4MNʞmMV".{T-A=ĒD2\)au[M)E)vSLkcsl=y~C9uBnIi+VTĽHH53|;ur Si5Ix[Gm" `ah&FD)Sbh%v}G>Mb!K&T}+{[FA|cEKFoqbEt Soc8~~1WMCLi"z;loy\cVY lڗTtS4Ӧ I&5Ah7X6n侥sD$fm5 0W:*VehyEqd`pĢ )VMZ`-ˀvUoG<%c4lFΒh&USPD)dkCI_6bLz.}V7L6ƥMЈ@Ԋ/ Ԟ/&Jcf2ڙ^F5!;ғ1$Ơcc9<}a,Ӗ:a^7xV%Cr4M{3O}R_ :`zI:x;uM%uV-5 #t`GL|jɮt2&khqm[34B1;ts0H+.GE3tl>"f&tčJafֺMk|Ψt1֛k;o+Oզdty>xUkxZU+Ut5=*pWoCmy5 Zkyfrn{v}4\XزgGQq#"4w({/SE|.КAӰw+"kFKHcWSN <(f6C[lI V6+Or1Su>y9 -/כ^S-ZJ뽤UrWzE5|5V3,הSɕS5\9rWc@bpeBܦr,>X [ _ń(;Zb*&6EMYo%VGK,fħ%>2ژ:x{5n0 c\KVq˕:%m82ߩK㶥%ӷFoFXo.؅>\65@:WR ! Db[u3;B=EaVUkĶZd@wWh| ]o|ׇVPA~K<_GB(Ѝo %vUuu|Be=93ĥRuIm^bT^(.6y^'^@2I-_b29m劺(墬 fpÕ Pd( klܱL% ZhHߥfUޞZѴJko(iTM_EsʂD xFz{ݼ([zq/<)ol^?^Rxp<9%5X|~innǬ :-JfzD/)d;ɡ7P:zH%'칞hZU 2.9? 1k.Vk$H|c:ZU$p|^!0H㏕;$j`Y~/ss E]+'j sc)ŝC.L $NUٖTU P8ffIs@'ͷC%oZyJbGy[`kqq{UYyOk; +؟t(Ea=RݬҕWEdXս$˝u;܈΀yH ԑ~VRbD'#s1&֦/w#lPQ6ԄGY$=Bp?0oOBU9H %}d=Ι2 ؍sOaJLO@;;Ӭ`f4~p A|Ր咷Q 4ɬARX&ᒯFt?Md#w ٗfA)b+H/8Fhϒ P-k,. {]JM~Ub1gR^W1mtN hj ;(*>S_? vZ1V%݀UMhD_2\iY.9.< ~.cRH჻7!OXdgެ<r3+/XUxwڏPO6;,ҸP4=`Q]ݮl^xwo v}C4(~a uB o`Q{7ˡbe~\^AKQ0T5J{S[(1 RRo7ޖU\Hh|]ŅiGcmoXO7hm%) (:(n%ʡ %rN 4]<=QA:Hjp I!@kC4[$DfuDi؝Py7B坸]A[X Xl%Ak5cjf8tܡSU!NBҎ!- !ݣ}%.+ @2}:_oWbֶ3 z$/̪oYd7yn4Df/s9흎~3x~`hzG|izM[4o*Q`_mgo{'-z KIsEM5ΥFfB;̭4&.2qeǢ*skT`0kO en enten,*s{y4miZl` &c$Cyx۰͉%o n(\([(o%ԟpG%h:K3>I*Fxtƛ41ƚenO^Hq|ߦ@W4UE>'2غl'ēf^cxVx5TjY\_/ŀ.Bb˿I_%RkXϷPa샺Q=)ˇX6&6RVֺ ibX2 )bC?K~bː[#!/ߪ{d}.Dڙ:F>m0#-Wt3:Wi:㱐Q k|5<]$eXPǓ䴟O|V kX[s9}j@u-KnmVҫqkkʕ//y9XJFƑ"t؀jGI;>[zb7XnHaXOOi=müz:tyEo!=UWh֊|Ix{hFnh1NXu/wusu9=c3)Rb-Zh,-ȕ_ EbnOMY `x{˜}l/, a+ ﳭ-}6v KݺxGbh $Ƶ°a|^qm1=/Ç}"-o?K >-ukyzO 'fxCUI[-F2OqmqVi6H,d7GH8_2>Ί\pd6) PAalF!BR7 +=(;P>zMzj Q=-qh`^ԑGK-y(?DKWmLg%/4/+_jXrt%EKl-nQ@7EKW%.Pıh=%hDNuﭾZz_Ui+|M/AnT9AygS+Q7CȞ:tIsK䘼ɤB(AyAl|N |A泀 ?,6 RŵOo 4mL>W-[|XI- snt^b=XpY v l\zfkO'W3Rpl o@ .+U &5zOP/YA֘p2wy~KeQu?FٞNeB}F>B֘2 BKe,='񤬝@':O+"J*6m6S"mU5ĻWW';DFqZL %! 1)z| Y9h^HsV,B`O`^{Ca~{r;;Yjw-rGɪS>#N] t41z,f~.9\qğxt:cJ[NCW%uR:dzb5+EϚ:Zt-C:tO:]Ia:$M|c-!Ƹ0sNVyOC |,TiezZf-Ib_쮯5 E}Q531dz x}H<4!Llj(kZ_OJ֙Z:T,jیO`>3UrKDIӸ q,/9`\# z_zzz֨5%=0+aI>i3'\]5_5 食upHmGHvB&Ƒ1GWH/ WHm?}2dw?9kS92Zh*fNn E/IuIVlHTګfZguҵx_z[alAcC) iǬIRz MFM&~V( j);gQ)=?բaѴһm L+ z`)c'OZ ҩ4,뮢7TH(>B+I}'pFi7A[kq`?872Tvs#v˕ލXPPWQcִ߬xCGmYQf6tԚ\Gmu'oħ=tW:mn9Oɿ@7lՂytH$9 Π6hYiYiYiYiYiY=h~Pt.χM5fv4D ޢJE/Huo0Z4vs Qc7#MIw$VG=47fFQR3 MԯG*j|Zz?NCކ@yuLD(Lfsg#0< aP.*]*4+*C$1P'nW(@b${pzN :([84o\@8w* \yV5C:*I0a>b^I ނfS/钇2M0$"$'Lpp17< \NXإbVL6!_CJK&:IlZ%l߳~=}y%x!_?M͠RP/5nHM&=cKz17 RۀDw:7K~h{.~N77 q'ASw KDN.o8h@ޟ$ߝߐp zC.ny+Z" 5m.)GsuP@;y>7O-bwSkΔu tA]<\N kA;d?ߒ7m!gN崟~Eݔ_}~'ӻncHy˵ÚmOKFt S%M8[5Ϸ .$l~"?qlhT| TJ @'2I$xܐJe B(U}H8#5e~HO*dp%LOfB)wʵ\sA~ZEpq$8A YW}MtEb'< ZY%%ǼeUH;rE2nn1q18)r ;Ɂ%$ߟ'yI;#,i'9N|ɕTM`k\֯yL~|hQ}n#aI7 ;3tN78ܨ<7Fo!m?FQμkw_iS {{'!CDx |:_i]?8`{X] N-!"@^tzhك!h{ziP@]a~T!TI-) >w0PufDQhD?V' $ $ E$Lgg#I/GaACK xU0<3=L&~ QшF8i 3DҴ^]ܻ^﫮 qLI !0 waDhߪ:=ɐU{={19VթsN2^LKA/s{BBXֱثr V~Ta64/c c W!KX?5$P$3ca-ؽ<β.Xk,<2J]wnღ Z_-Dߙ2O%zStD5SY׾NisBw輯p~4AD~kE?}<ԧ[GYѧ>M}I>CҧW1u$=Duo\4.3|3'D4Fam%9r> 9Hh3 #lIU^ԟK}Yy#ywqOé&6ЂQ!kl{z9nwsurX!bwAKLREP$3ntY𳟛~yI9.(i_17ATgj|Z8j^2Hkϒ!H걒qQ_3ܚn2߫bx`x +j [T7y{"y5V/`W-aq H,\ԠDld՝!Rޘ`9M_">L˄XYX)g9b99XNXΓ,rc9 X 9 Y,Y 9Xrșr.L,g,)E2[136Tς>Jf蔬x;Dh[ m3 !c/g'XBS~:dj:}IIbgw6TNx;:nU_c |xw'!)F û0r6OS3d!h3+twa)lJ3EL(?pU_ d_ɭ] УOKnfrxk !i?3{Y$}]`C03 FjB 4<TH wa1eّ{b2g1 Y0Z|56ۿxl"ω)N)7xQxV"ع_?@Z,bo XdQQ>K0bQd0 /Q"EP o`jyyAJ9ͺH}sXrC7 ҄IIˆrFMp%g]ƭ p0!>.LT^'"CTcpNOS 0Ls cpN- 9r0ԅX >u0~?2YSS݊xY>xneH ;~>Py.s!\(۳J% LWX}Ռ|F&ЇEFeN!HJ|ȞGle`\VW8_I}qɿ!넜,MGʣ,y3r6U,g!?LCr()q0+O\?ɩ?sQ%2,?cD>ɺe"KȺ% ,1W%,H%!,XwrhwJDCQAHoei}'KzKfitߥ?K㥅Ke"K4,MSK7K i)dXS=ѴLbi|ߥg4tt&-,M9Hi,,\Eobi$>}+Kcdam[o4:_fizvY^/bz1K?!~sY`zKO`iDztG䛖0mgi(w9W,c1)KwS\1F 0o,,Jw,WY<Ut44di t!EXwzK~K/t&K/tKdL;X=mXULo/~eiE'"Ml>+kLoZU-r(n뻆#@Cw0 lvֻ/a> @0zDnٵ͗a?HQ7fZ"oyտ⟙h}=JnZ|`p7&nƷړMd:r `j<`+ b` Ur/:uz^pGkx3 ([qbӢ3O2TLeӣ qW3[MqvhbGjmg7 #0) X8`wFR&(@F@qU `r`lk (@Nr06 pl. Ϩח\;?^b@,sB ?_u[Э >.oϻ׿ q??__PpO&!`=WzgnS84gͤ?Qόz\ Oόqόqy @cό880g0g0XRh$ʪ xz^\ 9q< /r3O=#/PgEq͈3x83̙,{"A3xzy\ N18mxqcWqpeXq wNKSc RL05+G$ӂ<F%t~\v/G}U0c/H4MV'[`ԯmk~ètKk>Z>aWhͩIzjrUFP[uλU{.w[HZef+wYo:Vwǧ0dVѽ:ѯ>LL}r`$t5[ ;0U75_Q`4q2?sS`ƀCg_&x &Ͻ<o Wk`Upmi#ϖC7ɦM\ {6 "—[ܩ;fϝ\nukaFn)uX?.ȕLk]M|4)КPI}FKۀ5S4:u]_BNҕ[ _ +l]m-$@!2,S䷻zQam̂XPsh1:| b΄z`쌪 aw--A)[K+xu>#ަvs Yp?{<_ |Tk4ch Ͽu^"u8U&?ᛄ)Yō|1F-{_cey+Dd*YJs×s\5YOxה4?/9҃χ`O *qqܰev.|+)T{$G{·>KhBU6oo|}}l^ dJ 62CAWܝ VVAɏt _,(s@ 95#!-zs yc底Ѡs{ihPش:-#J1XX4z ŕ9iUv@e{dfn/ZX=kEs =߽7fZ8h ~Ox]q,ed쨨MN*H`AxJKʵQrA ~Y2 ఐ/]BH 'owhL9aE~8]/k H?$F_zjhtOb{~$g #p?{2#}⏏2/!6J:`ҦA& ,5H _.4*$#-g‚"n R=D_i7&lj77}>'%Ӡ G6Jpn ֍VDh.Xn竐cFv}{~ Y(=G8Uy+#F9 +zsn18׌3drsJ9ӿZ؎zOt@/ G4 jG`VƟҦXSdUcwSrrb; 8dVƭAK veSYfWcTɤt }VbAm}YxdD;֥ Gȑ$0 deJ6~3mh|ft%LLsk-1f|'U_k&^/񾶬n6ۮiRfآ] ]Lw) DIi"KshK>bi5@(˧N9OvPo95#V^i8@eu|<}O^ǣl,:mOyEA%ЌoSe~di\F ZJp4X<ܗ!2F{S*q8ݪ#ZoV*"tu>_ T4hnXjd(tEl8)LSb'GOGѦZgtO Q5@95iQ lXd&ѣ_vZ%kքo&ojncYbz8Iюeʳkvb & Aof\5<'}p(?Z/SI"ƑP|4^2I|zD_]Vvm9CS#X*4H_.-ѵ*+Ǘ_v7QV'c|s M''ļ٘yUsա)k^.tVy~k5{"ݣ~>MMFo?Cx}>q+|x sZ:q)4>h\휽suoGw@?'G#uP(|7?s.xEm`Y֝ g(F*HPx8x ',{c.Y 9r5=0}d!ءeԒCW26F13אp; ﮦ_{jY,PLB[OvQu7bu?~L02LֱTj9RbC k]_۝n!/hz6"S$\_4QϒuX#c#R/n1R/^{1o#z/Ys-'(T^A[z=ca#C[L+˶;K-۫U1f8^˖ؖʮz,$B!jw5?LjJ:fC+zF2X=ЛǼQCA'?>> |y"+v@M#=u8XM %Y8ww!/!qFz|辏/kg;%IH?3seX'_`?j!s !+{F1YhmT5RmN**]L(?e(- iR[\$ܙr$Xk*A9Qğj6K%ZCW$O };Hm5ҷo2DnM®j?כ湃m^ŷU9S*a`<)טM0җ]g4 e,%H9i7QS?3KREu GG <^OHWsuYUQ]k(vҧ˪W}!]r'1o1l{Qwy*TY~v*+Qe]𘪬Hݓ?&_IҟM?\eu*jzP8Qr3XkBldʪE4&U& ]= !NiFNޛI uR|I |J*&)Tw SI=TCդTQM.EUTu_Z?TQ֧zl 1vOEԀ**{7UTwj ゴ6WETeЦ$o!=kbx٨2%խ }J@EJx.)&QRTR]rB(捉u:΋qo٠SEnB'֤6j lZBH"mUu_~؆Uq'mΜ&Q*WO*ic kaU,)2Wvխ: Oue~G(|@$]R 0Гvա^`QVW V5a̧\6 c s1[doHEA>k2kzwQsK{WS+?L&[t B'NT^ gn/[:YMo9 Nu5,v,Dk8hV.j*^~-R諨XEW#`Q9{ߊ*޵O U~5]V'F"l)#ۊmظ^5gW$X`1ս:͜Ji6ar_@^R.KW=,0`&8h+3q[fAFբVZt`BrP,; BOa?jIRΫuYѪpUO$7Tq& F5 hZuk?Ŗc-y +񃗡V<4oQ@0ZGfzGܪu9@muhW-G̮b?mmͫ]nUh :Lva{WUGpW9Z*>JT[D=0߂j,\C,(VI:j6YrPb0@ ..`† #Ɨbr8 b *vv3xF٪d4^X\`+p+~/~~|;6Rx3or9;.||{beķJɷbvs|'P0m&,tMJ^&ȩ~\Y_R < Dt\kOd}&όDcmnp_4x+mDTQQ/`PϨrOˋt mI$_BI^an~E\^{/ 6¿A6|} Z-b&3Q6^ #g륲6N8 jOA5΄G_{tMw@(փۚV&}/yT .9p~}6dP(ɐʛ܄BC |m?<ɤvRb sR[MrfNa-_ݠjwOr."^Q&G&Ws./;m пYN4-ژ;fJ*}.\ﺒs|7NSҗK/*h@t MoK@/4]v!JK`K[&]8k^GS|'4vr_WgjPi`ݽՒ# oK\rɯh *. uR(Nr>ՊHęQ|'"tAEr]i7HO u ,)o_?|L opүB`ճAzţX2/'z2AX ؂R7{:DZI+ZZGm DLJ*o4lr[`o\P[g[] ]Dk.r?}$zHdfz]x7lsSd͉C0" 2N[1rFu oBW>y nuA|dſ1ОȗBWHncTo×\NvSm6g"?v햃z* uUŒ_[d ja8!t\\ݟY,qu]R=nKKO1oeP2$yv=vaGB9<1E)ka8A:LS'sg&"<6):p;4Ah@rK':rؤ"pz(\ ^a5녦ΩJ[5قm1P=,US,\s(]04 >Z\#&."ǰ|C_QwMJXU\# a=Qbr縘>Vo,3r1X,$+;8ޑUFMRuG |Rbo l7\A*}RWwdo  ־ (N~a4HCI : ෨P]b іcc"ÂQ}'sޠzsxcZj#v%Eg&{#w|l`Z lCXA7-C7[y#\|.*,*SE4GD31^z֭ͪvk$=cxx(EGhmьFAg@ ;?|U؉JegRfY;eFL`87yII1, ?/QﶃY[Ie($uڀ5x;eY/CpAqqBM8KOAKad0[e5a@RGB0.(6FI˶/^P/2IRw(&7hK(LDyW|C(r:%e3Ga/xEk %0FV 6@Il`R2/$̗V8pzfo[E$Dc8.~o,K18<bWH-{Ed|'ˏQ* }e-f9<؃wH o|z1:a#w;"a+w~B2ay9?%kr%d-=ohpRӠPem/_^HW6%Y,kˮSˆ雰*t RPFjX1A6׎'kJP6Wv HPɦ>'7}%km\ʂwV=LZo/9^\^>VOn)}jLP̅܊+-j]3շIt M^EwŸhdG!e@uձ2zapJP7 "վ͢;Mm _ra?/ᨷpa9VרG]%<Z&SPɶNw_|1?vdwiRGA@P﷓YՐ(,$LxϋA0; +.aȈE8\}qݚc,vLdroq +tן;c%Nׇ".s2eV}$“m ڨWdt|N=Vm8.aay1JD uyjrLu'ML311'z`;4\F0ao`绣ȶp@d"ۜNlzſ##JӇi" BvDBe}u5b!@Vc8rD&Ȏi9äZ͗0*GELR }OEo)-P_2?bP"̥[-puΗD"}S,50~h}#>ڶ8٨-wOU6zD$Uvo[,cx6ډΏh myO|C2 Ȅ s% cS7nk%A_7$n1=t笄q2K\9 <cu5n l{: oC5"ϼgoX'GϛpaYR_k8}3i?C~Ek"dV h´~Y'9ka9Pۺ^G`q^q;Q_tXcX>Bsf{9ODW@-RZ'Zi)Z1Z.FKQ?"|ɚtVoD4ۄ1M+U$nTUSUc*VDUnRU|QUT$*cUb* XM *ﯪ**IUQQUǨ*OUhz MEnTS!)==z z'{s/##@`3n&)sޯ"="^T;ˎ1;D1r)^a;wYx_Ӗ W\`NF /b!)LL}Ys"G$Z|ne2Bt:jrU6GGs*SػgpXDW P{͏>me\ƗZl?1%v3l@U"ٗO£M 2n)\ =$I?sJPr eu@ȠeaBX𗛑=}&k8W<*[(ލBg|9C db]Jgq(JauΗ@8f sĽ˯2=A6W{=wG Oۿ[ȮU$b:poup]rbqn+%ÿDm+H|`5cRd|].w))tɩ"o,[}? ̟QqN`.?Y/b5ķIڜC=YfY0ˣa"8=ܩNXD46؉ap)'-b-Z٥0lOZ8wC+Bv=/ʌee GȯRl_3I}MP"LZ <[ 4,[گHp\|v)xlab>&*ƭCM\;nê-&x| ׮] |r?~_3~; W C< 9>Ç]A@zр:dUeIJ7gD%)P+3<~(@WOP"}Jm2'Tx mD5t#,D9IATR*s?"՜c7]ͺTބ@ $3eE>*l>߉RI\hX!W?.B)y# ?<Q}Ti# 3TUJ+Ff嚜‹$t9zOVC ψ!Ij N`QON>5{a^A?@i/tT} ~S8, ݲk|JGݏFa }A>l.4 nVn 8vR"P"TX]GۗFXn=K9CV 3%mEb6HK@P'S4f! XA=C,=G(y'Lil6契 % u/$W@}#$p87׈8 @˗(|NB:NsN8n 'p %nQ@싩nAS@&U~!× vД"iNĉ] +Xaς%SDH'$ is ug %ڄA2.)w;]]+ x`YO$!HXe#_ɪ=+w;C88&< KKFPu @Pװ~~"j#ϰ)IC;澊͗[N6I t T";GSQ B'*;qJ+ ͑iXϓA.8 G ϑ' hZLRhg_U8qJ/#9w-?Lˢ:i+ɸ@mrC hk8*M|+ u e6T@5cx~lm]!x9?&Ԃ!o t?Gng@R׿aaUGn$ѳŘCJ,Gjū]r//d> 5XNs`t1\5d)H B@[gD>y>iO|2aUf; U̡}(}Ucw Nkŧwi߲ M)49PPhD9U!pGeD0@E7s(X-y`x4z"9P$XSwvG{j#s}nt}<ji`1Vs_kUN^ P/ ?ԃ<>5)H+ȣD7_Ѫy/u5^quo(t-jߗs#ݺ}ìʄAhK^&0-/y@ܹ 6qW2Hr\}4W)5_j<}>vwn vח(3/F^zzm {6s$V1~7@,4O3f~zĵ1j~7y=hApʛ"d8PDts9k7ˡ;CK}{@Te00xƌR tGMU\H& JoEy l"۲-km7K3E3J^\mp(k1sy{}XA%nb{$ ptDw:cUF<V Ӆ{UoLp_ϫH빠aI/tۛ³TbV=BC!x=A=4f;r!JS5VKئ[h>Hn71" ]=\uyEHsLs=FPjy&\0xBBQYKo눮 O;=7iMHS70 sL]ԍ4RiZ 4MqFtv$P$Q SֽɢhuB+=7=lE|W&wwAn@զ"= G}G}$;/Ğ>Ш)CYϧzSSQO{((W{pз$w0[ὠ +cx2\'}5Vp!F\>[4A&CysLhakh+OJaޝ-cK8IA8Z"uiQnI(h!]iGgq_p]a_!~[]Rצ)49|Qc>gm.FWO;i'i }x#\>o%7+\alu,8I~Fr~iNQ 34e6 n~cRP~z S'=lg7= ֝>eL2QZ"_+^ pK ?k`ePgߐp9dhp6%F!IZT-0$$9$:Y3RCuT(!=ʝAo:LP6dduV*LCؽПٖ 8ؗF+~Ɵo>trDZN; OE}ݬEAͻkPwmF` FY4wnЕsAX]8짱&c騋zBt;CRˀKlQJ$KִjU}Ak5|":( K /Or[<)?S0F 0<%<7j7u:=|ȗ~ 4Gs`> dlWQumZt J٪ CzJn 5 YwYLq6 {h(.C7T ;< e}#QK|T$tQL]/ DL.l[c_;)Bõ7 bX3fxʠ;c ;BĦ³-O0 Et=2 P&%0$PZNdtr3Bۇ="z}}YO7ƍ\:` *-t\ Y?)gQ*L1p&PQY5R},' L#brS8bs/kʬQ\"9.Tj8#d',˩%{OCw[}Nx6 21j1p5PW% f{t< P0?nY̸MH0gHЗ~!'"P\\T%BW.m(1Bϯ D3 /eyp]+%J"!zT)QMRPo[OS'.,/[殌w}Y/YSިʠ2DO+V]W9Rѽ82+Uyw%9뉧%.+0'!qӐ@"H=.Y7+.޹S0v4Cy`.c.A8w!C#R`A-E9: Zr $PӅ-u x6Aa#;q B0s鉣"]SX؃3S.U# B:L'%v HxWbC؛:G`5.cmJi/ۡUB y~c\ |N vI2vI C N쫸' ei1j{p+L\MhXK}@pw a\7`W`k_J2(SxPD/erKYРԗ' ۹e*qK > R^e(s fCR&4xp&A :sC@Hf2%o濄4 J/F+oX}ʯe!/%IfLi;sɹ84qin7lZn}26z ƆlTQPs7+ td韄G5jY/HZԨב#X*n΍!" d)ӕ$1Je@<%/H].0hƏd1tW\mY+A@xra:5SY*Uxs\4U 7qk/yi !G[-hLV))W{זq2IqHfDE|Z+C-R4'Rs#n8Ǧmn#.^;BA: `]@9g= Dsn7y6iC+Ao-D@S^gE坟;7 xsnbc4Ť9&rpJsuG3ZHy&ϛpc>)0"nav\Uӽpl\G۵vx`t&xK u8+e wt.ƣ?1u{k 銼,KӜ|Up]FKuR/=eeY55ѝ;J6)|.d`6$C| 7MzGE7=3}0Ȱ=^~ڴg7LId][c f`._Y-t9] {9[gJنmHW3YqKmVC $qqyz@mBqCv4 ? G~Wcoc OJ@K]NIY9arre!mNr ~Lj;XcYa|%~b?/sg5ۍDۄh3` Խ}%g'0p`sA~뎓c`z;\G:ɍ4.q$VBG3D $ Cq=iN1yIp /jpvH6l 9K'l(IIx+7LԀЀFl@??P!1!BM2l$KDi}L.NtP9#WNdD"Ŕ77#—>+Q=+m}$ Y&uPH:>. J8 BD!{Wl8ണ2w7s缟̘BGIf-nT0!4o=A܎"v^CY3Lq>+(gCZWbY"K^CTS.YƢjY.Vs-W .xH|YTJl?lZ@߷=34Y%Ks2 Y 8ߍ_~KsみA*9҈:;fDaR"T)8Ama1=~"O[KtS/Wz~R}r!Ȅ7rQ^wY8:H[ڋJ߾?P^[+#y?"{LvPMw&J",3U@d/MoF"<a fφKeHR<6TABr5x t&\[3&WhH{p~-7NA6|3%n“mEZzK2J-!HL&yC iK|3@4/tq5T0Sԧ OτDX)a3/*8\0Bvd{|{J,eFNt8&FQLpܹ92&Lr=iǵOFJS`NPb܋HY|Y?8[alesBf8I;&:{]FSpWYc<:7r\ii[ȩ,N/N!V]>k{z8܃;q6 P~)pHlSv mN͟wnc@ͬ^e7gALfC?ʖY޴XzΖM 9Y?s<&cX2ςp'k3zVDk:Q W>a3V!c;t:]XT6#|0VTh%5 A!ȸtQfn-|zfwn0bfm=#|u83-șȮ~j m))қR7CD,ENiET1<'1rhWwb:m{ܤoeya*bhşxMF y! :<~ LkjTT(S45{} ӖXwʀx;gdP ^Bɂ$ɖ%4I^ } 6H̿w 'VkSqth=:fA Lyl)˔KPM1t~buLWE> ɘ*U[._?*J!>ǻx)8+KQ( 3:2~mvOLLnA qvcNPP,r CN)I0m"tA$K[J{%%fih=pxr"}A>#|JHE5nƇa 14 %$(\5;ky@Q`L؎B>ejWQ(yO$:y.^U- 1&gV.!x o@* 8F&fӷ!̠$ۂ0{aMɇ?w!+| Rv`SX6qiuΎb K U/ad> Óƃ]e2~ 6=lX kf$P?kf6ok[kd6[菜z9Lk=b1H,NGå|?f'\32̮bNI#j_\a`)i`gRsFha=F*slc! 4̄4X-ßI( gxtK{GrCY, >ZV _Y,oY }|jK LUe|\9|2.[~y8\֛䕉~v[x_|M6ћ1Njr Ðof_q UDHiYþVF5UTPj/WJ=TQ>W;B\{[13}5Tҫg7msXVE2X| ˫Aӊ _)b}J?);Rc[DG.1'h5ɋgN.bnLBUZ72Ȓ^jslrK\>KGl&8 SE lx7p?%0{- wy}[cNE(t7KMF#l'ǃ N˥On=n,]"=-kHnw&X1t?ΓBFÔ|~oeT09  ~NaD@MPWYk(JvIt3=$vLWы `}&AI/SKS.GzX|jV!.z"p8+`)M)lD&Zs< E+"܌+QV^oP/mƌ-Son48V62Kp0 .a Xc@) c~8=B[l9F#;)g=8 DE\%? jS+isV MX n| &D>G9 F d6\</y8c 5G5YM4,8,~$ 4,aaiaQͨ@'8vIB㰠8, D̹gXs)j!bE|.KtO9Hd2kEaCҠ L'p:EoHK # cP4yگq2+~E6)EDlXqVQ*PO[b#}1NG&<^s,x'>F78412/ g l)ȟq#0WdcK).؈ ŕ0sQbo{2n:'qI@vĸ0TlX~Ug0Q/o頮k8Zf5Yĸk(V|r("V";?MI,uz@ NFr^ [4t^Q{NIO|]P j80.I8Z.̴Y%ѺoU$%zy >5qfDk5,kvapz׊7?$4+\''(DTIrq21y-25G*! 񊵭B\ K& չ0ye .n0ĸ#'d$vnrۡ?p[&I}PҜ2BNQbA$lw@ſDt7URQ ^*c: AJ@yn€ߍZ؃zML)etgUCɕҡH!iŐ|xCމmra`V.TSu\ri5ӗ06@*!Qp4hkϨ'u{o}4H ]|7RH%a ;oaP:I`V 9׈qg@\S, 'a2?@ 7TT:QoF{#DP"fAD Et'W~,\b`EKCG#7s@@  !͍qpǿhI~AI{v!s %ڥxEtIj|s[۽|2K$./W.oBS˗,> ~cv° ~ƬCɍ 7Xˍy_xmxHFW+qMqr#ۭp)7f}Grc\OCȍhߵOC@MSZɍm-7>o-7ދo-7߫ʍuMnl*q^#kƟjeG)7mKnD~Eb&o,ɍeeM҈=Hn,Z_~͘PvAڑj?#|{vэuvxF×>v5Wg'5!Fk> a7<o_K> aox>v[mwiexbUk7\_vJv;Uv:UiO`,"]3+g}w4l ''j3sgř tsVXW_K|.:aXWtc/MԽ.J'%p)ܔ#-rhIok)h}4 6'Jtt wihN&[!ger<N*L?$z$`INLY_7f*87]pp?-s#?p.a%<>mIATV RʑЯ+@}D z6b#?+ckA өjZ g2 }êUei.[4e.:2C>KLRcVVdA>U<ELȨJo%DDx3m`.ngp}@"e5v‚ts'jIeVa BnMy,7 D?bNt-ZԊZᖶwgVֲbqTG/M VKǷHdȶ#87TBꑲEߣ*I}"ƆmdYJL?^cEWhQcIb;kȠtn 2('ɠtl 6(GxJLJ 4?ǠILx("lOBgXCMqZf+_ܾиbՖ~+ n\w'5nU ۿfjp6q{+p{эWg#Z_n*u]*pXŸ%nq;Rs~'wjp{SMnox?_+}+^{j1q'\+6[޽*]׶gEmϝ1l,}7jSxwP{.;oY}sPi}l<9H#Ntݐ [ҖҰKY<4ZQ,aR 5ch!1A zP݁^h*޳#fJMqưԗI$^ȥbd8D`Iz9 0k ˖ fEN7T+iX@CD5ҕYV,rD:R ( o+//<,*OD~mZ8bV 7p1HjpqPjGa \b_C27:ܻ3̤kVfFO(+6r@'a/p2bi #HY(ݷAUHc.ˇ?y^hxZ^6l`^,yy{[6yyp\3φm<ۃ&ˣu 76N&A +BHD݆Ih׳dۼ}0¶p]3wkUGdIqw5OI3uJbP>؅WMmtΒ&GD >êϑu 3/?s.C;l'6dw&$t<%e!%i^p]n/hp>V<6mh\c%c-YfHxf(m7h*{ ` `xu!g#c=Ձ _0͂IJ.&{mŐJk]ߓ|eh)o*H6RYٗ_iP}$sCaiRaG&˻Iމwjos)" :%w:ͫPqG9-} Nr>;+y(\g2>M!sӻP̄&Ѧ'q'@,A6a3!ܶBLCn$\ʝ$#;)9zߡGJ9][M *ls`xsLk㱑Nr BJ}\ပW?ZLkŪt C91POA<'ۈ Squiy#4]/~3w?X`8kmԺ;:кnmosuGXmDfV%+MWՏ) D@_ 8p؊; [|]xb8Axi7PDɇQ5};9vyX`dB?8Xh;[~Rm W]<'=5wTx3gy+ù냵q(2HZkSMh 1b Nw ,xg4!(5[YJ݄[}ݐѺWP[XW`o]+Co]qXSXI3,d;7(5g-UowpZmZ6w $:5-񷈻rCb;N~f CBY)ߤ*B8&2|q1D6b.җh~W5WB`-Bj!ƽB= Г]ܬI2FM } turFhJ 8-F7W[KBk Y?$h^~tS}` #E8ep u u0غ8s -u@p~+.soЍG @ArcOgE'Y1y{RN~gqtōBoG?c-2çBGc_|v;o)#&Xiɨ{ލzn;A=fڧu6^.Տ2Ե"ZOCT7q(P!? ׵B Bg]ZޜțQLub3CSAq.۵8❿❏N*eo%o(C+@(߼\GF]ڝk8at)P;V &N.Ec v+y P8YZJ;7">^zARWiE*8i#y>ۆ`$86 'of]mLFBng]` )X؜OPH.I!F279׺ 5w .Aेt Y1 ]aNonL";&ibp"+<^mFcY Z idMVjF" mS+42c'FH`&>jzq-S?o,Tk aaeatR9Wc8c0dIJ_j^\{z9(Z(ҹ"HߝV~DnxQŴoYY 1)MrˎO{uvduv#j T!-b3.I3`ξ6fG~G$}l1l4T_F%~TrH?R917֧PW_A:>ZjwF tdtݩBn 5*ڲudxZ>\s !iUMB@ t FαN2KL'vMT \/YqFNDL7:X2^J$09Fx#ʋlFYuc0S*^AG!mB3+&v`>4(ΓKUW[yfWUH兆*}Jʄ̣__x5@d|_7×#[u`uGO[$ }klZyo6*a[潔͕\+G!R+xN *'doS;:R;I #onyM9(Xs LwO|\ %2ge S6Hs|Q |T馾o(1|KKںx^װzY8/l0h+nWpZa$7Eޫ/0}/J y4c| a- #^17WÖC_POdيf?:j4Nef3~oǀJ "2MVrj&;NnR^n_<\gYMܙD`}<73{˱>?P EFG&&}CGe1@aH Zzʴ ʅNVm)c"W@6x: 58{Ѹx#BTTUz*Vڵ`f2(U,SkU/T&Uo{K Ρ<_syֆh@@N%g OP!;V&װFa7JST_hE0 g鬪B*zN`urOnh[;U?q#x&?!@~q&"(jfbfUΌܛ8oFT%g\#X^erk\یV븴l5V[8a5_+D%ck3}ǯf k)6ۄo/ǧ.گA %Nn/ѡW]bhE]Ox#`&}5+XsyKzHnMJJnJL u\ <'{2 *_R5qÊii#_Z^E>7 .;~uG$zFY#lUYy#U[kʦ+XkܠvɊ_Gk%H"Ԍ=>ʴ4rcc:OVC::ϔ"EdZBFxW <^y7@!ZzGV.x ȊrIE)9NlE(X@.iYCk7{-*i`#7Lg]_ғ+e'VN)f)Qt5~qc`O(BvfTÿR2cjj@~9^P^kdZAґ?ݷb]K.b#5~,a%JN,Lebh5BP H$۲=mYa1?dya^50"Ȼ {9Ww c٨M Gx]KOpX¿PnC88@݁>&FŜ۠b"V^L&4 ebjh*sV n5PY5@Mݭu65xmjYC{LT4uc(yMmSm= boho76Au&\~v1ԝ$+9N\#@ca_Vc`. n  #[\'g2!ؓ -^-7iGOgk||5-׭5Z#wQq۠? 7 Z(h%4-9յFݶf +Dy^@X"ɹ(_< 4_uЍE:O,U(gP J ˢӐL.AX `GE{u \IM.#usĵ$z|1&x3h9* IX/9(M )IIYf\' d;T?QڗS'OhZgrjVc`gBlcq Fa4.up\{`dN/Z?xq=ɺi9:熐k)yaSuFIyD&Q>.Үe U '݋UMhá8C=E43 ͫJo045ō<>7g>y|&9͋[jPIF.|^V#Q74xl&bDkr \)];+M#Wga3cAmdD. <"-XY3{,C-dEO,$l4HU{mӐ-\CPBZVeY?e~}*Qr]猭(}vf45N~.DwKdZp5Ap5qUGbQ7#USl𩬃c21&dlɋѻQq vgB^ M&<{S_6.u;;Y4.h5T[(,YYO]|Ό]fd;01y7K\髎SBΖ\Wz@A 3)>|v ?lƕG.g/£|{泝J||>kqk|vN>{Dg/0G}g;rj5i||6]{+|6lY? Äs[>mzXhvuN݄]S&Gl^.vle_ VlGe~\rzFrOW;{_=SN`3t%tݮNs3Tg0aXqD _l+q6!h̓&So`A~%Z^KmkP" L[DcF>@nQ%|`J9׍ɉ>W)ZɽnCJ0܁)+^X0}z]VeqzS>VZZE46q8OcݟM: eYaav㭤 㑖㺸M7 G9 g:(&d+_/?Е|+: ot<63>rLۮzxD=Gx%wdsP_T!D_ b5 )6?4l4!(CoBԯbWFDq2" =WҠ\1Ѹdv0[`zp"O@"n"[@~g,PvC0HIC=f,řQuRd ]s_He}PƻE~0uMbSZZWhMǒ+9J"2U%Xp-/b~ŸZ囮LL@=AX_$lW _J#M{ν!05Z{XlA9bSK֙fw>L/>RooXZV7ʤg T+j=Wy4^Trd%>tӽ B.I`\jMvL։0t!:uhO3X7dMsIlq%Y.lGW6OG5Jl,oC4섂1ό@ˮ20W;*S_[x& =mT]5ᯃK$]~ͧ.?<% ~"JRrn_DfAmd^n+t.%r*<»+ ЩSxX:a1@qw-krOZvznD!T \\BaߣiTrar7\MQ't MfI@ºaX8*?#}zpGu-Z0:VF $5R|Vn>pXm $MC44-jI*i{Y-h;ܧ*S:)b)=4m9>Cϧ /E^\l?MsdiFI .Gg*44m M;=R n@'q dx5_L e8>w>[A 3+ع4?gB^>B԰lV*蕩~0P?0IKA+"oPdI{ PyZbS_+HE6=c,=a vLjQ <qBЗ!hPNg +F k0uDdϖ)FOQ˼P6Z }u2{])NwMe}Vf\R9e^gxɤCEЀX_%{_+?"nkMZZʼZe6diEMy=t8Ѿٜh<V_ \< 2e+l ]nDT g!!'.`f Bk3xBlE6,\0C  h\͎DuwF:FMW=RĖh9_+* d7-|/XŸ2$;\vO+\COtIKJ|?5ie:g10E '=C>TN}>{eqCWjnmp˝W p6 Ta-lDi" ҃Bd#*)o;HPP})R,:+Z>dɻ?WAahe1]gǯ)`(Q ,Xni!>R+R0{\Ek]/NU=Nd\[y̵U m;O6m}dejHl O[V(|%q`[WF9Z{A<@@`2^KN"t> :~3~jxâ@5i9U^4HPt|]M|^?2\?˲뇽wزWyvze؟lǾW_04ɤ(ٙg#}O#Hğoud'ݭb}"nXFrNgH}`0<*;T6>D(Qu O{<1A#ELQ)9V옉Kۖl%a^!A>@;(.:8QKhN`N<|7y]Cy\`Ҡ8"x&{za/u:$_M§wN6&{94\ܟzr;[w;:L<4d^YN& H'ZM~XY1ž-PĞ}9=& |s~~=_cc]{Qo00#.ֺr:ysecC\q)Xk2HT'-De宊>);EVMf]ׂjiY^N~!ل_Qd }{2_ B֢{P?waO,|u渰dȨu jUMzl%BE*؛1(?q\a^y<' Db 9""m[i Z/uჁH/12~,ňmXrԎ݈mmb W +@6lblc 3V\ %\s33 aCn™(o_\g gl9TNC!nNZC^tr{sN݈ Ҏ4i ߇|>.z\M7`_r}Ħ @B&;q dr322mdt*)Z /܌Kt=Z%q`bոIqIGưrbLr&I U)$"ӷBDB}*-0#%a w_£nôQ[|_zĶo]ȷruT ߺ)&oNPs9jU-6Z6N1i[ws/k|I̷^?ʷ֞Ǵo=qR|kI/ߺv߇joߪ_ȷEɷ.QVױ*io5zԡ|:|T/(lGAhl^ڌt'mF b\5j_j}ljF|zl A)#wY0n۷^}sµάTyFS y BCw%V9nx9֚|BsH9vHR@8E8*7@k _J4~@IH4 v5ԞaI2pC- Slun]HpYEB {{t6O1J_D6)ߢU8yK#P{=Ouzu_x_{9Oǿ*x6-SED}.X?''#]Ib>y4{/=̗Dh^5E 57N2[뷝)#Pgc!i<3;t45:hecrL@թi֊FrRa'al8D"o4Er&yb4o&L_ܫI5[PB$MP`lT j\1?A䟟B 4tH5TB&nX4jV_}"~] ?uV_l}#tǃ+a=R|wnx<2)Hcm\Ys|]EyfSQn:ՎSG&{?}i|nT{M{:uP/#TTGn_~`=xv4\CjEVr:ҳhzG^e94;z#΀Vj?_Y(MPqr:z{!0`$Z ѧOa:<4Z͉4'z\98kGWG=P{ЀסB E&iCQ<37}?g (?O30R__\L2;q"۷0i#uQ>܌ %sgV?O/OhO-`~f&`<-"A*Q`+DʔDj_"vֳ-cg/_Xkϻh@暛iïjgԬ5 dX`, &Tf3񢺞fȿ򠾤;yJGN 1%Y{Rҗ|~lqvh)ӲW%3q|[>-tGtz >|cͧXȹVkR4&+WA8ksZټFsi(_<D')eOlC"蟚 :*}>AyUku_aWnݓjmo-P[baTMwV_ <Wٽ_o?VJ1i7bZ[\=^#y8եTiգr"r[ey g+(ҽ{VLϊA& !wӛ$|z3ް wo:xN1eSJ8T:uJ! Пx*M]KIafۻm :.UϢ=Mcuٳ&I]P}~Fz$FsJ]sޓ )ڑ]䚊`G7eKGh>ti#ڪ`%&y izZ:/[vdmp­^-%z%nY&na!֑nk.nFmg PⲄ-CuhDH@e[hWxQ*lB:^ kGQ^F8_)wУײБЯƒ,ޘ?2BzЊCxNbXe|1]B?BBA'LzD!D!-aA5hĠ;- Ġ-yȅĂO2)<"Б&`c  r$ˠX[(G ^-> &=ÌqDGGnG֞Ҿ{oΞү`O){OL)wW0mOijA :{JSZyiGKu L k]:1VĄyJ&-Q-QXoK/ο=͇9CK]{\Tվ;M7#$(d5ӀBX\"#E4ĭ['5:酔Cd PhR {=g_ysgoZݿ#89wG5+qTOrT]4Uhoo%S~9nrzGwGuKkrT䗣KQ9 G8A*&8Qu5?jQ}~:qTηnjUMqT co`#Q?3gu>z sB@{#G7%(+{SMgyz=*"Q\O_i#<Үb_y߹.w?y!$/8G\-W峺kF,F[^o˖kkԍNp*{[|=nhդ6ad&`)4Z )iU/A*v , `~m`Mt!dylD{m{f^ }7r7$8o. @Opu" {$NoɫYpG=o"#~Ȏ\Φ$qGgWBhU0Iz;Ѡsט3&&+䤦F- TJT颫ޖh-Mn&T'F?]E)%ZG(]-XrϟǖNgVCvScr+)nʈ\.$Xk}TL=kyGuo\qG@X3X+dm>ϨslFTɨGfΜw^Y+w+h0))Fs+31}E-2.'-"h-Gz:w\hję*4*l))ѕ9Sde-u`^h# AI <:?fU 1C`ш`q[Ơ,r3Z #:=(0 mPFsmjiQK$){vCލO MaѨQ+ 9qJKf#Iq8)P~HFwk.KSVttY./k:9]1-+a!1sOa'G ./ ~+t+7ˎ=23Z$kVyznK~"@+Z6p2sn1gxBKnMc#G {єq''{OyY=hj3Ҽu(jk> đ-b"_dt;c-w 8z_R;tcy-[o(ޣ"Jx: w̓Hr+{uF*  q_ oҾ|'uJ5R{eBx AͰV fGVx#uݲIס㾼&*hے(g U,&.`Ц.H9a~7t|f*(a 1BM/5AY1iTNGFQϧgw&v;PB\ߠ%9L2s ~L{؆/nC vj'Z.y|q Ʉ=pAޢ#^BƾHYaɏ,֠sǕ "+K!#:yW.Ƥr; 7,HPEWsj+/)}5_'PyT QLJއjxubtPEk:\NSQ+n 9p|:(O*Ы:mRh>߄=ZJȋx UXF^Aq"4{b)-p~r}MH$Kj}քmo:]A1#S١͕c6%-UZ 1 %4m[]. ǐP&lF}!Rr|* hPڨo } ?oV;6zxde' *?49Ani80=eQx^HL nfdk7D 4]`G3 9CiMx>|#ҕ\(Z(0?2+8 9 ӱֵP6r`T@sEPja&}Fx{$PnܧH'OҪ+${5"I>O\AzJ䈿t>֋dgŴF^0Nxǝ|Vr X NNy=i`as+2uUBZZQ;D2wsqV|)NB9Y{6&) 2SJ(N-@CA$1e ?0a{Zݰg0ž6/+ =?qQwrZ,џޣp4f"B#!hQD( $jK0lȄo5Y󇉞B;c6>ހGU~<UδP )ﺱ |e('UiUrKUa}΃>=׹-q ӽxlIRC^5#|~nWVdz4J<˻}yO,O;"M+q3%LHCo*uǧpN[܏fˡrcТvro=L1{()^?YR&qtfn!,>Ui6~Y m2.d~WaAC3Ey4b|Bz"2{^~bty+#ET  xzI&R2 JTߏU*֬<P -3/ѶkP~"Ss tsx`I)dϮ\X~P(gZ*4q kmIn/lrq~b]ޥ#paADZWG%e50"~)vDLL" 9н>𚾒p?,ȅt4M}M|:VOAX  yx(<.bLL4`{#gנSepwU"+e%21X![VIQ$71΅ 7*9>OM(x=ݪ/;eæ&Rјfg.s8yӴT5lͨU C6c@z1 EvBlEx4SJ?jv9}&q+>qEQǷQ%eiãBL+.k'Sh*{M)\V@kli\AD 7ڲ#p݋X#eGA.Xl(řa콣Iؒ%es-g$ASAh+vh`8v5f}&)M7IoFu sgɥDWZ_{\Jg;3Be#>OyL񕧸Q'џ&$ēo4b[Itr:~?&;MG1ʓWݵGU]$d3"*"!C!<-0d &6301TBO֖E ЙLF&5hM@QI@rc3g2{}779k}kљ x }G u= w2Fټ =wc8^06`NSq!@z0LOod<-"!TnF0)x*關<*bxoYD4WusX#:xB2 d&G-;Nw|*G(诇1 ߿( "Ǿ#5p{:C>w6z̷s qUXC߀s8dpkΡa >0gk736 Y9a:mEaeLc$!kxi1 476 {K>9W㯷qi?|ٷrpz esøjx%jXG_sסq6Clt'gf x67h!~MSԩ_Ybޒ%뚬x-T_}.<?LQ^EB8jӴ?;{pCү2^-MDk~o)پD [kKu{3N:%jVl[ƸݍT?Sq t4O Rgf٥t3thϯNj~~5@E \=?e?vywk=Zs]B Dȡn\j5;lyyx Ns!+C/(XCyC|5jy 諲(#}yulG->8A_(2J'V#p1Sj<%;c:&f2^4d S<)FC 9@ߊ`W<ދڟ=ia~2݃d_@WT떞4t R6/tfc,BBNb#Dt5A x"&2+Z89P)0-f3iy\?Y%%fMdWU꜍_R&u5P{\2q+O&ƉqMNyc0-T:0?XmUe/9μ}Z ǿ q?x4fN݂Q]c|-U+j;RTut]27\3PZ+55Yw)/GEb[Gs+ WL#"l|Et*+΁)[1 gw4sH*R}yy?*r8cF/W2}H3W!Sy_]s(y, 9/r~NV!3,  {<;;xۘA+%? 8Xs*{7@ih~d w|[3d͠tmL?Qx/3FȚG) V4#4~pcx1I2f:vU]>JRq/~+'ʥ]rj0$(l"ߡ:^^Ƞh㊓Bs|E]oF}F~+ʟbY@h@W*q2|gGZk7bM^C Whai‡Xao}kS}uﮗbHjۄ ewoʝ.FVZ~3oFg _iFPߦ_rpݦ'6ad" {a}ǣ#cLq C)~l66breg[+f:ha3/ Pv>fiI)= +a_QryB3۵\V=)b垼וX('%T1Q+eB97&,i|RQ8vTEV.mtT5_U/r\8](?)C4A 6͍ '>`&h֬_OW4kiy=zMQ5e-$-;;$-{s:i?Klg+4L'-+l`5Ět֯N'%yZ:==Qd2<)vV/TL/GlL>\3 d3[|i{UgTa? l sS \zɤ=G9p7~l5yvi_($?G pT$Z yBY%Pb:@l*^fʬ.*: VijW*sVin$ƿYpUj ;,ԝv&o-BE&C1SOGGB& B0Xp }dZ d}vPrU~At`Աh#ÈN9¢yK-8 vkHC&:DD[cxA{ /hg [#"̭a[k4Z" $D [PZښam ^oӅ GD]M6WaW!~6 ~"6!5<6r!JnsJT6_30ہq\llP? E˶X;ͶXb:]pۇ[DWCB}m}})sS~.aϊ_})% s4 @WX]<+D#Q 5:JbtPE=%%r|˕1$n6Ɏ j(k3^zWֲ., i> s:k `?1ŖROYg7FD:l!u-_یz7bVkz+ ;c%>| wv/ U[ Y\ݳ]n a##C8t+g\͙9cp%kq qnt-;$kq|tcmqE ttǔǖމpeD)qi>:FC72BGElcy<#V tEO+sp΋gp8yQ(>6[/I+ZdolـnPwVL,U@W!|N>~lͧwK?92Z)f<7N cF.`_˘Y1!v3ٴcK㶿ʗ]3^c|M~TPw~u\tPf#hȩ/Rr8fbܲ: @­) EjbZZÄoVkU}NI f,1Qzumb^ͼn3-!`.sς"OuUS-ՉG/~HS!_#Tl~a3D!f9>#<yiS$B( >. THʈ8= ymS#R[oAȆ逊oR AbT]Qk% H|6E@-p6̵1LzM:SdtmI5-~ pJ,#8_~*s~=M|FnT:~~bfk\ZfF-91\L#tаy?7UaoG|׸]lp;:oI'UVDbg&>)A%v}oG#gClw%|w[VV )'U0?_nފqЯ]UP,0m2g2(frj|jۧ5xi4J&'ú(1tuc=p F{\z4DEa66+m9x!}1|Չgދ[_۔2E?縁PBFmΕr4&-Mt ϯ-H2`T&3dE󑉺%{&n*D33]~t[W`v'D?+LZ |"Uf'IMD\ KG4Aa)Du0?>_%80mXV=:z:$)u4IUGgt.AJ&!hoJ hV[O!|P??5W*L3,wĞлgC!f*D>Ѿn̰NEdk/IQU-*zʁ6xz#3qb151n }T!p?:oF qf1 l^#^P^[ _K({Af5F2HgVSwP1)df8F`~j22 kxq=ǝt>mB]s$oZEԙMuGYE1SysPUx!(6bE]ub<͑kQK˻ɗwMd3DS\s`2v`}]\MԖI2 `D=˻&'n#<}˻']H'j yIAy7BIAy̵UwoY \'[ulALEywK7`78 t'mю/7?Lv񆍓cxd݅װ|ν 2jd2t\AOtΡ9< SxgȪ}4(Gn]dqBGC[BQnHYRc޿\ٿ?Tx5a|[ E}%Aȷz|@&]&ޑ0\n< !^Q(DHBv߫o?*߾2ۧ0x ;(:&B=Qos'|Mt>KouGf_ȷ_샲Ɔɷ!d Ǜ(.vpq?? ?& r3CȿkP_J" *@#Daj2>\.Aw'"Ȼ',uWt:[Ȼwē;1h{/tDUKw)YB *4z{h25DލDHۆ T jyW+BPE@M tF!ݏ)OϨpW{7MKfEҝ"Ezw۪ꍸZ֍iP* o3ȅ {Й ΐQiUiݙ:-QU #PIED"iUiW$}V;&BtJ+e"!zdzk@ԆYO@#c#2z#{ }OJnHuy\5>=83wEG7gʗ&oSDkj_N}F9gRaEzNxg9r,9QiuBc*pϭT>%'-nƵ&q[+-mHIfwUJn&J|"e RdY7zr 1Zm*i&-/3W0 ȿO_2=*-;h 9Ѯ \'M"Wwf-{N]_d.xntU})ܨ9f6pTS݄r2g(HA^N-(=`F|Sb M+D|nef a";&8w|hjH1 7䛯H; _xm?=ۿ /=Յ@x=;^O[[ظm ZnX]zPZBt8mOjN#K+>6o8-Il nIz"m:@lȭtփXT`ۃ :kT]c{ߡP>oU=_a-PVok|awx 2^#^15D]?|x_R^ 7.pi0"g\ K?hdzLGl*PHDKxDmRo-ת=r)W'?*~&2] /OqXɁOR";o(oF!]DX#y_Or7v81 (6ƣ?׭sYbƂ8C5d؊Ʒ!aIc]҈k ,쩱1*҆C(bVg7oH}liy$ 㢫dOjeoOvX-:Vng~[+ [j`pXrXֱ:PunɭcuлKv:u^MnnC:VGpPٱzgGU۫eώ\ώȝvVSۤ]J85'o*ݐŵ}UJsI4%s~+0A/_q5ZG.J:ZVܡv@K ~C#-\G|@HܑWule<ߑϩ|G>;[\rIߑ3G5 ձ[OP(%GDr(1J73<CK=}|SEMJ H'P1X-%h7KYl]]iZZ;P "o5ilL[p[p~ Qms̽IS@=6̝33gϟ+X$%|GXƦXpe2*$G;=O!?W:Ş\3bOk{rpɜ WEjMד{od| Be@Z2z||orsV /f ȯY3R&䍭"zy 8Q1Ws5Ő@SEa/\K*'5B0hN<&fJ n|Т,gڰ enĈ`}Ķsovx+iXF'8;= -WPTC/Ntyj1zVE͋!zkvtmk,Yޡi1Wv#`g[%3ѡ$w9Bp̋vo~Yu_LY0N5mS `qDWds<(9`98RASqYP c#B(bֳf 0{?%CA/B|C'8'xcP_[z'=m{A(7$,еMwN4!䆺3K}cܟG, mڲܿrٖkݿoj>Z=/__߿7~_ܿ'X5AhoN-6KÆ88•$9JF_Pfi1Y\@7sW69}Gh`BGyOB%Q!;;XmP8q`eM|ru;Y<6ܾk}?\r)Ӣzy".{Ni*oQ0vҲ(m+ 1:s>J,B"O6C[mW2cHhFwGTaUr- c!9{X8)֖ rG8?-oÂ!ῳQ菹'_m a_}QwW]&_+D_|?z5& ʾ 2Ѯ(M7ngƟQv Uo]jgxca9o'νv P}b[4si$gur[^ogUY W=:jKz]Pl^~KKyj wv]r?0/gVt]KHa _TUWrH&3u֛Ps"3P 2phFa 79׹t$ž≾u-!S~YQN17átMؗA0<u'?lx `EE3?9]Oc>fFHY%th-/]dda+K,ɆOY?N[hY./8OgS^V Ƭy:F?DT U0FlN?J'Ģ\Wj:YL]~b-X$-,luYci35Or;%EAb?nB(0+ 5p [ˊr}P|6XÕm4''.u҇fi?Ꜻsu&`Tgy껱f#5_4kH]7*E $TmDET{";EŔڴ:FbN F=AJQ;/&pǭGa8Ic{ *PU<竂Ot{RߛzOB㯍':(?9][gbKun!-94WfI"eFl%NZc{7 1VbO1MQHS<9G}QXqJxiݨ>/H㥊SY5Gb 3}JE.mUTԐaIq@T_(_aHB Y._6XV{]5E>%KtFݚɁә}.Ū$v&Ko{zrORѽԓ(]9%>Y{.?Ղ -{k?E=<ts{jI =JzSIN\?Z;3liiLg;DgD}"vK2*zg Ea 8սHSܘ`MCk GQ*Ӱܾ7Mmu6[rt6{۟n wᤩdM&͞}%:8PQH $,s|!8̅ΚdjhM tS'xA9gjC񵦥DRsR=UIu8qUh 5Cd͞ "~lA\+@`҂>qN{n,3p7w_xV8,*u*CSbuǏ{OLJ& R[7I}s.ED~5V}a̷SrI\M{yH|0yBfUq?//ٍu((CynXNQW{ w#wJ,.ٕ8<OKkpCL7| 5/W• I>,R7++LPWMn8Vh\. lQuA#ֽJSn_ݣ1cBQ:76t|XKj|Nc.K& |%JVScGm*V.z]24M26Q$My Ip)S:fdA]$QV*I \na ل-%]fZ[8Lzsʢj أ]!ͣCksBEsw0 IH&|eSr7}øi[]@qBvTghdXC3{P܏B*`fv)QЪZ;?%}`E$3q|OW썝u1RsBfͼ[3/hRfQ ;?q/쏩;K$%T_t|R2c"ORS\Qu%3 [k*i 4M!x^wwwC#oŷ(=5Ŕ(<<+}h8qr+I+ja,s9 Hv. Ma~I#;928 vu 𢡺[r # :`bW5 \ ]P!//Z}nlOiId@Mb!1Dr~'7y?ߊm,ow'kDI=? #G?h{nY"+7#/ {p~,nbi8ڴ$: RPL8ˉ?-oqoҟf N@DԽ; ՃrRYBy$.,,< Z56[[ l Ya &#ސkbϽ=Wlz]7=gF&l=$L 7L|Rlckm_zQ:o _?]&|۞v]q# aa>jRg3dޥWL1Pux}e m B&<0eZ]Yw>S91ǃJ )CP`,NVQjoW۝'a'#`]WB+u=Txp70qmfEyƾx&Ϩ/ZE3jc3uc grWo(cE+3?wIQ|7Wo4$&+0)ْty"0A$P r=ety r, ^kĒb |9ǟq teAi$rh6rFQF24i.H'L#;̳]SKAv᎐X sɈn:i5 ߿k(|{I{ˆoe4<>CQsͲ\.|##F2^N,WhWkUfksՕ,0E) QrYz0kk/Fw;,v P0`c069tKE{ j]1KӤ{P)5v8Δ:[ ijT itW2ڝ((j ٽyE4mSW}/W=¢jL\gVSB3 -قC3Ч&6+١XO6'1waMq.=ШSxa8TvvhNJyNڱRk_NxOʈrL-{;*~;f8l}tݾ+rpyX?h!٠8=C=lH<&mߙD_ {2fcD#[ hFcNEOdiOf0ŧғ~Yw9ZgY"Z8 햑BlWgK0vc+[֑Re^g@{mDyT0tXibUښo*`~k$, Z÷cI6rs:ShLmߏ/?51Kv̅jǙjm;zdzwUQu0=d F!89LZ@!8kɷ͢kNi/Dv@S2"Rd޵e!_4[ҔJYCth(лX?5 ZvhO_I= 3Oݕn6b((4Haa7\2+W8?h%Z\-t 6ͦSM*W405 Ngsd*B;!߃ \ dH5dP`]B:cRLR<8{']HI2PLԎ%]UJ1ς|crC1̓0gF9g)'aT\t,|řrrhӒ )H1(A:^rR2G?묈UPVly׿?*z3LhpD1VmpVn؊%4rơKWCоeĚF䔴nFE«`d./n 6d>Oc}W7 " BFHg%QP2g ʶ )bX|!I}U%mV7+>\021 2_|`e?i@OtoШ]e̡O`o:LF6 qTC\N օZUjCtQ 5[ ~ V?Lhu>pQ46Ɩ&=I`y8)h)ngm;:8_JF%B =Dx> c*v'91l^Bp%&`|B>, !uWྍ`{-ŷ)dȟ*2(y^<{ br-˜{,'hw}R%H <YDpq9!/߆mظ%\6q1IJQMʖdMOqbdH6PH8&]żX%9լ4β65}?H.'a yÑ }.k>E퉖_& ND u([ ode/9cuDh3ӡ ݬ} hwVPd% t'Q2΍G|w`syDzĹhnsn_rURE).&`tRݎ1p6Yxb+HvR{*P")N[yd`Q\~=¯ZxQŶe qS6\D"BيJ]ѽT'}G[f8Ի0r.s ^+A MKC˭&aNi~ic/G.0UjP5hwҠ5n PVPFQ^SK԰7Gw~/ =WxGx~5Ʃ#xpǺX<<.rpº;c]$XG_b;u nNq]u 8XX`Gopú>뎛u=M.a* r:+PLUy; 6=Qg\Dpw3-T4h?z!J¹0u ux\RFH87i77:\ [g L]00xr1wpc 5 ksQ bI.ann/oQ>( 4rgC ;](w"(6rԺQJpԿQ0' AQ/QV=8jGs3nᑷw쓣?nQ_Q?G]vQϕoQ93=8jY娛qkQczsԎ7cNٍ~˛ꇣn=QOuT/z[qԿG]}GQpˋ|szˋQO9{zqԻhd].IsԆ*G=f|f 8oG}M98wpQsQ|Lm/ߜe|_s/w :?n;G'G5on{8ڹ9I9wg.ۛC}pԫQ\_)Q-Fm I'KQY5Qf&!ʦR}QT8.B 1  RO)2 rzbUikjk @m[@,[6х]U{+&;_֏u]R Sxۂ 21BRSE 5 =u>PX -Rced|-E&J B/Mc@6yy`t x\ E);%OѺ N:⚕Λנy= <݉sCA"`ˈ7Lq!_9]캅L b`16hĤG1)7ŴbJV8IJR$,v*ԃ."MI`,NX*+3?_a@-? }$ ~+ ]KKp(킳WD!rTzF,&VAأ}$WI[p%(+A=7os|m#zs+bڈFaa>vQ:n2jom@f?~ހf~t1~-H:ܲmX\e~Zt6!xHxN})"k^S5O(-5٨|p7 osn>'qs׫|N$uRRWkU#TjHU#CTY`xH䥓>G?m;UsϪtsԑf/ӤeM477ow>W$7H¦״2"}gYf7೧Y-+Nkᅇ)a6ڵH(͜ Rz&L㝍i Oudhc-G'9>aZ.CشM5uQTۻ w$=#H 9MT&JDMkPpGU]0{GSq  hjuzRAZH݅}_{ޝ[ ţZnf.,ݬ۬>3M.=Ϫ:Z>A [T>8=V;ǸYr=50ֆ7Vj_Lh}=le>=_3@oZ^Kq7g@oj=1u_wz7+[̧l[NRg[9;u.fW L|qy™'g&d_ܽ3=nXc!|86d2#bE(+m: DL3GV9.e`p1[k{I3hݱ`CN9;r}DI(0XX_9{n-pbo&X9~uE2vD\"e% 6`Zs%"w~̎ig0PlndK7vl_j lUb~TVn dTlWrPʩK6LMq)WbUt}vn#NsD5qr-_g|q3/ {:hTo]c _kZi+8d6 ffAmkgm7tKUhZ_)P_*N ! `n J_>W/m!0> | ʥDo T>B~䍠i!g9"0 ULW~Rޱ^Ցu ~;q,g}T2>E3ׅfm2̍%LfY %Lg&}TKOiBN=`p v F1CA#L09'$a4u_hh0,j q(B%()Q_\|'d:鏠jUB eArk$L, ~KQ_/a%, ;c؇Ob_1iĘ4&:5QwCشGQt!T밯ϫO{:FQ8nWrUm{jq<7gd zkzhOxdڛ tq\wɟ.xT u4S{5摟"[x]ٽ#}2Jp€X&=x$0]UuqQU```Pez3$k!KtZ^O$Hdnr1l \IŏS4xEIY0kiRR+d'|wڌo@3>ta5d/k~%$:?|)rIh7l5PrQqe/J\UxrdM{R으>nksfRcMxR`}HlNaO*A5^N=CK} xTյ2<2DJ &((h|0ڇqU ̈XUk}!QaIB(a@"H2Zk932gX{^{}^P6%XnAK[%U\0F0KU "R꛱ ERsSRhC 7GZX<T:՗ih89cGY C;KJ٬}xx@b!thl8W)rADro/BP]Ӻ7B\68$碓ӈ@BM^ js(5D~!75`PCKBHUFU6k3Mzۍ[g4\ 1wCǻ@ >$Ӓﵨ_|_$=!:q [acğeF…v~$3Ut FEVq3y'2O42G$,Rs𳢲S1anP:M3U|f7L) MꌂRϷ_.\Ihf q)np/[w OӕK)]:Q9xir9a;د@zu ؜H*Ob/%"_}U Ҹ0!*@P:s#'>^6WN<L牬#_AO DDJ֑5دN=Y{Ĉ2bqbMFbщ5$Έp:ƨkoR镄XdJ*W [BH $ FWEoҨ٬hl+IVڙH4 43.ˊAZ%܎h(8l 2:DE Z@VI9CWP}0Rj&5̛Z+y?[ H3XLAJk6=о_=:$5-vx3WRTIy/WgKB2Q=N/`nOU1Ī?Fb&1쐼R[T\G¥~&Gټ V:_U2®”ړOG3m.H!Эt n1cT|JmJ;Q&O<ڮY2-);%]_.`-JՏnN׃)(`E 0ˠoDrmdy !|-4I2VcW1wa.IQ1+UwʹB.Ox-31@_lxk)bJ)*GW;$؄@ER]YW0vO%b(2AG@G=ˢleQϱ(XoÿX*5ii+mJ}h':<4KRB9MQ2y"5#TlPA4SR,l(HuvԽΡU.B.Q8RF9rgٻ)2ލx, L:r xeHI#@*OW$QY^baL^=}$3" Uzr,6&zW結nޚCY|f6;]ER54%n%hA' Te̐I|kcB/~̿AO p;5@F͙@ C⸗GE5ڙp;:dpHZCk%nKqJpBﯸV5'|[يT~4Xs#!-r>4L֟]mvg=_fn8 pC3d._'.WfjZ~ί|;Xy:g+QoGe$?9ICy!amsm=xzMk91px LNb9M'Ѽ}feg>)&cസw%D:Tbq$Y"v EzdeEܶM? nC2Zu$Pآs}.H.maEQMr{Flu6Fl(5?!ED &fwqj+)ZW+'#hPw:}Yipku=u^uOmuXiYh؍nF7:Pw|̭EmeS`ΕWY{uVv+JEC䞲-6nf*;6 /:͝1π7>]:e ={<$A9;\SA6IT7(BfiB!;C,!)!̀6C0 Kr͐v퇒NәU8O,I:c<nq<~4!*(hP+(gapY$t=b  uM*A;_?)0n_=n部x+UݳM+hz#)xj*rNQ9jn_B;:3;MQ$lF&qԄ+1k(xleBm3%8E00Jy;Y uy;JXɎ[TNuꊀ5Lnyp[噋6]SFQgc&wFƺu8!GԹ@=K3m4˙ns3?|G&޵ص}Pp,ߙfu=TS ܠgqEΆ_l ̆w#sw<1BR7j=|p J$8Q>'d'1SBn?ybf"܈۴Dr7>2|\_( To`8%,+r8ԃ:7X7X@Β2Ix80H3} | ?БAad;e=.ZxdRRQ `ܢ#i(4`o,hEa7[]O* ·`3L43߄Q 4sCƋ6JlNܿ&heY{ev|.Za[scL c JЌƑڎ E Bn'KNN8n­#r~ 1ۧ^Ik} >r [7^ >vL,Ƚ` #[c?e;T7^}Q5" K2mɥ䗱M^k+r[c4ƓOt@]0Ȁ*?<kYuҾS7`s>w~\;+q-||)"\?i3埿{-l^|~+r_'=|^^:>8pGC-RFǩPk._t~rmw=ضT{Xt݇u$`o10ʿݙ>LMzG;K|1IǯʠEq/^0 wJ$ah阝{uP%܉GDҊzDo3Tҝe%0Ÿ׍䓛*8H)e&=ZJ0)Kk+kc[B,(`ݔi?hfìǿ$|G8rT&w3'kG ᖄA1P">.R÷Oݗ#ӇKh==E/"~ 𧐆 IC>I|tN(Yk䶄!<0'-IctQgE3j&:lljTUR{-yZrߟ_a %UcbRxis-zC:Oa%1 $2$eX jDC-} x0B1g1@O ֥wmi! N9`;)"`(8-5 ^l)#@qz9>8| JpPd@\;hqJD}3[wA%eq'Y:`ri(UqY1~47%+UPckz0' Z^ll8M$Vz+JG~{:R+Rw:t#wVa%y\`M};<0Bibi$巩7xm+z)*))q- 3mGzq[!mmGG⑝3psDx!跊:gNO P]Ue.&"#]ISNѾvy/4ok8Q̻\j+o2=9jČ`ƺbG}-լvh 9 l!fmdHEt;&}fF呔2t5G.SN(Aβc"P47Gkg^o◃Q:Ϧ<|I IMjtT =Q̥~YHs£ӥ/?ԦM+4֠?Cݬ]^3Mv9H5BEہ1^~xTdT:b5):a}xrZA)ӅUS0p\l\x*yxL&{`Nxƃ;3AZ~ק.C\:>il4 2I{\'\$+d ԩvxC`cq-ÏiNLuCJS^&_%[XL|8UYXL%>ʽ⯬h'O=$rһ"eq)aw?-dJ%K)..\6vK@ڽ+!TF%ڽ3!(f|Owx%\]΄ey=RF EF28~n~jfHj*dz۵L]&*_̄Nvzx.G e*ZDevvuV-Ъ𽐓*t< őT/vhDŽq6zdAضƆc%0+ڳ =BLo|[e[f٢nUTń xVrCKP:j((x5-xԓz~T[EuL4E/ݯ8Wۉp}7S|!ݾS*҃ֆ]Ss7^ZS3p߬spR ʩԱMhW9e~BK#P;jA?tN0 ȩEgLa*ĀrfadqNQw<-,ͤYl\ 6 ª_%zO'*̷Lc5pq|ioѮD[rqOc4:Noa"D4OP3>FLg"ֱz z 5/O##M9ͥs$8gQ3H/ˆ٩v`C#ZQ`$ 1hPhhviO G $K c5eFyI'E9992|$O`AO"Qk*KURmEKr 2FrMH^@"TgĦІNХ% 1!渼'<"fiZ_Qdu9?ɿ"|q6Z*ĉ15,){{LrbJN<ʩ0(تMssE*QĻGKL #pNPV*{#JK.'YFV:'Y#Js_dJ_] `yRWKT]L Cg Q,N3p̅+&X=!xф[[J2Z]%NfR8P=+\?% %~l|{~\$%XQT }(W;%uS:tdxVP O x<;" >6U6jUi;x-Bˋ.#mWӎ[:DJ#+hKL!6}KCemjSYƶruWHMڶO f]"<*Y,i['G*+n[r'v7#cDQN}]) &Hu)0|VH v1B:1+w8^)@ 5bڽxj&9c,!YRb*D1L"C8 #يZ~f-̃Y'ό,e!Df] ż`OGiL,OFrU˱ܘdgF`jK&_Ml߽/j}!/*Lڥ./Xqk1vagyc[qml;tqX4R:'aCT-!ڤ.V] #qF/z8 -|b*IMX5\3ܙlOy~4~"ZR{zs!ZL޲d޺t(޶삁A ωhtm8w~DEŸd=Qp34B|g6s\in (+mjJDZH/f|"%TXEF{l: v7H>ۿ?&yE j/@uAܯjզX>yVAGy6Sx)*7Z[LOy 4̿n)$Z(I+;}pF8}_OJHuEҟG`K-y((&@6^L˝KxvV$܂/e@Qr|9 T^Q: 㙸fbzg"^6|"i;7w}rி;ᡖw0,0@_\G5}yhq1@Oq7y|[lENU1vv]۾;Gxd[tmƄmߓ4xf֠ fP+瓷#(#{{/' x @UA1ebQp;Ѭ}1'ibx^(ewF%օ_U\$OwMHA΃2G_hOj;_a>ī͑BOV}Emk7RR- o8Q_TZ  gmFnIuu0S  a9pH~:1|9'䩑*ӅYeL4!5̌1^,wS&[@6{rc[ OIg#x#j/RL+K{18?2 GWbgw'4Bz׀b\,>_GF+FݗGLYf]W\3B,aY7@-,|ԁ_Uw{MOe/S}[^fy'2V缼}mewÚSt9 wwc\ƶ_ ͌ˀG҈̏ZIIvdJ .t6{:f˸B1>hˆEh1a*\ESYLIXWCB j[pŘ_]w^" mZ"Ҭb:PrnpڝEy~}v7&`fQmMaltć_JCnR[EX(¸`rQ-t/(C"('22=Q HE<& 6jogY\YQhANHa|Ն|6mkB?<wQ48?0m3$IgZ`"W`0'C+P4?+2h>`4'YL4Ds]«2_]AKp+⽻3a`9 E$mHҕYq 29ۚNf$GVTN%l+>tYSY1b?u} q=oq(1 m^BߏBkYX|84ie2Rզ BzRrCIwCB͡] T/WHZ @dE5!sq B2cz:ȘɈv}>娍J -tļ6̚6da-.r`9߂bh:z@x_`Жª|>`Cئ+UmN;NW p ;8b_ΦDGl}htVMWj,dx. %CPǴm:L{h;b2.hPO=O"ZpoU ? ;/@5efڪnՍhw-4 b-g "dSf93Qֈ3V *kq$ɩ-yR7؇]c m$^”^.P`YɁfsL 7&}Kx 9~r3:NHfbb '~>I8{H$ͣ9iH|9!"7b_KRϨ凵(1g+i &94n­@nz^.9LP,uSl soؒX"? uUoeu_zWVw./AQa$.x忠MKLtcJG?9!s`| ٭wg/ p] {j2Hk_~90qGS }Jş/9f3Q+ULc&\ Bn.UOj'D:"$T3q>SpveruԏY/Rjy 2ɖq&Ò}DT Jop5(eaQ S1!Cj&WbZ,WgAZBў'Hh͉h̔gϰ' :Li8큞(O뇙Q֒KbՏp5N([VZ U\!DZ]ҭF*yg ٯiڍO|je )5;6Df{5m: ,{"ZoFcR&GVOY0x`j?}:KeLvЦ3`ӄ XxٛE/<_cy}ezvk',40.ͫu=C*b}1h,maI-,ߠ5,nH#oF!Ô?Y)@4ZYFO $6mηI10BǒxY3}bpڔnScxV=|Uj( r='|s."wO*(~?ƛZS` 7=zW^eIsȚ/ bZOd]3{+YYS~.VCbߝD72?6^{OI! u[S-z5kca5:'] I% !#[ Qv'!<^b6ꞕq=;aIN(֓.IL ^~wM"{'_?Eg[z?4$$J"gLE_DBϼ[w&},=;/>>9[CfO4d^J}N|)Mj#ڣsN h&0RŇik+ꯦ$ ^#ǒل tRrtG2aĉr0,F XyM,}x2OLl \u'WKoTɍvn mbaj[Z[ЫL ;F9iZR3 4gRt.dXL0Ij ^DK#hTLUP6K3R<`R5% o-(StjνgG:cITڡ}a=d(ms姏5?9]Rd0 jXye\Ϛ0NN"{gn/ׅKx=%{St,TJ&$zZWXmkY|IlU΋+IT;$J5rR'Y+l些uT7):iT)66wD%U`]bG?Z}z=1eV2ˠ}@?*Q&ܿ_`8˧kwڠA[Bz^ygYE1JDybsTʎ$,O$^#kKsHjGGߞ7z8B/026*y3_w?#&DI`bɨG]ӈ% ʵ36e\j[̳n0X[w&$d t6-83Peլ/&*`+JXЧ,\/P~}+(d/!j Tk]]ژ p_goԾ\BP6ؐNmk`։N'Lbytmzb7J!A&>MJfI,nۉ)ja D4xl0}qU$~~ i%VY?T~ ӣιڷ@#IOPg'jş7s4)CK] TEv> _a|S?fi+[w3≯%ƣ'gqcc3fFqqYƗ}'}ed: 0^| Ռ { SaPIl!b#/1f .MڢMr{ޑr/,i;m3PqRŔ ~m R_a.ՍT.S,p,,ze_sAP]c̼;\\V󫋜( 5H_rQ?õi>6\ߢZH#=~5(KœܳeOƨM4NAuX_\c1Ш1XiӢHp2BZlfQ`|SHK cRe0Eg9 ZɎs4^j:)RgœO('4tW69Ϗ:'I3zc_3k|;-uaʑDmsFUrTG!hch[KY'´z^?;7"wU5/{tRm?0AsJXĬuP*?LvAⷊYn9X0FAW@ ^!lѯ%7;J-!E6{sWȣ ;70M-nџcZ srLv\-a_,ʺULL DBZ(I\$ cg:&I!R:P!O0ē$Zj9>Pz_֦ڶz%Ihz/G{|V@}4)1ET2%iDLdVT1L#iR⪫ʹ8XWTM[Wu}Kbj][/掦iCM鱮3 uh|0c  Uytfe`qA݌O1cxC~~_e#F8bƨ0V0F c|s3d,:F-!CUG[HZ,hNLMG:݄]]=>-暶AInݗ\c 5qX*bh~\ V|ܷ ٴ4[rl мyx_'Ef#ӓq>pEUJƛ??)͔-G?ѾWNj}Ͼ34=>I#4zqQ2ћvDk #0AD4^UbG(x([X#=&]iyM %c%՘ WI_O-(r#)?f1Jf4Nj8qmf7Bv|zdOOBLB}ѩWDsF+ߴ%O"R 糵oܨln1I_ q؎>BUW`R~P-BϠ7VjByT RֈCN`h};`L4\8bbb] i$) ~rw}XxCyW[=y;Fj@IhIZr#+ީRZ!;8XއZ,m\Z9םch&=p\GK\T$GI<~e2('8~9~?Ogʕ8Z|azn\$ _\~J k C?|2}Mi° 2k18dB\x 2m:*K5s A/w!py+ԡ_eBL_ vP=uX-TӻPG{J4^Xf% ܸ)M`-9 -Pn sQѻ!w`#(A-) p%ݰ(T ,HAK r?W-.C w'$Pzln ubS|6'kq08@zBl^kɚ%8SMp/V'2~m% Jȡ*[$ݶZ@Wz"hCJ'Gߟ $'ӐDhΞ!脥;C P ]6vGN߭4%;g SdS&-ӷo\%u-T]˖njka E_GQ2Bd`zG9o)ڊo}Ih V6_g}/ˇ~W__}oo~ooopwğ[o~/w_eߟ??~g?q/0q |/zeOʫ_}͵3eo%sΛ_ZV^`UK.um+VRcq7oݖLu^_@z[슎{]Y][W߰ymK}]G8~C=Sag@˝Z" }@4P@qN"P֐wOxObllUn6X6b1f/ 5^/>\h5%PӔ7B,[!2#Q績nZ?E&QGMe.kB ikKtS8mCsLf|jH^,oyd9Rǃ~|I2_Y3#y NzX,NsP<#8&ΐL<}^pMD `̖S7 Y Ȗ哃Zv g|,o_|~ ,Q(PM'a8'9`PЙ1r?Xy/^?藯4. PxDd|~usss8z RWUM^:8}Zn~S浛geף/ z_ EaW.TAŷ_N3[.h>;*N_Z߸[ 3J~ B@Nٶ<~ngKCSۙGuu\GqBQi C T)bOd+@ޕ[}d Z"v"vm!Q?TA3wgF/tNry3w̽wwhh:~"DŽǘ Ϥi}u0u0B WW{'0Ymwwww?Q>k>j`>jp>*55~-6R {{ {Eooy]Dl̀*3\p?~3~ ~  -Wn #?0>B`3ȃ?H'0睶g0` *> x7xc_G^M;np>?? ΁? |* 4{yא ~- QK?茶ϣO{>}_H_O@o7QSPR|['rp/Ip+oOqOC%׀ok!:x >LDxGo >Fq|7 >K\7k.ޅA0s O1?ap  ~ U~5cu&;TEG9p<ޅU<~\?//(:A&ߡ<} {9A!$x:x=eWY?x~:Gq僷X>( wC9 ~< nq> 3yGse3Ao/1?x^c~:󣃺tӟtp/x:}L!͓ПWe2:=%0A?w!go78:o烿 ǃv?g?gw?~ 82oُ1^ 9' 8.Wqq7^ qI׋H73Ї`&~o`` .A?q ߋi K8Ug`bE-֑ f8Wn Ǒ}G{W |Ǎk8 0HG !oio?=>h_==:5I{=(oP_qM?Ꮳ׃&kA\q-bݷۋ81և}?K3r_ "4K8f[=ahIGcm F{w8-?¸?ں|8nݷ Aܑq~qH) Nnp6%^M!ĵ8'#A\AqEv|:qm] θ ȸg_qB7J{$ v [8A?Na\ܡoΌKC  N8ҿ;K2o ڌ{q8:m$13ދ :ʋsA\io?O/|휒.m⏴W,cyR3wXӫvMNYyƵQjY1Y_go?1\ >vSrO^G1o%{~rjAyu{ryTs̏r?JiqpWl @ k̏uj}ƻ"2"mʻ _/,asv"M~:Iig/lX5KyF!'{H?;Ҹjgy.ϩ]VrV TOᚎ[ey1Z~9z(h~W~ x<pE>~nT?D=/\v(KOa~)H="9xΑpYۍp] pO8 DZ ;AEʟqGO}*g>Dg\x)Y7^?6Ou)?m\.~~'8qJVTf W=Ⱥ5#9Wz}TEI2}Kƅ5_ƍ5moϮG~$㐬~ynr\'㷺#gGl叽A Zz f^-b1ȼɼ"%Vy$H?<~3}c_CsX9oAzÑ/_+z֎ڶk=;gNp?hxqD$x$Wϟh~?::﮾I$G{~xUẶ/X`xMV? hq\qux/ S8p\q5qq O5}8q8.}/:8ni ˙ x|ep?EvS?35*7-ʱb\ʝ8ʥ(P}FN;:`|KQl%6K+w*JR$39{vھj"??6v&WLzY4KvJDnʹ-94J6r') 5}X"ݍD{}0 'GNR/Jrֱ98vލ&^~-ERcjًF~)lpj(;9Dގ?;Q;d;mԭ-&U{Gd8 oN~7/{ҰXwuW?eɰÉw/䛞ܧfumCvvXys?:TyԣzS."׊5LC]?'f|zi7]̧ }wwă!/$YOM珔w[w}}G¿Bѩcl!dʜ]1.aL[`w_xZ`|zQ66؞W8?RbǹWt+x6;谉_ui1/_wMv+!OA<8!O+yP6s8lbݻ268lm9l -*0;lr蓻/cS @0O;l_t؜9}we{v?'6yyhYOK};zdl 8lvXr ZuؼGxagaOac%W6]ތ6Bw-!ϕ8}{qƳ̃'ʜ}:ߞ:x>o}A3&H)ow1#2=:;6= #GG7_lߒ󬍷ϔSު= KӮiuTߦ3$.uȾ;Rwmw"7K l~J^:_=V 6Z]q'[PN*پ/z*[{BCK 8U7|H&R MT2E>d!c1"I"ID%Tp!Q*рT!DYk}߿bMI/* /ƾv#gvuEH'$xo'|_Lۅto Ӓ5pe_x/=CCc /猴{!_ߏ c]5D=;T2ן㉝E}'SLJ{MLAy v=$Bi#{QtD~g)4 ]x?ܙvOs6?#k1⌰cDlL sΞZ#1`"ꦅ?-o'8WL3`ʀa_]GO`Lm_z=\S˓?c$dL?w2<:3'< Suވ3&i='XЈ#=&Lq^/Q復{ҟļ/M9/_\'5?+D_طc3z&fLcvj#p9<pJ`Iz{Č[G:߃ɭ2'CW'q fxg&$(S HIY~oge鏘rc;=̕A;ld 3N{BG@uM'/n2* ^/,Ċ m1tuio1byş} 33˕Au>/̭Ҁq0/Q'1v{쐞G9|eV٧̎ gqCK:Vb|RXu MJJ-6z|֣5ϰߥ?,s׾ƔRtK3[mf:_{.o-^? &}R*9|2/8F[tH(#Fn!LC86t;Ϫ/O ."0GJ"|BCM2?eS^ĸ:# !Qy%*8{}5N.ur&J%0Wvͪ%҉$q  ·[>E"u}x,M .zñ@)k=*n $pɟ o@`OT$shI`_ 6#Ⱦ@J`y+^%z:HRB'hs 9uu ԻE[W4x;/WAW4rkk7MEś=s%*ƭ.}+-ăm"ܢAxym%pE_:R#0ԑ$puV8a}K'B2MN/&&n'mD>W[F^q!P4c' &P@F kd 0Ò@ޏ"P1vV@lm.!p,V ׋Y;E 4/?'@1yw!#B&xԖ@=6" /XN` z%ܕV Ul < G!bbL'p@"GXK`jn -\A5@[6T(qi=(I`$Pċ!Hts l7@k64I8כJһVv%3::EO#rsb|9Wc0~N;P<ȢSf? Ȑ Ȥջ폝ojuf`\?u++|>h9Di-9 W̷0l &tFن%6VƂZr7f/XXW,W˿HV?z:l[Ipy{k95B%rAqfB -i;3p_H[|p NހVQ/ { jApp~պ.O λ!pnRnp:ؤ\{Vg0xUw쐿~7\+?I^[/Ľ"BD)= &c5Hjǜܒ֟;:5_vz @M&.{lY#y9 ęvYc _yq ( 9]A7ʽDOEAFq9H3;w16* (Zg NnJW%lOVf@rֳ'qt0}q0.8\;>`xc+'gjuh;3:O!UAt˱F_%g}^_C@_;nK ոvsOSk=>[x7 cHˬ#%dWSRXdP4P~+АwWهs#g6QV;TEg_5p77*M1qqAcxHj,l "n_9AS~J / ϫ|Zֳ=G<+p-1y@aQi$׏h=5a @)˚]Vz[3_07;fc6 yD):4^F/zç=k/`]kMkrlAG{\zc<9/U#3e[I`^w?&{(8wsUPٲfkq*x5_0)TDyZ{D^}+Mͻj$u[Kʳ#@8pzgi)~uKîD۱) | 9|a!˽Q@pt?[[Rpfկ"w ﳧMbQNjyK}Ey7h.L?罕 FG$Vxn43"ꀘB Pg p;@祼qIfnSܝ܍I ~ZpעEgK p:vgo,xGs&'VxG)dqX|*d > ⼑LOgK|ixѣGɒ2ÑVd$L3𐳱1 X=Xx&31U~g؛+^: ğzʴleWömׂ dNom.)d1I`DVzO̳W,)LԟcGܕ1rFY x*͌S`0#^Q+&_vʐؚt@'A'1zNNE`@8S$͜9{A:\ciَcA|t.Vn*AnN>@1zw1ֽ$bv9_RR]PKJIc)dJ c(_䓂iC>i, qs)N*㧷|i@>>oUq@uZC>^n+8K!_P q>of|SiUGB>qNv2F!7!}nR>}|þ4I*ok,E吏] x|L ,Y=Z>с|w||7Fy||R8-  ?o`S^==|2}7 A>~nzI L7? ||#!*;4|<W5r7@>ٕ ?(% ɐNg<@>L3c+G|06}x𢽟 W/&9s(Hǻ]!L|\a t|/|Q> ˴I|գ[;ɐ_9,F??Hu7A>d[Kρ|\dVE?Uu!sh_P|]OqVP ml i/ qׅ 7  |ꨍ吏ѯ||Y/q|`Z5s _[WQ^ Ǚ~= ;  qH9OO %C>xlOv^|<qz 7!f|KUM񧲯!tFq8!7|7YZB>}';c!O6g dq] !ѐKtA>m~獷fC>~xz%B>V8K7gz␏^e| B>j xlGB>>K=loW|/|Iϸm.oHA>NoB>u{GG| $_ ߒ] qGv_|2"#iB>>l i _&㝉+!Y 8[]KCW|<~(||9{L0qk7C>0kC>NoW@>~60O߇|Vuu*gA>T'qu[k@>NoC>BJB>վJq3P}Fτ|* O:uE5C>l( xmZl88#fC>Nj|B>n- 3΁|χ|DF8c X O,VW\qË!I"m||e1 r3ǻ}|\Ң#r% ||\i!+C>zq9+H1|G?\QQ7-?,/|jL!0g=vupm;ߘ|H@/vѫġD{/ԠlQy s\cx͏trz¬E#>4&BWwiH%AO?'?j(!F+A|Cf`˵+!^Ӡh.g+Aިyt fV)9wTsò9T !.j6+C-~:" {ݯBƾOm!ӊv8ޜr酕@rl̠9;3:o׊ 8?}UX$oe_Ⱦ39K+QNj9Y|8G[]MdcLyM jeϞט~; 8HlBi1[obEzշbkVZ؀`QEOໍR|s暙}qzw[B9Mt|ʳ܋^[t \[͟Y4B.-8n&K k7'")X\QC:Jh'/쑁.z9CJT{Q&W`7Q2~Q%^Rfj.;=r]Avq` R=HY6p5]L4 /_x.{+`uCtZ:]ذpƘՉASk5 kqM_fb Dz=DGXR֯IfB~,BrT.KQkiQJկ]퇦f,O!|EiJ[<߭"li{0ٕrkv[G `?x{ݲ`~<@O@c`ĺx<ʶcqg>Y__DG=iBG\XQgS vimnG[l&zn?}N{9\a,gl;yf lk(aPO$=~Oyϗ[!ٯVg%9~)EX h?ByG pAVh?gB9֛6~nCouj{h?\\m6B& gx,h?=ڎsN-f[YYO~[3n2Mq\X< hE͕/`{#PX7a{W+1zg$,/ƨ>?ڝfڹzkQ^V˨f\"ʋ:?R^~BȬozOVڲu ;=S 4*݃FǼrl}Oj)=)}ʔgg^Lj&*&s05[HJOú.U1xN~żr뽇ujV2kٶnJ3χɅng) x4O3/`ìXgAdGן ''޺/^ލ5sX(T~Tņyς+&s_Ǽ?f~7~g7>ϼf90YU(_϶@¥ 7~N;ZsuMMղ~x |l1EX+TfۨUEz %5 ǚ>UؼY?jA׻п ]bEҦs*{o(`[fmjU)ZSy;Vې6E&qا2Ә܆T[~)ؖ!_FlJKIQt,%2c5i&aιg̹C%? ٺk~w-j%U7YVDb_[ c2_ b&bgή. rJ~&cW>M=k>-llIJ`R}Vمl-№ݥZ.!ZŹ;|QNG7nU? ']vub/(f e8]E.0 )٩Ԧfz a /cBȌ^P}jZx61Y.)2$rQ*T]ſ4jL;WeP,Y19h yy@( Q1-O(s0˱½T;}1?|0)"LWSpJ8ܿLO ?VT}Nir.$w .e )]9n9(`gSY3OGb]*` / 8|=pqoͿ77[ܿQ*߮7msGmj#v sV}i̍Q^yc+g׵ X)8=0f*c^v0f0N^uPPAy^??0yuRأ ϙ8>?g"?>O>1qH{(RZ鑥%ެYEcO|5}i e^hU3|<ߌϼ\y~`30\HbL9߈]2sd|v(~ߣC\_L|ˌgagcǼDNy}㢮arj5Ĝ*ۏHVp^)xk";~"3|cT̖sqƽ(܅ `ӷ}Me3ʋL]5Ԅ1cH>CL6==RŸʾJ_tJ̋zHy 20<ϔ|AkK mqHP}ү68 [TtBP}g"<.~v@埜߈ʇRm@F/W&*j 56Ay٤ljݯص0kHUX6z <|t/*\T@ZO|KH%<BP\Veo}AK9ޗ-UD]sס1FN?\WfP޼Cz>S[ Ay[/5異ˍ=W]s?9(&om~+P}H7sV(/!/ P%Ũَq[ʿy*KXlP=p*ԻȞ>GQqAC>CB(l@]NPa~r z }Qy&wB6K,k#14L`%6u}-0 8d+D%w(򝺙`Χ/>-vPXnz̺Ev\\' m7'S$Nb+<P\?iy؂-L0^GxƦ#cFg+ eb]b0MM?U;TE1ZFAB~*<м^m"Eyom59˚VKVp!/HvTYy[eazwzJM*;o!ݠ-\pѮ[Zkռ׬+}X$`t-V1jKlP[XXvs>[0M=6/kdI;_tlai'r|Pm/Y>hF^LaSTU<Œd1-pnN<WysOz0,:~.u{01%k7(bjf&myQxhˀCVɔN-V5m{b"W 2!k LLa '_~M:oY5ė ~#VG,TGv ]4:DV=> T]񰳲=|EuNZk=m NltISd E+LUK7h9{EcYȋ'7k( 8٫{#ԗ7DP?B~|~ =P{v}uڜ~ jOZ4,y0R:23xgIW|/?^bg bǺIoW׈ nMK3]اJzi;^䮗YAZ(wGP8]mݟfvK&\[gQ*;mV#ɰ/Z=Gnɕ]\ׇo9^$Vz^o\kGB. ve WXLbK殪=::GY 9$R_ei*zCD6%[AٷK`T9 ! RKnff@6Q\rSkմET%?(e/]<6yiM˙gɛ_.,8ZVQeny_\Qòy|˓CrlS\l>MDV)ñ_@{Y-A1*diB;3PS`>;‚_fd!& ?rԹq*`K\0vOb;iqOծ|SMKXM,meZglRNK淊Tmi-Ŧ-lkȺ[z:Z*6Rq,V7`Et*yZ;bGfKHW7:AnԧdYx*5 F. $Q~nc!gv=so_$ĽϥߤmK=ۏn`1{|D}Q&-+_K>-~F{ܯ ֗ж;-*c#:heo"1 ?mCUt<#NGߢܡ 8C!{߆4s{8::h>Rd~1Y ig) iw8}DY!!_|xqd&mm>3z)oXu%v ¿C3t?~rG8m\CYueө'u,n{IXnZLܴ7^+UN 2䟭|#ԍ_ӓNZ⹢\4ѵId-zیcu9NvZ3i,MKfGgzK{^8Lcȯ`gSꂏ +;)W Zw&%4sB,"atٮRk,?QCϤd%ב'Sإ7.Rmp^1xwG E=U u3ӝoD~ ^ߌ|f:1қ2b|02avq]$1MIHMh'PGeȕ1t$e$tn O->c#>בdIٚI'QRI ~ei:c#3Ht'E"}]MhIu$4g8V=iI#IxH_IuIĵ$(#')hiH_kI!Nj7_;'M'*(k=HERѵjHBMb$Z|)bJO<=?R$T1R:>܋2~4)~#eQ$I~Qus^E.EypYD%o4]V~ K̾zUeϡ9gͿwR@18R%4hkXqSY %I0JQ8ea/Ϟ]$؜ߤ-뼦é.v~8Q gY\Ne_twn.#++u? r[Rt5==yvRhmw5*&o5ԭHpzSMcvX(|gǘNn֥׼Ki0P@GD u|ccٮ%ٻB+/Ǫh-6%fCc+M,4zv`0Eo@R,.b_ո.t^%YK8~w~}~moJJ)ΏYG+G`ϵz^/Ge7mk>J=Z՗e?Ȟ\T^Le=NSeHxDSzQlLT{SjQ5bREZ{Mtp]dXJh,v`i"0ﷃH?2G M^fj{5Fǵp.hi4 v#]bJ;D%Ҩ |0楐A3Vˠ%|%)3m4ͻtZ[xpZWG5f|'|?X-v~J#>x4~]KM-ڷ6dHlBJB[ m.| ohGu6y'wtJ m8Ȟ(_׿_CO_׿_u_tg _wqgx_==)̿nB̿.ݿU>9~9m~)iz^.hsg:}}iၿ[y)2ua_\~o;WbCcM ?*3N7Xm$wV+P'Μ_&x i}_=}'ן-e0)`zDož>iB:>Q*I>zЦ&ߥGzLnӓ&`&̿H#O>*O>H>rM ԣL>nn< @o["dоcbk}dWL6'baD5Ch0H\-C!Njzo)Vh_.YEAf";CChQr{O)yFQh_,+EbRO\%j}hp><ߛGԑ}}BHCOܞ#U}8^4.M10H#"l-EHB3*26=yY9b% h^q(i'ڲ6!l[( IIh?x >}n^PVlάe~. *:ݲԚe5ƼU؃!~9Vv[7D} [K;V)x-c^u`ǒ-Q<@ Y/ =:ێ^8g~]hv=ahxT*~ v'd|p5͖= uon+]l׼Ajgn=;AÎ[o<}K7JnO>a+eC l9yhˢFdr\%?IjlAU^/ b=.U; ھyDKҕ qW>jJjjw^: lhP:,{iw pΊRm'@v˹e8쫩:b(Y@cr=ArnjeXV 엒S^{q#0!flw~V(OjRReOF{$!thr2ú&3L&3=ffXS뵀vU ±d+8'H:hwe>Ab[qP@= ʠ=Z%˱y㵂)#&oXU osZlÉShby+L j;V=( Yٙ].S0e SSo}unX{<:n>`旙f079i}?s99!CCK lJuWb@(d͵ I<8Ci h=rAye|@k +mJtB`W(| F(ɆfZ;9wtq o0}~u|Tp曶qlzN,_i6ޓg; A3f;uK 3mw0 Jr|[P#P8 ~)%7 yuk:ғaq^3@+њab]i~Je늉߉ T_A/HOt&op=t>Dt^pS!bb q@}-K*1{LSZvlc(;7VT 1 ]{3dۏ=!0e\mEmLyW8|b^.t_Á߿xB0L>?8[)m,ɇ*y|gWkUɅW3Vˬs4gE7=pdUafPm^PT_0sim0 *>sVm ]^sFX\))g>.DσЈvn"ErAm!%hIN<ğ n?`PkdQ]~",nN7^tȢ~iO.Y\nC;1`Y׹ټptɠ͙V?#p=N3y0$iboH+>R;ʮEk׀TQ봣,8˙j۽{V6UnR7 ;@Ѻ}WB*-]/tVh؎sffRLRM#l|9ъ#UypMWa]a@:Wh rOv{~[+-r0 J:ѱw`;1,F 5y>a(PeKokx߭yl]Gtb+2ߔ BpV=|އ)}l r~2Ol+փ: 'r3A9&~t?&+ڝJ'XfFw%̯ϙBe j?zÈo9^`o͙,>5(f')[_ޤ<}~>!wʻ[,}_.}.}oi*jpXPʕ'o{{[gJ~v@L¸]0YqWd -LKV7O;ߋ֠W9=힮 =; ~8<4f~2w hvU5 =]QlrQ@wh3qqV9 +֡1[}O΀!쮞$ͱs?v}$\tlon:"8%x 퓍Ȁ OD̀`Bp٘m|WF9dBqL3]GH+SZg慗w/P at\WJβ;Ah笘[ev{^:bo E礤6YAeOжPMol 5nB[L`={ͳoBcn-J/}ma*?Nr6 [udv0o]{EN0 &eò/ffG'+nf.Ew`!5s6c{q:uNV}Ntpv?;' 敡vX9?ėr!fch pp\?3f.T%P >C.{A_@Y6ҫ<{ޚ=--vA4}<01?ZR~]_)Ծܶ![pC\;x5ڍ$]MA4.ȇpsړ181r#*UNvݥvfji A>ãEl2:B ڟ?PS 6pg h0WuǠ^Icog\m2Wz}3 O:uv!|릫vlI]-"͈m{ Mb¦zz*QO0p{'0Ml,ڽ˓t9  ~QStw gVYI~ Զlwy I֋2ҞXC\"}jCWn6>LtTE;YZtR-7hW_UZ :+a x1컖|Qߋ_R5z@y9Տ<#g ``gP]bytGN 8> k_l̚]hj0'>*j6Fu%A?kg48^5~Gn~Svvc׸E@ibH `~9>:w+WF.ѻ>`Ǹ{/jͳڥpmsKJOiS _:*};_\\ *?u P !|Џ .aYԔRзRP W{T 9Й_0B͹Eezm;f1*dmsuZX<}kaEe>J=e'8Y6)=(?r2iPS&B@Nxsz[t1|=`JwA?ݟit9!|s=?9h8桿K˩C W~*C?7ܸ9 @?7-&&$w?pb+mTA9}L喓C9$5P2wʊrh=ar@%@2GK~wr`YCg~-@?]Vpk?X\$vl7ۥMZ;N_F*vqvz҆ X08tk~Zv5R+ήNϊ+`~7#cm (\P= XGhz=?x\<д0DYSпu~^y?%z[>?zn/l?χ+_Ϗ/XZzJۯܮgsSk@04Hۧ%cZ7[?co5?9~͇_8<`?3G^O'͛37Ag]{l)8t/hXzKwdH9|3g9G7)N2Z[ R~9(CJY=R~դK)*8TLK,ljRf86CORv|)+?~T848>I>0bܿrG9T\QF,%AfR/ĻPuKR|INjk9^TcHǛw10ί)̣m"N9Vd?XS~]W78>yӾpBQ@pdow kʦ/u Nͅ]΍ z u#{>S *4&kE~ƭ_4]#0BS,LZC ~-^bw NIzI9pLvϾG^@oJ/5ƯYI/LJ>Gq8lNF/lQQyl]y۷dŞٚ&"^ޱ-Y 4IaQ= wll==—YC^lfO9Gk2}ip9c>ދllcG (rF^p=5n3`ISNKPzYPjEM2:49]oMzN[9pu,utdq^_nd_P{LP ?͝)~=&UWxMYC:cY"ky9*[^BHn +;x {$'1QUC.}-Kw|Gqˤׯ먱OrGS?(t8e3XG 祐R"2ŏe>Co|[«M +'c5jlLs]~oEKߙ._._.?]>]~|}tt?g t >\o|[J<0@vZl7Cl4]iZr էB/\O`z.4m/ǖ>ByI?ݾv4 I!-&$"_2ٯP7pC_L0` YS<¼='}d2hVP1}˄=ҿ l( ^!a OI9ҩȃf3Wd}1^K_ަ}{ _s, 7qFtZKrzNkq^I6y6Wbx1#*SvFadb&Ծ(?)-Io'\^(oO*XtM—*rfO[@'C^_\H{m}Y7t<2vg/^q/nUoP´ei_nƗ6Zy:pvxeYnp.X&_X;o}zolt*huVZ}T5s^o oeOߛn3{>$z [m{}Op/hi'nΐ52zH_)Egd-5 2p<|$(<#5j1tZ% yC>$Wu]Y4ȉXd2K/Ͽu8zoڙm\3B#{F{s2oP';S*?#hnRXV#hW1*3L}ڣ >vk=$vU,ӇY"'qD;f!`QhDMcK}E{;D ky[@WhǾk3Vx3ٞU}.DG*6h6[ćZ-ss'<\hħWO;n_!)oNӘx682 t~ݓ>6w/Bҵ n]}_ _ _/KHOS`a+a-eX2~ \__ƿA/ w{b?$cAH_/``I|I%D2~g0<+d~Wu kdמ"~J>gSR!Wn/ixky'oNM~ \/X峾a6a~}J?Еqes/cDNS԰M~]q5׍Jsl۸O|ĆL7[vۏ*%~ĵuiP ^ca1BZ& ,wjgbeJ=Moݾ!8ީ4ʟ ^^+ab&NQ;_gNC:Vn-'2zA3E݄+AM~#U_GvxmAO7lU`$~3xzjLO:3QOQOPOx=5G=5POƁF=5zj$NćVC=5zj/17Zzj<>Sc>IEn!ꩱ|ScF=5ԸzjLOv3QO@=5 1=筆zj/ꩱ}PO qPOzj'񿅨uScH\pq;%cHp1_SKGsI QOA=5zjclBS '>XjoD]Z/erkG)mvP9Veu: 9uߝJԼutaSqUQNAuϻS1mGU.Y9dqܙ܍*3NgAuYG=UCb+EPwaYeiLSgzpVTG}zQlg2v\j 5u ';o3~< f~IM)=>Foe25≚ŋ|ʂ~oTYׁҽ5d%ܝR`Ew)ۊb6(^%|,-PX*xa,!m-Sׇ{Xy돳W4AWov"_GH2/נ fC؏pӈS *`#E<$ *7]w|%#\SSw_kvP?7.%ze:Aͱ.#tt<ʯ"$Bf-ғ+WCGA⵷ʩU#Yp&Wb1 kom[DxkNc0'N+4BE3kXKZ2"AyeJj /J9oprͿ4?l?t3h:ϷVPR8(ν6sTGy1C:|aVA0{𩺟1KzMu5xXڽg=SfXv24yz$ƗB~C@.w*{1)HII@PVv0X藽Rcߺ%w=g%r`JAó>go55Y 2u}eBryg>DysOb5(h-}usVݹA\u+ټn%qw"ȴ] z#[Km 8˟qF[@ۀU+"!3=u.~gӭ̆$O]0Pu:Cu lWĝFPs\ݣ0bhΧN3d@rEQOR+ͳ0ms-aϝoY~Kgawx&fVsxW:x֨<txa|g-. Ed^4sZv /|_xmqp=H%Gtr ӨiZruE\6˛F}^G/L}6:6H˟BUoB׷nOzJ;T&M9SͼI$ubƁo'ꑨ{('PF$rȘX9)˝DȴM"BV /wef{x00!=la<5veim44޴k7ly~tuuaLr'PV/?[7s Gэ*эh~ӹ^hdǑݻ?mESƑkz1{qA^8*Tkoh<^* |qiN;c -XQ̛1$toi1c:cO]1J=,ug1Y2O$7Y!޶%cu.u}2!7^ΦgQ_|T:Q <@;G9Z /f=xч{QaQՐ8o|A^.Q4sN /w߸7tkL֭'FQKQ\{(i:./?]EQ۩厢iF(蔬?I<0*E<`jf,83ֶrG[k#(wv۳#-9oD;T"Vg1-kGyW>#.j AWߘ5"A ,֍ ŶatG}aK;dh;7 Uԍ"WQSmS_*E /wYoe9:,0Nӯ< Hŕ "a ߣ%7,F'? !iI?CݸޢChsC'B} ;ʇ+5,huxPD҇P⬫= C(<ߢ5j>$x=m\6&:CNCeگZ'|ԭBX&۞&FW@ԉA$V~! Wk;uD?D+ ; rVKsA\>fmD|3Akу8 5A}%i] Ds#6DiFѭ_vDtA,`BDq`.O]'BTS=&gƙs:7sP?8H>8mhqʹ񞃬O[t|A6j=<-J8ΏTdi9KsP8hsPoryD[DjuA3OVFr% ڷ}k/x3zԛ)=]#%9nbrJze\r#jlr7.~P?_|#8\b 1=,xCNc!%70GDvK}J9p/Ϡ|ebG2?p|}GOxԚBEOjU>/3 jb{V /݅6~"Fb?Tp5J})|_&̊Q?=/>cҍafw Ch>AbzU?}1 җ\6HN';+}v)$ Ys,S(6`S1j_̈Ť~N-zoɍJ,ZKaP:ft'̊I+Ǵeaa}Lx&p-kR^aR~c>M\}S>Nʑ\TGm"#d)}LL<{ g[c`Ff> LSO~Pc̶IN̔EO1so ><@mfH.#Q091" ?e٦Ɠ($5ah :H!}(Rҗ*zN~U "6&gIrҿR|EcFL3:`= ',vf3鳔c:_bzcj(fp(f-fa!3z*X)Wz1aFO4`rJ[L0 1 mÌ#v Sc&HnPǾ]=鳥br6Ŭp,!b0n}ä{KcK'}Bx3 9 ;yi|Ln6*&]vNĕIzh8n~r>ަXI70^ǥ?cugWǤ>'N0gDbz#]ڏ}gz]@GbV@;k~Dώ_:)r]3T0Iߓ }ύ1Z.B~r4YGYfB 0om$SW{Iu!\;JcߴAI3">o9׵j%_ɘo}Ep+{CTK/X]j-uvggL5 b?*+[m:⍊š:" U2,AP?"&=C)U3=}PeT4 E8_nPLh /J"WΈ6uF/ <)@Y)ћ%s(;ݴ ck PFo 'z. Toq:J: 06\ș`M{$cv,0+̡6{^J`T[H}/7 c؇]mcӌvP. Ivꅕ)å3& |q3[ S18K{n* tW MKy40x/؛k΃]}ƾ*jB)X2d>Ws/C_|(zL,|EÊ/PPo9Қ`?'g?VkIAdLԮeg6Zb(\z?_E+t{~?e$ˆr}OLd݋s{l=! `sb5qy[0rdޠ;z \f-zz ,f5XҰ+Z˓z2-c豄k}A?+~4?9)pdCi: f\.dΣC;?X[3orkw#(k8g~IP}Xm|喰7JO֦NΧc:ZsmS+h8l/N#7uv_I;/ 'Cـ"^0kxs+cs&kz^u0'2Xa|2)mNk r=폃G)/'}3b΀avhj6@`ye-YZV0>JAI~0LVב)Cナ-He9טڱaVD5|Srw^?CiL=+˦´OTV jxx~ظ'2L<@!makqp@瑒 /uw./u1;>0P:wr쬹UK6EA/DAOӮNݞf*u7;BKðF;xfi?l\_~ĸ u~1™#n'_w( < f文9A)yShn/ڧzb/NT\Wɇp愝d3{mYi-&1EVy>~'ζ]=wH䐰;H_h 52teGc68)h6kwp\J7OĹB%K4ԝneKAr ta)'cj4 `gt5l}bt #=vkl()]6Ut޵!\B"lJL6NMm&ٔ5D;P,TB e&&cDW;D`1k'D`16@ \=JOm PkJ8=H!H#8"Ae*Ոy1]bLhcJ)6#Dۊh396DMv H.Ę+ e B*'(v  'Iḧ́ m%C(PB; %kSJ#=Gh?tbtPL e&%G't:B(qoBLjWFcvՙWV޳Zu0i0e $V1u3 6Lai0-̵Wli̫BSzw& .a.auܢά aڼ`.Ŕhc~ɜ)(l.`>3 [It0dǙۏ2[3[vw1-1#c3׷3ze]Qf鞍`i2/kd^ocޝ!x\U.Ru+֥( U#dtN{oKl?|3gΜ97m&Kb)vW[dv`_J`{Ǝv7NJKvl[ئ-?g̎-~q|eccW^{-??;Z&6~յN}kd Mgf_X0;9Yëu55mkYk5ukG&?G/?LEh5 p>dbQxj>ʼ;Y|Hb| 1|CG|(;dc Xa Bş B̈́A\x_!2bQ> !韄0`]Nj e }{^_n`ނA <A{0h; >' ? ;/~o=<4Y(3E(6EYdJg7EKRhװ(sg5Eˠr軂E=YFW¸XaH\|G(_͢k^7ƌ17Bax(7AL2$7-a9"}$7욼>g?yK?+Fo^!cgO5cCAӆ_x\ވ=k rQ2[ o \70g̓˿Mo*bZ^cow>~)ص޿RyJqfso2["|M˜8f9%L;χ #G0 ;&sW ltʰߙ1O637??ϘeL1 DcL氷ѷ<쿮ɰ}a̍_60y׽Ǡի77Ŭz82FO0/-0ggdn9X>xnc-OËZ3\zs_z19s:Ǚ{ f,KOL4 lpOjmˌ-;kWHwF݆]n|F;bFި3杪0)y>w_Μp4|?E%*]+{8Unw6?ϟӉCk_}wYkpu~p ѷj~:om&@/]yH?yxxܝ\]掳+9}MCG̝:l>~{j}}OCѣ߷W߫o17 KuY'a}m.-oqL?;}hHZI-߮!1EMǗE׈j4k,?Z;-''q(%9I:3 )PX1߶Wk~3x#2q,iؽ>2δAxR]I̫>ҿX|i'鯭wz+js qyXB68-s#Yy\J}w8Db&txIJk35z‡fu$q:;oJ(;o \ݐs5Qi'Xe"TIH,Ho3n8P>Κ]&!VƥP^X;5 J 9m.Jv9+]j0{轘,qBGTK(CP>B%V<:rW+فׁ\kEo'ex%aPtPP%4s0>L,!CsCa%X4hg?f JJJj0ACBAC?/AJ ~&(~(Q   (t)K&y0KÉ.o5o"(#\ *HP#%8AW9r-oxgPnuy*UCΛZ~dב}zqOWtH=WU{EAR-J-/IEwWcs$M|IQ[ӑy$,~蘭'H$itO7sy~dG/UBB׭b~y9"yGQҮ'4lj?9Ӑ<=Dӏt].jMm?$"XqyHM_B!u}Ϟ'w$!agI<.Vˏ9ݟB 'Vo9e/K/*UwxD-J>O$bcTv2RH+\h`Lm)5=h,h6eĩq?OcJFh XSK)w/q Z k/WvAvV9$`v_d'W|t\R'F%koyn[pϗ溫`>0ϓ.h/Иއ [.ߪ9잆>Gb޾ƻvڗ~ϯƩMJӷ'pqUxKO`b>I>ı%~ސ|h ޠDFb}CkpwU(%)qUTaw'9 >q 85*3/? WRw>cρ)'Pg21f}r$,rZ2je}45b|V?KSwS >Vֿtğ+G| >Iå/PѧyixhU[$xWYZ>jZWO/<$oM(gGU>3F '7JSUb}ά[1sbqaQzzvT77 %q5HΣoܧo*x1g_@Vϵ*5}W+{b5*sRC!e}Ix3U%xm2K+wR}6S'- SjD|)x(27wQo׈ǰ? Ha@8 $!ϩ'H9 _'+ { ~ze}b}LsiֻN:14Eu6_|avbh((ѧYE)M?EǴ(ϵߒZ)Rk6H_6oRٿп wt/_@7hݘs߭؆qյ+*=ܪd˙U-g+;|i6 U oצ)W=5|B>N刱W c8cQw@:|+e\]~ ĠCE~z`޹c1/2P4F?*>@!pzFyʥ1< )y ~\]> A'9H ztAy1`c1}3h yhOe^1Zxc^r٫ 1gb!|"WCTE>2 o_A|??3U/Qi7*'<菪G"/6 o?T@c=H"i_IeuSΣb:?<G*3XWWTe{ dbqԗOgiY1d`~8Z|O|}o`?π-zeddN- T%r_}2 4UƑv*S ow @mM䳔Ƽ1k=vP|&Ǘ2t>&+Dgh/3P?3Ӟ@5R.菜7sϭiSѧp zT9 L>8\(9/$63nIFg)T72/_Ta}2@buxt /[ *I>nist]6[tا2Q Vve+7AA{%Ŕ/J{JYJL_Q@3}]_7)7:W>Afp&r_Ǥd>9~"DɯCO|{e}*f"X;ϑoijBGX*_ke <3ϩ~ה~۷b2rsMl4aRe^]ƁYv=}qʾꗂuoo-Vc` Ͱ~+pPOVaʾHlZYbJf l_!zJ)~McWBa;g+!9vi|qlPD~ ̣Km/@oS2c?E_`X)nĮ0c?C%t}q$8;*Q,'*tF>H)QgظrHց&}=^犹*Ϥkokpxs z& z-a=ng ȡhn ώXnڟ/[5"hk^k?Y>lF7^1UKY\G#2fM]؇{jcݻ~,jI#S;uނo~xV Lh[a?{#5>-S#v:KFjRf)_Ʉ{W疿aNgX7d,eg}Xد6mw+*˿BI&_+XU&fݱom1 7](Ѐu8C<3F 3{b^xy&߬~D5Χ'M.B99)fk1b"_(y1=Lls9w:?0?+_4ꁹmޣ5g x5u khX7 _5~bh-f͏c+Kzs;D 댼5\_[!N`si߅}.8DKr%i-uh%9&M:D4R|v:\yiNsyz;MSsюt$b/kNN%][^$ay~,LQ;r0u ox%~nD珴{.٦ !1eB5,\ y[V.s GZ/DoCtEg2&pE[J~ Jq8 90V66c$swe}^h{h~W]bc֞ YOt˟S߇Uy5{j'}lO>!F}xϣ:iTU6#OiaZэ.ѓ'`pWeG 6#F9E:ycs{F]-Cp7ЯɺxT'p4NϿ'$N<ϻh. :|__a;rKF]µ1Uԇ8 IiĦ9aWTa1e=?K|;1kͣ7Iw|5>d?{pnvLDp[q]+v{:yez7 us.Ki.Y\*:Ue?b-| dCh4"2fo>d%yǹn t[_&i\ٹP/:ѐD|eod)GκM;h~l9kag"D/{Kv.G#bkr+z+eO,Ϗ!Gd+$ۘoH+B.9'!{B=˄ڧ4j 9lM%VKO jM2/dznS&4Ѫ&*mɈ,39CqkLqo)7b$0y;w5CfOiAt[23aOٺ{_5?bNGzox.&n)\Ttn8+r]JY~g0nbgwr..%*m`+:MY6ɱ~co8h?vr={h<ü:3[]妼C~*9qƭ#40BxnQ*϶POEO $Uy߾~#o<@|! ,qSٮj&3X!?<Dz=FDy-A^`7e{'3u2ga{M<ߣ>AXNT l T>mb!Z ~ъ: l=OiA"8A:S4Rse"PJzOh![\3r@^=<CG\<_UWǃC9-4F{|ڧ#p9TE^pB@t :gЧc:Zi-NQ<;T ;7ΰw=~W:Z'իSks6̃/ N~P~B>5M5yeu $H/TsRh&ݷyﱧwU )iέ5Ga3ϕ _?scʈ_ͼD8g^"K<'?d;hiCgg$ݐQ&ڑӄ0>ʷxQy8?8g34 vx~ k~ي<[sYZp `gyob2YYgIޭp.^$/G`YKkb_silze[krdB~4)40W Giyz։F!hÐ?:S,kN7 cjk8F&T[evȯ:RvwTͬϛlKۼM"vTu**Ɯm}Z ' (]Z rW9&Z2cixE[(#<^i+GJb(ا }=aՉ5֌ ]/T-PrwGlʼI\ʶ)J;xuE/-gF)%e%%9]_$>ƕEoޓu\8WiMR-Z`6竜bjJ.| 'x6FgWz2M?XNP9F}|e;1~Y8sNw xN66(bX`簃zߋQb4o\mҸ^4:1raؾEB'OBy"vGϒmR| ?!{HbI>PVc#fǙǭWb|]?mdB4M=jKњߊq|.p>}C1-v~}^9K/jjѕ[[u=}DtWNJfi.=>x׮]K֒=&xZZr/J$;Dws9pwMwcl>Q~'GP צ1{oa'9v\~(u֑oRna=ufT9>O8OjxEU1A &HO&H ' > } I=O}&t89gKۑqt:x1l ۻ#yj=ytv@ӝy{$:[#I<I]1op-&_SrY1A>ϸ3[_i>:Eqoo'Amf_?uin<{>݋q[x8Hv_q;;0u;aϯ{}K]?3+ȻȻ8v_X)!񮚓q-yK?[Rw;c{߆tP_W;,^ЖlD5@'m m戀;CX$}(}X RÐY [Xa||vJyo|i^F~oz93z&ΉaWMآ|Nv@=z _6O wy<+yAs0SbT>`|lܪ 3{~6^h^Ȕ{l ՎYܚ.k=pQ }xtl˨R|Op'Rexeh]'.eyZG YOf?4tKUWtv0wvpUѽ" ]߬ PVNsf/;8?ݧԽ}܇JrUYqUϾ듮R{!)/DZ\]X̝ku߿i}iw(~%fer?'wBq]R?bkET 3ST;W~ɛ7^[poy~~Y) j<ڡ`9'o·ץ~9Uw\sp}LU?i\1( іK-N=~m;:'0Ac.׽;:jVm4Q^VuQiZ^(pR!ƱNQI_%뇕7MSvA]D%+,!4opOz3V}Jt/ $bi5q&ϕy-w\;}Pv2E$,W4_t9lO/9!99GGN=G0 c0^U 9.mjO_~þ) `V2|ۏ)ܣjOsՅ/jAVؤ~~3v߻߅S8*Jh)IU_l>˾eYbPL+#rLqt?Ǿk\gVg 5+1܌4c^՛<ZJxNVmgx|!.UTuCiIB7SC9Jb=Wů:sǰ;v'gAɯE\vߤ`^Y[_WT~oKA~sH< mZ饽b[֑<=9,y~&bl LC$ڛԸe1=2i-{<0H@4u״ԯF:)Ϣ fh}r#UL|߂3eIwar#[m2|mrڌMNNGF&2]F,99{SY?LYTN5P 1pJ4]4uMvAd-qnQ},HeʏE\sKr'$iζ[}\,]5qӵra[qmsp1Yv yFgG>ZzbUN/z .,ܫNj>zm/rjEx2okG_5EmYN˷`{ l|pΣzgNc gQ kEn`!`!橰!gc Z\9`:}4;'dI~mK}d\Y)rGQyqu|Ώ],?cgɃuG_+P?5gQy'/ >m'>F~]hJ+z>e>ǃ҇,l/G=˓b|;wc'j/0/63h1`qåyOo}TcZ(6yƨV ɩxj$=yȅ+ZA < N99|V5{js{J^2. vetP|Qɷ*tzIzϑn\^ԀNAez< ^Ceծ5u7۬6a6ѨAQ'"Firrh=t'=)ZF9W!nptE5jޘ{NGj # yq tѶ$uH_%쓨=˰:9΢Cu:)c{ͪ7:ko8}HzMp`Z!}8T\SENS>1-o&Ok萹sD̟m4!s?_1h=Ԟ^9 @i yty"jQ,4i6u1!x'tdw6Nq$aks %6 ::ZBT;RaSaMR"ͫR}9mLrB=㚣Y:]#X:{SF=x\yDK23eE?+giʞ[L  1<뜱Ƀ ;Ƕr=dtB t]W dKw%mv1 WiI6vN3Ugw4scϳG s3i1n۩wN6Zi5GTZè(ͱ9s(mk֕m-|rZ(s1f-t1*LaDpWęQ*n3|Z=u~,̐>>aoysomYS;\j'xn5OᣌW QO|=6 Ӟ2;2)hj;2 vROYE)#fm=+,)VT(|ḥ[m6k/;s?y܏mgPs,d^@^m:@ݪg}>ApfȨ(E_ :@O@U q\MD3A?`T밄іt#7Yu!sn]u,V;i^>`ɤ#?;q3[=o(<>QɅL\i a_3 jE yz yam*S1!_el.M3? s9`mZLK#>$qPsչM;^V->-z݂ywݖhֹgQZ31W]g&hMIKNb.nuia}^>ߞ}cH6$knO9ǒi>$S s`fyg =Fܬ ,2<&&θ]#C7rFM3v 7Ul{*$+qsdBS=?+]VM:u.:'?q{5۫˫8gyĞ7맩)/` C^{ƥF\nFY>&J)Zx-(uL\2iN |/~_qܩGw)wgLvW~jʁ H!TؓjK}øw/lC<׀_@ۈżW7xs@[RF7*+ʩH+k?7w(֘O?נ;:n[ gs3,%ĄNĒD5;+)_ULՉKbwUk37|D14κdu@:Q_>׊;qq5kG&6 T|$O}IJyaRArQec)UjEEGd\o(ky߯S7O amV`mCoFvo2h/ ڬyWǿʠ(w)86D#j{o&wb󁹋 =J6Hgv=mݠ.E8tdw'ӮpAu^YuuҼ9i% rE{s?YPҵތ`YuM=M!;Vx^u}qAcwoкw~3u>`pPptvk{I!W0!Q>QQ`BvK=g]1fMAֺФ|@IgfL8J<ާmGyh`б ?)<5§ |yn 7 ;sWܠ`NyӃ}v>3I կ38hwu6K{ Z qCb}nv\\ 9Yp2 yb8?ײݚDE~C{/bzONf?msьdQkXc_ݠ5mX_|ς[Aw\s,ͷ:ǎW  }9{W `r AU{/@gy :˓Y6P9lvae $ś:`En!;rm̗6qF6+C˳(U8AOsĠ.rNj~&^8l(Ln cޤ}ZAgl^YŞ1[n0N2i"ʪNls0 2ME] "~~qoն:Ԗq}Ϥ;\9# dXTT(Q(OFG:5*VѢrszxmdبQQcyBSY5VTT4<8~iNѸ}C>~I3Ś$Qf]ϓTMh!r "NHӴXFS ge1cRf1?f9#^cϦ~ϽxlE27%:e89gk1]2!+aT7Himfd״+%QX1v2D3Ak{j}tƓn~MiʸMg9ziEkW}ROcf~9tK2ԬtHqb{rjܼ`<~]1uh?ECGmw>LQ3nlf]9)(f 8Cp{([q\{ӌC_y]6#:hvDؕ9vCFǮzvT%Gcz^7sIoe">i5SFyJ1NQGHq k]tO-dkzPEn\ |dXCVڃߌly "M^PQR(}q'Aи'NO߇{3DDڑ3E쬞V+ u9cLjQ}^}Vu{$#&B>ύm=`ox.r\k4Y\ST6z^#e66N1-e)޸w B QYLNwIIb*SǨ8)|noɜyFքԸW?}N|d22ݗP`Q.{>o,^]RIDŽ  8s8\ ?UXk3CJ[꙯}R}(y5W CnWvu[o5Vby ei1 ^'b%c}3}L3TY)f &]6Su`_:-h:L" w)q*8~TsZ.@skP"~l)A?7!3#sPHJHJMK֟H Qi$ھxaStctPm_FGC D1?)gFlms4d͸U"%{TƩٚ6[`708.5v_ѡ_1C]SҞQJUؙtt!ۢ7᳥V vļh6ڥۍHcL3*>0e|-F93GY' 1%1_b#8;4X7"U3NU#G"cJ0ǢXM$T>D&gwaws&mS" 7'9S%vQ.Ig8j!Ȉ}9d$F|bjV&k"lDz2I=[Ƽ䯎E?^;I}QuWizE`8zQZ_21wQX2ݝ_?p(G)ʯ$(|rb?ވ>9>͒qoO[{Ms5|z~jfA'2Vg}tzDYo1IndX7d@`n)il(8KJ6I&;~ ?!?h})6W2F9-iE>qAA`Ǡ<٠q!vyD0&irsnUB3dB1r< !WaQ)beG[B&%IN9d\fCU; ʐWd~j&{-tuSzViImfmq]Zs E,yG }>K`bP Wh! TCz#%MRݿ99u{5Ay*~.#/b?iP?*C~۞?N^mYD^ȥ0@͇pwIF%$q 1I5e5;*>kd$-d pi]uC9Ұ'lFu }7)Wu|$7L2B/l1lӿ3ZOZ:D=00GޢXc|X}F'7elU[fR.$~#=IW0zQz/dCk)SD+N }m SR %P 8zhYP wlI[vd[^c]Yś|lo#:Fv6 iCj`>N#/EaI]``>u9~gwhG,l}dA6 e:G8kW-2 )x"vI.yun7x!%P P ۠F#:h~a%f ^h⤟z403N9WY$lR]ٽr.[Iغ.`le36?2=űCگ0K@/]3ȱ+R =eэڿY֛:#4qԱoG֧D#`ҿ/-[Їf`f=GLy+mlC:]/*aYqR.V}*&17&A:tgeCۤ0s5Xd#ؤlR 9%6 @ ̡`>tɀzbߛI+ 8r C tzP]%]]:v2, ,i%ȭJfɅ'HIG8 DG|Y^EBv o,]o1^d 3k }ُжM~xy(T)c,}68Elx%e% m7ףRv;r]:2sEv2V}>o;d0b?)}P61nWRa>ae7z_GVŠȸmsq 97le(G f+.N25Wy"$_EoWO]c9Te[-"P{=.5C&gя?fl.Kyl/B^PHڡܴ%KlP_`aLdP amUR  0U!vA|"XӬM%o?*8T6]HY _ɳYGXgnAԿw.ci 9PM,*諤XM4tk$>W~v#+ ~)6ʸ<,R朮dh&9iNMNl(eRv%e{c:!Yy)wU ,ze9 9A'm8xx_ 2 P  Ԗзм*|%Z )'#K# a]@ꏢ\ jWYc*CX҇=*2:*=tyg0 Su0$ 3+a&G633/.Goֳcg8 \;},h]D{`6_m !|u<t\HzBEV)ԋԛ0h a#|8heRl;6t]CvُMßyFl]wBاgWP5 Μ 8|hmLejPEAz85i\0IW޹[Ce6Cy&kM*||JE;zw_␔SQ{?DgXXb&̡l?Գؙ4 zԥ R.m!O rf#sN!l FztاF%27&W !%lc@?ld8q=~8~Mb. n0V{l{Y@%5Im-2>g"v1B0ulb2B>_$oc|[ y|b ~ `ׅ%RY0foѵGAl0.Yw"ll"lgs?iw~Ùj>LKrڐq }|~:W-ZWv؆Y r#}Ki2tԳ-PW@-4C]0C1 F Ȅcѳ,GvqB' :i1(d;$e-R' b<ycpȏc؄' {&#?9C*Y{W7g kXa!!d%'N:0dȾ]o9H3Mb ]NlfdO8P:tqdyOӰGbjq??$4?, :nd얘bdr se_"UWӷkmvfƒZ?R!3ᵜCo`+UŜ.S h>[wګtS|tdCr 8!|xl п҇c7o7J!6)lȫ ;tku3#~ F`z", /Ѥx&#wy&h3k):(',7ªY@MR֍̋ Isg%r4¤sVmkM:j]_Bp}Pa_G(AH{Źd 'iGȟ>~YHz7%d]:u9Fhǧ?CdP(NTֲ;F}X׳a1&sX?cm/wԜRY'oc-!kV(a}g}[j'"'0cN~-(ԺeuI>BH 3.! l&k:B 歃kq Tc3H[9%))F}`SBAzSAr fN g98 NqdAoSɳpSz ?R]RcM8?|]oSr,||Œ"҅?v;%faSPBC5lh>l>Kۜ[&ױ2&ne*]ClE=O'/E֯`˯$Dƽ{uO2|-9cݥ_k}Q]#D1 C,"R06"})1>\B`'܀n3{?Ң^*Ӕ/5øqz!\ ?7/>Rl շy+ʄkC2>R~Q}mЀTZs-2^|!rB^#Ў?~u$M-XJ#ziO3|FQو\])ȧJn`\#\2BiK-p 3dTc1$t] ,v)p 9%9p1 v03Vaf-qqp.½_C5W0ep/0{C 2dp 4A?,wa L[vO 胘c\r4A%<âc)]pfd%\wApK3~H=%ZJyK6svRX5 ka#\ ]GxaZ`%wC CbKV^!8$Od, </.)E+P;sX_kHZ5^-݄9RG }KN`7| RhayKÿai;(8%=`[Nu bnpA_@9]R ygR+Y.9 ~/.Ia.à p=4B's\r)L?%'B10Hu !L)`-T d!pt . Bd w“V'P~c@=#Hxz mJNx Ç0 SԿ d΁MpC=>mK1΁ˡ~ | K#3"Bm&,6P $샏Ex r KO7ӏp/-[ VFm2 0RHŰVX&(6: oG0  48P +v£t?`,!;H#8ȅ3 WA9CCm2t! r (XA\Cބ``Wx!`)d*8 aA x ~'| _p+xa>xX gp\k${Mx>a+82a:86•p#w0_5ߪAB* k·a3 *VZG>xapKS,CKw|TE7GEDP@.UZojHPM! nA@iґ* ) HT ҥtR6<;9s9g.OP6|8 a#쁣p{ =7yCq^@30Z ?~8<\ Pʃ'ԃ Q`04a##pnSz`~Pj?AGxa3?xP @h -#}aLy6.8,\T$Pj? 0 yI!_<$=t+0fbX;`?>Pg- 0F G<܀A 1@8/0:{pX_@y>+0ev8 <m AzB3@/ a&,a'p.5 w<uP @ 0C?ca*̂  w8 W:܃ ( @Vca,51ncP1vC(54 `04 a= 8W.<5m Ci5>4 `0X g8g*6 CYZC$B/kX`3p.mxj EM3sp6A0 X\:c8PjA0t!0f"X [a/ p ^D( ?6`X 0 Zw!G (?`8 a,Ly6.8 @ƘT/!:A7p@ S`>ͰI)1XA( PA(3`>q7<%3("xA}a LŰ 6Ïp p +5C)A3[78)qhP>Xa ̇5iš"ԂFz0C SamN%AL@P@e!AX 0J pMpv{oRJC%:h!b' /a:,5 \ޠT :C7p@?`:̅~p =Qw( U>4@hQ`0)0& 8+p  c7Pj/4`hF`4L9-~SpnSfO : xa, v~8 g ܆'T |*PtM"+thSa&̅Ű 6v0pn}xlr @!(*ԄM!A8 v `0X `l ?\[^yRP> 9CtH ݡa0&T ` ~}pNY - _OCnc( TZh tn`0f\Xa;S7܃@flxC(2TP|14`h zPa*̆V& a8 pzPC95.BA! HX ~p. x/A!0n= Q0lX+`sp]x @C~JBY^P| ZA[ Q a2́E- 8 *܀%(%"ohmDBW `02X `;_(p9 Aq( Ԁz :b}` 0RX ka#lpiW.<:m@A(*| =!0F8 a!,p eh0^@a( *xA-h N a$Ljap n#1BA(j4PC7 `,8,\^\1 Bq(P !AQ v` |3a,u~4\kp] (Pcas[ ""yM!Ȼc*C'yI>'HA)D IR#I R"Ҥ )KʑT$HeRT%ēT#Չ 5MꐺO&>ėҐ4"IiBf9iAZ@Ҋ`BBIk҆iO:ѓ@I$FEhb"]I7CbXHNFAz'Iҗ#2 "2 #2|AFd %x2L$dBid: 3,2!ߐdOdYLoR,'+J|GV5d-#l"@dI~$?]g!d'Ar&#(9Fw9IN 9KΑ?yr\$erE&W5NnM_r'C<&OS<'/K RF9TRE5}CswinO|!O Ђ#Z"(-F$-E?iZi)H+ʴ J='FS/Aki-Z֡ui=Z6:M}/!mDڄ6hsڂ 4ִ mi;ڞvi'I4vDn4R38ڝZک=i/O{>/Gt D!t(Ft$%KtH'+:Nt5AgYt6Cs<:. ".ҥt]NWЕtkZ=]G t#D7-t+nHt7C{>+OЃ=LGQz'zzG?yz^ezEW5NoЛMл_zާC>OS>/K 28L24{rwYngyY>gXA+ YVcY VbҬ +ʱUdXeVUe̓Ucՙ`5갺0f>̗1֐5bYkšf9kZ@֊`BYkֆk:ӳYdFźhfb]Y7bYXάzgY֗c6 b6 c6}Fl ex6Mdd¦il:`3,6a߰ll[̖oR-g+J}V5l-cmbl~d?]galgAvf#(;Ǝw;N ;α?yv]devfW5n_vgC=fOS=g/K C?s.k-6=|! #^"(/Ƌ$/?y^y)+ʼ ='ƫs/ky-^uy=^7:}/!oބ7xsނ䁼<ּ my;ޞwy'睹ɍ/| !|(Ƈ|$%|'+>Ot5gY|6ÿs<>/ "/|_W|kZ=_ |#7-|+o|7{>+?GQ~'~~/ ͯk~7-~w̟_i &B %4x[#rwEn#yE>PDA($ EQTE QRҢ(+ʉTTDeQETSTՅL5碖-ꈺ/>W P4Eh"fh!Z@J`"BEkFh/:Ћ EF%ha]E7#bYXD.&!zEW1P 1T 1R|!FbRx1ALd"ibZ3,1[߈b/bX,oRL,+JJ|'V5b^QlU b)~?]g[bUAqH#8&w8)N8+Ή?yqA\eqE%W5.n▸-_qOCH<OSL</K >*RH)[m%ߕ{2|_C_G,,?EdQYL%dIYJ~"K2,' SYQVeYUzHOYMV^3YC֔Z#zl u[H_'eCH6l*沅l)e+$e e&v ;NR/;K 2Re"IvdfiqJK!{^2^}d_O@9HCP9L#H%G1K9V9QNWr*k9CΔl9G~#yr\ Er\"K2\+*\-ȵ{NFIn[V&rQ$wɟnG"}W_!yX&ȣ<.O<%O3<'yQ^[^?!o[#=y_>#X>O3\/+,b+RJSo;*zWV<}WSU~U@TBXQEU1U\P%U)*ʨ**OUEUIUVUTU i"ZQV\+Jih2ZYV^}U*i*ZUCԪi5/3VS\huzZ}Ӽ5WZ#5њjʹZ ҂`-D Zkm0Nku:j4Y3hZ(Z7-F̚EӺkVͦ5CZO jm=[Ҍ" +\|46-, lvKD7K3Yd``3HՄںFKar$eS%K1R]7rV=ÜC6F6IJm:"12`k1FdP[~!nFs`7<h)6LoތNfMzKxWd#3òJw -wV\ nv1ڳ?L$>h̪"H)#5mƘ(jai's48H[eXF/S!rF ?ilٳs*>SAҺH8)=MqVPV}:Ky:^nDeZs\y9FeZet&4洨K30Ę0]K6X]S\1b*ýe9!z YNosZ۱iLyq X}7c[Mih+Vfz[1}Ӝ0Y2 uk ](ÜN|M6ڬsWeY'tf6(XWmUoB-ّޕ5aٯzOlpCҗ`5,kQoA\7]ŚAlv zZ#'g%Ԕ@z[/2h3 c!sMK.86G\&Wc&M 79|#7{نlj3 ³&6123R6O,mbhJ[tRoR]rw3>U9~^zr0bRo2GYRh5][@0}S]_&oaο-U /[c?+qr5l(WXW%$"T 2J2dzgشz[$\u]E}Ln.rIO{&ۯ=,E'EdޜҍSˤWҿkiJSu}4%ה45Uں''vd#/g60FYx[o}Sd*Ysu}DB{sK_A[>C5Nv%3؊X3x(x&\Y-l'+Zb,ij=jR͌jr%nd{5 iM6)jxHwgsv)Zo#HnݚxۈK I2DfF$2F8o#YDO#6hmd; 1VK-*'2j{mnWL 2Ho)w M6c>m\c(1?9sJz3{jɩZX"YLM 8\i:WF1lOWNuwl͒nv1]W%54_N&dT[} g5YT쎛󖩏2]lXG;쑖f5 ~ )q$+JJ|`nԭFREÖɥx').U3F?hgS`8y.oEk^IruRRuNO|rX.V\ɋ7O\r&m-[L|lbewkԇlF]_g֞o]}0a+͆73HvMgV;Fߜ'4gߴ߷]-5z+:9a/q2;4gWk 2bޱMdXHJV6Ao 2:? 5[±a;mð4QPXmLHx"ݰ.s_~%ߗVhE>Ի ߮iuvnOzhu<)@vY'Ggq̑@[ 8b"zw1=vRH9ꡥt,y͗ZLbp'\c ]_om.BZߤ]J`\\>aԶ g2F~؏JɥJ(?c$>ԙ/OI9$/$#kEgҤd: Ԍ_lkڰt$vݤ k>B%p]NpɃN;W=]U&'@vfbN|Y7k|-qkB -I<2Jm6q)i=3H0.73|=iA@)vlz&d"!.9 ?cĤ<" .09b9OӴGIcC&TFwɖS>lǸZs>??0$rmmF?l'/g;CD $Q4 7KΑ/73 }S}NZ"`||ݝloF.vUC뫍kKSWОkՎE,a6j v?wJ'a H zݵ}m=k_͔k9"qas&k&a$Xwg 9LpU `-NƼیQ3S}ߩ-k'PE y,*Qܸ96u뮮?m1'td4K--JǼf?aӶ}ȩ2s3jղ^CFGu !8$/; p7y4xMZ)xV/BנƎ;vۍ;W;uhB>|`5R'TR'yxV1D|TՁF>ꋺ30Vc߳laY[hM4ҩ <=~`I \L{;O}&'̦P?g>&*CD (Vd}NCxU[[fyXgr?oC< j@9oa5ͺvѦ nºb)an D YpL@o@\TIa/a.+B<]h)^9GQvQk׵ߦ+^ͬJnoA9ʄbCiP 2p mMΤ dZ}A`YVK;Jb@[紃S8 Ѩ0*0NJ%q6M7Q1GGAKj ˤ-v.4j2 /YC2_zNZ?G f0 2!s@AVu^i@*#qq!#I@<< b [c }R'}d25ܦ:h0j *sZ34bBtQ[0یX Zȱ(\jK$ ɱu:we +Q,k2%,EӘ'zHR!<Pt8`3igd2k1 8lڹ G+ Du"qMEb яd0]R$G5C4R!*&D!_%_| ᦅ-dIްxt:=.3K'fT0?3yBy| ,dLԈ m]Kfg&Wp!ElCY=Dй-'UH1nFvp*pЌ %`;\B0lKE}ԿR;)3%.h@G`6[`tJ@-|mΎ`AJ옐%q #MjO oIU-$ܳmKpN4bBh7ya2e$'ku73\O0,$QxjE#8"9'QB8J@rm=L|ZrNAD"ϻ+{;+'8 8HT@xYNSTa9E3(l M7m=|$އ]NGIfoU[eVjs$ l6@8H\e:ԃ>\ufW6Ϝg>3O>gJLKua!Lr~~ٮ6&$&$Fb#I\R Č1cFrƐDH2Bd(6/WW Shq6\H'PGIA!K!KD_o[Nbn:Wc B"h-y @ew!"p:7O+ \A`zʥpG#ȗpc%*1EEץ_Nb[ɈOs}^Nh8=$vg~Y1&y)d^ Bvmnj% +5h-K0^%%u^-tBy\\CI30ӓe&<9"2)Ev73 ,Dh=5c/tlbT짥gbHgRɹskS gLnQӬSKQ.v]]?R vT;V׽5f7fuޡk㟛cskLsn\nf5݋u;o{8nDn-vlk]']dl'z?5J qA4Ӗ(:d~<'d4[pkh{j` 2*h͢7Y4Wjԟ_S~Mktœ;OJpF0~aHZ< I! SQHGZ\$-@$[nL3-N?wgԛœ&ŴoVLߧbna2?Y1\*.Y a2Œ95Tpn(pH= FI)A֧Dv5fVQ$ϊN׽ɠ zay3m3$2gg-bo4) &űl3F] >j'л_C {͌b52n#ۍ72#[92oӑv0dގ!3[3dvy̮3oќ%:EuHg(3c;IQy aUSfE]?P='gJڈ؜&,uaf7wZF6aQ:嘍ڌ9MX/KH)u6bgȃ^Ɉج+JPE2TP JHrJMS*P] UA |].TX &UQOMyִu-64jVYH⑮"m. jdefΨmnk؈$1\]InfAHHqj׵JG*OREiPVfW񑐣V2mTtErAZ O/ĀC~Ȉ>HLcaFTKE$wsXRSyl7؈ج Eir}y0<ȮMh¦Σ2UՓA;B-K"G vHmWY[gTnl5n6.p0|6hTK:2NXQ);V49S!V!xvԓc• 1ZMG`W]RעoF4Z'6oML$bFcDxc_C#;H`YC$LYS3-!]޵h@[^-[a% wZdzcXcXcZγ8J߮$Ho5_ #6ϋHC]hQTpRBEꂤvN@I6mS='S|y阚M]զ6C?*m,di`W݆@3Uw_ԭ4},561ň"q=dDH38JFԏHC$dHS31dD@ؑm#V# $Z6#F>I8m4emK;]<8< 8\< ǁkx p!p0 x3pi s<x(p18` xp;57j8x< xp3f{7i30X` (_ͨ?GmK[_ s?^2ފx xs<8 <Xx#Iv7WcS |:;4~ CKug xp;íH#[ o>|p;QUdW[ہosyiIw]$Xej_o:S7|?JqTHK^`Zh&]ͦ^Pϣ4!>445զb]Zdh"Bi @4OmǛ|2hu&x3!>Uwm[J:[0\W;]9!5Z gA쐪#Xg wX C]{4eQ #tAn ֩Ts-U4P?gB|Ip|H߄hngcn`E56뵥Ͳv.Q PcX/ vw~#*p-RH0$^\M=&~>jk/3Njy%V:PP-wsGU]s!TtڵnnoQe+hw+jkV^xϔUZ.){g?.>Gk[RTvJ3*=v_EAlyūUܢtpm^"^BqE@M^")J1q]^;2^mޕ7|`۪MvtB!Jf"Ƹ\=Vb6}Laۚ; .cJh_mx^?tѾsß%Yy9Ey'x[n=RkuAwPq֢Xd|{Рyg]k1lX+6.?Lʧ)u)/&(xZ r7OF0uoyK@×jJxo "%%ʕఁC_%/aP֩LQ $)Jqy~߾84htqEnt_ʡ*nt>D+q8aoR>h%GTꋻlzo^ZZtOIl ձgMBZ*T?[wi=Rznq*5Q!&,!n^IpSoYlt[#n3INUߖT_3WcU>6N4;|sշc;_mn&%7qo1̑ |T#]CeE'Ĥ7Gs~.{ ~^~~}wI zCԳz>&={m/KQ;%}" ǀ]A2(cny%sxUgIeH*DKp#.B͛@u~pq໹ ~z NϜ,|`8;+>}{OH#3\H)yuV\=KSI=:Ri:̆Nyftl7*o~{ ow~svÈC'+ShtmL7[kIf֟݇^0rEGxeWᨉ9V^-W_//ۢ&< W+^]5j*mĿn~}:.cjZ/qŽkv̝_}gBt᩽ zzӽM{^waz{_ N-r\!> o oˇG# X|<-,=#*mOϔ^ϖ# +ޕ5utUK jPQjn(R@Y D@cBPq`պк)*"D#Fw޹<|<=g̙3g;wwXˬ+ E랢u_@qR`=T\c=R\g=V`U*nXOYՊVr\h FZ>jݡhFA~ S-1hFg}0c q1nØqt31xc!ReZU #8AFc1`$0c >_3Gb\1c"$31*1`XKyB6FFW}0c q!H1`LĘQDKFbxc FpM|1-h"g5Stc?7c|JW<Ї Jd?a-aGkK"UDB;ܒ^' qv`n_ShQ@R l0 -B`ysÒ BC0DC}8__I'R7YG:W|Eݧue+yrMjE4Ѕm 4Ͱv@xՅ#$vivVvOnsd5^(6ɽ2`8:$}dG6LYMfm>x4()"jz sҳ"M=.l׿ X˺e{wJ~4lacoJ_7q. vL=D= ãV?:ŇJ}S)ig9̲_c_Ԛd+eXk0˻A{7׾p֝Hs[kZy盇](@u]rwOt~ɻb)yߧljK9%`2! H=">ؕ+,ޢWs=~X,Xy}*?ܛ9Φ|Op碮ٿo벿ϡ~`"`eX\. _;ϓ]2tgi/Gfϟ`_ݬ>g oyFlur#D*Rn_5mψW(' "E#ܳ 4؝lDepꕄ冩\DG E*t!FtY34"Ñ&Qg ˙v+t(k<鷁17m񲾜7SƊ˜&HJ{P,,m/3K`.v>iTʆ}fVίEkz9ms6zfVWKy;^3w*oP kQ0-/~}\f.[-{~j+.۸`W*o Sz]l/cbO1CǺqNh3mf)={rvʬ==XWquG\e;-^|žf@On4c<٫oMsj9z  j`jCsp37澶ك}3ZνEahpmq[8Xemn_I 7<-ךa4hC [ϐܕ=l4D YFY=E#"{P򒪲j$7䑙WNCm|# $Qfj-&W!xHtdkwoTI13JӰÝGW9a_HEo=.7{ /<[<TV@rCOA<.9i8ͫ@﬽B'N]^zi9珤o-ث.Wn*#~@$_wo!O(~k7H/Z%^V5$/=Og.O{SŤ2 ? |Y`SpF!HzsZD]yɍFҐ}8OL^A||/( , VOBQK=qO#^=/אv,ǐ_!!Rp"YC/O#?Ğ_ʇR4Ϝ0ysZE;3>W /ךFj]I:5>AK]}Mrp60ԸU&_i/ђkݵxDg8!_D#OÄy<1\w >uz0A~:=Dkmg@c ԓ7Yu=|H'\#](2 L*#\2@AH C$A'e`z`+dPNּZK!b9*&=}vWvCW;j3\%+PkefŨIu|/|.Zz;<[Nz29a0 ,L-R)>Z`z&ՙ?_I+W¡\Lvxh$eCRVir%[l?],(-jn}'fFD(`2/T&%\ L_H-RXKFG2Tm% Ĩ uR\XJ֑CS$Lh_P[M3A #װq =픉fP*QKccP8$0O}/ǻJ0I_Cy/mwi;(mF^rAg[XOhog]gJ.A;JesJ[0^\Q棭tL$E|< m5dy,$@d/hzijAD/|t 駻,#S=?뇟'ke!I/4.@m !5}6gփVT4;~_LnrF#2}%OAmALKyhQOwigm<1?={텹NRYKۿ'dP&4STMV>zQTzYC0LH.bg*I v4焖y@-0?:\ߜ# 8~5ؿ* #V׿-1=W! DNRژ?s}&B[uuxLNG{>[B;UyQS<>%輭O^@ }ʚ1s3(Ϻ/OK^3ҧicU-OG&'c3f/Ǎ#oW{|wZd*/ qHF])" 2@iYW = R Qz2!@ K @%!~c c>@t3`!'CgB X0\)nq)C\vB @lC þث?EBƴ8LC܇ 0h2+ lȇXؙ㺀h;%8 rAGxa#nUUTݵ reAJk n e(vxwC`y!&  iFR- ^EY qE'AtA! Au,E;ӎҳ#)-XH)X8P~`C}Ao]Da¾_~1gՐNX ]ҕH?CK|c۹:(a0 bjHdeje嬖he saHð&h4 '|}ߟ|pxy<繵EL1 6L. KXcԋ7]b'VSZ/~cm#rQxzOgKM>y 4c8rΕezx4mlM1S{q1ۄ\Κg Ϲ˜Y|/t\e L=cy!+)?=e95Kl}.>m}ߎl 9xZsl}>`poݶޅ'gi}^ng]>Kl}9k;'[?GܤxMZ?ze[߆_>gL\m 7 f>??No\|U[AmͶsl}>`poݶǓmκYhO|+X4ZΫg9~5ٍ,1ϱqoőK.s`H._ڻ\3peA N9 o^srӶn'6 >}//~:Osn}8Gξg4fW>F.Kb"U|."/= gn=Zp>b쿛w"mIJC.Ƕ,Q`L 9}w9qa\}vnjɦz>8g}bF؄Y?ħ)d|\Ǚ(}ԷO<'t>xד3C6iv/O~T{DZ1^L28\jXSS pRۈW̘Y{~6Vcߎc:6i>40Akt#Y{Ym#v?%ߟs t<=%61`E}kM3`ǃ/kk[t=insߔbی9f}gV>So^8J/YeɥqO3 q@s_<>L1 =V|Mx SL( 2Md:Yhmߍ_d:iӇF>r&}6ǽc9< ^?V=1|5&Y3qAg$}ds{ gOnƣ6qLɧ6h9 Pb^֋CPK(/i9_Sgy^pqz eqY<#z"lYl:>Dq< };N 2oN 3vӂ̨;&j7)Q/.Cgqwdb&%k?Xms8'>ǝ˱xhZŵ6 Afm)v*ዂL76A6"UЏ;SM` _zDM 2fKulm2|&Qkⷔxǻ=Cy4^\}NƱ3=fgg^#2pO^ý\軎{@sf x <(JLwy\̵׋g1wbYG|>.*[ga}ijjNƧڽ[(Uam9v>|HǓw/g-fO:ߢ.ݗ0ӫḐ8_ce=-cx֭z[B(u+'&|΋n 2lNE^b^ȭ[e YY͵=^5 pA1~"Njr,9KT|_:V`<̾_pF]صQ bObq:h⺛ύ:']q%6I͛^7Oi OnOz&L. h#~DA?JxVeK^6ixv1jK}-rx]S ZƏd]Q3.S[bދoivҹZ%_õ{qשd:ƌb,优M,D9C>kwa%c? 9 (dY؄6z̩=>—){xGiO}6CEnͳ۾q>}a?o?8M.zM bsOR97,>e_i.+{3ךݧxozEI<ڐ-#M^'GI{t/1~mcO3~sRhӃj?8q@s"Y7c~yĻixяuS1wG6mI(M/>/qR@x~{pL]IC: Ʊxԯ99U<ߙ_{vr'k^|O}7w7ֱ ¿>&2Ƶx@Pss"c;_gaUHE{?vM Y*4 o(~<-C5c~XVlYwup6EE&& 638xX~;3&c8 q8 \ks!l_d_d{^zJI4?Elz W|)mM"$y\>;5G,zC:NmXlIv͜l3Ov>sttbz)x>b;fB8zh|`3狃mS}/N9 ǚKMcۄ.%NtMc6MӃM6mq%,ƥ|](WR|˟(~r/^0JCU挫qYMJ}6Wkgۜe8k4O;lw܎_܇;߇w܎{!ٱ6'6 6gY,bŃgGH?X2[r9[o-`%@dj,I}h{q8Fm7j{,mYZ_7yq?1?D+[Z´^\^|uok >r ?E O;_MU6ϫm}^]DK)^yN9Xl&?"_i}<y^۸y#n96g6ozXaRldp^\׾+X*A8ׯ9 5h«j Eg<^~nz`GR3jQ/ްU$Or]0U߷ _܄c 6 7Sf[k,>/{ud7u/5/g]| /k|{K* |N\-KFq=͌ /]Idm8NǖRҨ{N[Izq6I{يp>&jLD=qgr7HbAm/~9>  گq6%c;psBnŽC3م(8o.9K([܃cͯxoZ?M?W @MvS8Ld;fΥ &wd>zz|ʄ8m|E (2WbPֻ(pdm m/.> tfOr8ssl)2'}7CbbkC;ĤRoS =852ԑgaCpgSxYx' OI!&6x!fK 194 1d7VRZ~(JưxH?1C;R?OdD$W||j:qhAjd\npa!!côObEk83Z{ߎV>Ni9\cõ>dZJ+5ǎw80bfQbXm/hv$pQI/ViZq8]b|+G8qzxz8gZ[_5G;GwX%V,_l`QF>cd 8hm 69>u^{70^s2^ އq!}|#CLSN$gb҉,6!d8gOnjOfC~)nx1x)xYBgJ(hs"^msaJ|fnv̚8d)IghN+63$˓l=cz\z&s3~m؜Se k;[/9sXKjN™yB?'i}L< O>_Ǚsηy Dœ/z?Nc)g\5E|"!Ezl_. \|O&Db|}NK[߇$g3~v4ml_Sf~OL'\00FOq/1avW>G_E=9(>㭳xY^sQR0^vg:RZh#fc=D?8fgqٚcOg. q~&'7ݬYmf%k} 6{CLKt ⸥cqLs>LO՜˙S^xkqø$Oq?Mo}MX/&ߡ;\9+CLJͮ;Oo˶o)ӏg~q E>`cŠmx %Aƃ!![J=R`gۜch|}\35߫OscCk>cC9ߡM8b#B?Lg"`\#Y\4 %O2G"?K܊:[:X\sӪujxi4|N7QMYsr6C;5P/^EǓn>co mK_q'!{0u֋n~<筌xKW/khym:lg >"9hy XOI"1;7r .|1#Ĥcc ^^~5&}l^><9 `v)6sfq~^"X[l:b3/Me}r/:q㗬 r3|?5_T/gd2Ji}wKs<\߱Sߝ;_:xw`!ϓEB([ځCi3smq~V"b~$:Fc+_M_9 !f%Y]{T1fq͟!1|XI7& kZpm=gο9F??Fja\q06F_ )$-6[~02712$̚94=eƦL^2rm.~y+~;Cqxw]2DL?S;Wkr1cµvXsی6)z=6?fC zl{TWќjNnsl,=&&q|]Wx|/xlGشKn_3^f;$h?kOL6DmL6PsE&^mpGm}993$s0N:dS񖫵ZpޜPM6>8G9ڦ isM6ޓm1P6fJ ?K_wi{ϪPS{Yޣj8raniӊluv+~OPgcsܨm< En,*6O8&8_OjyN'ɛB4OOi}:t,Ohqz+%ڿN[BM :Sr=W,Uy]XXPofӋU>xaa2>Rlg z^ Z߄ ^ŘW}zvmI~;ݣ[_kʼniD}};^Wkj|Kߧi?P\&PgEϬ'ڈ?s)u;L#o?)>&xfN${/%߄aOSs2SŇ[lnS 5g\ߺ\x 3΅)iƄ0/J[CgMѸœ[׺ߣ8?3;) ܉Wh[]6cݚc0*2dZ/vQ3#L,m1أq|q` }6zcOdž9|~O1G2o'׃L{œ?+L] aO?<$ᆄ0M1Ӵ>ϝf 86f:q&fb[>Aq~_?[daB+cM9]]<>5 R?N ,}OJ0 Ǩ0$nL⡗آ^KL+z5WPep_0afX>ry.s¹d2f,mӇ'ޤcky!mės=}?ֱu:,HrTܼ@8|v' 679[(9st{m8e3[q7vy?W82>Ԯ+ܹ>4Ga/?[r]מ"'3Vh}~B܅Awm\mqǑaQ ~<~u&O5\/كý o_ {;[t yx<ϲχ9/y>FVH?zS}DZʧ{J\s!g59wjyđuz-gJ.Cx[}󽲕P҄FCMaυO3)>غ%̤yχ9?=뵈^D}7muՌ)f3"5D=8mmc$310(t\Iiq|eYKG^ޯDG_L}.iȹXI$101\Ρx#EחŶ^|o3^ s~0 ;>׵ {fafIWڷ9>c N拜 |5 tlCC6|vq(|y?{w>֌{ux'&mĺOOu֋~ixn1dK=pwޯ^?/)Wp3t4zr> \&ckQ1O<ƅhڈs)ԧc6GJ99WScc&<3"q:~ q8Yb~qPiX^I)o&|K?1Qᦔ"f9^spIulXp)Ia|pUp09"{ |br"Jm8"& {w\2ό- nh3 ? 7wa1pK%Kcq\#OcG/srd/q)λ;>E>E=·(Su͈c؀(~\Zz/O'zsw:{AhS4c)p^WAqޡaR^fo/Y OJ wO 79a. 7EbXcRZƴpjkƗо ˯Թw\0zڋLwv0^^? 愛Nûލ۲M*O)ĒSpM6&g^z->L_YL% ܄?ũK^ 7xrx1FO&[6(\NAo~+)ə,$GP:ȱ8v4{YJmp:^NE?w鱱Xq=?Js>5<`jL$Rߋ߯aXǚ,;_Gwb} H#'=8Oƒa Qcmk+ќo7*?n+X'CZ w>ChᦍbJ kzqFמVs!ngѦxnɮFFi٠~BxƩ/Ý _xQZދǾ9;< $ξ?Lﱟqugxd>_+\K,ܥꏙ/f%y%ukO)M;$;_o.|^\gu1b$15; ~cDSߋƼxZ;~׵!>Ra]8/mӌP2fҾ˸ͼ ~ Q"m:Bܦ)moz ל#ΘqK.m76['0&6&Mm3lmœ>GsL3G6绍^6`nE'_}}Xw֋zxμ\+Zߺmfо2&,N Yzwf뵟"$^F)'Z/c ܦK?xnLNvs$׈-mİ}C F=Zw+qLdQ2İ wnz?뽋~/v԰G-un܂^ޤ}cZ/m18Ь}3gxkA8e֧b6=V, I }I8\Zk_nu҇;X>z67upwy8v=Y<O^ܥ~,H_Y+y$9/DZ&ڭY[_Gq~ +myhma< )fk5;ӫxQڿK}. 4gZZoc(<; m]{ۋ~c}'8gzg\(\c;?-O=o7[և4ۼy3L6?f[R0iRfY}'Dj6ߍ0Yr.<({P6'G|#L4yw%Exr7>vfI8,gkw|(CRZR0\q7_9g^ai^҅iM1~+B9R"VhGɸl\hn<6=-afSdğߖCYs ̼>;t)wF6s,y\azȱ]+>sǻ~\kۣwmks9+lc:ngs6G $-X!8ywwcÓ Ǐ7z~u"܆Nȱ`dSaN$'u,u"LٍI[#Lw,ƳI}9i02*m7;YMmź^ŋ?S}<.ܥs]vfq w}GZ+(Ο但;)N!)C4ёcC#M4Cn3D?9St޹bͱc#MNLizW~O<Ҝ;.4Spq:lBl8Fꞏ¨4 6cZ/<{A}|Dr&iH gqhs6}$#grx^FwD:$zz-Mxl||R@9H38>ME♙Z Wm|fq{Fcj> am#v,,n,Elx%%=P̱:iWqzqWxiq',^kx%ڿO_YkxRbmӄ6LLۈ,13l,Fj?x\{jEfŷl,NYk{m+l_YYe/x֋,^`xb#j?b߰YmD S? #hcs7K1̶MA $4Wsinϋ\?mxW~8 O}W\,0|z[`rM3Цi`)g:^ a̡_HEk6F3wet#bQqXRZ?Pro}۹'S9.lpzeVFcz,e\ 1^Sid,4|*ͥw9.ɷ3N,|Nu.}.9a&q[Q,}s|_Q2?^+oјj?'ow,s̪VEKÝO-ر-ߺHHwF<@Ljz3RY9ZAT39>_w~ ILg%mLdpfq1}_Vlr/H|Ίފ@tWFUFW&T&UTVWUWuVuWVW VGc?ݟg<~wutu|uRujuFuvu^uauq:P1EfH{ª⪖Eᣗ&iNꥷA35(ׄԚ̚oM^M~MaMQMq_TRV^Y][_3X1ڨڄڤڔڌZom^m~mamQmq_TRV^Y][_;X5uغԺ̺:o]^]~]a]Q]q"Wllll T*wUTUtUlU|UBURis:eLqG'էgg[Ԇ솼†CKC{CwCCߘԘژјݘXXolilono 4On_/ޗKe}yB_k}]]_TZQ]WRXR\/i)i/./ KKKJSK3JKJ KK-ݥRwYtY|YRYjYFYvY^YaYq,P../O*O-(.+/,/.wIyŬV{wE?k:gݥVfTfWUVsGZ܉@{VeTeWU2ve?kSO`~:`>Y-ndjqӝAV\-*ŠX]Mumuuuu>>>>>>[__Too7 Q ) ކ_CSC[CgCo`ijmLhLiLol675;{M'|)t_|&_ؒoI~IQdĔFƖ&fzKKJ}Mm,,,,,,[_VT+k*k+,-,3Q )r_ySy[ygyo`HHHȬVWUz+*cR2+E>6^H˓R^YgU5Gu? 7E&z>MuTuluBuJuzuf Ff♽$/`<汐,f.f Όv3jyu3m<2%r>=W~u;fe'; d>ݯϰŲʌa'#hd,2[Veג*{NSFxRY"d=j +k;Yu 7X%譍Q>lu,brXRc#T`L|$Ͽ-b{GQr-]YLg_j]d {هى؋}Mmȝɽʃ˦3u%\2 l1+)JyF\S i;Wx^<<uP7|*{7K'^._L%g=%%>>'?gO6-<<9<w7;O4{O$!\1@(w0gsFˤnJ1@ @Hjx0(É WMֹ4Xϕ`\! !Sj!`H"(+6CR*zP>_ 4GՀ7*IT 4BUtOi h!b7>Es'78 jz&90jX σ!…c;wtr&METUpȐ(abkXZYT%E?%0*6?I*r0JC`pX,)D+iq沌7Klx3:"w$]QC1:+X6kL޴%F.k00KH*.~>F>~"_ #*7N>,O_^u4i<#UդSoўh~/V]qO.y3L5Zps| [_t/xT[麯? CmBwg'H!OG>W߭whA r[du_VhT,?<"TN[{B˜>Ro76Tܞq&Ͻ!9%niD*yCgH/_gTUWa =bͷʴ\39OaZBaVdTD@J-4YD'x&肸5bv<̬# qqq? "d7nArA/YsrK = O||ԹMʨ!-U\}#|I3VV\4;zBΫ>u`h]Aڳ켪J!su1i/\YeEʼ-ȒyNh)_]]6!ң\[qsԕO'z6h(_W_W™o`(T(FU\'|Qc=QsE犅Ҹ(qJ鳺 R[$cbY;a,J}p>$, AHں:::Ft1HJ ctE QxT-~ڲ7}j.sf>6]]QۜE-'(%s :5'>ͪT\Y`Z̋Sj4ra֙ZϘRζtT)~o&(`0~FQPJtbFzcSF8oP:ڍ՟M+ui '+pY~WT4""r sdzN8yO԰5ӧ\,;;+쿕y*Mk::5Κ |cL`#ŁVV^cho2-]ºOQfC|XE5b9~~*^bIHonog@ 1U}?DD@]߀1x]z )wlT)B::"fZ- <87bCFH 9  &3#=.roCߧw-,ytB n߹ؐ܂}knxgfν#^ʄ9Y3ݪn^~Hj*",L /UJD?VF9.+QN4#·KeJm%MXKiaԤW}|+u&عRo÷o2y1Vq'1ˋlC幦$%%a'&rju}L QF>m2'b{qSg1|pVHNWGU~=QߢuH=;I DX&Gܸ;D;όN9O{vA^汞@r`HmN{>|LVѕk<>?_i̸C-d̑ M޶qViR+=erj=$}KX-קEs]o&9NxaDMUSl4p06νY`ȓ0Um:^G~﬌{J0 <6Pn1mw"γhb^uM g_*D%`D# X,p/)@#psDyI,7e _VrFr~{.YŤóϵk X&ฅ0.c6DJS}LNREN^"Nt,A"VfsXkCBQ̕e3;\0t?YddVպ/´J>b}1v4X ~ޫA:t#iWWݙ uG91p&k:&^/G,teMyE *ZQmhwotgNѝ]pϠRT٭]x冺F7\Jmvh|{S+ʌHypZS!O,GMZ]E_hOA M3DE7~gqU@m;ֹCڳYOV9t-e߈J`y(&Cdcq4򾨶.Grz[Nd2-4&62xTF"nY߽37 ;_ԟOYW*EbiًO%k 1u4wMhM&Mq}˹ehNRI ]ͦoݴ9}B!iBK5.(ZA*M6ei\֞'+`m\#Y$*! RZ]Ţ' #<2[*DoDdTVuXC˫?&oLsR+9z*Lxvͮ,!s.im]#2ټ"ܻoLnHU=Yr{\Rr٪uIEk9Oo ~ڥ2LB/Կ,E /B^sg5Ua|]œOX c :-x;<)~J?"6w߱{20gJgh7#|V_I9᪯Ru}_& 2#?AoQN-$e|Sro=SEʤ ٭t _uc-s}'eqo%̷ViF8vªM5wnq]w J8~hv}l6lMׅMrנSc[^,|ն! ӕ#|"~Gޮs7.^S`/X|~svQsxe? ͋%ψlziLx~Yw}Wf,9tjAUw] zz`' Lh®kܫ5z>edޘ?rR#.NiXxl!>/,G @ZXc渠PFP]mVjq(;^]PgZq;!f ZK6_U88aSx^$F`u[c" }NX7!f^3sGM얞E|R辧 wjegi,6_\7nٮޙY~'o&Gr%FͶ~'jp~&==UB'4/ov,Ztgܲ!ۅtTKL94>6f"8eRqI Zy!Ҝ.'Ⱦ$'x@=D_1X&|ZuMUoMtoC_ev\ʖ]\['80٧2T-~t}(d&Q=^T#zյ8ө$(P {722}{(7D܇wg;%,K-ȫ$.mӉY(q+m| {cѷE-_O78ײY5 K 5GoCː2J_J_.WKi.k˙4Z nAʲmM;bI]\)c IUc/Cn,)UiIUs;4u)BL269 4($*]Kaj7k;]>m(ؙ*΢ u8ꕉ;]&U W[ Q;_C*Q!Fں$]. =%iK{_&ii'vYk#"|Jl3%WM5(JCR #C~9\s1v+=dViMh_xrÏaj$n5Kv]>Pzo >0j ,悘 o9WsEۥ7Md$o|{-U x8>e#Va|-w_ZLjW _}]چvn?)PCG_7 dh9/!tI=:@dX__~4\&Ϝ'Нbٳ/Gqg G `nnpfFsh(RS'.tGLfٜmQ4& ι/b6'~kX%M˺&2^]>)udtUiildF|5yuʰWĆiS]KI;^ |76}B_:і-,Kȣ-Ev`\-׽9> )a׷xT¼8h`ǵGf.Y^63#z|G5aOWon%pEӏ<]5{6U6忘_J0(ۭ凫;&eE$ߑ78n?\9@LUyVW8ϥ%zN>Wbb25I J9i;5卫?*4:T4Wzad~wj%ʣWo#;H;N|k<89%Yevd[m*_GT/oJ{8*csQy:6Ο@<;48\L)עvޡFRR.@$Bm3m'X`ՂʊDވ6p;g qvvTPy"wN$e5H\ MD0R:+eaQ +5CS+MQoAqj+1_3 BU(ٸmBNjnb o|)Qu kۊd:潱e\:ypMR=$U =Ko_n 9v)ؚy>0O8XoJ.Np7SNzgb.2-b˺o/sMzZD+'37ݶ)rM+;-#۹_t kQJLNԽYsܠ߳! FK=ol뫝soOi WVjVs25_J.̿@Ytޮo~nGj;>bhOj^lJUx̖ԻZ[vy:*ᔡ,IxӞm b!KZ¯ņ.XXU"{ԂTyH5kxT }Ц=CB 4Ma~e&}T9`(N~U^Ŕ_ono:$x:k޶~ ZUPt#ͧ񲕽oѲ,z/x[ǃ[{7X"L D_C[ꍻ_ih>B3A@Oقl (ҜlmiV@`o?C.ʚ/бkN . "xOЂ*-lR}jP{7t:7ՍoTK/.najjD%v)/~k.Tqqm!ՋNSaH^+!%ae/o}E,g pشhڹS߸;#hϛmAS/7ʹݭAhK>:OpjQy+RwkWX8vOr_ ۷4 ,<'SmVs2y!ˀ#/R!$j\qg=![{EIzHiV?ޥI>No֙SG>>Z,"$R SODݔ'=ǣ&׭jMi\*|l*uxVSUx#[&wd~XrlsUwךܨPd;V<(}uAw3Kmϐo7^ػ_~ֹw[|'Goޫ^'w;ޛEgوIq30mCRu}>.t L@>39/In0L®!i[7xR}iӞ.ݔӋr=9ypYgsGx ko+s{%b֕$ld,>h&7;^1[3Mq۬SjȒ=.H)5_cԳxBE_QE4]e%r{#^RlʗվDum 4+4&?zHYo${ltY=5=h  <uD֝Qy*@Ci6.=:|wӻ7Xb$q%[mL u~1+nCMooK~Tnт)_D?ȉlYV)VJ`sY,;h- 3vi*䛍fjt8RxΔ>Z_h:҇x9ĕST=ctSvU%="_蚃&B+rWܚnLXX}}ªؒ_gUʧfo5 +I-Aw7U K~.ILg]߫/ =' |H”sHJc j9maomA44$@ѭTk%%"&?h2P[,_6 s#>DQ!$mŬ}Fd5$ud:"`3Zzap8AFabY>-,Нkฤ} eآdDlA;46/&Kɫ̳W''NXtb g:9%[u&=Qd.[j5_M.93SxϚx"w0Jp{5fӋ܎׌cV*>׶dF^Xݽ5;HS~OX#+ .+V)%CIC|OVyJ>ꟽ{nNދ{LDk>Ldo@Zفɩ o|i2Ly9XzDBn>|(DUƎ\v-3=oI^=#):TZTU<|yvbWÔl7?I5Y1/t wW=ᾖ M"@<{a0s1\0߭ϙbD࿩Pҏ(0oxxD4/N 'Z:"5,oiZaZNV |ժ*w~tV |vQZZWVǠCCC NVL@&/f~Ggf F(`qLWQ({h4/ f:,c^4`:,1'PQ81x9ETcZe@s:#SӊDJ5/g m˖DV3*7Eyb僧 |T  *iF;6[iXh۹X-?^n({-\1DmY@1X1ES~>9Gx2°|^~k2>6lܘ< rZxpXܦIG_59Zo, Dȍ4L6]oqӀj9کv`KeS2J;Zo?4C 7)͙ Vahd r$  x4 1Ch!S7иLSy1uOiiKhc&.G؈tnQ.Q`1z@G4dQ-Fi‐!т} x.8Hm4?;TGH''LŒ d3$s2D{"I(v|PJkv ZbLḾj?Q̩c(KGǕDC@pdJ?}3lZ7$j"l(AH? >k1hSrXbT4aEQRkt㰂C+5\I 7q-@ܤ-&VDh?+91SKSo!dgD@IA`^,o 'M$xhL'8G&A1 7L8HPÇŢsgSQ+Xn gE+gjDJthEFh !_3 f `. A)&A7/{& `35A,Q\JN 1 326Ѿ #Mcz? dtM{*w?ROPnNݠ֣nA5IB^u= h-cM"CH7JI>܄o@^(&ݡfKL(XiD lgO0P @Mb!Ytq-c< FG}r|w2ŜdH [HQ$@(`a;\>YOŞ]\)x;Y 1A^;& 422PYD')Pp6g` `Y`,W61)N ø2 M'EIjL'%꣤!i[j[j8:h4τZ@t dT0_B;+ǑHOΩ4y7CFʜ9tjXǘNf<&K!L=&I&?zÉ>tLFeՕF_kD51O &Zנu!"!^7yIM^ xk?3x+iqO3w[D0+bp̧~&cdS'[%;C6xIm3do|+ &#-_>QLmauXN C~}Y)$_VJ(;&% a!0:S\Lep 0L %݃Ƒ3B :CVbhÑfI~H bC k߽4tX D{a1.r?boz+Cư?ư*bXħc!&J8xj pәjSq[N_hs!<6BǷQ:}FUgftjX%NǪŋc|.aђ/VV/1sA>`o{]c~+ՁAS.&.&rc/9Da26fξI?}D,&@ w4"=C&3p~>oBo?)S>qpOo Y>%$y!UЋ&9ӝ!G0£wȉ-rLlZA-<۱9d9fthFh>^cR3X>L+(-\&01S;-ީϠ^Py+) C zou0SYzI`\YR,8A$ы> {8>!R_a1z*WՅDžt抂bZōhU]突/dPD`8z)(F6zk<(E@9 V#ۄt.=0df{i `#}kq2qV<h3dl >ac6gF1#eydYX?N^xaR0lXkx>TB(AJcDg0-0eԓ6fn-BQhl2#1rnAf2],K?4S+^Ћ!Ѯf4_5LE0F3SP Zr*ddR#z2< av|&Se܎yܻ .lGי-:ۭ($]q(TZxuEu-O7|C>vF:\c &S#ȴk1 +. {wzy,,^dM{'ٴn2_Vٰ?ҫ߀Cn7!6ϵ,}oe/Cl}fq846̶5~6w+rgK6mu?[^f9W-rǽ`6CCl>CO|ŽaY.u's9ݶ]diZwrޱ;rЦcD/]>=8洢C{=^*c'rD[>6F>c{-c39 _O8~:@9+3- rJ.@~ S2eRw.G Ht:7skޣ&u eZ?N<[ְXYw/bP ,qwd'+dYurb::V5[q^փ`*95wǝ,QcEsY~%XYlYd),4,;TKV8Y\lYvceՈ?z8)k,YɲYS9d Doִ, Ud h;V}Z-sd 91ʍX%0s1ك`Sy5QumޣNQ._\ N=@zFhL)Xx%_%`2F,A$c^q &p-L0v# 8_> 4ZyMo>M4 gc_po]6/~ď%6czr\];Z44? ΑLF0de+LFM1iXYwSάQK+n @3^\1`49;Sr7]\"2#NوN9 [!.#|DNXNAy{6Xl ?C2HvZre3n-٠ ':,MϪ#A6z]A (P`n-SP'B ]\Lo\7V\zxmb 7a CsV|P(%(86pDqçB| J6m!Ȕ -2T^#Z$_̶ʶ- 7u L/נ &hǂv LЬ]`X^T&0w5Nf$z#CK]{xSUO҆(RJD 31i?ӡAPZ蔡тRQ "^HJK[D z ^[H@Zkjۤ?zrk8k:9xiR _|=aOpAI4LāgIIVnHIKaᐮ#Dzz&/z<<0s9]#g)341y"kLֹ·wA+?Zf Q/#|"/ JzQcu0az<r,P:8LC$.l`_)!-Mϡ< #lb3gL"lkaqawuTa9֧K`c?Dڻ֨,&Ǝ4kRjp"Hda5,5'!e<;|k$sЗy5E9Hr8qIffRAr@O6:f[S#nOHQ@0{̇̒ѲEFlQ1s2CbVi*jtMd}5mÄMpZ G=qR1ޤh{BniSX(P>緮QhiI qaFl59Q.}mu%1N;A4Fp)3ST8 ,[̰= vU`?ЌqWWbq9fl4n"SϡµjПe~{Qru㕕10@ZQ4x H~\@% IG72蛰 ȑ}- -0Da6MF ƾQtbg/a}dGDj{,{;_`ͬ w6#~ %Vx,vVSCD;#]ր;uƀsSy|y?,;԰Z?\E{VqEbڣ+TL"ov]/PoS#`J9Yu,M'weQ?Y绌 B20LEspw O~_KܡQek#ZӇGd_1&>QJ/0xT5,-!/35:1ޚjIШT:>3LjQ3y#5tB~ 8apL5L~:z4"b$'U% /PVX>s; LDct^i𶕉/y. F0O8kAT FVbH*kPaQ"HM+Dsu$4.ЌlMbc&9q d(>Hc:3 2 2"ΑH ̤֡pzt0N%ؕo$rJ %"iy'gyNfn8=K)2, hhJds IEu;uxuS> koZ SJBN*Gi_X -J{k^J+ *wo{x㟛 C#ӯÿqo|#xwqoރ7Fo iLk} ._5a׾ߝNl 6S--5c.\BE#2QZlIPho~mSr5ݏ߼:wkʈ%ĬM^ }^niRXjK-d`WxZ0vފmqPy^Ὥ1ާzx oOC( ﴐx7 j_(<{wfHuХPx{ĐxzwPx x{ Nޏ;Wxc-! s x{wPx;;ǻD{-xp$k&܏X\yk玼-' WcptׅIBW*d0X>TYtsm/I?.Yw)[ ,)|Kwn@SFL"Ţ E{)uDY\؀_ŚuBO+ԿT`3E- EP !}Gp܆ž]~]S.ߺ>6Nd}L/O7с#mQYS{>R_/ln*HkSX{뺞Wx»mzpڷiweH tqo}pӋ:zQ{uwEzQC}uE؋"EElwdu `~b~bjupx">LW>ޯ u+۬}:մF+VF\Y^I8 5ѕ =C oZ>+aYխjZèԴ:tM:Ѻ6oG^!粇W!^eحl; c_Gl?9l l.麃{lG`>v4$Ŋ"/v~o ~3rw̖^O5cdVxIVxWۦ,֊_Vx7Q-KF+^21F H+0]m0rV`ZW5Z+#jZM h5%0ՠSbD}y;m###*nmqˑPfAkVwFn |9l . \sI`KEH4$ϫS/߭]׶EE|W 'e=^=nb޽傒^P »gkgԙq8ZUiVZU\P)ʨuPTZܵvnZu\h] 3KN=H  ` KDGypsܓ$7 ,C` MM-_7_7_[Eo=z`%1z!F v{ŴQ|HDf_wB{m en21?n(~ilM\vxeYOQo7`LVR[)+VP-X8Un o%J꿕o9r& n${{\i1"gQ#nBo8k]]]EEJ&%뉒j?EE%___[Fo#=kFۓ^[^[T8rՐ|a%F+1j ne1G~x-"#WP8va!:"#WQ]vNNNпכ;ėHHVNNNII)R-[*H@2.e3<"yi‘z(8@IC9[oEY36:'2GZSAWw?GZ#e1GƵ/yFk % 9g]اpq#U#woy6Я ҿ 7wK~0 `2qG~e#]6iH ̲qdB \Q"ő%8?6-a?bf\ :+GȨJr`%$*Hp+p+~VP]Y?8dڗd!x+ G.Js,+9 GNvdg#GZ}:c1lն )qg{ p`Tqd|ty!9#;_s!yZ kyV?(]H2w埵:{dWgT]ػۑk]He# Q@=,q/L;qp]ܑ,p'8rE#/X82"Ǒ3Ș"8r\GD#ɸP:;2ie żU8rNoGߧn‘̠dl4 RΌ'u3fPr&q2?h#IVqGN0ÑpdY#Ⱦf8Y#{Ȯf8٧#ށVU"be=#/5gdc82//u%Yw,9[8vaC)l|ߪ1ۅ“ K>vdy@Б{LsO0 [u eWGd/#Mp9$͑LpV$ǑnÑoÑ]oKq䖏%8?^-9.u_ߑqs9i#ɑ;kEFP2J)yz O[xnlhd Q2"nF8|(͑!F82G66vd3#G1tY[8ҳflt";~Gđ ~G6c3FOpم/9[C#t7_q$GzP~&eK9lF-cF&z;r9{1.|t?g|?gZ`Bl[!a#ȷ G6 r2lG6̗ȸHųM =ÿMĸb#{&x;2Յ/~.?U5|>A}蘚}U/L=!Fm܆r EmؽpK}~0߈yFTųm= =U,hG΂zzdoWoʊ"YIx-,z(~@i4 ,8>[0 NI/eWZk, s,(Ϻ I' q޿;//f,-蟪W^ԥuu.ИM1=_< BȂ6ZdAK,EhrudAȂ'yR`G?g.Z3.^S'eygw( b՜ W.MO,שC}C\|Uӏ6x 闋 +!yt 6dwGz,]/us5ȇ*|( 5Fv>X4̇ ``k"Q m@\GZ|Hx˱aMuæp@J>o(oNZ!;Gy`3kc9gh;JaA/ @3r@wCCCx>W# Hˇp5C-'WU)^|$"oJ {}i{h ,ȇx|~^CT-)yX7ۻ.{nSXV mI6;\w{GVHUv{<n,XVfeݣ~@H5FE|4ܾ_?dvsk֌vkiǝ{sWo_v;2]sOV _ ]^&dH~pWqpZ흕p{;%Rp{nVq{LA&yOͤOo.o^_=2HLn%?3d;S5#?^$98Kl ]<,WmrKn37z" S Q3vdȢ2TdȌy8GcF&Z} j1-fhz'a'`Nh´GaaddDxFb[(#vπ؇22ksĭwv=wi5 oª\O@2wڌl "I?M? ,~1{Iמw # #/e闑m!#gCFe ȓ9iddzd$ޑ/  F}nvw3 #MUȿф>Q-SuW%O3Kg풵E_A vsgdFd3 #f藑{2 #we@Fn;3 #7g@F&dhtH)VZ29Ц?xF5阖knoJr`Q9dm8Hx|_ZʾzN<[ ߗ=;ꡯZ@5.~!x ÔB#j3<y*tI_ M-M^ ?of7^шtcb1  [~*2i*dT!QȝG!#7'#ꑑxGHZŒ/^9m@FfUyO"g:(a2R t]25ON>)%WK\at%2r} d2rY dd\ ddTM9#EcF:i5-fhӝL4!SKF޽{iI$ #g$2r_LXf2]=?d$n%t,{Ne15 T3t, U ~SW O&dhdhjd}/+~H_ҴgdȤdd2R2ddd!aÐs듑g둑xG_E{w7HȀjFn:A2A27t>tn.q|''.(yV ?=#d3e22_9Q.^2q2HWƌ|Ҫ!H+CZ29Ц[S` )-G~-̮$1 #vs ,A/x2:B D/бp}k/MJ|CIyjLIE4T.qwAHx*<+A(D+/@{C,!Wp.|E_QqւO+LL%Z-뢼N,k$JćX؋ҳhKY_WgFDI8JӂybQ.ZgC yg QA:֚1Hs/ܙ.֪8Z륑:ԺW .ѻ:ՄWz5+jYN>A >ZZ\k^NeZVu'8wW[k/^颎tZO*֥| :OZiU++<[GjFPm|@l޵v觹'Jg=THZOp5މԻ־}5s 6Hn N֚K'+r޵|WH/˭W5DZye_}J+B7Awn?Zh ] +x +a)Pyޚ{xf>1{6#yUM_ ^k 74ךODpk=uʼI߭Xz׺ŮJMZo䓞 ҧfqkZ}]r8WcKVg޵S3I|R9[Z_֡H^ 8s޵Bs6Iobsk5ROԺW. ׻K=4ڈW` VڸRU7R|Ap kVsxs-YV3̮2oҥ_ǃzl+}9+s:YUMd>) ƭDtZu9+E?w^F1AnJKΐظˊ;ݘXJwXQt3,7ecH´ܚ־G>am9^Pω{~CմkZ۔hZD۬[ ]jXۚh[ִ-ֹvv$ڻkXۅhwimhTڞDgMkmY&׮ac/~f.~._h?cO U҅t-ESg ,֔Ry*G?ڊ(i=:_r)׿ dWa]y -aDITBe$t;52cx M_rOM+6t1ڝm):?Ymt~I T| ȽsZu띗D9x$PM0ɽ7D#Ѯaj?ɰ=yD#PtcGIiܝYez&F XSD_P5ďP&Zk<,EK^%K p? _ix_!q"80(v# [ deNt{[Ӣ:qS-22iB YA`z5邗uԤZd}LGtf@`%iuiZdyL aNrguivB-2}f(ػBC>)ea:ig*_WL&t!LQ6it3VO<y>M0B:"YǦu˚Zdj@90I~60wg*VM!LP+~Lߘq6-LKkSC>Sl$+7Lms=LOE Vȴ r$+wL=M9Lyϗ"Ӈȴ !L[l~L40mWg~i-2Xn ABlo L0=L%.i&yVg`z:4zQ-2}@aׄ05b0q*y?"SB.CSˎN03-Oc dQ+ɇ~8L=yok{C"i{MYmW3fISAcnR7fn{1;74Vuc s15 Ioo],E71&l3Fc5DK 8)YD'tLF#E[r41YtDEtB6,4f1-,"sOzm)P.7]i 'PR&H,.TD,{iwucޙAy*z?D64 5o'hxa$x˚|[ӗ|&ۗ쫿/&eM/[*e$>Zr}r}8`f``/_ąm8W'xr)Y_֛)޾ޚOoB[J oۖӗ|}#/{xb/Rӗk+ /\\;}ّ,y>/د^ GN i~ `?6~ ޾p[$d>xfXx %y9}mw6oƃE%5vz<x 6- J&ryފ%d-m"ۭ$ ISۢm/xo=q3(ہE=%\~so"[f;%NLϗWl Ed^75NE?AyN7Ha*x; )7Ix[Es[Awޮq]paM$6o>͚}5B/2 o*}3 MwoC[ L?yx{~oomx;:Q~; GOo *bτʹ o(%\-Fo)-.fF ogΖblxSZb+*ۡP Q. &̚LaLX$RD7Sy{|9'~}b[AqLCc=wb嘆oVT&[2ʻp8p|իxΡN8$g> `l8|xG3тh=WD6e}iyx]Q1+*V8lX6v6f;i4Y;,ǗᴰkR?#:x OhvV׫ch8G#v%֡4j#u.4;\F;2 6oQ}F/UHW.3F\ysnK?2yv._OCqi[|>|wj0Ȝ(䐓vF Zq iU^!54O.{`ޥ27Y>5n/ !$eŜSIFH9;GwDB4ķ̸rw;(%j$s@F_O8r!9:V)K0ɑoaw0/K\UM1p97Kd 켤EeM],(řgU&&:o{lM`>5P;j`#iIa~K%s={}qF!aץ-L&ڽ5O5rxDW <9)4^K`^2{ߓ{}rJ׋|sSiEٷ E!l]rs=lZR>,{&&˖d;vپdFv٢dv٥| yBvٶdA,Wa2Y4y'5Gt=u&uVeY,Y{:q-dJ"g-Oăjll;=?,M%o`삗Q5_w]`l];y )7!f7 9!n۟pt}?;ay4cwnw ["E\`W!NF2ɮH=~]/|cv0' ¿|B#E6CK]TוFF(@S1%:*48 (*`bj!E%f fejRmMklu[r6VD7cY\DM̮C&}3ڞ='uP[Q3ϚMǃXTS=nʿ&.֗.mW+^L;DI2,y\O&6ouEm$Y2wqR:y:J*)5WfS~jcL|-!)b,KnE%noغֵrJwRQۘڨ^wP:[fm^Gs?F6 q6m&|ffcRzIV/2EQ= 2Vx[^0bN1\(E[&Z>tI!|M˦yWM6 ~H`vj%˵aWf/ϻ~6 Sț 08IƳ63[8t9?xN̦YRG0|r󉇉_Q_f{w=|~bll)w KD_!Y%3䀓vf'2L8&$}˘/\,e\aEl]dsٙg_Gz 0?-+0ك}8?3({ L.p`ٖmԗVsmbk=k>X:5,PN,=Be?Dӈ GuԳ5 )xϝԯgDc*6|&}Kg_)EԖZ@p?y&թΠ Kt0תa6s|9U|Mv!yZlEɛ:&jH&̞,&cRi b/JzI1cZLz/_/t9OU"919Ii.q0V583-q c>kK.ga16Irszl d"6_摝qq[aqLZ~MU,mb9ՙaG~bdvƽlndktA,vܾO3N<[;2<~!2=ܕF7]o9LQ~N,&goXWyQKu`1e̟UBs ˡtS28,cx~7ckƮbI g92l=[/3a4W|9̷euu]b1OŎ,Xp`2a3)v&ӷ q,`7of[IbrӘxhgҕbq css> %vjgaL&i|1acn⧑ߚJٜld|ȰUmWy pw2CQ|FF^ P[xl YUJtHYVBgӣ?aCuP] L,}iX5L{嶣BE$ke5QxoT4#TkHވv;o a*Jqn#-oD~]3F#jC]sG?}(pBQ@1^+mm/֮1(EXrHZBH@Ag`wpUF-uY">Vmxם⟢9 qH#.ʇS8x<}EWEO 'oC1Z8b5I7pŚJL*QrPRjyn0m!:l_z[mU<4: F1Co,K,>4@VG޳[J";7>5kU|=fŲw oiTf?V"yŠَ <;f^#εTI@_c>߾cM2#-^DQTC1:W COYUG}Py&SP2JXY E|)k=aVxA YX%f)>ʍ.בbtB6Tj]/&Q},*yŗ-Ʒ6F,#J@wr;KKw߀RP(KW@+a .c1M[xL` > 4HSn9j q{>MU7^82ao(-#3v6B3[V A8EBx]FN߉o‹>RߑRʹܹB?P_xz<>NC0 /'-V/Ck<"w ˓PXP /o"rsE ꀊڙ!`4\映wV-+^K܁fMWT-7ot|zTkǯ}žiI jnoDIG?" x7sP{Ė\OGKG-n\&FcUTbIпB͙#DQI}>;Q|'@GzB*2PLŲ] o⅟pUŒ\]lWxEՖ.|Rz PyEnYG8\w zeB@'v0ue Y7j1hh=JvU.xF[ Ex4* 1-qMu"kjiNem#|qVEJnQ7-R΄6}n=f%H6k4cr~%iTerPS;s]i8,d(GOɛ*LIx-'L 2i I&Zs SNVTP\ƻfMa1RMx* pYM಩r3;B9!NC8׮yح Q9Nkr#/.)_C0De9Ey$=Qq v#6قgqiP[{;\o0ugiO7 eieX`G ijx3A/?zR?Jխu9`]ƸεyT71U!S|qPcFE M2MDnGӕ qk$Υ@jPTzMoC#_5k~ *GdH~Wޏ wQ(RzBD5]diFٹɸɊ]RU{ )#5r&G wϹW267"ҹQɝ{G(DST.c7'Z"ec5ر")҈ò!~7yQ-#buWRՖz97쨶7pd07W14N)(Jet Tyf#[1ęotELƇ|v}G>GN4XB.4&vlVF>sj5W}.\=V>ȫFu[#:&p-;0~m d>uۿG~b},h|M[.٠GcJa1yLК8KW/B̳<=UH"SDgIk Ƹ'zN,Ey>{O0@8%`c6;CWaxKЮT<@Ca; ۴¡(6~*C{ޥZ2}HIڎPLPJL=1/yBH} 6?6qce|~A AL3 4eRޘ'F[s}gl=)㎥U4}zc=aP d* 23aVWJGQ| V矰ͮoΚj%4|BrӞ'2'e(#`\])KR=`UsRݧEŨ*pYZman0rp<@Sf4S!/~m7Ѽ%0xogvơQZ2ݶX!ΩJ:F״g)ˏO ӿ]~RWKkhIў뇥 =Y:I{JUԞuy(V-9;Zð+~ QHVQEE]~6lͲ- ,LբЖa O(Thz "qsb?}m5W4ь>̰;^99ѳkEx :3jWQ/,k2 5Q Xb ] ]j[їB3ë1 }_ zy&׊oc_ j ?Jv\$ !ԂHpL\{Lͳ"p. b=*}G0A aqh_#шhADqۂ(io?<("Ј^s2|Bȕ`<ۖkYfgs"+P]1` MI]BS ֛ 0ӿh SB ػGGBPmփP 7ᮭD`ɏWmMIiLKeDRa _*;kn mhh< E!BASJM`(HM[(JK (>83#!VbQ^ 5Ͻ@0]k\Kzɾg}{b,\pqݚ)4fb*;F|]+WCz8hp{0݄kW =ZTw@Vg-tUP7'gs$?ϪjdVV6Kig3i_Kӵwwr5Nߦҵe $h`=!ĜH▎Wha5t~30bw`\!($k֢ Slp_o,Y$3\gx@#abKtྼO󎲨38~B3=1 mN рk(Z'1m\7ftgz'OO>sˡSh%/OEb;^p֨NCwзRhH^ϡm>iZOّzBo'_h:(,FX8q0 p 8p$Ź ѿ|3)4] y\,$l?a8ƁFy4,N YFSeHXu80Z('$Ӑ80R*χpq`$Pr\\8B(f13 Y VWj|%8D)lT e-=~J$ʋd)U,I "aw ~8C4lH޼7 A =QNߗ,3TChL,3ȿmʁEӻ1 áR4 i `H*UCemymKSb8LآIֱ?@jD"Q@\DMbqYQOQ$(oDE[9W9QH@t 'O$"OwA-=0ӧPM-[0 C#$4$]8 'ʳJV*o9`x"r',u‰DODܼv(``2xAHHbŴfFe qhv?^֎hZ)f}B򔐷ڱkvBװ ]gk4]c1Fe^u[yLE_LzM DAt5q "-qAt9ݧ"`?rDBnu0]eNLe.]fexuaܪ}|%G}8y> }='ҽLT$"W@bD\Cш`l *׏:S7)&}]m݌]`&ݸ8!9'B_! *}iy!wwGȟChF!9'B;N;/wޝk*_F)/3Bꍆ biS1 IMT$@\e4-Y`N+e|YEQKa!7*H*Ԏ7{X3d-#PF ]K?ipil0l=X9ٍwGN,yJ7# J~>_"L}FIV#hhإdFm of5;.ͤN?mʔ;1ӤHƘfMfQ,Bq љREwꄺH*R/.3e&d;XWZ+W  $ U-/ژti21)2EE8Rk)F>]`vNX6E2㍼GL۝Qb)6cLfwU7t10ZW+@Zh-7CE&BEiN6)slod4>3lH% (H,*%x싩>5|T,:>RJ`9SMQPs+ zdp:6PIWM3O\9G;q#Hʊ4KHRH̳d=ooqMh\NWymE(R27HRwRyz;պ2jEN0a$=66يVW$z %Õ˳BPҗAr@KLKzfsa3myfv5K, 0](}ѿ@5&WИ('wK5O;@mRjA@Z5J?*t Q3P"DKcILDT /zGޯX?$iQo.OU3Й=c 'пoCұiURi"V!@3Kyx:NchnEw!?cIH͜KiӜfN娀yMHrKBo 9fO'Ļ>%v)_wU BӄtCI!])BYu8&jcE,*Ď[1r_i-BYo]},-F^ifUb:LA4';R;#4ztsed%,;IX:6IV,a͏sdGu uz1Cy8\G_\ij!4pS)+we dI//ԯYVj.xV3Oٸ̩b1" i%VB[h5Z*|#_*9EEOP㏟"'T7~%9Wލq膞viLڠI5]x8 Fz/V2Lȣ֜YBWdTBV.*>/?L #$O_t}b9d@J X5})T(;IRQ h=r:w<q`hg"3Ylh 6N`̧$ "+WV롡zw? )~ DZJ)$'p']o7'8 ?)9R)`37#Gk`_>H$C( (S8*͙ϦxfTQ$y&ǒUu$Il!|H_ KL2^V4G]u9lzK_6B #rz5>'5nirG:VNL +4tE8SUWb=fO~Qť>!m kUlgUꫀLQ% eďA>뉵4g$&~ji!Rۋ21Ar+jbCa@'s YtE|&.KY'D83&s`XZ@D2;- Nhn ?)OS*þxIxy=tD}D=%"% l[Uv?ZMj~8&FK*jWlʢVe|ɦ0]wW6iA/2Ygx3aR,viFͨyp7|3o6YѨle˦.WZT+yL iw yq-]?~_V&qB:aL,+M2Z1)2R1M~̨gF=bC;F=gA|9VA5Y5(_?LVw |.o(O6>]dT,X?O DۖC;VL0\^v"c<<х w|3@iakZei - 4U[64|lʦߝ${]x鷐{KA20)k厓MrdSZ; pۋGTjRtbsHCwtJJ3gF=T;"*rm]HF8T6,@Q\IޅTQj;BL5VʸV-'+-p4V-/tcv,+k.'viڀYz]w]mUKU7WCZG5 єG-VWf3KtP9jC"h@4W|>ǁ=__y?vaybmNb$uf͋;TfGsIXtة5Gr|~qW,9M?CdAJH'A2d$U!57]yP 6_֢mŨ!c:1~p]jPmURQƱ@#e^,q UI"Jr$V|?jU,ylW$NP[;%<sr ,b`.e=XBgS//0P1T>9[<jla~^ӛ=<9׸_tPL۹մCt lP+Di:8! R@ `Qc\PT:8S9{3 #I={O[Fw".(؞T.h}bَUbXLdgszǹ9F8~z~Jr2#j8vђ`< _΅̓D+݆V~"ńzF1( Lޯ.⛍ѫ/?V+~XuqOw z!fkiAAVWΝ\55Qƶ[Bi5xl9j{QWW{af|}:_Mqd*'6U<Dz]ශn{t'rP3p{. nypsFQ6/8'%*KM)ZW_lSUm ]&Th%` _^F:U_*Wr6g$ޏ_ܜ r/Y7ha#eleL c;[!4 a#y\.`WɘFo"8͵KBQe[5pYB*OL(c|@ g~J8™>Jc{E m N:= [㏞iX)\S%6cX;8ss  R5XK#ҭ1)W=w٧%4b{U@ay .v4W/_;{U_P&AaՏq;!\O #7H؛SPYۻrraK6q]3{Xyw L1S~Wo5y~{p[ 5]@V]YGB =0fi~WXT(ݰaVyA¿Yd$< |8>"NqZ齜VpZXNGq鍜4K95 3[ۚVaatu9:k3==]m<4hM̝b<a8ZvDdQiLd-Jؔ~0zMR'0YF62eB3rD׫ѷnOgZ*chl܂mߝf¾ BC?&*F Gt]} ߄Qڏ"<;ˮpuZŃw:+iP -zċ##(n?gZ75?4?isc|9;tQ(bN>J6䋬6iCeM KQ:,p,j瀁uA=CFvarEğd,4;9QJRegZ !7kV:iJ.ޙ~e7kT|˲cO#{R(սO0Svͽ^Otv/Uoe]*yL 8h?z$%)Zӭj,mI'#A%ĘKExc2pC $kC*%:D"B |8]Y2a]-Q!Sb~R=I>ޣҝ)-c/1TLme{$zJϥRɪҪ4S_i @H*){I(CUʿ(%KE$(iʫ`2Ч'a"T?jRٕ]*zdp"WIYq^ilupb8@nqQJrm_*Tp9Z귏Sgz4!:1CK{|eǓpH9)7[\h`BXVr,hm5a ~QţT]B@ܺR.g⅛oI:]=s{}hWwtwsWoKgۖZe5_~΢ޔdXVՎ#i/{7Ҙ< z~5a%$*L ܒC9B6;F?M6՜.T?,V\*CӜ̹f@QqK IRi54d Cu5Yawfc9fs>~7q먯?im0RnB[Z%4p`mILh vkk]Rcjz$H׬ o!{kO[VЖiVCzC;/اw"F Y_lyBG1_v;׀hx noMt$ Sw@?ed7wWәb)&[NAKZ² 0 Mjh0z\Bڇs`E`恃@tL0Lu"d&$-e,t*Nҿ.dMNtrڡiXN \'GD#546`%G5XQ9u5XQ9hTij8އfc7=j7r:W.߫q'ufm|n|v:6BZ,ph+9j7P%*!o.GyVK "P'Ud5錈C͋2"NdbD@*cD6P'<fۀg{-`no(i˷ꗝ; 6;j:wl:wj`6wjpssmswMNNs5! =fBB}BF \=ʒ$'E-jו427B'wXQZ)fDֱ(:YgHk5`Ŀ'ėO &Iu.ɥ$Wv\. L0NK"Akg͈4 롉TD*1zDGOD;0]蜣x}iS3tS하i>M{?4#^KrUqڕ~Ap 8@7x  v`3<^kB2ڮzMFsud8⾐2b2؞f.TE5]*ڋov`kP@S/npX Wv3}`b} |9 ҜNnd ]HAT{t R_nɔNAN Ӌ0iKRH'9xn׀+%|p8| N {*VDt"ZuAhQng$"J~*73QOr -e0[F"ZN[^2UFfaɏyH9#S؞QN0=1q-)EmͬӮAoWY`|,'p0]`Ib/!MNq֦qE!zqM^yq3,1s:!F5Uvl5\Pt uj}<6bq:GE1b:Kv7Lۂ-`"}o#~pܐb bc{uۮn[u@wb[bcbB]l=7+ֻzzk+$=icA#W[P%WX.m/zu`-XVBp8 i` X.;H(c]?K[q.LݮϢ/ X Nǁ`,+ lil/|>V>gi :|3#*'9H> HH>PrɇIa# ˇ#-o'h$0'`)6>|eB^=Ο2 N'VDuUcLz>@R=JCRyĴ5}nD;,+ l^V̵*e=_#]:E#(psܲ |WAHE;a ]RRڪ8t0xk\. 6v/'FGm/'q~Iɷ WKp8c@_ _ )pn on[O_X1Hp-`O3t@C˟}Cy{d!H3z#{44G/ܺ币~u O?h.Wb[*-;x ?@A?*yeBQ[0\vp\._sSTpXH*4湟C6Gox[dudK++ )gw)3rSvP . eP[ss-"JT UJJ{aeKK~XVPɰ"G~ s+j jEJHI 7u8D66R 7ue#-g)N69t%hNMsZxC¨dXVed۳ڭ(og(U_#7{=lʑ>U%I<y? *'؅$+W+U^5#^T(ݞ'{CQ递)srKZoXjkR?Y瑒CgLsXoF=fSKwO0/#} '"xOB=oOJӾ_.BÛQ`{[M(9`=tI۽[$һiÑni[w_.[xX_sIU.%%>t=FmbvGٰpTPe JvY3=W\8yF:nڭO!2ʨ7cp e&<]}wTm@La;Jhx)\QY2l_.H>o% x&k>|v{3jsuڞ7e=;>)`>;*҉7{CԚTBg܄\FID"FUマ=PnrjQI╪[ ɶ̩YeCq\_k/;^BgBƢX6:j]- ^+J\1=\`P';t6_;uzCǖƷCqAq91^A-v[ǵyWڭᑪkZLNa>ue'-/[>' i-AoѺ7"&vKj!MnQ+<pi[|9|{D-L{G1 sVOȸT۫G(v %"%$OONN)9l:.utaAwd3ֵ+O(B9wݡKHCT⸺V?EРv.йR™T#yM1w HIސ/rXȗdӷ <;*vTd;1zlZ.N@m#wBi{صv7뫙ط( Z/\8  kiDԚ0dQSQ[޷,rI+ 9DAt`Z0%j}8|q$ GjW#9Jk1;GjVDȺ=5'k+FO'TɂoonJfl="yd_5_W3eiD)zk Z]4H8`\pnjI29EpOMBpzL;(6EU yt: vIgr'^oƏJҸvJQ,@o梲~lNV7[J5MM:S-ٓZfr$6mlSBnl 񵐴0.*;mTacgb W35R!EIzlN.:xf2s͙V5U1~'b<)w>d57yL|T:QbnwX`~8֢->-Zsv>׎?>O-JH{h߲:j/\˓뭔nx-9@݉4%+Hg|q/2G![%XB%b({ֹ̺Prnxi0*W=8-f({$*PMcIK_Q"u+) {\(Vm >f)q6º68k:*:`y/E\!M+Gf7҉TkS%GUȤܵfW J [h4n"drSEJ$ 2l^'PF+!0,UCj= gSn5Y/3 [ݼӯsd^whRDŽ>OyGRwgxA*|)?HVR]ZF%;M=^y߮}fUpy"ղk PWt'7';?oEt×IW8KSjL..Xw cKl vc)Q|UoYi 9˂C}LC]$ƬGI@2*_0Dm(4!)fgj6P<LȾBt}[ЛxG:^ mBykΩ:k?r0Yʌ<3~ړ WQ(-h*(h~c`S3"|'01/^ou&k.^ond俏#dcςJIŧlY?Az#-~;4ھ@\pRr1AmHϮ ée39a2g(* _`n #W$~$AyDV8F`~fgơ8~=kgejcH3!uEme:w|2; Uo̐Hu1N[0?ԟ,C(KZr/D#1VFcti4QԡhJ6N3(+"J|knKA ɴ_X8-ג0GF #pIw=@J,9L(%KUpHwY$8xk5f[Id$!p}cĄ$iBSpB֊?u2ȝvK>QMϣY9jzߣb.;ͽjB.CaYI2<#9%]5cq|ꚜ[c^0/ڇ4T =ُ]HJʩ-%V즼Rb m 0"J DԅQ&\9bf)li>8TESd,S;/5m,1 f^ `n HA =:7^h*f@ށXgx/;@Q#>˙=>8]]u`/OAOl|_ueI;PNWFkW' Mu9rp~8og-#? x2†`K0>]2## B:=4J]\U-COICsG( ,(ٰez?}rɗ(L[в X7MF>A#G0(a[pGĹRkvmA ć#_Sz0w^.u&[344,*'}JY|Pqfdp4}NIݼRnIx^g2z\lX^EmA'r\v؟E/5 ! O6"lWs_ERҗ'c ՚$uրܼinJ`YƷ5G< Y ~> @)5B 9^ :Xӭ;,\1sqyHO - S"KQz%!4px?4}H2Qߦ\ =ГS'GnOdn֓?,02P7M{qJ{G7&>H/bw]B\s:BjO鑬c7,c}8Fv%avX"6Q m9C8,j w՜Oa-?@S>=تz,&,O=el5,0#E!>!pEthuϡ($8r?gr;DK6D߂u}QiG'Qs lt^%$ cWљ%._[-n0 ^ͽ1y3ox?D19t^, ʂs!{D%/n3lGKdNuK^?vXb (o% Qߛg16_rmX3I}*8Lj-mu]?v wDnR'|Y/Q/C4C4C>x2'$`Xu3g}bASFXghۼY_ɮ\r(kI^pYb'8ߠJVlxa%04XL$0 tGPx]BJyH}Pt\,r)xB *s*B~IXt)w~΀ucjK^qqBY}m^tUZă[ZFH D$z %)5ֈ[ Bjo((;Ǜ#9c5O]t:-c3Y[Û3hK\]IG;&t4mu(,4eÏ LJȓ%Cˈ&fŠgHX@j boŢ%S9p_PY v+0Ҁ`Id)-ut \Oo@RalX2RZV磁"AJ9U7x0=t /sv ~*0|TPUb"}'0 jxAƜ5pBj+[Y,{i5 $dn5VAVXنy7  <>@Cs]$vDr5j`MR/4Iev"hZ63mz P)J8][,%0+yg+.\\҅7z7Ӎ+IPi:.sG0%Oe-D! ++E"*-Ű5ZJ૫ACx#tqB j鑕JD8;/ uY9rȦ硙FJ LęF{Iҙַb-Ot ܋3yʲXDs]e`q'R0q^NE^Ⱥ?W}R㸅2-"7{r _ $9"SXR'P S#xl.pDF)q6Crg!809 ;@Yf7s2he.92׭Q4[뱊2O"yb;̒~gg8BN,aJYuy\ >O{Ts B1RtvVߪTCca')?ԫdUyЎJF~=>w\Eۢl=3yvɏqߝ9b &I r S@?0d~Μ OfM@ ސ>BJ1~b*Nh!:g 00_7„C{x#AؓcD:pCSLP>܋8J SPn'閱_uPq:Jtc|̷wTPAJBQ wI >{.}U=`=w,n H*DvB[+,{h jPvjݱ{8-nB;-щ=(i MiVoj'Rs/ӵy.9ﳠjUBÝޘۖ襼VrsJ@B-َ-(N"`[&lr?1ⲣ FX>ҭ5dT9>tQ¬%TӥR.bὄB&qUӳT&0H;tg8AA͜Ȅ{0E[#(q[ݙ\h~bݯꏣt"nBTeEFQzԄ56^/Wn/4 ty5zWwH'XJ 2a;ݻDPe%6<2Sz":<@bS_@0t sbt4XLMJ&tR8n3Z80S$l8 wC(RRN?$9c#C؎2(<99g\!#x_j<KSbݴp/R*}1[(Qq߳YeXƹ"ъD (\PwD8VaFlhTn<on{8ϵ1 2? t8s"%q,__=64h %CK]{|EdB6&"\+ @ `"N D@"j#"f!QUY8F ~ $̀PbV1_XI:jN{r~9".֬Cp gSc/%ؔ݁@\ŀ~< fVdad.u=(J=,uPG§/(eY.mh#?TDfjc=#xWwbFi9qDߕ͚]aכwHe͟CcwViaiƂp2}Do뱞Whdt>GL̒1 ߎa' vpG/[2a~Q{4dzYt,]ފ ,^t5$=eD[\}O=1/gmh\ZC㘼܏ Q2k$H;:vc )ѵh%Wa3:Kځ(Nҵ}pIC˖dxC|%O Ӻ2Ir̅,%:Iœ7/=u0>_Ei]n"+'EDsOH tocd!n &kIX,8/Kֲ|yq3&\CeRi; ;=@3[cYWsT>'>|?̘ڊu!^T`%;;T1F`|5y|qIyƄ#7vШsYк/ +0Fi1iiSKԦ*kn^^ui_D?Dwo<9~yx5٪zrs^Dd*ڇS}y"Ml:՞6>3,+68ҙhSqSm| PNlhl15_v8᝘gpq6Ell~m|I1e//rb} x|ġζk$G hRXE>;'| S;ais}X@5;5oKCܬ;o}'ab rT88[j%XΟpo2C\+gRx`1Z<%CtO2]V쨁eZaR mbbG!WĢPkǡN T*-ut$;?a&cB ]̩7 #*kA)gu'>喋;7P;:NrW9õѰ ˈ ]Fqcsba.lN]⻧C 6 q'21Ⱥ#`TU̱ B7&[m F 8<Ay&;'<@sWZL(ϲ3Y/'ČVxR蔮Bg|?pC,o ,Q=N[S_.KP_l6E&6sn_.{]lga'퇒sBwcUx= E~!]'LfLa]=W}uI$<'֠i9w< e'{=4gdY09HL'H%n xLFv'!T>ܛ /nȺF6|͝!g6Q,X ;wL䒎YEmQR𛗄m>پt.<*mb*ϙspLK%;^|M/-:{rNœqCdz&#` vgqGt{~ȓ̂:K?iZ9,pBS622 >]Rx"3|FZ36~CzO 2'Tta^/`巚MH #}q.<𼲓vVocΏx|7ԏgv-Hr>lr^l5{q'Pw^́׼%F .$x"9g"w!8_^X 7zȻ h^YG~auPM4e>$B080}/2CG£(ݣw?0௮Aiv=f_gucf', n M9{0 '!wر';p#L[G\9Fz9WrdTIz뜖G*gH eW4QfbrIOuD3|f6 -L=k2yhaL&1&ۘ`CLn0ykϻIp٤? -N =mL@m>1ZO$r,LUJS|Xݴ:#RF~-|&;GA1wuj.y9 qSsZ{#`F5Ӹ px⿛9cL$bۋ&ޑc,e dz0Ni{9ȓc#q )Ml7ە2"W8ϱ"b1 z8ӈ bۇC9Ƈ1Ķmi-M1~>Klp܂\1lT Flb@9` .~pމm4etw݀rF!m쐶~sAgyk8og-' 9.YÙi9u[%_N+.)!$VIO[%"B"K4Kb ;!qq$ѼEr cC-푸D- B@M|k$H\,I|YfI⯛e ~WmnĒ&ńD!!1!d"gm$l$Ip ` ^KMHYa"1xKHE k$48Ql$FI"Q6WH|D"OH a$${@pvI|D ı ā Į 2 M_kL$#$F#$|=K"Pe"q|$zIn$q `!׷G"nH#$}H7Gp$-#pD:Ib:Ib:Iu2MvIl5H!$n%$:EZU+L$ީ$JUR@s .!vIx6H~D"!хM/5'lM{$m4^#I$HI^&qn7( =ĭn5 Ǧ ;az叭kQ{{"coZ[u}9Rw/_ ^pk^8&X1] ?[g1-0JZ L 8?ZԪG} 1E:j]/Nxw=dėme^)8rѮ_J$V[ד(Zbh8ʰZ8U R]WEPQ*9jxR}gj_M:8HU &ݔ*]JUa/6)S+Ό 9SP!gM/8'B&w0.riqr_tmfAKx9ڮ՗'s<L=4=mjλij^1*.Ųu XEKq SHh֊ }Ϣrqǖgb9F,H'*%]=F/ѹ(?͚ ֖p!gf&uMDSqdžL/lR[?@֋tGRNɁ}i˰*82iFK{ip.8;x|xˡ(~碀/g+=ʸnvn:^_ S9o ';c5Oc5=aVA1w>1)87]IvszvǸKgƵ=,3_A0l( َ|-l Fx'k 6f7^3`[ˋSП;+!|]j!QȯAV!cFq(@!G Y(,!Y#n!IB~ı! Y#B-dz y9υ~P L8JL3c2@˴ ]\K^,+߯{Jm#QQE.gk*Z|jcxHA[_јP-ڴ"E" 4T TRĂj*ZZU[vw6$L;{vfCo#`SDW%:xO($\毝ٱŸδo1J;؉ EN5Qqpl盇&.3m#& 7/ׅm!UۣfD{d1]x&QwoI_(w#`IX,;RǞrлN({NkRETGO چ#Q;"~{;(Ưto7|`x֯R)j8.#l tܨ h9([v493ӿ9,k̦{]RT?v%l eRi0̇^Y?,8aFۅOmJ/6}$g*')i=D7{i[ӮT4?@3A]K5;mD0nvϼ)uߊR5xeD/&&>mRje]7[oiwLg=䓊*l_=g[6!z$?{p+x&ߕ]oI}'8`Qaږĺ{[s당C]U>BW8׿^sOˮԯY!n%kO(ZeҳLW+}˸ǶM[ׇ{!~A'G6_N|W-m%cٸ!%:=9jΙk1U}'eHwRS}n(;?ht{7:D ۮ6XXdʮ3u^[草y #vs-Nv|#g퟿y3>GQG]hMqN[ݶ)qN}07q/m^:rn6jvsaGjua%qW|sv\ p5)wTI`}–2ozgF9´VCg<FuϥnyNw$nTx̄91wf _&;hC+s6y}wjxBgS«KRҕ{ߵ;9o //'I>H uǥ̛#ܧ@'}\ wy?tgtsCΈ{sO ׻>YWm̽o5l/6=1.={Sb ;FWxXx KYz$?4j9a `zl×hsn/O՟]j$XO,^Ҷ!J@z (ޢx=xG/fx|t:šx-㟞ޅq(qxXrrca\pǓڿr+ ?;4Y9|ؒLՔKR%>=:YJXexvϙ`H3P}@&9u^O lBz`zzHR:3:6 K]ڈs6"0=K#zabSmm!4 H+)gԫSh=w)`zFR,܁ܸT|)(޼o] L/4pd}2?2a\%Kr@n*ck0N䒓m6oc780ɀ/S@=Y^YȈg` Ɂ?rg`:Lk kG=,(g=~;|J\(:%w |5coa\  @pvX-UG[ajIąD$qs:BkAϱP8y5S}MǫgS*WRJTZ88È ;r2YsS"q =~q/o,A> ȵq@N €'}09r6@ȩa )\(֫< ̀\^'r@r@c7+r@¸h gY.$+W ѾS>>ް]Bz%yΒlh?ωr}\z_%אᳵ'$|Q lq5@.9 g䚲`\9w gmq@.9+ `3\2 ،_Wqj_lgY6k9R?z霖#?y ޅ-~?ƵfCh_?"B)0^O~^?OǟCK]Ijt$ٔQ,)/Td[b α=5 ` A  Ї9KbZ-uBZ|WE'-5/R7_/zq^Y?x"􃡫!z-Ot'nn} 4݇K][RWvRۚDq$_srܒޞtMR~m\W=߾4G˯]Qʗ.zAF:stUj]CZ'Zp^Ʀt+L{; ry6P\;=~N!~:5Ew}xc믃ҙmW!ݍp}+ߔAhx믣8k\2a34yǏswhymcido6͗_ ^&:[xgfIƳorUAߡ`}պRt[#ӏ=B~○ۚٹ_]}ʼn_׿Ş֮CL{G3-Aj {ѳwiD睷шED7&? Ts3VDtBxvn^BzLz`dx0fhķוĺhˍӼ[x_ ҥ48o9&!O#-f?G&>rx*x>1)*sc!S9A1zdFH:Bz!BbQ_ ӝExwGh:ѵ#.+V:l|v/ϖ3cq؏G¹#9il?ü| ޺J:cw~興I^  Z) i^{|J/~U/<؇AW:"/^v6vk'Q~\)+?^AֈȬn')]vC]c-i;??Kd gfx{rz=Q>Pd{I?V њ:oH?}}Oi{Y[a8|Ы4^9g~0hGM: 1Z9ӡt*Tqet|B@ 9gCEH/n1H;?1mIΔWW"~}$yo2]GUN侀LoW֦gFnu^#I^{dzQN*syc~Z8#?>ty]F; VOqW@N]g6h%}p~u s]!v}k_],a/{m} |kQNoRQ닋u}\!珹GCz&7 KW]}~]s)1N4X; z!f Q)Ι7I94=]yX_/4NGzj'N< \~W}yAn:#6DGzA=1ތ^=+ .54CewpneLԯHDONk=$ Y2f"1y~}4bhqc9f8CĈwg /1|?yngG O![3ϐGQ4Й @y"Atߙ QOl<j; }_+)_[_2|b%jhӺ'9K~ D Q3G8U3m)_~ oT?P |:׌kח1|j"Ybh'6b^Ӳ8{f̧>K(w66c|t})S_1Qv*zj!vL lt[m#‘zVo2 %,121'e|Mo>G9CAϪie ?NxEȯd )OyRZoiyg gr"'^Mj^Hu9r}}ryc>>筡^y^C~T!蠿 Uy 8: A\TZR:CsB\%蜯a$W3`_)VR7Uz~U!y p<fCzڃْE<7SX~z};HlA㳾W yjC^JUekfuQnM:]]v2&ؤS-?'g||ҹ([~oI/쳵Vg"}:߄q0v>sbx| gQu%b+wx;xNOy]a]Ts^Ri|K~R[Üs&r9277M7^ݠ.?{D%?tWyQfꨦc=3{|3 ;7q)l2A0eh2q_jt v4e 7s~5D~٪i OOo}?I_B/P/tY nl9Kz? }ɗ8: ŗ~j:u70ς=oۦw|S^m$A*mK8ٮg>f:+_;So?(SS;"zxơO͝|S@g"̽_Cyx.z.Uw.%v隌ɢ] Tl>BY!0{EI_Cy¸S$k o,s(Oޣ8(<(^?W[z_u %}_e%'g_Ӵ=|BkoΞ@y~ Q{n+&"+1`@H_O%ߗ{⾪O?{FlϿk5} /?OV_%eC|B^FH^+8_KyPڝO}unӟ8 pB@q>'^e?Qx#~O I]G}O4u<j=2ԇ|Gd"0B_;~A[Qt0~t`R!tr>:_C~ݬMrr%OmK!#5ߧ.@]œLT#7@f߿~Hd$X p~KʣWaw~tܥr | :1ȝ9%|Rzx5IcT)OSYߧ)H?x [z<Otpb[z{jo'|o])Ly|\{5;x y<1^̓3+<)̘?%M"cʻRߗ6,-{)i+oύUg3⋍ؒɿ5<r֏[CC#Csr59fL~x%#0%Z۷N<4hsEtN+tx^]o|%QgA]T(xd-7BsM^`R[)CD_T>~u{CЙ. d }-69A|ĆN^-g5!CK] tTUtB' Jf4HqOB4̮?Y'3h.bDWUYLpv{Lvculٺ]ׯ{/7pWuk&Pюe]p^ó`!^ydV7AC&hs/Z^w 㔞z}9SDHWlE]]="M&E&ygs3u9}jC[ꯋjAzQ9qZ%G9j>r &5=}TOޙC)so6GM]粱OETׇ6yIY=rL\ئK2vTdY:.]5vu#K10+u~w1a0v2ċVwZᲩ?ΦNf"_U 4\.ȜtI=tF=oYt#oC/:q궉S }EũvQ#H:[UBIuDW\nq3OA֖[MJۺ( TՃsjqඉmױ&eDtI#5M~>YHV.э9Lˤ+f|im5h(~ q}]DR}\>y:@mX3PS$yyIo_koYbSW. 9ExտP?S=fq"]ݤW`u^PKlA;PMߢX{FW'=;Jwezlbmh{- ZۡنOa_QJW6~ OMƛօ #{:zR?ѥ zDsd?ŧOE{ƞߧ:zH.ɟ2y?O5 yɼO|~A˫EZs()]gUϵa 14ޣe*lJpն:_]YUDXnOްƛk)T jz}٦j6gd:qXc(ج犀ZG[7Y&7lHĥKߋ~[I6Y+J{bK#:~~hVu|jVXg;Q*[o׍9>VX/V6*ossinC#j&&!Pm.O5٦GWY_7g*9NBQ۳ܙX/VPg1.=j=2)S>Zk~_ָn/[zݐSE}yW7=٬t A ~!ZKoE 9!/o4>':yKGos_ȗsylڱڟ1]M>`CP-Sg>0֕ҕ]~ulwZtH< z7ROXA)QwO7I:w\}72ܟA mRKTl2sKs⢍iPkɚ.mݥ`?IA=.rlEAӹ^qO;'_0ɽ .M5yOjPoMͳiWGտAh{6so_n+j3o&:7ɣR|. Qjny|B9)U}zJ}"~s+MpCo&/_4h.@c&qcTFHG5Oqof{bcG _~wL:_A +bBdʹ{z˱#IM} )u s':6Ne5f6ڜ mrqNٶl6_Okl/:6fO?\I |[_R\ Tuk'=kbs |{,bv+OR{-"X烂{{.1Vú#=CO4mzic#CknUl}OPSsUv1mB&"| W(lդs,bT+c {][ӕuY}&h?"?x"o_T[6mhk'__$Y37UU}S3M8o!޴>N'?S8)D-?to#aN 6l<x0x0NhAlgϮx`|Fww<>iX⽳;mߵ?\^{0~Σ^9v?~)TĀ^b>'޴,Ȣϳ{,ꧬqws^G.cn1x (pnĞ~g6zvk燲W\|v\ c!^/%Cz ҆1/>kfg9ɧ.A+NIܑS%tNom^ &#Q!zL+A\fg>Ite:{Op ]`Ys#`~zY|;`vJ=t+&lB6nIɺA9xǡ['BW*)c"VeG-ė:C{)ߘz\x1pI|^×̳iN7Bs:7swc_)t+t̃%б:VANSa|5xB<:> CA (t:tj:J}xnEbu,|;]J:Bga`kY139_:Y 7N3nFC+ȻlL*.ax$?zn?zƟ? Y~ ?oxG ^^>{RyƼ[@; 6v6& 76G[[0hΛwͩmxݜ:nĻ|G5TWqv>GuJJ Wb|IZ9GR3%ɟy5GK%Ƴ8`0_'¯p}.zmh&hbmAfڶ"moö[ضdD/@c'; פTۊ !lb>o M6xc@?Nm Nb9Ϙ& !9匞i?yZ  >j^;lW:†. ? A:1 }Qg/gbOmC3ɺ. k-l?%pl6nU9 AꥷptX lh {,l=lClE33әOg9'LOAꥯU-wI-,-bDH18G\?BM.AI1ԲC Xd%v$={?#3ȐWm_s}fӼ oC5!dwοL_L6TlS>L Qܑ.f; 19S\؋pQE!"mP1+3:3Ĕhk-r}~bp?_) ¨ 4s_:9/2mižި#|$kKG7p.*OgOzr w6q.ĜlYZv1ZCoB0s,5ΩkkQw|j|俁/SqRW,̡ks+נ\癛?kkd*ЍA>-[; -УcBpsV$؝.-k&(~ &bg߱sK<(~ӡ녘+z=5qM [bWʱ[gz"1 |+A9,1<z B.5%oM x]"37K -w1w].r lFƧnľ=A]Q q#+e:Sn{Ee.ZOPmU ](?f09T֍M>k]fElM݈gԳ_uC[$ht6t;]O+t纡kA󚮏BG+CT]#BQ~*YױjC"8wy |,t+)tt~z7Yb? x1ک,g GwwGanC7~fe^{gCnznZtk ֜v8CFmR> 1n,Ǹ~/8W^h/c <˚uB-dA{Ā wDz&D A&{x'(!kjY?>:},m-j~,10Ύc,1Cq C}Ȳ?!zCNb}}OC'ղZHaܧXքS<Ų}ylTƽ{>!H@` AIYD BĐ(I!<ͦ`B- mY)iM..1KA1ISpw0w{1}}sf޽n1jpZ'TsBV^7jڝjH?U^PZy56qzju#j{~Vך1jZޗ@wRR:՚_g^?ױSfzՊr¨5k})tXjo0ɨ5kT(Tj]BSkXy-Qkiy5p#{F ,qR>e|Gq}{e #_}y}WawtWf֓߃ķ4)oob߰ӷ!1L|/v[t7"w&b㳈|}{* 2yzN|x[g>`/"߂oCOso쇜'3Y _%&|SyK~#M|E| Mΰwėe߳3HoW8o_AEE:+iMAħG>u9߂/J-Z4n!z5:EvhߩEw|@UBof+ Y+Uߪ> [5?[+g/FteQɹXp]Ƙ~|m;<?N,k_ܹ^k7mGgTkI8lkĵ]&vh8k:|>܀mp}P$'!nvx$>C~21Bwo8ĵﳞwHuqH=z]!7W':S}uJOTY3S\,rk|s9rǘ_n{'1z;kpͧ1ɺcab-um])sg2K}9aݪ?[}S7e`rM&\˽p=.'%d q"גs 851Y\s}}uv)nӝ7NuJtSNq=.r*wh=godq]9p]ǘ-[>< ˉW;*Φ' `jíq^鉽:=W%⚋ҫ^y{I\Lx:\S4&:ŝϰqKϟO Ox;qa\u=osYdDWB#n0k7 _8_50\&_eD׌G|5}G:LVp _3fg?>,&~C \Êݹ6µm~'=uF?qVo=~_\ U׼F7/\}ɘ|Ƥ9*_SSsM+qvqH к'Cb} q=6@\[Ж@q(\O 9@dMn0kIqcsnEM~&O&.O5;4H6s,qlD.AZj^@WZT"];,D}d\p-u\?e~|N Fx.$.&.1/;Ugݹ~2zZБC"g#aNm}#Zf6}uH(՟%FiQ#k (/\O1Ɯ"ܮ=ĠL\/s _z.oX_86Z\?-Wŵ qyǨW?35.ӓ2Nď~|^L$C~-Ɲ.fFֳ}}:F#]16&/٤5mM\w4¦lئycL 2/\wõ1\[<d)Fey;'EO>#V>+Ɗ[]\ۥu:.[vq]^c|]6ՇϾ߁Y|'^t$3nYM|f_y^&&CK] XUն 썼%>2|DHJZ]z#:7I hDeeeH]3+M+TfNJ{(}ǺuڽNԶ);}[1s9s5:ӯ{[;u%ꈆD>E|<(wu4*~$~kp _Ϗ_'c'c1c%}~}Շ_:< }}c-D.;(WCf?Pnޟ - rO,r5"7ܻ>ƉgC.)[.]IO2r6G&m!~Yd\|oWEnPԇ\Րr|^ -+rHr%>bEn./R rMRǤ\D\&DM!B*Ir$$ĉUɈW2'9[OQ=iWO$uO豥 =R=K{q8zzV7xz{QgE?=sp>4|9v}M~jy?AOdww4X,@k E,q_J} B?Iy"HQGd%W:\!W_ܾ/$?+N&{)%7O\ԹR%?bҹ}.!.Wo <ަ3Z>ql/#0i*);;!]U3ǔ!2^ 6-w%Lp r8><Hի"ȑ{$?j%} "-(xI"@ӗ@~YcE+GA~=T9G)2]Y<^m> "wBK(TxMt8먡z"ȯ+Bĝ=T0c?>WhL7cǰ'K!p?zJ{OnzIdI/d2A*:xhu% NmiBsXɘ|Bo;`@7d`Yhn Uy} QއY IB+y%{q \:{uYvllrt6G[( ql\OzR>s -S!9ԻPOT!9/g7A̟_6ӮO\K}Ϭ[Ja)xA*<ƚ^meDXqK캗/VѶ7ayc]^ U1ՠ] jǗI3G|k[ ? %{+%}1~#v}Gn?oW>k|s%}|%}- {|E;}c!7}֣!owH渠-܏~ QM:rq{P)qVM}vq>/PU L󟈛7;0MK|%q P%E܄ L7;|q~*P& (3|-帉0CY@܄ ;Vp,cB 1>8$P_>Bz"F/¸"~ً#I~EHm_>Y+P^Oz@H? Paz?1Z2"P_E:[G2N!M +Pɾ/:^tA#PQыɁ*<+Rxxux)b&VgQMC)b!l؄ 7 lb Xx ߝX8H܄G!]eTbaqq!JʅXXF܄ϻ ۉp qB,$Mg, ,f,fY uu|0MuuϮC,qyYbe!cdmS c-ϫ9_{1e|G޽eyelf =̻m>ʨi|'3ˠ2.]vc|pePA_Mp.cԗlwIs+|>~].@[Jʎ~!ytke:.O){X5<i4xF%r9k@/]5*O~VcVZ-Buzю2{%gw iӱ^=cy u뀗/]wCY?r=ҟk _ /=EOgf|'uc13_7~a T-p9Q> |_ċ܀{ֺ x~O#5Fq|Gt?3]FAFBCIm`6x>zYh=}X#t4qE.6֨M7?m૪M(&⯑g6 ߿81@^|eVⷽ[J ->7{}m /}ΰG9lG6ONA 6:|ظenl`GiͰ`39!~5m6NaX7t&+0 3=nVCkBs7ۭMfF)O-eXއ#\Ip ;~Nxe&`f>O{ m-ن 6N`bKvp~j>-I6T"#TmĞ|sw1zr*H%l6.o<-A hwd[D匲Т2}|~&D, n[gC\ pvc0{7#?;!~v'%GMR\>ק؇?rf;3aL}mGL;zia0XW7`0oCO􄱿 ȯ? %ħp#]8퉐ߦf<b>=gA@am^^B|84N'*uO;.cfq}Z`#?d/w$ڍseܚ(sD/'fybQmN}QQPxn~g2*(ВQ'D1mwYm͌-{K^ ƳpS+0:§ sdKmg?I<$t +8V˥WmvOgqt'z6k9>_oK$yIW犱|l%$LP1e$ΘPO ȞWV ͍5<(7ĞߓvH_ZԘ1ωs[`ӄ=S^_coEqңzA.MrLYߏЯ%ks ^#wҞdX/U,N#5Cc=Mg醘 -!s4pY|^IC &>?7!xzsKp }qeҮl[;6z/z&>1~7>)*B|'h7] @494CNeCz1?kh͵M&3(Q@GEݔcU92e>9{qr" 4%k@)em5>#q(xfbߝ<2 ~J&~gG{]%cW9ֿ? O#^F{>~bЅv˳ܕǸꚽ]kw' k?z~j^j^:?VͿ6[[oTֳڜcNb~d`U92 *t*Uﳨ2Hjʿۢ﷨qr>hQXTzE/h1eͳ(cpZj,j\XT\qﵨr k/YTC|Ta[-Cү;G*;q kXw{jDO? e7R2!gC^L5N^K{E7\+d.)r&~_bKr\zlK&ج#OSEv\,x3[wVb^K3;w?/O99gΜ3gM rDiJ,gY-XJ]23$B &8?]B^[#iaN#pۇߡL@7A5ŷsw[wŷwh7P[J@jÝN7f~mύ,xW%12 ὯV|+XH]\[ǻX)}o&---C..-u.5. .-g~ uwX.d9rܼ;k;'/΂L8W.֋ 8/L8.΋⽉xG#f^q=Sd17}lw x}R%84:%m1V"2A!'\B#_%'*XCCv[B"[Ƀ%꒭ D$O%ȅ')0v,9d _ ɒS%c!w[)8n]YvddN oY`%W+di ">[|dy] H|ryz-r'y\x 9n8 ?$G1gYqd;y]A #Yס`$'wP0Q8۸},qDZ8Kq.A#Ќb{q).XhGDDczч~ `W`(0 W؈P ida3&1d1 &r``sC؊?ć6p#n܌| 'I| Oi)>?g>_6|؎/vN.܅/n5Wqc{q~-{<^|oa|w=~'C?c?c<3x?s)<gxE¿x ?_Ư:~7[ϤӦ7557^źKz>gci-g̪fӚF;W+mK7&i:鴖'4C2~npcBIwMX=ґMM4[ͨnYM̈~k@_d$%tLƤU[)"zȪ|iiz֬[< -Mtz>m/ND[QL{c뾫]uof^-=ӫTlBF{b㺑1n?*tF væǰm';5g֤3vՋn>QߡjSMH|dLide5Q;ldkf|Όt=)j`ʁZG mpJk-G<ܥaNf k֌i 6>xr o*!בtMvɴM6mZs r3fHt.Q$FAS7l.X]cbPrjkSnZO{}ZFW8v8+| |iq*h]Z_uLh*35V3S柇Wq4&v{D3ܤTiu,mV]ƽ6gMniJ+K\Z(){IM]Ť,Ť SimUI^笻V㭧VnC)_^3d-ӋOE$ %Og9ߵI1=j7MZ- 9.ZmY֋c( C<iנ/ _]u `dxV48ffZIM\|MoHmh\MiXe]Rԉ³PMY]M\:i%D(ZZ,$ijuS`6Gy\/tp(/ߌP8'bS1 5ug9fx_bmh1NCݔպԴ@CMOi݀AixYCp); ۚKFh:vTZDnHWʢ"p}f5 3XL*ߔUCUqZ=D3jfYdU|cȆqPC+BE4kY`ݜVY`z7Xi-̌\-oЛF-;p6uz*PۚwkjMjvܲԹ›kMͯGL/]SAL{ lɄl*!g-j*_ͩr7jыٕuSSoވO[طi1gf"4>Ӗ77nM wR:Sy,m`8s(xcgQT̢c%|ˍ?IiTSn!HNT5jEoDQFԨVo"56AEޛOd!jÅUF7 תzj|C?yLs~:m8QD)DNpzYwZ%t≕L3.̊o5JSݣ=(T=6ISIFm6pJ55t!4hs-G[f(Gږ/T^x*4|F@݀ P)S.SnEWZ(6uΧGiYH}TYH7=ɪ݋- 5uK=^cJT}9Q@Ax-3۞`ŏڌxCI%Dx'=E[sVXt ?SnPf4ˎEdv}1-dW`e%ANPz1\XIqLz'4TQvtzNjEz^9X繜Fi[CE޽̛-SRQײRBerx.nGf}ovm=f?YӺ+SqGX߃"nX3bʮaaRu[baSWX.WŒ|W.0_=&YTxha!V@5MA&*8f9XaE0% yRg^Y`ΩzaЄ9PEX(r+qK^OP {U֩.(]h(oFԼ].{)bFfUkn@U]3  Fَs-UA@1kw+ͻ04bz^?\Yvű`/Oüy ?0]s5H1T<g3M| R:| 0X_r eߣZi6|RA}Y]g 2,\|tZݢlN)>Eߍ]uW3ӖJi-Dp,_/; @qRF |7_]M6𾉂2oޖCD^O&uGJ%/N/9{.y*qR}I{lhTŸ zVB}I ; #4ސ>9eG|[WѲy"Xiv+/LGW%%+o t}~j׮׉2`0 x x{SnC[L!ϕ#U%hR}jcO R?\v:-k0t>JfB7s$rF%'OQ8z8I}᳢ Q)ǒT^Tףk)pRl`ڣyGo󹇍)ңTDb$AeJU,Snۖ?8 p+,4;sGo0hqvz轤ےw=|뼯/8z& 1ꩳKnot8P,F]ӈ#mw]dIG_>,9y߃ⲑ9q@~?RjՖ|΋J aexh!?24D#f #?dHa˃')jGK#L*Tݢ\~`t88O=[r)I (dh&u4(tdRMWPtaN)TSzhv=AHQRcÅO;,?Hktjd8&ɑr?>+x)SxJug0$vD+}6Ѥ30yGߠ??22r̰avQ{r%!O`e*=$PGbC01V~Q_'wQP 6޶;x!*gwzQQ:\H|(df'rU HDD0=Qb΂f`z6[3υCpHI]PJÊBhx=?JI=rkRNQ){8G(J+2(qOZBZG]=v9:|lp$V>$F 8{cǘ+歯wդaD-܆,W=G/PY0OΌ.QJ(KJ:FM6VSɧhl(!/(p)~CA1H8x8lMOb맆Cla;=|h˨Q0I4Q1}Xxf) 't}ށBLgT<0%D*oř]e*d'z1|jZ[f*V2ň2 #o׾djA s5?c?J}WuWۺ`13X8 7:1?>`g> 15~%3['0yA#b8!Vuk>4/~-b pp0}x`<pЅy̛rp9 _q gZ56X߁7_=s*|OVc1^ v]/'78Wk0c6W&<_i6>,ӜZyѥLx6i*ӜWgʊ#lHwfF瑩.״y0gl_@V&^6>sL>W1!O3⻻ aI/U|iż|1}gL?f;ظ]VYARuJ37֞3 6MϪC:cZ~Get+lx9y~>]n;a+Iπ|Jt_f7->olϳurN1{-stz|ZNBO{֥{]x?alc^Gooi6 x^jAϺ]s>6PFbeAϽ_b87SZMg屏_&Ww3Ww4*m5li>~|h'믁/vNZu-yqTa.W89% y_y,vgf\b<;ԯn_{r.[:cf^9q*Clcy)y%<[mҹJg&&#gl|&Z@O-xGӷf&q]zKv3}VqF3?ីrj~\)6oWGA VX',v"셯I)6G|:=/R]N|oq܂8~)>Ѯbx5Ze CǞNz|oqAu ?*s&a=N7ɻ~ر^VU{ucjugfj:u?C<q xַjB\cԉ~\ I6_G]װ N+ N ht)oGg]L̋i Ӡôco7xO\okd>߿#P"蓌`7b&j\ko,b|}?voq| NX?: 4jVC-I֬qħw!ȫ8Rgx_;؏C>֊85#_1+RxY8Z|ַG!_硧g~=ym{x=J}?(ֻq*Z@(!'_jGk^N+v?S d3XW|ZX1A{@ǥWAmɣq`L8l{-wY{W mnqOgA_kvj?XG>Y^ /';q TxKqL5SKg%!uM½o ,~>v!gvϬW, HIQgt)+ߑ?۵||u=cX^cjޏӟ i'þyu?ޡW{akuD] y`Kr/Noߨ[9i굨OǾ,B#7xܟ.7+ IAEt dKx/tHO9t>O c_ `A./ k\uR'}~4ԡbUUz/i}|7s> c5bf묞TP74^fnE@,C// 2-bTS:N\ȃk%4]CNS'iIè˒y9#r=@c.iwߺN=ɆK[;t RBn'u /[$O:um+ǑwtE_ו6|&G{ȃt!o߫L؟Ba]NIt7{?%'u}LuSEӏ¹\]цseBԭy?"U.g\\>Ն|.@}+:_X*qy}b|Ǭ8>d? 5\ʂ_{gx}+iP_zv:st`zdcCE K\~uw*GI>}-u_eD~i9}S:)uE=yf1]s ׯ8sCo|OB&]t얌+Qfzm냩E+ub8W#5 nY5/C^v!hS%&~1X?V'r݋{ޮ y7_g}O)?A:gbσ^Zl!oQ өuV^ÈVwX&+w=byOh9zUH7#֫V w_ow%o<-#nTr2?٠w>ԫ|~\|Ṁ9WqVˇyψ)GRܟJ#_"4AO;. N՜7msv5=g~' ;.NNdZ$''~s{U\?2~yr{SUΏw'{x߀vpz}65g|^9ڹ0BSg♃'S:s}vY5?+7{qpz}X:4+GoC3Xg8߻U?QߙN ԩ~aHus_ c!B>\{} AW@+ 0@]'? WW+_^10N1.З>OGqcA/S.fr3x[g*kvfǮAG:bPxHwU*P{6#roz }kZ2zı^;=+w)\^9|j_n]kpf{)p<Žr/!O.>[%Jʥ[st&SK4g39Xw8su%#,'K׊ˇ9X}+_\%C[Pw1\>2.q.Wx\qI9(/ι^BOLJʷ\,wOSvx=>9~mp8~r'/kゖ^ր* 9zyz*!s$ZUpHyS?[HN%9W+!9ܼUn)ؿi1tOkWFۦ -T=X4Hx+B#AZdm6^괩dVjBPHDP(!U{ !zȡ<$X>̼7y.h >MoFwD܇#^Pgxr E>AgPfg}[qLb>OcOhWX3 &1jD/kQ2mK{S zG̣3=WדNk_5c﴿Yl_Ηz4 #ê6c[9-wrs| Ox@s< à9 [?9[cGט?bˠc+L_o[(hx25@sǷv~_p.5[߯gWq(\O^;~ p}}7cxЏ"AX25fZaT*di!)zU4v֡6Vͺ7$Y?+S%CK \UC]+25#m ]&#BNaKFwp3]KE-)kRaR^33?x] ̏}:0>;xΟ 62[ ]fﯞtN3Sv=cAϋLM4sC4:MN KꬎmdztzJ}:;sS L6{bSL 9Ȕ߿^L>Syxx篞lw/vSϹ'R$gs<\3<S? yL3a͍;쉙.ӧf:Ntcd9sh'/)1a^FDIE޷8\]Z %8-Sj3hb}x?r vC[V=鴶!,ΑmgO}=e37Rfm&o}VkVb̚I_{J>NJuϟ&7z| |J&a>|׿ϙb=۹z+&փ.\b}-S2xx56A7.ĨXmKes8<`3o~>|Di%= }ggRrSwTZo '?/=9˻pe~:ϩ_n8[+9d|Lk2{HoE)_Q=jx^͚hϲ;3| ?{ROS_[|;&s^ z?3%Krnr9&ز'a<<#'gIew}bw8}(dP^i' ze&s~S쮌i hrbʜ 1,򪉖N[&7f-Ӿ'giމ$IzXH3#sgͷ`]r3|{%ϿO_z<ԥ̖姿#;^>OzY63ux9qfIK?˱9]YnʘJwax~:o?Y|CPgדZ J嫝1&\Qlivokx|N%)1ޑ6ם"lCdޭ8 `U$]8b!j K؍n{*08_EKe"ދB@)" l[?Һ^r¹ #F8 v3XeX-B>UK}T$}}T]侔!Q,]lnQD~ҁ5@vt́DZC:ކE VnWX3=Hy#ҏ wpwʧvwȃ`FE~䵒j HF<{mX=n*DH!e!,] GEQ~t4|C#it\?dt(!Ul# M(4A,- tZ bmJ, ]#D":ЩcW}G`(9/ |+AWϰ58Nuo ̽^h-V.o: fcEŌ2XĒ6D" '-9 } Hh8Q b9$/D:F!V'0p@}qԸrL߱%S'+-l B›wd} p=E#iNO[ ۈ^ 'uA k=s*M'.ZKֺQFxt"-Y%QR,xHgmAK.h6-&h-C3lf%7ZDK`@KcK 73h:lZ26-Y5%Q ,`N>zbIO]EbÝ՚竸yP+eާ3RZ/yX =;y+u^JW!yyt^W Zbeu^pg D=zѵ:u _+SžSʿ ^ORpLO>i} Ww[7(g:>vs%dbk%Z2 ֦aђ!_v%W`3np ^ +!Ћ`WyxGt kGJMpv ?ƚЍo(fdFiG': upBT6]:?o)-yǧl/&|81/[p'}E4XDVC (z2uXD+7ǟgaQ6hy:<l U ZwXs 799[DR5$"b=nOK-bF!\kJ]?y_YD8: ޏ% >,<;"jKX ^uEm?`| }.l+z܅5>ѭ "ymlfՒYD>50 PZh|Ra.Y2Pi0+_%#TZVkɌA 0(\iZK02bCT#D2֫3 ]9Tj-2MXNpHEG/:bu6x ej$}.cFYD:M\t܃5hڭH!n]%:y\1YD2:"X z7 t5̊e޽˜pVE`8JYk{1lߣթt"|w Ev ܏{} ciR/NSu,`ZqӕO|+ ϡhɣnoETo* nֺnmpP*sLRm2e[4˱{Sx8" p"IpS-O;UphjHx__r)jx#iWz\u1ܡu- ^&yKZ7` Ŀc|G.xt4{E,Bb[`"U6 ,ps݌mtl_l{ 7ܣZJLMa{hz7DL֍k._i',U:>uܫuQA6}W0,Cn¢nׯdcr]wb[ug!c oЩ,t-pԃ|+AWØU3dl+_(&ߏI>*Q~uSrcm7܌{t%-b̋e>U^5-~ +>ke?CÐrʉ| 9H/Uv8`1p3Ot^%Yh6a#lܨ[`&h_rVpH޹,z&}Xs nbXbM9lc-.{Iwa9ajq#fѕUZvo+Ƀ;neW>.tLlPk>Qۯt =ґ\[hVi6*˭*UxLV/g(dαr&½Xt:vL{<{<1ViX)#m bnP7JKހtW#Zn!Vypg%Ͻ*6﷗ޝ䀟{XE!>CHP>Khk]Dړv#*x\ c=В})G柱o(guw\pu?N1RW{FtѤO\M[zX1F[e |ogʫŨu#>pu*zo\K|`CJG2rλ%E "VK܄c-UZ bbU2pDUR7Ax;`DW}XԿn~;I6Y$%~m=2h\=B(D%XFp P;PVH F`F|nggʪFmq^߁{"d-K`~3EfM0y)߆`RdFHam6¦/ /QZ\,qfաF(> 3`z>`~*@vXm:F)daWPo*E~)_ȵ,)[p?,فI0U"VBl4XON],$Kgy ` ^`57.^=׳^ Y^w2z8j^6^ü^-B2%J^/3^ `nkFu6)^oM ^>lgy;x.x`r'`+,8`qh9m-eέ><;x%>o*a .1<9v|-^wx=uԭ`5].<1`q`7aQ|ทׂZb^?x9*e4ǥL{G7ۼ9d}Fks3ok7d=[ֳon3 1^y[0<s*3#nn)8-j*pgrc z%ăq;R^V8s\be3?K~jc!~6cEf*=,p6wܻE$}W_k mJ:NLd \H%װgIdϝ{g=e'C09xYob')|*GD# WDD34`Q3F=c`13aX&D(cL'`$bUlXVUn Ҫ֪j+ceakƬqk5a&)+m&mMaST6Mct6`3L6bcl-lآ-n%l]-e#v]bev+JʮkZήFn[쌝˞LL8C 2CC9Ø8XGqD1GH8IGAb)uʜr'T8NS8NS48N8' ;#Ψ3;; g3L9K쒸.K] ҥr]֥s]er]b]aWu\qW+r%])q-sݴ[VUn[ֺun6Mnfܬ;쎸;t'];&RVYUJVŪY eu5FĚY ˰,f#lqM]lM#HO!iD1Fk}:g}&g1>E|Q_u._җ/K2O~_W5~_ ~7-~?NOS~$i@" & !` %@8 D@<H@*@$( ʂ TAUPA]P4AS  #h0;`W0LIH!YHC2 C6 C1d CbCP$ BPg( %Cj^D\uaČ="+ԁ::Sz/0=uԁ_|H'SzOjW}Kҹe>\s9e<\se:\s9e8\v먈{u,G暑dtȐK&MҩB>)mF,*H!XD>Af`]XX@`e|p#߅xH o\ W" Ø&h2ds J#.1y@#͈i5!> %fxIhz<(%B$!"5w|XóF* L G)F5P"  ^0"r A b$ED%Xk#ŚqWBzx:a6QŨtzԴCzeƵT=ppu,*8ΛF1DѰeYz<bJ$6 zVvZ=[xź3bj9B}8E(K o"^#{ D2@Lo\v?݇Mh$]'"{׹| o}}Lt51P qߒ,/V\z#'&֤gDί*ʣvy jW[[R$szW66,kmi(*rG&[3h0={ʓ>ª2Itb.-.**.)%8pi~p׿df9t_yYsԕE2-6ٔUO+J KhŸ)S+E衙+x+jl[\H \aAla@@\{\1{M/_.{SB̆{-5-/K8G?aC蹍^-^o8SuE]PwGwt[G˵u;S(sÖqK6?:|Y^5qûKJQg-8ყs0}o-O ?~e c6YVs{ݴp}&|2E^=U#ط%'_uG育ʣSwk&MNU},&\Q:jZ;rvM<C7 I|uCKSgQ^\}qkcwq f3i̝͓u+WǏS߶tK4uf}[kê+r&9[ ͤӪKpk֬mt7a~t.) IqQ9p#+y+#c;>.h|s7/~XqG 7 #W$[ox9ʒ އ}K6Vn*,|1 1Ꚓ?sӮt<9l^_[x{#'2]ؗc48g-yzZ{0g⨛s:p钗WO6;S'=S=Wm~ߐDBCv|r'?,oOV ~ᮾ9up]ή#ףF;zY _LYS2_R,҃3I74ʪkA?+d(cv7_297+TcguS)x &:^_:ydDx_Zw,o)<*yWo]鍛ny\pq#*/mޚU[+gYr,|I׈o\oH_ klzhÜ7[l'R=c?޶3S@ЍzX-@OsTHZݵuwɬ,? .(p@=('{(f Rb0 fEaٿBJOsj>#|yiWk.)HF%CidFk x E1m:hikx`g <ި_k5Wz[^*5LSeF0/EЫb^fɯtxC9ΛkW d7zR2) tyrp2ՖʆIv"Űk!81a4ulfzהfJp>(#z̢gn+wJeU_4ϧ̊i'a$Xk ΢F >Dt ~C_"!Xc`"0 : !a`5@#SΝ*H> 0I<4}44k44qNֈ#y {O?d2ej -&aOThBC1UPLr ?f".̮\.[@$V`鳤yoPs4#P7%ɢDJ@6({jrmN|{ό:ޫ>0SDo4Va(>AH(mU*w.~"~}B{'6 ɿB{35fnUC9}gNt=Gb^\w`%E7eۧDLq"[9{dvb k u=F~ITծ=.R[&!Ax'l2UhW"T jg qA 1ٴ]x"K|-Ӟdӕ1v'"ߑnTQw!2#Ctrw8X9YKUCxBt!P "wSȏS*$) LrNM7[cҙ3VsC |]J).}e}\H{CjJ="Ϙ\rSzII.Ϋ&)oM(tt~BlaAP GEAM o!WqSOoNc-}JxG`$]0H$WK+K1ߠ^_&&HY`hd@L8v.E-fO ly]y݂ouOq*s&D ]02.JeJ yzZ)*=)}Qd\=gJ! \ĭ+K~Ai8WH#,u n^H=ߣ'^ zɬapzAHB_NBo荪A)_ c~ HMncO\xDy3)׬G4om.C(3M퀪Bx<[/H\Ń>ų:XC,s6aQ~}Oe Dw͉-ɇgfvuf^H8_"6U5JN:EV Uu] USAy h7{K0UV8ꮖC-,r~V,MK3S\ݦjo,D[th`$5M½EԐh0_,vCB nGW~kfiϤFf +7Q34unMfnI|;UI>4A|`E8nfl +Wژ^-iM[VٹG8L&r5i"d )\Z!Pg.Tsz׶9~P}_\t(q3u?JP"QC1D ( \<骄 ㌚48* Hd3wlDï)Sz:0 y]0tp. 0ETݩ$dT:'E_64^Op' 75K 5[B]iAA—=WSB|zFaӵTEVI1dw|Œu4BJa1G@SvS^M3̼'R|;OYyGÍÄ4:oa$ 0&)MhXX3]$%6(4Rbˤ\'Ro*f!-:/|N-%zVŒT|{p`% (3`ieU5sFE|8TAv`T?SB]\ tF-w &uxVOzQfAU0laJ@1×bwvEQ[ nNKp3Xa AEB# ^/q}4eՈRCFNG{[s`X'J;MsnjI fnC{+,QOv7x,V^ ^V*RtELIun69_\Ӝ~/ KL>aN:ף"PPfiϖת%(N>ذBk "֛1n=LIpstbxk1(7yU2RD)-`Ԉ\bQZ?\q:Yyb38}<%KXL XDav|6BV|BB|6P;>A-TN5QuCܦeZN/%# }ܟ= g|( vihC@ճZ//' ϗF oS0>RҤKc`ڿ;3 s|r5.2 zv&P=|~\"1Pw33臊7<Ѭ ~av9 ]i\ 8iW\BB)Flty;Lr]5NYI+`s *y,DQf7WLH5®[߉$$mLfՀ3fS>, ꡿vGg>/Te0wT]S։;y<-AmEYE ܹZ_3!=m2!SR6rjgydj=5FyM^\صA/2c{q 0GjٞMIy)R $A 96\5Wfyr c9 l؟v؟K>AN0r=[ 85W3z-*JqO^/>ô  2#Z#D\-.L#*@##P /w?X b0@X"rT?(>@ܝ=O:!-gnr̙ޮP n"8N9T-PBkα/R˘s<;_T,|0ɤ 朽,4;ݮ*C}8nnH#)6klKl mdwޏ`q>Ά\| =) gNCKK 7C__FZ"b6B :Rd2_ҟa}URqb{3Cxn2 5fR\i߬Eٶ\>p&o6K*bl)"]qet,V jl}Lҧ3aE_ 0`yXOb0r yU=mƌ8xEUbdcg hrjS:ИE-5E[ݵhL_Zz1U,( r2hapsmɵ YQp5vB,%I^ys7r$K{3#)c£PK(>IFɡu<$X'0 _@{X"/4b"@'[+[#LZD-*kQ,AK#Ӏ.}a/o ď̷ˁAŭ6^9Zy\wvd7N鏽9M ޳*yy'g:姌 y;0'ĥ'6YJ4y~~,3vA8wiئY8?JlPA\`/݆|.辰ҧh_LmU `ـzlFc/99'fspQaur3MI |rcCgөz7rwD婜)ZDR8`T|/Ͳ=}^Z6Uz<\Õ&bcgW)$ͽw,&VS!ѲR5~#Ν{CN04ܔ4i1fF˜V*d>uY4"Ӎ=Uȷᅨjwuun=! "ȇOofC?@E?oKȫsͦ/YK]N=,* {g זUGݺ}_iˍIj2/b+gkrTLNl;RFQ|mw  %&w猅PbcJzɨC?6FsRw`vL(&ٸᙳ2+:ښbAL9LAuQz 7GsM /J2E]?5n9%l/́hp'i,r`fz!ZN" }0۸lҮixoi$ E@DPu|   BIa{$ l5X1[%2$ҿą\L*EsW jpŗJ[*s3Ϩri 7׌k|V`cq|NR7jIՁ̓)\6B׺b"ԪOI}^qC$+nSimEx7X7ݝK픜P-|k[jdčIY 7Q:)Jl$# iMҁF7fs̭{b_Q=.#vm>D:<Icz۫j} vV>I]5=G8|,E.drZ(؂>œ(gJ T=mouݚYQ~ђ1BCsdro)wR ixȓ7?^ 2[OWy\rKn䋗5EVfɮ%&\c_S7,|`eڰTgw7'=l2/16eH%9gJ|WES!Zs/$Y۔fe6~qcXViCD*i!ݝ+A8PeQWJRkTMm\=6#%p W%CbǹMbX-7KGVtՂ΄%쌃̴vL5KM8Z `O"AmizB~9<#>Xr"o2o)3<0U "2LSǻU@~͂|Qi;ׯ.>Q [zs7cQ^ WT$kD n 6)HQѢF-Ɍ8뱣3z~w -vM4j Rx}t3j{$dTT>h3Y#p3{E5w rZ`쿨bEATF?h}sgվYٖ;MXrx*ryg ׃BOc5~5>V Vݙ;+)L^8Ahtv[Ag޲Sʖ_3YâVrKY% qH\GTlҹJ)`q%9q:2-V!|h_9܉w^qii?)E?jɳpaAYӮ._#nwu>RmV,uT6T6\2hۥHnj^z"!rqk4.3 "Xh5.>VPP4QiG`oZ~}"5zœ1ֶJ' [YւQhOXq=D(ʼ̋gEoeq 4-Ÿ ?V6qOg=~Y]OkL.+0N*wx ɻqP\[кObMp#49nZ/@~IkۮO Adԁʷ K?WK#2rߕipz9пj%UVn+^3$Oz$E lB&\k6caHzy&vu te!AcZ:OuTߑJvռ.V41tNJ*8h//JpL]Bƴ(i4$Zsw!Ȱ]Jh ̧l 䫌|WOh+'0x< L | Installation DatabaseVisual C++ 12.0 CRT (x64)Microsoft Corporation Installer:Copyright (C) Microsoft Corporation, All rights reserved.x64;0'{05F0B5F5-44A8-3793-976B-A4F17AECF92C}@4@4#Windows Installer XML (3.7.1623.0) """)))***++++++11199999IIOOOOOOOO]]]^^^___bbbeeeeeoo  #%'#%'#%'%+-0361EG#<?BJM'3MORUWY#%'#%'+YaWYa#%'hjo                171K++O+bbe%%%%.G=@SWY%%W%! $&($&($&(5,/248DFH;:>ACLN\[QPTVXZ$&($&(`dcnmlfgikqprvyswzttt{ux|t}}~ux|rvy prvy")*+19IO]^_beo""")))***++++++11199999IIOOOOOOOO]]]^^^___bbbeeeeeoo  #%'#%'#%'+-03%61EG#<?BJMOMRUWY3'#%'#%'+aYaYW#'hj%o  HHHH&HHHHHH&HHHHHHHHH @@H  !    6$ B o ; >   ' S^ . : W ) !s9c%A?vJ" =  ) #>0;&<;;&;>&>     <  <Striɣ5w/s l{SGf values that are permittedDescription of columnAdminExecuteSequenceActionName of action to invoke, either in the engine or the handler DLL.ConditionOptional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.SequenceNumber that determines the sort order in which tempty.C_CENTRAL_msvcr120_x64.05F0B5F5_44A8_3793_976B_A4F17AECF92C{E5B92048-5859-4AF1-AEAD-B97EBF00B087}System64Folder_amd64_VC.05F0B5F5_44A8_3793_976B_A4F17AECF92CF_CENTRAL_msvcr120_x64.05F0B5F5_44A8_3793_976B_A4F17AECF92CC_CENTRAL_msvcp120_x64.05F0B5F5_44A8_3793_976B_A4F17AECF92C{570C624B-D57C-4CD1-9013-1B80C800093B}F_CENTRAL_msvcp120_x64.05F0B5F5_44A8_3793_976B_A4F17AECF92CC_CENTRAL_vccorlib120_x64.05F0B5F5_44A8_3793_976B_A4F17AECF92C{14E8634F-8AEA-4CD1-AC48-BEBFDA18523A}VersionNT64 >= 601F_CENTRAL_vccorlib120_x64.05F0B5F5_44A8_3793_976B_A4F17AECF92CTARGETDIRSourceDirSystem64Folder.Sys64|System64msvcr120.dll12.0.21005.11033msvcp120.dllhim3inkw.dll|vccorlib120.dllMicrosoft_VC120_CRT_x64.05F0B5F5_44A8_3793_976B_A4F17AECF92CInstallFilesRemoveFiles12.0ALLUSERS1DirectoryTable100_amd64.05F0B5F5_44A8_3793_976B_A4F17AECF92CDirectoryTablele, or ODBCDataSource table. This extract path is stored when the component is installed, and is used to detect the presence of the component and to return the path to it.CustomActionPrimary key, name of action, normally appears in sequence table unless private use.The numeric custom action type, consisting of source location, code type, entry, option flags.SourceCustomSourceThe table reference of the source of the code.TargetFormattedExcecution parameter, depends on the type of custom actionExtendedTypeA numeric custom action type that extends code type or option flags of the Type column.Unique identifier for directory entry, primary key. If a property by this name is defined, it contains the full path to the directory.Directory_ParentReference to the entry in this table specifying the default parent directory. A record parented to itself or with a Null parent represents a root of the install tree.DefaultDirThe default sub-path under parent's path.FeatureComponentsFeature_FeatureForeign key into Feature table.Component_Foreign key into Component table.FilePrimary key, non-localized token, must match identifier in cabinet. For uncompressed files, this field is ignored.Foreign key referencing Component that controls the file.FileNameFilenameFile namTableTypeColumnIdentifier_ValidationValueNPropertyId_SummaryInformationDescriptionSetCategoryKeyTableMaxValueNullableKeyColumnMinValueName of tableName of columnY;NWhether the column is nullableYMinimum value allowedMaximum value allowedFor foreign key, Name of table to which data must linkColumn to which foreign key connectsText;Formatted;Template;Condition;Guid;Path;Version;Language;Identifier;Binary;UpperCase;LowerCase;Filename;Paths;AnyPath;WildCardFilename;RegPath;CustomSource;Property;Cabinet;Shortcut;FormattedSDDLText;Integer;DoubleInteger;TimeDate;DefaultDirString categoryTextSet of values that are permittedDescription of columnAdminExecuteSequenceActionName of action to invoke, either in the engine or the handler DLL.ConditionOptional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.SequenceNumber that determines the sort order in which the actions are to be executed. Leave blank to suppress action.AdminUISequenceAdvtExecuteSequenceComponentPrimary key used to identify a particular component record.ComponentIdGuidA string GUID unique to this component, version, and language.Directory_DirectoryRequired key of a Directory table record. This is actually a property name whose value contains the actual path, set either by the AppSearch action or with the default setting obtained from the Directory table.AttributesRemote execution option, one of irsEnumA conditional statement that will disable this component if the specified condition evaluates to the 'True' state. If a component is disabled, it will not be installed, regardless of the 'Action' state associated with the component.KeyPathFile;Registry;ODBCDataSourceEither the primary key into the File table, Registry table, or ODBCDataSource table. This extract path is stored when the component is installed, and is used to detect the presence of the component and to return the path to it.CustomActionPrimary key, name of action, normally appears in sequence table unless private use.The numeric custom action type, consisting of source location, code type, entry, option flags.SourceCustomSourceThe table reference of the source of the code.TargetFormattedExcecution parameter, depends on the type of custom actionExtendedTypeA numeric custom action type that extends code type or option flags of the Type column.Unique identifier for directory entry, primary key. If a property by this name is defined, it contains the full path to the directory.Directory_ParentReference to the entry in this table specifying the default parent directory. A record parented to itself or with a Null parent represents a root of the install tree.DefaultDirThe default sub-path under parent's path.FeatureComponentsFeature_FeatureForeign key into Feature table.Component_Foreign key into Component table.FilePrimary key, non-localized token, must match identifier in cabinet. For uncompressed files, this field is ignored.Foreign key referencing Component that controls the file.FileNameFilenameFile name used for installation, may be localized. This may contain a "short name|long name" pair.FileSizeSize of file in bytes (long integer).VersionVersion string for versioned files; Blank for unversioned files.LanguageList of decimal language Ids, comma-separated if more than one.Integer containing bit flags representing file attributes (with the decimal value of each bit position in parentheses)Sequence with respect to the media images; order must track cabinet order.InstallExecuteSequenceInstallUISequenceModuleComponentsComponent contained in the module.ModuleIDModuleSignatureModule containing the component.Default language ID for module (may be changed by transform).ModuleInstallExecuteSequenceAction to insertStandard Sequence numberBaseActionBase action to determine insert location.AfterBefore (0) or After (1)Module identifier (String.GUID).Default decimal language of module.Version of the module.PropertyName of property, uppercase if settable by launcher or loader.String value for property. Never null or 0 *H 01 0 +0g +7Y0W02 +70$ F0!0 +d6y y003+92HH+0  *H 0w1 0 UUS10U Washington10URedmond10U Microsoft Corporation1!0UMicrosoft Time-Stamp PCA0 120904211234Z 131204211234Z01 0 UUS10U Washington10URedmond10U Microsoft Corporation1 0 U MOPR1'0%U nCipher DSE ESN:C0F4-3086-DEF81%0#UMicrosoft Time-Stamp Service0"0  *H 0 0ePZkH^Ip|_b_&Ӌ9".K:^92{x78:bhh@,6b`p9`b8o@ x6k&M)\HpF6&454\}1MW|֕ f 2>,Հ_89]d7\;Q[]_4_(UpT|UF[((VL H*03 lióN07ԘRԩ#E\AIObh 00U3S?`CƯ+X0U#0#4RFp @v+50TUM0K0IGEChttp://crl.microsoft.com/pki/crl/products/MicrosoftTimeStampPCA.crl0X+L0J0H+0http://www.microsoft.com/pki/certs/MicCodSigPCA_08-31-2010.crt0  *H 1n*W3՝:DM^j[yvh M9 ]$:|ۭγl9,E}$T&0 Gf],{tOik$햠sjKb|HMDN;] U?@18u(^Fmzy@Eծ]>ufc`՚$04cBgJK:ﶕ:8%f00 a3&10  *H 0_10 &,dcom10 &,d microsoft1-0+U$Microsoft Root Certificate Authority0 100831221932Z 200831222932Z0y1 0 UUS10U Washington10URedmond10U Microsoft Corporation1#0!UMicrosoft Code Signing PCA0"0  *H 0 rY\0d` BvSl>ok:t/2BN#r5W ʮ IhMKyKqG%ߝuϪsDׁ6\Eܯ=(hrsV5rv_wE8s[gRi/ t)v/T0Yҍb_F1P'@0r)("7N=2=͡8\NV(*2KOc-bE=F[&SzJF7<8w\V< _^0Z0U00UҴX7.3L 0 U0 +70# +71N&`;1o<-0 +7  SubCA0U#0`@V'%* SY0PUI0G0ECA?http://crl.microsoft.com/pki/crl/products/microsoftrootcert.crl0T+H0F0D+08http://www.microsoft.com/pki/certs/MicrosoftRootCert.crt0  *H Y9>&Fo@2j/nI_uL;-C -1#|P!]=/LVpyIr>A i˥ - PV-JҼp VชKWB4ئv `,ֽ[C1ʹ@XD:0ZVtH1:؉1Q{UVihww\4c0i1v.3#eI S ~rrwێԧ*vqˢ Z(0$ *H  1000w1 0 UUS10U Washington10URedmond10U Microsoft Corporation1!0UMicrosoft Time-Stamp PCA3+92HH+0 +]0 *H  1  *H 0 *H  1 131005105431Z0# *H  1 U$=LG]\ 9>=0  *H :`mYޮ Ȓ9g'# wsUv=hQ3U1h=j7Goݯ]'~Fc y.`o"+2Iְ5 .{Pf b}ZjdR6:sr լq)_~ϯ@`ȿ0_JX"q~V\N[|j[W&˝&\WC8y7Q(oSkS_o {㙥+modsecurity-2.9.5/iis/wix/banner.jpg0000664000175000017500000002374614147005233020575 0ustar mhsvierulamhsvierulaJFIFCC:  ٽJgII/ñ~ s_;H)-5bX*$ ֛.JJo V$4"*W)5qa@5)P?C>`&Oa4, P7Иzp'>4XNo{~#c7kbFpwR|sw~Nn|gu.O+jY}{]) A$,J%O& ĩ31 E*x5Tc{VN戋=w=b TB#WղuTۆgܿ.Ĺ#"gal+y;ttB"gcy;ș y;sB"gcnn}LrЏB!3W?B>&v9 GD!\ș;y;st#"gcn}LrC!3w7D>&vùuH}Lr.o?Ru?OLrͫC"gc~}L%stC"~_!\ș+y;s#"gcn~Lr ЏA377B>&v9D \ș y;tt""gal y;ttB"gc.~_o"}oș[T_"g~@}D^޲' 5z"gat}tt""gc맡y;]=yCLJO@.&v<<:w3}S ƕK'Dm8) 3+yۦ~+~֪6VR͊0R 4\4TW6y഍[j R*-4$5)4 H 2!kn[οsܗ$a_2G$҇#J@wǎ[W- *+~)[UyIQwR69(,m8bfRĐ3nFe֍szO:5Mz;H׵!6S]R]ޥMNz8IdFqސ%6+Pd ;r&)ޮ˞F.KI+Z9"ďގH)E@ʧnm,9BY D \RUŠE=B-Vw!g2 űxti*aBSH1C |Ӥ m*+IY<7F3b#xgE&ˢ7ev'4^>֦X!4,I5  ̆("L 3 &˩RmY=Z|I=:rCG4$:ZB)oYl;bKL|2EJc^zrNC"9ѳ! &)ŸvB+z8mwty4(OFXZsa٪&;K:J\i6mVDD;UbՏA,Kܣ HquB!$A\tmmMFNG-6 Gu!$rP3ќ!TY{^hTdTݫOƛAY5j2KP7B(jQ#E ѤW#e~J`UopơOS`SaH"9K 1FHV_v5RKqRDcExωЌ3)XBݣɺIjk)/4FI 0'K2saUV*55"S4l$TݡpE31=$Uk,MNrvA RT!"#124ADQ$Pq3`abps?Iot=%_hL>Z=;0hH|:a߯/-߯/->Ч 9@-o?,_߬-]cŃqL~/^#=SպTnb3/[{،Lo#=źtnb31_{،LoW^#=Sź'tnb33[{،Lo#=SպT~b31[{ٌLoV^c=S;zTnb, gcxBnb33[{،LV#=;պt~b31_{،LoW^#=;պt~b31_y،LV#=tnb31_{،LV/PLT<;n053gT~ywtn1i~lvc<;>i>FީѺywtn1igczDީ:Fy7tNQ`,\Euq"X:W`,\Euq"X:W`,\Euq"X:W`,\Euq"X:W`,\Euq"X:W`,\Euq"X:W:H%,VAᬙ4**|B '92x PQ,̳I9S{d'!EA& Hs~3()D?gB/+ a*b F'R^/M$K&*7IC9@D P J*eJ"kz Nʤ:ǦOf@όSTʪ@B&\HLcPGҌR\W/3iD01xKrD_64F@)e;@L pS 7"c^ 7%fI I9Ē~\wF iaDpZ>iKahljUY#geK>pwΒ:N'io\ @"2M7T\JٻK%t8";$A0 YvQTD%SfԎR"sZ "k~L>5s NiCk c?nDK) Nw B'~@<+tS3lRԭ4.cU`!&U ׽ۿ馲-go˗9ȫĔMALURY4g ɆL'P鐦P#9 a4L=Wy4Y<# \ P/1¤DuTKdlNdU:MسESH'`LJ"!]#:f[XW^+c2"S\.ېTR.0_$ TĊY<}QN_#B_0YbN @蔷]§H*eU g8$фrJp)E%^$C˔R){fD/s C)*jć98xQ\&ob^|$8|#ѲU=zT%rPޱFEF%/ZQD)(tư3js \*1E j61 gXpi Ձ%]QUP;egl\b"}҈U2&ȨR70flf&chGIiyLܚm3˜&e#{L)12.x~A 5!"1#Aa%4QT2P $03DU`bdpq?ѐݢtѐݢTѐbtѐbtћhnќhn|hn|hnhnXx6Ł𡛪Yxߺ`&9Лo1hMe4&G6m#M ̦ySBms)6b9Лo1hMe4&G6m#M ̦ySBms)6b9Лo1hMe4&G6= qY4&G2۹lb?,M:G sM ̦|!ƚm#M ̦ySBms)6b9Лo1hMm4&G2m#M ̦ySBmCi6ޡCZhme݇j#ߗ΄۱b>a-zoQ}4&sͦySBmsi6b9o1hMg´TRuntfQvdzs|>sxxv){Ev0ΦQ|#7k}"ajnP'r-0zB_5ʛUĄp! Km*ZXbԐu(q1&FD,h pUSW/^ްCU%+i6[U愍o]D㱅S!T1;Ίhd xY'BV%_Q&/ɑxFuSUM:HZaj /*}&FdvxkA0AUPpj5UQFV.FMvUh߀YT n&t*1 OQ`*G tsPɍ[+4l+Lf0 Э3veXeܜ(URKWJ(h}x)Ml:vܘ ̦ 'f%FJBIĵh?ul]9P<"]U8:ȦULhQe]f*fKE\@ʷ/s,e {)ꮼWrhU͢Xʴ:  uTx&nS,%(,tlj]+tf`spN( ˉT HG &]Dn] .^@K,Mԙd*w,`cCV"_D[ጇOy c~ ["QH"d\TlL:rH/[M#g*t1n3j;7lʤUDRBckư r- "gآ-Ѭ0JR1LrE b\|57f]Y6ICخZC%p_m-)m?zňŏQ5 w^bP(&v'!1QAaq 0P`@?!س3`yk'Y0x?c.\p\!Ofc.&6^'}x+@c9H0R];ټe:Jl=s"Xz>*1>hw0LJ]h:1ir>a@&C[ /̸{/TRK/TRK/TRK/TRK/TRK/TRK/TRK/TRK/TRK/TRK/TRK/TRK2tt*P#~PpV\i*'8$$"݁AcV{/H1o͔N0JX0]Ȟl@yW5!zJ׋8AyͬP Cَ\NILX& St`tL 6`R~TT9-1;Iθ3keY밆sVANDr}6z?@)G_x2C7L 2,eveV盠茦a|( @ĄQqBD;0HC~ pKWFo#" ?(D]80a!b@2;9p2շߛq{ ?"p>" zWT`sY*? {12se4N-\P6mmmmmm@h u `&!1AQaq P`?[+ނ_Bռajݬ!\!B* I39PPJ_,ȱI̡f ɩviiOt[y;`JLa}q&(QW>'K QaBУPƈ-RK$j&m4Ӣ3^C UCFe vHv%жaEMA)>e皋-fއ"SǮ 1|yfH(4xJ'M2F  #,Z{;xiH)Эxi&i=>~RZűlZ-m* 'Xڠ6|T0I0Na P3 ͋ ,jb;f@!>i$ąRFIȘ'!1aqQA P`? @j_6];'M1 OΨ~ЋvʁЃ{zpUP`KAyiVB(`&yinׯ|XA٪D]HMv=" p 44"-u@c #X*}ΟСNe_*YWʿUe_*YWʿUe_*YWʿUe_*YWʿUe_*YWʿUe_*YWʿPDA33%0kinVn)ݠ:(0"F2CY]ws :CWlV)(A4;  />L qED|E :VTTi4Lhcn۔(|# Vo4a%S'7k\V TQByT>r ;LX 0&a,IgU(HS˚gc `I!@ ?4>XA|53'.]/SL@@\s*GۊH!ćNE P/[0q)!1AaQqP0p?!~ֽdGΕ7M7$ F_#\]J4' 97C4@ C$P`2-oHC!? ~FEDTOQ<<}204%v(S@oxNNJ[8IPVhB:@&eg_[E A P%8pe 2B _4@dX2I1_ nA%^:/'+Km{P@?J`'AȾM@w-4,x@D)[,Ѥ,4~$`AM,%PJ$C8OdP$  AMExd5HɡG ~(,|I ַc:.u]똻1v3bg\ιsc:.u]똻1v3bg\ιsc:.u]똻1v3bg\ιsc:.u]똻1v3bg\ιsc:.u]똻1v3bg\ιsc:.u]똻1v3bg\ιsR6(?Bь {G7QW%{ 5'yщJ ^ ?B\e_˒ <;,$V <^ԭդkiIa2 `xaq*XJkd3[p,]%)b9P6] .#-S'RX^Y}>Pl, ¶Џ /T}htL($IŒY'R!`t·DV~$xD2Lx`(8_o5tʴ   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry F g_1BB=ACG: C1B7Hp SummaryInformation(@H?CAED1H @HDDrDhD7H)$@H FE2DA7CrD*@H C5BErED/HA`@H??wElDj;E$H}MsiDigitalSignatureEx.KDigitalSignature$Z  !"#$%&'(789:;<=>?@BCDEFGHIJ9@ <'BFw8=094!yes&$M+ k=xs# U:Akcr*B79 !1'1ٟv:A~D@Z:|fvq>3oc:bSx#/XIo;tk x~o\a~-[Raq'F yUl^Ć?>SZ_3K͌?Qn RƖW1q>N>к_\-`#1<ґ>{1zL@Ϲ8Jj&E?O]FVx.|KsDQvGAmYzJžR[^RN&2?3hWƣ G?I~![ LKYtޘH%>&_Ԋ;җW5f[F3܊j,<n<@CvV bQe///{L2|bO]V S-VD\A^z%1~pbr7dmD}U|H`vYݝdx}5j䂓,3/[ ;&ɀOh:#!:%Qks,U I[Z̍E:pdji!4mA HӠ*ml?2fA|q2Zx^)-I,JnmJ4AJP-Q2jLę 9U 5™CgU!gӬ?]eA3^˕;e/yaUfS6RF1u4v ? SEB2 ipiO u( }{$f_ bg@5)=':_8at#s!t~ WvѩTHu GԬBW>RcȪ~N!Qp]k/fE,3i jMf hqK`n/:N~ ܥpǿ'+u7w'ئVjlh:Kh^W7n\һm=V/MY_Y "]=9 9yQ=m//t#Lh*Iy^͛k=o؞Xұ &eXx%?.Bᵏ_HD̙A6Ǫ=g?ͱۑ.yQkN+Ksm6z x38XX)ۭcz^a^Xm>'G/bO| y)mE>b@f'T>JT]_ꝇYnr/8j@M;*lN פY=(Q2f\ -]UjscW>>/ƟƊ:61nqT·^mzg'7ߓ5;Y\~{Xc;}~H0*jG3s\DߑyAhj`AD긙V$G Iƚ;D>Bl`ރ;+Zd^),({7by{{jȹ\޼GϹaGʹPٛ+P k}ov^qH "+&Oy~.E)B-a]lru$Tv._ 5_5O5an 'w`Y[P!2i## yɸ'aOp1*jUL̈́O| :ˮ1T k˴2&m&[`g,!YSk% Zɯ/Ls{i<||ZɡiQi Yd5ej䥉8JVe)$7@9|:\؍kˇ{7%>U;4}~"Z_*>'rϻT0A{Pjȷ=0CsLY^#rVuՔF+6Ǔb=êE{n6K\wڴh!u*2+'غ_ķuY? Z3,Q1wTmjcX㙩&' qKc/.ZYl fɴc*da&vHzhD4+Pq7CENYZC|lEnw ̫5 g&1qZZf-K|r9gߟ] Pg`?B۞yt&T:Rxmn浸{X-,xbl嗻"z5ӗ_3i߱n6~ e0[>+tX_R?OwKZ9]]rZ}m€N?^J;J ;FRڪF(ހoL8G첏tj^Cu^F7b_^ߐȡ= ]C46 hƲY nMLəҕO3\_UFRB=RM07!#$b=RTn*x`pςuNf0Jp6E"R wW\̹M.Eۼ`6 8V%nu6&S{}ڛO\Wm }UFQᕫ<[?NycahI )m!#{ 笰3:j3o3/:#'~v&xFUg8 ~Z״82}o9Ye6V<` ޜVtHs%˳Wd0MY^=v>&s9=gEܠUWUeYq/u+J!Oף}dXi6U9Nn4/t9Eo"7w90I߯oVJa)9tbJ?!gݨ>],Ӽ03| ayT:/܅JUmYHZzlQIS1ҫC7=*PZeX6(q=$x"V YK@#a^#!,Uc\ރ3 bW<˜ leIN}QG.Yʑ(֕iD${NQ5Xwj+xggqc,vp';VJͧ@{nP M}<7}UaL~ء2LMG>!/wh9MSCFp ,9 eAK F_CENTRAL_msvcp110_x64.C7F737EB_3325_3BEE_8D0D_DEF2DE62486A  eAK F_CENTRAL_msvcr110_x64.C7F737EB_3325_3BEE_8D0D_DEF2DE62486Ag eAK F_CENTRAL_vccorlib110_x64.C7F737EB_3325_3BEE_8D0D_DEF2DE62486Au x4CK} xMJ ѸWUSj\RĦd+lZTP02 >\W'@J p09wf2IߟK'9sYY93GQ8cY3q\:q~xy&LvWwα'M3Y0əsHKkvqʥ7=r f :y{Ypd{{z}2!]MMוUu]0 %WqMႏ,i+:qBn^ 3d3M'q\ \sJdzmKMZ#7n96q]؎n皑1T. prn=׭ i.i5-\LI ?כ, ! n{TqO&S)gq``\0:ƉJ (gD#k~j*&WE$!ƃv6W}6?^_qM|r΋C|z[x1+xxR'n_m#ȰG^Fg^lhsOC=)S~ Y|[MQ^(vBh%@['8MP+ [xaޕI%yj/4nw 9!ŀmNTxtX6P*ꨣ(̈́BD,{/|amO΀DMAP"P57:x[~!7"ThF,;^X&-}0$lY1/~(_j5p`_&hBKVl:`T& #KQAn`#\Yy$N_Gp}? 6`C[$x,"[OY'G}[ }©B:<:\)7/{'TL{>#V<@2L/=E}ŨpMΠ( +L-Շ7C_q#R?~mnWz>^G*9) E/wee "\lEkV#Y~po Ƚ|PeR v- #+YMLb3/zQa(3Yks)6TQ~O\|A<+Z5՚9QlqKMᤞ!g7ɯ,2s^ Q;IܨgdjP t~ri+3!K00l+a!g 88-|`LŐi綧a.꬜獚\ ׿`P*A?JI݃y#HKT "bV)ڦǀvz do)>/_hFTM{fv_?)+FE21WJf$d$`d=4,/0N]L2: y\ ^CrbN=(`*Ћ3S{P2B+,V` c0O__߅=5/g G7sMPI۽97磌8XL1۔+icc98B\~{% u^_+LJ}Εd7AU@\5'hXWKU̞灑m~I ,\f7 k.ͬY Js(j"8.pɟ&TXHTՋGp}=I U9 2rXy[r pR X*/4I- @(OJEY O +"BFip&yA#d `yY mH)L&08L&<,3<3^J"@ E@wZ,=GX 3@78_,jT J 5xQ|VST#%=s'>vG+},x!/w \`~W{\*7qcy~$= m&pK]*X˸N]D2o PWт{-VpM-;2w ᥿gJ<-@SRHWHTͿQN*ۓ6سRN3=-Xz>&!y=kVj[L=1jnE|%&RIeNz̽9 L0r<נC]ĪztŊv8;/h)qdEbD{KH>2xB``VyN /%ݹפ%L&-KĝD7c誗9NW-(ߐ6& _g8? }RK<XɁ#;xSd華 ZNڻ0f;{Y}ʼ]lxt&KWgӒ"v Zr`^_+3Eix+('l| GAV# $r_Mu"b\_i *, rc+3 Y1-yh Z@# 0 ݼ0h&\ Hyص{<ZUGlg|:p-SGR֦oށ>N9cq#WhWt ħOEyY&gyi[?B)ѯwGE,Q+U&Rn,,8nmf*A`tK(IP2r#]y5_/Ï\ϋSl8tcs!:g kЇGP.9|}6=gHl-J|#;qL/nñkVNwز:Bq3%U: F2_ԁzqjJ @v(lLuy&^` ^dH:qh cİ&fd'C XޠXnxN&R+FlDO{.f!#sfbX$q @^CbM8͕cT$'ZGl^*F'!Wd[CW\pDa w@Kiѫ?"Hj/Fr#Da\`mV<Iˬ3&lq8tL['ըDHW̋3\BI.9ڼMϰt&QDR yxhI=lK>n7ǹqa0 s|3q<858+g?:SvFV[1}^9o\:=*Z@AzW(XA<ߴ+x` aZqjqMJ`r>Gr<%m^ ѣ'R9mE1^<\;T7F;zTӖl& B>XOkgrTH2'dy͜y(;Z<+5Fj2 .>QV(_]Wp 5YtHv3 0'g;.DZcf1x"z"˔瘂+i^OEq ^i##2XLP) 돾8G"+Y4ɛ+XN~ѠD);Ԃ8gWmusVFeeqήoA_uvml)]9L͏G?bGQϏG¹~0__A|}v:3;?hufgq왝>oM qI6xSCf3WzV5Δ` h'8Qٷ9W/ZOV]>لzvlz'幛";8tvJNF|& -|{>2l,_Nvls;ounl"3Uw™Fg92fͨMu'Oܖ~Sus6O v_uo{D1d[ҹ,m]!_9Yok |gyfl|gw9g3|]s67s6i[2-z g;N/XkNZu- [J? 2{5uV 9ᶠ 7q{{][-oM P-znup+:f5+kp/nae}mz&ϖO~Y&c𿿺aE<ǨD܎ gۯӧذliaRB$ !S_Lk[TM3OϏ VH"v<=.G>μL(`;L uN>rZ)Q\MK`P>Y/>n|'*ι.߸EBʵU@խ* u2E+i'.,L_9+9y)]xbۅ.!lGb{EŁV;i g~'F+I`eUhKO- ,;.=W9-r㦀 1迆a𽼘xEXbs0Y:VUU & ; Fu"Q/BRNŸ<h֓7Ƒ- ,k,> }V9|*j t L^.!v9^ ZޞrJ99P>O/ahrJ {6<16Uqv\{k Um=A6Xp˱a㯎}#[n$!]K6;SRTG1xGx~oq\Qﱔ@ߛ9J̋QKj _vw:fW`$É,Yf&/s7 bE/zvBo]4f|EXT}A1`BOճ1!tleã_ii/+AX8Nq }9.vǢ9nnzEΜIMs1m;1OsDq\O|zviqe|Jħ-|4ͽdt;&NNM[qj{8%Gz&tN%mN~90욏^f|!nsw|q㇓"o!Juf $ Vfp}iup\':}һ* v|XFX߇?{j^G=@H/&$Rҟ@أ"Bn\(f88Z?LZ?ķcD&Ȼ>[@,)ie?fa+*B5&Sxd3r}#\O4C<_i帴6yWYw?c6Rbo0+(wϱ-c[-wM{C+נZi@'kz2.,1<HCD-Mu. }HyGuWO?wg*Y{rPs] 5<$IO!=` ӣ}Vk=D8*=os\)[\+oQncOuo{δ7cO}־dmZB'a`sCn&%'?|-w=Vp!@2mIx4.ƭƻsɛw>m5m}p>mdp'6-dp[u) 5n64O]/4E䛱!ML -¡b$) i?V$ْɰhv]s wl|b զW41)^8ӐX}5w w$<@.U-w"K'_*rQYZ]pl+6׉_3׫ވNoǪשw)X ΋6`tBl Fs#zT2A?>U O7.SQ 2[2;s.fP hA|UM1mC\gx$ҚTHP%R$5Lrg1k6,nWq{ibw601;;ب`?3T{ 4zm9Rjr!}M5`C|>^K;SZ+A%F wFh93>{ovvM  )q<D|Yi"R(ŅxO,'îF+B6R O`:_yE(VL*U^cNn!=Gሇ5\I6졯OdYƵn2L) =bc\VZ A oa#l T`Oy>5٪kS6h s'J+w02MI]#8I:9nhK@1e /_)t+tKJo4([ڷk@b,QDaxTYh:5F\-0HD<C-?rcokʃpR@Wۂ`s&6dsa&znheǓٲhVdYO^i,+e|tecKtYtBe dml֩C'w _b YzbAן14$l)q}w"/쟎o ga(/-6ΜKN9s? i;wc UJZ*~P_NyX5wg~xjߖ{ l/`Mn*IvQ2w*޺Fz"C09ogsѿ/UfrS{V9দm#KOawm Vk3p?h}5J~ega{BVrIˇ6v}8kr5M>MX5=3ԝAjU^Q+:`ԏ?o}LRIbU`H >⩣ڐ~L*.]\2F#hC #A(P6@)E#mPG#Ǝ|zّS&BN%[*) @?`c~ko7[^X qrI~Hǻ53OcE];0s,qX4y۷-m9k Ж`mm;߄@\QÒ"q$^Q-q&!x-lz2L65zl޸凞81 gHJ7sQ8I߶:' Za%P$@JRi6gF\C#>(ʑPJX'mx'MwjY:Yƃ.sҝ6 []\de+\>kaU XG W5rX h%]SLK&,gb&=?v+0 X1a rXbz@ߘ-7Lj(ʎr :Bl%<- (WvvI~޶u·,x,=CK={xSu7IӦ)ƢEu1ZS)t, v0v1A*v̀/pw|37MEw6mG"JApwA(Ds~ܤ)-}}^w3CBpbwaEek?w] Y9lB}wBcuO<6NDo ZuqPDUw[$NA֦2Nozl&d}6Ma&$.t mr`H8 D.AuYԏ+ AJe^Yqk#:clb61_O`ǰwg 3VDžy4;? ǜu:.;-_9Y;lMI#,6 Xɝ._}r~hyS;/J}+[ݿoM;,x'R Eon|@e_^R|\jq43O6bwB$\uf =N{֋(q0+^xq9ĮeK :dԾ9'css%R 7T򯊹`Q*;\@OM)3]S&{6ZZIYo\1B]Q%u7T z%P1aoFa;Yjes|~enT߷>Wk$`K-ꥪYPBg CZ`>HZ%%[^F\Ԁ.؞N+k'e}5mL~tb%3 y<:='lv'~wB$OF/o'N~-s٣|<^>|piY%Mc.a#PZfe^c>bZί ̾QIS[EChh-m>- w}J4@s&G9_7ڣ@r@5b RQb ״:N̵nLUEjn@zW3HOpkaWoj$C=txzt4O@B/Vt SFv43.}d$/8a N ⸛䚙y ? [[@OD"H\GH,[>Դ? 3okLb1A\/$Ú ؾ==!>.%C9q=t=Qp@uh]K!`a/džxn7zkH]|nq^_Dm/v#WR> Y(a-/VIn]/Kzh!PϾJ6N=bŔ$X,3x#Bt" 7F _ 7kz#?`oNvg>׾E'a4z Ұ:nwʧU&-F:0)ߐDm kmqҠ7@NZPRHGj޴q:865!ݬf:0ygONQ}ϽՇAYAӧ\$g>.?&KDD:}n&]`#pGzH-ZqOSjr%j}|~EHsSN#$3AjAz̸Rl;0 ՆyAӉE Yinw\lg;8k58l!eר4 b_n4Ahb qDЮĝl؞|j5Ԏ!&>Z)|Bn!n j-Aa@dPVJDΩnQ׺tKBSΊuR$ WoаI~;k49CH/[Ґ<rQgeua8Q12:Ot _>m%<엘6IC;Y&YW\nKґR6(:>4M'-G {Lu;NӝulNni߽5˩Mcy}[5L?:*RxU#~xN^uc^d^DW9jH^e:zT^^=^{HUc@9s'5\?bi^,/0RغUH ZoYH7粊 8FIsaq 6=Ć%_#G;b--73Y(Lb58`pH}3@0La@ۅ "f@ޢ4i{լ,ǍHw)l} dz-Xdȕ63?Waw!v 4K5}9^vs1#? :lY:#D7$ ڧ P ׬t9,z{xć~У?ܙ|"^Sbu GYlP/׸cx h.>L(h'tԃT3=𕼸>|,hbdAB3 >onNEKr{B$/^Qw0_d 9t|9&1 DjcM,,4\X[|h? $WGXWTbcAH6d6D>^s MBԺ /⓸?\j,xRs$k=95r% {%JVx,W%L%x?fD^@Z>2J^"=nE9TXp c(s2* 䊳}م%ֶPbB󐜅ۅ@ԆDy(7R1Rah mb+vZp^p n.!59dP;$..5'ɠ Ag4Z,A|58i!r2ELJMv=ˊ &\+Tކ}l~!%,rSAMc+ݙÊkw_c}Ϟd i z/"WXT/e yMb+zDi2VP>7@QO#?,FN7`dupbn4 "Y^j3ä)5S*3Ui@R򵛈hD{x\fSuLC4S/ ݃ʓΔ$ܪ\s@eH&I[U#t%syճGU8GfE~@ǂa!\ Si(44O阵V$M̧~Iǻ&Nh~\g;>74;`34؊Lύ4?\ipwK@U {2= !D9QUCzpS=Q_b~Eӣa`#J&RکLGR#I#ݫݜQ^I]/f(1 4~'rKڝ1L=q؇r6;M!uqC@C:W܍l`8OK6:v12\O$PW#\ǟ0Qyݕ'Yoq1N}DzFitI L j6,/-ĎXJ}ڏVUo׸[F0Dzl2^9SbXn"pR(>1BM,eƙEL&4}}jb$'c, 4-F̼}q:lxFL3dֳx:DzcTZ4$etg?GZC.4ӮfR&6oFBLL#4}uaߑ$\J>}Lj<[ݫ( ,wN)@b" = 7۾>FrUnwxr`=1D^bn_p{>0>-܎d-ww݉$囌8SOC8ǡoFƦzp L h<# >!!E+V'F? b^tɑ.Hˑ96)2< ?q} NT(jF+.۷O*  $!+А@ ! sN{BOwWUW:uΩS:R:XDv_`Gju4yy<㳁_y 5x46!#fvtJ p \y;ΜR?֒~<0xwq#cyZsā(ػDGe]ϕ I<=YM3k\j &-_~y<פ "V2{mqG1`S\q }u ^:9}; :N褑S x!Eᴛ?ͮ):]ݻL;PKW U7iϏ ByգY@G^dfٽɹQT-k^ W܃S>賈isKKqoUq ʿ:"0olb'8n`<ګDGe<=L/ 7_RWݠZ ⸂crjLBCcBTڑH*:Fp.4DFZC.Cgĝ,.(& %N^{ϩV32bp&KL?ᒱ4w42i'dcJ) mG""硊\1J HXM|K@PE|ǬT5>3Rp0lG[W#1cw'2ʛ֥n72G6h>Btvѭm{Fmadjats-9ngEֽ`L{ V*=ݼG]jatKTtk!oet{Vnj!vC1tv6B"0ݶ(1tA#t7wۻUo_UdƯtrRDNvڽױUaGX,! p)6;/z]fp>ir]Vo/#W>j{cB'K*fpv0舔O@XeVDGYUn3A bZ{;z(D$ S7ͯ1 (<:w,bx^J;3ȥ q\ǭRVE@:v/ø#xC]?+wzKA  &Or{!70jCo (7|V~3i%02qF1 1Bߌ |MR| 4_VNr$ xO@5 /i]Bq 2zn dg c]h:̷1_|4(1 ҭ4 D|HWgj:n3|}tW]F=rE sSjb"?44LwXi}WT/T :St.ZOArDKͮwa"Fel}:>,ҋf Os]dcD=ץ9sY\*pOih=Vġ3љ$vESj0qC95d 6!+{釣2-NE6FRdt.U'orK3W3ӕ,7ZZ4`4NpƭPщPn{k't"0-X!678j۴mخSޘCZMX*(p5\,0,A+'H('8vrFٓC_|Z۵UBRvH}1G:gpkѠ A3"-Td5 n_=/CȧY)wFv 6 lcif(틣>RMkY& 27@`:)D@Ԙѳ!XL:2E"ة|CVOfSV''q\Kii-IZ^'O+"0=o.NQ-{;<ۊ0sa=t,)2m`\(ӡ)HN3Lr4S+4e2ewʀýWY{ }`ٔc=\G*%h*Cp ȶ <ݨZŠ}O~rr!j_'ЇgeG*es pV*CGj`r T;_A?Б Џfnn! ~hu ZY<"T M^chi.5|C_FV z?dHm+WiPaTH0̋ػZjܝ (5l;lt Ď4LAP%K Zm"7ҥWwmxPB JmZ@_EZc[ܣ YJSHm69~@[ PSVz\3|nHA%A9ݹAAu?x_GWPF4nY}7MMTtr ?M~Eg: 4E p՝;> Ȭuڤc Xq"CYJl - HS"xW`nHg<[W'M{h#͠.Ay$Z1cFx{F0N #HV7h?-Bj,#8Yqvk1B<8$; sN./+B E[ ۠sIh>sc[O_M5tc?:xGFNhXm~7&!?{fX% 8ZxH5l¦',֟ZIF&kw3<{==.0֯>}4C6m8Y:F(2g uZtȊ6x Lq$RM1>ԓ!:ΗL!Q)%[uҩ,'؀l2FN\iC,('nyڂ;;D3FQ=-8Zʶ#mȉ mbcQ6 A_eFZ*֟2?}9xKʠ<`,PA"MƂr6zY@%HWyneM'26xL4э ΋`Xv+Oc3ˊi.)a92:#p=hR-)^gN!#fLYi+W%f7%+c6)VSZt6i." jc@F`̦9,-"^Ŋ4"V2-$q*{Y2= $XXVDzn!@w|=NN- L ]_N 4F@LkG]\)Lt䴯ŤNx5_C\VξrOWxZ@(DPߛP?A anA NqN%Ίk͔`WLk`I "IJrXkM&̊}do} BQɐ6*iٻ l䥓Pݡ{>`P=JaPxI;VZhUYdՒ"n~"M[BbL152kcFxS-:VC,i Gt U*%k]h6KY*;gh 9mAQ%cxxGͪtKTPw~qY'E8.[SMZ֠n4 K s8͛BmxKd {T~`jɟ{Ė0C`_I(AAӉ{ݡiof_uff*SgJU qIw\ @2'UODA4'&M|SS^G7WZc\l `>]pb/ \'̫m A~mnE-'@1@ғ.Em36-row OKhH|h p8E?5hMPMY:E#K4yCk'ń eBU^ޭץաQ:U3E3%J^_ h(i#iu1B`KX =@,8fbnoo$ uځVqMZC[sx7U3<#FwB&WU7DK8!wFT^<&ozOzs6hU LP )Mo4ʆa).@SKQM5@` WE&l2aM܎ܯu r'/TEƥt->٪rzt*@ |xT~V\Y9[RhbXkEw3&|>@: K>3^!Svsq;*훁ty50W3~!%z?OL x :c &(hb)yg"|6PxlnXJ+qoWE*UKPnӉFiHEl&]7ScH-.|-OG>_l%AÁy"|-F6oS"# pr*@@C<|xpF(`-<6HU @y̑%AnaېQ0B"I[MƭTxcFy &i*WPnҮ\3qf) ~qBX]6[h LFsHm9$>i6W*E7 l*ѤӰZG~A[ w M7gC߶*zhU__ D9!W^U(WJ{%AO'AKvd CmM<jvoVL&Wo-$ !YOq(0aPya6O]RGGd+ɐH)tDkiߣ#KG~0j²Y~[,r1#,>=VwEeyXY>$=,˷Mez\d}喗Y!OѵlzT~ϟI\>/%Fnjs1Չcv6Vj+Z{#(i6j*xc(2Pm=lbe Tj%{dYSDh@B[\[׾Ñ]RaQ@e I &y`2$Ps7mP6]gԖlNZք I|Wra; ڟY \;g a^f&OƁ AuwSN-cc!àxܹMY<8Ͼ)KI=)7hߴ{;q7vM0vg1wTNoIw*L NZ]H .9_P3i~6g_Sj a= B#U UUkM dw葑(HOȣV^~ mz ۿ4TQCrn0Q`zȽU-+DQJܠO6Z@oӕ&ߍ![/RYY 5DN.uf %] S9xBkcTU^<0**;[7A[x}0섆b}GRn+< gvw$B;>vD 7nH=M/reÝ ݷ~Ok|Z8AujE)4%m5b|Vm.T}e´[A>Tvs4:.FtKvɋNwF9\-HНCRݧ݊kG*^ mIP&=\6[6ݲ!#Z˸n,?nq1Ҭe!P ?GڣWcV'3&Imw{G#ͯ&xG$$J'G-a/ҡ5_zF^BBw>warruW=>a;D{KjA)i48,=0 vZk<[6q|f1,Jf2΅{2&smwaZ}XC4bVWoclLmYhhzx濭~s :q90W'?}' .0T 77pqNf>;[1wz7j6rwQi`}hZ̚x>HV;2nݩZ^gdizʚ|85\?=J[;JN sLTkf98Uͦ)ݽ; ٹi+lϭgݟ|Yd7N-X-:747٧B7㘿d³4,@ dM;ȥIUs },p_JZw>VW c/]şe/횥]ONf:@evO o77 =*kv:]+k2]/o+ymDפzsܞ[q84OO_ K7/{{"z\;_X<7.>oeo#ͧ| D: #I UVkwQ8+a;(xx,-Pps;s|QϮE=4m3>\lz˛?, Izl\63> d3>}9sv<,nAzYvOk9650cϽ>R]͔h) NMqX&o=+H_t,l&ĝ-zyj_tf},c%XQem"saB1m#N/; -9E %EM׮ytfr%hƄFS;)'C4#w3此%γ 7| !+Ne!3^/(|;]sPY9:`fБN蠢e4u?}rg2ۃ_7 I #*髷zH^k2:|9Aǖ?#UCvwEr͒N)⺔ߥy)8lGJT֍K˼0a6gcxDuc(qeWOR*̡K Kg<|+L@N*zo8ߤ9K 7P0b+0S!IU ni!;%;k7gDajwةN73  JU^ߝ~pno Cng>[e}N җ<owL;/l ~AYضҁHŢ5ro?*<  9}4Ц4WlhJ=g޼vvubfh}%yyq}DKϹ[x<7OTN^ {P̀&rYē!i#a__$zW5D;M3@{iF?)As,09:`i!b!eӟMi/`,,RvQ;L$x5"Pݪ&Pag|`\XekIiwA7ҟd^ENQJkcT۾swEÕrX{2hz pIb<[u{you(Ps4VRjI*MR* $CM-Z4IӢ`8(Nj K Q}0= 9ծF ׯ<(֋XXoUˠaL>2`JX7MX7Z:)j˜jZB#]z0nD@O߬ZL7IzHoA$11%oh^cCK]}\TUaґ^ķ(G``Dg`$(eu|IVS@TKe[gT?_oku()jzsνw\f`1{y}~10qeI.wFvBwG|${ڞ`bEs?UU!ëmj+*d.3Ι]3Xj0 478ol̊th<5AFWAݑmoᒾ|\uqG <ۖVŸո 3<꺬S5 8Fw.APS\]|@֗,+<& C6djUT $7I s#Uxg9lQ<(R8%zy I:<$T(ꬫيS f#iҧZ*rD}=5Qnro^icAi7Qķ! X(Cd"L<{mݴ9 HaXOa\ji5 qV=y/qPx-?0~S)8Ź {p0dz`"anDƿ%ZS~?lu>#h6|@ X %.ǣ:#b VRH{o@|Xw2g,rf>4KZz,H Y iv>A%%7-0,<ἁ?dSu/naSSaAC" …R\kŦItÕӍݵ |Sxp3Y)pekU%Vm+w{`;yx6㠔!5 kXt CC` # [CV_lĿ_I v:ﱪ_ >Y9r"^,g*B06bCs p#̆קW%oS7ŏ_`k 48uW }m^&$8ҟ%e[}_GkdzޯlvOփ:j\o3lJ9\ 2߬_fyquhbOl߁$|s{b'vCiP"6S"<< wd܂oEjXb<@4)h Ów`x}ѿWßua@~ ]q08A{Y ti{S9w.I; 9fu0.^[ ioGDF_u\$Sj5^t`f BUdIY7~9 &c= k 2$ k •țaf g{2Ukr{YSԗy riP,Zב>{*4#k '}~if:r o -9Fh{tӦ0M8RBa~ bysS~d9T,)R4wGi a#uQ&󶱂+cAB;llKQjv ]{K3<+]ȬcmZǭ8@BGA0AvO_L1)gjvsZ 98"m Y~%GQCZh :рvZ|̿=[0> +D$vy~;- l{]l=)-tOŸ'X&=~4u;fe+?I"3ԝw?.dd׿/]vgxT{(YF#[}p]>P]ژg/?ϸxwZM,*À2^dPƟ{eJ' d'dt1Y ɼ|HDʉn/T{.'#?-n{aS^)(+:\cIJށoRR4FH}?|/;5\8VN>2f1vM(+)uÿ_OJE,̖|rt ?G'dtwg~R7ZԭvFs0~9h?9ꫦܝѣ񓥭IkdYrYґO Os9+8?F$)I&x,QqqKj8<_ӽq9w#t]wWiJvy 9JC7+iME'i-?uϒZ/>϶#|0ȄY W8aT#4 iH9R}uMʬ!+ՏpLy?ñҥ-G ?L a8AMwRN3iYX7]@,y'H%0wR[]:'{9hI|AW]HKJ'nDI%遮)eNy7Y!zz7_("%yKYW)m`<Qڳ{"@OGnBey 3ٚ\H&d?IPn>_ 1lIWj׬ 4љBp@%:IQƌ1} Ogpґ0lósD 7)5y<3&gK!k=U6 ѷSX'>_v|ޑ^$]4{ܶS3Ͻ~,mb2ʼ R},н't-S ~r@qwnv.em-XNČ!r"fM9}S4Mkj(05ch/!FT|nM0#[9en*DΉ?PQͥYaj;E 6t%d)4`ձ? H @0%t._YYklaK4#./cʫ`ƴDwtiV6u aSM_A1KI0! k(D l~Y+Ab='= Cʈ̦m'(=3dBKL,R@hrCKLd9g)~`Zxwld],:rC;rM0X*ߊֆx47m|5T6Lz xHvftA t/KI;xw8hJw5&sis t%"T9{쏈s&lSr9,W8`D{DF^] LBkěUxF {"%yu¯!wd:l'b5X%W\'nBs+Nq$]1['dɽ^"+.{jWvG{՚-T; b7yL}%s;cwNtӊmD=lYޙ>Кa"{/fygD;Pks7Pyt,xw۴}y*v{1Vyb#M1;/:7њwsT7%G{ϪVV+[9CnVKCc z@ ~u.@"9|vtӽ"T$kg5z/eeDɸY%MlS7ژo}CπO튫|)m gF7Q^*dwz[vI`1JxAyEd ^kL$\ӓzpf M̷׭%!ݠEozf{3Eg'౯Tyzֵ:I#NM|wߧ~+>K潏^NZozw͸[s қ\5f'7Rozlyg9z3w,Ԛw[1_6:7=shּџ=Mxכِ5 ;?כּ_ӟe}7=x8xf xI5o ]syAρ )~*/m8ϖ8X OgkC Ag$ee AY$ *Ϧ"4(tբZ( ]<~_SF%VtHUI)ubUt]TQԯ$щzĕiObؤ&:\IBSMU@e#Z~Tos&z9?2M3 IMT]%hͣ$]GzD24Cʻ~4i5C;5@o'4/.CKܝ \wYeJf\B1E!ËyYas򖔯-MߦpaVTL,H{XQ0@QU" 9;;;˲۲{sqPD9޻nˉ>ۼ'v;^{Ԇ-'}yw=w-':y:=.}Dmޝ8M0ofݖMmw{~7{嚻-'ڦyGE8ﭻ-'+] \wB#ߐ>-e7DwA?f|Xv@_Qc-rMxe x.tx4ZnyߟuT),X&k#037[ +D3$}8uz`f$R]a1 C? FTy Iad$30t) U"ܓ͹lR.˕Eʁol`w ܾɳ]~qb{xMƞʗ#B͘;g\&8g$Ϊ&¯X01owa?}!c~( _xu(*?$;ܖfy/n )o"6 \oѽy_Jyh@w +2hw83m1 r8~y!!^q母ZWAqx;sk3Bz\SH@D }0T0LjZN?.OI;#2+aSI6rdHD<~_=˂2CoJmoγ]ޘ0`2 `Oq_R2u!`EaʠpU94H>'\ǿj%$h* *˜k9A3W_WX* *A_iRc))}0ӓ _HLe~yZkLIGGSǏ*ɰ>78]8ŜyݫctoY\"ӣΓ7j.uޕ<] k)["!/3.91gtx|v2`/0yz q}s˜=;pF9:;uye̹v9{>uWQ Kas^ilrK[𯄜x?g_-q㕻7o aRnkܖ r[v!mpZsLg3!`_rg90Kˁ S+-Ӧ9I?g'Bm Tg/`ݧ5ۄ mmuIyEv;cn:cf=tʝr}.!+vQŤ&9O3o8큵zJ3ιԉw|N$ pU978߾s\̼pDNΫ?r.Qr"q>9g?D!礫sާlAl~(I C?ԧ8;b~)@/i-+@&6I* v{׳{k̂\Z=ŵg)2 Qئ\k7l5 mi3[5hay{ mq{4 l=TL- 6'pITȾ^޵gS23p˂SznPIz% ם'q4#Hӂk:S)hFOoGX*]E;&@v?g| zO>2r`kr&Q> 皾'MF^0*c@2> ,8#3W*ƶT/hm -h3M Y+j36UmIԦYf6%کG#P;vh3lAϚCeiJ0JSGdȥ2unnhiww5jiጛl5fj\@c;7јQ'8L Fv?tu]B]uXeK) q#xq?#i7؁6i|)5NxF"rScu ghܼ^gm4j|m&MSxi.'Ԃ yD6&錾/Ipݺc} `G -xs@Zx׹Hc7 5j|X_k\8FqFD^%8PF-V_c\߆yR5gmq¶VP[;XPZ%۳$~JLmNB +Ңi[(4PFUS VMjH t-M6V 5Mh 4ʢQG8MyOh{ځ&/t$i jnz^%qHd+a O Q G>jI 1nj"(PQmp([!VCޏ4萆}1`G2geC=X[%^jZJ9SN$}cN$<Υ,vy;y-_mS\gN嶖Yo9k3vz~]zQgib{.gWIܹ'ihh11q,j$ Uz jsNg5Be LRp_(iLRJ8oīпsdYn<5F-j;Ҳi"$N+ Uڝo6inyRT9y,ؾ y"{`nG-UDFb 3 Uh&4J՘@}$c)I~Z{GӨT?z2ZXl̾EL6ed>ҨA٤E}ijLLDR3u+gDDT8s5DU;EE($A }x"i6r^eb#Se%˭#&&. i.hˤ0HC4Dh+Cf@)I搟o3:3pÙv ϴ 2RKdek MѾX%+앱IS^z6C>%':">q/TO4Dcr dZ$UC&wP PMNBFvblij~6?zeQ bl609|!b6c8oAUN4K$>*픸J [2%סRWTr]bR:!kJbHbO9ܓQ䜾+jvLXǂxItTjz!L}-P{fnm4jHUBTPL '[KX0\#ҲGd RFp *PIZB>$f{4.UO#/Jk5-QsB+edQ{Fv:눸.NQC\mUA5. 'V T0ǯڸ%ul{N j"CFcMa!B'Í%qd}I HΘ%Df*^PILLjI?$}Lɋ$lKpKda#Qv๫9AZ ?؈A(5Uὂ(RH"|[|X0-*zlgͅ"|MKyH)5г8BǏg{l\E#nF:ֹdѠK6jΣ 2TDA!QL EbB(REpvW"AAjJ/11T,&OF2赯QTFk2Cδ%{u/d:*wc+CMKё`ņbKJPPUuqBR|Y$3GKғoe,K+|D4 R7cVu! - dAh7" P) k*@|B¸L:.ิL6ev FF\Z)y\:]\z}D\!Q\ZӭPƥ!ť'=jRqqiEgң^KT8ŸrqitRǥ_ 9KҹbQ\ (uO[_ŝ߰d`doi4q7Ԡy4:(u %*V5iL?G*:QiORIh/iJRf4Lf3Kج$Yd Wٷ_v4p7k|NZΩ=iQ>pb.uuCCa>\?k>qGֶ}a#*,rCVaf}߁6>lt5;{r>įj}/, ]/VNeAtw ؅1e\X&:q`}@dv?5\ J*E}idD³gq >?;O~͑OiBbKtVif}/uSJi>)<擁)5I9;'? zIڙ! 8r]_j֗}|xρ/3V/v6Km_f}PN|q1Fi[&zv+v%c>~C^9dܭtJi84>$ 2'~bPȤ 8{f,v{~~~w7w"~djsV8l_IZ8u!茉Z~NRK2Ŧ5cSCt5+?EMcsg8pc $hd=.oDkn׮ㆆd*pM$;6=KК ` D2^b6f]9cI6*l!qC: ? (d޻[ Fl}w`7qqcvNH+vᝰ>O nݛ.twBy,*uI˱޵č0>[^Q %(tƳkJ O ;KCb$1];3MlרSp=k',:([?B 4Y=0 ~ጉO~y,qx{5fP]Yj1=Qo{`EJEB-?J62z[ 1d: Uak;xZaȿ9@t}Q1 YGQS瞝sgnnb[%8'sG΋G_M# eg +Tb_*ꩾ`"ש', CK{xSU)UG aXjEM iO jy)T>.mW"I+ e| H>@ zqFX9''i~oWKSG#6 ps"ݏ\çdX EE)Z)5JVp]9%](s?o܋ E}RS fB)cYBk<&i=يQm xߜG"kJ=ND#*'HhP1X%m.ފ>Ѣ 0R 8D30W"±cOA ȞL@VI@:dkW8v87 i֎دn;N90'c/=968v.DZ]8H9uƱۡ{uϱG%at^:}[s8!3Uc :cW2v86~hsydAd؆ X}8v}_\a)-7 "lF x[$׏:Q<&t~ - |x΋%uS09,pj+ XyZ/@4ݮӲEMnq9Mmޘٞ.`ԝsg9IcҢMbёVs- -ϻV'[*jzC)j*xtKKRQcjd36 q`viW-=b(o9s~@y ڿ4\ j נ Q_l|]` ]d /DY @V )~/d|"O/ -r;!BI yar lӂ}π <\Ik6(,r~)':. խc3?z%*-iWwq&8pP28F8x'_?J7WvqW{y1*/"I3N5+7-B48Ρ7@QO_ w`"f+q쏭W?nW fNC ^vO߮o|?K.tY`>{~do˱$.soec%OBk<%߭ bK"0aif1RuЀal1urqG@ߕ0_/rp`Rj w3?6H3Vی]9~-UPJܶlTϦ=Ѓ_&?=Îv1i|6[Գ!""ADwrus4>-ΊkrIKha Hff83ݚbm^P 7:PRF_6PbM$DW59p]\,,Z_+MDq@ѠaɡWepq}U7DߴYoI4q&"Q#)'/F>Hz,5(Cڿ .<kt yr\3\btтkWu˗}޿2Wz*bh7ca)Ͱ7~0YBx9n{&(S:nA߁8~w_)N[/=YW_ݰPyYX=6EB-\$~X1/~_?bȏ~3Ȑl d~[u[[F~4)~.9-^JXGK?.҉gL*nO K)ܨ6۸U^f*YV%FL{20bIe=p'|hRHaMQȪ V}ݒe?Hgꨂ?g 2 WXA$f!8vrb ѻ_ۋH'm8pgOV8gF<InvS7n6 =_,;؏ Aup5m]rg/KY!꼫KFtJcv4xQMPבmP.S5ұe4e+y Y6S!˹L#:VP2)Dǚ-!=~9Fm$.c8|/{ۋ[7ú"TX{/?4@RŦRNNDpX_^X&jymE >~4ϝk :̂ DO%{kעn{S8EuKJ>&h~p R A(&[5vM Ac+dI =+y<;yW-9qvztGfS倀 a>un,!krr/e(;mh8f;2a+*gx/1!w=EdA5W͌*Tvȩ]Q`E&*b~L2-Sn ?IDvA%0$ЎU=k2zգWW zaqDB #~I t%GNM{[*LF@_P\L7gP" LhټGe3TI0*4*H;3S'*I5Ns2혈R3}vPeOdGdG-8rb>N㒝tU 49,Ąѣ7X>9̤*a5K=Ddrq|)@ Ϲ19i"vz_!$JaޥEaPRrK3 xeHP֋e ([yAe.2yKOtdN? <qa $){A&>Y $O%~}0%G x Mo~C< tC?nsBܠ0{I6#f uZgHTҾ޾?Aکⴼ.a#AQ .FEWQ4u`@J },+hXVd:`Y4-4хm$匃ȶ8x* \?nuBxe֢B|8bw3ϹG}~Z !/9TeJZRʳI!=lnY@oF`5> J.02!tڞB"vMB"q",0ὓz 4ޯ{B$aq(,&.BmwxB@ XB <)UΚ/mzI`X|8wI@"y#Xɻ G.ҋCyA] u;Q]ps}dֲctqm%錽D35Q?5|9{8?8QyN|{ o8k|>T\Xw9yh]+-gĀlj켴cZ 40P,uh)j8fP&+Xf֦![~evyY} >[tE[C*mB"΁3*=_hl_kudi'c_=4π7kqdxsC*"\:'K%43Ym~nZ(end@[它9SRG> OႚW{9# zXaWOf Y{&&%ecKDvJ]ON`{\ aI>AI=mN)E2 cPSijB=BTPialvG5Q+bǾƣ2 Nn_PBuC#K`vAM\QO"heEAACih28 5T8~iNAmLcgBv}|RtdE9nB n=Mߨ[?G%u= h/:Jo5j2ǍMaw~ |{}šU$gB rpP"8(āS߈~ cB阓RU3=pɷ BO,%aqy*Z.^rO^,%l;k淫(4'48]z!RcZB'2mS4hmA X0{ "sM'ss&%M/SZM$h~mh#SxSi)l OaAaAM0!R$ (()旉\mo'3'zFU^_6MSGQ7#Vcg\N-EMW"FoaU+xW$al\'і `e8כ\|toDzUc ^J Q#H0{,oyeإ!'?ǟkZ d~v@i)myӗ=$j*K=LJ$>/j";X@;T|%2_e$&ӾKo`-~uﰛSm/۸GcΩߨ 7qn$sg89mܓԭ&5}Im`I-0#r`\"/FO$['ͺZIƛNI%G \+iw`dAIү0]JF'u2RؿC'PO1p#|d;Ly6^$x {: K/J[$0u7 THcʿ̊⥶m$.#Q۞ppq̧,?W8 6B"񓖡sڷVS.XA[m$/9{fX *"X5%z网%BK>>=9|w+N7g%/{j$\f2'qQ%u^yɻU!DzƲs%{%BK憚TleAZCK] xUϣiS^ Aߪ )&< E^Be*-屦 P~M(< .R`E=wdh]$d̹93s9I5oZ#$㒵J_Bq.oja2gHXiq$%]%} KK 6.4Y@6ɽ^mZaT;Q q- Sqyhq<5]|qI{\0.1DBviD?N:͍8Y5N.x#g\I42u-w-Ni 6pRn̆j6hM!/䚧|*jnl~: N%j ,ī빐e=j]La Dfy簧[ؒں@g%<>ji4/-ߢN(7SPiŸu. @c2` kKcAqK|x_c'c|F]NvkH򟷃պ1V-ջ5.+$.;4NҚ](K9AX! >>&s]Zq.5<]إom.ߵ -vܘˣIA.C]D{~v"<ƥڥܞQAkr*bJ  yܾTMRd~+|jybEdK*Phkث,'r+O(9,7MHtk !rs0Bl7κxغ;s?w+x'j(Nx;`U iR/eRi̥Ҁ/9N+W WU*5JJb:xcnLV ξH QlO#r6Ș112dWR+Ǖa8aT{ ٙzllSlX.1&vtNgy}k>LLUgF2;)[_BI$HpGb$9|iyŋL'9$SDnW崂iVjvfkYk&~Eg\(wU+ʸI}9Ξ*̏ЈcÌ3l?oW\$"d ̨` b4fBt%=ȁqD;k@i0801oGQjfj0NUi @4}LCnc3-h=gmžJz3׶Pجys+\pBQ\\5P00$f4XMTm}߲m5j[^_:/߶ڎlkgj[?+n[l h[3k[UGmkm=R`:Nۼ-mkru'_mY벭?nV߄@Imkؚ_K[ mkgVҒ!{ qe8 9:'c (.TeJ=p&זH$:X3ΆA|t68cP[ptJ"#^S=$7&qؤJt&jX 9 P6Jo^Bj`kAm!-|ׄ!xSS#Sۈ֡Ve2MJp;. _#ޫ5UXp4U # uL]IH7vED雃1 W.$ŅE^M' eIe'w࿕rptGrVǻtS< L"ƙC :1O15M恎:Uُ+áUMyPnC \@;cr4!>9M-~]Pn=6Q؟g+&dk"ֈEw apDZjCQu.sXY`AR u}W%C#UVކ\gђGy{ eθ۶\ ߲!ҬeH=sYkaqҿY!Iy;M1 ͱGy!1]o~F<(L3NN3Fu{2^7۷׭m \H/p%/Bg}̓8bQˠǻx㍀mě[xq W ~U2fڇbH|! |:|lbMTí=#=҇:!1\<^? `D[v64ްxN i.ŻvW^xnrwZyWl強or9o5*6jkǫ6$ǹ3<ެ{;/WH@ GZ aya~@qkٳ<@6PA_^>Dt _t|`[47 l[$|@ӧYMkxQ[d2v٬`}z7cY^">n0ػxodlV]ǫ\!a`3{4޺}oN|`v>個Q. "<.}D]5*˵-lRLj>b^S9!kR]$4ntW5X`,SB Z`e ߴe. |9L evN7,/{q0"7*T(<NR>c0> q+S.%+< 7=##rM(W_k*PI*|+/%CѪ$5ץ>M?@ wƶ^16a=f NoKY_al|=  8^f1`k <xje0`y0nE@ ŀ?'7G'QQkN51V'84ˊQGDt:Ҁ85͌ɒ11Y< ֳ uqipHaEc4;S5e*M2G.Cg,V5O" ^NqA]MǦB/γ}s)kn>'peJ|L(QZDHު{ χ[CɃ+1pr5}LNuZ5a:OOUiUT+m/o5d{nKxo@gK8[P]O,~y+ŧ Ak{]$okOyvAvg%%mR^f,0taIKM.ʨ"n;bf쌁[WSb4wL;LPP"61IU}J0,B׈ ;oӉlj6]o_Ac>UEML3@Mj@ނ4?~߷$:҄*: w ^wfV'Z%}LF"ul믜6K9ZVN+}H9G.S;7 GW 3|[z-pF)I~s}%+C\f{اiSۧDit.Tj6>E[EůO'bS]?_ld#Wg6_n%|VݡgP /D3^-DhcI3xu*-{d! }<*[D[ t!&^*: Bͨ0&M:6^\UsP"LM.ӽC_ @)X╱L p1t=-US}jys%iz!VƕtuN>&*#~%}ć%ʕxo}&_"u}է?D3&]_oچ+Cw׏/;8~;8FŸ8kVo]ŁZ|8%pr_ܿ21|Bspu- m٦ *(^-RPY r!o<|pڗ< ~K@滈H:gxSh1gܙ:3ο:ZdJ}!کPN]hy[ٚ`坰L$o95n! SԱlr(!=8R !r<u#CD l)gI=GD FTBT:ALjEgI2b<źQ "4LDV<%V2 Elg S8HӢl Ur%E,a/#Q(xY;C ޯ/D'@V#{ 6QБY@2r L[i-7]5 XtܙRu)urawN즿.>9ǿss-󤟹{yw,ʻ["ɕ 0֟t7EnS\d*F;98!匂 *X s *@!"-= >^0Q D?Hv}N) >9SDv1?vuΡD[S+WEίl5hc90mpCɘhdyڬQ0k9?б'>1j(c;Gkxzp ޣ#&aoF\ Woox&jʫB0[RS% ݙd'WwVKѻ} aj1^N1F ]1t&>%# pS_%z!%"qS?c,C:나q*9BpV(^XŦSj%1Ջ9bZb ^zT }h8^dTks 4ڄn`sxky"D7'u|9)s#8kTi{Χ m-iq(M8BN_W``p e_g;yޡ;b ,s=:W_wbI=@ Gm["JgX OoPϤ+q_֏b( (b/¶%K{Pe62 Pn xUf%dD۱yjDE0X>ayK#8q EtAݱDFؑ"ڦ8,ؖN`F|;9xIN׎̛ =yf sC]w\߼\_9$GQc*Br_0;_s`tQ8qr8pW`LOA(;FOQ6QdvR\=MJxgI[#+A+^o(k8-n \Q8Kf![ m-jBŋDg”]اi%V0 j1?]ӗ&f\8<۝a{+D<}Z)!+}`!3ΐj[NE~AM rqLScyDsI#)/oUmfeUKqjÏc:nv'}wZW|@-]DqΉ/ORKJQuCaJ|na!b%Ҟ-ש5 ؎2 .؝ , ĂA-L)v1}Sk]SWdXv\fhg1|h/G0F íE=>le29[0*j O!6l_"]mb>'11tVL,CK]{x[Ցl+QW)1Gqvְ㰑bV^EMĉHH4MB|u@y.o>tcYҖ8/Y򂄐eP5*|!]9!ɖd?^;;s̙33'# LK7 s5 Rӿ, 6 ćm`awƾv\ėT|lP*?DJjZ+1_~&F-LG?d2(VÄ)Z3޷U ;A n4F ڙ9f 5pwfH[3m@+~+f 1úi}6a-}o5>3Ϧ>ن$}ƙg/@֧>o}6xqW9>WZvg$./de&k/+>c8&iɗM^ suFeչʷ&z3>bsuޕEQe؟[݂e961:r ,<`54ݛGh0> : ߯~R\,}n*U~oL!VohbJ&C}{br -Xi} _%dd%;OhtJz.h8 Wj{lA,eiJm>\F+ [Ru-[O9@rdȮ5,j.Jl⹛5R݊Fo&qMprbu]Ms2:WO(<W0D/fk:5J((g|7m`|ݦ>oux76ǦpD0=? az(+1\ ><7,yEyH./ -WzI iz UZ#cn֍E[>jI,?&NA/ `8Bn1pK4TQ݄vpg@o Mb45K}/ Nz)6.0x fWGfSl.FJS>6N=^gb~хLċݻ;>>Y0};B8X/ _ ]o^MdTD\i9FЗ'E_A9mU~m? U4[4=E;H3r\q0I]+jwd3r4 f[ m|sUsߔ5ŬY)g̲ye) >|M|16e&;h{`u?BDQAv~]rsR60?kr5I&[xq9.MDh9' d3-e@\ sakF,NJd>X^K|u9,/,ҫ#c jb^@<bevƘ83adkMX7D uk +>?&%ƨ{M0U>lW!yq+.cWÌfAȤ'#壃REiަ#Ϗl~kDBrX`Ctb$j qaX/'qm&l}c[al:n_;gB;Qpx :fƮAcb*"bNK#9oM1DxDxEW$1fgS&XCޣ.Q;2oNnDX0+I7#&w˜W"gQQAoJ=$~'<=ݓzTҫ wTGH_BS`F64XǾf>u_Z&&}cOcjrc.A|X /[ȿhl5|0|'օqK$UiHr0S2NJ oRCymhnd^Ɔv;H}V{{r\La.LsVS]snR~7e*YmIj:7pgf' oT q7awnjA'tQ1|+5+l<+;K~PY g8ۚ8w7އ+^z*2XT|X8C,>K9}XcKO Dk2:UHfcm2XL ];2ڛۮ"db5)Tg¦db׏Y&N_E3VL,ds L⣊6J9ryP@5^*)2:}@ I@|V~1[lpx@iGr}f}<7}SIӫ|#k%TX3R)_q(=RUGGw7<ښZPrx,:Cm /Agߧ OZY):቎GDw ul%` |hߥ_Ex@_Ȩu'RlL{b\(^$'guq54<~|[i2'iygn JXMc+`n +BoəwA7m["">{?PZKn(8Ӵ.q@4 ~PFN'lA9n -EyBymEF1'اܱxêE- î:.IkBۦ}D?#FM?l:?F}s70m>M_ݴkI<:8dyk^Ha܇͂bGAsʏ{K233n뾌}8?ctFNѡdJl42#gf8)fZ՛Is~tӇ{WA0[᷂Yg pA*oMNڼ-#pG]9b6PnIL`b >iGp Gi5cV9晝3eu[7ͦd&)Q_Cܻw[-Eu(nj .y"I473;_lmGK{0]=|y:*7B`uنXXP| F}x8!oN\^u"Y,we+nћ i(\y s6[ơD!1=Np`uj*b`ET+@ȻS;N#%V8e]h99uqYdVüHSfd;+KNO{z5,nh:;~ML.UƲ=ye[]&QjD;^KvO|x(/eC&| 6[e 5Z_jo5-5?ی0MU,%4X TU+v߳ {YVuhY֡Q&;Z4rh;c#ަpzVc6T *ejb!݉nc_k}UVsJHdS;&g&2nFЈ9͉Y?m0x.F=~11v3c%8chO-;Z[:'U:\0${D^Q$uq-NR.Fg9yysxE.79]Qvkj=s")kqR~H!"W﫜Uu׃"u^ck/CZ߅e^ƹH~#Y9M7u_Y7'xSyk?LfH#@0 ax̘rf )A:~zoS#AD'r`U%JgHo+-B3$P8wϼh_?2gf}^{=~k}֚Eeϩ yzmV2婌j]jEF*vw j |a.қ;LksR S ^(4mЍEC}|}~ZX2u[] _Dō8ݴXC4JfU1sRgfН}DŢnx`ʯFM "5⎸㎒0*jWμI8l3j+vkb M5,:Q$)?lOCMnzd2y(69:[^c"{p>bN fGfmz_4iz">`+ :ꆫ Rk?݀bg!`*dˋ,$ȣ ̫KKr]Qz oFnXUl$cxIU8HYϯ%oA[UBqڥY6v[#lA_NpIA%l.jd`g&N'ME̖#HPD\Y2G}=)7 bxآEVx}Ud?kiQ+NgzN8#|AZY?^NBQp@8bqf׋XS%_Jg €s" m%<ZS:c=]byM& 6nf AB|_*ܓL揬-%G+~h>;suUr ҩA%޽50767 b( VZ!yaG3}b'zW0|aA/Fs\GȘS<9 A3 6b3 $!׷I(Fbz`|&_hh% ~XQ.O~K f(V~i!"V0 )˧qù k⁨lEV_V+5kAY5 7*`-/%uu%4oȞlelul)Iq-xQM,)Qv&dN-9d bb$|V*Kf \@d6f"f~8+5eĄ\ܛ)RuӀNRл3j(EQ ҭf5Հ /vbU 'tbjpRa^6sPVO1-Gs@՝(

    -@Y+hG}95֧=܎7&ν͢Cm2>j VٱWiYk=[*Zz.S ,1V-ۘZha藙kaE\K{:AN p"vفo^xw@kx~'"ol!Vya3yG_LlkoJgũ[mdCv2ݟXIXaG\ ?ұ&W$fXowoRX뗽Wd`i_Sf :ֿZ[a{ .XHdXX3nbL/ *?)W̯K \Ugd0Ns }I:D 2:jRƏ|ȖE?x <·/gc{q՜d,Ӯek ѠnI+?EY' F*:Ɉ<"G\O(s7ִShU`٭`Fe `FzdpdS2%:D̬YUJe݀Ϡ}\vDutGaH}*)V+Z> ɰ8t͘Eĵ?S9H 1qꝖ4h43ˌg#tQPI DOgq!WW87|*/:Pp5~kkXVpΩu- =qg[P,2΂pe'޵?|2ҋCA:ͩphHj 0mzӌ-ֿo?o0~5~yKS?M=K[ zT|t(4>K"]1WOlO0&;J2y/_5'' Z֊v(v6oncq-Ofv]=VVk%Nd~Y7r4!;KN_^C=>5䗩D@ė DžzLH}?]أ+7>m'UaGF@1U-瀾uu".!'7[)P`f4tφg}V:.ijB!~(=Pd\eoV;7zX9#|9iQZc|9#ȠG s!Jz\k_Ff9O{hh7܈ʽC;x)l@'9* 1 .\僼MQ91>0;iAmY]8LJ;oLuۘg_?1kqbh7ܰ<%#d|6 rWu rԒIF 0ˆU~9όP=̳5vO_?3q!n#iǺ-p _F%Б +GqGZir r!$҉ہ`^P/{Y#{r'@IGcbR~\faNb kCSf'VbٲsWJ/0g: yg(^/MB <|Oi~ :3ԣ4'!Lfɠnab[lux8( *+v4e a;b |ֱ7v骶^p` 9&M -;ԍV6XJlW L=TA>|T=LM=[)O:֫WU#ٴZ9hPdpZYG`-jˬdمv ZZu-{Y!YȐIw,!B/ޓ*8OL+ƻ@oM=劁Aѽ+ADq9wXS}i>J ˕+ 7y0-eN.9Y6_>bT RE73s9!\66JZz{qFݫtHT a}vV1uW(:DVu DEs:m˚snm܊uHA:[!5VjꆂNOСt  :yJ$cXO)MS`9)Y;j qzV,i3m\6./ s6Oko}f hC=Ӈw#]EhxJ!G!#;(|DKzkoDkQ3"Q }Dhkm6֚77b 5Qex 6}YhzbA8;(YO>__ #afkص%e-:ۦ$]/Γs^S̙|z 5nf Sʚ5M4&}#&H֘e8n =eeh4nyaCwj4B, U ga=0oՊavrJJq )"%,)+Y]FH6:i"I4Oh!YCd4γ0*Q|H֡;I{njAН<j{CTxl<3|̭ȕePXchP ^'tK4 l1Ww6Q nBzo@7ՉQeYw]LӉ˝o@ZP$E9U^>0ol+R{Ѭެ)19mf?RA!=u֍7%GK=E @SWZxQ@PR2l4G]bwvڤB FL)iTEBYeTJ 9 :l4w fu&n}aڮ}E${Iܿ/Je$.##o53H7)w%n(MX0/a(5|'$Aq3e,쑬 _JwubuWMVl~\]=oٹ yP-4` D.l)=*w0jɺVOA$%A>d-ӵK44'LOA[W퍒5tؾ `gX M}5]Q[3V ;D?cą,4i<[@䏧%}xA꜆xwdӋ{2B.b]hU aGv,KR@> >S^coT zgĻ<]/I-q4j}f\ɢ#( ߅*je$IstZ?@,M ~ |Ӌ~[遴o&_M|؀Z`̞o&M:Ej-iמ-U7p܌Rsi:2sH6[\_}o'rSc_m;nH”U6!76hȇLwsB:G.؇lC$> yia!Iivw8T0_3ϑ6_փC8] %5yoކQl 6N>vM7?27@oSm46h-{uxG NWᤷ ;=UUM/j)TBVO 0:vldH/wA8K\| 8Ʈ'BJ,Ck]Gbo^wI[$3rbzR|[uţs)OQkp b5>úa^TTS.EF44|NOlce/Ԋ9uTp,Ec9s$d$uu=_q6_YK,hP*%\/{cF~9뺕{S[RُK]IGf'QR{>k:y9LlD3TvDmld ̢#%xݑI%E3?%stF|(0 g}`S)$k"5gMuy&,GR棭n};E"$}20'&}9Yţ3(\pL龳.9swFwg76>grk:йaf ;E}3[rm͋-g1۬SB]f'7dR#u__X8wN &99ԙw8#KFAl[-,y朶6_"{ߟasGQzoysv\Ȑ /N[l3O|x l:NԙY'qob@x ؅i*wn(etzG8m\F& 9; ۹(?v@qN~˹8k+ __\Ә5x#$ ߃y+CBއBd s;ogtq뻸{#C]|;ɡ5oL@E)˜EO.K͟&ʷݎ`ƐdԘWA^u! ݝ%P=TeL6eyd}- LpK&h_3|2o,Dnް΃l !(0#q95 } }boH\"Ѝ[ emA\9 prêlwĞg2K-̮Z>eqJ :GWgpX3m.5& S4mڊX _\L1tqq!6xΏL=2L:wO7&Cu[C\j 5uv=!+y.wu/S/mFoK#e#p}֢qxA' )4*N.zpM UOȼf B 43h3Oh%37C \3R og櫒hYJa{dHkSe}FHW#x~4I/gߢd@;i֬?h؈ ZW̖aY~?afݽm,٢7VA ,YGvϤ,~ drOH$h?=J7z2x P=͞O:lR;f3ӻǏ7I֟fA;.0ta kŘ4UsTBAS$Y~c'x=^anKw/vC߁Tף@|LG͸,8+["xʫ2HBOAUsuC4cG zJisuv|OJV oe{jhL:Vu)KH0=.#ϻ}>Ǡ!-5RLǹvˍ4|6R捤i/#r)~ ( 2ڌ+~ y4h%՗(黝mr<ɈˮmiPF|^p&nw>;JGF?$nl[49=y8TGh)Ƃ(! ed:9;HLhT;*.ՙDmMj#N!Չɿ.g=S *hW5}Hh_g+iꦥ t%G?nLBz&h F[2m_>:Qʿn`K/&$;*{`mGk''Y0U`'!kil7g:+ 8PJgn&㩐t^>ӎԗx"gi0O? xwSϧ1#=xdˁsfA) VdR}:<ըn~WH.4mdv̊K]~3k؅ +xM}i9)y37x V<tzm\TT_jrNst;>_ I⽰![>]7v^'Rw5-|O9*1-ՐiHO1\}jdް[M) Qb㼯ѫmPh3SwwZ`_Hm*JQlJ=Q;u+=HwWH53Â8$qw.47~şnl#8-"nю0p|k}r|AȒSI΂yf([$Ճb-b!Tn= AF~?_%&# $jY7-:`@oUS.bORAb3"6 ֜оiBfWi_\L ڟkBAz=B@hVBBd 4$FhpcV*43ƥEXZo>WIj(R^yezdf Wpmj_w̫2E>qA2S_Q݌{w5l&3e2s Hf*ε,3Md`9̜ܒ̰4P9&ޮoh'5p}4<9.BW*su :KaU񿱠HEi.-AtgQnP_܊;;F4}K6&͊ t9ϼU~T6Ѷ(F鐐7ERzF_ˀ|524eP^Gj!M rvvid[.Y_Xg'|CY--"|5zpA&t_e-iwe'o}?:!a ZowoJrb k>ޙ*|ɜ?og\N d#E );sS]{ Bb4XZi`Pvq[v Ey #%2/ޒu糁6yn KwC+zE'5m? v[LS8)玔:_:J 녢$վxVXH3KÓZu|C߂ V'|)Yu\zs b \cxj7=gIuH \}wڞ-od!epwp[,Z켰K8,n1 E7iy|!%8fv2Jp/(x'^[A9XG+ZNlQy f1Ƒw}G8”߈9vWhG/,>~^;86 gFBqS123o!~>Wcg}>lȓwh,blMmvڽ>+ 풓Su$q9$D?~Br6%, ,三q-l_Ht׸BӄiFwV&uc7[o|_OpINȼ EDCRqN`ǾYRY K ߬VPLXPAJAY-t|pA:,fәcvzWWM4LSsoʉh[y$d8U,vD~+/{I[y).1g!yV+voϗʐd*61oZ]o5A~+A'&~+#'n[ en٧dM[ڇ[Zp{IGܾQۗpWqK:q}xS^ۢ=+nOd=vRƭJㄛyeppZp-^m^aoOƝVq3^^k]4թ=Gm# njpK=AQm Np :%nq;}v^m(2ƋׂۋZܬ?O-OSprFSǃp{ŭXAUn+n2>>* 7rEp.ߠEOnO*UvhnϟTqPuV2v^ۺ nӫe\`%ᖵ}^uOn})FOAuB-zq{mLu˂p{2ې*۠*72wnqڇ{ǯKn)yUASq=|9p{*ې׃p06u[X%-Rƭ n!uǮIZ! n4 mQ ^nwVpain*˯1fm?,V]D=ׂCZܮSq KvQGp[\^q,ֽ[^9 1ܖq[[}96Pu-hpvVmh-!yPnëT?e  [FpXp{BQ2->r+7Ψ=p w( 4"n*nmf)͊n\ۣ[ۀr[r.Qp[\JMX>ܲ\ no UWq8p۟6oʃpp{逌[^[ڬVU~MzNm$Ohp;t 8I[-eE٢0jeaJ3: C,)R"C軨\`k 14OEɬ/T)C7  b=ãůC=ĉ@%cpZ ]phwnlZGd]<0iIԤ[dTMQ⋚&QiRw˵aEa搌ͻdl<$c;D(YZ6[9Ij`mj|yP0;׍}âEuES"h*bXт.ОYǕ|DHc+{"pz P@]AU?HKUoVHtYՋoX4!+"l|¤kĤkY\ۘ|iSL:d?cɢ0yUL`A~3&*[aGMyxߚ}<4塠UYamȑVx8)9п"&{wJwOkm/{1E=cmZӛ!Ep)Ni8\ˑpt(oP1N57Iv)BTaGZO ʃJ*LHFs6Bm?h.p~\?:X.~g"elo5AjoU)B-fPo2BpSFnUH x| KkH|Z{-G^ǯ%50 za"##&$%awos-qk%eA4]K2M;6&0إ^x_{~Bvq زہ8dRQ\N* ;=r ̬2Ҕ5im50.V/W#V_Ll|?пڦCBJ6?9CP7$n}0C=6M&B3Q-k*lzV$xT LE?{LSW)&Zex|X s--PZڢn4!FP7.C03<E؂hH[]Eq ;VAd4wιS='-+t& mD{T,~W[Q .G5!99xCNJ?(h˘b)_ȢL6xHO/eY@Eny^=y^2X9yQ@| yVsH.u_x~$o[(MS^G h􉩦=]iEzдx*LUhi͛RR/HE_*EQQ&<5jb t+ k}K-h'ҁ#L %h&$MH?}4Wb42?S!Mnhj}VckQ$2Pa8{I<I.ARbq!5hF+{[nxWSk>ݔ/c ϥᦓpp(%᪙pJP*9_bzh=k[kmN9ovjsiS8j3zHk3qvRhI4ch*H4 9YiPBl;sDyxpkKwn_)-uU1jk'#g)*FNw6y $޺ X@A3CK]{@e"x{g HdTjQ,š)eA34D7eX@ĴzۛfJf*ڛRЦ)=ٝW{.;3g̞y/bl揄W6)B\oMnF*\.񺘧]j6#\SݸRqM،p駒'F6#\W.!z6~ Ǿ$?#1>;EӸ}ыrDa/F |sX Dj>`TG0 "K˺S0!HvH5q?|!o cE:^<_79VUN݌U0ܰ rgLNjie>@d#2{2x7!1 .Xm9 ZɌ]n^ ïL.f=*=hBÚVcW>#Bhǹ81G,RYw2yY*2)\^'lS ಌz92 n iֳ imձ8p3p&d cmue<lDJcs6am"J'JYxO&UXV9u/50_ 8W/$ ^ 8G"#._| zwo!#;\%Fְi1 khbFlm٪*1\,+2Y4/+}#B6 #Y6 7֛ UsG4/X#i*]}~f`\U6!FV-T*LP`a&  (2@v _z]D#Qp_t| .GEs_0QFuz cR Gc `▀FsIG[OzG"'|%Ĥ1_ 53_Q3_1,1E8"i6ASc}:iUGhz`Gt Zj^岷{7?}26'L_xiy/Fu!ǗQ^pxvg w[~2M8}gG)5BjmPFѾ_.s Hf4MX'5ճ_r{,i"H32'y^]V|ֶ( hˊ L_])vTl}`{wXg=KrPa<2GXahCy쿻^62v-Վ؟p/u׉{vq,3?_~~ۭb}i[/KF~:6hkYbe V=h"m|3|]}#M\- )i,&YheMoڦX395|,ۯ]M6i&] ;BwYn/ă݌weJz^qmB>yԿ"ԭ {f\> u Qg7! 79%=^m Ud.oa:$QZ@1pͣUy%~k2Z(;:5z >}/تNf .Dp% ][ZST붧]]cvŞ"{zrkT/=-Ӟ${_W)fG{bw9tu~5|KF;tY]k]M\;=:}z՞o:u 7_*<q h x,TxєGwGA9UOW{zVV<5?!ԬKX4 F[ρ& .!]z|2h6CNR;Y;uS _h'{ag)_BhKp Sl`@Qz%2\XoӞ5:aoLj>K@3xRG!s'>Umoܜhol8 \ l,{gN[@D|\mINln`V y7ֽNQM\q|+DSiKuQcY)0i䲗AC~ jx*!&d›&.COheBgG85EgvJ1g!]JGW{D{c,;Х#ew/pIKwF8 e\ai {WrKaҾdڣmTlj׳ ֯6ˀ3\y`o#Kp&W~ cڹ(0G*p#0ǀ KhD EM@fK mvC@o#hh4SDFeQLwع|ll2yoxj|ÀL2.e] !6oos`Uݲo8ǖ|?7M8 K_"ʙeA5dlg|yܭm05Gr7PvuUN=j}"5s/[e˽Q$Vܣ;t*m0 =33i0F[Gh(V}@扇:hvB 3CjD{NCkkUyT"(%%,}Rݱ(UHc96ƚsX3a`cTSScʥmK*G[cH%x.t$3sKENo'kw% )„)5`cC?^ԭ@Nmjm32Ͷrd1|hL`=$Kjlv̬eD:P#lz>S;-`G^ nzӲvc X,{pJ띅 =ZC,}ϵ p]̸ 1YexX0o P/r-[h]?C`2f2][לς3 ]q%( ʏRL3V s<'h҂o?RaէS|B9ޙ̄.($;g9s;Q~;=vo{1O~;3oIQAK#9Tuk~.emYzdZ㳱pf nhhxȷIe3PN"p}b5=B9FΜuwޟ.{SC si ]uWgKr}.N]ay}.n˙]d˳{1) \2=?gî&qO/u˽G{aqlH޸6] m6|X E8> ˼7c⡱~cou"v52mw~Z{wHlۮ7q {tђ\F1'G |wWuV$M.*='}|z) _8DWZ'NK\IGp\ǧ#Z{׏DUR]#+17Ӓ]^FRH_V@4 8) |a_Ig|;i\4`aka_c-3l Kp  : .h;mȽ|ۤy ͫ9Wj(Io 5n|83'd5wwn 7% R[шO K-L -'|^7+XGW*_ ~@A~#O?j'IcY#%8Qb<39aJy/*Eǿu ~OBU}^ט{*my YT=FYC;U}}tO'ۑ|}'b ߧO!UQk*͵ٻcُZ.dYj*^2̕nӘR &mfs ;ERbȹ /jݖuDև2%Tb#>a_˃{)_TSKR!oz@]8zwk4WrlzhDŽ>c뛕pXOaO\db\Sm ^t-XЗ KYn|E3Rꩫou3,H'Cۏ~0W}R6SШ7r*}̠%m>ŋf"I)M$zNkf[0RIĂJHlYk&/Z4̋% bZuLW*y_ax&?WGIA )#Gg[gwZѝ4#tmwh#w*XHy/kœȅ|A{Y.q/ (,x̡#;cܭ( KiY׊/W/#˩Ց+ȞR<[QşȀ_)%$NOZT/F6EzEwW\AEMR!tǦ95ƽqL]հiX콜ѭ߷/AKY]RIY)mYP%ׇݏ׬[_E+iO`D3Yi C STKg};K-Y/1~w8}=\9sӺ)V] nu(9$,POԪID~VMEgr|zsi+ws=EfPLlŌ6)D^͂~1 Ar|==/Ǎ8{On죗c({c(;H*} .xxN0o &'8z '{Tk,WE ^0گ3 ߰Pɏ [_v cqaWRUa%' 25)U qSsL$TU׬rk"fܴ3F֌!}:Y$q}>9g>Gǐqg"]}hLع.&l*l*..l2n3eqVrb:zUY36kݤ2TZ96Wˣj$02G<]ff5˺ʺUqyu{wT&β ,hفNe]Mm'Ӧa q{\dkNe0Y>.9.˧*밋,,{To[eUXRr # ]Gux]Քg0h~[>r\\]d~#bsFesY,*ˣ:O`tLosۅ(Oi<{ Xw'3a4?n4hRym;Sy\*/m*g #ۍbJ٪,*dvf~^sBtLJ]rlϞC3uhLs3|RUQtoOM$YO3Y/sY*ki.넓IO3S wyR˜-fKkƿ>Fz*bJTd3Xxy3Fgȁ#P$tx5u˪Pe՞Ⲏ;O18 \|ݥole|&OtIs'>tE* oazWJW :!N{6prhM:=|!#Xx~Ah =%yL,^%:e+ gCpAziұA|!Hf"lww? JzhRaPNu-@|q =yZ%p?.eƆu&˶p}'F+=JWtAWrKT9]Ei!w0,n,M܄'EǴbCH)ఐN:ѿu)Ϸ-aopqE쀼<؉d ^w;M]N}|!6<eZNxS>n2Ef6#8ʛ8 ǟǔyL#,b:gsq'N1D .gxSc-ZGq_U<>1A 7$Zy3:"O|ip\!>ϋ<>Sb,>y~CqwT<tڶNv=DpK1%)uؒ 9p@*ަ98XąJ"3zqƙ8 ;hhș2 '\ęhBĎx6yTɸCg wV+18ZNjs2Q3AnsOe L,{:6e%2aS)e"7*NפlE 8Kc (Ndd#&Kku'&pEh2&16([FNw?mHvߡۇbhXg`%*>C-[W5^^Eg'XlI\jLq^u+;k/-G=bʤ7Вxj=7vDE#8Cha_#T:9|/U  pyLko!~9y7Ϟc)UCf?ȕݘƼ [Ib>e)pGlpz岯sL<<} 6s5JUN #Yʌ,6&0JFiݯ޲YOed uRDoEzgFoz'/&֊;fq;!2ە~P>- [Z ?M=?tmxF3ژ D9Qso7t eםNjpK kv+'6Y%`vdV6h|d+s"K}V Ɣc!FN'Ax&Y\_6\'^NIV9Rd< (޽!:oGme*qxqMDZ ޳mt%JJ 6?A8u--_u TmϘ|Im6!nKZF8#mA!@eEB]ߚmRe!ָ=PRhc(V[pbF[#|?Vk,B,5- ޼>>'łː:xgJ_jRfn: dfOt zTp4 y+CݠuMXmu&thMNRt,-м[1ڄ!7/M\4XmrUkVa(8W|a쟕#Va(B򽉍` 8^0߼.vhs3><snfj{[y+cnóPT3&+&Vl6ljvZJvL7[˔RhMkxm{ʉlUE&:n(i0ϽfзnjYXbRy-%ELW?ɚ4[6Z3("݋]G55yιi-Oys=sϹ):N( @JCpRKf j /HoH{dk{ aLCxa;-[ BYQyge63rmG/"N}>*f>j77U>&!*<m% ˷%XV>!+Ў_էAf@ :V;'аJjlIKeLnM)-zޱB)ִOMQʍ_9a@hҫl%rZDB f&Dm$to˅'4.^r3*NUCuPǤ#@dJȎڼ"T$/S $VF 9 evC1?_#[i|[@< &eGkߒSKy3R>:d]~2RՈaF dgAX,S.m UqQ}?q 4F 'v"Zn50_DYloFo6A`{*;k|w@}^HTm!|Vow4a2ܕCU,UfiLߺO>C6q.xcQ<@]!-$%-a|V^"] nX~=yxEEoԻ̺ƒ}]6 q> #BX8 0y`͏ew xP#:nYxov帇W+0}!6V@p{qY|O][9Od}rF^Adxg̪=9ʬcwޙ殝dtg 'IJn Ik C6/]ʚ@,'ܲ.+AYJ㛰˂7{qZic6<+0k6,XY<1Nddd]"ICuG\5YrZI2 4z-<QIpd0GJE\hˆKyyőGǜgXv S2[ruJA٦sbcabGxd#ue gw'CK] tSUN{6AmHGX)h PNs%u**o%< #QF CC2k^G{M(U\f oD=h "&ԃ<{mL9SD/$ N#H%?؄R6{Q&#Ky-Uvӹ0Rt9ó|^MVphiĀ\a+I#/u61e'%+փ%PȬ.=v9⎁a2j28s0.3hl4,IZ{x/>GAdXA7 A3S0t3( n9vγ\+%M'l%tbfXb=ʼnA탒6(H!Qw_6;'2u+ͮuf5ػ3tͦ~CZ{4݋3U1N\]ROa Ҩ2g0Uj1ֻX YӉu4 7twr TNy nJy~ȸp_n&UYk/{^|ݟ{Q$r8y9o yM% qr9=q6'}6qWm>ֆ@,5m{6=yݦhfƫxuOQWmNQ^AK/pX 6Î2a 5pXYƗx`}6n,o6pFô8$:v!(qX~Âv| zdR8I`^= ;A1\ g`lVS& -8 v>wuw?ѩvD(D$DAdmȆދQnD(GdD iiPP봈/@hP'E< C,lƮ(ۘ@: ́+d EP},0TPETÂTShx}ګkP(j`VfZqٲ e̊rÈlb+g2^g9"L$얹qxU 3C` NPYPgh{yV6`3 ?^0pg\/p0jgPZ 8 "8w83}g HA88 +dL6y lki:$q/&[ &dAjQj' J!Š &di%y@\| &Kd6`&ɲCW/ޥʂaT 2-:isaXF课|.o +D X:\ . q~g5 ͋@FAǛTѺ@@4L>̠ " 'jZBOK =eL (=Zqo4(;*d(dXd t3 ' *ڹ[uAziF/v  KTdԹ&@*n[u3&S*zAq$ph\6pzcdfΌ`#̰':/ qCgJl 08sCwbf' aQ> U_ *5gpF6 ]_1.Wg/^>(#sQŗ *UGt9:f:ΉLF>Ŕ\ rs GnAHreÖ5XJD+0x}s p^wbQki#t݃+'ەdJMNݶDc;{1qB3]gj[/`!h+C<"<$:(~[R[3sqpݕIa*NɨbًeCTSrd#qtjҒٚxUx_T]־j8ҒYJ |oI(FYj*n"\IY4îJvO&R_8 mvg<)y1еivϒt0y(K\4Ҝ)5si+ԔE]<>\7\`fSvSA|Z ӕy*v}xWq}V+$*1D4nL8),<4 dǚDB)Z]\6H6R{){+Ύ46aQP9z6HT(.d1DžVr<*FE)3(1pxx=X߄c;M^؍򾡲q MƖJiލG e풫A ՙѪnVte.S*N%}a`(X%AJU6ܽKT2H:@"gNr.TaWi:[{f[,Y,+ma9_1!p;žxK5=@7[L; } eN6/1`#IdG^lRl@{RI6ƌslS?0SҴz`iJ є)a|LI_KSW%[퀔$ΑcUnݻba0j*k^0qn4u9Sܵ2&{4&H7痎 wٮ{pm(U> JVרI;޿GK/{λ/dۅkڅ ,C6|n,أ h1pUOP7N0#u-J!Oi!*, On+4 w  \ۖ0{쏫3N'^_Y*|MM ijnjgMv-ħ%,\?xWIo.1d\bM\bĉs.qqqwۺ?zO.m_xxOV[w\~d.Qʹn.q K,}v@\0.KL]q\ۧ jQ-+"\τ箁K3v/@1DǍ-4!e;IyY[~RS ByB}PKVo1%1I]yxK[BAm `Y+*l DCrƖe*i=%(pM؎;=M6 _JQBlxx1~2~֛xIq{.(PFFBAN6 )iCҪJK MH袐\H!JH.Ŭ_DR>V9z%slJҚ ,"ʆXH" Yd9-7:ZZ]1:A4:^x q!n9V f(n$&BP iՙuUjL1 ڼ|uGkjlEUӅT=/LfNoGsv#dUGYW ,H+,ijٷ&Q}U[YrŚ-|oZvșj#dB(/lHâ/2#*pFE:FśYV~eWlkn3:vXgMݛ<r{y:$# }" P1BGq9bl7:ӱAjWn8C_6+i!u/js11(T [[>:@ pћm<􈃁vr.v h Z {4S!h./3U ݢM~;>LnHOIq4\#(UDXODB؅z7kA`a^I;2gl-^gX'm[NM$RXG55oxd0eRm`?qɥ8AfLM켁H15P=*}bU$LGspM@=ح8eI _VM4Zuٙ*iҽ4SydhzJCK e۠ J= R8CH@sLY?Ο0^OrD F^++#khS0X%k,8kUu&tBFtsz5LC/UȆW=K)=~uciJK0?ʸD@_`#iF)C'SM-ioaY-pt\nie7CT[3O,!tCn,p\Éd׍#Dy3ԇBŕ~q5m+/SrGp<]@8h!x+G/ 0RUE= S8FW=x 9*oPX[F4?uJ;{o^ep'\UMs=}ƚx-hn%]J I2 FsZhijhY|רcb{ø,&lWc pn("V8I8,TEH v?Mo8LIvSinԴlY@մgٷF_kHA;e.e*V>밲q @NGv4HF_mAgyhWy[oW>U̙=VgԸDۜCdi\L6 0[! `tﴎFzk:?Upn¯G"@~\#:Υ&p/' D( EE=<Glz y V_ȻH@#f q䢃 .[T4^SxILjOD-\X߉<wy!W๷- xUnXܭ֠ |(hsy!/wAFU Buz 8b)gJ[ 3WsJ/ 5No41(hT"W |*1H| :&>Q']-/1D{ {{ s->'眫ì-Odh-hZlVejn`t4ݳY" D4fFn͇45:ӧ<^*NW#/CRQvgCzy.J}&{J?ɔ=0y4='} }dKeo})GqMdzDn}GFGΧ eD{k۞~?!M'YXi.܃爔 yr/9y9\'Mvy?Re^,O'kKwry<]Aξd} Jwsr<=y<srar{yr=|H@䉈#M~kN^A.rq5roD|D@䖱F\u%wWmd. kwm$@Y|Hf>(5E\*T*fIZPD_5(S< 'qW$J2':hW!re>}N0'TVȣs8yȫ9-C<'SDr'DnɾG9Ur~4c|,!r'D~S<2_ J _K&N;"y"wCs@S۩d[)!D^(O|'U6[GoS8o6#>56*mHP @>Z5_,M>ɯ"r(9y9 Ȇ2(s]49N.->*"˓MN~W\t șl/O>qDtDAM&iA#'AE@"Oe_n`D;-IZl npVI '^*\A婜 KA(%0o=![ʼ忩<N1ȳnJ7(nQ+sD-a47D+4ys6\heҴe}C=2y,N Р}hmiAٜVHsd4.JyN[A 4Wyڜ\NAhIi3sڞ*U{z4KwnϋkAݯ$kK?Rb8dz8 *tX͸i[>]k_6.p7߉ 3ޑyr ڇ4mEN~MC EDuMi iqi_1EkR+6V}i&WPw)Az\i@'OxӼ5hxiUN8?U! Ox׈+HqM3O+`|IW5X|)GyZwѠ}hmibJӦ_- h?G6ђG X[@$O .a D+yI=,饜6]6q^-N34D~X6>Ҡ 4yrN{Z6&tMi/MM47 [VrP䴌BVshpTL> p0 7җ9 ɆO/~Q]>}tyCk9xM}2s߬g?_Z|bSyinh?${Vp.KExkx"1|qO(Olt@;X:Ex.r?/DHMоqNv x~(=*o}}PbKkϤ)"}f9 o[QKfj3s5aVwj V V_/\Yv4'O20d3[g3[e3lllf6 PR2%GaBBNFgdu`2̂:x4'0 0ȫ  Xc!^HX4C'rb4B/bZXuUu9Pqhk1O|;FBEC@5T9*!WD9!Tnw>]gs/|\ndC~-W;qTJX`l(plҙhu"K[ODEAX#nf'pTpXL(pZ\F=QTRZa\ݿJ8!W2Jx²,bK*Ѕi>@I\9jw؆ 2p@r@T$j ='!In0GQu'L 'a; 5.].D TEKC|tj]R N̄9tq* I7qԹ45%Q?*@9{^u/UD@(_IPB@&m2rt#y_MfdS ټ"ֈBJ @}$9goqEwB\rԎd.(mZu8EG.oU؇g1>-7s3$Q| 7/ka [u2 ܑ3lKgRLl'-2r9aE'~.᨝2[!۠fή R`~zkB@ovڞEUw ,m6VZ#QVx+Z ]%Cދ5Jlg%#LӋALp33YO4EB1Z].g e>(=F(}'Jdd3bCPz!LߍȁL/f3 O{õpFef]Jo~Ѹn\ˍh T6Zh =s4hub#ɠdBVfL&*)p&TD'Qc}b!McvEAH1>DŋFT5BO = bFw5[q Z(*JqBf^M>ϲ1ULN#rY87}= 5FAƟU5_8 0o:+t}Z,wb\e<-̙eg`N ~n-cKJ=E O>Op9֠}ɐ;s2~+J9v+;|]iӯm`d6y;lLަ7֟|=\׀\<\Ca)4?G{s _(AuX:}9&]8 &?|⫲ IY-9@z&C]E?bj-kOh$[yo+,E}m(iO]l.=<B+p@|km*۞U9d$R1$rr0j=WmF'@KT6?IXac_p!Q<ϯ\Mcv ^ٻ7V:Τ2ؼܸl ̓5%Hyvhӕa88ޣ7=auekl)i=л=лc2d'l?vA޽Ζ/3T;V$@L|#uPR]:@z*=GT6|ءṁ=/ؙ[k{.RJmϥoXWGyñ-Gؖ'f2EzpcJAOOfwwʼnGk%ݗ{_ vg$rՇFN=e &=-(0ȝ,xx^T}tw c7"L<Ns$CKܝ XTLJdL {{*JD2 8"⨠0spFaZz÷B%E%[2ûXVn]kfܭe%ΰ>gg??{3|kva nܞ=s;t;vYGn7 >gK[U= j}J`ܭ_4v1B7[m?Voz$|"#?w7E?n ]v$9s~k~[)oӃ{? zzk¢:4_&(6u0_$4$YBjs w|~5S N*'BvvmUUftF&ݕI?ɞ=?p3sDoEkd@Î+(2ѬYZ,jגm K;kb6s #Thtskh[gs5wC .Y[kt6]Y^ejݒV+ =[cѴGXiiMKgOFg}0כS].r '7<9ٳ"ޖ }9Y˳7gV(V$[IbAoN<^y8ǛG^yt1װ<<Ͳ<_F,|yFy$yzV{7ci?"y<0~=%"_`N|PMur1K%`}V~kqqU.m{7?svIl}=&ze(83%ˏL"ñ3aM)_7evs|qt#dq4eq#q\xeH\,%)cqTh"k ޶zp"fI1cܖaII_V'8xUCs뤹68K:ufnCI(JB}1^)0Ř.K1b\lGo7oc4>78s.f9Zl9b.\+y_B/xcbLRfyd}y  1ի]i$117x%}RyCl I}o1.1ዱK+",LLblE ŘI߾W,ƕ%NI^9d6z粎=m;n1vOY'Ys$ /.I#Mv<tI{vkT{>l1ԇG:0t(Kv?BH{ GtHH|"(R܇n| d>dzqNW'/} Gp?7Yq}Dh[Oo'`pOٮB=y_XB*93ٍn'Vp{-f> ԇ>:k56_ql\}28G-eH>}TiNG{5ZKjr |SmG7ݮ}ǎY^kcv܇5J>~G.[|{R1X>z_hY[eioc۝|hfӜ1Ora^屄X@}|]I}L|LCՖ} | r%R!n#~8{zN[H:ThlHowWu""9F|Dp+tj_X fXpx< 6/[u,d0I <Vbp!8 |>ׁGw*x 3 'Y|ph.e^, -||ց {yc@;62o`x8Lzp>hgP+= vBx0/g0y4,5`#~F4OWxX n hp38|,g.l=`B" ]q70L3@hf|` 5H8A 'cUI0^kem xw`#Xւ`f0Z;M,xceG$gA=Sp\ Fkp X#B3.0sx uRl(HGsƀ-ExthJ;9=(3Qo`(kE\=`x(~r}m[<ݮմ~UqҚٕxY#gWZuf>3>m)w\7MT#3/tl'^I6_ޚZͧřѿ5i^^_ɎO/w :Q~;2wehm{F>h35ii,\`z#uďȮ`ɟنԋGHduxЭ=W6~l{~}y ҥv} f=yetv,?ێ]xɾۋJKH5{:SoV7/YCL}%yՌ+K=Ww8!wՅI^OuGL=ӾY2mTk!_1?O~e5'nݻ#[Ԟ5&;|‰Q[>șr~)6;揧ڇ^xAږA#c^E0{a~ΈP=6l7uF,8vsiJjRVԬ'J;a1nc*p=t^;vZXk7QFHz`2`:DŽἆ׭PP?T^\er}u'G^_PvhiR`2lR?U@JQ|*?SnS_8[ԏSxmG{@;9vid^߱_@J.6H:G_Ae < &qƂF2I8/\7ysXy\PuA[}r{g`0{)q$A%?-#)_yc.z=D.*/)VNg3TjBE2StjSjwv,킴sվJmbhw vcؗ}jhrNd3\.Q.s :v6OѴ)tHNn"v@e*1M6 jRi/ݧ=c}3G~ H.VD:11;*Ap5YKXZ4ָz-)uuf2:\JǮ@?('[VNԹAp։NFgJIrV- .7Bd!&i?ns]J1i1R@ D3ɳh1FW~nXJ6ހFUP_nXpӮ.W%dTC6M" H#݂M\''- ͇,+!$QeB0IR!Ve@p3yG׮ d?a޹AV;Ct):]%@I@+N(I9EAg$ו'*ǧtq{+?<)3&ߎjۧv."t( g0Arj"ן/ĕa|vΎI lB;±SKW=uD!ڧ`2/$ȹ 9:@7Xn'YJ:{Hc$?xM~tl"Hߋs # `:PWYA'3EQ/B}7~PzoK@_#?w'XqKz5# O,rPJ.dy7ڜѼn̒=t5T)>7h>z7>OGt!m]`Y{ۅqyk:;Dד9t1Ie&WD_֏-DoCOG{_q>\k.LP ߮ KDu%o8(Ϸu y$VG);t'tH٢"u͑|9Iy{<u@qMV7NkUTNQTۨRwlvc|L+s֖n%LU7SՍZ/$@ 8SlbM֨RNәL;ni;c.ws=u~.?w/ ^OxWry>;ur^qxFxr^R-XJڥrތBI^z y°x3$3`?Kk~/2gyt_WU23fi,S-N"!Z~_19kdyè~tP?kkZ.ׯ9wu9KY1Y?zc7VP?FV-uq-:k}?WWJוxūgK_M9RH˫yu㩌W]'_xYw/ש݉:FwK֐_uXiI@yC-tes$oA;rPw_~_$קºzHwtoa'#)rxW|X-^]>,z׎#re8*uQ\UoaK-u]9x^1yGu /\ޜ5?SxUӦj~z~{Ssj~{^O}x\9j~ZدLvW9,[xAM^ jPe+U5)y//"o?z-߯45+~!۟)*SJG&aO?=~h0V By8~.MULCʉTrJ*WPyy958?:6:u ~&uoC>s7, $W1jk|}}3p76*wMC*Rh'®p~On_Qyiʙ(OaOثdϦַr5Sٹ Tl6ÏSDee#sp~ M33x*KߣEهއ6u'|fȫ^eXz|PIx#W/¤,nY!)A)Y%"cʡTxTܺwr>C+pq'~yzׅ/S;89+;vxmޤ_S+owh Cߗw?4G =*+w{*UZmm1YeV3}${fL%^311rͿ%ʴ,Uֲ[Բ~ekZ5柚D=wlvA[HgK|ڱEcʪrT'-'z8b}R9ۧ=vk!=ƮW*|{Q~}#Sx^\^9?WeY׺W&ta`x^Gx)tԏ NPel*G0ۻU \"wp3}na|f}  |ESQ?o3}<pu  `;yo.kRx; KW ~vہ~8u-Xp p8|7p pp'p68 Qz1|E/~8S? \ <|:y~ cgӢنv x)fw%Q~UFyfӣ4'u%֑z[`Ma/l@w,ŷn!g ŋz>٣f}|gla̮)8\xWװ6cס~9p[;g G-O> 7n8zD>6x%*fF~=c} p~=z^ ̞׳5!70E}#G#ތg7aֿ~5??6? a.ԇXL?&MxR4Q&'QYYafʽE BCH 'GB"WɖCreIJU`\+}[[4[Q!Q/[_՘\j& au2`i]DsU>WkJ'GW"z N S};Qahu.$ {|@xX3iajia W& SܮELAS'y9.Nk\l#q]=ΰw [_H ] βHE,luјr: L6ۅ0#LMY ^#${/9ˬ7Mezo@K[-͜Sa#!Ď*ZiܺߞV>DZAg8Ɣ0yjI=kM&'Z烧S1hS.am'dx(bXc>g˧XI \Ϟ/ٛ`k9YbtC7/lׄy B>>-o_컍W^O&_-] :d쾏 '<m̀̄32ݾB5+o\{B#fq$<Ǯc7{A|/&pw9Ϩ#j,|S}ʿ_ (޿3j~eo߳l_CK= xTUvL&$:h`Dw\AKVg-ʄd`dvf&qvi;nliVڦ]v;mmuݠ 0@Iwݗ{^{s={Ϲ?k|amcS[Pe]0fx)'?-=s-7t'Whi7U"D_IƬ=~Ytu=l;mGƯ'׵([`|߲>s6c6c 2-c6hw۽>Gx_u.m("Уt1=|v:w'պw'CVЉ}=f/JPǻ!5f=cvI+MyQ[CGII~qŒʹØ0o[w7}c1=7Nci;[ɇ|([Cc1;Gm7H7bn4]/'1sJHv':tyKyx +.H64S7D}qR v;v ^_ux1c}/\}D/JP3|z7S ~Eø>k_5o7knIjPXSSSR!O AKE| [bnqG",.tKDcqKSńySVR~fc>)J19Kwl2Vo4o.cncnv#n݀}ˮ=tntzz^*;m@~þWjk/lk +g_ ] ]΍9A*wr'5l~%~Dupiu/.Wp^FSln1VGFq|U|nri#Qatiw>2*/ȎINTؚ~IcCْ ^/Q -Z BŌ~|^7cfI9k-or~ӤhO/|4Oj'Lkq Ex8 |>i*`k+pEVVIkV){8_n"UxAN9֦fPIu>1^y2Af&5ᫍ/P&#ƢDM:_Зb6Oi%Y|eijm]5։Ӻ̦IY #"Bqt(>D8+665mj=_Cɀ5.d< LĔ_55.v^2V'^LL\v ^$pF}nGbܗr>*S;Ao{(Fz{t\>,Lɭ忔\z!0|#/%l_雰ak_V공<l=1;~ K_N7!"k16UE'K#m|ϯvڐMAou2|iRL`~DZ[z}loנxzkh}F; }؎k|Cu|}O*~>%l=>l b|tLkۧ#/G%?[{Y:}ϲV{l<}ɥOcy\OZ=N>(ɿyٻ߀bЎ[ۘ^A9#wiK7a$C/W}щ :nX_En/_*ӏٺϸW_nwwU-zOdgU/FUwO^v~Nj<$Kh{b1S>t;>3C_1>%huӱ>ܾGY=>!o~ʗ |#@[<5A "OPXV$Ola Hn% <>@ֲkX|}kWeOՆDޟlj!X%!k6!l8ʄBИuB _˄&W ʿV/ Cߟ,lpՂeT`,]0$]_Y ' L|a-AN I^h@|.U ,fN|ekA&S A8 ? -Y `ma[a_hlZט]_4KP|˻d:yW SVՇp5 c}M8qh Ջ;QcmM(;%l {ޢ gs'K⁴\ݑLNۢMzg UlnqEo#_zUޟw[7.o[Gn?z-Y߻2Ņ5j_c?}L,67v=!+﬿?o>?sOמϟ|򤗿?w^{?Z ҷ‰/o}Υ~ݚ7.N޻N+=GcwX1\X狌F!{WCNic _L "srՑ]-|r6fe`VpzhB,5qslyCsiӻW֡oPчu'Trs&/9dNIIC|}-=l29dmEay:*#|ˏV'trjӋNۏ/㿡*{ӡTяW髏MAOVm:~T3+*Lj z]&MSx$} ~n>A?O5D[0`.~.O6 s<ɗ'|r}ȡ'M'ͧz_}ڜWyί~+5}4]> is ᯖ'Oj8Coh3Ϙg>K,?}ӧ,_aU_9:}u.OzWm/O >As&ϠI|}Uǡ'gm:Oghrӊ LIr(y1} I|IIV s{_߶UtZ$%["}5W\PD_`R#ЗT<<6Yuv/ӻU%c`>**ȥ/W6= (x]I)?E)Ry׷h܋1@&wN~HmebA|-_VGO'}PKm`޼5k,t ]ˢ)ضT*OOytN vPQa!w F NbEp槃GཇP[[/|}J'jÑ#a~;Bl9r?і# aRs\)4-!0Mx*򹿞Gɘ'wyپ.zuv?֗)=O' GxObAv e@o' 9/_zhǟ0)#;ZVoʼYb|b/_ߵX,y{'a2O}޹%+].OVا-GI9}cxfА#ÐÉ0Q·Ϣ)IN> mıߠ0,6QUry`7Q8*;w '+9$Ig?m`}zlj‎+]<7Uq)KYOKWwpt< 4rԘe_Tz u(~Ֆ# a_Ր[|\Go?ƗOCG{/{/GDБd=-G'|BGḢ{/G9z LVi*]:rh8C :rO(ڿ'r5ppAzNPu z. t!YőG7Op |,jg LROK›. < Eu?4_FOsƟ|4)ҖqmWk)ʼnx_IZgKowէ'Nǃ OfϑauFW;th=-G}P>#pVQ%ɬh Qlg'>. ]g9 )9g!gs˛J>zʼYM9C;5geiK#GTZY\9 |tP=$8rkxyP(aȕT_c\E{K3*uu_w\09KC`ʟ/KdQ}S'8.Z\?/h]47.9Ow/ ,8r LIBQ3:卆%Nya<Alȸ8Xvޭ9Oc\jH Q:!n_6?? aE|?]h|;)a܄'ˎ"Ü~.YY\?w\R˗y]IBt?_F8ṙoB>Q22w7r8F8 |do |?/s;Uq&uY Qv;E._69\C_su?QUk{SA;n%gpx,OhJΆ.Ә_ŪG"禱KY׭V~r/|/ת]@O㮉Vv~W S nG4n1\`9;3QΎߞÉ&k{a|>0` $`ڥ}iZ]ׄU;D_~#koQ٩_ePׯ 'Ab.3^H)il%g鍣w!IuL嗋zΑoe}8~FЏj瞂+ZulH!i+Ic$0D"W"HdJ$r%{ya8w0s9v5>15tf`5i>? M ᙵE=g@kq Akc,WXx пIsrH Ƚ@']e3'{UXs `='<4np!u콵ïcM ~ecŜ!F7z Z(9njtaY<#Rώ:~j+bנt[cEGv <# }wH: 8sdBk| r'zƶ^HT+ߡiOxШrĵsBX\vZ&+U<]&ΌLxk 5rFF[t^Qmh"h?+&CK]{|SEi&}PBawTByZ@X 䮮F,/*f"hyXyHvUn+P^kxeX{ $霓?ߜo=f朦p52E+_?c轢kRsI=~M i}QDvWwHx. YolЊ>F=pDk5 m:ϤUl!̦NAO*}<<4!P?u!S-LסOyfמ!?5X%r2'^-:3W1#Ð^|(ڽI9bjI0=elPiXds%qC~REI.7z≰5wjBV/|EmsTc!S۷}_[udDؠJ_z|Te<>윏5+<=\AN,깋U+'}֣ak"kQ>--.Bib -,VE EF9Od=fZߚ~&h WM<~5XJ%XC-,mɑE!!OM<Ȥ7?9yMYĝ>_% q"݉t-\wmE)C!]|$#WnEṧAe)IUęTZ<ϝ%YE8~3!r{ p+yJgXlεa1Wn "s(8lt]1Bx}?FQ_mTbeG_Y{tyعZVb4z/?_sn=oW٣i,lo:޷] ^E|xd*vk~SjYy~9R3^HǙdKoI/]yܱqVar * ¸Yv/'U9? 1h[S,;-7Ioy|djǬ0~+sV-8H]'{1P%=OW/SZ̫u8&l #+^I;*@y_`(P8Wm =gAzr̮gY"? _Ng%bà} ,3ѧhzymzæ`@8rSo_zKwƲęΊ*5Js"3W$f?LdFY3x%$-&M*4,<%ŲcgFކyeڹVc꘶45syCêRcJ3>zi$7FOzSic*uI~W37fz p/Wa}:Y>CMztzֻr X*OŻv EiXc ,6P;cRu,,rC{]IOE+Og= X:֣vݼݙh׵CR;A皊,S2%s=qiḿ\,0{\!_>~"u_Ƴtj.=l\gt yUU ߢow.[ ;aA~)܏JdYe?i>'+ǎch4&>GE TP3bLNީa~$?smcޥ4 +<\l:}tK!o6N{& 7 6?m.F{GfN$⿂1^̅qs܇DбR!ob@_oZ%d'3z]q yۭIdr[c RƓ-g,]Ĕǔu^%WI'[ ~yo~-b֬SYiɾDqki̓Du=lPfKXNqL-ctW/>ceW=&rl͗ѷ%G uհ[H\̯WqpsϑedQjc'Q/؍O'ܧ"Gnd y-rO-*Jwr3K\K=={{uy@rc%Ϫ@rw- U g1"' Ioa.LݗIlӵBCq<[/rx'烓̼=~8<]#>x| p?R :ӛCj۳Kߓ s9?#/qT32Z.Cmxbu_&I<sY$gDgY oBxpW4NA=Շ*GSݼàdw u ;Hyo9܎G;hN@/{8<֫\Sgެ_aN5oK71Y!LcYj鶉XObnJ5s}S=q8XO<}<YG~0u ?ZGQ{5rsA}XA++#VC7>t׭RI+y|N灞c5^Mz?VӍ%WHn+zב;uSvגFWc)A/A hOFtq,oڹpokګ7RoH^5<; [zۓɑ9*i( ;CCVaߖ"Fv{3?v9vų+$Qw>u޽m烨s?Dś}ޛ~s9->P%|^̼H\cI]bTh]6{3tVPD?j7Ԡ|#*.;ˎzt^Q^ǚ3W0?aޓk֌}~/'rZN~<ZC`ջWDY)7XDQ,&s1ZL Vܥ* z!F-Q׫^$wEKI]zՐ ̓%pY&9X[56>w Tq[FYF[]=M|:Z'Ԟ{*E5[ttm~83@8xqw"ᓆ_mTۻףjOɞK ȞېyC}|X{jA}]!UW:Q>1)r}vso~ma'iF$\qxx 7fn먮<^^ R-p>V8Wi'oCK6ί] u]uKh hYI0za⍳FלKg'r,h2SFW˵ihظ|OOǤhXJ Iru d4`Y_|ڗڼ/ p.{fN!LI>g\΋qq4a`\.mry42Mf$ytЧ_EN-`O?H:<Ϟ|>:H|!>^CXC|k5[j/iR>gդP>CGdo'OCgI|'Y >s`ZZ|L~^!sY a|.B3 >&>mO[GZP`{y:Sd1D;wcQc@Ñh >d֓Km'm:>xMO%! <a|%>Md_gہ{NL縣d/:ڕOYQ85&ś-{G6C~߄>__vgߢe8kVQ[ůCxo5#>ׁJ||*{?_9E{W> ||3 :c#g 3ϦȾ d  "_#.ؿx%pOv:MQI#6q-<x'z=^ spґ|ݲ)?Ag|΄{7}nDl$>g}o@؋>xKwďI?\-˜w͑LO콸pR83鷽4k.o((~g혟 x_i 1\:_cўʯ5 o;ۿےMD i{؃̯B~5}|A<'|G]W}fq6iخ{B+㽣c)hvNq%BOwq?{O H>u y/~2Q<\׸vgIᓑOkȾ۱NN|[N_@FwD^ \+7lNS|ꦇaqþw o@B|f}Bx's/9<|+FIN|Sp\}[-t 9 pOJ4*i7tFg=O %;޷v{2?k& >m |:> >G{l}aon⓷ħ>Nc'O;ݕOTⓎf"3,iߋw!#>#G|>qB~F| B~Ea!//HeL܍9ug]|*o{Ⱦ!{كɀJ=6>0 >11bR\BEBMMVQ +1.ĦNM G +<'L@*R|Lr,nw~g}{S(EҳT~5unϠ/XD,x'4xW"~נG*&Ua4d@ƞyFDyf4*I%]"e%iF?UuFz/= | sxO"r ?^Ə?RE/7=?xMjb}57mj]܃>=OgA^蛡u u|qc)fN{:Y16Y.Ryym=A!*9~^A~Bn̏UŏU͏u7>>ü:o6_`ọ-$̓|3#xR:,GQ ԹbtEφg<_s <9/x{T<^AdtpEц')Ąz5DՊC{CMP<(V􏲹Q2>O xr9"3Exl|vO1ǸިH{_v"hS cČAO4_r7 G-5x+í=K 0wwq%K̼s~,sT9k=6k).zmv mu<^98Jb L|g{p@8g9O5*~yWz1hf)qqUأA=ޡCތ]W<lϙ]~N.79%sT߹eIo.#~tîҥgǵvVv@GGIvO"g99'9oK2 z[a{@|9<΋%!c"X{Ec '׀7_|ϗΙ88J3^zޝݽ߯ϋo-\[Gg&R\f: Q{|]7rugUfėQ쁊@3A'g/$A|c !p</߆ 9<]3ޅ~a[Kl=K&VŊ/Vn)n-o+#9gɆ{ૅ>ffs"Egu}{Ig>HG{-Q*\|6|1WW|W(%}D|?ɌKMg4X vՆ(]ս,|YfC|¼+xNmx#VBЈJ2p7-e<*~w=t=>bX7--^w?no9s)Sjttz;z#3\s3~23f뙀8kױo]Q^Qަ~.zŸlh:ءOtB^O;Mo&[_Agŭ tp^I| Rnw.q֘\ug>&ImCG{9F;o+R60_}XyKX>ԲFo=S=s F+C_"+!3ԇFf-={{H)l>-b3ۥ_v"b . 3t*gĹ- b[.̑ѯCy(ށ☈~%P8~г:9Z}A׻˼G}qLԱMUgPP.kLm2GmUm6zkZ#ƨ1տqڠ58V1@.juos9 Irpdl[1mƋcx?^迎W9#εF&ߠڥjc;_c NJNq$w#Sxi&3)#*g靬=e{n~}^у!54y6|hp#%X] VLkb<@{Uݳ;?wq8Ccsg;w~pgyIMb$gOy |},7#x0=>\,T_&FWV<횩Dw357-\{I{Uq5T{/{ZzHEnu.rd?ߝr|7^_FާMI:prO(87x^FBG]Յ,Dy7{/P|>ށ"B,Yq O!O/, _|p?׫L|"n$-AO۪88e FVf9Y/L\e=l6o5>sܭVcB?{R?IU:o4}т/ˆ/ j9j6E7m_튻y\z"zJEΆ r񅗋+g-frv/.K}[7o+.os}}΂Ɇ;T%sJqW̗WQ)t5toM= ed qJ*3#/E}/ē_/_>='{ķgzq? xR|6|1?+u|BY`?C|AE;WSqTH?]!XaK/B| W!>|b'-vow(r~Kz.UxεKˁ,|pUx}Y-W z8ҝ/dž>ƗƕPfp4s"i!M|;йi{&q)D>dWmn~1O|#Wsh;shwshyT}}q#s-Ey/?jRyys ~ raV /CK] TUUWC x-5@DP"QjhTWGfMRVNRiD3QR*-D[i] &8<5C\mYuw9{};{* ˶j\V3mz _Ծ^"MgW@L3^θb C@hl/ }smp ̝wR8g {zbs:9gߡjrv5W?A// ng L ?$nrigPLqUЌy/Дg/Hov؆;.?B|ݱUFXGu=mE/zr6;&!g6u\7 'ofuf]>bht,rrJ=jxp<'WjO&S"gEq2x|z3'+Kq,x Ojcnu(jv hxtM2m}`|8:uSSֱ PBm}ֱ Q1猨È6<{mL:zlfm\۠nl%`8 8cg >6> wZmv=mYįPu֕oePߪu#tċG~G]+-9Ug\vJ9og!+\3Z -^+xّ_5na~0[!0[xqI>_O|Qi `nٜW\3+N]9ΫǬ`hq?c&rZ$*|u-qyt`Q7}hYλzg`wϭ%#*de? ;=kɭl'ϵxn]mR ڠvY] mp8m)m/%Т8_]K.Љv׎޻U>CUmq>^hقhɵħ>m6nx5*mvwɴ( 0'ʳm9Z^h[^szEGCPq#%,jwS;^D-y#q*1ʊ:r+ZƑQNfms|1\-ԽwR$VEWUӒ1Z/ם젖\㳷G+c/3F9 j%Ԓ˨%AxJ_ŌExxԙ3m^(ࡨgPP_9mp8wԎ%'hɊjZL0PK⅖}ÑG t><6SLVԜSOv|ďh3kcl"FɉE(΀kfG axHK"_\ #jTd_g-FVȘP7ZET1f= 6`6Zraz$?O]$u-9qNla d rx ?~?Mz8K0_{h5,ncgk$./opƖ뭩uw,?FddA^c]r~wIg4im:/J?}?T~]'Ҹ~˝74ڽ!;T'WJ۱QԱP~Vkms|?ѩy0WLjC B7W9:ma7Ő-o9~pO5Zgs{[pMU?`|)mkWuB~"Q>;Z[#-氂PSH'SDZe@{^S3q])^>'ߨvj 8ׯbkxݮG(˵Kn8q+#9iXsYms:Z` $˽v;oJ "!?LOwYeMh@9ġʼ7-F]o xv oqoZ؅.V/5r88iyN5s?\!ʾg7 f˾g<-?i>Mܶ3e({ G?3G9ʄ͔Lq7a;Bd P} M}y:=s;48Sfzh^ ,5e Eb5Nr+>{$?އm _릂ğNUY_J%̷rjLiS݁p?oxEgŶb {osO(\B(I}&5qzRs_Eo:oucq{}2e},=ʹ69Ƶrȿzr?nT26mSoZw [m.mʅ_:^ o0^G=Uw >D,Ǖ;:6Eƕe˙`P?OFY~ c3x5"4T`9 񕶙\cu̙ss*984眤͜D1g5wZ|e4ǞjicN߁ݣ>4Ϊc1~}̻1U y]ލADmȻ6.M} ʒy 8=1A=T$HAy iuz$7LPiǞ:i_ȹE]oV2_s^s螺,JtVsݯ'܇tč}>ӕv86m>${Ġ})msn; duț?mྮi2F oq"'ÐΛoF'7#{O,։"&fsd!97C߈a篒YޏI%5zQ$"J/i_|i|EPI֞\h^t#taN>teиD˾%5s~v71b6lLQbe5T8EJGN9 WMG5O/WmݍwD--]Jq~]dC9y/k?S #(YncM 5V}RL?Y(,[LfMiH(zV_+xiX"עID"=ߗ,fZNĴT+{XǓ[ +J֌?`9 .oL|Ҷ_/ ~6IVҳ;6U9 dy2?Q왮l_m0}5w8ɹo3]ݨYnۯImE¯gWS:JyUUv4NL¾̊}m&6@T;/ћ0k)\Sq/37ˢK5&J>.V/WIJ2k|!W?a_I'f'?({S&l(ϝ5\Og3n@>yz+ F6ߠ{q.a;'o;Q~Y1uN|u?Hm|??0=ҪAE|+e;>"/"L)oaA@s@O#d?3iJ_¿p;K䷙m}m5,?Zy&6&RkcƓZ851.qJzrl:8ޟ+{1 dd[[C-X!.:4P ## [զg;qjz,'T9.C}ڮ0 W"E)qvvϠ_ۥqʻ.W?υrpA5bm$y Ubh7>7>-FK{K86Eh[诬mqG(} 駈;ߑG_EĜzV.OƜXC }U[/C r^("ޓov=a'YZ~VmvJt 8|q%gG#ϢoO<gݏyOn>{6{uf= |N</θETDK3k/DJKeDTT4/bɚv\2#/ewsuJ.f7+r e~?y|ss9uN=FBO Y#ryy>qJ =]3Nrv<H[<;Qwꤏ`Ͻ+u`cVݗM*O}C4O]OH7BӾ/{|`^7g5VXq={Zhq71>qg2E5xMą7>Ng]e& m%]BʿK2|3c]^S~{}O|lUs"cw 55Rt-cGaۑ~^>wcVfDuMyD+1vug>ujTs$4o=̇mZwZCgZ]$ v4|C;͢ʳ1oT{eg{{kFI7؍pknJZEy}7c*s?J'+ݷtj NlU}f}yϿ]V_‹eEXDO6OcB_JxS_9ܾĜk՘7]m_! b/9з 1/9NEއbHh:$0@{x4V!Z3yCtxa#^9 H_bu@Gs<հŠW5O˽*`gcE b8Jk}68K5U7HDX[{%@%PI/ߖz'Ȁ~2ܷL)B`Mwm8|i#=((ZkŷpS"ȋ^D?ӷQ~[R~ZZ'>/|vÁ.7tWՐ^-֚}39|&=OLo;>ʷfAYߧs[P9H2\OW{,o 0hq9*X5.{6pS~Q?NIfv7/qJ&Dj7{$sEwqB67R̐2QˑPfQBhR"Եcٽ.U"8CV>|NPwR@PIBPSY*4 MhB+ovFTࡴ =CU_睳2Nd7SF>AE.ԉ.a.Ikm#&@d7WZVYUj`PrAtU -UG= UO~z⼅ke*w_<e+S2I_2ŇVzDl"T Ua!eAVk^V*hET2>`Kc;"4i>B'J~6]D]l"StaTN`NOiT?m-ډLcf-]_I omm#LIY9lg)|}I]JM~S=+o% ]nS?:Yt^3z+}XozK| +/>@"ސVY,Cڕe|x`m?Sl{/VĎ;u&q)߫^'< Oǿf_F2q  e#^Ch>)=+38iefCΙ ۭ2-_1,+KPז@~tJ+~&]},X ?? G~-삟93= 2K;iT~GEޯoYXFʅ6oXs}2<2eoB Q(v\"ccYf|ڌtyA]^7c#SٮKC_ e&Q\\,B_sk.9Y@o=7ʹ44#-r _OAye_0ڔw3?3g&12.{`vn(vn6&P6X1_07:ʊQ1J[8nBb s_ƘqU㩖́ss?d.!>q.%.i\lܮ87S9MIs5a!>fA^ټ?a6/&m6?5ߜ }8B_NgAYR+u =<7f:A*<-8PEU^f @^cfqG  u>ĻK&CΫ!drCխCw+4Ϛ򬘆r2 e~:9qr+NEڥek"fZ2iNu;+vYvd`V\] a<秀>$NF/A?y{~WOb%"{q'c 7O[Oa%i[2As9?tot6IwxErX{2G{5;oxg`=S5XB|Gh" zGNiaH |jy^@MvG cJƷe wHL=-shq ہsu*φs-}{jXAD'sDOyiw#m&$6Vz8KM1^2^SRELedLA1)~v8ŸM;zp)d?Ad+q\ ACq yYec,D|cz `n0t  *=s1Ё=} d_[y!ϙ׏g<v4޳%Iv= < pnYߦ!0QI\}*ɹ e}S~;ɽ/~+҇HxqR`}_Lӻ?OIuf<.׽]Wǽ+Pi>Ÿw$<}&ԗ{ha Bm>G=e]'}}@Ƈ*Xh[/KYGU(Rmoy"j aob{ ^PUP' 7狽JTYOD}!8 H?ۃWO[^hI\ڵ%Ѱ 2ُw6C=%KQ&#QFƣۯ빒Ui#{]>)jsO}Buxߍ{9YWwE6Hv?fv~\ 26w.|'O*ƒ.i+s<^O^dLx9W;3nE=E=)؝u/(=ܝC(Gg@\Z(/P;ni'{'GPw8\H99;0pvz^}˥#4;Bnv͓~p;O;!䥂T A~fأ+ %:=E׶m c|8,@բXfZV>eݚcg'}P(3g (?0f!(5ZK(OVʱ0 APQ;Gc|8chh<(ME!viW`m{+Jsz!7:aO" ג2#9>#g$\ɷIw:R9"=v+@{7!~ _3#\*P%·!P&kjF/WP7—$|zG3̧py{J  /%Hs0[rV5 @<#Ϧ@%ߴiQ޷>Pw`>:75k}sW|Q_#70KkNoߖko}7[.ZwꃐuaK(=Xֶf\:oy<†*O65ov}}\>#^H|+l"q6T`ÊT mo~=|iq#?<1?g5l{.YyױDZm+mw`YW߶(V +wqmG0K-O" 4\CN1-ƷLo,(=ö{e0e;?Ik;i={@|"7V8ثo%;l+oe 2n<6ۀ ^rD{h_?v;[^yڏk~;l{ =}==aob'ďU 97^ޮ?F~ֆh2.UoAߣ>l12e{I|d[7K{{Cbܫ&B3oBM MuG62] H5$7qB[i_g]F{o{#uo0xx{(C l̦Ls7xikV G궥mԭI]8NRnW Ֆ"UdBK#\Ww6]kX6]gtj\x|C^q/>95Fh/]Zz寂%>NƊEԋ1b Q!"5stOh?ar}PmM?t@?tT/8=(ͅ7T7=P{!fB|E'@ԥס@͙ X߶r@G9 UxSP:n5퐲R5CʹvHݎ}MM-mUm7A1PSm/A̾1[j,`p{:J^!/mkKE-x!s3Aě n,:K@ Bw5CK] xTՙL&$>, BXQ#bTj&!d$i/;ɘ޹&.4cM1jԨXSL*uYEm-E)ئZT{&w&<|;|;9;WmٴX_Hrz+Ġ_ Dc=E9ϟ6~);M|cMC1]Ss߮ |n=s͢\߹_6~y) ~oβޟY:z0m~؛|fy˼[yq?}sEl?ͲE;]I9x8{]}rIu/7kW0320dgcn`fyGK=AC̏2bne3o`9.lG/q1y8̧?c>LfyszM>fEyޘ3Ycyss~旘G?d>Ü<.+ka?f>)f̜|bbk373ocn{?a^s)ۉy9e̫{090by?Y|03?cBv2\nr-V>%&32\\\¼̬1ogdN s5s>sgyngfb~y>^n滘3gv3W0/KuT79RBQE'JK9o*sU5kY%Yjp@x۔r )'Xx@$\'#i~ƈӓ4XK}_^opkO}l՘@ej1My\9_SCGB|,FUpIZP }*BV` EJܫΨs:o,+s6lRUrUA 2| EKBO dNe FOz. #)H |]k 5FoM RO!b ȭ-{i">Eė НgUl39(Watʵ)%Ri8mr$e_E||>L7?InT1sXDoR1g'59L}NTDX⢣WK&rhaxc>O=1'R?g߮B; FtF^22-;Ʈnc9W7W#E*"OFEFsK'垦IeaR'nŹ'eݣ!n$RD $"W1/y`?sk"C8G(+FnSRfF>k&̮{_Q$(C"0u}T*29шu^tgym8/.WMș6RyV "-]fAkh:=Fgcugc u]LGn (Aiu%<_A< 7}lnK*n H@Wqz|EEm/^*E z=8O{Ub:Q`ta:쏈Aț{-zJ*)ӔqlƉ*/=z8)_)OñmKrruu/]Zćd,䨪x7qPe`21Ԥhrs$B{f˾۸wbwd<|"(]ucDƕ}zDC =c#&(s· 8 '5na*p"=+kObɿP'+b\M}],V;R)>p$X9ES\PʍN#]Тb8ҏy0) XN[/r@iJԨ]noUyMt,uf +5-V=<Rf L DjVӗ[C3mU.Toƥ.(*}QDZ(5OsS%]'r+TյEu%$Wciݾ:Z>B9DX@xM5Jn)ZK "#M(s];jw]"jȵ˔~Jt(b:S08e68lB?صv|zI1:EnvX47q2DeX}(߀tv b 1u1/5:ׇg>8aLwoԛ0^\ɰs⺿>s3eԑ1G"~X&1ko71ڂD%\h(ڏ6š zzBWku]w߶aM|-cفSXkwa}ub]ލy6隬cm(}x4yCȔ:hqI>{hi3&W}{d]?=_@?bz?/IteyxЗGbա? v<{—FO?89h߭\zv`*3t:4d2&@}pWB.:Hiz(tB}|B/꩚&@c/`xukqoe7%wN iIw\@!> 1 zwig:Ư#lȤGǁǀ=@`/ p]x?l Rѷs$iM 2paLҿfv;v'ͱGL1u>ac%䇸 /}4~v?Oca?Nkf P͵щluf/QFl.QG:*mTֆozD/dC gq}8AlzHbbv<ٗIeż61!|`F{^6flÜo,4NW>} {&x pA9(L&=y5d*7:{C|Le7޵jFї&naoiZxλNV(&;C:Yf<<`%] t`7 ;{-C8 }BƷȊZ''08pȒ3 Д d2|ڛIy,\p3SMTg;1mM;]@ [MtcvB;kpN@|@GN;wŸvegҀspT~$JY`~滾sӅ1 āQ 1 3oZ8:g-9 " Ƞ#( H !)ҒCw:4ҭtIJ0pEĀXqXV;HF9hzFJF1VU#CbpK*^ۭin|CߒԴ2JQ}(#kH@L&6#gu Ý̱ZwR=e=SzQis-q? A7XK!%tLJ##[FrlcHzӵ'?(/k:_i?"zM#{Q<,:g{9kƲ 2{p¹jǷ)#lpHQ>/\䚭".@n摮"]%M ?p9FYHݬXG/w#^qߣK)Xb:=J9AsϺ>gy A_>01gqy; w|XQ/J[[*s*U3bdۑm2eyò#.m;ߴ`<\oj|I,Y/<"d<-@؟8gS޽ʷR¹rY~qi>AZyCi4DW|p9|]1[q1KfAUq$URqQ?`D~TDst;C2 Q`_r 0ʂ؉)??"K& hM8QM8X b=H=vL\GXʁNjb N#x,\h ,&~8'؅SjSOc=EHyR _yR؃DH C''6'Sw1'e1by0p3,!xq<Ʉ Sq7/'P u{2'1pI{Ș耥W?. &KL^Mc(!eROj`2΢u2O7؁_)'ӰC,JIt+=9iDa6,sx1'eE[0bL.+7}H e@s$C,ʫE^ I|$UOE7(sA%BZȓ|o'C)ڼIžE oH]A#v؏|Θ]:b!"qIp^ÈEe#&MoQ]1 z'qn;$_yRu1+8f؊H2`GY7Pz'p/!3H: {ko\CU pizR =0p /#,&}4Xl][8Aq؏X? בk9q8+H p/f*^YEX'0e5# !w/"Zeȼ؃lX=O<` aod&m3P` iVmC\;<~A]hۓ{{TK[cԏcq<÷ HI=k&H 쨀6]d.HF-|8h )nXO1  \AAR тu,Ap ؍1]1pbɛ.+Hbt ) 'Hc b $H(ꨇ/0pp 7xHH,xPUQ -10`vNn?H 1R#r!&9s<,J%܆K$q-@y5`&c`34n%$=$EZdFC!A AT'h.qXU؀؇cX@0uO}0 0 p+>BR#+ }Th/1S5V`6'%U-F#0I4.1$ĒGJWIR@$e p&eQ2ZX'eLI2YT&+2Sfl#se̗e,EXRY&rY!+esjY#ZY'e|/?F$elm]vN%e''CrXrTq9!'唜3rVyE.E$\_\rSnm#wF+QV9S~ MEW1TLKVqT\OW TBH%VITRL%W) *JR4*JUzA2T&YeQYU6]P9U.ʭ^Qyԫ*zMzCT!zSB۪*b*S%TIUJ>PUUV}ʩ#UAUTTeUEjUMUK}j:SUWSUP5RUT5SU jZ֪jک:Ϊ>WTwC}z^~R P 5X QCUjF1jƫ j&)jTfYjyjZ-P "X-QK2ZVjVVkwjZ֫ {ڨ6jڪjکvjګ~T?}j:C:~VG1u\P')uZQg9u^.꒺WuM]W7MuKVw]uOWZkvڧA:c:::N:NStJJitZN:~Qg/L:΢l:Ρs\e[Wu^~]u.Ct!~Kua]D;]]\K蒺~_K2PG+ʺUu5]]뚺Dun&n3RҭuVuQwҝuUBԽtoGtAzp=L#H=JcX=ND=IOST=MO_=CԳl=G|^Ez^e\+*^ZNQoқUoSһW~}@ԇa}Dc>OS>sE_%}Y_Wo_mh&abX&cx&I`D&Ibd&Ia^0)M*ڤ1iM:lқ EѼd2&j&irMnc^5yku7 1̛-j6MS3wMq)aJR})mʘCSΔ7 d**&T5LuS|ljZS1oilinZLKʴ6mL[δ7LGt6]LWf 2M3͗fhfj03܌0#(3ڌ1c83L0$3L1S43|e" 3233fYhfYjor¬4̷fYc3k:l0ߛFl6[Vl7;N6{^3s29j9iN9kΙs\4es\5k溹an[涹c{7~e5Zg}o=d6ic6k6Mh6Mj6}ljƦlMo3mFd3,6f6e_+6}浯m>o؂6oڷl}ElQ[̾cߵ{-iK-cm9[~d+؊l0[Vm ikOlm[~jzm`Fmbfma?-m+ڶmm;vm'v]綛n{/lO}l__vd!v p;Žh;Ǝx;Nd;Nt3L;ζs\;η_v]d%v]f Үvήz~o&n[6;.{'A{G=f=eO3=g_{^{jiokxSN;ssA.b.⸸..K쒸.KR\Jʥvi\Z.{et/L.Ⲻl.r\e۽W]^{s]+B\!{˅]aWu;]WܽJ{}J2ЕsG*ʮ sU]5Wpvuܧk&k暻3ҵr]ֵs]ur]}t\ou\An↺p7 w#H7ʍvcX7΍wD7MvST7Mw_7tl7u|[En[►eܭp+*[ָZέwmrmsr~r~wtaw쎺c;NS;κs]p%w]qWݯn~>>>KKKKKKKKK{җʗڗƗ֗K{ї/////////e_n+zsaTjMӰ_NqσjTُO(_z}VtJlOOJwѥhMGf^~ZQ<2O+K(xnAV"_V6r6W?~b}n~Yۜv\yes{jcEOj(~~ п*?\w5zE<X'~J=??}n;Akwu'h[ph?=w;q<%r,?\%>i=v)J"?"Qy}J:sm׿hu*S{E<+3m<>xqfal^ea-r=>,H~<1B? CK][(3,v)~Ok\g3XmBiiCڭ]6kURIЅVZ[{eֺi[v.t'jrN{UIojkx@&< N6:x@< Έ;DgvxLԩ]r"@tgq4F>B(; UpAE㗵M`7" )(H7h'Ry$b UDUD_I ; Wowo~2fBw;_??!lʯJk7R0)߹o:aԌSYxP3o@jMTpjxKm!R[cDԶS.%( KmOKmϔk٠g6qv|{Ay@%=: ߀ VB2[о}DT{I 0Y mPOJ)2}}+b;Z(1sq :V& | k9)u:)-PW-){ɬ=  >U89kΊ9`A%OoӼ1X$5C\' (ޠ2)9q6qgo3 mc"f):ˠ<~TsF-EF\C_-ΌD7;qQYN/ " ܪ1 w"%,(x*L8Ʀ\/&JD@ S|97Qo+;f_?'~?6x5rI;)2[O?8,㡂2vjeq}KwZ L ߈oJ>pG=əgq;B)aBi?g}ω6?+/F"=IL^bTZz_LǥOSS=hx'dԈy am7ˍLD${KreŋM_va.T/|b0oYcH19(_o˚4mdlՕ l [M,hQ()[%\a.6m>hܦԏ.6m~= q3p{n3,-q<ߓm}f f&67ļys1DQ3e:16gQvq3؂e :K;@E/PQ5P;4T-h| 0Խ,3KjQMAB#ʂQ(Y- з/z=ө9#^tg(E&f/ZBb9٘v bzu /jb 4 :0jbj~}LkF仾emf/6@.X-3 rɧ?"&peIրy; x_;a5z/m`lp-.%^F{-FWa$N#TD`XS"1ĨF Zc>,)]廜I5H'[9K&Iϝ3`QM,ҽREWSeЃ6:xM}#f":SwSWyj0jnn7Lu? W Л|SR\U;,}ճZegl{ +^< k'\=  mOAhM|UZ]ƄxѡxhP67zؚIG!1˔D+IbJ<=*g)\Ei*Gajw.Qx<`s+MAi_ɦN]@Td?l'hnͧ{p? nWw"4juGa8ߡ4ʞvF(p|&3Y5˩ex [ČRZU^  %M#a4H5Ze8Kfw'+Lӆ X::1quǪ ѹ$3+ij1Mq5M~K&Nf%~ͬY~V,򪘹Rr\tV^3Êx%;᤹W!^'㙥cq*. nG_8~@F(gHec$ PO CK]Ys8KԾ6XI6j_T c ɿ_سxAViP:z|:Qz'VVB/XPZ_'^꤅{lfrUh[jSh[gc${ r`J[Gn5īy}# wcq=I)+Y#'"'lgt'ʞQn{&X'["F"D $R-R:~Ut`㳭ml@R\\\'0˗J֊뛊ݜ4Sm𨌶mJv%4w5P@_#峯^R[z)׽N.;Vkr,4-^GOBrΰ|! u?٧Ig2ԕR|tՉ>Yi6t='Y'O'LҷokXg0/H+7Q9A$7mÈɏFҾ/? eb_6& ޞ|Ҝ\e0&^^#ry~A7[h4M߄-IQҳƕ~G&FGZsҞwְQkFܪ@]Z| .)u~pϗlHffߎP #:JϹr~GGD>|KjlQzH4G)AP!CLJ؃^‡AD=jԃVt]L{;UpN{st{/ New *Ḳ}.C9wx,G g0bB epl?Ѐ @n=RĠBkPxE,h ߷^W[N;H ^Nvo#`AC,l_8B&=9gѱL1i;\ۑiW6HgGhGt8UXTo>|MȽ:z#VM55xG\w+v{{YMhKE]WQp[{vFhŪA2Zl?誋':ueZuݙMx[:0jDǍ+5k>Y7V3Qյ=C@}W= 1Y&4j/8 nL6h.СjЃ<*̀Ƿo 86 "z#I&A` 0)p|3A%p|^D= r o^ CK]nH ~@Z;VI1d-;FUIku_$K2\L^Z&ϐΝ'C]G.kk5x B5 )^bG7&J= i8!'t>h`Zgf&ixFI!N661L lrHxY$>!5>Ml-Ml(~SMn#~Ml~Ml3Mn ӂMlsMl~Mm>y@< EaJVW6$n zQn(/E.]/*yzeOwYWLv wrv@o|DqQ0Uӭ$ғځ4A Pmb &bАeiuKmmñ#i` z-Ώosdąؐ≋)))PW!C`8xUD rc AC>D$gt@'0@9MH\&KF|cy9 (CS},X[wjK}UP/d)(RM3(eh0EKNRb8ާbSoM'5S-'ؗV>m*׀1HCG󀷦2A7 B0H A^do's9 n5SKnA|9ʤ'?ގ~ l0YHε#]}!TRc.֫t'2 ?uQT+d%gC1.xt3ʪu62#}7 ^` &%D ?[7oj4>[Ss̀nГ`E:ʸn@* Wd'H ?!#Sev5 eK5wa#3ʛXAVĊ aȑ!KN@ȒW mK+@ОT 'qR̐8\ P&Ƈ~LޮrH[N5'R-Ԁ' +7ck;wx/7Cԓ;Nʏ߬.~(@ʆRoy7w1ﵘ/j*1&CN^7Jj:Us?I{T/aO$KjS=(4ƏWwj,.(V9 ?CNy;C/P`t\_0DBs} UL`v`884,= QP +*d`"9CCpPԥ1OAp/-(C>l,%S/TI<,vc3 TJd̻TeޢR(e'RxJaAoTd?,HħZ Û}h(XXȀr2 ,ٔ=ԬqYqZfMJ*z+ s@ٹ#/ yK c5@ዚt@)c}1(@Y;Zpg H/B$$^Ÿcz4X:^2p {^?O<,,6wx eeN( Y f{D*8gKfq 0KһXn8>٦vݸX, ;`c]k*-Zug+? Hf`ciQٸv(A ~6û 0}_:WY N]5[rߣjYύ̙\9ֱ$HzEpv..Ρ7pOjP[[ xNU6EOAhV=cAm@eaLٶ\giPߪSz-"Gu.Qp]~q~ӎs5o"9oq^lsڏFaI4tBZC_aF(3+ +y&yq(;768nKϜP~TtZAFA܆!c~M= B)Bp(&xýG;G(FOҏ1 Yy> +7&Hianb)fc}Rn٨gv)շ$Fޡ>>wAVѯKzDCC;zC_g:5Ork. n[Jv.A:HB=S@&aOc-z M겟/O@4:M'_f4dDpdai`Oh?Fn@' _MwPx9 FS)vsj=vr07㟇EXtʏ{K{ڜ]?oP/@ 4/v>դƌV"T6wc/h{[>uyeԕd͒\d**)(5MER1%20T*7v Z7FDYtW';@!t~ޟ>,e f <g'eXZ+Vdʷ%.Uj,/r 傂R#I,<aO=%.,DIm ?jT! z_S/))Œ tNX"]v{aƿDM~w{m{?69dٲSv/C]˷$_ezm캸 `-/.,|竟'p8o4wiH{$RqDǧFA=&6x)5.?q;~ģ`?ǐiIϸ6딎1 zG|UPtٍ.Se XdwIRyOqUߌֈ6XbÙJMbiv&Svl.{ܒoC[g!_Igc9l39`Hss44hgGݣAZӱy8 h/UxCNX,{tXuP9+w{" ~ &s>;^5ѱ>wV[Lx`}[kS~b3=gSY6ޒ7&SSť"3"d/,\d6lƛ+s5^-{ 6G咓t]?ѱIm7hpqvBvJ>^!ǫu9 tŽ3uDؖ&m?Qax2U`!#kj& uքwVRҔ&:- R`k m3D4uz3i_O׵N-|C3T$֞6=Wy9R'?=lḬ'v Iߩz+QR[鸠9<~' Tuj黿]arqԇY`S0$7h7h ){dI^OhW3 6h-D_ Wt.j0]p,Án@Ls+N:o,0_I=AZ#ڵMr z+ٝ=MA΢^}-A_N z l>-`֫%{|<>x`MFJ4?_hA|Ne3Z4ƖC9Oc9c]?dE4М3OG=Cׂ |QgΎ 6,cP8_(VBY/sH5P]`mC8Ah8>|[AK>+eV [4 fnBnlk7k{1о#G*/gMcеqVh6М= h{&Ҿy; Z4|zAXyo>k5E6pO>dss #,agl?xIEBc`kcМ kfbQ ~x1S`ƿbh2 YV|Pb <\F6٥\J v)pea߹ɌBqD'r4#ySQva+4ST.*!xT[ @~^W2]Ez.>1=p |>GOi@tjxtq\)7<*10r9rx'D&p̚!x " 69g%isМ+4gv i29o <3Y`[[j A׀^AOؾЯYs@ׂ!T@o!_'`̿Z , |iS X#3Ph.Ҭ;O8mhccLO\Cg/ #41М80`&'c9I܇`-Sr|Yo'P[>/=`b?gМ#M/ƨVwסGOXKh^h,< }I7W ]4#,/H@ CZ'  Bw8Di>o ,0/#skƷC0~{ڥdsRѯK\"F1;hcqz^ ͹WhΑҜyBssМ&cqDӅou OuB575[ ] ohhǃ|Jp#nd!`r:>Px7u+mc8js4DEaZA/ǃ(&N0YppМ7cpb[A؉4ͷ`lٙ~PB]-} ! ^v>uѾ:\$tvJ'9 m!~|~pJBs~&t7FY";ɇw\p!}z8vL2gݍ1wS|; >D܋4j s mGyZG;A<6?b8)A~\x?xTޕ~HI!1^D{D!or3xƣ4>w%mcw y: ?t"~ ??#B|'xcйm?tzs G5$B67Ndh3'=жs ^ID2H'E~gO~XO=17=M])}/xfT:`>/pBgƄgp ,B-\nl4D|7xsg)oՠGhΛn |YmϡN33xpsT+َy(#Sa81-t>O[KBK,ߋ[rE7k'Gb<׿D v#ܸ yC_*ָ#2Y3d'5/þ!;xpދ`Eos7Mql:e*; н8qqX-1EyqoQ97Ei/jW;y;9k~p.w(BLH.p[#o CGw9]w)a<9 ޲>,tgf_1!M78qm?yay7|M_"?=9R|׌}Ow& ~b'<<`g|| Xp Bt # >i6GIW%R5KBo{1cG~|}Om3,t"t_@:J:C9{SvEpAOG4& \2x-a`& @#xRAG`@/H9v_X >pK6wveX9q]ES(&S lN4F(M B7|>+eľ}Ai1B'qm?;g>^2lVޱtV ד,끝ksZ׷&K0 Ѵ#Kbli a h2k2 dVFdDUKSVO׹xw\vFC..&&khǸeG(C~w XK #6w|mKهͥ2sR-pgw3O3SK|}1qåճUx J&RQxN\?R!6ڋ︛D\O~|)n"e0&ءK{zRq6a/Rq3^be~abq R)s @>0)? fLx582WA.}X:kɯONC(ӝ"]ERP'e~ uO MTRHPEǒ_\MjKIŬ :w!G/b * ys0 9[$?0&|&e*:繅KڟL܀]#SM[ {8F=c+( 4{Gt;#}1eWG,ʺ{~23}xFxImag;hgɉԓ?bxzb`IW#&Of^SYw &I>LcgyŹT: R'Y<{0~@;gTE6vԳ͢Ϧ-q}L&TF17Gy/UW:Zǜ?{+7TGڬM.Uqy5q[[Yaǔ\ًoq ox<|$C_g'Ϝq/DjzgvS{c?1NEW7xF;wo,+fb\'Ŋ:)MNb*< o~i[n)ڌ[KqOny_Mη%?Wݖ璉~v+Yq sCO8F\}fK=HX[5k#R_|rnR< Lhc bmTik+T#w Z*i1q-V6IlӞ{=hG9qs/*iAR~nYzqq6Rޏ[*48؇ۡ{f)- Ɯg[`'8| L4e!&.0q*~lR+6k5qv|Rbo|ѸĹXkbC]%n3H L7KW[=2KJ-uvU,+wxI܀,ݯrΈYZà RvW&y԰-E0uyFMv%cȧ|v$mƁ|l9)y~(>+e[rm"Ӟr4MUӤvuN>]3T;C00^bx'K6WdwPqR&G%J2(h'͒=6olr'Y>q$$aX|O;j|?̕y\w?z*ES(˱|;q&̗kLm)k})w/¿ITK*uFZ5>PઅR>qv]HgI+O7Ŗ|v\:"ƕ`LZJN_*&&.3&'ޕ9RTt5~jrj_ܻBU_ SWJ~_)gA[%q*3߰jSaj)J 6k+Ll)sL[N Ɛ5=45=)ȞЌZwW0=/ܘ<֟Q=u:ig{L^'J^xr٧ z3l2xsiϖa^xT?[ҞF3n" 2q&${o$dY$ S6Khًfa9R& H~.#c^?ḏn*uaiew.{\5 >Mbܳ] 0m!ք=eH\/d|iOP\|@{+;'- 9V.87vɵ1xy9kJ 캛ȵ~G* ޿G1{&N&%Q&/2x^%>W{c^y&?6"fywqb.jKJ\G~B\?2\VJ;3p1%{LO QIIΈOX;8czםf|s/أOcl>*h+'Ϙd,Y'q=v3>8ϱٷsFR&? t]`~{^侴9 .C^ibm.8Ւ}/3n_w!b)8/I6PjO׮M~4v^'2>Xq6/mA-?3VQ{gܴ~U3,[p[Q^{>[ƱÿmslVqlVy{yWOIw*>lUsN]V#*F⮧mUK܈DalUǘbs@[g`ao[e3c}/__ڪ>A;g;{ޟ>_fM܋8/۪ k [ UU*g&_*by%nCmXfbmP}0[eTaBin"2\􂭚hOƄ٪5c[핱ۗ,oڬ͝dօvdƑ A08CƤXxy^xƙL[q_3|afġ8h!8h$ l__Marv?Ic3T1qK\*eŌ!rAy)!ܥ-'9kwvl;lr3)P׉2lC`IK+NR6q-a?!:"m+ĺ#'h,q1^'fā8ċĥ*RqY&7I Iq!Q=uwB F{x%=ݣfc%)7?I= HowszfzkXL54fxQB&CK{xSUWd7\ r %x BE!)PbR AO;{Fah|XF3D."sޕlK8x8xZkoHg!/?X9,Yg! 74>oO1d,s;g2 pX`n`@p%4b<dHw _,t߳!]] .&σBe-X_Øŵ{pۯrڋ3\CPzxjC>+z~}m2=Pa+0+p`?48);v&C*<"~ &)X VhhCnx\gN1w27U3y^qΐFn*C<7p%,++I Y~W0(8a?E|/<<>!v1d ne<OϐK}>C?L T*!~< c&9ip#tõ31b|g1d O#_c0ASӿcٻ)9꿔_;08(? !ݳ91njf%/xe^1,wå\ '{`}Tk >CG!%ǡ8%4w7 ?o?oY mOo!èuPys0{B;)p`p~bBLS]Gq|| ;N!_* 1e7xX-O 1!ySYp#-gSSʿ-ĔrAgqiAwk%;8tQ Y7w叀e ud%dފzued,_8TF--!]d$ӥ$ϥdגN M"TO툩Qz·u«ͳ'ԃfHQ+Ii$Gmd!C ~Y ʰ>*>HI ,"fRћ랂d ~ʗnDiZ3Pv.釺ζ}|IzT{uF0* -KWw҈~QCLx#j ;czc%#W^ה21#UGR?) Zw^xΈ,BkK{PR~)$3@dF;tj$ď6/L[ΩeI.R֢$ҾOJ }?;V u{W.:w3qv J{J @6*슝mmgsH*yErDtȏb\Ә%kڽƼqo›޴7zs^>OSXƧ|zg|fl>/K՗e|Y_Gx9W,ᵼ7& iBڐ.BƐ)dYB!kD(JZCP&$+ʰ*aMXօaC6aK9l 0ñp<'épk8΄aGeDQG؈&"!b"HsE.Gbx$IFRH:d#ʣ2lTFuQ}5FMQsmZ=Eh,&h*MG3l4%,hz䜂Sr*Nͱr:N8#g̜k欜ss1.%$Z4\#CP:TuY:zސ[3oy+o<| >ɧV>g,_W~_g֯o?o֟<(:4m@.bx HR@: d=`,xOo/B$?\\[g:?f<{]<_| sqh:ap&aq4;#;#huG֑sܩp*j'8NS48Niuڜv'1g™tδ3:sNⒻ.KRXƥu\zet\f첺l.s+JՕve\YWEr­tj7ָ^Wy ^"-I rD\C1!X?x$F9CU+tг ZB<4~3ЮUC:Zv?Ci/BP.` V2AuP ASh< 3\PRN:d&Tkby5 fO9.uФ zB;? grĥv 2.O\8KuNWcp= OғzҗglJ>tA%+<@P!Z=Ќ`vx0̐BnH#;dHHR G%_U?ô}iow6%}ruaonm6yi>o=vs7[ֻ n6-fmsݜwqwr;ιGQxGa=֣=c=Oi;9_*\ݮrS2ҋsKJnZ 4r01̚vGJ{$Mާy-Z' +\1V`m=V5@mО @) %0^ʥ NkD+6P֮AHR_Fm|r#ČUv(S =ơ8֝r=SJFՌlD{=AI u6szTThX4-P[GM02q0C I̻]ɢ&h&h&h&h&h&h&h&h&h&h&h&h&h&h&h?nKQa[n~0hnRIIrs BEIE'#KqQa3edDʍeǰ9ӕP,!YL\'.哎MrW/ɵȶHǶኋ$EEeѝg7^kId|2eEwUW聼㬚%M*lzdz] l_zcY)/Y|ōō5Mjv}Ϲ֩7V[^Ql尊Jp6ÿ;dV2ݓ6m7{Cvk \{ 75طg_pǼ#ceѡc{fo2'7vnd}~uԱ[fhgj #~Zz\׫}^dEWk:YNjJOyײnS ߭:|v"hTjbD:e~J;9,.Ҟ߹O/z2;۟}TlNmi5r=_zcv&-_:M&`jj2:t^!ڐy 5/g>8iPL*Aq+c+!(>GD:b'=f֍XlY{M5^6ˬ*e䗉]W<<_?sk>K^Nq^{j݋{Xxw?Dŷ>zdboU._=vϚ3},XG׷Sk_X2뇮<1}[]֘_}Bc+=M g=71ǽÿd1'7OZ~i% |-%WVϞ/o o^ݻ:yߡy`L >~)fSxCδ?>jW9?z]+UYHNkϚ9iO䅆W7,2*QÆ F!#U~wȮy"#]^[8,olkTV=A5z R9xdEeeŵՅ;U5.Ww ]''~-ա5mWwQMe]OB&H/7#(MzS@Z(Ҥ(Hw^w&"ERy33|x֬wVXsog[(=kSWjˮԯk?{ Qu&9!EyW;K @--7; Kgfdz8LsQ"3|fNBt,{ۆzѱM*/roHra!?ώ!)%&:sR/A&5wV +ѾW,DؔqSKY !XUN!8֍ժ e;#G`Xn|FcUًUSPDO7$ZVNM8VXTXTGWz`k2=*,#g>"6e22)2R[$]G3m ;~.ug%b26-l+3Cfo^j)x95aS/D^Q4KZHD9xGy!枳{"ޒth RAK1 ٙFڙڴg"wn0h,E[ChȚZTJTo!?s Zn 9tV;OD͵j;f7E5qL eƷp1᫂=ɝoc] yخ`p*F/1CzH/C,&\[r3`xt~_*0 ՏصsvrqP9v 8HpK)MAߔtZ#šagtNyӵw_R(^OD05_=RAr A/$Lb*9gtxej?;>{ZhE/*_Me*)F{'I$FΫGDIyƽw0Y9#$i?ѓ4@Nk ./Ћ;D )OΗƋ@cp :vk9cy^蕒Ω?oQL2Xgj3b5p: JCX )Ђc>({0 唩40rc/@$lD #/ R nd%cԹԟRfW!M@=O5O9Ze4ִtGhjG&߀aTgdBy4=j]DK[־˺'GU+<]r= FqZˋ+(5Κlj@o)S"w~Z!Kzl-<=9_JZSlzJhvqFU#(" ˵d|ivl~[Dd@<:E-ieh̳cyk w M'2!j֛+0pE)Գ7 tR9^M`Q:y-]muN :k*XV(h@9{ҞD껑Q#Z< ML.$1ko!)\x;1sd#Ep߽R x9%? ȰKk-(;g^(B<|,7YC~Kl }/v$$7̀ݐԺ! Fn Z mM'J^~Ap킝JMBLn)/ VAXnxťXdn2m!YIk>oeւ{m{Ae)O0Gi_EsPTkWznS8?عHf&9P_qEOF uYσF!X7FS$5*}"Piڤ4e]~oxeA<nG~Y|pXu<(Dc>~O!Ÿlf@f_u%B4dn7 {ggHvCq Dwߏ"|Dd{uu~y%]BЪeJАsjw8 '!xNAiNT3ٞet>b_/wɮS͍JDWnng홢RFda*Ms]]ޙ\ΰZ SG1>MgBCc0]-nkwoJGْi=yE>&϶=F-U*s_& :b:g^r W7rݮ?;,*O./˻4t(=t]#l+[`G oߕO[1(s.܃a8   _gh$z‹K#90ƾ1 8z@ ~ BiU8IZ?"{ʎXq Lc c=w140(m<|r1c}I9qz{(-=u4~ ٫ZCV[8k-7m;zcƚ3}EdKiR7&i.Rz)( X]YarDt<sYם§LZډs24|-xJWFﱬLLs8̀DI¬DDR_nV`_ Kq&F B;Ƙç#o1r1G!-M5I9$oL03ߛO*JY %ОjySEw-eeΝ y(@v,*q>ϋSa'pkTkƷS"sW4ae-S`&Q# [  ~2E^ӟkՏ熭ϩ^>iᆳ2{5{'Xf+ƚZ@0Rл)3?+GEQ'Ίyy҆:@?Wb~x4Iv0 \.7?1@9>‚Bלďw;%ݶPETRYϺ=O9 -w9 Աn]NRzxz ܣ۳>Ck{D# Woҟ 6 W<Թ\U6WZrí7qWwPm3m|>^QzmlOL<B.#_.fY[?i>?iC5V5\}L7eUJL1yjpӉ*/)v MTOhy;C bq/#㤺Pn;Gu5(loƎl^.BK&NtuL#UAW/,T wR4qmgэbaT}UĊ7B%]pKP0{C=ReV1"Q7FQus2-dCxqx"[8Y&\-V{3Vּ"p 9%ɸ;"`|y':nzϰ%6bCN |wIOі Id*d2Ňȶ4}rSGmEnӢ\3ASuN/p!Ղg[Ёܓ-[C%eW'NV}vnM ZY֙GP(p&e;ZQ,||knm|BJRSQj1 uۇUE}Rܷ9L-mR2"W_ܼ^ݬw.mȥ9elZEGe0GJ> shaY,A. .r]X?W8`5a#Xz-YG"k@? vVG!G?K}܃瀆@xIj:@ `:_f9(}9Xi}x+-oiY);,-$FCK xSU0|$m:0$Q-CkAsڄC(s A(0S(i6 22()PITƂ;r{8Xʚ%3 (|gou^7u˙ˢ-k֜W`ẺIO}G꠷/J|S?51ILm?a +qڕOݎ)ۥ>KRU+VZ q*?"ʽWbt@AO?'Cr"o`U~V?aÜi|-ߨ@Tsohzk ZL opƧƾ?r-SX|ĕˍׯnLfs3}njs+.hy/ש/~[Ǹ~ؕݪJ{y'mذvΜ6>'kVMŠ_+쳚]8c/ۦ}~6\x~B UWOz o¡mϪz%>`l*ydNW0cߞ1<`0y߿K7 xˢo BxzhV+,\eo0TE_g:N Qt[8uNK~oӏT}x>pk9=d[6ʯ*ͣQu6'/W}iC;}rvNgѐl5cϧjDlE{!X=7t/<ήOtMXڹȭ<\~zQ+G{rǮ]_ceHjJDb&c]&Cڹ{{7%p#e=77f4_'e{>Y.Y8mNׯm{vūO/zaמ0gi=% M,m[ޞV5lX԰c5yJEE ý&u 5p xAyaow9u :T-Rx@g P*oNcNaݟ=^:l~d>/RhC`֚RN]t{]Gqu]3aEvL!G\t,Z"ߩEa^?)*>krڤJdn!~vşy->ic|Xar) 1~ vkemt?n esq^Z{{7ύ82d`{UV|f[oцa[ &)9Y₎ZEi40EK_<+,%")YOF=9sЖCoZãN/hvsN;}˰ 5ky‹1[Fޙ٪WPύ֮}nkʷLJLc-.y*K剾otf\@?;/~"OwM#G5^Pkc">1]^;wi/d<IFI;kGvU4S:}6QWwek)z S?:;Wz^<3H6'6'>1r?K$|rԴ(sBcvmي'Ԡ/( jΒ1s+9:٩Ak΃ڷQ'·m[_|PSzfͧVWwөsܼþgSS/; >ep)9g'x~<4CIN%v;qɿ}OI~-Glar25:{&-kMuMoӱqS,>T~Qjgskg'k|0isⵯ=%RU`+\eU]J ϖyuvOh]{ E=^Ss}.N^2f'=?1˹UKLo<紿ѴgW;mvWu"pŽGmM-L_%Ҭ6:;eŘ[?=ҡ׏s,MHW5@|#B?Xف_:OfbV6oZ|k}Ӎ/R0,E?lhsوWp=y|رÓ6O5n.s!s; gfw@v㙸bЁͲMYNOKnqN G{tM:3@tBٚS)C:qq>>O\4Y˞O`Ҥ:SAu vS6-eoA F>1hܸ,\h?6e⬑=zww8{*'cz;*g%4?8'咻ךU^ީ|7ŒL0Ҟ8omfA[l0 )堸r[3g]o'o:xq){uRkiW;T˃<=R;_Z;ZL{YrEW Kɗw&PROWے( Ѹ 3w鵵o̵]wJ^p7S;HЬv*N+gԿj|# 1ܡg_kq_z(mn<^ OPbCf!3ߐIA" !shi9GtSN&ힸ )3GBV! =ֳ[ꧯ_͏7ŰO,Y6O o<7Q ۼM?e[<7^(uƍ\MgS9LC":DK~o+W*\!8+dAkHS !~w%> `f%0#yz_dx H"yg|6(9Rϑ dZHC4Rm٨#-EsQ D>у| o)bxyj_5m"U*H8,IRp$xΈ ZHt*wI D"*oz<<܄q.Yt033,+~34g#˲v@xH5Ol[Uѱ[e9> ^?5(L/͸+䵥@RFpsD#Dd?Jx@JU@bX¥~ӵeYRۑKA_U *Z"ݕvKÌ@%Porb8.@$Xhx1,%a9eY@]~ pU&B8Uq]IqQH~&`"cr>9g*Ɓ$$,"Cq3LO L9]f5;5yTT"Li_*iXq"]5)|q^NW45v-qyc|np%hQ/!@M!A!Wbɧܲv;P~ϸx DA!M!My 9.XY'm"Pp5JϓޡJe]:<2ECȾn7Q t5K(Q<%͕E+8}E꫑G:G {S_Ep iƟBayTAd#TQCMD_Y7|VD^3f^9 =W?y2? VZV=*)12-4i. 4lًKP nGFi;Hr@`k(n-c{|gq ͯo ΙzejךJzoLR*PV%$md! Άq}Inp_qbSmm "md \-AO9w+lj)N;ÖM4Eǯ]eq ]ȡI9 4̘V4AGst8PWR^JFANxoGRwڼ(ҍPK~0K})?nle7PAa?> (ڞOq$hԁT:b0vOxK-.uo6(42`9ƥSQY;IȖmlXk7SwI%+u>A"e*eZt2ގn髳iG)F2?!;zcR>5__^{; }[X)0 c=EN4'>3P@`K1F\yB/8@m8ťvrs`Jag YSVT; vqjT^@0/+("9X,*ypHDr8бdQT}Ua h֑!H^0yTjz=@ePyq("v)/1%3!;)FԎzF0IE~(8) ~xN.CL##f/42# > glIWfzloX0Fwe/jY;p9Pļ_ϊ6\n|bkFC16^A d%Z;8!H@)G!HpE~(3 :$ Q9x)Ji h%3-A͑[/Eyţ#eqfog~XH?LB>B 9CXx+^*ZA2h,Kp.>F Ad;t xmߎ*͟]ղ -E@hiHX`  IZg6S<>~U4}hG1o 67A/ߚO2Jgr@vRƳ(fzk3@[|-V:ɼb~,T#vRihv2lBM)"b )V @W*Yx7d 3iHeUHJ@8w~qDRZ,+:@CQ0"t#l+)k_fնXm4>64CVC=6ksھKn¶bXY(=qSwRݾ}S4՝Y߂5}} WjB"1i^Hp00qUSQ 7ZV~g={Ճ~v3HxM^UM \.D`S"l?qpӉGnWH1#2BM$O$H)]A^PcV+K0VVzb _7&nիNLL0>>\f?~Q"gnC͇iWRrmk${TM>iy3>SQMYژ\IW+m_թq舐,>tEfW!@,bhḏک@cBd˽0,M7)AnL?vl5U͌pa Ā@7F`s 3T'd,߁oj5&,ʻFL& s{v#43lo@DGlrp=˹&)r2sYEj%L}mvпnwZϕ*5w8pI$)0ճ%u >)8מӬDQy+,r3_KHiGfq'&Hd!pϫ:1ăY 9[Sͳ5l*]~@#Gb,a=¦RA7P)M 0C8Rwmٷv_} q/À ,5GU-ۜ[x[%M&_ԁ|EG@b*=DTu#ς_;m*@\*v•œuW){= $1ٖ2w K0L K\ߤ@oe 9G CmF&3*>J;d{$bm}j0Ÿ3?JqJmA(v6l eJ gdg+e+zQɣFVz a.xeIf:[;NjaFj9r_h /8cB3k[)!$"ۭ}5.ep\y\EsLaxp Ϟw@9@*PÃqim׃.Ƭ,x`t,p=,07H q izgF2FlPVW&5"!āXb}d:du5V'W Itb*GtԂnn[>,bR -c.̸) ݕR;q*rd%: v)%ʇw1T_.<.&ք4t"<&N,sIq@ru ½7ioFLx߶SdS^}<4'f&VR 'nHIxƎu7vNj/ `(9Z1JL!R(bJG gm ygUR ahT 6+xhqv-r*x'hlqO"):헤.-\ljM?.Fge'<|d~$! oY͝Il#Tl,p: KY/׹Qad-(8fah BŚP4ضHp,]F6z0R,=?>83 4#}3cD 0'Զuy+3۽,ubzdv%{Ĭu;A˼"سq)\WFPСCدc1DoYL=U0*!w1u̷*rIP5"LYm#-qnTel(`]F-1GlMjàkJJ^V1. B7H# B) )b{31A1"cTsSX p1fhz%v?N 'bMML䈘ʪL.DT0|Hꉀb%>l"k&Ɖ, gz)諸!3ol%w4蜒C`]B95iw\Sr\EҶfW ι 4$bPfq_ l8:iYEt'<(t(,&MӋa>L` P/m<R^BV Ql7ۈ.4zIm ꑻhS Nۃiq$w rHm n@Xnz^7&JEk{|G\5cER[9hn8L@05;66_>c2(><(CfIĀ-b`}2Z d16A!=DwnA.B$z"HJȯBxg\#} '-oo[M> lo: +h({b.ok.Uo6rpk$@/^ū;īGo\Ic|LbaSmh1iAkҀd٦iBL$[$M Vp x P|<; `tɧAg`9tE8.м쳐J9$$yqP)2]0M_$tӐlG!'Mk>-g 1"Y/qS5_H-PTQBCJ T.W$@$3yy:>:=G'/PUʪPv3) 4+Ckt}Ё 5C$lV~U EPHtB=lkamM` 7@ %{A{86'dR1L\Q~BƘzU>ӵ| wċ6k%.(99(M#y 3 6 {p} y!0(> %kywj"Y5)]0}SbHa /h!I&UUq@&aB/;:+[ ]ϓUY5?O+oQLd+ڎ9]F#EñY}x Հ+p\RC=[րf_D ÁБ7xg  \LG"gdp5**u%/dBtq65&˘Xe#:+|xw'\ Uga 7LMZ:} X;vn|9DcTZ8*R'xgܶ+^GUKD"yp^ڳtԱγg{;nI xQrAd?.r0}:dhu aI׍-b\y-$0,zhbh%@(ܥR%`ihzҪҳVW(34q~ӊ|E>1T4:Vk0wֹﻲ47/aEYNDoת ^Äɥ2S#YX,-ScZc?!b :\4WO+[6zv٬%fWbG2X$ [!WHG@)v 4ɾab9O# mn'i9ѻMG!L2xspN܊\AP5Gu+*XR(R,%-'].8,ΙxMZB۟<*:)gfwrRq{'^GA3gˬpƫ'-aiRgUxQ#7óG߅2H:%ĩ2f5 XڂӣtYMYl1ObI疶n ǴQ[Zpғyқf`Q\!e07i \KKFpƁÍDiWXC1p) :E] ]Z b:—n".Q0s B9c xq.*av%AbLmQ)a5 eDA"=* oVNWnp^zѓ!0gg%U '"+~E1;<+saЇʠB Cx([*1TjFa'b:R7ꤿNӶ šh:O= .ڢm=Muq@XU/i+:S\MݷV_ˆނi vQ*&ϴ?5m,u6Z2o'k`YRB[M8r/{C3Zowx^/gK\l_SiTׅ#9\Dwly_.mc6]anPM7n(x\DZl\XCY]܂+*zZ㏡PEtlkXAL\5 U(-jISRg򷤤[HK<&>> Yvf).Iad)p^^g^Zpr/s{(eFK1fc_oݣK Dž~54pJ x,m]XAUy.Q DJRC8z>&=bˊHo_QG1lG`JY=uMQO\vIХ67ui)„1(hzulqO7>Z]O3X@lĜ-,'=fF/Xt,qEgo0 | ,ƣ'ѓ 'TRςɈNHwI*|ao*rSA,M*w(:`P"; 瞨ų* P:҈XC\m8빜dŻ0b쏈FFV nX@pbclBC:2+v3Iel6 CXxiIYc;7QHrR/=W>CqJi@H'c~fXϴPY,ۆ:9= BJpK%0Je k*Ou0Go$a(nNLx гD~}4OeId:[rs~a2bN!K#VEwD:aZ.*P|+ƈz8ӻ,S+cG9Ox!glp]krУFu@oF @|g$" i|YCSx8U~U˺.5mfG4[,ww"OhDŽ* `i"'qu-?r0r+Șe\fYKsir4JC\(][ 33k!ʬ(|7>.80@n/HLIGU!LXOCTAñlVA: 25]!.!8*o!݊ `<܏=~]pQ;p_O4BLa[Lt`gڂr+T6V(T< (6a(Zt08Vb *P38_ BNcl(Rn{BPU8*f"s-DLxd2p#5w{aʂ'Y E1h ?kx%8CKU_tzy@Fakڈ[g3ǔc^ B7ywyj/nMܥ dD[ JR(|1\)%.DI+b~]#.z2}@U'7B_GL`uR')ryg%JG< * Ctx!ԇN`yBt ieG[nqSrLhwe̖TA#~7G^@-a DuIpf31JDN-ųV,J[X لv5&qSa//aZ :g!]K6rkg<,D"B,t #fl̹*}iFC8ΪsiPtfά50skQbR-,kQ#βAVFf |L6+jnMFmxRu\8,w!PΔ39rb鏸p|?掍pFVdqnjѶıeo lcC_4rg6L>D9dd8D+=n\n~p0}O48$(*8Nq`_6NPJm q#}~qVh *b;eC.XfM\F{3NÓvmm6=Njx6[Рyk)̹72&"65:Z%\}0O+cl:·䎤M͹`1# %rZ75 պ#8+w8|Cs#WcʁĂsf4Vo6bSO Z8gDg`1/7ci{Ka(&ZjBQaep6%1ƒ<65uy<}!SͦoWl{Vj;ǖ~_Q~4"w^<,[!RX2kڎ>xDͪagTf{;l?5aK5xN >*ﰡo:n.қ' gfx<˜쌯cL(W ,GJ` c.qNFxOpF}h8qq8zTb_Z7GsxHTlz+tXfK2 Wxs)7;xNVp K-Y<=V(mh|(Yb4ɳ_Z*HqӖzz`._sYQE3e@W_j xǴ1 ʭ1y6JEB_hX[ɳ3DOn5:4ַO ݽgԒ{:_PIЩ/O|&;_ )1FGXK|?kgxȣIa;7X^q_vZյOuo9kPo+9lj3¢xwzN9zlWe_aCG7`;Y‡ֲqGV۹{~(citQ5w5y,xfV&'x]aFbM* `>fMUO7~~/&W Ɲ_Xe>޷ǂpk8l ^Gǚ4|,xX>75Iyx?HxO1xe3x?= ǂ׍5~rYTx,m}ɛ_լɑǂwm #c#wbM qG5iXԬG$h87&`{-gW` <[91mcF;ה 8R;]lBɶN¥yt[$g3͙SaڤcB)1hP52lhp^y[]M[EVjdF1e@$vأS_DG5W`rfz=-GQdǡZLBb[kDЭ It9^ s qZ̘J X- kdM"Z\o.fƨ̱- 6;l4HI$z.++M}bd@uNFeD2@/(cEmD/t2V!5VpʌS w+g}u[\1Xt'-.+Х1~#h9Sy 0z1HtNYL0K9o Wqi]):%bAC =sA|+$Sg|dvO$yv=&56p~((9dK>+63+~K 1扆Z}ke GGQ20 Vߪ !V:FPdnGd",}gk ybi ̲mAS=͊\\1pgzGӱQNB\.́[ 4CxTl4z#7 f/_??ָTTpmZ(,]r˹$'.Qpqpks^_1&;7f%zǥ֣jPJŗ\"GIdDL_r#ߢ/}Q-`(+"JH2Ey!Tbh7ܾ` <~Kso^ZCF|ÎG g#V6}'$yOH &Hh*Mϱqc%fCs5~d4;-1_H} {`b7x`b >sf R3K}1K0e3?u-LO|??`Iv~bOOE HA[XXvW7nt3.7]cwq%֩Os17+_\7pDZh-9D!9yTX<Qf}K}PI ^)٨aN>Σ/=Z\RSđ)a \@Qq:Rf0\, 8_{|^]Yq?Cכr 91>=_>@ICK |U?4IIimh[\5vNh*E@@*(ZڤT^i)5 [w]룂>M[*\թ-yܹs={Z-Ѥm1F,e9Q>vwܦUbHGdݺtژ!wܮ&urjv.|\Oy鿃'x=  ).==]<jpU]R^z~}[;1RGC* ȇ_CQ|u/}u4<]saEoT,mkڝK3& d˶x] :µ#k#V%4zX}1Ѭ6ܬ=>)04nE|9`N2ӯ7di&-_';TO@!xNI0$,LGR+zB5C&S.P{68X&5XGZG U[ڱM(f5hk lBnKʹ>dzKS)s,4(OA4 P8M+eQs jް0>~0 3hό|e@\ծ}zCnd9Af_HQn-0n('vS݌Q롾P_^+2׵~=^S[ՙ^!H?\Ƭ\zVr(f{_2zE8eum: ZͦP`=}k/FE.,m V8K =Drδ u=ubӲ/dk0 ]iD5τd_=}|QS{k"GmF7o7 c8OBH'P]]BVLX2|Z{p*P؀mY>wVS3O_'7>;ya]yenǓ_@ibv!."k{@Y(=_$862PKŒ6~(O4;|jN TAȖʝsܓK>w~-_]8ʌ9#w*jb(77ǝF<"؀WC! aH )Qq5 0uSt $ֶ.Ǹڣm 2؄ mA:U`y"0oxۉN<;A]^m*.~[.G.s8?܁= Z*4`(!VNXӨ[s](7 W3GE^MRא aCTͱ01(A N!BmȍvzPXXO/#Auʣ2;nB9L'HvQ/DAGEo}nr5-+zƇA[}cOL|):9wcl/L s x}l]i؂&2kw}UmtЌg9uےDhyӓt#Lx?o Ӽuj nө^}%jZf \r!F^VT+`+9V/vS.5=螉ޏ hX QL27G|YΈ"uTnL9\ ?)j߳ ZHn.IasE}s)*?>ET*!XS˝roۏz`#׃> F'nsꁥSj`@v\,ԼM4NYD4LG(]ƒAkxa׉>^[ڀhiX|OՉP܆ ߶$#Μ9oA鄘U=#Ql^5N`?*>Ey3f✄8JYMpCM`k_ ^4`v7ir@ц 40Bp]ijMwkK&?Ȝɹ-ʹуV^4)٘zU@uOQ1(4Pz u&hQ@'bFwUS4yA[@hY0ʴg@ٴTZa%xڀ0 mx( VPZ VxLK0Ӎ=y-ʲOKSYOSj +؁iDos1h;\=9<͆ilUX--[?ZsZ~B׶خTvB=Q!RlI6FX0L0~kvő{FJx, wv5m`G~?#D ek>ͺ>%&?ݬx:glqS wQC:&AJf'. 2JMFؤ jy8|k( WKٕ)-cc|D!7otoFr]YާմP)P{@eI, BMㆭ4Wbχaf])<K[%Qz%ýC \$ [y݄LDLl8ǧNf :-Pi`E8 p::p z47 T <>rс;%%U>bEt N%Wk+ fō8\zFt5IaHj^Ւ3cy+_ZV2%BpR C?#F ԳFϞ+M:Vfbӣcكl,.,Nl;9U 2wlgix1k6 oT=_4<5 )[TE0ןߣG Rd6D"Ul('[Qe~9|P7r2Tx 5krEo xWH,4C_9gNj `r0vD)3N0ADFBv!ER4轴VAV^bEi Q8 JKjR}vO 4PV?aU^׉ aF6)ˌЭu]ӇtRlmޥ=# GDPi}Hq̼D;x>(y EJ{L NsljR \WT-jh[i;!.VYB!x}dVeÝ !0$݊z YOM"wӿNk Ni͓Iv-6!޼K>KM) qX_닌?b<%[{Z]񣮯 Hel=-a ;,CsAM/6cwGtd>ž?Bi=hxՋL/ n.?)q[^كh*IR0v&= 3< u"%ȳ5fbоeuLIҔGBG "Gۂ9AnL$jXjY;j 67')bMT͍i,E`Y>R?ۅ]нwI-Klƀ۵Gy:hFo}O8{X-![.2uhDm!t*lYa*=%tx*,rM}#ɧ@AfCQW[fo_#`ɏsNlh/'y\q}ܶ1t~TBbrFY{M\mڑdSύwڡL37g|o>6:=s|ܕV9Ƭr5aҡ^&v.Mn {Ux풓A}_p8_PNwag2PꖲN ζ"yj#9MOn.g ]ow)(2nG`\ e2HoSa0z"?'xoq`dLrǎBTŻhn4*O,>QDETXz(i8WjqXZ1Ĩ'Z`"\`33T"WGec඼s4,;6A{ipޏYSpuȜ'I!! ODluPq3; #ZǯuO }.`vr>%Ʋ!a%8%x%wSCr7V&&1AbM=v|TqR9]rT9-0&7%gRޒ[MaP4@tŐ.OXJ\!SCx)LnY$faraEm輆T5, 4>i0#ha6ң')JtFHabٕ(P+W(j]]VdHb4`u$hhTX.D66 0% bX{ЮH ;?>k0y'm!0\lsEk\NX#\(m#>"|)w`v#rI,]EQ۠5"R]ejzx|4}}ic*v;H9.)dX4ӰƱ: (L3ɖ?:;B5v~>ptgr-Cخn'e>XvTۼ0ZFO6*¸熪5kK6\ mNPbn]sz%wIQ`UTQ]@6ΐuXzWA9  N=FRD+Nd ֚l6}IEErkca[؊_F;Ԉh#ם!5`aͿ~=Lu uX58³y V"f(K]|Mka^8}1\yXV3ߎ P~6nl+6,Kݪ-F}łkn^M[oI}ztPIZ^艷KѽvsW43S\M##ӛM6U[oYj،Qp`/~h)6"Ŏd PXíbmB2O۴;n9 _s:] zh{ED^yJN΂۱ZzMdNπ5ΎZԋp+'*lx{moe?zOo5Şқ d_3/Xo42…dwg4\ЦY`aQK6^ܡ?4jֈʓBb oÈ7!|ldxb+@tDV ePz#+`Ʃi;4 1rlt5l4 : hLS2L[n*7l|1V}>d=AD[я V5 ,ء=-\ƋԌ#V+v< ATBjaZT 7$JVm1EMF#'u ,%]LouL9~KߕPcDKmWlu/Dg;Ngߣ88&? j7Y1Z $7b.L'LwG'x*YJ<^Ps6wKEQ83ڷ /__B)mTQ^ǫéw" QK/Pmr;r10 ;@h@55(FC^2Md~I?;=B*YQdBh~u4"W&wUGIuͶ֟DId (ә )eXS6& nF#PC-t )<:EQeڽg{7X4Go(f¯[愖?fN0[P_ y%8'lpR fA*/g^n_/ĆQ!Tkq|Х-BnRv)u14! =VNnMa%p' fѦ'XIpiltN 80{>*2"8kZN>x z-7OAtvje?@=kuróH ގY ¹,$m8C% ڃj` R{dg,X3(gY}ɨÀAdOpdJ7w.m+V%m=.ftzO.уوqCy}I8X#7"jWn,$Ě0tSc ٜtHY:x}X^F8tZ %d cƨ6Y[Ƴ5ۢE@P_Qx$1^qBF/,s~'vX[G3Z-,FG0M0naGpRfMZ.oh4n7u!T/*ͤy7_VΤ8a [FWGTIY.YhEqeqn\/`35lY3eW5?>'S7's⥷fNu d` KJ|<#>J;IyXK3WlN! 'Coif]_ u@ G,^CyB=[}Z30~K'\f23%c/' @{5/n*"\T(j:61Tb eɳKֆI4mJɀ'Q=ƃٞy(p_#J>%/1دfR2aO\)Fǰoڒ5a݅vi9X d x+em 3^5bRXj˘h׾DxecZi~}2%jJ}oTܷOv >m/UMjʻ/b.~9Wn.ljMzCs쾘wR]/N49Q @= R'xܺėll/r~@(ӻhLCWe rRvqThIe/`\^`3Omos&IxsbMB)"kRwwfwnܟX }S@JRh{]x3At7 5AreSn;'^ŚٮDmrFP$ֵ?qPEO(Sj_"hjX?Բ\[7MF"+"Pf`b3q.4Mҙ#b8#k ǻސt1ce2Fhz![ d:. RXWd F*\>a%sՅS _9U+j=GG*~CГ`G+5>#w/|9 0`Qe{+(iF;VfdV@$5z42j*ks.<.jLKZ"eA<_̼9޾\cm퉫MMXs=٣,YxdhR.ĪP̜͹I z3i4AGo5PМ0-QG2N#}i_ʢ0bw`zմd{f1d<NzB9igRlz؟jd:F_xN75x /OIDjr_΂3kG@D> בdRT۟&umnk_dd aZZ)(W؞ 閨W}>O'0m2XIKl2M TZ2%@?&=wB%9PZ:Ѡ:=?S̨Z<\mSF4PVӯmL툮c &ՃfzOWZ Ƽ? b9D4Wm YhO\l9I#7 祪Cd2+WLBc(|e;tۏ0[S|!& h *'H;p1ۣq bᾟ^ARFdI}]d4Ӌ*ªc M_B OO xϐ,']Ζenl}3E.,޿a/P T4*X9t?rY%XKKy>JXYMu.Rrb'ተ.o#؍!`a(Ԟ Mv27*2;jȷ]Pn`^%b~2;@|ih Yϴ~sSAZSP@ :ܣ~ Z:;@͒G6IcmkW^ ն;1>ncHc᧻&ڻá2x42W]wоBvLAQ\kݿph^FS[ҏ0j_H_UWqU~:C汬w0|5,GU KϤNb&*PE'Jk )j koL4I(!XqMі`b33CcDJ7j7VpjnԺE}r!-w\Ю,#u b>?yx ;"JD'Az:".YPh,Jhph!N,m2I7~[L#Yƕin$B?cp}|fye`nt!"-A^gS}J9BnKFޖel]A ccxxu~/DˊerP-HQǂ߯Xz$Aw' Bj`9׉ӁΚc:}ˈI6Dƺs:}"Yǯcfu%$I"a.՟"ce PQrp:5o4Za uB,JXh4K"L*J[GƗI1ld*x2 sFIb^Yp2i3C6%x= kΟY5ų}lfM"2J,`sHVn  Zk{ {\F~ZILjJ)UUlEGv %+0"5ab.ۄZBc̮}usmK/vxSaArM,8ə4%rg" d N2v*U":l,avrhXo)vQ!?r#ا#xevަ<== H.9Cpkmay=HՓ];U2u8,o\Ⱥs\(QoͬIcUkH$;H&dI YU:>me߉lT @U׳-J(1yko^ %@TD/݀3D=yK¢3\ o-B"z>!<H z"l6\ cp[R$4JA ͦm3^%Tc^vȚKBUvl.3'@_[߂? u/o[7FZ 3p:2&O_1?sKLLA=2`@U-$,ܭªIbuhG|^XRhCz z' LPdm{T h*OTC!kd-a P LPo/CԯǾ ߏM4yYp;(jzE'2'Ɉ'oL8 } *}UlMN;,5Ry'yx"k){SdG@aa7h3 zNmWn9At R6D[5YGo0(pW`Dz-Oq4=^(y~^(q!JAO4v v% `k@y G@! "%_VbJW NL[OWap UkTg5UwA5|}.O=k)*'lYB,h[)QA Ttzjƕ*Xk^^o>Jx*E^5ƨHIZYENQZ{:Ʀq WP箥^] 8!5ۡITDpKG83ZNHSOA(h=p 6甆5Ljws [DS??2-uÑKRadE u߅jZX4I{EmpVIvo]ĬLd,B5ɪqJ\ds8y&,Vet{`bV8?ͥcJQJYF .3-%._)64Xlv+.uBG84lDoucx /~ա+ȁӭ|l{;I KXO.LKBZ\~tgV"{8fVu.8cl X z!Er)T*k$c[Лfve[-v<bCV.0bq̜+*PI~?GskZ"WS2!FR`&ZC[Y QHq'.gW Ivh. ktHi38hNI~vgW X`%_"ј(m~Wu}VmWBO'\mGz72QE]oڧ 5mE{>NF.oJh<.wd:M;QRķ0%~;RUwAz_6c٢qvYj-Oo@[k^yٿroN2V_ۮFّQ"-= =L`낸ph8i2 > rDu'nD, 84@J#UTZpZA'~(m}W~ę wRxtid3 5XY~GvM-v{}lgpXl^l.h. j4ÄUهrq;Q7V~,fd 'ɲ+h[ *Du3px3dRWv6GlPSpr~#FXECg[ fz G/ ٪*\bEO"oE۪)i9;qt1r@{/G#$fSFI hu% ţ̼q-c'Z&E[Üq2u<~ASu Ugy:V}M2!`s<`9֧!bo8["goW3\VP3'TCX=-G<}{5}dJMk{-0E!m HNK*/ШN)GmP OlD VɈGe6As=,v*&b ^h}{YkJbhx`79?K>99urydªH^0h "$>q3 |֬Odt%,S 'Ćq2 ]ŤCa3_)W^u:ہsy_5R>K6Y2ԣdT(˱$$Š|Ca ϶]y'C8$嗈36A~Oyl+ݢvcƴ-}SW309đ@ đe_#,\{d>XzA OQsn18봊:#$7ZSaoSKx$;h{SݦK- pml-upN X>@8Vvo+>q@8HT,e6N,煣y6 Ju;{l\d{[Bo23/z5AZ@S{ϣi>y;`-*A3d-6/W) ۅsc\~ufq7:n[>G%dWrw^Qv4ȾO<>][ǣ 77\-k ^x9M퓙Y:?;h$:Qfh)[A) 'X#B;T~/# =ʄmD *[P+4Z4{$K!/D}-t2ȡm;ϑ "@^ /I@t v4< 6"duj ?% +Ƙч"d3 V{OʘjZG[rP9YG\ Uմ|J_`*3I|ٚ*rX=NYc 2!㏧\9\&_g{W'tm5YDT:(/Y mPujdomAPL$^)VՔ4 t+߉V'V͞xa{Pa1ٕc΁6ߕM'}"`&֔Pt)T ӜŖebW#cz9͕iL,]|qOx(Z1ňSɟtqf2so+(} H}t@mܜ?#O"2P:4j{3t\`}GhEiP@EOgӹ ]+)xvg +L)Dӎvז+N`T7|GyOd 5qZS'<㫆z`R-P.5p#n EmAz~`4- (} TʺPCZ=?OSzj[% .>MA5$$A3׳6 8xn&cM24_5:RbECe&cHų9x9. e_i+¥`k/R>4Lyy/:.#UP@ě?&g57-W9>⯺TjXǦ ʓ NgaHmRj+Vq};cJlmu70}` ,: %9C~߀񼍜Ŕ=<)W} -Z(+(M]_b걞1by(.PMש{>೻ * >+vDs{բHFt;nU#ȼuWv2Fp`ݒ3fTIh?G. 8dktS(ށ%S7w@[1:5qB( D^|S4 bαvcĢf[a٧#WUE*(}߬ i~mZ6n%KkS,к /MbP3gRFs@MF{5 a cB-HGw"3>ہO`UGl;Lݎ)؍i}PPʐ vhtf˷gK@]b'B0a>]a_. Vo˂R\eY c7K,dUޛmj~GT8C}V!ʓ}_&UIM P[2Ŧ$ۯL[¨{5&tVu|h8=e;a0[q4~=BIeYu ۥJmO*?>O $ $ 8kR|s9=!"pRʵaE о`/ 7 [Gn!\F;;YR}mÛ#љQ*1 [ jj8b='"7CM9=)fhMCMnZ%زרe)ZXԮ*56B MR.՛tӥgl(?r5iӮ U{8-`%lñcĊwݔ,$t#`э.8(_>XەOH7W@/Q, hdSGWWҵS2rtr,\!&{I#9Tks +lXmkA67ZK/^ma)|Bm ARyއRjAt_0Οm+L]5Ŋu. 3GQmr `+b+IDӢ0=+LbHO1pJHS0'Xn:7(2+OD\ ]S1ܐ@[/]xl1y 1'ga3E)@AfNXqBX)&)0ڤۯ=%r)#Y:0l^ʗCXM"K' ]\QW vڶ(ZTP;Sq2_P.tC!f,wBq9#5?48Cv6 g=}/U zu탫xVmUB׶G8 Ŕ1VJ^2|Z;{b_Za[ ]FRC:2Ш=o.W (zy[5ҤPW=22 v  MZ6Na{128gDZ0 /ߚ+leA{f i4tj'jz*b=ޕ|AuOv ƔסeIPP~OTP# n?=E{ kkP7Z9KR(d 傠?ȇ#z!sŚ\0 bzsI(kK-.@B:,ƨRiʏX\AlK hœatJ,\Ɔ2)>55$uOܗ2)ygl@&}+ke7T}d4Sɳ= *~ށI HqF|mƤóPr^ y =ӊS9l$%9X[`k:M 9HEU K' X1AKXmQ;@O4:2U@;ٹzJ6lR Z 5hu՚bSjҔ=.)LƦta$Do!Ɋ9eΊ7B 'fG+BFNi3SRᶞǎVj֔=}9StQ>NSMq+udG_@D,2|Y Y,EЎ\*u(Og>u-oPb'sLRk"yE.ԩN[ @|*SH5xS@5AΛ2`HDY O<»+bl ުË!UcuE Nl/\52R0:ËF  -}F֎yffS3m/M[ (p5zT?-ځf\[V; BH%&ՠ̷kzjHy$Tl:^%l?`0d-Hu̶:̏X!!qKjѹR}R[bcNVj(O+X9LjJM}yZ9]d  eZyBGg*.zAzAZABq:8,;ʳ%RG{q*tXv*sT~3!u[Hs)Շ$=] L)1P5Hn/ )b]$ p#tzDG qtBخ-Q>"Qc`+4x:P >9"RTQu4½M˿c4mU9dgHX@llv9S6Ʌ xvvTy/CA9&51JQ&"<6N 07yd;6BB,h!hě؈j(j0 37a ;`'tۋNE 0 wRFPB| :Tޱ-0B`g8_DO.!mfVP.x)"\ܔ :u ȾQ DPϣ)\3u-OF4y e=n4FIl<މyAbʊ 8$k[~z~ĮwoҶ;A!]q:;ExZvXcj}3EÎCac̀ڝ㊃zGBlІuEbaX5!P_*|` r0-3k5 UAP(4 EgϘW--q<([02*uOٝ 2Sexxm+^k McbcE;zy^=a 6c0*2]^%:ꔡ{R_ ff/ȱ1⨾ѐ y\if=x}GK{;X#QJăR}y1nȓ--@E'[z!3J?{D ~4v B/=]ͧT޸r [pW+ZZ{| _$➻ly ^ey%<έjf=3ƒ;i}M/K/{o4/OO_6֧UUUxjJGQ04c,=` Uy}h\~Zi ;XKAy~ς:mp y#g< 3m&DiFQ K7=M`}dP| WE7~s~e /LF(/ N-#@ꅕRa\M/M8?R|ϴcO\ x#^EWhdhȪtxֶg4PU\z ty3>zw`)mE3FYwdհZϛ[Z)jWp_F[NB)?YӕY((@?֫>$V/ZJgY8?%-i[.U~u-̥gY,? R"??{l?:j-Ԣ&}t2ps~?I9os'~P:=0o;#s3<](T.ȶ}I6Plp Tv+/QUP5Og*jΰ4L)uڵ_&옑%x hJ :%7N䬒2˂nHREeh7n|.[-Zkd(X췧Tl{Vl+n؊8QZD1qQy<}~@We $|d%8{jZ4{V!w+3nah7b4_O|\O3}U>JvMd|$ ihv1T+=C|zB3HzPZ z(g;.Q|c:U|gLJ eTA-4K>*.>2˷WLktD/2sƶ .mW(r}PĖ XzII>߃ɛO|]a_zaW +V[8 үRlxҷl8| m{כ$~rو_UG%_T]$ӊLBN#iKf[QQ*׈Xjѣ's.WzS~O  >e"kR}' dC(dLl$o#H 0K#.7XS\Ouhd;aUGy+I_&O˫˩w`}tng2 TTE J*Ja;+(~^. bܦfQِ oK{O0ĽS.ܕɭib[BmG,AEϒ.poC5>9u k@Z уF+T XkBa+hZYP^ZL.;8/pH; }dK0T0|n-x 9( '\r',C`ܿDϼd&"|#ίq\ckbZ,2*EK).M[7( ďkɁ$ <|_=wxbVY!3B߂]* #}{b}d B[@Z /bz!sxY 3Aak哈:Ƞ y AПt:aq [t%&>xImi2c'X0n;r /A4XVUT+pp]GZ @F\B}FJ/F ZyH0DT#IX| ѣU,tZסjHI r g}jz|H )O>5d2a i/ Dx멖u|O9zw\{7~N|;2POi(OeoMqOo.SC1ň_=j 8+ $]Ks%g/Ͻ'AE ˖7'n<~5V[cnJ+__N2|W\9(^'\fM33ʄ|ٗ;T Ų % `S9y)5ܤ& ~I ס7݉UW`]\^1eZQ7 JAWe-f;K#簂)W:;KA7 Vˈ-d;x'e%6r`h+NnY9Ar2XOuQ^r g3 -仍s"- n>\e&%a>\vYP&p##>P<:^`ld߻z5|9ű^q(aa׬}fZA~+va cj!nRݴ~|4=g;!6ifz }R"MKS蘾{[)F@JmM ;~=żgP.8=M74Yo鼍P6}E1a$w5Vc@>HbnZb^r&q*%?ZVQg -W0a)v3GjrjB_V O!|Ņ w- 7δzV 0q})>ώ!YKVWRԇ*]'g\xL`]؂PԸa8;Kۉw6~IV`fF4[4 j4m܅tL{`x^ϑ~HlwȖ--{$LDJ7o U8~XdBbb K 5ivՖz.!so*Nܽ6u+ .-Kof۹ѶQG\Yk47hjKYHԉAq%K9_-::C3Dby/l!c1B|"<"|MgNۄƗ bN?яtbT o"Ms9co71,P#P -X9DS47,AΊ85r"/,1ve~jɑpFn7$0Vw pGQc 4hTyTPZϏYRz<: })^mZJ3=ڎZՊǞ6C/jkODO-,C>_1EiF4 sH(1ֆGX]]nE>}4݊ E_~uu390{:cbi&+v.ڪ{iS)x/#*=bbΞ;]>+Ffn_`Pd*g|KCZV iN^bnX{[8̛P5DYsZuGf$9 ZZEUikPplwӡUf ǵS燼g)/h"\FwIC S^]FCBXv(WrIK_\x9p !\)yE4R=bT}w_ZHzw n0ܰp <^&{ƝI8XɟRN9ZO"Kjeʷ?*QϹTq|tFrnϾK")oSJD][(|X7Q`TYZURy^ ۮ49g::VO M;:pg⠠-]?oX4\ E2lzΐQ_,\upְBkȍ1$'hɈk'wnO98C}xc@IZV^\oͫoTbY|؎8#YX8ׂe;lkQdrXPڬkGHv6?ߵ4WΈOpG Ɏ}kW$J_iXRuoU K˰Ii"QuKU p;Int1pf~=Ch(!.I[6#=(o\R5AtPi:o4}f8^ Ih ͯ->'¢ͬ`h |cЕuW-@<iŠfEXLx;H'j^Œz~:ȋD;Kr C0u#r.}Irp1">[gG{ѭz)+&84?@Αbz b%#w1%ѻ☭e(ALpu[pCVn:m)-mUGSDzʴӅ-ES{/Ɋ3>F#e2?<|4,. sBPjhx'|Nhj>+뭆4Kh'lyů p%F4:[LC(b o}^E\|8l艠iAIYq)+W%I+i1`i[R=UOipF@N{iԊp"/®s3Lb %XL P0Nܶ5jvK]"+%Ϯ( BID'yβĊwi6)=9?}4u)Ef:am oO$ :TwL"$ K~7*}Wb}%]+!#*ʀppȈ7mdشK44W>!U=!,}#u q(32r2/e;%d*eu$D!qd/2{"KJ)/XT2r.ۤI5O:Z!|Hs9FEy">):z4/բ'MOIĈ@BV6eiT͸fE&9I;еa`f`HlN<~%.L^`kU9,X9Lc1sRK~4A>xkj>~ϥw6 }ܠG|G[I:z'qƀtIXݩG (4Tm3B8|ځbteۃ^0oŎ#{ G lp ٠0)p -,U%p ]Ry9\c<_0\{38yH2!bVOcp/- |ú]= ɻ&3et3o qvp:X]i$\@`(J>V!0pC epĶ|PqO9qP%8Ùֲ4ޟvonw_:b]ؠtc  cp6Q#niA(O7hq@lUgYNpSqz4&GƤh^ >bk|fc!FۧZ\XH7Aj8cw9avHfq ge:)gsU@\WYS Χ|Esxwzڛ·;l:%ͨTՑMe HsufT~G>]ˏ[/)$_ =P.d7d bDqvtK-Ux3te0w=- K\ LJڱ{ O).O `7 xV?ÓMdz4.אU-t.:W[w֔qO"[:`؀3b.iUݓm6$)eJ岚sst;uZ<`Ozbt{t56.#py=6(|7M pZsE#kjlJde8ȧ4ӴюٳG܁ۙ3,CFi@9@pb"ί&Ck` ,kp ڞߖ y8$wCk$O_hxPysbKL@|H6 u}o_F0-y2_ʳp9b\γq9pC{lYKCV ~n^Rk]ɻɶb7NO{I0;1g0m8(,pa:l #}jA:zP_* ًSѕɛdڃ _jjIƟGXIVJ0,ܱc.O.qZ&1p+nuymH,ƦD[5AH/BBPi/r^O7ts΃kGۘQR=>-G%w 0<,0?mzƖgEp-s; {GΚԬ{Ek%\3(dCɸr v5~4j]Y[`:r:^1WuHr9GS%X1UH.Z]Qq3 s0 ,~ѫAެAXF[6̈8)CtB-zSU#cae@ 3-.{iqvFͬCO|ce=o[.  |y~ҌPA47݂-]`aQfa|9/ eP`bRexK~ ~DJA%sfsJZa|JeL-d \Pg0!ۀ`DWm̼")Htsx(]v+Mi 3yH(Zi|ϞAFoM]J#-(WR 3jo釚3լ_9pj[zJf_ة__H5Bi uI5ܔv|i|u|.\ IDrYDO*р?0ؓ?&J)#oG׽Lx1{?{"#W7=4bàTN.=[kj9#5kB@oބD_N'p&mV-Tff$%!{/a2|hfD12zYX{=jZ@]1>wa0#0:&d+fv26]s候lQ ۅf}7b&Z;̗U2 1aS(O1)/`{s={>3agM7r|;2'TOnM M .B= "|r"}af:{]d=0 ] c<n׉Rlȴ) |bX,nB[]b;I$Jn[# u8x#lGI ZOWG5uSv#yߎKGkD̿q<%{\\Xf܍+t }'[hO> =v//Ҁ R2L`R0g0L;c}ϲle {G s&} 64i;l ˵ @Ay6T1Zageg[\e_C%D] MDQ@{lx *l2c7qo&VrVtxj(s(󈷮ܦg=nRufUo^))}m, z!qJMpv%OL\ȞX?{Ӻ|1EEb}YTT֚сĝU265DLu-B5ϩQ1g]^#lliJz f.Eu(>վ<t'y?"Ԛ]P; P4_H*<3 7; *w8uGSST t ó,?ʳ<.)>;;d}kJ3Ԓo $ rHf_mK0Z=(ȅhTLG'~b4$ÇvɧC2ɇ1`>݅Z}♀o hmVWi[gx&_h[2jo ȅ0kiK`K=>C!yL4>QdL D&dfbT;(r;-ߓs&I@窞0?#خk驭i 9j2k35]9EBt@Fl^lՎ ?? OY?XPMdhY6!Q'cez(#>7RhB>(30yOOd!h .`LEcmׄ?iX?pMIQGPvß6j05|)Dۧ~i,r.UqmQ[׶aFu}ev>ۭ~x<> ':Xy![}:/^żb~O+_h?2踴k>8iho>oA/ʩ, ҥ,|9ܠV56^ %:ҬL%,gb;` rYQ;bf@G#uw jBZg`v u2|lJw"nb qUXZ=Y +9IXo!#GL(x1D2b/,xE_qw4CHO`XݔvJS(?< =1`:/t 2OA:zZDEy~]k1D|)LIt9ދ5.hS>2iY4XH.ҕj@,eZ3VᷞQ1v-3mr VB*/[vgEa"!Z{Y-.ýk3KK~ғGXǸ(;)./-q_`v#ذs%)S dS:RٔmWIlcNn"G7wWe0fM,ѵR).ûth!)Ÿv6藸Bl赝~6]pjw]Œ1;aY>f2 77y\=*UV'N0ӣy{^ӱཿ{y=཭޳Y4?^cLƤp _t;,m]CS`m1Il(PRB)RO$,jQD HlAnMO#UrcTA# ¡J\,K faJEH/B2{_&iل7VPS ˝iMS%\}̹e6rM s3?ܝ-Μ{)>t % ~dSlSx>Rn)c7ɵ8 P6GjP6GP6Oes!eRU f f-hw5H]ÉCk"w!35!.@[6g iO<>&mٶT7p T M.Vn j!p3C(\D)]3^s͡]K*适ܔHʜ J@kaDGܯ*:{)92FZdWUrh~i4%xc<٠8~g˃٦?T6}EڥFE4.+:nBw)ڮ#]YNj {lBSow?Oe.!0IDdbFWkER-GlMq!+w$`AJb#VBlk{ԚY>n߷1W&2zo3w/1ӈ'pW<Ʌ}P*Ӡ|̻|OpQO^ /'"h6_P< gDk|UuTga``0Ga'oⓋy'snw0\6HW#<(&g(߃l{472w ]Qۧ38k5uZ#*e<Lj"@num^ YTyGGC4Z젰MO8%^3p'Lp͋@!~WEyeՙf7f(/VM6f,0L,ɚ] ./kr?]0Kd/6I퇞,(2T~H\%z+d~_>S},:&+P{Ewop֍څS~vJ98>RR-{NýxXJa{>S[d[ F#K~ Ƕ c2._m΅>.`PYmyjKY~)}eJB=0ZzSkTOֳ\#/_ػn;#7 S_]vO-М̔>;3Fnu7 ˨heWm{~w>6EN:^x92 .??Sha[jT!Ey.e$cc(0ͪu&; xB/ZkQi%f:NokW"aEPAvDw#٥c=O.PFVRX㑅@B- b6s.r.جqfAcS㸠 /ֹ! zsžqONsr0->.ġ&6i"6Xe v!&H㣞TAY˧\6X봺͋axF(;DF(2=c4mS>6rSq>(#~ ^Ey{t!򃏅{kgo`2x6A Xԋ ؠeQwa0(C&.xso5^yh4{$Ʉ^T&XcKͻdgn6K~\H6xU~p_ͣ=u_+',`- ({="VKHG#U#̛d\?O߂E|s)ac(o}- OF/kEz\- I=pZcՋzJ%TS9fZ}V7W3&ޥ?ݸx["LtK` I>y"lNsn#B Ie~y/\ْMNbzULI u/U /"+49lyon>ؓ7'jP\Wd]l*dlt2]gkI ,˾ ?)eyWY0 Ŵާ '鼤|D ;yq":'KCPimߧҰm ͜xTitJE*NwzkN٣/J$zr s~6”pk`0}7 3xN_%_U& 1/@ø !E3?$)CpiTdv܂mQR1xOfhMEbU8090A겷U}@`x1T*ںT[G6^+tm; X++P.Tj{scK7Wh3O*AUT]xG3mQ]| +p[oobf9QV]Vc r9Tu{ܸ?'=Y+װ޺@sn-i$X FC=>='?Bfh~rirOctk7qlA""zg5,P/ o1Nr+(JYP,<*m-/;iT2BFU9q+L.9@}!!_:.clעTY R>chU~Yt h-^LegK'< nCY4m-]rX5=Gߧn,3?&Io]LIMh/<٦4 g{&Q#f?4_6GKDLbyNsW(-NegJH@%5(/hETK7E@R:y)֧|[yl<(h\e8(7B-*IV1YXu1c 6 b Sc)6Pm̫jm;p~iG]8pTmNllz\)$ۢ^PvzsyU)ڷa 2X,RrKXGR,y2P9urrtQͷUĺ G&+h p`(GKK&9Ǯ a74M憿ښmkEVV`kΈgm)7:aAcA $c -+Iͯ_7[kT?ٻ͗ǵjIo󮥱6GLm}y֮S[o('!w[&ߥ鑄+a:Nrh#Ykķ<h#zEU^ CAOa>cRJq# ܗ1@FT(bRp^hsD[yP^Awkyh$~0#7=10t$fg`Z$Ŵo AY|f`Gџre(7@Yܺ] AHWWO+oNԽ`Qz]-phy$ͪVqͫiw%6DGuü%tMv+SPn=H_: ]-\bz '&d܃E08݀[LۡuS5jwD9DEekZ+Ee )5<*{wQJW,^Bȓi7#[1!Su52ZTԬBb>j2]1R`,d_O'ă.GUc@^XP D:C&%zxkr >SƀM3#~qHM4'Bju"g!G qE3YO/ && ]*V"Pkʥ#$3CJ|\@Ǖ981+׏5YӏZ5萦y^1oX9J-l}|یA޼_/m[y6/xI%WáXΜt++M7aP.%(e)7*(QVƉ e6*2 :`wZp)ePk}q ߡ5gvKksM]Zs,5? R)aNxqVwT冟 +h\lJ}gt}-ffq)T7J>̈́F1}|& / .tm}CN@ ;A{r܊r(W-[ ɵw0pQQ~e-k[jH)|G8K͑"{q Oq`PRJ̴} !\)ZjQޟW&?&vi q-U_fL {U&j1oĂTץC).6Efۅ:jl~?H%L&~L1L(2g M3G󙃰>CP,M $)MUTi5Xp۾jd ?>q(gDarM[a2-yAMoiO3<0O<щ2DPMM`U|SʲH/k@d"FFug]Ctu6ϺU4f]>ig`)ӰJ1XksT7O8$lwKcOI3Ɯ1lBr )0yo!; Q3} =ګlfuG[TB*a.4#AޢPC~ gRU\cӍZÂs\&. ycUEC4gr̭S@ׇ>2ǚs?]Z)>o܏B:y*JE#P!3 'eby{l{ĊK@v[ФG"-E׷,/ LGuY!F*{4C3lD6 $lڰ-{~x QHA^ũȖ7j)۶"wJM{nr 87M戋 (P[H{rri`@2k:#T2~]sRfq'% E3MFi_:y^`tR&yBF :*~[{%~NG%oGƔk,r/Ml`PBE;hi>:TwvuCIGQUUds4e>g9Yj2s4g-D& ӝf]h@S( ѦїbIeZ'E֕&:{f7{x.&f=u+z_:&TD. KXQW}9V@pfi8LrIE[/8j?I_>Խ: 6\ #o`,;֯\,cNfR&;mڗ6*aM4IfEH.SڜS) F|r3t'43t3ωN#8h`"!I;9 xϵ7p JVU]_LȥP[}Vl~S\(i2pԒϒ'ɀ8Nck>%G6;#AHcme3}i؀}LSwZM(7X!]A FɔF;l _[:WSYak2ƣ1Vbi0*Wl*ŝQ(IlM dmgv8MZ(Bk܇{^ FzCת|2, eԮw'Y_UAٯ!.-G|#-1&ѼĠh <}%7VϠp&&[z)I Zuu9J|a)Yh֪;%kO 8p4D kLЖ|=zІ@:(~64bsԁ:2ݢ(* >qżkst.Q;)̚A`T0EJ`pV3m`i98gy`TPo+b U8NeØqW #o]f-G *]őW)'EE/5@/kx@bA i5$A"Njn^[ `I[ /wJثgn i4i)=}L v&$:WINTGq^ќ ð04'/Y| e0䪏+  !{]zBʯEnC/b98W;C/p7˙{T$U!p#n/Ztrȸ{gh]FL h&5[k-]F# yunPvIDp+:겸lE %kssj5KܶcEx ÷ mόDrl&@BNYc}s M L㶦aaµa)Ip' CI#su-I[k(''B淟!ť]M&Qf΢Zb2&.UM;Q"މzTѮΒ ˕ha\ܯI uŲ!ƐGq3fw hX$—sxk,&gČct;1jӛk jNbڥ-;ß n:iFɻ*4kxgFeϥ_7Cl#4S:Y*zPW$q樚vYAEַ[v I sd&VsH42?XDGH-:2z10b@#ϓҘ@y~Pd>?/ʮfp^S5:OulCzd(Rc-*\Hm@&(g|b Sl~ݙtMJaM{PI \_DfDQ $&vHf$'CKgp. 6$%]쓆i{J(5 {(6>I'Z߹6 S@αzox3]Bu11h݈袣KA['xH.8L*^ooɢ^m<,ob>K\7$F`ҁP%n&8)1mzkn{4e"Vg }EϠphl.EIOD}GtMhCۄ$r]M{[pMP, ՚1G x!_Kv/ZO1 \+=1jp_[8;L.SnKVY&4qI!V"?Kmݪ-dld c|:[͓s&fsnXL3%~Vr!XDr5=G;ẁqV…}ȿ4m 1?4E߱y$kZZ}qh4EnC棫hۦ-ʇ ̇ny0-SO_$T\Ӣ_0,ѓ'lVmR!f,JX%+mԶZTw5zcm+yzNw-_BzXu+ nnbuw;X;jn~DBڻ`94CJ]$n/&_+g,@Ģni4{}C_قy{մ:l ]MI2L0<՟Voi(ཁ U:/g6#ޜoo.oNy4[>Y?wKwt@w]+{ ޥ}ұycgm&ft-prkX hނMזX`g7"v9uH$f^Ve2X.%ŇxXUs<iipmvifﳱ؁w}OZ z[8CMPm*xKQmg)T`kKyTQ{wR%8ܴ6?'Xְ\ W@tӯ9Lh ûT|nz,{[sbי=blNّF?4;d>$Y˺G3^77$.)wqXd[W$ƾ$;y_lCa;VIC:ueg^&ٕ"KLly'3N=h4-my wMKpD.=1`]+9jZ8NK#0G`Ydn:ykKU`>5-OFA]JUۙo+uY~sXDPV|я-=m̻$AȼN:}Q MU<)<? T;W K.3ޓUds:4Ô󾱜Z6֙rԷX"+'aÄG:3ubug=z׫tcg1X,K+ݧhcyD\A7ͫ˹S'~1.i_Riqx{KRC^Ko"^_*ZZWj/RTj/^j^\y-~K&ƕzZ_э=CK} |SEx$m"(JEm H/MR@!"*-kc]W]U层-ն_*(:1"E<3&7}~'̝;̙39{it|^oPn[Ee-W}//zuE]סuSxZtnu{iz]{^GS?k{]^ Z]qUx ^iB^W^迋zMfjz 罖{^^^z PHzQ .. sJ)fd,gN {  Opa>~ǀKUwPϦ[yI!+G֕mZ[dxDjQjϮ|zC][0n֡o;7egCfQ7؃xxԁO'y#5-?po?M[y#5/R}+m3+yCmZy]⭯N}Cɦ9uۉ[?[`x+ _-?p u؏gs}Bg0 :I~xW$k }:i Ks-ɧK-1cW$,SGlgm]z[777*䞠I!qpb+>LSU˅ѵkAy~Q!Dz3!nH3n 10WŢ8KR+#QnəB_G/}@d^t`|5?6a347=6=$G%b6؈٧_A̓5A3h]}#G h%,Eb9!C|tTSײ/T>6L&f+ݏО9jn RNZ+|'27ϙ9^g*fgx剪\Iܢ(HBD S'* Sl,6-“3X'7~ct=?hp)^X?ɩJ MaJ]P0fBk7?C.)mB$\VӇϽ?Z "ȧPYJNRoT4WKBF4 BMrqDC4܇=w :/wtxǙppj! u3^iVi ] P1nyuU`3()X׷Y:K"t9:C>Ȫ 7zW}1CbŢXn,?ß(+c/ 8SU~blzDZEM4hAj|TȻ3x&Q fjuo RSR܈f${ $F&Ş4d*1})dP*UtvVԹZ"upP&;gy^ 7AiyL'XP63&\o(J-r~Jcd{Fsy @.7VVQbyH .DS4|u~[&'blsi3' hč;[EC אbpQ!0qh>x4Q@dWm'w@X%0*4 V6.•M UqpdIuXr> ՝~>G9Aˍ\X"HligC;,-x(y)K?]Yb\5sll6xYٟy Ѥ2T$3ghILC]h p~gE_1A[Nϖ `H أ+XBrPUdu;i4#;&m%B@.`` h& vצ];FI$6aƑPWr SBa4"JRT8;(SNcބ$fVȔ`So$k(wxɥ䩞![wovOm 15Q{GLQe YW^r2mD9xŒ*R> #Sd([̓Q4y#pnW3#?08.G`1#EsDGCsv-[YRk[)Ÿj@O%/ 5V蠡`Qj/ql*"B_v/֬NRO*7zKZrmH}x-fx^޺ࡾ`USt`M_Q (HpJ_Q~{ĖYDZ0xEXPj;Υf汝Q*<ӧtzx#tI佝_όɾu}BZ~ 2]-$t,K*GYnͽs۟pmR襹x*tLjZwsY6i&֥eQ]kAZq Xc}2&R'wpjԾj}SS 6'ivA bwte>BIJl@IbOgqˁْ.e&y>ȓ ˤ7|&DAś+_ kD]Y?z;ya t͊ ~o>Hv ҋvDgf䛿m*^NȂY6\uzy*:k\uU1g~J#&W}Ƚ5Jpb|)BE6lU R[H%Rcdn:sxpX[*e"%jP7T^lZ v@ kn4bnp)p 8=c^H AN6f9 N7c^J] e^ͨ=Q)l TI&9U.2ŀxqn ]kRr;+K} ߰>e }S,;) }BDaja&F}217eFh!hpw|*b٦'7窎ב-ዖDaLI)]uv>9}t3srҔ )] ;}I\]!ba郇>lSlxԣ^&?KS+ tvyz;?Nwr{ɢFaǙh@g:b_T ny^pA9pʁҗxgJ}2os(Ͳ´k 3b.j+ga. |g9^+'T6Puռr9p ۟4͊Z\LORJIպ~?ʀ$Dz  '﨟/Iq~B'8?8[E6j?9;EU 6IdK(xvL7[in OM5vbk?V2ڞnaiM4tc/kx=hU^ڻ#mͨȥ%V "ݚHiUdT%L;c+k*he;MưMNj?*_w/i%eGJ+qvZ vr[xJoà5C4r?GvHKx>jӝqd'cNaO^x R';&i'BofcÿDHa21<5'?"YJa8qh_f$ | lM5iɉ4RR:;du8W 􃶒MDhG̝ Zdđm܈vVSc94o#ϒtU#0AubZ9y-QA dV#Vd;XM J-:d[9azhdgy~j򗵨ߝT܇0c*QoE!b %zfcPw({7pjNqOK2e63[}@43OME;Z07=JCS@ÍGO;Yĉ -&O(F f=!=LvQL'0. &4۽ăfkXzj:UU ӟn%&a= ۿ1pSqhƒ[$mі;iC16XpByP.r!g@sP5kjQiDy<"]դS7c2G.ί:9Z}9 Cc.))U]ЂQ6 ~#+MNKL ,y/_b21crAey<ܧ9)Gnȋ3[bwcmbGrcE:=d#5 _+*d_r$iA1~kNY rxg"_"faBiD5gE˖G ]kd8c)^tA@73`,1@>s>}T؛oE·!q+q^x/}R8 BSߦ&z!G KݐC<] dGdrCPa&+ R5R'*t834v.tvh)aJcƍ,nC> /jHtRda>6oXC;ʼP1ѽs BظԀ:9+|?>Y_vpro zsΛX+` Rd4iU@ 6QEA1(Ůq]uխJGnRmRmR Z9[s?kcx`ۅgD79glXVT99FR_soQ8tm`'r~%GeM4V PT\#M2ؔ8XbfzcHmҒ:H:$F7w AzǦ&)s$2L#@4om7Pð4~)u k\G8*6KCߢd%Tq!** rLEh?@y2[M箟wJ[)DF<ƴGk=Zh] 3um:c !]^y_~ |.AL `ų>նX.Ho.A0?>f}Kݫwɍ>1۪#}Mn'(]˃w1jj 看`8A>'|1[ Fؖ?Ը 9D~G 0>oxf f\=pg/$$@9V 6S;tS6b)_=}K~b8/Cl<^½r䕮v.%1qN0rBW0vR&3T)7An 0 ;hi#3GitpUp4vqX`Y{(r(oe5XXG "TXᵏXGt2nTvc^Y)DCݷyj+ 3%_^q\iQ/QFO;椨|q,,[C^y2m 9@NN{|3Q?Jw7| ,p~b5pZRRӀD.8u nVD/nbpgSBt֚ȥ?:JF믤R\)t-X#oyj -\v ~ܛȉG ؖz|dr]nkPBFΰ>a7W` /~YEJ+ 0T] %a>ǟxNT# ׆=Nf'{H}lX݃[lʖ5%pb1b~]Obe \#eӿe׹D%8Bֽi8 *=q ,Q'OL(zk0tvъsJt@fE"# g3&֔50WV8gK d8W 3Ǧsl*B +WL.+wy(jP:ɮL?ALwYp)m ^~7Y~٩:VU7tRbAI8[VӇ IZHrDt [$"Q)h<@;Ӑ{PR9>>_SrQ>y73<ɔmMɔ90܏3o'`ϭ3%d&20 !'܃!S|U`ݞxgk~jtή!&YU" nIXA 9W]mʞzkΊ &jRkd Vl9^pj6^]cbږdqzpl~V) C-D(DFWf a]@`rYriTrN+8?nw^0AwzUX`<SPV|>|m(M(J!SSOꍉ|y o_QğyZj>} N#Ug[&DO?Ń֦֤f5$xı?Ë~Me5ЯxaOTIu Z5ti[rۼ|K PJG#DmUvTW;d6liq^hiaEX%lc`@'Ip zڪAs**F_wtt%9 fxZbI,+/ǜ_,ⅿc;CUpmdOf*q?9:>d˴!C SLr#|I x:ϯ$m̪ayfEH6(lxy x&!p*ف=HH4hnxž肺gIDcd M)xK<{N^,jK ڏy$GA^Y$D,씉lpY4wˤ3k!˂lY٪E1jHNSCDéjHV qOu[ߟ [7S^Em`}`2/oO:=i94d5A{v F0@c.D31SUAXʫôUЪ ^XAZ,\ fgal]&8X:˙>m#9:C/G}bh}p1 l!++ b8S;o(hkv '} F4lݦ8`G EC̪4@Q?NqS$@xS絣z$Ǯ(8^l5 XyOIpvڛ  7sˣ-66jdsӈהae@өsWlyL4x1"ːZG) :G8ѤCPz,'aN{GZ%^&Jd :cnTؔa3{pu7*6yNu>ۯ?:؊ }Du`ǺΛbk4]g1:߼,չshLy.+~ĠR*9;9}Q=)ASt+:I?dut tuU)'k6,rKşTkA.|}< ѧHs<x$7NzͮV- UQ&fC74N٠WQ EVdi̽&u?-;;j2bc0ET?Ԛ}=*3&_o*SFOZT^ҧA?##)h:a%_iBLzUuBP=@]tPgjXPd2 i/~O[kAj{Kc.~ÍR9F0G5FVV]?}7G~'bi/U0,ظn " 5U| oCGCUc+3sNJ\2#gRR9Qy?t/Ȧco dDeEH<7tOގ#Zŭ;B32S(8D~>ъDt j#&n? s@Cgj14KiVu7.UbP| 02Xd7;CfhE"AJh3VeݝzT4f-0c?@:m91n1 0n;@zyAz_Ɠ>D|3%GEʋi<]x)"dFҍt9/Kxi/y$kvIʲjFh}PQ:.vf9A\eB<բ$c UKdy1A A5LyD8 o;=[5a#I!2 xὝބ[[ڶ$MXžB-WH&.Be@.AȷYUXFq|h@Q>ņ?  atFS^!߽9KÈ̳YU2E}q8$ &N]t**\34nR_(F՝\,,/ U"4\`68(j韵Kǒ|Mn 6}rYLg#gT5o|B,YmKj_7 <98'GXwD{qIcSa`MP&Ll4\ޟNw({e%W U! (#@:tk0[-A* p3 Xa"QYF'\ÙKҿWʾg!gWO|H(CtGKP q=[1p2CdxHO>f-QQʶL#gx{nn ܩ GJ21te{R5@GCؠQ[`ȃ{Aw8ƃg$}֢ U= Cq Wr=^AlOHڏBj1=(Nĥ( UԅmPb9BD^uHx0Bs_Vks?gpsh uCSH>tFWf9{myjMޏ Ncηu^۫MȐ'83 k Zࠐ̓~JOvIJ~N+Zq/Q_YvMh( 7L-Gl5hd<؂]Pq-kUkjqi0T6yy R _ KJ!ےUˉ0ma3"mU86g@"9 dUͶd  Q;,(|ad Z}H(`f!=S _y0حS$=8ide#ׂT||V/V@t[]DFoNb7'Lmj#$ĴWvoo2ց[RG:䋴Wyc{:W.^eau|?9aqP$ 7!A:2Wx&56 |5kkdN;o-`tHPacLwmz1LLtKgL~t,Rj♎ħJ^|0tI2L:j2 !;35mof:L;b:Z5m}P TE*Lߐ|r% (ZJB j-M oI9>%Tx RM6am'C_Vc{9zWڋa_2{c4)4R7Wyj k:yѽc~[]lC &&we-ШJ4 +2* F=b y\_?qPH sQ { @@ Ƨoz͈XԕGjaP':p\J2ᓿV|-O/ ;P+䒐7&fQ ]Uߑ>ܽɶ8*mlhXkWt4#Qm%V9mjcuk˓ڿJ>gXbA-V_W=4m'+tN]uV 4wV9ܻT7huh{jC=y  ueuo4< CB|z/O'VĂp߀)t^`B'=@6 :b|-SabqH<76_Hkͭ8.6'{˘M08z >w=PZ%mM8G`jECzO/]`œ>0z On#s?p{';1y#0JP *@ \T%ANۣ}w~ wvvaUnG.. '[=}{b: >g_F<{4Eӈ-`zaGݶOM xr)1@i@0F`Boo@9aN4$ס<޶F_F],mlC#\oO*c[f|2-S.]ɖWB-5T ;&v BCr}9(I{\o\oR`}:INз'#ib0Y ̎Hg@鈔t  $c ^Fv+ʀv%`Q~BO>`6P}ӽRv`al= ic$RG7ܜ#6zr&|k;F$g+c;=-r31Tp HB-#UrOΌ`!\`6sxP2*:x^)UǶjj$ X1˅hXFDQAQ*4wЇپPӒu)٭ŖYD18^~U˓'N n]I.X6P\d Ů]Zr_[cRƉr;ک$̵ONn[wn>Fmmd<`;l}pz(]{V%T2a@hp[\ VtBj6ioƵpNpmxkݺ\NV v4ZbmI \dDSC@Z13䇝(4ޝxwEw3;i:>Mw_:<ؠ .IttK2FnHdСEi<(P+pb=1T]_貄wrGKS/ۏ ?7衙mR5q eCJSgFR]9^L Ï5ln/oK):,N9?^I?O{ɝnϋ@3<{)9 awdzgf<gOl'Gr<%&_ROO娎z~^r3wU'8w5&sArCTLI?Iz'8bO!BlxR缨.s`8]]Z:u8tb<.N .Y?!:q5ayce;=(gûw_;yޕ[txwxwq=C`~G縶[(=]Sqm8\[\su6k=ĵ?N{Нpt~;>cn3E2 MXݝvw$}p~+ ? &<CK} |S.i-X"Euih#h* eyV>EPnXПk\SpApCMZ ](RԂCRs{s@}Gi;3g3ߙ9Tc݂Xc~w)*"c jK~ #$Thv 2BRΐ!ؑ+d"e5%,](&tҥf4[$6j! x߱,d=Om27YT>gj:a:1tc85rv%o g<=ύ: ;;CK[,Gx+ !}y-== =1ui)}+G+iGZ*n_rmj׊tn2XzPa[Y]/B Io'.Hqۆw}_Η Ǜ!L2Rf#|({l.7{cmȺzK[ӅqBq_Q Z@j6:wZ^MOycZ[jRjiS:@yO[(Ac6vɱ1&68%4̯`#t$j%Ijq3#^M f@sSX\n@lKC1 noI.fr,`VؼMZEe[%Ca :5Qa)ŔZЛCc*Iuwu@yl5)+z: (:}s5?/7Td`3߲:đ|9% dGSIsavajFU3{<OUTme[TsϡۖM-rkreBľ>rKu9N9LA>hYb45gSy ΐ#G)=iIhl{O_>Jv^?UT!1x'b}!^`pC_姾$b}T7 q-wKx;Ќ}|W3Wθtl"Scف̝xrJ(<62}H_\Uh=\ɬct<} o0h^Dc1hP{,%=txLhȜ:)"׵_"E=t;萞o,]WPt퍥;Jw@tUX{%T k(X];MGjӑY`N10ŮJ Nmx/X݂[QuuUKO1JMb2[jX<:U ќvp@t0[y S,}!3@Ϗ&[ mE@e!x?~۾^)`vLAw/e==9}MXt*x>t{ہN[SC֛D[ٖ)?a1VTGA +c}1׵ w`m!d6OZQCkq ϢOH2YG칳)Cf#ȉlSpպ>0owBC$w=J(0TEHV.֘?!mDHC7*v(ʪٹC:4 *}ơp-;:<* !t擆P*AzPR(p*Q]Od,'T|ԻZg =?EvaOjx`I \E $;*i8=|R̠.^-CpmoCh&=8eKzF t$O{?n8@48OCSX լ@}wBPNhZ}N8)&|R;m ?Ū>L]bϢl[ 1ڬG7',~+c_mlMW}t2tO1X|݂o\N<c۞S)+ݕpsgs0\|}sg0y"PFv{2,qawwdֹ٤>{z 'Lb[zf=\O\URw>}u4nV*nԋ-m]-R񦕘 AT͒x5I :s+(VѢ%˺]@dA~UU|yk⛕|]n 5v=-eq*<TQRء[cf~{)u;/ a~[d][;Fxu{kG-lq1  6` >822Sj-/ &~M?tRf'H),(n >w4 oDvJN/oU֢0_jɭ,|Y"xPch=m^tƄYlOϑMh%9ㄊ pJҞ5_k衴~S gs~|}R6DHX5Gvx<)qYfz33ɓ6ƛvּb-z:BS%F_U%>? ǷX$3t#0qQ=C7 m":BÀ{yXdէk1Os3+,2~Lxqb3^Z'cDfldxK&gܫ.B Vn_8|"kM[NA g xݟ/CS-i|V_v<, izwYFg>G&3G~/8K'n\\={m+G~ϙ~VΏ0Vy(W:Vt/6'xup;VUw`S;ƅqd[/[.J翫H;;A;(f̾ `bY〦t4 XJ@L (JOqEAWP:Lr!=@FE7AZl=f?$Sfy|}3FL~ :`taFkz,_By[>?'` 8gTU@hf@(]B@EWaZ+ A_ AWߴpT:"xES"_a9i_ۑf]`t˗;57V|fNiA2/7A`[!R,r\Ͻy~Ll_|fd]>t$Zf`]]Y|kO JaK]c?wNMBhq[<1ٵ ,9?9yEvז&9mbh|Y?40^XχWghN!HE)o4NŪm&.dۋ/`ȇg7ZC"LlnY{ϛ' a*|w,οH1^lǧiWsGqOs|+VBP=/kmTU5Fggm:]`r9էtKrFt(ȢDc3vke&^><3 F|_3A/g2W`(ȑjkЌL䂎tb^[ 1eJdf&d"rVsb|էNoD7~vm̄r`Ggw#/ FCaBW92\Nr!,@jNٕsj43s \)OOg WJfHrsMJ#z~)v/j}Ѷ6ʳxEuH(, -{,7 4Dm׊(E)jq8p|ll>hgT!ۘ [d[+ [n ~Q6# Lf~ Ȇw->VP& !M*ne8n66pdwGضt897w#jR P۾Mڠ >ڦm vfi=%=[> <2|mmI_DmE1 |!-nӇBngnC \_V= z {Cvc@2 Ae\Ͷr6UEr>'f^ͪ4<;J~DowT!&xcV54$߬I|"11$sl|/%C Lfc6#Jؚ'￳CoJ޶ Yx_#M))`Cޮ~ =:Ds`iٓCiQa_mّ;c}+ ٽ`4=n珔 k']5 /՚uC0UE]^;v|>YC]$Gez1jKSVV)C{TePCTl;|@CV</ԀaHTҎ+ct~F9]^c8ٻբl[2@eKE! (f`lcO58O2{0oC?Hm"ʯS }JJ=B8Yt) Z*FIF1(8eЕ-3e!W-{%O}5唶َA0wn8A$7݃呆xsn_[a-xFV )Ex<%x(E_l];_I'ݾ<.ڥ\ S?b4jD#fAod?lX7Sd2C@J1>ZiSbuXb /ufPI*dȬcEȶzWKU|쑏GǂfEP`v֐Џ=gpHRaGm;@YL&N,ހ\$9}0qsnpJk )9h=kt'V:w}ftjQTI߄5YP;HVuVp@D~d(W& CYK e6,NT+|57O+it >.AΔ9'4IuBo^#w45;{"Uܧ*r6I3d|P#-e.3+59G{_P{r{c" ʐŃ(L 6Dr -~m._GVqfUxzds aa{پaA`}/oնê3aa']vXLaQo}`M[a3_V]F9]X$$ổvqu;/ŤANRY=yrjUSٙ/h?lJb[|ηM:~.ww{:}?;/5Qz[  o5?Q0;Z@ M?Sdֆ39˴n5IvÚ3w9=3BLQaB nD~# r$y4y;Ni폢lN)P$oT"&?(^.F_W[/\f~Q}~X>iUŃp@! X"ENk9/6RZ~8p~2p'3e4ȒqvuQ{= Y &- j$.ce"Pqi~8n[DE=cOƝ n[rG4/5ز߉z~ۄ4t5E~nB`+,Ѡhe1\{i㮲\Mc޲:oҫ*7w. $ay`&xƫwa%ncKhDނ%*i<ӯg#D9CL )I!&swv("BL^p2РjՐ;#FVVw;81} owy+)tpebq[+/, fi1OzX/d|,Eӹrҙ}tW(ZXp*je2ޠYHN,c:'}طȫ sc#A!8*ۗk/{LϽDN/"䢆{:m"{\roۊE ޞ qoU/_ 68&:e]}X`O dK|y﫛=b0?3)zR<~63 PX?Ԉ>3a-&&AiIF4g.f+:OdK">ٚ=yeYg_ :;N* =<7 ir4㷜U.OP۲ **4QIdo niw)w2 A[{g ƳQ i;oɖoLu-&l}C|k$ˁ0b]\kL|(w~'my9;띜xB(9=t!NsJu`!?R =k'5!k888ٳfmاkB݆BU0 ;wQy֕YT^3bM"qNAT~LPh"{XD]+XzH5l@{41_\:/*RIqBA%i7[<*^8WἈLġf^l,x ciY]n qܟJ&KS[4XxD6MqF>-6dPGt4v |#M8DoL $ZT!x;^:;"XWVHicXhS FA< '1\Wa);h ~͵W u.g},Eœd2  r2p]߄elo6]د^ĮoYx"r_XV|C@' ;dmáΙQNK=~¥\^L\ {I`|$;%9x'xL$G,NiI YxY \7s-z[fYwjeP*V\TUP*'R*[XK-?׌mtu?,HMY> $&FJUhXM, $d`3nU8j8=SLRHh(" Ax˔|@M d{ˑs7ケ׻«w`T92.\ E|&Xnzǖ,{ djO"_"WG(b=Ot7$.j@ ;S IQ 晰ʎS۷ zB@+95Y'*qrS0wf ^$#) $X-5>JQ{ pe05Rlc ɡ2e=ڄ(: u2rC9֊y:Z+B%-v_۱XoZ2ߡUuoM+.S%2R+j2{Z{irgh%V6 zՊl{$0Qgmm Nu2S]_1Dp#lvx{]8e36:|/$Hx _+]yM$OY.=}*n1LߩPFc(¢!zqt}gP¨9ѷ ҠMlgFg24 6i,YSVw6gV1@*EhvkE؆´#S,_hsREo?&,3޷zMuu?jl QpZa24y Q4ӌ!X0P>̰/mUgMxR}6Ic>iUgŇ}ҪhX^RaT۾J:L֪yU^S%ecWyG@&ʷ`f)ߪ1`+Xn-|lYA YF\t;~Cua|7e^!05 ǽ10,z +zU0,U j0\;t5r)5KR&LXwxvHxCkRXIhHА -{?f~͆. 7 o0ݣ@u,_96~qFe8.NNCR[uNl6Lil\lQ+20>Na, >qx`[`$. -lIw H -(LGݤ #)[8ؠF^1Lx9fyBcg]|Η#/S_Q*JW1> ۻrIdf̱`&8 @UfֿP 9p/Tse\uW\ɀP?JCRaYB4>'DbJp$hNS7.ꈀQs2 ͵ lEh4~int%Qbp r@1&/8XMԘtY+pqPA\hqAqQc=EX\ , L7v.t.xA?ђS̻2TK AdtRdASN Zb%~AH=m %(tZx8aưx^IXosdt23:R[pps2(6BԔ4ةbS (̬\=puⱀ xMnJ{[i_=Pi/W˹Q}k׉*i8iFLIEӁ(ת>‰Z}u=SOOhF'&{bqZy>T $q#܃|Mh/[wjK x_20ǭ#f|L[u^4_tL]Q-t]N;GE| ˆ!#xK*Ԥ<Ù+v>%cꂩWΤnq.fÈLݥlb\'oID7[haA&?PK,HrZM\|>ڴ>T\}7OY]4:5\\M&șh4&N&&FI4tiFhfVBܸ%|.W8Nϓۊ%ɻ̅slIȵ>'jJ33Yq YtŰLD B -tqio wRbKy+>Em>EJ5wщUv"=Q(ʢ^.`JEt5Kn!n%L47Bψ[DJ>=u4&1]'SmS Xh hU*$h$#2_Om$QTNh٤.^/P8҆POtJB4(B$ `^fw"d' S, @N8 6)7GmLjlab-a[Oѵcg~ff} [r ( ݨxcrf'jq&T]Ë yhMtpkPg4vk?Y~|O̩M3)U Q- &1N*lѣB/T:goZknlN!ZDrwĢ{"v!vFxY4|t7 Ivh._aшݤ +jsބ[7AgJzTʲAǐݵ ĊG- jlߣq{ kV>LNjv?T_yqcd*˸r.ev 7E$7`{s@uR{߯qdpQ/,`UeXZyK8ԅRxeW]..>-3wq[d9:f{= )s _.B| ~xt )` +<7|8.9l^lMXI9B2xfmp] v T~ 48۪.9tf5ׄ7L#-6:>kM^d 7Hr T8E]b'J_<ʬi8#4\FY"t9T-!- 8catMnSrpc@Hҧ p&mF&R9w8)EI~> [ŻHhNT,=t2`BY!=PIGݞnÍt,1azer*B-E<5θ˵|B$s(dCYyџVcAGJgnC`AyS,kpو'D?Z`Rd?5d =[yQH+YyQ;82Nq_dW2KgG/28vJ^J6U$+|!NքT[;CAydpsvQ+[8f>9ʧ(+\ bhR^McmAn -=,p mǘii9p,+hrTBnfF {=$b~]VNt ./#&+ Cݹ7Diq1}d<CK} |StI %eT`BEmHI{#VEEE@?d3.QO}DJ-PBİ73ni|9eΜ33߁f?RⱟA_,WR8Kv"A10zAꔪ?ފO 7nS,Du() ݝ+%JE S+אkvvv@Y*4Q GTO0\|Ƥc'8f͐5Wz8>},^`<ؤsbBqt'd!Jm) eڳ :я3T,eXv3ʜ51VAQtrr;޲Pܔ $q ;(bB^kyʟ/5>&6r)ve>ۈ鿰_aP߅}hlTjxHw _ZҾK+ = /D^ط&y ? b'#FsZMV=pd%i}jo^7_`P̍f B&E@DgV/%^rǝ嗢l_ST|%6q![H{ChǂlG[ųPeL7=1.gLO`@dE &;rRC1.A(K.ƃ,3KHq |%wNleYw[x|mCRx: dXBI e!˼2Êr T+H릩sr=]pIVO6c|ʃ˗,J3ALh#.SA=B.MGbJdyL6]$1SN>.:;JN13Kt~Raf- Z7#s\mǥGc̑nh=q>lO7RVĽij'PVm%'KTn3nlO ˊB^vcOz~J < >~f-V!B$P-gyf7֬nƙ*DR\ɨᾷnhkWZEyf Vg,1(lܘpObv$ޡMeo:ySƦvߔ$%qwFC ߖ y$u[Jmʷ-жlKlK;SNaTZXdc}yף˧}fk-Y44%+s~s0JOVOR_Sy|{ ,'謲Aѡ x=U{4ޟ3",N &W lVP),0M}ZiC7_ɑ[#a7uGr[?HsPDzv6.:B&D)%߁* S"฼{PT,rjP.膊c"(Sa+w (oV\RuPlO_=YMD8vmkɢI1ψ<@uuXzl?cFomCwhr}c7K]--1;Ql *͚ήe+߷t̓k>&ۅ2yM:b"q/pi/CȻcU{4s y9C.Zqk6;ksjvV ? ]xUYǕ պƄ<ܙGG(%Wq}Ѡ]Y?eJ=/yv.ʎ KN8K)PR;ц9مʛN }))-ҡUxQa c]KԦ9r=?B`mS5 xIof'0qSEbr*z?Un6H$DsGyotqC@{ER8;!Iu7s h ; 04{4⚂Ā(ɑx3۳[(EJ8zܨ0F]B#6Fl#)f`2)e|^OX `8D~䇷T)ȈtV"[ n%Ƶ\OUHa]d K {\F^w#PFחy\66O~)*(z o.+unБm3uըF؆fv~|\cpEݱ%DS`tAąPj%'3k ` ȿeV-{Sx$-<3Ǜj)ILAlrk'-ّ@_oQ܇b ir`փ=JC}.Dш_ Nhw.=EehڵUTI=J0]qw-=K0(fǹ nsz~{~f`+2́g{ͲŬF' R(`Zţvd,8[|^@+lRb^@#4Z( OLE!ic}:.Urb-$Kt~S-%Jp}C5:;we*-dey^qP|# IEFE7F#b2ٹʓ lQI~q.qb#DQ,aαi{+4 A $sh/wx/B[I(^NփHA~ɹ4-0xkw-YQ+YKp`?`(AA*0!ȷ2I (?h}1rQh?U ?7 mQYΣ8pމD.&ї/8ٔ=#V2- @ '4)ph8cY6JIJ\[A ]& ea!OSL GNԫC.aZ-oBA n OrŞb&ZE }?d'[Jزո*Tܰϝ}t'a_4|ougS t5xxD2j\h!05c9!RDK7#tpJ'WȺQn>$7rD jfI_.h;H8g_M~ ;% 'NL9mqz&9ٔ=dh0C+S. crP` /`txcXn(-//ľ^E0)UK֪>mAC$ӑu51FM/~HnjCD&oz+w%_5(aNgB&۽|(K&_rx릇wFLi6eӡ^]auTQߠg/re[ )47KCabyoM|rzT'l9*({Q@c ) s[:%^X]҉զ'dV)73ؙKDÛ$ގ/5Eߡ{X`g$p~$e{m!D1N9U=Vx!mDld+mV5N5_1ݎnvAfQ"8h^ Ǖ87ǚWET]*صgO~>~%̲zw/V>ar-]CN+݃Y?y1 {`8K.Կx580I酦Vm5_ƪC;4YoYn|ղF=@0UOKLcA,Gcm_Hmⳡ98Ö\7$XJ[נ\R~6-oǰ$Ook^ٖyt=[ѽGE`-J:/lUՑ\xzEUPEܑIfAs! i|S\@8YGeUa{@%+M{F3n3a6Z>RF0)v&3]Բn KdW_4Ap zD5afPzMcZ~e2Y{T ]*-DGu%࿧ۏaFS5_:pFZz޺;+ӗ1ub1al,Nʀ\ɀ][wȠAP5bE02FGn|Czf@cgMN߈SNoc<>m/4#uB:L zTq]PzEzLq e@..Wԕ NrTAUik ^ӒPeOv/P~PCkqy$7a`==%{U sQ!6-QF#HB8OtE3CE& ? c(s»џp͕Ĝ+g"eF\6mNٳ1JlcGݣqGqS:j *|iJ2j[ {zmǗ]0sO>K֯{&.R9&Dah^Sf;6E'㞻SG=OuH/KiOI|sJM"$A&2uHU&C-sh :<: j+|sӴ2U +m/4)/sּwO@V|,=E97[iS6ո[ާM}Fֹ#E^QZ?i6X,F; $7s֖˟ې0=G{#Aؖ@|bSֈ"5=L'b8 > Ufd4DPkbcYZz/3|9mA^=р H=A>GH͔p{}WKzͯҒ/.meN &;Ju+8i5, a82b?!.2?UPKJ(M.7Ej?W|J=;2^y&Y\\C=LßԲwR$xK/9̤Nh mubv/(#qQp?\p v'Õ\W?ҔCA$WqITc,JRCaא||+zߟr6|X9G+r\ٰ}FD6W$:UGHKD^_#YG\'٠bpb՚xFـ51Ĭu5PSt6(;x ?wol8bh{;/2xC[8Ρ,-<:aGfʛ]c@7yWtZXn˨B=ҕQ2UӢg c hF=^rt* mm֝~ŪC[w8t2(X ȒJ(!*"Q\˪ߔ]b }B"@gqWX2'0^94lL>Tr~&&}k2c} ;BZ"ioNpuU['ga$*Ѫ;6lv$&]Aq5U(<[n ==C_= G՞ZZOpnf/`l/lC=G7U:vMGw .SX?bwХ$F|(Iv%AԣS(cy_ְ$}ц ~C}ld3"`^9I$ ܆^1X7nlE/=m熪DEp2C5 ^(S~#z`$/ ??_rwoy;:|B{j\@:̎^hRe(^bO|o1|^~_ T clI+y;>K?< AFJU$;/\!/Tf%:G]հy{ZZ`[Z6I&bX?l@+p+Z+&J78 {<IVu?|~qfQofov>\f5;*1$xjq+UBY_Ӝ]#ZC"..C⛼tq98/-&G7_~Ӱv[쭏tWbGri5ي F1u1`m>uftwt3?K~?h^> ~ ȟrWF&m]7+|fk+#ݭ܋36~ ź8x|Ƭ5F/8u1E`[+-Wn~oT|l4jOZGeɯ,DMݣx$qİhWGG1686AH(WAQ.f;pKW/7KjkF!qg|V?5eTH~ר=i.hJªBj ]q W"YS $,]Pnq{^2)2 pF o+3}8JƕaQ/Ow-l]`Ml bC<*^@x; H-3e&l1|tReE"3IJ)%B݄zc|*O9MT|Mc;Է!k1VM4Q*;G))ͲvaPo qԛԛlyFE6q{Πӡ*lMdjFs?=Qkv5S+swso RbF߫kcDWcjemh,ma;;±FH·YgD=cjwWQ\q}l,;@Ld kBe+.D"w<$IH!Mi!q$thʾ?mg`(t:I@$$!褄HN );L8b0O{;vɺݷ}oo`dſpr}۴' =qzi㿷m/ly%mKv I5gn4ȓJ>.ygqS<)U גfᯀElAuz)e3ŜjoSs=kB=.]߉i>mk$@2"/pu_߬0&" 1SFe~C}flc>SvN0E0GyG"YNg 4Zfͻ\9N@ͧ:׭އR; D詶,F&64X-q&ؼ=QPR2vĚǦK/M6}=ڧ0&6t5Y:dB{G#u2YW߫av￲e />syV͖BS;s#Aa ϷMu(߮'xk-&joF\UPa\hhw؜u) 4Շف1wAoi+`_pzj)ݱw- WL5񐫽xB]t3I*ғ |ۘJ, Qst57>6f6˗s5֙9SscS^W=-}!$x^Mgw̷fE R$;RMaPQ/ښx_TA,Or+N(2A .1N[3&у_s )sjM9/vZgh*5SWT@yOg}`WCHH>A腖\-8'&ڵvwG?*9Xj$7 ̽-Z%+$ESAvX&:^~|b?ӟGaKM9m3eo77uW Рj;i[7k4䙪h`(OuĊXv{HWe#AT!zWXO =VI[ȱӜq'P;BAWC dij zzu'8Ϋg%ر 63(< Q!ӑFn<.V "^zK^)" K a@FU}jSܐ*{@ 8f..d0!0,ӑJL~C%T5B|#Sh*Ъ1v& }q f7^i{O:ԧ:R/DZm uѴ3N%:VuzY|Ƴ>Ӧ6 M Զ%S 9|VU/,vF@!g{gc]>AΆ!ۑ),[AN%FrwBN c =i/@ז3; ː!Vgh4FAȌn|cK7>j+o" fdl+@Umnn7T&y "qH,> ϧtº݃N~ZX7`ݓ͐L>aVSI\(&s7d&HqhaCha`i|C,kggXI;x+T)|ĄI JS97RP#>k3aΟZa\ dZs!uO'5M.RNn>ɳ$fetu..r"'J.z*|.h/r \C5|.w ܭ'3ceQKCR(aG.;3{a$;p +$2;_9|+ -J0P x˄-o6E wLwD]7{rTćfMdQX/x Du)E{TRWxr䔉C6 ؠƬ wbu eV(}ڒ1|]LXc-$žeXgzwY!WZwI=_#R3dX !CUݷ W bM*SԳ}S&/O\Y ы: gڍHxaM\L^ܣ#<2QLHbylm_R9Ԡ>6?JqTYڴw-O}btK[>j@qW^::Nj:ێ7'X/hC% jmr⤜|M 򂒖<\ S%%qrM59WA(."{<RT@&OmY|m$}'/t( Y aa2!EHx4tm 6OiD9dtrޠ7RփXU,%UԉEXO d jT_Km Uz5\QsE!V; tы0OFkZP7Y=TvDkA ZA2ID}-c#z^OA9'/iNNj i@;CK} xTյ̜d$@xIԀHD2g`SQz)(TR^m}Z[U!ԙC@B+/B% Bο#̙}sZ{Hz5C˶)ݑ<Ivdq=8 7(?}j>n;DvjRUQn2E\ ﴊWqY@wv\(Ԭq4x5 /@XoF<@l+!,= .f(I@ ¨m=7'ë|*GA2g$EDq}E=)n2DWwGW>> /^T ǸHfc90S&fR~b+^zEP Zh0gO: :q<( zLii=ZO߅Mj.< ܶL -n℈c@,:нܤ4}v؉ LU70EL=NQc_!TE=`fˣ@ÆDDD_3$?C9GC6l;`;2ogAxw OxjL-Xq_]8 淍(4 %Z8:|HF'2mۇ&``y j0*#ĔQ+M,VӼV~] ikpJ vA= `nZ:+ :[s1Fl>=-Jcq/AD ӂ匉y< a f4I <ӡȽ17;rԬLיoxV[٣oXHi&KL7򏗒9{*Ϋr38PZP[߂MH_o|0`#9bmk:OCPE*#emZ#"ZҶMW`@|.#pg|\_g\K\~,D,o%ųt} YÞ9M1mms=є'4N1 3Ba}n[&~fec}To iKEw~k)?u7Ο :π)N@<:f\ @9;W/t(Z?j15G͔YȦX  ka}}L*( @na甜TCx}]xeLOJ ՜0xlnGD /ɸU>y 2nl\X; v_jD$ JW}K'.6H X eB$cc(OٓLׇߨjdK1-AiG6. U7jm?7PNC&FY|vsz]Uͫa?<Sʡ~A@sbk r x "?&o}wثsɁuEmgTUnIZɻ]&% ~?M%"A hԗF<[{S8}J].ï} +[=2ȸ)A؆m]u:Y5TPPtJP>z8L}/#a@oRϪh*4L`έh+^+sp,ZYrg tlYB@AK84o+qT r3r=.-:d~jA{`W22s w Z?z&k 7;3(p{$ǁen/)UF`z#ˮMv\[g7Yvk 0o]7li[u *TuvC;Ns8ꃍ6k Sby4/Q-٥y"7Wg[|f$-!n_/|Y[rA DKI_JYRU&P}9H&RK\ϩJ0=$r;Dbv>TDS4N'oMF~>ڲX<D J0%*[Ϋ. \qf~TFwHΥ;|wU?42IdKW߳h"|#O7AC!t3")àjD]I'KNJ@/ 9 F`l0u L&Jӳ D gxPH+hfW oc`',*uڹRkȚ>W[G}jSs+ͰBn "\M6 τvci:2| i~S)_0WA4BL. 8NS/ELJ SWNfjQq{+|Z:5߽;@jDHGr[ՙ-ᅉ~aTlA~dAUJ[ˇ't(iZ湐7x.f4WJf2X^ @ g?v6ȁhqIPsAz]rV <ċȗ'  ʢfK\ u:şn:@Na+T7]:&T LGWQs"a^#QՂ5V (31D:d_R y KmC)~к3iU x XeC2ђ&嘅ђZPLI7NcF1:ʙsl ZWֶ֍ br6CNt`)JK'+ :Z%NvU*5ˎRUvdq4[v(hOtP'4OvBv/!O1uwQ[(n: #%0䧢545g ꠡ KbtM2q~xw ƙ5`(O$1#M Ky1k"@&& d$?OZu<'ÎxRœſWGpbr>px|ȣH׸5=X( ַE~V+3IH5#UVC|}ѾW7c6ܴɺ/Ply KFVG7'b?GۢqKL[vXnMN'ф K6*͇r-*N%E=_&O^{BtIcX uh|B7i0)aתZ{/ukNyg/~PFy%ܺj3 H%t^ fҪLn&Q?~; &^ j ),ּ7e "w鶱 zOZ=~cKF,WA% 18%{-ȩe= x׎O˲Ω6;Ft/Cg1IhӱS #hŗT<5{%6doԥ["G.֗nב{C/LE²< zS fp=U7SߙH}X}ّR1+U̞(ltbP EH{Vϲ[h>L$z)>`I+&&"ʒ-@㛖6g0xQ1yb'iLĔG,/|b]Zk@[f#N8~} ٘Pux툅b۳APæ&HviC&Y3ҏ|0?WY.l@>;g4*9K| j;p`biK௡D-l?;db|pH/2{M@En h ,xE' 5fN2,#9W%4h͒ e v[zBGW!ov};dc)rxNWnkJ}_$}1hn@MC۹'_^")[!%{z8F_;.?2cAё|ʁ=͆(k>UEFrFAjo55"etVrMjF;<Ӂ+hR-Gᗔqo7?륖(Xmd1,r8 Jm[8޹vD+O'uQϹ]Nds=D;kẔ %e jc^k_/fRd>d*w}KFDžw$W׈'n[ra ?x|7_[{MD *yEYRdlCFadmalfWɛXQ>5{g,M[4<+M٩8C(Sυ8.VA_;#݋Ynv1ө^XUERg%B] *P`lq_قR )P\6cp||F&+O+kwkvi,ڣqvY7jv"3|"9E @.6_XU=Ld035Nfp-z6R*֪^ d"fı hy0 qCD_ + *U(+g ZVfSB?20`F{rV,ʀ庭B Af'V//*;E`6] ݚ¯0<*L?VCUX%mj.4 ,4[6 h)h6 \nl&W2'Y,ǣi:Zx[# {t]_" Σ8Y/ !lOAx"ׅҿU_.b qbÀ=0%>3lf 6 5=meðZ4ɦmR՜i/b nv,v͈ኍfp tcvf0kE+I+kĊA1awB?qvt=Qw}!o0b j%sVviFK!{G Dv]ek8ف>Y`g.]LFrg} ug $as/TI/ي+I\ <)h9Fk^}?qV+w\jIATiBi_߰nh*<OC]j`{o/z/49rRi6ls?{O1x.*ՓƝ5WAls/=FmPn1. ~-aP@.h!ZhNGbe͙޾Oi4#ڣkVf`h?($o4nтfi=}jXjF^FuKtqVCjXcVTxOT '?w\r&.3iUZ%)S4*^3['vI?.<˺l- b}iwʁ]TӕXhSX~:&gɎ<>6SӜمZL9Qs_`H,˟DdhR^j/x L;v8a:k ;=(j!PBSFNfr 4E*T+u+0?Rae:]ٌZ{LynCd(l bcd hO @2}]iGG(b7 6:׻Rͫ3BSmJ)v2GʥV|RꇿutL";̉Hir 'P๤ekq2gAWkL6FE)dWPVߗh)7w(.ë0`$6487A''tz ()rA(n}"&[3.M=l5v+i Dv"`"k RZ M}/; Qv@޽.wb3 Ѽ2X\+H*j ]oq^;"} ߡGh{5yљ4D4>a! P`7 `? /?AM=1񡑑c=aEug ,4w`?ݰub^e:0 00ukԜAQᵪ9ֿ߮#Fx g/KxkVϳOm"?kr4@=ӎ{̯&zG:I9Vu>iD!׻Pu끿4WuJt\'^-^%Xᅪݡ龖} >t_'ݒ[r{f5({᳷}LkdV\[~>{mdVlXbqeSݳS!`-7 }BD~~of/PEEjs ? #f!L1>xYSX>$N]}Y |$h>xdm&Zi/C u7 צ+B{8y=:̓4ϻSgfdo=sǶE7vixn[=|g;uNç_;1cw]@d O@j9h`Y5CW8Y\8\2+vB,tW0 M{_p{3ýQ+]/cWnpiP8?{+d;Feg!e㊷=r{/_־z%t/|ϾL7{%GTQA,uZW\q6voh`N^"CDF5 qx>]J, 4  s(EShZ.xL$x\ﵢ/q8}GhxV|}^'}3ӳDIE[;_tzaYElULsn9ߜEAd'ub _w ϧXg3ŎVAgug/@ ZֿSwr?>@#`\9`mSn:݋rCMgFOFs* T <[:4{2XR 塚 T2ǂm٩ se~?my)`S9ogprAY'|>; >Yq>S>>O{xKCkL쑂ۙd=P6bly+;SqHB\&gLC.gL]VgebLmN6YnsL E4Ox47 _XSt';)I<>E &2 +[Sq䉒p%QDٞڎ0޿B 6 Êj. >לSK Xt KNg̱dWj&&Og&bZn`aLW0uLmvLTge'~^of1~lrrMѵ"rb H3G֋VS"4 d:ɠ wVMh]6{j' gb**U.X]Rp<`_;-l>1Cxv"<1M4SØvZ_4#8]s21z&5b󱣛BIYon:?[dh PW;?':${\A4y s؏d,&E yٸa0?XNcqR5|Ӽ‘洋V*x@"@sÊCOHʠR,;C|8Knuii]Vˊ@ de<Y݊{0jlPɄ),M)d)WKr+1AĂɞM5,'D$3"at5aY*xnZgyf/L"7ǥ_IGG1>wN]L> G f?MP_UM+Ya(ΖkIj?c;&r\ɐ `OZ"2_/Ox Xt{fv/|z>?ϼ)ϸ^Xx`9` F[ 9K+C#Ix "K ~̯Qȥ]zc{qe*J7[tr fV)B3PhBs;U+/)jǗZ=CE4SlŘ-EXM)LӌL_b5$Xk '3zO*Hxx"|3C[o{-t$9#|2ƪ-GRA3ٞ+:Ҭ!VU`W,7DJ' +໊5X]C=XGkDN6KlcpmHmldmiw$b Bͬ17_BQ 0t0|6Ll c0]l Iư062^` 0}$꟒~%>7OP Vcsi+|z[љټp$|jMt{y/.ȠN}6(@mkCF=# ]dȞ+(=#iNbw"1!D@J, X1 tyB ~},| ^u2zLa'L 6@d rAv+3Q>NQ:\h\?]2}gwPB4(ґig!Ѿ?xMK;{Oq]Nv!!uIDZt,Gh Et"FJP2Bs_ @x!>26ߜeʭI g Q~L["*fN' ̒Dd!$;67 = tT7;}rSnYA_$>-ZW(xJ &*Ϙ0>dnLnZr揺Uz~wnZ? lyYk❬U_\qʧn) Q\FTC$ШG DgN {iwE FΙ7rFf/Ď.G{kRy"RA@?h5sqn':1d4)m ݳ*!oٸ:*QX^b@+:nUu񳺪Ubފ sy0ޏXׄ1hŢ;l<(W#˖D㰣,({NqYe@6'FeQ< f/h[e]8m +mPo:g!2;Wo\E! R~DdnjO0Wg=p#@ET8GuPrKđʢImX=Wlr ?Չ!-hm]aNE4vէ$VA/ȯ Y~J "c@uT^y2N èV:ozEGI@x+b ՠPftץ?U5Tp$PHN3 !?S⫆PVwU =xeKjp&a@TgkDU7;хFsayڄM+{ijUn[G-:ïպf2nwʇG1JcTsθ,4 Z[]WuEok?4J-o@No *#o,;}bqq8*G;Dnk }w9.+/ԬS4N_ō@Z";E#@2[e<7 >]sk[y•k;:T=C+/!7|,xݽ Y6g?T5 yذz&vۮu۩537=yV!Ԝ l 4 ?}2GV Uq 57 8+z$6CykL=. BL4Hj*xW`m kĻS>vbbƿP 9૆~-%O-/Rtim8-`Lnσ.F֠֩& G0[=5ػ._pg^-{ţ< 8M>Vn7Z @] BC$a.\zkg < We ԇWf] cjNC2Ca0,U{=b-,:0ւqv+ҏ9b62%0eh%mUgxvA]? /?I%1br]Fge'ӕ,PCT Ta ZdGv3O@V97xhk|xNAie*&Cx(7n:xϴn8P+r]Ro3z0Ks^lňKDD=KQw_D5t֐N_<{G!$q"k7cRH %Qm DJ7'!*z /ǝ',:Z3FvS"M蹩RX^EEbafZXP!ZhcUjR`'n5{z:/#{訢Ie".q8'3ːcU/$Eic:uc BLN]P^ dbΆṔ::ccP3c;RNVdX@3nFΘ)-$މ؅Ƴui m'A|td]f;nX7V 試1P>;ąNa@X 1E0'~ίg/PH :IWdr:x'BFbƳP=j86~M.57?>d֒29T&w:8 X߽;#jY._{2H^6Ҳp?jz9 sP&M]q\ ["ViF3+d *ԐTzwEjxSbm;sxDz-~ `p"MY&v\բ5$=¦ۥlDZpn waHVutYx'/Za!%~Vlxd$]ƪ[rhAvd v//$_zQ) V Vd U2w}VHE?qܢ/1܉J,D΢/E7({qQl,sKcpz̅ PVm'i;:"wKJMb}xA؎v> /D[YUϸKqȉRRD &Χ7m:r}E65b#sSJyΆ6h>4Pm'$ ԶVAX2[XPdғ-tsxYCgPmi>d/qdvPHYpdA)7my!,ry"5?1z) r4PP1v/xX>K!4a%սaTGᠪas;CK]{xUW*DH`³cBc-C#12dLRۮߨ.' `B D@\j[Q k9^tBP'tݺuﹿ{y_`Մ`'Dy Y)=FD-:# gUU9H6P(W~)N+xvOXO'LÐ~QG#$8OZLQmrv7"~t +,h˧6<A\evzf,R=̞!avQweV!,ምu__3)9D t_#W,Fz]!¿fK~oJ[ ڱw[T@P*GyZ:FWۭ1jyn Y' P_(%5T9m X,l3)oˬ)TИ3n| i 7|%gM%S?F"HLеfĺ*Lq8hTrt \SY[5 8xVKKGvGe$)R-M_& 4!ݽZE)ejgRbDKtbz|dx"#S ev{%#PE-T=X)W;*z:bfB?KkX@G3 53AXǹxv%R@AQ"/[Q3~x, e/?S^ݻfE3ZQ=jEwC6_txocQu(6R0Lʯ"\b*KZ0 mzPVCoq1ѭDsR**Ʊo"[-/4ZJ@IqL aXr7 S R- Oqr#+!œb#T~q_1Jf*)E _Ҏ`PzO^P8;(Ĉ|0 aS1(B*C>Ŋ'4ʨ> ?Ryru7J (ʫwD[W ts.rM(RDiYP %rke߮RY6{ Cl tu)Wyz<{2NZ " BLdЪ^ Z{黎! {"K4Q- ?10Z=JQ_) B8Ջ څ>sIW<Ҿ::~]]_[8A7hn%˒~ҵ{@׽e;_sU&vZ d-`A [3ώAA6:SBX F5sC2aFrcYL)j<:PZw~@QRA^ _HX) G]xM"u,Sc2gOcDGcXԦQE'zs\:_ߏ}).~ǥàVØf"¸70k UˆKJ_:aR:{XIa0q!&se`޵J*|x251$I UQdݓZr1X[51msZ8RfesV?xzD0 e='oz7J6PL2qmPp4gt4^>xK0'i%Nܫ>""}Y@X;`J(s}'%Ecq߁DNQu7@ރqad4$G (غ ?~AK kDP$nVml3ccÏ`c[޶Kmk~ehkR.4}+!M1-e~R<: #[оW~$DVЉ]bXX~՝ڪpށʦl<Gt\m̈́]ٕw%;2r`I˳wEæY՛2?^`[ G!x:l|>>bƩ|uS~e7$7ҙ A~[ ?Ml:a*;lk( OVz8_w*E'a7j~Y r(M5_4q ue)CgoщbY]Nl[hSgM1iQb<NXԝBDv(eA79f S~NyXnig+"J~P>_df_WSvSh*n/r+ .4x4r3~-9s"sBHdK)aH!PSޏSozF ;}M#@@! >/bYua{E iN*_n`S}Nz/ ח^^hk i)Uac{|1,Ii^ḧy|@.HFBPHa. Fك)mx)^き~ ${Lܯ { GjBL-.$K866L1pH/^ E[6M!B` {2 ],BڵD׼щɕ)+gaMV agCHZ~YIP+fzA9j ehuJ4aNڿR"lzf)P:* J:&LKC 1Dr-v }[+i]ex)ྱ& (]ߨgG8wSVlrߍ|hWe(oV'WѬ]Med1l%3_+;8FgtԘl_r[dX^:J&A%Y#¢g8m=7=q /WʛDaGd{^W;ZMޞK)d;ґ,პ;ozVm͔s u2. #SWIsGP^OY0 v7C\> )U Lc&>< gx+'IT0bߙO3K FsC5e!A% qRq-`M;'^;qL~n9x-x!ྴf ̥T2_>pVz}~CB H hW쑟BL?A#":)q)J矑|2F\T@/Z(ti¥dqit"7B q4K`#ĬrV '|ռt8}^$gi2CFW5ux@tgd!qǩc=4?2OG??ϔ׽]Ƙ5:J*A &dZQ 0:8Üy:Fԣ{56q)Zbti.@ |fu2A/&nc~$8JdOex-g[W6ww]0xr[He `%c _QyTR)( m:uDj9sͲ<*?/훛m=ٝ?dwo}BD-HIVʊ_gb12j;"Qt4`[ۤNƈF[|NCF /ŏv_EZW.3;`2a8G$ z]hZc-MԹȣ_LJ_b1ThޖfShaŐu1h;l&H_khy 3{f9y/sNjiew}Y&cҧ}G1H671xpm=g_Aw( <p|,JAT/Qg* 6G`l/Jg4B{t<(C䟖d[}x>6D4gMlU)Ml!ܶ6 ŘMlx|3\Bl8UM<'DP49naE$[m&bTG'R6V:w NQ9-Lqڠd/15k:% 2El1uAwI}!f+@^Bgq0YU>7iVq"3uv݂IizV-J/37Yh)4čQdyɬu1q N_*<֫ m\d4"΅xksOʥ8LO#Q8Հ0'+o p'pp4($%iI>T (4=zt4:a#Z9\/:y80-b3ܱMtl/^ٖ}N8kS7q5e'#lwĔc*-0f˖pd0 bN-ز8[GU@m}B%~P+z^g3Hа^BY,|bV&nj0_[ė83To"og|&Y^%`l߂V'VcƮs iRk^瑖ScM.VԊ#F ^*cfĈe ^!̌2mʃvO?V1-UXcB2>Aw_G}Y0/,a$y+`Na0?BϽDfs/b0v!=v69 gBF=24ɫWBLe'9Ha v4TUG]}]qj OŝY_ڒkՓt(SG\s:LU++fsFĺ֕.,Wi񴜫xg;j򎫹٬y{.CMOw=IT3z{.YE Ԧ 38sy&4/Ib:/{s@Dג4J@_4ff_>8IPA]?i):z)4`4ygF4$+TH{8;;@z\>f~%U4_ՇΤP$-PV$&$-:Q|˿/GV"=Sۤ;W B \ZYbM+; x4xH=x[4zt̀*DE6Gv4`2V_p}4a8޶ =r#^aBy%MUfL޻ A gʲ鸐ޣ>Kl65 x5):Gvq4|B&$'3 |3ۨ;t :Trkp8s/ZXT)>"k6-z &ə4 }+xj*Yo*$FAPFswhpR8:n^7blZD_}k⥝%=ʈK'qAfg`&3Ey6 p9p= nq6[_KEx`baVTKYKG2٤}#Eס\۱ C5vGjݝmL5{ ^եsRqR`Y'kL։>EkLCOTأ`2oLVnvZ)[,NVKoPVdBS7$ /j rQa? C|"O`Bz.pLzwMvX=z IX0 rYlA'4-z: Yg%uV>TE-ϋϵy*%OiGݸMLz':p`]8-_8tm<{ MO1*hdg5;$1#vcke!yoY m'(ˬwڅB}^60O9Gc5l!fTFEYJ=|X۵qNW8 n42 ]8H ᥗi,wݥy B r9C=$ْ-offUpL+,ܓ"iM%v Qxڈ~ v P;KX-Ҧ_„ce>N}WxqUE37)Ch}>>\g_,2ԍ潄VnajC\ Q8ۄ1Ff1эd7+Ø!G@aڂO6y|~ˏE[`#**nho/tH7"ƳefT/qDqCobWIgjSJ3&̈́>)c2bci8T_H›2{Ԡ6>8np$nj/=Gs}c/0h> I?@SfєTr$ZsˠՏ' rPEj4z.]U~K yZIƳDb2h"l?9nNA x9/ //tVea ~"at0LçDsHog':Q4ŀKB؊F>S+"y>C5ꞟ_S_!1Ҵ1aCq|GvoSd6czzWDAofֹ"iY4FBOۨ:Aɽ69;t!Lg\f1 #b64."t$hN$^X鰲ZbGNT+lzܩb#;./PrYL4u\26l : eq͹Exzߊ-T)ѧE>hn -Hk>)JZӀm 5b^iu;SJr6(I ik]P֟6[tO*>A<{D'w۾>I\H4qxJ _}o5)]pRAedehW7s,R:+am0Kބ5O) :Z#Ҩdqb' lY x@mWAVCج mVhwը*x{IS9Mi,PkYKH%%ٰ0:d9F6hH tA׎H>D1CHTjI H?J֙ud>D1']'/+Ń$}j8%̼BAtkͨl$y#hyԃj?mG[An:$q9A@لkqe8V6M}s$W%) C<W'nףѠmMkbʎbUu[WVW2Q0J?ߦCZ h9bR|$Tdih&"ҸћAJVKDhIAC$^+WmsQt)}7t}NM!(l`j!WO&I($]X j A`Dh"u p{z:E`%o16& M$p @Y)!Ʊ2Ҋ~H JЩ:!#HCqaM6uy 2J[49/=XA7 ?E]M- %;zlq%XO/0kft֩bƐcoc!>xYqX< kFNE*KavS0K3#}m~ +tj aQ- $6ᾟn(VhcXoQMo|@9ľ:a4x{~AM)$IL-1¥ by6 IX_0=G(ry̹I0+'}X#9Q9fJ *6t(,uM[>?rF6CWC_Y#0%eQh9jiHT+Q sH@P{X:~< .O.5 CɇC_ sΰ~,'fEHjj+={, L^NJFe|j|t*tDʕ'Y9Tnx (s㳈pOp{m ϱ؈& \SocJS)]G؏JE{h5pio(l+#S$oɣe3uNۉ#R 'NqCETrp>$@lF*~-$xɳn4z K5}R`d1Q Q#Qe@lBpT6Tn鋁 :atouoڢwM[EiX%6~*nir mj3I(Y3IvLk ]_cC~N+U*5hx 0z-K%QN-~:J0:{b hاzVc 'zu`,);a+BFqn ɩP i/n#c]~ʠ{+x }މ)2g[-̈́\1h.zh.lM0s^KKYIaR8wdwyi aU&V^.UI4bWցݚ~CYG>XȊ6z0I\ Ī|SY1ݷ,P^GAB0i_Rw 3a~JAW{u46"}'ŜGx SK5F01Ir'70%"Ś 㒽1Y"xg;ޙE xgChF.),[5VD[nEQVD[QeDJġAmՀzd('T GXSG֝G_#c5="_#Z% +| C8jGUڪf1(Nt\w ')*[})fcGeab'.4{nU< k)i_*Yy|J<lmڛ^9|cf,k8nsxvʌ9鮟||K׊/QiEQ1Qnj{E72z*çEsV1U ڧfWPٛnl( $O*ܜ%VH.eS)@8Sa(:vqVJR{gDbɅ?O샖,wtahWAJ{/܁񂓩{2r+% J"(VU0Kq`F? ̞嗙s4hL?q,ы#bأǦڎT'[H6C8}8^~ .e%'gRLjgX$tY̤ )ni4F{ EѨַzs^hOMSfUWZE>*KjM޸!5! >q?)A祳pVs!ц2>֐XC Uw L0;b~%zA$+> Bəff484:! W輬ިDlotqz{o-Fv|ѼѢhb>A4+6\Yn??5hf>zyAG$d*땃w?<<_~~}~$Ƥ {WnzQ v/dΝzv?TnF+fo(O1zCkHG0Foj9C.v!"}+F@F'll4/83lCEON aj!7kC/ByFWtcp`{䰪N?_+0^y ~e\qu=(%hx!|0}¯zTfi:enUfSv<Y>D^^ٞ TщMdmM, ~suN_(+~Nxmիp.[kt6\P蘭z{4e7dhZEUϋ=[rD)-9wf2[=9i?kH5B:ƪn]ZļVeaoBn5̴g(21x_gQu8vK 4^cASIgPލ$@#yu#E1Pn#//"Yx.ƲDM<fO4Z4V5f>9״"}'m|PԸ6y0zA=ݦZ/Zgc U#=/Hf-RUe.t$waMEe.3_YOrƓ)7I~k:L,b$Eģfj"rq)ZYT-|Տc|ڏD)y9@c~.fi8럿 ex|T Vͺ}{p{\H Ycʣޞf:0/w3=Kmg) a;n( Je.C~ɓ3{i/}2u2>Ԛ5sؑ\erv1տGWmk\yo0&|]YIMH-0LCe$q0 =-F+=&?"'>;qԼL~ogbkIX<=Pi]^o^lp c>>Fq(ѱSMnʱ&.KIvpcoCTX nrc V:eGS#.p 4Ŋ)pQEVwH6Z25g3`UU5|:Zϡ~F >Cu2ɫ A0P:RSeanՁ "2~ХuѷdFߢқ` r^0JA#3"h0ޯ X8WAZNg*M:2,sN.С$qp/ͯtiL5CͿg5.i75~iqy._ԅ#&R+Y!ihENdkbi.x H lMo?b Y"T;~D]epҚۧt~WͶL- R I®"A bu2TƺYPs3ڍP0+~pVe0pTh'K驔K3+#aB>я|Ǔ 1' 6M{V\%,ML3]zwGFlg%,O䝇(6vu5>Xi~*jKXeQ A 96Z w°fEmls@ڣ O}M{i^#remfK6VAѲ~b[C ڤ!si;Q)B"N2Vw8ND }x IA\,'%5?$[sǹIРlҜ3V^R@8H`FC\mQıi!t}Iw/(NZ %mѮ 0 ?1o:A+ty(Hw#AWn9sk>A|sŒЪ#!u.cN6xg1^wCͽ#JjU=ԋ-7]UgYAM"r Z,m0>QȻ2C_^זּ׹dl±NEM, c7aNpR:F!lb$IH&!.%B,3Bmig+80%B6DIɏ_'~i9b:FT:%JMN7p;F©Hg4g僩q!8U'Ɣp 08%)qHL˿%RFI(Ce:ie0k9X-y)ڱ-6hsDr-Seh ?zƣãȢeړ9,Z[+V/ԖCe ܹb ηoFC1pg&g\{ب{nA?sڜB!"O39:y'=rD{=lr<ẉD r&X'~A_IJf̛H ȸ wUL̆49vx&Ck4sxẺh5ewPtهjО}a kAd (! &] kh(0z+ki0Ǡ'3 Do5fMHhv N3 e#M? ( fwtPQv^dbz!0n-l}&U6ʵ{kӝ@Rpjj@$,ʅo3CbmGoҮw1@2jS(}D۬vIo M_& tE?ޛ}aF٩pwҦ 텱a(rͱHVսt1EȶSF P෱ 2 }]ӕQy2ߌ`l?ژra<0|Z ~Pac_<R0qĆwavAhARinTuK3tr  u"k_ǡ!;7c:9뷡!lۓT^J[uz g ʉظ`..{q} ڪjUfcvuY1ʲ@w5"5fyXؘ {c&h@$ Sefnx&h0 ŪKx}T["etSTFL,82ZȾ|i}W8⳾m_-X'򕛖20 ɦ] yOvHv5+x7iQ%6¸!4)ȳU:I'3o2KD2Bsf>R&da.cM.%@2S$@k[UfC?}\]Bu0m0]m/b#~ QڛŬ9v\X7$3/9n{m88iF .}00v3.߁z(DYY{"ɈH3 :5\]@@@k)"vcb C9%4&QsS*ey{?-*g P׮ ܔN6 hO.!ϔacVv y2y(^=$ V f;ֳd}V?z(~C7q~8Zq :^WϖXdtC:Y q]v1!I=@4c*yd4`48WE2pTӨB65LZU h< ._m h_rQ|X{Sʤ`~BM6oNDA`Jӄ (\ЧasMո,V#H,@OBKc~U5B 4{g .~GSMc04!;h# s 71w aj+ [^'ٻYa'45bޭzPjx歫#T?CnjRB9p=Up*a5f%rl ʹN%R %R2ٷ0%}5梁*ʀB+¬ւBaZa|޹[QxT|zhuĆU8L2f\D{QE.6iJbR9 y"ZC%S^[h!2P`x7C~pgzeuO=G/p+vDQ֋V6]LFv+&;Կ ;1^Nv $v 0 #9 9ehe6/t6!5ǿxq>пމv8u8~s \HL#i`knd߀ ?ĵP$u cUMb:ɜC<|N:I\'ΆUdfY\F: N$Fu=RX/>Wjj'1Mlݰ<)4fޔoWb^W/O?ħ2O*%t%4~30g43b&мKM-gAyhVhUA厨:3ՙS::-bV[m'3]mV>} 40r)3OSYm*323)3dRf*3{mq0U Sљ*sZ6ƪ2ʔ# ]o2KN%L}*3*ʔ_Hj3ˆ(N{2o#˼e7,$&|dr}X,3XڇZ'{$:3R!p )923*ό֯<Gyf6 F5.|hNF5_a6D/Db e XEc69*拙HsD/Hәg@a[fV eWc`TȂBvOVojW?RDI;6o P-!q+^m&hm'4si߇̩䖯8P{h^˂G[WF60נQwhšFxFU 帄 p#M klZО=gܝ~t м0B`j;8"jgA4C 旝Dolz5@4 #;1+V31d!RnpҘΆ-6"[31 ~.6,9 @uH @9גT$HY'PJ+hf TG҇+KSZ'' @8_-HG:Nvmt>oQaysũ%s}IPMlۧъߗlED/?<­1\3/ha&)]Ռ1}I H!gȽ{[5rY%{ ϯ[dp\F`)3 }a nURפN%]qf=eR}m\0ɝpuz$\5bU dL:uTڱ]qMg\ awm9u;՟eez15:ԍyV{T $@U Rx9pX>}-L;qyzlY+:JXrj9T_zuq;4p/5A&?VՠZSm3\0Cț;,vQ}UUׇ h<퀈o"(1 |d 0>Dt.|^D0/7 ~\_{rc򷽏!ub_  G:Iْ{#.8wZ͟. CY9KM$֟.KJ८,{gS6Sq櫋-r^;.]QlJG6b4r{0.ȝޫz0gˣnfЄ[YlAA ՠ*p+촏PV7g8E%x%:pos ]u-O}'r_C_y}@Zqn -r [-eҌd4{J*W.׾no.IBOe 1d. =`: Il;rqS:͂+p,S-2d11+_Ǯ=UGsgGS7ë ;;ʠMswb +NҖfdLwe;Iae\ >Z;dUi@ÊPd3|. N> =@Q;Ǿ u=bxO` 7#g?ʇNy­6df].cFT r=) 7a6-NARA[idϦMA]<=I|w*Y5Y|i1_G'+m= {@tc+ MwFd'fWK0q0WxJi2m =~Pcاt>oedQҠsƍ-PA7λFIZDž%pQԅF)f+ 7L$l\pMY4!1Ud",Ya7MP(_Jp.a_.Q%[ˆ[«U\5+zVO!6|dPAۭ ^ʓ Vp"@d}p]q9la%cAKP9sɎ3 P'E{%Tad PUC&fN>8SORnzB "Z+f]{,ځV +›+ıX-VϮPR`iFз'd+b3fNWՏZ*%}1[Hק;]6+#>Ôf!Ź"Z0h&\0V6iE^Hׇu<Y,'}]gAIX[OOnBǧby-BƲ|4XOltr s?Yt*F*=cl1O"{x>Kxnj7}F?ءCe3'dz'T "AT{w3Wm~~G? V1盰0OAbP )u#οM2<b[_aP~8PH .VޥCC0I5#iuje%BN2TW֔ayb2(\rµ ё0 x-T^q[]ĩ-r&cG#Ķ:a(Izkrb\Z8fNuqUZq;P*jTkLv`p%[h .al9\Y/gD= =j"P]xwĄ0Lw!nNϘ3|֚DׅDM;*&9+#1.a%:gR̓2`At0kiw卪>J$սy^̓ /އv6ꊝpkcN.t6%C~nBIJ&:T^L4-h+p<M6Sb3ӏt}Q~ ̎cgE&EL=wZ En1!.C[bjn/'L p$?Zh9gP0&?! 0#\?9o<\it(VZWOB=rV=fVգ`sqVVI9zZd5)v%͔+M94Iw.LeP޳h7,d*ڣ9HҿF^C@3#@io ` J ?FrۮbO $ Phd-C v^H:plW(2m+|7sx'R[SVKQ!⁒ƍKqEԇF Pt_ɴ^Q {S|Sd_*E)%V΅Q輮N  Juۄ@L76“׸j'ƊgU tKYN3k7nZ]2ku]Ī]]>kKK'Uҹ票-'=VNWm兽)0&RD>f{0%gþ7bZyb-j;1}RݟY쉾f qfFT/K\Gب90KDb% E&T^~*s ,;籓Iy'f;p3vnGJEdN_k';v!;هɎ%k'uCv絓%w[7vol';kFv;ydQb31Xi;[MX7YLؘsbGQTOymb6Wk{lb+&v+6Mlimboa&xZYilYllÒM*Eȃsmb_ck=傶V'spN}WF zҥO{,=飄DGݰa}roe&[M;"luVV#n{ íq[э Aݸ52HQ&xka*Ƕn<ecӦbڎцBRx}^ͱm2 DX]qB9B,i=1Ɲh܁G&#zפ`BCeˠ/ںø7S^c^:5~S7DŸn(t{V-bs`2Il-b./@n$S#FQ:ض.rwNW<%#AA+8Ot! ? ?)uHuOPxsDu0]a` 79G.h5v= hFv>@sNց@\|qy'* ֳc'ձX̱z$s?t 8Nc.aMwQN坶n9#fKK8$¥: lKEwh}y10yF Y3,ͫXDQ%ETю Gſj]BȽȣi 7'{G8QBoʦh/ʽrUe.W8AĝY a4K & !lղ97*I>w&QʷwBX+D=FQȜ ߱ ̧ τlS5hhqD/S.svբPl3NŁ"=#v2ܕp#wtu{'T_ʳhq0*q:hi0he KFh2Wi#dB_S̿:}:O#LSy!+Y*Vił2Dz͞BU\^띠\!ǎ9A}X">׺e7"1D%8k.oC.Ct_\{e_XuX_IkkpjX)d]`qIigO;~,?R0P{K~jL߭0"Cnձpۭ_AC+.ܡ$R}M6ݣwb7tmkx;xx0 -=οο̏9{s #o)XƵ4ToZOA{Ykx*wef%;8tﮈ RpQj"2]T RRN {`.㲊r FT]%AOz"vVGoso`:o{c<AQN`w[W w'sۤoj'{FIh-f*Ws]=ƹ.uJ1*ǥvv\,Ӓ,Ս'z Z`BlUU ~e"єqVďNDa> b.JԣK]` /kݧܕnL1]k]`q^r\7]~h=K5]Ծ/9 ^m%A8l0Xulj+Pڅꒁ|_+}:vaYLVqz^9nkFʂ|U2V?@D4d:]P ǎPF3g4:RNqUwwc̣3q !}w?+)Z1|$"$l)pqĶ4TOt9)m4عD t44cqx[uoCHƼ7UNm353'PoCe4-TfַoF[>~ͭײ2&ܩ%bs9%j3>hqƥ|M"A_'t5!pA }өD|m2p iJ^˪;k2]dӅ/t{t[`2LD ]vX̼ icj!|">z^^ {p ]}//Ќf Έ̇/JdPǠ([W^73 %$RIJylHDpg&)M^ ݾW3.W{69pВ CK( -(Pa\BCQ҃=Lv;,̋cvXay!fH$7S3).CQxu+ܣo/i:"Mh|`qHxwO8\^bOR` -JH ' )#b^a%C&Xͻq}S]v-9M07NGuZs'w<)~̈=H3h3[qgiaiIΘqًcHm %o%ؿM-z#a<@"<^`E 2ryW n}6'jъki[jl_&)J#!N^Ee$`ǎȜżD=ݫJu,Fwf+i'] >(OCp"ـ.I%(\CNI)H1 Ɛ37?7> q@0d(Rб5yӢHlD lyjUuV{ҔH֚@~0xw{S{wsI%g$pJwˆ.$@* G49`,iTzԽ1r@ogHF'$fhdǟ2>I@Jʞg/gieh ;ګyZ]0@ 19PB;5T}9b0>΃-pw>}ЍmA0a0?b#mAV"9 /n?wzr\\ _'.~wVqVHv405:/Z>|#|:EEw1cƨ_~X50Xa&K_\bGطl&#m&#{@"Rmc3Z6$Cs'[[ @p$اE+ko<@w S,Bit{R=|h Q͸T3&j340% N&//iŪ?Pgl*Rr1id|k/Щwwڊ_޹"k[v[-qe+ڽɻi,""LS`|jPjIL^A4{}y%?2Ξ$&_x[ 7z>ӽ3{go_1&6kx:&a7CK} \Te?3je ْ` A36lڊI-%3F535i-k{{iknwm{QPSPS,R|iB4ތya@۷˽0o؅FKӟQo:qbmDot=uo-аoV޶- v:ZC\SvYW vLb\Zkr/8~>l >IK+?-Fshn .z0wd)9NbtevSP0;$Z( tޱ܆srk>˵ ˝sXM\vX)-Xnyr7r W aC22+ɟfykv{)ggftfϢ[CrBh=t T<);;ZyR7c'l  q5Ntsz}XQ]ƋwUׂFXSb}@1%c01)aPһMѴר36IR 9/Ģv.b[ˇӥޯ+OGŞJ@]D)'p+]MS3xHϼB{O D1\=-owqu#ԶT $dXQ%<1?LӅ|O#?]?(o"ھQD&/2C >+813tZ12CRAp̣ 'LorG==+s2,h 09*ѥD@=AW+,R3sOH;.\w&ӃNV`fʕzh˕rQؚoIc5g+bi̇\w Q<+aLo7e/  Yohyb_BôE/`jzrVaR)T!YcR a10k,.ם Zh-bڔ_௞(0WtSßb`~wH }A;Eu!BC lVZaٙxvzv%zvILF7v0Qq+~yzK$ɧ|!t\w[حY=ZSiJepQ!gu&C7zjp ei?k{.$cRP7h'I4B2ª2b8pi༘-cC*&h Pz` fsW~-Z VͫEUNt'Wc0g^lO4{Nw}q~6LD0ݶte$O/#y Ps~~iTx#ݸ,~3nC ~-j|V^$@>^̌Dp5Ly1XzZ~ d|m(NF؍7c4W+`{, !oT|ޛ;w$āT|q G`0yVa3s0?8< lACrݕ5/ée({ _uAa0Ԡ÷~Z.2Տ!ԯ[wfO$|mP 3{hy iY[)?m8/2i-fob/hQoJpf{sRKȲ$s!A:*CL̘m3h:̶1o/Y&_"d}i},YL HSޫP׽(6Uj.iwg_u|33뽹 ZbYh1rc=ݖMe%&}v-oZF"$xG,7sdB|KLSEcZ~e5'X<50jdV͈]k=}xlUq)@Be;v0z4 LYSG&|:W|fp ˊF#&nL@[Rg ˍ&mWi G"›3ICq(j(k 1SHAN7TeN Ry'tUMaӞiOouѨڳaM -_K#,6D 4ODϮQym?[ChŸAWE9r"Bx}4 u5%dKBXn0$X̏O^̠T<}!2Th~=8%U|JD%onL+{ɷ?8|E@߾}rSO!?-}7Rǘv;/~9tS׿:ɥ]i0cagIг}!i"HgRV ۻ}R=o|U s?8^z2tyBJmK9`?w?0hJ(ĔдXQ8aC8>zx5ȲvYRҮ2X}{# C2],FA"^}xD \+z&^-[ 97_B< 25j"JDo4j[Vp,BXc[X$pD0,6BD(۠MoV mps6v1C TE 5`unJ`00z5(_x3#Ļ xrlvxzxe(0=!һg;͐ne~c3]0 6GP;Hw%%K$w<_S?`FL8XZ.vH`wKteNWY9C[P'wve`_r\2N-N)'\}f`0 #0 U,RppNC9A-!;rC{Yi,In{v@?- s[\VcǴѹV}uWq8A<݆az>&gc¤ !.O!!p`wD ziYA5Ht9JY}w*)~@E*W* '>ңQ:Oҥ>MDXG'YG7#&dsut8cMXG}ktotZK-Pl"RggrXa, Q{51fy! ;ij ѐhHKRޔb]=>: n c>:K}6>p"}t6gģ\p;by9ܣ_3U?v9ud#רC/y}i:͓[u"մ1W`t7"/lnRm R:ٶ{ck^1{ΠَGc> 9a6r󱲆)L&P= nT:0N=q\8sWhcVoŻ0b"Ɵo?bLo= t& p\&&_-i$9L+&[YCkߓ17u@Ā0"xF4hߟ9G_k {p?\嫂[ۙ_q-_!D͠qb&k:h:u^x:FRrNB$ '?濯:+BtDJtFJtFJ4)]@;og B x?:Du:J ſ9+¤b:ߖ$Mگbg?H-JbHnK+f#Gگ+(FD\o4߭C_(S_M$צn!id.7gmPگ]ph~O~äB$n {si@3¤dRȤGn(K O#Zpipik+RCɮ8M@OP/{RhuJ"u,&DoM_!7vvX^~E+IƐ^t?Wz) d0]7k`M?__MM<%5JHɯ]3~ˌK%M꿟 \~'huGHo~]_O_MPӯ48o5#֟a %w"Ui~󖠦biOmgn45tM?h>s#G !YAsWM? hD{c}{o}5qtѿ/]S͋B٫ ior#ڸ_.Îh0Gv8~J7 P%T\NG_ɗ[ČȢlgQ RXG4?[߶\U>dΚȘP"5 E .g&)$w9 fHM1\>k!yHWiJvzPYv d2|-wę -K%"q#b={s#)@;/;CNU+4U^ wf@9;tr|@b啩g]kࢄ>k%% (2}׾ЎL8ROm^ђdQ>$XCbUDTU$DW뎊W]uGz]bؼݺ.o6a2Hv|<}lXe!;Y3o&$ɻ*Ji]Rv-6g[F ۄ7[u/ĬlߤFuhjCi#g\-Pg);$#7oVob,9[֌d;OnzT+0^`+n b]?E(cɗewŇ!uIΓbͶ[APaDŽ(TF UAy}#*pv嵛+ካlҩɎF }mw:ow޳P7y]0y14[K֗|CQ6YMD{xxg^d3H"1 N K y:z'>j{>o`}ߏ}f+qgS>1ϻ;>? 9٨ϲ}c>tѱdb%G.&,uϮNN4p쳒> |!|O}kymғ5M} }b'm?)F+O]W&;BCc Dr}b=Ó-Xkgx_Z&$d,6CGZm8}8~ۦu)xTl}LG8_gfYgbd&'Bz Eg3ijg+'3]lNϷ`zBg ʫ0O!/\OtQp^+CTd-1g͞f-љ=*0W.J)9m dB &s=RW(|,BAr41ޑs1 Jp6чs}ȳp6N8:X-xvZwr3hefD=f7fcʡp#]Il#+ݓ:MǬܾ020~dLK #ac}Qy"l>_@cMN3EŵЊp>j_,$Z#z⑽o-n&@T: ^Tzb)z;X3xm(NPLBޗBӮPj=J˪ހ3J"nt% ƶ: ">X\uJ13iA},}bl9ON Iu= uBzs3Nw nJW5滕VСqh_bmwK۷ힳnvt5 a6mZ@IS{ ;{!"(ns>!z ;#2{fļXHo]c$bxD>#_db2lBzNEp/\o^H;OF~1u)'Z]ے׾e=toqJ;&iEbrQ&f7VMˏ(^_j6&j[| z&`\J;(Ə²@]sa̖8B5z9VÌqZ@lCpheb12Xr)"3s-r[p!w:;UEXp1Ypbҧ_i̮3nh7|aR>uXy-Ecql 6Tobwv0JT(tـAcX;v%,[JYFi#7Z$aJ &|D{g#[}wZg)8w-`kya ߷@Iݢs˖U}≠cCTרxlzNN[}ʝ[&lBs>ZrX $R86wGƣySMP{8v&f9k` ,2sUG `dO@#X<#yz'|'Pvi)a.wK)S?̰ ݂+f#p<tIr{zz}/,fd Y_1/FK2- 9[,/]0=aٶ11SӀI?V -`L AfYc1u4B%-ֲbrqwM.;r|ʀ[&_mwXsњGt۬7dRk}`0[eb3"mX.n"thx#-u6̮]!mWןz.>06.vyhp-VAj5f "+_xPa`u8pY>Tʺ~!9eY7Ip/B.n{he[/]VU;3<=7\6s#; nB|fI8IE⤎C3|YݎK(><hiU!f@z*gtQ,rE F+ncQptV=C]DQ &.B g.^Å*ې*Bu 4cВ5X2tf1l :6(Æ.Ćp2x p8! 6t`8 y: Y^†l)@x]:6D6˧5lؑŚ_uL2Æ*6N7 %̗?C Y,UW.iYNE*z>=9F2-DAGde0D @ѱ IE_"J#@TL qpz)7D nF,;G/@dQ^X`Z>" !A8Tjw:gvgZ'P,_/"v +J*}l%HԺ4u)[wzp$pܩ\ÝdqbĝnAXv) %2hLر71p57ܪ'J&4v&O4a 3Gn2/҄V54ui^r)ySJ3>-NY`:ۏ1d.71Llj:++^9Z}Q4Dbn#>((@a+w ԉrf:ŴmLiFV(p̫jޡW9|i u|'l⼎{ m 9 9<7tm$:4Z !>b@T-n`o =b`p_ph2&IZ<{1ެhfPt77^ ,M3~^== r@KIe#*V@X~ɱP@T(+4px FFRZwsgE'(SFP**A&`"DTiWA0 5$5-M6h#j(}  EPByg _sgvםV>Nsws=\2+w&nn&F_it7|o|k"! 0I7{7ąłUM}x f'k!!:!oIa~s|c ?4,qۛM xK[Ț#x3w){{?@xoOi@q8ٽU>9'xj KYF$cj oޣ\d/$\)،^1zcoѫgѻ_0zw`d[^)CI,7FBw͛S7tW+Օ\#;o^DZ4Dnxj>j7-uYv{lw(ո/;k~LI{Q.|,>i{t??; % KqPw&fYZi]^V^:~24e|0p LIx? 0ԟZJNޅßj bOC}~~oG m&< _72 ؒ:z\w0Y7Jm=jw@*D[˾FtnkGfנ^Ż$Xd]ޘ-= Hb]UP:p\W;ױ4X):uyz|.u\Hpw B k%R#wpz 䫩AJKG)T:PZjGC)zCK] xSeNB ?D;T* $xZy .Hc%833;,Qm!PD.p+msݿ403>4M{~X󲢜VeH}Yx7R66RtV۔)rs $r3;)]mH!A-HaFg)ak0xڢYs/!"bKIRXa'N0vJe/J7xDG,12sywwO9K3 l| |&3eKi5j siW'&U| ?|>Kqh-[wg] eZ4͝?Zc'd@Vn't7{O4m=0 upsܺ^lC~girع c Iz-]-{ع6N-C _P812 y_݂{lOG KZfImLf#fCtOͤ'~Kc)"`]&H<7җ*T21soQ|+&Unt[8ƝϔdvɋŶΚe;Mq ajcfQscŀ|w&$pq0q7,p"V"fbkOh1z}"RW舔yT WMBqP\\ ŕ\OmkL4Oet;x_vqNw}nzy=IHaTuM @<@u3)l AnIG D:{pv!KRqT\n+e)j~`Č;]Xs\xy'C 논q1BvkVQzL' ʕ j@x8&b.JlFQ9OY?Er<bK` 5ŸMEM0NvԘ#=ldxf^)4@4~U ` :ZV Z `bUT:p@\?Ѫ'Aײ5*^@iͣ U0i1~Ol f@M_~hMIL ilۢL&Tek)Fl{f놇a<COyWcUyeBx@TSuD$;PugLʻxX)6e^&sT^.2vJp1/M 14Tmj1,fqpE'b%OMWx4fj&hi"?n?_75zz#3YT@ %_,b>ڡ[hౕ1"OZ ($ (IoOn]nO<9gotMՎOv퀀nK\*Z] 7[Z V܎xsk]bU5' eu!x[$AkQEj ϮƧ'WyQզ&ZqCIâBhoaDms/HvƐMG}Rx#x$}q'xt1لy`Vxz *Ǟ+'YO3"6A%!!J'W=gbZ-?k6qo>Yğ`^c1l{2oL6bͼC`c]ƭdљBWk)e6y3b66Y:MLfzR{RdF"h'=JuV7V ;wP*m֭``=N/|! vmrs<2mv!҇b-YH%F:2|'>zپ,Cq [dg;MR,f mh U@ziH``oOu*؀_X $I&)Jtgpc!L^ԕH N0C!(]6^{pl~FMLn OF%n6I$(N@) (4XtM2I*8{M={CXEgR;srLm ¬[txD!B`Kpvhi`WU Z0@h:ZvHe;FPS 6La%,-[֩¶g!y%&O a,|fD /[ou֘N߂5xnZn( $6P7 $A|5ʡyY40ΰu*NO:qjk\F6&%\diMco*;a`A]݆o,m"ǴNp" jih)}xڽ6M5pQ?x^g,)_w;4ϰmMA3hOEr RPYWDVb :^{0g`$N &=\3u9f:R9W?zv\Xa``/ ;,tb` rAqb@*Dw\֊ Pހ Xe)?OFŌkEb]ڀ!C? =23{AU}6!iy`#AdQAxڜjjh>\ М_8?M'\ Ϙi Qϸ=!ZQIF1zRʙ0+/c>tXs?rxjwir4x ۭC V7TVCa{U֊ 1W|\vBE<h(BQc'9+7ylPBnK0T 1F ui7Mf&͞<С s-,h9Da:9M>8~42wvڬRu,Rƒ,& WΧ] 5v|KvkōA#- ݈:'064%xJT&|k]D5cB LB1Q{I4xd" 4Q*d$b]Txcizkct&O'ES]JU jkSܠJcYBdDDHtPo# ~1U:{A:U>\v|-f?Qv7pbxPLEZl3Gƽ]ס ^$/@KTZîL՞.d_?dY#I䳷Uā8p٬rG{N뭾PC9m~zPFi,:Ş1qU0e=0b) c5a#ƾ{g}$c='0v?c}1vScm# cWi{>վf0Vs;tclu07"קi[:v-,߫vuߏ`76Pz^wn'_(6|<,L~n/l,xg& %?okT-4IB BE*q߫][ЄN S\[`-C&c|/(m) tW\E;Mhsܙ33gfΙs3UPhˋm=ce(SC=Kz*;JE8pX֨=މ a :Ev4cc ?W,F,|ƎlҎ.#PCaxwԲbI _MY> ½3dk6Lts9'Խp\$5#`!`!dX0wG6r3ۚ ۖˈx:ʔl]O%:=`o˘qxN p%PT>\fs82[334*c'x ɯ_/%L~.;%.pwx/\&{saޟc^-Lβ'\ `??]@K͖$"%u1;cҽS{2݀z7y'4g#ѨAU5y3 q!yx  ]}',Z͙F []Jj^xX0AUzar"~  .j*2X#1ؐ/g<@bќmFN gӑ(>Yj"ԃy: j^ /5cFΧ%Uԁ]T?@28e Ϋ@@j,8JfZJ+qҨ(G.X~*|vǤ<J2Xe+:+S:Gʨ2S#2T,oM=Ͷ0ً*ϣgfPGfxW6m =̊ÂN'[!+ȇ13`*Tq=AӯbTa7ZR Yi6}+ov_Gf dsecO77_>|(FBٍIZq[%>J G%[BsJ]ҡz"gPqfQil]E<8H$j^gjnڌ q>n;/l IZ^~riC}B1 4E&tii@. gZq-q[qX "~TmdTx6j6u,mfh\zf\Џ7)E F&L8>oU-;ɀMwT6.IHe& $7.ewIi*띍 E!EH%"Q鷇epS@zK.M@,_G"/2YsK,1)~I,DV% 1j#Do}8=B}aw_JiA/N_kC&<݉1}y_S .XC'۔iW:[ZPDI&_"}8K76 e}r鵭pT]z G)@ 'L0L߈{c' =g321f5X{)0&9k^WD(ΎMȱ޸\Pv+n!Fh9 eRq 2 !0\ܳնRcfC5;?QݻͭUTTGz@Bk>5U88TOJv kZ@PUm`?RSA#?a"%*fѽn MQԦ+4uZafQ֪η$NƧ:z^J:JࢵF5ߔmhwΏAlOu71disMFaO- r8H% Ii0CFYahtP}N[15XͰ]@ LB+ 3s?]u68j2spmثJ.zM:i(rq2);*NC-Tlw+B(͟n7xVﵚd()X6"' LȚ S jsə*1h*1B%X2Ӧ&ˆ( CN2OK4`hQB8]&`ᅲ]cѿn||q@lp]lt~~uO&%{zHV!x/-$@QBS3q:2@Ta=UMU {ogDp&Qj%;$ß)2bn5n 477˒ #1 GYD9?)ڜ0ލiKr)DP.^2٨Eג ݛPʋWc:#Qb-6~^̪n = InfEeHp#VN: bxN t1QFy *7QoFZ@6a?;&-l&ϣcY89VwA3&CASVxQ @J(]G9ύmr?\oMr1oW v]BX/o2_;'7ރ;FL;2;kz}pS<_@437o{yɄ˲)[mHF]iJ@ϸ=لf?ǂrzdǧ-y QUzĔڀjLu7޽}@AK$P6\H{U#`OjnՀmO"l*<*7/JxF O^4iYp+Zd#P^Ҡ\d3! -da^^) cXwepVftYŤޅGpN߄/\EW6gG-C~aM}YV!LYq?--O2>oہ]x܄G$B^S0ZU mõ]5( @yyʮxw:/)C2j% Aw^d.]juR*)|B6W@]:3E<|%E,* Ucetc<-R*\޶:Y +5D уԈU\CLS/"..9/EW:y^reNxƜնN`xbEm>uuT^۵IQ5f#c>ܖ#CQ;٠-O?ph)itn7ovYu#2m)J|{Fߊ:F?X8glb |OI`*Ze`[Ukn3XFVلp,ƭ J`<+cH. zWwxyN|D̽O}&1*HݗWX+RU5:U:L;7WW[LeB:)5" -k2@5{Х)|0@5 fpp%9\Z?&j F :n:W8jAK ҩ˳7 7da~C3Uv lK'ŎtF7d2nGfnh+҈YԷhꖈS¾cmKs4T%M~O.gwEPI<9Lb0^Ç;I$KM1Ym_KaPYg3xIFnϝF#$;yV`_Xx7{q`^Z >,Z\Dw!IШ0fdf'<~n` -$D6Em`|#)NOn8-joaK23X(zJ3 t;T3#Wlm6 w"Etq]+K9ʼnNu틡Z]d*t։NJ8%a&F\>Q=B7=%b@Yc`u DmG Y6>y4ڨ< } iHvs3L\1n4>1Ri;Lcf1V3ukȔ?EE.t'/|J7Ny*z@wS3uTۊ z Y.~<ӱԚdpF5F.PHV\^,soI1kz FcWQ,:)ËxjRcw5ܖӕzos9$"wu۲21YN25KQWƗ+%א]x^(AzE;3#|v.Z% n6;ho*^?@m}A*"p,csAC5l@ E yY"`ܨIQU@"|Vv Ȳ892S3|#OS36@eSDh Zh\! -WhnLDz>GpiShɖ,߃xvidPƀ6faF=Yȁ|\kDIS5qƋØ]7H\@&kPȍ#&36NCtM{EPÅ_[S{$%/5EORI/VJk$')yCG<?C&+FD|4T!ԬeA>ޠw_GXt`A+44DZ VL"6jժj@'( %"f(vݵyAŸ)<(FqN>6BS`ҨȓNc/eQvD`1)( G-%8?t6 UI~ c m,`Gsr-c7K2*]=S."&Y'2UQ *DDtYDmw=HS:JzD%pͩUڟTid4Z>KŅ\벱QZf^B'Hbxi.~ ' *{7hD A] 8|1OғIY\ިfIqiRr}j/h1Gp19Vo >RI+rNd]DU=1[ 1V?c? $ >+v5iʘ58CWQjqXb|B XO5ڌ؋FoȰeVlg)z[0I7MEhu73gglkuRҌ.!7ӂ2W Yղ;#ԃ/b\URy*q)#Q#F;w]#ti@}֖,nJgT[r;/ID.9tK UH7Yi~MR}BOc<| (sDV*ܲzis$i8/oY|(o$mjC?p5`b6hJ҄߀tq>a! ~[l𷟂} R*+;.l|_1xhDqN5wQ>#{uZŅl3*y-\|ZE=1M[^Ϸ>Fsv/1%zv2̇ .鄍l|/(vqE;'j%7IɝfU)x^lx/bO2 $W |""{B'I cD?L"f <&C6Z8{pxd;ܼۡ˻?.hH9S9bSgK8ejSXCcq%M.3 :3Uٲd^F誜\OVYa:;X"\+mKM ~wk8Kɥ,l0٘zӐ; ]jWuċ+2$Ƅ`)Y܊[М$j]ȐAN Zc.Rȋ2n26 /ũ%ϡ;|Zښc>/#ĝgKةoUzc|R]|lYL ?Dj.!G REvPJ 9i)'s+caBŕ8 (/Ti .N-V'첏kH̾@ Ts4D6ο5 'dߕ x m0HddaPw2ؠaS̢` 2&1lJ̀\~(#f\o=T8HCK |SE84I[ "yPȅn0|T]]QTe Xv]Ww}~*O>U"*Vk?̽IZpHsܙ3gfΜ9s9˟4!e>+xK!}3mٲǣ#>1ds`\{vZQR`NC?p;) I5$K+n3©,n"^ K"`7 |-lVQR~:'77ǧ<&cIF$6%SҀBo/y47u̵D"Zkw~\*Z3]1[6}&]2V*u2a:(6+ Wu{+ eNfI~Kً)Q-1ޭ69 .ϐJJֶ(1xƆf/P+Vt5̣^Թ}{̅y)R^&e:Q!9??, )E(FI,FeZeignR7Oiuet )(`CօSKĴ ^ܚ:MVʼz vmR-;kL܅B7Zc>JZTz̑;̎BnJ[~hO>/t m1¯J+{Ltݾ3!IhǷM#$lgfxqQ.+e+_lDql5HiѽܾZ'ݦS5Km&J;ԙn<T`S’/jxWC`lȈ#q=g8tzLQ(5s y5/ȆBzxhu]hDDuPĕ@@Pպ)WkTZ~nX̲F6B,t$XGp:lp8t?!b\j3P\F`)V{xcI:L e[Sͨ&9ޱY7zr%V)0%^"'DiPa:2wEKxjSGvډh2ifrQt/x T (| )#b?yto~T 'I%zAoԻӣ6zB !+/:C=AV0x61Y1[Q/BLH ?L^sΌh MaeP~գ!M;sGgz"Ł~d ycZ3Y8LBφ>3F}mu)v^SS%S2 x? b.FYrY98[Daֈdt9<":&5n0Q"1,O wO"Yeu <ӏN,UZ]ZڱrIj啟$ҩ<b$(J ʻ(A=ܛ|TXaFYeZMoBwHgc857A4H imJDV(;"SscvGy5#2PvzA"{a.FUb4PaiZfE t^hk!ڔmZ;Nr}D蚆Afճ!"A8tjUiE3dDb~Ggt($q( -lX69Vshu|Uo ަ1o iS 2ֵ(Ao{É}EàwpKKp(''澆j n.]D:y`eE S,za7NdDk5V ' -xW& }I߲$ y|S<1ibFV 4#n'4)vZAgAn[)VQ+ A$ DO\{۳hN~ O*&n®; mF}$_`au/] \QK3_pąKnbP.OJF#%D|uw `[+@ suƠBpՃy8/Zˀ.^a/^aۚ+ 5Z?gb5ľ8gڬy;;}5ޟ9|9_qIޫR?dga}9FM$5X.đrQ0C} iI0F"GLR dZk{d!gG.+=}R 2-EC_֙Ț:0b T _V6OBa-ڶ aز7aoOj+}hesr/͙mErrk}W&F"4NsUxukDB ⇛t-snp f. ilS*oq /1P6Њ7jSm]}ڐa0h4Su̕ߵU gURɝNUpU#Q7+(V eG[ѧXUiHǿ£lsUg,ՇY[ӛFȠ:dj; EƠmFU&rԯ &Q03P0Ե3ہ?8A?-d`_e5U=~h_P+\o'< zpN;q 7EZFc&h|sw IZK~ש%utW^8C:=KJT۟O,V]ZQbk Ql39"Eѹo:IH)XpU?_7qںbРorf\. Xje?$պ"Gr @#|FUFa(HeH7j>dG@:YS+}C, ]"VVC`jx"o4~oe~ X,c[4OQd'zU}< 5L@,S&tfo\S,9Vw_lxꐙf|  kUjbl6:a΅py(]w7ʴDw]pco?4wJù~*l6j#,f%K %^5|xFܣVHj!Q׽b5>d쬹.E. r$G8)u3 eg95ܣj* |GLLRe[pPe},4ai|Mr^~$XG?-4gc5zyҴV %^B898zeo^NẎ+{+uU CX![{3,Fa~cw\qPң85K7(͟-;d뮒븡edv~Kyd >g!dַhS-ܞȁ2YqJO-'2rMa/_bw/{v: p>Ze/uIL[5Ty)n^ޙ/G'% Rzj`F"{fm7 6Cƪ9qȮ_+H^WimW3FY{ɽ >Z9 K'@EuWmP<{`ldޯ I84g9MTx)]q<. %*5\D eǿլǢj p,u-'u\Q>J x<PT,Z=4Ʋ 0.g%T=w'-7$4Bsm3ja%^H}mݍJ r UHʹ1r}"fimOhwc~9  65~iÆݕ(>8 <#31+k]e2p8YZ}(sB+n_5} =Vgrݽr|^"A_L /Mw /`][aPD*:*4}B%,=B`=L_}ڊ_{<|xS"B/&h(]PtZHW=whJFzw܉3`w^? ]Z,LwUOA8L3z9Pp)~|^ P%⵵|=IX"P;i+Dy?>z|Nx@S]*/-{ ~#kډ#yN{?f<;FI| !By]YXxw &wv6=-i1vM-''_E{:T[[!cŜ o~iT9c, J/YPxZj_p(؟>'@ 2 gcfdGdr-{6s7mqAryZZ@OS&cג?:DzoFōl t =CloF!V(/xd!? im]Ҋ fCT`xz@R|gw.%|rR/<Ň4x1FJwҨ]cl/ImZ ɝNӢ4,/i@ Yt GR8zՎAίv3BI JP-Nջ  nbg>|I4؄8W_p ϸJIe֛%u9j8AA[sPR1P(vP]LGP%u0iLV6nq}wB^򻾓x$·M!q I!.D=AUۇU`FؿP5 8J%" >PW^15-@z+-_?.P9=."kص >|=~&s-3Z+&ɡqHlb"ۿh)> `DMuj"QTt#* j3*xَ+!#`$E,/2PX]Vo>!^S7j"4rbJy, ejY:ME7]-]8q%aɲOw4Vr%]yr֧=`*٦oB,dWrm`*,wNI4hG)'O?!0 D p@3O͔%"5Mr)UN>s[2GK;r`Z inRzy%(Uy{A(oU}6C Sy41Z6||jw=z_^Sv7 /r{ `LWZ`\X%לAzT'eNu9uRvjGX(- <=LGz9Z%o+;a.[`g2tE[6f@Y#z ?b=qG{iVgH7pPZHO$(BR83qP uψ6*@YOO"-"|ܖjk| riV]hk̷ e~RLݥ$$`Utu.xv{H 2JcjyW>{SW13R-EH!h-.8gA~KVxfcdoxнDC r /iLx,=Nޚȭ~ v\edDw Sdb¥;dVV4TYg'׻2uLz:$>7h6+Q* M8BjN?bFwȉ|-ΒHX'"ds^˷q/ ӹ0VB% $ $*C;' ڦz3#rwj$6ٯ4А;}:.: (^(OuqTOL%q#;a)WR~D)`[bЩLYTz/|H&Pe%S;OS[Ss6ȩj&mMrgviZAHU-Wo ])Uo3|@o{p[^i¿-Ҩ<f/L܋(X WJl3}4ؾ4H9i{k;B#6#HJ.ԔwCFفbR qvT}ȇ׾?"f#9i|(00 @SEW,[Yt0-T08_QS }ԭZ=W ܅G,}؝:3N(Ta9LJAN}h^xtP};!Ô}LÿMoyhv42=p*l)VCnS~Yx^~թ \hI/!8.Hʺs "&Ӈy$$׏#"OŒdj!,yڸyw?u{R'Gh%pPLH;E*+M**,R&D!es_̶1x QB؋h5ڠ$;~4CRl3cQVRث,KkO}(܇9-+:~pL<]6փ3 e`;‹?#CQ@A2k ˅>yg Wx3E8`_d-[ShaԪ׾BhCnq4}DZ5~xw6uqɣ5Fcu.!\r\!2 x>t-W]1g\T%͓3N's C=;",'8gbBiaD&iB2ac29$/I=iRH avjuQ څst{j~ڐY[!ZkH5tXv?Nv/eA% P irTrG:ypE<|_%G~nBGE$E3wTxu ^Fm3J4찒;A\x89Ǥ{,~c,I9IfHř K~N͔|Ad]Ct͖Z>f~}9OmlGJ5Ade$JBՐ~E,u 5l'l2e& ?kSntb]տ#x)ae;9#5^_EePv#d\H`CrV1ǫb)c@$] M\Ԯ4m2ly/_.4iCGvTUO6<,͉h9r`N&}@- f{8Kh:j0*ƢlTt˝! 1i;BAgGoѯ/]~"L!e&췃a[o'HD]k.Zy0M-B]I=L{n;<[)p"g ̫)G QWC'LTB(";.ލ0g &6n,G& T҅q1H&J'̂(.{+-_)=xuP=ޮ~\xxta0`D;k>Yee2'eFuq&07G#jyO,1P$,NVXHY7 ~XdZ2c<ڣ~Skݧ0qK'^ ^n0 z`3q|-Aj/\|ͯ9c^EcWչ!ÍBASiL[ }QXϡWYCDԭqfY |t7ኜ /oфHwUO8|%̠Z~ in[NMi&;pcy5xa'dj{^C:իm#YWHl4OkGuSێgɨ7/&(h'^OU8J;/ež͆Ch\Ù-V AqUbcl Fxwl}qGs>vaw.e2[(C7e $eeb Zڨw 44j%Ԑmmq7DpC{>2ipY,>N9ёy'nv#n4od .-|>!Ƒw>=)b{Nō+I1ygs3/ E<=~ReT-+]s/s2;/<ٴO@!6L 2YmOnoީ܄L/ٟl/ot /Р7& l 7pA$JvF$ϣ -_}*Rk1ߣ-00Bk{&bx!ǟ xj#GXjlsxd Sa, *B4eIޑxݺasNG|Hx\܈ks*j*;;&d7 L~>F]kukq&3ٷ[t 5KhA]g{'jޠ\!55eulЙS̋t:x d4gEw)Tbu%P,I.bPG)9!ȅv߻4 !N NQBT/ұK_M@J? WZWhZ᪩sܲU6׹o6= ] j~YڦFLBk)!K lg ؋˟`MucVMCCq9.50W-xG4+yEUt]7G4XϣZyC4bQao9+qaXWx=߁&R5*((h}PY e?t˱io^o3Q67ymޕiwʾhA,ʤoҡ"'" ܢ䥃co h񲃥ZL\|^Bdpz)_(gӑG"?4<4J P鿃t;i e9M1mB ebN6hlvwF`F d1먰nDd9Uq U'xNg%4ʉ6Cג(kOo𵛅 xcMpd*`k }SHK58n1= i=A/h >WH/x~ o\ 6 Va rGaW#/@!/cxV,??}{\"wO$q|. H aJX _30>c z>nрHBtU>];'5w^_KpBQ4~$1(wgFTx(_BBt ҐxDh#HbkM'}3ktx _K. @b匷i V)? خ˨S맹ok.*\dO}oQ ~Es!׷j*Cqt3YxU侭qpk8{{ zHGouK(&{>#f{ ֤ݣFB&GyA'l`Mvٚ%@Vf H_OVM)LVf $V8lEq RXpMTT(T6;q3T2hMltn^0!M]%,lI Dgx{B/(ǃn@Yb5~b(PoPps ƒ.v JFn_ rס/F5> J|RngH0pxy܋!eHvŇh J1V*lXbc DSO7ahRP)0*yA-H8n3~%DkzWC$<*H} Q ;CRIߙ$ |sut횬5չ jB i O,>S/HǡRgR,l>Z=Vy'4wv Kd1ێceK9ȩsJ;#_, ٙr]yrCy*ՓVøB`|[<odjZ|o/e"ߧ䷰"?kT?X |S~9m޿mX\^R$_2ćSK/WKAJ r}#4~+/X 9b_ f_%7hᑐir"箋hy/MHbq7z\s;ONA8 &^%V,(҄T' ;PqMN?176ڶ]MHmTT/;aNzb ERAKfF J 4 S(T[|gJ?=9mzp/I%IH\ |ප CdjjH_=Gw}=UIU#OI[ LJLh@( Z<* Tj]WöVW O|̀d|%N u/Q%zfnOPNfܠCSƒ/D{n2C5ss^1bAz%Q 3DCK |U0>gHB@$Hh<M#=0ȡQA`AID34zx G@!aqÃ{Fڧ9GS7h,S($9:DmI?t'ʾӷ"Zq1b'*Q9s["@榡Q2&wt@kY;Ղw p{5p8'of bZZkUvpm)[t0'<ަ>5DwtyFU7C JpYLܚ&wm12_P][ [MiL7&o);P+ \40?v~;dĒn@9JE["u@<'a8Su Brh |Y:μz<*L+Ń'3j[Ԃ#L+!vG}=GԸ D W6 vUvry4 )[`, RDZScGxe:" W64g{lh5d S?}@*+{QUg+jќPt~ruR+W"xW?/wGnQz^ MU6R~zzb*e~dK7-\ZvyʿhǗHw+yk( m4X-ZY HW@k^Q`Zx18ukHQ`.^&:$,O.CNM6Bd>ǔطԌ3,dՆ|1OsZ7wmFДg1ځO7x*=}W1.} Р )r4 lވ7~XxކVuƕwG 6t{c@Dz1g.o[X" ;TwBӠDck'FnWSaqu,n pj^/,鷋O^Pp{zK}o,YWIU9^E[C8 Tl%U`|yyPy[tIТ_3:)254;(`%Ś7t dtKwYTطԷH>LPjC0`ɚN*LxܯxwW<^zy;tGgb mipXUu)e޵uV>cU S;#WX!vA^fį3P)S;#~]8CO"VsJ$N7R ҭ~M5~֟P=cG?j`"JZYk5Nx+B3hw*?#芷;o_ex̮x7dT5#'P_۴?r׭ֻv'|Zg/2 m,}⯿iiUiQ6]7ePv/Xojg|Zg}ʗiciT__t[B} 'oԧXsTSq@:ԛPc6/kE=WQ\cQ.MGkvX-5:\s/k%{@7ԫ5'OL~zy,SQ{cةfRWQ8\ p Nf{z!q̈qkԾmJZ1*\+,WXS6zo`ģ+@_u$֖c:Opn8R;4)/|6vʲޜ`[* w` !oY;]}_S}cP˧\cM,b^72v,2<_Pǹu+dlߔS³wy~03#W#ZSC]JHڬnԙ бUiFpD^#jYrZΏqaoPWroxW޺?/8 "TB8|KS@h+ҌF)=ng|4 ?  }Gx,X &ӦMP0g3LS)l@]ѡ ,GE3-+Ġ-`G;Tw o+F5DQE:T [9;+o'SC!ߋ4 C[}cz.(GOG Yt@s݆&-3LIiPetSud*{/+P*tPkӰpB$i3$AMf[!<$vt ^;h7sk"zwɝrKn[Z|ds+&%ܔ7$aDQE*z(phm O<:.qJ>nYk[HǭRGaI0N-ET;\ܜgܡ ʖ<C'm{N^S ]Mlկ}V}!WྲA~gޭn7nZ90S !Hٵ?5PITba7|udQ!xV"U#,>+W[C`nUWE|NwdpmE@&Evm.0R,yPewG ]sf -Ŧ/ 6sz@M3 nbҖ-gZ"(`!I$.dUU,E9 l7udjdhe!ٍN{ɉ +W6E/it>0Z yDz6T ^Pj*Q!k548>189-p4&ק#f4V'jexlZC05[E4 lh4$Qi87)y߳(Sk,t)28z-km{{h0w]sN(_h.ܟzͬ'Zv|9[\dזQ;qv*ԠTo[Ri1Caʐ&aBdoGp>lL;`l)ߙ*Y* cgzWNN.[!#q!!$~+{4g.+ҡ,Dfء9*4t.mljvy+mпMYqjmմ|e] 9T@|JeFH҄hAPstN@\%s`+_S7xwƴ|x9N щ78 aF]TȸC3Nb p0V]Ț4(( ]9x`Ns x»De wyg!{ 'p.œ=]C]{Oc ,3ݾՍA=脝Q{.ocrrIUAMnTz0 dif"JzG0?&}?g2l[2$iﰲUXKF^q,Uh6v_v-H2 iW7h#QRtH{F%t':+.8˩hC50Jp $h޺E'E|gبEm#},UF3~vE'="{wd/Iնnή" Cw~V-ԏAgNS)ty>͓u{ꯟkTu(`Br-ЏoZ<#m$CôdA<Fj\@" 7d1JհRfݟJ[-0D-Ucax\L0 ((f&?C PYݲK#yezM탲aa 4kFE@ 7ni_K!Y٥ba.2*KRB6ť 囊j?ǭ9Գ6ҝl_~Z4۲A1:xp/ȐOM izn$ٗH<"مzkxɇ0XHEML_֐|GbBskfoGɁղ-bDu|FljqaHND,b~ %)zǰCs.,vcVtY]#A{iT.'$i6R+XrqR߸ڇ)])qطH"8k43''> *ĥk:c,`)[|5q il\+'eʢ+HQ9"(5:aK5I#rbO| bZ%C8_}O]"[6ߕMƸo%w',? t 9m$ܰ!vJ+Ď˫K$ȉ JE#'.,3gVpTxxnaGI d1^^$kuo!& =GOU|sb0p|B1'Fcm &OV*"/褸pI/R- ^N%YxX{)!zlK]~'dV/] [FcjӘdzgExH'KtwMǛC٤N4gR,E{6}*,cL,Ȅjf҆ L&Ab0'b`C\դ?N5O7_ֺu+LDouOjMNb-w'b@M@:KsNVJ^e \"1#Kl< ,~/3I}Ja'bu(3rv^:(ӭHFJTx:~[0^Oe=IW-ELͲfv*n۫t۫NSabv]~خ2Sa"k->YdxZ+"B9oL}榀moэQ\!>j/OjdSv 9= `Ɩ§ a{MǶۮnvNo )|:PxڋyЌkhmExhe4adL)%8T U6Mgް6k^ʱ ^ ;Z] SHT/#/ fHzZcN99[ًM\mS1/4b0 lE6!8iCۃv -5l*zN )4T4Y}bntqa>1&iaj T>sd`?Hv#NŌ ;DsO0Q[)T}PYIh]S?Ɇh꽫I*Ā~sz,0Gшx)ŶwY9aVH!̫͒V#*=XMDt k0)@|G~Am~maa,Eh1֐pzC"Gl>.o$=ю >Zr߀~m%Hv:cU_oz'bSB(>h4[x)nw+UԲ)>͏MMl9KajHEh2AFi1zJJ7W[+?mLevƌd YIpp||LީI|)-^DDZQK{7`ʏKWcka;zb:LݰnfJ W@uQ2 2MnAϱS΁j :ynAF$#Ko J`iZy-ư%|\]lED@WtyhͫzSG7G"yR4iU>-F!Y\P_<_ [}& WǼCun.w&mPdONU+W&+1aog+Nnw YNopj#XB:_+7<.V%C?Xt>LoH03Nu.|6yY_RSus;1h\G籓5w).78y@;կT,bmjWҙRCKiΔHZƚNIu]`m&.%wph]:CT#8hR ؇P ΜA3O,ˇ[ܺe7^W̎Jzx9ԗ͏.=τSBrGK%NT*{P;&l.с Z x t 5'c"^C׮e5{D1qpnrd3i;І猣vTrtr}nw۵JMY;pT]-͹?{a@tAԀsJ+#`~\ RNhV18 s[ c~ٲn5#FvWx%;AÞp}Ҡ~?)i,N<ąG; ?5wm/|_zv9zNݤg@(/IT€<%3ܨ۾/hfI1j6N vWiSVƜo3YBG=x?Q{:l )F"ꈓ'v-t FWǾ,;M9(o=Q ~N -%^yy[v#6#r6zc(: g}O{mdhT K+}Cw/tH IS{پ-j:wjap}g0+ݍC:^RCoL!]OaAq^FIMD+qD9Sۋ!{b.g~ۧkKgE/4&h}~ko=ߌ\ E,wA3[D|S1388Q]6Û+p^:gW|8Fa,hm ES#0hP$

    ?yEnjFpq>n{0>0ѣk2Q!Q;Y%" 3JptPM >r(jSpP NoI䖤,; w@Qx^[Hb[9y&û_]j-Fl/Żް$7#Ui tk0#վ1c_ wC5/1u H uǔUtD68HaqRiFb^t1o5?1J-1S k גo'KQ8kE?11c:1/ƈ*cjAB`D`)Ca+y<4U@h]SUuu-JHz"By4sR PI/xe. c8U/)s5adѐ&OKJ6;ũms^ $dݴs$M$|5xcIaH*ehF֝"םPiw*j^KE< |V3ڲyxFqmmCbdP7G#h6[MZÞ/wosC_[+hh=~S#ΡHA6@UUXX8-165 *%܌WR$S Zp\p`he)[[f'b4. s7n*%9Ě#T91ңt%V /\ [e4xc'uȑGp%,)|XPƊHdЁo&\M0:7;U$#iJ̥qL &sK줆',^Fl=$ Q,^Il']-tba$<蒬ZzR{ᚐfMsӅ,2Dt27r i.u<8HА|]W9?M+Ɏԃx&  3L!?\5sgL}<0u9yn0:]^8 R* 3ZLKÂl +Haw ~CuM1*@`a5X2s;#_>sv>24gK QGNO?K? N:k.EN?Žqu<~ꈽa8O ߦCT\VVB4%ʤM[ZXoYĎ 1;_*X*x%X t^UT=>/^BU~Q}H7uP3ڠi3Wk5DS,EPLkѿъZUBv4;/ = wAt œ&_n$Mꐊ1ĊyIq {$:N%y4v|abNzQM!0.,\MhV 6 ?_RFm0ߧ~ ΰv/ ]38 (`Z])ggCZku49-_i.k븉i}B'kbz%קa3jn\I=beM~.(+xkQwFrhr%dFExmx@s j xΣ`O-kV(8qܙ"c؋؜o5un K7nxmkWz+mXxNZX9O%Qk= ]p- z1VvVA'kbk ( s[{Ǻb1:`h< r؆S 3CsUsFeGg\$Ϣd Z,CFUznV܎·pw=aw?ASc}Td)ϦE`WkBHj)A^" \³{WsPO> X2ZpV4״@-ZOU+ٿa!n':H7}Wlba˒7CͥC9MS<5茹5EM3e/`<.ّ^4˃׺̫;oьe]D#⮕i.%YTLm-d2\T]F%Dq(fwGR8WR}$r2Vʃ06K}gP$(Y 2~QM+Y]4cu3'(-wByU-d#\x[~M7>sx65WnYmOPEOw4O}7b'&O0ܛ讚=pxډAk1pF1pƲ;A0O -` k;eP*tY"L^4c[~ آ6@27= A`Lք#<etXRε&o7-@ZP`P:ڈH *J?9\t[UTϲYZ=_KkQ] X9O2[T;fR܆yx+hosŒֿͦhʖK`'M_0zɢ䯛GKpV(+#r0"N2'ٕ&<<@24rcb \ Z.@ٛN<>>vn$q࿎87lJV/ LمNvhʎ8W^jd{d~XbjS@!jя“o=}4^B۵LJ~ i j~conCF'su3a_}e Ia\Y܋$4kQ=Mh&{mUlj?Mj2d+f2MÚ?&;^)Jjln5s5ٶ{Q)%_Tld \Y^&=1ȇ?p{[d 9cG@oo"kAó,ѥ _@x  oFo.\n ଦEFmetOWG^.H,b  2/}Jo5zss}@g ӑ@(w-ױ{N^ ˜ZRXڅ'krTrs3E;xf#hgd1(v# 3,qQOk҈hqMء}_,4(5jWtGHE{^xP', Z|\ٓ#;$n P:%t*E_欼d ^gO;wщZܦN@AN |+Ą!|In)dӛ~AN00: udp[Idd"XɯL`:97\;`T;N!d]rg3g\t3,ޟ MS9Ӭ?Xpnﳱx7xn|KXqr2 b->ũװ3|ΐ( *|dK{1xK84p)ȹGC;oHlFtT 2.[ PB,^7FJc+í PXPW2zCދIuT+R SnKFA= ÌsR(2`f^_/m-ջĕ[ur[ID |hqUҺ,,?㣵V* w9V;Ii ;HgeDwk#JIcEk-{"nНX˂ }<Iv-G Ebtv` @ ۵Aot6w=ڴOtlRLdH\ \HFiio>uRVcXZ؆AyGѳsP~(> 3 g1tHXbKD h61!o<\SW5,y!4x$zYI?#HKفI(0vj:xO[ipxeiy*y Arp;lb#*ijM.g:IXh]܄@{">HU2}LͅtyƀDi}Y[CZ8 fTy"px}75nIE"RTzuqf*@ֽ?})ia pߌt~ m_~[gs9"fx̌}%)p~guCqu"@}Ӛo;Odd &0֯"{6bY*LzSx*15w3|誚)*u#!YL4$:bӄbU vD6QYOIa~p.? ܧW?Eg@i>zٍO4V?Y^(OwcǴ!COa<6~P=/OgtEjM[Fq-(:$"Eӆw2}$lGRUg%\c8dq!3wȡ-?C/DûXV%(QcTVm@zs0%V i|*0n76 ިg+t'Dk:+(X<jpH_";H9c>}C5A!|ѽCГbr(#N&Ǫ)`Wi.0W%%5_1/cqXL2*sB1tY|R,%~,O=?0E-mXP[B Hh miu˕|H&EZdW.]<|^n7;=-} ХҤT2vx@{xѿZiKZc?[ t =4 %RÛ G \-*L)LBJ?.x[Lcɒ%p#໻Huz"m-֫tOwNm4 j4 O ?è_I`H3\iiaVpx:"@ceŋZ` %d:y@,K $'$ #dgFG3=R  FTscsLwS$HvF^D"kpf(T}GZ`*O6Ƙc.Z?zz[+ {A3>ogn%fK2RR:}ͤ$/"tt{ܥ]%ylS& s *Wkq+N8˴CJTƃבֿ9jZph' (_5a?=~O_~o !B%jh):cG0ē%ګ4ed&E~2tѫW өWJ W u ,(>+1>]\wޗ^ NX),wKwK2腅rM#Dޮzv"Dn°.V#i<1V3cVS2iD22\J@XFo^dքcEyfꇚ;@F$:q )/GRS463% <+/N~hTCREٗmYu+ʼn)9 O\Q;즾O$jّ#!@prS>cU㲋)X ԅ[mI+CF"<@ۂZ?UҸI?@ $eŕ P&c0gwBDT/+A hBý}x ށnDVD+S~Bv$1aP)𱑑񒟂df?_Ț}7.ॵ>;d!gw8ąD] q]3@F_x~5 mu"dQ VUiqAXNHibٸc4 >heӪ\'1fACsG&*bs(@DR Ɂ"O[|WH',c"pO?ٳS%|9_NF2Tťɘ+gM t52arh-S w靣ؘY]$x}Z`'>{[$c߽dYVI7](̰؟=4.xU& UNMo" 6N9qey̨C? FvB;jSSL΄j#D@~[oe؏\^$#8^Kҍi\^ Y0p)\Yk6yA}ݚb(E_$5ԙ8bG4$I<IIp/GL"N[378}c\\g݈ u4 +٬Yښ閆HU%AR 1hZQ&9RRʢe O?I_1]clj)MhmSe3Y6!|8CNH %.f\T] чmQ~) fB@d`g[*)&=mb8z(=1w`nbyx(}#ivFHʠfo;9W)DvC0<&^t)tMݬS53G8*z[ձ:VvP~v\G$L V#]M5j-)KgVKA xXzR?nh-vt _XLk_ˆ|Ae< yg2ï_"Z6 $V1 ?OGeJ&1Mp3O7$y KMd֣9 rr_wib~ AX+o \N]l\j\ ~/_Qj2I&(@Hl-rP 8l$Q:_`Qh _ 1YhPlұ_+-R]d6ij}x@r?awa RҶH@ ɃOg_4d_MaY>~or >>ga~+_lzܖulۈF!E{Fq9vCQ,pjrcPj5yR{ b}c A 6't3.tj&n’} *.ԡO?4"uMJfZNsqLAlf:o"F`v#llxםz 4ظ"Qh2\c ֐V 3Vz90vK^NLhz;{i_Ve&c\PANœR^OI[2słVԗ.A]p~3]Z ٖ!VM\ 7t[}2m߼~`2_.c ;Q1Vx}vJcH[s,iSOMkk >ɉ>o+o 4oβ %#Y]+ %[,Ub>3]u2'<׊y~i>,9:ؿe!EBH,z_%c7q?Y(>Q*4Әe +mȢ2+Yf}IӫJq^,JT 0 āztx6$#/A3(d3 /#YxQBqX1h;"0kI YAճhA#-(?g`+ H{|2A}`v2EU3F0~',5: /4дZsZycY4a<ʷí]Dxtwsc%#dqXBnO:ZC qHEDҾȪ4zu.h&F8S,[Nbsv aŠpg@,ɧ/[[H|}㻜{t\Sl'ͽⴃAu6:ȯLiJ19|@`+C]H|TD:psos^ˎ=3j6`bb=s|'R{=EZ`$HNkT Ll{,MkwM{Ϲ+Z-i?o9w}c*}[˒Qo.j¢}f* DD9wpօ:OGVdZ ܡ~ہ3}H>@:p@.}sM<2new:wsd_pO[`2[VPo&SR0k r0@Ĩ=H7û7`zEE,`ت_| w=贀Cgh>38C=MU.'\؎hZY_,`G*/"s&mjh^A)Erz>n$jFMO+߃ztr^Z{1,@X3JOםc ;w>&Xqڧ6vTNOp>Vǀn%Xn.-}5<38a/tBtpt i{ߡA2ȔɎ dơcrk`J뛼Nk }8fQ :*\hALH^^e DWZឩEH)%Vrܲ}\sX,_Ϗn bf:ѿGznѪU}jH[m!t;HQAm RyG0.rć1[8~i9/oMC ANpN- pkp/ 0qHG/yOmts4ᥛv,zl֥/$>?t#4/]$\p罱 "):mz#w|qmE; v4O\+̊P}e5s˴>3aM[#q,i]!A_Nxw^Dø_)M_޵r Qn>gƱ;GZ:4H9ñ$go%\<u,9_%ԩXp$hmp4VnKHcU-ڶxt0h+^Fʠ@7\%:S({eI<2Wp:+W@dUۂf;nS,K߄?&'JrsrZYڿNN-aY%{K10:9HƙRó;V/u. J!ѿ)C p+Dž 3ZsGd;/zA~-U3jw$p݋UK&X-SxPW VSV*VjeV>ڱb KkP6} ^i($OY#(irEFcn*wf[(`/&X12Gezt!eSTUU|+"׭~9CAyƗ-fP/v>c]l $uՎdR_t?`cLs&/8 34m,Nd;qw!MdmMII.[dzp.A[bՃ9`률u h(rN3˯>r}3[[ 긺v5 ,T؃1+YzIa]f҄fWנ>m[HsrRDb.$(qA*#]| ◉Tj+dzg">#| ۬d1ǥ~ІvGGA0AEka"'?dլP2ʁZ~:ev{7a{YHz+eS="\m.rT기`gX}B+_$~+DbӦ {ۜ8UbꝆǂp4e宣s)usrL z ?ICFH%V|^04S0,I6"oɮr۸)+v[#|g '/i/|(|a|i=?LEeYZrhuF:+:$nG8/.|j[0jq^v9KWp=<*7yާ_NƦS6(iYB =Th \<Ӽ${ȻwB8yױ4xZx<~Ə'1MPC_;HPPqNyxg0b<+,e)5^9 ^63u ^y9frU_˹ ntaOU]#[-٪-_Ӫ[Fg[UI_L*e kU͇?UݠEkj8 <<'ƙ t7KHi5CKԝ{\Tg`G)@r`c ^ 6`F(ovKnfZz'Oej\DєKsѐ/zk}=0^{w=k?ϺWF8fu ]ڭ~˹'mws9n)%zoXELiU9nsO5v7ystwootS_$:@9 J=2o3ͼjT ujUQ>5; 64ZNcRÂHqm? 2-- L:!Y[[dZ$P*Q5dB(P~eV<jTnkN3/X?4ᩭ_l浦Ma SL=]#nVEO1* *evf+ni 6Ӗ-_g|OtXLå`k"?eh 'V&^2}Nj7t8SS6BDgPkܑRݷ"*z]|W㛏yF0ɧf ǿ_`[Coo$lijDژ\QXo鏀CLTezݱ 8]WD܉z5P-W̝q|՚s8n3q>f=~YNf}BJL's)zU-:W Ufʕl#[.obDS A)ά4_Gq|)[:9;[bZq5bSS)ƲXSZLсf<6Ua:r"*S{U0SL_o9钜Ƈ;y)PҡNė̛Lm+'eR?h1p;{ j=Ak6Jx!Ғg:.A Ǔ@R8@?i-E IasDlF)o2>@kEPB5ZǟJLɨplurPK 4||>Ww:\ݵ HYE\c.ۙQ4늸"6IJVy 5iO4h9ӃAwK0gBBXB58.ր!+iB5^z&SZLqgo㘐$x8cdrLI*ll#?lsdϹ*]d~Ry[(v%dR:Y쎋_'(-0K@vȴFvkodκN d/d"Y!q,FB1d,@6)qlfFg  J [}ك$Ul!}IBobd BIoGk*Le3_FEB#%#tYe^>jxHve"({%dG62L 6=ȊFu0elBd Ȣ%d_i "E#"d$d70-P:z^L:Yz՛@6U5gd> Y,]/F6u.2"3#?RY"|(ޜ"!X l͡Va~K$Ӻzs%,|KBV#;vȜ`3Lx#:Y_e֟'dR"Y$! =#!3})JAdD@"Yc5![NBn#n&IȪ d\72sdukE.m(͢d׊i" 4?n~W!sIyC 5b~HJڶ6᯵*>*>u$lBKO6 sv;>},[2M/W"o=mVn=Pf=^e=@䋭Scz/vnm~^fٯ!>qn] x4O V'βnٟlSBd!BJ}̌_nHj&@G,dkH\e'n{J@PP# 5 `-M|+fn0O|Ymn3tIB_l̛ˍ9H%CM&FMmrٲbb7 om<}R9)k 3t1:wp 6j̓(\n κBLD?:fcYB;f^&|OƟWрQR3uͧNT:pb" (5V$-}䲤O'&'i١rY"$ % ȥ x/~( f`y LjacM/ğ?wIq5Ӛ 7R9J~Fxӣnk  29$9C+ 6;&細\6I"!9Dg?vIrҤ#w<^UWcf>hvPy#Hn 1or9*Rem\noO\HX.P,>f!)pP2 w82`gMlq-T`zW en6lq۵q?Il1,sl1ZEDxďmbr)&Vz"&9;lj>NF!`#zj"X2 X2i;o憛0 z1.<ϯ.&Pe~8rd'גz24>d)Thz5 3/=.O ^~lcp3]˓b«*71/lNc8H94u>HK9icڸdu[Glى-i[BFaSd]S.a4 q{h~ O!\HT2𠇩TDk~m-+ĉbR/ 1MHpSP%O]1U4u&΁!;5Qx(Q3[3I&Kͳ@\иS체N Ѹ:b aĘc1ByTc*c=V 7iYsf141{>gĘShc.Nc_s.uĘyc-sc̨4ƜxQm|0=XJQc^k! *ƘHb<1Ę/Ёsv\ 1fyy'I<-49=Ycy1G1fTp11fzcWwir1f^cN1|19cDn1+^bYc#4c7ƌr11ty5F1^r1O^n9l;|粧ϘcW.g"sy =N cL]Ǟm1\s1f1s4Tg9{1wSVb8Gƅ#3x{c=1WD12W<1/9H 1!dž/vY1$I(^U<Q|r|.Izy:d4DPt>֖R ӞQ Q,:"a4ޖB.6t3qbUܑV;eZgnXזES0=''gœQz0O?pI&ՠ8P/3Xt|b*챽&QY:y+3T(.9]J%#GCKgH[zqTsKӇxkiʐ-u,r"tBKAKBKU@|7ږXkmM qh!D`!QgL]߷%!3uhwZL月;'ÔNu]iX+ҠBcEvDp.b O .0s0)8!zVJsWTPYT)P܅)Tt) &<pJVy _DLGVyJ^&J+;tnL:JOv?*Nɕ-kFa">5i(y6o+n3LDw2a?Q,g V$ubKu7金Ia"(VUO 8ês cߥQ4bH4F`ϻTïiJc\tBQHAጨp"U SЋ/ ΁shs<"u][8 ^sЏ;]c%eiPPЁ22HI fJ!`J!N) Dc|lvZ[h qxTfõbsт"LbBwⳢ")x*#*:a A:7|ƇeZt E2eRu1)R0OI}r̘7Dk,ݍ/ԕdu]fjR~:U*M}z #[/y`>0Rg")l0r\[ew% $NT @ v`Y /#2;Pѷo3'ERP6U0RWHdҧ2 L6Ro?uNz}&c4FM¤6*?ghڱݤ0=TsJ;YE^G84`3z?]}@TU`@\љձEKA4GuM2XPj}mnGi+R+:&٘$$d~bJ%Hk<9G{=|{Z&te6H6X8-WtJ0azj8лЇ>ӹ漅+$#bdNb&a8~q xr:Ԍ'&"r8rJ 0R 9\S婟ᩁ)&Hws,|/:)ۋa: 橁 )XMMLa먩w==upzt1wV^eS4IS(AӨvo h:oi&Dڄ̴ҳÉq?4.B3P+F=~W,$K|Dew2(,l`] NG׽ bW_fCD+ä6N ZJw">#[-cQYY>&CLh}Cy[9a]*v,Vh|.cy`621_iyS%dQh,d9 y؀Čm/\-2tR JBՋ_53pЀT2;e-`X17? Pe٭iǢ?nQ+bqYTbC1d,L},_ !t1iz{ssk1=?RvU9msVWa \2r?6IoJgꗛ2Xq f+Ys1@H*yE!dVUZM qR`MU4Ǐm$ ݀0մqN #FK&8 dB8j7T<c1ǖl#X~şKf~VxAA |ܐ%$0N k18eEe^"S@ +\$֚fC0NqǠ=E.fs?s1b9$cuNCxr7~S iѹ:{Chs`C?DF1[a}\Iz}9a_Y8{ `]1 9O To5ʍU<U6UͿv 3&ww&6 4%Ot ߸yTqYBbU7.Bf%8m.fҺ~xk/=xmCL~yke~>ro?ہu;=&y07$P-I&1^k f2J ThT)!bp ~޲{I<o*pn Mjr79-p8n"Ujsw QnaWjT:b,1\ӅN5Ȉם3ut1YYT4nնNp J_ E^)g# q077ՓTs.T3d _2K-]m2އꦓ^ stGSUƃMS-UKOS qZ:UƖ%چAZXF: B`̙_X? )) kMCv҄W`q[.t0t&)d>i8\Kjaӕ5x,M{MUEH5ك+uyDjY0ZW^G?齊匮\o!Qp@552H)3g?%i`F8chM~-icisrouN#-. ~Ot0ȫKKڟsh|Ψ>Եݪ:嗤J-z i{gNxry p!le$o+= $5hgg^ ̤֙,kSGB^fެ]xƱ`нS(M t52Y GfRć^A> 7hJR:Irƪ@48@P14L8ݺcfLYkhI>M1wI4oX a[lPl&iU2Y4NUFl?Jsd^˜ &#.MhRlM͕:Hfa>NP82QS`)۝hQ @A-60E9_v2E6掃6pe#F;E6#{ RGf\ Α,! w#{q C6";zppC~ÁT?BYM@;GH6m@Cm/m3} 2I`K &z pi`CX]J`,8ɫ,v硝Wl ۉn^hjgw;O1;oe1 >{8 <1 `X_av! ͣcx\5N7I w$GW1xc"I( [ΏGD"i,m4lTV*Ӱ5l(J{]c.`]5l1C/4l հAedBx؀mڪ?b;m-j;J`$_klEbOZv(_ 0o59ǟ`q-_|.ߛ*WnBrD ԂbkJ4ˠnҫ~L)~a*ߗ Ig[* Wlu UAEА8z4h&T #䤓~.+4&3=UHsW=^lhp[ '6UK؃6I쿮FZ;iT!?oCt6^R'07q|br  LVmLmk9]&uGED.N~wwnRa"w~ᄲ{Ce&YhXkÙJq%rIVmܶiu T=e=ݥ;(?ʩat=n:j7j)C%ƈzu!d%6dj74v W*DnIMЎI!=Z2nqRdޘCjz-4qhݒ?9;ӺҜ#INu NuyӺZ&zA&L`E:кmH&uvhJ7_\L4qk\mwK 瀴ĆLxK ISR]V bAv<cɕnY7_s2RB]x TFn^S\ uSW|KK`ppG3͝'*mWֱ)z (|[5`c丌2i@ZRFQC0:]Eo&8G]*^R*}AP"G(t-&j%ZhJ uwr:ZL^kzwj=jjWKֵ[V:@_zؗzWz SQc^&-fYF2ȴYKڬYkڬ1 T4Af}HނAf@MW%UwATM1!S=z47|f4|0vL-PϿ,.s8;YJ2n3p['-)[nLGlXDF#7.ˉcX{Sxx9=GK.MqsAEduo8'QJ86ل/8]mVw0Jٍȍ4_8 qt !V2 18 1#4U@C!=iFøfFC\HwqVY\tUXHB6"TF*#zR^)#$JbB |Y10ind%ZrdS47%md5 JM2jbP[jڃdɦFJMT{R1Fj\&xb_ ^NME@oćۼ'0bDl(1Ić''&jOx {-烘q镘#xSWj=F,\115'2}{\Rws3mqmqn5Z-e | 4݊ {ֹ4/hwHhN[ .ZcUz9X|OF: 7n: nw2^v]@4fCPmáxQ9e1-NTG\ڿm\He8K_^gTi#3`@˖Y0#:=\c1꾵W]oQxUuvg .F'fkCc$} f[vӋ,py秪BEc,Xy:\P!  rC%Ã,NbF3:&r0SO!, V^7D$UŢm g 3 $^xOxNuq@\a$~ۛSj=M S^4H,A 趀؉NF2k*z^Lo'J$m?JYJWJ@I^? (ySe߷\rI] 櫃Ѫ3^۾ŷL,gbH{z/}6&ݣf/Fg-hf>iSO&JNX+~)=\v僫f.GL_6etf)%1?'k1v`U͎5(6׵TwOVD@@"ٳ8Õ5Ί'e  |K}o˯U^*?.Ux:| I y٘>Ez-Wax,ԓWɁŚ ߋYg&9w^Ǎ;9OC2.cܓa9B\4 :恚n:5T!Rn.rO^QœF>`ϣVRQя۷Spn\G\˔\˔DփMبHE.b=cCghZ+lV}܇o@&_AHZa 킠Xk+JPp!e΢_Ak4CK} XTe 0JJ+(jh鐚*򑟻df)Hnmnkin $(3(=3{]9<|s_ZWdF3Yvi{9:gWh0o- 49{sUa 3u.fFcb =^I^di 0k=zXU!cH'񅚏 u;R)vf0HnfeQkkߓKش*_ri<5 ,7VMH~Ot$/ݖ(g\gT.0x$'{ZR6TmG{W~< Z̺UCh&nGАw:Z*3ff%x}B$c:Kp鬹OlCOM8ۦr{W[dA9ΊIja7u;*&T&[S Nu9$*-74 aX/<.ُG5&;{XhIY4E62sm`urNʬ;ս #N8Ό knxֱS4H8P9,(FVYFиă+l)uTqSvP. 1:8W:Ors-ʆS!}#u;)d}Ƶ"ז>͍rj>G˺QUKdiZzTQxkB$0DgO~J$ 9+A36fUoM?5ФፖkӬF "k43D "+;ah=-ie0¹oZLs m<еxY8s4j%"$$?>hc_w:{:0x'm{o饺K/x^Tj8}Ȇ]jTsܺOOB-eV Ѥb1$M!tkcllg>GzGϹG̠lf6Ғdym~剠ʙ v>& :3 hofZ}G'ȇCiyf2yZ߼0#?ty!7tӼRvޜ=_7/?ϑlmꈵ]sg#~ԕlݘJuM7Օ8z[]TÝUģj069uXkNx]d-v֘<.Yilr:ZpwOچ Aj.(ֹ0PA_rNІ|< u=r]gnemL^p y=ip9G`tc "7Đ47$.r߿,rvs3}1;1au˘NOYcWκu v}15^g\"f>lY+bCB]93d?fuW]-%Z3S֊YT*wrz [u:k*8 M(V[/uD{&s'ͬj=8jxDqqȎ8ٕvn48y?N!dW8xX!ޤ:.uWA"L6d0b[&b菒/"(x%G0u}) 0yƔ:A]TB ~C܍^ hoo n,f_=5W˖zUB8_c[ j]=f]wX;q1#]{󰑉d7+`WsFzy;+w 9~~;bؙؙ 1>GzGksvZ>kY!g5d_L9/{;skW yt$Krp{I̛x$&íl[sGHľM5՜[C,XE;nkXtI@2@W=='nwu-Ҫ[n|\ )J$7n6G%5¬wqYYWZ͵0eE02ff]a5 ̺6gg^n5uϬkQofe0k\fά?7kL!\qqKPo`'Ȕ#7]vKӳU*՝w{qXwSibb-@RD!Y5Xz]Tj [ןL&Z2d}:"Zw/$N;Mi=piYԄ0 VI~8*p"#q р{C'=47\5Q@N}n{FTH"a050ZV&dNŢRNKMRh {>yesY:^Ok:5M8AgZ:ӵoqPَ؜gn5GΖ$F{E{y ; c蘣ˮ1` yaC[))rrV&+#ka.M{g{'G6PwT)ɠR,y#¼pB|+/[F`ٵ)ih!Hkf_3WO?Qo +7bj]޺\e?La1p` {iz&'k|YtoĒ`lCr"3Ze. ; TFd{ o2F&= soJVf8m6;^ JuVkn=5Y1SQn+XtGzmevcbv\TĮ́KI4"X*k6yZ-)ျ Okt9.xE"21: ¬6mT/{{y KjlWX %ڭ=mM2w}6jAeh3<[_0L$$(x!.&~ Rq+HfKx4{L}Mð2 eYl&NkN?`Ri-30`G"̀'8fuBO>5{TJ(72lMU=0.{jTΌ2jMmio4N{`5iȄ1ZYEF l~N-}NXp x$xm-|Q'\M$3R3m!AHe_{<Ol7Utp&/T6Hl5Q i2 |a qv=Ox]w@yvfx<˗S)j>ax)!4Ljs>wFiSG4$ј^۽[sCyESq;1e+,Xfipb|hQs|*+? sÌmlp{ͭ6S4Ѷ-A ِ=w=oMNߩ6%9"c+ P^S6UXC9Ϩ٧br 2q#5t 8FűO#F8f8m~>COP<~Ϧ2fTm~5[RШ2uN6xHܒFWAMq_V)r4UyEk3SZ麤kuԍN(b*;NG'50mbBɸp'Y{.VeO&j=A=6S;[O' /Fv69>)oSi&ա~]gPOJ@5/iTSeZJmSRc%(>I&/X3ٮVRr_~ӔGUE&#H&fTQ2v᭴Q"ŚWea3*V/~7/H-妮{M-5[-ExZL7"ٍ7BO Ұx B”jsȧlYg+!\A!+8R=,cUP6,b/ kU/qق譱$hmrA$NVX2 ^Wfl'(p^ސz(b2\2⯑7|Ҕm]S⦾JZ@vyQ5$h4 M&sD6I:owZ\d=~ qiek8&qxY65?^VMWeZ27ExytRQq-9 3o+rb@Lˉ=> Ԫ70;K8W/e,i]h;?%Jit(&*җ{BI'qw@?c%d\#EК5%/Qy&U$ 颯'=\/UiQ׺웠 f!d B!$EK!{$d8$^oEShEp>\Aܞ-=M>u$Q!˄|~H# )e>3;9Kc>DBBՆgfp}4J;ܾxu_{ȺF&[{cSX<6 =eid~ '[0Ⅰ傶w* r ヌQKό!ͯGwiH~ϽʃJr?x)53p&;w=vdI [Vٜ߫BhGtբNF邼x0P})%EPv+)[A)eXX'AgHOd+ d& $Z  FA9Lu IMH? /@Vv!r66"i9es!.DFg&+3cv-*7 2T^ !oL!OBg4 i~hP$U"i+N5-W'?}MJ6JZ2A^d )Z)/ K\ #ITLJ b*IjcTT~[8A}aZzi5"JuPL*YHtPUB# ,AJZ4O~zQjDL(U={# Iڧ=&ɥ_ m=:J% X(b}yA_z?#m6g /O/?+ӿY.Q'AVRA>z`fv?2'2[@Z"IK V4 IX5PO6E}^DE}5BT(O!krRȡ>!S&p2uHҢ(sozWM7:A_s6^$Z["}E. 07J6 +~"xڢAW: W| C(p_Ѯx^e U蠽 ۮxX- SZΛ?.Esҟu&HaK)E^PIAEK: [1SWc %1p-T,W*|_Sz).OНU|2aO&{)&OZGPf (@ }(zi:P͡Jh9Ql 0FYM.5Bjt  h2v̼fʘx]i=j?;*@bkz 32ï+1g@׏(Jj@Nt^ W@9:J@)mBnG%Ff(@[~{MT|+"JT;/J P Yzt Ft^%׾Zw n$$S QƝ\Z[V֗C O|H+Ǒ ^wzb'(2*ͮ\" hUhwwt3Tz'SBۋVΡtmPC7z(t LҾzPj2t6'o׺+ڱ+ՠw3CsJ@;r_%-@;OcuXu$Z5-&cvhc2SH,UIdjiQ1RThbG2?QI,*mHKSa:Dv[Q1l߷޻op/ܳ|;{{Rt Hb<9C8AK(h!N<=*/uZ{=V[EwBݮln29S7Q.Wt!w1ފk$sf? xZ)]ܖѝKl/]EI4CuuFs}` $?[}1S&[͔פU*@Kd80oҶҬ6GyF}F=u U_8;a(<;x%>6eXi֩@SPS&,H@4BM 5Z_]bh֡RߓU}A6e!;g/jg|㡦`<) R6MХҭF4M"MXnEH- Η446Cyh hlפO5@;M{ hOD6ҷaЮ/֤ e@ ZC&̈́'Uj! ;xFyH0txMk%-V`_e,uS`jXWa6=l3USؘ=ZXEwsm) Yi8+*ܥ2vL]X_Ǯ~֢oHa[XV=~.rpI׭-a b)߷~b+Sl[9a~K\G"' ~/q]K#AqX|b})2VV"P!rѨ6;9Fb'Sq8t<.b=N30̜Nטs/Zq{w֤=s Ͽ5twQs]brzn7h\WpsR`[؏[Q%Ɛ"n΅sƵM'F.g{yO*s|u)V6#d+9_XWy8w)l_c۽l[q7*8>dstyD(lmBٚjsnْ\%lrX l]xBw)lmb*ט:ńKk},yEb|'vWMJ}ߓlz6ƜfK+cvVl|~]vnl6UlsXS4]j1r~5y#d8rNJ| o;hg;hmYT\ )/$2;csl`N:&zI :ż_UptJ \ )?1"q?9&az$OJ5lx}l"o\ZxRn$~ƕ+qbf)XU!o_-;~'N#CadDnuN ?7ybk/HId{'_V?]kseq\J1|I8} rȯ${^J3,M]?űB9:e^zE S .?b؝:}yY\G"56& EELwRi>fuLrA6Q,CK Xi^L,{, &BsM66ffy-ּLh[ !ӈX,ЈB(E5t/ŚڼF#Bq]B]*+q6n~%h"Hyj]۪Xki+xЩ oWüOm毀z9bGBfT%Wچ0 Ǣq˛Ȼk\oky[Ϣ bm}Yӭ+ln\aǘWٜӶ+HĆ1F5jֱz6.q٦8.]#kSOt=9x ۟/^e6g`:l'hVƹ6m8(bƶz݃e^ae_C0 5Fa#'ٸc(kMF&\Wukf_xx]y;jpy7*ڏ}}\g(ldareWO^ SWz]ӹվ:uB=ŵ%AQLO0-yx sX;~͡ SȻ30͝Lܽ[yޮ>]vVmwAq_Pxy^ұpf9Q$N tdG9?rVd?rD߉qNrN]?rN4rf)8~3vO$$13N1$ks9?rѾs9I NǦCC$srvșI81ȉPp'YK8V+8Ǚq^my F#''_U[Σq 1ž%cZ`.;î|];x y-u^$Z:fi9/D^"+C^޻9*xۧ- r*x+ta6o27- EoEN rv!gcׁq:9EDN`ypɷ̙`jo1[9yPplj9gmQq}cȉFNiZ`|xe[fʼnk*>O1EnvտE8nȋxyKۑd{Ur+E7Ƽk+@N{țҐegw3NrjW<:1d<RcDN:o#B,f o>rVyϮ3^߱ێߐs@"٘p.0N9D^{ FN7fstyAnx|w3?я% ~NEqLZ59`Z++qݍy7 9o+xk~y!/ y,#or(x?ǖ뱥o8wQ;EbpMz\xfP>?g8tO79YX fWn}y8/a,$ EnrM"' 91!-x0N 'Mo\=s? /-HbxTp^]!gƖIbK0>xx}}?-GVrw6f ;;c@)b D^xݍyExNPwy kq#MsY$8so7yc3^^,|{h0-DRR6Edgx-𒑗 %"S"ӘWyVp\[9xc'7g=woP]wa~|{7#r?k$uUqg?ikQ.|J}091ܡ5yyypy톩D0m1M(fs"L/ab6'%lN9q,6,+S6L=)aKYZսi)G-!Fڧ1_|q b{vVTW ٯwOHҎ3|$'|H:)?@;*؊8_1b+#_͔yIx,_|M~b o(q߯KH؉CG =ܩ%̏a\>bPȎ%~l_F0;%b^a0֮zBZ9nǖ6b=*`P!ȶ-~!kLj^ޓ)iþdy[Uڎ2Q7 gZ)FD[ݘى}܅Z.1IH @7ZS(i Y2kp!1(KRP<?! D XzOM] ?m> mvܾ--W+о5S)*kNe:WNݟC=(yq㗔?3o3):C)ɜ~<୧yS]@IH̍,p$%~s% R2Jmncw[Nɣجd0oVS2%EkoRQ,%~3q(Mzj {3%˜m!6ms$M;t.+%=v{-9:d{~=e %c6bQ2#Ss0u_!N:i±gkKXP0rЂMXw|o@k_kqQ{7Z[@OsBjJPHA 戭mڷh DP2(~(4ޠv=0H@/$2m JœucXjֺ'AAkA?~ ?1=!މ\֏p̢oP`>.S ˦$zdum=Bkm 0nP )KLdwu9XDN4&VȅZ&Ұ-F(h'حDŽ ÖWoA,^>SuCSaZLEױBPmDoJޱ3 鿰VTQ!71u 7{y+N $j"@Π[p|Ўúǐ-[]Wq}Ϟ݃{`AkP<,Xqw` ER @@B_=3=3\3"XrR OӲ!op<ٔFWӳq:;W-Wǻ'zE[ڦ7ĈwexYn2hL^`m~RÖ^s\q}^ߢ3qnѯǨ|^r*3u,҃2y^`.ȞxtL4|U.*ƪ>GP+b>fDVQ\DB26&0]/"߱4 !GGE$ߚǖ3^[h:/ zr=KJLLg.\)[ְ_ꎲg*Yі{:ZjR얂1$ 9K,Dܖ2t5ER`0 TtXQҽbԫZYL+<(M t Z*RRxyKM*jײ1Аdf6)R.[Kr^ϤlϢ-> a=ZG|[vYjf|tjoɯ3d)kؕRIlNtoK~іzLGl~/FEv9A{ޞHg?f>g ҁx=۟1Vl\gC㚯~c7`)BL@d)j, ƅ {(yoy3t8y~x?eQRs߽?btd9x̗c/Dh2($LǑ)ѪFg<<߯7# f=@Χb4rHȍ(FjFq|xF)PDLS&KYj:~B=XNiy%0ڷ^WGZDLyO~kA쁐1l9eCc%_E,ޣܿp"?=r\ k7/؃spʳvQz,Đ KmDGqťš͋AG55a>kT&e;J{Y^́%xϔKYO\?9ηa_Ws 7D˷߆h{gȞst32 S^@T!We=) OY 3"h}mg$_ΛGko6sːz`V㈈q3>R6t[طGJVkڳxg ~Nt~e2jofmkGaR*]lt۬5Pe7o{'ٞNj&wu gRz_ݎ=33:{Db'_xs4DOޏjzF> ºl}}#NrkK~ʔwԧ.f~guilf]:;^YwK=r)7,YDaƇ(emvi?b8FwB.U*R).=K>እƥٖK{1F{6g{pe|48nO/]/q>)hm .qp#Rti,:vi*478}8OX(&̓w]wm;/ĵQR>=Zbp)(K4!ߨHki/eD.5eo/p)ei|oM@0K}0soo#,Go ~ɾWqwXZbGiu;˾]}fE~u)WӇk~E0Џi!VMummy#t[3l CdikBPhͺk.|g(dk[3pڀ(1b#|]dZ`k2B󻭎XȹV;,+Yd)~Rs$Zla0fnډG(lb^T?!A(s~0}s iV [%f(|y@F`~5 }؁w(~y=x>#fsǑ4s ' ؏O(~zsz'OX;Hw,\%bs8xWxp_Uq5 Q㺭`xߠq1Ci;Fcv,\C[ԉ>XH~?HxF%4Codk/"=j'_ec( 'q[;!cP{dV.R<^F0r ~5xM\b$a?n>!b0B${F6 gܰsڄ؍pa z#0[GI__hQXp0q/VAh)jg <[ӱ7QzϜB;jF|d q'0b;‘EZ!%Hc9{tr9궣8 FF)؄1=C@LGyc9:ޱ7CB"w4H7 E/l?(Q?l;KrTcVRGͰ@d<G$wTO ~|#sJGCԎ2JqC>9&`72u Ș`A#928cH#QF 39mx9:%QQlm(hkdJ}-x5,1';Ny؎+x9a !ҹ j\B/q&LBu At+.Hޅ9b=-R&p0HVQn *FXW Jr.hF2CPYGP80(zR'&0+q+8"DTCKLeFJ ]WHQ9XĮXb 6VuT m1 j?FYu@/qHS1DZI,ID@m9:J5Qy lQF 6v0_dNOb6u ՛~LmN<`~bpKnI~1!Geи۞c4:3о3ԅ3ѣԝc|D؈kl=5He^sϐgۛ}; #Х?:xE_oH9Z07q0o;q@aapq}lm8#B] ҌbN#f`!hG5v:j@\+xsb2Bx}s/`n#RN Gc!D8ēQO21KBNUT `>"7L؋ d8Ñ{&kJ?DLG1j#yԁ3g1m:/$'.b>b΢2oiE+UIL]G࿖]G`z\-GM:, _Gۙ؈O읎!.Ӱ >a4VýNxe\pϑzf RS7Nw?sxLAE< p WŸGcFc8}AmxvkIXx1 Np ^"c79a#ayβ_@BC=,CdXP@['ݦ0hzy {x<mEG 0[t|SgU8si&,wQ;\@hbm&C܋Ÿ7< 0{q #ט`$zXa#>{s ȚxzXrɭ؏xƭA#dUCn[0אv&$85qqnUx Y an uL`'[Hs,Aq, u6&$sFݪ8 ܪq8 =^#O"Kqi#'[?`!}("F2z"^'[%g)*Θx\) 8)y.pIS0@n E4ԃe Sp NZ|Q0q/([ 0w1=e8W"R&tA "7V|(hh~ј+;?'*V&"!; 4zaa9P%Q-0ӰppC2d@6G4AktFO@, l.I\-FudBެIe%[SPLRlQ\S|%PB%Rb%*[)RZi䣴J _eT&}^YUٔ]9,[yW_TPTXETTT\%TRTZeTVT^TQTYUTUT]5TST[uTW?꫁~OjfjjVj-?Q[S{uPGuRguQWuSwPO>_j~o!aQ1+xMDMdMQj5]34S4[AZߵPXKT˴\+RZkV^QY[U۴];S[{Wu@uH討NO)..鲮誮:Znn/=C=co=S=S^kQ޲}'˸m61LL6qL\7 LB$6IIjۤ0)M*ڤ1>&Igқ d4w&d1YM609M.1yM>0M!S1EM1Sܔ0%M)Sڔ1eM9ST0M%ST1UM5S05M-S1uoilOifieZ?ƴ5L{t4Lgt5/bCK\tHwL9P(āz@tnⴾ&vj;icffffffffffe,U׾ٝxvҐ+"&bXyb ^boW'A`q8T&G#Qhq8V''Idq8U&Ng3Ylq8W' EbqT\&.W+UjqV\'7MfqU&nw;]nqW'CaxT<&O'SixV<'/KexU&^o7[mxW'GcT|&>_/WkV|'?OgU&~?_oW<, , KҰ , +ʰ  kڰ l l[l PP0&$ S`aP uP~hFhf- maG耝z` * AY0B'́0D`Bbay0Fa{>/p !p(p$G1p, p"')p*p&g9p.p!\%p)\p%\W5p-\ p#7-p+p'w=p/ <#(<$<O3,< "/+*&o;.!|')|%|_7-|#?/+'?/~\pq\ĥpi\py\Wĕpe\Wpu\ĵpm\p}pC7MpS 7-pK rJjqN) n֠^T:G?6`#6a3Nl6l#vN؉]؍=8w]pW wG^ ,!b#8s110<½q<ƒ<<£<<O“<O <³</‹/ «o›o»|‡| |§||_—|_ |·|?? ¯Ÿ¿~!1yhZi ZiZiZViZVi Z֢iZ֣i* i#ژ6Mi3ڜ-i+ښʩ*iMI46-mGTC yGSꨞ@D4ZڨӎA;Q'uQ7 ڙv]i7ڝTڃ4zOh6hOC4Haͥ((N4Bh>ڋ}h_ڏ@:CP:#H:cX:D:NST:N3L:Φs\:Χ B.KR.+JkZFn[Vn;N{^AzGQz'IzgYzEz^WUz^7Mzަw]zާC>OS>/Ko[G~_W~?OC5 LExQ^%xI^exY^xE^WUxU^W5xM^ux]^ 7xcބ7xsނxk. * <'do;p +eOZzs7r74nVnv;rĝ3xgޅwxwVyL>r?=y 9C<8< x/ޛ}y?ޟ >C0>#(>c8>O$>OS4>3,>s<>/ "/K2+*k:o&o[6;.{>!~G1~')~g9~_%~_W5~7-~w=~?#?O3/+o;'_7?/?)jRS YRUSţ~5FHT)h )J,ާ(6zznK #Jlaob_`-Ę]`M7W1[hjv_'O$W23 H:"Cy2Eeǘ`:c,!N*bcL3DdYtonNw#cfƶ136]хzȏS֊eȡj3 @hAtf&8̺oȡ3t~ǘc[EgY7a~ lێ͸޲^ϟ*zl =.^^+X4gP^JlQ (a%t뽑`hm[~+]_ߒI.*_9+ 4zz@I7u$w=jIew, Įأ$OnÆ("|p]7u|pE)1ti 2*,E'5)en laj9ǯJE'dP8Nøu-8_ Eb fS#h4s:R@L(GVL{X"1vSJւF1js&3PK> ?w5e&fOΉD )00z̙1(WȐ7dMey9ZX()W}&Cϓw'02s`o8FwtG&ޞcvbj`Zzޮၠ?,GN' )u$fƢD%J˓<#Cf<+LyV~iƐ"Udc;W uS7Χt<67%j{,j1lWX7z+iWl5o+:|i^o+ }'nVfvxV3GVif%F3;b ɌZ#Jщ747uKj4]Jxk nuGlfIx+q#:nǝm>@aw<,?Iʼr\ܙ$TWn]=F@+ Ja6PVP깺^7Mrf9xU&Oo9&P%'_}Uj'zDc_AQIYEUM٧PJGBI4:{՟l.ki6w=ƌˀ2p I,nʀd=)SS*T&)ke 2Fp Y"s fiu=ۥiENM&{pU*Ut7+Mvz9_ o7-rpɸmꑴih-Umsf.*yAM*xS[-|s) BdDX]#@@lRݳ Α NE~sQdn,\new.ՓIԓ<'8';s+Qunkqu;՝` NfdJ+3Iuyδ$)H_-8˙?ZS'_Lݔ2[>,kI:l *2ƠɇCcPIڞ$K%X|:թ=u:N'97R^귔}(G\BTs>+r?z>OY?O)=|ҟRBޗ? 8݌K߹0 t-ֺ72ci H߷]iǽpoc24Go&Z;T@N-L*&stHqMe**jwZ'1en["R骪TrW*iܓSF-ܓN=S |TGjP+dQu00I_*ǵF|jdpf(-,ގkZltxu@+WjU}aM)͝q~tJmfkr;%oI+O rbnKdZ\xs )?+44xK/EF?g h(^AqjARAVe%( SKR]}L5ŘҰ'PAZbNq*~i9)ԩRpD# Q((\G(+9_;+wV 1KT>A -u@ŝ\ǝkd(Zҕ CK][SKd! L&/*Orf/SQxg[V%ˁ۸Eo?b3Zubug 'Y%awfiz*Fv1xcџW C+RtGйrtûW cIOp'q^^Lavȧsx s >_E3r ZJiyvTO?] \t+"3"ADɯˆ9_ 0a< i~THEtE6h\kD\8YG&{R|,?"CW㐆5)Ne]mx$_Մ'h`iA R+/V@ dUN"XpTD w  kNώ#*AW1p|4`3c ~KQH/ǴitQ}:Fc* F"G E=Gup%+#Z :h.AYV 8@KwSl޷P y`D:1## _("8NM^OMwhF/WDEmK]G&(+WU="ِDu}q9[dwAuKe ыEs'Ӷ<>orp w1Շ'}ڤ$mu 2 !G_S`VK3OK0SV}bVW|3KjP6˄"i;6i&qomJffC:F5k*%x*V "n5E5b߾ Kga"R͢O2eHKv4lN3&P)x( YOi|Q}e}g@+lO yuյr۾|¸W[='G[Wޠh Zc݃I(h nC֔0^T2_,ًRmtjYB![w%~8|ao($" eYzX(4E.qa^%c`E/p/ qU1S ÒYi\M8ͨ;,8F"NC| F0S~@+]Tx3IDscO躈 ,fn{A^'spJsWoO6 q 4lIXtg,-//0=i0è#9a"$3 n6lZ c 'L'Y^Wch@*}tCU7ZL~r-~igg \ Vu-&@ϣ=QhXr DY`- `m 3MJo&Lo@@ܡMpuC5%$!cԫl0Zgǘ،P$)gd#hZR'䚜 jp*yhZ۝ BR/OKc7&AF rCGR?lyOzp.|ڣiZNI',: x+6 VVkm3GQӒޯ23 AT.aV_B)Vjrv©Y2RvoXZd泵d ؀Fɠ6, ]פ{l9>ِgB`m1dΈi%Dlc7{q$ OQIn(J'Qr".- ujI$MוCWzjd%1Mu_+#imR2)u_+|1>[G!=Wks9~) `s$U_G%BZ3JުRRt(}¢H3342v]cXƮb\$4◰wO^j'`CJ&~8E _&[Y ktX˥Z 5 CK]n8|@{m[ (dpkԱiڿ_ɔdٞΐT1/RseF:E]Jezi:9EhVNE`f.; ̌N=ӋMfВMm v/v(LZ3v/|G]}4f7kJY 'VKeX`4neEX7P۶V~@xHeAEm:C 2ZbM-C ai0JMsUN1bn=(VG*eg4Uy`@ UxQmۭbnwMs_b@.S6poHɾ/6`8սUmJJGJ_ء]u4~+}tRڈ:ibFi7J=4yyc?jܝfrA39pjCϨFNv1|7#:zFC 5~x=cJsN^ ) !<ܙfC{C{wr}ΕeGH XI# .$Z.JT$ΖW:%Kh84!a1LIq@ Iq@ +v80ݙfs._L??7JvIt_WjÒخ2{TTޗ(5˓fz3?`yFNڗ+0V^oI < e yoXya(VC?7ÝIxI-%)$<sKM |: {^舻h}#E=|97Ӆv q0oLxF99}]<'Ox Zv\/7酛GAezRB--ߚW>ee\_`ҕM^z @Pàv)o졮5uΕTNc<_I0?y,{YwgҽF1c64zEh.l ee7Ĵ\J7+Ycl_ u'۟̚c/k 7(=@ V`zԌj1G գvT`Nj~+$:=Y af#(f%zfFл _4'E4Ҋ!)9vhG\3+BR^rϏeX{Ԏf>](oe1wWa ^RWx0n>~oŹ[bbyeג K ܦX|q-~{[QXh{#JR প;L;*m=b6|I#- 2gR|lm-LJϺf+(D/y`ě* qOJ>z!3Q  vVu˖È]]m!J4,ѨiT* =T~ȮM _^X VRiX!s25Vvp&LUר29^BҴp隅w+4?s .pWX I=o͏}OuϞLFɸk՟&yj0,W*gvKE׳TO% ?$Q@f:- ;C--uZ{[[{ ڿjao͡3ԢjߢCgUվUy%R=ƥ^LMٖW"k{β Q|+)b3;^[ĐG!"5-nn{iv.:x?YN˂޲OpYP\^_>er2',U:놳Mp),Mٮ hɊ0 nzvF;-ܴ|f LF30ytlwnטnj#_+e/֐ Ӯ˟C ]u=#uݠ`9$Vg$*|vJ;.;%NS8;%NISZ TM$* JRU)pU *pU *\JWRRUIpUbDI5ڲM>v$jv=#Z{&0#lid/lY k*<0Du19T@3p=8Q(LDx%" DǦkiuo), {x^ţyn#x۪GYEڱ5YYU2._׽7ڬv 3o񼥛Җofy_,[bN3V{tF Q0^(1լ1#X`@D $#@6$+\l󣊚^Ynm[ŧf 'ϔl\  yj\Zq'nRo(Ζn-MN'j<6n(n[& ]C5.B)eBrcIبڜX\8x+@{~,Լc>G{i>@J޸~4?ſ\z\(cs%2m˛Man~jP ser$ q?/lit$D4ƍ4=yh^ zm۴zuE_ viòB&aӆQ)$t3@$*=ٱJEr$^ o)z8Ih#^g/MXw\JlQvȏ.={}{ #&#W\b;rIH"I_@Tb4ӎ;ϛ۳w! )Utgć{C}z>M"D[(@3Lg2HJB;d1Ic41u!YhykY7VX/e_ ݼ-f`Ml)6cc⡉xl4>j",#g'a>'YhKg*ssoT-c0TTl7ptE^Uu5 emlj8e[*)d˙OPTC9xRx+=d5(}%%d,9L'MSSlLffJ3r>URgfbw/WrvH--V|@V곊jSSZmJk3xbNA۞(_@dj(3 (dJ}6ϠhryĶsq[tz??quH)NO̖i\V3'OO.MHhStj:jY:5IEeB=3Ndgd$1;]7?cs_xU ]#Gl>\Y S=P4Xu1gM)H>\6m$^:k۳MR+ ts!Gcߨz5~]0uwDsJln8u$hmM.O]_Mj$wgklf^;}8([Ze 48dw` OQzl1KےA W_bڦ93 Y^Gm lqͿgl,>M B2[,jZ(NbI3:;];1[麆\Lbg׳,0u*:?€s/cf y'rQ-/ŵ]Bw0zm)ʛ{ng?M+ڐu,SNRǥFz`=UXEkski :Tߴi[o&/1lC7Lgg9o_Hמ%5|H|1u+"D2Ⱦios8jf_.Y**ټ&b8N2yV?vO6ι |VJgw}`$ m^8^ J^ϾrLwr^%BMjj]s~PEE7s΂Ծ%N4b]٪˶b6˃93>kPD(oB=U P E92$ $ \ ȏo_>hˏ""ooW!5"pxxr0 ,kG?^}@6]@Kx^n2<<\0G'ou$8.)qp." zs48p n -cE`0 ǀwON/| yQo_BÐpM{Sޔ+OT޷a޿8&˪VMաHOllR>Yj:"^FݪNFnM&ɟyQhR=,-3GYc'XVnSJ?\!G&m}BN .%",[c*'?o@;$V‏3^|w3jFL\'F =2w gLb~^J1&|.:Av,7^fvw~0jo ֎m-^qQư^))Ba9(BnPg'ylYyPwr}`G. uDȯn]'Qqk1!H\svrwF{W& 32nP>YѐO<+r؜,9ZwEq}G^ ~aP߃3A?eބ&s|sp—ϐeǠWȜPm-Ź0//)(ҎsoVG8yXIѭeU}@=찺\vnrswzE{WfIxaq rrQe[G)HuZ&=mQ}կ.9? $lrBWɢac-,:,ckQK$t Hd5e&*ƱqY_G8ә!%mu]uvۆ䐻6֖l1NB.ڳ;&#zS0} CK*,Dy:LUrὊe+Ն 2>@qbƘ$ PӉA((vgIRf$ȵ_&i7>RrګE8&oٿ&1w":v}E|SW':TY,6~亞86tiIC&_39[;Mi@@ Ҝ{AЄA4 }Ct3M##F A@ @@@ yw߾66p9s< 0;ݞ_I3fqOa_1?w+gk? }VޞeקoG_/FgW^ G:z^Fw /uUX|ׁݳ/_ѿ*/pS;~o{瀚~mu;N'2s,30@AtB(QEQ Q!Đ$ʠ,ʡ<*"*2*:j&A-tݣ ZZAhvh ="+2*:k&a-vݳ [5{`ȶl쉝3;3x_kQq3q3ȍ|[{y',QTW*ZETTT\UEUUMUC5Սj[Vw^uTEWuMuC7n[w^wtWY;&`ʄL\AH1Y3yS0ES2eS1US3u0MscZִ͝75=734#3635337 4+6fcH\ k!Q#q 0I2$Kr$O HJL*JjNInHܒ,˳"Y.dxCpl $n=x@^q hiE 56@hZIhjb@ Z@J(!M d10@VQY+7Fܘp+ݬwn٭uܶ{vݾ;tԝKwnܭw= {/%M {tGI Ȑڥ=ڧ:#::3: +tC>}g +bav",b, 1<&YeY'O Eqν8r@;Ϡ APP4t *$Z@MSUMܚ_nC6g7bSReTVT^TQ>]S}5PC5Rc5QS5SsPKRk6QmNAՓ:guV蠾!:::fRgtVt^tQtYzzzzzzAo>'} iaB^dqό".Q5?;Ϗ6/Wگ%=1)9Y%Y5y HdG@䉜39h^ kQq2QI34Ks4O HKL+JkNIoh6~;KS2JS^Czt^mfb8[7]\iNd=Ⱥw3]HúƋ_l#;/.[X.8N-nS|n|&>2@eRvdYh|bXO1198(> *ʮ&RTydH慩+6M$C^ؤp G￸Ww}~Ǻ'{_}cgW/ S({t^֗qK ;wN.g>9؉yq)촼B9WeSCK \L7>ӾU!u9sT*EB(D"K% !!dϞl+!k!|).w?^ci9|S2$5 Z:vEP)̱n {Eb_1u ԉ\3-)y! HMJ=~T5ZHnS-M|\!Hє,X6 콌 eyzf;0cc 7wn ˧@G~kŇQ vBpprnNV:&Eu#(_$â@րWߎ@:v@P_&+Н13jŽc+ Mʄ.!#w eҋL!/Udddd'p9I5pT)'=- ڪEuQ j u:AS4N{t7Ttdd0:3E sQ{ʇ#K{aT0P,v9ێs8/.Mfsk@*CPSE"R1^ k (M-QQMW 9 L!v>Kk'D&qyn$ťK$ju0nF8pagl$pWYBf̨ʻYOϐokfl7ց@́e~js9*y&PUE]s'XjIprE") K U!OH#jvAt2 4xU0k`l9hd9c-&n{!X|6??ŭ@vJ R`.sȝ`=}$Q%$Ug%# Qt/ ISF kb#tc_xvFQOX% <"wsPP V[#]# •YY=P:Eg ~m/z6S3zByCGa)LlP.`oϘct__S![<&d[З"g:%IHJ&HҤgS蓠BMr04 CikQ.\aGA@G #M'\LR`z֋@?HfHVJ5@q\Wz{MZ/}(ՠR#iZDĬcv2//zW6C"wۡxhY{G#{!#2&fI<$EdWPIdԀJeebCW-U) S1\1JIqEb-q ^܂y|GCZ퍎@ǡdt%hm 6bp47'q/"|-_pѵ 8v'p+5Avw977Er#c/mpkO pw:/YRH&"4΁n}[öbyMIOH*#Ջw.9 4uARQIpp8ǂp\0먐)"D,=2 ge$x㖤QV-'HCoH_I(3z'b0FU yz@=^Q ݙN#x =Lat$Cǂ@O Og׃UUP1Vd_vNez#a`s1%p#Ag\]l_p9՜BRя]` My:y8~5{kC+O/p(ZB;ɞT!427lU(*jy"xh1 J^ 2d:K9&pmK9ʜ?f/KbncQXƯoOly`"(nwIOJjQf j>UCt2m# bg3pXX^.Aрj3x0 ^_&CErQ!{ST y P& k&̂.)I QVATQ& ; g0%+,R!uJYS,vnq{JzBA8XUlL7Τ:cd$ogݔޕւ/qZ ܘQD*2WUU4*l i'"G ᐦO Qt5cװ@aJ")9'D$!ǃq YM>&Y$l*AQt$z3e`0 Wa/XrV3 ib⌢Eެ3!t,oY`?+>bS0{x@4Pҍ&!yQIAb .-T),'WJI]b HImmx(}*B9P8՛ I5M)ZHCN%d;˞˺H{әYQw[ʇb ʿɕQ9t٫^9r^gJc=(^1[L]!Ti[})OY Cxlv 2 gї'NWI=@r:4 |, DC~"zȒ@K,Oϑ jQ^e?C~~30S+3W 'eaω:2BC%"ƀƞ@]02%Cx| t?/8 6 J$8D_b&@v,y4^OYx';\ I. \$h2iY5~=+3Oޑ}s. .H8 p>wW;U +&.f_.HȪcfCV=.xM+CW@M6CߠPc\/`!'56|eI lv#Ǔ+g\2N LyTZ!md޻(K:DoF.j#w>VASpO~ A78L\# .CfC'o3W;d wE_( D xTZA[%ҝO Э,e! $ gwhol8 _Gjwδ3-Ƒ'ǝBrM,@AA؇>A &ac'`jf=Nldֳ:-?:W;$Z*aXGX7bCi/ \7MpK+nL #rufQNMHk` I&)d6ԫ $͛d-VQb.J%K$9<$%U[Dz@HHU*FCKRF5~_.wЧ!ޣ{e11ٲcʞy0 ("/  eG2StKc{[ |A){g}϶93pNhb5s͊ςSgWd&y|Fڢ0st<>˜ֽkEMЗajɧMydXj1'mL?^I Fc) ,k/D3yyH_#@CY^ȭqgػ 9w.KDs KN[1\ϵ[{]?"74 pr|8cW]W 1K3&*H|vKI:J3 ?S^tj ujCmHjβ&-8r'f 9LY-9rsD&?O-eqf58Wn9P[Ebdnz8+!p"Nu Lxm>t%MN&7I}_22b$dH%%k%${$G$g, UդRH RJ(ߕ |Fi EpuwREYRN73ʡBaI S Z:ђ : : 2w>ԳJ@OdL#-* CoE1S f3S$No"xFWCd$FJ2J @GMy >T 1SRT, PcMA]qo<4,մx8/ P"|[DT D3h%$ n^rl%xkohp9aS$J)ސ߭ԲSHZ޺ߛdI!ŽHYB/@74A/ІGң:8>O??@UHiP"s ɯMMf\` 1֡zWpB~֚ub.jUo*:q\td`\aC%p] dCpUxR͊"E)dz`TDwZ5 IRn=ٌ!Pz9Ҍ|d4-DK hbX4by`ϖ+@⍏xޣ !OK7(ԼԸ\“6 V/Ayk83!H*$Po~fIx4G/,H{נ=hTuV3;Pd})Tm܊@Y, YT]Wf? P@y*s ֒ hϕ@+&9ҐEXg*hpήP,p\ 9,:B1*YQnRE\xD"H4~)G*|] I!( BYhzp"V6xyq賱Ī}L[G@E[4CEEz^[V!]j5|UɫK~?P8@q$ZojӺ1>_rѕ&a݌1`^d**?P-*y>AWBn0m 5vVdAjV/Vנٵr:_VNkёC]ѠWkᆬ)k:lt+xcy4C}˸NP ka[iPQ.w+Q3P̳w"P\yFG (@(VL{4w.pw%v ƯhPЊ\'Zq#hʯ[a}N|!4 d2_H(aO5ui3}4H'[ ט;J_0[tkKk+w4ՠ Tf+C~Dp99PҟxoqځPD`&]n`~_1w뎂d@fw& xݘL+ACj ]~`yնlhA.ݲ+m~Mb4xԽ[N*Oo 078zƹjnZB6'.E dx|[ ]|g@ BMB |֚w)^_6&(Par&.' {uHcPi?a7f*:vg6KJӮDfP fiK7(.Z)UWI׃IrY`6Xa[]؏LTE:~jM6Lj|MG3erU_T-V+Vc)^y6 <|1b& 9HnCDa> Uomߩn?2"v120 ;~lTeqc[>B,+sSb,z9#tQL#bI 7#EkvC4+&.:2WBgžhĺL#'ƄG"οXU*n !RJEMԷk-8GX.S LGNqkYvCqJ`sUR-t_YO=<8WƵI_ōsaG;U/T9_V%u?&$N0bĉ_m C&J/ Q_ȅO\>J/_f}A>,D#OK/1sw{LH ީӖixI?-jҫѣfƻtN^'VOkˆ"f0fz*U C\FI03*Cf*HdCkqZ/>Ogqrw$xwK'st NccF:ŏ0g* Et jAUUuXx([_`ҤI3' vQA~<wIk;(,6h_e yy_]է)`:.׶Wg.vl|c SQ7 ;`͠lgdݷcuMD.HXk7ߓsɣw,18aw,֊yWj/ˊ)~ocϜ]OYӰX6 MJ~7h޾G{.+ṿvgRs#^ɔ7OK,;;sFAig G"=bv]5_t1|x 3@cW;U2k kWG/! kĪ&<"?fx_ 8N&2 "k}_<SΠul&B[Ӵ G.ۢ,{Amr`bF]-jotPiVUo>9Kzj;}>4aI^gҢ7Ϧo~lif%m;Y[XγҦ)ouV=eUXc[;كVzZۃS2"jcjc =vڔ3]q򞽷/~K~Uښ6|n}*]~Rjqq'S(HПU쪫FaG7Rn輬g|s`)YvUsMN3dSoo4]]⦅*? KZmEiQ1ؤz,Ƒ&^^M-7qg&Xꆩ:䯊ִ}{ƪ }7_9d[X# &SN,.4]Q̽pQTxk+fϷA7f.#y5]*DwY1# lj]A i]MZ>4"swl v}/wj jlxر@P(3_-'$DI,001 3&w?c]:"GVZZ?t}s~}YL}Z_&i9ҳ)kCƭ~k'd\:uƍo rs;[cdӆ_uȮJf_b>m,}27qQu"?Tܙwo7z'R|w}Χl>f]XK jCuo*Džwk.0ekr*dRІyϵ]8P~P3D#2i3X]EQ_O'+6**ЁH;5b$VQgzuڜPf3:vAJ*:Z"pQ/L05i`|Qtp}eHo-WssCk$X/,)b_Jb`}糱N؞l|,d oF=G[ꗓl\:zXy`%&=uqVC̹ N `OUYͺ7 )5RWo_>H W6[Qj.[u̵g 6,T0~iqL>6_q 2u59|~>>Y8*%7Wǐ[;bc,5x:="vݧv]5#WS,\;2qq}%f o'\M_C.|9K/o/;Gn7}~AӲwPZ $/;TG{=9-6Wnaj%qǾ?;%a;+\T}8zɈw+ں;t+L;NYYȘo#?M|w h_▵CԧwTnݣ6/gǴMm{jI{1 x,>b=k'4OtF'_udm3/W_c?{Ȧ4eoG䴐oJ2wmxAؿ=S'ooO "ǰߊ0Rv}R}틓 1vpRe/to)Nu \iZk&N/gNx3e{kW9qj5ݵMȐ7[l졔n jm_N:*h#9k'YkM~~L3QVnអ%W 6$n۝lų &tv6kH~cYYҳ8ri1<ݴ"ɡA>VrS8 h?hr$vX}~ϧM~DO)Zkj*:NFvKC~o T֫sHlfS}YT;s~E DI_}~Z0 *bQ-{>chk+`v~\%osWD0!fu:vq򢂪[1}aVP?occ4?MfEc)M^۸ٳ'pp/-2L;~F>s^]V1}#3E[dOyj4C\AСoc~nx\Q":D1ߺyMmVQvd# ihu#9Ў~9pv:|M'ґћ_nq~ms ⃋\>kKLQGb6W{xvMM3vK33Ovۀq7O \WՏy>p݀;z{hþnywhC1jInݻSZݩ6{#UnHޡ⧂*b|9rԏ7exKSKl:/`l>XLL:[rRL~6Is"][)CPuTJ*ϛC{Nu|f[1SOwhܖԥf"GkPQKiYYf"dJOdc[yio9vt}\Cz{=DkNW<2էSfqkvY beӍ_ j[,3Vov|P$Gy 07`AȜk I5wYt̀wg"vyӾ1.Μ'/߭Cul1D=F$er ?9|>mzgrl'/f XO I,> FX8J#iw%c"^IA*'v JKͯ?5c יYC=B 9<3=|?"6>Tua׽*QwWG߲jl[:J/rp⪦%qbN@lA*?YM3t(Q*JOwOwܸ{CQ#S-4VŞM֛yP{3kyHm˞xbM5벻0EcMQ™>=vWOr?ԥP`ٱCum|k܁6r燯F$88e) 뤔]uuGh⇤OARUN˪@R/Z AZ H CHeE"D]RQx=P=mko갽zT}뽁Vk\:dR5D:wNnP+ Q+st'G̞j3zggaUWҲ;斞;hlP'Q]9>ަwiE9F}*pL1?%S׽4ygǺ &f??9Dg)5d6O=ˌK]=?&#+N63t{>Ȧm ?f痻EQuG$gM7MhĐ]i7dkEqۅv }rsB !2 8tJ/v(ý1KϵH6[ pAcXa5=+wNT6s TLx0mExn^/1 ] ~5:`Ynla捻)I[x=_Fn=w`kn)*cS/kr̢Y\P;纠Ǿ>e'g;؃pcٗmzx ?yխ{Gj_:Ƶ]jI5p9b4@a0,8*fմS_*@>u`-eLa͛ec#beԾՇ_պ}}G}4*(-뺱4oVEC vq9?eAKZS. jT? fJJm 9ҺEKH~}1F$ɑvElZH[Ml1-vo?͈m(uSBNvl>.&#n*s'f5 L C#m^fҹSJivxdPnONp& u;K3O($%GOl f0þff3]ܝ^sd6 PxhSmrո3F+/sXuÕg7C m嫶hoِhZdcGD*\xKYasŪ};`DC;z-\4z+i{xYk[ذ.hxe6;k荋+OWWUD=Zq 64_i,FRΉ /NWl#"&N>w>PGtN(R)ׯo×T|4(#ɨ3#}ܔx.>0HgTvgom7wy''Uw:|8c3+EbfN0}brEE;6:NNeϨߝ"노t_za~U[uNo{.Yy{ӓWWDee~9|ݓ}uw3.|uUfL[62+qclUmG/Tuv Z PqY'yUgrO7>K)mUfNaڞ[Y{e *leiNv|WQ%>l^Qc'mI9I>ԹԒ fͥɟ;@zBw)3rίu[}E--̥>5{\6 r0v\Nv޳㎫|߸kNxso|=jc٥@UF|?Vf7knIn_ Yx/!ó-$U/ Xeri>=>^JeC 8 -nhYZ08j.*6'wO?>:],~`''=*764PͼSqZk௧ rpR)Z,ciwzJʴl=tB#}Fj,HOýΧcBf^I?zygIL 0scbyUknX0pZڮ]/]3IQ'$Cii~N%^3- ;.G]!T`D:"KVLwO|u^eYZL۔߫˟Q]~P=~uHsq:n]-$xx @a"ف{V,|73꘸EWwᳩO͉1%PzYxA+%Q|9M:gYOnl~3bbx*cwMڵ5%q'0?䅷^}|HWZVھ]yLe9f}P6F5<15s95 XM%%w~f.:}֎sw"7:ԉvF͙6Uy"4LHh9&fZjbMJח;$Zr I9RRoY"ԾĝG]) to9ο?KK#-}'o=6|V(}t6n3!cC~!iI@deM1j@Zw`D s[Pv*O%?{sBHZkZ?l1Do#3ׂ?Loxg,p=ns=Jڕkܻn#9\eL'vV1vrL*egz[Oe;Lty򵟙|s EW[kR^9I훾U[v J`'W6voTdHڜJ#+n }=</ZBu}aӞ-v)k^sV7ǖ./)m0}rc /nj_?9æ o^!|Uʅ[m/|6H77ty\>xH3$Km|.[w{ճ8'*Ѽ`U*`3LjX1c&X02fk_رZ6O+8MΆΛຟf!n9V|us{z_.Lx4|?M$<ڷjD:"1]AՄ`~.S_^I$R+-Qu/ f ة[~*X$(>7\'jPe|F@("#Oʔ g:r@1pa aڼH1[Z^[xS|\pG[YxM **Ν0 q.$5-ȀgIPYQ<|N^&\N?`%Htz6|Wmg߹*zJ]I}Ն'ETEYY?|_Wڟ|)|ׯ˗*9%ufڬs˜`a֢K.[byk׮[_a[n+ܾcgQ%{+`١Gʏ;~gΞ;UW^~w޻_S[ O>{ecӫo߾{_~.+)khjioШ}&L-,:[tͶ{v)R)lxxDdԈ蘑Fǎ7.~|„'O<,$4u?.\{{xׯio߾1/W4}ʭ|;?#; RS- NR(|p)Q$_]QMd]&0WM4괚h6\)5_|_ݨ&oDk¾nNUIS9euQLYyGS .r.F'D(\>w5EOe\6n('n牽$߷ +Dp/;&_qx9CKu|TGkn(Z[!CRJbŊCBRZ\i){~%~9{f;lBEZP'qn! rssϹ(dXa[:Ks,ɷ,SE ?%Rhѿ-i1q^т6ՖCm67H2.מ<'*X/$$1)EFr4N/ ny _%9FȊ!8?m$}JRfGʞqLG%Cc% %yc,tZ4>%}omuҚ縤&ូ5iϱBr.'4[P淔-M^'|:s?YLar519^xV_ly0!퐩7/=k:$7gI=Uj-_n8x'Sʻ5ܖwmhS^Rt-Iby9z̸wl.װ"uqel0Ж1&z?;ג&+Sj-yюy{l%׸̵?m+s-`WPgx؜qmw-gp`mK _(KVF#j.Wx0vq?r/ÔTKs2hD_%q3WiJɵJ 2'ıK~%vĥqK.VuJjJS2;%ik2bzgGjb`!r6t?"o/|CF(MuJܚR^o^n%wVڠcSJZTPn&JjR&JNiG5)wYCWҬSޗ:ɾ/5g;zj=)94GIJ'6M9ކSҤJڞVRj0ishNj:\V4DGz;lfm˿)3:GPI@$$R"_T$I"HjITM5N" Z$mH$$zmM"]vsBiI;[aZi((k;*'=~0 Q)&>9C-}mmډ6=QC=ص8#66Hqa1MJ꺼)OQUe> fN9tg2ySdn#?ԝ3t'S*b[S8ƪK;^^Ö۲1'Yaﴉϴ)S1*rtG %/mZ2 [9%K~ԾaKP)]ZN"#{YNy7 cgSN)=xI |3u1y,/MdDydl)Ni\)ӆ3G繽-ʗFPiﺱeCv#£?$D/ɁռdRr\u-4DN?UnsIDHe.mY@ܔ{Q)]( ,ZeVn%}[Zb:#4,}鷪5m?!o'h(4vjS*dMɪ4TUɅNZ)]wAcK}TmKBWZe0%uN#CMƅ3C&z5TRk ֗+NF&k39$8CN|ZER9L2ֈ߿TBh6h!!8KԧC.}鐵9r7,'&r17F g}scj)Ɯ(V9z![h__yqBڹ(9r~.qD&)&gv)wQ_E׸V%%ϣ :|ZE~ yؔ)y~L?q:ަCtqvJNɅ*C X\Rh-9a-_$vz_?}yT~"M + YoHAJ tH|܄w)UK4!}^Ǩ;I뮒iEqEzk@8 Kq.ə)>rx֓B~U eE L]%b)]e8b00ʥLd.cJs|alem&wjr?SSIuI]k# cGJ^qf4\0d,م(}!5pp6C\)g89$.]t#TKH{=|1qr%.!s /W6CG8(µ1p'c wva Nn\C~X'/~cz!wV38Gּp%C9d&B;_X 8Ǵ#9!p܋G[}udC6rmuIta&ns.| :d'dz G98&lxrzrb h'J"}C{`qr<1^߃5pV;zSTYQ'#Fu7^{青3#19kY[;3jynFHܘ=1Yup葬﫲okLiY#PAsc-Ḿ '0nPƻCXmNV7߃:O92$C;%Yܻz}T^s&9x^Cb\6M֐6C*rt!]`g|ly;e=c҉zR=}W>,(fqOAt V1{ƕ-Sؒ_RD_YQ㝜23KjNd$MR.aߐy9Jz$9,ϘCMtӂ.3q9}ޞwk|69za.]. / F F"K{ //K9S yňCC9%35 }ޓ%(}h2smM~ź?{x>k&ی]gtJ)b0'=vIgn}sH t3ojK<ij1Cance ~.ܯ4|H:hqE`'RVaA}O8X N*wBpdA{?OKrQn+r Dgsc.gm)P>?L+d jv}uK|xw$YK<˲)l§>Tk)ӊ"]k =zbG(ؤ胸,' x` GJx|\"Xxߋwof$!TNI"NkV~|IpQ|Su🶌;d# :Ⱥvܖm-kzwѤ!Z,;WGeYwǰ;Ws&fo)YLMTR>J]2?k7:lr]J94IΖ]yN)rXuuD+zge1Ka'ȬI)uŖ21hbLB8OC 5tو1NG8&|V$ ]r}L%Y'>bS]dv]r28Ke&6CX._u%G0!Kآsfg2Цr~ J6xs\sY :xdW!<"6\T%Kjw祈˸$OYlCr.َ]2%U]N5.)YW%de=4pɕ28Kh쒦M\RIq<!M]r@E tsd;9mE{lj ^whs!.3)ui{#gKִqɷ.rIHK}'撲]rz'A\bh}]kt?StE[_p`K2NpII.I>ĕLdm*\Gp5O3NwI{ 8~?87}zYkw?^%Va riˆyK읷PF&\Ӥ l/a iֺU&+#nѤ {o-u4&}kK,|=m?y^q㟚/sިG{i_Tg΍Yק붻daT'>ːK LvqB5An*7KrtɅ[.tϰ )_( eL=>G~o3 rcsߍ9ɔ)H2J R!{9s)3}FCp,K>b2)b+]N7t`=)9ϜEY*dC9\&Vh1TIe L#GRL*q'I$^%ğa3v{.[xNQ$L%%k.XVUpm$.?P .5xSIJU2oN-ܕ861\jQĄ_ >+a‿ R3.aL9.?uRə=Iſ<tT"UԯGJ$SJjqOzx+bMྯ>77hFu=b=ĵ/AXKskpnX(6B=2rNeG1d4틖q[ Qe8sH6@bv/8NJT LZ]dǜAWE d&P?D{F^X-a! w-Zc_& Sp~Z|g\c&b:a VWl^\u܃>@ dD>Ee|GO h|؄8 SEr|Q h$,zyEU4QA{qWp)oD4Btt,ZlaU܃1yȍ2hG'PLl&!|JdGiGKtBo H|0˰`74."<(FFڣb0`fG8x y ' 6 `$&`*Wl%܆#9PeP > XM؁8skmkR!3 ?5 0c13 6a?N/\]R =r ʢ"耞IU،8g )*.!#0 k;8. =#J6aX؄}8x$K(1JPtxjS R2ʠ*j#!QXM؉8{p.I,ȍ(jh z?c~<,jl)\]C:c8fa-*P?EuGs+ D"o؊gqB9O@KD`b:a 9ȋ(4F+D `c`9a 86Ȇ(hVD0 u؂8K k >@N/Z"b2` 6`.aEG T?_c(c`6a' _iP hVF7(L<,F!% 7 9Q>Zhh>Y˱q q&Hȋ(?!vaIy +['pwaof\!$*6Z a2`56 NC1|&E4?ca#vOِ "~1YXU؈m؏0;BAA%B#No01K['p7^[yPh6AW42l.9\8Q>2m0Ӱ$U m;=|F)TF4FB10c6~ 8xd;KȄ\(2 4BsD;b,G6y܂ !!>{p]<+Q }0 0+$.!,dCA ".腁%X8lC*d@/>C}4C8:'`8&, =8qB:d7>EBc4G$/cfb7E܂ىH%Q5Fbb b+x3(r-QYXX-8Ӹ0Y1."-bcv Nñ1RCdCD CUCS%Bv11s˱v 2nCm@Z|ȃ(?s荁1X%Xu؄؍8sk]AF7ST@5FC4A0Z! ]0#1g:l6!_톤HȄȃ|(ATA F4A0Z-:+z<Z`$`V7A%( ȃ(TD5A#4AZ  1#10?ca3c?4.8ڋHLȋ( Zhfh0D+z?b &c6aa%CX! 2" $ʣ!-0 01?cc3v/\ſ03nRdAN|B(2jFDKDDo L,,jl!?P'xPQh#1S0 k['*>I_ >D6EACiGD4E"=11 + 6a(N"nSHȂ<(2@-:'`8b2f`>lq4Ȉȃ(2hA[tDO HX؂=8p8:Ȅ(Ҩ4^QX_ {q gq\iQ%P&p#}0#1ӱ˰[pq wbk!XbC)I%I%#JrI!)=I%%t^ޗCH2HF$%dl]rHN%%䕏'c}A)$bR\JHI)%Ji)#>+e RQ*Ie*TjR]jԔZR[H]'4F4/HS f$BZJ*m$L%BJdq#tI:K*K.=+)2@ F*d2JF˷2F8/d|'d|/SdL̐2Kf+d,,gY,Kd,BV*Y-kY+dl&d.*d쐝Kv}_A9$crRNi9#g%yG.E$\kr]nM%ܕܗP+]TCy)J\*zG*zORUVSHePU&YeQYU6]P9U.[QyOWު* ª*⪄*JOUiUF(_UVSTEUIUV~LUUTuUC꨺\5V_&*@5U Rʭ QTkڨ0"T[TQT{AuTTgEuUԗ꡾R=U/[Q}תjF VCP5L W#H5JVߪ1jƫ jNMRj5CTl5GU|@-T?E'ZjZVjZ֨_ZNWFMmREmUvCTnGU~u@TauDUԟ:NS:Ϊs/:QEuI]VWUuM]W7MuKVw]z<!4]34S4[sh^SKZ2]-BKRkiZ:-A˨e2kYZ6-C˩rky'Z>- jZVL+JjOZGjZVIiUϴZ5VCjjZVO5jϵZ-@kjʹ -Xsk͵ZK-DkB6ZEhmH-JbvZ{Quֺh]nڗZwSh}~Zm6P} ֆhCapm6R־hcqxm6QNM־צhSitm6Shsy|mPQ[-֖hKermR[hhkuzmQUMۤm~жh[mvmSۥh{}~vP;֎hGcڟqvR;hgs_yvQ]֮hWkuvShw{}P{¯tMuC7uKu;$KO'Փ){z*=FOz&=EϪgӳ9z.=Gϫz^H/ыz ^JT/}t_^N/W+ʺ^ELWӫ5t^KzH\o7zL҃u\oCVzk=TozVԣh=Fo;NzgUw{_=^zoWZA7`}>TG#Qh[}>V'Id{}>UOg3Yl}>W EOb}T_/W+Uj}V_7_Mfw}Uߦow;]n}WߧCa~T?O'Si~V?/Ke~U_o7[m~WWG<aa0 pId;ƻFr#xHe6itFz}C##dd6YlFv#e6yO|F~(`4 "FQQ(a4J2k5 FEQ3UjFuo4j:F]Qh`44/&F4AF6-F5Zm0#܈0FmFlt1݌/F+m1_c1l 1Ìc1m|k1c1ɘl|oL1ӌ c1˘m1cXl,1ˌ cXm1~1clnal1یcm1q8l1nj? q8m1猿?qɸl\1׌ q˸m1OiitILLfck&7S)Tfj3Lg77?0?4?23Lff3ff7s9\fn3g7fAY,b5fIY,cfYYެ`V4+M?YլfV7kfMY۬c5fClbM@dnlif 3iFflov0;fn02{fo0os9n0Gs9oN0'ߙs9͜n`0gs9Ϝo.0?̟̟s\n0Ws\on07sn0wso0y0YeXeY尼,rYId;ֻVr+zJeXitVz}C#+deXYlVv+eXyO|V~*` Y"VQU*aJYZ2kY VEUXYUjVuoմjY:V]Uj`5Y[/&V YAV嶚[-VjmZm0+܊ZVmXVluZݬ/V+mZ_[k5l Zìk5m}kZk5ɚl}oMZӬ k5˚mͱZkZl-Zˬ kZm~ZklnamZ۬kmZu:lZǬ? u:mZ笿?uɺl]Z׬ u˺mݱZZ 5[ ۴-۶.;~~NnS٩v;Noo`hdg3ڙv;nsڹv;o{v!].j%v)S]}v9]hW+~v3]ͮnװv-]Ǯk׳ v#sځv3;vs[٭Pfv[;Ҏ`w;ٝ.vWae{ٽ>v_k`؃!P{=aG٣o1X{=ޞ`O'ٓ)T{=aϴgٳ9\ZzjyIphdPnuLeԎ 5~`wt`HhO𰠘HwXPG|6hȧы|}vPKwpL;?<4%kt||퓨B+4MP.0,׼^]Sjt`d wkV%j$EwHk-cQ1abGk Is D\ 1/ÚJ+?rQ 6$*u+s]ݎ ʓz zʯ9_r:!m""Yq"ЯoH\aO#0::0eb ~sW^3"ʋD=owdTXoJlm!JM y<3_B۹#bE1t]Dl1WK\7\*e$aT@T;(?MܝrP>q"cڸ[yF4 {ZDE1@{*) sGELo\d:g̀hmn!Q dž]Tqk‰|, 0;Vy ۇGDeK>z>/LL"o'[MM_oH1aQ1ᑞM cN?~_i?l-_V~f2![$3mWo=IM[ v=ӛ'g~]\ Do?])J\VO5 4m {|Ҁyt~ɪe-vJW/'6ۭBŴ/_ ^⽐SRlsqT@WN>?} ?W+&wӿG2K %`BXOO zOO'D?VIed>olFxrQQDm}"x\6l{m[zl Ŷ|(.{Bѕ"c"x/O}'jJ@\pl=Յ/ʸv/xSĦ 7u"^7IR!M)*FϟH<_F$#l[8* ~aƧӦ;Fz!1A.#XjԮ玌z!зoBONbQ@ +Lb7د,WPܙ 6\3w<pWG~mǕyun =[wU}7Z zK8mU<új¬}Sاss/*a>m9'*PS- ~?][k yU GNo,Og y۬-#cB;>4oS_f,0&)aLܬ d kwX`[n k,_噊Qɟ5xSFoZa ?cO<[{o ?]mB3eM߲US8ܞ" o;IoB6BozY7>jńǦ~ծ7tGU V/A?M|*w{D?t` ߸tջߛkǙ_2K+ j[DŽ{"0$,ѓ7쯙 I\Il>k쩌3I={kBĥep9 _7D@WSuc4z1""4yLK~j5J݀Juʳ_(~3tI>qt=ķe+2/aptxQg=Ihg"|*}0jڑۏu}~cnωE*U cse㗁3q{ɩjxy>"o c<^o#}BZ%\xT'E%2":> F~IҸ=ǭ/bt?2CK}}pՕ畭`ȼGB(IIAeKƒ%[6^ZկߣkMb@xѮv0ڤBlBQ>)H23-fbOp&ѷ%yvu=s=Wܽ6./'U$IξLG(TCt." 4tۺuTi-Oѻi5HiCԷwsΡ΁Ѿ]#jOҮJ7h{z /lzT)RE-Nt~7!7&, rLYfؽu??'G$KM.u^7RҘ*'q=-s5A+9œwpGZ)l֜wrʞ_ɥ>Hή5I_4IŤѴoAuXOwsnz>o䤥ȱm[ngL[De)%둞*ms)~ۮK[ zWlrxQCOnށ+/{H+{ڈ0}oeu)46OsҰjw6McҿQ=y'd2Y&kd +YZ^ý`M}w50×@nJ΀un*_\TD^"4:58-nm$J3Ր1q 'B*k4aPPp:"@LQB{]Kd 1ǛՀj`q+RFɕ3ޙ(Q%٪mް>7LrvAeg*f"Ʉl(Di 6%pyeYS.4N4wzUjå/նEҸÔOI<'jw209ވWst?U &;`TD) +5n bujBt0Fxn#9r]"clˆQiJ+X̑J=(A |Zk-^mic/RzdCl )v Rբ3"} q,6'ڱyi,ꁑӪKEwZ^j(AyJQ탩ƒ4;0AuBsAtB8:TG oKZXLr *Bt؉j)7g*5T3–F.Z)%/by𪾈~ 'iqK*f?#'>&d1gI<|8`q4qUS3;@dl"[:QZ&Sj%MsiVBIZMFn6챊2WgY0$Qw MOIԊ .+tjɛIҸ$=fQUS( e -M>fD>i4JJ2{&f3,NsI!Lo.JS1tU^)Ǎ+R FpPbӨh㉡N=Ӯֈid#6i,ˀjj79rC2ǁGxLkJ)ĔY !yԡ#WR٧S_-N}py(bIJ+I-(I+}8`R/K5Fũr5G€q^ំrdǧ/NFYy3ac86Uq'K+VIɱ"R̩CɭLЇCDMzqw}nED.`Sˤ`ĵk҅ f ѐ\&zcJ (FvC5ٰH[7Y-b =xsb‹Jz47vټK$gslXo'Ẉm=i5 ݰ\Ll2FKf"%dRI]\$1, l t**~1KcJj60'TPX34̢!r F4rbƆŌkxnSШ-: "mR}⥰N'T:yG$WN2*JuRYnʼn$TT^el(H `YI_℺ *(PՉ'y`ֹrzN*iQf7 =l">fd&ȷO 5Q+/N2/i>ZiWDV<,C#ƒRh?fQSRn*Ӳ.UZєGp @!N=pjU h LOcʆƓKF6N,Qn#Mۂ,H,%Rɷ3 jIEA}^h08'jzjSq$ID6sD!(uJ5ը' `0kJ52V5@tF< ʹx .ÂNt1H6#I}҃Ĵf;Aجl#Qq$SNJ6QH]R䕫DӨH^RɆ8lV iشJmLMktB"3>O\Y ]1K ˗Dئڴqܜ\KsnNs.MKnNn9iNX 1D[oM89:d&ҷӷkۍtg¹k6FuL կկ!UcKZKy"5 )ͭD5Ш9 #4O3憆PjTQ5TZQq㬵Ai8J67I2ԊbLe0ɨŗdƗ#QR67_8^*ڵV ؽՔ550c,X*i5mu -2lL㭶[Mϵ;:lmXB0/0a6bB2Kcl}5ƣIC(^'M͚kiT]IVGV]2ٌ0%FI3*)ÅM(apÌmiو4fUSKU0Քj%|]̶yE6xҙTdƋJ.u,E u\?x-x!YPv8#> 7 fۋvH-*V|r%n$U}KdCSA'u?@Qҫ\Mz9)!g9YNlNc8>܁|uYwlvnJ IjD˳CǿI2% q⴪xw8wgL'-)]ixS|CxCjLF Ld'8>!B7G74B-MsV1ꋄ",Ll0=:.>͗ RԪ>}Tǯ p0iaji4!TR5kO[juXlb8\(fFzAYSHE| #R5bXV[+]0Gh\0sVTZ5YU]\5%y*K}fJ92_~%wT Ȩ 62v!M+<+VGkVqꐍ&Pj47omSeM Ed"k|si(UZXv4B'wq/7im3;mfv`۔Цށ6xR V HJFYQt/Q5xjm>̘2->۲ޖr o} oeKr^[/- t+ e}kY_ZOw-?Ǯpj8\V\\_iKXZye,y-EnK+[C["ʯ-{mh+ձ[[hlvJ[޼Nj]I͍ԺE*LVKv1UWLR}$՗LRs$ULR}$MRs$wEUt]4wY#]|[#kktэk8#O$%fKҜODM5;M#TSO~*k詨iCsbY1NMwy:wLIo3ȍr PjN4[ڲh}mGxff[T=RH#ͶHsTRkCjmR?H Bj|rӘrq$Op.sڦv7WYu2)6*kƜh)5nQjux 5~׍l} HJvp߾%/J*~b\} 7C(LMz&A]yޕJbWH';M7ʆ%j #5ɕ](WUbC  *b*)RFJ ~Ƅ|{t~W^wM~ hveTS )6]w?ӈۗɷ/!VԲTұR0#} ҥΥʕƕYjKxO/If 7-M15KOCM^R~ZoDzR|q!e%L?@q8?GedȩƞaQ/**Ί&_A=A @|Y^PPj=>zE/Ā+(9ʩ0[w -TR>o79 Df $(t(-AW-[eپFktBݙ`롪 R׼}*/! QW uqHBB]NPDvH@B]wꮃP 70?-o9}A Bb  -}gA BViso(!pjN|d:$z$ ) }M ]A,2iҢѻ!߾J8_Yόq!;M:J%@կWOxG xOS'JLfƓ}")ȫPrh p΅0;S CIɉ[4ԣ|~Byd՜33g>̓^ysqΘ\ ~#9[EU$@} BX }L':RY̩ M;[:]J1)PN@DY*VϖJT_#s*X!RDcT*K\r|~# My*)TEPaJ5j.(ZUHWH9Ԥ:QªF3V yJ"aM-کYlaН3]sQ|zn$#x9!*=xs#x9><yvBs%)i2̓ >e<'t.Civ?]֓ @B7&n=\@Q!j6GL077b}Z~ֵeUutO%F=Ѧ'{G ȏFMNYVR7 VAY @wz9Q5i3! ͉Jt&MPCXFdZdXOC#G6JЯ w\ ?@'s/~@ B{&o9Ty󬉸(l<{ cY\ʷ~y]g|ٔn2eS[xpd.v!|=/##|g_>MPcӟ]'}kMqn98dP:5_͚:!U˯t [g\Ȟ{GS7?w5t{x5D+tni-o>z )rXC ]7|Vr Qk?e1jQ>jتcnGo@utaOփ~Vҫ"^>chlU;Z}vͶ_fv*J0-~>truxGq:uuoSG~OKzBOQh[Ic\ζ7Ulk~v-+WtW.Pf[ \r;r;.~:Um!A.U˩9{qQ\xE(x kD~uLUwfI07J<ϗGlW~n,m|7NQ=m|cEW@i(:5+fjqG|\a¡_7;oW ov¥C ?l?u}_wlH_v+6uGwb9r11KNʥ\~AO~NRy2qٯx񊿸TWWfڗaYi 7Ok4ÿX8kA֙l2w\g'1:7ƫ>@Md;w`c;4f76B_t09g`a7ߘ~|}ry[mͷf?onnAGs[q>&&BIT"琏)mFN$zp 9!F&b[+ (Bc^|Ax  Yq!:s~yג>t?B~qr J*jHHI?"=sfp FzII!p'8Lz!=H[I@:+N b\ x x-p5E{/&;k{gYٔxx>><G BgIn4߃/~a:kG~1`8r!9/~x5Iz_~OOvq<xx%xp Xn $ | 0p(p; ;?_Ea$#'߁v$Nϫw#Edp|x.y/ px% ^#ekۀ p0 <E`7!\Ty*e*ٲ7}<-lI/'/,u/ۼuga| aV׽{J=rȺwBS{qE^Qu[Oe0u~meء}XG\rr4ޖ/YҎQ[ϲ!-.+;~ɲ+:fקy>dk.#g̳ұ2v/ӌ1ePɶYcqIs\~%,oɖoIs_K=6`+Ə^solVܐeԆ,(Qq>#_@blSkOPE2'2J/Ol*]U9W\V e >RHWQ/NcRQ(5V$=@TWrT* l^ kJZ_eUUXO*RrJλ̺(/˙P$*('U?Ԍ>UykPyCwwp:3:=^8 h?@GVxgrϘ~ѧ{~M1n_?VMO͋on_F{?JkS?ݞ: ?^$i^l?g(:/>$hT{w7D5ƦS M!ǿ/t[Ontp*|w>¡^Ɔf l ]*yp pۇ!O/<;_]a){RR)=K?#$jf^^tvt{PGA Ikk>ck5»(^qoGqͥA# /}w 7n:쇤npWfo4_YdC?aNf^&2A 3N;~zcڪm>g-b0H"F\R sb5n)v肛6 Ul'Qu<v͖j AG6e[tM`IߪL9=sϻ{ [ ͻA9sR|84y.Y-N U8ъq q푼,ӡC1Ǝ}ӡofϚtxCCҡBЉ`,d(B ?S?>`vq9N@h_Ђ9S-=m fby.Ȭ7rpJ>iALTs@M^L%lIM'ثB*T/ʿVu*=>C7yWyL֥=T:vGqc4BHjyweciVD))p{절K=.VI90ƜVG#.!O[ۊ+qd2I(~2ڞo(jJ؁Q/w;&r0A#3gEpC?65.'y1r\%P @[$l$J d ٤~tH۲FI6EiW! Afָ(0g5y*|O8[@b; #c.w׿r>A@nΦr$\&8 ڱ>OC"[0-vUYXCAyJ,bv=AKOxuyIYe cEC +4VO@mKw1޳ SjRnb y*ل<}(2L$tNpHBK` ,\^}p < %(#O0zU!v!`ICIyj,k;KTqyA1#.l@]$!= -r1VorX5ZXm@:=Eݡ)j3C݃8PHCg-*n+!IhIEFUm?dUju}pfh|GB,lfl7*!QGj4g?$m\.lSG7 DVš^S8> ݝFTHv{HuyLjv 10toVQ4w"%~b`"ĄJ &b[na;TWֺ"`Xڈ"߿D,6 3*N9qαq<ЦPeal l0^Ȏ ,_"CeMSkF|ZoY(ȟQł|DD-?* ױICK \T0~fJIJ7l,p Re5Vw=o7, PKiEyDEr>3~d{kdS}›}8ѪƢKәニEV9VQGwKl@D;KQ_S[]Oa;uAS.dW:LPGM0KB6*('{47lMa:OږrTWXUa԰iRDB>DM7:)I/W(BdmiA(Bд  ̈́VƝ3qDÕH`{.ԩ(,R x²rɽ%8= 2 v\甩u3zL5?vŽ*@5U*]_ )~0^/Xu򪧱-˄{rcě`dN>Sdɯ&RtVCD1.,N0{{X8;'p-j#+w}O˜'jœBX&u^(qEв'хwPg%GѾ$jzQ?t"X^pF%MOjShI!N -%=7@x1Yۈ*Qeo:")K)"u|2Mݒ;o 'ɿZ%`jVl\``vxKTA gRa#8y8O^@V_f"YM/:W&g(Yj^G' {gvr| e`{C>jE3[PE6)'3~&LQwDݟJC(߶ W?r;46 }(9dzğklHDvptj[Lt͒Lr}i< 8W4Ty{RNz`UG{oaȪbEZ <1hef:Oе/4$X͘Ycی`+vީM4L?47.>x.c+0eN[4'g.\H: 4j\dEF: n5ogaouݺ&dC>β۰+r<h (eMSB&F [tӶCO̍jv*jAE6yz8q^3 t^- .֮goei,Œ^m)}OM&0tNsh6E-:M?\6xgi\zw4}ap FR {n(BKDs8\;ib]J$Μ/ ϛ昕:= &QI3gFW57QC.:$I#篙|2z' h3+;ÆHzaL0$A]PX :!- є8T^hIYFk3pƢ^\cH~W5kkY6NE9Ù[lM1tzOR*[X@{/)f|l nd!kԴzi uc+h P\00zœ8@1HȪ5HTw2eh;C:,ZG]:W'Bi)M8kJ)kPXoCUYߧI*(;2o:-?{Bk^ ߓeNNVD999=﷯Ӛp[^Wo≣Pn  $K|4E 6ٮ;^;XvT\(;^ y8e#-uK8GxqPFE7^])L+={6ݰo*QW2CJ%7^`=bspw&#`| gHzHlfjn`~]`ԸF:鷄ΦfS Aj`հ}SL߬;=%8/B^Obe?n~ŝT 'TxLثsChBwߑb(XƮp42V2)^լCH3{%Ԃ3&3 hxJK.DlQI;%NfW'P3w~f˚y*N–;@6"w¿h:cdXI$< HY ݨL|AASWUF@PP*>nQq_}^2UV@-d2i "@{Bs_6PLzV(ԁX Nt\aSꂈT[Zc[i 0ަqcD.o܎AXxi7z:Zn{}L0*|wΗ}‡ ,.9QgRYGrJUv"A+^m<8E8b+n+{Cs9lx%|)V]Xrwwh>~[bS!Ma_:7FnBiM }±Pw,` oKhp:w{xe_ۇ.Re"~v4EQyIjZoo` xLő ΥDD˲=p\*aJF!! ;ZfвP!(0m@MȷU' 襘> q_QI4q:!ٻ@2W :֒,= t dN֡2L߃o}+~7!\~oh^=AO {C#6[?q|Nx&С6GʶTyfh C\ǃNא&ߠl&zB@brXIa ~]zNV{gJ""l@3kmk{N1e63Rhˢn~n}&|nf<VVc: n3A1wR?vܕTPhjP7l'ԩ7]::rf: }fi Jóͤ1%u6"d_,!H UAX5dN2 mF"x`jcDtnsӡa]ˆUD 3 z; ЏJ_3aFd]NP+J"Ju U$.JTJtI*(OϘ#"^遭TS*E`KLr@z_Sֱ)<]F˟AJ9Cd i*W7Fq*tYh$!d˧SirDz)`)=;!]v%d]00Q>A<јe0⊜\6@c]x+擑66@V 0({h ͏3`azG~(D~K>.'zݧ:=Aōu;MΘXcq|Sfj@,Y,-K )Eykc9*3blѦ˹/լ&R5[k8z^ :(ƣI8ddWp5[@TCLjP 'cf`'c, 5ކjT"㲰%#G Ik B(w )d݅?|D[dZz:&- <Ѕ;xgh[ǻ.@iijÀZ -4CK;)O&=f hr3iZ9:Io⦣#bmN =PER3L՘RKYwBˍD؇ 4 3uruEߧ4H0tƈST^ Esne{E4w[l{6Ow"g `vUVrjxԹknֺ~ ]%Z7p|qH|vSaծ}SS^`,fR.f8Q4oO i Q ULB-gmJZB:&$M9vGS͊sF]1.Nԫ425PpӮ!∍mdDPڃW,j'쿮--%m4vZ#TǠ]dKv*'{$1hnz =3 S8wM)؀:<_:WyktU9cU,d` :L/5)ox~sFNI| }9nS+X(h\C] {]6U+멣&7GΛEǩ~^'K IR(ڜ>.l_.G;>s._<ܠxg%fvoI 7b1p"%, L IɷɻW _ U;W͔G>"H/7SWz::Xcc +JS݄ls+LEݓ+q#/&w-PbUd5_yN$i<'*tήQ\{ߠwG\;xy6/\I:yt. =X yĂ̰NJay P*Pp| wx'2,hG Bl ՟I=Cn! Ir4a cO΁Oʲ)??dnsuDm57pm>VmQ9v)qC0vOM!dϑNdssQYjp][i*m0łi@FJ#}v%4p~SGyTC&$ Pt %W2Ǩg*q<&`؃]ZЙ^392'lW2BY\f q83 ,;-LQ88ퟺ1k,qRg?(PP >HW˭#g3A"@FdmjT6A38I&T|ښOW!M[ެf'IV٧fD)ZտbR^C \kwIiPd"%vC9.jAc ){89F"fy3* (,ȴ7=3~ѓEů` ]=D3NհnwV]ph8YfBCtwͳXc+Saŭ9q9֮ ە]f?|nҔ'}L_/kHIJv\Qy.tսnÔ/Oiy/h#rT;Di~ a:k=3KKua/Ѵ65m_Dh ō QkkآsS&)IE\T< Ņ@mqgI$deU| tlt 'M{RhSAIjg|@~!J@r>{ 6G$B ԰0'v.ދ(h4iz&Dq |({#d@@T=i2E'Z5F0Pa^V>)Gjuxp5!4H_r[ Zi6:9>.5sGX]|iZ*Dj"vLE8<ߩUkH!o%kWV=egx.T Y7@sM 5; ?.R4 |U!K|Ho%0q!7MR en-ǥق{-}k!Uuѓ&j~p>dGyN@jyCU+܅ɾ<5Ԩk#/>L-t1 !qf{Ym>wBIdlm!"YvKQRV죩1J?(7*l!3Iړbkh3`~͕bXU+֕|U"Rp=gHB rEU7<3ִ}Y"a|_jhT"`Ro2Y\C&vƃ0oY!h^:› bColׂ(xOPET@Dhذ6i>/7JB9loǫs}GNCS3 \-waLo v=xhCVo}خۅiT<dMF8koJ}Hƫ+,&h|(xVZ uoorvpjN;29 V*guK w(`n{@$nb3=ÄR_ژisJ=$:r-)rKQ ZrV6ݭzꢁѼ,OjEݗY҈Gom%ˆ9=|.Y2O2n{?Kן{ytaUe3bvUTBh۩QG f}dx6u_r- OuC&؟Nw6% ́^V`P`JOXތ1!Ê h<@ONSj?C~B7fau8 `cUf$3/jV*`f1ɐA<^J~>0>g_)sr#6XJW- uP&Y͔c-ző'\p _ayT"ovbd͗k1r :e;C#4.*q9-]3*;}!+/Dxʣ”yiY" }hR/( $wUG݋akз B6|NsNjʎ '' %&FFc.gsʵG)Pǩ ;fWhjFdOL*mͿڿ͟xCIk_\5+5dB݌cZu檛qdoZѲ lc#+^ roRPV!e[g9Fj3pʺ0 Uc'* PoN~ZO =&:$5Ev6D27c]锡D|[8йBD5)́2N)@YAJZ/YuvЕ+ '*"MEM8lűcwi(BVJCzVG=YSa;W4dIĻ2k; `4\+;" 幐\x@+ x0{2)ԈɭXMJISlʃkheIg'0!vw$~4' ' 5|J^/(·-ES AgSv\'u* ;zCsN;Ǯ&Md!Z'wBT,FbjrdLQ 8|.'$Q)uA9h\ϺKcd'gT~ڬcBpRY(Oul*tFWczcff;P33WLU(dL!c3dmfO1oL֠ac(fLiN*TA1lL1x͹ѿ|ic$WF}_dd x18|ZD,OGYSHiw^3LoSöܴk!yfZ'`U_Y#Y?ì01̪~E _ìe1RKy{@mρo%N}y!7׿gS2_7B91L/eLKii)s01T~Mx|(eZ^cr)&_1J=u869fr?捾&9_J5+5e&orMC= M 29F+û8,/4pTgi "!3f#77hZM70+.(dj{*5?>8 6ͻ5)F jG% u jnRNjBYfkx' hSԓAE';f-x}bG5c1`kYb4/ jє'w3e""ŋ\6Cx95ַLs/ׇ]9b.!zμm_3G/֙Ug ]}|A.G&6~zU׌z]O]\6]z]@- 5Zx.wF %4qx6WSZ NshrX1"paRߦ"EF(7A>+`eOk[4O{zYqޒN58cbM1:A^M%v <;oKp-c+ȁJv-NdasLz܁zԯZYM@5n1i~rk$C_z{#]z4wJE3<%=x$E*e '=˃A0 qc"!G Ή u/m s1` ~^~vo,mԗo ]uf':χW8EPb<6nd닐5}5+.R&bb) > Y|4Gc}3c >A|s IC0ᇫ%!>e%# >"26F Mun|/'1kHY03⭇^bD$ >YωDYnhS`"l9Ulۻn}x`,@vovOv?VT,Zxys'Г/TAa.k/g) ~3?>^\6hI^uع6Hm?](1B _Y?ǽرxќ"wCw3J[Pr?}oKf~|aMV{|O1|G+ݜe~f#M<#_ 8jGd5 3IMʴj_N\9NN%k3j )Θ|xO@Ё>t\TflG-d :-.Q(MKne}{yVuOOp_մo"woF(HFrtCbhwSFJV3#@l姐>Mĉ#--c\lԪJcoUʌ__TZZH ۗ 7<%FNԔ8:5%lyL)ӬՕ[p:,MR2Ҙ|sET64S5g\_rR.Qm){bBN臭 iy9(V ;Kt,aQVAV|Ǒ_`阹)sco7FY]h$Az$eEkڲ۔7iYGa>'jז%G`AٚHp|T,'?)eNb<*orQ݉.YLNJ8'u 8T>xNNMG#!6N5t^?̡ D{1M7+yF5q7~-n71N;q',=v;>zCރLߔT&J?`#q6- |+ͪXgYJ@ZƐuh4,dHtdNóXv2[k %D֜ ~ ~& { ɻ GtrCg\ @BaMQ5|saZ?9 <}r]y&M g=Ρ45PפEM3xLf915iƩrtoڐ5iXHodo_Zcg#4\[v${i?Z# ·VƆ)Y6zAFght4 ee},7fxQxXaaT. ,HcM芡B=ysa_hCd4?fszkpRM'TeW"r_GV3tWMWh9jǮ|E}@%ik72s4ZYhNfaIY轜.`t†ٜisV&ԂE(7nPЪj!;9x΃\Ω2Y(h:w?<~U5H\}Zcd ?7dlIGnT` 6w̒~_}נ `c۫:#[S`nhHG&U܊ʞ?KP}@z7je^Q;kryČ -4,df=yU&m eB0{s[(2[Pc3?uKF3Do)9]~_sW@ fCuw nNDB򯌯KMCV\>,5T|y/p3_erv]wB3/DN+M"D,1R j3N[OaT)ͲُX6K|n(QWD<5i=ЯPԩ]ϺmcElFQ!Hi5n{mOidbOڰqo?;{FNɈOamт6C ZǠv _s$6-E*fkhqnѥ}aAҌ` _4xT6{q&o~Ze 6ƔoELV"2GZYx6Ǵ+M1=x T u6ۢkc=1"cDcOx _];(DR^p@-[=YlB{T#}tI%k nB:$ˮCx)]Vpϥ̏'!5KpN4<@(h$e 6F=ʃhq $|g%xm頔콵E*8(R[:t u<|Uߡ8A9UΈSM^/RR^nxGe-G+o􄌘lU伦pJu yzg=\2Mw^!56%MZN|%>0|o)6KU'L/L<4TXِ8nWՔ鋿{!e{yn"|Z;+[F'"n>DKII/ȼXܱY!U D~>SZbTD{_6{;&'%9иe _|eӌr,_舰\d3ᕎ6(Zx%QHv7EG^beBn0r_nGT6>7M*M$ u_`G;z \@Z(y 2 bo qś.هz'NlM6wCgЌvhUV]?\Aq"ur(9WMvyIIqw;Ȳ r^ԱseS2G[%}+#~@dHA)Pe~ [ 0 ou.le|鱔+6>OݩڥIEa +ס^&B}$k)oSMTXci9EEZ5q,MCK `8>H&f#A  Ѡ%4Z ,VbWQi (]I@#A eE̓sgN}ͽ{ι瞃w ~| T$E*h#Y[ \e;HmVv8yMSC?YG9tubMax0,7* F\@ >[\p2XϨσ aшȵ37yl:`*٠fOm]-G1[i:x@%04Hcp}?gTK4 Jxh}x!֮BqXX3F*54-_0VE:gB8q3^4qNfXoѓ:_U=I'䷺[>I4l9 79&hABMR0˟/[ ĝ!&=! pr)K M=z,%ӝ}q,/Õ#[` rbx Z Ŭص ͡0&=ÔbWzhr dO?C - *͆t3qKߌ FX33}Wr% DJg42MM'%kS@vo3~g _]_,[pU5sUWlY4 \mpMuU={tG4\WZOhGwB9+N̻M6ei(o4 :?pm+|/mpʣpmõ\EspUeDp 1 \HnPoJ>l%ne4tf¿[-Ua9[U${m wDef, FU _}E:e($0tE$D!;mDt1&4e?Hg38:jro7Ǖ_1_ȣXtI6 aT^H*Ĥm.&xO:Kn(+NXٹ;dEX Yvcy7K~eB'Atv/sOڴ{= I88Oǩ~E^ڝxJMn$bqWX,Sɟ8^.hwf ct<-|Z _[aR[qBQltm'U0<d;HW\؆"2HPjv=(?+`R c߆bhp-W4e^ɶh;sF5^_]ȯ7a$6|BTs0c} 8pP'JٛPCLqDU:: ۰ N(;d۷۱ RIpHߎP[?I9:+rޗ dԒ0TGP|};(Ej_?k14 O Ez8+2BcSg:G:o>?]g,Z H߿B<&wˁMVBښdoVrmjd[( Vz뤂R|z`T1Ŗn0Ȓlݥ )ͻ@4#36 z>Y4ug?@4eD6}ao }ɶ^mF] #_DqkcIsBl/nj@%Fd\ M}wM~q C=T XRśH̄aT/NבcUBglkE`p Lq1H0M~hm.< #aiĸ =$ {' RFɵYp~R|Lp)Y=+mmp3veEهJ䮯8 (Aހjf@@*81>5CY>:=Q<s6K{ݞnIm+dB$%@NimTR˶|YB:S,rqImC);$^Ks;/1:R%v]PF5|\ B ?O2wWǸӁq]Tɡ|!+4iKFptg0$e*:KXb7IYB\._nN:K\jI+_臊+Iۼ;JF<{^^#;Jg)g(oh읢m.Xz˗e[RG4g7cc8Qi>2%m@C8Ujl!e-ED~Gg?Ȣ[!1^ͯW%D>GHc3cI]9>屙xR]J*cE *H]J~Niѝs2m\F`PlsSNx^?bdQ>,sT# r F j+:܃!Fۋ,iIGǨPbDP?ꐌx:/5Vz{? 9YK*rmRa~j G2ERllqhyf3ų~8W|zFE]5,Bi;*G} Y~"O,IIq*tIcg_L\|FUt{Thَlp/;! *Z=_~V +m+a~*W{-hY0;/|/",1u_S|m'΁weWl% sX+}HTP yDRAe<#[Z K6Ǘc_Q8: @j[ Z_O/YPhd")K5zMyFğy*XBJ# ZƬ4D]1$W jqSPLxsV klUҗ )pP-AB#O ܃mWw:pu>=(T|3˶mrqCb4V;jX^.[]n_dBme|U珬~-_GU_LpA6)eK./||mhi`pwa`|%w&Wuȅ# P*?e\ߵѳˇ w҂tp RIJ/>}Q@r0 X+r64ʶ}QW(26YZf$۪<-֖YA`Cɇ/e{a]Č_~G M)Ƥ. 5]‡ &/]Nu20Z*z(b̥_|G1m{"/?ڤؿi(a[+FЩ8@"V zAKKb#ٛd:d 킻yl5 ~\ rxIx(u[Dߠ< ([#$q8$C Zm\WLGGz xwN` Y^,Dlfp:?(vdٻϠKc)x|VIzKEԾ,ŻDAl#8|$1%TX;k~w_Ʃ #ەL糙kؔĻ"3L"Z/E*"܇^2gְ_4“XoBm~_OnZA-Ǣ,!I5"](h*>TH\ De\D9/qNu,~ \+5>oBt+qf0K΂NΠIvK >-eaV9{ y6ƻ@b"Κxj%9WCà){p-"fە ~~sZje>R2b BFS߱v*hqpWB]=7 Grm: &^\HDLV;%rR_WPѓ]1lRFNB-v^bb@@j-:O[ab)م>_Py yEZ֧J6s'Ө|&&^޼_x ИhT3bsk0h-nţ z>uGxw-_554d@M<`3Ϩۭ>&苽*x= kؕXis0`kc0uXn7rLrNa̴MIII\7.S< Ők s2=3>Wh )Z8UP|a TJ^a=#uO{e8l!O|юqMRQJSq%0zL%Q1: 55{k|S`awĖw:>I*^%E /pk):^H%Hex=?b[?sl RAm UѕOf^3x5p63$d$F@bB(~9H 녒ZNɵ?/ƗO>kjx+! O5(n#/cx'Σl-x) '+ٵI&Pi<5qAz~K1e:Y/m)$LbJt9NMv& 0$ 3am8y;塿CNyB3P$By;SJf2%2BqE]y4l!YS?ĈL5%VIǁI;V'٪d("gT`dkU(8_V[ $H0/ 5tr>5bHm QQe[p[ް>)Qp*P8 * WBr`]K ~ZNWvNm+Q_(i͑s$^5x%WC 0Ւ ^~E/<G n}L9W\ "ڮ~x#}LipAjwݴҪ +Ͽޱ_i[7T0-[q ž[  *ϊa-2n{) a't:F -t"ʍ6?h(qRdTհ!osHH %paOhPw6Cd!WJcgXϲ(Y~گ HG3Ы@0"cé:''`v·?% u8P026e,TfP 3f/$q*9˗RF ^XP_qx][skgLEB*?9u 1 tc5;%\~S&,#N#ǜt8ZBfj禔ew#|p#$?#ֿa_+46R1hn"ϡ UC= Ն_!Lb V>,br{ɼwPՍ.w@f~q$'7)7$# ᄡ]adI?1X*{o'1%{o4ȜKDa V!/~x.\1 $T6C<1_MiJ}pь{o@ɯbDLC֋*JWA4)kLʕ_RJ8 [)bg=aU@x]G:)@BQ)󅖠s)Y.*Ta=  ӯ ' @QZ1 fx_r+ؙ6`K ~qbbu\%`\9!61#p? wqAqQ$`/Uf0IhV/79Z=||I>fKQ88R,}GoF')Zk|ٝWh|x' *걶ڮudjqc9Pу'ֳ梴)E H6鰖ϺX/~IPs['<b6 3/(LM DYғè= z}=#)@MnJ(+:2xs #1 7yUü*[n7~_s WŮ&+۲ 2e/9<:!:H'>p^0?+_40GQiڛ;Kc[Lʅ {VQ %#V>-EԈA $0m7!LO)fXf} 0j÷ZKKQBzz S ƐR K7q? mRŠp"1z/$P+AS\@J!1>^ 9M 䱵صn4y!4QTkug%&|GСBKW* nK)0c^(Z}0u.fT:Åy&ǎ_'GgyQ סDˋ+ {C,``,X^Г8RvaN;Tv3@8B-LzaLh\_ PΌ$n'3Ra\fMZh8» mEihE%z@Ab u.|)p OJ+SKc& Oc#LGe!oTݘ+0ŘGi,D(xV?/Fj>gFFHmNk[覔n60쁋wjz~XX̢E, E,z&:eHxfOZ]q =[ZhX=׵~cQ> k1X",aE]XG7T>^J"+7P.iM2F}β_]YFe9 (rK.Xj-  eם!ҡl6cҮ! u;^߃K8L?g0V#: mD<"L'p]S>;Hѱ sAd͞K)~iq>jpb3 u0Qq4P(d,@իOh^N>s{.VMբF&sHP5-fY\vX[bxݜXxaƖD~ȣlYcg5K֘b-_j(^VW:pOƦ*)?$#|~ZC෸u7ޟ&o&o``FJ^o9l4@ ևg>uD &4#4G:}y+}8Oн+4ttWj`x8nA>9ϽvܵNt/ݟEttٵ}9z!OCt_QOv,_Fī ';') H8A 'o+$O^8َ5i70TJwRVL/zyuoAe PPU")W̭28\E>ODždÿ]zu]&4 ].<.(I._!p,Mz^.,< ʊSH0ꟸwڨ͎wkphQ?lÀ:rDܭ^0 ߢ6 ̛iWV_.S|.ԴUX `~2Z^hE\|E ]f)[Cfc:xL,)g8@̡(!h2]̸+(VcdX1Zĵ@?7e@5Oґ@sk李N0F8H*ǰ-39X]RGVBv 3 j dU<"\GҳP'^Zx@ K[X'G [OA)0K9~?ܿ9K^R¼]);n=ۥb.eB]7eJ$6%aٰ1cYoaZ\7N P#!po+}xLy<^Qڋ# Vj,`aqF g]QlC #tǔ)JS(!IzPsv3 _H #;rYh!Ďسr` 32Y6qCY_ ))⎗ 4|Z2.=Լ 6ہFN '=R42 ٳ(^lC5Rϋc+'=hi2 0 t"amp(2(^Z؛njg 7H`r`2Mx۳:b&M3^w󭋡(6[Ն®I8n~szsy I_Z)yL ; Q0ٕ _mGɴY͋#, ka)G&򘴥~u>?5Pӧ@tycpaq(_%L:#]aw=D0HUAc{'tw[F 7{nG+{x5{;=˻@XnZg,ֻւ1ľ ߖDhEZVN6ݵ{T ,[Gn Q^)0>*b.EOkeˣN ǻuSj0k" @ڃ(θ' c0̃ lc;ADz1ވ14AHht tDuVS/|N e^4RuH Ο:U|kpdxz;7%;`J0wL,̕+#lk&><<"}ziͪ=V-xt}+M+xd i 3͞E+ i KAK 0-P]Pg24ߜBySJ@ڬ0!0yȼ_|-Ox7㜾pђ|i$ BX:"D̰뒏.n rvtXu8mL 3s5B F=%_\ hWrQGJ,/~`Eck6cC ;_pH+_IcY#;d2lŃ1 R? \7!(Ifn3Pdd{!5Dv%}x^(L_Vcq_˘iF5|f 緆P%ǨGC E?Wy7Q+,}RYPS Y AG ͷ56P7exzaW>U"ᑷ ژ@19Ew C bȕ9="]n&7Ӯ cr$b 7?={)}'=YE?7)Uj䶿KC-'/EDg0Y?JnI^51yNבS~1ӵKU|ݳ$޻0^XhϠ$ir&jqĒ=32it<9hFzty&+bՐUPtKF"'3xjuct7=7x kys O9~u 6N.lqt m yw+IOs?5WGn095[Ukv mYԓx͖fp@nfpM__fFo [_:Iay.bI\[r^=}I-,{I-;}½kju7#Hgo&ٕ_3M`'ohނ֋~e<t Ra 'NCsnr[ hhke E+|z[gLl9@-rC_@@{x6g R< }O b?d`Ҍa'Q:;ѣ!f:S A51G1E.Xv,Ŋ.c FT3H5uj coIB|rυsPL@E"q9sFecCk!ɰL?grz䊶a$Y;wRu]Lٴt Ih voGؕ )aL{ꝑ|X<J&:ښU7Wt2A?h}|@?GZ4u>E~p# gEOȮDH w&?mLrPGKi/.~4M-$9>̈b?W&D'Do) TC!~PћP.lPAғgoB3]Q9CGi_}0q#7'xs9X-~;بQfiM4Kv5d7%`r#Hlº}FE0ȗ\m؆hA]l} p\3C 3ٛoCZ~>W@.|+x;P.7}@]K}TRPW2ڨzᦫϭ4[Frs?qß/gkљ\Imx[LMfD8sԛoyA܌jxKr#@x\.Cz_}BOX%>A6u-J{!HQz<̉/$%ih3n7]!HBu%n:7{%sr?^,2b9SaXrr=1:l6 fǐci`6ǏMcVg<{[=u˞;X: q0H@)j~=vjOyb᪵aP1y1YуsCbwu+yW^򬨵wc@ik5UV0B 45/YFN[:_%37+x}5BI;뷳gKxbr|Lނ[ p:AT)X]zU֏[;:{Dq]X| Pb%pXΎB,Lݩ== VgF16~'I55z鄠 Vl+S9qQE鬾y}Ԇ mHTD]cN[l3ˉ%jDBt`/x~lKHўq ?=k8_̎V ųrмwb`ɓ[6)"X,\viG.s3%1-Eb}gZ#BmQCIDQ!kյRe$+ZIÉã[!wN6S;gJ )b[oM\&7jT22,[kʨ?BWfCEuy>U?~${؃؊\SD/IRzmGU)JPvA\ :csb"9xQ¥&<ǾCZn?l_mGrrJ)B]|lHo*Mc5h"Ës<잪 ܔ ppbjm: A2VgYH[XΡe8~Zʖh9U?Wy_ZI :՜ 7ıjGt -L1} ~}7ɍ)|)fQQ]/VS!4gD‹VW3lB hMDK1^|u. 9ʡTr.`QCv\J=A%uG*nQ֒XUz go[Fa^̟BVe7 x1w!^G[BZ$;9RǝrN1‚3 C:I5)Ήg\{ !ėE8$SzTsq]Lؐ2Ej E\JBN 8mBs3U> L,ta0@هb xEcjKqϷ7 FIЖB$*g;x4<#5f2!4H6YR)WiC~ྂ6B\c.ݣ/.HgSw haOGk`2k@{,R;]/dXp&,IW|My3\$OqIy  "ïb`0]X@ 5pJYʥ8z_СTn֡Pz# XCaZە' t5\ ruOĻ ʁY&V͵L4QIt? 5> Fl&CϘR଩vNJToeZJebg18T `cӝY0}cf9(E<hp΢+Ll5+IMB/%q^o)24 .gLd>cd2Bg%x0I9 F>Hב]>"IM$'/m¾O#=pYʌA' h~ʈĐE5ЎkH~iB4"M&h(I+ !{gs൰yɏQPɍɎ^}_EZV_`9%}J=LǬY}3*:*ʦ ⶿К _Eeȵ+hp}zG\>9KZ)dRM{cv\ շ)BހǞt<lK>{KGkM%1f*Fl;!N&bq *FO'Sf رz2>dN+Z@|c"reǘnG\rܷ܆SY?{X3T`Ԧ{vߌBPf.$f|i97W3pO"va2+N3 c9qjE?*`(8ҀTpp)e)0aF0׳ϻkO"r"<`;km:eKSʟ٭n-zOmǥl3h! H nxG+MOW}*) !lS@t63jv  eDV-N-O8h˜ooRB!W܏SE۵T"VASY%j[rGŰv*H3I  @ug*_(%y 2lUP1g)*'SE =LwyYJnTQkUSd%r'-YE*겭Z턯QzWОPi(K$J$hyHQy0V=wEO>:,)PE&Y'5J}uC:Q*J&unTɔ aߖEj!@&s"-1X"]@܄nfP#ӈAt[?ň1TFǤ~ٲUۿFIccaNS*ǓF7ye4x^'ةbfFE^F+\īCv%E z4Jo.Q_0Y3؛ƙy#:'=#crz<LNoWI`TK݋Xw\tNZ'ԼwVaINodwsަǩIS5(hUX;ApzE%i`-*lӛ\7W~1Z$> ޯB*l;Q=ŠIșNovIg;5؝*lӛF0ӛM?(I:hUi*lӛvDtzj甤p];j`Ix.W5 Y1_3eb YjZoUO2pRof$ l~(oa1D%s |CU w`lZ3}5"iVXil†ETnSzjാT-fh8>ߥ;~R;n |hY̭Z^5C /S W )N|'h`1v-Ffd`f |L0p}>Z<9e1T3~ LT05Ox.+^d1yZL!'kdlfB*8ӴԽYLs[`a{4*8m-xk_),fR3P4]j[gԠ3Y0Aׇ,\]jpwC +ZSׇ &fC ~]PV3uPĬRkh# *4Rk=Y o,b:8~ڥ ? u*BE(,ډ %&Е! /ӱ^H*Γz򺥒3R^G:y5 =DC<ҘS/>уRUS:~yE{P$n; P"$#EP 4JF $Ƿ bHto^ $?"U݄b0NèykɑS%G*2f陃.F_A<5<;MPaP^Lh0ܓH gf*i}xDdmxis m7Q&mtP(H)7t Z! m@8p|ȎȖ[Mk( 1+aj|>?5F-AZ';u7o=l#єN`dy;g&{4 AJ)o+E"8kʌ2:3|3x>T, j44 +9WWuF@@:!]%^ |d8]gUA5qj5XF K1}$?l?,+]&(zS%} [#|B:@[`GS1Ib(U$MyV܏goT&)G@ѐcBտ}|Ԕ9 >yE?3o5.s^r ^BK'A;FC{G$H0vh0oF;u>zv?,J7#`s )0aF#yfa]d&fF%Q?w:&-yazj2Mlx}d'o*Ld2Zr_SxT+gUn݆ &—_eCٚ`c!IG蜿?xQH/sS6&L.:mzL]F\eX!x/夷Z$H eHKE> B~xÊ6#CQE{H:v\z@kSsb;d `p'bHz\q}&bk~ޞ ?_ 4/9Xi⪮#ytՄ/a!_a@HiF#L0/:L\߰O{p- fuoƀ1Yp!i tPٚbqBW\^^ VhKn U}.9ߠ`^3lԙ?T ;-jXx2Y }ozX4;vy=xE#ֈoCKtN族x~},?ZJ{R0 W5$G`GALFv9JSKULe=NyMqDb=wEiLws+f&am$@!`!eBԖA<[̶aemc5V9^!dd;^e+kL"B 3s`\TQ'rn.dk݋)9|fple ңq@!vܰp=ԗa%dd3FČ9† Yƣ¦+Q'[7^[ ʿ[B)ݓgB>Ā{(ΐz17q8'; 5Tug ouA$.sx;_n:qסɪ XJK1P*}x}N%7щ{z)e ?F-!ۮ~#lLi@'x}r%SB*%f3fTr {t؍yQMz=;v푧2m_A7a~W9ud=* =-3eqZf5ցOX_0s`/5U?߄TJ>c d_PwC\w SQ/%o;uQ=J#By?E|CxR\aZ1R2[e2[<8u8ngv'Co=,wptߍ%=xq*x.M'a~dȡ Յ!<;{[ϹY _/J ϓ 嶿X[;wќDN\!rbA#o"oOk7"'YfQ=:BUL3ζiLKՕPYXL1zP(GEe(|[JT7 }VPK_{ dFv3h[ƺ*wVw(WF4ifkJJ89=DE5CߌuͻYGG_}8y}?>D߾r 0uFav(nplQ@a{=osri%1LQW~O MErͣr͜e2 KwoX1ՍU.Ż[}LRT '?k9i7IkpG5 ,`ވG)fLdO {&g2{i5ԡk'F>{ы1tBF<Ӊ CQøp9Tr]Hu{ΪjZ8,U!\r^ Fo*l]x<#cʪA^܁Ƅ\`3}sa1U*Lqz)CG+ܲk 2 Mzc&vY\zz+j~̓LkY ؓx,T+ &vozTN\$,u!B>ᱭ1zеAʆ@vz4t&TH 6aSZkhv"7|ױ{g|T' w")fyth[JCͨ?28| .ٺ^&x)asquƝ|mz _? U|8/ IK"e:d)CF?$VvU'X?CC%&4'0:L$dX+T SC$K `)4ߣ3a9INx$;i9ބƐ`fӠh DZA$'LЙ-޲KVNQꂙ^a{bвiMʧ_HL{ɢ4(oo@ fCRĄD5JVݴN;Sm0sdЄyҿ&rx4\č:zK@kV ,_n5*@Sq7'jX`05zTNlKm̅4.ڎ' d )STNͭOe@>30P$ڐCtz.-$?0[R, Rj Ijpn N8% Bm/ 9x/AУ:~~.}I L)J EbEHQ xT#n~4*+1ʯ+ąCV"_"D`ɾ_3n_+=%M*e#5:FN܍.FWFL0Odt!]mU#xA1[,XA7f9#ٚ?2L2wPVI(.yxTAjQۨ#IE' wî=g&:y֓sqĴqQ-V`nGؿhYp~<l?TI7 r6v3'o vh葆T0Qƚa2#}bACFiDzT9.X@ {#0W@M?4|g)R<=; w W32Η@G4t!蕡o6HJz,TK|ziD1rb[PyxTvQ3b@atY<1V_X(lڅJdn$%O$a 0cCe8oq`N6m4“xp/ml;$ ET_`?Vĸ! yi3-?NcXw 1-3s؝J,=ZK :L~qS[٤j0>3gD|nk|W6<)ߕ̎:[=MwO6&GbUnpM򷧣WVvѯ-z ֣xsR ))=W,rgˋ|^HROʯn$ W(bf?q?@$wIظ~@^!Lp/ob:{ql[g:cFprJ>ܰl4lc0Nz"Frh 3xY&οīsHtrxkCBx($z:^A[ΚQ9Og317)jd%7cp.iOʁ#q~rT6~4]#0).plL% OrǛșPP褓߆ս $M'Mє UyGU )\s,,fr6禰V+Jһ1rbm(4fr+$STz,:.Lh}Ԙ0l7zZُDuPg 4 i:對ЉtPVr"nbKw a,5soS v}"7wUv cdܕc?*]ݜ2|,|f$&54#](xEUl9ZqN4##3'J^xS+ZH./OMRHc! zXf_ԋSX;5GX̯79Uv5%#ܑ٬0RO>ri2[&i qλ t1#(s)2}؞cs1s$Җ}}[" #?ٮ|UL=2C &9 `?l^F'҄a񤂱rO0u;'Z EaBL ۮIޫZBRIKϥOK֡qF!ꘞkC3[ՙ&TrƝV@Q@E`oMm$D<ݏV%sMQi2Ӌz"zu6zqqbc9zqБX+ah>+KㆉF`OLw/_Ug9&Gё؞jfl^~etxGkxiYXgEirTɑDƧ oMy2q4IBId瓑Th@($TRvl ?srIDZeaƄ1snե:=i //~2}Ju~joJ_VBRkQZQVqzU5kn>TYt3YK:X:WW]R1(uW!cӒhK -QʼnuyлcE\hHw˛:^nXq9,n_O p~ ȱ7v藽Mֲe2ڒ H?`‹J'ߝenKd9w\i$IHC-I6xZ`aiE6ӯ^2Ց1ZpXW4>>0e @ВB$]dXչR$&y)ӭ~v0#GU&W{L2@MuMzEןDIS(3nZ`>51:~!t.P7.<>|δ7|n&F=Mj+,#S0t~ы)#@bU*4T.Eg#8#8${Zbu(z_x+vxtЫk$T(4eNݪ&Ev]UB&EM[ЗP1wdmmhẖxJpWyTGܸ}&~=j*c ա1*JRy=t=I i-BMpt?[$44KyH?G.B_6lj]Ņz͊"Ϛ>"v[_74wAx(Ecy rɟxm~B=&!Ñ#yZ zz }#t?Qwl8JB~WY[87S>μ%Yee /=2<_^>Yd%=0ܾB<;+jeoQe`͞7vVE \U$k" #AVtW1Uٽ(1ƪOۿQ xP˽Csbz㴪w },BlX;p{k.E!3!:LYRxA&Djr (<2W, nc2얆D! d1 2k > J@(h5YϨFlq˸9Rn%%kkpAo~9s̫psEEٗQNZs,h>sX4eqaEs4k^yE"U^3ݰJ,*o(c,}[Hsfhԝwu #v{y8Xnϳ3k wUq۟z<[ޞ ~=v~`kvXۘQ[u#ѵvFʽ"̻cZ\$T (IR|[_]2vw2Pj$ xz䒸m .P5Z)4# ^тV3{;[]-{ojrJ%NՄ+S%fZĖ:E$i'3m┮*H<U>TT]U^_(z%yź0e-u Hlg0 .4X7)~x*˅]4h37puDQDFXFrLT@i)?4;X*JCށ-:.  y7w2Y-J5E)'Ud?W cxr1zLn#v(lNCxMqWH}QM0%k}s? jT;d~yP'#Q95hRg瑷/ezUΌ g>.mpiOSu38rf c&9薝o^ȮKnb)tö:&@fi,O7^JZJ8=;I#0=wzd96 "ʰ&"̩jdgn_@A'}yuOVx`Ls9rwktw;V@wpmKg* ,V, |NUIY2w!c!d9< Nje&zCPЉb.z*էgFXGr:c[ɗC+v[x4H D7RHj}C~ T 7^·'[O流rPLIA _̄&!Fsx3Q^xf 29aP*U߀#G[@)eXR_F }&\D]5L'xn2\'Mv^;NxL=rsr];sރMϭ>X$SԈR Y9[*3\ 3 94RVB/B*d[T}*Pw h?Y)GmK]֣S;, 4%ì\=Ua'DDef.o&@=4ax?>^a6=DPaKz2I y+> ǁG4BqN"!v>f( (/vl9<}˖?4Ƿ`b`wf-+ыsq)_/+nn \U9PxTQάd{K_5~yU Ue\]ji]Kڹލ _Nֿ]PVFu ece}w?Eq W8 lj޹zq#fʼnKř07T-Wہi.7/e/|%mWi^Glo6RYz*czѫW6nb0 ,nUnOKTkwXHܦ(6'=2AXf*/$6֠*<5s9Cy @ {LONUb;S BpC_9\\fkdOI/Mkqr,,0=-h;T&Sk<|*H_8"exAȹf2̜CwofGCf!u<"Ѡ"_TϿ; 5KAe?MZVbf U0v>͡6ÚHu`.d=c+5TdE,H hXmId+MPVs@0Уk%dRH j.:\VZŬy>huMڵm*R̀`&J ;6oasJ3N8;拘Y^ӀE+(zW^yCdָ೓V0s@u݁;4蔒W2L^'rmWj"HU a6fŶ)xf ?\>Ai>4En}*wѻ𞇗<08<. :|@(kny(."(Lة 4YlP~+Yn@fG19b\a/=lQH $^Xx$Tr m]ʮ1Gҫ`ezgXCGK'{ыtz끶aMZ֊q W4!8ŊC"uiF|ݙW04w7̓fm&Hz+䲠G!Í l.t. OgzK3_x5's R!MrPәW/|N+hzsAIJczsWBx*7ހ'X}+!n>W-B`ap<,4w1 y o>.gex%NK{4P q-ȣp)85 l`~=>(y]KP!\NtT(uW֯a /24&y|,bf"w3cNÃm~XO1kX ֳV4q}phEY WĿ`͙Ę!pF)F'rճZM0UF2m u8ϦQB POHY]N^+j3fŹ}0|GIٗFuBYAag0y 6aA^¾4v5ZV]]҃D{UM1dĸ#慀t TE!!_ޗVd%~}yEȱ:lw:}s7:hV>@cSUk. 󯹀!agc->k!;s2v@D,#"ғ* ɤj8j/љ.NڶWMhۿ~X=Tr kG^p5b5iM$n~ @ՙJ&mTTʛI%=t#2 >`GBh =vҥAZt,]  _`h"x/Q [,Q=srğ@ S~1X¡cS 3-0C}BuDdR^opjK>L>,~Shbf&y 4pBy}[<_FW|EP8lj4MÖ)Z(;Mt~O0AпbV]Nc_?1b] Ίͨ%M:2O@.PtD[WqAT7[v}qZgL쌿ʤ+$%"it,VCvzI=h]d@8觻zܘ؂RV=*%)'c q#-?u~445t4"ˆ@O]7j(Ahr Cw|D-[2 $`=yA=~B -Kc-P$l8#UF%U!Gz b^1u,&$ނc,pOdrI&'gjޯi;@.btrۯa\m hC$x,~tL4EDo~ex 34BY*!6 7X@x6Ѷo6Z6 s00H-'i攞pi. =m.0g1h kI \!": ٙ*?u)0hwx5~^CzLx$;?KiLN^fk;@}aaԷQQ"e>+s쨎tMӬҨL_20Qc.2&Pэy+ϱ`ʪl+&à b|E "wf 4ۿNNsĆ+~s-0E9o<]e7@,}[̃ߵA:R@PP:mQʄ ^&d̸^8 Y}ی.b6.&j[ ;97ϸN1y sz3c$LꙛYNC!mxߢ+n-Ju 9PqE?XXh>8~ ~(1FD9[ЛI7:; 2[O2©VzyNZ(s8ְ\)7E7`Vp,=w+?I>~P b b2WJ.:][/݀&.TD|\PtjN|w{BzJr v=|5rMz0Fu=s;B7X<;Szl \xioG='.)­dqIxY}R"uX3>)9ݧ1|&'E **oVCO+6oa5ze/3s+=zd+ٟs4Kd3 `d*sxfDBl=^zNgCsMϹ, Y= |.es%n==װsg/nh&sm''长ENRVNNop"'$T$H\rk1(zƑ FؽD 68Td`QXwr"` :щ9CdDN=͎jYG'g#՟MTr6SF'g՟xlž"']+pEFS6> [òȉ1r K%';"'jɉWpl 9L3&'!DNĂd9I"'Dcʬh@훪a#_ʣDH"9X9 ;r#9 &\t.ʀ |̘J48*O g;{N:Tɕ&xY)DR >.;-1J;L̞9J >٭(9QH?"YTi5O@ziݝd`ކp@DQVxQ { <2feO!zx@Hܬ$bqKd%cLc&-ߦ -HDs[E]iQC)G`Hm(=5~q LQק!e*e0cY$9@'I߈RB 2i nmERcΑ \\ 8K>J ^q5F}*vfr_*H+NV,q$"MEm131Dp4)Mn&s:&MZ{7 fs^^_x/v5Wۃ.\ȹv Dc|2,O1+GXZnuzO!َo1eD#om9f'$ x @ 44ksaȲIRKji8l,Y&g -(2NܷJ}ÛFږGtyz+q7nGbPVa@(nZe`3kZ)LawކtW?7v{pg[94u&ьI}&t-C5F=e;R+R}!o  E? l#:@y+Ɔ  MBhUjxXo_Oꝑ2S?ܰ+k9dd6٪!#H`0Msy9KG BgW^>Fo+ϘؔS+?K繗,]$x,Xn2+Sn .&V48M1sh9Τ+A{OdȒ];ŤcCCéGZ$Zpg>j-HlCܔ *q?ã`^ VcVfmhLGGD3ZU[6qKhWY3f+iEnd2ylovo^an$^w?F8IvLOERi{n_DZUM_~7cˬs򬇴¯ ~Ca2w޼fCfރ"n`}o8/|gqčۦUm8?bBe@&jN+~Dp'g%$&/aeZ l -8yiB\$|M =G"X:siKW,_̯QH([ؔ%foPoVBE߳CMd gBd#wEBf.G'+*%@1aޕwT7N,jH$p;qb3,@|3 &(/L  [,Uf"|,hgl!kC ?{B%;ŭ&xK{Zi+bᓲ!F KE}ѷc ?9 O4H uC(a6gRmBJ cZTyEP++JŞ $t WkϯufO{zXD 5/"bt#$oߡ۾6] ݾ]Fs[czgH¡^[<;\ɏ[ܶW-ԐֳvL%ߢDJLQ킦}딯֝3Hϣ l 01Nl3Dp@oAHAp1$}/aB؞UG5߀$2, ѩ`b׭K֞a? PԳ~iX$5G2 Jⰰ{J! 22(JV6Y!^Mw w* թ0,ҰLz1e]hqїr JEӀnB}X)$C> *CcxLӜ9.Z8 9 .ZT3grBBp/5]̙?r?h{*=tUgE/0+ݫ iZT^d<-]xB eu޻a{?P3df \!⚋3f »$mkHli0}gކ~`"B/0 !ͱ4c~'W;?O4'B4c fفbb+qg=I6bu(>ם$Y~\tԩ4ƋךM^PTs2lf}FE)Y%Na&27A=VTB Pjb/JR=&Xr\&AR%WN#Urw)WJ~D!z9V%*B R nU* =VYs_,_z_Z}, 8<Jbm {`} ldYvJ);-xAL%><= w߬T ayyU.R& 0.XK5p%>䦈s")_F-?)OdwJmDѸ;҃FI-PoWLqZGez}Fl ѷ "vWˋ( 1@id ِ᷿d/%t`8ڠU!#(>kE*>?}b{ٯ;C֑j`k)=u3lRFN_V3? s\ 4(4f2U ~ Q]FX`,>n)`OQ؄͵OF3P2LM$n"|P+zFhͽtvIkgw3T}H7$ҀWJ='I|(.s{}Qb1;cv!z4oBY%*#>Gwp yM5YoRS-C $Ne^[3N l4V&dM㒕pcCq>ˁqӝ:]uWpR5Ƿ0U;TQ U %`yv b]aZ7Z=DEXѰ. 'wӜPRf Ct8A) JqH[XCn-Fep9$v Ν&8c:[ }aUQL7QAZVӨ52j#g4$!.'" zIe;!N@?_ x[/Wt6Q Үj^?:#{)d'Cq 7`vmnI& lyWW6 $?<ҹ[rFVIj,Qj^ځF?޳JaҷA"nJ{$z8]6F㴱U>oC:h8͏j ;vQT#i.lt*lrwGJY]*/o_^kw[:<3Cυ'il%+kLf`]0&Co,&ܧZ:R,#xj07z } }h ׄ!%q?aX_^uon~g€+>'? (D" $=XSR1}W?ਥ(D&a^%\2 CW%rsT"E$\߂ |@Ulw8_*|J'ǙBgj#pMN(sv*W4&̃ۉUL֒R{F+G!äZ^*w?\+p(B(uG+T C`u}esVs#*CMDxy#_y vMVu oK1]Zx~ #GVL2\kFtͅuS7-FC&_Td;i%:}"j.mEtմP??SyAy^wTi$ӋLՙ4#Ifnl&4V=y~4>&=i=N+EVn(.>rQ@+9a"KkfII3">CEMQ/J.xeUU)6~O<̛ea@9䛰S*^zsMu#KH!ZE)GډzioMJ͉:t^׃/9faHg(O#Ө| PZ(Z>s\q׊ǐ͇NqꢛEMڄ?CG}bIcNFDrRT%Ϩ+x2K55#V$({jQ7PsX9^tG˜xiBQjBT{ΨR8@U/6zRдFUj*.c|]ܤ*FyI:oI) GP!e-Q-ٴm"x4FJCmU#I4D=(h]$m˰2\ю|qT0]rO>|!ر2`fљA\ *9 L7 2tjlM hjxDF@A'8Q>XcųGO ,}hcGמ[c4qoH~~u1|Q(8@('<sH:%n9ȕ6Tn7 @ٶn=N? lc]~pccfٔK cz?mQ5;AÆ^(d351ܰ >\ŔY(-M1krzb/ϞBn#C  sfUmkl2HgV{;qpY2rt%-s{)AM~foo|nnY IKVhN8{*IDvSq5C|iq=j,h;VoO@> $Fp, A*}fS/lXk4EKB0C/PԒn4a i1rZFZfA>@NiJEt>V}ÙImTNdH&O1\=[@:b"xnu $`u/6(#Qb*gJk&z\ O67jȶpYeZx Mz5ʦ(CmYX 7[8^(m\Cg7'߂wrW;l.2IonY9r﵈'VRFDٔc.DQm(+zGYHm *ѷ)QTmB5v+AP-SR!%6]~D߂8pl< n> !DkLX^/}%,@!n$ivOrhc &ޕΠp,zZN\띙𕛫n~%A©5`S(e / }>&W/nOAWOx( !5lfFPM~}6o>{.ąfv w:޶i?^C4H!2t:8ڦ4u-HwjƏOe n?+IY l?Յ 9ݦ:b'6l jcj"P9i$Cb3-cI8}Vţ6'mIǐD3&evŲ<سzN/Rm»l$hA>VDXvWU <ˆV]TRx @ lJ,;j's\բ؛M M2Ͼ+5"̀VBDVԿ?;p;C}⦯Wa'+ gU(|AS&5=% K[k•Ӱka ?oa켥KW, 0&jkp;fL6 7ge@垏 `HIMR$Xɯ cڃ (ڼeQG>p^ 6M.[fI:dyۂ6|ߎŇm; XP|`OG!wG+Qo,ݎP"e܋nK뫆z?d6lL8 8HƾwAz9o"[c?}eGԡ{`}ˌl?-ߋE(Z@i׸ ͨ9+0a4ZbƫlcoRF(=b9sdgoj!p9rD#7]er^ci@ʰ[m5݋7@5L>> F.'s{=. ~SEqGH r58C HruzGVW.dF[2ScHM?Mq $r"}h'V6v3PsM~"+Km>jm(\X<R6. dJ7^ E̅+0vEz[SHEhozAE rڐ\9-&vY|J'0:Kj(̚/Nk`L'b6ĀO5OfCR%`QU6oLiI̥(LJ+ Sd+ގ6G6,!Eֿ W/k/hmUV$ȋ*yΰxn@׮itLDE%:ĥujO$7ڐ2]r4ݩ`2",eUtY_'R̷LR9im)xU* MxYS(=m3y)S>P1 M%!P4QNPnVFŰܞAhŴMR8VN0!%{kC#kM8YI,f o} X9פ "kl} (RHr$"8" 9 ܭujw ێm=#ިrap0vIV3:hq)#Ie[ oA.Ҡq\@z6w=elДX۴ =ɫ@yFHX|cLU{8.y# =lr7E`AQH,h"=D`gړ}wگGSFTWlfzv ^|nWN9!5if]s-6Ł=ѥ#THen.jjut`g(h`#0bNNII3?BZ+~42yHcݒ&Hl  ?ix|.~r9욛l? !GSKѐe􍀚Nhx^2"7>Y=ާ =5gw54pFmGγӫ^e j#/kWe #p$^½^!a^;p5KkdRExNa+5k2yZJ^ýkrғ3ky{kzWyR!D^ ý_WAW,y-RGZ58ӿ o/7Zjbx]0 Hj"-;3ii*p-4sF{ܪE}MP3-`ŪEi+=oyg;]6% &/YDe(g{ҥ㗬"!%,ek ݋M^.*ľYlU2ݫ,_ xH4r<0߱¿(\Jϓ2oٶTcc.9̭<,/q+<6J_K}ZnA-ڨ&Am;jΉ($@Uj*b%glE݈70xmj0f5bVS~H.I55 j{uwX{]/a 5L8=}u XtW5  jQϷt6r1MFb^1q6 L|H7Um:jwZ8Z΍F c}6[=]:}6Q𖁥X `0L=%n8njܰ f4ޗEx]`pJs+#M]嶤m}C+LBƳ!if{p6p--"R._OmYM5(XMmIIPȎD(`-sD`k 1B1*ǿ)E&NJ?@x'DWfXaj* X5X}&*3KPO7 x'zHtxlH IWA(t`5_K} L O@ҕɟϙ=R0I*~vhXcA$f1pT{x )33)EzHv0RұULc{D(Ggv{n]1D99l +2bB6m`4:F"BʖknIqen.۶W6bH%O]A;pN<* Sl+uQnA(cͯ~{54wT!FEa:2t:lIGM+ J|JhۢcKYSc@7ϰwt3Ir!irN`J֪vhئvEVP~~#^\lG lt[=MMbwZl˹i̯1q~nF2EG+)24艢hߛr4wJb :`M:3R=)՘<ʽx-/z!2 h%Yѧt zSBLz6e(uk= s#xk+pCJTo}w_cIFtN`}޿fVbIdɑt_/We |~VT*}T%n|756M6rGۈTufm(`y}틊3Q 2QjWȞ$ń"ݖHBR# x]Wpr={ߌνS,Ʉ⠢3^;#EɳK4ܡLZO|LqN}S q:t񣚳/馪V2Ծ1$Nٺt>y(E ]/ ,֣١(HﳢoMN&Wg; &,yX7̒h-ieH~g8R Z ϲn򮹘*!FFDHkh0k0 š .,;~"WK 1nAb_~B+R6͢Oi ݑo"@ z ")n/zr,[ɱZ>`Uٛ~Sv]?[ʬP='?J*UezU2:1J/-3$gޓՔD [JW HvqX 79O?0BȱB"IlMM<3Wĉ!/k^O(#yi?v ' MAkD@HWjšFْٟB}(~n\3ڤS~+먚Ee(o=d6)p5^͇ DM:S:SԘN*S2vhp O?2T-FĕP\G&.qǴAjTփw>yzUWX'PS* 5|oA.j+"ތy\>5rHV;ҝ`IG)Hؖtf݂l&_6%j!L~`CmL4< ai/{dS;wdd)Gǿב ITS.ɻ{MC $5x';Z RF-Wp( <Ygut0q|.lu^Gd^b to{QZbjEQYm} ēDy?ffs`0 TQ{-'nx=ݷIܽ6׬|TiLSNʧGW8o∧Ī)#M<,w~lq4W52jz$[-qLQ5|Oۜk؎WBVS6D|-RNx(z `8ûQm9!_=89|I2r>}9kWQKlqOrŸOR!BS#lŗ/& JTkhprsv "1:or~;;f_ġO˟tjXJfBm\ȴzYN'~,?t"Nb=v@D*Y2]~|{Dwo7,3 RɠT`*?<:y3 ,l[*-)Sbd:Zs9(kiX+xCH;iq6Ŝylh1uŦow==~;GW#tM-0#j@fNjǯu6Y_ρD(,0-kWu8BvvbCKP6L_W\Pҏ+~4_4a?,WlW'ԡ [YpѥH-TsabbU0j1Ko yҵه3fcHD}ȒH 7{ge A`G4 eͱp%bOrR+/ps4ST+G:e_y#"Q42"7]~:(}Ab!e ӳ(Ox[}zw3Iǜ~ʃB7y¢o@.qň)4 Y-e:O*^"'zm4ߋ SSp#ڼ!fWѦ*pKtu@JMbvp\*hZ0 + eEg%\ҎJCH$z%P-UfчqSY)}K& Gc8yvn#LK3&>|*[}v/hvcro'Gt(nt NoɊ[ҭoKl$Тtk62@fqnͅ~a@a@ru۷`=_1g?MMjuQ}?zSzlGL'r. d;.c)(נ6|Udqd1ddNaR(,EutVj)G̊qWK̤16R栅H+rASv [ч9YE /pȁEuvO菡ŭ5:kV$ S (G2Sqx2s oɱ>0T:MwWq4]!n O1U~Diבd(,x@‚ou[ y ]K,ˢmpHl}3NzvҢ@t~tLQT|F. qk WJjda_tK~K's0JE| Vm.U}QW ś^pB2"_rwɬ[V(ֳ,h 9x la&׫Z8(nI#Z+G5߀Fx!NrS=Mrk:ʜeʎQߓ8[Ii@dJr(̓1\ܻɲEPN7|ѦCe ӞlTf}9]~)v9Tfu= 0;J1hNsћM\c? >f`2/1UeF j:F $(̮R2,x&e轲6>=8e9?‚:Ob?:0Ïܿ8pȣMlSNOo j{b5ON>̪DY죻5i8~ھd1@oS;^ί"l0U%fwG?+, f`'ƝOJtS͠hzpǠ~3z:DT_,w {#lhXS'_ |K6LI~"-=&n Z?6ɦ#s Q;p!V Ձ%subiP+hd#>yn;,|Ȫ`8fwU17C-P; @XAK?OK3'$P|y1);O Kxځ*]gA1G~ G"_{PoS 9D˘{E ̲ϗ,V ê=rylyـ"uCCaES;dtӆg]L~JQ5CGؚa V-OJ.,n7b>jfjRW䰭PH4k> 2g~'&!;^m`=rkN7p_X5170=T[\9τ4_ YRxWwnSK{Kf/9;2A=ώ]?nr1ެN9mi+œjU7\<}ؔM!;[KȢ۶qguByO/94kKǻu]:=IS=bWܺJZ @idJĻ ڌP`͠s }uD1ldg~"dgv bbE^xQOx`cetbn5ΰzdYxWJ̗k&UnX;5XDMa?vNb.='skqg-zPk,uLm.T6 ] J8I)0)c61x1x$6lIIo3AObӦ7"j55*ɾBfdH\0鐴ZM  Ks~ruc\%i}RML.X <A‰0oM4iqM72`7z;pG ^_qP~{(_9㯨2OGi 0Gf*li֑[u| We/QۜВxxi!][Ocgȿ _kzֶf ۩ϚqM<~fOw]߇/m輂؍Y0Z߀a$\rzb0MzGM 5F I_ѾUz/p\x%R걪 mG@,B.g1 LT|0o#!20sWUtEo38uc;/Zaf̍1=w2Z~ 0ˤV`~0t)4LČT(n{ Jkn;'AןJ%_c#~yd~ vP?FȧÀ*J[ ^`TUf‹ '5xN~ZR0#)B4fkP{)8'0XbԺL! Sn!CTGs'SVV {ub=?VR٘wP6Q X+שI@g,kGп[H߷UjWޣ3Bp0:0YӞt0E$ 'qLRѼC(89R t+u9xy-o>@!)8DoCxjee݅;x]Ǔ*ݽQ-i0EH KڹR;9 -DAUM`T!2$V7r $h5 zBV$c[b ׬; M~BDtu}7gzDbqkQCk15o۲}(A?8-,!tFoIla6tg!l!㫞EӃi+nsPYS4f=D7lp3 $X d- `]L3yͮT&J|A|&5zFhIS2&8ϗ@i T32(p>%7lu79K䕫)pM)nH)BPN 9f%*KV6Uh́bȂcU/\^ ZΪp1ʂX[ TN ?{={4G].ٿDuK Jň05ay{Z&G5NFNyTTȗE{Gs?ǶAp^;g`K ZK$,ǺsX_WǺ;5o Up6]4vR[fn[\-qQe L2it6Zi|N;B"3BJwZ\x+vGѼkN RR~YeΕJ9sX1 ~Pin}n /ߎǣS'dfX+~Z7 vXgTezs/b@yCvE_Ƽ;nWw$UՔA6 zz#H3I e 8(G X hb5e$C2M\,ƌdfJ|2]*!Zl5|l;#^ei܅/JpxGLܾk@A;Q' lZ֦"^Hk>8jW 21fΕQ\UG\FۚaHxLM@~ @,M /8Tr1?blXUeêjֳ>o]UUEOG ]5*OaeMs]`_K5I#UuJ,Q_ zuTqXc@1W;M TzW Phw @bq GBP-2%|7~gi9!ޢӁD;^]\ QC(:pmFM/O4bjg/h:&j Iq2Hɩ 7Z]]eTVi{Վ="4?HU$T qƓTxҁ G'X:fT|*c:#y 'rX7o&$IȰ9DžDa,WVD[lʢ 6F ;S٩('TkmK.}UXT%:\?B{86 _6MI31uML|E6ąw,k(n1"|V)'gcB,8!qArלE) Mk M/%U M`%HʩZ?oT]0.phnq1RrnTF36zj2C=<Zå֥jQ7;(U@qW0KZc^tTT+I_Pj띷F\ ٮT4"Ǡ  V{ CE9ƵT)T}  UB%=cMZ9ʍg⼥j޷1V4C~N j!I5ƬTy| 3.;)H>̤s6vIj.aTMYVLB_Tᔩgp#޵^_p)w!rcu`c^rB3pq55I͋u֐>I?o+?\[ Ro3ơ蓷=ҷcϙT=o4ƛW<| ̆7 n皰c` <+\c1B &LX A<ދu>J:S242,=:t[c91A6t>%l-賓Jo8."K!a/T<"kyTQuYн2`SMosZk/R^$|eJo(ydba!@B(^wm l۾nM~E-! ou"UkL pg|VJO:QZ'z}A['k˧ۖIluH.ry1s'Zm-jWP"V4vL$ AOP"*MA6 3 goЅECE<}Ju5t%Q7 Ĵ22cߩ)p-F!m^S,4)_(6唯C󵚺6o!~:T/es)wDz3N#w ݉]m.tDnK_62Dwo~KpOukfAH:0E[!3zC4pr4umu=XeRn45 +nԗ=BlT%dRmlPO(xIFzS{Z7x5l|}Uz~Ex_N놨_!TvXX5(xnx#HodnG%C}fQ5~]5{֚S8eU5u&Sر=6+&|aSax3z|\gM$>lm|?<[ͬl{\mh`jəuf:3eȞZ=5x]eklܱ,Y0 8,E14T 6Spr}|khvMhLDml\?S 1('sl|i=+Md*BPp}(,_#2u1T`OoŦ|A[],NnX A˘7bZ6FN֒cqǼN @R6/W5*m ׻J+jN%N4&G,#R3o¹>:e)`5g5l;@2@؇:@>=ro@VUa;&ʕ*lj'bTS Bro;cyJ3 !B?U&Pd $(~ t=LpqXw7sB{L\[5}鉿I{#FĬ'E}MD0yfsl5PBc/bqI+˅QZB5Lx,NxFL$=;@ 5o9Zw;[FkN}6mz:;:'~+΢թ8v)BQYMS!4b μ]}BF:eShź[TT&{ Nk#`(A撓+Plg0޷HEhՈLR.9SƠ@gWQxu롄Y!eQX*߿s8 %ڢhiЯLyB&ՁDy #SHWqOTqGхv_hw_}UdU &n8rT$kltJFȮzgEO*]h . Q>ڮz…(l|5}Äz+|*e=?-be~I.@~]jQ2jGf0/8%ZؘJ {ɺjdJV Ww'Il2scI >_h$ln NOXNMb1/lL-m(I,&c&݁j&@ MdSs8mxeŮZp_`܄]|b8_? n./0P" 'nAE.#?n;QA?.,tk\9no$a,ș G6b 效 OT&Z!8|T Fن%*oλ2"8NqClKf*J?(퍳~smy K,׿-@F#h;/L7O"gca`|%-TKJYbUc(zwg] 3DAw*#dWeemS?4HP-j#[aH6G-ObF"Nc023w_f"3c3f{͟\cT$XCm h~Nʂ?I%-Do d * #GI>רZ{6]~7z IUB A\/!_cȡssaMM&#c?w~"8׌z`j%l)-x,S+;ƙ wL4yЃU39Z\Ӕu}QBhyp`TΉ`BTI4fvg4:p$ξ^p?a%`O[U$euy]%eEI}C8 B尩K#+Dp0TL{ԓaڠsw}I.r( SMd& ճXssP>.XsLhn|n9щ-?z|ƪѺmo6zR wk$_0:MLԅAN(e{ЂZK#ʡ$%}D!? U<@ۄ]$S<"7*ЬTךYg <4^4BHzmz͒urpgcTu௶uTm*rx/r%kN(W6oN٪D.:kgf  T>lLꧬ_x dy(m7~A"GYoUF Ҡd,$)]蔱z$K]btJQ'K3"Q<+!a˘J00JԎuvA^]PhTbͦc 7C3Lz^^)rylSB*4S#mƙNIr d(GYY Q:ErYUz .5<*c 9*昳SnrYNIQZ| KӍThOej3RC[CZM`]C[ԅ9(ņ"-2'(uc3lq@%VAL?IVS|eͰ4}?nLŚKZ}GR*+jm>QW8wD9rEn-ѳ(Zںפ&M?N01=ߦXaHojt[!@\o )h9ec!$j ypHI/G/0J,BvRDфp\_m4ָ8׎۪ڗ= ?} a-T_~MuzÊ6B\#/AZ.Ƶz.\ ~ 3q:쉚qJQ) s~Hkg?ʌ6MQ= E2p<5RU`ͱ~!ZE%0"7Z% VIvC*~#qBl?zd 2HN z; aBipMll*z)ĕ|!UrEii\JE`v));'# 4S{Ɨ 2 ,DF # m'z?-ͺFmlRYMBUe<|9O[_~) ZV.`tЌj45QF4maQIz^zsX4:&Bt C"|}U:iSW5;/kqT7,actzŝ,3r|yu7{C}3pt;!2MjMh#Gm\p4kW* ݒj#TW81\muE]6_!vur;r5>V yu%r}kn@zS,~v,z^uu9(]78v`H೉lwfc6PvU}9Kz^yTn%겇QQY į\㓠K/kKN+KT jVBPy{t ]Hѝ7A>T]W~9Y+l. S]J\dWB3ȒKUhXMX3ϼjݭ&635zs59L#a1*3]*puT2DY_ËjZC7h;X ` (! tk8Z%VQQeD` /ʥ԰`EEwKB#J)Ő2*,ABT>-^&&"̂9YVe"Խ5UZnƞBdM,J2k3+zyhnbJQSYD5E].Vj`-LbkE0 WD7`y f(~l4#ޫlYuRW[O()A7ks,2ul_ @jU붢`Deژ s 8+G]I\)4^W\iYW.iX;Lg7gs>A$i^ڦ1ˡ(/@&j4Wt~Oe^iaF`?RHKuMזզo q!0ڢrsޥ0uSaRiIIp,r$eI;["h˥$͞vQhنVF}{\M-յ&61lv1}ͥ{*h?nrpmyՄRz@LhB &7 =襀=Xx&4CKz]4QfLnX._ dA\*Lp7Q^00}X߰&V ^3B A7V~@$|9T1D"XWï~\ΡԧIM=y"]^nU@>l#5LXKI@ɨ1Ny#I=)sb͑ԥи@I[tshX`<+;LuAגJ2ʀyncPgdhJv)jv.$j D& ܽL[-VG|r8hnk&ri"R`[&NB[@^H+Q<N\$)Y*E_ #oYeKJ )\rfU >[p W˿(mdDpNCQ J8uc|9V]]㕦Ш4K |\N\-.P>a}+\U8f^i#Oh}NFSlK. ]SkBoiv[giBs[kBi.lb ayj1Ts|Pu^w9$' ōQ/f/u A7םuبK?QL0M#aemp+mfȧvs\"V!̝aJȜy|n2?{WvH ),I[Wޤ\y})7 ,sTmᘿ)ys|[HoӨ^YMƨs;m.:~^ t7:#ZOXx!K$72&$v QRG(y._} ; ) g̿^{TwHtH̲Eb\HtAbo: MN9ib9-0dF)NBNUS ?LȂ@4?ǓU-U}'<~',m <Հ6qc̼4q<*ߥgʗ|K@e u]%:.{-jb׷űr6n5yٰ-O9l>BW:\YYXv?9{sֳ""*P0=> %0: TyEКWij50`rj+S^( 碐i =!p.>⿛ WNcŗGgg̬&&6CtU贬wy]й?E@?Cg`DM^};e6Nm| @e"VkWH ŭd $EWيi[oI~!%F=bcYy?"8++3+?AY#e2?w$zB\z2U S+̚Y2/(3eAhQPk$PTV*+~B9"ilY2~nZ@2 P:D8^ plvB` `vdXm!mGN(X;`=^u@gH b(1W~i-Ӯxfd `]մ~h;uk@!߹ 15M!op oh_5 JW@)~A zt7Q{^j*kq gV>| _(bZ=8;Nz=%MTAt$r͌y)G]{1ЉmybX0 `8!XcD|1n}~% 46{qҮ84.97 SR i` K*_pPW0vA薠S%K($$H/\n I-u :d0YX>P_pH,%d15f; mva|7S|_a ƒ;UG͑:c`bX.:bnLggZ%m.tƤS)W1-mM ~7{#7fk$+*pc'[&گ/tc3,~{ӭ17JKvYݘ%ώ?vRT㽗m12ݦG7ܘW)9>ܘcYO69F:N>by~xo3tcQmI56P_ϩS?N޹v% 6qqr/kKi}1}q_Y+n6IS!?<7ݘ1SHmr8hzbyߍK$2zW޹1%vN&п4}Ҧ%y}=_ldު`@R5?58LdH&+m0_Ƭ!kwⸯ밷nL3S3Vݘݙ )d]ܘSisJ!ed3/)߸1IՊ$Wc@T*{Kh٣O-> 7d&A;1Rj?{ dxgJahix<18]S9 І_\;EhH˳g߻1nҒ\$\$UGZ}[ |^nTGidg`~9dsi$Rx5p|1{n+Wy6u_t;Nbu4oyث %ln_^I3HENz'nLRĎ^dM@7e ڻrjEzu Q09]In_OE4пIZZ\Tw=e]О_$.߹zn{7 DzظOy/gS>ՍKd7CHe8v|H6fB݀d [G$SeLAQed'?{v5B^j6; uꐶO+?mBaWGHa_=cϋofrqĝj!QzwKn=f=𷨃'wci1=lIo`mdCv|0҂΅Y~qxӓ_^Q٣1Uo-oFx ^'rȻ?Uls61нolڈ+HAn!/YɅ񶶽ÆЇdҍ']z?߶ϞdA褤GRCb?z0M476+ 9]f( #'|pµ= ^ M:([>k<=& ocz}!Ͻ ff= >nF~kO^Qbr_G>pɔ&Z $_< |%To6 ج8/q li~@nu-!IYڻ33N-!l g/_hT%n=m0֫vŜ Ȇخ_{ Nv]xWBіD{|6Cڃu C7RW5o7[DRW!27|3+@K7߲Q=3U'H- ߞʂwJ'Cyru4jGb=ï"٦r6.w^@T~@w﵄[3"o Sviq@$_\ Ĝ\0oYٰa |7閁{4Oa N_8@<z[d#W2CȀ'_3%a%W W dO^6eq Qi|ʻ lKFY=e(L:$=r` =gXHitvR A.ɀg#H2VCg9g c{&z$OȮR%' O^M_w|@o{0%~ȽA35? o=~;9ko=@Fr̍ena D8n3۝wmr眹l@'薯Xo ێ5Yu׀ m(&'=]L"l^RLH$RIb"reof/("өK~MnYD \c`eHC%튈m7MH+1N[|($z4,"j}d; ɦ5ן+$S-;XH{~)$=sW:slwV I#-9Bv0] I PH.֩K.- eZVOnਫ਼2=cBχ/ɠ=9 @FKF}`6`/Iƈ}kUf/IδS]W>ioHS7k[GK6 ݭxndxboot=xݷ_8ƞuPd ߵm?5d@zuƼ kGj2C<''gxNϻ]x礃wͭ^̟lÏß)OfψڿOٝ /ab˧d?!?{%OȪXc^i# Y?. 7SMH^f2ݞ ~OKNn>Mfƺ|ҩչ~DuC y7c,ksHݙuI`S["QSV v7*;URdWLV9TmMljXfy-+Lg$_ǃarNŚ`Cxމ;r>qZi{~府&p>FLɈ /HL[N6m+\=[B+IwN_:?|L/:uf'^ǚu3 r@#VUYO!|Nv w ;w ;u [w u S8[xzM(1&QC!b#2_j㴠|E*:x|ELEPOQB*%6PDIrї[AĘ]14q= -}:/k -C j/IeeAŽN']./a _A%WsQ"˼>X>UؓeJy1Ȫ.ZsLɸ2qU1!X"AIeMPO!h)0%[g܊'\z&o\yQ'>2=I/: ~쮨'{E)ho@4grIG]D :<ۏ$k:{.|'Fw7PMq憦"SGA90kѿ_M%C ثI[0ښ琯 NEjYgRҁpE1o]EXNt:$o"F*]PPRE]}(+KU|D9zE5́8y= ؟wWp ?Dlќ8;}姻ڂAk,IKby91[BF*"szh/[$R9LDZ3asLjҋ-UiNߨuI~3L7ڭ6/' RG.OM"_i*"4L{EWxӇqmX4:w\>Ȗr 4>xw ɮ{fST?$$DO=F}-W/_:91r5QRoє`#8 [ܜ7&{8Cnچ)dڢ{GQV'6aeڌ @V(7 066EUBaI9{x4:q 2`-Ug5V KĀ~c&ah.~~zhf5QVG=l_P xh8B\d&ƹQ?WjSׇoE72QeK5SܖU7V}r2ƱCy#oFt||_!I9t)8J,…Dt7XMZ._'$#0ᬷ.g)RCQN ԣ^RZ;+6H͌JUr:tdFƶΣ8 n3[9;I %8j>|Z Q?!&7tmry=$1nؽ]u"ب!&&TiAC?xL*!qwD͊@右4SDcl߿T;@<I딀>/*GN~rN 0{3 1y?޺b˨@ ]{(.1]J)D;",W+sZ댢NU* )Yo_es켚*`g|߉)r5 *ʚnj{^g۵ÄhZnU\{wCDmG^:ՕH\0dU0~i[اM@nLU@*~x_6b8lT\u9Y-j`hٗ 뉨PYƺڮ#V^BfntXdxQEd,l_ ntYs\8_ &J6x3N$Z33iTC?$|EOG{Wdh^N4&HqS+b;c|WObU'FW4AFjMUZhd'𓟟t) ;+9LÿvXiؑ/Zt(w~'񇥳68E-zкģNjUc,{׻EQlsfig8V݁DYPa2Gj&Y^z,YgO.,@V i"K( rS 4ڥQ8)yh,uE10SP2TuHD/ \oVwU˅6Et"V!P> +WU&UUiu^yv6:QzZ"ϊQq£CI鼐5m2G9;KŅK9Z;߃ypOa5'9~o@D=Z[o߀ތgdt=ٌ|ׯχݖ9Z~#1&b~O4#1v5*Es ݓ赆Ml𱔅!Ylall zl}YŠl,3ؘiFθ+躊]6j1 rhF>}1g 6V\ul4ƜW"dz,`cTo6Z?,ba6:B/ﲰ$}ײX1 ANʲݾgv}i41ZwNYQ}yb Dy[p(\8 FaCxwFPk60u¥PmE0cFգp(?QxyFBQh5 F!5Ǹ9 䗇} cJ){΁ʯuw y՛\-hΔ5w0g@w}@úR!+d?xįh{l:b{,D6Lnzd/js@MkCVYHj%|^q=Ǖ&j2T8g~tK}ݙ)|yU[V$\TR@N;ldoɸ g_u7} Vm{ DaoգB`=9P"^lmi:nڛ&dOmG)#{m(|Z HomdճZJ@!q(_)Q~&3y˷"y2TTA ~k?LDWք 0#fT JܝN}Ԑ=t h;n-M3nE)4Uxi5ڿvkvTUfAop}8=Lu@!A0يcnoc:'րy~ Rs> i3L| _+F&;V!@WI'v=sA/i]ZTunj3nԂ/d$-Z:=B'->5Ru2l/=sD x=*a9=GrOK33z$l=|R7Om"³ݐTe6FSRw5)wZG9j`l?3aPM\EIKs ^'2Xv 1U#h#ۇch<&m;],dx}揊.DIeU-Wjgp3_W`CT߱ۃ?9E;Rt|{7k+lR}[Ǡr ػǫAMкpg&?A[2qm&ܚ4ډ5Y"CS?>H@=.C6Dr0-3B mhV"b|>2m;m·0$6Ct4.&.NQݵ2_lNڸuVNl3j7N: ]T3|JoԠq=HBt33\Azd;qI$*~$$J/BO'ڿ<-q(+7zW2 oG1WwJ; t$㝟P^v$'[MH _S5d{2`=%6Io[yP$ǽSZ8CFGjqZАM/ FcPk^Y eL(w96> 7ʽU3lCU% m;8x~_~+2l]ũq*tv_ 8}g/oqLk9 B$.{+?b{#y, Ɗ|&˩"M5 '+ƶk2*4O"eߌF]6:CiVlVIzՆLV]h1W7`%|L.K#}6Z_e:I򛺣؄_ Nl,JVAaZU誕ef2{>xVWV߯_KP@xl[ D[ znMN7NPG>puܦDHuSY S-EX48d7 f[/"P< N~P-dUHdz}2z8|S q4AK3=wݢg^ 5s-^7׭SFވiH?GgZ'G{2 3g٭)ay:Y%\^[c,_ e/E q_dls}Ud#ա҃^N ϐGoJZ}(BtkHOD"7wt Pgf1,AcGw܏@]+ kts9 .]ώ>a&]4h>Eu=0 iW8\7}0 q0O:R|$Gx =}]iggF\gx+~?=;#c">wP42O0./NM?d  .>To ZShmu~gy\/}F~$DbY;g}BdG?~Qaג0|_!n.$+,{{s%.쉿/7 {ЂXK_GtLysɨY[`%\>xHQ$ɾ nN'գ1wo2^> `|] +(IF7YyܶbGoNC;[sāe o_eG(I/ߘG~X/Ep>q|dA>~9GG>/T#Xω-7R?A%y|d%??IS'|JG:Q~nIr̛_MpI"8! |+rZD.BXr|d:> I?'x߶{,Q~!?Irׄ!~dÉ|(ܼQ~9IurI:qZK|Kr߬`!OȽBq"'Kp/&gIy?udHc‰_y 1w$~9#ћO!rJuĀé tct|Pp  ~פbNYWMxr}6g^o ^s4|)Xq23~KѠM߼! |,,Z[ phϪfi^5@s"*`}|,5.z;ϼgSpGc뢨@;πsOQ=7,>x=G{K/A{ot{v-Xcsk R|@Ă.dX6f [ƒgC-Kނi\Ǿ|:'H 6B`iE/ .rbfT]wrKih4퍻$n2Yn]֔4 ñJe^fzOݍVJh2=lƔ!) - Nox6/7DGx7r׾o xcxm15ͧLQ݆ 071TJ8ʿ|-5mAMGUEx'TZW)5-œϖO|pʨw׍=}7%ރC3|xNy" vYn\x/}',ZJ*ao{ d}4Gk@5"oDrMd@8 h~y ?>k?glo@g ԟHW@cSzTP_uj1>uH-8%` jzԁ8rku-NYuw*tPʭ+duGGLƾƷyf=- >_ՂZhUaA%%Zz!ԂJmW DBKFfFؓ>H8T?4= ]ov?~W&/̡2oQ|Yw?P鱟OWÞ W*Ru^ d H.q FV*Tc/ɡװ YjA&b.09=;J6<JNh?׭̡׾&zԕϡV68U+K㩗~f^m9%31eBԿL[ᥨC&/Q\|[S7nLG忏w/kgF*EpW[hx'T?c9h}M~)\ OFdXl ȃspCy vA5y Q9ů˅œ^xK\r {k&}Erg tJic=.Ɓ1aQ(/lx*wlޘq?ԷonYrwm\T|wP/+mGZu9?v!̷"Trɿ,zq>_-;ZOO'4z/0}LUӟa :nQ7Bu;&dȘ'5Ua2ψܑ+xXS$w0SXmqɒG hߔՌgNu~㋴TL|jy뒽:o/# $8@`^= v$A`V? 7- ~%D  6'XG' @=jU+ V,'XF]% ,$['+/ 3O %v N$$HJ9A&A W 2 R㈜ E+A)ܱDNI"'rLAdrE E; 2 R"DNI"&rLAdr E+@)~;X!ԁ:^qqu>t;[`y\ٯߥ^4M_bn뮣ͲmB/ CI@O{ym !+n-.x u`;Q~kAl8.$Wrj]r|^߯x|l_|r7i+U7xn7Nsig_6z޿mƜ(7I8Yy 1 V#lDQ*sх-Q@noZB6ź>n#@Uh?Ovw(O7ȳxGe_}5[Ӧ=+XY߷QUW3@ھPM>sikupE:`N\8WaA`(OĞ Ze]hxN0=F3q;nIMwQkX/PNBQ|~gf" @}Խo#v= {ÌEVyslqC.άF_Ž`Z7}ܞQ`s|;Q@~5AhEa8}EJS<e3iv[&&:fۏ<,j:o,Pauu нnYA] 4f-ޟ•j8{qt 3 IvL:W-c#~(iS4z*UY;`9"p{vL_0C&;g& NWJMBY'6ZSp ,-U / gHetb⒯nqgcl?hϻ^8s*D[¹ӞFPXk>1 +_x0hص;?pJ*{:ã},ټ䥸u{,ϔE,)c+JJXR[[צ}el \uƞx?X=nct2|,X3|6n/Rx\}j&%#x?;a|CF/Rv|\_i|屚 ^Ƥ9x׫O}-x=؛8X, tS5s=O `V:oH~y;1XXܻp-,2n.?s̄0'Nbz~zfm\||re%iͥPAGLF!H7$z '\rHڅ=MdCL|6U {⫬LI.~&qx{ά_K{>u{43Dc9Z~>ʚ9WYO0H ElKP0Bb>}=c?p%/]AFXu7Qq<gt7 ȴ#eG|™[|Do愛|Do&"܈= NiCi=M W#| S!zʄO"|"7)@>f)rfplSc+>d(R|HBw>qfeoDyXz%W+$AY^ kI-F羫)U E ZZՖ?>MeXCy[D)q-Yo .2,E< Ogּ}\qL+V!C_G;F8SPn\A*aZ$Xt$9Y) om.%(_' /l54P"c@)z}*Dl{ CڻXb@/4u)Pc߱Irǂ9mM j z4Ɓ&iՍÝ{+2Iw%ԋ4tR{)FI]vܾOӹ`SIޝt2Uw/2Z-u PeYjۣt dywWh`n:9S Ű|Z)]7Kx%72'U{#B񔚛6JTEgyDhMEAzt@^'Ax[dN;Wr /m|`xmr=MV`ds=0d X Yʠ`N}ߢ/S=sF-1TKL:Ҽ6Q}vu!}Z֮ N 0A7 Ǵ)/m-s% n5HPgOU`&_?\`aCx= gȨ5 n뛩/?Fˡf5~ez~Kf&jbzj6|nܹ,MĨ] $jdgӼXMvk&q&CNXY`M\wЗ_ҘjN(0/5R3]>B_Afb O}f#օf[5hco^rD $EqS\ `[Qkl,5`sZ?in33♋5,((9`M|p^, M0`e56U@E(ւPZ`ͳ,>X܅Z`Qk_Yn'̂/%Z[]x<(M6I{m5b\kŲ =aW>~>R/O>K!XD.Ŀe;is=8wjE60Λz;Q: 6DUap6ϞLV8nH•):@(\YH*tj׿Lxzxڥ|-/xWRMk}ZV cx6^(JKNid[>TA)3 ۀ7IOzݑMԷBEh橕I/b X"̢޵j(jz^廪Ut}:ಣgm;#T{ͮGa4zdFi5 Г[C8hqLu, Us,ȓk?RT(c<egү X[Wk/5wyl>L[*cN_EԸ69%4C%(U=7ʺUɈwS!gWvƙrz0a]_Ull$s,R@3@kf!1/ e 3w|z<]+LO;cHskn :AMw`[ePt2( \P*C&|| aF*/c0h7 H}1V1յP=DpޟuES>IHcXyKԎ1zb05\6J]0?G揪๔ƶEt|VR%B~TV&?R'xcպ9W'1;/gb45c,s86G#/ ġљ՛}O^G)L F\T0ݿ&U1XYrŤ+ty_j SySfa˝k&UEaKqOh-p g5n71=MwD:br9_,7P[LD#+nZaXpNKZ?Äяźn0^tj`Zւ;s-L.ievda\i7CAxkVD>['u{g;ϚDL{1(]< 6jN 41W>GyV=n@9S=oy*gl=~qYtº8n9vr `?1:89d2`X;'sK kp){Z#?2}cz}}|42+pt/^n۟6In|=68-\6SpY7Uzx;[6ma^G{ݳ/Kz*|Kr*=-jEfHvEXz`* {Z]7tqz@[ZT fj}|zں::n;X#jed?;:̷YѺ5Qb"Wlta!ƧޏӶƝ#l~vkˉYLjzof3ƮYjp9ѷ(`тvoߠT3%m+>odL.u{P;؛ϔmlG:.ob3WIvvn^xGv8 gc;&J_oʌ`vʬob;6SŚ2G8%{V%0V G=cV&q};cW R==+T{͏ G- zyqfߑ%gW#HN ahf2\kα\8ƒ8<+'6vYfFbǝ$8lE Wo I.9¨dkw ènO OHz&su1:x.\uu W 7MU">[8qD*3zU!Tix:mi?/͏;ˊe(n/].Eztn|PyKZ nۣp6?.q7(d IYpT~ vn(=~)^/`|*l׻ \8]^oIn`)} ɏ#wk?W8ݠսDqզ z@뱜-;#= g-}tM%p϶3q'Ɍ*W՟ q|B;㓌G cu^ 1['2He8p9!^3^,bpME'3Cs#՞,1dz8ɽ`~)Wʜ{>[f ~^ᮼ6|/$$x.38ʽfs6vqǁ}^+-8*=b}`^t>Pcꮕk>oaJcoJb.­ƹ?s@2b;s$sݭ-Ə!7IW 9ʖ2Jc2/5NZοUq{R_c'o~tO&qmKGIF%~pxmǹl?xA wDbv3]q<>͖^_`n{۝l:(jYvh_G0nzw$g6?tg. a {kHǁkc_#p\SoI:. ̳l{Cߤ8уhO`"cOW)tmor07z1y{cCDg]ϧGzVFeyݿ p>Ojϰq P{ 1 3Ӈ4'T6?JSdcA8CK]{\M?GEnո\PuD̸L!t\++ ScTHSI=uEtޫ{;^{g=kg?u^`[F㼈;m^+ku',qnm|c[llEny?Tp㶥\:l ^<_A!ܭD!;nm*VwV+«TM;*Xwq62 :d7)Zu;㮦Zws~xqT4bLNpRc׾N<ם ^ ye rqם 4dayQ 'D]>ؔ≠ X $#.]3\ qȵ]@eB߬I":Ov h\l{[5,% r_u7NFO~/dxqc7yYa;$+i]wLn2oG ٟs~PI. K={}OWkMb(_ˠ=kT_ˢa5Vohx_KWQ?7ᯅ7׼̝yn*w,E'u4(ӉXck`l_ؾ}c+WFtH,RDzMV[!WZ>jIμʜCVMԹJ@5Ҡ:Z7*#zF=ҡ*Gܾһ2w~`4RzmbiLB7ևmq֋[>Fg{IL m׸,^1pA]myM^'%qIiMwPd14a]ZvhT.L25dz&F4eI|pr HU2DTLjOK,9f4=)@ eAcyi۳d4Yw ATa/ـw&Swfw)Xmz4ٵ?_4.Ҙ}_Z_1g?\q q· bo>m"v (;@,p^y |L HL,0+Q E`_h_)UO{&C/#N}n〉6S㊥ ~xKxMuV\a׺Du/h W1ŵa/?*h2_:Wj+˭8k .TkR]#@Eo~ے;T/~$\۔ܲ-,Hv~^Pΰa~JX5~z]ϰ0y#O;۟\or5  ͻ|ZW?y،'uQ?<>-']L"ZiE& oL7;Ki?~Y ~ˣ [h|O,:͈mhqҭ2qgn*|L\vh+8==mi+I9ڕW^"TF噳3aV~zR|'N{m *XX?LJ@n7Rz fXlV[3.I  ]+3vy+hzp={4 ZemX 4o}y)YdxqBZ95kj wl8E:d<z3u%1uQDiGJhkދ<_NMX&wU{TҝwaLMbKqp#8{qB768~ "۝1z<<9;k'KT;P,v&kKe? MQ'l9JoŇf Biɥ|"޲ ~|N?:0)9ey]ށW'#EE@욂oow8trN\MCj%dp_K)?oz\MmFu)c~nAbKП\)/8yl]x.4PS5Vz/BuNBc@h]bt8HmK1ArX\^2:#BH5dcނć3!/UU=Ւ\_u ۉ909m4`K>&=6E!Rz ^w+G6߷Q=-Rz&o#t-'*v~J4[rls%X/ׅUHa´ +sz`Vqّkϫ^6$+ x9?7a_ǜCcFղ~.ăZyO0?O<%eGKn'6hEح9p}eĀww1cs{2% %0 __{Gr//`ax ɛX>90 ,|X>,K` //`A,y/977}# 0|}߰A AX~ggA?#~3gA?X?#O?D}^ J+a%X0TD}!`_H}A2l_H \yH97~#F2o$HHcR}LbdIl 1c>&}̕gc)@b d?@2H?`)ǿCb!dؿC2wH`)Fb?#dF2H?a$)?Ib$$dO?I2'IOvkzmvJ#6T{ кy fgU~u *S=%u#ۿRcq_m4r¦(?r{&2ޙWEԉ,gN?X(1kS:*Sb1W3FozEp4>DCRQͻ)h|@G(RƼqшi@')VZ8Z;fjyL~zTKl痒nnniUGu!Rtզ+9vT5]__ʿɞ썿ٽ%/r<2txY+vþf@um&95WQLjgf͕E8;Q;ˮR䍠 <42]Q64 k="2 .sS^Pw)P`nh|C6]V1ud>_o0>ةo(+#LUSTSuD;R0j-ZH20XiM`S}`-9 20łQKR@8Iyt>L"g E cjXeKIvF'fSjq(\z6K klD?ѤZ(ZO%У9.OmPё^` ;V9jSp> oU (C!H $jPqTԖP)^NAvoČ ^Ikj!gxZc8hl3k_RxЕN ~5PK thA>A=Gv}šRfd+4:琷ᆸ ȨO9 ^#Pz8u bW^C H{Y4IhZ*="F#z٩qGA`S 4JQA:zZ!=Ȃ:uvI2a , ;up['h2}*ZEzY/qM@zδwS S]mVҰ8.lh? 4H|cp>ct8S!s DInKcϸ>5JnR61۸5+<^dlm:ݠ"kUi eS x)8ggl)t۱K1) a 1`̩a a]\^n TޕSսm"s %*[JsB)TS!BRLT$2d1ep6)8ws4{˧γk=kyk]ʚXc6B?bOGNX:SӦEg 1a޻8&J\QL3CYy)ıu̜ߔ 2vut =RZcsx"7;,/:V*_/ᘃՔp g噣e8VW9=t(NӁ`[ Sb[%f-8Hi H998mg\!t6Ʊ=$^oyޒ>M#x+6F]("~ ,mDZ/~?ɗR+ՏTN&T8\$fiރcqoG&A] ǃi%e1q, TSIݏR3rq*/P24l"plmVNT2XMfբ]`]DuN±u?Q} 68`Ep]F %Uꞑ( /AGQ8:jN l9{6;1&/?5yf){O؀N NJ拨E}=e^C2kT8d W}FQkj s^^ ѓw>1ެ9W楁ey#('43Rh+6 EEa4oOj/VHɑ d_ۥJo٧OJ I|8_ӑuK;#ۂzp@ gp%=K}Ĭ-އʊgIUEҧj^+x~VI)uA 8%T1xVz+}Z 3ON8p sq77LLPߑV%-h:w$>UCE=6Z>i&Hꯑ[ڝ '(j^^su,?{IM8z<Fy,;iM(xcCyJz6(F.qg3;b 2iƪL/ Q2±|ؾlL/vcG@}D#4_5jtC/4mKȁ[IӝP6 x)J vmu^ =Fi_A3tυ-uxIVKʅV8`.bLyni`ޠ>cyi\k/)ysn J5ޮ4E??HN!<])_bej񈅶'.3"d4nfX')1_߲p ףEγj+4e@ލȋT5w!|*Hj-DZTt aY*w/A TP/_vTPw5$ޕe=!hc EmeplT=co|^!igY"0Z~`۾w@촉7G'[A`dOAc+@q7i@$6ͨ(/?5D{OuH2{e)lXvw1o"%0?mD+-jJkr2ϗҥ07m2_&J!8Y+i^B*oɭs܍Q}"bjaͳ|3E][,^<6N+uywEC'a!ov;JoeLSzFDhjkjܲE] t )@w×sOx7ξ &BO6 dʱF< xV/ZȻI哦|& )jaofScZE9ֵp><$ʁݰ0 Fr3K-LIŠrPOظǹgx]9XK<;%V[4nd蚛W$+TE6(#l,}z+q&>3%T}D ZXɻb4A)N~k>Voq!-l]ҢU'V[Ͱ]kڗi"CokA{zgQwPx*S69qHݿfTAq1AZ򶂅UpJK4$s [JTd+xꪀ;?B|xz5x/Eף8쯆&w/Cjp UI]k|˞j:%hoYg5ovD0/e5t\"];Vk:#Ⱦ^&sP:t֥BэKO]KSq >*KPfrS˩P0LʙmZ3uj!-ĖZXZXy]2S7A`Y'LWAaz^T7ߢ߼䈹rZ\g&tyN+6rqfqiafҫW ﭨЮ+{d 8ݢYr.yk$|ODg4f3nP [owE9ȧԮ ߶;ojz'*X \#E0{땿zJjO]DO9]Q=ںA|{xtևy3FDf3pa7&4?ӼiMw+Q "<@ 4-Hց&X=ln4ga>Mk*~. BTVڿTvжhW}}h})#T )(yK3Lv>ȝ#ph*ZXx̀X @fY ȕ*œ?nWCkkȺvekGӵ5`sZw:mQ>m'-۟\{[#ش.tz~[2-:x*4GOωtP?E FF?OvCI9rv+0אOmp|Gykř{5^Z4ʉJ&ѽCb3z*5y*oцxWpDZ+vTx)"OVKGuN bȞӶB&3跣*ZX%ֽШ5݀[c=/*p]L8TkM!WU+ Kx+!`|\DO~XMf^wD_\>1(;y]xm‹_: q񟆨itt'm.}"ZZO$0= ?D5pyBir '*RѝzL ~?-Gtr4$;4HQo7^_}7j BPlա jTWEw.'7Y񎀜'|KQPIrRjjmZ +'2B!rW̆2dzC[^H[J!B/K81طX[7,.($`ߤ^DC XZ!+O+Ӽ0Uvs2q˵I =ciX I!a%[2K/6}A@[9j pTGv=%uގ=^pvԞ/(s4 >$E{<=:.z: dyR Fw_'~GuG,K(J<+zJ}M9őFx9s!իמJ@m OpINhȀo/_c)} Hs0}aKdGǀs_n~펽䞴߽k 2ƛ׌I1c-~ԉ滵33@l]QsLta_!b68o`ܯ:fQ>Vaer ?8 S;y_kl4Y=e9ЦfxWƦ"=0@MzLW} 0í7{@UfC(=˥Dڬv5 XM"~GX{0SVfT:JsoR{cݠ@/.7tÖj~7bםt>g1qu5k.whi>S1ö*Onp}b*ڋݰX5j7[ ݧ—uL%Bmt+S.YS73гle:\Z: xZԮ>I+{v;haK`sԪ]nXS! *N>-Yvf]P5OTd̫I?= ΝqcRn'x[O#Og7Ӡ/0) מ^lLYYr6 %KW @+]ފTwSk' 돆뀪m؆M@eT!~nWmNP+TWU׶CȌPc7󴠫[HEQm W6v{~63=yL^|D­G*=RmAڂWH85).r-q(..գihZMyyM@oX$~vRq}gU$/4@Dɛ 02$-Vި3^ulzlK*l3ZU=f0@ؾvyXx )"2(LG'1{އs*g9\8;*>E|Kc2c9dW} Y I6u/l"2:K݄t(8*vnν cA؉'"/@-ҏX+~j"on˽ӽc4V aFF)(54#eO QJ3 %'KQZUG377rx2g롶hVJOاVP(mm &@J˩KDlCWۑ]+_r`ܢ9?Ԣ+%0V7V1odCԔXYrp~Q(Gȑ:O~miՙ#.#l{sfIon?~M۶ !+n\Tj&[}3D# _En\fmKV͉0~̑7vhM&?Ớ{UtR<1VE}ENjBus=sX.;VsU+!Wdzi UrVMR!Xd?>drzv7H*q:jD,aYG>='O KY3Ƙ(1K i;JD=dv+Ϋ P5V, - х2 (YA6w2H`=ptRf xEfKC:H =vWz?F0g'b "MD5d9B %B\xlNgSe6J( 1XC kp$?YD)#BڳKć48h _Da\vn.Vn?6}^v5aY-d~sK'"$wlxx?MϚHhڻAǧS]ro:ӻT Q& o3ʷ;mʵ;-3;wZ\w {@:Y Y7)^L.A\XC$6E6/m_ڸqiK?Dbu"|H~i!uj :#dӱɖvU5|(Ų5 v[BgװqS"9h&r=9 I>,%CSC;_ɄFOQha+@%Q4 dkx=C#:Q&L0KKg5f(hd&l jf;Ddj(Z"_q#̡]A@&'?e˵ZU*A7RDeo dL#W02>3[ YYC5M3(Yn6P\KUX-I%+Qhy@LQj?5,3QcؕÜlj7wgxUQxc\VޒԹ9&V?nS5Q]cIh %Ipo`uTG55rE2iI[jM"ől <+/ LDҥZf3qO!1$nb"]Q(t{Y)ݛ~*,99I1@n|Yiq'IJi6B&3CAh;x >d|̿ef|g;F ?9IN1}+nh}`Њ~׽{N4/XrW7;qMpݝW(1ǢpG/8 (`e/ qsì]<"q/ƉVnj%~rAw+դ퓳߶K!,m^_KQcX\ŝJp`{՗<8[/'b*;֑7Nrb;Y79‰"`Ț%ʚh}yϤǷ<>\\s35cb'[(j*V>s`VGQr{ Dv1MaW(5) b׮QOyhlN󏛼işA˂қ_SV O~FP.:.U󼒕U:Of]S{5c`Je[B]oQw;mBEsLLJCV^0Ч\tj8cԷg=@ ms0L碍hʶO#S/zN=O٨Ng5{.? >tjOX0w QqMcEj ~U "t.Soh?%}eNսtć艢-[35~u:mΉa{gq QD{U=G9r2mA1캠ѵW\)'TMneXB91vaG/ aŧ?vt:RᰩR*B&ܽ* )'/d<L]eR8rPƶ mӆCإ+vzg\n5r &wrk'6bv]¯/k h6=x$~h疓7sNoӁ|k GsM-lpUΓ߳.h}bl,c&p1eXd/qjг1&=5S{ LU'>;uJ/y7g/8Ψm^zײm"KCyr%3je]LRV)CqBDǑ3_% "~'+sfsim9Jwш7̦nJ@_e@bdq=PLw3>f゚T;&R"30e&L 88 ='-ױ3;T4#=nff)"tacǃLa7ڿK- 5#-Aڞ1" FCLjPݣ˯/GĄ#fD۱w+utndTk;Zna-8y΍#7@x+7_1roxq&n5FXF;3g1#07@8y66pc<2@XWύG\=F`w7:@[ˍ#0i#pj1g^~#a@Q%1M}XH{>>OZFg; 5IJFM*CW.-L_㟤gF_Xl)362Vx LwZ_GgPOw_.?jh9 3AUK)0YkK!Up n7qKWt@qd9X7snB?|*鞠gBxj[P)C`{ u]LvJi%x v1ajlޗJ`})@(i铰*$;$yTԦr޵%|e,"?"׏Ei?)X^ jPax B1nUbqD{NQA+P1ªh]j3?k@ӏ&aub ׂ"i淚b}Z8%I!/WE_;qNscuc-HMN7:ptӘA"=X:p8zAՄ~uۓ-s(*u)Ip-q>kϊz 1!:/ygI).c$eOA| olPj2/.xh 1=֟u(VV!Ǘ:KiCw5;ھR=Pbf2!cm$w }}jCБwLBcUc`=Ox&>"}JT|e'MM~: O>>ddEcE-޳bNEUfvxD^%25i·SA',*/E%=\f?\:00gd ٯXl46Q&փnY@{|oDz[^= ljO *bpƹF9䭥9$)lv ~ow$W NKe^}/?'UGk}W_EK_eD^u^J`omwu9y6z\=TTلh:cr3<7P{K..-~,nl"wVM۸Bz+Q`gD{ϱ|U hॾFuBMtR:--|7X,w:cV< ^L7(]ںg#9Fo*B]/)Qn'-# q?5G|BP-.cCcfƫ5@UMrD~RDQ~(7a, coGtC.$e>^ Z f?F<6^c\ZɍMﹰ΍,%ngVp!}7Zqr.FMvH;n,FR.L:zJ^FHSƂ.ƍ;pc n*Bz:7bػ=ss}hS1SϹ9mvqc*xinĚ <FqAnt^ʍ, nĸa>s7r}7b1t7q!7Zrc<7raUntǍLnBI\+Q퇍jBMN{8I\ _E{ |fex(` g?๻LH }%Er8DiPt/!DX,F4(S{H?czlx':nd 'ZsHsmcp'];@'Sks9^+=GR6šȼyP|d3NHy˒?`Yդf~MWX9m|/ ]s ^O2+zoB|Ja` e7hx–&giC˒/3=‚3 BF%t)cm+ۊi"xW$t'/<ж\ ^. nFkZҽM/`BhC$Bj i^xҽ3D$"v zWтʶ(o6|(*ZqsZ8ܭc* }M!;At:E$MHڔ(!84,F7k{p|,p\TW-HLJ~#ddkK+Iak=IBʵb!\OB{ѐ8~T]{{g q(N༈=6'A3[ >D:|+DVb'q"|IG's8׵baprV!~N#Zֻ y%]6UcG Lzpu`o_QJ? ;S@^89!Km5!+{j')%0"տV7./*?ּq,\oxבeԊfêKSLR<#9'}ʑ ` _jy[yз*BD&ַ& b%tO'jGt]v?m\uF4,?*ҹ" }Q$ʟ4"Qs~E=dy${+:^_cf3N6dH| 8~kͺʿNA[_39U4={nVpׄ#Yk6\g(NE\e҉e7 ^O*rp|pj(DǶ, F| t[G_Ê}0x!m<ޙtb]G/%۽[5[IbCGd>_770ӷFN+pZ!^>r 1[Q{<^3} ' tm7k xu᭮/zy ߟ p>g8.>eNIOU_/ܱ76\sN/Sп{YiAk9>*#7qvV8l"גεDk6~ fo({t%'hkj8U}蜻_'9H߂2\sMCѹ8"qη]F7:v ׹ 9Y]8HB<(|.iyQn%k8gй85s(D{# Fx\V3\! GS>p3¥ P<%D|zйu=|Ҟru oF*K!dU =TDsqy\v!:[t %ӹ-Cb`,7FJYm`A]p J甔m [AJjFU)n(^UUo}ʂX` C,x?LUXf-vw=Co .>8V{No͌vα;^EX ? fFE/yoW}=&Dv[-օ |9`Y,\.CΜKKiڗ3=xO+2%Gԛ2}k+-6 V|J_$pokȭBp8`&M%Mn""@ P2#sLcgq8B_)v~cJы K.\ރyP_Rus)m8c_6-%[U46 =.J_W2PTw7@s'+*rRHRc_P&[88n>%CysCR(eS~cWϨp!uL{[NԷ:uY%W^J/ %mO7{6p\mI_U9wk>h_Xݷ 9uDٷjχ!cZ#kj| ǠؽC.E,y6ؕ^*ǾXWŸZD{i"W6-KE'Q2\k#5T'cX e64l1T hL/IW;)uHⴳDG5_Rp{|MU]a)wȽA+٦0ĀxאV$ S^7oJ&vO|oyp2c3e;fN=B槖 Mz:g? -,&uӞaQoJq-> 4u-ů, ²ig+"?w=pz,yĂwS\w yѾDz)%YmcjM, MoҤ#iT[g"w~+7 Ss{RH/g]3+xސ_EG?={i,ujb~)g*įB &ح[Ӊ=V6!w( ?ɼrE!qx]>:K?#oq 9D +y귍ȏNm, kxlP8XqDD}0xK>|}hc_ ǫ=[* Vx,|o#|R v{es2OY.xٻvhgF,2t  ڒNz|4H»hF~4'Ebp!Q%z7xڊf)݃_8ɧ8oo鸩od~w-9 _Ru*Ѿ%OpFoJ"}x2ec<:(Y)Z!dF&_pn|B1|ce#W&O5mG78c!K4b;˘q2 =}2G0$9ϒ@D4B8#!! !%i1,GHC!dE|4B0#!! !%i11C@|4B?#!! !ŋi1,GHC!d 24)jnkQ3](vΪ 68& D1^/ _1L\N݂@{AV,C/tǽZBg|;0oZm/\mg :\8JGtc[PsKxuV|\VT^0kB(H?yC_`լf)V}օ'[~Bv0ˁ`a||3N;kvR$\!ղ{+P''FC_ =&{ ;.z~I>>\|urGyޙyHѵ)"cەJn\tǎQg>9w!0j 1W0CO,?KWi{Õ!4+/77)uM7"~LW ]b 1oO?OtE4*63&Y^Z202^QA+G<<{oD)ʟ9((e0\&3O}LOnцIq?tBcrX8Tyqw'5_=wB3zV̤`s7-XtnLnҁm=0Dx(M?h ;Wu7^Hzn?̹|@lZ?y혒 ]&wX8./?)_U{DX͗ YLr|˄|EEP?7gyLm묢ai/͹}7rCe~b[·퍚.7pləA3r,r=R\aμ,6Inq+fj)0m W\z\xi~{4W<9P Oj;{ܠB{(rGƁl]n&w#p ʫyn vHgr|u ޸ = {Tf2(/SmƃSWH\Ƥ bF^غ ?pxdW˷݅o8Sqbh8w{(Ŵ=̮d; }߇}S}%}%z75XyR!hN_?jzBX^qP6n##g6|Is`{nVmţ>jgxCNpktιtMOoȊu@y,my ^&o7е!ߪ{f]Èy1J7&ӥ}~{Ӫ:mqY !*m(Ez_|rKzf]zj(>a&Oqe+<ҨC0Ѕt$AyqC}h+-q$ U܇o ;`{wؔ/W^;o?Tf ^O=*(֗9* к 5<4TJJ3Ɨ*;?1ws>؂rZ6m\hiL8H_h(J=3D CtQ:Dk#z:MCTDkxj(* ZѓQ:EN򈞈G!Z2B$Q: D!Z #ZcP<Ѽ͖ m Az7݁ⵣt}E݄FJW:Dנx(GDW!(]9JWw.FPBD#-ҽAkDBK. {LDgx8JD4OQt.OQ(=DE6JwɈNBtD_FQXD_Bt4wDDGΡt>PD_A4S(<K8ďEK£Q8BE. #!Gp(JiaC! AiQ8B)~G|½Q8B8#C(!(Jw#>B#!]Q:!GiN(>ߋi{7 GHۅwt#6GHߊP8BķG|;GHیP8BF[io![pW#>B% @iPҖ#9/CKQJ? RX \`<+N!2?VF޼t<\`)<]~pR?YL%;c Z p7q_W1A UgKA3ƾS-7?uXX@ip}QW}|u>\`v R>aZ'_7pُeuQB{)+)P\5|51z/dvr>rű~1CyeE$If"˓f Rky:W(dyT.I cSB~4=Gܹ@(H*J#!T+WK=3f#Cn&ˏ% "-X{\b25`U݆}3!M6^I.W~B/+&[WW)mS?X ?94B@+qK)tp r*UT dic}6,\j^lj`sڤ-p ShSHy䀌+{]3^Neq 0^rb8neN@zpk0@B'ٿHj>43i8X_ 5f0M")>/~"8"lOMuCJG=uB(Eژ" $'Nd 'w#i4fMCn6uBxd䖫G>g@.p kVʺ3d/UKת>$fPEPp}xU\"Uغ^+YOWס5к={?ٿ[+seڇ/pK ,.pZ =2hty`1?\ee$٩ Zlߢ}rP-ٟt_)[I +kU*i2$2Ky `|NTSE ,;iϓa̦O;>-t9ISxf ˧&3ΒϷ\!3尪j=ysU@G{p^< p0yy7O!1bYUx@7\27PVSc.&T8?\ =TcZ!eMT4 /o2-W|A:FScn_qAg-UFz-Y^ zaDP5P _R' Njd{y`\tԁm{+SomJ8y-<ԁavm6}@nu0+smd_iJbA+] g͚d}m4@oN9EY2d`_MG4ifKI[.Κv5G -V9ؗ8<]+03,5W3y'n/%{9OO{ `l91LD߄})͗g(xز89lp,/ao[0 K ԽI+pG94W,s `qY|n{܏¼*z/*;Y<ہ^j,re| un΄Q|;wp xWK.LK(3**U23dN5J2xbEp!k>i҂K_oIi|JUR-)OU4.+1Mc3Zjdyxkj 6O5TKxtW gO^RnW7*Iϙ߫wiHs[<̂tg\eh/$itF?tx?k/r+~-^$f I%#.]:łI!-%ZǍ|uǑ/,N3dTcsΐbO>z'<;sObR@ZZתθ*/Q\WL9a~I7}Po2?M//HVۉrוKDG,=Q3jSR~46n,.V?'/b5ula<|ν= 'vC/ h8;>|ŸNv$GK?,YF%!K d~Q8s(6y /e4|II Lڌya"wb7rW=G~Y9n͌M iL_um7it_H'[kbmZ3@ôdȿg|7A\쌩x!3u<+$L"ït =Gk"˷i} Së_szkiyPlf$[nfHZ}wvnfąL#SӅw1|JٚD/fw2j-t2ҁ)_MW1mfLQ{~ncZ6x'I}씖X 9_{2yyieLkBW yᛋOH1}NDS\=2^v3sjB}}^M̨Ɔdnd7My37/Jۇwl'AvS}KeMf,9eF|?bZd9 V-]|>إ̨;:.f:/c'gQJ(lv`0ci{[^] p+`7gov̡ƶ[&xE~[-UtERzLmVՍGOL*yw@+8l{60/tdV#Wo/VN@%#b]g3,C_Eo7[v|(GIm-,ma7Kpܾ6GBYphع !~5Oۀ`l5Q 6@ٖ9R+U,'Gy#28~9encg*S(Uo-NUFS*iQ|([j114Eoq;}IڟZ+\[Z5v!Ǹ,\7b=zvnD׸4/t<'| @~;@)S)mqavY@sʍ-oH=mQ.NP`GQ2zH?kK7Ƨ$;i {ٱ _4UJ}E~QS-"$w0]],*:Aa NO$ڌSpw'8\ ZB_8HX\֪uX3 ;D!ʝ &(bWu}݌o뤟NPζH9@K]'a~-=E:C"lSU.p1;??\g(P.Y>/3_X`ʓŶ@.I䧹 lj]WJK>ZGׅ3N~AC p\&`Kn :ǹ+؞~8xcyw7F13מ¹Xm/c!qfuQiLs7H>E9wβtKPN1\I= )%N WD,x}oER(5[g>E3MI9I3[2tygw+.C~{r鼛)ԵS{օ}a ot/(%Wvb%` oS^]2#";ّy. m GfY938~{ 2'(/gE6UuåH}Gv կޘZ#<1,H?}$ .1sƷg<)==)Ě{֦>഼#G̓SfSش6[n?9F&ou?]\4恮L~rkV7ȏu?J9Qy ~1;޹ ._xg[c?8ψ{1&]3>^??OW`B':`?b$44I7p|Ao&l?M"gqJio&c5i_%) -4ȑ5R h( +4 T(: :A 帷cs\ST@k@s0S9䊈HϏm?}󧏓V־"DY[J_)d܍CĿP:7QOzhh#ۺmc6MLED?Źu'2qm.wx/9T綈Q2lAjɉ8Iz_/OJ|K/d/8?_D=LKmx -ZeN9N,3 a ϒ%<]@+fTx;{h;trX/ êwjhl!2Lo~Pf__.>%Y6{fx ippos5>u}[&)>n_>}X^3rqK>޷Z$y/b!wӃVqr{k\b>pH=Z R\t{Oyd#]ۄG ˻Ed?N 0PJW:[wx9OHia Fqڛ'5yH ˫{X_3,+i%}t"TuS}H 5p>5._%oZ+X4wPY6pѭfLy[Oa,3l.ߙDiYsJጢ̾2jn{#"TfRYtd֎0Mzj ^19@s+jVĔ/5u3=wK܂?7/]yڛ\suKs̞+LaUo<[;fVS됛{aH _OyT69<%2Kb U|gEܭeRsjIYw9NLM*8(&ma(}?rGv0mϺ̪Of(l>6*:9N/w$,dLJW 'jw~fw7uKôT@3Yi';yq_0Qz+|* Q\nR_*/ET_0~H`g///RQ_*` P5[E@Ee|2>PF6>e2R FhF2QFߨh~oT4Q77o~(`0`7g/@>" bQ}FϞ>C///>k_(/ ٿQ_j/ Z_࣬/Xh}`k/ G7|o(7Qo8Z1~Cc/cQ8Z㣬q>GYh}L?>QpheG;(;8ߡmyӍ{MCK} \T] _" 4%V&ڷLwbwWܶeZLs EDKiF5Zb,9sY_3g9s̙sfCCvȷvo!ف?OCC?yȷ?yo''!ڟO\yN*pK'8LYhߏxyƌM>!׶O2 :V>9h aRp= "?Zwb~\_Ίvu q˚ u?tݗ$}bW~䢎h*Fĥ ~97.|!c?ңϫK+ML28x%*ȹ?;>%s&magf zP%R6:\){(v5oSmRNȁѝrA@t>EvklY:A:T]l2sW@tg_2S9f *N,P+3Vmi֣~L:ݸlIiZtƣ 8ӶF)%^p M -|.$q,gzpDnݺJE%~e(L2Scw>>]Z3yC.oDy|9t|5:~+Jqm*8D95.ڳԢyӎ=c,5˽6̿ 0wU q^EOvʖt3BfsV0re G\ Ji#Xs.p_2&L!K5PnR-\8#n4iC'X&v@ZNEGpDM6&KiDrZ6*-77͝qĿT[/"ppԊSQ۟̀qI6@4*Eiv;7@τ45P@ gybW鼙\+̓9f?`;xMkQ9M^[Fa.k-O pO+[Γ+0/?d= ~]ztn^񙋡{(RQ`כILdR&7+IO8Kll-`Α{)xSbb 1Вqq)T2FCA5TPc|1 LQb)U&*[_!=;ᕥpI% v9jvאTgۮB!E!ŒZ ƑN8x 980f`C1dYCB1~-W|@O +Ať O<1Kbo»}(z޽<ؕ[.ioP+gZ-j*Br<%@틯gm99Z"Kh qRTQ SI5mn-(u/us()EVE!\+AM_֪gŎTmj K^S2:E[Y f/AVrYGgXdx7ݧ7zRuleas:l ҈|51ԑ/A/8{ j&OTד 5`[ $R{3(,;3b0m7KE \[v? y]%ښׁx @^+E"k@3=F3]gMMRf%;'xJ&]b-iwB}F/"ΧW,.4KVHvlUJ1Gn$ v>0˘[v9G^1KLӓ_\`9|O)MMea6+iM5at+4|i߄K{'U'DGyX-?#XA n!)_\l0:)W&is녇c8[t{&OJ՘;i mdJFV'f3 aPӈXL%Ε).ccyMO6gq=m:\*t0.+6KP ڇA}m %  s̊vk7, ` C L`N4)&diŰΐf8=y 6>w4zDC2Dð8@-lRB(,P0sX;ELEW6e? SB~ZiJ>!jbݜB,J5cSk|>.T&j{aҚ+9Bf8ZP!q4 πXIgע!߃z!fY 5sPΩlz6tu$Oo@Y5vE\u74WnvΌNF_0:<ęׇ 3,eh!6=>PW Zw0ߚ_ y0D)+.~_΍k7 I_mkbIFy^<(}h4:=ÚOsJhD8њ&kBN> )ba* .'ςu 5u44Q;2i>jv9f|4`C\es0\|Z+ Ҋj.I V3e61xuu1:T=2 #7)E9h^ e@9.FKir"z2oo'⬨!IǬmHI'%:-7#jZ&2l&3)CkEf-pf탵]:CGuRe)<`tfp4hǢsk˽03O] o9Q}Y*k.yGՉ Qٞq,YzL)5\] %fQG34K6 2iNsF/ޝ4SOVc ;?xlNsҌ$y2w|iH_ S3xmVdłҒ.:FJIJjˮj I*NQc A-$o IGZXU8pc g(>#ac0*|Ui҃Aǩ%-xMbJN Gŀ=Q67&/de1)/&Q(j)/f͉͘uL%9^\~j=ܫv`:I:ZVtI3 %dCLke:9^1!qKr߷W7̄|iBT2!؁F?acxN> C;q+tnS$MGukvyewW&`JJu߁y39;y\/sړ>3j!S\AopK;vꂪpcX_A@YI{ah*XHFG=¿˻ $z5#2-%Xy }VxhL)Ot_sIax27"_XI_hPIl.FFHj 蝹ݎ}ԜW2Vy.m82F5 A{& t ?M1')xSڪ鲆v2 Pq4Lvh˥r7MfrTbb[Y.roM,7 r.i3!Mz2HK6=_@a*>EME"?gN:ғwe@r= 'qs7{O@#C*X.5uVZGg#700rW?Kj.ڀ5: -JsJ]10SWP+usV~Ieܛ? =WX" +Dk!.L8 Cxl|cly +McJ"t+!v咣PB " @'}@FQɤ-u`:.{f gHCmiޱ#XF-xfuw$I&G@gr=w@Bi5F׀#1xx~5]B4tkpOK--:hu#I XS%8l#oa{6nn[Yb!-6x_Hb C?y  ‰(2!UA,U  H\k?Q0r#0 ֟OتwᓜXW.]^<@'amŃ#xBLsĴq1m8s4]+?i Ը^^hdMZ-)fr̤<\c% ̒R <  ޱjĊk1H&bAj) d@ͬӬp+M]+mhL?n% o+J}';W+Ejq~r-djδP~]j?f5OX#Z)yꋒ-x/2XlK(J2y; x4g_=}9Nw?H"- #TYt$?;lא1@ u(3F`^:nkŠ< igZM)kЁ K'!uEc9s}pL|2PwSa]@d-vx.0-{?8Oj kC 3X%0ݜe)u*G'z}I8ƺ{k2]ml8Bol t;%-d먜pHW) 3x"G2)=C-ca12cj? 'zBhX@S`knJ:Ԑ5uiق#mfESo7kխ6p/rYjH7zX(0)ZMPe1ԌNy/7 pkMVVoh1^fe$u L2y>N~wJh)ƺgYdV3ǩ_*u%%'%=X$^dY4kUmS b3Y lW]a9zDHR*7MMKl3&i#f3 ͘Z4wxJ٫-RS"5\|-l-ױ| ~ ˸U|4лf; ^:>?l{",@2.=đm*< ycfrSh($xy{'lQkj@!^m^bxS8nCn.;ߓue\>? u3yd@'F45O <5-{^s>@{#Llr|=6nC;Q}GN k##=as\yG)^AHG}zmaڂBՠikrإ5!߹G̝hkZ@Ү!u)ȅP,🚼yfwXWMJE]9< 3ุm6=R P+ƝfDGH ڴ.//eD/6W?q:@PoEz} Dz*48nɢ<ɘBrd]j oњtFBöCJl/EKa,|g .?RI'_&|e8O6XUͳ]b8SOxs-2H,@=I5^?uWi8A \=#);XgQL},RH`ӽn?ݷSξ#yw@"Mrpɤ+³h֫jwW[`SV$Sfۘ:ST]uj ~0 :4nP\b /ډ8{$g v}j[^ImX,tEGS&A ;MrB.m4mqEԾW.X{QG+zQET:`@D+v!_4++B  9q]GS^dX=ʓ\dAY6D+y{9<=G3q@By{z{6(L[|H)"n;C2q;c[%T`1X`i#_ƛa/2}zJ_UkKBw pitue9֊n_PL{@A8cXL7BT݀ bl3D/1eg)m-lc#fW.]`@WfuٰpJZ t݁>P=̇, %;F`@ʱs3ƖM{T-eq Vӯֿ$ߺ(>=P8_Kq;+,ڃhI3Pyȟ5)_kr$For HD"ij4#0R_C*ǹ`o87z1-OPɽʛX+ǗDv~ãs:C&H'5uYƣo(W%Gz9ƚ1TUibAqZjR!?t 6:A?C~q(_~A jvʞ`tֈK)l.X5E>(hjN9= _)u M"~Qn@p~FX'y[t;,O{^Ah$͂$,X?F ۃO`7#O @w1 +bz'fKq42JYi<ЗБ۟FzfV\*N'd&5 ޭ:oC}v0PJ]QAxw3{Mb<4Ջٖ 1J!( >D}Wwؖ.1OOf+ߋ;_ØS*qum/kĥra{@&m<=}fOr@@E7 ~d2|N񄵯p-tυjXSmSFA>ƕŠ{OiWnKC10^X,èF 4RPy =X B.?a y>ux9Cu=s]맸׶-TT$rCvtᶔ(w1c ]=v!-TŅzIZy׸–G k٘[1̙-;Wd^˧n^z7@Vei,pWJxG.KŨG&HԐ2B|?GoPeTVY=( (5H |~, %Ax^p&*y|ચz%\QbD"PVbaCwܳ/@|?dyOo؃ӡq>wrL=Hwx!z%Y}C*_ }UA{[{_9̘1PJ󰦚_?$C {>;^!2KUtvI`1 Te,#C,_ fXoH`hy,%cDU#1}l};ʼn(±lA7XS|<>|!-TϗC' SsԴX{{C$gBʶp$a,C A|O0sRsh.kr! @qf]E|/+yIA ]/h3<%P\- Ћ r[7PȏvGJЂSz@9ӫjvpAe;Ǹu:h UʑΧۭ6w|SՐm׀-"qVjW>IGLWX]0}3u.OTȲ`{zA6 ^y|/bk+fhF0bl[?[ڳE^fs]}aT4WPHPMEJ.;!T*>`^PO)Y;tX?v0<:`>/TR*R%pA H(;J<*q~0{W$kvV;@/1e} cΡp=d M)WD b&ߢpq|Eo1IȔ;4ƿw-*<8ҷynQ9yȢ2;GbO{BeezH*MJO8K.$,xU. };O^Ve@b|OHOb}ou)O:eO2f3C0 h6@0>;ռ#]`5^@Kn Y$^iS4@؈.u\gi_&ޓQ^yu)y_HXڣu>ڣ<)Qϑu gU3enhK+k:_ZeH4*H<1Jk'BN,iXg~9>7sC=?oQt>L15(/) LwTS>&]$5RE/A^>ЦQ/HH!;s\Ba1LB͎WRv%k#Mat Q #ƈt QPE @~QƵZJ1%lӼK],@#?:p%]X~) נtC_K; J gE@Xǿ6b姾c@Ye_ab. Mr$[Z,v*E_@ѿT,ZO jO*|z6>Yt<;ljZIpTy'[h-f  $4 B* _DJ5oOhX4ݍ3 )+j֎_TN:`:ν&o:ǥtoAxi xY]8 b6Y?M-lg߀aw'*1R3u0.3YeHHgQeU.ӛote*S'hvfzYO399AN4ݤZowlJw 3.(LHgCe9]DY|ȏm{vf0~}Loح{~"QLrD1c\, b- ޲+vh2gP(ʯn5Z}@'z};nn \uloj.xfLSc9wn#7'"2;1]{3;ԹR2ޠCqkN̖l)95W~z.sC'dnhn؍s_Xv0UfG`HO i-"UԜƊ.h:oUt??> G.oek2ij_3h 0wY5U9G4Co U.fȪ h+b'|ͪbq Y7/ Xq㴕Gcr4&nė^0p)EKViDGVC>Elbů[]SJپ@$U!:eI !%b+{Έkpzz weSU7֙TITj< 㤕4ZYL`Œ4fb.^@X Ap(&{S "4LV^y4SvN:ʌF˭a9DedӖ@ VGD 7u~upy ~n'M5]s۷δ~t)l1KD_J+6H۠IQ}k-!Y=8bӗY/15Nj&ga@-RubywĞv8*߰9:ʠڧ~wX{$V /]pod9rɘ[oe5L_!;7m@?KXoT(Ǖ;1[hݓm;bcu)[tULGAǞg&B!B>,2N:McoYΗ^.Jf˵g=s''5,0 v dI7,OwߡNB`(=52G`\IYaa rknʊ 4FB[xc6"t >bgkw`QfPmZ<+ۀ,X7ڑsYOM!* X-Udy@dXX8?uәqy9:Mk}? |Zٱ:E%Ѯ*񋸊YcY yLxTiʼ#XɌ?Oxo&cʈPcħc 3Cg4tD_ePy0f͕& ԇ_Rqpy dM}Leh[Б;=8 [\m5g5INLZ8Kl<>_%7bg:1n,ͭq7iEY Y6LhUiME&E0N֢R1Ё#zV7NŎ$c+Bx8җLBwQ>B'14-Bott<uƓ%{x[=!otכT5+E%ZQ(mW(SU:AkڥoCdnIYo$[(s7.t83t$np2ُ(n5LT}fLC}Ȃ_yD3p{G,>9̻@9 H95P;†~8G٨Y?͈ Kȋ`6` 5t2 5)A'+9sOw.V# m`DHj,DqJD+|:[xp_ʦ* rlaqe6ږPeZ ζ/STDQq?U*nMnbMÕ[iV!v#I/zNĕsey>ŢE@(kb_kؗmb߁,ިv/}(#bߩxo%5b_E}a\;B{C_n|QźYm]'xӪRh W4Oh,+QgK/̓wNyh2ľ|!Iu6ط*Uo+ݡw4v [0tSVd`VV%-FHGU,lWo?Sx?z0jg!qJzuWgej}~2/'79WJB?MF {o%#e}S3DR`;*5^ё{zqcwc"%-ځT<" au_ԭMѾ71mقۘ%bZs hŴw(YwJLkƴo<}EL$+bZ3S%w^,& e)ǴbLjf_v/Z9eױP- ƴCҩZ~@sY:SƘ69Ӛ<\Auʁ WQ-DLw ;}! i$ըCWN$:v}(|SF!)nPR|ag%SЪU<3y2~ 4 m:t+p')V{} :6oiJ!{qP2U*VX0nwI9r+IV~~’;O]0 nd/e0AG1?v*yt3 fL'4}ygf+ T=3XsKDKzZҝă~:>C#+tۏ|prL: ] Ȧ_uv j&[rvm@+9;џy \"ˊV/z1 0lx[?0FB;^ 81XIJ3L|ic`ԙ>B52f;oS%%JL6ҙ_,af3lk[mq,| vNakȓ0vK';k0d?ij;_b .tXь0)Hh+2%H<2a7J4( M2Ai+ ԾDٳr{CV"10FwOgϧEA㼗t)J0( ^ KIp<'ץJNMml7~{PFwB`l(t1׍5= &HL^/vʇP$ǷL7sY4SusRO7˅zI>j*5 5)0sz)L#iQ9[Ӡ- dc=T5G+?мA6F.91kyuWZV2Ń$4x6ۮڄc&4Nq^ʎ/].1!&5Sjyh~k̒srNQ/^þ>}~Igo?xl!D+b|YDq:\uVz ҠNvlt[!1y"+ E~\ta,1sw*-;LvN*+`_|@kkбG× r$>X( Biъ=LhN8O:I0eATB\LCK}{\EUgMTTRgYh)xI!ܼj% nO[vϷ}-7Mh hxy Ks%KH9}}}9s̙3g*TUip,@WG$3n)kq )$4õ.o7$e4Z3|ijiw*2Tꕸ" }򮘫&i)h鞔INBآ#0 &Ŗ(վ1四CEQ`ҏO 7j/o/VLCa,E 3.0:~!0/.yX?ѷcj0+^5lf@ ̠WJDT;8MƲٗ^tEvf:%&$c*PB`HVyO}!M A¿Ɲ91({VĊ[eIc+8*QY >ҟZ-͖S&lŝipgbg8fr/;"AQүu_po=FO~8d?6z#U N31qLYH{LڨgQӡJ%zDbwvqb)@6gq^+T,VGlAg@(;ǖ?<pG=flt6Z+|)VEaVZ\{D՛2^ˢ2Hab?o9u95L8 :8bmDDiw}?/n3nJ(~LFyhe+E{nFJQ*#W)4I¥獼ߴInKcīQz2vs~4Źo"SyAtEe`Ǐ7HKh sM<(m*̅ %(MySoGVSxF8u1b.:&LB Cu9M Cm8;8$2a{'~&Jpg 04|-04$09O3r>On"qx{k= >*L7%D!LlQB{f@/,07| q ksU憩xmP# s0v70 Fi 8XȘљѺ1 o0,F l-hl{<)U4HcNuWt,}`@(kn2uk(6Yذ5†}!"hîC+٥q9hǶ {˸.l$đƖ<}R [԰_W/˷b?5k-0 v V`ߚl߶r' dfw f%MtK701oC2^y̰Iuq>30X97j,JhtL `vВZ*fʛI% Jc >zP_#u?L"(&+-lJ>ld-כ_9 璽DSda<4Sq='C<$ꃻ`&ơE ouASBv5/SƣGe 6p8VͦT^T,n`>륢_ӣSjcǽȀ:0i/8.&c1'Pn7㛶(ؠM:h@ JtZ =$,h w8hgO)J-JBIKrbJ 9eA kY2qM~7jb 2_ c'eߔ.J|Ija^^IX[I~fu)%} l}Od$KWA`',ȴL w`i)ɯ[:+Gf(cO)H6wi`KA_L`9}?{6杄N޾}Y'(G$K&ֱOeh`2nM Z"%E8]ۑżzPGN"3L:l $4wo"Axs+A%Ԉg]fn+ǃ4G%Y΢+h~$.-s?&k^D9b[ ~5#i'O[4i,3r3Ikͣg77&9B7{b151]P1cGdfJ+ B*c؞?Z"'?Ol YsbN!i+:'6J`/KOWUj耦KX*RPY켸ߟ\hWVv](خ Q>evhvϢ6:pQ]S0;M:eZ؜ ; 6k$RzĤs^q/)&9Pr&{^/ib_JZ&nfusL5ɢL6XP} ̎*Ȅ>w?DߝmS*x#mkԒJWVעW膮YĨ,zkڐ ?~U$,yn;Wprj e\ns:Ugc66xSn>Gh>I%²,xaFnW`ӁnAf`O*fJ|w$A=Fx5}D7%񈱔 xvN'mHMG :Y& ҘHvȡ!"Tmۓ(\EφJZɧ~ևf+b*w φP`\} @"@uˡ4G#k]I 8}`E4$ Q42;U9}:rq{1шdI .7a[F']}lgiṄj|Y=x 5.AJ6goJ#Իl2@O7x*3qJQOׂdO V.uƻYX"pܢehet9oauWoq}E). ƞ2ۑkBBD(BFJo uTm=(;S^AԱGTOwxnB!OBx3h !nqQr32m> g:N}s5CrqSWGh>o^ˮgmg|Nt17pˇ[Ƿaw #CiHKB3yjAu,؁/]ZQQF'ZbDžt%sJ)row2[ܑ0z~yF/ˏ9yre:VՍ0zEh;.6}6m"!ȃYE+̣['ka3v=,g;ȉʓMF\~C'ܵ~'8٤Cɡ|ꕴk| ŁǷk:G.x~tjТ5ǯA>#0 Z QѺ T3އȝri !j^W7xGjx_B=,tb|J'٬L1R&FaN7]K1a"ϐu !ĸ1:b[(zG\)7^?Pw Z?XXuĻv֓uluAO`d/J,=CN0ӈlWK:6]`S9bÜhc9׈? sg, s ]g9,TQ0>yӠl;kIs9 (!wWB9JIEg=s;cExKt^%n 03On˔Rcc:tt(8/P!!ڝlWo6nZTATޜ0 XѼ8vet-hpxI; KZ5/ϲYȭ@r"G^9Z|JDή% ̓,'jp% j/[L\"6vt85P<=AH+XO㖫/)ENiUptj/;$P$;IrW\ "DGhWP%XL;6vg8jǑȗB$ے$xUQ̑X q6˵,EIƢ@W܃̬k5qG yW88ZW8Xi*Dz \16oBs%cxGtw,Z0ocsDE-^b0Es|G^ ,%yK;s4ͪE+N(]b*H9 _X[/r8>; qր4~Ѻ| FZXZ~Dɽ5;1hsǝȢ$s~Ktd6! n̮>苉dcҰZnA#c3dBx݊eϴ6JI/c09Fٌ[ ht1 jC| [xVmcСX;c9zŸsH\V6? xxx+?oG; zmC5@V#e]v`;̨|P|R:Y=1ip @Det`[Fѓ?w88ݔ~?OZ7Mz$XF:cHTwRYC)R*v{Ȣ=,xbl쭳0y _`/0β{5$ѪEqma7{Pdu}K]gb\bQjK7d8{{vFɹ :9IFppO"Y@Z`Q EZYZ琣3n9 2 B oc$}w0$VUD ;Hfٞld~GmeFz=vjpԔ*Q_tcLc&7Bco0OUUr?c\Ab9MDCVwoGi-2crxXȗ?OQSC){)\ Č瘜kDّ`CM]CIhsjl*M9l,V;Jy]RIMvZj&e Ňn˃ SHC3%%WQz0[QeީΩ'})L<"u{jX2 8(Vt לf[A(TE(UXH%ʱ 2Cɵ:PhGRR9@!@YFi_RT5dc *U2iy6UldYP {8s31h72d\ܯ\urJyCsHs!Pހv-[5P|BP5Yh !Ʀ:ۂM ;u,/*ny(0y󏿥fˑv/LJRE;'Tn x@Uª Gչ] :h$thFWYP4dBF~CfW0(Vsk[j_XO!V\ /i46JtBSQóOPèdsq;AV*$_h&o2D׃l\'B6(g2J w`Ek Is#wщB*Rؖ!&qˡ+z(\ D:(A{b)5j[A 9 Kky)PzKUc/z$h$~CQT2*nKr9;y-D)!MYl@&Vf"cY5sJ&n(ثJ{\ae,z?HY@6EY,H5SLFudfȈ(d|;`pd8zw>ِ{!b9Ok%/'PyL"$ 'TKp7o@G4qt:@r`d8Fg;--eR6֬ ЌQ؁"JNXbEV+sv+dv5Ezu 3,U(4{0V) Lg8`$vHJf-Db7 XՊuF[[5<Hx0b*Lܗ`,Hw]EZlQ7TrJgk>Jn:e[#=] p4ν VhMx; Pa=AAVyu;7Xrơ>PP|=뙧bbz~KGQº ,:qY@%up *n~rTJg\$^_zer.Kɡ4GK͐< j+n$JjHGR|㗜n4Y}H<6|LmZE&8 gPvl8l,QX[,@#w2v<R Ғ'F"{fEl.%;h?Ց<3Kc+k &B9ض``|$ŧR|q0~4faQ,le]@s`S2k6bNnnP8lhf_&~XbV>)LŒpd\Qb={<%"(Xlmq+GO؍+:\㤧z\!ܓa#`@ѣzS?n\y"T(JMus5N^{1m]'WT11]KΧB9 AqT::|^|nw} ΨUD`R|f=JDH#aG4u$H4&HD~#Ԅ;UEy f>BZ6F[=:~}Ur̸_ 0vįp@ʼxtT<Cn1Idqxc~~7PxɍJnxB(yBfkY4LzTT˾{tJo>~"Pd/TԴBH֬j7f"O.15iD )yx,,dK`cH%s%!xvZ<i"Wz+ g`cHON^FB;sT H, f:BL D 7eM*'a1J E"\DIs5Б^ \%r<&MX;F;; g0 ̦7RȦS!*/S/* m%0쬴$Rp9T*#eboZq~p`ءi@% 5@j3bD%?cZ4}qv|]#t"rB#"VDjYa- $"=E$WY@%r[.喍K2M$OmY[^G BDZV]?g΅Q_Ao1=M,>?ؘ &r-M*^gI+Kho UnێY!';u8,Yb5΋0GT9}@@YKDa/|[]R"=qHD( JsF(pQyHqy΀D,De bЯKOXRx;i?&c3'"[zՄ&: ݅_vn.y~N*x- (pYegleG:];FwClABW?v%#fMEIN$ ې̽@"89!X|=P)+ *,6V|bÂg߇` \jP*"vGiRzbDMTV00drZ#~w-*Qx'P#t⣀׬HRt}OPDnM-B,, GuU:ɳRiT,+ދD!`c!`7Udkz!9C:[wEH>:TԜ5rn ]\]HwtPu$D-F -TU!%|c&z㝩9avKG/x3afkJ ڢ"`!{n.TbZ"ynq}7Ӏ}D=ZsE| uT僗0x~1C%ڔzm1}.qw+O85l8!6pD`Ųl"s`q,U/1cǂѼńw{ 'Ã'~D+;W]ZidAFz<؋ :0I ^[c^7aBpiz;] )Ar%KS%RTE'g-cS"{Z70a\tzR΅;HMIa҇i7IЎJfU0G7M|  <s6tGqtͼF/eu6݅)ǣkZ`cT֑'G:㵀ڡ*b|8땊畖ʑcވ+3+PtTjq'T8PWUjR7C;!3lsF¡}%i2-1-Ňpp/-Y\݀GisP$NA *,q40!=D'?4rbg@P|=Q;*9!@hA0T6~ V(6g[IƠ]4$4_Ѐ"7( A*': ALNPfPwu9ݔnlHtV-<N"~:G(vP0-9,{Ozuk+8`ocŭj9?G"Uӊ|'ܘ6b QziXw&Q,T] rĝSUF1q1}OK=a{ z;10׊ !'x\ޜxGoȿ^$ D=u; ˟+=[mu/&_sDm@2?͔ŃTL1V x' 0Lz66 9ADՃE ]ǴA({PKn +S$KWw!2%6 0MuWծ5>vx'C<$z)Mkk =9xTw $+Ժ)ZTETdpJͱ旞ۏWnMlRux!l8ґɘw!d1uLc}0ED.2-_wܭ&O;Xe3A kaB኉ qR7Kc]T#eCVŠ D' Ʈ7:|4f}8-.*!_um rBFKnE׃d/1/w\Q22D|TV30¸ r4I]㉸#J.87 ZdIt͐{R)/D9$iH.Eqp)P͇aKa޻4}銪fedL/,bJ ƬR[6&){IcJl^6j?~Go$RIP.6'ҨS@&q5^O*X9x֪ۨ &b,*4 bXŠ AIg6#&&<Zp3!2\ZVw&[lj,[݉Ug_t"{7S򫀕P.=nƒ~Bƨ/rkfQJ]= Nڵ2%,xr`EI:YvNOi޲i;$1,vov9TS7 I2tc{O_DEuv:2B {J_x.L!+ ʍ0P8v\ŃltK5;:TK <@l3ag8N_Hٺz3Fqj=b<15< ıSZ2SWf3:Dhr LwА6<PC-5ܘ:;*ӵPGI]Uy[׸ k- 3!BaXYWEh蜔lP:IZ'wAx**MI],.Gu~]g>HN)WLr-iB޿^ %4|wAPFbATr_AR=dlXX WI׭_UAdhT`8@Yc<W 癷54hmM77|!bvT(ϨAfnD}x^\a7xM6It{{u"@ծ'q"/HK*pux{{HH*y2l0"3_[ԞBluk@IqFXw `~&2)D7~p)>}k޽/~k|{Y\z=9M WwmǕIxZ(_~A+;zidaGcg; uW&ˢGc{#y #!z (D ާr0l,DPQ&w܏G7lZ+;a]n@ 1MMéVښD+ bIQ0uBHj2 W2ġfV*]|2_4UmT\M-;g'x[6mlCݐd\©0݌_!\'y3~Ds7.3sFN/]`3Ö|±cR q1d64s*Vޕրj5F C0wd _>?wB? ?.صExӺow~(sid=/./",;J0];s䌗e3LIgU^UM.bk36wt-x=cWh dn5J R&{Mt$\AQ휌g .>gؤsek+m<..`߸. n*!ѐh}HēƶXbobcXuDZRz.4jy]r*wHHS&uv65n2&`wBśka<}X!jz3'FyQ~MFDMm\|4-D:>>ؒDX7qZ#~bfh?\ ꐾ8vvaaml6mEM܀e,K85ش&hRPq w a2&?Lxd.p|ʄ}&ٴ/5zyWA[nV{A5\O|) 1\i+t.$t tr-DK jg,llI'r~VCbС7<Մ$zN^տԖv {K`';]`H X(G ܩu8#̾[,JMk\cqcC+m1}m|WPBDs͉l1H$TW'QŪYq*??SkG1 ی_pu!ОicG ` wl(jΏw=m9xqUgabܹ,ba[^+  th!0"!1ZPsrՁ'5 RZ`?̲' ~Uk^Vi{0+? @" _q[Uo*nsO$g+JI_(jpωGT`](0cw z'G]8010~ V擢*KiS_<٫Mou{Rn86䍴}{쨻tݭu7tɮѻ:jJDrM5Rt{ ғɭ5!Q)GMnp7uT] @@`GAGnbNU|iLANzm'(vR64\k'5[( MFq}_Fj2&* >6:[X xMD$V?{s=/%O`KuU&T&lWsO)(V++w`$Lj f\mɬ:ʙUR>!ó}tGB(/Z:*rnRX=Q{̈ekeQe aJZZekmk@` 1Dz 'rmb'xgg{]L9NRJPU7B̓gD5>3bJT٪Ozτs]U +>?F$ zS]GkS1GcՔ灝5FemZ:wEHf h վk`[95LR2Ob };zK̡ؒ"N;t,b[oV8έ~JɭɉRFt_'jxf040}+~d~霄#k͂\6;+%-AY)-NCDEm xB-J{(XH<lj%b)i'&p(#á4#9'57b(Wٞzgx"'Qɞ/z? @*t?ث>-:YϢ&Jq$I/%kBEӿ&?K$*|v#̂r\blPWR'tl|ɅJ!4mϽ/;}]I(iV{߯ qCqEIf+DZސw~r%ҫ%Ws%2GQc_Arޕz~ V Iৼ$-ܠuZzCXX܋᷃l۽4=bѢ.pv㵍#yPQT Ӱa:t#3?H>dX:ymmMVJ &YiĽHGxzuBZҘźCl,VbϣQuB]AGUj, TUΤ4 wx q[]Ɲ2Dg_JHe Ka0V#:@x[^Mn6'yu_G+ B;WT=Onex:@.)yf~ Kn@\bw4)דAp1I#zH&v:llY %"D^{\]*ͺS z>J-)io-Q%gxvYM!BkyԮsK<`%Jy~|<1/k{4D+ʹ vrڍ_x~"$3ZjDQx WuBtEPE+쬕3a+ ٷ =-0ߑa m~&V UA(B7U=/}|Jahu<8XRɃ^ Er}[ C! z=2>R| Gv];v좚]ν&g;OuUv6 ~{JV֣۷F^ 0_^ٟ2[qe}T%HU$m.i![!Xd!'$/ MR *'>=-VjiӦgLI)tLtȏACb Jyqr$xۂqA ܱoFptįS9r(!RIjdDˡ~w':p߇t/ aGf"čm&4ylmfI8۰]0-sFv3>L-0lƇ~Z|DKCt^' X/OqG:,Pp:~FBz /{`qPq;}HՍTNA 'V9^N'~{oM:l g?׏@sAPÃw62C, uHs&| 2<0Ƅs*D2;Kcub$ @_ |k X_G8 jĿ7,c8} dW$?.K^4]\J6 ,aPɢMӻZw\=ԯ 8 gB_Z0:o͂E˖B;!io_Dz5J{˻mH:[lUފVMt{tutwouutu"R݃Yv@x YAK!Of.ҏ ȣr( !b z4Xn :rn]X5ZKmAn Н{@m!^|ah>?,yBCK]yxŶo#\lgj& I a!IL'3lLd & р" ( -"ʖ@PMdyTLO2׻S:uΩsNUo2| zz:)`Mʉ5">F vݏ埿8Oo>Ė&P!?i;$#|q]@ JgtSɋȳavKcȁω2FX5ߊ 遷$ FX"ן=<+S^?{mn,|Pl.FOO8D$_hr`[Z#F+ Y5o>xudU5yzPˆղEGL[~|( {9$m 3d=03+EaHȇNF.1KpF-͈WM.Ņ$ѕDBlK#Q"I c#4Cθքuxt~:tFq]O r5gՓ@ =茏a<^k&s2Ùn{.(͚AEL'o-/ Q{3x/ hm}B49|{3YE(O3F`WfO;U?te}&^'Camd|A*i!k35\:-Jw p-JglNBas I|cI+j$Dc&5Srͼet5ïIϷfFaM|I6| gtb|B[eOQeȦ"eE Fc"w׽-xtPNަ!?Ǎ;8#hkV b"QUkg~-VK؎hZIc <4Ȫɫ]ȏK? t0 _@X / F0#5꒬6#4Iv+Y)Qt.Xbp:>x)!s`WROGc* ]FngPxǔ s|6\Ddu]KLп2|b;M!Yd)dH [`\"5꠆d1d_Ab|3azcKp*u`[?$;b'`kli*![ "|=(ց$L6l[d|l+N?2Y{3=HX^/=8CC#)6'ł e8߃E:NY}}(vztg.Օ>9+KK`|잘`$h `g YLK <ăA dJ חȂgıσٰ.αlllϙ˕ 6Al&a&&F 0` e4. >6,3Ȳv%\lb =e>vqrI44rɵ ?;O!hQLXN"ME&ghϪnH83Ȳ{Z-"l~i/}9BQ/i\.̎6(6Zh]lovx: 465֞%!b=@*0"y>SlQ,\+`î9&k.cV͆Kdq Wd3d8&\ꍙFrim\^~? 9-:RjM%$Uc ucqLF3!_Q8LQpuGer܄78dߔ$dY} ;{e]էNW ,_WI< Ã3 Gca]=(@ë(aDa:n&ocPpO }/ >=x ֌ԯI쓈b[p% /'az[^O200 ÉocVp yo3Kr+f2L| C0>0:d\}(&60K d\6?a-GDt{ksxʹާ{YbզQq*/˛MpP<䩼'?6dRi,EuNV#+fCN#}4zg6V3='J[AN\կ8}-k4Y^Oyg !Sj#s,ИgnTm]D3g7A?=k整>0[җsr29ώnm}<zkErn y6H3۬8oup{w¥ZRg|ܭ_@S5wI+G(cR؈e'M8jZ݂ < ѸtaSyt(l@t6h/*T1~ɡhFmnuo91@O6.7eUڅwyd4*dj&Txw(v¬e%;fhzڈv-VYٻ˽^l[ݟbÏ_ N~ڣHї1>މL=K:r}5{h߉'ElyZmX1{#Ŗ ڕ>5ǣqߢ滿s7ʉGL>o[Љw{l;eb;ai #lkwHnrntfyE*nCk/m)bB󓥯2i+%N2;@ݵ㹗.,zn/-qe}MpkJo]MRtqDz&FGgwFxwu{o!UyzjݒEDENN i yתn^@K˓֢Nr4{JGҖvܷ;^(s捰Qak:^gœ;-S_ Ηn^SU%݃g{)P={+rjV}F]uMkqrEbɧ&`}ը`M?sE;SѦ3#+;9fXؙSʺdY@+9FvYzjZZ/EyEۺ܊n--vߚx_48II@wnVG+~[}p&{~E/NȳM[s]Bw/#ťŽݹ~sϸ%rzű TzيP]+7ZN_cڿC1ߍV5qK[AI-g⡒oL@#?7m4SMiMU',R͉ mms|=fdjB8**V̞"'RUP˯U^şC5_BAW *]Ҏ"BG6[T\j|$UUDr'X_ΩN}c+~C5rizq[ajBQps'ѯSE>RһWlQwgzK]ZYɚ>Q}iũoۣy-ɑcWWݜ"&!23Yg?3Ƿ]\fӰKa#Y F.$y:0 >/װ׭_Ο2Ũe2ɬ8it$!(YtV\7˰cFc㗫Z:Pq.^뛪M 6ߨZ֭-TBt]McW=XQPyGNCMvW'@_>_y˦fmwe+PEӠ(h[mW겨KQJ/oV:Ėg #{az2A"/EN[*.nмW^_2[轰EKgN|Z=ӹ M>3J ߾ޭ?dI-ѳz/W/Dwis>g{S[H=.-d%$a:V[]t]!DaQt]ȑs 9.9-Qn !,%vffgNôy^̼5z9gQx4.ᯑgSu.w#~GʋWVi٦{ƱCJLS52oX'Y+hpa͜5McwpBc9O-aȘ(m2eىbCն.]im ACx>Gi(x\fb7q=x /euks 'X1icV\ev鸝jK5 ?o0h![wlV,wd?cfr-mSg+-'eo/pc{n [ϜZS@ә~QoYsū@5՗i6NIfv/'KV8:BurwNӸR^KޑrձC9}g=|㡙ϊ͢{!mˡl3Qū3͖ԇ_ӯ侵Y׉|QQpOу}ϧ[?:gN돡N)_(`q38on+Oq4mxwԥO[ vg?[kƹپ~ڳ?~{љi'X ~9Nϲ`_<ZEwPSV6vMhonƩZ_]חT7;ɖXθ\7bm_'8Ac!|abNgun䙅}i̷Y¼Er~L`|{VOg4%[ ne'D?RT8jW-ݷ8̎ghq{+,Xk&Z2p;O)G2zU;ٛԘ1j9SV[(W:+vz!3*&pʗ&C^sU7 8k}1m8Y J_y;oѹ'lUstr2ogUɫ圛W6}yۻ_k7L/s6:yĺv^pNf^ibl2M/]U>ǛSn2 yN=$Av̤vGߵSױlj>KB. }W'M+7gNp>b:{8=Zv ;j4)𗨞]3Dz 4v^9m쏛3E~:wN+`>~3a?1V } O[\Vso\yVgk\_, 9czD動U&to> 29hРmOEs,ŸdXubˍw+9@9ӌAri(qkMkd&H\K!ߠ+;do}ndѡrZZUoҤˤZ8sq'k>'~ s$/8a`]A+hLlZs$Fn=gN+wZ T[9Q1U̞DkԹ癟ouB݌.`:+貽ъ{E?rKޑ=v\u}1YWmsPig͵H^V i6oX/gXowq6+fSsL_ey iIQUJ~b}b$ddxxxxxxx,EY6˶/[hu 7 sbOY>-޾VؓbPtCpm04xlm9h <:q ?{ 3k֬r#|y/–e},X˽jԧM }0k/>9ܢ3۽^`YNb`8vnr#j~miIAx 1+MզNybINKo[(-%jE7߻lI/9v%k`bYxsr ` htMbT4+v*y:FK3ߓ"<ۅ:3 5+i?C._Gt|9w)b7]lXvr%SCG.y$v)%ۃ>yUiwZſ]>38Y:CqOGqW05?pKsw/yԗ䂽%3lV' qvSyAfEK(+T߭Cx_{|:U.CHPM<*ЈOm\R\_xizP?D8{!Yc;~Q>>lBxɅU 4n:?>/? xCzaP+:OI_O"Km]Z 2jl_aǿ}/y_8G$VAO{^f#7p_maE Ch| ;y5 sAV3 .Q7`ծˆ3{ق3 w&#bp!e՝?fL O bfzK' >7>?L3"w~z\>J2Y?o{%vRm7?zƄ Aߐ.S؃ Vt=HD͎ΜN1?|2ʂM9Z$k'ReQ'Y)~}KC (ƃ5@nҲ+OpgNj\.*]_V#j0!%cܶpayNGn㺑v;q2&Ꮟ75;!22c1Ne6FYŹ- 'S'^{Hb1^1ұ\4U1;|y#Hh6i`D_p]F0=Q&]O}O#2^N o<r*OǸX -m&Y7EJblws;&Chw(WfNPc]Sq9 8Sø81ĸ k!y7%`G"_bocsu:=g:%@3/O=xS]|s~ㅃˠ^$8m0s6=I5_O)pqTQ a  0}#曜b\ADg̦w^Qۛ?Iq#q JݦM'F5u[NXH)«y0W#_7դsuq7CjJ~~c1=H i~~ߖܗc<]2D $\;a\'=iBxh)c%;?EKpqR ;1nz{X|dcX ~{()&Rpk*SI۰+g%t ),䤦!v.xԹRp;Nm9Rp }dW~"\7+LΑ cx]o?][q"w)p4rBY$*$Z:3H 5)~RPk&o1n|>H 87m$qa_* Uq&+L ".o!q`U-da`Xl6X~]'{n x:i) `.i0[5ƃHbƍ;5 ~nga*8^ :DF>^lea눽a) [l!vqvRծT2/D?wV Z0Z;Uc\||+ q<7/k%rXvı79H EE4d/x*)qʹ q )8R8/)rTq;uHXkFE V z_q{F'W׼Z < ""gKyH R3aeLOq?ϋ&)=/ȾG1$NY?0Rc[[w I{RO[ea[4.ة SWmHw۪LQR>!=+ tz¬R"/m34Fk0`i0 rݕfj0 "9Ҍ5w!zçh1Y ʊߦ<ywGaB99J;MRBj(C O`o.Az[&h0`q0uwb c3wXn!ۣhĮ=uCjQ!ty-rhay0|/KYn& $|L{bY7=zȚ {Ȫjt)ճ&t~oOr(CL[7Cx%vף'K1a&=ºkLHKs17­CcaJGzl˩1].7s[A>c*wy}(mP|ub۽ c=o{ӝ]?s"Kcflw=`>}HSGgl.nP:ౄصm y}n";k[zQl[۫uo{ykn#A{P%42;C!=K(M=@ޣOU[у7Ƥ)]/X mHI7t۸rPlܛ/w+T—ܣ RND=ys%u=x_KYܿ}"sg8;Cɜ(%6Y]tI"c!#Gηt= +{9M%m@2]9wrAJGxORLI{y=|Irb%z{0%2i=:d))gޣGCIS~K:?3 qT_-23> pa¤QQx f]ˢ򱓺n7NdD߳{zcπUS6&%~׫|W)]Ԁȴ=1nPXON&i“z*ztKȦ 듑>XnSz}Hot  t 0eD!zԃ/L_QcBe8lT*ѣ.ZL( i.רlw(-qqug~g\3}tZ\!ӿ).CBCh RAϠ :dTQ)>T RSѻ7ChaD(+AVT1ǵB \4LSH/ y^ fЊ9}Pbhӂ|P=('H2 -mY?˨YqEWrtʁNdɦl9_׽ |7 A=1[2V^7>_rfP6bj{DHeZxOl[V/x@5*dE 繉Ƌx.(#ֹA1*paZ\Zu-)o ({J0({oLf7y"7H Ns<20MGyP~yY)W?SM8"P۱Ũ4{W#*B;U"2mm}8 r4'oeR6)/dQ@I&Mnh`Mi>1}J1&e35 P~yCT;IB)c SsGATeGo}o,%t@5ΊƧ j@;4a7b.X&tn;B:`Nm) EďTeWg= ^/~1A5pLB0&ײX,U ; X D Z.N8IL@ X^3^s$ }k/6IDo'S / l:Gm5))3sؙ EP";w,A8:Ģ2ԅX\|1!RGk H>4vHQ"+6RW- U1 V }M T_K`.7R\&vyܱeܲxܱe_d2O!Eh[⢢h)4ZV  g9E<UUh;r  jh1ħQ:׈?Hebp4NbHtQl^ZB+C'4ef0B1Yʋ) @w 4l^pJ& |`d)4n;ٻ܄BG 1:x؆'~z;XoBvXVEh )&.8bDJY;ap *)>w]ڄBBWT dF8yŽ E"9npP 0'8BcKn, K$ ./6@rEUA":0C-3(,d[x3,yq1*< W X%-( sPN$B̓>; F[Bpq{;_➀q$|,Bqa su'bv6/O}D !J F5_Ca(%MCVw+F')3DW4M0V P*0aT@v( jHT!^3% Eu֔'(LAs| 4 ѠjPecabw9CK c`l*K(l8۵xkX]^n5 ,g Ly;:'o`/}za#f /b,-R*s PCK}|յnv ,Y5T#5qk7!Ɇ A"`-&3 HC uWҾVW[n"C4*7.Bsg6٠}~U2{8s=s< C_]̕ ټJ*8KHttP(HZsɲ-˜-Z@ZBYS]!&@rʁ+\Cf8$wU J"44y @G=9~9?Ŷf4"MH]2ڕ{S7RYif34Ct{HG+߀rrZIPRl3SÜ<5nwx *H n r(%Xj05܏jKʆ\u5a\ EVǤQIC<ƺ*";$Qtʺ2M-L\qVqKK`EUR15 { Jm8 p\l:$kk ޵6'H$R9Ӑ8T FR _&NOKa{拖(<$CzP)|ps8+jepy 5%.si+.;6k #4.MX/U%3MG^4.Uv-NJ1_4J\Qb,}y#<48 8{{s4 Um7*NJnhf&,hܑ -<|Rh\b x5̵ -ބ[C<`CfrO뻯0\& 3]W5:Zp`5Hy7u HytNpostdA~= خ(<f(\c%k ^2^ džY^k.Y_^5a_8.)eQXW3MlȀu1w ? iUH2\yIZmMoJt%<,X+kW6ppG7+k[ٟ]㟭F}ma>KȓIژ>dtd"GţK[QپT, U  U ײ#%Hlی˟]w䈹bFQ#ŏH&7I?_,VTu j]BT\ {P8ya$}"tb`&^F);:Abt~uzJ+ܕT)t6wI*v/]E *zxd0{]hWkrrz)@:53HsL,mc.UdJ)=k_j Iڮ-`-PWUjIeAzةʵd<0&r@p:( JiF),폑zzdJ04+ 6>#DRvO7+I(LMtv1nnꧼlr^O@W .R̵~ʁjزUr,B;Ԏ (:/ˇUr!Xj̧E$_YuCO%ȍ.fayÓ`okʅM0VEqIa E;'`;ю"e4E޼V-$omNn ֨T@bPf݃xG(zddqɛ`,«5.տ?/e@_Kn7H^cx.>0KRE)L/lj!xw }\qC1L؋@j'S3*74Z`y01)Ep-W<8)9heׯЊڼ@lkgZ!o%{No.oj)HO\(\djԁ-To j93XeQ +݇u*-*㉗*a7Zy/`_`+kkCTf +`&15CڂkԆ)TVZ5OumM*r(v΅x̤?x"^Ķ4s Z)#o$u' ',/׌;[5|&E v7qJZą#cl~t{itHO= ,$OhaZIG9Ck_ʠt;AXePehV>qa{kl>nu9 7ՖeܽJV.f0w0e۳nny[$՟ Nz܋oƤ :4)ºܡ,槑I*nťO-[/YL83I Q5<̱L?F\tm 2P "^Ud0N(U?ffᓻTM+X &obޭz옄S4G^J2tR 4;=zVUx~td)W- U`'ƶzvkv'l9ۭ.$@FAIRAcP<;`>cyGaU  Pi>a2K)LG 6$A yVRgSIlA)-tRƑ"sV#CCVt^ f[ ;I[l?ģ @,#qB;ya N nG =R304&}0\4,'C/m4Dx~jdes6y+CıtA~@!Hȩ@%uc4d<_/27XoncNCv:=ޕ+"^]FRg{Ya~6G6 RZ 5/S,^z4Ba%.n 8[{y#c$b)ByQ[.B4 U|Jqfkyr!@ =af:AElR)E"2⠏gOdZ_@ImA˜2h O Qr?@*h z];UѰȷ~P1nmPff|0o4 ܪ֮bU+_3]Zik˚*Mߦr+ۿ//xV{4wumw"qO[)MYHxLJ*Aöܡtf0VvlPanP8U`*]=>ynUwQVa?!y'~5XgCC‹׍j fc&EJOh$w}/qh(纜ʩ z٩%XȐG$ѷ6mvgԥ?O<,)c)~}x6-5y,~~4Ac͹hBn 7pWq LǏNPʧ`pVr'ٲ0*ݨdD8ɰIg]؂]]*> )=wi ߑ^m >nE2yS\݌7P+=Jg(^O1(qoȔ׍IN} 0N-׻\FqfU\yp˥Dbr#,id1,&&PKtM|$SLJ9u͈#<z9@?PDEZqMO\ >Omki.ݻ|Ԑϻ/__}FӴP4ia7 %ssZ,&RFfy"SD&yKuKeu %NpllClZ}LkNvaP,o**ZKR1B `d̖7Y7XAq{!<1*(=bytTzTکzz I<`5nilۂj0O|$vPZ:sr5 =gog>8駴I?&ݿ6`c;[`ZRw:dd>*V6g*lњaK‰|8:ju) Bx< 0˸ŕre_4k: maر4bq[WU˶!fi J?lt>P)wDU~1j~5nYAnD uxBE3̒f|D '6O2F.bUnwx<Cg='7tآN/V7${NO${:/IGHw Ћ⹽WUzS v>Xcޘ.vԚ֖zqo`W8 }Tq/"'+ PrGmDёǡ rgco^>653+Źz8d#GJm ?!<$tXUN=Lﱘ@#<ř) 7ԦI=sX=9:pz&VAUoHVt[鏐ݽ6kWUEOj^ScTr c!ąr#0Ǭx|:yFA~^WOΡڏќ}-`r>N\ʣ/^'!ΔЍ)p"1 S B ,n05f0><0jy2`q֡qF*C1^F9# XBuIz/ EO l棊 8W/ Bu 7h f J8CIŇF&F&rB4 mK-WYc$)d9j&6mU;B\eOE/7_څ#I It9.Kby!ixL%::vӨS6H@pPؿXenŃ!7l&oO;=*c{s(ewx Q:|A8bZ8Ll.oHFO43oX)LRUm( ÈMe++f1^[_}Ooޤ3)u  ,Sg7x`6•ׯ5n;w›upwb bj׳1~4TlalB"v\NxHRc ck f>0g/q[[{-{!{Clal{ً,-m?KGlalfek[[{/{qr,C[[{{aձof/ݱfgg>j_O=Wb ck?^93ًei[[: [[tڃb/B="rwai*&׿;FQY s(䨒cSj$A*9.rxS JNUJN iU Xih`RSfQY]^)b&)t = @gx- tRhKEMnߐ4찱2$w@ǣjCT_G7w>ڟX姕$5mTrROXP(qŨ x>([{Yfة5Ij~h4 Rz/H >ׯhTPreMOqA,@9BT-L4* #\[Ѧ]xoˉq`U/ei$EM,iv<)K0~H@*koИhW1V6~*Jd5) 4ū;n]m]H:PleLiHX:hH8d,J}LgCLq{ #:. q8uPzQR>: zDJ o߽C”QZeRշ^fB?[0P_ 4(zS.ISdb,'Oe<ڕ6,Jq]Ωm8xԘ9?Z>Hr,f{zm)vO&OK7=ѐ%Y$ ЖdtS k]Ǣ(a㸩c0JiHJ~Mɯ_4O*+//se ɪ x7< %!LN5MRx9Y ފ5Z1Vh>qrKv9ٯN-lY+NԋGgay*J4ˬyp)+i7f"MOp7WA܆d+0B>Q}EE6~K`xӕJ>6E_JK @NSpOOT cHVVIdx a(wSՌFNe#7j^J{$Pv!(m5Seg8IA!|edϿGH0HVGAx4%ś6$gzro$1HK4i#P8 &9PraXX+9_n0&Pe(pM%Qo]r;jW7#*,ˌ†PMXGi\F``k̚( tyTםh./klۊFAr E_kh1C2@KoazzQ Rkl]~.X4__瓾EQ4%72YY zwAM`U*Zr xL@@@2ד&#(Y⪸*#ȃp#*zn"v ?/5Ni"āp $Q/(䘲 /j9T+ 6 C@"^k5dL8-$MrRkx\ǻo6*ЌӈV.s;`74'&LAKqYGo^1bZ`3{2o :KCיZJ?Z;VC -ѸĞ> k(Ё};)6&:pc q&f䇬?9D`'fF:.hcD>(1|]Sm%C#ݻ\g(m.af%G.cTWВaXP3۰0jCFR $2+p Ew#@(y kZuBi1dkm}q'sL݊~915K7{`H^P0 %x-'Ct#s *P,\ @QFtZYU}t a]=>Ok=Y);mT`^ڌU a.>6ܡʶ%0`HJo_Q E::dvqOu)/ş_bEŽYYw}M޳ut)c/f\ 2\ZOR`}m{XNFŠe[+9Kh2fM1SnR˳_E9 P>ڻ8:MY1/N==ڦ&`Nj0-H#мH_YE~hy_SA0ibH1eՇtd\EΦ0$vWܛ) .M0Apq vKjGEvU  c#CX_Φ NܶzhAxE acet"`=|_SU8BZP-,0p<.p]Uc%S l(\膋.,-}A1Z6CQZu rb.XFxA/3en ǶA4-pdLܡD"2Ph?ގPfO(!k`tD ,P 8fkw&,EzRJI)# F\,1Jo$ nSIa>jVbiz!Yna-F쪸 .a$'\ۗG,;d]1W>jt%_S1! )8}*T| 4->Ì,c ̺`mF)(?+9÷hvhI&eV0Эuť6`M؀Ͷ\/ R)MqwCAechj Ayn}@J@QO %kAwH3`JHW2b&:n V}+9 3Mxg,'% oN0f^@Z R S4 ;rK:K*[:0&RG] M0q'!E%Ʊ~ NU"jLD*qbbɜ}0@NPR!eA۹A۹CHQ:a;Pt5C/T Ζr- )f)KBB΁*l!/= k Vr"I]J\Ō_PO{Q?—o# 5 t.&kTRgHrf^7\܎R(Ni֥GW?e;Ƿ69Tմ4kg,.Ё~fzFͦ^gޑVio\ϓ:_ǃЇW4@9vDҌGK1mCdrY^PTKӅ-LqU4 (M;|qJ~t3~/|?fG?~@ ~uU4od+,9'HU-g5r5$N'X:,9tVM :^)4w%$θ=xZJtD S}Fw|)V`:^ָ='S2˗YLgx&`tm23+䨲b&wgw?r5iKmj6T}Q%lE  _/uQ⡪D5zuW7QXlz׈F:I>C4rCQ zz# 1qRLi齽:D~ on,SYAU:Kyکni8v1†Laix0ࣗ k z A<{S[ЅXiyei?oWqgLQ7b8!|?gvbC4W>P;ltq1)/fNDwq%벶@LɮX3ek.-* Eu;]h=R9Ƈ)ˑiZV v]ŒM<߂E|v }h(G7NZ8"c'\M_@o}=ב*1,rLӴжXY4Gs)/^Aw7ݰV`8y0 #*]i&McH+g}y+,<˦oK;whww؍DW%o$R]յ^Kr?_Ҁe_D+nRf`v@e]?Q;Y&;^Q;i9AMom"7?dټvp8k;HqI^1Ӓ,٪дaA hf?F&+OSmJEp%+-bk-yv?X̺Og'My gO,.kSm.7}`{ Xd6+D[;<*q/X,Ve OzPx13Y{Dmڕݜ,jx 䔩sB|X푇5ec 7cx͚5Uv` @2L@_.GnTJ=+h̻ ZJhc?Sٿc } Vc=S1t3;ym87E4huxkUaǙB^.~fvog?S@t~.@c%SPkY_QI.؋6100gJ[ԫA(.Ư d r÷'Y;pM`ZY4I +jjÔ𛆤pejF?%QgX"tӨl: =+bkHD\;t$ jMaWJ.yđ%C\:o}q`I doQ0 25Fs[:)`AN8Y(CCHP f)|U;s:w{Gӻ} }Ti$f_œ3l[Q1N7Qm-B &v6mB?([ucxXy6WOCOz9yEA.BzY%C`bѮoDpL071lF:@8@0 ဟ>s=֤'Óig/Lߦ 4Mhi3Jxd=ԁa*~)ڊ~ow7=R7p6yvdqâ5%"˗QP4-<]!6F% FC֦&RLJgc0\x",ĩ{4j{|%0 YZ{Тl W迍3($;.od4x `]? mFWiԯpuS2wd.֤MKf`٪У'҈?X`|zavl6[.[ցU> 3 rK+J}`E`b݅6Ľƶ6V52$λ;SG|1N RgF]n'Cx[=|_MԔ|.qm.tVC 9p5.l:.U,C31e-nhsJ7FT|YKԣ}e KMјMXIю&ۧ"쟃lҨARMqA;VD"b&Sf>o*r6\rM4ty 3H'~7ñ`0 3(^3ȁJitfҁvxL:Ǟq!C14[{|g8I븺b8T`n44b3x7u_k3tH~tNP|in{ց}C$]ih'Pȓ̝y!Sk܀% ̴e=4>%W 2`&ga2v}vjqZ>d>ithtxLE澽vZs2:-/ ]z.kY B䮃EhWQo׆xDm꺬5kōj֢yzDva!^TҐ?K<V8npK,3~6ڣ5ڣŧvMRKh1v MX.ٓECgXzU?bwUe^A;,͂v+=`TrĆ92[mwhqz`c4D/4HH3@:Hŀ3ۃ { wH`(fRRo{S)+}H*z>|ѲKҪTD+xzU<'vsU#ߑ`g_eѲS'#}vni>9/x6c9I|5SHYeRi8ɄiЛ^[N8.N.4^;/7KI\CRO冈A|&Xl`t} u5J}$ql [f mZz6mHtDQĬE6z}ѠeKF믅wϫ> ,E`[_\Aw kkf=<jy1 6e΁XͦQ!q,+{ @2IQ$w^:}C/CyAL Ra8v uίE_TuKSͺWwXQA|LDI (Ҁ~+F_d=lf7J Z*Y1w͚&5:,Q%Tw{&@JyAR`'%A $ۮdIjd2G&PV6R`UZekj]-N0͝oSɔ`;՟6w<{Ah] ٺ C߶b"ɤY"^ WV%ҶPIX T0M mۍ譩Y}meϓx* UOY8=y($Cr 20g9qMvs0(ś*aAЍ[JUq5L5Xlq-{](̈́RW&NuB@娍H-|X}p*"OL=ܹnt+tH~۰n4S-!U 60vL5Мo0tP:‘]~MuNwi:,`y7ƪ<9}g< 'bP,NY0X/_-j3}Fញ4Bâ.vބݻ_}?|raSn %C:ʄÖ'p2`/[nZ,q9H"ĴlN҂D,qa,h.[,q9,<}:M+]6ŇYazċ!Et9 h ГeG Nl S$${dS,14Ukt+L78,sgk+05ߟH+,;M0 3I5~BId'NY;=$vJǮx6.9-d+fB̏ιo>ەuwY G#9v} sep. tG`3#t+_l1IRCRIm PR@A3۸7^ѕzvқ}L*xr6,ewpRm',7ж;Y]9@w $ߊVZJ9п>Q-~"08ƽIe&I5^?:t aP'<»a~ѫ_] a8l6vJh!G0hYzX: 4חDb>sF>WDPM½HV49:)ŀBR<.Ub#rɭ>.f~ 슍tf9hk3w˒ bkѸ7yB#_Q9YKX!#ᅴ<lv,_&t*M h4sC-tyg'62Y6՛355ˮzS@֫ʊ6=&;,_(@KWѬM\(Ju#I/'EYWF(2HFHQ* R$@UU%%0սv`_&b7EbM&ALx[r),q0nU1A\nGD,‚ @R ֌l AFmr{J 0aڬ6'۲8b&B9Ӑ|?gi̻c`P%$ ̌Nq!茘ir~K{O[l04mN5H߈XEwgv"yCɉmo=55}#H"b̦Cr'UA2ޙhZ @qjAU2. N ց a,qfX|(gQ@L Bfgߠ| - C.7.Z=IrG6E_s%TCHF9oai@g-# `֭IJ]6C]Z.<[F ɣt=!r(&2 Eæ2Rm-jfo(i]E꺊,X51LJ *֕8&ZD!JQLrVS0>^ix[i$d cB<*ya8PL}wU<|bd@ ~J'H?dh􎱾DO`pIVN4p+NRqE3DJ_ ѧ)=iZ߷rֆ$Tߊ|ALUȦ5jjfR^Yh8Z@egdM# T*13aM!)ZIF@޴~&ҿ$$d%$?>-*1!"ڱۢp?@|#{0(RI_(I%+v($Ϯx02j yHY0wKGqOLPPŹ@۠# 9sgdb\Y d,MA2qO+WfODXdٺFe1%|dDzNJ1 luܪ|NP.@|Iz[i><ܮ\q 'ƫI-: Vьaf\_K._:5 gS'R" nx0KI\I>|U^D.$_J>, \Me{zd/'d&ġ'V*L19ILgr1A0.q1Pkg#aqfeU? 489 r-dO-w~0ˁI,+StVަTPw`3)R|Kp,gg&Jd]84W*`# 74涓80:HÀ9Rz^zDUyTjLn#[2j+R <2#/DϼvRqֲ]! CBE!&,Iۋ9|jpoXft$/3w2 ~(GjL>jjgTC7D3/xS7HqSq6BdHn3u1E>pxf ;AٲPl8>S{SLX/xziBiwppLMi73Nf9M:.[~ kێ)KmBG OP ~U\\w(i 9*DNXfH::ꚅ:SIlaF&_EQg^|Z~<&rI' )mB6b?$C1)$]kfP%XKn63E5NCK}{`TյL$9IfD 2DL2I&&PH5 ޖ9!$!ժV^zbo+$XEc-V[7jP IoL?3g~Zk[܍cpÄe0i/;Om[LnbKN)U+= x'b? dkhd:˃6v&΂Ҁ^@ҫ1p 0@|ڃ &j(/cyEH<zUkpB~tbxp٧\ Zh.xCt>k8\$,vWË_BV)y߅7߅cZfd!ЍGY0J`'%=xn(:bgvb'V^i';ғ,p ݇{j =?.3*YIFNIZmV0 ePs*?KkuJ~>_D  DB8e˦Gh6lWQLI24eډ2(c |WנI;@Gbי`|Fw>ڃY%J@k{NE܆sp@1_d/~ ϙ RdֺiwPsΧskGA{F(-}^r_ҏB[ڼ TΊΦwj3UĭSKR)T7$۞ h['͉f8v SmGgul\&.e0ß ?uig:Ӡ[ЃnP91SKB?ձelt8Bɪ z&]jU]lO /dykYG4yځ\by~<j(w`f{G"r s޳c#ao :;~[gMQE}z6PZ/joߣ܂jݥerޡXd YjrD\OSy\Ɏ,A^P[@ A։wKڍV,;–e.dVTX` x;p@8l d-/Śz &PWy Sez ?uhh<PRGxK_-OAzN:i$^<]9/a54[ *üɔu@B\= ·ܖoxUYMA`IJkx*hT5 $Xh:am"^;9PHQX١YP٠x =hG uå>hb=C%LKffY\qɈe=Fژ-r:6ϠP2G ^ /;;BG3޼4ջSbLEdBb 4rye팦˸5j%mxɁ;Y+#~ @9 ʹܝ~ b'e]?c={B8Ա2im᥀#R|?&`D2ӷÄ?~yL,$F6l^,Ss;jnc Ɔn?y>:/zZ_׍sx> fE B cSf*d_ow f)%|<3/磱¥zI5&in@Dk"V=kr驃Q0;-6˶U >ԁN _ifF{~DP='[e"gBJx}s +6`Fudj>5J # ! _liٿ{Vw6# P^3d?JUc No9{"ȱ2MzaMA; 6RzwwRU2hjrK 6S77׳y7qc&^1-=h@^q:Kꏰ`.^E0JY02:-q4L8BkZRpꄗ|4 WߊbHZ:k5A86A${ B7s"N1scK>?;ᝏϳch~gtgC?/'19u)DM\Q>\aV6AjRvD'z4@| QP:yRQ3@s(/7\I pl>8||y+Px]"io AX|"eot!A;fojc%̟ey#Ҽiޥ$YN;J}x ]c@y{_Er}V֋[ƈ!}?BXT ( X=`٥c`S-۵x;Q25OPeJtYq)i)E0:fhY5ٝ[DV,db\$h/jjQT 1" .>6yx[bs |`NtA%|UdyH֦m +p# ݎ[7jbcX.5vj_ڝuR:9uG]]U&{;Qpuj;S҃Nv%ai:X]8'/Z0fqY0z0ݩջ)͝(X)+ۥȬ_j,2ڸH ++eɠ|v,-C7(zq} r$ 'Ŝ?D_~90!9[<yT ?F'KboܧN^7/{)p!>5t"g+΀U+| +fiCakɮ;Jy|r:< CYf3vGRbh4놆֍CK14;k/g.@ɴ7#.a,7+hQC5FWYq_͇ DT]sY/`*B3 yZ#t |RR|2h-PS7OKq;4 ic #dqU{h)m q,S_a/?CG, H! ?6av X]07O X _=žU">T)Kɺ3M rxɭ(>dB^MP^>IXQ,L3O H߄6{Ym{8w]u#-.džzvUՖ{I!D[3DWd~I%horwѲ3~?bb$CMnpиҨo!3m/i؁ej2`3| { cZh~jD>Ӗӂ+ O`Hxu0$9 iG:[-T^a;Ư$tނjIBX.M?v"ܶ|HIzF^ >&G?ekuV'ݡeɪ|5-2} F‘MQ UdpL3[d;mo/A7d,^'G Ð0k@uhGo2tILV[=z A&#ڸh*^te:lQQ.y|*/P)& _NJΊ}5~-f;;О~ACrZBr!R=KD4ζcmoA ][QfS'sM}ޭ>'u78w`6Pfcjw;[;='X͓@ɡ$6Sf[)7g0\7OzAG E£D°8Ρ,C:F`;c;2``NML y P*bUN7_E`@+uFFXeD/v>se"zk7,vjRr_+7  N%ogحԕ&Ā]>EA"x?9NW֕iW\#?{pҀR%mSS=QXJ.'_2scZ}zH{%cL=Bc#K4'NJrcɟZYay`䫗* 1;c4.ҹ_y=%  o;W9)G<}]4WtFbɊGs?{~8c)i3b %0g&MB('oᆜJD^d+Ƭ2[ߡ ,0X7;tdD_T-1EE7+ ¡#ǰv3]j,إ&fPٌJ0SؾCiYVNkQ 4ު(/1؏}L* _w1/[a7wҘV`&I~/XYkzB6dG FliS+ 9TaQ'Կr CulhGtv,\@~J=T{ju nƲ\PnDk/_:tyrNBeʍlbI%¶S(ͅ.kAv;<-hw,GF`Nx֌c!]rH5؀+4 BNr|۩͇6 S.5rgżj⪾fx?4IaD~T?cqcdM;bbm~B2"XRa/iFO2,ώ`J2Ƣ Re^~Q8U"; 8M{sAdf0G炐nZd{Ήv 'x2— EYo%$; ""ʴ$>hzKד;~>q{A ߧ6?a1m &y`ﭔlZ$ހV:h:%X' >='( %OԛpBc29ͱMcux`J#?$7])`.> '&X7dTbn{t>ٸ}idԑ%T6*mjAl+x1f)b}ދ!25G5n41`) V/!P,L=g84 VլV>(_L?}ʬiuw]]^iCS?TA |-gz0}Az5Y;_?nXvG0/Rk܂Z?ދoZN;fm~<9e֝^ ~;̥]Wu!1h~DM:D&N̟6E슞D@Rs zX<'>"c QtrR&84C %.-@O"$?}/lX#c"C0G^ h|2i&+)ؗSXg0mMn^QB8opTkݷOeS|@q]~ظ>^Qt$c9П5gi oWwxZb[-MgJ04xjYF?s d.Lً~T_8Nۻv3gZ ?cbsPxu;f_ڬ2-8⃲%Զ]{*Wxf+ X^I0وB;SN!°"la^dE&ŅqVS8͕2$k~=%{T K [Z2G2{< 6GbQ8 ǐbG4&-[J J$v But9߼GzUU?P86f]+ %?&8^4,HY_n&TVDMݰPk KMnqh,h!gC}`pa{>4 _ "v*m 'x6 :WK[ڭZDZC; Ifjl? kM:_F N{@7^*Κkw"YO1>@}IllEykVXo?'kDUM,9&`(m,yzr4`G=ЉSRCJL\TcAQ# 23ȳ1aLN81z' /‹aHJ] Ɠ!$/O+gЕ䙨+te!W[Xzyr[-amv1 lxxXDzj΋Kq:&b\)</Qd%? B)3pu:< ,DaW\=qf@$ 0c 85F|1g9Fq g)E`6 Z]_Rhck.KqұXAr-+b,V|n|mB>:ۮx1d(u:6jzK9M aPã'=4(j ˄UqI;7@AZ|Xⳕ\-D|a!pVzȕAwpB4UiI#Z&:-fSI0c|o5 (N^Y.uEj5I32;g̢i3mO0BFY(3 ysI܎mGxK0vxՁ1[C{yQp*m8![.࿿;8*"8< -V?] :Lxv財LyX7-oq֪6M2͠>Q=jz~_Z[MR&T Mݺq|FOxIh>64__p(sC9M;ޓimi}Ip=:< ^Kt}}jg~%wl}q7ߩȬ0.,ᥰnEߙ;Ǫ[~5VJL s!2ʖp-@Zᠦꄧ>q%<ji_ئ7t,ԃ^ V|4i[r1I?éSPR"ԪQmhR} }J|9t:O.4E|hqh~UIf֪,˜y| 'q̯wO#GK)Μ^JҲ`'ي|z;;&i4<Wu1 Wu3uж &՘ =.P:>w68GocQVf1sP{2i;1Jr#kM R9k5&vU?[sj%1KD'qks5:~}s{pm `81]/6.evQSp-FO^*A"ުV> -Oުg00|vV9uɵ):Z?oeYKk?'D^ʛ7lG>Vlݗ F]Dq Fme)6DCpMoe뤵/ {(<}ƺlcF D]NłY̗fyܳ#{6dž:ht YMjdby/6Ăm8AaLYp`$q0PSM}\gGSYט(2F+b6JIS,.-<9BeBa J$6|Rc9Ӄ 9SEV$zo>|8i-G:!%ӧ=&2%ĕ4bxCF[c5bF#TC6a<ІXԆ0fC6 S?C[ :O{_S_*+[ w*vNs 0BI,,>r)͒T"C) }0X&bxo{RӣK[[/tXr)=y@o={R9,$շACS 2xV.\;v[Uc<ݧkNeK]( }^B􉁉vˆ]vQõ;\}O7 8*aWp^Äs&ۮ6]1бvbŁ5>}ŎUv{+4!YT{b=)ɻښdmCJǎgB vO~ˀ! A=ui b2Fn*PLD,[qӱxϙW;1WZ%v+(Glx-k"Sc UNG;UnLv$˳alY^ ^Bi\Ɂ wAVdI(GaMա+ G*w`x9[VBw;RV,#,Y6q8.Dh#ЂA6#)5Bx(7N9+O\cYx(>AzBE.,TVUc1je;PTڴ",ɑ:C" >QMPQ1މI8p ܮӿV~ k߈QsQmmL,OӜ^Y8Mc#FnA.L;]VD_.v p2ue P B1?)5\ 'E=ͤ؉DžO@Z=F  >hK;xc ӭm|mC Eq<*@akו!v QL׍&5~I!6 Xo$t2 } ZJCYm +ih+&49GT5|+"*GNaUfi .Zi7SW(-˝qYM F3H2"*jjm{7Dg(pok1ic8f<yCjlc8%ET苴ꏼ NVx|cɚeiQ`tSlWͼwx$R@f2W.pTΤ[>DILAfbnX9;q7;yS_YHYX94 /i/,L†ȉ䔘F#'?Z.On LHm,sVYFD |t:\O*- hNE:;bscsfzԼ𿄲-j22؉<;<5<6$},2Rqш7ѯw]qgtAI2F,8;X;:=lY7ջYX[3fTC+ ,6@GBrbq㛾ACmPTl ]qNmN%#gk"%9}b!*/i`x`y5 H5'a/|a;d;dǟbCnNC>Cv}!~?CRwch8;$ѼIYm\sTf]s8pSdyy&;6O7?ԗ+oa): U zB96ףG_e>JE`t AYpu3JK?7J TНػυ2h |ӆTfCsQ &景.ctK8}^pVHm8|X߽ewD975Fh]`GFO{[ktiGK2'qߪ$Ԣg>at/C{Gp d?_?OPXve8#9 GCyU/zMe.ʞ񈎢$cEIsQn>dۺ9ux7o鳥*J-q0rsMG RjD6縬QhO18T}\T d (XP-d14o^~\QXvtY므5# @_%DHu@'rv,?:i$M1_q? ߋjnfax. A 5E;&n7 @dNC?Oܺg.#١B/ b6B/XuFiM$o B7Z䡀Ż_s20\2`̛T_dյ^̷[g.#X0'bJA`}ɚm5Nur%+|&ӤvY|*B26X/B|&X"dgg>iZ(#ˇMPˏ \&baP2s겕IUXM>F~;Zqs5:Q Oofm>c*_ϿT?o~ugvJK4+Be:][/w~44- 7aN7`D,{ݑ^!?î!wzSwqX |gY5sJ[u7US ?X?`LN*{֬Ѯ5pVCJ<`G`=ZGt+UwOg!B#x[gk%ǖЉ_%t쯳W75"#_#Vj=7Y$1am;f uAVtZ+k8g+: #PXB!oU^5 6B_ȵSnc7+]"cPQ 9M)8{f GPG%d( 49hR$ &Ix>F,Jxq8S a.z%ZȱvAn!MuE|rJJ+u\gFh 1:Lf*7:pBDha9tl2hxzⱁrS o%7^$|Otifte /no;c xĉd}HO& baAK,~vV ߊ 7dz|y |8QDg1FԬV*|+)E\Yq2k Ɋۦ~DQs@7?|ɡ6t2k?-ITDD_g9A"sNTLf.췩EÏh Iz/%y+2iSE3mu ;N0_.ܰ d  Dk@d^O'qeetYAx'hRAi(FœSU8^mmQ /tc*#Q|zA֋S;wq:vD{,\uz3{uS>E {‰!C38UCDeAhXb' BRy(uQL%.<ɌGR>BÜϛX#"DB.hUV*YgZ1UUkUiUus=g\,2Ine'۲ƕ|nBr*S l0/6=Hmj{;^7=;v@xwB8BJo]lr ܣ:W|u%Ѷ`A"pIu{;s{:x]ɟ-Z1e tl2tO6ea|ɁaޑdQ w@bD7r`s9+2: Cq$\=,[J.R9m0!{;̥\mS׵]nv*gJu<+^4&XlCIJ±Ƿ@ l}ro.ەA>"soJdB7*z=z\9jZH5+?i45jj>Jm듵PaJ@?4ro?.idOI *z{(m%_drCauj9O+.vpgʒ Mܟ"qwJ%b&EhWfu ^XXBvw @ҏƊnz tJD:4Xw&h#gJ%Ձ{.F=R#@stY57:Zy&ֳCs|[Ӌ #}N#CsUwJʌFpS[ xeusUȞ ]Ɣc:ck6फqNL=rDnzmS^CI.Te@A_3kLXvCWoX,q~}BWܟ2[|-*8kjojov)앞C`+6+Y=- $ bk },zaො 3` qn]3`|N朲XB~]@J@y Lzm=Ut#Ue^_MP8op}KaFiS* Uv8.iaBi"ר]Е UףdS jOGEy(84<-ز: Brj; Wt5|"^ fCCw<$̿k4#{^:@9_ s fD|yVP V6"¸@zsh;MnIH FdN$yX\k`Bծ<9^I-ucCgjPYDٟRm__V )Sݙ,Ri=Cɲr]"Y"k(+ 31L [_Y֊Yy˫ >&|eg HlX˓?*N(GH&"lUZZ}_`올fA͕EEZIV>sl^-5Q%G C7%Y!47Lnz,|EdOe+sd#ҙV J(PFPUL6AQ(aކ\OӋ66s>$-dcɦ[t TCjiӖH;63D͵o6jb=m[ 3+&PRbЋvrZ)Z)ZOmѱok3 ]ԙSXT Ϡ^"*@ !-tͮDt&A^UV2;Am◾l?i([X)^ άQK'r7T\v5lx%.̬DP[VoG#SͅރQÙ:{Nti௅2 4w]LiGIY_]cP]T ~E{|^ D=#&1Q`n(/}QSS=!g^𽮈o[   Mj߽QTʉW SC ]4fW&^cHoc]mg5ʑp0o+(*84Uch2n[qst- E4d"!0| e$6g˰rjRnCsPꦍ ,WRp^ق1}m?e  Gb~P\3i |'261jo"pkߨZV)*QԸrp<ƚR6w% aK `\vuw(BEJR嚄okl޻Cp( KoA_o ]fNgyDvv QEN"E cڠ͘˭|KyY#{;lP-tj+W dJ` :{YIue&8X%ƶ~(X= g=|pG90:3VMDo6L(-i 9Fm5x fä&+1Q&I0Ji̲9XϹwfV]νwΜ{9{0k9tФ;M:j1=ITe,[ȡjc!˜ wiQt%b3`‹W!UtQ'%`; ]EcL_g?# Sb`hyEԍ.sLDn#O‡1HuLϩ4ht|uo\ktC;{S#i94 @yYc\YAbmk1iﴰw*;'{Px]qBL*mަZiUuxq^]u44*O)ן?etf49i7(4&S+,#nHr7;VpKg׍uΩ ۸9M;ZKSnU(hEAγQ1,0vQ.WY:ӢV-4]fѝ5xȨlܓйԊPնuUAocOb )0Ax◤κ%qRM&(BwXAj) ̤0?$ p*<1J㿂n_yۚm\cvi=fRܲƻt;΅~Znr7 9MF6"{?N 1A/gqm5P, eFܙ;St'[K =rh bٚVXN59L Z0 MP*Wygf&tZ-ZL?iJE"J$&l'HvZ`96둜aVE҆01p+lIkFc*2qt+NE. X)$M cޙD{>N~74ȿU> +'iI,`Le˟9 r'HܙHf6ڔc((-=uPfL769x٭yIT[~WjS|P4C.ĈmӦL\, a~Ч|@39m?cw00.fyZ*,@8JNy?@<FaϜo0Tvcإ6 Es.VZq b# UFAwZ?{E¼MTO)fPvfamYfF BqKar۩cߕ~t f8rC t͘6,r_v~ 5qӂ_ƒ]nJeU{%'=CpQlV)wq0* /\A#p7/sRHYT >/dQ'R]n"VZaWd*``5o?mXҡ/)R>ϴ+mĩiҼMo%j0K@z7-5RNW.xL'In_d.\ۉkڬ ^4INK= }q.H N\ڍįpKhH#3KS+:YUѐ腉!KPL7L4#ׇbңen%7ωsW̥rOngE(nPs{S_[+. }_ BnTr `Q;/[k.C)P~pt'¢~(,d> uU|֊)\ZvuJa(aדpOL0:b<@z[ZOS ))}0OMV0bB3G!cNtQQjC}tbq|X B)Q9UZ\at]nau!'Se*RXK,@.ppm쐨4 {*iy/U DT@H2sVP@{j'v^ӭJ.bܲwүfȦߵũ#߈g[52ON XL C&̪o tyX6a?iLs^'$s_`IΔo MI1%~^m]=rmUըnrXPHc 6K Rd@F"^וPnj49q)%3jjdLX)*P0 .u7p1t^Gc$! L,P@3D|d\DN\Y\!: -ד|djjhkkP#D皿uK4:l +VLe3Wj$?#6fZag9mŔ5<}ʺ`r* e V~Yz $SӸyN1!Ԫ=}}vJgbwzeU[HKllt&bl@*4I@@0lP{u)kqsPE]itYз~@dj6՚UCZ12JRzh͚y -tIAKoHtYq6~pswЫ--Em!p 1ʿI{%a6{;e@ܕes/s Hg%$w4 -DcmXtFPhhyɈ5?GQo2^> FuXwX^Vm+[Ѱ ԑl$~H W=q1?>xGnj^ [B1p׹qtL6>i]x[?zAA㺲da_-<`}w uД d% `ĸ8N >3KDe'ILAwEõ$gžjoG;~ڙ^!x&>%KPRW).'n^jik9_ZtӟppK]M}[1Y=R>^t^ze *O[t8>I£5ż;x) :mhCr~T1 y RY|r *-#o3#GUd.cY 끶<+!w Mས[<+V2 w@9΢,q,OĔD,nz^Dch*0(/ 579qL'iztTFR'tE!S 9f{P'\4E~}X̷]h.4}%АZGvjtGw0ryfiPq FY40B#fc38Q/&u:XαԘ7ׅ =b ~< 4)c(YPCf~qwa%b:>-" R=A,qk,.M#n2N\ن:7 "oBQ%nі~NiF>t2\^d9 .W!,Q@ üzy*S!~@@i t:kDM0~ #ʮ NCP>8Ҩ|%y3<[@<7)~k5F*V!|!nԞZWRu\9AGK?/'Y. 2GGjkǛe, 6BiMq;X[@Py R%yG$n-m*.sp;o,y#ԘIOEq>FEсxeG<<5ƱGK9zF P%ZI݀m]hI~:e.g tZ wi3̇fO"c#!̲S48|x ntl?cBQtd19es5W]7B sI 2dV6U 0,Q]QAu٩c )caU2Wu;0BWF,^+jaEHh@O̱][@:R\쪌q<'2.#͖8. w6`̛A+/M߮=0M6k(U%\-w4tA-X (,| ŜGf|>2gfȦ܆XʉtM Vpbj>3goĦ҅ ЍRщޜA7i*8#NC'xI/zĈL} u'Mpa{%n¸a1tAۉo+Ir1Q 0<;ʦBr<>"|I#OO9i-!N7^ jJ$D;HuSiUrQ!~B s v oD*͡1WFe g]!}dRԖu?U5k&?/Z)vi#342fc&8G.`Fa3p]I#浕OXF{#O<1NRe$> _陘1VCa +D9eH xĚհn3,&wա,Ԫ&axr[r74]wknz<{&&Ɏn߆D޲zQaxLu=UPs*]Gs)mŔݽ(m R=(VQ( 䰠qQhu,%eQRU_>+L@Z#?Ռ_}^c.$f]kф!5ߍi_DwD8Ĉ-}yq&^꿚^)Npi XZqE/ Iz  Vnja(4V5˩VE`X&/"œ]D} %"„t?NGp#Nt=NI-_ۅlr_ N,yc]#9hgF_ӱKBM܀ck/GB;ߏS@IUnj8˥Rz$Ei2 vym쾾̡Q[%ĉnKУ/"XL76zNvԹL7+;Xa<1Y{e &6O w-`0Q7~d$LP8zqBqN4 P Gp3X9 歮-bM'[2ݕ!7|HSO=t+OL u_{IwbK8㏣&07vX-O˔4CH",[rlGO ڍYP0M6%+>dݖBSϛ_jjK5`&_^Yh.xtz,A~y xnZFӕ Re<~ηM(ي-BǠz_PU^>uF{:/M1X]Y=뾉:W&8ޚl07r<XRR΢l0U8>ɯDžblND#hU(*Yx2k]ڪO58uY7 "a`mqr8$q>dR0@QwSM::be"}%R{$.J-B?.d0k6ݡXnqZ&nNֻ뾱+fK ^ψQ!JV A;抍|2K3jG`B}2$4/!n %_,φ2l")ÀP#ԥV@oߐ*-hhaYkݗ~VIſH ?F􃣐K=ˤzJҡ́ ē[@';p_E 0Z%zՍNl2\R'N"!ky62D6B&SQ|]pn^xP"$[lc󣀔,H I!c.Ƭu 0MK%6e?\&I'\N6DJL[Yb&?oU Кe 7 \ /w$}LㅠVvu#piǏ ~|nJ_N_1uIh+M$2:LT4 :^ ڑ]h\F?Uio+=~ ??NyjSBl]=n1OsqИC;119l+K}ѾqX?;hGh??h:0/=kU|_Ma.ǰp<%w8x1)p|}q|+Xq38>01t p|Zq6E|}ߗTUI$4Kx6 s~*|*ٮd/`K^udb:FM—fE RfUPB^!Ao1OCr,R5>Ih Vw'0f4ӟOsҟ# v Ґҋ3 ERS˭2}# m* NŎ! =/Qާ{4{A @r"!.A$>C"hEJr(:At  #e+n&f;E5`#V^֐[-r[vDB+Q2;'ʁ9BCC+I$b;H R5TM)C0|i3)hFA|19ѽY&R:GDdϊ"˲hDO }tw/ֆ+T =ƐOS/u <ygj8-2?ښ7Ro2h̟@[+.Y8˦%E4RpˌhrI#-?!eejx_͐ni(Zz?#^ 4/^KZbF;8?N=7 -֌ǔP 33~\/^l{ǹ\DxR}'GR"Y4=J4 .i }VE3ˆl"5=ED5zzζ~CYMcE&RƇFbiNs~_ah+]#+~5váU eM˃ybKyN=N3pC>X$LA>wE6Բyn.t'h[Q>\7s䎪DЦBsQ(Œ:d:́KQ荃 ΅FKs]Gw m$=bpܫjOKލ@#8 x|1O/^jǑ7^MN.JV%BN f1~K!L$(v_{Oܖ'f(}>>#$:{2QFWO_M7Xj9=jFW~K cXJ9NϴTt[-D7K)}'uoa&l8(eP#zr (R!sZN?HX!! duVwoKI%z7t( 2@/3TXt}{aGM5~:Kg7~։`j=t2OV07'hv#a$=HѪhS:TI@punhm7uK-#vfiVx116AzgkFW}KZ7r g)D=HMuk@))O,.4sv#dp!XnQ}u7iGKcf4QȄ@l^C>gprAx o&}R"'.715Q0[&V\]~ Ľ{৸lag) O]-fZuֳ{nh"p۶woXQ٣1ѾuׇWvߪ{hRStOc_a䭢{BP|#nH VJT5OSL{hYڰT;_a */g,SYK{Px!RBi@<["9s ă /p? #Ev☓G*ef͢+1]`N K#oHgnAb[(Ei@oShOMGGlTZb}[>fT0<$#1]7PnrOiGp2dlS%~L n$,#7iUѪ-G 8'\e 3vpOY4 ]aiG.f1>7Y9EzsyȢ q,wzrjnVClZrW1q~8RrF 8U8 !̿&:'"zPOb,<ºL<.bnb17),^כ9;i'{~L*04U)45 >h7?L;~'”.zz)X&:MDR&G378Nb~ dukUr;1PBוU3P^F^~#&:J`e_/:Z%"z׉K>-.=#.=*.=^_ť:JDȿ O%}&97hhbq7KmT&ygE &9Zq;SխYɗ[:t4cp"%.@Bxh0p;t#V -[Mm*!$8 ҷ(een?@M Ɲ+^IyS~R5F*> 3廰P{{U'GifxUGN y )'hEڸO14j \YU 9X,c h[C}UFwg:$PjJr4c8xVp`Y}25AQ: "oz cfוgԌiL< Ղ-MCux$mH&d0sat:,Dfނ14z47Ig1=P `, f?-B ԙ cW x<1QkRCIzdU˟0rvX$׿CDu7*j2CS`i 5xɒD;:5ټ>ҳ@cksENB7Cq蔛XWy?kD?#%gAc9f6;[Km-G6L@0yݠEWEz@^z2%Dod&464L$RC“43U耷TN|憎ZrVGGjw'IF1 8u1_H8dˆ v>Rn{m/T~!kgKZ1KׁAHf翀%tO<480?|[ P^q| B=x0sMN:97hR,O@ASQs{3^[/d+'W"n4 r3s{K[$6Et{?0iuE)UCtz9@G|ً:A扴h!5:^RUHӄ9\HӄT% 50GR#ρ MH CHBʆBSABG9SW~ޟ:Sum.SixUNY w䳯) 1̷46?c/#ld2%pcw">H,R)hbQ0 5q'6; =O`rZ_ȣ6EݯX*V$CV/-FiUGK"ފS]ѭs탚ϰ ܒDEqrp"*h#&.S̙+}>ЦJү2^*좛g@ƑY)`P!Nҭ^/[Bb 8^DY-lQ*M0ǶN}QCf KG#^"Lh13`5ܵf+B~,8VU,h^VxW[N^R:2 Xj*,3*-Rq'Jhwiҽi:k`8%g!z]ZeqОBʹEg)68bfS<GU We#+҅jF<ió6-{0m |Ā~o#<8)/5χ(qG@8* '? ~}!(򶺝o%c4Qi|PdVt9%FPN *@w^_! Q&)X-T;eK n܄AeT@. 4-sQ"_F~_zurÛɇobT(XBjJ|vF7YI@5l#gP5Lgxyœ/>_D3k>,Of]>3H_fu5ꃉ]OYPbcsedt}ݲP5.VPcݮE*rLQdFm2+B.F-9wATcYVQ;:[cy[z~-cP '`z&G\$nBۺoț`f YQA;!BL"T?1r:Ra{tJܠJQC!QVQCv\Wڼ<o&5Ny4ֺ1"ҫd뾹zh, iMߟ%ğJq:HRttFZ uxZ_vk skwwĤui}y-z GMo4v٢*PM1_O@ILDz0/D?ʪ ޝ wU'ғ 'Թzh=%11TOJ'@@=ƋQՓ>2jz=IP3=izKv'q7yx3=]z'\E@80"C xae9`M`dQCx.46h榪Y\@Tc}D?|D$ t%zUz0ki 1m.[6 ֳ۾Pv!ӶvE$4'Ɲ4\+.PȁHӧa >0*NK.B!t;b3cϘ b~okMO*2}t`Wtn'CcOLJtX4#[hwhODMAk3^@hp1OKLA$\Ddx \'Y34dd7FN#%_Bj:D\WVLev3ې ᠶi_ dž˽dTy^Oպ/zԣ u2j߰ 4 тѵȷW !,BO8y'jX"%(5*6]^%h=]nkE@ʨ2G8A26!BtjwB?&8 E*o$SI-JeQ@qb:1>y8:{WCþcvydN7vC:gլ@g)7p^*#ACK} |SUpҤmZ&A@ʢE#%-%.ŔJb a=Px0**3. l).PB*U٤);^.0Ϲ{.^m*m# ۴R)DŽZa[ #R3WD݊[ٌF,Ŵ+sMn@L%?"{ ݸ)Y\@,ܵZMml>G)3Sg>&i& 4/9ZԏEJhfDMU q(jIrgHwiN9Gq'OAk=ļHoK5ݧ-P2E ,쩇!ss\꾈yQ<)%WIe}/HGeԜ

    è3#I;䞈v%ŎHt롓“z H ui$Z#a䧳Z F:0">*"0߉ޥarESYN)Dݳ7j=[ _) 2p]gN.y,{ZxӲ72-/#xAy.E:l;ڱq|τj:BbW2>s31Q|\D=*/:I1qxt{x6ɯ$ØN9%R=$y;.'/mF]~7.%}BܥDv%ѪBAVn QQy?1!qrU1!!p/C'S^F PȲb)6?#R e~ />8}x6#l:2%[PC|d-fФ*e*A YY&R E eR8i"ɽM(\ƃ}gJ{e|6>4q m$qvVp6+ &<.K!Qn^JK k@/ln%s$ 2߇ %WDi_Ir+֏ O1X>Q!}V~I{-#e\_AuUݧ)E:}' wܽևmD<|;ŢzXR;Ԏlƾ#27\Aɟ etTn-*d/Ng\z]K>ߊy ` f >~&aҐA=q&vRIump |<<3!F XA.,T<崡/ V7>1K|ZGm3`lD]{?_{9gKGd$j  挣5w^𯬵6y>ZoltH72u'wca.) ^Zo6=UdzgxĎ> KU yd'JjS{ʽ6۷z^i#aAۡ ʦY 43KK~N pQ+Y#'[kqB|% b`,9A^欒L {Z Μ2W|Oeǘ 7[<B Y aiO*Hj`9&Ю)OpA%֣KWܥ8 LOP!\n 9nJh^:EYG( $,H :d%I Ml@NΘnbxLA3+ 5v։p>5e+eJ,CgnCr/0jmhޥ.A$}7 9z]{zABs/ׇz,3V.cߊֲٍ:`l0TN`ј='v߿hxTAg"ݸ Z5Z|F(B=ଔ]BÌO%y3[˘* `NJfC1_ HMA@q &CT,2x+35lxd6+V" ^ Z"2Wxh=|}_>%lw6h|Za}@6nXa*F|?zT>B& !TW$BhK!jlD-_"dq!W3gi |y1 /R Z1|" .MQl%]g"YCϮ*r 7BookKdΊlUsʦ8*$9KӜ3ish'eZ&垰*\kޣB>ŶkLg#_`x)gbt,,/,"OKvpT?eT0*8b+X Ay[4?$9@m [H4@/ar2%*%0b脮p>ʍ/uZWE&rܯ~ zlB[t5"9 N= 2U{(׋z^|<&#IksQEԀ:ɯo)sw/S6.r>,M3rx܌w{[[0*`0R*xY^ [|}ѻ8> ' 䒵58F8j@cz*(y3eTzz[oxR8_'Ghx+lՒ1}]tۉ7R?}\-zRӒč׎6D 쐺IF[dTԷ 7[q4L>=qAr6tȳ@kmst0@jqWR1 ~D'j3Mq% s9vb+S\r;I^/ׇ:vЫt0vd<ؚkΖG!|br979% W( zg]{g{=ޓ -盳.=xWN\A4cߦİ 톳Xx۵9Btʽ gr@/O yvnT\JšC _8-U .{@HC"",;"h\I@2cX:*텁%4b%5/kmє#c=5kS }Xm 5JwAҺ.c{ =l~-#;HQ⹍kIK.6uJ]1'بy%&'c9Qȓl}Gӹ/wCƳ,R9lSd(@[ "_ Q*ѬNNX;ktgg9MNzOvqJG23,38ӺʥvuDK{ =M˂2 9SF-+EF'g'ካ %W#*n u q>eM9?3VAK:S4o qD _C 1f W]: i檰Uz-aY[*ѬB恆t_Rg@Y Åm]ȘA!ʭT jKC^x!%Ta'vŰudpy k`sYvGXA)>ݏ z|♤;^ o s >T|K'-pYيW4X/^AkDfCYT(Z?O9u#SaKՄtǞ,iNw(+ ?>L'ng:t4vW+͗4M۫cڍᦦݗ35;75ۛ!"dYiLY(R.-׭ra] uj:h֘N(Y{'u]iwbzU| ׳ tY*iU`Z[殆}JǛٌsU>4s_uxU2 m +۟[ve(p2_~9,̤R( B ҷLKBR4XalV0V  j9ѠhXto!b ?\3Ra@a[})2|MjeHĻ_f.!XE0  ik]gz, d7z[Tb[M5t0SY/}=#jz?o+qQ\lV.;c(G*d?x鵗彥7/M^֠1sTiS`Ͼ/+P9KAj*𢗾T/-/)X^hb[,V eo[:vЃP|ur&솊z\ŠX ,,U-^d\|bsV+"~'fHn('%%O]Nru3E'fhL]mS}3ؙ۪ԻZ;%!~̕h]xy*~*֒0YɌ~I5:#\r|ԙ_W{|J~{<2mNk=\?=כ#Iګָ <3CnX%h˃dtWĤ "#VwbARJ>xE*O.C)$`%2whu8|V5;ޒk|.%fvQ"qԹ#WzێWo 3`O2xN\: {vuנل69U7$Qb,h̐B;vP;6.If~رَ=Hgv_=yr%:|B(/34N+#`^2W)RhXעZL+~΢0 ?iy jꚹ҇qArW ywWi=;Bj6Ee9P]RB#I60_1ۈq#K >z>J H!>ކ:0T#<ׄz>;V {,@-|%@'KkD[@{D "DUvMnئQpnڠ骰|ߦbx ~֠$x9X?.8㣿*A D~Q!EqJ!ޯضɧ^_O܌5$bFy`^ ී7OqK^7M({ 嵊EE=,k;>p*KS= 9B|ll;ICƬ6iPlνe'mrOlE LS΃dN*h5%,b%~c\T.6.~?+mT 6Jq8ta ٪9 i @U`D~(Di)=t=+2ME4c0]}guN;?hSdr}sGJCyZf\"F& &cpF}Na|q:ɫBq22t;;-Q{ '1e) 2}~CL:bbh[5Ν| MZO͝ <1/^ye1si @|=^ߴɶi8V"􏯤X. d(A|{ %p"ˁ#e|Kmq҅)!VccxK|AX%N>vI{`RɤH҄ɉd ݛovH7J ғx:9VXU7yҵֲ9ס ;`P4Œוeӛ5&6W'>6 !ªeםagoX䕎y[ĢhGڌ G4g*]^Hg2w̕4ӧ" RGG[iV" ˍ YƯ2?/lbbgt{~C𲬭 Vǁ-5hWѿuHDg֟U⽉)G`F#%x%!ޛdIӌ߂vJ` ^i'7Ɏ$dאbKd`@O?#.JkxYHYK^B}uPk'(NPiv-ٹ֖Y-WivB\AmqFJޢT{J\OB5$Cb:kTqRא+^Ns ckLP(?JemP*UJRj?|[moCI졧}O1S2{ho8^$zG*~蕌Dg=J\2* XItU7ug9#i} );S"DD\@"H43jލ2]ݎNo*`t:pWsCXũc8Ch?gzjɃZ3kQ8w5m +M(lMl)Mg Ǹ(_m\Tnkwi9o?h‰aa١j'~.]w0gc8bY|%Ǹ>+L>:M  %PYjK{؛ƚ 4>g$ g[@ŪhMjpeL2w5S=*ڥQ9C-S r~ʣ~^K{Pj1 KSox?@.R#5is/c/ 3@ʱ )R F5cXޏa˒6<" `V¢qHϘ6)aڜITˬ, DgIb`ANLC*Xo-h3&eɽA⫹0䣦1bPIʟ[n)CMgQ]p`S! FQV U qPUg޹3>7TUj8 !vHܴ-Un ~l7=x~pJmKN} x { '#ms~ϟ)P/Ѱˣ8S@L܊bgp5Ɍ qLv 5y, :ß;3ЗD<]{ꂑBc58/v\+xjA>}_iڤo(}75W@z)HvBjXX$rNޕ)_%'њ8bU ~Zg ?_2Yp:. mzxRU#=(֨7Rnt0ᩮ@6+ox:Ιi%';Yd-HHƨ c6ym~_᠉oO2@^QfKs]ӽDﮞ;9,fE[癿%4$vlmpN7gvm5B ӴbXoCʹhZboUb5-/_ ZYhњV>WFř_$WT̢.ܵ4ZV4^ $⅑YBUk뚋6YhFj݇Mn$\0{GKx*ڰ&RkֺmH"kd'Sh_<m-֧C]  ) 5QV~MI))5v2CIAʳ<Zzcut3)$'n4-N=~K.z"e' Gcu6 FwJ(JYlrW@zr t%.at:~?x!$vj|4$;(0eQo +w0?k뙶i$kA/xti5v|FiF=h+V,%; RqrwxvV'kGG 5\7ȯ"S}>Ve-ŸgAŶ|QSd9 )$~+?\_K5eϽYzt`tCY1 tfo*dS(Lwox"!Y w2'Τ1n)zk4 6L,3 zFCw)'e>ҾhB\אOuٳ" dZ;%J)KҜ@QWsk񀧢5|Qↅ~ޝ yӀaE}ϤD#Ӓt"H_u6CqV\d'{[-Ue6>r ~v}QTzjb w]ɉ(` ^Pl9G~Ɗ {OVw zkn'a$f)؇.X8<.x1/Zix?Rpה}quoz(z޽jO/>u@Q[*bew4o'#'t2NIɧ)v򛜂4Rs:tk]RtWU -a/M%+x+?KyU$Z=y+J9@ O.jM.:'WEch(r^mlE1Eɯ[_C9,oo0,``իՋJ]+z]~s@;(:,RM] 7ҕ"R&q{|+xTfQI3H}el˦VtOxp?(5yYoCorMJ1֓Mg\d& q)Nt`]dD7n:>Jkk'xn<\-kX{ˁn4<`P /HvW/JBaqpOV.5 AX#- % R--e)|zgUdGB baP)KPݤV }X~ $Z=RBӽ1 ☈6Kr#bATC#^h/6R xMI'~ 3ͣ`#U(jZP8UYT°GHe^ eW)]Palk=|+fٷV4AGXCbh l3L}{JSӀZOe凝Ͷ\`ɛ6g.6g׹baUdD\YaДw,Џ:4W`g ^SH9G ̫PhD#4/F77 s0n yH_#sj2$#GULS:IqԩGh.VL M*uFxgcT +@P%!7bYK֥eA@fy=p^dZ=nyQDt,Q0P7 (`Q&¬^/\rאW_Uƶ+V&Cd<%ʚ3qf&4eiыiþz`^k4_\ᤑ!PBŞR#sfWUL^K]KP 9ghELUCZS ԟn'ݱSeh♤S m|L6z5Vxh}. ,{yy[h<]@39[1CM{ ُ< ;d;_o7!mCX~4DZ0[$磭&yeՉs>UW7U zj㿼Jt # $=HiF]@Tܙ>͌XhL57+!Pf˲Y7&NbVQ쟽v(3- n6H_7-L)I*P Z:4FqzHMn fxv$Yf_YƳ6uYڞg=`gmgm֫<}]3kUݞ05p^GgJr>zq!0c%<"0w./GG П\Bk"e&/x{=v2faj)9d84Oᅥx\MX,I\ ΍# GؐZT,Fڷk@Q@(ޚ_}>0Ho:t(vɉO{f~#lY*TZ*+٦j\#Q 5TA}Kuu1#VfAKptR+suA3̠|fdit}/YY+T4PAt^Q(Á<3G ;v}J XaEf6!t2hRe>&4C'Zͳ3oމ:삗ܾhVOEPYK=EcZsheT{`UXF7ΰ @"0)P>PQ,1.kI}!fZȣ@UDžyq$.4=rTB]f""R@F2L40a$Sτ(E3aèL=v:(c!HrgOQthP"5*; `.;>+RPn5!ך#Cc2} X@dLH%(h4X0̝9r7o ~ EXr;q]`/ r fQ5E|. w a C'?B -1|ҦKSNNw吺*}IU8c6ӊh V4)a!4֓6̒*>Ik1*E ޛjsktXrnt)i8nj.ZvD贼קA٬`:0NR)*MRnXGhѫBWm׬бhT^I40pʸZ0atqXnKʠ/hp08fAqA)5(\L{s$aEQ($2'\Fp_\ v Y-bJ|3<ҋkY`]r5i/sdO)`Jmp2|iRhۗ7/q=>/W} h:-Z>7;)3 *X"AN]C &qi`n r ea-=PDe?(M0Am eu!#!rҐBt?IPWt|:&/a6SXu8R/@MR\;$ҧ07tG3Lؠ-KKݠ"8K7NgV9tTCуVUSKh(e'2ʛASsXk Q@ߟ m֪%RJ:ShP+1];u#en[KnlhlN=q|9AYwgiwakP}|[gNjk$yO((7\hһQVj^sHcp@58N.,o]!ⱰM Y!7"LnY"5K&#O|BDXbq<IO"{N<ڐ G+:aKsA)~@gaaxT e4hv^.-r9P:lQؠ5ihWǖ؉ߓ]?M睏!Z /A*$p䋣я&zKg~d{n -EWx&`H1 NfhT y\Hԑl_[p]L/.kVhTq4sET&0hc4pJ&3K!#㖡Q\@zB2*  }J+?fdZhd^;Ў !M("~qJar}Ir{w(KZ*l4})եy [&Z0[1փ v4 Ѷs(NBq j@0s3R>fq-n1 {͗92:j%Sӹkh;:[t3}o6 c\fsr>pR\T g[PgRq>!弦^χUhi}͜+QGҘ :1ȩ1Y w#iHo`r>#ŏQu 8Ui̦rnIeM+R/Lhw"r1"R1]}LDo:=`^QI9\Ĺl ]Ttlw-I]_tJhʖOj4tfK?l*4Īø.mn|6ɗ4a `w!Wt$+2q?\ʖ|dKAOµw3QDca˧ix&%9> "ԛ_rRۻe(>CK}y|TlIlw K$ " d LP1W!KPY3NB[[jkE3MS E;F $;s' Lg9y}γUI=@>JP)?h.e ט(>;oVNB(F\f2 :{^n>nᜏ6I>zS*>{S9 >"~G_?y%qRaǿ#pŇ4xpULJ"oTdFBa|Nh^}U0-5aY*TX nrmy8ha{쬝)B\^;x*GجweSqnklFʈUMEt3?ar:U!n2hx 5r dfGjOUq7M1ٚk'B7ƍjݚ)r*7q;Ħq&<NNQxȪf`N{u;$sN#)V v{`@8Z&K$9H7 2{U,*Le R5a)~d^>*vU/T=A7Ҕ&K E rϢAٲN,$@`s/=%Ux1J@*E *猀WoUZOJ:Uy(oYXX`. (.=_gAiZqѿS@/LD2ƼBJK,ı5)K)4$ DcG"0=E]4wƇ~P R1QnF*]C3z!;z?/-ѳɶM@[+ÀVo{PQ۞RD9TFmݹ%kXQq5_u:p^E"+h"?"v^[n@DD[CKN"BЁZ<eYgS2 gQ7Tu.γk*W2:0.=(yGC;B*h'Z)U׆uQTBujBWňNt1ьTZCbDt }<>3K2XNyf~[M6b-N7/nq ܫy=4tC&tPJS<)(Bh$<C1F9yCe(Rd {y3@oD K< /v"Rf~x ةw@pIH xF|}+v0T3>@TsM!q`%Ż xRώ.$һv,40WxvHǂ_ yVpo0;W#|  fqW5 Ҥt+a^%"@c﨤o{pX3`2JSi삙fX18[YA?T)i30S%!*VU*t *9նZlΪW9Rǒ 90 \8A1k1̥,;~GJ`ּAĈ ##˺k\jk&"HLv$Oab`&Ê?#LAP91\'B+; ´3޼$Ov@y9 ,f*G#⋳v,0'8 pos[mm|\d>6W%p1,rիs[-쟏|c e; r Ε*c˺ ,mFuDEPO1q(s̻ytM20J1+El]ԣOPR%wh \ؠ&_}l =(Z7/ K^جҸgSLCS2SRXțMU-O~d_ﲯ##qzˇ'_ %c z$WK!<㉧eL?g}=`8`T): l>gЧ04:={&Q& Ȃgw?:7ZEz|ٝgf_s$@ۍ=*S4ڹcH'\ї7 ϔqk :?[o+Ga~90=Zl>]Y\`~M^?Q*m:Tj!gHLP 5c>YhHY@X8w=jޤkތz[RhE`"r1UITw4}*[\MRl݋5m=V"()k^HvቑmtUP՞dyð*,~De|z1<~^w4zfzpU^R.)9-rZ4Q)-l8ѭD@QD N} oVi':KkI*hAb@鄧h"^<6ӹ_]4awYPӲ.ֲeMWȑˀ7TBjPfc왈\[k)җBڒ)x+%M<:*($aqB2؂Ke~q iUPTU>hUt|didؔ SllªxqHlJMKQtq.E*_;۷,vT=ķ{GU7@ i㊓ibYsT̳,[W,/\|:XhxOeBGZeIN+#^KI^V{";IK^w1Y0NZ24WoA혦=Jу4͊rMM[jy-JU>|$&[Qk+@TT~xI#TmTʐ@u42ZUq ɒ/,YJ&@d?BRüJU |0B Q 4jgElT 0I5X(Bxʧɲ8zs Np*(k*oP/,=e3K "R=UI }E>_6f0ck _M?~]}Պ3562IÌͭo@)@$`^9]eR(pwh#^e[E% nA(6lNdۄ` W*zSl̞.\ߒ"&*ķJН7Bkׯo.׃rƒUI<,'1K˨$NݓEC|4TJEЃLZ tQlR. w÷+r_VNEOF ~E%*3e$peobeQ;l0sjV*bZܩrlktzlZGC6=ͪ~ۉg͋ެQg>YQe^ ~ҩ1L ~@Bt2 aT hwW$zٚ7TECvCzEVoR6BCvh' ڙ_`Կv ϫn4?:Qz6z\u 'PW|N3P~De%szտ`C3\qLz!p?eSSP~6S7 xb}fO#^V1]R㟎% 翕3H/Wq3x}gl(Ýx\Af_&܅՟f7"t+:-|^38-fCM Ϋx=uZZ؆P6/mJfSp+p|zȝ#_ 3E-'Zls'˙TZ.^0Hmۉ99-d(s~J]]3?z U/[`3 wt[cX5]9顚&x6Nv}*xZ 9;Xcr`̟q&??J[[l•ĺמq)5n BRoN?@򳾛 m_ r@@+~%xAe )\c 4?U07up>!G6OsuߡjNOzX9%!0X՘{"I:Z"Z /'~Qقw.R_a}O...2rzj h<^~)x\W4#2E!7^f&+J @GId?./9%qt 'f; /"?1aK@q-y4"bsN-p_6s xMz̜B) j'm-j 'nlWy*)M^gZ%_u%_DE>H%>/\GxEZnfy|Qyg\w97U$gMx}Q7TQ|x%E)oLŋGA/@3XӉ\{[ƓÏg^Y=ru_C7 1Kg.Q׬SKQՃ.J! v7=}),Qp%Ockk`gbig q q!k<)lِl-Efa(݀|!&.-_ =n1h s{<MQuM'A_pO]L>1X4[`pNj)҆!Ѝ+Tw4z{z?Oj2طx j?v/}WVf4K^8HBr2OOk(v8wlɌXx-њAɩڒX"e\0i]3-+` aS0e"ȶif?&f1jHI~yt:'77)[KGWCa..P!k씗6e aŀ /YL JjY=3kG5A[;8&J\ڰT8|:x],$I^j;tuȈ>R+L9'fM"{ ϒ8ڟ>ݩa:n:fSdG8UNN6uNyz[2"RJ1U/vׂbfZu {7Ί4z7 G(knHqȳ,mLCwҊ'1zPmRAy \ѳLnbHCiԥ3KS&!Wԝǫ[ sAWy|1vG iOO=>R%~v!*I{ },uڋj*V>Ep1qvPTda-Kh7GDӝ Q\=\\9j"dh[ \Z7h=yն5X]mlj.Ϥڙd\{FQ5b=TkS*89)1 C0Ez=;|5R5&j|W,牱LK0v@ p!D5'="2  %c _ǂ=jdeڌEhv_I$r@Rpwy;m@.+GZZ,mdȖ\B8d%cYkfi}w1ׅZ\M<R1:lpC^sa7#ut2Jg'+k - xh 1SX)Z bר7vk=K xSY$|HyUa+z7ĈQ\nJF7)l߇q\4?WY|>Jb(8Ĵޙ_~h&5L{|"~: ~9Z3F2A%uuw|iFNC  O#eA9+A2pX{@}P8$@dwfεΕxہD 8 2L}96 (Q!seM'B|+?oH](nj5y"?;Oi7QӼT3[֕+aN5o2Ҫy5OV*IJa\Wh=؏=t3Ĭdй*3;'H;[} 4nwUdtK.Yi|)Լ- ]oybswP}N$5XJ/!zQtЕ`k4Pڀřœ5Qu|q6Gѱ+` =|EiR1*Ncݩ/<s1]kVcNhluN`vNhFsBc圐!bNhEJvsBO^z9a^9t[8,60v3;]u4pM 2 ,٥ն\ 5vR4uc'҅֐8'Gv5I!:5W: tK&:ӿ #YDUpw{sO:U9}Uokk4Fo'$;*E ? 6:N|r~PZ>7+7gZ^C*g Q&{LL1ډ|Fgox'㼋;"'۾ߙx\_n"#qG< ^_U&3lxFE[\Z;X֮V'G 2h<4H]= $KMϽya^ĺI!FM#|bɻ<,C sMéR:j8Yw[_rL@Ե29f~D.J@R|x +g[t7qܫu«msD%̥9ט0:-O#ii^LB*&=$#[_w}Lzz3W!~| ?=R ޟ]lhVVbT> ׻(~p]hnhw!> F('iOItJKo]b5jb^R}mWLsfqFzNF:ui}͘<4ߌ½:v<ľ9'ag:Ns|'. ^ʼn{1O ֪/!YЛsjAe-ǽ6M[8v.iG7y虳_mBua1"Vu W"T8b^{]Ew^'R_epf)֦ u:H2h.a '-jv)RY~$A~@^={>DA$^>.sup$e\7pzΛ "wF{5Jog❹T?6Wy1Ί3YMjcbR'bbEa= 8oq= sx ģ$$Co%<9gπ5}/~B! (\+0Ɩl3TӋP a$brH-N))Ld/-,g/Z"|̊YMyX/>\G-a]5h^0s`"bm&?jD:/ *-3au5mn*Q2Xas)]N߾S&n fg S]k}_lcQMퟏ?;f;Ra"߂HЏt:cX7ǵ }2x˽l:b71#H|2fJ1dL1^ 1f3(weN\]yg-c2#{0eT&ɓ]r{7r1]Av(0ʟG[ec7dYi=0aoܫzV<̲I#1Y=O\T{RVq"- ^VלYn*ҽ+w^LϱH&ˋy۹G"Z if,tIsu}-FZѧ;ڧ"]D a<خ\>̈́+2ǛƝR W?c{)Z,fdsL a$#9ЪSx k&,nkR􆑍uBf ?tVJr#ŞI^+A*0B.4Z1iLT ڨ|f~?];@ c-_ p~Ac#ԅ&^cif4` GTkŋ)2%R.sQ~7q?H~ס@yw=JGn4Ti?zAP>sXۀQjis`YRU >?I{[jOlX0'+ VP 7N<l ~UKXB˓׺`F]-L; }a5{Lhmc-=tg%BJ#u%Q[|OT + 31rdX0(،Ĺ,c򸖄kp}!ܿۥKF<*d/?q艮{zp?GI9]h1t,$# *=.8,ћ ILŭ:v&F!*C5,u),uۚ6= ɿWm&z4p(su#zu0柩+?,23- Jx5 ;JRkNM%zZO&+D4\KB1[ϙvsPֺGNq+ڌ i*=$єLdYKCjyɢ eE4Ю)M[}0qdʠ^N#F8qo#WNrc ^Bi-qmBg&2J1|jkDߣ%Rf2` _gH;ٟ3HwV;qHr,Ѕׅef{ȅ]\0s}kt&= 3呞Stg_e ̖6Pf)-o(4Wo񢉺g1ɺRPun>\/X_C9wWϩ3+Ժ|J|R=%҅Ot&q(^δu CWPm1y^7O;48Mt^Z ݏ70 %,b;`7W86UVێ]\=.rVZ[xj1hא 﫶u1Tlm^`-Fwi\Sٖ࿶m]Iך aP$5Wg|vCj[|<|Xpe`ITF"a[Ir:YUm{c I[ Gna2/IQ}GX{}z至b mGYGBGb#CЮCKΰnk?Vd;}D3h~ ?]/>R0$zF ng39/ R ^e{ ޠ^ K 0$EjϒN%]gݦsA$t\3²೒.lEp3u/z jzDO s|܁qSo5`AMAymPܶFr܁[,~x+ bY"Um][dm]Jz-DonǬYGpJeqJ !=TԞYkŽHk/~*:Y-5xOAW xJ6X_ : roV5zPС>>cS1UF nB0/k6JpUr6L Fs ^""phU0Sj:[ }Aң0?A ۤD;|:k{v~3䨤' o E/D k/[2B6)q%4]W(5ʷc#{_$ ȂUYwbx.t1ZGVab@ŃD|1@$?YfTKFy|!@LR̒q]G0`ȧ!Y#.5T< l8O÷x㺚]/pu3SjJNRR)̶vF5ucRi ^)6"ɯYs}JQo6M <ԁzF(Jx瑱(iP6g6$1<{"qɠxpt 2]Jsa !Q;^pp0=\  88%P76(ȴ3!+Rj w, ]xݮv%l(* /FMc@1ûs='w @%ᆦ 7tְƱBZf_x8^QXxBJ Fy,&_ ݮNQ[&YO.ýjTx)ƨ&5*k%*|E?݌r.="^bbm"pN""))^6wEmq-ǣ% iN JNp˯$޽T"5?X>3jwO/R|s8_秘%6]r]8zk=$jM<9rZ`=oRY86{ۏ*iX&r@ 7g=Tj8vt~Z82 #nF ǰrI @%A Њ6CK} xn$EPP"~i|C~  -5PLUXjZBl%6!HBE?-*}qQ( l9wfgC"~y:s7w 0S?iPnV7 _DPK|R㍳[1`kca3Z&hբpʤii˦/({ |#V_@N+z>țlqĨή$Ld>,6t̥%ot_6o15!=,AJ#f ٺWZՁ7P٣V54OxZ%j 'q0H~Y 4~b ). {Ѓ-TXyU)V/fDx76m7z"^Vq|q^)|<,U;GuüNdQ:f [N[ }?[]y-u`\:ΡJ:鸂<_E/Bu1"{++imVP"1h_ҪXnu^-WM5 ։?imZ8}ǂaJ, /VQ:v"=ѣ1nDGѓ.sF)tHaNccr| [.UBoǰQ_Nf*XBG FGʁ(C8]DjH$㺳8M6Nł7kaIb7+k,4J`Ћ*Hneܙ)L] m&ffX"-+b1թƻKc#){C:^ -@d[0Nz}\K*?k0Ay赨(Q8%~ f?a_\ 멄RWa92zxpW6(*/3nD0U͜UuVћK!Iٴ/״KM{' u{!)4G`-0-bNQ ]TC )d3PO-=db.b\SEr8ӷF;k2.B+N^[*Enl~Юz/rw=R Z64 B2-RB7{U)bڙt)ϓ1-x.>ƓU)7~f*ū3 s@vk}%M+FF|B բ`-qt)'$_rtgf`lyo0JP/0%w)n_ooMFԉ<m+M^%6ٖN?z^ٹ!*eWo(vU7c.1\a nT9jbo2y]" L+l Tx4) hp*Cwyulb t+,иe]g,ּpm@ q GnÃ@Olm>[os1 *q`0f#HV kI-,vzyNc'T6{ y4d@8W/#I{Nnjm#^V-Ab/Lv=@:)}xբv\?I=}\8mm ]|eC$v&oiH, #J5=2 v<oiO;.$NV^9h2)yLu#Hʨ<^'Om9b[-e,0fE=e Ѧy̥wӅ?Us4[s@M<UC-!0$A5Oeg着PrwJ9~G1S*0nC/0 %X 4dĪ1g$g[VCn#!8ᗾ>S2kq<8]P1K@J?F\s-OIWAM-HOGv|4 &K>A|.eї,Ziy/(?Ns;y^J돬M9_u_ezAIYԀ2*W^57qZJGn` Ri4`iO_qiR[^qMHhpWJ]Dߝ2Y2)C׌OF?k<(.=xb(30E45J[puC ia"F"ȅ%D.B.ȅ\aW Q \@̑6/:se /p,.jrNzo 4uLv!Xn rU^râ+ Ib!uCAVEoyxe7~z8xHֳuvBeTe(eH͔xme9ebgVYNFE_NwUϠ{ eXgnBXEJe1졨oZЦ0E]*?%|*N'L?ٴ_{ՔF*Z7N*n£ )ݝq&%ѿх]0 u 33 lf!lE'[RV 6ܸ1n2y`b5~ ,B5.|qe }dsϐo >@SKqaE+!y˭FHA#H` ,6txB{XJAW2Lfz4Xǽ}鸂ןXܾ \ ٸg8r҆;5:65g 4n8`Kdj:!Xl6U(pVӎ*Z@UiVA]2t~CܶK|;oqȉ\-M;3%4"T.%(  S\5k`!Urqn~կ%)ױNެl+GS0j%v*vD)W8<:ű ?*\Tk jiFшXEBb@ű\bqOrԄ\Vo#bdd;U m3WK)Nwʘy=@odWxF.Op4׳p͵**d>śndEƔ,(*έ_T `~%QRHTB)N+ ʊZzE DQ{Q;T(6Ko6-&xM3;Wk~P0w 06:qKc%sG '%u6rtμ&f]2Η"25Y'Rp#y  SjmM{:#e/{K2_a=Zەz Il2{+;q6$?1"gEbcLSO]2nDlļ\w;*kӨP%T፸BK@r5cJE [XAXNXbZkb#,([Zj6`*>^2\hȋ T"ޒ,:7l:^& ƝM3ڡXFH)M`<[}OV"+fT1y:Jf&GYUبoG|Cljbm̲TC]D H?doub#E >]9ju~pH!r7EB9Ź 0`a=IwZĖ۵uc]1~hQ")7OL3NSV>f^jd:PVl?-;U}I -H]bo m'ó")IiTMP2iﲘJYS1S}mhQxzlFY ZA ;m%t^^"&WWag lAklQ~p/By4bwխW吉BcѫoF*j>RE6tZ#qt@bM @w +PŹwj_ћ&H0_}W'<L`&PC/ЏX-F(#6d$%bQ2dry`YK1 Pr_ gKs8m-}I%7V1YЅ.1=B4:KЂT`Ftݔ]'D{@'wԞ"gI *,QI(z(> \PjRRq^ /͑J1GU{˿uL*5os=7ďgd5Nwsݛ޽6)H}?!=WEQgkţS'Iy1 ~?С#Û#gxR.A~x|KIic~ o[ E{s>AVI %KG]ˌT*0ek}(:0: EA!xz=,, |ߓ-R6䎯Nt[P$U1E@ʆ}}/ldQ߅%"ID_ZݫB]';Ucu%=XoL0/`s\MժܑK rIxhOi"r ȥRޙX{* gʽ!JxtnR\z3pza#$D%,q;Ff?dKg{VI:Kw.ORMbۜ__V۝^QUυ?=}.'??:daU qP%X?JHo >{e%;j`Wym*nf]!W?osi In˺J{@`D]+?ϒx%=n"?%R5)1`"cHYke|qmNZdwl#)y'TGOf$I.[B㽠~ae=ڮ;RŚg8v;K0 vGTp6ߎ{~0xw,8q4wyxj܁QVfFX5*1˵+@QRSX ,y @%-Bv TEu`.~8 TDbfiqgק&@ OGAcU([Z{ {~d7d }$كݶ"|cؓjcٓZ2e>=ӓdѫ D+*tMūZ-VElϋZU+5"py1:==qʢ#@_4Ԝ+hrV>Ƨ'g܃ ,1%-nLlOr+کl*}1Q>G墘y{݃w +(2EJ,υ5Qxk nD&7ztv&p@o`e05%y:ib =ZrIU2]KHeH ABaιXRCfʹTjbo%I qzm,p,J]3'@BSaKI/?VԜĊXQsVt-h+j@{4~:7]R?{{B Jagv"~RR;П3ͳ ":sFV6cS|^n8^AfX;-ZKΊA?jsB9ØcsB>] СDWǮavKo] Q^qB9PN'D9ߔ']=<y3^ -}.8?;IAW>ZDn׾q f.L+v x7?DP|#~!9왳L-6GJُ18H$:)ko "ɧޏSg%]yFݐO$4*N>M]"%eܧ*$a'Ћ6tQɧL$[T"2ڝSE>=;SɧEIt>,i#Y=rrO6_sBRP-kYT68:_ rQih:P:fPGm{)ĉ!N>IY (D{KQ e&PR;SR9b0%$횒rܒ QRJ L5HhtRRNLԣ3%iQRL #bK޵(J%` H0NIiPRDIylJ#)rԵe7NJ*ǢrlJQRR%܈w=(cbl~-ވuCسw.&&))r{TFIJjTZ띐 ԤC\x8Qaޙ}1~ÏeXUwgM`MSk:,heO5n3)T/b lZT`:ZĔkb/$S$Su88W1屈jkaɱ)GOdaALeJđj_R'b>TV۟-D:%9543w0`2Ӷ#e!.~*4'XTG[3̮.$̸ֺM>ll߻s];sjSB-_Bϑ\Ё/BNv9}~r=ۛ.V"ܬgl7~;L?9ܒC-I !kY]֕`xBȽ%!rKr2\J Gs:*!|ǥv wϏ8t\q~G )#70.kk?0o ` { ?eMwW s-0.o+~q_9`\ VC_[tү0ntJqUaJ??`n=9`d+`ܴ=Uw0n2lbFqPCc'MM+ƕ~qwƝ D~\/7s{ĀqJрqJ΀q2`܍_3`ܒ.ƍ(oġ28 g ),bK @l3#ɓR:+;$`lN--@W2;>+ 68#8vXOA8=. O 2HB8O O4A 6#鸇Oq+Y1 _!#6~ECk;GSJct|V.4z" փՃz?(ImHZdL$XzFtjO!@v^%MS1qWפaWoln *#!2@8Mi襸O3?Ywc8kGcwy5s%rC-PЄˬS57׌"ÉR|qe'G\(w(T;"Q6 K;gFؐ 79+Ѯh Gru}s*;sS.HeGTv'rTnvE2Y8;P8ay54hC~x'^ ښJIdMGF&̶\hoB?n4o4uvIvUnFn<7$+F>ASep^+O?&]bp;QGĺKUM2xt10<җ~4eG_ hbC @˟יǞa˟=3ymtc#~)~ա"]~7]MޥՐeb<.DzY^f(,}&n[KڏbʡWA9̊Sy\Uޙ}')9}1`/_L 9 +q2Ч䭁YA$ 7Nqv㮰ܸ cd+gbljt΅8j ;p!8M'>bOКm٫vr /;9;nmi'lw9ClL^wlsFc!699;ٟ-l ]Ȓ[6;C;N~La }S%қbxq"]HFNFz,@@w/?e?@=W.:Նd%?SY1^ g!\Գ^\_Sg >Dī_oM{M:rv /Czpq^ ȷX{w$uZh'Yn-|m凮7!8Ư8ƯL?cjyYȎ,m(-6e9\Fh$U}dv(>L"Gǯhz-6P,wOcau@p Hyk<2N!2UR6KL7zD锍_@2`l;Fg8sOsv}-5ѻBaj8&1IvNSz%R=OЉF_=F2 ╉)nwT`<`X{V`锠SY侬'.%uᕻtZF ]3O.Wr'u꒯;bփl9H 'SzN qM@HZқuw-~|^^h2j!=ܷZ}ܛp[1;"dB)=jwD=}x([ 76z'G]Uq.0+Q=F3|ǙNN'TL6|R# w**z|/rzkTwJB/>6~zY^^׷m?:c]HވvBBD_"xL@𿢘Es1+JwSW`F"CƝn~ϰ@|v]$Ux1O2o% D@ ʶIIzփI$Ou WG%CϳḶ s,0m̓#0=S#Ňe3)22:i:.)8ؾNՑN4u2Gflyo7feƋ}՜؇!^SO^ ݫY= m-aɍ{sPm/=;;S NdFEh1X"w,UȮ:6`]3\vtcO|šC\xFk<:Zeڨt*9ݽ^O]'SZe#LmDgL͛ڵ|†`UQ9Kї1yA9/Ov\U܁#bT!2B[Lwܬ~Ϣ81鯄ø⸗u8q@q㾿J½F}ܧ9/ȟ:p\ES0Cn+š+0[*{5⫺yazB]vbj]m}95Xiu331ݾf= gy-w;)66'y*-y?ʴ2sc&3K2uf @ '`Tz@/}r` &OɮV#me ,s2 )%+}v`+ ۤoV}im "x7<;`|̻왡L[ WW8fpsNW) udaGG[/ aw7,ݭ-n>P+# \5qX?릤5__(bJ~G^ǣ9 CVhaOh>޵c4LZ'2*7Qqܿzc+B s%ցb__[i]6qܝBe]"iFe[}q[i X2AxMwZd[~ x/׿?ޔ¯JOc_~i)MG_C_:s)1ךe9b+k wY6GAmϛh5[or4r4_h62G͹kjbNO7Ѥ U24~Ejd32x ?_ dRfPY>[hGH(wO08UXİbbcQ9b)*w,h1Ѹ>/g]mO&ڤ\5TwIʍNѫO;``TA/o?[3H}gףʿ,6 cF3ddmq&kyy&䙬r.Y]ŷo[c3\|P}\ο\p.~o;[R4?R.S k˔X.u\-ew^,?|йR=</?.~=?r܃Cwŷ^,p\xnT.q%s_s\?1's: #\)K|]_$l*!<@;kCj&_Z| d|'zt};RVhg~hE |nK4|^gL|5]zZӶTC.OKϾ_%Z<Ӥ/w&g%|v§7C  ncUWW;Mou6Wܠ(q{mi*Fd%)[g>q N1uӆ, ¦0xjµ] 5X:3v퀛^ΙKWJU-^q;ۣz(Ztq{p@ӻ*C*> _Isk_1`rx́#8* b/FpK܂٤=I\Ab#=bJ;.pet**TET513-=94ni&"b.`HxŁ180>8MmBa6F8p r@L,zx3>~>RWcL9ȧ?qֺaWā-X3" tW@Hz|(?{_b*GnT0= hXBub'xeK8|GR(Rz@^xaWҽEaXrFj=`՚/]F7FJAŠkl澌t*g;4DMP?0aΒ{@itjzP(aMi~)1B4Ann/fÃԤз\ˋSk`ԟy J7-ҸxU)0 =?#:G5&m!fZB wV%QI߶ljs*稼QPr8:FpxN,R d e*0W #UZo&/-ړ'5rFzrix =jZrÔLQB&ؒX-3ؖOO`9 4&nzҥa A˰ =g@*PE.eP2be+ZI %q%e\GL(0i? އ" uM?^^ow-lUZI*bgx=rpetQjV5@w)$B<5-Vd5#^DRQ -TV諏C݋ì*3RɘQMFP1);@RΞxp=ʾ^Vjb CPPOd$5)`=gC? 2*,Ng W6wW}i\]WP@o'xvLK78qA`1W\ްD2f~ E"8qIAQW޺$PjPo4#L~'5TޯM\tI=#ńC_xĉy c$zO;UBEL37y)rS)LN/5Y9.RsctDΘɧ9aeEn󧫓|k N|4YEU:6 Jόa~h#n/O-F$mxhQtmȽPDE,"rW_\xd7(LqAtЭS+K4c ="Xg ͟U -ȷ󡉯qnn?&ʈ=$_(Vя}!Ń}~( %1\jj7߂$Shg0em jOCt!64wĄ;~WNwGBH`??++G4iIo6O9GZwxm izdžƳNvv7TuG|Bv0*0һ-2tOz+ޱ @ot҇VBKAͨ㢭>kE rVT8FFI+Rm2nR(v9h #ŦFJ]Q;A?Y!*X`z ]Aixd" }TW$5,~W71mvWjR3\F>.ÕzwPRg/``V4+#)zʩ{|kd3wQ@׻GlI\U]d#}V~_]U Vn{;?"X0o+?%ȇ{{g^L*ay>JĶ]P`w2w*`wK=%JIරvlc6$cA N1`EA.ԄTP;ӰVxKĐ {,g $d3'89vU sk&b`F![fyXx6 ={ CMD,1wtmV6O!唫͖<eC OדTT7JjBrHe$aIqX%K=~0EBv'-}84<"wQtä1wz2A1tTHҕƲ4Jsf.Y[( ^GWMj,0[콸Kut{;ғi2.!>XPk,Z8@%9ygnOC/4:oPFMDuڿ':a/#_;IC𴰺ʎW|gL0>Ò~T,QTg6a]`Q"F  EH\>&Ѻ1&!@"I "}WVJR|bi(i{5o593h@ovΝs=|o ,j3R_)e,6Ǵ80']#p- ">O: }elAgۇ ]P y*#P^/aT;NM * uJFeZs-^Tp* [c`όO }P(+կ  7|=XkTk4wkpJ.ۍ0݊4 d<+eYmu]1D+'p[ b?OZB(f4YARV{;xyh1J!2 >2wW"X?ɽ4Y,V-cTao*z2S̀u&7D ǝͿ–©|C9/m%E@* Cc!:c?w*2Db4UYZ&}']^Sڄ'?YaCuz_gmF SEPZ%$W:†nxAՉŇz-j[Q^DL>eENFV[K%8 Ol4\Q!l^z $T&׋tL4BY4ys&ns*ڑ&N3y8cHN)2N>Q48,m`PQaS}#NC@!5 gU^ @ }ăB 0pZ}٫QÏGUQ?,-k鵎Q_KF>җI9xOZ L:]2*$tRcta!{7mj"\ <ǔt[WoT S+eaE=7ЃgUrJm1O=6n7W<\w[tw6=}Su6zd%xHKY7 tVLnpcZS mM8ܚ]jkll"\j%hԱp40p 䙚}܉ӭIVVsЊO!$\ lh/㩴)zy@>Mpw@,K2,^*%hE B):ãܣ|殅]w-?~o O/r˪HYDZ"{C%liSx&Fon}4lM:GAx*)^8iǘz?A*㤕~(] W*>c+4(s8X}:OlŒ_E cĴ<Ѣ-U+ 7KsTJDP$9$a 5w):G*YF{%lY1RI0PhncCWQ2WcG]~ 9qx]ޅ4pPc5w~t\܂pq+^ı1bYTq[1h5<Zt&yЊz="ϝp&[5 %$ݮ\ 0sWRpAuH ?QJVv9?9Ov\FڕCu  ]Ϗ?~3NPFXvAV@F׵ u4*.ΕONrSyf+B:+xtQ}{)qkbWڠ^1Y/6]`q9k}|*1SbHGtd>~@5ކ@O S_#.Oc[]{q۵'^#2μD݀b":&՜M_2[[|*#2A; <% RgyF ^=s,+%ׅ%,ySn.M@DH;'P`O$k vPX:c(nghc8 N6L 4ЈZ!|z܏G.ӄN,xʼn`agKI  |\.6Tbuq̂d `ڜ \ozo6Nxy{p_>A׊ЗSȜKFkU?/BUsrDkĞ7WTU}-dYE@v2 B8sl>] Uj RQDjGM`vMYmzrIDZ)Nr4BÇRd>|1•Ҽgp@ o1A q򭀃>+1IVjR)/X@/;}p:h[*iT 5BvԾpj]fPsr]Sp!toMZz>Ƴ lq@?8إNPbP7C,;c?[l LF^76]}7dD5Y)]5­* ^IgoߕqF,o-^`o|*:)PO5xۃ8$_}kdpWT5j}AgtEY"t7ԨA zXe1zF\) 51}tvzfu5% OT~ь<wBu ܝl WsGFk=:*:Y'*֮O_覵?n[|N㗀$ǘ {&vmd}Oύ39{{ { ӊ !}.V,%1.>({) rpI] V:tSKPVj~)o *0n@@-h'hAm2P6O|z@',ǎQ!76GWf[Vx5x_rqW4uOZ6ࠁB[[O`DwdTO- ٿ~̨Ѿw}yqLt1PJPw/a_k#B5ĄN..7}dIHM4 j@6ͧh'(a^^iwE&%`=ꞟnkRHx \]nǿT3=l~Z0Ua?{f@:. `D$?aL-?|odrW("a7GXq-Ɇ<FQ&0#?6 KKL{=o.Р(@<mOe/TP"bTtnm"s <ǀc,Vۢ R#7AWΨ}`ßo&]gzwf9j+\Q7w(yj AeMm`zTMOAynI?\<ɯR,]Jꡚ] /*(-rrPjs* / fho"=W/V?yB}Nh찜 67t\R,>fl)U wWBd{A)Auڜ M N KaAqGPh {%mծsTZ;}x]6Z H_.^a߂pksV=PYw`VW4kB{YԚؾ}ӠVfç`ki{֔/&arGA+_:y,~K0Y*Bw᪑?m]UOӡ\v#v0f\jYPXN'(.A'R|-ۑ.\!` 8|UpXcNe+~CϽpCn?/ Ixlk 4Xޣ=x(t=+4]n. ݊ߌTQO6bˋP3mLzkoFjf<47ZV õ !ҳ=G]*ӭaTE8-8Yеfޚ $/Р?Yp0JeTt;+51\*=2zIbyp%09 =obҺ6?jxs AYUb埮MEy# XM~M3^b?;3?LA3˞?<1%>ғ{J84yػD@^o.T̨ ǷSIp?b(d9{g=DZS/imN"A {57>7fL (swE.gDHT#<-O7 e7s\+%!n^^jh  ODcRd%|6(ϙ}؉=ڥʾPr9TyHJ#J @U[#EEە*.wKDv,413/Q+~,uh,{ߢ}2-{HyV[yP΍~'AS3EXiva8nb:%jLlB7x\]=hBvZfZ.-q_kC>@Wc,p;p#>>MoxkE?`yzT6Xš e?WX%3R~<Fy7u qٖݛ vExw̮JI35rR3]];z?Uh8# a{=hNXnKƜp ^n8qn||?F{"% N*zN'RugP*b>2$_nJ`@sPOrz}/ 0гZ6~wZ=Uow[r}.Ah= >]p@yJ|D{=\L`j礋1+(N|W\)mg*MD7@"7"@K6/?ݟluE,5 } >SqN:g`oT}v7B"BYnd,Qj,@et$='izJ\{4J)$vW"|28U@|BO{|N]q)o3J|xI _6~61o0~&;Tc}YCoK!lYr@a^Le>tMK> Ѧ 2[v77uqqNsc8Nt=%޿xѽ_qM=ojG!Jؾ(e<6OIf*#`5\`B{ t~Bx0-H ͣY~-xkT-n-n 品Pg^]G$׾Ti=EPaPY$z_P2) R7FE7LX:lX>ԐP9 ȅ3 g>*Zp>Dř.gJJRpfX/Fz-)KÙ-϶7H gbռlRT-H2NEKEa)+ kR@H?ͻSPxB:44#3ZUH?ҿ]LB;"os !}JBBz x*uw=NuH'l4<=r-kJg:ThҹlT^ÉzmtL9c4U:\tBWt<4dr[$s Qy"g(U)$] \M.O!4\NrrQLߎ˶k_\~u].W(rJrri;sr ~6xf\TN{hNQ"KU'7cӞ1ШxJO'}Ӟ1ӮOZD*kHI"?6$P$pC+oA| 1B 8! :VG:$ݲw28+'H$PE͍⇥)7OFCK} \Xqu7WECMZ-|V 䮤q|Vk{ޖe7M`7V |߷ jogΜ93^',sgKMGuBLȵ,ATE<V2}:~AKu_sM꾆}ƞ($k{ I< zQ14? xpwT1A 8DݸA. E8IĮOJL3~ńAHMXvH*7˸zHT?t-݋I˻v{2`&ۘE|Nǥ&64h8cjTmDBFY2ά6v+Őxp|_k|8m7T}󑅆i$?4%Ufl.hC{2I_c#,EKNI6.פǿ\I,(4RnTzV_yCϜxVGc i= Ƶwu@G _tVƩ:u?{rj.2 LwuOuQm?R0frf+>ά]N.IGTیخ||z3X$y_$eEQMf|%K`*0ƞ鶔\)*M֊+P: ޚzFE @7kF;&֫Ys]8`N:雊UwAs!1?YF Y`w `Q&$୓ Ѓ)Q>EݏXlߚ<T#ԫoU.o9?ٻ> ݷM29ՌCXhƅ}(Tj~\ V|(ŏ^[8QMPE*zPn9,0f];"$y2`X=lQ> =E&=p*a3·O HM!LG6Лb$SzA"e1YCRly7cEuϷ{Th*+Z!GCh;JML_%Tl/(0y8*)?ӤP9fZ2(NoE,'ZOmC A }H{ $6ԐCwfrʶjg4k*%6ٚN:z[T-꙳+t^ d f&|⟴U讈Ls_XYȀ D5AAg{zgs=%LkO ?f@|EcE_|̆pV|^ /^#^*әM:eN;LO oyj"^N[O tR2O?h'v+ٚA3o9)$7Rς z?Jn`-8eȪ$ƇHKoAf ) `V0F1d&J%ʼnd %,җFMD:B IϺ8IwB%$.$ta*{H!QH6AHH-$w})eĎɃ؎9f)Xsp}!"] ;G ARrSjV"o!hI,Ƿ Aẍ́ -i?_13($װ+fhvW0Ӌ QC's"i4VԲ%{gS]opۈлH"v΢^9&)( r{*PA?W؁QeyQ}u7jkYke`rO/tUI-\9L Yk9*4&ew((Ȫ,8+E>٪ewyg86yg(<ȧJs{Ȓ}LLؼT*cA<)5C;*Cwp Ԕ^0=w;.!B7Ϥ}r ctmfk@[*B]^!'L^y-<pWՂ93C,x AֱDy00AÃ0SBHW3&gfJ{9>!*/)vʩ̓|:'DP/q+nҧm?g+7ЈIyib؆Y:~C620oXW,`<]wxPl7mv+6ēs렒\/.vR=IHlP/Y;ibϞr zOI<qف\p lozr`n&1 NfSy-O[J3xLRUja_=\->U[R:[uP(8/< $@k3 C"Q7ݼ?%X 9Y8d4]ct\]BQ52mUy&g)jBLH9TFɺzj@Ex l]z<95;)2O9y]zH@¸_$4lMO/TlrkM4~̬.ee@hԃP7)S>9pf;9׭5bi{eBT-I=Ҭ$`zkk`l+ޅ#Ďt)CrPG4eePp0n.Ym, zI24}?'1x6g3HuRtȓҿ}/MTDiq_~GasNiS>Tވ˚c з* llpuɮ9[g.I[D~n]: zoq;NTg @>.3o)3u!zF'v~^o :tD [նk0vfxD\+zӒwDmJ\r\ >$4fr;V\xFx6G|Lޘ2?v}65X9|!l Kq0ޥ:` JO J.kaXaR'f?<<6{2&۶}7-; 1PK$CUC刉#5͕goD;;DX;۲[C vTI݊oqE/iв_ G.|٢諫QŶutUmwz蝼ScF>eQ>`^{߿⼽< NHh^B5&UU&^jƋX1n9$g.]/psJ 2pG4N|FIFrSwe%t(F;,(g~RQ2o #*2~h\Dڥ8 'W`-j_PNO@qN$V@YQ-Im >NHNtLI};R\x]z\ɼQa0]eof{n%񎽘W=c)u6_A=2B5E/0;8[`t{AН~:vK:hcfG>0 N6phK>o2LgF`V,K!XÄ 2?FRψFۗM.ew%n⻸ 6Q5]`?*ә0(!:cUԸ .gt^]2 z`(gڌ񘑝p?d"vx6Sy3;qm$Z)CYӫ"ЯN$' G$_ؽPmsd'1}A놾'1A }$bu裬<?tR=o ZoF~u[s0zkmz{>2ȯWhG.>EyM`]d]s;o\H$֨5^S: +J:)/9s+*`Lo(M5y"?]ӦAԢ RLH:AI'509swPG젨<gt"CCkZ8n)ğt?|p@%L=<{p;DWXH.=oʹp Pd˵8~!w49m٠ ЫaطB*r41ҵR%IˌZBH 1!ekeʲmI嬀@k(B+Sr(+P(QL'o]ypsefg͊C\}oZ,Z,=6FN J8j<}%&{u\G9.?`hźٖ$uFʳM0ڨ`v@U VZY7+Z|Ù˯ ؎Iέ%r'RkBTg'~ 'Ҋ\t#4XڀM-Ly G&@@M-7 O?֊awB2b f5aÎK3w#ݦDݭ&!%[boilOI!!MI0hR:t3p2lEq4KfLd,Dw+Dma)݃Uȶ]&RjgrK%!a}.j:sS>]a6m?wlH7ێv8(U0Ke }JuO7zauѲƣX C>e}0jR5K>%f'Ζ/nq(ؕ={=aU4 ۮAG_?*:v̘ 17ߟ* b]DjO0꾠6rYٞUF2W,) FFaU$Q`e5Esu|7 .$CtJ^$j$?VIW Sqؒ,?$ojjOcKwԳ[Jwb@E=y|I>Y3A߈E~EP_JN5p1䇶ŅOCAzz_0eA~(yzT4I|5x'ꘕH$[M_o8Ֆwڴny/{. 9]{݄RUjK9fu[2ma\ڝ[3 iו K ۉ# Y- U|ܿmMgj`YzY~N@&._-ܯXE(8u:;JU%Sg^AƶWՏ["O=qӳlm4ag >{4(Y0 `ɹ8ޝ+%=lY\Ɍ&cG_Ht<|?ҩ7i&|~,,v,2d[sbƢ6i[پ:lTiґ2{ 9YA(<*_0WNpˑ/u%3)z0wf7a[PD(H͑l=GHmt eto la.Otr'k]0)L1J4>xY>zNDK{7sn'7EjO4t>$54iOoy<}B00B_Mg11 ب(חg2%)8at ~ gjrNTxJ,d4 Jitb5 ظn@ `LrxMAQ9={$;a\;1Lf2il X6SSڍG[uĻ@}+\$@ BN*ZM偠CdVq<Ҹ|O :>7q6&YJ3FNP{ Ƅp1Ӥ'y MO|3خCN3t`zI8֒ɎK*t-=*̻L`YsO=&͆ٚ~0-IU) E"l"!EHlnf&鬳m.{'v `B:.[9D0(֨]'pb ..nLV4. .w/#ݏz9KvpQyϺpk0=o>p[>Ѵ^#~~\lx΁?,~`nEcv:7=\2N<=p'wQ}|߅?jMi1( |\.^?]~w' \7X?1%zp?n1l \xvha>(|,O}1Ρ>hip_ .^.C>ӑ!5}Np+q|q=p^YY k0t0*~? \.GpQˠV~oO5@3{'=.dC1eƴum`vUyI)ԲAA Fn'bғ+B[LMfѻl~Mr.LOkҋEWJD3iIфzR9lgJ,<tބV,<[eA<[ <ֲ6ൖ: 6R+Yxۧ,D_g|5|tj;}KB}piĞ pziݩėV Ɵ"Y?kr"nTԻS=NZ-;AJߕ.bX,)ѥy!1~(3W/SS! A'>RҞ;%@V1Nc237ӷ|qWvh˖:ޅj7qLeg** 6j6]xS)l[eX`.]zPkNMQ=h_ <HIݳM,oYJWc:+)y:50IhE) tGlE+\sR?Zb1K >k{;,2칌< 'Y$o4*1)݁Mzowv,C!nny{ќAڛPóf鏛dy&ingQCdk*R^ch06W"Ȧl>$ ],g6N {Ä6FBSB5264'$woƧOKU8ܒV>-׳lIAJ6Tٵ] ۶b[ 67y0r ]vڌ7` 5<; C/3efe|}[B%aKFF;q҇*PlS٩*d Ucٶ*mY_.pfSt:tVbڢbhuk 6VcѢZ|-ʬR0vf-ͺ$]w)/tv06S[ !9Zb,hߤm#*qwl؅`׸;?h2/Xfr!(>ȉe %jfqFkJl7ކqbÚG&ۿ|S&a+?>wj96#Y.#|#7Ng=ΞwyXJW+_jioenv~7mSX[”ؼ9 7KY|UD"0bAX!?7ֱP(v\BBŹKP\`U4v~\q=gٲE cb;776wɜsyK eKI )XEA98tRtT:k^c-ȄpRe[Nz 72|!YoM$ 0b > v9"EzC;%b Sz[:HIl,qSEQbɶ~|Yõ bX` չ=_ ~]?1|Q;* s|D'ISJv{G!7t#A4uܱlԦkuRRi[ 09KiuˀD}M;/9'jyXrN 4jO5(ng[g#x>rT5sV; 9;y*قTQ=B U+ ̹dqÜ*ײpP޸&:Q.,Yz< .m0Uߖ&M6lhmD4vpnCxژd"6edճPWy#ҨBLb &ǔ;r{H&)7y#>+u  9?rPxQ@pm~Ewԟ}*K#tQPH ݊,dϗ*:['b雝0F;/qTd GlGfz43id{/N]sgX3}&˺;9 Q 3 wYh.3Yn8E ]:;VYEa-;f'@G^C֜cU]EeqfTR# ܣ{:Y!B*ΞVV˲59 -Vjx5pLMNA?Y~he[L'6z B |{Jp͵:>H#POoau nn؇ù/٦idg?|mL$i VDB);6d`7zK*[5nË,(୦lz-:# luLX*Cd"a\=6͉}!}a`u_MX1&E!>Gb tq6%eV?LXu X/$|IS8f3@caC_[sW=_j4>iDp*1#y**jYi(]j! )ov7ls~ ]LQ-?M؜4aֿ1O̊ǡ$`s>anpu?WQ"?GۡmGY˼Ԙh4`#F)h i`o37q\IS܄ P .RNHk,бqž`.!¿Ehr;8a0wWRԜGƴbs#`<4ʇ%g;C[V䏀$*GxNK# ˾p;=^Á1+bu!}ŤiPx҃qMRzTH- ɩ1(Z簬P4> q楛Tbg<u)y60ev@:H xq\Uz0T4Y)^>bq { ]]Vv!uUA< x:9Ev&/X"+E ړQh LynŮ* };[=> aElPn vԣ7X3e*-\UчK=C47XQp3 ,OM=:+)mZoZQJ *P BQR z7逇yJ(]v^%3*8.ZX<9lAD%Dj8x f̖ۋekI1&idLԦ_ҀÍR0(3{%ȏ%J@~B v͸ײ{RZ+og3E 7K-1'!+vQ?β['J1 lIrB0 E$XCIAFIjVOc"bD$X2 /Slh!]}C[5@`ˀ=(#^`` ; +`2T2ɓwk`lhKPr`ɨ#ڦZ$>2%mE_HX&#l@?DFr֍*Mmַ' Wۂ `l6vj5!299ʬcBE(ag=>eUF҈2"#A?R%?hߡkH%Q<`ęP(.&I,w b5Xm:]6xCnW Z -D e&WLf!2FTt&GOc֒dEYt Ioi;$PPQWY9,?+G; ~;g,ͼ"zcML#F;]F'"[lU$F>^,SIyIb=fW2IωOgHHKA݃1rIB,!$́E:YCR~6f]=MI}6M*YIA\V>/Yc)?cߋ 7Wd闵%w⊬%JȜ+ZLd TP/9*#  xX 5Pc.#\P2a>d—U\2J\Rh2w!kM]NrY+ ke. beX/9Ix0_YiX-݄0wK?1(Ab0hF_nqYx-tm8Ƴ?GaœӰ7]~U6y w9iJcP,CprNC@9: ~^BJ?Q= {XvSd5Prjo;@|j,#CR3\v[V!D¯]f/ ɗP}mVwP>w)fFq[ Z&½=]>f'R1 k /[B3F.`٧>5!faI`JO}Byjl:kd; !Y/eG4A%Y.;DLK:F=f!NM3T!LR^PrYe K;N`c /lgWhտj}6+TX"21RxoT092pH/ -Rgח<3jS㙤 {UHh},} f@d"K\ (dtAW09m皥bpr'ɉNش4s>-(INj!ҭ,m:i0S]9sZNlןg6o'=ޣXp|uxv!--%2En/nhʎֺ8; > cs}7wU#r; {6,o\Tt<9]s˦.waSƙF5>۠R :VCӞ! FJkxcؕr]4memZN O%WX^i3Z5_¾(AaEmnRB)1~5e8'[/i qî` _.Rb~#òھ*DV[PcU*J']pqޛ8a<9v^;qYCƟi|M'2 i*|8<`A?Z,裰Yv@p"B=ઔH3 ( i^7hegy(iS zf;cTS+ ^ 6Ay\15\nwOL p~Dpޏ\8Mov"'Z23;T3iuԴ6hg&u*Bms͍DnkFR˘ѸKj|in|V,)~&t(54e*OY4?k _{oupM7%LTZM s{\@M1(*%i{J [~> K|zlCvnHPSa̞m1zV<+RD((ˁ7 ̂c3ҥx:h=(GdfQ4c`.{ YiR ĽJDY6Ud$k`LvF DD@7ÁiԌP[zyf%A?1Oc^v`M:n٭siS..>z0#U\D~6iV>E[KQHW}n)E+CƱ8pص„c3z~LDLtR^(gY1k`wkCVk7^צu2!Qxh:fK,HbZ80"cTx9]:?V"dm%XBZN^W/[@nHD4+d\3Sg;쉅WA=#! 5pP0,5e 6pNm ;hڎ!M^ݑyyLvfyǼ٪WJ|_^c>Fx,pj} ?.N ICKw\S?hE;^X ]AbC(cW-uл Թ_r`UaTUQa 5_n)\g;? QX4om}pj!˗:'H}ޠ8+70~REZ)ҪF|Y7O~NF4ޛoAqQsXQ'l/DgnEfGmUeEj YxL`<i*F2Kܵ>)_%Z-,զklCmMڻyÃٻ(;T*4:'W+:{7v_މ,=:.NCD \9_O_iՂ+cnO|.I/m2Fh< wuϴ:ߑjnF+i }+bL?Vn`xXDH #iG%d|T G))p7?yYڭ½GSQX6:'+uw_OtXy{t4>עb 9U ũrwN;ߜ*+S-,g?vn_*g9_*wwOT9Nar_*ǝ/NwʙhΕ/ϕK0 C;(':;[]qr3 gqˏok9˜[QOgDEs(|>#ʀ?9!ųrmt,6i3T-7D2V\Qk%>ǎVEt?y~5'ʫ)፬E|͗xAώUiVQb-ǧ65>1ƪ-ܑ+ŌHHM*>zX`EZ~hoQIYuSI'ҡ< ']c+/H';d>޷T H_Q W4)\c=ZU& ]oa4"Q7풊eUNQ7:V~ٹR;yZV˽weEv1u0!K6vB!\]l\Z2PMh ,DYLZJ#\/ ю&V9E|yEt`ccaWT@/Ϙ[CR\:|oy5oUG2!!__!-JʯֶF*O(x[G1p |<>s"l3h}22|ctpp#k!"PN|g I<Z:~f@1ȟ"S> F'{;l&a3v|Acm̨Ie~x,(%o^URBZȘ[#/#}r$PYU}5U.ru˝֧Ϟb=M)Hm&tьT=휢&)yڈǘCjyj.&ǗoGhEjPuRH hrO^8"oG_B18ke|u~q}?]9 _|@EH71 ;OD?BI-E[3mzG1jdVO/ܑw|aBQvyXH}U!dV% d="W6vrz t艂 h Cvxq=8ڈ>mH})*PxAs#D<͜eV-x49]58d>n+4PH4Ł YQӴ#Yn{␁#NjdxU߁:U' z&2 | /Q>*Q:R"ebقMd>u 髚>Қk Q<$H$RVV\a#7INw48$H ( zE0R,Ur}cD>U'T;ه.okzBT(27} DTiHx@[&[+'Ld2& թf!9v 9VkX+2#[Rj&-?[n"B AF[4'̝#z#9Gg,rq6j˰R&֊mApPsSZ&lVVI_:0"ԭVzkP9JpvN5 P/A}0`DS |ЋbG-ECO@9N [[X ޞ棵[evokĔdEXW ̦/n#:G%;ˠ śv6wNv9RqAZ&}fbdudTv9w6 +zG~Љf>m\|fVlS4- j'CBwx?Gu'<ϡ3[VTX3ǷӚd;.tH,m2Jkn[=֨Eb+.u؊Ql0Hj(gX9b5:@tXmBuVoQ[QTP( * ^faGv.+SD.DרV>#XE=PR<\4Y4E:p/Et, @Bw+R/ӵS-ҙ񑟶b{ l.HXGiMI4.MI4FSf#M) ܔISjJœ9i৘Ќ :O~ "ME_r" sќ! uH> Qb= Cy֜`{?޹YHo~2WUUmo^eeɽJȋ7Ժ`^ى; kÐi>WX,\{-[$d= sJE7 >/,U} S>DSzYZFS0*4-r}zX]Nbm,6N_rыvQt_.1S-ݒX~qE2OŔ9Sl`6 h*hFm@qP{a)[S!Ħ"Q$$eXW7\TE"RE*x-\\m>#s!hNgYLo:4}s,粜rn.˙*Hqv4rXHaV\zmE=sEk|_2oV&9 h2,dYȔ)g!SB?%UA}L 3iKԷ)TPLLOمs~V/UN.%Viʨ(,X+){ZpxOߑtL'}n{ah2j؊و\V-kA#X'V~f%_B3!d"ZDc?!myeeB {;|zUJJ/,iɢB%˿:ݏN]9SFGG~S̐n#f40@d $?i壃Ծ/ ]J( bOh9:=l/1Ui| 8Jь&4s ɖT1+{:@F4?:h Q  l{GDC^͌TVy!i"NI;-r nT=N(D?40YL$kY2z>"㤑7Ԃ5钆Wϵi[ /m"tD>wLAEO誚m( ɥ= D E(x9#Mi\_"r%*@U{0r$3: E*EnDGs rQ15(Sy x^ ]Aγ䑘ILzWU7׌x0D(k9.2\b}2ӷr  *Qك\DXVbT04_:@fPJXru>4%lN!f$N&ücuN`J;WcQ jl ʅ%T%*!i!$[Hj$`!)r,"~Swu#qs ?w0ܘvtn@ψ'_P@&|<؃8p_uOKnP&ȩ y91],z@ PNWTԆA4 s6* K j%TwK դrQ;g"XٔR+ҢEHUQqEbgtޡ|?ۡuGBB0nźk?KoP81(K,[6YyӶG /גqo񾄾E\bI|L{J.*Ȋt %߁sKpjI߁'E ^=U܁f_rKC7 W{ f %MLݱ.PvKs _ +- K^V܅M&q KL`AsĐ w{@檎,p{Ye/ރ4DOd,<.vT!eUH=Tvd1C/mPuRs .68}xjkȰg>pלW=-IZ.i0@RʻޠB:M%GF}WN'>ϏnYDg++ty.1_l{Ϸ]NfU=% $Tqi =Lr?q0s F&ƪK tpsG_.B'v=o_}=y)K0b?V/ Aibck722qF-Q7t,k/:%ϾS%<>M3Ka%E!gMz׮nXzX^}.eupGB\B]8 cM#y8,}ߪDeɒ@> 闭~1'bgR.q5[O`[mR;].?*ML1D+Q3nskoLP] s)#DeXŒƧpCś'!ҟpQ)DPs9i[_}&K}vg"FE"}W/&?t 0l_#L M] @nhsN` &.!Uw=R斈FcԾ%R uAi%7xhտyD{oTm[.NAjXKK q iqIktd\q$h~J%"Wux'Ã?SrDj R[Wj!>~+ roW$Ì têm<]GYFC묧o~s5 +v6p@dϠL3^S#hl n 1꺱 S P~y!%0Hr3Tw+r{H%` ͸A߸igνUi]~rP/ܭbLP?QϊX Ӿ!*Pq% g[w/k2RX z Ԇ>P859&D?t>{k08x*y-__^ÆQ~Q [}y,8h\C]o/C{7%Qn(-y{ OA^Ӛ7%rZ=JG\ѽv3h|4[uxy w-QK~--.Y-V/Kx L-2#Juo6š7Q5v)kxsy߂] la(- jpզukx03_lZ#&`B.E7PY9hXTW Rv]_Sqw_IERU]f> jl-Q|{*}1z쏆vb}u yXX9d5վJ )}=W3JȚW~?~JX4C#g+*?e -DϥwO6ZfݾU{wHjUÎYcS{j<~Mhw?u˃%n:Ow=g 7o#*lp]+.Tĸ% W3kl5Կr!pl8/ & y$ptQȥ X+F7F Pj$0'J{L6VKs* {t&rS#~S)Z}}kM0j}#6FnZ׻>I`qQsR;.@f3<D.#jZ^&I X44㕮G H[oܪ @)D%z( YEvJ`Q}SK o+ rH nwͬ' s%kܭ[@9ϮJ@ں 4}#?Q-75J;fIʍ%0%nuBRIw~ \vFN@s]Vr}5qg]؝3p} sO憻@(؃-j`5w =ra-s֟_{NnPrȶj6(jW|RAt+NŬ&:7Q . CUkDJ1oqHԦfWAˇ|ժ wJ1'˥Jؽ-0k!+!qmEz}~@b?"vv eŖb -OiaЎ'FYaŐk S-j. .xnrm;EQl*'Ȱ23]'f4ͭpbIM+oKߣVA2 _On(c(fdo^R}iXhٿM)5P V+S7"!bጂE$6glr@35XOnm5]lG횴lߌ (\ y"`]u+z,bwa^ͳ5"= wy?LBtW rW`#EL'#I g?ƹªP$/-N3߀d62]͌gJLFmVڡD'Qd :]\lcӫjE Q_QζGW PBЊr! %BU52}GrYxk'_ENeLWS2q5*A?\ChOaUfx MW ޑ:t=( ^jP޸*#~0ok+N7JLw"ZPztȰ|\ h OaYB9!) ɣңaq5a܆I~IjQ~L'}^?bL1ҝ'(Q VwH8ySx*|:9D}7s;eʥy#޲Aש$/f ʴoP,xU+(x}Xzm;)-w̮E}sX0h&\)6p#~ u-B?$[V$EՊo>TG!^).'CrIx/, :n b;(o: 7Rw,KM.mt͏‘+LF_$#,}9o.w+p_b q;v}FJE=yIQD]< QQHm#Ƹ-4$C x:l>)I{~ 330/;IذCe.u E&'x]⧒CN"7ڎ!Uiv#C6,g83\8+,}'`Xސl}7xR@^}ۃ{<~:{Љwx5"١{O5P/n;o`r<MR4 oḽli<ЗlB1d̬d~ g?xy ށ.)ƋɘK;e W<1 ^Tb[e&Ƅe =kG㱧&Wk/%=vKuyGu ;fKRPK$?*aXOljڑkHZ$W2/$Cꗰ-7Zn&ӭ]Λxޒ"'%\6rUN%ըآTR>Z+"kSޓwj$ǤRyH ]x}[w˅4h>utI C-W*{Zsk!QlB :>L94& #Q:e6NEܖqgMlkgS_p P%n] եʘ#xӭTDl =vpÒ#x|: }ȜRkFXsB-?ucۖc7'4>&=EQTjȾtj&4F fR6g(>-7UP's{bԯyHx2z!'`[~,,鋨!R:#VN=$?QW_$1ҼݒH% f0ibڎlGDŶPv kT'~'m'\9[s Y~P(K*Js@'\ g'횠^>s,]r N>x twH#;}2'-0u"8a= e =thL?‰i7>Ș B /F{C+o|pc s٠^uAuPM$&[8_ypm˛t8xkP}0f@Q@/H4 BF^X LWl_#8i8N k^917ݠ_8`y̐W!V{`<\%qC\8np?BvuaGqBmhi8Ƹ삅vPHĎߙQfi@-u_v>+xߢl8 >oF+R?ˮc-{8F+ρ3 %Xy%*hKބS7݃ssdž>}A!?b}C` ׅU!<tC_!vC fNMͩ!`!`>1FqBY|B4 Ӿ!sY!l+ `%u ť\ rOV0`$qP `(9 zabD0؄2aw0  `4/L ;>`83 zCn0(kr0 mAP6Z v>MP_ JcQ p2Biu5W§@X1@I+6>ZB& Ҷ—[[AVmMBVH j[:ff҃>gf`=v4CBx{?q?DCko7P|F?xdX~-)O-0eȓnW6奛fl\:|`x oxC7U76IMP" 7»agy`Y=6ܻ!f=^whuxw-\l>35'xjc.\%@Pfx-50}YW@@rHڼ~Y=7.5KPR/4wsW7~ŐoD}w~!86? at: 3頤9 zX)0Yc24̰1o&f[{7 ^Q>àu)(60@{Nʡ7PgzwaD3 *w&-xTa7G .{ΎBSCUSnQX=^RBgjkfT!,z':gebuku-.od"fX $]Ȝ!|=[xViK~$u( OW3+GbZYFdi%oϋԱLr3wBcgeL )g^Ţb uAL[P]1Rlua:>Oo#1LPG^J "qϐk$K ]&G:?1XAt.pPXg]UM0 c䅿"ȕz@oZ9.r_/AEt/ u( ŷ) s %E%*vg5n@Ľk,`:&'m.,|z+?1sCy, icO0nP'.țgR95x_] liɖ>4 Ϛg%8[YnLJFS[{q]mɸNx_?\MuC;n u0RfAI{Yw2ꥉ7l\C}yvȎZeAu*Iz͆:D2x[g uNxGḳR9^y\')$x_wIVLw4-DŬ`g\8dV'iH38ʰ>vFfuxd<=d^mLFx )Ϣ.`fU9TW'MfI:MJEd֬Rʓ7xnRv(7hUeP,-ߖ oIpcdžf\Hcڅ"2wΡNx_Qmla8o:<r"_}.0&Y> ~]rM8 q.i [ou28YG I`.J&p_C*M'o߭S9t5Vd﫴>vBZȸzkx'!hzp<ϑ>r8RSpxQ x_Sxxx_}i-@OϲΏX)Ƴ)08ccy8P 64gXN9D;w,>C ~diIdGQ& k0Ƶ>2A-VES]O[|tIY L(KakrUsʆUo)'?hmQQݵYIJ?#r٩YNk8X~Y| DuˁO|n>7&p|ln U5YZ f -&m<#Gc02]6,|"m+S˺t_6Sְ$C: {,3 CZS17 6)on,k؋v1|;cG)4[׃!Yx"+ Gh'ai) (D]- -{KXR'Fꨄ_H!Q\t^ؗYOByy8XͶ^tYcTqיͪ> C~IQ–[/wiInԐH\[{”@蛍W G\#wyW!{Bׇq]su#^r 77͟oeIDބݍ fp7cAN+1;s^ )㻓+wNN {t37zw@Hj To|yV˹kM AY&8>`ijryK֥ZteB"/kuL25]|m_uqǰ(Z6}WCL_vkzKkUӹvnB~'a;s4_)- 1s7zZNp+f ߭J9lV,ϻ59x[F4l۶s,*\s.^u G˴9%yXMjA熧i7 XQbK{?z8'ܾyNV ^p{a;ù+:2[F8u9;Y lZ?娡Lz%+mL`z6'4~6٪UG`J:q9-f5\Rw7pƤqW9=y N>a.sQOџ|۾܎ّ '49A7lG3DwÁSCc6qd/Yj46rC{x)iӼ&3ރ8gg! v>_mx]asOgmI&U1lz 8K.R8dW9/>"fOYP/E,uoqv| #(%5Kp=Ogn(ǟ1R}ҺRz-=mOϷNub)f/T*T葵9$Aq9wn;7~w]`4\ض; ݞ&_Xzwjpipƌ%Di5w܋;ǛvӶq\lIiż%?7MPCK \M?~IE(Bpe-VB!Kk!dV,RҹnfiQpo~3gA|ףzי}Μלkf+3 -=>.r[C!@-ƃOl |3G] Gv4z=5Br Tr>rФ = FvȽ!) `r CPQ{:ݫ:f ˽kGB^wv@ڱK:kNoe:o\ j/?LɍwɩircZfԁ)"?i1XǥOA)ԣ~ӕ^&ϼ^qs=|dy^3tSC!qYٱ#e=ɸh. /2Rk _Dvug:\iQ d۟g{mm^G5{F.Եb/-J=4zo `0wpB7<DۿOvy02vĪsLbȑA_hך># 4}v4ovrx#<60|/2fhF6~lӧtmu&xseL,l% W?ET҄W<9\{eO&ܐ`ګ-w bZ?Md\4߹fc& ϜC9rnVCNne@Eok[_CI5>pGKcԛ!W#S ө]!b͚aGVG"k3굦VAaIݷEnxL3D1/\gfhKlڙȕ+ 5ò B!WZOLh-^4p|iN3}QxBv'q/f0y6nŦ-_aT]6FN;fzE =\Nx?9nk1|R59pՕ/ͅ]uCZW#>y'ApM05GXU~;ertWnޟ{?Kft꒥bS|ֽlץbUΜ6U ?~&!U",wT[ 4V]!w] +U, }/gwX NjT\<9TWb1X<N;bS!mϋn}D=?7$U瞍r<+g>7N/>IȎ|%Ss'kyru$'QqJap}+Qgi~M4J3eZUp4f|vW>vQfV3Z㠉BFpFC8^Je< kj-g='XGzgX 4)rP6GMJ9'?a_kpRkI0m^/% Ds!R| SثJWR˕HOOͨ*4xvcK²N\pQ4 =Kdd EG7?2 蠬3= +4CQ)cT̩ϜFӳfDϜlIs?I!8ʇo0G|PYJQlytU9P됹|ڡ[Z=깂QdMaTx%'k%6H~gB٭YWvu 9nU{)t@2-P@EX-Dz̼LHU}w8'ނ+{2f.Crzh,G Tl{kuЙd2G)^Mff*OR,:m 趇VgŰΩ3~z,/zÂEefS}KÔ߹+"2Wq}.$Vb 6uJ$c 8:h+sa_wqʲ8l*'Sƽ w ȳڿ#&[\|"J=%ţڗ$q5̏;!Irɏx#0$R@3g*ɏkvk"\~\H׮q\I@z?nШfYkzh-h[H~03Ŷa+(rJuma$wh;ԮQ^|fޅ`nى$cb=l|)9IM}+0u滷8:mq{NLj~v_m͢`~sr|k|Y#(9G<ۚBi]m 3Y{bII .vɟslLǠ?$nOt5NHm?l_~~غZH1$1ӛɢg*pE$Q+=j@V$mz둱HShaI$pc~z)u%Q4͛$R{K"IQd1yWbd}FAiX=$otň\ :[C!A^]>#ﭥ|dɵ_]U َ!/H¬aa$wg:8dZޚ@jΝP^IA -ۗetnu+BP:?cRuҹVFw&8f;O@YiNp#g`8ˆQ>sN/xgsn?%K2:xōIVwmWo/Iѓsra㘃I_LN>{J8͟SU!i_ovdnmSc IdI07puھyOi߽zT{=[e&UT-ã)$bkK BZy'ڥQ[];*}ŒRps%?osl3{su%ńY&jA]}3vҽM'o>i4KM~H!\uhn|{Bڎ 谩GMSInAG^Ki=f+U^2izLoه~Kj`Kg{լ>NIu>AC:+L38|dI/>0`[R [@P=*%I]2653o=>)\4WhJ.L껷PkQ+J^hrRt]v#Ix3sOdgMhiKz329ZfxNڥH7>6Àj^-͠sIp$rBՏf|{swxx:y4=uw> !L, >' }Ƒ:vG]v LjB0&1ʳ%?G n N!/tzo:DFڢկ (ة/bv`W^Rc+,s?;F;{bxeId΍I0[w3ᤖ҃^bآU2)zů 6_" Ĝq[ԶTRũ8O :bA4<R,WyE ⠲AHrŐcD@:>5hO'Ͽkȿ$gܿ~hv Ʒ2oiw_p=?ڜ@/k)87]jPJB7vO?U<OsNQ9gVSF\2ѬQS 3hn4wE!jX&v\sI24ZO编6@(e I7ޥy =zm8l;6|ڔ0v*X;cSX|Ʋ{+Mn+t6cdl^v]!JUξljeKel=s%g˘xNxMxLxKxJxIxHxGoxF_xEOxD?xC/xBxAx@x?x>x=xB!7z7CƺsV1׍{2Gy[93hq<<TxV! !@WYn߇7p=clepe&f(.E=0wuAO$`JDMt]z֠d6ߪk+S$vrG O>p5v7|ɭީf S{9#hx_}*/>q ׺ wο~Ds_p+T+~c-+3nWfWx=q17H/rjW:Pìrm B7gFmh.QC3o/yM 5a_Sl)6_O凿bR[_bGϟi?/b/Rl}/žb_K_2<ņ'>ŦO%bKSlrx~~K<}k?~ȿ?mi~hx(b߿_/ž$J>_K?K_$/J֟d+Y%!~$'9~I_OK+Iߒ/+ŵ;{ B#{m -ok$NaN!~|#,3XՓ=7j_MgXbE>`|`jͤ?U`MGCKJ4"? R\40#iD{F3i5HYAj0xsj56ZLz[i=әӱ7Ύol`Sus- ]WbK y[F\{/...W\ˑ+w1Dv/"n/ ߡ?H\ύ8ܸ8čܸō8Ǎܸȍ8!wDž'o\:1DxJ"~J"}J"D)Q$ꇒ?J~)$%(+7Ε ϕ+7>Wn.\sǕC> ˥åO.\9rѿu$A"(?HHH/H?H<x~ |A#Gc<<)s=sg=\zmo.4exL[Vшc@IFQH]W ^OxuZ5\OUkrΐEÞEl^VڗnaV1NfdX?t-.>"גI!:޸E%FK'qhC#o%DWڢyZb[S}s%(nٝOr,yn潩'aKW}ڍz0s5Hތv+WO͟|t'Y{=:HY;@G+'|L0 %K>\?ƽyv&MD0֡oz'Ex7thN|b;&Sr%^0hnebFތf6 OEhhDRh&2ݽ,N3?ml7#̎4pe̐-EwDJ bH/ɸ϶PmXf4HeَRK U}Tdq4w;t*B=tX LW L?WLVLUtTL?TLLtL?տ~07CO}^~ZyZ`>޴,{L{o]["=dT%Hz!9x~kX *rik?E4tR$tWӧ]{`ƽDp-|_9o_zR]zAH{@KBeP:ۮ *zAڠv"bb<~V6ˎAr&=Dpl"xht\6M<˓gItv{YAE6"n E`߻m^F[zKEX#4A?mEx+ -B)]Dp3.# iqas&O_"(WJR7UTMy/w ˢk="m":n̚{fV1jK.z :/fTY!|hA>4Mu"yN ςܚ%r4 gΉC(uzQ7Y-C[\CYrD:(SMѥ]dU cO1<=>aI>`ƪM1sЁtm&tn>~mp͘{r2%3^4{(W#tJbE8g;-<[][~byol] ] u!]9TJ(BS^)ľ֗izjR^z ߅ +i>lj,O{z%ܑcSOpLz+p}3V}x^ZGoX9@ŚAmߗ;?>t?ݿ#*Hq>M$#nn#.OH`MuG(Z%^HcG<&3%PZc*;H`' L'$RH`凎"%pJ`YyG|,H$#HU t9)Ҏ(;!%p"%K%D5%?;Q'ÒߑX-ԟ )th-wD ^h75b;c Kg<lccNgѷg0}IV( eʦ(NzޮSQkLoLs^n^Hޮk *EGl6K#lBr!R P>'J|a!pSe6^O6y2$qBˣM)fleP|S'Mh:><5S8}1us }HߌȞj[Bu}>ԇA+gL}>< 74: b4誏oR=(<<`LX_Q\=ۢx*g44re! Q@0W 3&̃t 7D2;,5 P~n‘|8Z7ͱ*c jy&T?v2:s aOHGuTÐBȫS<:G6"~սCЧ`=>î*o>627p{O>ַ<ݺX=R{9oG?‚(>7,wieFOQY=O.Iacb7)J]>llL-ﶭ Ψ}\D@G5&捺s)|T2ܱ1"`I)fQMňgWJaGyGX3&" B`Nm(<<2ui"T?^-é2yjfh%_"{˪KßW 43>,9],()ئ'GjFt "˗lx#' Շ}Սƫ]3Tnjª0dPwi|i`iX= y|=%$!;q h]i}.IѺfu5FI+BPete#tՌk]?ʡ]lgO]\,Z?j|&.?f˳ﺳ;su;MwV;X_J֝%eo1pO0`sz6X?1p̷ 9:WI|FAPW`so7Aur꾀xCw]G)LEmܽn3пyOwϮXy?h6O91"s|5?6M ;/Nhn^k?o6zAE{G"Qw=8-LƏX=`Bqn>0ϹN0]dښC!gP'X8#/C]<ؙ0e7z3wmHF,voQ%X<-H PyxZ "`s-O,} vh6C?EBj(ᙟI"pctIT?^\*wϯ:1dMZX\S3uƱh|pUѐ~~.N^`447QhK/l Q [:< Fw~gVJ,\Wi2M;nz=yMCUS̐~<t }Igf"[h\lX"Z+:$AÇ4nٵ[Z̸VK{d(i-YASnc7>x277e#Ã?^(9 .[߀sn[y$ Ҏ7*S}$]-Ɯ+`[pg݌ ߞwOsOO}tp٘9dʟEƽ^Ç3_AC݋pogz`?}~/| Xwy _g,"ڋ,sB]}T =l@ 1W  B|N5*v!6uڻ[Lhҷ"h(?ߝ C:XLn?%NjIjŢLx߭QH25164 ZQٯ~> z:_ ^Ȃ],}ˠ']alo ;;``G *\#j-%K:N{~{/vDrGu;;pLGt*AQgmG 9vG\źѭ1#:" :[\KwĂtAG|QvDsz}G|1GG$ #wD<# v DG, -QsDG|x:"#yPp#tĒ~Ѯ<nvDMͩF&fg0F_oo"@HH+3T!ul䡘JyI@/sRT,9)Ƈd0cF)(m+?`|=fk ZxM[]lh?-f1i3/ Vxsq;,'PqRKB-j9tpׁ"A)P%MϚ9ÏVf`wCI%з$} oa3۠ג/Ca=plR ߕް'uX#[/w"}-_n@>O xT9=;fr>mQV6ax=zl[ \>s0i_xӿQ0}9 v|QzLGmDCޕa1"0ԳuWo,L^~`n7N*>+!o,x+rdw:Q3tN(CWE}GFRɖ[3շޭ[eAm%S ;P95ɋ)èyjPCܟS!IvoCk Cg~x{@pE}* *~s巨 L=Mz:uȰrO.S9w5b)ݨNZlR;ʦۭxq*p`Cj 5Kϩɶ{>:t'JwYY |/]'J|撖yNl6&;%z a,~VN?3&,Ī/ z%!Sw|.>_>zu0+ ']E\ o bo΅"ƒgGG9bݶp Z1>VS!=Z"6/3 #'XX$u_%kfCdGGf i[V΂g J,/syBҗ-\՜ V%g)~jL#go%>1#:'] eqݻ &}D$!#@#R܄0B84dO#:NBH[56zWٛIf2ԪoakM!uu{;5}/ HT>!MtH:tt<& ^%//v9Ӥd2ipץLo߿1F>uxh ((BKΆv1ޫrRrjkUf.R4 Phflʟ!şaI!`{߬B{c~}wT&T>DLj|;Bj'3ۻ-~MXnJ:?0L uҥԇk FI 7m!JDS,xT<fi|*2;Ҷ6=bq MOϨ{s5mL*S/k;wJR93Hr|v:QV쓼FLTRQ}=g ׊g~UH[VC{NEhȽF~W_T9Cak P}2W`0.epZk6-ܟ,dKANpnOUAУ{>4le=iEHJƚ\i5Tuq]^*& Jnm|P~K@AVڝOKgG*Ha/#{UZe.QOmي.dwGDېt/K_[𠊇J6UYB۟=QϏq SGdP׎;}g”fP| fs*ActK_भ ٱ)Q|(l9oK"ǤB 75A9:nUo~wU [QxM4K}! t?]A3>Zf6dQ@Wu|%6zuʪWD+{"[a@,ݹYJ%yIoԂmi#옭^Bl.@J3 c&ZtJ~8lPT eB>6#9 |>LKv|M>kǫ :%ΰMLL &Ƶ/phꡐQt|rWEY3,L٧Թ+6, ߛj>cN`6HNHƍ]t@ٳ+=]Pr7T>.Ys{7zVƾ>;1/QA+zxcSS[fqEEAzb6wF~jd%Ӑ;ST !^J(*VT**NzZmN7д 7(_YYޣJ"IZ)N \0GOB GbixA+f~MrlӁ)DBFuK ey6(ѥJC#M+b:K,1^>x>}LOlY%,A?[4_E?L2POun>[r$+ҖiôIzVPz@p,c9SyL/.5y\E5 o+%jh5N9_W+y<12Ln3qzu &pYڅy]BҦ1Քzn`7NY=]#Ujo|tc~*@9߯myeO|>%z# 072<ĘnkW>:ѸiE\ߏz~:?%z7?[PK*ŷ_mI%onLRأs)M_ m=QXdqYH#((_YEXo|otOgP Oc3yXh)`3ݦ`'SY dq+|h{g>`Enʬ&?gq'6}{XMA |Ns+{-f6n0U,v %=`88kʰX_]cew.ӞAgź˱?2d3AgAVȢ{_ G β{vڥƄϵ9p+MeB:era#k<'{8St'g#oLyJew !.`96ˠnF."L+W8eZbx󜧨|*n A3CI=ۗly?SϽ COw7Pw܍MǷ >+ռ{Ǿn,CE|JϞ(K 'MU޲'׫߃Bw͸=\=\Yh VJ૷+:]%Pdɨ2{EE?/ꍞ?tT)XgKj4^)Dg[2И0u5^/K{/lL\8ل*%r7L0&H|gڗf: v~ʵ+J4p2XSD"J}}.u67{v;R>FhL|tM9̇s6yPcvhs$) WɡFVԐN>B{73i(|` !5gҶ$fPы5w3kJ^{xTM?̓өΚ'_zAT]N&&((Y-2zjk=MXl/f){(e3%SKW4ndiݚPMo)o@!D?MYnOBχ첝Avrwj:'?Aa>jQ W{yGpg rGH _jxӘ# '"\b(1(-|VES{K ^qN@5r\n\2EYzi}=E:vt *a]I>,17^SwM5ۧ=qxe85+q0|S y"< Xwy,, Xwy,, ,X$X(,X$XtaYH(̺c`Qc`Q Ϻc`QЉug"@ug"@ug"@ug"@ug"@ug"w XJsADHCh[⳰1DL*2yƄ[3Уai=u\q5r=_J`#*k.w-\dk 5珊~D80c9?f )M4?;l ̰b*_|~d=: A+Q63@rEaW(м06ʃ^7yG9&~m'd/믃ecׯE(N}̶@9U ==o-iG!}Zز kew$cx~S! 56Q>T66.9 ҭpoځ2r^ Pgo-v*}8~J;Tt N?$5*f-8'+ai ; WyQ{TYs^t]cq/IKQtAkdpw|OÈsmS|\)"nƆfaMԑHn ;1thow^E{U\9w/b"h\6VQ o|]cοG;"O[ ٭n/~,slBI*^xS巆fguj^Z[kO] TR èy^pc{&DXAaTу0-SM v7)<qu34q}vҪU ՒKpNt!z 帿9qA$LWs|΍WmE+Qcw!9mԍ\5ح4qqyvJm#3%{G:,M:dX,2}3e~?cE}W>BztvJcZ7SקNS,e:o,z}t%JO/]ׂ̍uX3jw#u=o*'#A B#ȭnJzX^tKu{p&[eZv0xL QNd}6?DGjϢ58ʎ&ǜ1Cc}ch@lvXӻZj_͈;Sqz>kz>q~ZC}rxx 6A=U" rT(mza}~yn#q~ 察RwwtD+܆sq!-^yHN?F˨#o_9MO`CU{g~b5gx>b#hƆkKKa7N]oA[mU'=k寧I>< );+&j ~vDQFa ;X̣)0o`7ٔ`mFEeOjkK3. +6JO8c IjOFbJMaևty7C=l1y 0Ѣ~C&vFm%&O$#&甤чHAr.I*>@ |T!$&vN'xo'$o#[I-NRfDN荤|)'8I*^G񤜤ⵤ| iI*#X8IWRNRq4GJ'x)_NI*^F-%%NRb_D I9I\BڑT<'x.))'xi7g8I3 8I'INaNR%$'HNRqx4:!$&Q'T<r F?T<PRN!܏#)OEQI=TakP9TSYA}I(I~{WShW!Û#}:ǥ4#=fĶA54:_4@@[~.z+z}GX2>Lk\pD*؂(}sHPE#\A>U0lCWc~N7:?TXԠVϯTZpyj/Q UDs:!iI$S 0:B6σ,Rl*Qˈ^]-JFVdzoqw:"ًDfᳶ̿kҋZm+ou'V?ljuVbX'pyf; eHVDv`ax8%;T~.V١p<+PS29W6fq'm6I}o5jq K8': z۳&87_Ƥ;R${G^3]ݶٶvw5u ;p(jUq~k{|HexR-OoSB{P,ض+o.#`cukb\߮=w/K\&`і1A<k:_7ۻ)p{4Ijsi<-5)8%XYϻuqvo=L W!C#؜Wlw%n[je{O>cg_)[ }6_[a@spoV>皃 ?TA p 9\-@Ͳ^g[=y_Զ87+2\sAюތ6{"5/<ez!]n.aN cߋ`z_H2vprG@KuNxґ[ug0Z8rO7 c07sy~Q BdGoorh ӝ¿zTξq.C]||]\{ܵ$v5tsisCC%a|hWtѭ@TK[< ZR txK&|yVK\]>ܧwkP8cyd;54>s[)ӛ?Q=Yу聢أ'n\\Ai۽;O֋\Aw&5G?HGh݀r~^:0840?ht>U/_dc1}n/n6$ {D EUSZ&7Lo #u; Xt#;/6 XdK΃hϑ>V7wD3tK3f >?T2drgkcA7(=)~o7wGHR`;-m>>Ӷ[O_ߔ[wܐ&tIq"{I7}{}jdc#gQ5zI< kB+n6/ڹ }U)~CuoLOK>o7Q=lLw;4ޮ(SFjdW_ܽ(lИn!L$/vnLw1<^_i{gE*mO_,GQQ/7]oJkrg,C+PG9-tt5z;Q E9zhGz)7Q^-'̍/ C(,2{#N},qG_d/6=?\t{:+n!5FV9'ևkD{pC0~mhbY&%>?`Cw[ݩvp5,`CX睍ؾ:;ךnSwk:rUk1K`Mn9mrrsg6#{0UeEwv9k5V= 3^і𛏳/Yҍryb9y4>ϧW->~٣)a ih;K}{o@otah@+-h@7w1zsi>GǥMڱ3~9>Ӻ8ϩt+dzk,R:Ti-];5Vqڜ\0sCޟ=5}o7y'Ϲ\:g7gS>Gqia5&ڢ/Kdl$~b7 95ʔR?qAΦ ۡBڄ>!SˋLhfocnTmex@1zx%aڶ*x)k=Ww)=@^MȺ׉R@==‡VnuGZF=P>\S]ӷ@r <oZF80cF̾c~(_OUL1(cvߏ"}RTJCɶmVU\?Y S ]\ȺNS2ehӿ2eA~-FS.}wnؾL_\Rծ/6_(V,oQVJsF[Qu#*| kJ΃}=q:}rfSa*eӛS+^Opg+ʰfx>z_J+ F]~IҿD_l?D4KEtzFW~vYqd?9鋚9ITq^} ALnBFxu &K!^\=Q(+}Ga&!OĜaB0MrZ&8-e6+Ȭ;Q]q 6A=nmW:Ku}H=6_K#y8K߳h7ybci;'\ _w"0㑫`RNl '㹱y׋EYGRqSSs8N5>e&;s7)80`kijp{ΊMCc[{0,s?,GKKcHb] uc0fb;|0F/2潟4`'^l( ,b s}˿3Ogx®Yk*˹>]G̔c!=c[",:9V` 4br!cc튈,g֗w0a~E9CS^[ ϔ.W~q}m넎ѧU%25c=SS o8dbljo]K%ao41 6ܥ{A~`)mKؔI_e>/l*LKƟxV5.őv qnJ ݪ&-7f-ܨ`VwR.V79:׽Lx}6uǓF .N d6vA!ڤWψi1LH|T#ljY*pO[l+ղ- { (I~8Nr Ył?S.dkrf~a)m*Viq2Zʙح#+W@jwp˱kՃ($1vrttd▨]:61iS輋eQXE7ugu9xFHrrIk&sFV;fOZ|['N)Nj>Tw$Zgǧ\+{Ůu٩*@KKC [XT]~&VttSfxs^~8Jiɳ} 6bRæ)8)<}dĵX>aŝE+A6XI+Q;7hr!ԹMV9/X8 ݞ: ٢iO*pgΊ] 8'^OoKɷ]kmҫKK2)U cև;7oTQbvh0rB; j6zW{8P5xeB$Eߐw C׮۫`=5zRPC]ڍɬٯ`UK3|V |>.;ܩݯ`h bK3a'5mY^/=$NQ _~z>o 85Oqy9]S*%ten o(rǨ]d@/^Eq5oMZ(n߼e~l^㞛|^%)Ko&hs?-7)8Gۥ3(׽V ١pqЋB6n̸a?I7Amv1m/P0q{G eSG. VwZ?,dlu~EѴ ~ӶKU0qGW6Ww=>vhSPg~.rezРyFL%=hX(5¢y;$g%SKtտ;$yشu 9o)hĵ nߠg ~} S&C!Ol(l闂].%|[gK~WɌe*9n~ 9V]C7sk8o_WwLܸ؝F.c)D}NFpoېrs`S!8c(&5p g7 G y`AX>i5>{5;G}y0˔dyp ՖttPd MDobGx͟ooW=H|#GSx"+t+)] _;(KHd )āLK*" #Mzk˗|wBǵd~t6`{AFwfFNq/9s`Ez @ٻ`}-~Nz`eepq-: Μ~9Qf;B0Nb<ʄO)*|ӏe5g0XTHя$DNtkⵡ/̖00ѳ$1#L'ȕ!84<]4\&wohUkLkbdGH삾33 챯.aRCF}όwMqz?3>tnZnrܑ"jۊu$|$8fp< Vx}S|(xP<<a?s TWxɏ:$_sq`Tu/Hp8 6$8̬Z3Y`>Ib.@)!>H;-ܟ( W>ōۉ[(k6uzʓU.GE` xc>K}׭Ja;DFi:x@o9@ ҫ&_Թi}ů ڧ*Os-خsFi*9@we}@M7DPV/,gsbc@;m^&[ )~`yǨ,@98_k ^*wnK@owsH>u5ME;=ni.vy2Stq>2Jԣ~py_T{iJA7y":>49Oο})}JS7\.{BSR `Z8M]Lg0?yj#f@ASbmfSi(e5.My_pTh4:5 ѷ˙|VN'O{&7;Th[*i*r>s]ׅߺHSn7朆ӷ. &p^eR:/~V>̽cޖw:kUdϩ@Ixo`/7 WzP 6Ys>L=SKApӿ\++u.,[W\tSz9RX fAݞOF}cb0֌{E`֚#SS^N,)>݂v{m !'7yz]`tSF^7ŕޅ o}Bq"[_\YKN jܭlSӾ9 R3.<~N/}i䚊 ¢b䟁bB3Oo6›fN69\t0=r\82>>V};%4wU*\_dZ~ď!?::Ip}tAĶ!n/[N ~U'ZPpkZT5uD}/-xJ3-Z}nG>|w5}8_k=$:%x& S31BG:Ox4s!0L|R~mfݰGz'X{1ykXI˄Lt^srŖcW7/ q.}<ÙNTC|†pqGGFl|΃!N'UG}?߇3q3%cZˍ𩵒6㙩X)] d.@|2OL NM{rѭ&C2KoUٮg7tub;Wў9)Xx {-¤4f'c[8m~i'ؿRᶙ-Wx y;N34Z0.3[O[mEM?;!qѸ 'GYߧ95p/DZL7}ٵdr]#W~Em6~q\o2׬C6"`^:w%t{83ry$18~k<<bt>7I{Wx@C{6$0V%?Ӟ&zƧzOzOzG&G׳4?P_P?P_7߸=M & ?M_iG)?MoM7}&GXSs~ir~ ?MοQF&W_7?/?Oc_co3o?Ϗ11>?o?15׷h1~cH1 ={*bʫ|Dxtu`\NMf$G4Ͽ|'192)9rn&$.*U8u &:ErJH 퍫e?.Hty$K.,91^oȵ"T~8 +fLOSghѓHĻ\D<#Aۘ|,`7gX~%?|,c/'Y~U6ezl;_vv\vyf~\cFFFO6Z?m~i#FCmwv,]7۞]7?nv|vugͮ]7l=/;;.;v^iߞ/C-: 'a=aF6|І9=t܋ɧKל`U6< nH5Eq˥rU!FHߠ5de7SQGֹgaq a" en9Z#eGkCyT8&5*u|;@Up#f/Y|t\}>lXq-pC + /'2qPxݳ醻Ap1yߤ^ B2u27+SGh[3zӠ4!_bN@YcچV{j5 x!c`v␓3ɭc nȟuܸo7Xj[ V ^-I6) gL끓}U6o|- g('wN!l\懰b5xޞ5Ⱥn2vx%ps a3M!nfepĥԷ[62֦m_v]rM>L_|XlVvrޙ}Gz_NOutKp1j;`tl`y7rQ8]Ƒρ}%-axr-uNzݾDϐ} Vj>ԝJ|a }t"ǿ7cH{_w*ƴ g;(7&w/X 8(M|^**G68|t)ȼ{"hߺեRr߭Jժ,2x g7bXy}wh^['{[1__;dذ |[c_|wa@}cc+vR$ǾU7ڎQ:;q uԂӬ5Ͻ(k溅m&~0gŌ9x̿Q,IfoS>.lf/U>O|޴y}?"dԐ?6kl^nb4ݱ?迆bk+vv׃Ι;XbCo$?*?zrI.o{FɵtǞ;غL4rkV 2+_L-'_4u__HUC\rEq޷~toCFN~{@U}0ݬd}xRKC|Zl]'+1k(- uqz0_eQ>zG7w^{=u ׾߻//}`0UF+nd2AbUU=/vy6פ+^KoE<{5Lg)6^,Z$ڸ[zc-}z[tƴײ>⼦0۹"Os|99k%s- ^`g`{%릏isYחR9'V&]zϠ&VmtQUg|5*x\90_2)wLh{xi{nؙʯKw<٧n%4;w0unǔgD:e`g#*;:$ƙGH sę,uRĭ΀OwJQ5̷*~gC+U1V9TVf)=FEbۀ'ʷY-#z6E?#idݫE ;#RMf;ISpݾ!&Զ8e'w%uOWCuḼ_kLߔ66FQm>3H1_In^ ֘ |%#^,v߲Fzܟ_+ ~E~A=z ~oߜ_9+"s~Ez/ w "CD>z胈P}>> ~CEz诈_P ꡿__o7Po"@= ;F#?DD~>|~#"z3@=g 3"~#pU=ȿz_UȿV%7t=t=z DDho4z7ooD?D?яi4яzc@@]&Mt=?M;t=wz;4whbξCgog4hb?뱟~Fc?L;OҿO>Ic}>I$]}&I/`x̼H*3 ]>u -z>.˾W&=|ϊiA5} }r wb=W 5  G_aMwt!Q_yۍʂsƦ;^>;c+ڌum^>Ϟ{Ϟs־ݾpnwNo|}RE6KX{6KX5K~ e{w֮sN[8K`fkekek?y[Nw.so]ss'oW~5cX(+sn vMVc혬-א%ʕcYAn%DJȚϱ4kdw묝|X=ϱz kcfKXoƞO݌X;v1>F:ؙXgz*kbR^eCI?2V_fL~ڕX}#oOe. Xk`=7c|||||~~~~1~~F 9?0>?< 30:<0_~E;0ﻑQ1a0#zHCڈ!gڈ>F6Ϭb/h#~A ژ_mĿh#E/V7⧴?)mOYۈF61gb#y67h#y67߳]rx1r7"?ax~|&f~$4rd/OZ[!?J+ψGyh ]h k پ5l{zܑ/ {rkH#\#_ȑG77 I$f^*qhJ$D@]8%<"N%mYk>V( lVjc|@'AZ3ލ+G--PuG݈/f \7;{]qoM3J,/ꥯUP&}&i @K*˨hxRX1B>F^!ZeCy!!+w\v}n"_Q㯜"}kKqTc` Um`ǸRWV]kK (IG* (G-䐝%`"!!I9>D?kN^-a>A^&+H}XHH X"ɾj9e=z?~Li~RW*_3Wǔfg=F}6z$mN ,؍&K>WHG 2lYTyZfx,Q䱴A&v RRpK4߷]텷]vʌ8#ۻm ŘeKۨ`Oetoܧ~K)Iio?ޓ h?Jo6j9<aƑ ر.Ohw- au(i2!O @l{戰{@duA"K5%+*<$5f8P.% o~ ?6e|i3/UDA\-Dj\j..@VH(w2SڜTl+Z^ ɋKQ|WUS!I]KM,~ID,Mh PWpe|>]bUk)[ݨ wkWr^D6AǕM>)Ә԰5,P D#dZﻁܛ\a"hᚁ IO2u_& C#Fx?hgx]?Y?BBvCLөr_pg.᝺b,Npj" 5YJʲU"b.h9 u/$e)S]  $p&y1P^"{A9A*wBlZT+GP(Ԇ(='jzp?@䄋ikzG\X`3?E¥/dy&pM9#Gnrgrgqb>Gnؓʭ^T$ p /i0h|F6UUOaV \`mrr_h23F@Hũ$!y *6@%@{X:VuC/P; $Puv{Y"Bfzp: QgR}!FL}UJ$}M&,g,$ThP?k~XZ{68K8̰$ֶ3Zam׾3S2_G"hg†!pcB .q @A~nW" O\(U-CA)CA^"iIr(4l,JN 5"ܑX%)mS)t$BX3hf)&tf~,!&q>4ʗoDAao܎h!ĘEsqXFhULW/x^ K+tvF<7R+h1' BB~ >G 1VRԑ=? e((-iw$c:񡄡Z~fq#a˞%=g7Sy .^ru['$#y|OT5L45 PT+u ҕBĺ/ R-qL {x>pFL3gɟ?v:g;o? "š ^i|Ƽcyz?0H',,UZ7A&ΏFk#1҂KY%渤ddRFViŏ>[aGg/[qs c $ Tl/- jQypr([rYZ• Lݑ>Ͳy3Y%i7D";L@jMQԼ-UH)؄B5-X;~ HR` ڥ?>yct3dy eSκ Y t"q"9@H=a%|2Fdo!&Kי3 Lk(/d`>̴ێE:31hba[%+U/j%Ó/ntp<j% OHwޘA6` |OVt8-r ߰?4tU4UX^GGS{?)Her_?I?I?~!ju4wu^*sೄɀ0MG[П#ZK!n`'n$s4f:kCfh=~=xIM(| s97 7UHtBmLh$1UH4B2!~&AFo|xm3~lK9!HZlO%s8럇*8sX .UP %5+e[0Kz6BΉ[%Ѐ(tP!W綀T5j%̫?ZVG57C'u ^irRbpǍ%qsQ3`J#>J2r#5Nc_'K7Aj_+K A]f0wī%-8rƲ7:kYY:Wg&Y>44 Iv|,SH/Lc HPtMesHH""aw,/5AiS]`-tMY9^#[${T3Lc왪Pgqgek9% 4w;^j M$eM @S`øD<r1@ ~rP>.nVXȎH|:5h$ dΐ-Iy9 OT}pQQ+OB}i";g'Wk n 鬘)cn ?1|k}s"~ؑc)/ L(4627 #ZsH< 7 n:8_Bꬥֈ%ߩlyd8YC3wJ+b^2Ffj_QgMI>4l|=C3tb;`o74kdoCC^"û.+P ]}' [%+7QW: H̀"Na%"]  ;晙rvD^ǫ5,a*NBFlW#f0sѦ~_^K>R׌)YQJQCB{DvFD>mpތ N"s lZ[QGgWCXgx 4p8T`(-dĬ@_t>ʵ55^ʣH(ygJqR]iT eTZ\rv:V\MɆ& U 71c*RJPvk( +F9iIdj*Y9Pec2Uc$'TupLJrB4/`wU򫢂fƃ'E1Z8tYӏ}{81}4i1;I&@WjBys?uBiR&n SLS9U&4/=m٘B_Gsy{_\=_mޫ "Ǻ5 qK >2=|ϘJ-Hcֻ Ӓ4)%ZXx&n. =!ܿ3彺*Fml[f#hzKf &%T? T@ia# &Bi3>+?vSaoE^7BF1 \{HGv1\" WyW&3&g#ÖurZdpk鬗eh!:(JbNhaniYm Ca |j!Uea6$$SQ:2CK] tT3 &@@Ѐv"D a*֕L+hgw+׶+ҿ(Dڪahpc`Jd3w&\k{zν{}{ѲIh?BLzDvM9>R™~Kyf_ziֲǫԡQ}Ԗ񲽏ECN ƽg6{oj0_Τ l?i`[-f0NV݄?VA~ȥeL&{7"Mnh$;*0\')fp]:q*zž8|A0K'AFbD'KGU"Ai)43oz]i2vmvnWNm&,e;wgItnA:[pnُ>5z1oNmr;`/^€=ޫ [Ͼk+wk!io _dMF,=UNԱ>AC:Xt1`[,L>K.]]py۩>AH=>_YxUzS?FuJ{0Q^vN6ê g4zH+I;>_tHY/<g=HpR S-:l3$jK[z=rmQ.kC/|<&p_Vy8(rS^@$Z2s%RK#XO$wz) kvBNUUs"Hߩdr ,!׻nb&ICdFӪiUuK@+xk2U׾; >6IA¸ (lVra pdݢ3#(ZC~k䚙7<06g7G;7#çB)rq՛a"J]^8Kc8#HjFiz{6{1xyصLv+%&n7VIֈ6Ael7QT8D&q$ZKrD^>36] /:?iާU06Y"zE&yj Z@W 0bolonڬQt_zψiC+ѷ8g1S#ѝ?n%T{cRt+xVѥag3LuކVj6moSjϭԳ9!B( c7=#爂Hv .ew'mƅa| 5V4Pm *U8W|@S} ؠ+v0ݡQ,ETwPm! Q#PILP?Jȫ꠆4m-X[}4IHqO1?2,^o@9x(B͠ҹ5ߵPq;|>ݣU~\3XcۥZ-yLvd<ܶ<U96{$2 ݍ=# T #pwljm\{=J2/b"SQ7`8U[gshGjCL""m*ob5o)sB'hp 1 a WU31c;Uo'Lm+MlZZ?+Z?VjN4'|FpYiFRRWZvѢ-֔ed(s1O:|+~򷮃)ٵ!Vw) JEBlYIt9ÉDn%Q/WQ4x>ԁV9l iKD &'X C&Vb؃*>l24<:C K_]LKRqgf{ `3vgdDE~Zq&Vc~ ^> #Gӧ]i]8o}!Yj`_[Dtl򜣫7ԕdzkY9!>6\6ak!w tpOF"f< ʃoJs*7{m 4ߦæ$h7Qy=I/XiGJY ^ OO4o%ϭA6KljM_9>Z< d4HxC 'phM4H{5?&iGJ?Yp.h UiM8kt8wO햰yӗ o?;ȇp 4= pEHA4rWoJrQ?yn O-9\AvV/7Dzl#iY-/M ^_.WcE>:ɥ$e)eE n.Lfx,"xp/ȣ1{_&"ƾ_23i $ſֳ5 ~7ks[+)|U(nEcR3BK]oc!к=["@)jTԗ@lVeJ<0SiR2h (:*/J\re-Dg"d3`,dXCIg)v%$xnY +D& IHRѹRUtg`6A+|=8 lsY^tBy]GKXm|O# m٦&v|"o|u{StS }5?N,-ƌm{|ht2t+d(U+s{wk`9`B0t`ɓW^n$z{%*") Vl󊛞WnOcE?2pJʀ#d qp~l9qϰ!p(^03l>'Vm6%tJ8橻اk>"qd7O?lEre8.rXȧ磇Y]yls"06ʞz꩎E)<ͷ`? ׌r'yϤ#Ex>or7,x>,N9kRKvݿ^kƜק!qX{W+JG$ezEI<9b LBQP4=;WL,(r8g9mAUϯP5CFb U g%ά0a+F4F#_&NK3lI=0vԬƺT .ap|EKߕC3bLHf"p1"jqT㠺K9"=.$!--绒S:NVPNCF|]. RUC<#V+ rۂ49de88CB NjT=<HNr+#s}UUAfV^"AeTDD ϯ1;/4LMa;`im꫟ 9`bLM]z xyxa7n7>>ڲiٍOLc7]s c0_/qfC'ma<~DvK;+OakY#j+mlltbHZ37@\K$NtUWAW -  ?%X!ޭ#DLljMeXx%cdh0%^|OzZwW>Z\Wa7=1Uc0SKc\*cس:N?Kr˶9Nq1汥}ECO ?ue7+۷뎜b~6+8޳5}UUTJCm(P5A{9+AV4ܣ/&h0\|<8K\2s|V:@venvO4hG+w]6-+e  J \)]!Azi}!b?(}5(կ1 KX7LK"#&W308ׯ␹CwWjhhw;E⽉q|07qi8*RM*SRzDv˄;8,XׁJ+ˍ>\Y91S/Yih lh%pwB0\߭%`UUqa$Bep!5᱘MdvP5n J܀rDgo?&A)/cezl.GBSԲ=X樂ip߂m1d˓/<߫P(G`ҫ^pڋGρqyd4t* :pnB_CCņ0z9V G[hXSݵ]2'$V@%dѝğ&G3&5D՟3Q{@Q- VE볅`{#VoXrs.$N8Y_8=krMw2Z6Z^rž5beJu HA+WWd4'- Xl >^Un@(^-X(- <D:uB)됃I,XJ}ikc-==g݉Ե%`]9(>B5!hw*[ :}Ef\)z%:lѕHm1qOo|G:e*q.p%9iu/p0^id}xMZD%bh,, 6MX󦤇"Q4OSa6)˂FR {.Z;Hbz0.(\[(O6 feH a-diW٬>+zg {\1o9l2̘T&s+Ξ<Φ,~KfG$W LS)V<`Wy"Jr)Id۾(iC}/6e{P6a%Sxs0{P|m #CBq&/BB?2 [b&uP`kP!=j o)pڻJoxtGJiǰ v‡3F@Enŗ:Vg%ZV O|> VZHMzb,;`6+7ձ*D= &oV妔U*8$#ٔiXr=s 8e'(\F3wK_Sva߅x W6 E1 nSKv|$QJN@1 .I$IBv e>ELڨ s7lisJLI&kXwbi'ˋ5#޶G;ɓn #.[е˺2y(een|"(A.Z$'AH)91 hv׏;a.}ő};`t\%{[Xjϕ+A9vE/DnV@*(PQAT4ir-XdA\ŽӬS+2ӱsܡTcZ.̥OJڿ25"u}Bg->RLSa=[xq[JNy)'\.#s$Ol'[G^\:n`Ѐ[_+X>O 3)w~ Nn#9RQ"{ ZT $jfmOl>l+ z5\EW55aZ[Bh>$%,_/m]Q腉^1e0IW|XcW0j~&{ 5:AwkN>آMcC޽ 6ZIƐOG%=??0ё)/L8e#Ho`934U|.~HG:#uM9fƊ6,49beլDAy`[$Č: PGTu?GF ؙnAJ+p3|z%Y?X?5JjhY@V d~%vDt 7ZEV9&ISQ/E?R$~~" L-Y,ިXȴH"#$9XrDr/:|Ca67 a--O]Q7 [hvZ@b޷XqaW~@'={X(jlYiUE. QP5٢&dC]-):;m, (*wKՁUdq `ؗٿoj>t{F3J3(we`e®e 曔H 2FvɗM,S8?PI&Gf l&%=R-8[<`?:i5j?O&o?^\Mi&oydؼ+goBHNcDR-MA :#]+D,.Fe)_NS>ijjr>0WI҈?{B(a$s~9VF]vX'*7Y4ŷUg(J{*#~0WPZ>F9d .0ܦU -S C(J?cvFCSyGUw9[^_gɜtJ⤾%'SK!qҩC 't?l;#|At[W7ʜԵ񶝉߫_ɜtLFFv'6^ګdt ށ^d@Qcf͜D6[[5uJW3dLsgjS IP:RR+$8}L;D8<ғi0"8jeͣTYam꽐++R:i 0ҬQRkYOhO;O`^H>t׃:e)ۖym2_-m;3D!oHx"2u"po^laX 0Sck^[hɎpzX~ -2`5WCA9jA w8+cӬz /pOm{G`#3HrgT(Xeբ7Җ@WY1 p]6+e9lf)*TsmCʿ;gۈfSUE5IjA IQ+t_J;Wջ_R5q474 -|5%sMfW+ɓbg;Kljc<_Z׻8l䛺IԒK^ғN+Rw JV< ƃ7ǐ;PCzZ vUbpaPK187"w(0"Zz~eXAS 1- 8ro>EO?*ɐ_h$z_Y^,(hX)IԂ@t88eЋ2"|2i Ld:{>U=#E A+0]c8fѻwQS 91^5qn/mQ4yXEJ5+D[r@X' ˳DX9- 0m@Te^h*`3!O_X3| OliSߤi'bA0Y2G C?C삍 Gl@H}"բBPo{ m/:`(";`EKS;J$aՖD؂@қήᨒ1!{&fa`6_KC!C@y~]y}R{0nG^gB^U$O$ׄDyl?&kǣ&j%Ebs Eې[$v,R](B{V$vbRs#H6r3.Rw:}[/`|ء0^a #/oٲ;}":xxr.7e+Lwž15|k/][%ȼl P և+2d5$HZZ,݀-|VfsnlI1ke v [#e/^H5^Wgk ;kK; +`B'tVVj]EP([Vd֡EڤНqq[/UjU (JaL<;ZW.[H)y֝"[ S@fFCŴ xYs@wS,ʝVRQXPRN|YW9o@Z#K%i< mzZʃ?In'Х_tJIϮ"oIUS R"s!d{[Qo.s}ݰ@8k"a6;KRS '*H_SFH7C_+o6Jjix} H#Ih|;\& _Zom (? !>p5t);٘#v.wvq>i߅3"3ץ6R.\%eѯs›ޒNX/DI|b +`%Std5C$ ʹQ̫.k_ )nσ#mS.Y5A W2QMKbrt37='`Iɣs׽?%\wVd}:nRWOwb~Ovҿ:gЁ'JSW[sy~=q'4q!wKo/wO8k ݲl6ԇ: m32f,z7. o^JΕs\:!ğT#l:Ji NF]s>נlgt ݝY: kVsZr}oC``.`bαퟻ `6|u9iK|]ރZ2C .Tf2^Z,G ^!u+DI+zos⾽1w0VFk2'0/A~ a/ǯ&<1, Cfg8F11MAc4aB_S'뒾e=4ދ/ 'sA\'ܕy`Wk̟I~TwVﱀQ`d;n b+DyѴjd$H?`,bVVhUtCe|~ "Ucq.~Y:23#fܘUg 7{mUܓow- Gʇ( /fb{1 W4of{՜jD_.!{FJ޸v\9)W6㖿1԰Ŋ8kTϠׇNn4iɮ?)]?d<|>`aQ 5VR VZ"?'_mTDžh{E{z*ጽ~pԏׯ7]ׯ.P.5X{@U*T6OJ՘;)rZi` lM*Е/` @{_5睘Ops~7ݜ/T/gKuG߈t| Z1r2LT/gY+B0 h납</ӐoE<ދza&0A,c|2wW%-}쉙]XҐ; X$({)K!Pu{ytl/˽ >n{@|+h]Z \5ݠAikvmeC֒}5ͧEO7CK]\Tն`GɸhIJQ?ebCʯ FZntq~SYUʢɐ%$sӘtb^ksXy0Y{kﵿk^{n{~hn/k{,,G&Q~ re u§wuy1 ڲ7N=>1lgX qLbm=hddpvu.Vk뛜!0I㈡f8*ju {IԔM b4? Yq;%: A':1[ {Is>"\KN;@'R'D# 6 ye91!JD ZȩM+}u/X} XG!5ɈxLepn2N{ lzS :76_81]v 4Ł9h ѽ}ph ka92^_P)b]^Mu¥y=9_Ԕ XX֏ tp>M|x{n-,ۀU?mM'g͢X.1h7ӟ4Q3dFiIbp{T#ɕ?;hpi&SYB0Q~7I6᎐[$JUxӶ\ӯsbk~s&0B9yj/a1K9 s*.9_ s*~=UӊRhn (Ց{*|GP($,@F˂n1r{*լFO]iP3es@ *8K3V&] ܊c?-x'o);GF.CKT=EkRoFPa8kԠvIqCDfL4 =(C!e7T.Px4dh:ﴦQcbnR08xv &g@3iaNs%ٚIYGepgıztSi:Z|oN0L(gP+d:U %E  \UrQvCu2{9=Rp9줢!%1ܩ4+hBwB2x}ѐyG&S.S2AuTa3:Zʙ$&c"f UE =褖pOGG-Gbx/4ǜ<2Jn>3eqMyMHwkm IݸgYԴʊCINiV C߸YYI&8L= i?Li iX\mQOq|ʁV1\eз֚J5}v";Ɯgf9xb)?8]5Q Z2zʽ5p:ӖmǮxx;2m' 0غl*ۇLLe:vlu.Ƅ:*JI" xG|fu2#6LnNgg$oY%0w0sG@uI8+njϪ!Yռ1rFƾ;2یՔD@ D=;="Fo4uDC~w0Bx^[6}3ڲ|Ac5̀gej]6Z-X_ToM aDcD~eb]~G2])hW7)_ N3.Hf+0c K6ElcXXAa  %Ux坨d=V%b%-Do'I_wvaZd[B] O DIq,\[=JF8-;  $HA7 |0wl9Y8$4 8N_mN. E#NW2,=pz 4tuL%c8=qzp!GIz0N>pbk~5\Nsai&(\3XW }&BL\B`.9$E<>KRDfxO$Pb%.@[霕@!|?Θ4. DJ|6`|l"" i/O!.鯺D!| ›DBA ƒ(*"C ›$o5wAT鄇H'F,p%ԎKf`N$Ԃ89LbZcGg%3vRFNzdX&ox:Ofr+wK #{Lxx#I4-ta% %HN/:޻ͺ,g<>Auƹw8팧Δ;gĞ v@U@BhK-xAQt:f)aA:in^ K`> ):Y &Ϥɗs 0H1Gv i=\5Ћad"#݁Q<6U0/v0cg SApazm> N̓f+=Ų'Zg">1݁|9r?f3&L\8~"Xw՛*RN,]2V%VnhWV1f: `M`YaѶ&wRQ$l9+Oﳕu&uѴ 3|K 5,WC g0p+*3 ƃI,r8v L=׺=آ|['vޙxAHh!ߖI>pz :e𳴄žz(DzumK?W;lPn7Ĵ6g9/;*8g/gNm8=WE c݃S3*xaw{ wgevq7A<_K|p!& GzzܩsNM'O@5UQ tcv寞VC5햴=Uw|z- } Hk.׍u;M|kˢ7{0յ@ȩ;w[ˑ>izЏнЗҸ+}CXy>'V(oZQ7WFUaM'|?ꑿEkT~;f&}*=` :_Ԏ'cM}iwvd<9?7/"_(s(sÀ>6d]o~M +x[_Zlx%~W 4)Jƿ &l#晼/} G8B꒪%@ٱ/ypLb~ГE _K~uO> 57Ƿ X-ڞm@dֿ1aʧ0OA~P/xyg*P>_tO;ziqzpOvkӓ@9(飊q/|7PLEQ#G+TؾnpH'(ʿz{m7 |h)$hxt3  T*_3φڡ^է-ҳF=c^[ua,jod. u W$U0/>#}Q?TW#=O 3yQy |̞^]K4^RNaj4ך?Bx4iNAfd^Bx{gnFHv&'&i=;~/ 㩽'P;ŸݖGQUPߒ›8gP˾ڟ賰߈D3&{ jA¿3K-*'znG o͟)!p;_-vpO}CrSu}'ΧVY=7> G9^dqddsWPS>uLL/ ,ۦٺyC̓F(KKe UV,W}S3puQ">_(rJOMzLRVmFuccnS{i|z>n1^tnfeْuZt&֌ض ;2rеF JhǢegkIuniC(SצQXGz\=W1IdrZ3@qX 8S6q,{)g[+=e^غ{Yײ%Cu'NU_ pQr{랃k֍W6u͙ۖ}>OKf"_ZOnX_߰6'O?5쌐w2lаV;`Dv'%+Wwa`(\UtF?>ʐ2K0醌_? {# p8É'{'7νv'i~Ù?rL9cu.E9m ǀ0M3/ʙA]cʾ~3NfHS,]ǯ= q!N|*n5f2.ph-O9DUBۍ2ɧ6KaeZ|V2n\>g?κL7:`n(.cVb/-ጃ 0Y`0GSR25Z7jiAÞF"m{Å< lո G!>.Sñ<CeC{yl/hI=Z qK_nm@\4g8=PIi2x؀e9E?.w,ȩnԎu$$p%l)=S&r-ʜ8?$C\8X9^.>678'KNf·WFsFrH[>2UFs~/ouuhN%DxӥCePh.mkW?2}r$iWcWrP?}.tڝo5]ʛ9~q:7`$uItՑ*'2׋Dv.7V E׆E||;:dQ:}$ K1M0V oq~.eGO =~a0O98U /yjt w(p-[ѻ#`0b 0&y |;bէvsV).F43g>Ս7b;Z^-~E~~Ր ^-NZQ2k% 4S4)F7F9o-^Z)eXIUxA7摘s 3 MC(6A~U۲X-/P>TߋPcDJPgrFSy*T ]W,6T_9΄j߉&X+*bGli%}c r\Ň%] ]j^ wI ȧ29v"Hng`@B! bp2QL !g.4b!lC!Y{4Qohm,4MK IjS\ >@yO|—_J٥Mgjs tәqo?gdg8wz@ :n5<]9_z?4,nt4ϨU&WZ?Oڷ?6rȞX<(俫 /[cGrj5'exox_~0_3~t1S 'L%}f?jQVN *QK QSJj -djXix`^pZk㌲6B "t߆&nS8{QC(CF1@*EA_"<=1!}~ՉF1OTHbRI S”1 }Ck\CkI/i*sZ28;ܿR4S4a+hQo4=Bo,BnK r{?ϡw~.ˇӾ@WXB2㻯/v'Deyw+D]IBJ"D] D)HT8*#QMv\ FvyZ&Ɏ.E&΢/E?^4+FɫF{Zgɧ}]Kr}^T\O% _Z܉:Էq)5Eѕfpw';U{YϪ=_B}u+xSI.PvL &||:ciV8tI`břXH)J/=˗_ʀ礙z߯cۧ :?wU )?t)@Q(..SjB/Q-I[MEKA1',L^% ؐۡkm>N*3 f/o<1 cTO @1\Dx?^^2|;Vl~ߋivUmH3wx!]z8\ߋIaP/CPM-[ޤmځ]R7k]) AΣ4Ό8RhQD&$CD$h AUtHDr $Wstǝ\n 3fkZ?̅و'n:8-L1,\L8ǒcn>z1 uP̟gq/yMW!tE >_y~\`evbFM̖^XwL]QVRn"eۘ@±mPB4Ah7[KoydM+ |ׯH&qTh4W^(̵Rv 6b€ ;98c6КCjt x^EDZUdãXcӬ32nufmCF=ڌDӪ^!ֳ& hEe#_}7u[ᙏ8ɬҾmԗC} E/ܢ5jcI(q1dOܯb7cےr'kdyby0B S"1-f/BdZN*7<)1-1 VOE40*;u|I imN-Y |;B|o6ƷfNˡ7 ~|ke|7-mE7J{ٌo씘ĽN#1ŚCiЦA5xI**$zhzM7 w/oڑGKO"umb-p2YFn̴9̱Rd,?c)lG2̼"K瘿.1pèq|q?p.w]kϜLĪrVv5@Q]W5ƂTtjj;tf͌53.*Zl:fŖ nN4`tqҟB@&jm=5Du8={[N8"wϹw=se: 4cl&OyxMK1І9j^_$^ 5iO>‹:(;J2* C:)ey S/bYtQbߔf`=VC^)\d W}ʬ]1>#sT 3/1{c)Z9qERN:эdLLŤL{S3UP K0$:=Ȑq&ɁL,ͮU14[5kx4Kz ӪR}٨yS>BIfl 1zAHcEZ` X[N#K7GhG3B #5F/1{V&fвĝK3w4Be^u/e\ _.l')̄8BKrӷ0tqisKs9sF 8REljz;/4Vc)#ctQx9K&=_3Oݎ锹he|vOݎ1ɩYqts{}Y wfRD}fQph=8K$T}r*`Cc^ ]Bk [+`oP"TKD.) eWƔQj> ̵֜?o)dh.?n8R 2m¶(]qֱܰC.0B$eFWeԕV:[c(bip;r46ےݱ߂:c!tc}˨n?AtX"﷞orD;K~?҉ *2C'Il@gJ'GajmؗB^iҭ%6SΕ jC}g{v ew"Fc`^u#^'{uK0z_B_{^w/{.J=61MzG-k۶՞Y}}W;J|j=̉ϸ,~~bONyONL(b5qzx0t%6jz̞e%y׭ Ę3MjXnet?D2X7.N\}KA3$ǸN&ׯԀ ڪ2+W74 OJ{5e&[>%5Ӟ0bi4~\D}KMa@61iPj,R 7Y+IԛS#J*VALcL2-Zz:30Ap=n]#p޸\=W5e O;G%O;?#{cܧjEc*rm$Wea*=C꯯UcwfVE̟w?9WRen"NhHUeQAXYĆ9ijlDݛ ) 4M ; &Z}/?nӚ>zt{m|ZAԩwgjCO ep'WCS ^0dk;`6l9:kq}!4iQ1> m .IYa &OaN!n,藑pDݤW5z`S:ź߷"0԰.Y<1N*qn]ET8$֣n4ɯÙ> ;"y( :35lZbXj38G|גh6ĻeO;=4;GS.)?̓6:U6hKckoz?r&i[޵#BVo|ץw`n:}_޷mj"wғk?Jk^%ޔлhVoۓ[MQ 6 wކVћ#{ջzwZk޽]ջTVo{hV.wxIweVY+íˏ^z?~wz{[޻ջ2h{OfaLwFڻG_4]iޯ;9"{wϒ>n>=-ޝ=EKػhQ A կ{hnNٻimᄇػٻџ{o~!#x=5Y¦R]Cc8<1iJ&<,@sKe#JE)dD,GpiE ?K5;xqIη37p$Bv.(IDp [icRm nQSKfQxϘ?`[YE'ܡJZeFt|MMU2>Av4aBc_b0tQj/*>cJMt٤2$p"SjV}n`8X2Q},ir ^,V(;̶]{e gpP%̐&%![Zm^,d՟+P>F4 BB+ 8eWI)e[x-dAՐсj FUrZ=m]}C xVwcp]'RFn[vX<+,QA,&bnVM ?71. \78򱀳K7/(uܿI9A.)ǕFSOROfԓO$&l%QF]uIn%QF]L= q0g{}q薦xa^+W \\.r]p#843pn7"p%<C;$V'edW:꒰z0㧮w.F \-~ n߃kwyp=b$p dWhQfؔFnm1(l6)sF\$sx}it,`?@{ Sgp̕Q.):ۜUz8ٴ2cW.͸=Y4Pv[y) p,BEQ{!:jx_|eN27=e]5fp.܇bqPK|5lxKl^j<})96%*c. *Zp(g& c򄁒\N>PWYf|j$Mv튑ry% 9xl5ENf0)I2 V=%=x'yIE%/i͛K4ImI&u RiDŽLp WbW 9(: $hEjUD%ǠPVƻ?a̝7[&fYt1beo+5|܋-+#?[nI*jNUYjAT%Kn Y{SOxy( 8LKe1H%LT‚)x{?Bj3-op42Xjs?4Ð1QɵM _Km16eb{ ;X,ҁNqS+CɹVErb@E5prkޓ(ߚ@saH&d5FЪsG+9-ޠ*W%s@B0_ߞx\,f6! <&]`;v[E"3AXËFǓK>| g|ƹd(Ghq9PV.ڍcB+S䙣P%@6)syP;t~VrL6<-M q%oֺf,@{< 7c&/NsU| YF¿IH/`76%jQL FjW=w+H:ηs㬃ꚪyl'$B8/ P>sSդwCizh_'g yBF' IyHYM-8;6N^&V^jܨ]cN[]~+rs3M游833Y;BnFgt,}g"Z#v4^(789vFy7f(iGPj7VV%B6Ava-t]o#Xw:t MN5pgwl?ROϹ|مV&_*;`5e>YH{wwbVw꬏t!= %Xs!](\+)cT=z/\"vT軌S$W7M^!4ɛ&BO4LHp5\(Pz-"8\a/[0I&1r &d-O{iRn)uxtp_ AgV$:zng>(10  ԽσlRg9B2e晠JĬilVtԍeo pn#Td.>-k2z[L6`sRݾ䗫)&VNȎ,g_c0A CK5ܞ-3ɭM"*D7FH)'>v~"_z3ZF.@5ع>.-BJ_s.ܯJ38($2J'\*Y*u>/1ydcGۘU—9d)>߆_C$ 1Z׀GU]_&L&sA~$*ȈB#110P8J [y^Wz[kmX$|&O)B2ȼ>gfhk^k'͇bGОl^xP:vJh%;ۀJs7bi hZ"g=nCքЭV2})ݏ[ 8"1^{-@RDRUL:w|6s& ]k1?ռ4-FOyeK[2nT6n1=Xw<.i7+X+Q|I~ 69V<,75 >"}1LnчSo\D]=ܨ+[*@]L\8uD zYiX,L&(V5z} &&u#ED4/9֖"7H+K:D5v̭8JOyl &ũ>BOg*UcGQ:΅>jׅ4o NեR\Tkgh4y.]g qϥeZK/a6-˜ln>5|𕯜.qʗJ3$P{EF ֐bN { Dqg> ./<&I*ܟau'qː2mxCHoP*v?!T|F\@d` b:qS%rDXYAiQo"/ʏ-Z(bwk⩢w_|6*Doeqh VM y+Ɓ5`H8*PqJ]]TqmxC"ؼd0=iчSR}hw$̽Q{ߔ)(1c3a̤ 31tjL1-юE⢴EpꝆWOR,d)~)F &qJxҊ>B,n#-O\UtuKHq|di|d͖K J s~S-̓/m B'>H    ~73!}?@aլO[jI1]]zm\ ?zӫ٦ܳj:Cޅ Wlz2Y{ei+O:- xn^L;&`a3=!0'aT&2PʈMr›ÉhO;Ӝ ޏ3OvWYYOWq{,~E Ri|i/%YY:lAgU_vhOi/k|5BCxCVk֣-.YsLl3ЎXv\ 'uD{F]g <Ժ_E`*a:`7auٌK0tP}Z%s3rBz}[Yl/`XEZW(Gp\B 8XJڤ;L ׹rO kTWD3KH^\6ƌnґʃcABy0zVNܝmK`,0Z!dT2M09}#CmS2^V_# 5~>%K (NpJ42n GOmG< xTXl&n :Ԕ;SH݊-7𜤵9=s6q%]{ߍW\T)bHL,6 >u :@y!wqf!Gu5hLx>ĵn=>a{CBxGBJ "􊛡%'C</k2\]N}7y| ~i !xpx3 I#J(>B@9PF1E!NAѠHԗ@%rC:P7#P4c8p[eڼeTJaOBA)S4`$%!CèR+P3HWp !i - g8~8mdĵWǢPuI@k U!PBŒ4bC]gt*@(BU- HPC~IO2;CohS OP CޠgӽQŠJ>v[ĖY[o5NlrAlmn&evԭqkAݷb825 8\bU*~=nW11JA.^# l" #G_$} MxkPD2y#RĻO.i;Hsnm7ZLI|s`8 X%:g܌CfCsaizn ,vnh H>*a DSa-&^ABuG;1yqSF^ͻ:YWwdfU&h1U3YQ5muDֆS" VP ,_taݹxy?U^<ɈM&J$wWoOa(>@-Bz=Ѻ(y7/BI1/$e(#h^ZBjR-c̈&H MBIPBXlBz,,HjOR”uV˹n-KYnBZ,h-/6q/~qKd:`{OjRs(Y[}Gd2}u?u͈'eHN\RsBa4bxF|_zZD|ttG#(xƷ EJD|fa1<,M,"=ԸmeG\yEuȃl9'lwrPq ZqR?W4b<垍ME{X,d|?d#qӲޯׯO8vs«ܽvIˁ]֗%=ai5h F)S/}/,iF z> ώ6W]eGa\J8ԃy-2T,:JQzzV2˜Y3񹍜V=h_-rD[ ?['xVV7w{w8M&ty?Oك;FL%Tyn` 3,NzW q c'8#x}V } NJ"yH&=@cWH/ŗUJ6Ơ)R%~(z·ӹ#'VLs534IԖX$=7f.=`:imI u$Ojۑx~vL+ȏI[:O~ZZB8nٞ!ܝ vkԓV-DKV7׳pܯ c|CDI,2W+H'~q~ ʵq~?|Pnȡ9?'p,JFeŜ:ňD]z08j}dJ,^& qEo"5v M|jLH Ǝ؃jiј @(مBũ>QS@HANVU6b@( ha RX{pp TЯ)"ez%)Kx wSC ȩ&n bBK ¦^:o AkyO.T+W y}IW.Դ̊OeZz,X<$?KLz'gqjdvz0^U|Bi$Tq[=cN*Ӿ=4X}mE</}88NVߧ]9w)wԽ =cpl\jl%unO$U{d#{$_6:I%)-MLG44TM8(Uf'[45q6ܡ4J)"ա0):V 2{N{)uZUL}T C9EJݯX_1܋>l"“7Y"յw@M쇇p G)H+Kop0Ÿ״C$t7QRiq`>V!+G-Q䀰W qt $cY C,jopr:P!YpMu ka&R=7@hPp i㿢ma1#=FagyH$,"Wg~I}.oP5"Y~.q5'=E=t.: /Kts!'nM.b "zY *)oy#+{l]/# M̆d7!!.W!ӈ 6X7$oZ"m>K\5͋W]ź9G$>$pܣUo͇ Kh0/ B8!&1t 7ܕpx6 O){T"i >^L4'}0gwS#I3 ,5~;o LNNpi6`\c|r`1)e#\/?ŤI!Q`Ƌ1i2P6b60UƟ_ &G`,Gy18 2wwR J*TGǟ&Wp ]չ^;$;<, fU9 ޻ =胮_"W V 1\"e5=8xt9[1 wdK6n2G`э|M,\L&`P@2X^T`J߀z[󖅽A{~ 7&GϩK}8XeJ;@WR|B'!+%z/\,3 Y/i W`ym?'.t/YD1܇#iݔy&C e{4Y[ѮqyF‰59Vݭ2VhD+Tgikc;Bn/Z߇Z3S+ wb \ӳ犭Z)F[%o 2ZvhxܲC ח4uł $\y8a?H@ް@C@kCGdGBSQ`/UbrVpx/,9+_NN'WڌdK Iq~W33{_lWd\mfRO}sRΨa?60'q!f#oyC V,Q9`DX'kLd $)I'N!?%$zm@I@7$&ߵŔd`t3` Jk<< ͔ W2a\/3{7WBZ0fs|lP4FXR4brF0sbF#scGԉ[ζǫ!xnrxix9魶rqO53ϊxKx#r%~*!n_*xPċkRIi94tnRTV| 5ΰQ_d ԋwmX;L. oߴMD;QLf, r2ځ8j"l;=v9g޲dvˈ2Ie7Q}]4Wx͜]٧Z} =<`MU$,Ax~ŽC"kmD,Dˍ|?o2#jfK}S? Rvia_(x~1ssL5<WxsxY_PC(K 6@J^P~ 5@^\p n q#9琂_WĭAܲ9ܜC~9-JSP|bG쇿 ќZ4T i3!\].C>S=`ڎK!aNvtqwvuX,S73؃KE9Y{ߛwXцoMG&  Px{ՉE?>"Uq^g5QIx`g,N+΄ٴ(Hw-JffAbtuX"&0RIpؤ;rLѷ v%>.$ZpZĄ ,kS o#@8 fT٧ɼwKj噷Sr+nP޷7Pn*" y*0my"d ;ϓ9:G s4@ѧ=b‚Pjk{uB?~8K!O\dds 3im%<:MW|VxxGRY'1xyȓ걙9ͼJ1 MS-"|)qt?>'q_u)K^SWq۬S } ^ "Oufp07akW8Yl&3/.JʞBd>$/0 so "c/T[X|sZbdR=ADvA1aeN9Lt߅A>oQɿu= F}YÿbV:G>GjW{k6>ɢDG MŀVӣ+,jLËDLDgYF@K~n5a?ibKK|[TiIׯ+t2" cd:Mt|EG)QQ+ENu?d)Q#_)%NxĨ&6 J$x,'"pE[ؓkRZ+E T7眦xRxgpdzc^pXxKoZ? {1O5>bo"0A>9_߇OU|Thqytȟ<[Ȧ`Y{n&U)[BJga-穭x`VvKxlu$TU(Ig: 6@mEY8<ؤ{wFaC/nUtцħ!0^@U~3S"VhVƱғ֙B(w=8wc`-Ykصlq>s>"} bϯQׇ1lKK׳4v^?}XMQyz;폰yl.=fFKy.;?O,ɧ4yK=u{6ofwqT+=Q43Ƕ {[>J!((5e|e|1ܫ a1 M׃a{UɱsaOGo;4Cϥuڹ}U1i"ϫyY,؝Þd[Meh,MHrmvNi; {}OztgV+ƛu ?/ [V^ז*divvLgis;Y<'֓HK8>gn;һqS V 1VI^0♠+FW7~O ]]Q7hb{޺{޺{޺{޺{tNWY+F.&tNW%K_["_Vz}u kצ3M4yJiß1sVt/Ι9/zG?"B9=~ղag3a>qRԫ.\xMbĥ..ʴuV,R  +~5n /\~%W~ݽݏM+dew6m/p+e;zw튯|Ϲ2Q~r"l:^_",Z(((h=P6@Y@9@y@@@@@5@@u@@ @@ff HsEG}?@@@@bxϥmph^<RZF ߡ @@@:hE@ˁR6m*aZ4m.B_@+] "1(.hq&.Qg  *NWv1 ,q`D  WJ^wSݧ CQ*tYP9_ª{Os{^k[<{?^s\wkmb{hqf" A>DgW0DSɀf93Dx"J@YDuB"mm&o_`Jڼ?oS7 ;6=ꬊ+o0Tōs{4uIwKˌ R7hU1Uk=Mq毯~fԳDtHƟK-cehJ^\#f bAu6}0 `1ȠW=v;'ŗ[JK,uwb['vvkL^pj>-v=w]e^4l7R'+S|':jgKf]R988?h|ENMJN,m /xUm5\%fO[יy+<3TK*:]6h΢{<*,Mw+L̳aUzU&Z)tG=oˍ~s,dܟ2x^GZ"<ׯo#f#Dx3ów>Ϋ7l^n/,xx)Ʀ 4kޒIْ+.͘ ^W1yMG?#L_8Bs|NjVeݼ"UǬx8N8uԕJ=X_GtǷ![x:dEY7t.Ko9^^(K]{F{W˃Z'N JŲ3-bgX3U'zwPuerJdrO kUaV>ӮN87ͷG(hتI`9H|~]-}JzƋPAX$kzJZo>s, ]}GKCazyN'4rzKK!\t$zkKN5s/OOI\K}Ót^=ژp[=]3kĈpU#Bm/.{╣dII2wL&SN*]PEٍFP+.c! ʊлE5>F1| ^~͜! xGπBdvz'0؀Hh"CRWio:cxzCϥӋh!gӠt3t.p"=fh^F[ AO((s>p.eA9a A0.!0ґ=NKiBep9\WUW5p-\#a10x& GӞ?mGD,gҁ/ ,`"Lbv+f?f sevҞ9J:2٤C0+G1Jr6Oz0) L!)e^La\W0)28e~cNgJu:!LNS0 9i@3gdv9 1rX+J?0Asf"XԐP;PݣT\=q4fD [^ n)pH;@xa2!Qr/& %<(T90̃ <Űbp ~%<Jo:' Xsԩe:`9<ji;<NpW.pp7+uXn&njp^w` j=T?a*/Pt Nt&^"2|?Gl  :\P?/;>gy@i~6>qAQ6"CI;b@=?$D '% ‡~11 Jq(I esP#am j<W6,H,8= H4ZL1)UhZAi.O7D q#mߡ03qow?!ptCc%Ɔ"ye(~Pwb@4W!Q9[Bi|X 4 q܀8&" ;#^g=_VF=BcBQ[" Q " v7P`Hb>RDϢp!)X_шB[j ~C wB d&odݞ IP}dDټ:uFB{!nȾKAauDSIG퇺C:l}"?E{HodU?;|GdL(tY~>d?ُOsQs7F_냷5Sߐ6Qfg`Ǣu NL0عCkj=$$K9pohJ޼=++p|'k'!1/GP} qk7}hB%0}z*&Ҥg FF6#vPE=Lj\도$_W2dI=gyA$?byެal7osxIAdU̽.$}fٿ.ٌVn0/uüv¼FT(_?{My =ONMs^֭^o?<Tu*?^|c{ 8VUz~24S׷ׁ[1!С۴#r83KhިDaO˦'$-drNĮ&)baQuZjd{%stޏoѓ{xz4a0ROE `/5"O&)+OL1[-aӶXj`#^̲3´'0laWlFeuglv]=&5꧅LTt{;Z8teÅz ~ ,Ȍ;a0.Xd7=4j ӫ律+]>0eXz\WKxǩ§g乳V# 6;X:[ovpO3rpg׍;]^4ud jIJ0I+/GG?矲wOM3"ޘ懅 =z$i!lR$;ɞ 2l:6G} nu.n] ?(x'u*oqPø\Hկ&w1{ j`\0f&g"oc\b07 [|Jscv nݟ x4t8b'5WGE}1nӞʟ̯b:'2&G'ڹ]xu|S嚸e|דE(ua|Q}=^Rpouvu\aM{8__gwiG{C [j Gx'(}Fx'g1?bprTJvWb@Ov:8^_2elaun_ >Sv|M4+߰Qfvej =?Ÿ]xW'u+?Z>m߂t |,󫸽 Lc?Č]_kR4{'^/d8~lǼ=)hh-}rmRCK] p\u$-c28F 1}?gXHFW'i`8>9 6. I܉62XlZGQ`&>@ < s#K@ PD;0y @2p Q` wk0fzg 0| # @ x8>bf@V^)`xF+6C @O/!4@X J{.@^#(@3lo7q=[7f:oZ}uͺU2d_6lg4ECVu42)2͜`8nS̹rqw5rGꎰ:7DZX(RU#!<KN :XKfW;3Bʮ[)Yex2uT4*& ?EBڳ+cpj ֢ %JȻu&YHԎ-ίNeu; ѷy:] bɹ7vy|Qԓ.?8 Yd8-!ٸ69 H&h9-lhkjEIe`6(gm]t[313):>R6g lHY]r>F"[N4žY6p{&51~ݜe?=Ϟ]:\.{Vu/ ƇG) +0A~Ir<Ŧ4e%䙉6w&$롵`m1 >0VLx1oc6m͞Pu4XtV.!̺r;oMVܑ2TI. `s*9 e|Ig"m9xߎC .6 ő'rMmFbM?da>iɐ_SLwXhV[Z˾$m#HwNMm>#rE \Nkc,ֺ MLƌ9AZ<rH'TQ 2G0dSnaQ3]!-`WeWn/癛ͦrhĢӵ)~;~8ej#ÚmеmV0<v@ΟH^ˀ8o8t<_\hm;?RFދؿz$L<@D#+]yp-[#v.gdj0U,7J;Av&.5qN%D*еVL?1g#o!dy}^+QSgp;+ug ?~˾>ENɞQdVc\\Ԅf6gQuK,0l !)G<{;kb[T&{k1$Ͻ9:p|&-Z8!'LWєUJRT)Պ_WJHiUl%JҥlSJCUv*JүQ*>er@9R(GA2W|@]zUM]֫jڥ;jگUGԣ:P?SGU]k2mijͯk ZHvhZ֯k!vN[_}~JD579l0 EYH%4etT^UNo>!z0F!,|W%tP:$J1iH:. K'Y3iTA\*e\/wʻ_!<,GYy*}>GA}HGc3Kc!QfT~]Fc>c1`7GAc6Fƨc3Ks)YfV~ ]fc>s9`7GAs32b5GM`Nr<R1e 3@CԦ.ݴ]A0g( %BBM( [p.[z]BG # 0$ #YaT牋%bBEM,D D[t.[{]bG#8$#YqT̑I%RB%M*$ $[r.[z]RGnH-ƇIcy_grͣ鈥??ԟ1MO xe%,-B;IvdT~zZ\-..:VthVnYgU[ivHN// _Yz+UJx+={O]<}]k{@G\ڗU?MP~!x_ Nysރ[a~74'x4Т)]]9vVKA vͨ}yZd]xk^tY'ȧGVU}LvG*iZ+'{=^*\$|!ݫxO}CZ8AMOFF hݳ6Ӭb,kg$:c( /” d]nbg:+v{5Neq;=c8g7'!pwW7W+UNe ZIpwVAI "ء;0A4K-2'٬|ؕԤN̦(_ⷰ+]EO1^ΐr<,/d{6T#WSʩp8:)N;]vϹ^ |7[hlP|x6N M.sC> c5-VsuE_}7;yn-xcx_OF Q^Ӯ~GHSQ{C*J'$H&I>K-eU4uY k5JYK1$Z/OySCdť&|]6me/9 n(p2U'Y&/O%[W[ڝv#t$xKx-R(>uDT/p窔Sɱѕo:wB=>(t4g~&)ҽP Z;1!c51/1֡߆6&dLƑ$<=dJX7;}zah Ii*$=K}pʬ'nv)[໿i7]A?ߜi`07|3SFق#ȀIS AQ$T̺ퟂCn$>ʍv oǃﻀO';wS} ½(}eO 辩%x]X9/1x?n&d]$}>(o: ԑ|bu]ZpGʜZ!oͻHs ~*s̍n̄ SDXVUƊAxëk [(8+ɚ X HV[;~(ZF24jӆt7`c| (f M#s@҅(Tw4R|u5?}|V0uA \߼hz iI-=d?K/oO&-<=T}NdOj{?4[+U&z釅|ONj9H%QHMz( ?dꭳ~ YܱY/LP\4?-L-t Igo"~z^wCf*feˎ,"~Ou@<EdYYWv.E=.Q}Pj/XLN.hA R=KӀ_C-@'W97_ݷݶPl^i|{H𦂼6xNj5m ޡABNӐo9\ ^1EPb 'yA7G xPG}JFd"FfCcd-!'9rn>%LVnUڪ`[zj`@Z==OB>a}ZjZϭ4+P4* X˦imZ6-{Fҏ0:_t8l] Bwɨb) En X;nmw%ۓv(|A.u2z?gKz-M1Ҙ`L3vGf:< >!!i31x?Jum"4gYXCօ}r#߮𼂉F".XJ0a#>o"{LKm(#M'ώ,HUa.>iq 9 3( [7t-HnbrZ71~'ڲ3{AW 9pRA_ tz-u Z >>$&6`/.jMh YC6}~`?){ CE}c>:ZNO(Km<q89ݞnR)`LF.pF9޼ ҡ=o|Rt0m`;(EIUC5W=T"ux[-6._.[p oyORSe oExcYiN3VNvGp]njubwU6uP@'>v;"㧹o@{mQA6y})8Ϡej&Z;ic3yb;mqv[U{ԛS2}~Ql0 ;Wf&3ۛcvk3Ks?xb~$R Z*9;YL SB_"3Tu~dgRE6pr۸ onӽ%nՙCgGNƴ:p^Xmr'ҩMNzO}f^ɐFmYMǬoO͏͉s'?*T @M9ԑɊG?C߲t3A3*%-AՖ#xviH7/ZI/[_]BZ9~Rj3A^#mԷk(#ڨf7Wg+k$ u6yl>ڛ}ξd,maY1>?EDY9)" /AnYyQ~b;eȁ/3693'x໾d-6=_e.5+[zA's|yLmU}{5,dE2oK?Dr_w̆f tX3ɜ FҬ)L^]6AEd>dGB1C; 't ʻ>|OK9yrC)sw3=9D2P Y:b5#=u/1sp^lf~h1Cə=IJ|6L/ v ȍ*IڏbF}>Zlv)dd@yYg-5 mZwS;?Т{zm4 L}P OICڊѵ4J 鶲2t=? -ډ܅Ube#G rd) j|Qmr׻6H۽PjPJpT\զi+# vF;nF'柨cA!S.FGbC<i7VxO~-XJv#fRj&ۯ΀o(wpý7gtPTd^D4{Lb6y$(%^#t!=D/л![ˊTy*Vg3Ydu?97^oguӴzzKUK@&SU0=0_K?|bf!HQR7qd>bZX6d*:W]gs5kOY黍FIӂj2HaMPAX&,cW#Ys,K zeY5PU?S&|Y^JBZRDm6i#Eۈq T +D3 `}>~CbC3o >a$3 V #̇zlrd]9ʠ:j<ipU`6.9 (GA?'j"_0?3ǖ!(ՙ~%8N$#2)4z)j_d!+gEE+[ڿ_i=~+5<It2 ]\JSur~ NΟRp_ހ`fgx6J_ņ"LU@$$Ἷ+|K``=j59 tbفL pFWw} >/~0q=?k Oڌxu[>4ߐB}_d ZAME'~|=L4<9O!=I | :ÿ%zaBQtA[t0M#ꟇO5J4HԺ?oWy+K65O@E?e NDoT%Gp_nU?;+OH'%89?_aF ܊u3zy%07m{Q?g m r[ v@۬֫QZ}L~k45> #i8UBwA&C\fo٭@Lk}~Vi-g'8nBߧ3-YZ#GcK5۲5|vVY,4Ox5hmA}ǾLPS?dׄ_|1\\mTy(g )Ơ:?s6{2Ny䬁Nb4ӚjSZWYDߠowenf2U |j 4M'_g3K $q.p k:hu0Q ofkYw9s^Gs-T@N5%kpwoAvkd sRD"$0E$00]VT@y3- &.s˂Ou2]v{;vㅝPHĪلp 4W}h /?;=s/7?^?2ܟْ `Z'`v\ܘd6B ^YLjA7̹Xؕ9P#f6 J9Tn=?U֠uhcL{Tw<7+Ī|?o3$1u~Jd' ˒4$[pxxXoQ0!2ANsԬ}M~P/v0kUjnitw'"Ίkb>΂G|IK!q6fc/,#ćCHГ@;g]'14WI'h5?B<\@kCV=-|;4BlIc=*Y[Zّ~ V+W=l)Jc;ɞepW .9j}^̨kvOJY2ۋ(9*.",#Wy&y{R$aU,0.>mFӡ4G>yށo,`[^?vȝE^(:<48\F#TsJ-^lC**<(+jP?PM&g3TQ5UZN6izmm_5dÌfqSz..w̗X$Z^GbEʺrb(^e7Uc;_;>]n?&wZ^ژ'c2{fgsfV$IFKSD׌w` 2,g]wKO^HQ_/|Z;n =_jsnwěN>\O:3@U\SªiM.JўD:NshyvDT?^ڑ*$3,yе[P(><8몭gHi~:̬AiOLJ{duI/bx8=+J4 VXkjg :K ʳ*tDOsA}@Ѫz_UUYJLye5O;]4?Ka@SH81fY!}/TnGw| ^憒ƒ{ZM1lB[㭵D0WQd|!D=h 9_v6^iz߾m_㕥]?{{*`+ï _K'+zxj+c޼BH? "^f\gm2-mt@M'[(r*CقU>k{ǫL|';]E.onB`i'\f^Y,a6˛dyH2 Tupb|8iI$oJ,?@$_oQ'e fXSjs9wN9看Um >g>1l2'd9YQV3 ͐&ɾB„k}ɸD[|sJ5+ Zbxdlxd*ϳg8ϗ-{2aG/_}R:fEes:LՄw ق'UsUIL$"D"WZ׭b#@1KIC3@A ':UA箛%yPEZ6PX7zOҋB_ @|mOdT*䮛E` 4"YV|t]OҾ =oopQQ|"?E>Y4zK9P*Bho5u교Yտc ۨoi ÌY3M]X9.k*M0 V5e>n,//ě'ݫq~B6&  $Qgi{!}bT# QN[]p1^=o> LۮFFo(|mNE}H0ȧ*>s1Vue$oȟ m/i0S|ugu[ >dusc/bgߺk,^ OyͼGg 2Z%psM a[}~\?3Qѥ FG1Ę5`̾f9~ ^ưIkkJ:ƹxS4P?mQ2*å+gA_nbvuj_"ū*i;Üoܞ^?oO6CG9m6W[tvU{eг eGFQʬe`{ȡ<YkA/4#>b)o<_瑢(#F ) AayCޓY߷UyD{gS}ݒ gjmѷHFFHoц823'VAzf֑}]?Yxe^g|6*G%J ek;^dx=NOeڵ~H՟ڛ_2uCuGAoA?_wq_a^v/ȳWΫ5{#4&{ӽyraPviEDFyƼh^Gg$M bLp,]sҚt" $1xe1I܁O??cO" Dd$5ybJ ٣RIDcGsxpЉCOvq9')xfggпsyLmE_8%zܿ%M$Ip8G*, ?g½HY425 `1p^w)`y-d}?G]2# óEm(S֨g6#{$|N&QM/0A{ }氍4{݉ob=l=`T6TsH㗣6hjڍuXNsg3o.{6Vl=8*3oΐ5e2psF^5B'HG@ұؿ>L%e܁zB??EQf0^p[88p*d<x\D֐VBcuL>4BET,k7C_FHaG9YJSqZNSUP'=E2-X3`[NfD<L49{SFh٠%jXzK}~N%#͸c<5*9FZOO Vr%jm?7Q+l )Fp"P |)_ ۥ;{] >o: L5 Io!`AHT;/xUaC/-}_w[֛X3]@3 kf8o6[Ȋ \#K ݣՋXcq8m1o^i%:q%:V(2G0+xH׃)7Ki9ݜ n^ &dܨî$m&fR k?:?Ƕ?GxM?zx!-G'2_7H":& \sg.'Z=N=E Ӻɗt=GoȒMeYyA{$o Tg7wtdj3{}>;i6*;Jfs"W_ݺ|PTP澙h/NO%A!X~.՚kYPG~3k{ DC{}Y"#BQtZ-fZgVF´ 5uv؇P `&Gtgb X[֙cCcW,U<?Qز 78Am O+dfhk8~9~y.xBx=ҞlBTMU78_z*8nu\S߿a29←T&ׁ}Lp~t[KpD>ֽUq$R>8I3p#!KCf5R &WHUZuG%p)+Pމ]QA -Y?R;^%=o7"6ZV#ƨgt2zog6`j[ͭ2kf[@STuryYqHo2,'H PbS+њjmYY1n?G0X{s;o >xC- o'yUnitCU3Y|-L]F'.  ##N)W_ymC~7&d:?"oZj> FOF} {MWE . 2[H7'`.2ԖkzPA_F9!czjciv[-JyN)TP}gSڭ6}}M{} MevߙBrAawŊwsc&зK븵nbD S.6W_Go]fYYl6"c-`v;ΰG <ҼW9vQP*lSO>m+& oC`tipqn}Zj}<=>&x&;"LD^ٱz 7kƛ]`M!~l4d<mv=uLo4.Ɔȗc8 x >1O煰"b^dd`#vY$P^`{%2v&ڥ.76PVwPM#݉Lwm0we7ʴ %G &魍*Ц ȓ}>G_oOE!ZF?cQ,oR5kXPsl`IOuF^FNLS}ܒG=l@&pSyVkYVu1~ Ƴ//`v*^~W֫Y(a3SjD(df0`_;-+W DOo xqq*vݶ B/M&!C/g> ;5:KIҏi9֋g+6hqQTU\)ޱgk)Uu~)̅7t>pz9@iHyR4;:zwGoD0I˩JjFz>d߳ s(.YL;q\?DfSdYEY4_ ^ d>gR^JՏV_"Q{ϫJi~,{ÉS7Ye&T0-UUt41 fSA^'oF%y|HF`r)YM6 }mYESWGVQZ,R &'tM'iZqlr0|z]TwPG.PG d 3.֊\*@;}^P9;Zzɖ@ 0ݜb>i5F˜01F|)oӧ8;j5>nƾlF삻FͤITgU~Ɵw"Cԃf.tG&dydf:t\m'y0^ Z\Ŧut{t7ٛLyKګ-ގW˛9CwH-XޫwjZ.-4CP-= :2x?Gf0ʛf73\en4wӻ H&%"<4TCq}^% ^j% I- ) XMko" s3H8)P9H: CQuƺ`]#޳~r\X/rFpz)syZ:B~`6̛UV8͍9I'LhVLϘM :yE>6{6/Eϓ3:{QwHT^\Y/x:%JPCs{Kςn;{)-سLt>@s|jz0x{>FO{yF_} ʨDdm10GTHAVӭjuzl]:?DpV>ΐοz" >Pyǁ'+VXcwcOeDeAj1-:)b'm ډ<CK} s>9L0g(Q9rJ"*m*T^߶`Q]ؚR_TՆ_5\5NuL<`jj3T)$6ziJߔX !deW.wRGǁA zū͊m4`{3ʋQQH)0PVl佘3zO$8;xr(kz |HejG*C`E^Po,(8 9@.:f#MHM(qlTx5G&<",GBFC0IcÔϬ(zt!I#DmBPxfv%K tL+P4(ESFY10#!0GX!2Rՙ75 Q$.LiIc4 DN͗k5^N'S(N$D)¬DsH-7;<(ِHzNz+g@P'~9̇0qrzytB( s 's&n8K]mxV,GP"2Aa TP 3#ϙ9i,,(%M,]srms=#lvϾ="z $]ĉ?i0)WHĽ;e!/vSds7fLN:Rm(Ń,͂*J>'֦j>E#`! R=Di?P,  999 O@6 L}N8qzMo<.aT+fk;5\6-,Wz!m9m>hscjԐӑ/KFZE "STVܭi?"/a#N~},*|wCY]a%~M >]ZI/Cj{t^/)a&W#'Мqk5+GH9bz,&Z>'z5"npm~x`t|1I*}_a(Kfm= 1ɉRC5\ĸG,mﰔ'j)70gE2N ^^I\ : [8C'̀&'*rf  8gv2i)ٿ_c٣m͍R O=+[H켢c.0z`ǔvht縙IzhE#R[mzt°bI n låadZhH-ܭa@dKOv,e'\gŰt﷛\ 9_i-X J;Et[mI+h gM[x/Q_qAQ=b}1G ZԔ NE:.)HͱVqF*qdD&iha B+~v )":ƩY\00H)m"uU9>L]^:h1e9d E@.=؎\lų{E9xdU lI2#x5_[X686Adb0Y(rȀѥ3~Q&1AZՄ~dˍ>w0]%XCq9eM =5}(;M^,]lyKoY1ݵL}2E@^%$==;nq6}+Bryy7 M:)qAd^;_Zg<'2qDV{7G.\e#t"1Fr{/lZx]7)}B^r~(x7-l;,8$ Bߺ|n]|fz2CCL᥊ҲKnUZ4TMbu2]mslh]KF_9`BK`[q NqW_^dPGﺚe^o>P1I1//fhw53gҒ[&V0go]sO: HIf۸Ϫĝ,r.ů|5^!ꏡ6|e M|H7雛Ճ-ǞRdxԨ~RG|~J< [AFQSmYAf =/_#lYq9{V8mqe.s" 6^OgF3,p[Ndk7Է7ޘ*,l}+~ c*/e{K<3Ji0?b֊Fj/#:bMx]'0~su)j/qIW蒌l>̱z1#恵Q?P-@X`lAUiˣ͹]OV{uWf m3#^p"<@pR|2ȣO6ȸ4l(=  ȧwטeCX8ݽVmQZ;ms1Z=vuGڿ .&ڛ=C\-y&aיt[0ow U~=<;70-R󖾶흻&wvf=/K3x#^}e(w[80z\MV?>Y':T|.Z´~1s^je|ْҼƶ/?8iۧ膣<1ŹtMHC7Ztkzǟ~YRPk~-DxFf5!kj̼oԙLL,tY $تvۺQfvB Cweo]HQ!tYLzZFSEe GW- Gך;.o]VUJt-SQ6m23JfE>ٳ3BHPXCpp-G[4`E Jc{uwl͖-ДY˽w[n_I-$3\u5k;WI pKb50?U!xOJ)6dzb)g6\!GJa?tKӽhޗńs(zm9^sNcizUaCx/GU:dC9j,\aк9CH㍛o/`b)FjIV/5 <s_8qzԸe?o*GW r䍕NX''G\j88WI.Fs%,~oVir#I~ȡlڦf{V5I#K07PM#(✘N˹)j-RVF^DDZ K"WQ+nr xCDTK ={-i.QR:P~+׋_ Aadygg?iXIV&[n絰5hٌp`JP'7h764G+q34^ϔ=n>*-QA33tR} ~ ~ f#b䛨2zn)Ըo@GGmxkgߘVY$߰+4J(h$dWw]R[l.pwn0r'1zg}ЋFw Heq70zZMn+`R=;jqiv/9J,9]2a%6B E_ٽtU[b}wu9[u1cӌv.h(L}\sZ:plɼjN==ߞgwI10֝Na˸OV )Z SUw&3Z+XAxQ$8ZY}cC_C|2GIX3g Yb[ˣtʼ4F75,v!+nt.5|z3b˕X3[Egַ N~{26e}iyd_e>!Y5ꓕ{'JTmT d}>bۣ1)]Zvdn$.#qY\BY4GX%z >G^H廤:?4ѰzNS3t/Q`g55ЋhK\55yRVبV/NИ7"]  ^{of>`U^=b 1<)Qv8;6(95DJH|h%KK-ziWMʆ8['措%YU9? }vҌ\Po'l5*g[Lk{iEM[GK`܂Q &r\[?KY,e{?(?N:Iʆ2L3֤VFqn - p   @ 8~"BސQ@Pv4A ><@p'_HztDz[ m6l]Z>2 WhذC7!'U]#+;j0(zR|[~36uaGkw N0]grD'ORS&nR朴O :|6Q BBi|lŮM|A\7j jtrOiPN.: Nivg헎y[5"UG,vze4oI|$g*rj\.e41Oh$UjG.W~`LW}&V '7l8k>"hG5>+~9oήm-턊81L՚%ΗRsBl /4ntdJ4= ~MVa1w$0ٗV\Κi&5"nk`) [} B4G{^G d{ #̻*ـt;!tss4 ݺpȘ;{SЃsW Ln*MF<HmÎQӷ"."k7|gLnTޠ]Q/mD_[xF&J1QofۥކNR]ݼv&wK4N/s8[1ꋖڎIaOL{xԴ {%[([x4MlU2q6ޞ7J2Z6-=U֥”r[cH0` OTq9 Na%Fa~`PtĢh I()[ @HTћ0\4nybVk@GMDz3XtN:R=;*-L:WtҪCҪ-M-$;0.&S rƤ䁈5ᩝ,J0ST@(Ay$#"J#Pg#Tq8Ǿnn}XL H\kuJ!.kq2}w9wƹհG6,jjt=( #gm}7:N+a)ݼw$T5sj=7@_Rܾ\^+3ҽ{] t̴cϣ4u 0j=LsgRFVgJPq{|Ԥ缞;Ek!dF5G_9Ci>cD76`59-k;Ow;Sp||տn\DLEXV&vl`P@'큓vͱD`Y(YQP]KkYO[oءsPߵC_aޝQ?T$Ty ȏvK+׼ E]Q^ K;kHz&Yhu]mcv3%N_/Q5 ެlt}ӰR&hVP21$#7qӭ(Rkf?EA?sw9Nǻ2vLoz~͘yXJRXƼCj_7geDr{R 'htkO' )NzmHeQXrn{y>xBs:,]z/٫:o AGnfLO-2qkk_v] _lmʲ-heY -:$(,g8ߡˮTE@t$̕Y+R%#Wy7/N>RϿ ^hZOLd:d=g,99ba[ f>/PZj\/.,n̩E>7TK8ô";;4k˥I8Yz/9~pܺгSUՏ9 ?~of,j;3 zz`B>7lIܳyɢ# rw.'>UDd e!V!qOjom6v9>ǦCg4ϼo% b.|R()rBUTGRKqwH]o9h]?Fa]~gvYHoM皢aK?'<{kֲ}gtTr R|~;V;i*)fWlvXƲuYI=lj箥6Ƕkٞ#SXշ4 \g%4Wv<ruM * ](¸L{r<ʘӧ͟'%EttZY)){eMewwJ[~k:\OȜL/GhY3ۻEB`پ,9U;c^8. E6lm;Dر`8gVh|}8Nji/4v8)$Y@1ܤ,5mZ)q׀wtMe8%("氽lHQXλOo7 OxhkJIسoIVbeGkHB.y}s>Nͅo`qj/ ӈ>Gt 9:x ׾9ɇ[p.+7QzqTuUu1zYnVGvڨ`J}R;fxmĥn> %R%~Lzާ[%'&̬RF9K)'@CAEIzo]7mGN68b#X2#hw[-00(NąF|qzָ O ++TMpprfzjlM#_/?Z-jya6row r@YL݆31 RejC:L81 9pTMTx੶"^$JbC>؎N+7P b!N'2mDt:gCa_ U_=uPM1t4"@[^Q.%OxAAP(@ }!w("OAwk3sϧ ~+BuZoʗ쥒t(A8Є"Ba HO%# [O | @vHHP4(=;-Hɧ[C %R'IEcmD(@"[͔ !5h-HEX.}(/x܅{=ݓR)]g(p&1ǎ'̏PQ#=$(xEH~:į&C]zaP,HɃz'is'}/dK%紈4o$̗,`EL{*C<‘5]Er[;+DZ;'D}3JL|9!D<ݧ: DAz_rWq!U r!'BP /HSP- uʅF*8"vR*5<BX A\ h\ z r&%hC "ْ-i0 #89(~S)k|C_?7*e_ dvݍ779~f+ݡֲUWtzԽ295j^<\휛qͺlTT{Fu xmu=:Yq~-ܓvTZ%+h\#ī^#9-\6v{泭kjyVUzHĢʼ0M0{_-Ҫ:[JƏ t}(Tjm?⌎Ć_7-ɿx=2e>g\h'_,D#xy3q4DjcJ۵kmizR᳢*E5xUC󂘭HآYow,|AWhKM_-bF/Cr+doHLUɸ1I~=h1іV w!yirtGLۺ6WJy5kDY73聑?w9_jbȻ*_xbM $z@"qРP7(,<ͺM]i¢‰ GP[Q  t 'zGy<*/Um~F%Ƀa#Tg>mmF@?o¾dVo{u=7RnȌrf_%g)mK.cJ=rMy {" G=r>r)#^P@ Bw  6ntMROkkÁZ<͔y"2$L^ әjMmA LqS@=Jp::J;S/e͈Hpd[1΃^iK*j9γt.r=Zws l6Ϩy0/<~{/.𧝻C?ͳ~99s}39iiA?Lr xY?2: ֩g;έ1f13\!߰1ԁ[%ئA`w/Y6᫵Ɲ~ud RFP_w<SV tQ4V zSqsIdeO<ȿ14~n\+[:-Ƣ(9OXO4PSyf?5iH"-^^n%ka=涁93i-shEڬg:Sދ5Wښ~n W si?y(<"cͣe>r&Nѽx^Z)P"%tx.ǧ@| k'gLrZh)"}J7v}@_P27j4 8T~@ *#2B~/< ȉڼ8> e(7W2;=9ϴ Z)8ESu"q!kS}cBo*L3/Mci<>W|rY?ycNzu8  sO*ohGqnj xMa.8)S1b>"A##)0> /_;@i)QxO ^{%̥Z΅>AMq ؃*/p (tKA{5E%W \m@iD~R~3ȗ*\_`F݅dV*? ZZe_xL1Bٺׂ:'Nn;1wlNj\^2b>suw  9|h Vq.ouԯ Nsu(0Ȍ\LSW1X-QssIȅдDgY4T_VQj#K(0"Q@TD 6 BIiiC дM;י D@@ $@T *"fھqpwogs>Ǻ-NG5D|޴DϽ8,q\FWW=?N^ )w«mLGdfz-u8}Lf.YzY]ŗi|!0qz!xZ8ÚX2*<A=kT{YӞ| 8mRtYZyvF9Wnș/b=w%<k%G1sc6_$%[.Jvs9/? ^>lݳqZS$Lؾ3;=2N 7!Z+|.qPE7%¬C^^1^K5phޚk}I)ipqxXk2J΅D^.ḍǙ ]^B_^әJ',Niwa_?/FΘ92(0>Wu/}coߧyd'z}!AɺC_igyoNe;z*4g?̢Z}k*P[%n86чLv G Q7oռs&'--Oc5647khjkyzsG)6S"y3كE9rw#V͙rbsp&U/gH緞Hn~kr`"@9HՖyb'|GٝOq 'Kz6R]z^)EƑBy/M]1!\ x: eæ)A.kº9 ̢7dI)<:1ߗ +CK]P\Eof%$/ Y%:o#p`0D!Ąݘ%uCr6č3wS rʺ9Mqwnx:il{owߋ|7mYZ!-^v;g<|{D=ar1RA<QNejN6UkLMk4_0" 5*euDnl׼2a2t219Cӑ:hU__p{UNԃ<(}enVuxlWW& 1FL"6IX—ySv{KPqū儧\|hujg5/Q>UմߓsAjM{UʾCu*(V'$yr'F %ȧP~A踰|?ƈ5?";]6,^yXqe.~(s9c3>P#lGkRVԞK*/gi~K&5a:\Z7ꈹyO ::?sa4Y@V9[e-Vvj;rLx^PTZ{{"f\"rI]'8*n$OJU6rhjn=}fHD)5Tm{ >Ԏ%r_kz\|AI(C;8kOv-vev",}< B/,->aX |jJԹv:uYgOמ}ݏ[<^YmtߨJofGR.-ڄr6_ tؗ$ p\~:UgQi뱌Uk1a3=;;=zطW2}}B/uam'*"VaAv-K~C䜢_ lvȡBGn:,-V|ambbVj^31_1`D;!?%+Γlz-sX_yRO=9tnw؇sY!lQu ~Qޙ>]2f^B-ipz^MDNajsc}~LOYw 7~؟&u:7F!NigS$aZidP\G(r]Џ೪\KUU*ۇG7|ꉘ Y1:8=14弤f˺GuZEY箣9X?N jAqيURU.Ǟ=??1́K[ĜL`|Äq)4hZ qQg̃gQfhqm\d.6٧b~xF?d6( a&חYUpVUEOzv-̋k=1=/ʥ`z-DzIUuE, QP#i53Yӓ3jGg9ʹpux^Br9]W0}C=VS{Ct/r3)9c{bU5|2#l'=I!RS[yU9 iϒqbaW=+;?1_6_CvA홲Rm{3kq|~=' Թߠ9Aq>֏:[?[1|"r 38cz~GC<3_SƗ\?ub1+k- P\@g!osE~(FRwm/64pm X@7_ZJ?szA50G0>N%=n$pa>a/-xZF8C43΃M7 ƹoɷbyp A_̀:Ҁ; IӈqM3vs01EsS:!x [4 [cB=onO1<Ȳ16@ss5Zq=Z4p_34:{qٚlm$_#CU]\Y")>D;7*pR7|f/&i4$h2|->V(N^ܟ--/[cqKmsCߥ́f4a[m |lz) 7OXN_Pq>u Kj-k1t=w|l\{ط?o/6Gs|)xn\.;ء~~fWރ Jv;xJItۭ"OGȏӒW~'˾`~xj-X㶈 bl+]or_οʺV-nk_Fov[uZߒ utn/ zc˪4860 ::Sm:ds6y%՛D?|i |v=Vun6SuXſiR cnCV zbnMg@K`?)z^c }]x<:S1լt̓'_ܦ؁6l[zyajz#끘WX|Fx/vgjȑĻx.M_XFgZ~T'棜!ңmujc]hVcSA\Ƒ bh2Prdc~gA|Xikcp%O~׎x}3QkaSgtͯq$ c`8/KJwwG\Z-2e-˶4}1 C&!; s۴-CIBS>lf>^9Ȏz'/_IXil|d^djr!|+pDӣxܔs$:Go|qc5#+^ģ)~3h_S'3{ qz">:ز7o :+a6ܯal\-ؤP FO{=Oi{S ghR_x?ަGǵ:[9_ek]sYC*wwݫcx뷋k,a=6Ǧsu tj2精;{7.eQg^Mx;U1xھUy'UWۻwc.5CvIۧ9 joqc]5[.إS tt$j#E';g+חiP5o']=-ȤƘp{{Y%cD?GT}񘶗٥w+zfDӏӝ2f#jK=miZ@cvGZ{4t\?3:! Jt2qm1/ٚo ϔCmeC!oF[;֑%#x9{K->6;jcRًN~=}餰!/aCb\tO9dVKAؑ -Qi  nX~6]p#. p1+Kp\@`;wmw[_Ru@3=g?.~ 0mt顅ltY|3m]F/c_KVWW}f5EVCmه1X/*lodRG ''Yyw]cmc'ً7ڱhǶ{0jV\ Ɉusܬ P AivJ?fVڊ'+ul"RonX- GCyGCA.fvG=^Sh)t[]fnn(Yh-KY`A9OxV>8ln>lF0/z${` ;9di{wa5籀NiSr>DB47 JM-vZ^PdmA#1Đ40H35":O0wRU7ߗgG44ៅMꦉ 475M碦 U7{S?nFg[7&̔CM7MlJ14MyM['GG*9s+riœi+d q/rBq{AՖ.2LgZ{Zho-^pA{…EBO{ѢEE[ -i-\a) /2B3Ȭ؅"O焢ZUl6XY)ۺcZVo}_à F5r{uF(;׸Y-h ߼&R7=/R牬8.@ǖy<o\v 6#KqVMg=8'|W7%'vh9(מK{G/&*6FVtbNМ"q,anBRtKe[heX[. ]~tTNϺ2뇡; ]bB.kg> qk|}h,|qDZY[Eȏd1%^8՛-%GOŞ]k_q{\r_]^Dgs~\(_ܝ j˽\('q=WG:FFİW7x@x(HM_]±dwnߞDrBdXx\ ᫒x oS\ǏF p*Ko‹oIym ֌dHرuplRPH~҂\AwYٝov\PX:-* kł0B*_b{{MBa޻ss^ ZMt:Ԋ`?{6ǠWܟ_9"dJB#?gYK~i{ BvWO/ͮ!{"Hnp-* eʩPmtr\vϤ 8BNRG| V|5 T Yjqn#d=w-VO6c@{@PiGOvbJl8|޵SXp :tCb&Noᵃ#pAF{?\@lW$%{#/p\yՒO*iI_1IòSWʺ;AEz1ɥ{?P"V!AsnnQ!?$=5Ґ@( GKa$P-wH*a,҆ac뿉0۟JaB &&þtȄ >?! R4~~@%7xѐu]Q@,J30aJ%L@9djrO4<Ԥ>O"L {.ǒžmuܮԺ: ~mSv8ou?;S3;Q٩cW;dd%s0NoK7Am,з~*yؘ\,bslˏ('m*`^t9.fgMhV0e{=pJr) ,ow 䧇>=܇8*u%?=x! "[B9ñվ+s{ai^M,#-%Ki KKoDtXG .*?Q`$wЧ@Ҿm `#bPR$(y<Ҙ5i\qMӬ-/FD7QLCH񭇷QSOȰ_rD{J7=E }E›]FܥFW.#uw EqN M`]~8+jJ c6_b_ DEވ[X؉C˒SCxڗO\fvn&JeE]A|mՙR7WUZZr H/*G_.5$I LnΠꌚꑃ5/F(: 'bz/3 =0ʞ >ZG 5΀o x:_ ggr3/cBC>BieX0z:i U<ϙ}(i66 _Zx6˟,\;gO&T:=Qf~,-XlYF2Je-s|ʀ|, MW[V5gKwF;Cn\ +4hBf /)Z G_ s`ÿc\◔n^(/PDXJ Vչ2[+h4ͺl5U&gr73Lh-SlW-&6xخ*sc"]O[lljЧ^be*:"U:6[ܫ^V= TO~ЫW~ܣ`*TR}LV~ꭕbO)cչ~rAbwW|n՘V(wU^SW٧5(iʊUP]SK*k>WPMS1VRuƾ>%G*>k}uLRbLowIjn5O{USuYt)f5Gu+"R#yS1YZ@EUץxwjUVOЪ,:؀zAzڦ(+-6sCY=>/e3Pa֬7w$C WžnoQ^KE%.;oj>͚]U~ 8{OcixH#OX`Hg7{fb1:.Wфh>B7Czar4|΢y&n>g?AiF5ΛuI8K8FAUs?Q˘K6*˨H^[ok!yᗰ3&:jv),[:|F7q`9 ?]}= жLJiY Bs}{gC{C& xG*Lo^6p.H3޳bג'x֡Xe 5vxXSoVx:,2:1CHHc(" $# -VXXN:cyUm(U:zd%{TȚ7 ۄwv_΃^hP ClLj:EZubuVֹ 711,ubf#b~ ,s+u d|XO0D/ٺgݷ.e`SݰL:m1iCڤZr<8dņ<7\h! _.vԪ*h61M.lcT6,5EIO b1P~J]Em a<>\މA^҉kB_TN qHjSt66,;F|3 >\")mkGR)gSNgiGRAD27ޯRW9! p 3B@ Xp'P…^}h4JF3V!XWq\I?%@Uq kSsF< SML ܔZ z|;/6n4XǗƕp*L|V5ku+3,`<ھ Vf[? H%jX/{G *"6ٖ͐_ywv/u֏_ dX7ˀTKhJ˼|&ojVlUG8iNh9 G;F`; O@!(^R!2Z`gwHnLvni4&颯i0>㖊~Av*B]LY{26G8A*^vh\y׋5pxhc# --7s:1$,ڊ#,f.$LV=.4GDFFĒNhղ6PEcZ:݆FT>I4&tAw'DMD=!+W@zE'%K^ӷB.)z"z $DO"N,Ixk  )۫ 7.pBt 6eۊXn]EIt9 ؙKvߥJcƎ, h3H9q%-4P9AP4 `)'#X)? ьcFOB`ajQUhő8,B @9v4ZQX,-I9zDh 6h Cy#xF^&jf6 W3h f0 7 \^-`C.׋GC8"D/$ gJejI _ E(EDž?R;xjZL"HOr&. FhaOQL̀RBd8&z wT(" KT !/Ƚ2a1$ޅЙE X jD12vdJ(" :*' فriTG]kSʢ6hH# Hg l\57q*O2WrynBT JjE QRA )@]^]Pt' 6옢GEDZh\mpNt"wN_OV~l:CK̝y\GbEE`QAF-*T%ZEWm r Ĕ# !܈JJ**ZW)XcEV<ڼ;Nvv@fٙgf3;Y@|n &~גSMe\8XίA?!7*͢yf55ԘG4)Ɗ5pX/?@p%%%. W%V%eRD]'&7?Ǵ^~2L hw^^ ^btnE]\#y܄!ƖbG]qcxnEؕxAx~r 4𻦼.pr.&k!#^ i:e8l;w9Ջ=4`z;?ꭳN[7}K5ޮfz\K:X_%:ỤAp=vb#6P㧍 pd p)E,Xo F̢ IJbRW"i.(){m$^K@Iܣ#*W'Zc!iY3P"`! vLTژ]WTAWh`CTqWV"|.22 ]Fwa=h3A`ߪT?`qzsb=vLqupL< >ƩJ2+mUIlBby*UtR! s(.摨QVQR=AjG^򿃺+OK0% >캐Րxʩ<bhfC] d/,YVLDjGKKYґaS PwOn8|U}d5wGw ,a/Cf/]wP? s09㐘Jx%+qo1"r1KBժS"W"ΖH-+-1Zv^KX_HpG%V%Hh^H%%y%P,uJdJ|JL`K|["WDvK_:%JAl%Jl%ȜOJ#P4RIAlrYwС-U?8Px-$V T"u=bL׌!͖+Ld$ &Jf):+tdqk\< |}A]f&Ti,]#)6?9L~PzffGR+ K8D< 5wz.UyEM"hhL{nuSr+({GG%[3ŔITU0gɟ0M̭ɵ^pG58&\_p $_mG 8ʪ Ɉ37DD]7Tզ- nQ2x\qӹJr͋-N&I!Vd Ge**Y Ufzc "L_c(nm׈DF0ES|&z̙Uvcj$術dw>m2#:):~&9W#yqkRyy3xEZ ~#<)IO%pnPXnuD#|8yk6pS4)0 .b\U\B \O.'|<)նF#~ XЪdl?hj5<@W0#} \ \ES"K+W閫Ȇ_4L%$jIDckRCo3DT Hv@PߣM?Vr)L[y+s\$D#(:oP<ro01}2>L/$N#|p&9 s"j4-'<)M›5J!6/ĪfPD9D!(q4{^Q(іjGۡu#iG]u8sHvhgW;س9zQhGڡNG ]w;FЎzҎz?Gk=Pv:8vhD;t0ѹԎNmN8zhQvh꧴۟CiGS;qhyOhGюڴCG߫vEwccJdMvE_YW+E+(@7c3Y⿨gp#O]֜|f>}&zkm]J\=+0hgEwl^. wliwl ߱B쎍k ;6&NWȹcs!{FB;6v-ر0)ޱ8Sߎh8dƫy!BEڱΊ)r wV|-HnG\χ|ܔGra.'e $FH$myHc!ߦyXBf1!]V$.y:yAȵ\mB^=MH<!7rIA 9IO: |gHBObnrЛdAofxzsbW̶M{I)o&` ْ -YU>Bls#d^qYR2V6=BNӏ4$&RHD|ףC'߂3a@uHvBRߦokXVҺE$Ðuذ`^ähJ'y֊X$v24IkNN$d#m$vp yc6Tء+n]..᳣zPɳ`!YŏdjɈ%vMIɩ |H~ HNDx Ir';n@.3)n8n,$El&$Cr N$kO!H~ iŲ^/ GLGVX,!i B`Fr:MOBFr?`v&֤Џ7ќ ]~c$f叀=þAI㦧ޠ7{wy7gz17_tgbjۛ1XB0o&;%$'%dG !)Iȩi(!-n ' ah`Ц^-1n,B$m=KHp4s8[IlBFF "wQۃWFiѹ!(~B~~Ay3׉lD$ dc%i{'KAoN_ߛWj'Y%d$ؖɑXB"QBE2'R?B"#H䜄+ !dq5eVMOm8!]AbjTr]'ޕ,zс,8{iA ʱޔ3z9'r6 rs@-׆ rmHM A:W ҫC 5/i,oWN{W$re.*7?egJcy!ފ H-a!^AZ,2<ᜐzW{@z:y iOl@>șrpHoǂ˖@r#L幣Y- c,sko4>0',COYO<",F0XvrM8s:X `Y2߄nmB}cy[]3~CXuxj:N:Xrtwaf爄[2+9ĝ5ob٩?/˳ð, caX{,|~,ój'vNpDXD坃L!`,v` bRk<@rM?ɆÐ3E<"9ǚF2/X$63q﷙)Hجɞ9lݤ$F6nmM!v}9| A20^' I)?9$yr>~Y{@+|>#c(P,P,(CP\i8ͼ9,G7]$U%DLZC`,!sQB>#>X?BL $d!Oq{G:6[`ᄸcbۦӂ b: 6!ur%@VMD'"P?B=c~@9Rj9Xa  dSŠ7ww9zc ޔaߛ!, D_n%n!]6G xBlmKn@V݂S|)M|ppBjS'@6 #TVIHMHT!jBjT$dT?BvI _eUp|AX)LHC#] pH } ^(#E|,g,$ǂŘힻ线ùߏܳ?g]hLHznB, ^w_G0!~!^|bs8E+o^ͤG.FYjƛ$'d >fIrB6&E3!CMmh &Ğ]^ӇT>!.tRk!9!@DŽ\7NIxB{R̄g|H7!&#yBNȭs*2S ~A;!=_0!NdWQ̿j62J6՜z 4|䄴r[O3z yr_xoWGϫѷUKQ>!ZD25mINH~[带?d'dNM&\.p`8UL `|C<ܴ]'J57ZN^<%$#9x0 pcRVm D)g~A<\$#ÈpCx&~" ߒ>Zy8l鶳꫼sZEVgqjTcwhc8@ u\^DD޳UH9xe0 {p K-fVea#)d!Jnc7yP?owȰ G p &'D/%<&\Gs8p*,~r-B#ccZ݋#b4ggV˩U-J.OŲfl|e sUdotKd1lggwYiO,hr?X)*_þцQ1a\R.rMtіQ a[%pv(]ft8%T {S6G `6 gm]?3}ܾlmjt-k/ pbr9,}J*"4X%qٍ|;;HS`ywG똌s؟0b)*t=CP;6b4H̱ic5a>:PW(1eb!2`JMG5>2̟ʇNJ՘OG heT6~M?T#%w)P*ӊ݅TڹvnW8tRe)ʜstZCy)68x*jiZ6je6v:Jj6ENC(eڗNX*h Nc:m1ʴ*֗NML;*bBmkQuj4?NSף϶fUq\w"Y{V g4 : R"NzS;kgDg h%;Cŝ6xKvZ-.DA&9xII5$ND'vB%;C\;$:@^TRKguS;%;kgDg&8}Wecrl s3*4y;0CK] xL`ʴ6~\7M+q)&$~ɣnD$qD ں*!A0S Ozwޕ1+33+z߽{3/ܿ"7/U'cZEީ-:hSs,8=#NƗ%ZTInu[Kjh;>ܱɟ.XU uQ5z%w^.%z:Gg#Z/CCƃ< Cp߱@``fFt[ y J 6X"h kAyLPϘ%hH ji-tҌi$,l^N}h5AU9A;e>5X H~HM6'hݼ:jroq m '[SlU3nJЩ%Hm5AorzzHue i6]A3l&hwdjUqBe7-5ڙp%o^F dް@>[kgW󚗠9YM뜠'2A[ (Ur3ZLKPX |4S"h5 9ؚb JZc+Ao7/AZMW9A12AQR *3#6/AYMPy'(W&蓫򰕠fOۡK&+VCTX"e^kNP7 ʟӼi>u圠2A_tu dFն5y ;jqej,4VJn^>h5A.se.^tX 's~\e+A7/A&%NЫC_^tfyLРYKPd X H&hM}E3N3&~^RM4fe"M&r[ y|DAnihMh&CA屾ua*q҇a[[b|A+vXP0Tk' U\?ԣaA`#6@pt*?4G^&Ob+>&qf6L_o0ܡK{azu{:UlMovJv{9)]Iv|%8w . Q ExWqzE oUlm wƘѨNaJƟS1{}hGT2 l2t~'mc1[~l>=X4 -9n9f9``貊_,mH^]p8RT0X 9bجjXמ+5u^Zy@ǛOo0Ҫ^F0Asq5l]wc=*_:7x%-xKt'y]q0iUf9YO7Vt/|Z6[f]C<}j [EC[sFǺhgxkY%sgiWo.Ӡl>p)GVVPm^<֯Vpa*6-Jn+ׄ滃 yPiL-kl٫1GmE>v;GՎ WO ރMH.o W d'9u 4%yH ?ͮ2fv`=G/S KJKC&!Nb݄G !-JM!CWUt.<:C޿ !F!NC}{)tWW$tt%tOt&Bw2'h1Ήsηig;Mf /.:?ȵ~TrMg6e?"(z B6fS|XY+rk:}t0+߰DK$m|i.ͳϴ{xUR!ֈ]wt͕"Za.P1@y@v)| `\ 78jxXSȅ#!GgEUnV u)<拎2K I\8;rޫFgl!)t ?S>|K9ui|Y{c>y,zհ/o~B:4$j{D9,Ib.GV3CM f9vU%ˆ"ж}la·L2&RKѬ.dZkLdbOM+L(6Q|wJMߤjfQyoA8~J)6YY|+sNHsVh0/ۏ rR Fׯ$1 H23V%qm#Br2K'{e. ƷwrIg[h|o4Ɲv݌3y˫ Lj{QpUcvCZTXj|mB[U_ YWVn@۠4S!}wj96/8ݾLLVDB*ox\ԯ ˢKxzf6 ? q[H-!Uut\p(^ ͗ -<ʤ kww_I6/e@zC-c ¿{o^mOvQjvHc6ߍLDεTh61kh1"gmgEТnK9m. a^\Dum ŗa:S(VC^ȃeh^yh[Z/w# yn(X 68nWQW*|ٜAD\BQ`}$vDu4G;vn+J ek8Hjғ֏۠OEeu i-Lo֛d!ep5vwmf֏)%'׆jW91ilHLH)h j2\ݕvwc|>ҿv_?W.!/o턤L9CoGS䯫ѦKtb9.ZUT߯;>ݤ~Β>Ms%c#VkoA"Obਙ6Оƛ"\ )#{.E nˍ/﷞ uNWVUмxv_ y0: WUg(nVIh%;iGGkԠhHCZ:c_-ڽ[i/Sc>ڤ_ZHWh;H+DW"EN VGY;+AŴ+D%a눵n1 i[S79&tS1мr5vŴ(:H/AgA}M; ŐCqun0Phu)πWӁ6hB)ˠυv3hZBZIƶCc|[!ڹXhHZrBhm ۴oM$QgSZ$ю[)}~ȨŔ3/oƈWӀc6 A[f? Mm6|I*yHNՀit}ĩ,mkIJVr'ݙCuBRr È3eW2:%SF-t_"j+0br-#ϔ3a7VL1Ԓbhd8832 }A.ZӪۍ}}!d03iH+'U=Dо}.~I,tfOSv"(SL^K A,}OFI{oSKUUw+Ñ[Wfwʞ)t)Nm)vƀMj M{7yVS> 7p F U5aR3a3ZfN4ȟIɕJSP4m? ֊hv3twĈj^>tҎZvoo}TK¿Zm#ketB 8}j8:;:$`lI ~  Ϡ L{a#7k%BKۥ Ոh[Y ݍ A+ZPe}HAg0C@'^ZWDw@syhg{8 hf 6Ni`wS?PNWs( IS?HӀ#^ː$xDXvMI?B|:/\p~(?C0* J<~D$1wK_sWȿ+iu 407 UG^%:,]4\Uɿ䑔u[*P쫲&S.Vx^4^*ÉE1/zNG@t%vgR;u}m~>W(+ڞ ]8ݫwudnhEnjD"yisIsW[ pp$Cmucկa&IHH;q  -j22mM@)wJ#$+I"(gTʄ+$#~ H XN4DhD |x7OQ' NA%x[f qVZVVmPa*Ɓj2**%Y7h=G/cu+ Qբ։z[=vVUSj{L"ɪwd6ΝeX{r0GuXڨ@qbHpWT (-V(D/T?g<UDMiBV"pT!h-+ $IPгPh)`XP2 RKȝ"ٗ&?hqP;jډTL;zb)Y/ -s٠X3IЃRM̽d胲J=?'nY3pLZN#-mNH_@I;z2G|QtuMjM k(nl{ۨJ{26h L)nA1* _ڪUwJI4jv SIZp!K%UXY"|ROH7H:z /B+9yU3Y7AfLo;+Ў=߁ mlZؒ+BVշB$鱀R3 ;V%@W!P"C^hr {&Yq?({Ů[״kϳb|/ tX-~x4[hY] r։S!RD)Y(K/o&v(; /)D7c6IY.bS$R%LA3Ź~=D2r\݆/ERjuDA/#/a0OFu6];xJm5WɨxbMWJ89i`xHG}vrHEuVdlSE˰ޠ@/\;V~ gο,XeUZ9H:$(V'Z`Um,jJz_xrXG.ôЂ'úCu0&$CQ) .C~q)mkm $qTK]۠g9372^λt\V3 BvCr%Ì;<}Ҿmx~ E?ЍTx[WXGMDyZCsw™#UlFϛzZؠߤ|U @hlmRu C, R97u 4IAid,Oh!ɋC t 2eojրk0-4Y"쬴Cݐ;D(ɛ'"$xO tbcBwA1f_2bcPb.ht_t6iM$-' lx×@$vŻZ)=;2%"3ըvM`pH95p緪.av5[YdD6i W q?j" `}@'˰1="6>SdxnmPyAaqN5'Om^ɩ.]X\߸pXp6MdC`qռ͍0D_^ ߯/X,c/TC=p:L80QVlEFρYhρй+0W8-e\`sa#':e) ≕}3HM`Sx#UvÞzxҫbmJ*r+4 9 VIլe~ L 4x"Ofgҽx-(9:(gڲqF 46u;ZpyoFd )[xBbR 6>{@`J] <:Fn鐱/*)" P$&TCB;q>׮#t$s La]j_ fzkvF7ogJϞb g/߼[]WFy+r./Tˋv.$j3\>)t } KH!XhT1,I^#6/ay}L0/r`OgnG=*Jo7bWp+\+o4OW+jC]EZK3\HJ vUAjAg0*8 n1{Om!/Ӛ%?QFr'BB*Flj0 sL܆jA!n6F~jG~A rȫt Ӽ2`Ekݗ&? zP[uO!؜>,xܫv:\ %Y8D<Gr?aCj!f}ދ߂R+N0dp\1~zcbgBlOxPe$0H5g 56Ժ$Wk(R!1&Q 9]$De'\OlbjJKF'SF ע8SktQ&akYR[FV3o2_3_r`hJbc8%( _F[,`f>e&{sD \gpsu1q~S[N8k _C>w>^:1m͟ןGtkQ@l_ :OMJr9㗑1"Xz]5z,3Iqހd-'\.IE^OMs?o x}N%l%/]Xn9 x~ҁ bD5) d`/r' lc#a`yҁ O.ئ-פ"8CunB@I9 bW _1k?G.C`ko&vh8?dvAv#^jS7Kor(||D|@`R.G>?\"]e mQVYOezaw̶mEl@%bLg+{eyy{0[%mW% 7sK[ v>O'CTdcs5>h 7ƀ XD_d X@3pЁShh74s9==:`/|koI`KMkYa/R.~a?}Tg;Yv\0 !22qT44:d3`D*~gM&| 7L79 m;k;=w;ޫMvWa8e8Q`B76o30y<ƀ?3B14Yɀ]&pB_5ǀ&pB0lʀ[>zv#eEj^;cּlSvhl"c1^6w>&wox(_{iDvwzI&dcy2mQg݈;;L->u\l*s5&b 5ϑ>|ir/9HץᒙcōdZrlͯ27vy}:igYUc@( I4rT (z%R^]K3s6TDҹP@Xkjvv#؁E2H8O%)cvӸa%}71ZSk4 ][s5 j +_SMHMDr,+pVI;LJF8H4 Bz; X8NziWB"@SR we*tR4'Xm e`|\Mf}J/a>tU $@"!Y5JBĮܛ3-+op 1'V~sŅi%t@uF[O> XܫVJT@wUAqJ5n =:=}8UnNGR+?bA܌Hj_jS웭,)u;h h u$쉦 l~%<<޷aBKbUqXkFpHzK%ЫX[qG*SưOcID{fZ>Oj /#:KB;a cpj'qTRG зY3 l%ewj^Fv| uǗAH  w>nZVI[Юw/B/KQqPjl4)֚m+ud_׀?Sڳ\ B_x͟ Y[4&sWsXKKހ#Gfv %CrP++6Â2E_^MoKӗ T\T@K_f׵顫oW`B߮PQBqB?qlQ Sf[;hC&?2ʽlkM0qo+"Y ӛSLI_04h^p+IY&}|r3ʕ|ZerI͔y{F!SVۮ##̣ rހ4/2jB?j''|iji6> w+- nvFCK xSE?m@JEB%-"iKS*[_!ŵ\q}AeUuu}YTV ]m )PTPi?g$-}~tnfΜ;̙3o|#|D_|@H2#VyγSٴ s\v=|Q]c Ŗ<֋sB.1:)g^vP{8'[cC< ;6[tsqDi;ڻ4>+w.:_WS.e{>51g Z*$;\Ψz䝹%90c!ԯ{%kTIH2ڊڐ'I*ܞ%_d#?5!(*"r`~2P ŧ>gaD Cx"48:س9>GK~琴ꑣViCQmN|"uTvTOG+ǤCmR9 k7t PZKeZ%¬gBQ}4'k ±4[̬s]m,e.2%(i3}ыY$a1'[4SjAܟro-'4N:]&2R.cl7gLti}ڡ|V}EgWZ(.4cțR0a_c^FكevNAwYgl nC nd3cY7ANw੶:e)wl]\6NБEtrR֮ ?>+}>18^ίpfI:zo*t' F׺jF輖uj3t0kjCʲg'7B<疶Gf$֐L<޵AW2H qUf&yD&W=5qD$ch!2Hk%MZ^Y oF &o3sqE63-E}dmQ )tM]GGP _B C՜U4;U089CS KL7{ ӯN_SGisCGb0SY },qOa\ NM6zCd` ~ ҩme( B>cUo7&4 6$ŕIJ%%S# $7r#=F^}vmn'~@9FC!c)J WEE#*[5Q5 G|"r Tj(n!޵*ϋzz{o,x-Hv2l (8߂ֽv_X1.PXڝ2I)Eَ]UB>oׁn8#fo?=ɦ>6-L@M<~t M]"ď)gDV MzLBX' k'j}{!`'95xVAc :{،<P\T֫KhB{Q>h 'EEy2ҍ%}7]fIq7>Hҍ%t3yAهa@"f#| H+XߔFJC𐚦-:S:mը>7Z˭[rDk !Z:sA7nװ#VA/">5'UjڝeN2 `j'&ʐ`GMц.8ΧeeBm,8C)]hȡ$|9CNh+1~:0ync~RG#};l9-򳜐uWpg{>NGn8[_dM>d F g׾oN6??('w9ԋy7jNP@Dr4O 9s:1B3,< 8 x,w O< ~aB嬓e ?fx@cQ?P:qtbL_8e{-jP*x%-| 'π3|מoF_?1]& g8U+yTO?O!,@8Pg| <85MN Ny<'AsE|y5;7P!E)oNbPR$9 mmQR:-Ll%S)9^gZm<%Dɿ^l;xV(q{2=dR'oQF'x.:8Jis+>*飢.ꎊFB`O~H3) P X%54^Guq2,G5? ޣ\qِWa3e^|~ӛV"xbHU_"GVOâJ8:KoBa;֗[()'<]y!WaG9fl|DGf;F0o*oD/|H|.B߾77Zœz&}A7g0,@>/*Fϓ|5NnwH*IhgmxGي8(M0sFrT,wzՓfˉe J3 zw\qjAʻrOѳZ/l˳Y&* c7ƁS.<@`> x0p`1.OL$Q {3/]~Eѷ]X (9'EUEU/Z\ xn(< S~ 0Ͻմ=hρp] @..Lǩ.!|81?Iuq'9w!ݓ.P/8h8z\{RE;P z=tBDD]AmJ)B| O9 wD,>  =7Ody cu#@P+6lu'4V<6V='6V ͌'fMsV_m0j? A7'AW6{yl 4V;qX=Dh~I4@c~5x~*<;v[Mu3u5,|`,+NR9Bb 3"8̧[pw0QptIrni |Sxu")I՞\kEv+mi1 ֹh0yBL1(?]|>S-M]p(o53Mf"-K`Ve{glo+hq'&r>+GǻC{ >ޖT%(yrIˠ>lTj٩6b1:L@V dVN)iVYݤwdH$Z˓Ed9U\uөlc?;d,nEeD7(r;6]iG⌉WJZF`+r8iw/0vjQ%V+ά`f"FgsUA#ɂ46^KL1gneC(:֋~i8!{0N'2ŪqoIxgPu/s_jF$L'#M[xSiRn Ju }x=39›;DI6%n-z?'&F99?)+ۭ!-U_zj;XySql,另[ ArL=5xU|7YTH] Y^bI14 HExE L7V&qJցWC} bdz/\aT7XU!N'4MEѺ:lH3ӛ}W>@M+ex1)zSUC>"Ev8֛ɪ_NQM;vCA {R+D\--_z]I_W/)W>8px5~[s/K8lMgѽMc!c«J@'77𘑢ݽW;Ud(] XrϰM*7_mWFKKܧiXJ%ifv1R\vVzvQwPx-vhP/J*'K }?Zbt3_3-= ȶ9IEUߗtf't4Z]}^Uֺ#7(ɮyB2 C .(a_(܂\)E*,T]#UjSN)ܧ̗"bl(< aN7FiՙeJڛp Uk*wQK GuQ ELQ\4 =uF0z !YGd-?S/sp`$@م ,JOЕ%ՅOKɐjb7ݼ|!kD^@&kC~9FnʼZ4nY/j4ɌJ)BƫY/QzHyjy"Z 1w/ߨvtj*:d\ɍBF΁ BCpTp<+ȒJlvaݠڸ{cs:ə[r@vUC&eXHMo!Ŵݨӽ7׉P7[(F`afwL$#.믗h"g.#n si2BE<:LC}!HOLCBqeMV\1A\:ƛFp1(RZF*r +2]˓K ow~';m֟Be)أQrIOMR*Թw(ՕVZ*òsYR֯!+Wdr(CЁۡUeO'Ec7iz+\ob4`E3m ir 4{X¼SxnUC;h; $9q2}3T5O3Vlv*];$K|3el0Kaz&9e_)~>BʬH,&_3 vw~dXj!v?3Ls^5&̔F:2$ Ԑ&{w&#_I|MJ5תZ٭-mcPNPKt/N4}|(s0t#)p~LKV`NK.kÿ+T&ڒiPbT'P>TC0Sm,XiS&>%z[ZYTTk(ZUth}ĿhQd*bx': {IҍPhX9k [xpETء5PQɆlv-ӛ¡7WjYY`m^Y;_]^.Rk =ʻ\Tw^{ZX rB9,qƃmdɌ4ԧB3%.C]CnE2D81^7Z^ 4Lp%]dD)d-!V]eI'9U}J[YМҋz9R^{GJWs1_ꄮp%;Dق^)J@+\?S?~=0ZUW-?QNe_ ෺&]iu5ƫ Zuw:yYhqNaݲQRN;Z]l* -v o6oޜZڜ2AˇJFCI.rY%߸Ψ&$z)yf7ś]\%٬+:iIwRyIeY^KGq|"Kuk,"c˸\Aw _VqeJ)p_7U˜ bkU|W"R9mL'9=k7;wN`.axBe[Sb%R-PkB+Dn3ϽLڡ5 `]RzL|ͫtKƱh~N7kG-\̞`~CbyӭJݩ]<aH#€ݽ=ԅ=B7`2,g'&ʏ% - yF(?H<қJN{JJ ʌQđɗ{%gHOҡ8cܾH2j (^!-9@Nt2;q,J:#8YŚx+QSGNrO/Zh#t(iZ$ :8͠c xe[ S hqAiͽS-Йx˚͆. "r]#+DEO=&ng;95LƁF䊾ZRنن bPEuG|8Z<5&"#rU`_"S&rt↺xCCwM딞6y:4j65pKxj/ Z #W(wLCr#vP_LΔo_tśVF$ۤm3qYF@;IۭLpoZq >ƪWǀw)V#ДE !1¶!-p!;7%us ~0EF+HN[d /'4͠b:>VNj;ฒkQ*U$ţ\kϞ-a?/X+T̅!SņG^,W-aY;7-TW4K=HBmsdŠ2ёI"L{FN @)*>'yj,UO0F'^I a<ɠT{ hIjrK[՚,`6Jfmt S\rreW>.HCk)ze$&d)#lN2ݠH{mQTֽdX䟣)4}YtIޤOwJd0a<:EAVb@ɟL݋NE_[ x EHlekEoy gBew(gS`*wù} ~ĩBruӋGg^]StM3fBT6$wo;fe,T:K=Ub-]*b%wlgJG~T[hV5qxʦ_-H,ʖ+\(bނFiaveo*œY~2㧡]bc WRN5ȩF9L;u޽S),mY.fo~^Ls:;K"bݝ"ރͧ7OrO~r0h'/nbFc*0=I*۔$|t+0g}&k9Ki%I3ěi9KE+qA)qr_L.O3MY*hc5R +%%GjML5/_fԹzX1 @@*^tnFKO=+z̑b IUHUipw[Ź*'TtEagPs̤*J  gtt.zޑfz VLFt4QAN4Svv=OGJehb]mws\)`JO#t&!st6Q5S6yO4W&mQQ~DTtx+mAEECq(Iv#'ճd$T|FwJ5w\V-&fI39b6k\I _mIݒ-i!NA!I?x~>T)J+Gc@]iu["I7VGF;M~"<]UK%.61W0G+ bWbn3 ᾉr5$?@>m0qQNp}DMc\ ;p2t;-=aXk@ ylg(ڎ`7^86+EPAϫ)bD }1g'ބ $dzT% ۨ$+=f:˲|e:W;f0 3qoЏv;OQ'tzxyi㿐O>L3FiTt4vFoh2I:ɓƕ̫敓[VN$X*Mј>ܼ*CS ~C;D>UǖGƸ :oA,Kq;ޚH8ءvޙɃ,;&KCts>CTvj'^9ZFb]RǗzW%MJvPod9>|N.ͨ,_SbHlT+AlVѝ7F>O4/1~OnSi꘦TO u3)! e6he샴 (W@7 e${mBsoMj$ `UbhҊ;TX -(8F[4}<$zYgp|q,[XVd)<:4]y)9X&Bݕ*զ֠ԴKKId:̱YSh>42 8:R}boAɁ$iUŖ"ݣt/YHy-ucNj ¿4bh Tj{bo~b½ jv7ɦ*ccEEv7N\rɣvC*>~bkō7x:Ȑi٪p=*IDq|G>Ht=:\as@3EFhkyX*EyT<#uiS? dkyqm }+1ĵ& UGz-Of}3>!Wkh9n*'`rp!4w^&:MLcVjC%Mx6e`3ޘGGkW9sf3__ˮ|̀H`GO~u>MӢ#3ddڗU[OFK:hdBTl{&!Oo`"w4~uhd_2?(,ls+.93!V.-Qݽ1 u.9݈pׇ yx/a7 M91Q} bӇ$tJ˹Ǭ-Mk9 MҢ/g5gOtj2X5 Y\H jb(om}(u>B塎%*g⃼$QdA/T\F̍X,Pæp4jStQEQ)Tg-| JL1s*EDݴL0:\1`{(1k?7R,+M-aMDB:mQ'w߈-R)* ̟^jd4Hvߡ<5AÈk#)lARϻL-VG0ll90FVC-tA6SqCGuPg*+g>zJНt8*׽wdw5wj-|z`9nU i _ɃV x/1e7Q,ݺy([ܺwif51#In~ļTG 1)SYjQ s1]ьߒE]G TЀ[mĀ|_p&^@R6i!cAw)=xR=!W裛@TC)Ko 1}F5hީƤ(ME⁶э |kz5ZkNKc6XѷNWlS+v׾C-ty&Rs#c {k)E, N)cٔ%ъkdoQ-WO!<~6|<<.?g,5}TlRYqvCwvTA.m`g[UY˭ UuEJU?V<\@.TF/%VJu~ґ"'sy?;٨LoֲWOe_}OҮbdrJ2f#I(>J"k{L(_2P|DIf"G$ޤI)33Jr 镞Ik(=Jz7g(PtNo:BǀNx# o,R@ >-U!{-&c4{@߇HlMGb;TVFco=^.WE_EO:;WQoUQDufBWQ{DN#gըK*+[M/Uz~G'ۄz_Puu)\uLO B{Pǩ&5'0B}P{-y)jqJw`f qxu5q\RJg ]Cd_! y!QńB(t T&2(F7Mx6<3ާac7}<2_=7jyW}e<|Ϸ~VԷoCQͳQTRx-{g"E*u寔,o_w5K~zdzd),R>,M,,W4)JYR( xJz{$I(gҏ4I[z&P Jg҇DI/LzAҒI(iJt7%PI)t\$]wZ0V+S rF0v?hUS\%]5|'MDrHUII%P%^5'żD@%1A%1J%1B:D {K{5G%G8#Wsz8R6AS?ToY_Q{HXUTIܯfU;{xHd$F$U jV{KqHTġޙ"52?S)D)A]*ԬϨ{xHX恄W%qJ"[zNIb/HUI QIī$jVzH(hlAlAl5$D Jy*5jhO/ QUIܩHSަ{ $,* JBRvf- 3/EH$vd [ 5F5'oHlPIܓ*"aHpO˦z!sn Ÿ؎oVq{k;"bk55oǘ5rʻzǜJsV;ц9UVcjVkpwi^8oL9#D^'N粑:}?8ǃs܅3B@ 5mMՎCpHj#yӡj/%j~rgCFagCN֡6UG̡vV;ٙP v;Ԧr ;#jg9xcڡ6I4wfwvq-g(Crxqq??>my(> C!zPwu;#a(*S-9*:VSNMUÏ*ׯɡnc16U5AifXezNu~_nIpә_SkE*9pWYF?R5䪚Jp9Cwp"m2O]S~Wou "YsUEᦉ/WmnQySʑ=ܼv' ~ps{;YΧ>p__=w;44- wL\YӰ0u8BLsۉ'p|5Zv"z`Wl/qUO2ՉuJN@g)S#+}d_w;Kdž;oq|SZ'!2C29SA=y(y{?x ?T|3P_։jvGFXޠƹyUO^O}ɖs59Z`$ybkտIöECd3|fU)b4迗v{I'&DM;B?ݤ(п|%&բQv{{7[h CtooտI鎆ECbs|+w6jnk 'JO&Mnnoп|u&-[!xb迏y_=Z(L MS}-uL!Ll~@_on_4-k-טof'vأ_^+hOTX2L ^ SֽO4l oa[ yg{^BJ?ԸC4rׅY~8҅cr>3PKS??:ONp5^?\A# ? $){lj:c+|^*97]/v?\c:"s7omEcjeAe;$B#Dg=v?,%{))Ǟ-*=v3liﱫ`cZjA{ozTu xQ/i֕9Y 9=cp]]FSu ?ljF=qX4=~\σ\}\~9s* V5矷`ofu; xx?^;>zc#՜T MxSH n[!ĞzxN{zE-J_(u*.ǖRklY?QGQY(bŏ aC9 gRTL?\ۄcvDQpo󗡇"Cs*DF9!~h5/:Wjp V0RmµJrG'pPìs^p|^j&>[ϱe>Fg05=THz&xs aޯOQ~j?\Fí{xAS{y*?.z~(Ӹtx:-5a%xwmTn@9v9uTEWsl>ω|ruz7״|%OvysWvcP%c Y1rx: .뻏tkjt+6P=iFݱj\LekmxS\mO6[ ʹJ< :imFUsgMܤl 8*_` B* w |Jh7PyߡD/ 7хOu5j*xP D{p{FktFe{̀ϲm46 (.}?1>cf5jDb7[q|@݉8?"ZxXq} $gmDP6<_#xͱ.`5oh0hOCm?߾Q[aǣm3jIÖcxQ cz@Ӂ@́ڠU Wsۈy}bls,D/7῁N51{k4$j ; s\{=ov4&8b߮8]P`$8>M`$ TQ40\^Q+`$0 l`^`?#,j-^@0|\ ƚ"@9K@8C.d׀Q?l.Ш  (F́!* PlFy"6y@]-?=Ps ,NKp̀if2Ta2"$`. ZQ`p_s @8@k`(xf>6gW` 8 ,e.QX+a5.u ~ _p \ p p%lj1F 6p Ͱnp wp`+< GQx GxO sWx^%/xxxނxv?_!|`7| {>K`*%J~fyEٱu0:^Ή29J‹p,Qʲlh4{CxQpL-RD- Q,iHQ;SUB.)a(fgc}V*[R,!G p.f8Ynv º; J#҇yurJRª I j֫PϨR!, 6J|}J?e3lWᅴ8[St OJC@\PT1D7;etTSDPk%R-~pi3bdz A$5i'p6 J< goCkHHI(ȊjZ13D mWz R[H&CdB+nSY5*吒-2ZHV!hASG7ߞF"/(=26 uw?GK:l#RCA^بg)y#QhGIItOkn]VTX|jLO] O=m0tHbi1Ews6HG.T?'OadflfeDNwXTAĨ(fP)+sK6=CuhvK]Q̾"YzOcNv{#ύ4_:t$#4&Z8 ::WNjüʪl&:VXX@ j%m N44\211:܄879CK b$eBLT/4v4DXXuk3 VEMgࢫQb,slRa/^.h]M+؞*-Ԋi?5 iR V,\  h64#y)'/X4ZwH1NHcP*GV6뱀JmTȽg|07@>`-(~e]*+5ngQ>%ƥS,(b+( sVN@tV[@a1lRe:.pf AU)EkHrt|$)!bj@۱ Xr#Q:9(QIӽZw0:ߓt7 2. ek0/69X6dThlԗ`X }M)!UæDELR-iof[$,E XGg{1w2fD 'j{oHŠmTE^-g!aM@`Z>-7z%5]ɤlSw  y-m].a@g#wÒ$ k/ REMez̋C5 鋻]r&/JE2/LR6Ma§!ruDu(5!jxK԰e~^`]"p^^,fIs`iZ5TId6D<ZVM1JIv^/udAnw/8ΎI̚KÙ4KSˑBY8D{ ~JO5l!(>T _w0Yts$bf6#eb*Ds Nψ+ z 8w) F_:1gNkz))1Wz`J^ mI@~^ GIN\zR6VUv>ʹm4|=>"qφJGR^AJ$:,FM긌Re,끓gӫH XG p=#>oxlof y7Ps]^+z cMa`_uB/RZMïJw)qLoڭ2mY5&7WP=y\"¸vܧ"X`iEu Г6׵;Oznkkϼ]/'ىSdc%1nǵ[c$HR%<32.Zҵ['DNI|%yH #ԪTMLz6nwvsrmQ#*M-yZ6x/dXJ{ް>lN6CF]o7oO* ';s\ؚ'[\Q9$+'oje5AfhځSEk9xDT׺Cn20 97MT`[^lmǦJ`^؎ n_̾>=7&5m#(~Qʹj0_v`6y;{+ 1c(s_~c|d} ~~ ?A}?FCk؎~ۙeN}0]jM#!g?6 U+ٴؾۂ<?NAڋsMq[w~?z&j;n*7aS~#m=VEc]cدh:u*bg7KyZl5L^)Ӳ8i0_[)4]e4RF]#/k[q۾BL޲_9iya~`f bV̅('sG"̴eh=o^"fn987!Vi8Vh[ޯ_ 6ͯUMt}l{o{8vL|?U?E~xA^a϶nkBC"R?;.3݉/ ܩC?[miP}8}{s,F;i[ymOжG< KV:y8?ק&FS0q\s<cbǰ9>zy96Ys,Ls\p\fŚc(hS׃0c:NB٫><^J}06 ֚:>e9|e?M:|9"vaez>}4MȌ.]4sóGL/ZC垎1~|sܶtu>wlXݱ `^ovh5 W<1~-0st.ND1'Ƶ沽L a^ܛ`+,0}x1w=n;ϧ0o,2mch9μs7V:?v+K-:X-*alo^H}ߜaw5m3~'a}Ϫ1f1~$#& kZv>؉yz=FUsCȳvm$:c%CK] XUվ!1SfRRuHҮpU DKG0aovKʲԲ=iziË%=5o=>{~߳{%㳙/ ]*%x7YW&|A"OcӖɐ5V74&ç1|"͈ck8c7lwL[DVCk'AX۷ Lcrp+Ɓ-98߇b;`0I&BĜ*&)qV.\K'd7yي'e1lm K7ĄO\MO'r-\ybBvU3EG+/|8VEh G]/+&V#,lNW)sL38p/YhHDо*eH 2>#`f>B&ǩje:7 y|f:hb933ஏEZdoE5[] UɵDm< k-/!!u+`׬NyꮩGU혥L>_cED>e8ArjscӘLḇ|,W_ `<0*6?K}5U/ݝ[~rC\t t6}X9eLbˈ<'XqX)).A_WlE:ZǨVX<ŸZcJ:[q7i$q-vl5'_e92_UEֶþX+.j,/%_A_箲k~#SSBw]aJ漊>@z f/;Bڕ-'2_,uܶtя}SlMĤBCkW?X6(cU6p/ų9}YCzBB MLϪ,.z17oeC Xx a g57J\)b6 ci~g#z0|xrO,v ghɷ) DVG KmyI|.Vl2N dt ; jd#=@4χZhz8wtDoՑ'g*ŔB^B//b,dJ}+ɦ+^BM=0{,=/U+qY66f p*T _`6ń6NlYˎr~h[x il=<ڝ*Z&%LjA[76fR7xJW8AOaŲ{0!ʘ7ZYdI5x*Ic<[ӷ~@_u$Z]'Lc xR̿Tq=c5 @/Of_mt%֍[KX|9/ӑS"^D9k[lRS(t9C+y>:CN@6WTqvzS;S;{sO|©{Bз#}2 } y'e}PM_7P&WA l숱s}fA?U(*찐o_>-e P?Y/wf+z8Q{bf +ag˩-le:1s?6fz1L/j/K5=͗!h]RZ-}Hy_Jﱈo fI?h.3dWh leZ _eaџy}S >4i9 @8zp0 ؐv c7"8ȫ}&}G^A +灰߯im҄\@SiO 8Ge_<|+ίWrs,BѓλoRD;xT6{vY^lW16`fnn~*&ӄ`vևbGꎗ03Zφ< ]֌ݿlWn;=k:91`nLN_zZ^6"3 ֫>7k"wGU2 =+e^|!;*4gy.Ќ8vfE*Ǯ ȵ9fçH2a8 >p*mIFį ۋeǜPFQ]60_B_khQz?B[ wYշ%8eyy,E`TேL?ЦԏbD7}2ԥL ;/ y ~:ќzkQ>C5V1Z7{VĊQ-E`T5P ,b v7@k[)˿vE;Y3|z= ﴈ=-mq Sdx6|K6}v:7S1ס揃ck4߅?YiØ,ƿ Ud2԰zUs*>z!k.*rp\eEdϤBGWhl{dvr:Y0>K9Gpm%}6'd5,WJm\mEO+,d6'g,o@O "~9r@"%N Ǔk,bc:$]X:J| LBp 阳}1s/hct^dV{+-bEJ!~*v:p u?l Վr@9FD.gq=@l?p1م8&|inڟjQ<ώm܃z^ 2kkMgNv:k6fhNRN9ūTđwJ'8;Dlˮ|=xD,ҮpBF?MLӎ9)_+JyUxùUxrk5SIS.{BG٨FK:@=G?KToؘu(ʠLe55('kuzdOU>x.[S:u&_;V]+i5sTٜOWMOpB%qEZ9'b-=tIؚ]S8Kߡ,-UjOzdi|Vg|,"&P9Leld>(kp.@vz%!N<Cw8'9,U{F\-:~NyWu=ʶ9N5'D}giC鸛ϯqRU8~"횵*6srHJNNQ"5͜N[}K%p{MƱ~|!8=q,AG+t{/E8 sH[!Ʊέ8@/T¹H{K8X;Z!=?7zGZ Ksq,;q][Ǔ8!яc;71qK\gƒ'\ϚGVS\rkJ@w^­TZ-:wp`',bI"kS4` {aFjw0}y-77 &yog߁.`˕%IzXB #1h8hj λ{3ljd͑޾a||U/P\3|i ? :B#"=[~>=>.rQF%ć&wFG۳}d>S (B!r#r^g9!z{2y"?bSSuFЬQlU_o;C4$n|TǙ4んb^O+XTy?-Ufb#5?a:{`)1vԿַ6q L'-}a!YF>k'"GNHiCZo3E9fFO&#b>>MP—kd#ۇ|}30ߔhtd!4gGי(9%aApRB5)%Uo r5$5Ud^qٍ3|KaDpn0Vsф]R;ϑvLa:'$چ5ch&)֢H})_ȥ&gL~u>>Ss7'FȝKN g;[+O3ïb~~[q'Yi3]z)'b5zёPܰ8oT|}MZ ]D*ϧu1S 2i77'8ONqlqbOL$ͧF=IjgtgFM@khS\cۘj 0l$6 ӥ}QNTN}4㚎tyQ #JON8sA[n"'x\iyQ'bS|R^0,(m4 VXJ{9WwJr$ B0ꙺ4t(3jҫ$SG~ڤ݌vnLʠE>W^`dRrLdHeC셍 #;J_Kĺ񖿙Xګ9PGLo 3٭sNǯ8&)%;7oty 9оСI1261IaSBAš&c\oz{Iq X$: 6G[<&zE"Gytu2Kj˒Mv{ˍۇ]u6woOY09* 8zVf+q7]>ڀnmZB ţ\Wo/ l$$@ "II IQKR(j$RS߾Co)C*Yc,ɌfU 6P_"f%W砺V$99Ԛ&3t;On(:>̧ZIQzB~Q>k_~oxne !%MpE\%>i))Iq=y?m|΁fzF^H"rFg]'%DT:ɱ}g5%&!n;/7­M?qP"'EƢs'"aZ]P ['@ :c323hof+w>*?Gʐ8|jӨt_(H->2-kZMwMLJ؟(%&m|j=2:>0Gqgw>SV&NePEgQovOvE4~t* '\ހ́B` `.07еe!BgaW'MuUZzVMc^_H?Y@ :~] z*@4<O/H(ݝ!#@;qW!p`diL@ `;ιHǬemB"Ix{]$DsA7tO9)5$HYug&3 b &A  1|0&H$HN̑_UꫪWڀ \+;Vʌ;XxE'Ewx1D˪:cB~U1jg*UDT$,>$5W˜vxB߯ʂRqNW1f~Y~{kzh=A}A FU71r.q7C>v@㲉8!+wc^K;u3yˁ%DK>&a2HWѡkl9KB@};" R,HƊґ%㯍pD{bۉGy"GRg<瓻hAU"ANon8OHI%%MW5gݏ^{6T*TpgTFM~x57VG-qiI)ZGb"?%d0f ^U&8r.}x')J<:Gfi;2X"[H/$$ڦg{ɂ7B5^3>yJ/sQEZ኉KY'7⦽]Ճ7jok5QtNw+@s1S2׃$/S qr+ٱB6C_5U >hcCz)^yx#Wp^-Q>K(P̌=F= !k7>nOkO=I}DsG OQ8%n6>uLs?e*(UsakGzc<վ27 ["$YȴڟerCC=E ўv.jf+*%IW+Dyd)Z@)uDS9g\ruݢF 9b=ܟ <-WV+E|T?-l:jfݛgoI ]>8#z%ޙ+/H>ۃHwX-Ưک'7_,s153dSt^k` )f.T-w RU8 J$^E;0*Z}*z@BE},?~_[itw s78y-S G$p&Qz{q?1vu-m_OϮj_fH@[d92LhW& Ng'4$B zdF1MB9RēM_iz78t%_wf {-uAs3y%1X|YPH!W+zW8x"%9􄌱P.?'QH[@W1Lg1f+,24yRD㡱j >@CR[ I1~z_k)'jaq\Su/_SS{kRņ' 3xcq694Kc‡7\*C 3=bfm'!%, 5k@_\-Ws \#µri.˹W4(MJңD2*ʴ2 klm{ǦrVL. @C⦹yn[㶸mn;⎹K[6% i~_-~S?zUS qaP&yaAXmP8΄sN[61,bJLqFuqC}@<O3\/zAjLC K=RDRRZJSҴ4#-IkҖ-K҉t*IAndI=򠜒'YyN^uyCޑwCH/vkVZ6E4,W`W5e]P6-e[Qv=e_9TΕ ^mV[TSP:N3:Ϋ ꢺ.+ꪺꦺn;z^ZVjmZX"ZLjmF[%mCҶmWP;ҎT;ε R#z@zQoқM1=>Oso~'~QkFh4Fj}Ơ2\c˜4cX2uc4}81.KMA)t0,'sBp1\nwy"Xk֙f1̘7A3eͬY0]sƜ5%s4<5VhqVzgŬ5` Z)+meZ֤5eM[3֬5g[ ֒aX֞oX֑ulX֙ՆC\H C=xh BSLh) Be֮nl픝i{^7M{>OS>/K5ڄ-qM\3kr\w؛n;.?Zo@a )`1x'*gY~%~w]?ASU/4 aL YsJfEaIX6ᄡVlQNĈfitA\W5`uWc( -R12'}lJs.Jz)r"r9%0+@(Q-t(aDKWF0;omޜ(@rPk:V`6 >BwSL=:)6Mљ\m6ubaCa +3/};.C\%(:3F6U`k8N3#ej r4`0 aKe~fk393leؚ4]+檹f g掹k@ܡydw&Vf@E[g ֢jm2|Qd3T5Bm@V YGECK{\L7>IDQ(B(㬵fYR!DQT;)RBB!BY( !Ck)w=^3S3k>u7q|g|`/j^$ ^tV4Ite防S"\%ֈ 9HPQT zdR)[!R,bLԸJY=Ƣ 8."K Mihy9h.ʧ–Jrej`ژ1fh51'h<UTGo"9X.VX\k-*e$%b0OE$jf ^Q*,HVD 1HL#҉ DbZ|)6(5i(u!]E qH&ɢp*iy<%j1Y"⶜ +*R[ uj("TJ3'ҠL4LPT D*h9%T)UY*N{ҁt@'NyߔTPOUZ$qe3?ꥀJJԪ"'bY( [T@y`N+cA-A-3A-ORRlxtH6l{-OeA-E bA!c8Gm%WxUR x4RPGA@ c"R5 }PĩJ|$(\D|*ͣ] .Nz&b4S)8BK5TZg"@\Dtp xT!Q?AAlP\+Ze;š0Ń *U.P_ΙV#Fn/zSAqZ .5*鵊rQ[2+BtF 0YPUDu-M@+ip ZFa< 8DBaШQzFz)`n+52mhC!V ht}p*Y,"Rp?iv TOPAg;+ Vpu~tDSL&\_; Dyrf=.;,.Z֠Ɖj]U(G\ƖUs N3.%>^DTg\fk+TL`;N C8%:O\+Xuؘ0!E|#%P"Q^%@RU;pXeAQl,Sp 5EDNERqmDSH)qUS'J6S<@8U Hs!:t&0BXCiG?Mș?\L^.fɓf]m!y j+b.p8+f+E-_l/↲g}%WNBZAgC3Vm@󧀲@.S= 93O7Y̟WtXpʕR-m""qU \*wi4J")͢b,.z!\*9dS]̤4*`T@~VQ ~XCE}N~KF ,負'ܐ Tac@sD&j J@y*_tmVu& PRIJF2̥*̪i%!LV%0Īu:8/dשpM-UJ*C{* [*.i|C;p=$ZzM_|)j ""*T*P֔\Dt{b Źo~G~@AYiɂOnhdX_aZ1x>%#SQ3+PLV-ZȽߐ,$Y+hf$`WX=RyqXo8NH֔`Z$;Ԧu%! .]︭[k/^߭0E~[Uoՠ?$\U |9|w /U.S[+d+$]ׄ¶ݭ[םl )7PDwr׹z*Uk4md]"֏6Ya,]D_ӏ HsdsLg~zv菚(0"ZHV=rREsE V,VlE8Ox D*g0rqf=XW6rBC~!IЈO&PLWr3֑K>p\[~򼸇%"|R"6G-y~ .|T* m{g+)+(_ URI58!K#cA# ڀ[Kkg!W[ l)pl'C!A g_Ư} A-p! "XH,#V Wr0r&5\N#e IΒ͕-=#)_P`*uC=SGi_zLaFt5>|QL0d$A*Ixuc#E߷@?zDg]JMe2L([,[9UJiSzT; rj0&^ S| Mك`fP`SD{F\ WspC8?n7c"NsEUϜPaQ1@1 \7(EaZ|SȜf7ޏAAwϼtTtড়\LTnyZYdJ%bacHFH{$AP$|H@"gudcHFh{TFC!/Ft=E/Knj †bX6*l#e:V=XsC @LECH1\GfA&{F:,6W$sf^5lcgu(Nܹ8`n9v.;ΝJ'oJ3HH"—J%G\)EHLAS1? tdSP(RB@x@ݠMv-OڟHOet8HLkƆ%?&K[_0ou䌮rg||<:6C%ϗTMbnwTto?Tmbb38\QƼ%T8UVW$Ys`nBY=7e:GHɶ2q)d෤쓬9JRЗ/ \eNYCq5Ǽv?k:A! ~X/=V3Ǿa嫢3ԺpQ*)zE}a?Y\c;#(:~f% \J'G(pDb p,b61Xz * Yr&kG1#T}֑5Ȍdmefҝ epYC))sEˬ Q!Dj ,j65ZZE6Pj7 Y(4c #-cX23xz%ӓqb2 '.~xr*ZPMww˳[k٧K +<2}n |eu⺂O,7CMWRPmb-p&;ag;8,uoJkl d쪴SJJ*ʞJ'e_$7K Lh$uf69s9G+7;}yA!am!/Yb& cqzg yaCFc1Vpl|?~? x>Nj+5&~?{ TmŒJڑ8I)ɞٗ@Kqd!!-n8$;*; i켬HvM}#SKj+_hKݕqYZIpg?=ml`61[~π+b0ט"3%Fl[֌d;]Y;g)HJ'z^/.brKWqkA6q[npCQ$yЧ+5&ww?+\~P+,prH@)RHS S-8iۇi$xK!F\%ʉ$G"ϒ&0ve3A9#3$>l Pĸ c1L M k$x{w@=wgip(0"xG4&I @.<nzR^Ќ

    zn[ 1ψs.]#=BF{ۅ$tF~ _:Dsq7b)A$ YO6Y(hb pJbsfI~:^fp/:x>̿ⵕrrrXnDM f̃nh(h2nA]v /PװZ瓐S>_q lPwdHP. b1ft. 3kJ΃9ՖWeeipSOmmQ`" Hj/oCJphjG̈́vryp ):^x1!$\ʝC M\)e5k;y [S ( tl6[p _C*>fSF[Rh8 ?Mrr!31󫉙{HKH=ѕh#T R0 :ª1 F, 4_/+[F*){H"[gg-0!+LdײGػ'֎T W ?))W(+" X<g uu) \?pns (V ]knMpW|8y^W51̷JxD2NdD/(yL2WӖY>P3#;&+AYQ63$OATQƐiho}G't} 8R}^l͓A^Kd\S0e'FCn.qryTF<2yxBy `\#.cK _ȗebUx ._kE U}PP5I!Ԡ C @Ȅ,C*mh"T]:ZzX +Y!ĪsBڪK(VhbPkI89Pct! f#TKmbe*(%jj+͘4'mTDFId 'Y/3O PiOAr*dd52cʜPc©HT,%T3i+H:+Sx ́k np혚p^bXEP7wot2Ye\-vJ0Xsz չ{sœ8^ԧWA 0'.'$Q8u@|o ]YףQw:(Lš[?in?3R;m04>e(iN5 8nbÝBo֠U'/ icJ_gA_P{ARVIXC@mj4h48f>'<ȠѠ!vL߾ʼgHXhk~Q Lx]_޶u 5wig( Ah  D!𺎁FNHv{ f˼[#Ѷ8EQtwJv@,Uwd ~}H$FھK5%1fP&j1Rs[+޷؉O|h8&>W& ;spw~Nm>5cE`|ou!uk@e]-Y`v:?W;`ń_k?POzF]eqkQ-AgqQLL6ڲ9%%|pGgF:h5jȓ[(q)%ݝm>֌>Lc#ψ gcy__nϳf[9owN *Z)FFD1!5ha(l?d`Ub Zj# -C<8cv̓dv3]3~H_wSJ=CvvaA݂橛H]1³va!'}FaI?xji55I.HĹ16)S4#z;h"MR]wTDx'/gDn`N`IIyHzu+T5○mE+'C䔬Nӗ pժ׾7xk~?O/ _ꭎⵖt]7>td[H&.04m<)ӨEAv2_\1lab#+$>=p#t)ٺ`;G?̺43mISj4_SFABv+^p%-nZ ;1i@爝W=+Gcw7YXn%YYX"*зzHs1û#2)8"2C$zDV?$͛XGiNnJMً[rnSSwm]7L۞޽yRE9־]]UI[ {ϧ2<{Ko푦T:Y릴9@ۄ̷,]?&ߗʜ>ŌV,KXo^MzI/N ;Tn]v36kn=׼&˽{ow͋C[Kcst.:MSny >>b<Nn|pgݤf]kYY^ew*ʭWٺ9lWFİ}M5{ݪx&̢{heYx{o"Ck./Y_G@' {(u3TE HJk?$ƺ&.ێxK(C[cK^*mڱ9S7_t!ƾWaH3 ү:SdLih@EZh5M!-./t\np6 "n&7$IOIL/#fNt0nC+WF^)=SU}.r@A"c1gH z?T2gut4> ;Nz^SǶ&Hפ( Cͩw;IY99!l(FCsxG7/_ܟkFpCTYc^b#ħ4ؼAKVtMIхz^ӞC6&!֪r󭾱$)mA1m9RU_o7nТctif}];8bY妽I8oFst9z +";;']ztM]ѦM7˞< ZTdqcڳo5ނ[C.:\1z)wLndm[ZՂ[svNyq~Ҭnu v\<2}InGzon4{v{1k*q(gŽ#Kh,rWր*-k񇉯?^Ū}>UD]{y-$lEn*<6ޓVI ͕}&a:OB_41skFO/Oveѧy3tzL/q x;1KjP ä܁Qٶvϙ[8pHĠ ƥ䷩GOƵ )mFU 69csgf콟Nϟ`٢dnPa= 3.kT-Q=ZҦ`}{➏>>T\hSREtl;ɐ[n^wNr8SV-9}_X~9S T",hϗ; -ώ:t^5Kr+,<YҽkFb)+'lvXGS^ƞ݀k^.'2_gFl]uU/˻_vw`g4zcAM*En=E]nhtP=-3X(җ{]7w f?EyyT~gXd`k!<'1RuCN;̔ f>QɈZ8eJUbSg]٬!޷؜B{T7<5#lؑBZHJ^|< ;mRIMntf[g:BM{oRm_ ptQXowV73te؞c)YElÈ*(V;tB'N~6qO_zcqk'4gϷYkhvn&+^eK)eN騱耶c'ٻGK65ܠwZZ9~Cj\ᵶ_coچnUULd>!ԷJw?}W-Mhl3 ҧ\w&cfS} M*_.i%ΎHw0jH/H,S=f,pCا~Ow5̽sn9\>?Sy`^gӊ-4y@냁fʡFZӦ%5QUf?'Vs AU_#P@ T\Eo>lZ:Q[龖;[Ԉ<VS#C; Wlb>lʻ3bm|b ڧa7AiljSh\#eg8KRWg ]n7Oק]LC7D 챘{f}KT4~w' RG&MXۉU^mۙ-Ďd/^oArܔ_Ȥ٩:_cÁ/FKl6gY_iN?೅AIβmF}uֹY0"UK%﫾E[Zυ[uUKH^o=)+V<̰2+Fː$6֟m Ꮞ1/ F2&j^nDQ[` ZܐЉ>+?[EhCЃ7_~`(""E'_ ڒRn9~v;tf{N3P{lFFkiOutNs-r?9fPfSkyU0qsi)->`W3]/#+Ѧ+K:U;nZA#7ͻ"ZfuߚX1CO5Swuّ+iQMkqZrzx={l4h[TK,J :?B߉UE(Q-ć("iGoީȈ-)l/Q_nQ#)S$*^~uY!K=ξ>}mY>Ķyj7"݅{`WY{v/g^^edYnlm{E|Ow"Nt$(2k.˭F=3{׺:߸{|X롴R4W>:NɮPye%>bR=g٫ɰiau\ًlݱ3 ?uϯ>w[p=vZ/[cSufל <eesQmތ=y؄ ].ܦAřu撽S{:("Y1%!|X(mH2γY1%]}lǮ?Ňɗ;z[ov^OOZ{U|ۋ^sz3MN79qz{l7'MfVVu6r1I{uI{M-.|Ҡ(c]2$^['?2rIA#4{ƛ׭Rt{a>{5JkMѺ5ުm5~FvV꽲Tr5767묿:ʬX9?kfe)ӗ7n0mZ+v|tz}W{:)ͳ'}^Ͷ pO D=χ̉5_yM{ۯ.]WV7E~,F;Fmalݾl~}5՜S:|0k/ji^p-Q/w${\r}אּ.M8vǙ'>CiVM&u3xl"ʞ'v?bWlwI18~duu)c 1 ,)351b -I՗jHm`l+ڷD]BY~> 6!g\jc ^{ d/[ɺ6 zFISEޚwњh 卣pT֖#]-b(.#I\iGJu?[)U]_-l3m7O~5&q\Hb||7zUt뤁uof#YCWb{^Kkg)<&e^УK͒ѳގ:a⾟?Xs.+.MЪ&+#L2=s8,py>;KdLC{jJ{/@66'xSoC/=""15Ƨv}3aDl-{Mͨp ː%?hDQϏ?4׾Uf]Q~u]7aN')'+mJ~-zH޶/<[#'G{gw>8wcZ|<_X=łɅזy}~d5o:=55c}즛=*\4IH_=W\}%C;q7t֧{?4wMǯ.uY,xyֺu-O&o}5c؄-&7D&Vdܴ1;wo>:hfӺ17NخV6?TiMT~/g̮Nh|'<ߍLv!_ݕy6J[.7)&yǻa3ƅL}~k гKcr.V_ Ҭ CKck-ݩb) ЙUf}`'~kniظM˝ +{3쳤c4Y<3obWk]lzsS?6&Ks|5U^|jl9RG 5t,a7$xQ,ީ_5Sg!륿y NVQ*3y] o򗸙;!z$M^&&lgy@ yDe@c%V[dv~#ww֠L< 41h"-40hlXR7 X^_w^_}P3:4E = lz!;i%iq._s~ȓ^m[1o' d_=@c [9^Ѥ6_fJy1o᮱V*NO[]=)ʎ#돭`@خWY#0'\Id߭?CKu|ᓀU2 >=cׇfr m["l}Fz_< zc5r+ocoS^oywXt듽t>WOh+'0x< L | Installation DatabaseVisual C++ 12.0 CRT (x86)Microsoft Corporation Installer:Copyright (C) Microsoft Corporation, All rights reserved.Intel;0'{194841A2-D0F2-3B96-9F71-05BA91BEA0FA}@Z@Z#Windows Installer XML (3.7.1623.0) """)))***++++++11199999IIOOOOOOOO]]]^^^___bbbeeeeeoo  #%'#%'#%'%+-0361EG#<?BJM'3MORUWY#%'#%'+YaWYa#%'hjo                171K++O+bbe%%%%.G=@SWY%%W%! $&($&($&(5,/248DFH;:>ACLN\[QPTVXZ$&($&(`dcnmlfgikqprvyswzttt{ux|t}}~ux|rvyrvy")*+19IO]^_beo""")))***++++++11199999IIOOOOOOOO]]]^^^___bbbeeeeeoo  #%'#%'#%'+-03%61EG#<?BJMOMRUWY3'#%'#%'+aYaYW#'hj%o  HHHH&HHHHHH&HHHHHHHHH @@H  !    6$ B o ; >   ' S^ . : W ) !s9c%A?vJ" =  ) #>0;&8;;&;>&>       <  :Stri5f<\/?jDY>pf values that are permittedDescription of columnAdminExecuteSequenceActionName of action to invoke, either in the engine or the handler DLL.ConditionOptional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.SequenceNumber that determines the sort order in which tempty.C_CENTRAL_msvcr120_x86.194841A2_D0F2_3B96_9F71_05BA91BEA0FA{0835C947-D6D2-4E52-AF14-0231D04E88EA}SystemFolder_x86_VC.194841A2_D0F2_3B96_9F71_05BA91BEA0FAF_CENTRAL_msvcr120_x86.194841A2_D0F2_3B96_9F71_05BA91BEA0FAC_CENTRAL_msvcp120_x86.194841A2_D0F2_3B96_9F71_05BA91BEA0FA{74260D9F-D644-423B-B2D4-0291EA4BA8BE}F_CENTRAL_msvcp120_x86.194841A2_D0F2_3B96_9F71_05BA91BEA0FAC_CENTRAL_vccorlib120_x86.194841A2_D0F2_3B96_9F71_05BA91BEA0FA{63B83B20-1AB9-4F49-B0B2-4489724CA96C}VersionNT >= 601F_CENTRAL_vccorlib120_x86.194841A2_D0F2_3B96_9F71_05BA91BEA0FATARGETDIRSourceDirSystemFolder.Sys|Systemmsvcr120.dll12.0.21005.11033msvcp120.dllbxxe4aoo.dll|vccorlib120.dllMicrosoft_VC120_CRT_x86.194841A2_D0F2_3B96_9F71_05BA91BEA0FAInstallFilesRemoveFiles12.0ALLUSERS1DirectoryTable100_x86.194841A2_D0F2_3B96_9F71_05BA91BEA0FADirectoryTable, Registry table, or ODBCDataSource table. This extract path is stored when the component is installed, and is used to detect the presence of the component and to return the path to it.CustomActionPrimary key, name of action, normally appears in sequence table unless private use.The numeric custom action type, consisting of source location, code type, entry, option flags.SourceCustomSourceThe table reference of the source of the code.TargetFormattedExcecution parameter, depends on the type of custom actionExtendedTypeA numeric custom action type that extends code type or option flags of the Type column.Unique identifier for directory entry, primary key. If a property by this name is defined, it contains the full path to the directory.Directory_ParentReference to the entry in this table specifying the default parent directory. A record parented to itself or with a Null parent represents a root of the install tree.DefaultDirThe default sub-path under parent's path.FeatureComponentsFeature_FeatureForeign key into Feature table.Component_Foreign key into Component table.FilePrimary key, non-localized token, must match identifier in cabinet. For uncompressed files, this field is ignored.Foreign key referencing Component that controls the file.FileNameFilenameFile namTableTypeColumnIdentifier_ValidationValueNPropertyId_SummaryInformationDescriptionSetCategoryKeyTableMaxValueNullableKeyColumnMinValueName of tableName of columnY;NWhether the column is nullableYMinimum value allowedMaximum value allowedFor foreign key, Name of table to which data must linkColumn to which foreign key connectsText;Formatted;Template;Condition;Guid;Path;Version;Language;Identifier;Binary;UpperCase;LowerCase;Filename;Paths;AnyPath;WildCardFilename;RegPath;CustomSource;Property;Cabinet;Shortcut;FormattedSDDLText;Integer;DoubleInteger;TimeDate;DefaultDirString categoryTextSet of values that are permittedDescription of columnAdminExecuteSequenceActionName of action to invoke, either in the engine or the handler DLL.ConditionOptional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.SequenceNumber that determines the sort order in which the actions are to be executed. Leave blank to suppress action.AdminUISequenceAdvtExecuteSequenceComponentPrimary key used to identify a particular component record.ComponentIdGuidA string GUID unique to this component, version, and language.Directory_DirectoryRequired key of a Directory table record. This is actually a property name whose value contains the actual path, set either by the AppSearch action or with the default setting obtained from the Directory table.AttributesRemote execution option, one of irsEnumA conditional statement that will disable this component if the specified condition evaluates to the 'True' state. If a component is disabled, it will not be installed, regardless of the 'Action' state associated with the component.KeyPathFile;Registry;ODBCDataSourceEither the primary key into the File table, Registry table, or ODBCDataSource table. This extract path is stored when the component is installed, and is used to detect the presence of the component and to return the path to it.CustomActionPrimary key, name of action, normally appears in sequence table unless private use.The numeric custom action type, consisting of source location, code type, entry, option flags.SourceCustomSourceThe table reference of the source of the code.TargetFormattedExcecution parameter, depends on the type of custom actionExtendedTypeA numeric custom action type that extends code type or option flags of the Type column.Unique identifier for directory entry, primary key. If a property by this name is defined, it contains the full path to the directory.Directory_ParentReference to the entry in this table specifying the default parent directory. A record parented to itself or with a Null parent represents a root of the install tree.DefaultDirThe default sub-path under parent's path.FeatureComponentsFeature_FeatureForeign key into Feature table.Component_Foreign key into Component table.FilePrimary key, non-localized token, must match identifier in cabinet. For uncompressed files, this field is ignored.Foreign key referencing Component that controls the file.FileNameFilenameFile name used for installation, may be localized. This may contain a "short name|long name" pair.FileSizeSize of file in bytes (long integer).VersionVersion string for versioned files; Blank for unversioned files.LanguageList of decimal language Ids, comma-separated if more than one.Integer containing bit flags representing file attributes (with the decimal value of each bit position in parentheses)Sequence with respect to the media images; order must track cabinet order.InstallExecuteSequenceInstallUISequenceModuleComponentsComponent contained in the module.ModuleIDModuleSignatureModule containing the component.Default language ID for module (may be changed by transform).ModuleInstallExecuteSequenceAction to insertStandard Sequence numberBaseActionBase action to determine insert location.AfterBefore (0) or After (1)Module identifier (String.GUID).Default decimal language of module.Version of the module.PropertyName of property, uppercase if settable by launcher or loader.String value for property. Never null or 0 *H 01 0 +0g +7Y0W02 +70$ F0!0 +!:{Q iVq0034$1@ɠy40  *H 0w1 0 UUS10U Washington10URedmond10U Microsoft Corporation1!0UMicrosoft Time-Stamp PCA0 130327200825Z 140627200825Z01 0 UUS10U Washington10URedmond10U Microsoft Corporation1 0 U MOPR1'0%U nCipher DSE ESN:B8EC-30A4-71441%0#UMicrosoft Time-Stamp Service0"0  *H 0  ,Զ4d4 X Rp\,j.YIl)8W2 4E廊 %{pgJj=pAϫ%fxxu͋3\}g(X`{3abQeA~%-fAC49R>^6۹j7φKJ%ȍagS/L,cʠRXsB4꓾L} O/]Ef_$FU҃rB":P 00U_KB 8f6VtYIf+0U#0#4RFp @v+50TUM0K0IGEChttp://crl.microsoft.com/pki/crl/products/MicrosoftTimeStampPCA.crl0X+L0J0H+0http://www.microsoft.com/pki/certs/MicCodSigPCA_08-31-2010.crt0  *H 1n*W3՝:DM^j[yvh M9 ]$:|ۭγl9,E}$T&0 Gf],{tOik$햠sjKb|HMDN;] U?@18u(^Fmzy@Eծ]>ufc`՚$04cBgJK:ﶕ:8%f00 a3&10  *H 0_10 &,dcom10 &,d microsoft1-0+U$Microsoft Root Certificate Authority0 100831221932Z 200831222932Z0y1 0 UUS10U Washington10URedmond10U Microsoft Corporation1#0!UMicrosoft Code Signing PCA0"0  *H 0 rY\0d` BvSl>ok:t/2BN#r5W ʮ IhMKyKqG%ߝuϪsDׁ6\Eܯ=(hrsV5rv_wE8s[gRi/ t)v/T0Yҍb_F1P'@0r)("7N=2=͡8\NV(*2KOc-bE=F[&SzJF7<8w\V< _^0Z0U00UҴX7.3L 0 U0 +70# +71N&`;1o<-0 +7  SubCA0U#0`@V'%* SY0PUI0G0ECA?http://crl.microsoft.com/pki/crl/products/microsoftrootcert.crl0T+H0F0D+08http://www.microsoft.com/pki/certs/MicrosoftRootCert.crt0  *H Y9>&Fo@2j/nI_uL;-C -1#|P!]=/LVpyIr>A i˥ - PV-JҼp VชKWB4m):KmE,͒-%t)j /> Օi6XeA @8%0h֦16άx1e ra9GG0F9jrDHbݾC3P^W@;t5pɀt\fv'*'|~QoG5 mR"WK+8D7M} 0dHcj@i W)b0- txaEmodsecurity-2.9.5/iis/wix/Microsoft_VC110_CRT_x86.msm0000664000175000017500000273000014147005233023326 0ustar mhsvierulamhsvierulaࡱ>   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry Fl.BB=ACG: C1B7H SummaryInformation(@H?CAED1H @HDDrDhD7H)$@H FE2DA7CrD*@H C5BErED/HA`@H??wElDj;E$HiMsiDigitalSignatureEx.KDigitalSignature$l  !"#$%&'(789:;<=>?@BCDEFGHIJcעNLu z=-B1*K-{I,a-5Y 7ҏM7XmNa(]+n%$*>11'.a 0Km؛SC5Rz"fey;ͩZ+iE_5Ho9WBElSo7{x1wsN_Kჶ (f]?J7{8q-յQ({s ^wxҧHyy.{ro(zr|?Fz{r7ޔ! I^nwXb;#v2J֒]|- t|yE{p1W\Kwf1]vUC3dF=_߳"w UK)J_m;nqiSs3䔓ճg']>݂ #|aC Oѧ~y_<}[8!o'r_c8wmw->:e?@OqiYe]HSoeʟ^BQɔ`ʼǘ1MǙqڳ.)eeJs|LI܀ˣq7x;t{)beʓ4r)CNLπL)=Lyt<8fȔO?nBy;4]ᐮWz ї}F}/S.}yǏC{.9cGXd?Qn|6Sb~͖ҽLYFNu ?9pۃLQ+W[g/{vht']rS&sQo;SoIv;0Vjq9G'N?BS~n2ޢUi8oi>Ҹ{M;bJ0LC)i^{v\m|Z<|&nkzC{DMP?~C1mS{N,>.څxػOw̝LyGڤbfOS2>g7zzfCeΔw3V3Kx ncB|?O NOt bkX ?>;:#tCׅ/-uV`i>qcEeM=޲DG zA16V~vG>|>,1ϾS+S&3iً|jSCǞM9~B7sgn3*M݅#Js`Rg"1?5ۚL驝jKhwm %w'ctzOں?Rxg_.y'6|~C>M_Yw<^?|`Ց+ۖ/~sy_ŢMǧݻK)w=e~֎5^B|oW<ݓ}'㜇—o?׽1Qgܟ|u?|?zGWw׍o䷥v惫޽doUk_훬z~2gMg-q|RzDB2e t;%$_*9 7+!whay{EZ} -8?O&T^T8!o؈?ts+r Ҋ܌ܳ} ^HY}moљv_X{.4S(6$~/_&a tA$ów6!2:(7dHf%p -ևP &Dn/rQ<\fҧr6ρHhLl_/ F(u&:6X;Zo-FT#g/μl[fӹ)/ hcPBI"X__jUZҎrpIF+-r#~(G-^׏ o\23e}n64W@qVwuA .co #$'A/2%L~5xLΧ׍)r9EܑiH{RhI;ĩǗ-ǤЧc'c]t@.c9;st];WckZU]r$++o8upUڋY푬=B[r~Kڡ2b̿ ޿(OKr2'\޿(u:&[w.oz\$+77mp S^I{z}ݿMKMGeG//q:(&:~uۄ!?t|W`_)('HNj!g(Z>7v>oЄ]K * U< eigmkQ\&|-_#MSCF ,3)fA F_CENTRAL_msvcp110_x86.D371D00B_69EC_3F8E_A622_74710A89ADC1[ )fA F_CENTRAL_msvcr110_x86.D371D00B_69EC_3F8E_A622_74710A89ADC1fA F_CENTRAL_vccorlib110_x86.D371D00B_69EC_3F8E_A622_74710A89ADC1ޛ1CKZ{|EA@%F@7HCB@&@tf:IL +(*ze.NzU\ueo~U3=1(x^>Uկ5,3'ʾ9 }ؓ'9TgQӶUok)5媵jgL0)3g)+ݣȓO>־(7m]/Ykx=g#jKgx|ˍxmXev wUim!=C=1E+ G2b=d)tGv4$*qYE]X+@]p3vcm{'~G߯4V<ԕM |7UJ]˨04ms]Aok! D3U.Zj;veΫ:+'-|ayH1VGa'a> [ V[ǁ}> CW@)l~ 0FCk` >8aoxO`pga~60xі{ riZ@38 skW^5G.ZƔh_|m{?kEhC̫n^&S6Zǚ_yg&~)_秳r}=>kJQ>gQzIъ9Of۶n;1 6l&}~jH/6sNjuImnYl}qo6wֆH'm$.|yhsJ6?=xs *~}[_wWo/Y'/~\l?r|\\~zP;t'֗&sGOOsr͕yI.4$,#~7zwSWN:_5ZO6;y Eywmmw/O=c@7{~Ad޺9/T^=x>Ŷ}U>|c>gy?BW=?jZHf&T,7q]EZFgZ̤PJK7]; NKO7Rmätƌ;i-3_ 4y)<_e*1~- & ,˅T2x3 BVKuda؍$͌X;Z fl`_#/VWb3dc~Ոgm;150.l93?g<  8_:Ƣ]?} 6Qv8ݕx}6u0>3? ݺ\fr=C^eۄfl?~oes83_^7t۶7IՇWg7ޔudfzBh[+,mS骦K;6YjfkqWxRsOfN\;fp@ղUMumHV_ŗz1**n;|47ހNJ;kZc3T֩G?F9˄+*QXu:%i(h-*Z#T'oP5G]P[-")qU ;Xͥ>[Wa::#ne7E4궫`qui긘[jJ7֣uͅΙZu2Εhgm3zgP[mI:ߩtRo2fs J44ުVE7iA0 s4]57ңG~1p)tAGڢg;1!neTIqNsѯșx9Îbo3iX~Va]m hzGA sO |K:sRו_8!'#ދo ;yC| dlD1s B܀Q=#p[gLHPg2EEHMx@b!5@Cik;gk4 h "\p-k;h#$tƻA~ccEɦz^:q;9g0y @g#:Ɵ Fo-MI`50Pk[Ktdb#Xq3pu-iZH(t2uwgZrrL/>;S7L ^M q @p 6]ܼF v[TNb|~w35rŸCxG{L¿*Rh sO?[Y  TQM 9uw.T wP~& {/Xesrn. 1 ?tKKONU ropډeʶ%wC1s^3Cͨ<}5Y (#PVul$W2d{]xKe}y;bSNj $2 syijF2X%\T}*:X$2kxV~E8Rb=+UjtuZ\E?+(=4=j_]5>-*_f6I!MBV̚5oˑgsXR[LjM} HX=k^px=oo^/<^ONDYgt{E0?՞^zW@l/''H\czԀ_z/}X֧"~ D&j}H{{W=z/y'{АWgGkS. < |/x x#t^e Hn jLLzS_^ |>O_2qBp% <`ٻ:`6u] q]#dOO`b%{"Ӹ+tS+MD!0(O# ~C="xD^0U>(MoѸ؛zO~V#O; n5LV7Lw}co)Л׀MyD;pC+. 1xH9W74?Fy|J=ڏM/Gyӫq>W?NAZ /Lh5BOe9KGc)}uFN:bHgVyA)6$KMZ&wyiᔫ;VF643RaE]ɊΐtCwJ ]0oI^U$u6%+lII-ۥFd]|5jFRMB6L}wg*⌙-0S:ۖxIäyd4rG$Hif0QQ m,۷Z"AƘa27-ORFYdZ,Ec֝DON12m]yuj=I4[Ip;ajg3-BCt`9n,c*esr}o&|c;C}bA$FIV|&|W|(>c]4̪4i #sZrAA1INcP\bc Yy:hK*yM(|$'ӱ^k܀0IV95BroDGc]Ms-(7 '$#m=zk¹DŽ Wy('HNOc]A.Os\+ |#W[[1wO;rZ.K3B$Kƛԍ_+<+('Fє͌U^PQ ~$q~8>)EodJS7AF]mDdY ]]!;.c~*^ 7~`<&CiH݋mdg0Df>չQ|yW\*iUBܪCǤrZaS( v7hBy]>$c?&y{qv;6Gכȹ` SX &[R!|l9s!L+|N`Di1kC[ixc:Dy9`yQk,dV%G.x{$Q8SAog)sipIǏYzlr[4m*˰Nu2K^RXIWeWwpNn2RB^y׷C<$נeI]677}Ȃ-1ӿd 9|\&񟳁Bs|<)i>4Ƿn߉׍|MšL9R0|*B Mڙ5O8b"Qgm&%| 3i}Ly"]Q26//;חGQ:*O=/>zH^nM1w5; ~WxQ?[1YPKY|P'U|*ܜgUs%xh5 MXCi}[̐s7CCbo9Id(aNL]% "OB;p9*wUЈ$jwE|Hz0<#^>!Aiaͦ9UrErgI.znmdlJrsڏ((/35\ւoXv'5vX 䃉5 >1C㣵$#~!3t qN9L/,Iµ 易e~-:\f7KslޯAa.\{'hSLJǥDZ}}úFW[ZDž|EA8܁ 7u qK{QwzVY(2Tڅ|L{1wm1[Ҿޏs{u?\Q_KN6EkIJ9'| p=g:Nd}t?ɬ.7}| e^QNzPV}6uRT e&ajWouw'G kA\5o +}n Ag- hQ0y KJ뱰ˁ`0|\9f K`l^$dakmk$^ >la66 0{–u@;.plvo-l v/^,x8L^}:(2,i7ak < s~Qഷ ^`8x}8|}p 1v/A (:I," ;޵ ]@/p".߳U@0e( Z|;}p p7p8( A x}hagcYX:`s-l KIvMUaR.ظ 8Fm3WA1Qę ֯y=# "*"`!Q!Y||K, Y\snݘm9yy|4KWy |\\6s! 8@1p8. 8f N׀i m~>P' .\ @G(i暁e`-l~2OOOd H,*a#QZ8dncFE>*twhI!?H&Gl$Q}ixNRf(hm洝蔊w6Gg(n!*+ % bb^ĎlOf(&66c5Q=Rn=uH~NMw.$:2\ נG [`]hÓ7¬Vhj}t5CgƘS=E#<la2[6բY߇YV9q VcT^HTF9]kFuU[+u!INL6D8WT4`S~Ӣ.{ Duxx2Ef{(kNȻnMye+)&J~/Ճ@#%ZK鹤G{:7@Y0onHnrE0vи*΃3W.m Z~+:]ud5e^x^U]9EZU=~md| ІǑ~b-DE*iEDv1idgZ>mJ\S䂌O.u 5r^Ҡ2@0OVymW[~,qO\Hȏ ـd/] Y<9Qߙ- [838@/O1{V?Ը9IGAw,$毟9 kqÑcPcPA~<|:$Ca.{ ZѨбCc ) 7CN0}\V_*kLѓ$DD1XTz"GOGQ&ՋoZ\4੮߸ulafL(El$̅y&B@#bk@߳GW]7:C5СVaaEe[ww7T7alY0ѯB-:{ag_Nk|Ħٖ㓓FTNQ9$/~7"GTF0TYxfarS/ ,pN%;CK\}tTյ3s3IFL!Š,Ԍ%LH%F Wb/\7zj}/\Oz޿;;@`o!萂 Dh[ *6Y03S$%D#EA<-yDUj! 6NT`[HG6A;yL)EZ&6]$J$G r $)i;)iK7%ሕʋ@N:'j?{@;**ڮ$b](`NKY ;JHSu6ci2]>6@6Y$ >Q^#5sAwˆ.4ʎjR$շd|fȭKUfleLYDtKe_2Z{|O+:F<6 ]`ІLㄾQGc B &: y!ȡzBXc# ~ i.-uiFM}TQ$92JqYo0G^->Z[6^3߂ߧ`x˯ NSn!B[neRu^3mUEX7&iQReOFINOk5dTO>\H[Eok4U7Xz@AʋcJ{ӥs{f; 6M~ )!`+Tzě#,/`껦דn!-v5CQGZ&2wI 1yDE& *x1Fd'M:("U^FobцY@}C, V%/|~Eh FӶo0Ҹ}`rRR AJ[Jҡ8Pti]Y Cp4 >iK~:)s~ZZN-h s ZH3jj(h3XK'Y4@ sKN%xHbdw'AA秣@D3x%>pwAi]sܘI NElc| H0P Eapl bܪg bN5\6}PqrAp T dn# 뙹Vüt#$BzPL8 2Uh./d۲W܈Bqm]'QGYvL2I)g=\|Gݜ1h2= Q7"r pp<ɘ;#~s--VR6zptU07~ nq}%xq?~Z PGu"G`#l S- ;&66k]qB@C5h3 F+BbdU4"̠g#uQTQ-Ci|`)Z@xvS0/tO+2hƒOA]x}:Kٗ[b Fd+{WzrAos6 8~)W/#,&۰xi}4}t6U¸F3g:g?So9+E{9H>V!o]їa8$*侄eɪ7bx(]Xxs֚sWe&:J;[dk9\U]]AxP"Xz8aRQn|/"Q7]\$d1!Ugq##ZVR RH<GO<V$U+Oh%YHI3WZ)qEܤl+\3RNLlN)9z\t %HO L,{= ׀4n9Y`&JdX|mtTvJ(6L>A(Kz욫)擉vXEeSRE %.oK$V=?45N0sߓ~(n25S8v)"sU:$ݻ@b*i<8m˜[$~c(O2N+i@)s 8 !0Pc)4T` U2lhQ ,C(5V@{؎mïe⳻Ƹz3?w8RqzGʼab!(^K8/[=&ʆN0ę Uג^'O*?A*d"1|Ϝƍ0"tFw5VBFA8wO$;f"b$EвdaD_݉bZC]s^yScl>?7e'&?$e hg:FG/SEN )'rE"V1 ds/Ho;O#ZU%KeX I[ hGlػ0 8p`1W6?h†g˕6\1HԎ^1#BЈ6S^]Z{3ٯ6v6.ḛ5܌F%  qdt[ j ۉIkYQLT>b :j"vXn.rAM; ݯ6Mt7T 'qv7{FmZЭBa_y! ۭhTi!JfgaL9x98gWbʟf^ߋ;fTh6R)YnCu"Һq]7,O`}$-6odSjL@CcT噼[E+a܈EJJV‚(3E*jy@(I8Yg>'Bd)) Ň=%IZYȍQBgntB(91 v>x`aoL/wQ "J& NF$žpt(9J"~2I͎ BfȽ0<2ކ^NJU}{jCzUѴZ7B]"z.Z{תe]I>|7p:|7H|{ev#[nG_u>#KՋ1kP~P S]/^F ]纵0v/FVHMU zWf%.>Cy  ^dt֙A9_Ͷ/ :iH*'L_$x_ W@X'b*|?ϟI|(у)fMs<{jT%R(:3HƽכxU*H56oغC.(.+5 *"޳}ݭ"jwJDHkܚc 阁DT :CD7;e" rZ~B+TZ"%R#E2;BF#GR @rA~]>x\bEb~[{]d":wO{qpVBmHHuTO&2s^sHRRd*or-32J{ k;Ozʇ :GX^Gw6Ӑ*b#N*mCv[΂zaVuHr] w,0x%Dž ͻ?3paӆ5$sA|9T.iݒ!ݙ>-~:*cG ǹΰ똝=5f@6>g}&НYxXv uqVIV֗Z[cZO ґQ9 %eyoX r Y NxA7 "ӚL"G?49%vԃè˜{{OUUl+9`׈%T'JVSDRK\ OjSڔUzh։\XF=&,,OԛM)lּ4_ne֖x!?X5㛊;}z;eݩilc&ٲ=u ;#[]p Uy`nmIh*"Li11?!wN.(ʇQbsmhm,f~ AX|Xp$ZWp6! +6d(]ع{~*r[ ȩt`U 飿FuQWCBemEv٧F!Zf,;rl*aYE.TU"]RWלdѺ#XC Gli_k|+c>#}gԊX58j7G5-?&Ik8]-t80LӘu:cc(XwHB8g%;qN&x+:;9ۍkO)g8 UvU rިm6f0[Y*PT72%!6^l/ZMIQf?rѺc({,Xb/ͻqmr?},Вކk@4&:E,a"7ǽ񗆷 Wxһ<3Q쑛>z*/fsYs5 wqt7sݿ8JW!IN/sG4y\2XLZLWq@|~B2ɍcrΧS&gN)<KrJ9sq{]]#}ly8,|/,9dqӘ|#<`Ƕ~`v|6/N6s0h6"1F$67@ibI1M,W&VKt8fM,'kbzP/|&GfYX78&Y(=Y1m%sN,C؛#:>yl x,KbFQy5f u$iX;ub(pfkk}̬&˨i!TsMWO?{@\Qƀ$Enjp#0!a8/JMv.Ee)]߬.PgRE*Emw (qn4$jkZ^`Z6ԗшQ:x-ozy*֩ϳ&mNn)bd]Hlo&J: $A RO$mTex'}4ASHuQ:Z'|B-0 m2B ]~:PtbkvfvfaqGN@@TZ[[Š=^^O?(y{9{9'`h"0c@b\H4K!䎵QcN<$$~.(/T80P)ɱԔ*(R_+L ҷMѭDەh5]LP9qKʢ7Rq_{H>:THeRݮ,@'9،, k8qy %Oǫ۩ kc|nζcI懸tYa מcFN  '"x&lHNN'qBT2x^e%bLD㳧thv3Q-uq_wG_HhZRigBRo?,z`ܺ<6uȞV3n̘p|{k< <ν(,}lqn]<[Z T͊solkVQZw0#ud>~Dg5c) kQ 9r9@Ho/zq_\B6NzV#ݟo7Z_Te@*{gC<21MTLCdžO &eK̀) `BuU-(Ӡ#0Lz$1 '\׊.4W~#fX1Ųכ;5B$AdS@hGn;ʩk3Ε3ѣKؚ4z: L@6Wޑx˜-,+W($ǂ]vyY@fHښp0_?{Et5thC'77uōZR X H ]/eKdl/>>5Z.,-Z!{P. z⟍ }ǧH,>%&77yMJlUu$Q`0x⛖Z!=^ZSw#[:q:k^iUmdI*,).KR:iN1X*3qq>u[A:μ,i̩ȾC kaLq+L4z|D΁L.l@\:8)q3<Oc:VAh N)i_*c0z]f nc3YK|pt\OV2@KΫaHBf?yU"vk,Q ْ]\XItǐj߱Z?mcŬƪX͵?V raa TmفSoojRrh NL)Gf0R,؏D ϣL @/~Z[ A%A)dm6>@elAZ|` vKa)aҮeDOfL|"J<%SN6ykfK<)6}&/;a]TvB)׮e{g9xa(#/Ȱ ُEٿ{ !a;ve`}װ(V =f/bHh(',)^Hb`%):s&ȳ !Z|OȘVȭx82cLtגր m6Z*лPՅ.Z;W Wkyy:hu[V"E[ׄ!QIױKt.\j f&ޥrӀ|JC((V#8TuD%,á4"g9KT!۠hkc'٤lSϻ0`IYd!@vflዏeub4/vݸwGB-L8Q&i%VwPb$(_%ƚ?tӼ>yO\ك@qtqy텁 wa0G:hQ Q,2:ek/Rpg "&LB6GK 6P&hP֒3R^lh۸q#g?NW$X sG4xe͈g^iyz挪$JeuobYvk Y=Z-RN_0.SzPĄGT!֍oclDIQil=ʊ!;u7qALJsۓ\5g3v6+I4Ds5Ŷ ttc%(9d<=a9dzfd{d\/bWrٮT@LQ[_-I^ƌoZ\/⵩K );\N/Y&?`#I!JfdBhӑ]BЬcS` ] p8=ޗ/,ť_|aIρ/٣S`#e"L.O"0 ڷ+@oO3-VKSo[M{t >%iTy&ǀ+rl)҆D\Cez x,et-) (ở 4[xiꘜ?Ѩ4j4Dւ|,i'>,VB W-]u."Ľ`BJMu*7;w!R;FnL.[b\k^sC%1a57&'IZgDtw |5qsn,>-MJHM@lztwQM�.IdAz%;^G|``V}%0ʯ)?"%KH5p CN7[u4dZB՘u V$sfoZ~ $DZua[ i >041<,vaD$w ( p$& uBs.ٳfk ऊ!F~Phph,!#FXQ/:WJ8"A<8l&W,_d sAȰskQK;`aiiй٧z%/U=鲿q/J&3{&7HkK34tx/vBG| uMФ\mnԦ}̒I 6X*'Gsط8z%7B7/zVG.Y[V'i7j 'dހ_8 WqZ$iudOR^ im:;ڮ0/hGu? 2ٓ듕Jk u ݌[KK-+LH#g+X_ |'\\}rB'8ipsB(^H}O>t0&1ʰ ֋)@6[+L>٘;fu<801 >TV-ǣ sqf®?o RmZx6{Ƞ>02{?(ԭjyRDPAuĬ6.t eO2П}KE}tLWQlKEͣտ1P_L9L7s ۘFߎopƝ'Uf_|(Ϟ2,5΢G8V5s%Z%*_|?7 VXݿ*3e 11k*͙<0pHL|ŭӀ[!~Hs2b{#m<:.j&7ddz90]}Ok=rh,|'Jʳo~61k#DWt>}+2z8w^$. 8^G0цq V+sO m$gS2lJo׆tqg ́9 Bߠu2&O잴t; ǘm;k] ΰuh9E|MJ]Uf@GT (Bmo<@ua.QOLU;]Jo{u)unCJoĄC_2)ݻo)e}IrRƶKgOhRn2>Kmf)E聥ą^c{eil?ZB1hO0"0kܮDq(xy漦lVB%"@X`k(; ,= >IV<:%d%7VŃV5xkyѲ%K\#[vYG+GO/Yћ7ލ4iS"JE?>.\p̝%:U*:[odQiPvyAe)gd0Py+~ /L)_O.lZYc/Xw8b 1Qy$zvqKCQ_} Gkz#\"yKq@5d8 f=|cÀb~bـniL#v ,^N2;x g;hhڭ*+Z.ރ9yGNfoEVw*AF `H0NOH?*r{]JUce}@$X!C3(D֢KFckC}5V`W4 )*wt'(y+p?nO'k#Wa1|GTaptvQUWmx A1;T.Đݠ$ٰ!tZIvA ɤl۩ RaF QiݰNh6VЫ4&üs{M{9{=\k;@q=V ݠ%p_=q;&3XnG&ٔO+4z_T$lzr;z<:76WH, !sx,s>WCGjGb*zl6Hl1*( Y V|AbQD RRTTh ]f[TJaꑩWLI5. \7%6%J+Ȧ~{Ǥ2TciEKTyԓK+r1ؤ2zQ'| ?W.: gptZ.&mqU}>ROpw66ض4^RnQf٭+>Ŭ{?kdퟥ gHiLsc5KRڣmoYՄ@MK0!͙x[y/)e|&U$ҥ̜gP VNZFC?dyg!^[w!\ ^z;(oз3z6ՙUilncJ&d%Wg8Rn>#l zۧna>WŢ- ,}8"|3a697Eb滠ݼH]pn˃g n׼V*E;W~MNN;FglmaJJGRr;б0/`-4jr<,E_Q-bTO9W{PZ@\XHIyU5oNDryk%. RuKJd Os(eΦ8Rss[ =sP?8/Gh2&')Ǐ{R~,(~D,;.McW^vgp-Z\Z&*/_( "W`\3u F3G/%aDC'[5t9/@HT)%襝p~D;GbMu1JAECupHPJb"Y[0efӿڂLnP|V[ ̷&Pm: L MYt#9\S1SE^z >Mu"M6]uw n؀ LYAO1 j.->H#`FA]* -߱T_en0T/fK⃊D󿊢+i c[' tN@F@b '3> .x-:e Za&Gl^[HkHGWN.(4 6%pXt=\+ifn1eW-Yr> cRѺ? UɪlтoSc@2ɖ EmTJma p4 ,u^t5=3G\AM(L| W@r .6 w_ ݁sP;!cXW=sg2ObLHZISy;Uc̃<ۿc2=uqru|ɜߺY7{'tx0u񬤗Ly^Տ M/h(|d[BU֡6Z<"`/D727t~QYTI7pp;"5m4G?It@t^ڪ["hꉦQFu v@1@^P[oBUV3Q@3 ϓYl+HZU]FϻCym4uxo^_q]t7BF:[Cj`qc~MqoxvEClX h0eJF,Osj"5EmV? b|<j.5_i7<7M6utL;\6MT" (W]Ekz^(lSi(,'$nf?M cְ21 .:ӎ^ }UE}sWJԦY S`h;1 'B侴fYGJ"Wn oýfX*ag7)ɴ?@s==)+)-EG/4e- h|= gOE:FeAU;??͵%Nr /:UdUHt 曑}^r/eX /G~VE?L Zg}6̘3jDljD:5ʪtʔǣ _?Qv2:e~T);NYRvR 5RVɤ|Z+7(;lZ a?nK_02nYqkYu~'aK9-%ӱdMۢ~u:xb}NY?JpjhqQ'Fʮ,[E uc34l+y];j}q٠ς|m{$^L㚇7h! r+ufaȗJ&0E;nP F-T;Zf|?\VeSm1.d M6L=c>L(Z,ӤG+WwcRz$ZSCh nCHu+GKZ/J_}0;mގNb,YxVdL+6R$٩TT͖>iabO|di7$%.z1]_Y؉ *I5rAGh;Tcdz`xIԞ#bBxP܉b9xc"sNaީ٠ n/  c V DOnejpHwpJqLČKD17CK} |^ $@ֵBP[K_H[^iK[:MʼnPPD*`Z%t?m 1Ү/P?H0W^+sI}>$s|v>T8H%$aqU/&(o}@@ap_Җsx$ao K[v_J+rr|Bv*1J![+nD>t&B6'N% &\ tɿkRb!4Sq`Z\WiF5Z|ȓw2Ve镆yR2zF^ĩHXˈ`>wO?[4ْJ&mkUd~V&,~?5R NKCw:BbOÇ썥 ܜx~&xj9oe *94gEۦJj4n |)kഩ`kfYZ֤CSH#}&K 9:OV]өp&8#m=ph_\%D 8wlt_H(+%cranEYdƛî.%u",ULXC#AR0r%B&GU"s]K 7E,{FK,T \v|v/J'cq7+q 6'Y&O!g٫ީ(^sw}k,Q"EqR`=qI^{o{`zHX(TlCIVC_pe (~Ļ aapxMgE8z0o..Z vibx t9MS ީFxZ)pogysKd:VY\RP09&O.ڰ EZr^+rMbK#Y:k^*X |%WNtr[T0]vF(X¢,b: A:un =k!$p..ȗIa~3դ(qհVly<0pŘ^wyH~RV܂Td0/N 0m-1l[Ђ/b5 (Rl.5GCĸ3(|_ M3!_ۚ #Dhvbט0n)F fq\ =9\jr&U3w} ,>TO 6a d f _`QA39 PpO|jHwJ5Mtc,qg#YFc1`@?ג@br0qMV{6(.^j H ֳInE$f_ ɆH#?F/@œΥ ލ =$8|WbO 68XZ'&/|~@5_ܠK<ӡ1}^>j(;/Kdz3ݟ_pO܄'Ԁ߈oN,h_z&CsK'YĐY..~!YC灍/F7 .{2Lmx;gl|TݖF^| ޯ27CbI%us7$7yZls2ާU-3eo/ɵ. Xz½F0ņ/}<(۬]/K{Y~;ة&mҩ:es6}' ytjw`O9.f ĀN\e_uГzt0FaԸd~*If~ A`㐖eC`G@3HxړmJh^U&pABWV#>eC"==*4&ː SG-:iJ7nlgz783Z܃N SVjHo-|75g\( 6#dį}>xNlFll`=t `.OlҿY@B;g%nᣨKWIjh[}^ˑx""fztDH 7wFF:5oR5-j ]nOvAkh2Y` B~:+6tVP/_\J&Z'J3I@o h0]XFe-L'FN:PA/N稏# Li#m ޾.4dMtaq*Ϭp ="JQ!:Mc3 \3MD*..)BЉWld$#-34a.^4nI)&,0AJH&,4~T42e>1?HP$YXf_(F÷w<XvZ _u~iyN/>z?\Cƨm b(No7.vFS qfBQzX':'NO4?;Tn w~wk> tth N=vej:ǏUveW9Ꝫe?7=QJ1*G=<:-h Q"0c_kHWF: =>k!)>Jwk;iQzY1;! >Mg ٵEݪRw7VZs I^<-tyB6 ^bqʵ-P6,}z᳽#Qm[:uE7so-Bq.zסePSj Ɍ_ޝ%k2Rn\W.s& tFD[u L6U^z?ɕ Cͼ `B Y/=﩮^ZMP&9IR'}N;?W Mn4ǢUmbB1$yP;#ubxcEPc]puF& TQ}ԝ~ڦ~hlKݨBuD2i'P: ;mULm=ƶ:\&vW(NAU:Cj.389C Ψ-AM%'%gtg*pќYU,.6b˾:_rgԳr n"T%L|@a@[>m Y0 i4}&3!D'hcYinAM-A}q[ݗ- p/qSDmȸ|X65pw 4̼A;U8rFSѿ%VV<ҒBGU fB!TFN .AvECXMN`=RLx |̫8 D pR1[֓D,ΒEc[ B"Y bnM7uu% &s$+ܣuUU* b 7OQ؁5C ; k-;U9Ah~߿(c9Juc^3:&{SY$=d^(/(yG$"VFbv7E7WWoеmH{ @p*0u ! 8w6@f!4@2C]=J QZ.j9is>L9:HIX\f<Ɓkܩ Nq0LzzwT98%p?zj)Kx Z*㫱i $*DgV7yfn^طeqDC 9@F_]9v7Zx]4%wpg 3?=L FĘZ>RG`"sOU,/&1 i(5Ssw?oy5y?xͻ~B[w^Xzbs,e ^iHqDn蝳^ wx?Zb+z.(wx,MӻOʅѩ,8 >cbvԼ0}ֳ]'ک)Z.vvk/}Qr!ٻ No.Ӈ~)مpUӻb=:[rϫ8* tGR Oxz{n6>Ug{.p1F#E +:V2\|% -䟸MS^=%=r'Oɶp/l>cJ!LǫaDXnl6F::0xPuH!̑BꒃlR(I3ȑN^y K vETkSTJCv>Q>Mc akG>Lҏj!Uяa3?{  _3 =烿t o.Z:"Q'9+%['#'_>פŢɵވ #m'DEmdrCCtV`XZzm**~Q uaVkw)ihI B-~?F/=Ni _wt*d~}lG? |vt;SNщ;:ſK;:;:OMyq4S[28rW.Sf)KI&k=բ4O,E:ޓ/̛> %Q.゛k^yk.:G#G ƿ!mw`hc-Zj AP;k/| Og5_XlT0zfԮh(1oy|^@TpC]|MT$e< SY+2Ic!6Bq#*u r/ qgTLF'Mخ1w 1F|Opoǃmu*d(&.mmv2BZsjb+RX=~] =0Fpj=6o$^Y~ ^(O7ێujZv0"GE?/>rWX1>&$?2x-qrMIS?q*^E4,,ǭU-2?ZDvEdmm^|tVSR5:&㿮 ؔzԊ_|/TH6jGlb+iIX/ ˜~Яmd Aj W~dBO68yոdWn~@ lm^ dĂ#ŕ ,9q Yf|yQ3r14^.!Y&к_MA D8u3O~maIiVT_]Z{~K=?R+ _ C]ޗ]+t?ګ-r gT+P^<4n=H3&S2 qy*ZwQiqcq[nM0RQJ )z^\aV A(0ZLG7|M5"hi)9:8LJ{Ș AH+-r ŧ2D ~d ZUr'sQN0-5ab(3޲7^7RBH`$5 cZ <=,2RojB}S OqT#&#i\xdv^Se`ix$J=R|QO*v]GgXlsthhYtjR3hVbƳp)JÍ 4ɓޖB'n>Zj絠ĽBd(b=ӿg='#AR/!7dTb={+N Fc6px yxV{>3M&}ؤgiH,+D^j~@NjRX]aP{= $I64 skK+iݞ44Rp+d MczSbչ_r> |DwiD)bAc$\Z]E=eItV釚b;T6+U :2R%~ 0#0 4 8b@b !qwW+6kۨqxO_U- 28//n_Vif<3ҿ9vg9. C |?OǪ+\(whIAzC* ,xOR'8K5ȏxngZ.~>g0&d*nܒRR7yxDYCd}$k0YmTjquɚ+M()uVEv@q o栘26o0PK-0&5iCYeBp#YF69ږv<@dz$]dE_8Xl1=04p7K";G^ +8ch w"hqg=/,ME#2h4Tx^\5bp ]Xdn!NTLsbvj]jwj44tDqUgktƝ1~hί903'wpoS;zQ ԅ]'cv VcEL`q}8 O3??V=Mc27fs@XckuKx'tڍP@ɳH[)1*Y=p25'PSQz X/er17d[bKH[l(us^]ks x8,wB3WXM 'KhZw!|zn mނirZ6DΓb*ݽM[^:9t+-:WVmXYuwb<^< eݼWaD Mf\-öfrf^eg+D4٢FRsKz12^qL(h:טgֺ@)si3/,<r2(\'}^K9v %6[h{J:(<.m2=Q;J`7 L\L&{!4T Hjű rTD*Z٣Z7c*V1Elhdwzp¡.zۨPLF}XJQogP[uN07zwh R~*v!|"hE>McGcu"[dz? Br/Ca{dV=4c6ev~.%oh h>F1VUMVe0aAcW%=ON|O<k)Z"Mu15h XI0qV.e&韸 kV_9Qj7Oe5+uL/1OiN,wϼ |H\o"~7,m~XڋVBNĝx=Pʎ@/=/,rƒboTdyi \q+J!=⤧4:&x7TQW"Tf{axyByCUnиM2RW) tBVO MUuq&(-2 2a O{QlV*V+oT]$-e 7ҖxlZwwb| Ɉۙ\S Wq(o&("fǣY^2e[p`gη6FH飫 E3:xɢ|qFVW-:Vmd{F2Rzv C`$#{[y[_弆r^rwr^3#-}=g/ϙ@98ⷔO 8C99)q#sv3g. `ʜg`Μ2guAjer$ g?,gJs% 쵥A-9rGlęQl8{M9$kg932g26n8KgsV;ͿqRٙWwd$̺Hyξɓ8{'_8+μ TΊ)gdΖJeɜ6g]͗9[8cRf;0y]?4748#Ajs_rA7>L>L"~JY%$wx>L"~U|Nm˘\M$]oNu\p*PC?t#0k&cSD:m UG1m~2-Ev !ƹsΑhQȲϥSYK&qFx?Cegjk_PY{̽]5Yi c:+tj4e/'m_?7sH-2"~ {.bd~O۶D~ r%ŏr? pK?t8 pW qeK_jT0~F (~ _Ur- ׇl9>́ߐyA4B!"M#gkn6G6h`@*BV(ū͡LB'#Nno0(daNmm~< p)5uX5ĞE!;ttgXP!;G_[ĒE!Bm]42CxҕSF%3(׈HKnYɅ##M t L;!Ho\8Eh C ]A- rYc\XVZ^TjzA-VFUhjlFZ8Va#j҈UvLHoR;\IjVװ&Ք#jRZuTb@QsdqVZ (*T S"}8+i$ch9&FM]D%9޳dryc2-J ,{di #)e~vbT2/ZHe6g\=m:Om֬5bZH{A@hAOf m.A{o%Sh,sR$hG6b]42?%V+ D u} o\1 5Q_|6$1pf6OD-[ٰfŷRۤ(;GR?]< ه8"Hau,;ɫ 蹙t8I>E6RsU-1w?aw5R9?p1cPBgR\49n|*N{:00|H؁cN/C6 \|{O1@xh5y z<F?Ϸ )[s.'  9,uc UekrWӛ0:o"='0l\Ka3ƻ[T/HN 2^e ,Rw2H)C&4{iDo]}kOoaꢰlV"&ʨy5/Pk%˷idG;إwXvIT߁qvj^EPs* P;\mQg@RwX^&2R(@+Ǝ:T3S}LY݁է{GҧeSCJk[V@tei)&]5j-($(2(V$TJ+eʺpf0P (;f"&Oo0,ʼWʝp|@Y<3}\/DWɠ@\@1厧"r{?og@P6&mu$P2( ȃ cP⟌ʵ_(Ƿ1P!(+n-(gQ֣P~[bJlUPnPp>%=~hA骊Jź[ 9wPm$lтR 2(9%y%> (=Wˏ姉 5Iw$PX/9(qa@i](l J(EP%Jԃ7Vn؜_#cJ/Ӷ|˱C"`>1m%>?"cf(Oͽ#t+Ч[p>BP:ZPoJjɭP_oPD8P\72P5тx$P&=,r(gc76De+;(S(f̔т] ՏePζ@}gc#\Ee8P3PV"(]c@S(y<~2P;n`0ZP:7F#}MP>,@+eS@@iEPޙn qv~ߛRtϥo/Id)=BwnZ1ˋR|DzﮛR|j)faNmGNzy}i3=E|d[Vꎾ&+WOP%ES Na3(os_To.ŏ-xL g>uy݃4J)Zb3lX{>JlR\;SZ| Ph>=mnqK(^?E1hR<`QD2k(TH?QRZy]K<2!n(MV? ]Q[!$ʗJ$JeZb'Q(8ܢ5Y)^A"DY(+(@Qz)%&{%<.(mR$i)BoV %e?E(<5eN(5MVA },$TRx+Jv'QhQ>-JmLO Z\DH?G1冿$xa;;ܢ>J=RB(5 PW<ɛR|xxL7xx3oJqKޗGoJȃR}ٜ.ADŽXnUh!Y1t %h4Մ#2? [6H2+Va}ZEܥ þW,NƱ|ck9hI`nA^%f1ɲa!rIlMs9)r?Biɝ6=VShsKJ H (8x0Ry"[dZ0*|;T! LZr\r)x\Z"pq>ı Q>Lr 3< 9kkPJ\7U=8 8:rUlPK] ? D~k!kd5r| !Oq!{Oܐ݋ȫB B~2A>@BZ>d/@Bj&!sؐu4dv>E/U]At:3QjAY "%AzO:CHGCR4k0iQ4i iAi7rOc&"5$!u| w!s2.q¤qI4m 鋑T%Hz!G^ ]OJ I;9CP =.oE,f?G0lD>tA`%͈`.EK~3y= n&Y|c&.'Y2~"Ϡ<Y_j_;ɥe),5IGk L 0@Ƅf'G?z76E*zw$y2bs"=O4_1D! {G"Yb"~FyCP![ 'ٷdՑ4/R !*\lL~(t Jg$9Ϲ$އk q9#̙@sp8 r3q S_9ɈpY:9_#DZs ϧ ih3+^E$HGEi$G"'lIv-?S!<1&`#C]_w2MWz !Ⱦtd fa1l!A=O iy<ԝ_z)GwTTQwo0k0!ytw0&,]`^}YMb} 6>f:0@, ɱ"_z ̧fkL>}I>FDi5ȩ%9ua0 s]PnY\['$7|.αzc(cb,hKh hKD#BГ{dtjϝI|;4I$ʧ$$S3<{". AEIZHM!4 9' BT%R8Ş6AғZ O-\ r!;4yk } y&D,p~ u$һ" o@  owtsjVoQs\b"l#bO\[ ;:yTu`r>yx\?M"X[kuv!mnr$\w2b'׮M\]\P#"޷\k1)͝ZI?\3lT,"%["r\v އky„)҄>e{4Ar}KSI7EZw n".[\F c3#hc0M\)G?`v10!&sG0fA8Y19[S%]# $f?Ef>jĜ'b0憁4擕 f~pS%ׯ 5#Ha"0w1;zy-^8,ИmY6A> Ǔ"s{( H% 'Eӄ>b4ߛl 9at @ \qѐV04MAKB~t]d|Qdu.䫱sU4-g 5Au("T!ZV' 7g'[].C=XB.>'wXE4lM.e)`{5ܙ}gRh9KZlUK7};R~-m;>5o F^`9Y?plg' il٬*qlmAі]'gj`#nWQ;$}%̧.ޯhcr ,,ox6ɑ,Y&]OY&Yʣ*08LU^E`j0*x<{v129uvyMd29eA`G4U f0J߫:&cnކ&/3&g\Ϙ|߳ɭSX&#X&`F)d&%@2,7P&g1nјS&30620>o-LRRV]/rŲ-wЪДQS'5@ܻĘ2e*ZDx5RcV_b[]˲:e\w6Fư`YJ.ijШ U;caC7f̶em!ZZ¶Ͳ2ciR(˒ #VqejZ}m v":nYgjr#آeށq_}*$ޮvU]#x]lx l׏?ɣ-4| UE; iwSY)dJ?[3kwcն85մ.ØA\+h#i 6+ε֬y ~hϒ‡J\\ʵol~IRe kH_FؠE=8I7\֓}پWOxy{`ǪcGwCG{>(Ą22CF%?)bcJ~w7*/Aif?32Ӆp+bWƪ.9 @%D\[ ':"6W0qkv\bC*Ȯ u[fc7~ ;|ְRMos7};e][~[e:=TvvM!Zԃ"|(i*ᷙRa)ЋCt*SqJd!?_4e'3~- gO&c0'0pnbq):FW !?V\ߨtruRcɇ|) lӅ]rO>-m5,ur}$rɋn#"Z4ᄽ6 +Qӥd'.X$r7jXtЗo:1+1_]Ӿ%_׃,_q{~\_!K9P(: 8R2)_oFRK1w&|c$1BsPyBD!|)/}Ƴ}D|9ّ }}ZFSx v9}[OKސ]I[}y|*k4ˉodp5E:bVwMUy>!mZji)}"PZ>x bTjEG*(`&NՎSװTZwG YVdJQü ,Raι&My?|ι" s-i[L|$9$77q2Wc+q|޻N%.Uk.6(42"~mE,ys~0f酓{ F;3m0Wa?&? H^SccBn.G`-ܵV-]+grUcf`]>H6l!CΞpRID4F:81`$95<(%S%{gPrdp$6H[kC@ZYj$p$rcM[hM/ղǙ?O7g*_ %9NB;tu(hQ_#0S @23C'9twWHs?ܦVs38GH^ђg wZ=9d-c-WqHG- e2,]Ft5iݣ&Ҳy]vgopz dtU7D2lAvFHғS8I+] C [dD v5O mՐ^Ny.#x:W;)j 9j̀T_Q vu Yg+3)Ԃiglv*2v 2v0vq1Z\12coSu@J픴8~$9>Q^_sjҮ+\_&\"mOI>:ixl. m?#m?%j,e%cTWOIZU(}i6r=m?}3vX}v!mF~mm4ڦ@]HNNNZ FeF5,WѶG6*m{pߚdB 逗ӶjiQhۇ-?[xR?I?nٛLHE^Yɒbŗe뜹Y^2$^E*(Ve* oA< pnƭ_ <̯T佣Hks({z*T  >#fk 19|E,>RH N`øMJ!E*lOwBk9NS39N滮RCtȼj\/QJ[74t='-m yv>L|>='O:;?u翘~v>O>(kWw?~F>ϽrP>5yd$N?P /c=y.> "n ?Z&B5[WɓdEsm@> */Ϗ-`p>_]ϟϽMQ`/7nӹ|Ȧp>?2M l9丳{IckN"W/ )BF(K3uHsuJĎD]}[LA=gGSBqVzCTԁڰ'cTIi[9QklC``89f8Y&0 tv ]H>kVMW#FcP KIA,|d٩3E\ 342i2!5$:'lQcSS8`RШZ p.|&)>F Uw㼷l?rΠ1τCZB>O\ BTK.!>qgX_1/J־ f4+I:zTeo6R3+HH&`~ qf5OoTT1Q̒̓(3Xϙ__Eb 7B?FHo6:Q|(_>e<ŹRf 70O%G98??O&D.Cu3IqT-+~x;se[Q] Nr|ᠿO:TF>bd#N6X-eíUݾ'ym k\ԡ~ݱ2Cajb%Yl lyݸ_MV(,0.c8O%h {ա׸[`a;*F@m^`F0c$_)u,c 9K^ E+i96q9n-ǁQypVSņopڿ*iߋ2/=Θ-s]h%Mrr=l$EX?:tGyaÔhmBnn{j*%D%a'(12RT乑l$G,-KؐhUV82U0q{Wd=rUKe/@2_BP-\ġ*P N_&퍇lu ud?4diBԓŽ,<=MƵ\|/JWQU)TD5gfʥ=d>Xux ty1>$j,?|mkHHepY-ɂ何m,BNJGE5\zA"4~YVMF~&B"Br$GG_ݿ&\nw6>n2[kE諜Hg{"ԞU^ȉ6"t"4("vMg1F"v?}T"&F?U}=ʼpx"+P QDyeG? |"to .@l"tyiѬAD(y "pږ5yP[ʥFІpgsPzyПz/ mfT\e<&G{o+s-AVe$fYƋXFJ.Oz52( Ggb0nPLw%Gpl!0ڗm^d4bטH t5pL_yU'ayNFSN 3di^ɘ s/`J). ݬPgX+ 1\1DM3NÁDw)W?i,U"( G0Շ >X>L w ʼn°H> οp,ćaXďE~RT,6)Ş{`⽃aAeXjۂXzhђhp IHr %|uݩ| n-$fviYER⠵`~˘Z5bjՉ7&OPކ$Oh$=P2UTdp'eOȬs5GEC.;OF82 d$l_uvם15)><[*j$nc}aBCmtW7oWK"^W K/c]/0+_2JR3A H(-`~v JҠQJDߤ=2Kڡɟ;d8mwUSGǎnz٪.@ dB!CGsp3 rG1r#b-Wڌ3K#JZVS߽n]:yY/2CuDuVXBdu xxX\膛t"M/>"PB2 ;uA|-cb6t% }rg[n>EdwA;B1/ԥa T)д^gд4ҡhtZ;7!Hrti8`tVH6h$P *v`Og5#0B2} )Ƣx&Tu 6a]-,M`=,P[~Bhv Zء%2PpV1 >Xƪz_c-gcu# S+cgb';WՊ]z դQcTŪASkWD)X}i$<_ƨ6 U74V+X7L. `7j1{} w/h {ʠh IN%ibfLcBo nFl1~FI78d-c[)ч̇2W wД|d9Pd1/(moEo98pT\!eɆ} u|&+V:\dI(uBSũ6łߜnՈɥuŖuq* lg..|򛧴l}!y F[UR2=i)Q)CK] \}K0&"% ]4$@\|.lz ]t}Ӧ峲.^EYy$">2/^5X2wAt\DXXI$^>>OԲQ+t:vGʢT=rCB_Qtu(k x:{TYôfa >oI=O ktɩGֲ=z^@O=-{zztF}iSZ v4oqH[A&Uəl:2q͍^kRic(Ԕ¥Jbk憡t81N4A̴2cW@8Z$Z8|(606ܫg"ࣘxVƖ EQ,  QX[`thV##?ҾP]+U~\Кku)30!RPtz"4SeSE S^R'XG|%:hoLX, |[dfRfsTC$l=p]l+ӃK̗5 d̡P{m|se T)X@eLFC:c@_ &Oum6˦^2/GAW| } |L_C:b]y- W0;0^T"([2wZĖ:5V0hhWxfE$,{||XDV0$RUǰC⤽T5xi;eC]ho.Ah@] g$ 1`<kdWڈd (oPѕY6)x!-rC[O  ![.&"% zz#Vb-D˲N^kk֘c]kat\0lLUɭ((2j ']~ 5WX Fjh!\1r \Oi90 }\I9^yo:HŠD:+ eWwFlze94֡{'Qhe~ˊ3A4al懲B C&<`oN"< >QƘ:JiYC\ FXnIMa!8}>mW73Ns'5 -;(KFQMU#ks,EOdQ s"@wnh21gk90޹d d6])xUMD$ x}`@=FzRQ3RsrԤ[j* ^a##KL0.oF$ŬvA׊%Dzt}I[SjOTYǣ !rA~|\"X`k3 H$EBLJXc)čì䪔t,zhd$+WqcGC]zw ݗ%xϼ8xN:x;.VcxO_/ׅGZvfp'iT{Za Bd>C~KuE`:MtE%gH NQU1U]O@Dj*&U>5w<'ZA_D R2G_Ȣ aa΢ԇE2ݟ(Z+ky 2 E A.ޛe!/eؾk#ǶSRV88mB3"L6ZʼnM=ΩŘR쁻esqS{4A`Az>^Mo,hR>қRnSwhm5GIA\tS77o ӯܠ zc#ctCb37G5s->GۘlɯA_>MޔBUV+37et oU\WV@rBXVoff/WzД~{BFEY m@t -B%Z^ t"TvͶ>dC2MA;WRn@̖ cLggg ;;%uCw)D3:< nט\#ꋝ\(`<'~\$1}e20BC,2ꏱ^RA.)HAO<$/= .dI/Ix%BzsgξEpĶm/JEx('exl+ ;;dguֳ&c=#z.ΐZ ?i+gN0qAGH kU>_zz)zXVXOcmd=MG |qD v|bYuOп{1 -AAghL<9l6Xi7)YOyG?T"ݷpл/y;#dGqc.wThҴ>!?YFʁn897w\EilDQO=RȨCc@wI2ק < 1 ?(H\{cρ#bBE\<,{#m͖qO= >9޽1m Nmq sui'BG0e UVN1|+*vJ`%@Ɓ;G OA'ϔ No5r߷] zv>64t'ρ2B%hy9zs:'2SϺ9Вs:(kwYV832dv8ГdrC@emc2KbcC/J_DE^A3/)}ZRlKk6 Oa~ `D a.~ 5szWw>k H+5P+!>'a(ǯ! 㪛-tWȜ.ԵhXߌ }lSxkN߂6w_]Y`9$)PTA2Q% j(e6eKϠR^0iBT;tr@v "CBt ;Y^;w;Yػ^,d$v 5'{}w';pNПduEwq_INltSsT@Wbre(@Q>mG8( e+PH(QP^M'.voNvTddtלlNY~'[g8YUy9YnINv>ONSm0-e-P@I$ P&Cɂr 矆}P(f(+iqpߐ훊޻Nv^OwݞizfFbR6]cܹ\׈SȫbJ j G/:\q~JF\IIڠbZMa~)]eJ*=vX0E<1Ӕ9ZF@$wIf)3$]7zo:EN0 NEgN)U+e3?ypq`j}_\O܃~ZihXHey-[en6+͝nXIAσ6ڰ6QI30^W-Ċ֥x7r Sr- pzz,k#r%zfhV (ז˵e>WT,|P=N$,Jq:^Pkũ(a[wð6W"a.koޓq20`ޑ`\݃ 0$`w`._BuY f4cGx * 8.V9LbydiEi'FRݺRKZWU_8|{*G =>6q%zoio6O=픠TI@y UIie{`mV#Z?y/?[}?]{XTGoGǴiP&Bh#N0(W[Vɶhɨ_zA)I\'qI:W|q0!> LDI$4IԽotVթSUꔻl&eΗI.GaRzcME¤R&%Sä h&ʀMiRuuDeѿ' wv>y1)5)Gz4);2)yGAt:$(Qؓ !lla|;kR jR;cLʯ}o $/8S݅3%j85]pO:{2?T0{)qӝӯFVٞYr5ƟMI1)?6_m:w;0' 4Cw?Bιݽib't[qC˥qUc40EQ 0F]B;mxSY/yGr_rþ!݋ = r|YF>B Gw}!p<`B%_Eq>=A8<չ $E;YϓYzJ (%j ()$&bT,q,^(S笒Ԋ8/C<bD~z-'/D^>Vr71PkNٝ)@SATIP"AݢU}] OrN}T<5mmm{A4{1:YYnM @\(݁ۻS\$.}77&ӑLQ X&ӝBL`2lx\yV/$ަ~ Ϳ3pI'9B ":4¤%TI)%*L*πUqLUi RLíW BíLv[ʼn]6Cf<&)D+ʀP 67 ~ f'A?ay_9:76Ɇx=~3 ZDr]][\̈ݳ!@ &797z ?9;~ zz'AnZS_ʺ%U@C~đyK+* q[x[t^輾ʔ!N^&H˄ w"kw.CE-{m-y`vw:׃}{H̎!gz99&{ Lt?ۛȊ&k؟|?·-lO|؝aM4A!zt5vw<[a)TH%6% qK)}^(}ث_:}X}Xԇ%}.caoՇգKn>K>,=A*ZXjRn`Vtʴ2$ ~*V]׎kfr* g WSE3x:P0Њ;k\M ަBNp,ƀ >xS`%Lc/A alB=&&]m1TG_}E;vؘ*DގZEas;O{#ޡۈ&E5\%oDlZԄi5жlhhvv I XA8$&'0hF3Vdwo' md ݬ6%mhyVDxHӛ3ko*-$9-HD8"^)U䬟yd=CVP˴ ܖQlNJGmxruW:Pg+dE9Ĭ!W}9}FGF٧T`Nci4{ zT%D. \3YVS&B\CYy6q#3Cca}CBRFQzo E X!5T*27 :ſ}KX.2:(Mc/=R(a a+GLZVŇ0lKʧ0@⹵]ioVY!x r`r~5Aaٰ;Y:i 1^Yjp99x>|AhT5aIA {ŝ Ю\hػ[C EUUjJ0kcXd;-MUЌ\Kml|3vHN;©R` Hg~(CJ/@1%`586R]8)'XIq5/2"`LzDك*W/JU \h {hB5w]`NȎl m6 . 8@ @F 1w!UMR [D,\:&hR=o[@r:fbxBa5?$nS7mE7r$l8W/8)A?:z H/c3d@/JZ٨ ndd5g =Q6J}0] xUun.?p!v1|1 quMCՓajo=BQ ^kPΟ#>u<k_#_?‹W="c]#dwvZrɗCIkOq~L%E)ߏ#v*WРlh2jKtih bj{<=؁b?B]`DBڞLAOZߞP(A楶tAh GT_8hSf zq(A2F؅<}u77څvп]-e0D  Cp/qޗγow8 K|۰u~:m>$UðhaH/bV 00Pʠ /4 CEP?a 0 \a8Vz!nU0,dyĻaqi/d,.d1%X%l{0[f2;\6 M[(UZcv2/4Ltm1# /nlqqrˋڃ kp7|~ 3ڲ/h eAG\)-m;R_v퀾WmgҖʴi)_!7ZͺLhK:Yzt,%1_!9/[hf+sǀ$M:5bGNG@`h} 8s\ERYz ^qep* 4j^qErn&x,!+!zo|k5CNPWAxK!}`֧s[7 Ba @1͞޵op5mشm跈P<=4$gt<>h2Y&KX`v T? ɹ rGB%[z`ZAB&zDp&> }V|pz! lҙdǽ.7@Nb_'+J/Ƌ+>XE<}F/L1jo$i 7xz'/ftb -s*:W2R l[c Y\X*p[X=mXСBgΝq3bX:q_D8gq /6- z$^dAI{vNj`j-_y$F(dmK<^JPm+ԐHrY+R7OL1 kǵk/X]~[̆[j;/^\8"0"~ duHtF1rQ!rJz"؇#rU qDP&Ocj0Q CK]{XSW? !` -U8RӁ;h|JRԀv,UڹVM3#x}uq;ǧԯPjÝ8-> zKsZ!7(9}kIp]?EpWE;Mܭi(8]@U콞[{EVhcjJ`qtKl6t'޼tO>JPƯ5lo:AiEM#-MQBͷΪB}䋩Sݘh0 X8>6uSF4q]2Ÿ9rKT1$V$Iu}уH'N:'u* m8ItPx9+I N" r K/-srZ#-3k5YhO92!GLF&\]?"RbX3#9 6$m'P}q[#ݫ鶒R݆YۈzZlC38!]-[}|b6NBtйOGf H=f>f ]!̝<9ͷ=$%m`t'8VFXq"n܈71,֕⚇#~kE4Ļe/wiOKFFy`S+z^)C/lymsɴQG@:S*LN#} ^7wy_vc$P GrOAUO&?K=9"Ҋ@j/HF D҆#2=H Jf?(^qPE:h'8"ֱ0 Gg<7^FZvbj,jb#toA3.ih>APg ,|u1%gwט<]1%tJHըX@!z,b:.!ָ j<#.ESsw°Fb Jmuf'ǩne Ѥ݊>"((Iz>P@~r#a>)LX{„uͪ,yU?z?~a5p PX&KA :f_I1L$EOWW>wĆj=";x^rbN#z4lttXAch4[ON< \K  /'jê˫! qYjz" *F.zg|aa~_& JqMe=(F &ײѽ/8/Bg/:$PţA@vdj8(jm]9Lq6 Bώ_|ߐw C?uȳd{xH!{o(/٦Gl !F,ZuG\ZUh{h :y#d:)%L50oJؐ艙#| xoKBk6aCj9MdgI;9*>O%x=~0[6 o5 Ɖ1د n0^5/`$#N\0N8rFNVnˀf즜 @b'D r!W4NK 2{_H:Jgyʼnqe]ޝfJzh/ ڸEX{0X'R,L)2Ѻ@Am7.1c:yt25Õ )WvBzD:_)Cxc˺EH23/+gdH_%ʯAIQXq+ +S@|%e!z-nV <):rjj&^ɔ)'\ YKVȁYON փ^V)@:u^ElDBaRq]+](lIbu8e'eכ)=gP|7%ӠHLe"SPxw~6٘XH9<6߸d\ pS334d]s6oye:+ HYsmmK!(uBy@bpq=wt(2H< ~jde4 \]W in$Y_,24Lќ9A4Ky‚h6_(49g厮I-4X*|IxyR>نmp؊SoYi?yߠ[% !N$t91jsx o!a:c.>C_ԍ+oSAy)L~za[+7m5ly ō;eBc *`&])W :#܃S#x0XtMДٟlu~E0MkNsHݣ$YQӆyK`;(߀6Uy^ejIk9 v'JN}-hv'AXRB-S-ŕi$`R `.vK\p3Kтh-B]jW]#S I3+.}Nϟt"+'1ge<@@̜aa`&v9q9p;sn^ qx)ȱ=a0`X%xJc5UJ5hw =9$M(vf}Ex? ,2/tUb0OX1sBqFeдL?bTZgaBS 7 jh) kh0 be!A7Pw#S q}=翂f XY`j) ~AVȁwo0Ys)w\׳\:ymwH)~vAHȴ=] '/3q^kMA(({("[; 5{ /_'ǢV+BͿ詰y3S?P!zР+n\-p=@3rtg @OT`5EX05M:Dۏ<7ľd;P.H1L=;ZI_"<]0]v}+>Hו8V׮fH,nWifԡM > J=ɘӯRə Xvuם@@,y$8cJ4``,`f֛>r VW${7wvsYTĸFwYPƊ@L0Lb|\K h~R'\՞F!xZDS{s;|#(wB r! MkƐ2>_#]HE~"~C2.c>ХM^PkTWN8)5cvr ax_f@‚Щf{b(7 bXqA"k,RK:BEfUcҐihcB{j1g){'j90 =,[w8oYY_uNzRMG}6x2Jm6ASuD ASUK)v0N$0TOtO8^}.8SC-VnyY$78Sp-J7j9W; ǖ”0MSlY?@ 'SR;FR[@SU,a =&?zCdU*TkRh wGҥЉ2<Lz;-',kKzɍX1P\ޥVÃ8lz(dXN(SO V`,,|}-wلE6~9SX)4OD-Ӯ7f2z3!?!7꺝H|t\eZacmP>{ AUW_ݎ>-Ec!ѥKY`%?MnVm_S^NZ7ܧpJ1A(uaq,bD*b\@6 B͝T E`VG"DŽ!B@$3'Ag]| w_Q=ɡ{hz5{#h5x3G"EbU9x*ӓcAO%+e'mi2٫:_ 6|s\0ҽEנK{<|.ei@z0>`!;L*Gk(e#PVu7F.-& ]Bx4,dm1_'ݝz*t5{ Ҷ<LsaAềHA qIyՏAIUqO^,X;T64&m8QU<汪o:.^!SقTc$7a8-mb:QsgJ`m da1:0BF-8,@y=u+ bSR,c#3(s w2Tٿo/SfFZ1Ya+)ꌛMFĿI_FXڙhy7QVQeܻ@H,ɈcncKG4w4Q}zl"³^ eVHMx}I{Dk9F;#P{[g֧<6 [F7 fB˨El O]`lژkGP>ʟnҶv q*8=E2`%=*VXjғu-c LJQ~|k; my>(f,]['N$gCG:_5Yy5XbVKG#VתUVKu. ~Ͽ^"s{ 4T'VDB&&̉M֬$v8WV}G^ 'Ch?atpQ@ YR_ 0s>?zg5Kڎ0u Ujmu*8BGARihΪJfؕ2G+QH-{귺+` *)0"B bج Z@LwD;qP-ꩃ7ڸnuܱkj#JNF% ;u߳<ނ쎔,Kpl)J|GO(K"OO#;aܻŞsK$ p3#>>-l~/_#aղ (c7~R{0.ɳ),FNMrlZ$p5 9A h$,i"*g  SM:i vl&b&Km`!de$F .VF5<Ƿ %k0>MtYYVJ:|_8y\숰ß]d}3Ӻ^R ҆sʴ/ Zfni)cnI w4SHв[HYs1fy-跁6 77!M&x>[C6? % !!$085;wTYF>`-]=>BmsߧC)ot8B̒kbJLpA~A |1ӫ#0S6e!V ?@ uԔ$b3c쇊'm C:vɌ&HZC;tMP7Bw X@˕?0(v3rtAob#&3)jpg X <!RgP~5!I>vYΨmICo~Df F?zW_ 0V"kɐ:k⤦@  3Ar,Z(G]d wGlGcwSv+@0̈>I§F$MU Dz<(e04G5z*65Bj D z (xÉ;\t4u>ӡQDWKMDJhn` Rfh@}Z-Esq'Ya <\r[!0jS}+N8|nOvn^443],Q!֧1a}DZe{GIV-RI}8@PsIs>Scqf ^@Qel>f`xlR1AY\u~d q풯LB:91[y xS/^&'_8FNJiQch ( (&it)9%M~_8ݗs7\lHf#CrN ۈr"{!>J`x[S ~rM s H ( ^'^wΗ˚'\V3H3 ]m-F4UآQUت{PvUخTC;p+"ENm - A,r0ѹz+N5,dؼ8^o)\XN'ja.:>ޅeOvW* *Vy^1Am;Z~]Μ 722|Q$X{}~1!cD NC!Y%+0өAsYR:/BI$yyemV^aL6 ՅNJQT5{Z󅏊wFIƱuH-9,v0ぱs7.%RFJ|BIl^AU.0VozK]ҳ B[F|r$2}A'CFzYN,dW}:-_]HFk[+[ #m2bũ6ؓ=1ch4V= ]kCw3mh彸V+NԎC/N{SES˨*sDHS/#7G?_4MtFkRypLI6j(JmBz_8.zbdCeqVfѥK3X)-65FC؝D;+R<@Ct^T\gT .GHv1tK^1R{ jzt Ȇ1+^3@GJ{Ist5 i5=tq RTe*PCeq47}y xqAt T~~ibOVtkqLjt95 8I1ǵ$'N]|>+щ>W)s R: Hc D""!k.a36 ❠AwBo+FCmCPKK]>#ef^FDG9_d8?u :-v?|;}/pz;IKHjxN2FaYԓjߩZW`IeH-de {cExgIs[M |K>f2&KE Z>EڊX,ds.>46~@YIEXtdҖw5t_r)@}m h%~+ROM͖r^M#ߚR|SJq>)ouh *|4!I1qXKka{=gAҪ[ j`޵b=Z}@zs!g[cW_v5TEr75DLi>{>q2n{wgؚ|wGӼjFtQ 7dT*r+'kUjn6ŦO;ui* C"hHm_#b+N%YXūر ufĴO󪓯aYJ,W>ʒluor2(DhRmE[lШ| BM# q'=]B3c1 gXLl6%>COSF9̚',tI; ̶4.![T.bRZӜdEHB4ؙ )b˸#5Xi3ϽUg4qFԪJ[aREQ22u5KSRu!'d> GW:,cW+BG=W2]Ӈ%Zy|\D-~i- +<f7ڿgQIQ(\~\4#FWp9eR*\Ul%A44zX,rC /jw`;RJg{q%Ր^} : \XJA2z2Ez5v"_} J E`3Y5UxO_2/Ih%}d@8 '^{nf.@U_Ů~X,t]a Ο۾PԟFܧݞ4`)@ρ1KөP 4"OOs٬KF2z|ܜ%7IuaQio-lx@qWEcsZ֤W@%-:oS7ʽeĔlqN&o*Vʄ_̟,.'ϊ~5=rG`U漸՗}fB H'тPqI x-7.!_glp`f{P׎ :޲ݼmn{}6NNȯ[Eo _ՏÈ QEH@-,"l㸴(owYc$GDZZP߃ޅ;gt+6T V0w;b/,gU@ Y!_0l\7y6~rV} 4 9t'7@P<ԍC_xP7,gjk2(TV(gO)ٱ Q$V7qėKSN[˂zXq˂݂Ay=tO|O&c{\t4QKKI,oÊބ&(۲Ze# bX_76$GҲ=IÊv$#"M"~~eA+jBg&m9Fn]IRqk:pHDZ+_}r$Tgt׳k*Q_C+ nU'*ն*ӒQO*v;*Ж5/'hvj'usq=;ҤH\lp ,,rN#oa#feB_p^e՘G Ѩ#VhD 3=ܑj1cnl*3}w_\3X$q!+YE`j"(.Q=1p=QmE9u4M\Piezujj:hb>mGe!%DOx|f=;gK]u4?\; fivE\ Ֆ&}J߱o`D z,_w/w[p"#d/wF cű w>hF3,)J" b7gZ`w|e6o,(- q?Y MXЗdd}rP%fꄇ%1>?rMmGCFD ?J+E}WTZp#]%NNm6lw(;pF3ї ExS M &[6.R+('&-&(7Bd&YǕZQslt1R+%ʡ\^#-A+ˤA4sej3C^HKy;[|02vuk(>(gH#iNu4&)b]bR: 2[ſc$1Pǧ' >~4+.mE03+qU|~~j8ME?c?>KI|+$~b'aXlY3Y,=ҷ nnGw6x%XlǍG S)˗LME.~v:8:DL|\Zo80$Zg-]6FWٚobJ^Nj>lDgh3kȢ=`+XTs@pD#DV"6u`J|{)CV|= pUc贱Y-*6f CZ*_Θk:Sk(EQEm>خ>*` ~D~_Fti$X s! Jx /PK@ۻqXޭ/~L7&֦4|M0-|b  ^!bKCw 1Bc/~[@}I$q6E}d$`$:2Q# HQ%}SAI]^;RNJB߫֍ث cJJIbxFP Xږ/uK.BI_KKϳmZ`|xfBI9P˥xk<%KEnJ)#xv/;s%bRPl48T!&}u3 EM-rFf].p 3Y.\x/I"ױ3nH $1[-*/($_ǐk48AA8v5lثI{PѸu6~W @AEPehӘ*rS%^78냞NzZ£/x1⸩u!{rdF8^7/0_en8^fCx/oF8^&B]xe2:S|d| ޒmBɀ̄2"d|;dK^0 NgBBMLzl3!πdth$^v>|ހl^*dՀI#x>ϛ@ 1!M6!{H=3!Il 4 YN*dIȞ BV`BVg@4 sYC R!5 [ϞKL!5![b@':$Pc6CKܝ{\Tg`Pљ r Kz(ⱼ zRdpv>iSGG41|KˢZw=̀{gZ{벟k=Y@d,TNv2NFE"AFq2 #\G|m[Fs J6FN}}8}~I^d`dar/bdoNɢhNd}-l N6ZNQr$g,-edAF6'6ed)rWjYYBf^+#ۼ"9lFV{qYRdjN)' 52,add}EM6g # d)h95 9:FMI6òU12# !R$#;Q%dQdMɢd}8Y(% Ȋjl<'[fd|mW3r2yFJ ![ZFjNv4p"Fva?#[SLlLbd?cdOld0K(K d"6˦Wq>Z[5_0īzȆs]72ua Lf%m?+Hx7"#A.S7h"D,lY\(K푌K ʐBdY SJw5;,`#%U,?dޱ#ОxfqϜDޞݷ% iC/\>ۖl3vY ߭4gg6Bik0afk;W 2B/ԿL9FcK"vcBB20[2fK49[ eavtѕebh,c%:ˆDt{L'ԻWv/:7˘Y8CtVuJVyIլSY":z:^t:[wI:{ዂZߴ<0r" 0 3 j s9CV%+/HO !>,hVb2i)f^h4ķ!=!5w^ [ɣG1rL fV3DyY?"mʛ`F:'3Vl`E(Fˡd͊m[ ,C3n'2p6=o= :( L#!|+ g=!b|lT>RYl'r]B$vkb[7TK)lŸ$3|eAErp{x0 v6#QeVCI*Ũ?4C0a=cLKIGq2=k|-jGJ+cb;+&,2vՖZؼ BXȽa=4ѹ!t#n;40FfDUlҊB-Phi$@{ޗ{;4zM0 v>j=mW4uz o]h=ؠD;zp*De45 {Фr&@$*q7jR.Xw}v2!nH8,YmyV<K$\]mG-#9_{ ]>QrvXKK/8L#t25NcԒ&<ee/+'8ѱN(5q$k^UЫ|uTBELDz`4!B#4t: KI_,bD>V52w)ٸ)k>CcHW+DNV? 0k"jUdpUm%ٸ9/>IќJOBVa绸d kj 9% S;X+ϸ! N1K|tv&> KӚ}`&Ja=nfg[q\dzAH9 ۸^$qGSoHu.?cvAYwllI8e]nbcnb9t쐄ŧ>k G on km`KE kŧ|E y AG[-ns>~SXfťHa07$Ƨ#.e HTa}1\ NzaN僃#,ZO4֭7]fMfPEc FzP?"84mA*/7 qpaɬ8)MÅ#EùcZ;N4.lʊCEhuHB4@D]("hbvx-!]& VEhpI6aH5 )4L%Ѿt=8X+M<e;]\.vzXii]kla\Sj"(Xy`=z藟 1,` W,qUL= =  JbȀMa'|`&q0ZEY"y*>}W`6i ;GvD~ rOnR}@OszK~/Rdo䬒dß||r^@6yskdg-'g]9S;6mş\{͟Lnş.}'t%O+TR+k-ɚsNx'ɗ?5TٻM2+'s O% ?yM͟ o?Y='vͫ?rӟ8P?W}Oß\tu'z:ɟӟ"꺛?Y]dC-IK7Ք䔺vFy'Ht {_{)ܚ˭OvßQCI!dĕ'NOvܪ?ٿEɟ|}?iOn>kӚɧNOzKğLq{7}?,|}Jrd\jKjI[EÌmWkaIͮnS`Wz{bޖhڲmY!El;h lG+VLȰ%p/jN5;^VBCR[V/͎G۳B3evnL#c0XRS̰AsL@ݲ ʞ6A:f0h$. `hi!# ȆmcJBMʖ45MVގUӚXϚFkDk:$tIwV&iPl (GWB-qez0 zٍ!j >{uWh|;_%]ֿaWb!>}i0ACf<^3`z&RZg|kJI3qv0 6@}PR*W ¤MLWBxʕ*Ulp+@A> I $CW!S0qc !B^N}Xm&td$IKL:$K%iiX U9)aX͙A1S-J\+ڝT=VT\g"~J$aTo]Lx4ӃKCN;I S\<&DJœtVO/YybpZ%\L_5HbxװYcRP8,B@V1'7?a"|68Z:8{_޴QPp8wl. 1@9Cw&g_zݧDj1M[s8 $,BDI|km Ve<c@TlNSӝ"LGBKHL5W,".lHC:wn!&ۦZ$xЎrIW*uE./*Xi!Kvac|";ѢP4,AR$X6^h|x,[j\/T7|o,u9UoU\s͔#(.aq\@1C1kaP⡠%IhD=yasڶA`U'ez^KK$A`ҁ=t012# s;Q] q2/ZxmK#(Q"MpזqPẊ5ۗ",5LDb_I$b%o)Nj^1RHtYjՈ%9\$H~VxZ~-u&baWbFn'IE辯ci |gaS)ar{jh`g1!p&Fwބ`̳`;ޕ0e@Bl)dQxo۶-&ya&<7+C@Y:e+}\DcS VMmv;$;KEcPh%<ͯYi6H+n[h\Kǿ)s>MV-[NE\ۀE<3DyC1tB$I+9LJuK*sNB0NA0>G: ?<@C!ޒK2ӣ*t4{zZ|ۖL>)8C٩󆐭iSGSTFO_]ay jL+BbrB{'"c~ѕю25/-H__柊ZgB%.;IhR6,L\,TYL ەEvW〠N|[Y9wDVY*MQzLnC ehT =|ͤu!ez8V7ehd/ZEKxjߧ(`Ąa㯷[{ qz:$v> 3[$1y$Z6'á] 1vk5*&tPhoi0NSAn3ur qZI0(b"c3٭ºsr\bFB1-Hgo-ʘ`WH Vۃ:мw*2(q3&bH)vJpR$lv/I1A$Drv4ݑ.S:^Z ފޕ7>_$#p *`ك[<vvODJc)_$ةdtu ߸ P0Tԁk(͠D\%+E&ɻځ̺Nzu/17|[Wֵ1܇uA[Z׷۴YrZ7soi]iu;qqɺ?N-u'?vuor1]r@nB֢Bw2O/,20 g4@E!Ӭg-4ű ҃&*k;ZMFW l޽y27KM՘tI@hEmILsfLfq0y|d{?ys~{RkJ}n:-@@hr 4@fK<X݊r4( ɶtQl*ZtH,Y;@񋁑'ɭ_Dmz7~cj1+Jf'U=?r>:$+o ryyi*Muam=IކĹ |GVxOD 72$Xo 3E*]"AMT3p*Îb5%$5YP;*x|zjU곟 6y6ZFZGGAQF)Qxp/b×B޲6 SGF2ou3I^L}Il;8E^gd@  HB,D(U1,a7am/]Rp־2Y}?š^%4[ZqnFP! :zt~pxe_WOGy"HSK; u@9Umf$\j%quM7婨Sk5vdJ)Ws"L HnB˨gL/Ki/9Nt9W|ZgGm:&>4=E]rDe %>ЎՃcAxǝݳ.d (LwWǵưj%+6^I8O֘>+&ulu7LM;Z'q.t9?+b B$5u10adz&jE:қltvFoA2L0 o o@kE&jłpnD7ZJ2[+ C#:W(YV" qGoP{{dkC='MyLHLo~8ߺ~ x1~ojhN}gV|>;F;3^ xmOڏ}&#A'+ ن{عO@ ^'LftЖBޢx>R{z̵e$le(᳐a%sa׫^F̴á S/ /ʋfޙ؉fk2F[Sbjr)M*n52pM~ ^{04hjyc}l;Lb",)dp@WDMWZ<9w8t *;ԅn ^0cPwŜ9 p 9x:8iNʅ`Nķ)2SvSϖ+>!KȊLBU0dF!+#2ddȖHȖ3dflaPd!Fv0"[.GsEl{ =!#[-T ٟ-WxlY8C6 #(!+}d(2Ëو^5uJ9ߤ~:FNl!; {![Fo6!{ȾɤȞ#gadgʐ}ɐ-J23E Cv`-ÎE YYC%$d{oYu%EhPdyDAE[9;)fзjTY-ǴF?o{獱 +I.?4;R3pQ-F$D^ cI-QwQv{(NCXBTZwVRege;݃'ʉ e \ϮGeio=ODd 3;P=Y=az*BY((0WOj0چ `F``Ci%MaZ@dF{5 w Dd`Gq}"ОS'*j ƫB#zVj@V,SA߬B\-f+X-)^*v!j݆hЪh_f4;h_mXHƙLNOZ8侈 Q()&Çt`YZiw-֒2y)bq}r-YB^ +z Ba5T:ҷ'qAud_ru\y1ϟ{:2Sn#Kw *+ɤ:tg~WJ@Y$/Ȫpg ;XF殕v %򿗑-MR2b7xr2#C29^9n*K"@bDU7j &$j Qý6 W?L~GfPa#vw 6, J4%_j0 f+}jr495O&K`gfQJW6h5j* *~w^K B(-ޕ Ui_UiB_UlP}Y**SF%fEWA2#'={ JutM66hSJjX0]Uz2&m鬛h1},;B*:K_~:Z[dTI%,=d:4&-u:4z&ZrMC>Zk֕]x_Z:5+Zb:BFg(@,L/SMy~vJ ԰xS ' UgT8֌>՚ܤZV9֑jl f3e W bŔfZ49r. 6.FLR ^.$-BW1 Mx,/xy9B3PL|+ܳ-[ڶR {?3LH?Jo ӤVI<+#^X 6=n`XjcpyIZ庱n4T7L7dn,|'I;_LtcW_VR(>k l۞"GGŋn>VLL<}ԌdI4 [g! Ng/c piPrVzI\T_!?ob .&1r/MElƑ+qTI$3m$%JƗ/Ih^/&p` "/ii%p[:;vXb -\+_~ޘ%/W!3fE/.t I^R'SfaB@B/*!(v|CPJd=BieP6ji.?Z:p{{;aLE1r<PACe[@ƪR ,ݠTAy*#>fSajv2&fݟ XJf{c͘VňfL$1BGq;ضe+ ?mbgu% NrD4*80{0 ˚3(y>"^Y0Cpfko{"/B`B+`Oa*C~\@k$-S9%('*:OMTᗨ7 B H +YaXJ:"fg5ZclD,[2NcfY7Z5`l3=Ѭ0\-YffY3f5fͮNeSm}}eY࿋?m}e̲f,["4cfٕP(͠Y&ppf$0X)9$5cdjn>~`ŒFy5V](tet2LKƤӚFSAbI m"t[4xkc;4cNO8=o>iF[ONy?NO,pv1g,F;UY%i3z:(OiF6=qZY=И5֦if1BVod5 F;&g'=cτ6L*O31yƏ׏2Դ.FCY,GU! /eG'aCpѣoGƉ8D>)UeW#Ij: 끨?4xP Q=u W׬P~}\"zٝ_BxKRoQ-9j%w,ŤOC(!Nߞؠ2,#±̒Q%C2 BR#1[ ih(Druj1pyKuWm3E2rq>)hXCU\]kO\][2V_ykQc0H6hP׮^z}/TY b{h^8w>cG=U5]^#ԎEתf dBj} zK HUB q# u!6^89t#puN(\l6O\ʛ՝ZڣkƵ(I- \~<6PX0=ŕ6*W(ՠRXWHǥS= sèr48!0G'dY) GfJ;FJ['=Ή%I6Tʅ&jӑOtqC(xiV~n15Fbhύ%}ΒCI@Rv9$ a$p&.5%^!(b}40+-yQo#z84kj8Z4dWHq4Z!{eˆ(=J?aTM|Á2a"6:@ @GlMsv09mq5G`{=/E / ]aZY|£US?F,k?/A Y0@ d(aH1 Û7 Q5~:u@m*U#{`Y+ml*1oסvT`d~:VO:c 2LE^lłݣl㛂X2yخ[Ӄ@U-ц20#%2#bF͖F0}J22a`F̊X>tĒVRIM 2w2LeLMXׄ *{s,6v\ɧFtalF>7 %h $ )JFlor[v-)-)-{miזeh̓a2 'U %(GҘ/ȍtQk`: ss6qq<˝4BEhW. .Pvf*A+nk8~u[l Bjh}X_'ӐArS#22nfޡ68o]hЭFHЄ CjTҒ<YTI$}HRˋmQ _ (%" eGLR7ru`q$$&gNCzʥDTIL]E(i&v#{?ڧ\!sVV9μE/oBMhcĥ2ZfU|y%͌vEvZ葺w^v{?&•UqY׏0^˃"Q&3nXᑲnvdbK*e}xDbSZ@ ǚh5K(`s x%y4<&[x5a9Eh&uʊ4']cZkx!K!9'"漯Q{סFiRGT>& ^ ${*lRnxOZLe_/ V h'LE`$ BwEJdT ٶ<D,J0ۗB0tfr-A~ŏϷ{^kt.G֋gYEFz"?3C+y=jǢ"n6RuX8!+ Uf|ɉ;_W [$&BD @KkXeYY Β%ogi.&{:FuMӽ`soq TX,Qr~)d)dY`GOMC-*g(M B_vkgW÷7dOǚϑِ(%@ӎzQ 187=%=чA@ٺk˸_\`DŒ2s,$H6g5e*4 1pF\M }r6$|v3 (|w[솩HM8b)ۍa&T]?R 2D2܎՗&Bd%ᢐ& #|px9d -*Za՗x=6'|}.u1ߒ!RiLKyzmq K^iTLB݌ %tx)y]jr= .2@?)I63ߝmhO-: 'In,[pRkl%xr:.T߬\nzG'o 1߀ E ZCF7=t E sZ.Y:ePy<6X )7ٝy&>?_eǶLbQX ^%D+b,Ej 64x*MXn!eЄZzkmɔq2uy'd 7hFN uSb}l1fYm62!dʺ1/aXI>< •3e<|y8KAȇ<|,azEN[ܳg{NׅWG|*vR7t֖aVO=>=aJ,8՚ 527aM9Eڗy0~vQag6KƇp-VzڤȅE5_솮;BO-|!bw 8:KcC;8 ix \3}<,D t&f \p DZV|צFu=Iq"p2[c ׫cJ' t> |:k22=a8+-ќ/.M$:X dc&VI68VO^\h9us*c䤮=n˓7'l4e,\Jf~J;9pRop@BN)o$AU2[S>[sTfJye2Jy> 4lkۧ24:TLb PXȩI;, @~>&6O'N` k}Unhl-6;>v~7LԽq E RQ"и-TjSZ-v)64{|4C*-^k{s̜)OUG}@{ɼ*eQ5DD\oUqtZ-ԕǴC+ 2-܊"zyUܧ61PZS\J4ߦu|EgeۜRrL+tJ4__ RدiWry~[~e%^-rY^,-Wm4^#|K;O@kmC )Ar~,,n\nٍyjCJXH հ4laqa pc MTÚBv(zkA\ܹnTQ nsٹ e8I4z+ ct5W>kD| ,`›Fal<٧mdMTGiC<SKE Q-넜UmnjY{VMHeno j:ReQ˓}jyrjy25n6e%^S{T--v=q@v!Zf`0:@e#` VY~Rͯl $yƀ5gڌ_ (z( 1LtqYwy 6X 鋘C +$%,N5_k"K̉p+x)p!cxt0%:_Nm@4q`_X5RYBȩE1@{r$~rXyƁ_=|^^'D{Cw °S0K3?:t:2B<hD02OG0~LJ0x!г{._B7όO]wOzingh\Mt|4|]єhk?,SgESZGS*xjBєWmlUGGK>shɱђWO%ђ GK& %+hhx7- }ђhI[ۏ<2ZtX۔hɉh?q$q_-h Dᦣ%hIMN_hɮ7ϑedbNk)PpG)e GfmxyjQJe)ܗS8)x3ʖ85:EԥTt': Kt0I4Wߦ?$p5$#)kŇSHu|<\gsL~؆DV9;˶+Wn9 N;[epZ\B@&' 2@7ᬃco .I"rxEWm |O@1*pm^?tOiɘ\C v2D7+ p.`#xd}sxli@|"υ@kMQи/L g@*B97XD{Kt$ӃZ'PD'WjJgq{DRBMtvp>,hDTzvO|!2T2F9ܸCu1\{W"#}(BZI<2a(Q dkOI5R"7*))xBۖZd6Um ZuR}0^Yvޗ(ьnVу[IIkHz& )Zk:*mI]_r;--do8Po}DPeU6?dw2:ʃ x6?@_]omNI->R P #>+T 6 K`fLRRLlPDrS`OaxL2st<Ԗi.ن{q]i iЂ !GڑQ ,+d{{x%.F_8h10X0$xhI tKc8K$%{CElI7B3VcYĊQVxLAx[S.+뤰F/ ΦBKPȊWR܇,F gWY>N\-FV.3 y^G>c =ab4Do䮴PΈp.z7oIg<$)ޔ*e,waBѬ^Gcl d܃:$iI%!‘J/GobV Gfr0qYŪfCRV^,؆M8MAv"N&-#5 VZ-b3dW4*k \d[my`Y#^I[XcD={%/ . oA!b߱īTdWѕ$%[hO'Vo}hL옎)4}#Y6HWlOz 1AR-0섃hfy8Vջ7^ѴUavcfl \^؟zNzfU/^dhREkzẶזA$74#C 5I*3_gb f$:Ɇ (1:xq=f~Lsudpy-v0WJOٍO9f>}ݣG/%3 *TF̞"(.Gpc:-LSj;Mڽ"{P.pJE Ph~GXs?a0lreZu`cpVd}2&w8id*TQ.r/SXqAGlj|,:BNڅ,LV5p#*smA"r@rg| <ڡ2LmL ytKF[YhfA ĽIX U0ǘX|_(79˗ ߍAHpkPoޖH't4Iǒ4ۡfU9]^,xtRU3uCi%Yg9˸5>7{4tj8xI!8 $0H<ğQ"0v$B76> HV"I LH3A]Hry!H!:$ɤ ΍ 9$LT/qjΫD7kFTZdeE*߂0:jz"R/+"IwY*58}\arxtp#8L gUM,x`6tpfi̺Dqx9LBG/;F3 3?mvE0aJ8Dwu``Zmdv{|wEH^B{HI`%hMDಕ _9O6I3&RJ]E=m &#x? QuΏ `7Bڽs%W[ iȻ[繊*eG;B2rh)9BBg+{!#d S(dkwEA<@֯@Q ;)!! 9B!R4! H!?ǣ! "By72 !rL7GAob YJ!ѐ!G)BVPѐg2 N A!m@ZmX5畾Ҭ-toe[)TiJ4BJyc"%5J!<6 ǿQ4VJ()"BB^,FH+SHf4$!b)D\s'@j iM|ukhVt?=0kA$ IFSh撞ꃓx5p+hiDEe!/ IdH<A^V̘kfg:'f>^kd6\ N\G\<\q+]:R.OR.?TPr/fryt\~P]6ŧwI'4rG..o%.ˇI.aTxr"\{AtP]l.ȥ=%gpɂKmr%D|J.{TMp .?2\.\J.^ K4?\BpQuyq Or }Õ\t[AcjH/v š?%@Ӏ's5ԣф!t(B PQk-&?8ڑW ]AKZM}=ʲ G jR&bTH1*h5JJJBU9(zi-Z @7$V%~MfDP:OEiB:ZE:z Ь&t:)=7W޹%=?MChP?ܒ# ~QŪjQ@롶Ѓ@J>$Bh+(/章kУS}0JgdME[T@3ZEK*: 4TE]4DB}Th#v%t&w)s^D{&- 5Tt@zV1* ŚO~BǨh?SQPBWꭢ́`1`s,n'er5PaiC g* -o'YiRdEfB$Y(~M{ _wiomrqcowxXgy?!П0搇s-qe!x.CX^sy"~q]/Vo7[&t]~~A'I,Gv#c`CUGBd.DY0|,O". hUO!RyLUZ{.Fi مA2-ktV"un)*6F{bВʺVKd./* 4((2BFDi tZ .&WECf  Zcߋ{ P>;] jPsM P1q8>9_!Q! O?[@&{Uz!Bgjﭠ=֣u:P6\!Z Y/+wH vw s| G_a)m;gD@Àn/>udFg[q;I>nQcop= T6??6.,\a/^+EE cpA!ri1 .(u<&~h zmdӆP @/]Oo&>Euc)kp?c=Rw=pu[mbs#& W#( 7#P>Ïi[D7`WMD>(s2RcWm1LYE1e:m-TvzV?=ikƊĔ:'v!].ϞbslFYp;"e7l-SP\iW2uak1~0s,jL=NP>T&W0D41 _)N>apf@uT&\)nzko t>G?s/<ԑR,}۬(cbбN:s]g1tqFfﷱѓ6BzɶKem(K6S@O<0(C3!iΣ,M2< H42nF!Í4V([SJ" TJsac+EiäkeW+teYBWʁGOTZ!qֲ/5YSVvò$9pŎ㶍0+J>*tK(Tvh t8HKJlxOeҝ)L(mq 7YB"'ϒ=ԁs>5x$Voy ூ^*Y+km#|G`WF?3^{}%VgB^Hp.2Iߤ?Q҇y9,[TU^( RC >U6M-"ܒ\9*lע~Q * K8Ïq*.1>3g'gLERr:%x&eᇜq|]d|ȨH\|~Ry j<-E?گ~(LGt< _19Hw3 0E;wb*( *` ]b}V=\ $?+RiE<WD̅C))2ud~z 1Cme4ɚSv;&W@U@(^Sk!uhV~?Sgl'q"$-]\.Ith*T fL:)7N$FS}Ž"ҟm2Q)rr8Ӝ>@j.Vu/[uR?Gb~Zq+\}JioR2{$zXگQ*2>(}wIQ٘}BqN.<8Wq{|X3BoѾL]Jfy"W8ֱ4& G_$ܶ?tBz~Tb(qBqE^h\(T7=5X{%K80P$ 5J7LcGƝF)UT]n` T 0"8$|P2Տ!n=[J/cԑd/{בg3 /9jT.1J"2=#*_NrT\qoBԑ?\B^ 9ҙ_*H1gƃ (0ysdkHu{1 9߀Ъl'~"#Ow*' HB"-d]dw~p)9{ 2uL\. _uTr\rỸr'IDoIȑ[N^ g0fx L?tb05;jOd_C͏2=Y"=<7[y2D=z6!<5nރYU:6Dk>eڪ-qqvg2w6pF)X gM C[Ol=_xos%0f; dUzmD=[\!Dx˖ɖwZy j "a7o#uj 6G9R ܚb)qĢMn­#ȝlYG)wF,Ee}KJs C,a) Ol .XK>9BͱXl$oO! )+$7D]Nu]\#WىA!mJ1[Lkai/nsfYe9!&@Zn{˹C =un1ip?w9I/HiΆ.ѭÚLEp?Y!C7FI9yHW®! 9q5>'dQ_OshO5%}I1y)cƜ̮Ӽ˾Y)ʯadb*dbrbɌ}+&'6VCaza&į:B9)^a3X?8cv`=D>,p) nVcl֕[1ص܊ŖQNºC.NB~)njT\cs7n$6[XX(XlkIS'%)")ҙ' ry%r5k̸f"=y_=ݞ<n(`Nb6rU1`LG:SwkU=^ZGGoƺvZpk٭0_ ғ:+b,=}kqS~>&W/\/"wOu>q x'X-:A8ۛN=rɝc9U_+q)+5ӎW%>p\tD|;_N5;q9p6}rfa=&oiə}_TՊ68)ǓT)U8{NN/l_+qpζ/E's/8yc;DN wHn8ggvI91FcD:7@L1ZR{Em8,fanE;@}}?{^t梺]ѝEArr!:p*JT)S8.u8] (F'&J-˝ENei(:x"YrDLO8p|܀8y}=9 q|@+rTGUٲuX8^Ko֯z#ccfld1gspʙSÙ)p\ e7:5֡ ey}rW1>wH;ǠANC\y ϙц+9QKYSrt`r_]G]럾u?ldU}WeH-} Vg0&AWd2'MʹĜ9Nr ?ױ}1:"yHΦ-Yy1/yq\WS+/Ļļl7iM<߱BoEq^=K1񊙗ןyw3g7]+ϳ6]0o:shx?p޻~ڻ7{Tbs~s]Y׶:=ͺ&H[~k鿸_#d.8S96%yMyk j(ue5\q\މ\[_ )P|o)$`RS޷5ٷyN2+'mSžm+'9\6)`N+'}\}m-%'=g+g6sZwbNku;RsK-]sCx5O5m/Yy/yZ4:Ͱvx͂$ /k Zr¿ϴo6b\a4K73/ eEޢ֊Кwk׼9?jx+_M\-q;μJTix~[yL6kޱL;)9ʹ7e0/ %w5/kWl׷ZqqnoϫV^ ¼\2>αL<`>7y3- V^x%2/:5/yY&';C>ѻ܏.ֽ˒`>ڦkۻ>o] fߖ_Nr3sl8YL~y9OL :0kV8O]9΀y8f=ϏhϘgp"vZ9}U;*95EVN1s>}"᤿oĄJN'ަ>jϹcΜhaNVi:y=Q}ٍ-'r9S֩i|>ίS4yqޕ+~`1Y{Lav>wO -sɦ<{{ٟCw[ó=`Λy;E\xfv{mw=- 2ivM]د]s>Ѕ67OůJz&.6Y>#)#z{d !F{ pl/_^~>t2}yVxGmLUuЎ5b#G9> ˑ{^\/ܹWYvֳ}߱=g8u{e{5Dj9u*)]_WO7z3q0WwavƸ?go\L'c>dnw+'>9\b e꟯vLy|#O ԏI~d{qڍӾy<6H56Fʱ5:6p\NY!R}{.~l{NG"/0=_lP7%%՞zO1#>VIA?}܅ς8ltls{ i-KWM:WbcG%2 Mr+%'M|mXbB;iROYʞ\+/9F[?=glm ;3J"f(|6 ۔y֓G)oE9Z[k{*xAmW1_򕏇4>pñد֕4#e|L)Yz@>Or'\1nɜ~&^&"g&,Z޻n{gz|RhlGV4UgEB~OƅrN+{5gKeSLUlGjlX\Ac{7܇p'JoOgd޻d(Sq*kRɻT)5Hq*4;9&yb>OeMGi|/N6SR&KCy,ⱔci2Mc)6{Mklvv)K4q9#rCnoαiɛksϛ vWi|7Hfdc9rzRc.8N'~qi)b5Gao=gMy*5ynZ'Ӝ:@'Mƶ{MN8ڪ ]}=rz> t:ނv^B@~nk,k8&Ya 9n{!U?8H#u3/RnZ-WtQ0jߤoGT[% .˲VY޿HjgtTrQ~'QOϣy*ŋ嚷ykIx{R4tü;3ZTmn\}DailU( ۿLۼæ{:4M7"(޶9r{i򴯐y:W6Bs15$];Z/ b=-u[/1ه.3ĹlւۆHΰ!׾${ =MW 2|䜃N#uz~#PmA^! xE91],m%EwhKCoU2m_A^Cs8aFqt/@9,&Z2֭1jgLS>-3B&='hA|*/"fIQV/!Qk3}; }eW]-A ~Mп^>i.,PY$ٷbwbA]T-Si #ƸX1&OO1FW-Wޟ Z` >{D jc *_q1@6ݯF?ɴ$fAM`N/F4&c-<4ȯ5lPlB D` 2zw-[O [ ̧ |3oggӱ@Pr/5]hHd :~6 Ceb\Df ˜y/s[ D}=@C1УSPc!_"c[П{؋nzA}Po'EA}-Pw AaPgע4Pts~+&{AoAMRo=) R{۽*Iwv0/š_v掤*)xm1ui,UX;<> : ݗ/hc?7(B}`ߠ6J?,h #g0D{_teA^D;4A-;R#C4C8K넸~P:W+EuP’惷LYv\ޕ:7vThA=X'z)(%Fh$ co&#=[ j sSSA } %z9Q8ފtNy:Kw ⇗@ݟA,t$AE`];trL69+7;h (>"DL^A߄wC~etCq(;93!8./zI#lMxAߴ{˸a9Ѕ1߬0#;Pդ舍t~~ zK&}aZۺjyݹGlRXW)|F4@SvF0ǟpp8@r5ԁwsC߬)ޟbzk)Y4e "R%{Ɲ A_<˱;<@4tA x`ڠ 'ʠ@X]"aR?l2X%~}PZs㗜_ S(-7ϲEh|(UnkB=z0Cn(?r6f~7xߐ_(S`> 8㽿ÔacD$.Q` ?V7ɿ*1}?Wf zUƜ{a8ariɦ'fdû~Ywc;WG=w76k9-M_c-qEŬKX~`)]/uk/Eh)엍roiS{:P^܄{lõ\_'@=VΜ?C\{ZΞgq'7Ghms+c|T\[Z&̥Wۇś\w_GMgsmaŽ_:R\b;n0aF`z HS.ۖ}s[7ےS[)rH[XO {,ly"C ;NŸMz}YVԳasGĘr|GS-QP^~oR&KďoL=i\˴^Fsmko#>߼ɕg?^}<~ɼ|yHO/ezA|Pd86auBa<_D6wlY7Nj7TwZ>גkm @P*%ө{{MޥZFp~@1Viz12kKAc$m$X##kdڍ7g<)2:Hѻ׻a덖ȁ؈ E7]^}iտGZH-TY4Fz"&9@YlD{Klr /!ǣ aB~_ҧЊ!z:bS>1H,_}9FF5Y:|뉖_3Nm㬤2z(ZEpLF.?+=q 'ZC6Jg\BV緸4SL7jPplӭtu1J;l difY871J!4,F +1{߬ ]J*DU ENJ+P58 JvC Lqk5 B5u(d[k-cn #(ix<~=HJ{@@bX[PGBMt7#GqohAXAV*Wl n!sR-mA5,s9P mUx;l5HxTAl+dIg rdr2S76=fm؁/(1Utd>v 2 :`"pr:Y#I<n'Č<u N!HPi؆`D䂌_p$ |!ځ+̘D14B"NJ-f`3p(qC5txEfOg0m&bJͦ Cd+jsN΢B'b3Nc2c9sV84[EZM@5Zב[6E6';wHEMfr؈P8C,=xCgLV\E(ogܢ9Fa r nk'qSGLNn C|r?Z`'b8dYp )^؈Pd:D_a"a xGxHGYP1 ~GԇA؊r܈X B چ4'?E>z8WtŸgxg3؊O(p1=";ϳ&a5#_|C Ae.3/'E.px-xk؄>A{P&uķan]= Es0q2Ox?"hcSz09yy[I_u_1؈( [Ln|AwGa@,F ޣ'# ؊s1IC"~ᝑ+}8ȉ8܏a#)Q8ȡ< iGa "<Yt:B.XWHOlG؎(#-1O!GZc MDB@Hi=pP2GH%~|Ch配HJE)鑩Fv"'H&GkK؉P$JXȒ#ݰ q QSFBQTAg`/1Kpq 7*%FLGRF&@>EyDcEO &cavp7`R<@|@zdG>CETG]4FKt@0`2`c,>^ljDBZdETCctA?xc c=vN"  iWI e !2Tp2?Z|dq+eD$_T&e̔Y2[\'e,EXRY&eUZZY'^6HlMYV&e][^'CrXQ9ƺsB䤜rF9 \rI.*ܐrKn+<y(oI}V_WM2hp:#H:h:cX:x:ND:Nd:NST:Nt:Π3?t&YgYu6]s:έtWu]P҅u]Tu ]Rҥu]Vu]QWҕu]UWu ]Sҵu]WuP7ҍuT7u RҭuVuQwҝuUwuSҽuW=P҃=TõGQzcX=Nz$=Y)zzg9zz^%z^z^W5z^zAzެzޮwzޭzޯ>>O }Rҧ}VK_%}Y_W5}]7-}[w=}_?!~'~~_7~[ҟUӡ~e1g<& o"&l&nb&m☸&o&Il&InR&ImҘ&Io2d6YLVd7&er/5L~S4LaS5LqS”4LiSƔ5LyST4LeST5LuS4LmS5L}44Lc45Ls´4Lkƴ5L{t4Lgt5Lw4Lo5L3 4`3 5pmFfm|3֌3f`D3L6fjfiffkfYhfYjfYiVfYk֙l0fd6-fffev=fg9d#9f&Ȝ4isƜ5L9o2Es\6WUs\77Ms6w]s7Lyhyjyi^ykޙh6g|5L( kΆlDFQlTF1lLƶql\Ʒ lB&IlR&)lJʦilZΦlFd3,6f?m油c|6-` B-bb-aKR-cr`+JbjakZczm`Fmbfma[Vmcv`;Nbna{^c~`Avbav#H;ʎ>vkY_;N~vd'[;Nt;δl;ε|.b.r®jƮl]o7@nn{{ dOS=cs6؞ d/+feo;g6>c>s¾kƾ{~Obo6mrgs΅w\DEvQ\TEw1\Lvq\\w \B%vI\R%w)\Jʥvi\ZΥw\F2,.治?]r|.+ B+⊺b+JR+ʺr*J⪺jjZzkFk⚺fkZVkںv:N⺺nz^~An↺anv#H7ʍv>n9_7Mp~n&;7Mut7tl7u|-tb-ur­tjƭu\[6@mrmsrswrws NS;κs.؝w .+殻<> CK]w6F\7뗓dٻɤ,Xr];K/_msM3g:C5#ov57=-[`ٲ5C1vGdf_UZϔ2R-eTYD-ҒK:$'il#"f7Sİ&vG-r(8 7\ܬ#6x>xoh<1SjڂkZ9%%m`3L=K޲wrF YeI],! q#ܫ%%Ga7l,krHoz&Er|{Zi]&+3Vݭ#eBX 3wH~Ouym8#5?*X{x2bD4zӅI$ZsR"@LލM%=tMHB̂a8;aLU_"H#[.__'dh>Xlto&,EpHwm8\OSk3@I=m8#IOv2"3T y֕_`s!͇d9.Ha;T+ҖYъ~VubVʽ(tUy, e9B[&L2+EӴD (*<#jXL3X*s4EX⍡c .(˪zjXT/YRޕD:S'yW\yqV)l%/c2)5汥fJ4 [h&Ύ&cAԌL^XTMd Nuh)T)ykMy,}JFG{t4GKktDGGpF6oЗ}¡ڞ4 f.Ri3gn.gu9Zl3G%9*CNsu!Ձm `C?O`S<&LAߵ"#'S 5؋ӯ& wY-HZp=?a&-U | } ?ŤULe۽(I+|~S xAR'](AJp%8C NPa"S@`p$0'Z9:ׂEM崦L[cݲzu `B=>!? +&=SZŠA; YpA| | + @SEUMRF; wQjR-:0 wa ~0800bUЦrҺU9QR%0=ȽmE= yDߺ$ݖ(h*P| QeS b%9X+uaT<$!rR(Dd"[,Jd郹mϑwd,fxP%d`G4>p9lZnP[\u,s)pƲR {3tF:#I*~ ~XnJ~RIU/RKd9 /R>hP 3Tз|Pac0qrPXa.}ߣXbaU}jeOjN-ݧUIԖJ37Ĺ[(IODzna`wY|!X>,R5+B]qwGSg5]t!kӧX?7 _BH֭)!I/I []7e/c:^xVwP"g#oy Ճ}8\ i|2vG $2mn^4ERGfאzRX);vzXoWײbrVP+(WlNJRZՐu#RhZhlZX4C-y$vB-yvC-y Z< ߒ<4VY"੖>//ePAX0 `<x$ Up@Z~EBf,"O5 ?\(D&z:mlSf6?#*lDwX'3"nm~3_O»=Vkjv:a-ӝ%)Jw.'yqwf[Yyܡ xp&*׭4&cGW}aEa;HD8?ne+ɤ!Wg5ਭJ0 C^j[z$J!U-+- ɃB:+|z\Οukuжצ(TC؝qhlB$8.;θZ͉S*zݒ|nB@s5M-Sv X01 9y wOJ8:;lLF[9Ȝ;GV 2`Gou$͠[baCLW9n# MK$܃{"8=[x =|$6tKOE< Z'қxJ)k7E'3ZFbݘ_}z{=S]o&Z;ܟ%?!O'CjQ'3 gĶoѽpވgyH]5i T<{߽@}ZkZ0bxgR\,q2ny5Z?̿׃3g*/Wr团 Gt~Socb${$dVx(qW CK][SKPuL&0!Mj_TX .e;f/SQx'[VŨӣ o}zA8隱sNi @"GMt "J~]ѕ*FiDÚ 7oSmTyC":e-qVWLr>9?I,)5Gf8&bg6<ήJꚁ'h`iA R+/@ dUN"XHTD w  kNO#*ȢA_01p|4`K~ ~&OQHǴi1uQ}iHF^<* ")G E= |p-+#Z tnSCHaa%`-ɏOV}#rԉgK7ǁ}8/z5֫z Mi^zi pV4}+U$="ِĤu}q9;dٻ='Kۧ I[r70;PS!`\Z' p`w-/@b~5ĸ~^_MUᘨҿ5YRcN^ҧ?/fW7Wru[ㇳtш{œ k"Hmg,XuQBiއZC02,لӌRЊS.hc$4T as8I>oïv S͸&' #'x*ڣ">2HI6Y b24y"hMtSV/dYeU)(0 X = _ = _ ? _  i つklE6!{c1Gz J?a qp;{o"vM q^z F8q)Vr$Mk^xBJ\,.bHڪnq6pgH0GI]eÄmvn>m:䨇3+gY[iV;JY ( N_uVjm%,.f7oeg48j\ O RZ_M}ݾNhyg}[)3S8$~fV wh^_ߏA}ZüB\S'*:~LYԦ4Ǥ^4~%}|/'nNدn(ňX<`l/h7솷;t x 1t0R.f h7,ܥd35 ,^6t. p/0^]//l %`ۍ q4)g31JK6*q vuPAKbe5KP!Zk5Anu #.A@U&P~gU@Z-`[itZj 4A$k 3D\%\QgkG#1c̙ jܩӝ./>҂M*HDcm5_n.#v SA}47 Ba(LR xy f|!%<]J? BH"ȥU:x?ZIU"2>} xj6 5a$)j+)Eh-'k-E2Z k^+b3@Sk=Z\ZL6ـ k^+ jÒuMr`9G޿KɆ<{Mn#Ap'tFGONX(!du֋޼;ő63wq <_n_?y]()g&Wh٩||/QD#BT2mUH6)dÛdS`2La "g&K)Vp^ta); BX.%;9DXHl̊'RgtOzRXXtQ_Mc,㉜4I)a؀a2d 9s[" CK]n8|@{m[ X(ФB85XZKnڿ_ɔd gH9E9sf|x\a{fF Kz̔dM6Pc u>蝭zXeM+_u8™ ԷDA&FpRg}ܷ gԷd,qFB%0]Cabqx!f v'\0{sNSERf.V:S{^iL7 . `u%y\'9VM[&"A+Kwow*ā\0gP7PY{4 #*dDTT̪$Y <%CL6lP"P&"9(nS`P@q.ݻ~ècA: BR>`b{zDZ5cou~*!Z8 m B < Bs ϚcLfqmN-VqF\Cl AC}ޫE[쨭b m(n"$tH ljP0[1fLy~AwZEŏQǾ+n,Ҩ⾴Tɕք)T>=de{Ișf>)uRjPC+dOaK{kt]z;Tp, 7 oO>*7G||1lk.f5R3Ѻ [y{r1XΊk~p7g 0ֹFߜ'@XΊ06| X]ߩ$z2+)r4(?UhI\% FHc 1ն3;4Z}h !J"mo[!К!0ڑ.OC9f2_ e^:N)%7%IChIc@@V@&/շ`F8(;<;ƀ'۱zTBIW+fZeft<5 9Y! ϒ˒ I`I .O>}H7`y:Ɠi$SעwS =ŹeoCB5/`*%5@8K2'<\Aɣu'ֽLZ2iՉ<SBG:a{\Aɣu'N|I˸xI z%t؛/?8t5$ݭ699DOb3@GFA.dPƆ~-& JZ(e+Q;N[b0# rgZ {Ia:dknUnUOJO=6fUNy.XNEtZ4'*Q^}C̸g#?X7~(=k}#}ۜuir=.R|^gPpQҋN'EiHՊ)%mde)< /Q@k'hMfLzFJ9ɵU$e6^UVC"WS,zqv}!3mPC:ԕFRrCN xv31s4u+V2KR͜/]i/fptp$"(m7p*&1s DIfoAN{p2﹩{>**J 2|B5?]bˇq}"~WW 4)u@Y>nu5uY9??0Y>u3ֵj KX9 u/C[{|1;0~&;` @쎘7]iG%k]c4AִYSS}tDx|!cf į~ &8'ͬ zY=igu:;nE>?Qu1}PY ba.0ʶi'ԚN ZC*М/3װ-#g ܾ&֍ + .?Ծ6 CK]{$yٻXgD8ކ ;s8fv)qfYDS0FBEr!~9HBD$"? -EYUUwLO?gItuW_U}YӰ$8;ͅf /è4 Vd:Q3YP)rg9o7Y}K[ӄWU39VqNCWzN{Β5DS3,Ӗ

    َEz}v>-R6lx'-۬Dhd h`ґaFR6ĥ#`ґiwFrAKKi1usZWÔc} #.U;]F"~I 0%۱irml8mQ Ŧ-O-9Y6uJrʅ2ZΨF8)n El4vv&c_ ]cN([vVp_8pmj؛* q0lo!1aCb%ɺtu- qa4GeG"PR.O jX9Ռפ–11L11>CePjϤP5/a_s,_fy O\2CEDn+uyI]2KF4 uٲl;)p&)wzLRo[}Jdnz D1'j袙Zwݑޖ޺#-uG\|[\|뎴<iay`ѡ;4C>b/*-SVvīJ=gIv$=Cs\jvm0;lmÐuafVTk׎%4&aZ-<5v N`۰tҴeF8,mtDZ9;uf:C-uW5´'\iAo[=aDnlM<5!Ț'Țd```'` &qVMůʱ&Xr 9|9|9|9|9XXXXXXɱ˱&XcCAR۱$||H[ NWRt:jnL½+Vk{aKG1&鿟)S=w W{/7`]<"Bd "D9*~#RW݇U<.qGwӳϮR\FVzR%nZkVz8{vTJ}: 3okNS3\:mo]FY\ 3f<; f3#Džf<#"J) Ug[! Q/j RuJ5¯~}_z DUk4HKu-zⳳYЉ%JVmНb=YͿ><8W9J+agÿ M=Y.wgKOΏvLO5xejBR#mh:M5wh#\)5d_FXt0#ݥUY _Lviml~tNMb:J)MJvbĺ;NVjT<݅݅Ip;!2;?Mwq(cOc4ݍoEݕEw"";.?㖋ymiMg: D}{b-'VuM)԰\00QsԃZmxk\\8H{=$IQ?v!8t:N`ǷjFyP-ߌ u{by8 TldK7˫\91Arn~B|qǙcw7ß(JLF/=hn4QIC)cmL>W!ׅ$.$u|\wGc!\.W6!iFÄ}_[ èeZg%;ˎ&Ϳ.[Ḻcؚ`񖎲,%v̰udy*Tۄ4Zm=JuB\(WW{DJytEZϸY{&haym"1 m ( -b㈎­ʒ<{h1]RK3L^PJrbItpeM!X\9p<Ш©K LQXiE~;=1Q(Cj8٘TCfRzLJ&o4]8F6ҊN❘* /I|bzæ`#ۛ49\b6.;_DK ~|KJoD{ n)*5U9L'"-CSӇTW?.MKSHCCZ"ƚ/aWgdKn0(XơpƤLQX`@ap mCSJe K1Ru'l4$6̗%O+r2Eg{ԋpCLTqbjC=7?Ag<L!bĆbvطYچfb*#mCcYM/Iz1|PN-T:L|s׷DV8eHYN灳)ddH1;/ȇW@Fe,=bm;7sRanlP2ܝIFib^@Uw5=bsX<{7(+x v c!bB`Z2+q?6Ky'5婤ăef|Oq~(∦ ȅ[8ِ,cp_x AңyɕH',[OɳCy p) \$d<\|䯐'@xgum`Swp  \E oxx \^ƾo}y 4gWo?(p* <<\^ ~Y;IAhg#`܁'{ hnnJ`?pA%&s߯Cס.ԡsdnȾRSx>K4'IT Ѡ[y _'oY' x]L?mrc*لJmhGj]%w]7,J :j ![ #!3IA}2Y">|,­rv~؁8wv!$E!@q ~I'{q(0f4rU^hvil=ɉې-px7ǐ1FB9TRw<ږQ_?9,5nb씃Iws|޴̭E.KY|go(i#_o4$_;y?ۦM;ްcR}H.7B! y8o; ͋ =~6vB|w?$V03;mM>ϸm`ȹqi˵"rshձIr_}4HxCAad-2')Mvt1cYg>_ذ/{r e%vlry&ռݶ4i@$'XRAo)6gZo1r줹0i[mBY.K~g$*-k=ȑƓ+0$hb2/[WyL"a|%j:BwҞl28OZclb\s WN ]D$VKv蓮^RwE8oڲE!ب ¶6,={}*myUb٭z]Jȯ-ʛ1rL,xBE<[fV@{uS, S,3}Ѷܗʘz*I j$2{!*+gC҆tM!`mU7uMiS<7%%a Iw-lʖo -^q־deXVn NLWN6Xο/.Gi%%B LDo}mY}tD7,b&jO*rs|#7GrFt>7|J2ܜhSFCV-â,6 D_gwt'e?|{?@xp{OK>a%q,1M^~kݒ*Yn;ӧJ -.i O#?NbɵPd [5QUES쬮صA em?u7tCO<㟉G/ ?9eimNFM Y}J.ښnH*#O}Ew2cӪSIr:ꭶډ5 N檶KȚy'} HBKt;i&ј /Q\w"me]D8(*B'ox<.׶ zx^1I驙"aȹu0x5z>>"{jт'|M>&[#BlU_0ɺiO嵓 Ƀ* Հ]3K{%f2;m6jjO+mgI=$eo{ȻcF0ozf{v 'uESRiA-ig1?ar7tpYF=Wtg^ĹlÈHH9́YBFM:dMn߅t8>L{^59o ޞeCSJ盲Eu3;y=%P ~n^,I.vOޜ٭  Ԃfe+(Vf*q}zY-[_ׄ:I}Xw25 !OD^qSplB?@*OPٕ*-tP9q6-ߪwB5~/kֹǐ]KvEr{,oXũ֒یRʱTWl?髆kfLۃ׈.AB ڌy;^4PmXy?, $`ϴpšVdk-++ 9g뮓!KlxoX#03iD' &hi&I ϣ,\yдoɠFldQ{5 4@~eh0~|5xya/6GIuR逆ѲQ-=8"A F@1ӆl4e!f @ h@ bbbbwvfwnvvMesJnw߯a\e}I<J] ֬}á!.ApFE1G(((bEP]BETBet*j5Q QuQ-!1;4Ehhhh=ڣzAMbma]c}vlFl&M=9[%[5۰gŽ,<£<'xxg8⌻\K^WK̯yWyy&o6.>>#>~ǧ/?-;ğ ? IiH0 )r"/.EA\(Q5Q q#%ڢ#'V PXLĝ{1sKkb+Nʝ|r/EeHUDEULՅJJ(rT9WT[uTWT_ݪSSu JuI驾3= +Q~G2a1Q3qsa&iR&m2f\#Mͥ)+S4%S6צbfanLӴLtLLܚ3SsoffnfiVfm6lͣٙ'l`^-_i8B`qGq N$N4`v9Ǘp_ Mm]|xGx'O/GO#SDHH\II AH#yrI I5*:i$-&%='3+[@4̢,,21* w?g@ (߲{Ώ, ǁ̀<]+@r(n}wN^w8  `3\J`<p؛w3`nmg(Nԉ; 'dH'Sv*Ni8Mt3pFę:3gᬜuvγspN؍q7܌\݂[tnŭ A$c.A%^Ə TӐȘthh SzOgt:.A5hj>O4}UC,"l uoF *@KP .נw7&=:DK1p) J?/ч9Qqy!2)S2-3I&])/'ZUTUT]5ԍjLB-JF=zT;^ 鰎討鸾 )4Ӯ:RV)鲾]5] }ۺVPXO^h?.A?Kt=}Gk HdwrGȜ,ȒȚlْG#OɁ# 0(8 )(.4G--kZUZuڠ7I[Mյl=w 7^o7̟6ΉB|;%[96Z6IttN< ml,9ϦeHf aHo P-!m>7p*Ǒ39`R!>ۀ3}q βf)+Y7v3o$Ƈ$= l^E7֏rb5p pguO)u9 p! +ӛs;Wm[x k;ܶahXۭ9.Zv ;sg yIm817 Smb9ڍqnw.ܥnGw>{7&,ʲeKjmf[ve2ʮ}6䅽w%rޕW*^իyuL{oͽ3>9W[~]Oj&;;O`"l$[J[{o&@7[΍܄<TEZ{63@UАסPzks6*ӹ͔mDbWZdMVm$EAߜ@NMrbiO"'l;\mSʿOS_ۦ)-;d3Ƨ {iP5cmž?XwP$^ٱ&{oc}3'CK}iXVUII0'RTTAC]{X{&)\fhjd&DCdXfChcf3&{ucO|q_!{]9Z{#­5 f$ ԤcL f9M @kfYRM*2M:Ŗͬ@%vIfYXD3I׀1I9\cn6%@J4kmyG[dhFpR#n$Z(V6БkuSkBY|TdPY|L@Bocahxc*?;24 4}i_2./ ~F+IRf$p@.(`F RO|߹&>͟b}'& =zR"(|7J*C]8ܿwJj.ǀY|Џ;  G@@xl .\a{).6#=LlZ?$ԟbBEҍ L(#(TOա"qP=XLaY6#"L!ڌ5mF2H33"vE_14A bP{|^#@^/aAiUft,Ӌa- b{ZA/f(&*'9az 8/?3ް#ra#vG=ITK+{SJ U0j3k9O[#x4>EЯwFca쓌*cqظ`1̀F/aY>Nt/xY7O3nN%+ӺoR?CjxN/8)p{LI -d9I.\GiSR>WR(۔j-HQRVkOjTDR>Mc^_C^I7`N1wiC]Ƅ~b.c8C5:zpvn5<˺ldwxYps\oVC|4Ǐ'+[5:bY6U~מgt];=A'ԭĝpռNB'eIR)zݎ<}Nf"a-6$%J/%e2EyWT^TR-0YvuD:Gmcg@bmwлL}@?y։q8T g#Pfk+-j6>c@wfuށ$L|NpL1ZemZang۳m~w1>ps֩A yh*|IpNUI7OzN#ʘPVerQ)V!$ԃeOVK3{X,mI+:h>]ƈ2aJ#eƧ` Fe3,`d$XfYle>m.1;n|jrʟNk.aյ^knewa;q}q;|:CE֜s>s6`~t:[m*n;w6\w<_nE 7[U %)gF- Hd "火'z,+MjǺVQS.b__?@jljOG<>eO׆{"IƏ)p?YQVϚovGmv?_[+C7/}=LB'dmO9d@T"lԋ'rI.V(Ǖ2uzim vB>ԹфmN`oa~QPim.7UP:)ÕHJ RKP۩}YNVgV҇.cV3b`;lwڵ]nNjzRB`v[˽tsPNP+T'UC퇿w z]5hӐ,Vhh?k(ipk`L]_5cp{V q˻Qvu{ݏ,aDo;W"1)I!C2 Obe w}ԋqȸyyI?)!%1uSCPkd]}[n*j5V} ;M.ڡSo!Zm emr;<8їgҍ(>>MT??y?Lwhڃe~Jc rT-*_gXƿMm Amx7lMYiKN~{ӳD0=i/}f2/4^ fsn7LZySH˷h =)n&R7#qy'D(A顾&,:Oߠ1~0c2oG :.rt {$ݚS Ob5}G_f>XxU8U!V9x)1$GCN+իF$E4/AY*S75 /Q:.ChGw:Q_sf9K:8='C׉R}*Akrm`F UV_3ԟ7@[vZk6ڀTVdaHV6\Y~J!R,z*QL{;0&oq ] M=n\KӑP_sǹo"1B}VTiOih`K+$D=fwaj6~Oj7kb.vuC;W`P:^l+y}=vy{W^'EG!d\,wp5i>?o_q.J1ynrxoʁ{Z p: tȘdvU|ryq{ {ҕǵש_0rYhfXaLt2ms{!p8ܱposܙw12 Sw-%y?k[]s:wLӏ/*D=GG(2/(])[ӂswPne"3 Zc'SY6`%GHRD^E+9J297ly_Z p^ _;.tVvyF||r2HTj6D݁nwi9=Zlo!7Qn)'i %dpo$'TCkJ4xr 70L`Vҵocq\ܔ"{D+JG2Ϭ){N)'m]@}rh[~eYvVPVXko1ǭ>P] vG9=ogR t.yׅǹ9{ C&%疒CH 3AQle#+J2[]~Vڀ{kKoU)[t!]Nw a5՛SZlYv4,2syȌky%qEk ^6\}ϮD9Tskܖ.wۺ/cܷ9epU<ᭀIE=KJ䒭x"R 5^n' ntn1Zz8n1Jx⺬X6̦ÃfEȗ>3Mߗ<|?cڑw}P>u&_xk-z~ܩ4p7N5t™@62Tdz`1vu2 Ǡn|'?/έ,Zz4fI 3ju٪m7+;ݜN<+M*'4cv^'?'NyJ魼̅;ԁ"vZQEi͐~jõZm=rVA`|'9ZJnYIl^_Bl7va80m=soV @>|N9MGj5z?@7=G37©VaVĮ0 #-'I/cERŻ؁/Z+|(r1v5rH:[=iR3~]]Yt=C_@_8<Һ^;?UI,OIRN3k:E=Q瑱ZM-Z mC}->`"aUN"IѤ#Y@*2p;5:JkisZ Nl,nP[ۯUզ1 rvG::RP=[_b6z~.Uc$@fdWFq8a5.uq0e(ȎbLj,i(Oϝ|/GY0UUjn1+ nav^`/Wث-oO"?إD85`fupg3ə'SJJ#pp^}/ ^&{އ^|f!W]np"ڳ #Hub?9Ifͷ6Y';V۳_✹zGܗ,yw̻)|9 cR֒m'rr4<4y\K}LOuбZ5{O:i#BP߫h0Í{c8l DQbѬ ^֕K&ùfU|Ŵ?ŎOYŬn3[CQds9ӸGQh56<>&oû?~g-,_B: Hֲ#GÙYX(?Z˭ϭv:9e[WR+ܮ gk75SvW.e |T{~ pǝhx.i%g&Bb} .MgY/w}9t)uB /0Msǹ,w8wpb{^%xŎioo7ƛYim*H%K!O I dCd;E f')v~z]bk=c0%Έ) d J2C)JPl& jPQKհtR4m7yyZ)_ZW@g[UU1;T=*T[俁bpo.Gw߄ :7; ,36sמAx,my"O,|3|"X\*Ɲ!|x."-uų7$)&L.I |gy%$Lh t}Oה% +x7:>F Q&[C^H1@o8= F.Ӌ7X*GtvED+M0Xc0(|X7G/oQ N{Z!˹u9fpѿ8rU8н/>C_BCt_; -5u䀥?Vֿ4p$ 7W h[(eкFɅA}#(n[5UĘ..I[Z%kBq6RIX ų=|q=pSJl 8nޱ ߑFp<&ؔn#o7c3b}7v}#Ǹ1bK{>S0iH/gb:a>j z~@(yiu}nf9B0죐3x6}ؒ-A$C' nXhIB{sߗc {06'UL?7٘&HFfP͂ JRPy.%T>) p0 T3B}  rqoa3@>ݗ%ZVC͂Xܐ =vtPCtzPQ 4v@^ Y?KG#ʈ1i fD5-6}_7#&ᘸG ut޿_sόǠ uD3EK}OgLg`M8g羯wܑःwǠ?4CdX+D3 9]HSb%眅bB@I @@ 1KLTT$>cH:{M;Q0T{׸硄{BI I%Q]G3 |0ucDpBsv[r_>f:sIIŞZ~k!b9j9ɃZEi4B`=)<ӎfF%I3 緅'/ܐR^O s$z4+X V`+X V`+X V`+X V`+X V`+X V`+X V`+X V`+X V`+X}d12CK΁) CKgTSYTzH(ґ"&tH(B@tADQPGC,RVqP(JC]fݙ0;gϹɹܼ}p                           {m`0(2iUKNDsc,Z M\xu!,Fv\|\heA1[R# xhG%í=$c&;Hǥ,Qm,lAc0vIS){nBsJ@ˍ-D/v3L#2NH `DGR>=ݗ)g ex3'<K\/G 9Z1A]2IyߊuΗ"HHSMs 8{Gϗc倅VX:fh< B #Sðhԍ]"3 gk}KҸ$Iz }BY$L_DMRJIy:TOk4H v-Wh ޟ薸h'zM?sO1A_`7ٙj-%j;hL] ,EZ¾w5GMsgHWn913gCg? JP{s˅.v]E9-¯KΝJ HTԜ|T]WZa5gd,pYx<7 9B8"nŏ^ů_.uf]F:>rqiٻǕD7tx4,p\ s`#ۆmlde Ob^.~6'_g=CIة1w}#ױ zUw*'lJ">eGF8Bu~Uv|gF;@ELo5?fl4w(f5m6y`ͩOz|KlƇ/oL+1<NJsVշSZ.Fl{b֨~A˲ת'% .#bz vOH$Cbk6rvq=]+i>M uB)haQUx`@5aM=5JrTk9=4̃{maeڻcóbgӚu1ssx #sy[=_=q%q8d&\<2q/uN/m$ԬlŤ7k/dP4nep2uQ9VI8. l Y?n_B9/ 6k@l c0huqʔPӫ䪝B!6j>(kzIW|/ݍb3oj+'l>5v ћ iN;uyͰbI5v9=LSLR+`IedrKP'6#SW>>R ΑuQ2J31qV$/߄j~EZcڴe oGYs\]T_RhW[ߪRT.';lvj-ȓk?*Rjj:+2#E>y61#S%-xDN9Ya{9} _=*E7R ًp $}=~s} .!ڲ K"ƹ Z7XLsnz_Y9z=3|[RsޣZTbrS]1=5enɗkFEק@+ICKX]7sMEND J4 -ҡA* vwXݍ+9OkfĚ5+5D;]j潇SG]H`kpxF;mO>ߋkPNΆL T ښoo'^ídhZߑ564U6Ѫ]M=}ݝ69]h-!eB^=#:#jYjX'۟dԦ]mO\vcBw%DJ_D3?iQўC5YٽNA{tJc~4KY2}뽖7*5pY=hi̪ D5<3U#Jxj:=hxfd츨qBC &o ##|)ɀ|(807hI ;{4TQR+Y6v`Mbjѣ3uXWfwjR+=%]UVs%9{ymWs{ӧI_edi?Wvk0AkEakeb\\c'3U9.qܥwR_5^sLk`ܵϧ6vMeF\/oV!Xy8ur NqB=ם-rwh>[eF۽cB&<`hvƘۈu:ڡq|E. o=~֣ѭv%n˨ƍsMO&yjQgqaBO}U .Z [hf&u{Znږ,?!h5f(0V-7Jj5"^U)=//phnvRv4w]qUZv3#\lK676įݳ(2I܅yopwb?h=QVY?RumWݥj+Q%5×Ҩc+F_V|)oĖ"OlsԩAmm$J{{D^ݘ< Y딄E.t~N/O+w9tR7u}^+oMX%OeGO>*bh;8j Ov;Cǯ-py֔s2`kzJdۂ²NosF|톮Ԫm,9mPGvwba7tSslCx5f] gt}܌ؗ|kMۣDth]r1RϝZvYlPk5캉y#羋x.ie33M+GqYO#аHU=fJPPwny?|鏗ĸLSbuоyz~=8:5A.=!r>: 8K|}Eo'Ym37=^Wk\ۯF-rJ>9y=_l_뢿dyMlxk}\rp=Ɨk8?RzlPqoJ{m^o[ʞLa1Xeڗ1w6VRm6fqeWK>k ·zw.ȳo/bYӛo +SnllpsiĠWLaAC:8sJ5we8lYn^fΜM$Y:q}<[oGEc{G@c+M,%1^5RVۇ$7WysV `ͥI;nyp˅vM>rdXp@uu.+ٝK:avк<#ޜJ.ꭍS8gqcG1|JRaۥ|Ԫ7't_[>C|Lb-V?g3.ulEcv϶|Z-. U?1cS\*(OrCev_a-V_m-ׯi>삄o{Ҥs4j|b;2{yi=Sf2{C'ut[X4-WpE~we'}^CǶ5t-`Wz䋃ryۘw{CAӡK #އ|^#kUW]1hgEA9goMes ^}ϯ՟F7/a.\giGδJ}HyQ7(njXܕ܍? v.? vvߜ?R*Bb2q2q/d#SZ|9VP`X`/'k6#'%P#11ZEb{$>,h6uҜ[ ]ך:ms?ݠՇg'~mHx= ތGdiorn..wqoe+-xJfv&Koj6fŝ>,cZ,3rԊmnOcI6yEvn24gν{ws]&/CZNy75qiZ^q;OhrXe5kﯿ|^Z͍߮G4/p}'͑9뇤.yFvVI~{78==ih]G߷i[pWʁfަ)7~<ۧfp;Lj%HQ-T~paM#5u_5|.KTmא7KzԚТ*Ժ&.^0.Nc>uo6Þ-Țq&2}3Ԟ'۲/`uGatC T_.(-:Ucg XmIcu316`ffonkfkQR̓$i2Is@HlWkrO?vbVT:T&W;V*䴍R{N WR 9N>kd?rv`k KU(iҧzw?t-V~zZ6iBc8Ob+dW{[Z]&k'o'ڣa<أSGzpOt-.4seng<5Bt7LIqs}:ʹ7n9y]/tb/cZXZkM3깒[ /K{} ?xqTʯflN_a {|:rwuWeN6+3ܱx֨hc[-Xc92c[IY+ZnM 57}Ş CZX ^5Ioj~ؕ5̍K,duھkսn-.:grJ:Jl7܎H^7Ǿ;ٰɑlZ{͡Kg ;Ơ}gn(~9S=n}/hpg`eE.&W^*t^0|ӫܧ߈Ls2#;tj~)-0`|!V;V4uu߄S.cx'[$. `fv\epsfJܸ{?x~WU]hef{/[ ,({_v@'_P\}=7izec>hUN{n_:lcW+B(1mn,;kG{em.;/K$`[$k8Y7^G;rQ|}ō[\7T5z*ATs Ӵٍ7&80 (khdM eWUQfo? ^կw|F]_oϲcٳ7ox\cmke~Vݽzn]6}N/ݝ֞`M{2犧ͨ gu{Eêѫ^<Ê[tVt_uy2^n/_6AS`F*?*EEO f}AWQrU/M~ySQ=a]W׿,_~!BY#M\Q]Ex˵"b+}]y_E=?nvjO'%_{,Y`[Nʻ8iaϜ']ؽKvM^֘{.RΛBV'6]t*?*D8m|"Arm=4,,XZplyd UWmJtF7}sG\g-iiimi?j[TfUMT=nWuGF_Xw8bԸ)49iE˻Y&{G3?Jbm|sU7/r*ۼ2m3}=%*}S&^Q1eaee 5YL K&_TFYUeggvzlߍ0Ṳ%SixSћ\_*pM+̭+f-~وk#/:NF|i8uSH]}N6J/2=ojy6{s]۱¯~$wGd2|_WO7hsᡓSbw1z2jpՇ=ߓ(e!鑭xpp^{3H 3W-8dHtmsD*sְ#UVdfTo߈{6wˡf5iT˭TK׀6=5=CBB#5|5ãB4Gh:kPO爙Q䯔Ӑi޷ȋϪϑnw"UӯHOH>.]tMqwI*S%P#:}[T ԪVkU/sDVQ]xA5j}?{=hH4w7j[]xjT5ԲSf"eM+>R5:1UqlOR>X6aH}~`4_"]'G{W.yb{*rEr_FJ7R^RZyU#)pmu$e6.iT-TmnU?a㌾E4$u"ef^K|r+O~G_~x|_?XUBbI)i3L6=sYd̝7?wAE ,]|EU׬]WT~Mlݶ}]ݷC=vSKJϜ=wBK\v[ܽwG<}WT}CO|FQ*j5jת]Gn 6jܤi-4[jnFGm;ʪ`bjfnѩsK+kO/o_?CBFGDFE6m_>v __v]uسs>.}w0p!C_EYu~~_k_W_U_??~o 9vFտV. 1MD!RA]9jbQF9蹧D%)78P͸y^}MMHn&#SQ?G3.Q!²Laxhp 9H4y.FqTzs,X1!FH}C>w,GA,w]vซc۞h">s 緀ay kJ4؟QFxw1G}QQ]* tAi˨U>c\ ?V5m%@4 YT._F՜pWFW!]!Z$*qVF^FqIuWGHdg}ƪa_[!)ط'Ruc8ı8V Mr7Q | d2Ƕ8_?lOdTϑ9U郪Ų",}YGkW h%5,Zԧ'8vhwzf(amu7ǁ2Wa= Fy&O8GӾe+HUuHY3G~O~^LF&o0b\RFmeTV2RvUI3m8꺣\%vD3qhJ)kԟpS39ת;WQb]yk*XFZ`0 Y,DFǬT RP4ۡ j/g9R"p{ < 5uADm`='hW[Юl?`ᾷD8O04D]k.rk З,}!4aySs eDz_g#3jvmzttx2)nE[tQDŽ'}laȓ'[,6s+Ҫf<]ŲQf,c s~ah&OmYClۘ}Sq\-Y*eGr/,3+sk 4.OA\.dwG\OTq,\)jrQ7lP&*Ǖ QAxa;\&4CQIA0 ˧2ڍ SX" Xɩ\]T 5W-`G=3}UNFџ9VSUtlSGT(Lz0 "=OG󻯣B*\T)uZ`4O'A]u}HX< R+gFKdTXB9j^?S1,|'M@* 0=VP,mA~lezXNa]KNZi,FgЧG_ǃRAiG%9K\?$'|qQ FF\k)G{lCN1H\A;+sՒe e oQV2s)덱H%8g' g|ZFk&h^*h#2&>2 MuhM:9EF3RQG=PlQ~;TA =(Cy\Q#Ȩ[+FWa}E*x&m֫ ͗dt 1 /hn< t@AÏT[]Q5hrF<6stPN'72=.TH#}<]`tQmQлG"Ey.dqY_b߾Ncq4k-0)%^TtFvQ'H6_M_#XȕQ}rZscuԟ n*(Geނ:rv*xN@k^vv*܉2$}2F;2Q8^59q?`C=tdġވ_+C{]KFӰ>i/r g)>rj|!B<WNSB8jz Xf^rOƶC]9b Lx9Յ0H9YA2dAr2R -+tAh0~fY|n7qdt1P)5чtuFhZ~H/!x@Gr;gf7qƓvXb*hnm>I7Pb9)؞S5y'sԯ: NWNMڢn7;VP 4Q38v%Q*=FVz*K9/P Fd5t ;p@N r&i $1ҏp2(XY`5IN0yUD9ur&I5! `r g\OE:rr+ g 7=X @?RȘ:)31E#c䔄4f"6ڳjF wai"UϒS$ClU=W܃0!`.X_95ONc@~̕Sx4X!F x<r0`Q UemJ/~Ab%WE%8Jc3 }74ȃM0}-P:0P!rS[$ô׈_q##đOOޥ 0 ͪ q(ޣ |_i7=T*t㟀>"~^-=õN"/^qT' `b\ |FFz25 y[#@j+UDA+ N `_HE޷/Epp^Ωd u WIc٠Qcd}BӤO=C,ӞֈsQ,M30gi(AxXr;d4)}:O>^daYOUp tO<("v¼g6Z;8 V\#'tNR:eTsœg/1o8m"| \wv **9DufB_ģqX1v/oilj#:<!51Uqm׿g]qr|WU{]UĒU$Iy~(9pC>r0F";D wDi^'%fa1tysʳX> 񬻩6BUSCh#M1A=w]0j;l}Oȳ&s)<9ɑOPwjfmƴv6΅ѥ.(pri}rD8:cc gơ R%Ƨ!30wG߹ۜ/LBYO({wjؖh{ta0Db;7|袿}(h P=U2Z,?@{ڋg<Ȱl9}41ІF 6n誜_O:=U1 }%&bT%H 3`o("7ȅH0 .*@'E`$<(pX @#HL;,P{4%x$(pBp`NϠ80 X/@?uA("P @FBCX!PwѰKptp,Gh;1C9A,lrO4 ryp ≔As@l`sRxIDѰD;{&h2Ih@/(.BT> ;9MC`)h<Dˠ\2P,O:LMž3a'\:P!nBDC :|'p X g54gp$_X [2ڳ̠71g B! tX g@nN6BO q 04h0dZ 0@܀* 4-hC DdyP@%74 p0 !`/Gj, ҄  ap'3pS I87` aDT+`P7wtka/\P7z`0aR w9|Zr[> i xߠV F` " 2`,MJ< ,A:-8HH)0&Z̠+;(4 yux o+.X`] \aA$$,X * fBf '  0r`N -C t 0 3a>,)(gC=h #X3?@d,XvQ8w|?` N0| `*̃B 4\G(Ft!Bd(p#Wh`< B*dA-NA܀ށtc84V``068g ܇`@ $4 !(p^8?ԁ ` 6Uѐ a >8zկ,k)94m0.0!FC,$tȅBX0@܀GPt}4-h&` naX`#Po /AC#h :`` ݡ /0I a.ABl7.<X)T@4!mc0 C|! &Āj p#x?9ԃƠm ;C(x 3a,vA8ep+YiP.)t[00&@ T\X Ev!8 :<>Wϡ>4Mh``=  Aq0 A*a/R!w4-c0 a<$C̄Vz ܄ >jCch:C7p!0`dbX apmxpehP6)XA7p `4@" ȅ%6'"܄P=Ybqē@"I$#9)HTIjPMRZTեzTPCjD 5fԜZ&$-jEԚڐR[jGzԞɀ IIFdL#)9YP'L]ȒȚlȖȞ+uԃ'"'rԇ\/Jh 40Nn4Ƀ<ɋɇ|ɏ)F(  0M:i P,XGiS%RMdD)JiN)TF)fLE)P6\G)P-EORZFiJZEi uTDŴ6FDi mŴl;dF8~:@#q:*3ty@et.eBW]tnmCwݧczBO=7TAoTI}/U&2ɘ) SejY-VauY=V5` Y#֘5aMY3֜`%b6k0ڲvLg̀2%3bƬL)3ĉubYfɬ5a̎3֕ucYz1'z>̅eXl̆l<'ḃ2?H6 BX( cY8`,E1,Ų86cX"KbY2X:26McY&fYl6b,e|<-bl1+`KR-g+X![Vl [ֱ"Vֳ l#6-l+ƶl'v=l/ ;#(;Ǝ$;NVΰ;.2v]bv]c vbvc=b=c W5{*[gX%> ʾ1 Vs'r'䜂ST95WSjq:Wp F\c הk5Zp\KNkis6˵qz\{N3 9%gs gʙq׉u,9+Κl9;Ξsrݸ\Α8g7ׇsr+7 sC0n8ƍ9Γ9Ηn$7 䂸`. ¸\8ErQ\47b8n,7M.K&r$.KҸtn2MrӸ\&7fsY.r\.r|n1W-r˸ [ɭVsk:+s&n3ms;.n7s!0w;s')4W•rg9s_7txxx/ ʫ5:_5|=>߀o7M|39߂[Z|+^oͷux]-ߎo+y#ޘwMxSތ7-N|g o[ּ oߕw{|O;> ߗ]@~?y7~{#Q| !|(Ə>1| cqx~'|?O')|*Ƨ ~ ?O3L~?|?s|_~ _/WJ~_ïE|1o7-V~w=^~?#Q?O?ß |_Wkuw{}?Ogs/_7|ǿ?Gag' $TUAM!ԅZBm! BCXh"4 ͅRZ Bk# mv^ CA) B`" f`!t: ]KJl[NB7Cpz 'Y-\B?U/  a0L. #wCoG!@) !XB0a.DB-bX!N+ x!AHB0IHR4!],dS4a)f B0Gr  A9Q%Q&E"jb .kuD XO/6bLl.5ŖJ[mDQWl+h JH4;ET4E Y"ZVh#ڊv vS%:bo"EWq8P$CapM!%z>'Hq(b*p1Bhq#ƊqXq8^ Ƌ b$NIb*d1C"NLq8S%9b#\q'.b@\".bR\%׈kubX,7MfqU&nw;]nqW'CaxT<&O'SiD,ψgsyX&^/+Ux]!o;]x_| >'S\|!WkX!߉bQ$~_oI$H$I2I.)$IURjH5%uT[#iHuzR}Pj$5HMfRs)VZj#HR['%PRJFA(Hd.YHRR%V%M.R/IrzK}$O/J i4D* Kn]<%/[|%?_ FJ@)H BP)L-KR%EKc)VJ)^J$i,MRT)MJ&Ki4M.eJ3,i%͑i4O/J #"lCC}Ccmlvq1?ݹ#ãª/OS.{ Ӳ#CtqqG >YgQ]R=/wh{խvq?=$hb?h/jFǿd?=Ī?{9!hOᑑ#CF6>f_gOV?o74=b|Gu~/ލGGxU̿w??##CK}m%qB<%t HwgJh=qoy{{'S͛7on o T84 ];!0{y߰ z1 LB$^ CgH=񏌸ݠj''M5l衅JѰK#(F,cuLfZ^Yz~gi6[}F m$ӵ3L4^ʏ}6.()8j'h`"*!7xQiE*`隘nPO]F&Oddc*;9Qn>&=@W>7 L-0Q~iT@]~#qVIP9(I4VLMT -ne[D9,rI>Ro.yOJ> /\/qg-;-$>Hef'3xӃ ~I&oS3(;-S?*),Ks(j\Eb8Y`q`ɂ _'Oy=xLO=rG9wZ]6=eMWHLE,2{p}b]8z駹&W)EFIcA-R#G?S>Dc:[ y:3f :_^~tpDLi@_tvoR?bF%ؐ8>(͝Y3ch*{**4;^[jUlPъӜio]eϷ`0r,1ׄ%ug[eqIw_^*;#\ Ρ#-H_10h6pM Ս 4rso6*ɸ -+n ;cہ_Dŀ6zmzon^c[n^Ͼ[xc.cxc2X\'Ow qasA- MZOȚ3g`a Gb^A h*nI&Y4jhAԳW GnċE?:J{nx/jjS~p-؍_nTe;e*7e`} !ъR&ʥB3d?Z@tfA"%h x}•0OnRuIk{E9])hza'{uCU<+M2ŦH`hu 4}4 oiLO{H<Ky|ͭkWV{z>"R< ^;KcY쓑saL@0~fbnKt®wAX!<ODV.^qD˽v[]ԐvF ]_/.LecX+?QP pp/܍;)n _!]. V܇нBmŸW*>U i!xPwRr$o5lVUUh <1.\eyl_4"<4]<6 qD.^6W*KG!2UɡJV-*AsPR[}+tD -xF *G//+zൊP|?ygn ,:/Ȏ4 qzk 4 =}5*bZܣgiP(ӸD4pJ%F6b2[eP0/s+bή/R>b>LqR4EB$J iG9%9-#x"Ô)'D VbD)4wH,0 4]Y(P fh $ m4U{ISpy'SġBCŝ9P98 :ɘ1U [% CtI}0=0PQѮ29Go%\ҖZbR0AszRB.?I LQDf3e>]H MR,qp\88a [Oׇホ![LDq ) M`¤G0R ;0ʋgȈ"ߓdePKVtaIAkwpZ>̢ [RaF[ +6=(ăey PT1kx"0~=F9cG@F@9 jl\eǚs"B, *3N+U?BK)5Gh]b rb _D9C͍ċu`'#MN軜zc`NV F肴 Zl*.z0v<3QICF2Ќsk+ *Xz6oFBW2.f3J#t';dOYOWY!Zqx,ݮ\Z]d%X~@,H ļkgi)PY)2&ɔ0HLk *dHٻ@&)VI."f,0#/ |8:rS0󘣄[%kGQ:֢ȥ /+ZԜ %к bmªddg51Qe1 Txdf*sp MXƀ|kO-AT?nu3>@2)p-OiJd?L%1/ѱ} ՔՑ#a&{fgf&̀RBǒX2HT-S@8*@_Xƣ`Zoۂ6@"\\JHR,WPs-WBK&O5FpT&QKĠNTCRJ̶-"]"9$.m ^fTB +*F%ЩS SaN>9x]gƎc֎3#=alk훗CluWtաd~rG _N~\d|槒J>+tc%}NJ;W쉄َ;2+e*DkCڼ}ڸںClؼ[ھ *Ƣk 6Mڴ1jȨ +̌ڲ3C֧^m{}W'_m}qցV['ZsՅY[h}gv߭^X葅%̤,&0y?ba /5 +&:s@:#!EM~@p9S9F$ubP'h)M%f[h1He.gA%`4ieVN3j:SH񌄩w$xH(%̸gK L>`SO(xC# &_Q0zz*0} 3+ ,KKy qB":Lݴ"D.TGSNefҩfګfLn"L(E`K Z@L;,)MLpC.1N_L \A!NR&>6>SF>SV>f>v>S>S>Ӧ>3l}fL0ԙԙa3e3g>e zp2XiTJL4Դ wLj i0e0e/_c=zh-O'00C'vZ➠ (H䈸DCo>–Q{|Yb('ķZ!_ɓCO7WN<\bu2zCfu/HxK)𛋄+w)~!`8Nt1P $ V E1xÒ uXjEj/hQ5ޢ=Vඥ_{xBAxj,y@A5";p _&G橣T9s÷> _ SK ߛͼ}y[oOWW/o[|c]HoC|_z|||U[rIZg\GP<4K0i@$2n꟦4O,lUҷ:;ADNǍ|wCbe)xhU/xm޷v };Qܖ ZKs/*?C2XIZv DD ަv,QQA9ou_'gnVdH^[zJXeؓ<CpW˼yIBAXΓ4ӲOd&ϥ f8v 9:n%?kdXťٺ%WcyN6Fs# _kxşXH1S!ӣy4`UUoo9o93wwt >,iA=G!y/vn>w|im}-'!/r2H}݃Ϝvt:}˹ kg|ܝgf?|9s:}fX +d`oI??rٸow>Pz˟scíg's'?Y9{z0>1U? Lsgf?~녃O޹?Sb28xԳ}?w~kky9?Ⱦ<򓯿 ]2v!?!q? ߙCo}๹7;_<z9s'uϾ~_>qK?Ɵ8W|gG~gOO=j ?O1lQ&;x $^٧Qp΀r/aan &*O.f'>G`QDz>m>m>m>uQݱ|g,36;so̦ W kWg~_/NݗW3w⿃N3["|7kWÇ>H|Qѯ|U .7~]X[8sop ?ޙt~G'gq #.מZ;u=ZlŖ`++E=v u`S;u}a8OC2ᛇg[c]Ɓ_! ~#iCLBCKteǟHE2KH)ВRBS$*PjftaT=s\f,38X=YTqיSGRR@B{$M[ {>˛h4A} "O[F@x|VHv6ߖpN;wF6ɛW]Džv+ٌ݄xБJrNo0 )Ǧq3LP|W^/1}UEk{@׻!uwtٮ,t, 7 q-T 2hZ^r#gDQ\{^'CY#VCC#\q=m1icw+S) 1 ?2veюPK#1L`~z_M!g#mGęcϗ۾*nINL僊**`ȥ;T>JS9{Z\XGzڇ6>e?-p˻zӇޏ۾62Ny b9ϗ&6L5;6E vѮ4ܗ[ƭ@\T2!E.t0oӓcS?Z=ĝLM c1]6:cp|Y$ ow-IX`b.Yynnjz/-EJLՋӳypf:о Rm;*Fz8mGg䔪0PgzdjO:{6;y9xxlaűJ8X9ӯk*iGrSKwCSgG.&O ԨyЪ6?/C or9DmEu?~ufo˓˦גbD,6κk\_5ºFQ" "\73$z5R_D:նFd9kqH0U"ݽN;jEZSlX9v0yACM>Va()vJgZHh=z Xzf,2%D9/IJpր3̇K;pWӯMڮhAys9i-T>9ׅHL\Fn}w@S\b`&ײ>wՆ8u-4_bqy 9CIJ}9suy.|VöK"5ct̘hg ^%lPwHV7)Ҡ s`NHqgS(<CH:tAq3)`,p\LqP@̥8yNq )#2{; z |0  O80 _{ <R}~`6G{&Rb^B>Fp 8LRp8Ov 78GmQ&6 7}`+xxx<Ni`/8L|i,p6x? >2! ς? (Lg,0.h%0`.G.|`!:(~`%;XE~[/Prԃs8ς`4+ ǃ p48  '+i` n; `%kPBuԃ8vYhPv`%8ԡ`&8c`. װM;i//JXUV"&>z*Rϲ强V^]q5!c$c]1qOKU矼wjQ3R_3\3qMqo#,XtDDZFo¹ kQvD-Igye38vsO!4v{;WJ~ȱsx51 սYqZT#Ta+1ǐPuYxN5k$7'W%l7KNF8nvQk눨!n&kEVs~I[gQqtW.ԧHEɂx>5Q}(,KsNιea5{aD.fu_NX'=b=o*n/姓ej]b",p\*x5k6Uh}} x>kGNUjR ER2/|J\wPv/Y+y:UuN+S/x}LQmסCTUTYWcP jr^Ūzկ\9J}Q_YqsRCu8F ǹ֔{P}:sI~jf&-8v wo7gZzSkvF0lZ,%S^kwI3CEWz{z^^:_Dp{BlAJb)Con&@+AEGȾ'?F/Db7#du CYNgx5z:Ӷ1u:A_>3o@S[} ;17IF׀ꋴyA~v!KC~1ӸQby73 =g{:{KF׃" uG B&OMޡ/`4H,͂Ks!M)Aܖ Kِ@:T /!=^m,k LD GG'T-L&m+Ioc:*FQýFեp{as\ @$6!û{) Xݔ+@u\<Ǣ_ Sj͍ ͍+J~r$/o;iʦ`}Y0ʅu2zQBP )o okU臾l(oDM^Gyʛ|JG ~E0;gV1ΣJz!m%m(\K2y> Ġ >\dھބm :7'mAiۯdicԀi?~b/%yMmU7L Fެ3`Ly]\UMmpuvUld4:wO~bzO z,BRc04kkc h !/fG{qW 1p=N{R#;Y6CɋYQ^9+Qˋ|90\=L1õ5L 4LŊh/,3 8zڃ#1R[ckFAcq&5ʍ㩡`$hy%HD1hhֈ^ȋ ^Ek/q;߮=+Rc,4jklb 8h#/D{s_ȋZ^̑cL c1Q[5b4&/64TNk-i4 40on M05T6XFzcȷPVH4rȾh#򝶑֫l4.)QQK.C2$D5\#7T9N|cW\}i]yi!]̞SJ}=Wx-OA㔶a=5l20]Q1.ݥS}FJ9~m4 Nmۥ2!?m)Ym@mMf%(?8m*GFTq52ǝ~~\жe25^qQ[c k.Aۗxe@劶Uh\%#D=%WmKW'.v6y; D]|6c-KfF^:34}Ǯ|VIEC&18;)!?({F㹁x[%qC&1퇁h0pNx 02G1G390-h#3B1RF=h9ZsO!s~Wl66ä2A|(yaxRܓnf1ږSuK zGb'WZLX ᤦVASQTcح (FSvv笻gbՈ軶鱽5}KZ|iۀ9H7x?L*/sقn wr~r0ǽIe<)\ TyyP޶c%].&:V^>Vp\/~zaZC{=2%#LHmeN,)ZhSY`;yrdFjn]j5dnްYJv ݳA2~1[°¸de4S%sj" g΁x\ā'/uB"tLNԨ/7= Pri'h0 g 5lnxgAݞvNIKq¬YYL D/+[RV^0.)[,1. IRǥ9*_q~xӉ)*pS\\, y|Μϫ9Q*yfH8~;oY^pGeuLAzlzkF Cȣ<(]YRRL;~JT"2}mH׋t_K#/HW-Du-@$QUt(fUv7xM kԴDPyA l  2( ; ?({qJc\u fon';hEà }[&d g2L"3D JC]%N|fw dScgzdc`-~*R%m#\O$*\0$9Gwej :Y IzxKI_@J osR|`نD^q{s?B]?4$e,V0R(b=?ZBs8hcҁb//˸'@\=Ȥ p 2=4RiD"eRǞ¬NM!n?fz#kdrwL'@f@Zvy4Z[_M1-zcKQ7{zq;Uib=ɵ}<7#L+#{[pr hK9~:>5Ԍl&_Ey$3lNS9ܠC s7^\[ݠP_A=޷MəHP(׻n̪M ܽ)(g9 V @fWACm~TqZ$W Er>s]\V\RiAE Uz3Ǜx%]p7dv=J ? )|(zNK@!H=/zUgpSSAЉ,Z+KR nA[Eon]ԉA~Ӂ"x{Pc, I'ѓ2v<=  M, qei;5XDZ'dgi!4X_' 8)GܖЅZyDc@a0V{UԤ (rk\ kAh)o3[!m9jB"_B9 HlsɃ:)7[G۔9&:7u`?y JS "-9yZv.uNJ6!fx< HG m{p2{%tq)(BdP z@=!Y :ibЧn 'wiFx QB ݈H#ƦTgiw{&U[1q,'v4 70Sqoup٩~uQMWV5+*AkPϔxQˋ,]˽' BbV5o qTF@#ė=t){$GқKN2^˔e:lԖcu_U{I6Nyq9rGATLz0A ׈YJ]ZPG߃4RB"<~R֙hXZ6,8DN9vS]+d(u0 ;RƴNx| ἥO'ȉ\u)jPhu%P)6,Yz/ `LSvTN7[$(:T 5ַM7b AXkiBH.F?('-8 b ͧYWUA[ZA1T6[O[5f}Q-(."z:F R9hή&;.u{\0DLZErUX_t4,3jwdKu,l@o,c,p>,U&$zXRӄ b !^XtR]?KeꅥzaPB/,>ARLбԫ ʄ^Xp-=M/ДM =hjASop= L}e9 |8Hxf@ ׂ@VbÔ^<v7< 煇w3xeMox]Sc"}B-CJlkONJ%8nom0Z8 b\5a-Qlps e 6x 6XT}c> bh6x6Xk-?1JITf:ʼnwڂSG)9:Rt*fPC #xjg4W,MiF.- 7? ӡgϿjKfh Y $&N}'G=,Zqiz[-=>>ڞkm CւMȤ L/H$THb %?i4/Tx É$z3NOPoXkKi'-4P"z&3FYF⟌Gl<|!8"Ux4㦠)b;i[)J9H!KǮsG|);RAhN 'K2q.Ýôuo`ACB׼m(>vXj1\bGXrգ.nz2AۺZCIǦ"+X`]H{wJ,qAZO'+ Yrf;K~!gk! )HRN< $)(覐( J~ǂ0ރik:C&P4Ξc~D@kë?@bG 7mFQu"k4"؇F:kjdA5۵&?a\_iB=jJϏ`<  ъqqtR@~,ԭhd7%~k #u &>t.h8+}=[>oTD6p&kĖz@ 7 J049:LDzrǡty>wWyLQBh˱xHhidFs{Xkgth4bςXLsY Gs${XnMg%)˝ Z{njD o[=uv[joGsM˺;B#iW+(}gu`9<ԭ , (~{ sz6 v>q "]#2 y`Am ΄/թifYi7cDʬn!9Y}s@|ڮ -W}(V4e_<+#ๆ  [&][9iɊg~>fL͙~V t桄,TG%@ҥ;W1(0ԥ 0w :,^7cfʄ;@&0گnp\0[)s&̤KP4V LTկ>F\  wA*4.$/7YAP{SM!Φk-q0דmA U8ٔJK zq?14 E.DT1_}ဉ2[YZ.o,TYli;c:IwiGqwس:tV}]~t'x=(=n:NnVi4;{w0iܶ,}m_l];Ze 7/ΪnˏÜG8@>UixW2ӭv&ߙ_FqOʱ0o G0 3_n~ hpnGV/KBzciR#dYJN(d5uUݘShHtilsBwf%IԽ_QA0U7G-Bx|MȏlՁ|rtzQ/)1E6`긿*Wـ+ 51&E SXng%@ue\tP,R ^R]* תE2rMQW _4RBT}(vz̟V&T*tպ5Qs}!*9gu\T<{ hLv/F4W;&1u8}6hC1 Cui\5 qGdV8Ҷ6Aې5jh# ʨ\ONbi A$@u+g w |Kv^٭>zVG*ٳ&%Xeȥ&;8:;9ݰ!ڞ`mJm(G)mG0v(;PR;{6r֎ mJW,*zv&;c{ &*>5djSt^Q0F#㶠R8,H٘(!NvSjAAPP&v)'ʫ34cce7! ]<`ŶaD{U@0ŭWJ}[fZ})/;(oMe*x $w@ӝ\mP\`,2Wy߫|8H\KPTIs:>TDŽF!QQ&jz9ޅH╀SEpꐽĖC4C`~)]]O:sTSj͠tf&^tD+h a ~"!.EjP8,JsJ"b:PX'焱M9ёQ輸p -6 8]K!$րۡjq {bN-qQ9 J&[.߁C3g>UOԕ,UvNVy2s%>mzuܜn^]?\3T:;SSTኪwS~=mP'=&P/J}%\zb>ҁtjt^=B 1]b|Eؗ2F|5eĿ~wB|5zD_c|QZ?1y?_t__3PYvt#?t\ | vEUd%bJY("oYsa Yf\B81hqKƾn;Fe}!a[}/)b)f!S2jkQ&S ( 5z JH? WLR"!15V"):4LtG %kXeAɶ3͹Nc `eM s{1BNk/A^pb|ʼ a ]:& &u0pKh,gnDҸԨWS"ؘ?@"@ Vc CXڧ8PX**;Bj9@x8vb:uvc9K){n$vCӧO*p~+#n|:tG;bJ>8$\*BzͿ\j*mW1W_d` ݛLMH2EQd)+x`W [' $S̋Wp;=`szMlV T EŅVacw*1WLݶ@k V##2R.uIN92Bܴ;ۮBzdW-z],^hl#j1dZ|WU2`A52X5TSkpȌ.S0g96SqLmn^Gŗ8``4Ud.|Jg3[ا g5OA.+L$Oy~Ff QNa B^|;cȗѥdP;L=E;`Qʟo>Oq 8m*l SMV&{ϧP zj:KAIpp>d~6γa,M([i,M"n71XLnny9d WB7=<7)v"N 0 yq0E550ER9Ў :m-q1ld&ZyģW90GHe~W@V (V}`%> vps>jkѥo*jxG&\FR,TVÉ${ Aynz"A-PzԡEšŁݠA٨Yt(_\aG65!rC>J1قzpc<3 2,٫R֞LJkp u;L< ~'{WSPn%$-w-.H"p_?}%8˒Y5]lW@N}lf6Rھe){B_8d:` Z%́lh>v;DKP2@2]uxK^Bn ;.3پ<(#i-z?RG0U u(K0ۭpRi5"п⍉lBYi3(wd."/oaJ,k&k4ӲP#3ibRjLH # 4s~N=N#]=C->\+G@޸Ce# b('<<.3 .l8kp؞;8Sl.3+T`_Ԓr E0:lpY(^lt+T$kSp_I% ~r]{x]# wQGGQmt)ڮѨoۙ$R?aml>SLЃ9zp}y֧5)o:2 d,}tֳsR:_lrW- f7Vt1g`fNwkus ޞb+xvqԫ1*e[pOP_=6 <#CbQ" zUOSvuvt/jWM+tQغl( _CKN=.խgTcN?j'./#ÚT#K5\ikKuYݥߣ"KukLgCn;\Nuܴs\0u`r g pԟZ:cEʖ$hKNE"\戒V!=":SB2F7p̙-܌IqyRO 4-/ ]wiŪ]\-+:ԞlAH%,)%p8B@>Ҿ ׮Knlx!hgz9d <)꾍iOus?2X?Q RPV,?/+d]W[\l.o<[>,A|/Sf 2Cڴp&;7ʾ^D;iė(N5\^EVEoWǂX$Qlp姶 9oZ+^t5H##  rՠqlQh:PEoD1tST \U6v6W`L6Kvy2VoJTtyOCK} \Tu 2vDŢ +l|! *hiD u-t]t-u7m->VQ"$WFE@%n履|}=| ꮿÕ\oН圵hsOلI5%܈d94|l#pέ*}f4b/!7„3#Q 1e0iP ǔL# U͔)0=#SZre2K;yGPxopViCqlĚ5[EC"rN vMaxuݐ`!5w u7HN{ڥ\'I7 79#~*g}gJ%>k߉= 5id_DV=1;Л;I10 w It:f%i 7EcEJD c ;+-c h$eK*6Mh\1 )<ʑH3r.SJ^a S#dfDH+ʇ쩑TE(w=Z`\]ФY2Ll_O;ZZ]֚!)&O +dC\ݦɻ_O9=]x_w'[mynt,C|Gizc2W.~O! DM wYd=U73KOl >Хu,i"BIëEU ,y$^M;5B+Wv @x5 #SX1F i%C{v@si@fI g~VǾ43I)}uŲV ϊY=Pa _JphtR},,Hv' smŖ}gi;3"helDwO?$D ȇez\( |ӽt^tx368刢Y}i]Ll,4/WŎNZo4t?o|0 S(3." TLǸuQx4"l `uy<R)i'Ai JPF5TVZ#CkPz׽Zқ+(ҋyX1<|C6+iN@S` Dh=5m|?3 ~NfDޫB,-P &PLj,8lcX@>God^8r9ȣ '0*Yw܊%׏{H<baA?8i7a7.9ңbGo^!ZDKtqOi[ Idѥ` mP1 A%fw22N`3C*^]?~ZcllvySnۼ2=qX=Ʋ*"!BީwR%n~?r=_2La)Dɓ]n 3CO[`of&tKː$5[XZp;sAeX_<@F@/@2 43Uu\$vLr^ ᧷*aqS3Xph]|~a :f|Ԛhj*kʐ>$Y*yk*\ږjήnkxW4_хs؟2 rPV%N+}VR%hQ !@m\-B5 "/LMcxFB^h=-U}q@Xـ2AΟʹ,{#%/)s`@qס3,9gjz[aCu]MZ5je8QQAQܒ_DC4 YWgo)y݂5Kk߀6N>Jߑ:&?&~[ +'į &zy{;OP漛Rv,GW3G b阝kxTW!3Mj9A')zA QK,^]jo7[aJ(BݕjLv;D5/ܧ@yȺA\I@X]onC^z^ /iڢ溆O> 1iO.wh(WG5׷$$3MzgVɘjt}joF&F[PY:6;`<J5` FO5*V)E&v#dp23b\k7yʷ|#5"B䫅I܆WE'Q"s`n]:ܺ4jPHuԄ !ñ 7OdU_K5':F 8v(Bx΂6{)M-i$KzHJ$v'R?f4Jca ϰ*^w·:Zr;i#נ$cJxtߵ6Ff w-#SNr ~R3jthm Ôjrk)V w+F *f_ 5"^q8w 5~7_g?sw\&N]SѕBe=5aHRpe}-Pkv4mT5{Ƭ`9g_JO  M[X3|"ڸ(JS롭>2!F0nj3IY=Qo,i%Ҧąc6lL׏TޠuE^R˸ Pݤp1#"SjVy>هqЇa>d*f|`K>lo{vԇV0L?LQ %R Um03QdCmpc.!+&'IUz\S2Lrաs/d­@P3p(J"6[iCPkP$PO{wYX>c4OUF#F#F҈ĸ8aI ^$-R4+[Oq 䓣zgqqh )qMO2/1'9̫o'T:a =nBm}4# /c+_(1%@/c& Q>WːS8A^Q'&{~Az(_zHv!bFq0 ,{+ ~tS ɱN4$]0=e&à;)nA=*5ƧA .R/A"d0SKE}7ev+miHɨY4BLSBeG6~ PF/ e{B{ eTXB3Bww2\Ҩ:N \MuobϡX"qv"6D}piJ1hɃcZX1%9uR%9sC(Qtkkny#4ǹ959WV)٨Jh~3T%4O⠪wHh6tJh&CBKBs;iIЬfCw M;!pO O[K%4B]IJL泴a"@%4'г3#8qVFݮ(s@)?ct1'(z$2I}a*ĭK>GQ=w/qOMhc7vn2:Gy{ɛ%oN~KynU4x96& ~u$WPz7ys~IzNLS_Jn@*\;]7ox`UTCՄo$^8 [:- )cD3䵭Ei|jݺgXo5vԯ*rՃV _ߩv :=/o+<~襍 :G(?B%+Ңjrm@ c89VitPCm8jW yK䄿jPP9ϨF!^M8^![;]4~PbvoXEvr>)#G/[t^uܺWPKn&P|9/gik9ѡ" 7^jl /&uH텞Ku4{&h"gP_'0ӑu@ k@݄3a_Sڔ1%g-BLA&K?)-ˈPOz|vIO;=LSS/QJ1;KŗZ23Lx\·gH۩څpVY3YJEC N7% Q5ѽ9>&Tid55r h$lRtbFUBsF2Bi#?n `8Q aR?ľN({Sso`Hr(0k頡>/>{7=c;7Sb,i\URW>lQChȷ".\CDxS#CCqP2a'yC*&OB;A);5bA\iežn.p'}Vl8zlIĦ!CYmZ~ͧ\ Fcl^P>AO7~GmRE7|)0F_)loj( 0`!&d32I9{OǨX{ȁf%\}5 '&]Pai7L֎d[KIryECYU*usZ;8eAZo\#xXs? /CȐiTW(Ü-?&-AA|2p6/1ЙL)~ɗa*v@iTus#BtJ,jnޜxkS/e4wj#i+i/ 'i %E Y^X6xi/-2>%^^ɧ:۰|l0¨mS׈ S8g)$ș(I{L-"GPW4JPfc9fBjfژB5MJ$8 |tQk;KtH6yoxWJdOw}v䫷 O-)u#+T 3;NWɗjAl kqYnkƖhNQ Rji]Cö~჆j}VvPeMŚ2` Ĥq1!E+oȐ"4B1*FI fD} J5̭ysMIb979XiJM=iJc1V)s '%W&,l1Kb`nrɡZHs \Fȝ:[FdA\:a.ut4l7=0~u<a5up`2Q5I S,%m. Ҍ4%GVRFBnB,Q8./KeE}`WV.Iq_f,k!,`~`p `{`pj* G6DM bQ%Wy4 ;eo0mm*2=mXr^!f)!3)C15 &4܆x ^0=#h7 ӳB(n.6A`^n^tZ1k;c`@6!^[h]xe"N mԲe ˢ+ EFidޣI5vV!5j۳h>4Nkµ_H=;X1(G4^:ߥd޿%uk{69>BөmO,VV~*R'kz:_MmN͹-h! IKg85DȊ iYY3ФTV@kL wh#}ϫ``pIa\SꕮЀ*EAoSEDEZGM 0F(jmV23bZ1jx$Հ;V~<Ԝ DšsԺ zw'[%L+%c\[OBΒ,Y' 036 EP^ =^-s>I !HoNE}{&k.\(gӔ<105#4) :-nQ}I H1'}(Nf yv0n2+҂JFɉq3vO5Fu7ѹ!D(!ߨs(I7RYudR93Ur6"^~Uk (rn]17r w^K,7{_A0HAh5[HgM]tq~2&9tWh ~@*u#>9Y Y͹>PgacfMSgUL1[8 f~=+fˆ$xM 1'4s@FmC .U $84*7Z- #Zkר,8/F("M9W>9j}9i@"~%A-x =_3hQaq?x#0z 1ϐ*lx.$',7Y­[ Z8 z  祇(7.iD11࿩8Gpۋn1p%01 7[b9 Ɵ*7g1yV K0eK@ADU;6Qyڻ缈XO# ShlXǽlv8&)'\\CN9U+=w>Xq4@?),]kẢCx4$Ǡ 0hګҷh,W3+|J:i*7#ChAeP4UxIbT*a*c5\ &=T$/yI1`sp3UUR/>K%:`{uvSR} ?1 ƳsZCT\Q :/߯XdK3 G s!}f(0yu CM?>̷@3i]t_Uil*CI @Xt>8+4`Be8[>[vY xav@ݟBQlҪUjO ze!d-SꠦǍb6r*e=y>c&&TC0n  L6sa:&vS/hѧxOx&'h6x <' 'bSO*x¬f><xD<Sψ4 #n`ᩃgX'$ϚifBO&<f.9Lܦ3xMM,P?e;[Gz/<4%zwJj^_g &/k1XϷ 0Sl`? V5cŹ΢u=8Q@ uȟ?~ i1Y,zp8 M"ysQA3G4Tq%X:o _k6 -NJ/ >7}mbyĂZI㪇?s^rIɗ\%(}̟?%ׇ b\s#(WL:ɐnBh~XR,L (DN' @eNκgi(o5*"@v u yΐOC_1wq_4jMUh+59kj2@k|X-!R F(Ы~9gz;zD@bW!axo:qprP!a~b+c ZtD͈_w4޽8HA3*3 &'K`|Sw0t&B݋Yq0[wf[IUa%m ZѢ6u[3MD,ÕF]h^2Mlsc0ԝQKs=6*Q,hRSܚ8ڤW XJMԉK +LL$IcI0o,\Z1&-zzo-íId1O;Qa+y_f@~VN{r؝/"kSNU @Q^ѻJQȚZh v~qѲn[ (+RSbZ!: k>5Z9ejU qǑvuj#LZ]3RS%O($||pqkʲS>; TMjwD?L1%ǕhQt7 #1AۊniՔ k A#,y}<`ӡ{GMkV/Ng7w\Y]%'ݱ"_&Z8>O"jnC/ɃX=xE/yquWI;,.|;E)DG5@_7Ar}2\oi2c/)#^:ސ$N Bn7j3 ZwzMYe}8.]!i#Մ?|Ҏ.{wCt+9VhIyx3T)*{q#LsI'C*TÐƓ/w>8ao]m*H˩KM*2 ?Xb }C)eTFrU!:8lQӋq]GWVl~±8c@/Κ!}1Ju:MmsInZf4Z.?)T)R*ӛ#9 ѩ$#F Tv#+P/3J2C13y,A~fʗ}AwaӿsiETY(;MEMJ!}cR%qVAlCFr[tLXe 9^9 A l9H- | 9v߷s&<}vlXnљR)sg#<m耺'RWZܦnYi\8ݍ/s"H܎TFG/d3Pn6lWsߠ  g]8 HxQj|`F-[O#.\VkcU~p][2Oou:HBB:lj|k/~sn0Bms "~L,) ?Ņ8mTyV@IpXat˯wV"vOr1T(m+*;sEoP-԰F W56t(b,ߖ9ۋqa'hit˃PƹO 9N= 6]B.B`_TܦUXnn`zM˜PjLs/R ]-jƺKנwn8å/vz4U}`JaWDXLY+ם 9g&άGT Ir͇ +ya&{)ANW b  \Z݉k(&s[J$)]UzS'P xuJ ^+!\ևX 9z@gr%G',9W0R<~7S\לU|SwbzoCieYȠpUh5oLs( 5k졣:^-˭Jd`u~ٝNQ'$Vjd:+c+\15}tyJߊ: &hF'CCZF`%TQP ÐFlF&WR-CU g|Ot%u\gg:z>bڟq1D끖~|-:l @0 FO,ܖ+7}Jg鄻HMMG cbJMxבݡ!ǫ e]qhL=bb>N0h25{9sRaJ%=~hQWl<#WRMyj99 J~V>Wt\ .U*#X%:"@xT2B0]+/1stSx`/U>R5oЕr%mtxlmb\ ۄiK f~'L\sn]íeaa89k -(jSzyppPߣꃯڰqG[˷F>Lۘmj ՍPͭ Gb 5p|1+rQ'i'-_ .؛Km4K8[P l&0<!"`A[iPæCROƢ:NłmPe-"`/Uk 2ERyXLo.߲g[)oV=Aӎd|MWk@Q>BgIS=q`ݫ8r Z-Dd$~t}OǢ8h#7pthpT  "Hw9L5*rC&U|)WԢՋk4Zcn[49NPwX(|2͞Atb(U iO| ~eWqv`lђQ)=wG.BíyQb9Hj8"%n8W0"ĔS_+iE}YK=T\.dBY8w" 7[ oqkPC9*M\֎2\M{E vXG䷸ZV"K(&8]0B6 vfBV(&JA33ag7ǀoo>oZQq@v6[g9*yMx Op)Zt7EW=";4ULݖ>KGI:z#JFDŽx}M~>X I%cCh RD #4qB;vĬ@RhSqjaE#_`uҳ"4)XP% r)qT2QM7:G*@نu2Axbmp֐:'Jo Um,j Lm5RR-ujܚ!Wܚ @Y{kT@95$B~Ϸ,W8o8 Ebyz449*]YTw{HRn]%zfD'CڛHuHI<$!%JYZpX;K鞺mO}K\ۊ;CEX0}*2?xG,M7<*9ANc1~*1 Be͕#fѱU$vl+{=2 xRɭA*nϸ~N11VzC!zZG_.Џ%܅&CkДe#P1\×Mr/ˎ΢2_6*P624PTh|¾]7",^K*[wcG|/k |צsݰycMys oil PmKkO㤒 |8I*ΓO]'.K9F(#g2q G_g5%Kv/I)T#=:v3rP$m"Ϲ `.z*4u/И:4B(=2')֋m.R-?WY+{6= 0ԄS\۔xdKtv*z9]i:@#o){l:L/@ss>,ACC9Ɛ$/~B7I'*jDZC.(F-5ge]dqYq5ev#S$5&u [cp5A9 DŹXB#*:ƸT~14),hx~'dyq=4Z O<9s^c. .< Z5O9ˢeB0tw/w[9ҭLo x~W2ؗ?O߁Ϝ c qvQ|\k2A\o\} yWv^}G+}<5Ǖo[_/kTAdW=.0WgUNN\/rC$ƕ(4[s·kijxu ,>vl0.ǮQQT>#x&=ab?9-݃7:ѫZDB8ՙǨw)ܥjSAYey}WFۦOsq͕#*v'+2&JjAIMrcv=ԗk>f+)Jޡ9կ}9]n"ҀI`?_1slgWG͌ݩQ9׃%K?85dT8;"2h>?HP]ʷX$`j }OL,\1Vik2?6x1IZbQނ#~عfk R)G$wa}Prր;;hw~…e/ύBI蛕yj/^q(80˖5b\)+ƳʋVJލRc!K _uN!`K8_yr"uAQ?Vg`Zf@ K H>dN:zG0=Qk=-WbA%M{tnLݔ`6b&Xh!t.4G#W!=e7fq2?Sji MAa9bo«xh ֌߂p !" \Zxsa,j*({*HZ4v5YG(z0 #oPsh~i\oP'6Ԧ&u ,TF O=>rѩ=/Cqn,&jL*~i ?@wQ@kƚUbʧ{i` D]LEKI(_T9gnjzaz?mjJ^R~ SoS:YĀgBԄr s^\XwO7Viވ@pТH(E+.o#$G9\ɲ5uܮj/NxyU4+ԅ7W4s? #MG)8%LB>UZ̊~Nqf<]9[H 5"!Ґ[pFP/[L M!}dqBE?u a2T6qul QdViZg2}o†φyN1ca17|P|fJmtCkPTVP8,fSg:|Ul`ι;t(ͣb8~K#shsb()/fqcV@@KaK]Y*xOUy>fٖigm j瓴F(|ˤ*eR}nR(MU}TO(pv7RP6 u6M4VCR Ħ ?/ȅYi+$Z*D8۴*ǽ; ̞vѦR4[1Y[Lu )P!N4A7Pffv Tke FLH`GEfQJu-G&qnJrD({ݔlPVYsu]\ 6J(Uъ*n0ӄ+:>ݎkҷUmu^ tYAiP/؀ }>qƾ ?`` {<:$bc#?SQ#6̳1ͱc8OJN?a$)ӦgdN˚>cfvά/8gK/b7^_pbceW,X?z uQ!k_+idxW>5覿V8MQ1D8jezX$/RcF<\J}>ݯPiC4 )+X D5n?HJI<&|qJƪ ALSK"߆(rXp"z"-x7Sj{KR^8PhPnC9ʝ}iUEj4u<ﮤndD9yHv}dB|][C@O=JawϚ4vڈFAhuw|rMl!a]q+^n;Mr27!⳩RŘnSZi+9|@)pS&G3HY ЪסĂ;F6& AO=FJ4I NI*ݦxQF%k6WƅZmwigӂm|@bpq-j-W چqí'qӺڞGǫYGZmOP¬( 5.j 2jW⬶$95nՖ쏫TR?~r6jMǭSZmqոiV$ܬ*gZmtu67RkMDžqyV[?U|-}]ɺj폻٭6? NCK} @TU`J4*4ʱh ,gDgD4?5gFy>'ܲlk~eZ٪bZYkuga A?pys?}s=5NO-r3Q^IgsTpwk` %pv1:.8YI썛)&Gːf#$ 8WW{/FbnJ |}Uv'iwU0A2Zs}ox"iSҔ٫w2oE*V < (&]IR3x?& x''.D?F1b mNR' T lUp*4Khi3Q٨fHT>*8K0X< R  $Bdq]i4fIc"*]]*ot0:lEwC,̔h"`F}+GǮVk"'o~ldkco£|=1o5I8@ w48GVk B'ލ )T=%#ԙ}`L7Fz ܢKTS` T4?@\V|-N52陡SxM^0N[p3]osz55} ldD P{ 00YW4CTFè <}X9rWSW8|♷}-uB?Vc٨ܼ  >P aT>#8Y('q.:3N"7:uN:*jl >Q+Zh$OX~8K2Ӽ#ek ͓45$\\ywOוB!*{h5;$p(M^3̈́$g&]c?U뜃u209-C/oUȀز۱kg-.ooFT BǍ^{'r;0:%MHgĸ.fGR\z>\C6|t|7>)EYg[l0$ MZHH(_,0BlhڤiMvSVb!z~YB4]Oqr.ǘG_ Cpė7z?Ⱦ=<ʎ.$[75Q8fbX7[@g&g0 χ7P _n 'g tzPf陋(uϣCM˺,=x~J4%M:_R(+%]MCsj>0uJL!{'F>0]ΰp.Y,Z<)`48]SD:lεmKЊyZϪϧVEFigu;b}d^9v| ݑۗ.L/6Vk5k0oIgz)\l ~4 f? Tb2Yt?M3ho{u}乂6zAJ3^ٜ^W d#(o D}.>bd} :޻4wbT](&5(<$^$bwEp7RHaIiQ<{G+.yl\  e.1QF._Bw =9gLK[p] Esٖu"(bڷ>:_rnskfVv㖲mSollsȦmg_1P~p@ŪZrP7+?"й Lmuö Z+OLMӝ xt>N±.U) b Jڀ|`MVY}{1}CIp=zI _wS/rMZ Ƹٗب?7Ek{{@N =[:K&%8T/bx3Y_6\z_}d|^ x=SuƟhzAոt-23\Ca{L{i|+F.7En鮔*菪[*X5ǧdEWH Xm9Ppϰx?2Fu{-YS4a:_jY;m+e 9xIdO^=C5~:/f4 X`"иQbV2ΈB|6-䄍Oܥvl/8TDaՉMd E~l6Y9t? Ox@frb!< k>aq.Gk&F]q4Unwb h_́~# aSlO۬h=5FP`NnO "aynM`iT6"v=ZS6$zx޿2zҍwDkztBԙ0?mёoe@}8|4OA{B XBZzp8ْ́I,ggk o&i ""rZ {4`hM X5r!oQ=> F3;R9~l;5UeJ<[ ݂[(-C ҅o$m'ϧ1—+uBz!8\ݢCt oeV,[wq$n) Ӹpzʈz*QWc8Gu]hNt$J 0gӷʊm@Up/$ hs4%ٙ",fw^ŠUsbQj`K  GEgF7pxYp+ۭVgؕgF]̅e aΰMWoN|ookn? S sQ~d5w/AǼwa.hށgL9~-#t\l {~#~+*熞 Ϭ'l looŠ'/n]^FLVp.e4G.^ x:VV vs5\ܗJ/.|ƻy̒I2Ӷh?Q_p F,Pq7 aT׺`yHaU ž@*c(Oxo5='W 0A5ct_ۡ&`()<BѪ)ȿM 0۪3[ &ow ֚2q[މ06ߜw'%y ~LFCsR7lҵII1KeiEl#5(Fk_p§D]'8{j>M%ݳ@Fw1.iƅ !A ܄.eJCYfQm2܁Vnh7t? '.OFLv $l2i9|m$S^kFl. Ř:^Sdfz hʆѩ&5ЉWHjtr:+`3c%]<ϫь/-AE8KK.Zp9WZrAXwӚ-[Z<.YP G,^pRߑe//]EołKXxAז_zkK৭-rk $HNQw6o9q4xLM"yn&]FJg>kJ!9¾;-Oݯ֩݀{`fV;CAı6;\C(_W =ڍ .wCGPCB+ R\T?l4xB7et5xHskaZEr3ٙChg :п9rPT^ (3K̋-$>Zt>C G'"6fXl$XC!7ұ~乶RF7dq$۰ [kv{ 7`+ĂĂbbiR-KY0ޫq)W<r 'f't|H'(Ј~o8[q΄D{Ztbf1> :"($4OB4cW}}CVn.5whPp k(xHWowOPHz~}GA4mF< A|NO2V/N^*j{}7ˠJJD(ZQBak(ۮ r_ DDŘh J~`mSb*miv6q/Sd'AG7JG P&PeR柑h;CqR>{,~y2Xv:^ _h㔏#y}i(l$eV`=#QܗZ1#c|`b/$AuvMUfځ3 vJ3wܚ٦q_|(ahD>8t!B =5+)hh,τ. ߰ ͦJD_W-^ AOY }bZZhhg4tmn@҇;u LԞ𕲖$A֊Bu^|&q+]\pB6l2Uw5R&VEU/݊q.$uCfhJ4 P/6ȏT_d>B9D>+d?d'qg+zb5> RR@v`*$qDACш {[hMdA/BƑPPW;p54yRH' ,8;\^s;jb2X5#*L$U%DaA8i>7>pCyҠ:?!K_*|̀JbGQ[C}gq.uyGqi|Y9.VMu=P}:4V_{V_0x!:lPggΚu|7 {^-2:(f$LE"hbuwSdEoz(?T~r硍Ϋ6c,1G&^/Ǵ'"M14 GK&`ēh=K8>!$aT916Cˮ2qngͱi%dpWne zǞ]J&!@R0<Zϡߍզխ6O< ܆ʙw WZޮrfYhNi/CM5ָ"ĕmK1#"ޅԛRabac)sx=5伫G7&ޛJ Yo|VWȺk5e-X;>uBIb\u;28\yfq 0W } +g1kNU3N̪@ *k? ;-tP=ѹ0Fe$Gj_]&tB>kVuH1<,R>p[-;8,o*?C@Ig+>Kw|`FNg d; :ۉD6[t{uޣ;ڵE&bDg@=͡| 0\.t-0])Im+*ĉ2nv^@fx݈ҋƈui/Key~h xp@D<$ƨ),F]<>,*S)̨>POo̬l$ʦ cyR|3PiT*(Y\Ԏ[ϝ?7x(NKzT|_aYY2g9 %]n%Cx3::EjFu[[MAjWV VWp$LmMx?G!oN@XHRVZlH;. #^FeߊH6\[סՊ ޢ "Ã36/4FTi&4Y9s 6" FuaDqk v-dbI VI#x{%  VCcV=bz~{)]*@%;{Ŀ]mNjҐOHdxL<8;.'>s"!U808ox9 rm+)Y>G/&WصK8w 0&0cpX@(?. lЦ8Oi^=+nևgQYu,ƟFx $R.VJx41Atet@v=-ZLD( CJY.sjEqţ(WnT^">F(9쵓P1\ByXbM12j<0|1Mng( kHȿ)[[ߋ:5sMz[Fs5 Z/$2VQ &v3|=[c;]6RnF)[Pn- 7"Z#)`c:vd_/xkyAKf]υ }^KjGPKO${|o?\('Hl\z!=Kw)-"{I=jJ5k98!3nL+U<#Y01蹒!}=Fɕ4r5͙aIcfMҵ֣䪇6ηHqdK{0Azp $rd@M*K14_2 /2=Fz7H4-I6+yF|zPvL3l^G_zY9} P牜g}FZAKd >_BK#l3jۊq7 I(|Y3+ Iڛ`gdQ)`+^OG|pD NDj-hK(X. 2zb1FR^:4"v;$Y PK?OB8A`V~/JbC2초 iV% Y~L2#KR0Q^j8Bגo0-[i0i 9N%׀Q Zf?^ ]A6٤X48K_</fŧ p˖fTKٟpb1PAw@´`42KjIt#]sa9,'\jD V.[ʰ%ty»~ʖ>mW̠:)/Q3(t\T]0!=[^/hh ,ކ$?WǒD`\MC|X!+ Ǻ:){ Y8AAuPq -*k$1 @tG:uP|7TOgPa4L%05)nH?cp`Αi+= 7Ia+*ͳ(ӕ4%_ہ#$. ECU@GCe3]BjA,K35 H/HWtAםtMtEK8n<O LQh3cGal9G\cufG>"`yk{k!Z27bgwe(B:C9z9j}߅ f ֣R䲛qsh=Jm }fqX "Wqޤ Xn"/5ȫײi &Wg\Z !3TPG; |VR^-Fgfr2Lm3И8sPz gD\iBWŕ>އQpE YhcIY|;۷DW ]J46դUO ӲF/1a9 fVFmr?~iҙ]Dt"E:WHERgT4gҧ>O<_*;Ph6U]y1vouAF,d: lR60L@ssL>fPf`=l <5jt8 nXl(\.M$>B|Nż|K-4VOE!x\pXH,, W[pP[hf:3j.)9܀1/̀r@ rAhJpcq@ZxT`Q 7J90y&nE]&Xe2TL o0F a*~:^K ~:-Nw8 迷13Oc#kZlTqhr8S G;xB]Ҹ1aV&f.;PJH0KTMvaf!]hb_|Y:PTEi.'x2ޭ}>Xc=ǿkj,q:p?No ~I9ӎ AYY&i1RIؓ  q< NT 3ۑ ߾ޫBbI[MgNNz8PyJmzQa75k<9DQiʇK{2 ^[cAei)q@4T&$@.>2nnV$b"ڷfmjiT4Bo= ME0TaאT8AFb[`͸Wir·y9l$n _Mi&j@a$VZ1Nd2 9o6gOXmEIE( :%C>Xs\~7Pl4܇86W UOD6f ʗɬ; Z6r+{Mfrːu@{QyECI6!CEI MYovI"%At$"EH*b9L(R>f+P bW\Q"` D+5`FtLVOy\ev㠟#%kX*5e؜EK)º"4~;?Ybccf/7b8 4)/~1,`vƳ41/-By&IwI'~˓{,a(ԁ&i q; O[=:C\%WOW#7)!^ c+Z\xƷ$rl;Tpɓ,ʷ;?X L}Vf!4_Brc5H%ohG/ko܏'{L.~)J+ڶÊY"hr+q46JD+dC.'AW0ڂ2iڔ.R$A B \ Avp3nc2] ZG׭tF"]_n~@zwp~ @tjQ;`81O`U8G4MO'[pj w|Bhiİej^1]v> #TT<:]ccJYjޥ%z EGB4A%f(s)1="5JBte/!];£,??ùhSP-f8O_UXbt;x|QhX9}dxB{NB|W17L\&CF,R18fP2ryYz%F&R$㏠u*7 (-P]-O PŐ'i86䎼IdpKegLcFZ> ꐎi4Ѡ5"â E֪wQ@ K6u{-u3]ukB ţ8hӲd 6ͱssXe/V%UZT*MJ2ĪljD8/YJb j!M%V-jv kR@[)VyijXv:ŰB,z(!R?v[PcT.g4HJOa4i$N]i<^Oj{gcO^mn74N }/JE!BJ7tp[evN(kA\/JΚr"It1Eb'#8,]8=j,/04?&[4Π*u=翼N2}*:(HO82[^vSh}dtCMu k.yDEgm@bKV6}W6 J[Cm4dlmTOC(x2* *"'l0ZMA҉>Hc:mE.7B(,*G cg7B U}XgؼF)qv!%Jföig妊FԜK++"µe(8B5v;ObN)lm=]L,Θ-5YlC!3~Ӌ݊6 P>^Ay(xo=L]~ BFEd܆ҡ6Or6b4|=?Og _}3`U!lFGSN =Np}L36!"g'XK݂&b49\W?E`_P3ḤLW7oKȁLطQ^7hMwZ3E%I"0m8)̗rM2ZGKI(vyNdL]S,o4.W*jN-vOÚZS[頽Vx @#s{yo:9}_ks(_o&8u.x/vW.]V޼t]ri+AX T:X}V sf>x=Pz=ߨ;dBln/x|Hӡ{q եgªc#{~4V0=VXqz]GG,PbF ]-N6Yt/GMܠ 8׈l2mģD4g(4Vtk' ,3UΊ&{Bd&LWuV^)qhܓgP*W)"EHEh;:zP)i2JPa K^HHؤjҤX9$- 1uy=bX-C\ xpJ IaJNS\5QQt ؙ5׃gp "/Ēݠt`SՌ3++/"pUvo8V#I1%A$矟9l%_Z?ߜls%7+qT05Iuƣ[vrj!A*sU8|\* WAx 63Vc^xX 0>W/C>WN%Q7~)aXͪB賱½+{wf!y8'o4e4[1_ӗ_NoWtP_~t;;a?pIݎ) gr_\I3=zɅg"9BZ>8D~^~I 3&(:(&P0(MhmB0ItNjWE&WdzoNd4&I`"" >`|0os`?ul0F06=}l _ܿ${t*e%˜:VoH/,1)N݃8a+l酇qtT~SeQ]Z(n,v J ]%{蟒))HD~M~ vS~ SK JYVeT`WQ,XOPawD/;BAt> odQ[$v 4{G nT3?"[CAt~POTAAܼfPw]mlf e'ST^"?'{UlA T+{Cp+ٴ19t47Yo&%P/6Z3d4S߶NWȯyJ)傲0E(+|.p:0y Ahk?_*4M7c)5UX^9 Ɠ-M?V5_tB=kp)rUq\kTٴ (5ARstkXJ> e2ol6͓MsNY\S҅Z2j蕑G+qdۧ%vhضUv .WT! 8 z]HfO`}W%}XQ}{5B.6pYKlm| J^GЬ[tiI/Orr֭sn)ULU?h/\5GwgRKm\՛EYNIvANcm"!I9vBzTg>k}h)]o*vϓ(i9Tn]:~?S 9_5 ptbH) ]PU,#N!/nψ2n^@g 䜬58 O~ڇYÃ3qK2Mv T|P¥Ng_W@{Z M⦣rrɦΎtq4s@x7C!^-)\E"_~> a'x[.\PǙ9PKi{{!<O~=kv_xkn1W-BK+ ?i}+E[ O^.($=-->c25u1 P)}iW#VBIjGㅒǪ *C2JWO>HU.kqXC˰ >3v@/ZE$q7kw?bM;BS7( d|qXr rs[eXpZjܖ;z._HWsQq\<8|W6s\0gsd5*rAڜ씖N{{V\L9'OTh Z" *6Z(8;0ZiYi1;zu<0.j1S3,/tֺꀖY]@EːՔFVd.tz],R>0.`/IWf_lփzf$#ޚ)ZNh*aax %!?Ob]l/ֿ揪#Y4 DbF<Ôt&}k~vO{QY:#9XT8; }XO9%"YO)%X| OYWvLtbRH(C3GAZF  dn2Gո\iFzbFմZ]\|J6 k)Wa&u/wujFCE7쩯7]`4d ]?]pYxhrhX ZnP xwE`ܫdh._Q8 aKW۝8ZQ'P-(;Tfw A@Fΐ')8N2HXRMK8lStqXM\ ERb$ϴa'a_4tXO[| Q] + :F8%;M!xR !a0=e@EKSmt+4d!]l\,9uإII'zokzFfr QL T9\G",6\lJp%N ;{l27w1Ƒh1ơ^tID1UDﰋZ:* k8 sq[҈8*kǥk6"cͻMRwUb;Ӣh`|j- Uݤ\ ]rS]6.0Lukg%1dMofc\G9_ s8ZZ@|{o7\pU@Uzj"Z'"YDGo AG riewqyOKN1ye5sE <,kl:\v{>J|87SkDgK%'lĒ.\Ƣ7QhT~nIJ;ՠJ5 cw^?u &fX0 DG\;!Vo&r9nlz#u6`ܤ:Xv}ox3 mvz{6D͍ooin#Zazu(95"9" 0'5"mHO- A YǕ!Vr\ފMEƢAE0]Rlj )\9u\ y*Hv YAC5`ݶU p0I3`vjaE:rP+}>Gke ij0YF: wr"bB㾃moѪJ:Jgtfo—B Fn*-/Fr<3{}`# b%s߁pt;t_tUv.X=! 5ěnʼnu|k1:_3I[J sG((q5!֨cZRP!=o|U5HkH:+P"i HOg pG O"e":*|tJ؍ЪJK܏# >h6ZZ0ŷC_ѰV퀭Ma:f阚)'\uSeN VM-<N4u쒭+t$'!$ANH)CǨtU.Y:A/6o,bUX5d/eCZU{&&9Pk.8mj|LJخy^]m MBsv D-C~J)tn3J[h?`#٤w)e6P/oAM)X78H-C&o .6l؉"7bDǍAS=)mA^Lq1ĖrDp7q(6{z!lqhJ I!5Б}-h͟QDRU0кq!5ieV٤>]7u ]}5!YΛ0!Vc,b6th}[I\۔!XHQp/*B8s ( T*.hU[ܽfeE,6bJ鞄7l1Q & )=<7<. -9X>b*7/H.7ȯ*ss7}߯Pꤝ_e$,E ?`9ě8_C\wAL|7iI?J̝˽fҹgc"޼>[ZX艧tySM vuې۴\Q1,?ޔm&JѯKYxHk'/‚vKd&uo+F1oݥ8K"9!GBy4iM$HJ+؇(hz@Uuӏׁ~L "M߸UO χgOŸYH ucJz\ht:lj$5a҇@=A΋7}=f(Gw|UF˼ yQe"x~2f+V~Ukz60;kw(SȳTXe#`4bԫk-G,AF+CrJvT Gl8Z";Q_R2h*ZiEOCg VPl\)θBUеt̆ `BPE*3kEa0t5\^XQ q%x^8BOs#𳏤ѥxfvØ qBU;7MoL)KD⡲^XW_]|Meiv?+[;ZT&%:VS~]ǜQ !pv|Ek*-ep.`xu*qDT _ZgiMg/rt~~jMf\aMgk 5Nt>zbG:V a1,voq#wH+D zai6[ l֔qF%%* 5[Q!饿-E47vZ3n[iq3,-t={ XCa 5Td_q=dqI?=@C&tL*,HoJhOůCdn 7SvE``a='Su :? QCr- /v}-{U2gMN_kayX_Bm8rx:_uWHҽ(\Z\LMQHw9yʴ|V]5Yp<<{)dz6ّ2!-16f[f`͎r(@U>trΟrOY f)\|St 4RPXW'vTp .\ݒΟ<]_U{٪qVebvZ*ͅ|>dɬ&e,MP/6f{4vb"d|* bq!9驫Av@͸a `XOfq'@ 9/)S"SVY!)tƉG!3Ƣ5 cTE,F:*}*B3 򭉀$ǩ0E8I~o5'Jz !.$ ?+nshI9My.Wgd&h7fYZz6vGx|/qC u)=IwM50t/hL*YG >}.hC>R.EI/uI58k[FW( FQӧ\ߧsiEBuC'0QbP|:CrnWүX?M| lUzO _675|x4!-H|jNtm4#9oy u߃>pM+}&נb"#.]rAg;^&CkWoC )B@q)<0y4T/T~tͺbSgkҔ zlcQvCŵ@'ðsֲ6i6D eC#Z/һZ Iߴ80__M9_Cwq$uuawD{K!l?1cVP}=8<#">7 wXl +(1,,ÔPlKoT2?ۥ_, jdh(t\V?A^. V :o9xGh=j|fp>@T( Nd[&?cޟ~{ow?w;DX0>F'. @VX+ogOZ"HB#SE00G*xe .'WBAcq}W@;88J 0ňd:@"#ˢbI{/:-D{1fU E|2)ΥO^W+2 <2)\oK+FG˰7 Y53*dTSEE_1(RCCHlSX 7XZ9gců=|4 T, ie c 50`&9(B)ߗ$>.OzH FRb\a\5jT5;&aoց2r8[-1ޘwG$O]ozX65z C" cBl 31Wd6\xb-#TzǗa LǩJZB_Ċ>JEGlxO6$lMړ*-Y:v#?KUl>l$6,>B^]LQ}u3 ?OH }2}I~s?]kB,JX>+A6o?p# o~-X=P;{Πr)].)?$z(ut e=`)%Bl XRK8k_z_`hlMc':YنI mX.uDAJ2^oxBaJa!&mHTX I\q?<򈎉߃ L!BYe݇x@LHCWP( srg-bK}mPJ6N8 W{_U: ־#?f(x1k\ߓRifL*ʨM}EtU4.$:M+Oe47ڤSxpFs'DXFz0eΡ֣O8bTY3cը}r\b]QF`!hne.ӟ0 .ym=tN5Wa Md,UԈZh5Me+viXR )^"~CZ5n̖n#gC-NvMFlzPA~m`9$tRֽa)k,~ bΊv9X~Z?`=ɟrw*M\I^Eݧt%%X:v"n!Gị0XyXN7O4aiQ ?{y;-_&*iv@h#K.ߵ J +P4;g`\Cm pOξ!V*i.DC:%6G(Eo H!7ZI9 qմ:#]O43+t%{ t\ *%-f~hvoWY(C>w"m#Yzva^v蝯£/+( cw }c %@2{bRf+@/8񷠺Pd$M!|H}q qzwFMCxj.=<z˫iY\+p ;m n?@ز|ap[zΚƣO@St_ئJ=wMb%נeyFD }) 埨<[,}4T57ϱ4$m$9sFgz^$hrE7)xކ|[2qGu7#~#j?P{n*f}[% M=̖[$%3xP ++~4tb+Sp>a6ioI8 `/<p 3uo]ZvOڶ \_ s_|Eڱ}L SYXW]G]iQ:c4 +Bbs ؉U=nYE1([qzcDOu2]_uFaOKcG p^q)#ߋ`Hv4s*b=;0lJzD(v)צ=ӱ74lYTd Kc*^ ۍЫS%Uڠ2<@=ڤl3^Ѭg*ùq25Sa=*p{y 4}䩳zǵ԰xz8'UdR+je.77eȥ4'f=`GvC!7b@b+$yJnN bQqLVmkҚWgB_~u=c]4N=8k/1//wѽ.cIhF ޼FQ:3 G*lwR3 J4WS cmVa m r1٨/|e b5rϷsGL!VNi**Y5yq =Iy*Z҈g*Z# K_"EZ;fkи^I=kGߝ=t!FAH8 `5R3oK?=d `ކB*"r],q_yrIE'A!C1vQo.Ek"Iʏ(]1yD @QBC"r]hĜ' YbSu~vhH1/Җ$+ g n< (dE=΢՚_A^q*BsDH@C{T˾7Q6]B<(1Du>ǰ|)$kٰ>~YQVLSs ]8D> O<2Cjo-.%uFǹݡ.qS˹}|gPҴu9)mD|Dl~c2 $ֳKk jPFD_ox&!j,1fQ|Cf$S_ͣx䔭jOݰBb05ChNsy#xab{ZJ41KDrʋ. 7?j>H>dNuugTcJzAS=`n*w=r*iIa=k<7ؽG ʼnԶ=|Pʑ%-Fë}#2(j*xSNrtM 󵰰-pe[$j> hĈ]ANNd^96*'Kg`Ddr _H}^ Wz=_ OA*B,Q8$BfM^fn{,^*=Ԇ}A e0NkIZ$[U4)z\Oeq/rQZB1ϊI7Yw(yW]](wֳ}Ϲݍ֩vDuPPP d#X5H8/i*1ˀ@ )cRR$9h@|R8w;-II-zAvNC5 _מ(>nTӳf'@:Aft ⁱ Fr]0| xj|l0SR/zŴLy0UW! N'aC*ںAb6^58h 8F+:d&t8$,E/U_ k.L40$F1"X"~p 6 0wcO_q먖-F)ÀGJ!TaŃ8ɢɵα{[R2Ћ2]`ED%kxu'C /GVVhXufjSxoKh)%%6|۷yhZ|X_hcceIQ[HNPƖ[jYԠbXHLySs-&ڋO_u4]U~m7s(1"9 )8v cpE%zB BR!n/IKFpwR]wqu>1Kj^M] pJlRvoU6Ŀz.Lz AT¤GXAkBqGUc]=EK>]x/ucjʅVXC4W7'aAq:S7gʥfQW[TG !m`Nol=X/w05 (<+(v].ʿh#`FzN:WS[Ǟ@֔#9/i|*y,2-$q_̚(Bs@& p'tʼn"n:bݛ1WK0V􈋕Ax.,|HaUPU)Jͣd|ز9(fB-Py9W` ioDi/D-YoHʯ*nam hʅi.yQB) QPYO!eTQ~%WY''*Q bVv`\(4n|Ff!C`VibY{uA6kҳ"{tZpJkHS= h]D$b0bfC|9a0 sL¨)[<}ɋ`59Z!tL2@yR1U|mv{Wqɾn 6 6>D dm9MJ ev`Se=(a„Hs($֫J~5թWʟAr<*kwKkE(7+Nkn"E|:Qrђ0{{@?R8XE sI'"|ъTC-l9 C>A1^\rMIFrZf3fuũZZRZˊPw$!=7@&V{n`\R@+ldsCQ4qT R@0| ݱ"$b& =*fHz!_iۤg젙9dsuu:vNrd3WtA?EX?3+ :Os=H"U\d wqzmrF`y#zs<s>HEV+t#QcfTP,Ey;!C  XOoL[ۡ'cw@aSk,hQ@T[Ω@KЁS,O:/CƅjAUj(z)fQsCS=B>F_>OX:8S{=[2=NE)*uʽXO12ig@6 OA60%tPQ2`3f?Puٲ;$䰞 Sjd_\rNjW{"|=5Q`OwviPtX+9fM&Wxf'8MEA ZyVF[3okջK}f75 4Bv2A! )&-},+uv$7ߐ-9UxrJ (+ B@*W"ow g 7.v`蝆,O/;1|3^WGGj2ObqEp.Q#S$86iTN3+3 o" oCq̯(MU Bp?Ip)V-ډ:9[*~^5}pQw-w&~OkMoz@ْ9&߾Q,Wc)!4В+>V[ط#_Q>R 2Ya/uÎKe!^b'A:=HD8:eO wqjXlё6&~i6t&d[!ǫg<E߂aot3{>ju*6+6Z(ʧ!eI_ Vۉ` nԵ6z錒z=) ڮm= %:Ppu\緯GkB>mwB C \6i[8@*gLsa ȳaXS1!lvoT=,VH 2z۳KB:~t[#|5o4Wrݨ&> VS4B;j0KZK#v":U}Sk$-6@ .g#2A EmfemV/-\I-a׋IsETk6)_@ZJAZ1+( tEXnGU (*qpD:_z%ch X<%r $x_CN2oUG.ڥ1l)iLH;dT(Z{#͒nD󅌯JrO _bCU`.ƇM?5,%(i',Q\;dCH؏pF$ڕIQq (( ÑJ󣊦Q{|&׵sί/~yFLbҘaҏ21OpόeF31u:'3)8AuE?%Hz}n<PeΠҧ(Uq/n vQk2$A"!ϗpH|6~ȉ|}JZQgXFQcT͐+8r{rU :,m[,mY`misWn~T*cighL ~HQ1 Lv!S &$?Fn U-O[mPr!j=51%/93;H͊*RHKwwy{K5Fv.{h O(jw1EjLQ0T9P9!=lq]`5̠8e+@0tA|($/Ǽa.SzNHC9pAs zq*$HB̎bA S 'I1Pad F7xc+Yj˺c3nV7!d8zenU:Nlo0A]F 9by\#Mn!\>&w!^Ȼ"np.t._rg.\.*]؊v \&bf3z#s}[cFq`9!d6+>']AGLŏppєњ4+ /hd_F7И] rFr5zMX\H'W.k*e]Ā 8Cg mlȖ~҇ yb+ҳel]{t=<,$ ɿ?$( '~[˸)/]&L&ž1b[ R^ub|( IkW6(Hu!"պ~uMv(@hs)y-ҹ^ܫER=)b%@C'**4lA֏L, J@Ї&NEp>h~vIOSԸ7 y Chմ`X|M܏•7XcE%j t0+6 ˇz"|UiEglKͩɆF>)ܸ:ъ b܇`EOLԒ3k4pHn=9"Nt*ҽF7אwr\*(Dn%P֛3(rֻ5Pt',&1ǀ$S5y](Xa(]K:~`-jB!紐_/^w޿*-y*x_b$ A7<eSmt#5AZ9]oB葔Uygk&suUk,R-f6$Dx`LF0FzVMsS<RIkEVG2P:$Fi.=ԁ i-},QB1lbNڰAOW. ˙MW&MuೇfjǬ̇\yZ!*+gxNt 7נ&PsDoMXOrM? SMw f.qZ gf6~@ڼ uƙYO.ޡϘш4X vž$n:vyIS$GsS*ZewLC0,2|C5_ɇЩ6/ S{U|2XO9F`(5aW={Iv";wMGB [6!򿐙xA+J6C 6&bXO 3vc[1B-_,%@  ||.(ȑӀ4|9,-T͚y충Y}%;rm4*OAA-% s]RL&# + Ovu¨//!o#5{p0< Ojy;G͡xFU.ߟ*^~#8sïjh!σ _^E\+7aPx 3c_|@BY>qUwUZ`ًQGa ^#Tl/m筟- ֻo.Nn2+m 4 ${jCP%-Y ܕG&s))ˤ y҇ǵ3fp,Lu}'[A2^䱁hdx!ĭ ? Tr6E)OҤIf7%2 XOm"}3ZtA&y3"B? =*[!wj(ȁ]o 9"IJ򚮪HNQjߘ7)C]چBd$ٞ 1n ht$`=(~ءUe7uD%BʕߧW䶮6崅D9Э託HCorsEQ?:2\-|J)F$h4 >qpi$8$ᒱ #h\G $la!s7`GHmч$67#ڡ%+ 0&#K\O7XAf$FvHXzS;Bl^<#A8QU+bVC]KzY7rC({(T$XJn5Ei3;БBs])g;S8'dw9s(pX#I!v@'"FZvGu|ٯAĿjƮ)A?$P:z.& BԼv q^H:&K?1WpM .kMz67PKArX* &]\Hk=a6>kI:H;=|f/CQO!U~;`=nEeؤ4F@7Y验A]N6swZ~tؙ*v~N"Y.?}l?6v+vǏ5_[O[z e~BQx3 +嵪P c 8QS;73^ ] 5 %kPm|b~hYdXwW_0XIn&%R8J!Bj`;jzt(UZMSΨ_p9YIJ4R>f"T8bs { U:tJĨN(wcJP|M&7zs`S^)X [)=2|ŪaX~Gu :K2B]vw{JڻV)XV3W+aŠ\+L-?}iT ]|ZC| 2YVm97H+ؿHZ2:0w-.$]ؓ?Xq(gE7v'XA)r~ß+dt+_oabrӟl]]:k]s-e]Ų7uMB]]"a+r_:;!8 yx=׾ӱk wggD$JZ{h_ [ n#nI}vo]:>M]W= XeU}:ojuf zvNaT,p$_ժ>px.fHnB)0eKޢdm5ei?2 YϣYx`!%F?h%I JT IJKS-=HW o,+aQ:VXe[8AKu[+,yV!{]~GqH4,*AzkݑO̩+$'!!=Zk#;I}F6BMlFh( &i#+I7*CVB+ͪо)ȹtҀM"LސfAe7C&[}-F椢Txqtca,UǪL*,Q?mqDE FIg H0]4<"' ㈬qUM^6 4]ك%Έ֎ >W% zڇY\^daՇILFtoB$՜e=o *jyU75a9t-5!I .[{wBN?g>tm6@>UiO3uV,e-,Ϡl𡛼Pa"'dk3{]Ȋq1Pe(fP/r:$ڛMoɵڠƚ28PKt1V=CѰk(Eډ S.,7T_ܺ0,hJHɞ^eH4.7 č6U9*'̩ne\60$ԣh1B puy eh ùyudZ^H 1֓vJ:owQXQ,EMD$2Vٲd$.=Ef xL ^$`(C_8.o߄Cp+ N`XXd!4x5+] d4W ڗȦ,vĿYk,׸t +F[2S4iˮ;I./ר@`^t{{$_{*l҄sVFމ%~>5:A2\4d ~~ x|U_K\2+Ǹ&Yu W8ͷ<VpieT 5 ^Fv\n|RJ|`ײjn(]v5J_|" ?úz\¨`t~$kƹ^o[Qf>-D GnDMTj20 @ŭDѮE~t3 ׼߂@ k:2Vퟣ.0kLJWD#/ƾa4LN .n[X}!j+QO ٜЪ̭03mZUKc9mdDYHvNx!5܂ﲪC M;[ 7?A5v>6 0G%f"qVbƸm6fxl\-OV{g)*Ar Q٥p9d!]O =?G=d;GQm ɓSYsjk~zP|B.26MBKTgda`*g/-0LҹPz\ջAAru '!5Btq8GH z3AY30pLcx%YM =_]N ^9> k : ;I^YUj6T%NN(OMct[#0m՛eT/*U^׳!aH>3ȡ.X;\f25՞F)",$9H$ԣ(+WokQBX2 ȚU຿KӪq) -RVxu͐=y|JjFk>uC~p PeS&`\~nԔGds.M/O m]BAoLBdťPz^>Ȁ;"+H}|*Wb Ԯ*f瑂ngB-F1HGͪd |GL{AyxQ0Av*6 ͧ7Ju@T586ڧ񴄚ֶxT^0xNB7g\$ť yշN_2ߞ[x{?Pp+ P}WюGZHc:~]7fU9f8ӧ̑0]>B8BW[yW,4et0 .:O_Eth>H]5|@;+kyl?NF0nWvea8d j60AWw[r!r=[t.IGvA0܌`A؀w:n8GG/lۨt GUM]ReGK^n8%)6U㭬H&z$SOx–NmW*sAFU*Uk.θ_@eb$AasF-aK4L5ԤZw𭩢9#[ABjaS̉p>7g<NSj]>}J }ZvOSRGvji;-=Ԋ Q6/M=Vu_ c|C2#ыxTECk,6X)0k!`džޠӣ'2wxJM Xߤ-~nNZ,n@m*ðag!l)Pn=*gjDfōD~oAF_~} pUaE7X{)GuDZMyJE/8'Ol+2e(s-1]ڱ`=%8oe"L[a9qhvKc_+`0އ`Y\넝lHmy5} +CS+H9m&jp١(Q>T_-U#G5[~5whwã]73cd4L<e^pg Cժ8WCjx$&孰5X&r.,ZNޤ{8UUJЭUh.<^]a.,I۸d5dM=p5O玵%<-g#L -lFIQuUyVqq d5'?B-ǮK![)EW>܍XS ni0bGPf,zs6tO]P3n RZHd|Kgu9S?Jȃ(;wV?wI%I:F IS;:XpGzVA 2sUWSvv\C3ʻ0w@"VQsBu]d/n4gU~D5\}y ]2qSmΣDnὪ_{+O}n++Xe/踿EcO|XA;u"0,~bL1C3'˘Ƥk>^)Z!ej %/|H.c#zԜpX*3)b7'ë5&5>"vBښ1M׺H]E]׺HG{~g9*ij33 ?)ȩ040&Uv&4!RIdZܣ^'\qe[POC>B_łѢݴʁPe-#1 3^gUQ@"+aM܈d+(^9g`Q\aq5+(^C\{H[cLc-[D[kƙ)Q" (#sQz߂]2{~=c=/f'A᜿/q򷺖db/-ߋ 6;7܈o(!QKE vJ_yA(I(+K eCʽ- h+K5O 7vgz0 IŦm$}RhMxnbןny0vKE HmŶTOB<m&w@%"(:ɲxȂZxsWJ-o@ 6esIl)gih|D?UxkL Iz{1ID ԽU7 GW=y*a{% ,~"% |9A` u, #!;U ACTj͸WE5xk1˛r¡}!΃nDpPsdn3?p/BVG- D4ZZVW2)}&1>gy5 XKBcf7n~ߘO9EU=xW( 9O#*{]u襓JٸUN6LѶ/TOTEV_@$~OJGI@i6&S1'sȚŴV$DDL26&hE/КʟNJC&S~(I\EO<>񔃦ALG(7$_EϖtOWsVX_C]YfrqB@aQTv*uf@83h2V!39g^e(4+2&&Q2X *lddb| Yf5,։4˪tfeX&X cWלęrR:Ӻ$R-) #q)S뙒m׏ˈqE1 z_)Sdc@a.!$ag}BǕ^7+4+Wۮxm b:~L䢨xM~%d$4 @,*d}]ݟ:rx 5d|.^w3d M"K `- `j+k-`7w-7ƒ${# 8# 4R+~@)^edM(Q4nBtUnOz]#T'Rtf0;X)M52㴦2GĘ,MOHi^4 6^W<5RĄ4FGб J7XL@<5ă0gCxxkKx'5QBdMFQT 'DL%BSW:]}ZeUc!NBgK-tPtkJhDLaǼy|{OXlk ,H]!s&wOw 5X1Ȟw\cKX:S5vHpUB\K7 >I(>chf$[Cgk$\*9> JυXY 1K3 Ep{Y"ڋ4W>XXɠ't\R'NJkrWZ{FHb:XE[FwBkIH E'\Xf45ѵ;`O7D60BV.fX[.UV`pOA"#4^%i"-T6Q(~l}h8EVX ҧ22KxlD#Y }jk$ebUc5a!SHWVV_A\3C-D:䭐0;mZ7Θ16GI& l-@KCKċE o _1|%cj1e@+rKv_|zNi\(\$@#'שVEMj)m)mjq(1Ra)N@R$=!z5K{Ѥ'ЎSʈ,,2Ĕ bJRƴ&QME¾LM5!x#VU2.RmH!;s7L5`sBP.= j,/6kX"Hwd\63+HEͼt%t2Wl7L߮el[C.14 M`rΆvNFkb5:ƍ5pW"|;' ,:T.e@TY01?'Ǹ aָXۃeWg\vu^"܅}}ZrlThG lĽؐpN8_q Ţ/. }=h>sggO 2wJǮ̱nЧhԕǡWS^r\ďFu5v&GQ+ƉƊi T>_㵧R/vTJ{2`.B̭!b =#1`ʜT~!6/d7!RgHIK 3gL4s*q=+-}q߼a,_5he9,;%CjM{F. D#@"}-,}D\Cפqa&P?Zvnm.5Xhx>z:ĸv@[_c"aZ;9 HE=\\^$VOpA6SEc6 ١DKxc!Z/9gOiW$42G;r'Eb}SB9ζio& )G{gHվA _TR9|n].TdH;Y0k RPhC"gulfUzFzOybeG6QJ|#ưPOq!l^hq̂oa SH"eq}YYA"!9,I(X]%Lr =;E+Ske3u%>1atb"X~<`f)]_[Gusb?GbO8-"1\P5+DQعYݺd9 |xR֩R`ϑH HkDef!ОL,9,ms_Mr" _m5ˀV+^89 ɵOBPdps"tk)"} EDQ* WB0̇v؏Џ 4 澮@ 5|Foˮ# ];\^4ր3u u7F4stVEOsxGg^=tή&`[!:gUsM%r!mQ)}g !*E~^'nUIIE- z4MDqEveevkkVg~MKP22y!Q wf2U#OqYyC"Qfu>Τaq 2u(W;K> KYĹ RkM8_8w|r⬆ߝ8_(XZۿ@-ll g)6@9 ZTX8t]:Pdtv7ܮ>;:iȿ_8sl=}m?16ime6=@;}Q:YËWv{fdPλz q(,3U>|9~$|*e}l 4?6 ifڻ|p7wVFvEUxá) VLn{3߫|)sON4;}wj 4V}艔ҭb5/_2n][^ʌ;$Ck)3͛.gyNKK_J^Β]žKQmL~?K{(dCz{نK-~=(eDϑkb#G*:By,8GM!eJŵn.J}m~c[Ebqź1R?^$_ں"[gpIE2e[ S=/NM+Mc''/D a>w]"I߉\Kؾwr9+2Y/M+eJIdE@_Jx‰j!|mxw59m8CX+/K^9e9229h6SX2q7B_HB˩=QiYtq{~H˨?}\nڡ82]jn`>?`ٸ"u_xx훐wR&xvx2B` )S/H<9heKR\bxRzN~MVʨgWJ qWHUݽ6Bk |-BF7z˙֧gaOKNW >kUA߬W &m/^2͉qˮ<]Y!:箒|Kgџ_%w?Ys4lpMKGvŦD.?e˥Dyja?ːH۹8)ƍ^IdMW=\ג+QIDyGsD䦉y2)4)w2cS}⏸j?qudVG:C{ׯLz<׃׷'RȽq{ #RH[+1*Luc^3"8w׍>n{50@T=~s?EПցKNoFR=63lFs ^v8d=m>Inmn$~(,<ݏL9~+<-&pc?N +޲dADzC|W˙Rue.)ße#SI^dj!h M>'ZNKK%C_{?:8H4bî}n,x8Y@t OS[He@{4+LMq˞)6584ʓ|g;ib}M:C677nwraY)SNr8836ۦdN: jГٿlWDxQ0kI'a6IW=^K=H8ky[zPgAWW3.%v0魛ȓmr.3N;#Wc ;}l=[=Ǣ ]ztq^_GZ"=I~&f_U?8c:i}rt[@m-vf'V?NVy@ۋݛ?F|@izG> +vw~k5gv ^dƨ e=K2H/Z} 2g3$E~f7 |2Io~/X8Lsi$B` 󷞟CBTJz_;mlmРǞĭ&Xo7InZwpCg(o.)#T 껣+wYrREGm9S.do lML&=Y/Y i .* U%ɺ_u4x6͟n o:;l ~B~]@;U, 9k#Ks_ڌGZZm'Ҿ!c?mVUr#C&?zv-!>]=Yr΃$Zz2c_搼+.|;0?6t3V<')j̉u&m<}4%)NyKZp+'Keg+RƔ =?BǙ!ψESs-;{2vg=<_Y6}2V] +m C1{Ϋ|-8:;Og+ _3b^Ix+KW^AKjm_߽2sOoLoE>T=k+N|c ?x(Z#^7Iꣷ/2QD~3u+9ݜI<=[G2d|Z>1|?\WjUǕdN蒡%"[Y.5q8ۿMޅ,ѴSVůDEOtDյG=Y\_XMZ{2+.DD#ߵX ~>uΪ<2ihWan5<,d[~T>y}¶X؜' -i[>mW@˸0m26mfD3e5Gwɛel6Yrz+=t꺴|giVc{XCʅ=7 &-$;b|GO7ok>}TQ<דLt,Г׺w@ΑávboƆ<=)\cSvXӓ:$>~'=ޜ>IQ\IOD4_ܠ'O~U ? FOzUk=I1ҭ95qXVjRO6s]'ؑ䇟~Ų4ʛХ<=)s~_+jU xq ֮'7>kVUW2>' +YN:yD'Yi#.$MC\7夃Azzzt|$:xnf:ް]d{dxM&wz۶zșdt6{Gѕ9zfeMI)vdIZOn':qEҝLzᴂRּ8}ݫq/ =>\@*z~:Q@H H^0~pOG HgGxrlowK ϝ=.  ٲ"]:Q^@N- + &.Z@zUrhVydغ/~)#M>בûUZ囏^֑|=:WEno#C&G=D:2o&C+zw8 פo<&zozM$xMϋ;|V=*ZK/tGK~b9'M&.[4<9ߛ~F6T3b=aҫ\R]\&uŋֹd!ا$̐O@ƒk#;1\B> 9ztmgy%/0;lfez,ҵݥWc3o{XX]S'sH@Դs%s6! uavwRaZйIpov dFqO6+6dF Aoo0 7ˮ˧e9b 'I 1=wetޕo1=q\t_oAV[S_!9?:%PuTs>:mUgTun^Gչ/ΤO:!gr<_UaUQʼnI(2VN{Uqfb9 **4A JDԴUfF'tmm{cݦX d{FRݦn7QxFv< G̈PƀTZm BEu *JC)60_}PaR%*-q ҔU K\M2Cu놠wmGݐd,t=q2v}>|aƄ?*0"< jIRp`F 0N݌i7T8*:JԏK_}}⪠tm@A0o 1" Q"JCOM~8H`%0&cQEMAO?3r}zSuMP&(4CY@^@Q<˨,׆7 FE"@גp,CB$b_}CՇG|MGCK]w\,-(Ru k/gQXXĎȊ8eA "ˡXv ""›wLB\e^܀^fϦ(>RQc̿};wc(8$gK]1y'i~to(!u.2O7j2 Ҥ|I(|Tvv?\KwblK? %˧{R覒0Gv v1ײc2ؕvXWUea2- ݇} ŘM̅1"w=^2ߥ3`Z22If*=ȫF;&v] OII=&ީѧ,Dϝ0T^:*_#:> X)A\&Ց}|61"οm8m''`AgbuTB>M{GQ(G99='G Wa.PsZI{sr]S| /~k WV2@Z^蟓lxCE~92_;+Gj'/'>c*6GN&[/tQTiPm2%ҒoK6:W |;u2zຼy1ydOڰ7+)633[t ƚ _R>mA>Ǯ|:*zMD/,# y+9U2os}qX^7Tm?#d? ,'!3~?X邌6ci\%E *^)6~OvՍ#RgxlgRx]8LX|oFwq.K'*w0勡*'ICO2ɴ?I <R' d*?_@~IF'PA# _/nKFLh^[Rynj FFc)223hTR+!kmix3!nG&6,XEMuT>EGTBIZ$2VA`#*MW^wʤT^ ~5bAC1$ ܟիr/!f=ʾ!m)L3ǷJЕ}ߡG)j|Nx%974#@651uQ^e[ tH.?~R OS8Gʢp!5(fԇ 5#37. W٩PoCB>7b-j X*g63r+[Wi0ȌGQ2lXwlum:I%wվ@3%=#\H:)u}g'YJ.3"Bo$~RNpH"yǔ"΍q>v)kcFE›:ͥ(\4`ԫT 0fQ{Đ^l{ @XqxW>t&8dZRu6i捚_ށϭ!u6ョ ~s_O,}`Ί1NLnݹ UZ࠱c/$7-+i6HS=aC"1n_aڠ"ZRɏž Sm_OTw͒-ď%s{n1+wM/gC4wOR)N[ۏ.Hw:.94G}ww PH|[聾5cK<O:w\hsmoݛۭ%v"cp½SF !ʄG%)\yl] z9]lF]-=;_gZE+܀Hk]ir+h4oaN1l4!wשS;TYt:Ko U'zxuDG\n7+׆"›of+Ts;=GIGrKQuc*U*r/J;[[(RN-(|ڔ+/6ne2>\F.Ḛti >"smznn>^JLhj ojޟI޺VDF@3b@TVo>(ŵj^8o- zp6b=toU]8`? QBU:?+Vf*X&w~u t=Shj%)Zn@2-2ԧ(ѣdmANcBLw&N mGM߇5y)R}b-+ť+ cnJ8Ӆ>iM΅/Nr6ӭUQ}^<2'բ >M+< ѝX?F~GK;8{cYL@sFc1?{Y.~SY|n+͟S Y ty<`]YD6k&?g{3{ T?/yn󡈞'l8YzշzaE1O5Cߤ`Ƞ񿜪 n<@7}ap6tm~OuxsjBNZx%5J. D5p_WdF0%R҉=)J 6W 3YW" Hy0K{M[ ]OSm !|Tö1\b{pY .hF$03uhcNfnftףFZ;[M '^xKg૊PeSdKǛT߂fz|9nðy/ F3.;0D7mxIwV^|jpï;|[J}E='  FN@B[N~f8u)/Y/?b2n.Pn& ԜSG嗛bƍh%a3[ڻꯡ Rx}+<5n5-FZaFMF{a }mU~ =ʔ@.v(η굮ɿ[m/%pӖVObYyu%Nk~N`¨iz}Kaq M<ɞРQ(-^sz4uH~%K!p$WR2uAeƠFt6U=bab6>d`]8l4=U W6ZBsl+ɒk?e q!_<6qT6fQ#Flt[,FAelte~'Qܗ+.P(~YB6lvgBŝFlxQºl_F`FAq;*ݿevG4mi4Awme7}u9~m sat}.[\&L+dWEc{2{qitG{oqο/xU{1_\~#:kh}sߜ횧yxb.RLO{UҭI@(P-d L0MT3"3fŦ(Q$%ooι<yƷZjW{Z]j%ϜKdщII2gc?Gxw4o-G`Jk~ǥ#8-GM9Ǎ1f.#0w #p;Ə@8i6|3G`* FF` G G` F(?y##r@j$q+s(, ǂwu*uw /MhΔ1 Gg {.y;am%,\ df('rA"Z܅^>ӫ\xlNEAسg gJ}2?ʑ}Sadi7vƭ.Mx`ՃlkG*T#Ί_?E4a멊z`1) 4~Ttg RWQٟ}+}K54l:9z[И¦@cA!jdmo/ՁM凷}>naPsV:\mAӼp4DXD|?5$3Z9~ŁF^DzE]ч|!- h #02ӊBl(%>>iEͲy,2U[f|UYhUQpP4b2 \LTe@ٜpF^Z9&N^aUs-@8l/ PtpZ<.[-D==1]"zJ >Nr{MB_P:w|Ż<ݿrpDZRI;YN,EJsU;1DLAh:^ f BՀāpD4|JqSϯF*݉ÏB[*tkev6l7itȬ%+uٴB^~J&'K4"jYa9, !{FU JKûZХ J/_^?U7x+/pSq~no{B"MiFřF~g| ZCv;`kyE~k s'Бp\O~ }dɢ9dEPyE⋨@D+2[)4zއ#(7QPV%k%p*X4w0ֈOuN/}.;?žN~ӣ3mn Ga=;=i+=(%נr!M }xB~4,l,2NͅfS+"P\ N6_QEMdϩħhG]"#Tz@+dRL]Y}hΜ>fĸz{4Ah?d Uy瑙e" ֮[t|F4^9)OI_|G<+[%cdxfG~)x.[߾'}?Y *=pT@& oju؁"D׆6\D)!pG1obXLR ԇŨs>W辋})z8#}B_q"hZ5=A pW1/̔'!xA$BhX8cBܮoh)8ȓ/+Bo_W1ւ%OCC͍Q*/%FB E⅂*!Ae9VGޯ ~云3 7ӞF.NB!14 B\%\FgX8"R`Ynvݡ (ϕdL˘Kz%ڜp!x:|%)oCOݼNE}m򏋠n~?a|U ?+a_[AF=`/_Г)zߝOcqñ%|0Ap/|; #(G&q/# c~$|d%HpL5‰ےz%'D?7$w#p #~>r񑵖 cOc?:AzO5M`ߟ#,aG/?&|]#ΟLgT!yoyt771[įDxoᇛ;'E?f.I'~8~·\CpAcOp RN,#1?Fa}$rD.GGa?PC?$ ?s;Ac9y/?Ws(tW.LenCzi0#'='eKWYjÜ5I(?kպ;K#aɊ Lqإ(ewc67푘 CG9?z`]UUԸJq(rϬ~fr]87ySg'WEQv.;Cɚg{$>f>CD_ؿf\|˱d*W@ťh9U3MȠ l8 ?4G7[1-zuۧ*-h'UԥkO[ )}w">[4ɋuS /YePV·KȞTfqBU1X]G~(1]}-s¯|ꬷ,RBn9x؞M^`N;[z n7yKn;`k_f}jW=||U"ķ q,OԧĠyD Iִ7D+ +|J ohSSR`Ge^C%++@+Ԣygh}X*P7~3\C-#l:c_TJ̏PY׿}kĕPXVaj+|}|K6T No֟ϠZw\5%־Q~95`|6hn\_J95 }ܷecxni ԂŢ1ΣmZ1Y rCƿS5lױj5cͩxKX E񶘘SiwV~Q,U{QvO= #Mcwxkj,Ӈ] Ƽ)ϧ*aא9U#MUΙ\ CDqH.~FT,Pc/ʦǠ~9?J1{XX霕M \WƵbfS+Iˠ.ueS˛%q t}fa^;x<+d@휙o2FkgKHjGD)4et-M1bɖB])-cPQ#N@+PT1K:lrV14hM j_EĽa ]YY,eڗ\/D4~8]t+qڵiq+ /~gJ!Ef+0g3cQDA^?g{;\{=\cY4%9/|~%MլTY5޳NAw/yX*4 R2Cü19T 6ɷ{5[/ EzTSPK:ܿszaC 'G`n]; vl'FO-N 6l$@  %XC' V@=J |G` ,$X@-7 &G_|N%C>YseHI"ȕ&rLAdr% E+A)DNI"'rLAdrE E; 2 R"DNI"&rLAdr E+@)_~_?VTyAd촨6t9c WPϛ7uRZVXzV[PVҫD+v}xzc{I_|Wɕ vV{y+4Z=߲=w5?%xׁ F'h a&l,g#=sAw3{ZM`%;h2 >)W+no=߷ ?_T.>o`qkR)w[~ocK/ح&G _?)~@{zak=jc{7 *r 1X3ov<.Z[*Ln=^y+yx&οeh X 4>g-rMC4} fB՝OԊu ?!Kh8S3ix&x)5qEi.0y=olW;qn~BK\ٶ{@qr9`'g~F<ػFvDFν@9!ur C@ӛx>i:(9s!p/ =hw,ލ?$燴ѭ"V5ow@&M5 9J~ވyk0`+;)沊{9cp5Ud52Yi^8X ]O  C+#@hR+nd|^?&}7$P:~)+gM2OXnCtz0X1@ʫ==-+kU|qXd tjbSZ4<ϟyw@WE'*eaA3v[Dި/ RK U8XQy BI~Im\'>Y w+ viX7Sx}M0LEL^%nBz^DMAј0l󁸾SN|wO?V';g% /OKN@I;&ZQQp{:w/6|lK2v=xXa=̘y5ᒋ87zCʰ +e'.`f2慮oxÏ}=7}7ȥwmHK.7i1/GsVxKK37 jo3|Yzf+FȕI_ڭ5 W{^zM`m[%LS<6 _x&|ExAoRCxO1vO_0׳֥n{_ʘWװvbDž/i*=1a6/u0pQ3d{{Nٖ'xc{z~%R<`ۛӥo ;w/Xu=;_?sԸU0;V|9z|fnX ||iiŝnPQ[LJ!{8j'&]rPڹ<-gaEIۆpy 680W?+>i<2بdtYA\z<&ݷx`.CǹG5)+>$܂3'zs 7#ܔ3!z 7&|&DπG4OM%\pmOi>p5'=LǓ|cኄ+.Gd RK|8ᢄ"DႄSzC|dOx^> "k'z$߉7Lx $WOx5$_5Dx$zDw|Dߒ|D5Is=%<=l|YD!G]w"&7HD*W .t/~D/~dK$$IcD( O <<%:Kȼ$:B$eGa>F1,E~<{ ?CQng~Nh^`{L>W*Q8'!-הbZy[S*_귰d-}xɲ,rhG SZgSd[xl;?1%.brϦm ioS0vÒL#V&M_[:;OP+dae5eYB`rg90𻱭ۻB0|AI +bY;xZt({\0VM̲W]?ԉq\QP߿s2%tl֦{>)ZeLʧ_ >tm+MJW;iMSlϼ͠_]M4XSNF .X;M ܖz\+@/aJoc#Ot*%tZEBp>Mʀ]ƹPb?W"=ؾ&Ȃ^Vj* ɭ=B8A,{Ki:&3@۰ ;* 5*৻+UzMʃܹN11/TUS䞷nR~B|TW/Tg< xx=LPkMlXkov"h͵cHR9(N[JKSYL:.bo ߦiJ`Qgcp@\%`0=ˎE9<c)+WXaXp˥Wr#q@^Z_ט5x:lV8&}}åHc,hW ѥSzNx0>=feuCa8L{Nog?=C=TBlu媂>s*.W5XϺg^=_t(-@Y}ޯ-%v|f]bV5V-FjkW&g’4v :'ҟŚ Vv~,Ifa&+'w:왼KC?SuЩTJ6O+yn:R ) s:0)ڹ?X@09e`64@N zqL `lRk/[,32z!O W+A*(G_G-)J!<\sx!%LY`}'] -N(2$ޮʸ7zR(Mײ1(S}!g@^8\ʱ1Ek.@ V1P=*-Y:{inL"\r$e?B!o^$GQ)BçJ1Z>!6ЋUPGOW5<X.bM.GQ* `GXﰿtS_CU* f-W;ݷTSLEdOy%$]%U(T,>u7ʪ<\Fק]**oS3aU>Mz2Ow(r5at |)o$C/rYvMw}={9(`ԓvTΏ>,b<F( 9StHX6{Xz>jSZ=^s,luKs,# B n7GB'-CRqe`';7M(IClf=HËC p}*4=sY!ڿ]Y-'+a3R~| om1sjI[sSU@J7}Tg~iq]p%R?:Q e.8F_Z8>~1Qu̼sؿH%y8d>pzNWg  SVmr۳K|xwP1bÓAtZT`y.)5T2c$SMTEaKGǴf8 ܱA(ظlW-zx",mq9W+.|"le7 G0?)#PG"WaVxeqO?`Z;sg\Լ2:VU!}S1kƴ--.%<||;Oj_{g;{4nw('_p!=':xטk`ysc>x@_x,;FU_!s2{ҘY{| s<>}7oacm1iHG#źf8YRp{3}n1ubgo 9I瞿L6^' avqxZ=?5;B{95֕u=]ER3 (wwS47Tj`guX7'HobNh WWoge3Y#Vdz8xhtFhtgו͠ͱʷ+''F׸N铢ק}G%|'!]^a/s.b7]&NR|k6p@N_Ushܸ yuOr06}-W)H7i*Urgtc\zJ8oəMrenGX9-K/8{jp./zcx8 DxKI1wenB{PtVepY3.+o6 V\ǎ ic |^|>͏ 6 P Sǩ[}[6V]86?n+E޶DeDt<ϳHm 9L춂k_Ld,v$)UMJ qw[=tƚ1Konh{>Hms>;7m/ҷQȮml-0{8m 0Ѽ0׃q}1m`" l~6yӢ=v+#knY˓8m#PTwbL>m"88Q"v#ر$o;yq?$3.޶.tvrsbHvPL[U[J83Sl~v,f|4#}avp~iYyl~\vP:B 7weH9ܰxKg4ðnwrߘCwtّu2q,XeU,5G-W"7:[8qx*+֖DIx2uI//͏3ʉa( }.}'ٺtNt@ys .N˽06?q'(`ޝlpT~ vĬ/=BwVτs3>.I$Nq'~^ǡU`fKtNPV,~rcJ]ht.pqKŖ9:c8ϔMH~TE`$Ћ@ʩIc$_@W]\氉  n`]LfWxT+ ~rI;ʎ ww!9GjOXu6ql-:.r7O~2{eRnޢ8`1 Ks?{7\dʎ<ط dt{B0v@X)۰2#J ]4`'ͬ0]IpÍ}t0#IeHQnRw%ڗ!?IG>V0r1*v_h, w>l?du&>?NS" =D4mh8{JFJ}њwl~^d9(sa}@Ck/t>8^ w/̲sZO`;q@aND|Qq/sAp05< :s?0zzQLߓ U{W`@y?8^q@!uW?xY^dHO`([myGqAXj7gO26?8UTzh~fu}Jfqhy'AP/#=̮9دd/u 3}Ou.LeJT݅ I+sV7Ǚml c._e#jL'Ӄ-qq1Czˆ}͏ġ5 d?Y,Q=O/[qLǥ)wYS;N9ǩLV g$FRg 9q=͔F @!;5;zg&0{.0'PeցF݋àd#taptJXTvWM0.wh zd޿4dViZ<`/%qy l^mICr}hU(4&MXnwhZn 4p"ۯs1qp^1 mv., ߂sEv# 8wf7 Ko??oj5[Sk5ƿF~Zk>o[_8oyk5 mH&Pykwgkioۿa}__^<Úw)AAͥԓ΂Z/Щ@ܡjH,A6S>(N;oO)]>deaʊtB*B?k~_VG>"!$)lj v` кUV=7Zdg~'\\D-T#KgF }&, j(ǝNX;zu!mIMkדflvt+ԍ.Aڱ_B)az DpJ(U7ܗ1I}ԺQ? ( 4TԲstv#T>d:jgU7YnTC{1v]pbʰ}ϰ df`ˢINg%J4c8]݈6+sv8틶>Uw(nY{u=? Co,r{]WGmVȍ^+܍gMz h&^x- }iy+?^EI]}k[E"{8lP~ap`NoGD<܁~ɑ@qꐏg*BNDZLsTXq}3FLWMB/#͂>~e~aLg.ܔXi 1+ؑVG : :f.z /8Sq8Y 6/;~4s-8-^fLX4Q]!tߓX 1Pv٭c$ڤGFfFp/zŪ~I㙓dJ]#LI_2!{G񪻦'#Ս?MvjT5 ղ-ˠ19 )ZT:{ Ai~l?\kVw)_\/zg6v>_46̀XR_1o&\p`P vMS 2H9SJW{6t0N50rތpB0g= :<ugSCFV:KdDG^b}5Xz4v3ϩLE/J) N`iŒ[, L~BWP6Һ(ܚe۾Gμ~4+P'+8dcGOC'ٕ.5D~rg_YWޛ˫iZgl$-:sL/Ir\RC!,=l3d^sCT/()6~ 5짛&_GĴ;"\||H+O[4ٖVyir@oX\N=$dNwI(H˛n* 8<"LY0Hs i& :}69\x'5aJ)!(,_}I]eFBF;gA ?G]ƨr41Sߺ;gUVҧά;#VJz|f `䯜`,30 `/__e7']!"BMF[͎W{k㵿#͉zGSct H.:NԶk yARLvoZ{a]fț.OqgJmS+mQiurQPjex@/>9nv!~ᅓS6rxZX;XB$d*pデAqM{}G_3lYW䦧,;nta@Һp" Z,:L$103x)UdD)RCgvjGW'=kvlԛ*wQ2M^/zNة'E! \ vp(z`~F1qm2rB_/Y]ŏEw']T탫ʾ%lgoR}Yޞ=_I~ ' Ũs)ae [FjpMmȹ=)z9E/kW:% jF]sx(bTk# Α-wG]o="A I \'Iݸr7gip6+K Sj6GB# 9kEC$ ?E\p찯m&p1PYi%rBfF{eUqW~ZpgN>" ;ݪb@%W ݞBv{ywR*9+5}` z]M1]D1K/?0k'nzfƕ۹v a4]~L=bꅳ`qyl/f<4y O[=X.E|M_v~fԺ9N啃c!(-[4I,U›hн2TH} I'MBm}rb7m{04ufΉmgΓbS9[$L'9?pƍ|&=x 2| .{qmKçGAJW{&f||GMyZ[O^s~cz5N&[^O2R<`=cV=[I)%1 I__`ޓ_<K X//`$e</@| |,"|i_ EXKb X//`_4o@7}# |H},7o|i7?)`H?`)`H`Iϰ+bY_1,/ؾK/ؾX 1/(B 1}Aa';%~Fo(bQ~KfabS>Xc }Lab)l@I?P@(X?P, ߡbPؿCw(ߡX;w?bQF(?Xg%Ka$%?Ia$⟤bOR?I')L|)YD,x A`h]zGsYNEtj1+~[.+*$ o1Q ^"}h7 D̝{Qċ>ёG eOP:^>+͙;w2DpTW/9Pw{= d# 6}4S,R\a/Lˆ&5_/3YԳ`:Ng7|Δa3!3|1?>aQBbg\PG8smuLo^z@{^_&ߝ|wW9XG ЭQDAP}Lh4} pf(aC^5BdXtiM@ZPѧ4 gq{vS^cШeh<w4?'8nYyj~~}$]OeCODvxFGdeH.ꊊV_F եm04TXiO ih> jJ|!I2)>F.t2&ߧs_-^@-B&h2{ = {)MU!Ԛ&Mܞ&vfY } B8KX9,sS. > U1&(! $zPs}L(3 ɇSbi) pGlc% |xa'_)}An}ʖa8gk!V diį&z]A6N+6iW)e@A!h 5s1!o> q9d z"eqdC|o@l]]x ;P_|:i'& DGN = ZQr70R A61qr/-kz<ZKTݱo[->ífh;0xW!k0g(̙jޢ Ůpt+zKfu qL|H}rCbKnsE.Zd` Qoz{8V$zZ9/#@rFG\Zg gGT wHe {A+@+1c @ϐAkF4AP\OxDהC>sRjmۍ.VfOΈ/AE Rp/g^] -B~؀"W?⊧7WB@KF9Xͪ8Ԕ%<qtT{U=H~H& qq5* (Jzg|ҝ8+ [<ZAqJﲲ ?si`֝jz*l6%u·0-t+\  7ꋗ[YA=k|b40xWf)9-[H wj>1칁`xAV ʯHhzqs"y4|5>S_D"q;HC\A^4?j&~E &QjvLVr71r> qn#qm!8vU]ss,1GOv}=J s(WS餘E_CjN[(N޹%}vǬvҚ}OM fY oSAdz އV/ggj~G+g84댈,0>Բ}zyTs3~|XgC}!d_=tFz0p7 FQXsEJ.a'39bR醊L.qRM˟XjþgW| [.̅[rO8 |մy}.}/Oi֖ ӜP6( ڑƂ][A!e@TCs<_ݏKt`>0=#c+'A~̻^dޝR!>͢ψ;ZoJ+SǵxsD`t:_>Ua=@-2WDO##5?:j6E>T+B Q L}zFsN!\Ӿ{#*ߖqpךBw8u覂Fl~|?{ٟ`"2q `=4ƽ/+ٷ C 0WgqlX%s_1|Z%ixgIkdi1ܷUt} vX6b=ݭ%Xo$OCp3j@ĿlQU{}lEMO / Yo5(N !Lh, O~D xd5)kLmR꛺ey᪝h$oJ/Q#Jaʃ")*oѵD,+ɖA-D]Z`m<0Au8߈*]qZd]+ V"{l5Y(xn^Ed)5T#TGsmݗ [_2wE/ϥmw!o?S.նSGU94&f|.]ʵB>l?j@g-;y጖Oe|T_LQ,8^ ^)jU1A j}ϙ$LזRl6L0 eYPT1υTʓ@ը?N=S+nVZKU0ͼ?~*v%S̬ T%'ZUWZ-FwxGa`g8&[;Z&=:f3A|p55 ӕǩb1'"?I!hmtWP O; b #K^A0כ܌>W"_m$zt]mWpgVΏ+T?0_՚]t]kȿ!pw} E7}SQ~/^ŹAD-l()<*`u[[VHN8{h);k 1T޽otʵ=pƥϵ|WN@$N&u/J@~71:m-nz@8! ~;{.=Njb_jaFd?94q߹t*;bȾ˟%EsP/zt ֤BZK~ k_VRp;ݿ Iuç+EhA; b!*Qube, !(b\gTah҈隨8ù͡HI ̤n14Qlv~\\֌ 4oO1ߍ4TsMeϐ| 4eRa'|GFl]b9w>hEw=泖3C!6c6$" ( hGS03M@~jW&yQw\iroO-odCLg/y 'LdM@h?75VF)f }"Ww]__ []xvQa*vcWu_3ܖ`nޕdc͠ilZ?H͈opvO%U1m7y_Znʌ}A8aoxVˡ Z XtV(ݎjgV)ˏ8(9$ ϿH{)=5q/u"&*9[ZK>+{+V_0G X;0Q_:O o#U}HҲ&W]@7*zoʵmpiMrH dAwҗt)Ulrޑvkv5w=Wv(5} j߃k݉m9ñe (]2uۛRV![%Lju$>kt'iMh=J] ]O3꒠Akby&x9"͗vފMLSņr̯=JobP9%[t}μm=3nS,fGT󶻬zI[tge(.-W ,P׵4W _S7 /eDW/U8Cp|:7e P9^fѢsߒ: q i4PO.D 0Yȅjo{ q䟖Ft#¸VOT?; .xoL3}o p I+<hJ/l$38^ml 8`uMyjQoq!p}N%Rw}-ybt}S} ܙu>qF>\39iiUܲ j$@m(^SB:\ Pl=עݽ^eH,%>g/>W^BX[1W("`Ķ<GL($` OX?7Ey(XK@9sYR-ə jjYv?^Q=\jܮvM!`%jO h =W1N nK}H@.}g늊XJ~? onpGqM{l>$wEٷ#_RaZt=L 5^H7*x{uڗ(j_ޝ'r3(MprEݠ6ͅg: Z}׻G#!~+[pCH|SZ"=j܃Wf-3J'N|Є31~ &4b./YC@kmA&d8N10q- 7zWpm΋~{<3KpĶMi1:#y^_3ЕK<Ц^k7Е2+S-n$@/0S7[bb(K d(/ăT$ל1Ā/+N$|f   ^Mibgjeگphl^) N_O`y6IaZ#k XvS%ܐOzÀKZ X7vd./`UpČ6ݓπ vn @ 5-fzq-|^-RViM< H֘W[l4RLCkUDd &ٷ/:)iJuzĨxc]PYߧJOޥt9H+}ئbKV%n+\;"/ \sz`jXXze@/0|Jw[pnؒOe7?+9n.%wC ZZ52yW;:5apΗCGd:F47C6 >f8>S(:gDǝ\*䘔vUKk]l@Rٽ`ڕ[&Gw߁^]aGu+5OO: *eZZsY-pn6uw <=\j:5Cex[HLP?1'6 ׳R]txޱͳ*!9T1XM=>a0j@Ȯv5x"zVRUs~HUx;!TjFO.1Jxw/sD%oY#jW>Ed1SiWa$ H7F-ya$?=~xY %8?l~v\nnI@L >vD7m1(7f!ReG ъپr"oDgpsc_Wg(sj1jH:Jxb"7UK+**jqcmncmc-[a? _5>vl@-/@-R##Ś/N6^I-%ыŹy#w^Fd^? )tɍ&_|6imѠlܬm;΋y 6j|t?E+ΥfQ7P^*):Hӓvoo%>zr "!](#y\@9+A׆Nil12Y/=Dѐw5d&]5# P >٤%"@ަ@ ilJ2X#d]!t8k#a քa"_JڳK}< *K,ux 1C!cx1<b 1C!cx1<b 1C!cx_wb2]G Q-Fo(Bg}"wJJ$hT$jEE|9ɯ#U$P  z vC!&)ZQrb}a~ b}D-E 9hK;U$F6_%,KX0KWgpkgKVيR( (R \גg̳DNsy)<#vFQFX`vW#T%SHʒKD/U/r (D{1kt>K rfҍ B/ 2kd>ņd^<%# lȦM͝ \Ggy?>Ojt}fv"Wqo"Jdi9HzfM2h"XżSn 6sO|>giѰ|k}InI />RfftJ|QKؘ;{'f/~m*Tpb&#/ǿxք%erprqOjڑI^`l0Ɛ(r2Jq@Ϭo \d=oN QឪQ8-t_.rтQ;sōWNOƿ-<&0[4Ihllf: 2hhBCtg:ҪرlV-͈wSU鸵 ͗%$,)8a'>(HyQ׏ȉϋdʂL؈2Ss?K(RrV,5Iwl4Rlhc _ tعXȭ3O F}cXuߑ?ht )F_V,ܛ0/2ݨ9]2o:ѻD-a& k!lWCv2/>&~~&|"kh [й5F/֎zk s7Mw_o?%r_}y6,6H=7th1aOdH0xEX1!Q3&l0m̿ۘ1ncwпۏ3KL9K;OS'}7ήW:V0MԑM^䞎56"Y@1!\SZ` RaH hEJ' ШzsK&|.øyD;ҔPΧ/G7e$%Pճ2 TOjIc@#y {{Dg4Єf 0ylrfAMVlnF,M%dTz>e,Wj @qcbBC9_%T&QjFlojZ&WƧy@v w ÷9ؙgPVl4n]lH&ýah@eT }7lQ}ЅÜ$j7wgX8ENO`\>ryr~_VUUzB>O _wIB+(i7Q9>T_Cq .#SV$X ɶ˽|rJz~q:o0.*oPZf3_@!1nHqsE2m4Cnau%Gg7^6RHEb ɲ̐yP@5{/!SLF_^fw#t ?{ݧ%CmbFU>KvDQw0mz={I,9_֫3fnN`0󸃗Du7 / wqì=Mb‚qVO02BNjVewVGf[Sc漼w^mR\|zx} -t'Sr`༏–33UYsw~فg_q`15-έ.ƾp_nhsr9'cZ\-7ѥuaNl=~xKӴO׮sbIG=b86;n% paTh >ù0SKϫKV.s gPuѾfI^bb0JеY)19f={q%s3- u-6x77dcuRHNxmu;"<|{ {6͉uoosHe;rRzD|G7R~_zp8Fܲysw\:Ϙs6C4!q4A*uMg=y!\Û|뀿2!j( 펞^H!@4f!`s,ޱ!!p Xҟ!{"@8?0v_26 ߾Ɨ5OZv!QL[A\@ނD֢ ,cnoC/nO…W !O6Tw(P4f8 tq4x:W ș?5j TBV<yHg .NU 1ODشo Tu40惌e5@@dhP]Jv1ڰ=Z]@٩Ue;h`: -@3{?٢O>W90=9󐽰KkoC筂f̜y^j_{TC׽Eo4YWJCKy\M?~(M)ED"Beh0̩$En d$3W{n)ѨD<~>w˫x~x?[{ag]BwLBxK\<>3d~g71s?#po !0c p8wxo PcUǬ==6;c~p6e5 8M$?ߍr.?WTMWAUc)'q0g'/;oLpן>>ȵ\W dblL8,9YʹY NŞ cRm&}/ Vwt1|0w(Le{E>v% iWsEEaRؾXB4(9k O]jh`LҬڲ _VξlZMCyԶ=(>ݘZ8vQ 3zP3/o+oNC%e]cG|sm;a}U|*+oZj=.WmRW**o@XdlWTcBJP+s1a1"l mL#ŀky;5(ep5ntL | d.1&{6{i=Np-\jZ9(6}7wrЫԠkU2m"II'&9K*@Iݯ'BFY3h E8^q~ bc2j)J q>R* z8ҘE |gV֘(L,0XQ @{,|{9v+ju$d[%c)IЫ6陣wW=4X 9_~NH,1Z !=ϲO o`˙k}ǟߝXlI `Ǐ8ؒ3БJ*>/gVl: CǺKז;{)}rwai|Am[ ;9Ѯ쫤3VYolNи#}+1]7_?-U8'Orfi7xڄoO򧧭wi8Ay:/sϻy}7N+y=oN:ywBi}8;낥Y/C?sLcNrWLubejr*t#\ȜzwwY&Rt$yJ0aB`Tt~"?:o Dm?n@ꘄWϓ6Y7 ?v%bE럷w]շq|p؍~[ g\ r_䏁4])Yiǻ|LveyG;_UFJ(wc(aV5|_:[v#paE4~Y{c5FNHX(Y,H05>0HSm65N>wizAl$y_Ds_,QtW$Ww? Ӂcs.\0{/Md rΑ}S@!DHqH/i b7EY=^$ [=ni`P+2p!k]YjK\z:>ïZmJJMπ:mK+Ɔ>z&F|Zx_ʼ23c[& ż ^ ?Ү?V*G~p?Gbrd7R9 訶|h`vƖIP.@`vԽ]l!Ms4#,D!tnDt0!Ͽ&?T[MB2%@{+p(Yҵ\P'Qq*x2НHM+VPDԴa`C8*OӁZ͏굳@֗EB=Ou QuO $"?Ph)͠p~7WV #LGЇЧ|"/bQX>xJϊPb!_{粫h41?i"Зg"R(59[>RkQ(`JCW';0a/X?xwj1szU.*4*_-=lBJ  b`&ګ¤+M>>:ü~|~;[lx,RӻP=1TvW.-PPD8䍺d8o7>/F/+whLPn_CՠRO-~dh˪Qk=r9V.Ih  ǁS&(Յ@l  !ؘ'I 3Clu][/]|cҁ!,X:ZKݙgȯ]V%J];USOoACyikC,jUQC~&Zu#ů(΢z/`ArSu`J+D-S Q͕'"W7.0Q C\D_VSS$SQW5ETN.G߈J^zsT4ԧX_CA(΄[Z@S|Yh:~tp XLUTpEl!\EoGy'opXғ/j #aߚ>gԤ_;/%I&)dt,Uoί0|u ݬt ߤPi]+\vMRPmD=D;!v.ᔾBqEHP]P]GR TdhJ(c eݚ"^v")e'7 ޘ@pCö΅3o ~Kfِc_ tX|8o* omŁo&m^YP>Xm۔jB赒^+p^!7^!Pt+j;5T&f_{(mZiyѭBؽHE 8pC8"KAr'hJD;vmc-%y?kJ~1s>SrT#QTW^jT~9VGîߏ62]7oJl71yY!T28ghs[?g;gϿ0?~8w7%w3->cL5Lsq3|3n"·Ź|dEs8׹Lws>r#kFs63oat |.J#"}#50_?fes|:w#sg`TǹYywGsny621}sGb85\\p:>Nk1hbZӎϭk0ܫ|_Wa9?/ϧ 'b3Ob̝8 i=u.N ho+M^}S)0O;*]E W_i'Wۻk#a~bEYO.+s8jrak  ~Ƞ%[6>wЦD1`LpAØ`r?ZMYeU:@$X?Wʯ8 >yf f-K.7B`~q{'c7^1aa+=q!  lf~\:jU>\{,^ Z6tZ h߭+rc{Im)[u]BHu^Ly{$5h!תc˟1c围;σ4B\ h'+8ݘZ6|L#P[ft@Xv q`Ma}9ȷ`Qo5섯$O+,`H!p^x\c"w³ .[p+/UoBa 3a6אoW{·ΈVE }̱Gx~W]fXSs-пsDӘp-(JBE>lglxՠ[F>0qn/E ;{/ ނЉp<2&spݰqhah^RrITt~OsMv+?}_zޱ`Ū2P=rȥ[!_]-rs9;em_drpȷ0[_vU'*~ ]򊺫3a< VcnC{+'E'*%d׎3&z*af̂ʱTLqKe,ǃuWKT =y nAy6 6K՘00^ϪVb1q&Մ+EyNFD5?z&оhj/Ы޸<$`1{{z,`*?\vfɒVOCޒ{N̞zqG>-%[{bWZ͌1u|#c%9jO WB1wz1)#23cdveS"bRrDÅMSyS"RfOeuˋȫ B > y29`rm )Y2.8\h+$^<7_Hr.M0%$ I:m?Z8TCab\U)pLT99ryI#ؿ[M%ҁÝyUF\ؿ%S摗B [탙bݹdqXې\bג|KX\rG[P;\!S>Sۥ` g,vkk}O˛H1O6X3?jyJTRYD*<`c^GZے,R#4eV=g&)jP1b Wlڐd{YMi'kC< Yfa>r0xN*hx?#F 5]w2lv;GxG)|(_Wg*><լ`n*i2\7kyȺ2oԣKEP^B+).ٶNWoZ<$ߏGrȃ>ozVCB*S1ۺ&fRoC:$r^q佮qp|Y1O>&W\ogw|_ ˟N_bʿ=@>^Z& ؈ &5g\ɾK*눟@j/S?FhK-f}F&F#W1210##+ \QH`|LFH``>F&F#W121B|LFcdb$0rz]{b^kQ9L 3F fIذ3 _24E-E:lUGSb!?o5*x:Gd;pg+9Ck5i8r1>ȭ=5qʚh}iP}f:_ʮ [) s>zq~"F0G .E396PQz[*?J$> +Lj yc*䷁֥חt|e9ë?Otm#9m;He(G;\^5}}we?͐>8T"oTB*u?0sS)ZY_yoPZ`VY2~]ƼØ(>`nxOD | jx d 'NBtԿE,fHv8)wX`] y6xNi;]}{/HX&D7x/ EvO Bs@1M> <7GZNj;&sJI"{V]|NʵLڏDGK;QSBj#{A~2_F/3B1pb 0JQ!0(fm&% 7Mq7x܆9mVSB3_>ukU1DD˱EnvʰVO2wOtsHl.$C3.iWhIr!s"$ʃ\6.n5./Ѓ#ojyܮsCNW?lJٱ|=(P%FI ;ɐSD.y"yIr'=wM]5g"=B/q'k-v.4[挀;ybq7%HiAcvd(_(͍oBKc|q;fS%9 0r|mO;HwfwM|cL\ ϑ֎At JLV$ـpr׆%h+ͫNz|6vC.ywaFT.'E-Ι@eȏ#/-/@!fTN `کDs4#aGlL31qY8.7 ӆ6>.M´.'|:xLôΧ˩cz 0=S18p\Nô .G1-i o.'願rB4i<\/=t'>0݊f kLW\ .W:L|qLWcc 0]˕rE~/t_|ٸKLgbrptLb:#q9٘~%r~釘~bo|px*.˘E\.yLrg0}'q\a:ӗb;Ⱥc]bd^h?Q8NF]8#{r;1w`>FNߎ12]q9w|m12-f܄1cd8#s;`=cd58#s5N_˭|L;̷|Ȳ+p:Fr_K1# [t%b_t8?\Hd՟#Ƣ#@`L*{lS;y wS ŌȌ-zH&^io Bb80Vg|^7.!>1z)w*5̘4+|i#ňo =O0!b/Z!C/D"q(!-.ٷO8H{te7Z/ø ~%ΈXQ _C(쭚Ol)aV[xX݌T(-^=yYnRj%:՞<'CJ\cL؏:T~Ȟ3|J0Z -)B&Bg&lrIؾTgh,!0oWQ) S\ֻ\0syQdDo4 aTB!KOurP0uHC j7tJ,Qey] QL1p49jt65*0uo$tTqy˷ޡX5q›xjǪIZ3{;mQ)zdS2Ԋ$TR 1@Η))OHq ">YH`SaT4F(uZ_ifShh@#dlKWfݕ[:Fd@׾t DSksSYkUd{xEʂY>ˏTMCt(<+e=Of K8c.DرrS0'To+M#\MU *Z !1q>%8=a1eWcKd&_NPg6G=/+ A{&rُҲ?)56h9Lv6^mˠ?&cug rKޛFGc³;QM|nm`#}~t(}J͈ ~ƍ-McfH0oMQuo5~J {1kخ9\6 Ծu6 33 %O wuB)ƞj\2ުuIoʠu;7O|=0#+_rϿ}:P5=e^b9 4S*f4Pyv-#Tέa;vwQ}`*X&W)pU|KYX9ij~!=;@OP|r5pujKj|'Qos"E({{n޽"Hɗߠ&'UQ)jckO=%Kr h4kT&_;-~ p>>\`**d xh1.:$٣^ǟ;cXТꕻ.c28ʽ=?ϳO*5K7Sޏa,fjwO5u2.tU<^\(f<Cϒ7W9FvhƬDLZhL=s 0,ww00e4`tcj6Uˮ-nF \ h1F%hЕ] b j~XU$͚Ʈ쟖/=~vYhu~"iT蒄E"H?W%£3eeSy'VhHJET~7x aXS 7ޕ+E9 o]|AܱN)?!J+I`)P e?ݠKUH͚>Qi!O.:5ka?B%y~*K.SbGSVm/KKO-nEÄGdYʴ+^I,Щw '.*dS_URxGkܕω>2 6=%2!iMHjUe4ηTy4r߽gMAt'F2S{gS;J#O^)4ui!o,kF=Z]wNB4Y/M#9&ľ\ED{i2콅~ËxRS"e+'F)rAYG̓I9$Y(`a?$urƘh NEh?) $bg^rU ¹[SQsߓ⤕Cz~% {qRZJH #UNWF>9xJڏ&T#EdŶE'FX4nQ,5j.̎ϩ:QcBL[CV( տZUQ8sT}zUL"u>CI֌SJFZ)xBO'MpwQB~Z.՞yjrAܑ'YG?3-G'odY iM|#LJ-<^.7ѫa7TT1Msn!r~ǖR6 :MR=[Jލ6}6HqW%L(y4] #i edw ΣT3 kGo%r gy1|ŷ3՟I瑹 SK$}j~[X")ӭ*)}}'{8rmz?|=y "nN▓ůVP@vqVD>qz>yCB:}&|dLe>A닚6=yPkd /^NVƩ9{~*[Vޏ s6^ gx񆎦;A#a0:iB=[΁2 ;5J_#|s ^}L F4~Up⌥*EL7[f0J=Rgܢì+Dޞ^^Guד)Ө?ymj4XtgptTVmp+nsJjPx e28PLXl8u%mc`yɡ5TD`A5cUQq~Uw}\Lkʗ `;CoskZB8 po!:,FtN1 [W`ҕ3yg7KF8 `gdG{8۹ml+*np#ql)v3N#Ȉs/Њ]InϒO^Yn|OrbQqϡ!;4mҧi8ÍÖ,V W T>iC&M=,͏;b WhJiXo >38M "`gF(TcUp\&.@B$\UYr)nH~tUM`$iq͏[V޺S'{^6' \R^T6l6Ǹ ~|`8z2ڝM_8q3য়r_b6x u9nqvƌ;Aopu3ОxTfOgbo*q ‘Гv*r3n]W4'c\nZ3HƨEnOd+n j֝͝깧:Tu\OykZxVpf}My/7~=gN!Tvjl[(GRv7\j֜fǗ8r 6z~dyo佲`~ *gݏ`lʉ} x5pQwܤUeɺl ~#jK(OL|I8]( >]UueysE,?kwD+;j!inkjYzWv%UyϙT`Rq)'jiنsMt&ǹ ({tE 6nv{/CXវa96VS$yٓ8mam6&uPS~A}n{3? 7KٙTvPock/j%n:C?DŅn#V`OI,R̳D{׸e w.娸xBy J:@ٗQq;@r[Ṏؑf3z7FD@kASSr:)k߸q;X@s1U@]vҞTNC l/^3Ny/ŶPwQޫFg'rkSj_{pv$5uբ+KËSQ^3@wsz]ƴNPq@wϳmE?:c{ۥ2{ mi] Sl~\.MBXϱ8`hqZ#{PwnPbG{̼[O!˥ z8 Zwo]ltԦn dFq{@eF/}o. {_i4/sޢ? p9V7w=B5++zyeJBT^w;$)zhr/x~>l~\^0hU7?LV/2gLy貕P;<hS RG4xټ=NnU G,yw=b\^qNqXAtn?AUD7o? Qa9?A-'8?A£[2O'o3ad8n7X[UIDbS>9'⚗78:!>x˯{L~+7S1Ţn݋߸ž񞒯xW l]+{g_7"xz/SKxD tt!^ozp!^e5/7Յx;R?Md+ᩈ~{k.cU|&Q?rޗ{_}y/?/,:~M҇){\B?3)MmVɥF.Q.L>xtYf%T*a*mpv -R%(T*ja=SEˑ**ܦK+F.\~,CݴkY$?(nՔ93W9XDep k %0qą+rp8: AHmx%1[bA'Y6_N!%uct7QQ]d2ˋ KYav?a5ƾu5?* ; 8Q-8$<%p?mJѲ*j\\˭8u&npj﷌SkWhaG R..0g[|qT}wt?8ǟJq\v@pN\3 6z%*wٕSEc<5~H kwr'5{'9VjKVCTToBLKq'Jל.CKV5ޗ޵Qt>ZpR#nbQ,=ӠvUN +=QYy lu@6W(4t>Vha-cW<Gi?z4<_Q ]A>y-2e'=Kϝv]Q;A医Iޒo@\ݰ~o-}=AƥqEB.8?ul@} B OV5Zh֧ߚ ț;ℨM}g+l}tVޤzC߾{rxq M \ [d;M7}mp& f@^n4 x3n*>QeN4:>Qj9mv?]FZQf_eW6]6f\0Ȗ_p]9Hk5u}14 BInȴuKZ$[I0*4F2_J1/Qf"´C~ja2.{ٿ~8ǠFc&SNahuW&L;ɟE3F1 ]/?p' cɫ\ӛ/{ùd}!|{,D=qOTZdk~c5 Wi]CFv>=$}V߽U}fy( ڢ?}=䥬'>y{k<{$KvMpkAcJQGd~Ry&Nr(Xo^ZN6pJLW3.!g=d\~̹|w1 9_FڞP ꡆMkwf >yO' Dq Ӊ"ٲBR1{ |>S?#$>,>ݝCxFx[m Nqpη7\#a^Pۻi%_6w+^?=PAI`LzLty}PT3Es;=d~3՘m zk 7;;6(ٍx Hv3]]>N>?;g^OM\+'ަM!Jf"7w{hS&qp~t<L>=[YȄgOe 8 6\^G9->^yysGuK51a޹f7= fecvM%'oWIR}?2Κ-[{>yϦȸ397'[jRG1ZM ɵΣ7Ms==ݲn ]^&gٔLhfsd#>dyDUGƅ["'BrO!C%m)7?t SށG}Q6`󟏖Yv*Ov&Yx}L? 9AH@@xd; ;$ߡm?#9AHFF3$IOOxd $ޟdmDs ou>A7'}B1[X5^`8Ԩ26~~o{oXp,ʅi$Y~iQCpKk֠U8kЂf@}}`ѥB]tKlėO/᧿%ȣ?SQgbj_fZm-0S:PwO^J("cNz(-tQC)[€<4$+ۡKnAp<Ք:)ARVun]\zS//㚴#"%h^S>x(ϓVu D0tJR%hect4%6%qqBPRWl^m}/ϲn4kpWυ]~̕$,Eu-%hs*-4đ5ѱO +Ugu'^@-tI\v{?lmB S0Jnry=I*Ac6H<{Lj0GϠ'7Fy}- "ivUf?Zg[ʯu>Q$l[πqi }W\vJaYAl.J zn ?!j ~)NU:nD]Y/fzРi)&d[gYO/<0H"7~H2YҁA/6a1 P_ԤyL'0v׃,w(E+7 `5ekӳfbytVK,aFZN]홦ː}qeK6` 3z5Rw @@ʘ/-R)?YORL)?O_ /IBxNtD]cMQ섵&%w߼J(dP—ZOЁ0:5ݭ^IDO۔<]NR7c4M\m+ml?kV߱TmW+tzbɼ[&LQ a-b;Vnfw$;#^-?G{CV/2X 2)qu C4%ɍy{%{LAyzE`p3c1n\jVQׁb7bo׏/I%rS0VJ9/f|sHdqP c"%-IA8o@,?՛+M⤮@+JHYhM;&BWØr^Ǘ$rvBA BgBe 9 H9匹gdk4K &vNXf}VS\cqMz2v~a}*2Z;#|E,; fI8'$@H9;T Vf,6S&4kdlhco픳  ŢY*mP,cS@jW,^Ku!R7ȠlWa;EP,YxJs#H9i49~1;(G ?M|'SRRdFgt3Ag{"%f%„yԋo(}R@)+,:ɻ!7 =T|\U~3 ` xok/G혁Jf$Rj ]6}W6^Mm_}k("EFUtBGb3enl?O]@{kL˿s#aBWEo PrvRo-+~[!sͱ,0B9ҦՄBܛL7vA{gXF@ #>,\%mlʰ8 y2l 2}k&lW7nn3nMs.1…ny% To r_w-zڮBU 3J Hy<*t5@kKg)į+\z.ĕO ( jy<֙M\c><'@ݯ^6]2 *ve3p]wܷTtʾڳ}NhKMlnKZұs[IS\'!krFovVpг0}I=EbO&ZͻҳhSrǂgH1Ѓrp\ff~72ԲޣYP˾B-τZ9r :~uOpjfty=Z(P+ψxϼ~R'zRxTXF9<ש9;m$;%;c!{eRTfV;;)'q1?eF: kL5ɓL^ERz<c#:lTDq N4$vK/g d}|db'؎NY4pArrrd~R# LjVO7oy@;(twg+ !;8Ag5NluLOKr" q à vw#xqT*.*"32USL#Ss+9yR WZo"A5l5aQ7Dd0n@R֨O_Vn*@ 2z ":rtg7pUY*q+g劜2nƍQ7,,Y@-hkC-ׅZ6, ̞(%70J 4i4b֎ >&ήaV#_ J/ 20\ ;Ou~Ig|w/a2' I:[::Lz{\'6+#L7Efgݒ<} }?PDv,֪LnNR9 Sdd^,ʗ4&s{.Xԩۘɲ).]bܶ\xu| d4 C/XAJFp33k8y ~Tֶv_ܕnHV}F;ٵvޠOƒb~pĈJ.\%IWSo]ŜjZUqVEӁTVDH[imvv6^yy/f/2EM.a+ f=x}ό.G3:\\k a= "Lbur 8ZaO yBLߝ]vwgG]?eҝ~a:Do"&9Ql*YCGg ݳMpCsxI%H' U+0SݟFp̼6E;bω)kvA?w5 IQN'O20-o֙x&.i "H_t3[ܐGRcӳúMz*B1-۬ 6kz{RUd\QxHeDw}ϦxUi.D3u!rIoNɡeG6" Nh >]l u OttfC://Wu\ŕQעU(вz'罎bAMCؙ0=Or!!5r$K,<ɇtyxإ],J_ԙo6y0< ~B9%bt+ΐТDħT/  "tN'Q_8vɍV6#"QZ S*W6/I1!R >,DYB^! 7ҡO'UkyhFWؕ*Vru0Pm`RN >/y:A_K[H9ؠ[2}uhgX&6:S NuC5;Dȹ `Nld·ZS ^ A%Cw1Ljxu͍+mxYv:]n\xQ@3vѠ;{V0XNlZ3 |5!暵LJCIF ^ ~R(TҧSw_Xjg4ޢQrvqKJt*ъaIV/D-D=cӪ3l^FbIfsJ Hj:: 2DxVu x@UHV]Q~VhPmT&A)KmkKm1r6_Ymf/~C?A2$zvP (Ci_O/bKϕ!=={o,lXn[4UD.,J~,ZW8\@x9rOaKnTB/2Wȭ12sPva^mi `-OcD:x{ChjjQ):-- 4E9B@W-dqOcP+ rخE3p.2ȴF<8>+ 6;EVw~mfZ.)rC57V2PK^,UdC3FK6rveGϳ[+j6%~zf=}3J%ػxIg NIԡt7ϻ}$=l4J& yǰ~Jj<<^ߎ-< Nf3l?Og ; B,0E&^,;˰upy)tDeq`gt|43+ȩtPΗ$rʝ]r*yqwU@}$%\l>`CNKng7kP 67֧,8#k,gXwg.j;v`e%?r(L4(Sv=ي+̉:4نݷN dCɴz3s%@v{0CO3};!%kV@%eDC/MPi~E#< ӝve=|8{AiV˕ΐ=(.o,xVNR8yH '_HP`|{ [Qh$cmg`L9I.ͬӬp(+Awx#sq_AZ.Q ɭѮ+Y>RAkXaO(Om<{@[1ibw(p/z$(Bi`DPg'GAs{qF9 _ @v$mr"b%|nKqR,YKXƚ#A9q5!y؎K(<1 ͐y5W\'ܔ;oU0í3b'A$i^u6zrj\9XeJuRRXs`'߀&cJUbȥ0n|d6D/glGcMB-P18 i$ /Qۉ7WN9NeG-8[GgBO/EN@_C^ᗌJKg̭^=El\lWrp\y^^"G :KrVbBXW'U8 r`WVn"vvwڰ֎3z-t@2.F0+ m\gU4]a'LX ]_1\{j )*Ѕ{!G -5j~b脝SC I05xTSzѤ$L _ÔCٵsaz٧۴9BC.lؽZcoA2^\̭C^m@>pa/ aAN6LGl*C<@k3F?f&g~I/N<l5rBc,BvnvXo /?2j!ȯĤCvh?E^3g Pm CɯVP2#wnٚjovSF!##Ò)8glɳ,{G[T> X^Bql|.~yޝ < ;g5;{0mB'Nlw"Cg+[n$bdʂeEnl2@!xnKrK۳w踍=9mF1d*ɂqbeeY+Pn$;jm8nf g[ۘ[`D cä'\?{>J/JC'ww.+m TC1;\`$e!ApY0 z " ;POCƈB$C'~Q;f*JJ2!~Ҝd6w u1ɬt:޽2IFi2ɭiS67| | 2 4f"'0eeҔI6i˲S0ᔒ8m,K`&2I:V3&$vgtF&1=I|c.qV/dn8~|B6"0H苃vZ a`e^L/x۔ubEZ$auvpmX9橆*)~v9 Q%07Q$5z4fx,rUÈ<\nB9;TS1Y$pͥ՟nBf: (HK3;vh4W ͉5 7u4vVkldW~_7~=otmʍesK_Aff0ͬѱ$`Ǥ*ABT3IL Ї X18U `]kV.IR"CX4QqgU|ߌ W[@vcQ/NUqnf =SYIΖˢi!?:?@_B\>@0nKc]@}'_w ^W|"<٥*q7P/E@]za4Ү|Yxg.I#X3 Hq,=S0*r˺XK d$NѼGХ7+Q'$ɗJk'UG74ǿdc8 $0&UX#:Xt$uCF~[8FdK\a =5rWCR1v\? rZ5C"G%G~ko =P1^8ٝس0"K$;Ƞ/8o=3pƖ,IZhwT zjw*B,hjtmyP;Pvh(@3dZvi68/}8sטbtsD.; *IN74LP< X(ṯ)snh7S?w6{{IhǤyRvaւ6[ZvcŸ{|~j?*u, ȸ#~vg| qKHF͓ :J t@:Ԝ]ȻԡB`sTS5R-4;GAOHk9PuC*^ wh̷՟.oT )ZXY6~Ks:̓f7gsJk> ɀ)Rhus< Pv筙j3ɫԞSu̓9{8 YEMEHtG^a uUmeu>(aupfD^ )U&SQ_; gp xXf2|/ " s % 5RdDKpB~12ҁLE.'MZ=S|uի(+4Obm STtH 6$ -љXb?NLy5}_ tSX /}ϡ ¶bK/jm {h;a]yRB"9))7AG/٭o%AJNK&`kuDK /6_5?Ɲ\x>:tfiGgʷA}\x`cÂ3R}P@ܰ(q08W)a\JSֶks Gǵb+揫1R,3۶I3w4F`v\ByUxˋ$kYAJւ93IsH:o ǻyMy?_EI`/,ghRX{#iMF'(/NZG~ơ+x,gAG>n <|VǴ.aU.I3h%k17kxzh/ϦIiV:O}P~]끙x}_=0ʩf_/ĐW*rA/2gOV/IQ3e U}_=4z,_R7-+&=9C3.dxV?Z0LhP0|IF,9 c]p~ &P/ } wRifOaԊ6; zbcj _iK-"»nEХ_p[e_ &ۍ5gx9ns0tr}_ }*lx%6F#|y,_64ݍ߷͍34V%]6;} U6M,> y/PV#+ *g%:GRf ]B*Zo@.ֱd^ȪJ0جg=ݣh=h#F~DwspUNSN45jP݀?ZJ3g5{$b#k龰j{iMJ`|6ԪUKQ5Ηwn@[>gҷs568V%XPӦhtaAN/tN)YXƴ]\_`b W$Ux\b] .FP[1/v!j)G.p@p0jnoSi F=E0anZ`Nv9i^vx/5J!)nOK;XZj"<(rg; s'&/-)0;َA:B&śﱧ9=WO==9v2Ϧɸ?ckM~MKsV/>{v]$I\ `0‰IP/,SUPaIP=DHba3P8Q缡v ;z_3 gOɉ\QHIY8EY~2YMK M:,;mʺx GJF.’[TN?ek3W3˶py}])H #@i}nM!JXn^`JbDû?ɸj<|\IU?m_A }}]c7,ڦU\^Vc[ k\,8]%~yr*_l${wݎDTOAСԎ솅&r}k|&~hlμM [ O^  9x4@֗ZO!RwJMl 14^FXA*eRt8E-G{djB@}Ry %ִioVc&8R$Oբ @A*IMW ͯn'Lm\7_'N~rmH'CYwu7;^,? _*ZY\<0w{An*xڌu*@F<*AuZ%SRt`%Z)B Q+E@ss5q"M93Rf~F$G6:5&ė!7XbIX]wH̞OIʌ$K7 [m:YD(_ ""K;#kUtBfZdԊt/nSk98ܮ܀AV25REKhULO~q6𨆃oAײ5x`QQlk^.ykg*Xo` ]|= -hCx/ a0:v1]mAfHlNy*y8aw:Lvh_Nu?7+ .SB5#Scf jmg+&qtH+h*ZAΩ_{s|!v|m3EY)}b Ж(\9M:']U }, \"X\^ R+A~w9dgI)F,H tس`B/8MЃX:~NasXS @SOkKWE%z-t5Na8}r9FY0[Ono/~b?ۊ|R7 N/koA0=E`Nq$f6^ Xo# 0aȩHF&;0Ȥ@bp"I)!~7NU~PdeUuY>نVmE [.H8,Uc/c4 b;@̼H#ҽDd}93C*zq':ǫng}f5ޓP23`>C7gXw(+m'@wzƻf9Ojcz"Cyt P=ܿH"(y Al+͊_IҧN/0;r^zVŗT'ɳ)~C707yFŬKN&}-#׊?!۾ g'Ow?e=LM5ֳVFbx)8sOy(Aq­^P_㪏Pr"+w뷳%H*N2|v&)AN#80 (Bۂ4 |Ǿ[F (dBτJFVm؍uy׆UX"{dB ރ[gt2 W܇$u\6Mb 4~0hNBgZdu@w=bDF.t&J[lڝ* Q­rZx: k?SBNs*1u18 78X]r{іhfK"鈗XFb -%!etG/eVgavr$ ̕H<`ɕ bAbPzT)e,yD+`ɼdg (~|:w~NW^rZݱ|'16I{W$\rZ L.DsxX l+U8.[q OQoZqAj)] Δ⮅6 :t>W\w7,ҟ)}NwީYc\,ׇ]U\j g .\{h&:[G ]*spu0V[OB^S_^ݿZ.> cYغy_algv;E[NyS`)ٲKVWxx>M)XV #f.H~h^mN$A mnl&~6͉ty?N-sV ?#~%({3A?( yW<+c Uݝ pӽ6k􈈐Nv{`5v}7_kR:b6@qumoԫq+svrIy$hu,mmAo2J,_z_`ҡstMSHhWiˌFm&VʕsIԈS0L>Xw6ÒƀNZu'_ kUͺh -]6?=y{5޾6qc<&xna& Pw\:9rF{X`+"Z)3++= N ܸ{[Iӗd_I3R]+TI9:x)z\ղqav[gzjR!t Oְf,a㕤 Mʅlѣm<|_d?wInг3M: 5߉xfAag闂4yBXXеݡS:)S?dpS;:j'P tomÿ}faп]p"%SS[kĖDUrSܧekKq 7כ¼AބOgwyTsj;vt׫} W뾦׋''grT#7lArsxxdQ:BF㣺>`Ȼ-|O׎ ̫dUpKgJ v惤ΜI$Pv #eBW:/ b`yi>;-?aGx8cW;6[ҾWʼLQ4qmJgh=4a*tKKsٍ?IgvI\VB$xFt)x?d_&teiMx:sxڅ )X2bdG.O*l` gJwD`5R.3`Aj Ouv}~;\#,3-QSWay' FKĿ84R9vħVA|z0>Ř/S LT ǡS!Ŕ@t+ b ײͽL .]4)|/ҹfT2KZ:Νn:}H{]̹< ]2P/!9SMNu:w!)4. M%ah#K[0kݛȆ==bϔ+bϔ3Áj{kĞ)Ş)ce碠 Ğ)׊=SSXkv'pۢz0ȝPC[jEX GPeѠH0@a/4JʻAkV"]uzäpfk7ﺅwːg:& F6K>\ ɭ‡ކ&k-aW󣿁TFrmCFL_Y==["wn1i`:>|GiKYvrU0%vRM֟}cᗦ IO $TwK&I,K[`\b-/Z!A:W\{EѮ۰ʡ-JĖ;\q7Z&{06+~0zRbiKaf DXvo]C*\r1tL; -DAOannlD-.ڏ@Ppщٶ\oD~|Kr`×#qUjx@w}ˢǡ6hB4~E|wW ljS]r/aoEkXڙ7h"[;O?qS/ZϏ֙-BEq,}X<'7 SW#Œf֙CGgVc7" 1]Qu,6@h}F[Iqp쯇\)b, #jY\?!>RPɢW@[ߙ3/[tC[`.x%tP;-f^&^x QOxF<%MمuL[d^Ve0 [vPd(8x@Xf VjE5DT= QV(܇:L̠6v1XY.1ivPaDzN/Ҳ3ru?F30:;e9N7# NԻ{%r2ZOeRM07TŬY9&5@@@);L8xK -,5PD/ ^R'/xGQ'=˩Sv9sʴb\cx( )) Z,{_}d^{^{g>f:wwO¹ e>+6M|5ԏmC 9^5_ۅ38(;QbP{Z]2Xtvdz|zwX#F\u0~G7m7yT4Z?cѷ }kJߚxrv7Sl MZ7@wR C56ap0+ R?`9Nu.l!۠KO;׽]H3+1r'|=֍ [1wi7mC`BOzo[~ ~[2Y!fS- +8'l,|k,dxcɘg$Ϧ6ϖ XngMt!NlmCgD'ۡMDǧ,ˇ:s]V^fZ8[l#Q/{EVtm]]JЍ&!J"ݓ_'2<,8J\0,dס~C Vo#`⧼S}O>) Z˿,;]~@9-QQ\X?z 6OhkFl.=!ƃ}CFXڲk ̓`l7](<Ɍ-Ȱ7V`$0xI|i@u*×e& =x$v3%b=L6r (25Z֛6FK#؋,F2kRKh\lq7Q[FKgMv2~tJN 4|).4όV,e2#x2tvrwH!\.yj5kd,݀p?:$Ϣ\ij|u,Hv:a2v xٞ6`Lvթ۱3;Œ1G3TN2aw f 4`*֠F͈BʻKlC3K4HV@۠!fLJ2D `: BHZMP0pg &r[1"A_̻{6G^YLD5XyʍHm(X*,x63M jf$A4x`0LvU?dIWŻ2 BEJ-(8SɢfyH{,²}Ɍ13,&dhvϾ)-mM` n4Kj%Fg[ޝ_E/j2˯=|Sa^g0 }r6ُc,~xeL}~#e>]{-e-bb0 س-{]X~zGSG~Y jnk]\ʹ__^ Yþ!1^-qmƬU{'RnS|ve+̎(yw'PWoi^BbGyxcMz6&`oƗ>`u;׭6KMe:Ko K^Jd,/t.w|;_8asoIs[û|s*$F9w+מ&#a8ia7^Y؊Mu F*d3%Dg$ vmcmSѫk^2nuk6ۋGV"4lz_q^x'`Y'8Y`'GDF OܪԿU+HPaҍWtC? a,sch1S^j瞡I*oû1/)-?ywM2$M0ؾ^&z^"Dq޲{?ZgVԮ@j)eԨ)h AP7CLcJ;s Q/ӋP7E[p8<ɅWլfFu{noLxq~$="Q1uRH' iq["3=`-E|ޟ݆tПl8 ;xM mt$_x]q$U_˕ГM:g ~F( _kU ;IGE`v|9Aύ~wzCbt9ڀ|%69օd[PxlBzodܬXA^n>U":=1 k1ypDAƹbcJ^:44nn+ uٞ<2 I IR_A7a4<@MFj{c]X=+FJ[S{c]dmz=^N_J#8^߉װBV L_D]p=?68$2RN2o#XjWXQ3p*y) hzǗj {51*@v~ )~KGGjfVFaK+-TZ[a&_ڭiZ-^Qn3g68̝_s Pg l71$Ƨã!m6At]U8޼5 >cG1dͿ|vf}"e|61dkn,4SNÐܔSl>+gh>d,lp''4_CxISG͟#pB>(3!o\l|P( $|7q!%x^*jmMy~Ȇ'1TypItȲ,ȟmAL\T8@ :sKx En9TŸg(ѵ3NKsnwT@װ!?W.1A-| Ӂqe {6IƤ k`xHX v?l z0 ^ #aghKܗo:k $zIH@v}XŗN#M55p2jg[ƒ^- Pv[>#nˇV[lb,l iX>T-'4RUǢv VSSBp"[:*{VǶwC`N<ݷb-; |']kRlk; [HQ>S-jM8@ZfDP VmEn|'&v<:))a&Yu!cVQ|j]1;3ҬRy`yk"I8Sa!,~ { 7=)5=LMOEajv w5sFţtc;b`5`RS bZlE ml#qіjg=+{>͉:[z`e3ŰB$An!iO$ǿ8K4r@:P ]"]CkQ`ފٚ2B0eQC6MmOaYPsRxlg+Z ~ Erb ":'YoSGp؈sP6YJ'RZB5 O ZbxR$)] j,>.ݾ^΁‰1W4+;r T *Adz>@nlb ==y_D_bvFKW´} ;<=8G@ 1h]uTi3/EOBޏ/UPB 4l蠭s05P'lCP=ߌMN L`{ЇEhH+CE_Zѕ0#?T `,x>:m7{Wv ĐAmPЄk)0͠&>˔j>Ѭ&[ig*Ԟ <΁~1F qH1cuLo@(CnYIv t >Zaxm4k ynnG$>IϵFQ5 9\zusXf٪FAHJʇڴ=iBktFk[r2?@#'`?P6g$oeY+נCn62czysF-S* EZAQTNܬυs,_5(e-z yKܢ ;ms,1Dɚ/f*9Od:Y+]wL(0[h`}P"fheFޜ¿;_/7)rA BF Wd缅}^KmҍltjơIN9oyfw+a@]Tlax :#xU鏶 ՎR>ڲ J8gkqؾRPJ-bU-ul9h(p7e4rf7-{ ;{zj $釁a~XVź`f@`yJl&v1Pp'n:hB]ӍC]X ;"?yțn$~k=_ Ը)i)]t0xvmU+Z?"!m Ձ@ԋ|CkV[n;NvOʩ¬I@@n*x $q4HW{18L@.Υ0P-LLu)md,#Kx#I"/]z+n[Eq\(/)Ы  4~꼊2«M`lٕx1* pDq4g-=Jdx#9V*L}I8e6*\ԁ&No 1 ƋQfK:zBٶ9`,^bqTּev-pedxseQ>k}QM49KmY<{]'?QJ;\l4R%4x5r=t+_,&5_.G+ ʤdeX}ir{ӬȲ`a/ǁH'= 1,W[p@"'jlrO2Yǀ >fN \?Fǫ^>5xmE4,IF2-Sؾpa7[qS:g]OjmI[T=^ݳGSHc$>NAiRjP󍏔O:-tnps!Q:w@Iib U=m'tu[2P&43t%[8Q\Sцj򢝱sNort D< {/K6KХXǥDvA7=bNFMP: F0 ﳑ} fkW!~ ZY.~gg9+힅j _)0@Ny*nx~l ۝Xc|4kq!˵KsJP.X98|bc،S@EHC0H*df`_iO^atZaHfᏥB A*Tfi/qZgezfXYxPؑ.1n4|) c ,qa"Z贪1D{&Nˬto= iz' C, 9I ON:{ϖ O8_ׅNdx`3=qH]9 8\ܮw<:6-`eC!MƶXB7] .y(;9rNy]ɧ9+最!&K1 :ǵ pbep^nWܖ8JO^(?Ƞqdh Ў(|"ia[D{-5=8m$`/w΄x0 ěqF!f^uV2"Gh ;m@UAmj78Ԁ-== m589 dee3`x['NBoݵ ȧ瀞ëMv[aen! m$HR&,aY5ӺBK_ D{: $,GG^LNE:Cw<þ[̋uC;8>N tsG ,(&ηAN']kQٛ0@K 1`yA@F}uvc36y;6["Kш!͖E̲n%n4[(Ppb> 庍~΁9m.#/a mx7 A'kZNp/DlR>]LHD ~ oG(BJ2ʡO]wb( <2kU;|K`ݺ9 =v7 CH"r9*ok`4n9g{rg vch4~mPse+p&i5kld⠺Rr$$e$Ivl-5m,p6h*Jk]sZfaTkhZyP+?5znY Lv>ɖEn͙:ܢ ?+?> ثS=VZt3g0 յ/ S`2h$6zunTcOI&tIPYm[d ivDJ$f=8FuO`E孹(x0/;12jD=`A]HR"=hLY8I~5,kLw7@` +ɩo$ˠCUttnO+Qz Kx#߇6m $#e0/Ar 'Hm1tmԈbGѠBMw* >4g[hL]ѐ.mV ;z I>;裖1;$a?+;Ȯs7tQ=a [jl&o+P}=H}%]O[I!OiA>~: DR>\n14@1&?hΆ8<2#+U@}O)󤵞/O2&G$;OϣٸJm6r"b*WpFAmyXՈXy+ri BO,ozx%8$DGNN{(DYP%k{ԾVh^g?'" SYj:/ޅO<@gB\@VvqNw?n 9 Jp U g^>2baƂuN^`e,%KAu9:a:;A7Tל9Ŗ.1u) ;U{+O֜Wa_8DZ|;)/`T6ozΤV1I@RErʏ fxOα7خ:!G9i:?Ib|o.:s$qIjUʹPK]ED.W:4a0d%rK]rp46c,ֱs5dOޤ; l)/aQ#س Yi |0%,}qPBy44YJc^*ޗcP</Jh ;xk|Q4Fϝ]㫪*_FT~,3uz l6uFP(vkΝ,ŝf^i>1{ӌYk:rN6OXפ'^pĹiL+5J~V#_ Oh_zULyNn&`c_H\R"Xo/X1JfB*:oU/oֳMR;G[]0_9E>];5#(~GIrj旎Q؀s|-pi][rU;j&୧P!*YHj&bX}O$^Lޗd M/^@]9_XwEh5 */r`gQEM.ǯf|oŖ< ?vڀ36 LF>'3|)iH|4~= VR @1W,@zohXCU?KX+,hu!Y%z8&R7qPy>Ș=0+*8*vvagE~ ;G:m 7ՔTrMH]g·zMJJ{k& 6^r:`tCVƶszxrЬ2AZy !aM0M@nYA觢AtbanmbhSٵ7pzSVA5C~!{T#TO{^O-D蜄ӛO~Vo ))}X;RJ^3IJ{ș P^f@~j5C*MFƿvôF S 9zX ASzk\;@nnm *7:U ǽ}-Yч6h.Rg]IV’eWw[j`te@ҧKjJV][`mP𛽚BgWvluP]ɯay&/aPlA(bi(_a=H>{v,__W߂%u\ v魅֙ԎAz&Ï<݄{8e- ^wu$Q?Ǜ_#}cB9y%;KA̱vȲO5K}=Md ࡥ=s?H>2h_y w1tW>ndj~T{5J{T@ƲT.}pXOZdpEeA6Ӭ4v[^,`w`IsjgW)T) kc{ §KS{ } .NvVK~bt5@3Qq Hsec#P(<6bm1;qQ8-lh:S;it<ڂfZڍ΀&Dc;qձ=Ln-5Vzס0&A6z[@hHo.#;^Y-A9O8/ V%ϼ"MuB+ 項nY=wP HcQԑwo᫧Lo G(w&ۇ? %`o?W?Kbس z mZfi}+y'? 1Je0bgx)!~t( gxv2 7p׃h#)';m()CReUtCZM-x3$]܈C,1o'HW'D ~kFtS`[??:Gw˦:[zf˻-aJLv|>[ q:J=G;g(ӭE:y 3"LxFO7x:tj :5(s@<#L4@933j"kj >AVo:6=+;h7 :<1!F ó@`kQwpр`@W ބ h 8qR'9y1*)_@l#7Ak! G-(Eقgŗٻ }3݄oX1}n^QBkdOzO]OT֐ !"Wdž8g6aaLe\݋;¶(<'xEt%oíp xX=@u!q|)h ǀv9O4~PKx2MWu;Rk^(3L%IP n5]X}+вxy(OT!;~/ ìluhȋa;+3 <F%EZkޭ*x@g (nKqnb * Jr`HFhuv`ZQNQdhkF⍧h%G魯W|O߈>gt+ gJv)A -ޓث"!(6bQȳ^<,QS{5`tijj7_M5 PX+׾џzN+GH:c!FX| .vo;}^l_+>0Zu+T}{wB&M>9GNrd5Kuf9/]i&-xi%o;^tov]i2 lq`41XCo@oc=%آ؋W5a>rqUU]}Ufj<'+%U \Zv:ĘfS@|F"r|H'Pg~HX铆hD-盓.˳?Gq#@qn?Mtt<bH:'xi-n[HBLoySPn_krul1w3&Ww@ ۅ-dc Lx GLe;tѡUwjE?w0ƣfև ,8UÓGq\si):tv|oʝ0܅ Ȁ#e MRջFki7zc{1Q!6]mRR4Ǥ4Tio z\GZIN$&}4U; }tp/w1I99AJɠ#]ʮvI3Tr7It6,j#+0>=C7ޟ5jq-b`ٳ2Krol,x _ -#8͞Sfu)|WqԆuXڛ >hx$iSYׇMk[`DN|hU[iZѿQn6Cs}饱҅p ʠLY^2hZheK}) ȷ 7C5s뷨JBq< xY霭}tyr\Ycpt);ٿM`,m,8/Tp aTz)Lw?beQ+ KIf^{jv\,Vn?J及=2(U߻יx^͢^=5{a4j_{6YkFzAtRy'4| k 8$mx=Cy2=9 y!D&~[/|Rʰ~s#9 5^"mAw<KhQ11/^8a&׺V4^snڈ4<ݖi 3v4Q=fJB爊ba$ s6oN`k.5&qBco nY s^x_O^x`/U4ARE7y ?d:{!{[WbH? Mh*9(2"rEC  Az:qHD/2ա^#ѬIZ%R՝ l+X#[.}}Q?رYOe+zJ#6HPM7UGMa{=3P#xﵽEH3E 1"v`~NE /v,dTnӑɠ#^td,hm)HLP6-wـj¬U2`8@St vh!;ݢFCi ? %>|y d\|Ӳe!&g)׶,$2A.PlK[竡:Wri?j'%.3BvG~$0}ڑ?#1UYmJ/_p %H`؎a@u3 ¯ib/7} P&_;D?]Wh[JfYD:v"o/W)`֚ .t;"lV\CY ٦OZ1 6o\P#F5+T3V P9MUSSz4O1b96yr<2!1bS&Oƪ̾ON=y|ʌo*zտW^v|!؛SFQG;{j*i[/F}uzYw /7{SW6l񽔽U]B3찃w )yD:; ^s¨%A%@bwwT-J38+ ɿZĞ>#=Euq-NR'0]^ꤣh۬htوe;&OE^26i,"'KfD >zHjB`*sP'%sRK ܞypUXZJDx!Zlojsa2NC'Rc߽dWq> Þ,vWp&Ase)Sg][+dF v4cσ@4&$zĸ~Y|.} m pP }tjtFnX$.SziyEKde=ۤfV-UV ( }OI޾1:oK{nZ<1P"ؕNHݫDeYͿ[[g}'>v:ȑQo4:U4 ?MQ#9 il3b\JcheSEp.n,V6Vމ,4'I&y}JP'ڬM_蝄ι/#_4_`̴F|iwSYBHf7!;~c5~;w-{?O[x}/~x8~}<'XQCn'ڄV Y ݈_@R`tʮM;gU4=Vxՙʮ /LG?δ~FgFNyrΨv*/J*Uޏn:OQ| WL>hʰwS#if@cTӾq$B-uB͖$auTӊ3v?UW6_.oF"q}2g2H4$5r gQXy*ڎ0RH<t ߧ[Mn 63:#D%)ʹ$DXhZ&Mx>c H8քJJ}Y-{7Ǵ|fszXCٻocG|p3 G̨c5a(%qZ BdڦYYT 5sl'-pV<UUr=Xv Xc==R` qdS 8y ygo_鹢ʟwP$Mr|Y3e>O6];o5񍚥fv^pԲ +Ӛ5vVDTiN E}6 8qx6`LwNe[hw8֛ƪ:VJL2OeDjF6L!+SP?,aǗFWke~gĜ?,\ ++)O&D 3ReBB ~$  uca?AӪaka9H1)xR hWҸG]u >ޣE\lD40KI{Z^y.rIK!Φz OrRTTW jP^*'D>b%i]uW^9JV _KZ{XHtuͻ#hK^nx6So4j]%wUsa9~W5hSC|Pu?s䰊>";:P6jDqBH_o/*kq4&*"MrŰ MxW V|j, BD/[cqC*Ob80I^eAC_1boAPpiv'XS a 2 $ٳQNo֬8H\Ù!-z٘!*Ri E_J1;@: 69Oye;$Hۃ14gt ''1&[7+{laʮ~AT6&(;'_!_!PTse=D`a蠫ʮgksk8T+̿4;ˡ,.$aI 5fW>AwX+ow5Zh:%`RVS.*nk),%{xW=} kibΔܤgkegc`{?3y,?AR̫6jqhpc30"L`haW5sFagΝ ;uǰgaj_J\+'KRU)z<>d5c]x&cxJd>2Y~r]k }';UW-uznџW?zYNc٪=[K;ݾXY!&&~ A2O=c0[2gBsHuk18KFE@عMC2/`[=!hVmz>9)om۶{M8QJ7~S>N]cO 3!s,bp;6ZU}Ĥ@$ԫc/Q*فA(H U8!EH^]vЗy"$ɇ #Њ?^O$U4~/ߢo3@ iRG;c?;'`gRxDU~ 9w*@#﯏ !gvRP@g~ٹ +4(hu&xnHߐI/ϡcU-lѕ`)#C{&؂`1g`i42MTHF ~-Z` 2 24`BGDڀRe8R5Oo2'{|7Y!U2uㆮ WI+ӻ*ҡ޵J<0g:uXSa*KK%6&aĐ" 6 $lǎ CyGQY+e* ,51{lcS.8ʒSG n5$jb%񬼨%˳.Yq4Yz@ 'uICBi4WRbqB Iv#$!|) !& ^>YC97(Rأ viUo^F>{/+=fvt's ~v2 υ/i^<?Ч@I@Qb{Ї' (DEތ iёGȻ|jn?0W<T<3CCK] xh"laH*-T[-K$Mf#gED|>xxUPTT*E. ls$6M7{s9La_= \B.d)ڡ GzK#D\ DeU9`w6ܨWԐCрQwFTFúBrFԭhEK`*Ј'A7T59FD^Y>Dm+Q1CܒLBt 7 =Pf] 8E+n^+ ^`aJJ{po*2~ C)%~&HPWaL)CJX>y&0O&~{>zs &YZwh(8Lqo4L$Ǝ|8n-{r^7!񪆸q_x_61wM˷!|\x,?qǥ|3ޣLR\6U@)^(x٫w_M^9L alMyz~ ){¾M|ү>1$9.\%GyiWĦ7&Gc׻&\PDuC{nr NWM5z4nv(q)RW(ÑB}BQ}8Af8BJOörzl2Q4<4RƱtء:f-_Oi__$͛;u&j~GoX4T5Y|,kMmur?={mg tjKquiwaMLjfh<NG5<&ūyNka*/Ѻn. ?Cd@8x)+~Na~l7xsď2qN%L TWJK& HZi \=F.`+* |~-TpZ*5qqUvay*^s=b/UT1oaԼ WGa}GZ~9k@V0pMb b_#y$$\j|0ae^İhmXejq" zC8؀SpnU؊Pq{{l`M=) afGj>,oTpw!6?-ӎS]&vpqu*?{Ca3)7+-~J:Y"_ pqj"Č Q!+ق>(jZos-߂uzvy7 >ӹV+!< q6=xnant $ " 1'< bN8C!VR!sL|3~-! 1YG5aW5ay\Sx(gq |pİjNP>42A˙Qx&[c1g\z2vz;S0Mrߍ@Mb8&2&ZFkbx*(54l/3Z|(2ysgve\)ٝFfv7o ^9Wl}nw~a:Mκ4# Gm}*yq¹ՐNJXW]0J&u9x6dz3>wً;;O}| |w?glݓw+bv k/{? zgS+_\ Џ΍'~/#~6Ι kޑ}^&u<{!]g?~?7dLxd/}Y3.sgǘ7Ⱦ:%)͛Ճ? |_LG:] (Kn3ՑY ^J"31%$kRWc\+?3Lfq[O۞S/`kqi⫁/ &d+v%EO}w;W$ 33k=6gN $,,?kr?Yٵ. _ f˲>X/ӈԪ 57ii6vc)>ev{ďEXO~aw,Z3IΰܝO؂3s Nȟu><~$_m9,;oQm8!U,8[]i_%ڜcl_:αOQ!_cÞc0#c!T" MyV,]n#_z<@1%]ز)YGW/%Eҁ#I2ʿLƼqT԰OmxxA5*/*GyZ ?e6oXWհs~3%O޽jVUÖI$ְY;ZWZ] =s eKgjYleGv"kX?ZvaJ7Qʐqo-[p>e\_\9&<1sֲٻ>_d*KZ6lq=Rʐ}͞\_*kفZwUU2ScoLFzpo?<ɡ.ulGkM'Mwߐ:fO\!^劔:lEKV?eȟ]]:C_?Y\u<3oʚL?sul¨; G\ǒ>F~cmcr|_~׭CyTR37Wձ :?xvT#:>T~̧8VObz{=[8jiK.͇:z`pQʐ-94K׳W/2sŔkֳujݒC攣z+g/ݱ:ͫ~mԳ[UdyCѯֳ5s)ƣE;ٶH?Cֳ%Pҏ|ϟq{du YF.K?AX=Ka l.Gj=!Ow%iS|Fb+KPʐ_`O~;NΏΥ -f~W'%\M`8hUmݤ_%إwVR[sN|YVvGzeWX׷9?q2/!iAyIޏ|Z׏!_/~kC@'+ ?3smŏWm *חۀږv}@ڮI?[o(^.ǯ~3 4%˶/oyY>iبIS1u'N=`^zCGx\8Z~b%mSjqz=bZ_COdqSwтːϙ6ȶ-{Ms=]Eb=˽|wR ۽NViI?^L1zW;FY_9g·$Y°[WL3PkR1'I^|iAIGu3l_<K2=d-w.7GPi=.y"ߏ|Kuzjv:A"5nݽvh YB5 ߥASm_/x;rѶS}ON8i\ v"ҿ;*~ctY(h2|Fƚ [鿕} |UAF:@Ѐĥ|Ti :)4i~|EJ[RP1".*]uk(jjX \Ī"4-P9w&%{:sν{ιsd~-aFxR.7|…7[yBӣ3wŇ=qϯ8 h.ޕi_6Rxᚏ?n乃hyςo?_^kg)|ߐ7TxJ3Cwſtmn_aMOUo;>.yߚ(z7b䵙5;HEI~ ?ZcxegVO mtfx,.~S3W#_qep:oCb/ Gͳv cCb?(WC ز_OBGIҴlh)ٯ١MCszOH}Q!YcwWO?'~=6$Jg ƣ'71$>Pm>*[C]>㡸|J'oK]&6%$^mf~ oސxh,K OJ Ž~Nn*qEOH|S[}ٌ{p27;. t5)>/7$f+Sxm^H\}jَ'ymy~H,[%?/<./ G;Vg)|z[GOiys3$$]p\*9KSxb!?^w%Bʐ?0Eۍڪ14 g8 >0m콚!~-aie&&mF)̢M!q꡾-nssfo%^i"!|+|x>p~! /ny9Aio<5}2so8Nඐd&j!g)jM:6i|P{Cb }΋)|b!OSWWiv-'0N-S}!JaB|PxƐa_krcnv>@H˒͟m:3Uؙ8.3Px_ĎqOޕ?^0XHRujG/>gjq O;uA?O ;js^>Rx?΄)+_ο?ƥZ|]Z~W!#.U)xKHuZ iZ_߆#,|x͙/伶~@Dk̗q] ??pɶdMY2<y1JM l?m7j JGH|iT` —_}?kt6Ri]!qWѺ޴س}g7hrS0!\6 wqȤu? _ەB)*Cylݨ74mo !+FzC[!'N%~3~ ?n:r[3k[7L(]f'g)"ck?7-=/Mb:9n[f l.JAw<;C!4\B!8N=9lՑbB{>5sdḊp_Ct8zmBj-s O?sY-4Z6fTsGwQ"?n %s,?6q̷VeV7,ٻgc ֦=Q%~|`ZT<{Al-70o&/\.xLc Bߺ?} ; }\ a'i=3> g}Qف6o|*ad(/; L3*z\)w;xxA(w>mA |Q^n7Cm~k|G|= w :G[yoOz P||Z_7CxYWG@Y5 > ڷ~^Qпr&_+,.]SWp/6o͟x o2=iZ AX$oA _AXMN|AxؖM07% pAXWypU i1jAsWJw3W.~м^L╞ر<g/PVra~+W}x*;F+p7kQ%Hvgժ+e겖Wp..=n/s??@s܋?0ת+W-we4^Xv\KS^e@ΥKH0W̞;#{,79kekg}㛷 ~ |/҅:}oW _ &CMA \TƱA9i Nv ~ 4Q\%pUp{hõ:ܖZp!Cmx&@ ԍ P6 ~Q[x=n^1Y\%}\ǥz!"qiqq)q.Q3.%0.2..bĉKGF@\eF\:T3b{_4 tY[NxA8˵M* KVF#\#c1p<ڳ=0@P>c/O [AX{v}^mgby$bvR6m2i$4<~8'M=2^iG]MUDFx W#1QE}uOtJ E 2UH Qo{zg <&ֽԫOfY7wn=^o%Ⱥ4rg{H1)^D#Ʋ86f <'EЬGrx~pm]N20lʝBU7^_ HT0&K'G>m\O=q=}r\O7{`}zjߓ ףI_ tz)q={?,S=@mX̓0!:n"'\d13} =y{{:}p{!@EȲg&^wGi/xxlE-w?_h61Qs>q+^az (m*[s#exH[Vw\WDǼA->e軿=۝ Zznd9:D:}'EL.'Ĥu Imgj=?H׾vi%Nґw4 '_Ť"qLc*ߒ+@F .Ey׮(bn#򕻭|OS6(WrwՄ#(]Β,1֏1!Xɸ'vmE$zscĪV'WLj>bb@zQܳȰYvzhGoq2IfǓJV\gAFl|+ߊGϥgF5IΚxV!pbHz?]\ \RBn(te'ϋR<>.y2d:+ :q:G81+.RUWG'P[6-2ݙ`tFO3|7w?-$[k"q5͞& Vi,eN Γ_N Ʃ??P!? @?YUot <+ޔq@#LWlXhktt!56ƗOI6-`,Hmq>>6" Qr/b[XRf29Ummfvt].߬$`Woɧ-gZq}F|W8 <4a4/1C/|yt# u}ӓ},9"98R2FmYoF\ f|P;|Zi 0$'^4eCQghfY( yjNE<2}/^-mLW%GaE7R(1'mFap+RFkzCvlmn//_Li4 n0e1R:_Y=L2f9}MɄ>8z|rA%O:}E9A4aŕax!CGy9w<E B+!_fZg(pDOb$[#n 0 i+y\"U sTc٬48x<%:)0p/lӲ"ύ6;a~]秌BN$ rs2 }d ̽4?!_ץ?pTʓ =V <|z(&s'wtNm/X'_ure]_gJ[_r5:.!e>{P'` sOp3iptC߻ :ēTd3Ir&%.oKvߙ)oGw6iUE~{ 章$ <2Yǁ#8aEҠ8"0 Կ=UP.B%G y6_Qy> oWQ(s_t3 (3U>0@ 9[A :];|3\z_ZA$K>D"uYZP|Fg%5JfhClmhkl {ZHm-Hk~z(o2T$'o\;˹KOe+iS| (-amnfQѨU\A(tK]+z>G>t/t\0 齹x|"G.J; F :__zT7N&(Ka5J4x 1h-#Rhr!`9>_!VZ%؉ӧqf$ 3P@$/L)Nv :Qc Iqi$譹a gW#Cp=0wRP ѵ{.h(S Q9ti14B-ta3 Zk0W#>vbFȗXlX"Jfc ƳPxH|[stGUK )jT,n(Ѓqj L#h>7ć7t-ރM*rD[T)/(I*JvAQe o $KrB0I;W]ag rD`O | _0\BHMrZ}}oxK204CKWSpI&M節&/|a44)-t aYj N)8L1Va٦q~x,+8rfn+V-<_GR!L$UP-XD*[0ʵ-)wkK쉫7g{ `nPXHA ^T@s$ @e4<4Y x7F-A$sRR}Љu<hQ,`s<@j[7)m,D5GB/U VxױLmD>I=K.*Vd+Bh" r WXv}?`Pvv aضuBLqҟ&OոM I^W5'1#8N:, 3_cXkqQ0D¥ jeB! %yZ,!dE6IA%oza&sej2 yJdmAV:.],-/P'G8AS"R |8WЕ{<2Eg:ŴjzZʴRTs=#{/w-Wqi͓@ns-&xxK8[q Ԡf(r#[mfB[`z=,K,ML$FC$ֹ3MBFoH!@NIΓ#cfrSM%!e %9)%$W3 OsAb/$;^dHb ^?Oݖd- /t^Nzobg&􍶓뇐<1W%vo9q53pe?ozt4?:.M."^0ݝՂ\,N `SZz*Z|nE'R43<1:JOfȴ´Lڸo5O 4:QR^ӰTĒsnD>R@_ ޤ73S2I|Du?ֱՒIc4-iZvGbP&24H&M=u ʳ#6Ouw3KÇ\3 $sXZZOͦω 00z59FpM 4NVdS` 'Sm\ﲭʬJD 3s60r*N9oCS@ Ggcrr*6'wab#N| \дOy#<2d)\챔au2z\fȡuҥjsmRV f"CIՒkT|%*DLA/o 3o=ܥQj6R2-fd0?ɷTG29`J>Ygx6[YfgVkWaUŻ,iLP?pI2 Y fߘSGڲ\A=^US|k*RG V?, SAPF/d*k,S>A00H5x}# *]_&/߷# /|'хH$/!50ڃII|L͒1 >˶&}]ih%=CQXz8-ғ(ISwY2͙^n9+"+#_Q)⽢Yە #\̳}  ~vøxF\,aSNnҪT Z*FG.cId'uأC|6uODMe,vRMzϭ0CFLbV2[qP Y !yOrї_ %& D;Nr\]&{/5/ܹeqɗ<127IXՂߟf~Tk|Udf+7W.Muk㱼v0b2 PR}gcTjwTSO /.8:OO鄻$ +cUA1ncˠ| xvmh!"'n'98b|L.@HG)XD\$hj?[^\ [- 8ǀ`R[I;ɠc87@,jsI]zk:w? jHn:5O 2squ _ hʕS;0 js1ޔ2Kq}Fy)xwH *}N;?ȦT/~S_[T[^ę$usM]bI`M),n >(rM2-c6 "۠-Q 5`z_?ュ [i*c}M|-?\} PA[Ƿ*o7צca|Vxfeld [I@!E]ϑJE)K>&}EPuUHV0hЀAms *u0 NOuI@*k()ZdFb1L %5̆\`)uP`Z}tR:+^?9+6xH7  j|wJ6ٿ96edǏ9Lk!cg3#oJvb, q'굗c"jG2Tݚ]ڭ˛ʍS_.MTJ\C'Jn&kM_uqH>Krxh߻f.M88ှdcٚcN1`_9 v|^I}nE54nwܚw 4+hLbu F|i$v\ tU%`6<܊~J MtA=.=I2b>j?c_|p"}UO j:sl|Fȕ Y# hYM3Wd٥oWpw/y$Lʷ_?|fo Zl.ZR a7/,E쉤:+9c󶼩U珠͆08iӪA>%]4$uD Yˏ `" sB}oW2"<峸mδ֒UsPq9iكoݒi`Cegt1je@-eŗm+-7/9R1Bź@;G{__K{qQ &.P|*~pFd -eRV%_L6Mm"-TR?"}5Рl," Xp_&:eV7*@NqMT聄uKoV&ίDuUKi0q+ ɫc^Fex[yP~]KⵏKᎎ80aй0 _AVjo Dc XI%P;ofe:U/W'ȯv)|' F*RKcզbV*䱆 M|V28b Xhm-ƂF=H!ݴRbTlMO--LݻmG,ЪciL8 N)GM7I9R6"m* 5  ŒYv#=j.oHTI_uU+ TY9*t"vTmn\ w_JOC\y:|? -d`dhGOY\4?I*tV]]B +Qkn16S)B:=']rSMcI6f0ʓᒟOI00pN{9 3* Ӝz̗OjyxbsW70n:ĸnM2@X:Q9f*B|@DLy7aR]Ҧ_PCK}`Tŵn&.+.j4 $ċ_ ?6!Bmi{P~ڧj[m}WQ[jBl6 )&&XSt1;gd{{sΜ9s9g93$`74vGQvF_R W}+fVȌWttq%ÇJ]Vd^E OK2؁/bK8 *H ;)37H(,t*YВFO{lv|Ri ٘5 Y8`JJ2(5 4:).2Нu!>T]2<ު-w Z7T:\0sT ENxo =E+S?Ž(dZxOt2ƈ#bH9Ii\ ./aTLHaK_G]j2#P< 3ȝzOlbYo :U!pK4֌$$kP6 Y |yXs- d>b>1q44 ;Jb+>QFh[Q$VAx b"l.f8F".Jߵ=ZW2C*n7$[X3Rb>"E!<<bwK14@)d(〢FJsj\.824bT5jJ3T^=uC@<#)HX?uhkTsCC6*);`S1i1Sx":li{iCh"ބyA畛A[ksA;c/-M6g!0pwy#jg: 0@^;zpV!7C 8.q?,_K(GeSUxDHw*9E.i;D29ŤNׅ> v.ZC:&,?*[}KjlaU`hdV2OCsݿg}r6\Tsυ^.g 6g{tnKZ3/ɸFh4f_O۽f_T;0egtٲz#&C43yiY/>jyxT|Tܮ{ h Qg5eJb ӕ( v$h]yUv+Gd%l\m )T:@4|(镎hU`!܄-6<t7ON~r0l_u9{6)]JtJ9n?/%]!3LB/vw !P^5P6LTLE2 3\S7jVݦ<9զ׾ކWrM'Q0}6C`.\L:f 2^Ldq=b*X\~Y@4&CA +ՎPrG~/ jLȱ  YNUL2i3Lm ͅQbIA_13 ax 06yi౫[gp/RTRO03LvޗA)EtO^S8ѡxBmlNLjW%l9ɏY*Ĺў9F~h˘Sm؆}]{oNכ C =k`eiqy^)ͤ40Jao}yn2f.:ާY9j`b#tr2+2șQ 9GE-u$够l2]˅NT_Pdf?$;ih88B^U1qYH2Bzꎭ7LP X_zSs;bB1&.ZGIf ūC8)IA1Nv7} ɀG *tctjC#VO۠Nh71:S$P׍ 7114IY#>ʄ5vh¶&ŷU(#jax)%m )L SC!{IUܣxI'60Kqc1+<$=UŎ\Јb>̀%+R fL08q NQF('eNz$Efޝƃ_jR7CwхQG"ʲ kcߝ?j/T@tat*m.i3N˦aI?3pjV?æ"Ex~x{d9ʀӋ҃<Δ<:AvѮ0.ct:[@a;@_l=hcf&]$۶#dX xF`"+jX)A,]?E;[P_ -YM~ E~%۩΀r&4J?0~q([!|/zfBD}%k8* ~6ٿ'zTXIJU}0 \G9.°xV8+h%I#JHw#mu2r=tW_lU%\6,}G+}vC{d 1F#/_mE?E#9/#u3Obam|Kz0 l,i MJLc@056f㤑aE zoFe1WA&w7&_TM3_EX๒ ):P&[E>c`a+^n4?oE9*ei2S {1~8 J4s6Zщh,t4la)?8^/M,_sW~4RViaU_:f+/Jy9e"ֺ"kGIK+3jlnF^Tr'sT; Z'M)c !kJd4@}tjL@2017VRG1KHM ojz='ECsr r@LBe_ouzz*i:6شO\?% s;ȴQc4仭*n?CfWi YQJH/YY];NxccN@5޿P&u%/i A-_'V4.X(<%otU\AP]1H'-T]CWr }╨}φ7 yuUdΏ lV_Y]+Z0XY Vj-py |Ic]Ɂp, a^U7& $&b>+cmAͯ@/&OFOРXk7Q dP{]TtEU w2[M@}@~鞇LRMRz0 oa%uo^xt!?3l}Y9ͽ`_e%Ѷg3ǵ$.6cB0]zg8Ŗ8BXwt%ca ϥzsvj^6bi K-pP$WgAst!<޲ JR"řЬԎM)}|-CY]ɍCWW)Ь|2Ean?Y(^3! t#4۷= ͤML %1MVƔ2Tab*cGSq;k,ObfiOxBV m1%qVƐ04Zfm9wԩqSJ@?NӦ0 L ,`uCw3אG_[x >(N0J"!Gb]w&&PeRKɇ)PktO]R1t |EYbWĸܨQf i(W.̶q (Vc/؋_ȌvI=OBO{pڰQjѪ]r)+#V29Nb!QD3Չ{S~Ěz;2o7[iNhM 6)#iѲ*cn@Z(C{;{=] /oˌ=#FoGs qK7=h= -f@K(;~ɷk#ƯadEU/Nci䑉#3Em(jVQJ%zgFMss&#Qzvz]j~UtYH;@-,7Ah߁v~r(8݆'q/ hW䚚E8lAj3Uz .` mXDcd8iɄZG&)m+ xN>j2fkg&1_7AQgӪ x-[MVdo_T+OG̜SuG<*x@E}SmF\M|Ϥ}O軠<_#ۛXΜ@&A.uٶN|~{(rk5W{n4u(CpH~ w A(y|G`t!~P7g h'ђ蛜'^'DnQsz'fZ$ C2CcRq$Il3xw&QرeA(  71(h5& u}wQ>KveB76Gk<5-9~ %->ɄCBKm i1jǴK#:_AxxaF? ݟY־ռچj(V|qdZY2 =75f#c]וgm&fhJ\_wGk_WGlGoCy`saVYFHN ͸8kVPl{xCpl'#ܑ64?go&}hZlKfLMo)R:Y M o+ţf5|J]i>-(󖉼'/z\!ˊ5,iSx V_./Η~{[&,:nm eg3LcB҆'Ae3nR~P{Zq'5]= _YY@b` 0%N{'1b9x/?\@uу|_ie&yii4Z_-å0~a~]Ʀ,٤̜4o&\Mװ|ѕ6{1"~1Z ٫:%CZ`&nDEQ.@&7Us}-Ӭl!(.@1{O'yBVI0hЬj\w(}'ϵE+DS 5%vLޯ3Z^f=<^^b@;q0^ʷ0Ȍ(N_rDO9 j%H#Sx4; ՘$8vlQj6s6)7G_HʘqN!3l ܋zLG2slQŘR7vZ;@eN\QT^zNSxS*фeQi,x=i7c2eo4J(i,+v%ӡWf"%Lp) 83E1Fv1h)+c:|]|D!/\{ `-PҘq7#<-%v:eb03A5r3R'éLhhOң:Hq*-g9:ӕ2iAa-?Dyx^qm9CjW8H+*z{x.gzQ!Ұ3\;9-e ]cfq1#x{xk6=sfDPS-Fƈ<:{Y2\,=G̡]7i: ,ưac^w2e~xG><(7Or990Yr/ 2dE~쨺XBk| ɤE F-xX)E 4)qqM b]e v[3"CȢ6BTȜsL I~7"ء!X̫\iPs}sU[nEFK2Z.Li.*[@tn1gcV s]T΁o1 ?.1bTczXļ9FB%zi9lxIyx?41/b;駰7F5x=eU<- 2-o VLi&c/"ܶYa tΐɍLނ}P8555[o 5J46| 'vӟ__V^ju4Ҝ^ y)'HftSQ>EM'roy=NpŭrKUG,%!tnbĹ&dkޞF 9C An C7 nEu3"^MuWr(~Y )' b"uĞ"{ʉvgw u__ZsD"|E@@qx%f3GVQųEXJn>EwNNSTN1O~zЌw>IE,T'J>G`_@O LW=ʓ=L|g!:p8ţ;`*ZZ,K]6-DSq%OW/n;zW6ȭ Ws] G,Lsi;z|mZsANE}]mDOSѰ͞M a{R֦i?vS'0RvO Q2mOMQX;5{eug~wK&p~eF vv7Da+[M4Eڴ S;b!So<;żlk bQZdcZCLl%eCxG4-&2'Y@KqW)E@9,OɮIiR{) Aq?66<ʔޮ@5>x{-߷+v̱,GaX/[NKq=@"S0 ҮH]л6:)s델OU='Eo0'9WrgyJ\w[[~V$:$͘nX8mٵOGRZ&[@>֔`&@` lG?ƙ2yo1ӗ&z&8Vv2SN.1rdhE>Gq<vX^VՖ-HNrnqOKmh4=H_ Ut WoWO^~fK-ڨI~ !p @ l|"~M?oFD #'+(Y`H.09e98.Yg!`3tnR:Bˌ3Tl7 #^;pLj4l4}' =Pqsn[<y )HX6~h[7۶绯X0NS+ $&İ;Z+0>t_SDN!p$7Y^ t h57ViP EW  ܗ/D`Vz;*!b5SpܲktvUKiJqa$fNgn%Ny"ws rۭSE s;I}jQ4z2!O`S ~+U)'b__ nӋ)-n>1?֗wY/ax ~03°h! +kPe`,d'|կ@ !p#>jvw]²gRDCwguyuile;a=-ѼFA0V/$m4o1Rh5}D҈VЇ}ݡH1:>pEF:L:aJ{y?d⢒u.<>_)#ݧфehijSx)9p9$dWN!q/ bYjzVc'+\Nm`7vZM^k%w mI॔lEt9߃.hɲĒEu㶑UDd*%lxb"R'hk] }ئ7d+-. /Jd"\W\!! 5YJ$q94l*S_uФsXè{(Hֺ2j|q拔7= MvucUÅi~;{Wf#A}@`tM^hpل0RSP P8'O{cƁozEWiGygwNmЙ1ˮ@y8,ᤥ"i4cRH`a2Yv#EjP, '@57Io =#aA{t{Ǿ`-}4BW&=_G1" xy{Wpͽw;# ՊIPUD E5q5+5ęi)(:V^3-: _ٰD|Ͳ&3,Jصz(L(sSztYaS7:s&3/fj#FPsL:FcTpg!_Txu/` 6w4Oo6!03E"ȧgkj;RMH#1%{9=Ym%MU^I yXrǜ¸|nk*hf!wMiԊ*0F"\ݸ[/[veJw%v6qS%ݿ5AxPPL9ejApz_#{Trl1dS1/+ {I-vΨaǃ2HZeS ;\h`{ijI!@O2,P"wW\&%ˮ{Qe`$Y8%Рv;h)d&cgdi@*^e%<4<4xmrzЎ*/5ߩ.u#^;#iS= PS3' (/;dϠQ`WM(~]:2Ȧ*2* EcE%^R9j S&+|_5Hh5F+U%i4J~n70ldihu>^[aݿ%4Es!$pl1[ݛ؛)ԯSa:rໄjW{G0Zm?k^ψ_NPt18(][R\2v^e'x\P6 fs|'gi.D,ՔGrNЧ{8"H / xN ۓ `3`CK)i 2nLG8FV=Z+aW,YިN#l ߕϮ$i$ 0]vD˚HaRڱķ9B?}O1ͨ,{bKhU4gq>q4Fw$S>*70x݈Y7=%S!6^YȢ@oz)oa)Fg"\5%~*m[5s`-\胧09X`Zj 3dJ,)%:_{ÉTtp]( /}}\T]k0EދsPl/${-1([A|\BxOeI]vWI#Xie9ɥĖ1!\\@&OFO(C—ձ9Ҽ=`ɦ2qX`B&$gكNVE^f˃ ]6rP0Aqˠژ*'woH <Ӊ}^4:Dy}+A o6w/AãjƪBI,@ [Y<JMSE21k6E즩{5hdkG$+^䱖峁,R OGɅE=T9 9RͰhmFPsuZck m,^e7bGd&潸^v 2]5yJVZms N3י37IoP:K/oM6Yϯg&Yf3Qڪ }!X8rυ tP,qo<#ٌ%BT#-ۗKR|\U8SSQhy7 -@=}mQKc1Z8xH]UMޔ uD]֫H@TA܈c1圇DŽqia34b63: JYe7F!vR7,gLXM~z@be/x\5p2V+L.q )>JDS, ֍III:w3qM<-Lėm1/tmAp ` H D =(0Ha b ‹pa0kjQ7 4 ]vtfv`Ч@:TNGˮ:<K!<#GM‰A%׽KA^r9o!DŽa]8^Ssr:˩ȯJx(1d4OiQZ@6K8Ii-YJGx4Iy.dl}Iqox$>RܔC&91 Mip3&wߎ mqbFXeCğ;1½p)`yƐi]N~]jRdU3碲E2qwrI&lI5W=fp}PH U 2^=S =uiC}#,U>@{1Ͼv 3  lᰌ:E;3!'n}dބmr-fRQ\|IڠN*5aԫYxlLW<Mu%c> \#9Kʎy츄l "gRLIS^gg R{DW;\T<>An>P1GI+% !LP

    zl148)Dp|#YVlքn^-SnM_lWN+MtJmg֨>a2–EB ̬=4&^NуZ)HHl,/Ӫ1s#PTzGBӠC(\DiX[Ws1<;5~,$/*kB7ۭP|nDgukτlkׇjy|U=?[54ȃ:~qoY<=wnk;s"˺z֝`1 㠷E~Lt|YF*]>5৅S'|{_~冄D'=X]͡WكA+i̙[W2vL8=\l52v-=S`^F{&ɧI74'ucuOdܿoYhѾ2]?rL\ܻJ::<@nbvK6-㤥u߱{t~9~"5jfx"MfRf&sYj\b0%|3ucy^l'x~ G\"orHW[!]ű9\c.4pve 2$T%3s7O|tq%U0,F@t%(?Xinx=^Ҥ7SXAPUCk%q&yqK7Mhx]?I9h~ 9tԕ6^6\ |i5JRfI|Vs[Zy,K7e|e*$A$3$&Nu8uK䷴k.T-0Tyh5=M?*ZHd=qM>7oZTς,ȕ8V쥽e+>:דn'33'xVl"קaкu*=+ +@ץ%9lNM]_L$i(ĥ{^b*xgI >z@M0HZyOeO'}c_L/PJt9B[LcMP>=젘̓,]^BRΑ@?Yȝv*DrYY_:Yk);VG֮&yoOқsY<+O}$EJp֫~E x dr`YA-(YR1Du>cÂ{tEȘ7b"*?\^mitAm0o~˜Ԕr !I?'SKh,3 $;I*˓Ɍ ?*}Ci=4f(ƂZf v-:|Gf8MiVVnGaGT[+-M71n~~QmZkcvr{cjt 5 %DFtXoxu-SNԈ@?4-FМD5ීەm;, m(sYT!RkB4[J$tCVMJ>;hW&Yɶ Y֚"vD#— !:%MCQM{(jYC8 @yŅlC Kwmvֺfn2)7N]JnQaU*`n .f*2Ё0䔊<QL!p : b.ir*̙6d'Mn}8L))HVrSK^=}ihqM8qA&9@W78T`BSFR"^d D)U$6j: V2_#&lVSH5GuA-𷴔N(ַC,ɿx0$?x=[glɋwbFe䏒 i{ˮySy#3$'Ʉ 0@EA M $3D$ N-P!@ۃCQm{k/ZU1!B;*i9ZkL?ϟ 9{Z{ߪ r>o)L|PAs/M~e{3"K-MF}: ' ͊Eʣt1}1XEU$` qP717:[HEy'̅/}oҴI[!3NbWW #G`~G{[,Ki-_Zya,Re$>yX GOSX.>oiR^wތf1aO/reHM",``D׊bmIx>cO nď,S%cR8f"+O{1$>,Ꮛy<(>Y|0WbRc}40RnY{+`U]hgvt!l/3dg4ioj>NQVxkO|ZF?M⃓ XAz9gS8cCALxdFkx4_fp1p7H;fSl^Ӻk\L{Z,?pc%rw)I9T7>0< ؉jؼ<[Y=4hh8qƇ$álMbQm-8/# o#}hwٶ.89i ||m x&a !Dz1'iDxi"#K#m]*[z,YQhH"t;h0C 9WYy6!6mE\pLqk>wwh] z# <+bAݻCQ/:ˍ #Aس`DM0PuãKO{+w_3Iwaڙ(q&ӧ?g'; aݷQ3>ۛBKT3@Ly fk?ܜnU`vt)M< [,&QLQ50 :Vî^1@‡@\t_[LA2W ^P ێnL;$нQ]}b).vh6<6ؔ[ ވ3ߘZ087&58Y8unf`O͇ft7G`(+'@8]H 69i28˟RNT\O%8*Z dm3 1h%+61Ta7c/}W8޼Ȝ;„WX~lq OnU&u,+0m;=҂4^7R'**;{:9Z^`ˠQ*75>E77+rr^d>{;ų]2h Cl~caڷrz[YF<70>,.cL/aZ[@^g?T [t쾆[āAc_1@x]ɔxEo1{ʩMB|1d&!3xvvǷPxf{`HbpQ-^\sz;IE?B+:j.CwVCrqa+&ZmH٬ʫ2]83u^]d`e7歽MG'7GRHfxtԢq(U+l|8 fXtLtѱBM.pӋ[>4K\ %*AJX[T2eGa־3˻rTNo!JGOP:!Ɂ[)l\i%zsY|)h o^h^,0|.PǞ6"zc3ʯѴmV}=yL(Lg|3C~=8D|YA%^\G[Iw,;84J9%{Q6ԣ&la∙9/XnDPҬP*N,b JDˆ],9,\ s ^ĎC':諾Rи b2molp&Wv-Iv"H If 8/= K찞;.S+z({D2.*Kwu ~|=#mn!N>n:h6am񵿄yh#4wU7C,V+*|U2( 5>- T K(#LQߎK|W' 5# ]*I2ݼj`s͵Xb,f׼hs}s.Rveݓ?OxgSsߌlpq)u4giف9i i?>VyNG'yv=9-A;/ccFˎVlW-N[i 3QåKmTRyVGp qۀt `>½RLݓF&҅cYu},bdk8%[tm87z03 G[YlevrwVfgTiU [qf,n{{c͖uBďphމmƞ&z=FGtڪV{Oeҳo7`0;}ctI{(a=]@t! ߴ,zm~ZeߎIW l80Vf`miEw=ѭbO$z쪞9D@cIn{R.US0`r>ei0=n191h<,a|_#Rr58fgl]&&ݴ 38Ur,h"?7 V&suk:54T",o^vWnQ~AC]l 7&U]׿}Y%pg赂U(QR eY޵ l͝/oflcbȏ`ԥeD ~qL%rmȨPC~%cd9`>fâ7ά}-`~Jѵ7D7e!^ SY@ zc,L%܍wnCVˊP=Y-az0t-OQ0_J`Z~jΑ7<!}`rRو tP$DžʌBN9t$8=x3!*?7[Lo_@q\runc$x`g(Dr ?J@ mb!D_,w$t(WGƷ.t-nU/Rc«;_MB|"Τ^9'рf{_;r3؈wmV:Sq?ΰ|`.ȭ?R;j!RW~n^ڇPK>'-Y}jصwMJog4gID$@{N4 e~Zj?PMw&k}wm&$Ը=[ت^q8go{|`yj WVcś6zsY%ޣR& !Wa *Z &{C,8__gQog$6_reHAQ }yO)ٮm1 I{\ٓj3|xJOcL`t I[>` % @ Xchw+s<\bgẺvi>3gvg{Z@~&x'#š1G,@d*|H>$(Cr}H>hȇD$N`?hlRDmrlae qe-U,lUh 4 }<|_doI:Sh92 xYW$4BPU(ot:LeA#f6ROV<Նx|s$j4$=yȲ=۫ʦ4|W<7OfM #p3ҫQԋq vcFh6.#JLle τz1vW 31x:{ wZ|"/J$݋[V\iR7|ۯ0(wɖ?ixk˝Ve*wU~{T}q8[-47ݍYnd y $<Of](Hoƒc 4M_^\٩ 7no,T1M=%rK!~\e1N& U eʙྴq,V~q7USUu*}ﲴuh2{ /HPCT}^^cIL-PΗSUNןRZOROU/*y->wܧCoy{??6ץ꿅RD5 rf7lք%醟h39~F{ W >>[JB נ PH{3=j nY"ʌ\6q^R?̇+B Ti $X2^}JC i9gtC"a2^XYPİ6% ~QE"+s,lX*]WW2+~Q3،uSw Ю UF?#AVm̃q s&7{Ԝ1 ,mvVu=+^U$C|n~)ay]Pn 5Kۊ0ɾ2P> D'߆vb k3~]VS* 1*|KZfl?SzP/b[ȟUr2ҽ|e<*2[NoDqI4vF3M_]A.F|>oYxQލm34Q謫eQR^$V,ъ;4j_k>-s`uQ0t|O@!ǍP~o.20A 7[}Oi^T9`C)oAAC+GtAgΖ|:;Gtv)c+7;l#^g,Mcp"`A- 6b򟍿b zM>u5kT1ҵnxp%Sq(f"]1dؑp؎?0{!u^x#rB7YWs'fлXњs%bP1wO^qWXу$dPVjiZJƉv ^4aBch""Q?\kǤU7 Q KX].v ch4pQʸbMMDZ[lcaALt%X>   _pǏ q)Z 2-).nóp;ǹ,- \kd57Y19yV,/")fۇ恮c鍏H$I3퐌(|A ^#/N<8\iaby(Vz\[a=vxGXa:pݹ%vNOJ.Q`U oZ(o2Dc^%w7K`M@A̟KL{03xЛxQÌ<]|L|Y8 lJ$X=L`fz(-)P`tѓF|=8}XE0Lf~}o>kߖ4?Ai)<qGY 6kZ] Ϧ)lkU')Guv:XoWFCuWcuŶ^!QD5 η` ^JvtA) =p(iF^l\m+gE8~{7"yn8ZP[7B+.ڶ-ȳo.yc숗7<6V5izy&2\֣}FAr6mTq]sv4b]鞌pwž,A0V;#.*͚SN]~`]g@{;d-2渉cp m #OYu:pUD‚zVEFiï*/˻r +ݢCUӭ1PeDAB͟|'Kr%wW? [af*jlZ'zn(xScd6^Dy=[@m IEN2i/{cIE J 5]xlYH,W]QS;CdofFԛKFOk| 䆰Jx/OY͗ J9d[&"SphV"wͧ l>Wwƚ z%Y=xtTQ{cH?"wѭG]vKo_ڐsuȐ3* 9t)E3&l1=ȎvaL<C;ΈCvSI V)~jblAǻ$<#Gz|ryކviBla  #AeL ]I @Z":taWZwU,/ua^, % K1^&Lq貨[T:6xьy /BZ ,^h`?",}QRgӻʕG\r ʭirZVlz⿴UN؀^tU6ۯ}ogyFB׶7cV?X5 fבV]?j}Q3y@l2pui={M4walF9˽ksBAIcwX{7_@ZR%Տa~^vVԆ $<1TCkQ_dSZTm4 ykof֠0vWy3#m=|7mF8qO/zC'~' F_n?O1E]z_0BiyDab,r1_Sj"TՃ dQ&C$C/{u24]ZGPi7@7&h6IMxE% hJcZkn߶LTzJ)-Î'/A\MdkՖ lg,s1UAZd}@W3xH(E4ix+'$ңEiۢ#8Jۊq~8[5AXj# gR?>PrӶA[5uf%Ĕ.jlБ(,y61o Е= .3{"5k~`DSj/)B,ԗ" jD>t糞Tbw o_7;ʼn\jjRWF/̀Kw'vv*u?9YŬ re6 gvtc*%?A'f1uy`[}I=ʜ.zM{լ. [D=58&;`ëpm QNI0m8Vyx2F&ɸ bwzhPl=z)WM 45[ T= PqF=8 uX0>2qʬ-(XOe"ŸLy@~#͇ʍQF[]{#BW4G&pk׬nb2@'K) AOH뀦ux{ĿyP`(JcVrms?oC'%&`,$+: ]SJ<<8 _x92 E|kl'y7O&/ğg fc`"p6#m-o?N0ˢ.SCXHB.Q>z妷AIsl]qļ[0Vۚmqd[K8X6/CWBrFszTG/AF|[nLcR(tn^LG_[ œ2sYs /4uQE@Ŭ.v/l$qGsȑώb5k^Cq:'~+DG߆CuShP0E"p\LӀ(1j[N2fA݆rKP W O&.KޡD~ԃtK`%,3P6~+dq 9$_1|i#- dSx0SK35[u?x[΀c,[?oͿ`.Fv&qoIy^M6%sxM>&eM$\kEt [/X_gS™_{Y!{ gΘ.:˖/qWą vU$.ArKK]_Q+̜-?G}0^dz(%q?AuJC!(03VQp* "#)R&%%}<򓺭g, VI@_\`@YWH1(oAj B0KD)݃EL毥2nHk9}N 9Y@*q0B+Of[Z -{w<72MrSO40VFr_vDguIPQUĄdc5 RJfjKnﷀ@_- glFK Yh61<[ߴz;}0}j$=׈="L2^;[$#ݼ&e=k b(I,X#iy=2Xox~og)VxϗVFY}l&2cy'e-^$@o5NB'Pkt -=l6aԢg>IԶƈr/-^Ehҋd6~<R_'Ә$߇3^<60(F;/45AK>r Qgԣdtw Xf kNvv7#-U(5׋62ܘud6>Q^x{ _aFb $O#Nbo,"e#?sg?*m)desܺf*demQdųW Qܼr6LbNV La%nr+O]Zm V4M+4wq]V` ^Q\!fR&18IIԧGy>EkWؘMߗo,Pv zg֦md6-34IЀ<%W3-НI4[[uN[ OBW+ Vi)PC)m'?K+)uG'-6Y jb 7զTAy8Vv=P0Щ u9qV+"ةg%0/}VMN lN1rl ߳=OI 9ֵΙեF)t,u&|zb4@C\J  -)FW@D*8 'j<25hr9rK:NJ>,^+]&PduhRTN5_5? 7WbWye۳K*Rʍa4DE@BɈ0y{on0A#H(3Ҏ_L*4ax ,QĐhTf1hUZ#ZAFj.3V8 $BKoOSEEf `烵Qd=C7xgB?R9qs-ks*֌)9U 5]D8qkrv$KѸx9/XE17g&4 6>m:TOWZ"ket̗@imJ yӠM3A&b˽m sp{(޼ݛS  yK~4-jiYUw WԏU4E<ʧ ȤkG Z'2j #~ed2;p2VlRB#Bd bݪ$:%5U9zY<:qC5,9dLQ͊p/aÙ KǡO#X; 4 /ݵ6f?Xkl:(sՑ9WͬByOV@-`E5ɜ#WhnItK5J2˭]DȟC#s41G~n]ۼBU+:a=3Ǵw vKq 촇dT෰dHeƇaƗVܴ6E 4uVH*>ξ팷5c9ץwlt?0MyIvSXB )m%ʰnEmI[ bZ}Y:l[}#s5i[Y>R,nK()`}[ C_{/#>@~=9ߠ;JY#Y-^轃ȿo%PHr@C{F E`ȇQWvmr=bOr3:E͹8lgF:!耟>l]wQVasVPLhh+`zKp3Nx;QDʀPY-@w~! a|((9,;0!ak:7Zĺ_r7Qg[AF*'۪`r>twI9y36rSqa7yʵkDBoNcRl^9 <=i@MO yg3 '7B/ThlޯNbdy2 S1Sa 4_Nk@EkF![ ͳr~c$ɦKfJArHw R W*{}-0GwgW!;rĘvtUk5szkf[ԩz 227ko l>4R]j?Z9Ȯ#NarXQS FKm?摖 NS / 6g"t5lU$a BG Dt+ A?jXC@xu.}n*Zڬbzչ4yOAuʝ??OKRdRI!JǴxV**]mSV0FXS ic0i@m|6VU_ŋ͟%c?9qAPl&v /Gjp仸2f PC4?E z,trȹv`_/'J Ѵ'-yO[q yN]76ɑ1T"N36FFήxP1+IHyu)ݓ˄v<6`j֘Ha\6 !sh'.um>i)wӥ$j ?o4> d{Vemi% ȁX#J1m_ş<ӑzfZV"ɢB^;_`T?K7y쿀]~ w|O"ŧN4XM&+f4n,nL]Vp5m90֕ ez =(wu&MFeEtu_@h-iᴸN7jHE.Ra9|Cf2L*N4}v  դfi'!36!XgkqA&g[ 4%J`xo'ՋgZYt-Obe&ȥ^ eɛ&D&9d߂ѕErE 6a+^xI8FRB"`pڗ:sp"AJ\wI33a y{varcN ӌ1O]z#>duFobo^}%Ub^U12_5 eǿc9T2/GkBkFʛ-xz|S;֐kkbdxuZVMS75˥U?X 2i0>4Jlp9iEȈѻɈt,YD߂| +Y+Pxڏ83B{A#t!yCy{ %@+:`+8PveGP`?vY:0lK_@2v3@;>mSSrͥ}(&VDl [ 9_љNnvڍi?VQW`EQPkle6lWIqÖPb`Ϩ1XSuvA:^o/dgB CJb^1롾 #g]}ߝ/cL0yKYRQ焊jP4Yavo|g<*C~[|~ xFR%HZI#w[t{6uF#gR Km"s g<#' KP]]w[tBطNT1qNh%sqOvo O8uO1 !t~ta,h1}!l?/AG2_V嘃ϫ=7oA1!-gab_|YS4y¬sK`ǵb[-5zR7*9X~' 3&~1(Y.~ f[j fw2%o@Ć/~^%gc,iSc\~{5#w;\t c!qM0^Qn 11]^@vV>G >?.V pM}~*vc} 8xit;^?U/E~`/֛aFU4[v`a{~m 2'ఎ ahTo(+ӕ (v# L f/{啼U%ث߫_;C.CTܱ9-gR밊8M/yY1Կxd_Zg iCyŃʄ}x1!M*F+ Aݻ2Ͳr5OodX,S8>>Y?'dK#dT,FVVGt΁0 6q l u@b&e^'k1^G1oݎhJiNo'_JZžS̓ǀ]Ʌ#cAU/^bT+jb=E)mtQH uoj 3JoO^Aj|)V4Re[ß]NAQ/6@1ꄲ2UPCWVȢyPX"/,ޏl:f"3R̉ xbڦuttNBPu?σ="*4J,eL3)(vr"p<4`&lĸP+B3m9Gi‘=˪&NןBC}аv0j'źB7.:OL+3U)؜.>_Vӑ"_ˀO%0HmO$368G&K!BJ]|*x.)`s&/v£{FىfkݻEMW%3cM{MNYA$Xn2̾X!la~[[:PI3㽿GLXߡ<¶'P \^C%P^\aش&l"qݫdXȺeZze̎u#|&詡Q;:!NKS e HgnϢ$ZXnvM`&ow;(MĊW=5ydTb)JD>eeu°AyS8sЧ_Edʺ{˼C[CxV/)r$'~ӛ"5c=4D 8v'~Rt1Ozvl2 ى+@ ͆ tФ_AaRb^rK"lz{_S1TeZA-3& ?CK `U8>y mhPa(jA[ XIѵHZEDj@Ku0FU[uwES-JA UX ԥMwν3dܹΙs={='Zܢ>P#}!p]uOA4quP3ExhV~{V^ nX@_{Ԁ=+i+X Lk&^M@#sZt'Tc7Z$#~F̩KϝA\N*\a2 Lt\fKsoAlz̛wVBxo}h&\^XשJ#Hx `kʚc-+9 ks@]3'x{ zKG*ु+1W43iCɈ¡7 I. ZN"uv*4裆\OBg;pPrUxM;#l9 0u֮x~/;QIfYxkԑǠVN͗W-p{Y⢦G)0ctTGE5&)t10o%! hPD wnP@E1f1r*V1r爹+thdl!4ͣtdbӗ߲HYsQ '`m,rQA-=(x4gm79#xҐtb}9}Nw/*ߐ'_zc=S(@ϩU-"+Z`slnrˆ!4yoޙ?1&&m1DkƆ vܝkw܅&rS>q`0x >~4v~:mWtl}9 =AfD|K%f!?3ϡ@*yf5Z*`$jYXm ȟW)P֭Lv-PY~3|_&2UEb ;)N7t%bI]/"C H y upSy]Ui3y.1S\g$1cqI) 8eb33y F ̵ hj˱<lgOhHiv[eb!͐07P:({̫%ۻVo@6rHxVtīyF/= ea~G)[*āZOY܆mƶ*'OK^AnNw lnYwy|̿9_N6aюkoRepkmL muٶR>G&W9Tq.DP7$n/ `́s09th&?l4oD .GeﻘM9/NH[\~ljtC9f^xGm5~Y g" 7䙤~EMxyy"Q9?NEXVfe $_F~Ha-ʓLb"1#Xtxpwq'vxV6ݠ̇ LJyԆKtmH+EݠAWtꛥvC^=;LU7ՃjˀEFpxζ$Kq8!L-qFq:~#- Ahù)*.pT~H~uy"N7G& A\2Vr8wm&R25gڏ#3˘BX•3WSjrCghKO3kB3F4"=43coH;ž8Z_.p>3(V#ytv8eKom)B 7.^63Rx9oj{Ak Dto C;ِtL&CtB-DG (vqeAdwAb:c6,tt|IK9yۋÕ#\]${T؄7 t O" p䴥SBKV|YW.wvaNxFA9@@;* a>[pbUP{tXs +R9 7ɤԏ0~l(QO'^qф85^ }&o4GlGh'C3a͛Q c44Xap+=p~c/%XׁX]5z)\z\`pNXu\/rn:!ƺx:u1\+t .efs-Ĵs'}0Z*-h'- 4Z*M˳g$i.FEW2bXyVgɶ˂pw.=x^(]XclɑY V@5udV0۶B5}<y =o c]dS=E^(:g."|ǚ<F9ɓY)ߍf6N6UU7():oFEF"^37B#LJ.U.99[" ?|Fg>';\*gV#xAK4@)kvп/J"\-> | rWs(mNDipSnvJڳ}q>S3kv-1do*-M=D%6{4`aQdIN2JP3Uȩٺa.& :ױB>-x2|2Uʹ#P.q{BHT~F{A ^M$5=ā)k,p̗O3Hf7Y^AeW{ez; -5{CC&)JncA!Jcttw[#-'xg0u*q+"O xȼ#]d#ꔓo[T]8A b"cϚ͗f,g.f3 G&giݨeRe9">c])WLТ.ۡa2(T%~3zZiIJdky旂T;Nc\TE.i2N,7ӆB?ROtr: #tca̷PP󟼄MP?$ťRюvk$h \n'㜆WE RMu|Pm,b qRYp 75ӯb\C0 +s~8w70-{)m7l\I~ܦ< w8bZud N\. ,z',*jSrF1:o.XD iᎢʛ^@WPbC#6N]|DߐS|Cf"d.wsv|>TfwF&hd:,7iCa0GGk m%`S*̃ܥSz\qy]ކ*t7&PkJGd@ԬZ;"Rhkʻvd/P@3Ћ8$[ALq ,Wɶn?37I4?}J@͑(e~d*z $E.a<KR87Fjՠ e( 7O)mJi ak0\¶qQ6\JG)mLU" Sڸ06RVFic"(m/QJ.;fF ˎؒ|`sIv,}_GZ㡱Rw-x|. DKn6Ftu@t[vw(!y#R#xwq!qw NWJWeh_Wb)JbLi"T0,{8L+ ؋"tsW$  aڶ("aDo"yHLry8.rKQ5.(eK'xB.OZ<p0 ?{^UZyN֙A3c(feu }~[)h~t7} ;ROơ6P : .>HPFG4y}1=+хt''Ϛrc &Z] }{G ڵ`PeY%ێ׵˒w(J hɅ1c?tUh^~xGf7S# op-.ky,Uqgf_xDT.Kc(nT8G#7;WvɽQckx iZ!hg/(cZ}ۗa6S'7T*u !a'R cA,H,DPE7L.L,/!u^ԳH/ t5f" g=)nƞ3.%Z^l"Љ Nwt" OY'Bl"y&BP%I@C(`~=|TxvDn͍|2;ό`>0r>s.T3f׮)R[*bDG's>:IFI )qieD1n0ak&7ћnT$gh@ B.[LJO[͞?t3959X[a8s 4+ڲpi?-_9 -ϣ(JJœ9U,1hdݓ* eXL'gG-)Ԯ ZŖ&n B ޅw:$ cHTWaN50HդbRLq6- PǗrzܕވ׭n )௧,րU0{] t+NTG²5}Lk:7y7B̧O!QFOLc .b pr9 r.#_V1o5dBv" "CE QX}q ߬<."d8-}-N%N^rt3)]f -*]Id%-!5Tj3pÖ87Hqk{/H=nလ}(XM:u_I@O=A@ {XZM\XrKt@`e] Xr?{w jRB=K7+B4}fmtr닦?Fic4cAAi:I!JIƷkd`i7iE$<诤CFFG/_;+O퍕2Vj4:뗹Ur Py)A9O.r+ G"ZEoZ35 9%Pa5:>Nա ɯGz;k #I.{<}g«H³I})H*K4 MoqENzآ6Ho(~u6PVM 7Mr#S97 ueژM6dS%nR L2>=g~KnS]K<{E GdtTQ::9Sut#Q MBī)sVSD(uMU67}k=/H=ʪҰHNuIկ$ #G_Kj퍥ZiXVbnC]kj=dꥇ(]m({"*socw(lӷ.װT,}t?#:Z+[zcX8O2|Udmʑ*;*)SA9K+/r&bWbփOgYEL;Jez޷/8F!kHF$ "hpcrΓ} GU4DL~[*S0MXm CWVz+f GSB{l|?YHn]e.8f?ej? #6st'z«Aʹpoc~?oiT|S }ka7Y*1]̬'' qaB`7ڇx<^7XdT j8VP`Ʃ~S_Po,u+YQR\_g$vpvO\E]3Ї#[drvc&|:Ob  裧q*NĪprL2dt2z6)dz̀6cm%[Lܴ9\AN>Aez@ov; APXQX0{ԕDڪM؇K {7/ȀOjo.ugVܞ1Cm m5 3tɰ4$LY2ah.0@ci{Nci#h.scv*zSvP1G-}@;i\l⎝{WbZ` <">FEO޵+N#Ue< i3IuMp%bܠV_E^gű7<5A#ԃ8LT?fa( `%YFg,;5Cȟ;P@v2=[?Gs@x$Nqf($ ?8Z (tNi_HJ1_ڧ*OnQ廓3IwFvW},MjzDȝpx6TGs7ᗸ-lqv/ЫYJ\Sz ܄[m# 任bN $"T`EGDw7>>p{EKPRez>35ʮ)Tۑ:^c CC|_EHQ?RL3nX*R_=#Oa5TT+W FUYxNB D y1Y_h]O+l!y;?$s 6PHet6~'zDc%?یqI'eQ qkpTB0Q'YFFhcb8)4Ueau'!(P=\M2r7IYd:OQ{ޙqD%ò#В%F~UӪM ϔF2݁6HJa:Nb7]pN*wܤTs9AkV< G$86c49stVv͚elrə M2z|P'3%@K[aB$Q#sD{8wRS Lm0rrsq2 Q8X|5"YΚS:$*c9i.d+?P<ㅒ1F: Qr{dEՋ;\c~\TREW@Ykk\IpJskJ[)pIN [P!#K…RPd) 9N9xZ"ĹC3kUFSSAGS+3w19Rc?ι3k5J/'e?d?-sOd?qkW$_a3vzJXOAoaz:*2 >)7ߜ;羚5kfK$G𛛆G)/1~o,*J8r5.0nN]Ke4*" r鯃eE,0~־`SxutHIIOxun%U1Ɨe~h318f3;qs }xfta`(zӂ=P a}2HE ϥP" sFxɢ5N]d~Oɤ$5[ z= <r9Kc A3U~tW|Mfv'5"&+Ӌ I="%Z >џ ΒE??R RSȲpWdSπlwv ٗs˻I>?zD'w+_ 4rwLf݄Nr`wp3'̢Lyrb.7yea(:zS-5P<ƥɮ]\dqeܤ[oGOjZivRsF&sQ"&,6f-"]ҧdz2"0Pcۡn DN؃v<:h}O0j̝t;Z7ie@9 #-p1 ^~޼1d]4 OF+;9a)W6+ev)riJh@&!8#bIxĶ\^=٬aGriݢWHWфflMViӱi0?Ɏ(v@Gm&/Ck0N iXQB%۵ѻMf5f7Bs3|M6Mo{_[D]e'–7:0\{mq:vu1OXJqwTK{h%z'T原X.v0i܄4Cjk݃wb^C"{ $kӕS]spEClE(CT~[>#I APON<:^ (Ay fm<-Zd51NEfmGh`(`u"S`C¤A)H{?߄Z.DO^)2ɬʦg5M־dӔTٔ9ŚHTEM#dӖ[M ܠȦkSd\߲4eSQU6*?}8Ctb}^탿eRXZThy34[?b$v\[ܫhRU tތ)j)%h.-܉47Fp>M(Kd X`iP%utʽͺG}<߆jTPM m9b[ WDwH]LZ 7^_օ>Jօ =蠺P#ZzSх:х:T]hCӅº3RJKT▱鹊ڗY : oG`nЊcQLDkBh0m^ cOgW*Eb*cI،:>7LZ;1rFBYkWVี*z6ucb+N=]d}~VgjKyd3c3E5RYhF* 8VjQ|g%?]!cAu˓A HƆn˔7DWns7KBT%IUwW7 |om䯊{DwWkHgy Rn<׸.^53G saO XMHUdR_W%p9eP&p9q]vB¯;Vp9"/֞^ 2읈 "(p0o4NlEv*sqYvD< (h'F\ }~=ͽSDU"WJf&DLsx@5Mi24zWӤ& re4#(ł`!džӵc(ܾU(i> A7lTaplXED.vwZ#Kء YhW4-SfC:{T_ةK}㧮򍜺]F[=>s1d8*ЅL6}MC)lfqB,v1 HӖ $7o@R|V_eX_aZ3P[l¥֚i,)Z6U҇z~pG[ا8B>xej6,9˞\*X?V9ϪpxF?~fnRgVO)5-PWPia 8}BÈgM >9x;C8 T9NQE* `H2c}]ӧYyc<+c;&|P\hYGG>6c=Jy*^xqXEǩdS' wtce꺇>a-)c/3s?L,3sJeVs cE^s6so5o qrg)gBN6KpmxXp%7y6Gʾt7yɃK\&kXqa0ͦ;8-0aLH$UWSkr5UcC93:?jLnkSzAdZ+a1jB&2=Q.#~?@;Lq瀚'($f֙{6@ 4?:#i`??% "Bu6m NОo\Gze=ѽdcpf %By1珸>e9>` 9-4<gK%u Cx)|u|܄tEfCd0CŢpم_aZ2xIhfAuK|Dox>Ξ't;!ojhKRu(ˉ /RY7L$leQJ8#Q5 7,}"ݫi HF7JG" )ڥOQ NHe`w~vG|Y(wYqAUi&e9XfK^"dg?d bu1nu< ؔe@EOIw7NLfM0U.(XwFfHg)UK_4}>CRզYfr3nlt?;$6YtNZ*SSBT>=I?*V0>8lSYHf_Su`n@7΂se/xA;d7'dAqs;ID1?1k4n<ء՗!4h՛tS3=S3t:d5hy|VÞux잌C~@RuSN C\lg~c ŕg:~$|_.fjadaJMJuJj&M5ԤFuжꩃ%LrSR$F|ZJLs& dWHxJ_OG`}Yqp݉|#}/1/ (FVUFa\Dyc#7S0idLrB"Z8Sq'MoO5'˳5>P s߈ޥ 2Ҭ&W] _=XCH psoo)@1RG^/:BWm#Ց/ c_gi f|ߝ 4e(aiVxBCK} xE $3yT .BL$*bf𙍣 <@ɒ]uu]Wu*`B0b, bG'Nl'0p#5Yaڼ~„dK̜i#a^B ܰ 0i[ x=ZppcKԛ{Uisp k}eqRtltI[ltn6I2x|$2){)ThSplq">&!Z[E^"͓z \m3FwX"ۥ-" }O ~tA>5d: P3e"^X%0Zj潿kv4H([3 #- _wǠjkm.v^e'ک#`:iC}2>>i:% Q|4NXi1ˢ%~ȷ.tg<3@CMSQwaKR,6 4G#.Zba3Y_IEoA4/⪺A(Seփx^tD65߀M~P#Smy&xƋwgr$9ƅJ|'Κ󓱌qyʁ5Ǔ2O=zr N(?x+9ߡ80X&\v7*ƇCO+%#Ue+ z mk}iAW4%`~iXPʠXܿW{ ~_pFͥJ*Y !HNZ-kfkri*?w]T ;ʨ)U\?V=jDA{5\2sN yR)/Y+TD\ x":^E[͍ 8WFI;)iJt6~D ;y*_\x;$[Ŷ@1_{qMU`Đij8 Q=^0TK ΅bkKtYUе~vƒm:JݳoPpFUFJݦ:pZtF $I3P}OaC#x!09A%.Gj,9B?I^P(6߲|DP#Gk.K uiN!0KC5:,bXI}wB(R\UNc0m 78?:1t>ݘePv׽?\6 Mv% AL{L?$\J"a%/5~feS7I??}jw>d C"SFGZ'9۪\b!} 8Ԇ,Tڎn%Ɠ‡PN(\fAGu;#שǂK7,Pc#|/rQrnς̺)G5My^!Lcχ2t3EOto0S2eSC.tV[^黓/~?­/aJJ,m㒊r#\2wqEo/'v~&i8.9%:Z=PoAJ;4@tāѰ{=9My oaEѲQosA+rDyOEۛq2,mY7k9=zx <{ڽhy4uq_^oφIW b l0]Ɛtf ѦBƑxGH!`Ou! 3?IgZnǥJeCiC5g hUYN~deMG/lV>p RrLIa(&(r*=aoa9a.22܅CG4kd5k.o9r>D,|A 9q7WAfWeY7ci06AœMB޺/.nCY[\_ʍ+xkXє q>GUM׺F Ϲ"\|w CU  ~-p1yN3xn0O9 HN>鶨$]q>ws[a K F<pZJUl!|fܢp;3{e&[lg"Gϲ%2왽)+gu9?ҳx~8oF'@gK轨PbEt\,.VálE@ZV8,dŊF9="nAgi[QZG˦W0;OxnQ<k~sp Bn̦k.શ'X$DQt_<_2R92soTHoAfXQ f V:P*IC}K}P u"_ W2ʰ3Gƹc.5ȋ /[oU ްC_֌1;A& >" fq)l4^/آ:\ЭoFi̪cj.-.:*k-]N5bYl[TDgdfFY׳ 3[ T?=4@^nͤ( &X.|c&>f̜BJMmtDRq|;߀n`Dn`=>k "K?8^)7QFP*,'7OgJU!|0s;PLMa&zv_#)bXln cXK/Ge䢄s,L7rYK!]5T7Ѭױ1W?%;x"GW~{-j2D(X:>:W| *5/GTRr7ܧpSޒ~wƒYȨʿw_2??TنbAtGwDž.`5ÐYo21Y-г[+ZA{ dLe/,2nrm(>ɷsInWTY.OgǺ>eM?DIqU `џE$ #!wA8#S镛yqC WhT/"#(H*mC&Lh4mG4O FčGml kôI „+گlvnv~l4g]O+fOͮͮu0tk^ Jp{]CN^j1]~2sY:5xȢ:X|,IWw:4pg+eWtkTCԳJq)^۵ ڵ X7~-c`/džP6;ۃ!cxPRuv@r u|,o*}l,muȉϵ0xܵS6XN٪?QԽ2aؽn~?ǛEWƱ-3n;{eng(BcDѠ:Ͱ /'?%IemNTٵʖ%m=W8KrwD7׻lahH{hX@^XK/=?C. 7^e?;uT R#do/]ğ5T=da\eN:U\=f6Ÿ_U'?^+jgQ=yZ^zbLρ,'T=+Zn$Vƍ(] !Rq{RXV{J\- Лj^ijwsc[usE'X~*NDmlh;5QlG伍[?p/ˮ)i`ui9PF'1PЬ]jH9<z%~`r^>-t[Tk)*TP|DccU*Yƛ2gp-5z-^Grt;>BS_v:qƢ(^^fjL-4ѼSn+-` 㖺XEa0<ҏeK6S,&^*o8DrViUoF̝$kYOvF _OkyHYEj6XR\xwE|3|T'l,`M7X>ո_j-aUX@?iqTT ?)\G@]kL.q炣E/z6Z~).򰚂Q|鳇ENm؅4 4wK-~qpLN;>4㽟x%muWH1(Te<1G :.N;s,>FҠ+C] %dwxtVQyO Kϫ˃d5Σ5d'j5Ths;Mx7*x*&*%;pg6*oد_HfwU,_MTO):kI}E/\НGBoi/j>r:vNo0 2+ҡ- )X;HO?tI.19EQɋ߫,ot VH( ڗi_//&o4pK7tMϏ>u(lG/G(1V =&ӅEZYa]8Щv!S6_w8^޺V#Qƻ ɫzUW[Fݼ``HXe"A7)Q]:kMM.\sאL]5QA2^LҒ7䙁^~i'@6OxLI xC^eEj΅ftF*Ug^OKvȜQ cDu/`"uDtlUl\2@dpUVSpлLtjx8.f{bLnh1pn9-7Эq/{XʯQ:נ|a_O؎. ?]G5 X"N%:ܠXqF&HB<;Mʬa%e9JƗ%;ܭئI$7%%x@wӫ!'lq&(pO}Cr}(C(p ܿ'W*zp?t<(}وm["ok7fR#P*4K4h+cb,~ DȳWƇju R< /4!q&$䛳az!ԆBBgApw<42ƞ*t<6f~BgQLs'm>#j> oD)4f vZX26y-0MÉg;A<'u_E8@`C3Oڏznt[jYzE>`/{M^[5bq#9M_ f7>."߲_:ur7?7lPO&Zh ō:tDrHW:&!y!f=c1jlt{D/IdNu(n/ }Ʈ/3GIt,t`IxKם>~N絏mjt|eY:5;̡fo1T#$kf%=Jތm,eqZȏ7+)oߤw4#/na-fA~4GE>\u(觙FfpJX?҅o6Ӽxf-!F;F?&^8ߍv=0jn??g`ŸbEH-&G_b]ʁhG׳P.uv*LyI%(Qʤ<["S,L䙙L31"D lL*p2& [ 'Ni)Ev"=3NFF~ݰ @$ rՅ%x:$a%K$4_{R|&='%xImx8 K%.Lǝ 7$i܉G"b'n&GGǐ<k@U1z "@5E bo-:6QgxS&FYވs^IZ9|ZXELX֘G[u$4ɔe}OwUJ&ߋh#6PT48h(ʳT8QaP7P\"4GԾ{ şc{*<g}mӨg߆n2f-Z?qjxS& \0ʛLP&.1[|.4j,7 5Y7-)ghʽ"lB21YKBӉPBL=tA+i\s:Ȭp'"%kMvBSDo6k嚆JqmvRn<>x+No_n+%jY4L32Z{)XX`ٯ^/+ѹ]_i#عM%aI6iutrY,yA+*f%5hTw Ʌ NޚY`Zڔi^f!7sQvx,cǂ}_ү%nש+}NY#D#hcTKrXw2qN4oB;Ǧ @gw[:e%iN$s,,-x> 8a7+BVûx{S zv)ɋmvY7ںڱ=7c$P٪vB;.Dll]pB$mZo` *D b5!aBD즣gu~K?;' ?2ٙ>ۙɬt(' |ƭ 6NNVvP=dSOg=PbÅpqHvH#En4Io?qrw>;J7ufLJns>ڼ]vNd6T3̆%sTmz:9svdgӯF&Q`%W8ZW+GIyT^߻i@T2fZebXN`׺VRς p Y0J<ʫM W2ECN#TM-zݥE#K;NŠMbee_@]JNbwchB n3HbK_ޔ<jn)twȜOo6+r{R K.s:iTvr{l#k 8ۉ-XfRw:z ;Xu(lϘ:)5=v cH oKiaZ. d U,v8:?/^Ȫ[o. "(e״](n &h&ʨʏ(Qz矆-ޢf4$*S]fא4SISޚ4 :{/}&ωí^>az?xcQW|pH=PTɎNa՛|`|.MVIެ k\TYNGz@Hu(wТaF<SHc4{ƽ9V%U51IT/wg5/K$w @A]jҟ=ո բ{]0A_n.wpX-9R2[X+%]_=&yYšcqru)(@`7-/`Y ý֮c)=nE LQzmPL"9SapԾh3*sB;`=AG JhR1 n)k mnWužiYg-Y To[j'j7- QM"^R/pAPd"ѨE=DoR-4agyhEn2&|c#ض*U0JNiôo,)[5Ǹ]v9&hOܭY3"koEgP)bR.3ٵu@iI4ԧő4o D@=y8{`WxϺ4ǤIKęd;z] կfڛUx㶀X=ƗE)6"ҕgAKI}Gz.2q;|+ FM\MoY%_ :/_9+˭n|܌д.VQXC=ѬQΒ7N_0i>y31o+HK/Z<kvK{}9:_B- 7 alHch8` 4C++Q2t!5iC n zĭPwZFHꏊ0*AI&;qn z'LFsPNzbvFw;<7 bs gQ7lFF!ʖ.\ҝIɱ1/G;f<_ o12J$DGщ@蒹ES3yW8j[M㡶:z4> ,:2˰_ 9mR|ͭ&URRCP_}n LVD)v?<.haɶR=<+nhܠ>\*}hhc:Z4H` zF$_߀)Ym ma1V/L7}2K+ 聬#ȅ}́BOǼJ=fwCQm&~c1@=r ۰Ku*7i;VxA0MWqͶ9e=sXi;ZZ mWGoTYYid]%t5XWQ=.SAAP[$Xj0+97zX$_12{%g^șf|L.x$OyjG@7Hu.oclM`ŝRq6:bih8(ΑJaęty )h&8_ 1;yQHj$_t,gҲOb鹬ΥVDd9NxH-YmKGAuO|j"S=cćzF@}^]@ľqy";mx3*-vיkBSᄁ[ٕ+vHoY+."tu*{X:ڃv5r,~LmFi [z _zWVL/ȣAyAHZ~J$|džd!7I &\~,qjSZ8ʢ觯+'bɺ #9 Ih@C%H9+S~<*ҺӅ`kTqb5CM-j ^oW^w 3|[;.?~qBzgKb^l?`B1vB+茣mA z>i#ȦMS[[{ލ`O ۂmѸ'DzoȨ) (}RLѐWIK!7~|^覺@O۽zjaa| Rț*B0ү 郁+H i%~{vVᒡƥ.P̨f=6rm@ri3vA{E/HvanK6C3nYלFר>ɨ HG}3uHfL8.Ed:l\"mbtUX9o<-4qN15"Rc? P`>K%aUAXP#%)j$`b. 6M.S!D,aEPn1̾Pѥ#d#s@ffƻal:''fgAG]G@iS%G@jŬ߉vPaE.Naݜprĺ,y>eBVk%m;p%H찊ZHj`$Āo׼crgd !nGX埼f$٩?Q Hd"_D{@b6(<~u,#VDCJXT fPpAPƏn#~X#;d볧 O/"w~@M(&;"+i4 w!׆قƧ %~\棭ׅz|=6Y,%*,"c(F}BoxseխܵzooΟJ U/r˰`7@CѾ\mu kHItWvRG6]*Z8iYDDiq iA8W-yuw&;~Y""KPلf|r<2 ԗLˮ'? MBd,ICf ;!ShXxLľ2w05_ Xo%Br(mblgU?,fҎ9"B/ÐNh89;EͭWKӮ]f>ͦ?Px.nz3^?bnՕ;CK=k`ջfɃY Eh& $b1hňAaDyuw_kK}Vm j?-Kl*cQAE;!!i;ܙdfν{ιhiODYpThz/ajԏӽq)U~·vq4u|utt] +h>ֱeH':? Bk`WbZ(N{S1W6@Qq< #@.  !jhC4 g ^]! _c. |$/A]GfFp)nj?e{9Fpm'^~zh{1z6rxȫxvevybD7ts',G^*=V鵻yzh<}(<}:Oz!nK%3J>eG!S.+t|fTx,N_FIqpA4PY'ba}1a F8M n+ꓚvBo2UUzVy ]{&N,w%s\Ϯ[!z{qn1xjx7u|?kE@d4Ȗ٥dsd3ta8|A\·hoU!`[4yF8ĽBl̙=04k?Zx>f* gOfgvYHe~~:X2Al Yx[XCajLα+rΎd˜h\*}p8z5^OK}7GՈн$voB?u<:M#d8I|'%np>^ YD)q*"vT~y(3;iBw.Kt8T#sK>O Xw34kL>O9ubnbo.pY5Ds桌}|";@,xc<#C5 K{缹~ :.ݮu]3]EF;WϨ]8C#{p^2Sc(3ظ[9` WQOu hZ<;R{I?~FnK-eV=MRe Vж)xAo;&IR:[tbߒ`^^x ˀ2|Z|F- RiZcPncIƝݩi.ڣ*fz $a@5!4H0i4钧U=@z v5i iV~͑(Yycbd[\LC})bپaXSާƺcƺ=Mt级:ef̨oA-[`f-g\|:h i1oX"t{ R*:{zzyؖ, Bf[#ln֟67V`0;5^ Ub VS>٥a%:|C0x*`X)zƃ6,׍ ٫oG߸%nWdUQ|Xb6Hb6wN@̌Cl LIbq('NJ!bAiAÿSE&)(+~&!R@Qx"`P*܏q~!\r1tppKBdݠ^X+ 1[di8_?`#T,li'P*ehr^0{~t'"VSS4jEpoGSw+jbbxFt"z6>W`͜ #/QZ;Cꠂk+Lݬ" yM`i{9tگ#lt 80S' p `Wф 5ՃQ|5ҁ/'xo=Qi/,g:XS5݉MiZ pڐm҄_P'ߙKdXYhs-&[ys X jJGFL H㞎ք -^KEbGlHy"&6K o*!dC!P ahmf?j@Pe /]x0Le x 9i` 2U&";Fw,+ y1\yw_T*~a9fB)㗙Ub:'# r.Z?ohzz@WH-Xzؖic~B##:>ρv s@ R*ǩH`-=n7q `%JP5(`UxzEz;N fwOq _P Vg G}g mţa4ZcJ0aH fXIPS"3j{8_TpTX/'Y8$q \\ 6\!찹?|ҏIlss$܋fz7M& ;Td"tiwR HsỴ~Mɨ;Y{&FlԴ3&qOj:[p8SqP [_`7`O;Ll싿!)[3Vxb0]/:fNUܥj,bWp#X-\뵆vn{L)O,lj-Z,<_S O>*<>D&LPVHPF6AyVe/ ?:yE'iT|ဧܻ(>U"VmN0u{zRiiJ㳘ⳛ>Ur!AjKHЪFH>R.7$A(X_l\0rwྱ4\Ob252;o{ GY=(S<2p̎faҶ:]΢ķgK+BSi|w7#Ɋ˵??񭚕K0'tS5ɴDԽfF6 Z;g9pU,J9.=)YSXGlsSLQa97&po{WǤ3V"s]Li]Ljxؗ*\5@7['/ Ox1G'*s;*`0>y6ʾ;̎D4n-cN|@;\^tDI+t:zO_)1 lu=pꠃH z8?IBr \3]-%aOO藺M- p$ousZxetX7uk2'FkTDRRMYAu8 /Y$sm̶éؒǁ1,{FbZT蝉0tŢ!ٹ:8!&'nq]bdH@0kyĖkyB`%Cd_ {s6=a.x|B`@5q$cM#}+}g@-f X*e\Cہ:e4`ob* :\&<}Kj2Ö;N?cX$8c/R=0`ΟiP$)H #3q)0F3-ؐLTpT#+@3UL2wyXߣ$)U_F͙0$4CgYA+B>z =a}6V&3(WHpA w'/Wy'äǵwUyn~ 2 K3v(lyCAhjC#EC3"U^t,Zc}a:'~EWS)Ksd{5oUf&O>&Kl;[Ҹf(9ƹ׀b$|QXh _B6b| g ڜ;'zS|1~&|ZgZQ2S#|oxXbŸJ)?J@z7 *SgBh_K#ȹ9 ~_)|Zg:g%[1zfL@c4Fu;YU5O%@#-1wxyOI[VW|*&  ݟƎ^a)bz~h_nW=V8GHen.eXP6[KVGٗ o`/L"L!oBg0K: ݽxSB _KZǺ' c|Ք.'@8XpIH"22aOi w5ԅ٢̣ɗx3՘n?r5~ ˜*6S t+ʤ'le|5E_ *; %׼o1L0j[BEEh_^&}ɗ什!? z+ҩhũFђh)W*kW7S^33d)i2I/`lx5Q;*:5S ~6Nߩ6T:C\0IZрVQz|3D۔H[/ظ)Aoڊ@%sDUu^pY~PBg!E!:q4-dB',n Ŷ:zK+0&OByjmKm= TJZsFV7ѭ@jҩ+BMv] \wpxDxD45SOl SK hLfxVTzE 8Avz.e7^ҫ[ t(Џ%N~32)reXWD/uL:,LiWX rOdfV- mFQX~qqпEyC{p7c/QgtO6Eɗڢ˝a^/?ܤQVl S8]ʖ ɔ-CT vn.flylBl-Kr-gEoeӟ/9>J}1h .Ћ. G°椲2Lӻh.@4-כ *_.rvkrqU YS± @\STr (]e {ڱh Pb tf ٟWbѢcCG;{a SSIkUZU*%fMe`T;wS4H[XG2'+o)bMd z o\;BO-M;GoH7lR#L։.R;m4-oIKi8pk+725n P%P-* IY~{6odM~ځ 6"Ni6%P+1bװD+j?V ݩVծ_/jՍwjULjsNZ~6U _ΈժaFX:xRu^ 9^ ?+Vزt)Ғ]X\ak~ЅE" d+)FݕA9X]3B~PیVԇ L*Tn8HkLÎ\w5t+4{[mg?{rTS+{v/olWO]oOQLSuM)#{cxu{֕M$_8c| %SrƳ0{?#qɯ;GKx۷j>I7-!INUM>"w4 ?ꀎr_Gxn\X.h:>{>nK|jؕ<ۙh!ޛs5p%W>ez I=bns{F9VnCR}qVD?%R*"8,hhU+=qpf/J](6w,4ól"{1xkc]؈{| ׊"qЅ"jPq}zn昔8g)\ M|袃.͹-ZqbI~ [Rb9^Gu(Sp61dby&yo8&1T}8tX.{mY%JFfmyA窢2fk@ޑfS"PbydͅUN%չTVK@ZQGDs^I8\+,p_/ß!Sbr'kv4mlW̶V"K.ݗ>MM`WV cTmkw݉.6oP:>d 5(hk7\U ^t.- 1.t]L_(vƌ^<9rw^p. <"l k8^Zj HQC L' NLC4zJf^>nNKf^ȸZ<,}<:ΉAs4Ћq0kk֑rX*vse|׫trO7?3n}>x !dCaAľEŮ!0 es!+SxG iGeppfs9py:*k"uxA L z[$V"V]m !(ߙIb 嶜va=R3%q4+t2) >+eSdGF] ܍v_=W<_MDjxgF)MJ]^<%E[WQl XPՋN2vb;A _a^@)%l /P17#UWIr{G&!Ǽ |1,OwPԾ`Q{E;eR ARU $ޝaQOw$4s\נDovt1W\>پldxDa l°%Jޯ,l'6P%JR ۯ_iJ>nč?E]}Jޠ+h|u"F ۯrBqA ؃"ۊU2Vy\ztpVU3,/ꄀsNΣB!nB,l7}~C,P|n[=&w'Po&8\b* 7o cC+Akf"wkAnT>nU k*x͊o`-=0MD(<% !R&v*呔\h;j)W axŃ>5IA1AspLjOB|D(e0 Z78@#J%=BSV8%h=]'/vdo) P2MDlUMQߋW&̖?AIXƢ a;p1[!Vk }ʬ3Os$E^OQ$`ϻ14w!,#骒[NvE$_ARLjRZM<2#rsx"zjcWieX&=u U±EşnkgGb|#1ǒxlPy)d9l}O[Ufit] g!,Ss˾aE(/fpUvQUW_$͆ *q%!HѪ X?pgu_,Ӽi?3ⴝ:a7!ab%*:VX[㏚}cܼ{{] y ./{]54ڦϬK:2Γl:ً j{, :1d#(3yM*iV,=4G+Y'GGOXhcX?e$,X/aw.RM':\9a@\Z=̽՜‘ST )'a C\ŕQ :ȵvMqΰ fת׳+jʠ* IQ;fKvU r?'O[Rϰ/;%OnRkP$މ t"qjgp!\,>r곂tV32t(m}IYCz) rf[KkfxmU I1ZNQL8.3E?d已ɣ`9=9hw9Q HY/^#YI.N*qDkBC.xM̀,-5%9yq6-|ȍH~0ϲHBHnrz2P$kLie~PBم;؝%c zhexw/Jw@A2UjobMf~Pr j/a`W^ѫZϢ;8E()4Q7o&%0Zj Bș\f>3ߣĩ<,v3CG9!xWHv0.E6qު<(WK&l9|"kXcR!YPNpQCnpcټ?7ljH^y-̋ !NGpYK~1vN  Wbi䳥"K궃fѓ">F0wI9qݶj !d&S;D6&ݴE=_Jt$JXoeI 9)$ ew ɢLĹ$.'3MH5C3!9>ffDN($O?9˅7) ĵ{r ] Cq`PW$\E(4s4ͧ*j%,͑e^gN(ᥔK%#V`em>cT%pwl>aް4G,Ehǭ6fj 2ރ 33؇:r& Y]7^>@@S1kXhDx))ޕѵಧj|7X\.s4&X孬`$HIE@{i[aϦf C/Sѥ. \,ŝqSYtf'MHvwʟpcƠt$PXV_c !Pfm~įI͢12GP;LS`fл%Ԋa}v?`7ܹBWX)G/K)r+HFC=n1ڎXn Kb&jπ'Sg>K'=SqNv9͞fl*o.'.|~ㆺW8N!gH)p<%zG-6ԊE|mZ(Svs)R=8gʻ@Lyv\nSެc1UH~1+wT13q!zDxM,W"I5&}v;dүU ErߓD}띺8twFu5*ў{}VZ4hցLuB ա]~ZхrEB۶5ѣMpu>\L *U99K7HW\s+dx2BoAg,!}7:mj)II;8mΘyBf'f] jqom/jt% I {3gG+{ѲeBw2#$YL Smp {!יK\gZOI7LjcJⅧp[d:^*+ivTc:pi LY.Ä^0*=IHъn%)C؜ \=5"GzB:G^ 8:]-Iu5(]g`?5o!&&i&si\c"}JL0'c6y/&gϋ? =0ߊ&&b 1'*]fm&Sؾ&`"0)f8oDQP1hB藞h cטhm?5ltY`"r%2b&ZCރ0eЂY17LT\R70\G@'ڒ&(‘!DѶ/GhɤQ+OapC8t/9kR_XefF;.CK]{tUtҝFa(5%@b+|@bV\\0յdT\vݕ!!L(gpE G|轿VuW'9]]uo}|} MpN'Fh[BTBTET. Qu# =3}_ImGHҵV&tB֏$ Xd=5);EI)DIa$N~VhIM ixI;TX_;×Ñ6q$/8"Gzp G:= tڎ#eq"-1@(a=Q (DkEl4C;'K2ϟmDT UUr$Jif\!JXeGd&`KY}B`K.O-]&eÖ޲&G,@cK[ SUsbђܞ EƊhL)i6M!mʲlATRTGܔA5B./H]d`BmZ<Dٙ }i]ctBN ^cb:MSb68Qt3Oξ|R1=N}do_R[͙EhRk-7 ojqY戵ەM;v]lP#W4 _`U{A O$*ÖiLR4{qަʊT7r3aR@:F!:q$5ZtvRLdHk$uj;iODZn,P/C++.YlaQ4z:^~S8e(%Ÿ5Q#1Qb?Ӕ9`: өSho`1x0IO1ֱ#C~Eᖋd-,RRǛx-o'7XSM5Pmܸ،eڥQʿ2r0d;x򛀤a[ZKmz;tgzzF!(C3ʯ#;N/cJsPm'S>@tK@1Z=MRLkV>b 46 M#>]gJYj5k>#<7͖tx}Ma@nxMb⢱YҲĿyya؝nGᓎ8ATNOIngBn'yOQn!m?a`]ڔX17R$|, hm131!fF^d+wi_˱$fP* :gS;Ww.3;W !ሃfiT߹̟>XP G|zg.`J80k8 3,c|c,{Wa$x_܃B`:+^q42*A1q*1\I`BsZx=F{?I-)" Mװ[ /~ UVҦ>eCY!b4jHb47Zfc`=CpkQ~a_x?N4.EEmw"Cjin 0Eؑ ܣ9?Q CaLi=zS!5P+$7A"617L/pGJa_^"ADUꮡC9`Ź}8QY;ıFT^%x$H+ʠc2t_V)]"+QSyBBዅ ȓRd ߐ^<Ě ֬*뻵S]d <њ%&/ z W^*)Ө!Ct`? ,;té\/D4eWi.P>p+ěAy'kr.n4x*kVk5Ula|Q^b}HtpԆ/*RYs3rKVi*oqSnX{0r;-rsi}Y9<(I[) w>j?!sLt/mO#z!3Yw2:Znc8" frHd$+s^*]?|ʡᏮ f/0Qv_eտr@QUJJ+]68,ozw1ߙ֧8}ʚc+kB`ۦX65A^8v̖'@aM[28q)! dSS~G屔K-O]SΘ~@{i)JM1= 2Qf^|.yVaZY\7[VՒ9FzGe@!&r +IZ_َ {i}Y PUif9. D}-.F\GY^8y16X5.C'cbC<̵w;+ hML}^*(>rIq`טa.pm"DZN94wP.h}I8fD7Qҫ%{dvd˵EsW ̸@4,-2S^ ē]m[Uer?b7Ä?l B,#!֪Ǹneu9}u͠|p/vřϭo%eajIҘcؓ'!啬"Vj3ypf'.rǕi-%vnJ6/jkr)Ø3#^6[Z;F[W`Eֺ ?]@`A~=#qʂLH`/-d$Ģ J3P2mpEKaV6cօ*#Ma DSSnD)-%'?\QBvxNPv_$L41v96\ 'f/*4ܶc j3<'9"}1UQ42C<a_ q( Oq( OY\9K?H?Zdi9+&A%,V5uZyZiZK(Cq]X9jG s$k.D݂ (R53L5殬s+*fbپ_t V t(Xb;L$$3B~E'1|\tǥ{ 'YGlY(K} #Iaz- ԋ`4>/y}دvuy}nK@2+9יQKܱn(?G3bMelO˜$i#8#5T:𶣬dIQ3ʪjys"KSᘧ` |1 s/t/4dhym1Q&hl$@cJYp+ls{f>η ֻQBLF^Fy96N.$6mV'N޵GQ% /E^V.|lb#!iKY 6fZeKƋj&Ȇ#[`Bw\j&&;>dw931|~g"~Nҷ?o (sjAskĈ|D]ߊVZ :g u '+R[| Qף"FW^ׄ͘B7v-}n?@P n7w&mE8ŬRLw7Yzcf{8f/KV}bɊ|`!n& й c7Q͋vW\r~gr(>nPq;T=arKp.]:8=*pAPסwڿw3R&;YL9p_S!1w,%p/sF ֞cwvz vO`wh9Dsnݩ4285*$;zlG +e9|7:1UBNw@N{ _O tQq{dG/rW&don\Uߘ._[לRg,*.M*8e=DŃcXZ CEyY"GDː=.ȁA@H(vmP}p|& D%| ïy`@0&f=uy2FH/䯫 } [<1fxvX)l^q+$&ɱ%í4Rb%aL)va$*\:YpV:z52XT&-ſ[*:cv gA&~b34<7B񁁨}sB+DHe*SHvlΒK S!QfP07v!= &KUpn'c݂.ȤycVjd0O7lXN8mài oAav.@i#@+ShhuFc; ,8h0kں! z'ؔ)XIP6yە.mNhSd2n>@AS :w*A+&2 _eZjr{$P_μL pࣼd#TфTak^&pnW~OFjYxN L"<PBplU[d 7e$M HxB;y'6e)dQ2da; ,<>dD֧6 ߙDz6Iit/Pdtp{I1 Md [raSL*=ңDfC^i}iLu{l϶.UYdJG7];W3 )) Z:n ,60A2\%d *' 0HAf*׹J"ehnDP0ܿ^ܧj" T2NeDPѹ' AmOQ嫃DE]((4  < ;߫;tQd&mC Fs1u~ZSH)CJ+=7 cwl|4J]iGxLBcZ8:@2'AM6啤E0vu cYB̾5?wX SCv4GHjHWhD`l>>XNuQ] ~H* i[YR>R,]9av Jԕ'"?4p\oE? Xs}AኃZFbqOԴǫm]bтAł=wkzwB_9'Z .=XSHHY^ =rs Ap X H\qAAijnCij/F6*؂Pvęl4dZSKl} !8L,%[df)r\%([J銥d&f2(h,%,5[J*IR(L@KR4,SF4yD+k >Xצ4ZOgDFCƹF9-|\T#[`kc5 .gKSy03,"isy~_ץF<i2b`vD}dӴuMT`lj5g:[couOєrA֔rĭvQaz׵zNTi/$/ÆUH Qm622QY07X FxzQfvPn;jGceZ-pu+rjtvik ^Io@ dEh-FծiFb#}} `轐{/ܖ@ o1=d{ { 0ܿ\wee{ajzJ̮tZv%(},3`Wח ̮T)ٕ >tzZ|b"cU3t p 1*]Z {hU;O3;3)¤ VMm_@Fm&אc|0NȌ &4~ް9Zc]K-bܡ t o`k33,"g:FykDwǝ`Aq7^o|%?3ʾt09o|7~:7#o+"JCEcYD)OOOoO'UMk6}ߐ " M>C ɸŀؗ ^EhOWv AjIm;VCC|*`Zڳ{Q}J Tń?MB>2SFT#\?װVSR7ԾcɤC;RSS02}$ z/Iojn|@Tx;z&11{45];5 *ۅfګqN(=0LͼT-LЙTyu.Ygjq}י*:Sht.35as_u4:SK~NٕL3ҙZLu\ف:SԘ>L-3t2rǷtSa^35N3u>@gjFgHUb:S:2<>3ź3|w :S)Euuzә*RuuXg]? F}יꭽ3ugת3әzLLt63_FP_hM *C RP@=^lkɩS|{m񌗿TUz*Oͻ"婭S^?VEyjo.Yyj׭<|婂0SSpS^TԄ%+O <ZyJZSgzTS*OTJSiJeQR+OMRgPb SQ^H^SrǵS] W5 fC;]s$o"O$<n7Vk䩖SS婦S57yP e}P3l!4GgC> k3tLj9o2^8/w,;}BOo6yhoM.xR/R=){VYfa[.xQaXHt.0U.D[w$̓OStJ3`a8?qsXӮ3͏wO57%)w ӓyx> Nq!=x3w.]B_D;3cg J خLzvWĒƓ6B1R6ܪ4&C/J}l/iJ)7kJ4CAz{9A Ba9/|G sXrBGPr!|va\޼e 2AXF}?H#!ɴQ92=QntE{z:F7Ibx#lxa|v122= ̕ :WQyW3 :Bٗ{c\ OB Rԫy\ J" => =kҳPZ?zV-땞55$=kO*!c5r?zV}hz>г)gM'pf5^Ypz*=4 %(eYbgkY>?zҳ|8Rհ,ׇ@Vf_KV=i؏GӺhZULb2b/"S?M&UhZ4-8!3JZ4@fPK OӪ Ib^څia4b/=֧{^iZ ͪia(_54ahZ]UiZӴ~5iZnNJÍFi=hYKqv,AVm(V=?a44hZZIO܁ߴj#M~K(x8 ХƠ'Έ[BR3]^ l-RJĭxPVT6dAN~2°֠?[kk֝F\eFDV][4 khิۅ`vhn`v쭚P4hj+kZ[Ybf0<yZִl o F􉖷UӥV7V"m$V?o+# okV3do-+yBZ/UuƫJ0o+NͿ Wx}CCK \Te8~`БXc &h"3^.爕(xt.ݭ[nje\KfEaIůi]={ΙO# !I͗8rȵV$I$^:r/q䊾ԑp#vՑUAe.p#W ?#HՑk\q:EwP~+8rk|0+;rБA#ב`G#Ցk;%#Wtl`G.\;r rz,ؑ G?av()\^䬵תa֖WS}kRe1(6O+V?ʳga 0-U֗AYߩYgv3l*qOfШ(QDv4ً@,gRh2#;` w;/uך6^]Kݵ+Z:0a*ZUwkᜏqYw-7SFއ+#LSVEn#gu)#Ns6n_gD1\ln/P2/50šeRNZ&:ɷGmYbᔸ(sE^,5с6W@Z(9zÇ!gtfeBH{XݰM1@9@o;ZbV~r5J~QVcp։h)myޏo7mhy0}Y!-y⛸qXg=J߼bK"TnkB|Q@Qz|U_Yi/Uahm$IR6hd{{ot3^AA_&|P VVN0=x7]p߸o.ۿ@_jW~Ѫ+P{p$,؄~}H/+wU_Z؃$钰{V _BR@VF yf2gEf8yǺ`y"_5z)퇛C +BK`< W *[E&+&R Y~B*7ih717M{_Vkw4NMc?=Yem~@~=7N90h*_ ySNљF2ީRrIa䮗~>Pe-r2iĦ$6a<6ĵ6ߒ|խ&}_LTSIb|uۋ ad)8$P4y4d1d1BR"KQ|۴-,e1%jc>ܣ>? $_5bSmgrqo]2Ϧ[i,\]H=)-`͔\35VNk4*kAc܃{&jqofGysi"FA a8DJ+.^)|xpz+1b^dr ?J-nU-|`mG-h| @;*@Rl}Cj$OoCOd 5+ E(Wep_o:Q].Iq߂v$g|Fm5H%-q[ݟ8Aipr)(1,`%ȊYqu.蹖^.c7ɫʦi0:S8:ρxd[F/bG#C))^,VĵI9POw.qM.aEX,cyn(:H=ᴖ ^@qHh$h8j'$ie@{@<0 Eu+ 6}⩄O )0U(d:➕5 BPP&ߞV,ε|V=Xb]nЖˏxv'<𔂟~@ O%u3?8~ WbYU%!RΚd|_F.^iNtV1ӑE>ơwP '} "6 yS lO` !LKg_c=4hi*A_5\np|o!b9[Bst\)%% 6ye"hFSG,mp0bv箚# WU~mHtB ʵЪ$Xwl*P,틴K Cl^?PK Zn|^2-.PT(2(EMEu/u((jo-jO(\Q![` {vN%-bj:d8e\wTrWX/pG$. T/.߄ L?5|ZA]e4U w &7VYd2,mCvh{NW=!=/.J[tٹ8yw|4Kc#j.P_u+r:at Kng1g8𭸏1b-N(B㱱BxyBDv%n]C Id.ݎa]!?oC /w[{nn<6;ծq ,x/U~Fğ{k2׻5`yh4)Urvo0u>k"_O;w1l/]nbRJBC1CoHs1EǷPjO;);\06HcoMk'-Jh oCCM@ŠDyq})Nj&.v1+w]"`l480ѱ`Cj:h s5878acp7ـ3`>6 pk4CqTVFspmRD)ۗoevAu~FԊy v@ (9V<P9$QjtK_}^c':fbrf HӰN2v1keų>INtg_7N<~٦qs :LB(RI\·+2x&d{6so=q߸{{~SURwsuU)JA8Z6КEJkvܺ_;H'Pk]yo@o^'qڄaC(dG8nD Tb2\>{pvLM\H[>dǻSV㨺0YPNx7Rt/^ccz/z5cԎ7+4KojR"@J,t2(I7Lì?˝Աu)wR7)rvN+@ty8i Ɗ?*I Nоc6&:-{ ("Z;3Nw5_[4 j-rjPZT |]!g78V`9tMhK@a-H-m[b`+r`PP{P0~\H0IvѮl(F ֬D՛~ ꆱlUy.2]I`VQaO( ϒTV> _-:+h3Pk>B'#(~4:I(.6M(5$\3L"(ܮj  N{ {VWuN`7d*⤝} OVP$+m# ȗNl2#M>W~+`GlaxC͉o`! B: m(.h(&%rAve1)&D[(&]W#5 <4y -WA+@dmE>6tnnp4J"8f>)8%;)>ojRzO$>]}SW`{;7(v%l0JӚ*vD|$D811u)ZJ=*e. EәJsv6GƋAJ\PvjR7sqqqL|Z"ȃ=,:HG)<12eV9 ?GjCVxS!(:'Cq<~^;.3`P3XeedpST-z9|cVC)m4_$YY9"nY|[_8tȖ{YV^Eakn=a@4<.ac졙!ɇ 4 {ч.Jc=$c`&Z /iNrMG$6f,'e |5<c:mHy0@$,bvGYRnop) ܷ ٳ5sָ v>2e(q"N T-t;МIw! f7 A h"vڀ7fc` , /^T#niZz(74(H>X 0jNq@6v~ 2$NF]ANSuܒ^W tE#;TOinfUmP9ۯ3u,I1jgq`I39SomRI(pkjI]վ.7͘a;'|4Ki8[`947M4\:%p;7cRޗlܻHYU #>\_ʏf{Goaz9w'xfkyfC6xWRA'qdO iZB_?KD){c@@]76n2mrQH>ר t1 AC7vzণ4 NwfNr7PP7_e9 nvhz dk9V}d{u=6'J_*㿔z3gG;pt({\jG!&@<αp8ÑZ\h) sHc!c v8Vj8añr8b߁X`±28 V8P8fG v8X8Q ~8q^/x pCx'OfݻycZbj\-;&ӡhxnKW?.ZM7ΠggSGt@Z:MwP|concv :6v/k鑎=FH,3MGe<8D/uABM"Mr2F9O)J[IȇkqjCyJ{l<?kѳo>?/o}B0g%BssWKnt%C6UBt^<{hR!"L߼E}NsW`wUj.چ l5C cR&-?%}.zA(nwg1Iyw~"ZݒWo6]0%AK8@rW@XW EWuV&$TDKl@S ™`pc("@"śPYN<֝+j,[SHaiB78*FuZm ubCBfo*0(1F7rhO0%ALމZ"nUqy(_a=zpTe9j+M䚚fU+ .6 Qpć ՂRU !FTkk,>hWk Og+H_KE}M"ux"ѝ+>>Eꭝ4nx*cm37NT6;tivzfkk0B{ ?ikkwGo;x" L9` u 0ñb5m1!&An7a,=I7HgMj8mхmp,ƎԮR#8ԇ.(E;WnIJQ5K;waK֭FtMP:Ҥe9{R4s`r8]&z\=m,Lř̒iIM/etU3K}]wt—C8x;|Uju v!UX) eZ/sV)4NAY=H2@IZ5]GvKUB^"x}!K zk ~|M_-*I붞hU!Sׯޏz 7~I]u^.]k\AnKC^t]!ֿjihƹx{d/wNuUkGDI!\6:j·jthm%tKu#Aމ0E+l_ !KwAtźmMvu):FEy{P;x.j mՊo;U4 ]gh:JݟO(o3G4 ^E:Pހoro<Ca~\ jŷe<_owb|7F)1ٝi.FӍ+|nW_cZ]Ej Ŀ y j6W5P- *yB'=F: {rh-Fh1Vb؊뗀b4-*X?&:v㉅z 8MEw6]Vh4\<V-6bY):q"~|fX0/Tn~D.m&}n+ cSԣ2lP' %1_/DyDgw8XeYm?'X Q1t>X~K qJ4uX aGkXBz_z.uāz4nY:D<@"j|?Y;@ |kP]!ZP9,gՔ:ZΡT~r~*ʹ[-'LzuNd!*Bs#wpOyYx7&$_=@)\TΓ/}mb/o~"bdS22PM0qH~@!t8(1=\KsXv&pTFeja:r-DQԩ8Py9IӁCKjƵƴ;8qEՂ9@Qxl_^! 'S`r4ش`m]Mo iM#&bp9_2M bӯMP6X~6}*k`6Of=ATocʬ7`-ğXy~̟q@bz<7g΀e.2R&J eNeN?SWßS$5o .ʕ}QFr2W2Ϩ͠|/sN_r|\̓v?_TA|y^u82k̀LM\7 +V=q5C1+V9`9YWSÊ^ T˙rz r{(o9i2x zq)6c0  ~@%~T&^~ԕw#a ߣRdD.K<#H{҈|$ r_ rUĝPTt)l|'h~Qh_;M!(at3DQ#1BzRbD+1`e,Iz*[wc ߪaY'Y 뢢UId ;I~DynQ/S$EC6QFZO^B*\exv"NJwB^s ݒEkCW4t5Đk c *tk&+S0̍:ʠ'q"[k)s19ǀ?OOҝ~(3#kB-a$a1fWPJo#@ 5^|YN'@lD@<8 so\C7);MMܰf'[q3:@ Y34[ qgE٤I>%Qy[DҶ!bdӇYLD»zi6W>@:Ҋ<]sV9Q >#%EHMwiX(lәȪPO"Lu'v@_OE̖.Ajj㺭D.\XDbeV/ 8\hه)^\h=yq MN"o+vQ 1[f zD F4f)](m/`9\uu@nØ7z0Bs7Oxӧg>٫SAOhIT?"w TTAΩ_\`=) ,CRFV æ?o0=}P2qzoӉ*L): l0M^w U7&sK#6'i*.: VsW2A <ʶ||,=hR}_t~! ZXXUp3>eˌ%V$KU>o{ ^#wrjCjap%[(ZdbCE#280-ZB ؋oϑcg0Hy@sNEq* 8?]o2^xg \|E^0fʅ8m!Z9RDH״a]c/_\Or^˷jVQðP Ncyb5V8B[U(}0.IT玱WϒVy?ժضzcXR ,xC*;3p;Yr?ݣh< i'Q/r 56 7B|Q  ,261A L1&}&yj(YVc> 0Vo&:ꑽ6Ȍm?d: #OKYyE5X tgHCK \TU8>o3* *XZh:%::2#** 4N(|^Pi6_wvk˵o}7w65Q343J**Î)4osuwϘssޟbzb-i%ιdL2>KKlK\r}1lͿNw-y`e7shVmv \ #|ta<APL6Cyτ<ٸH3I8Am ӍWxIn %=(@Ipgͦ:O9䁒S(EkCgRSiPn^Y0 0L&\^~$1Dd%h?@])')MJ鿾ͷo_1ceA>Aiߏ5vߠsaAJ<}o1\82M( P.\2XZX## +@F` s}51})1*nb p܎9=M_!16B} N7`GؚG5סa1:rDW y QwxriǮ9[lG<81"7J=8~Ƨ c8 =&ʤ?\;czN1}4USa7Wgs^6ױ'#̝[퀯/v9賒э0}ygp-pk `܁!C tؔv~r,[:Gp/>#^L  G"S%2$sҒ.+r!YIN83լq ΀'mbY1Fh\r_T΂0=z2 ʇ+3'5RT!1k*Pf78X6yR Vdb'm릡&WǮ0OsB_84\F$nsG_(H#X\6)Tl^OkS0wBUGw?3xp͝Pyz0 >g[HLiC'o汙u׳Ly]Jw/oS y'A(n !z0wȚSr:w% |"fhNӭ`@s@'#O/2]~UMY4bE/o`$m^džR@rڎ0ttRD*$F>v||~l0FC^ø/ɔ:+ wPx|ߗ1~~)̆nzc8~أO m EI/\ΰsqN$GV)avIW,*dF)5*G,mUw{Gy*zVhU-SEU0?_fzX)nA55hXJr IdW+34?SfJzgn1֡)>[}y7}wΛ E}'!8`ܐyQ1*JX;xs.nsODb W '#XcZ[^PutAc ?;Nɞ^M[76sI9ɳRQV"_8oB?/_=3n7y e!KBSÉ$d_yYj\Q@i3h!9>B~ ]dldFl-kG??F8MD-@EQV8DeL 6OR `v%g6D$} >0}Cu[CMg2+UX h"=Y#E\2._&c6 GB֨6ԶOypB851R֮p2-vf8p(] @v?#nOUBIq.* F*~ dyaGЧ ф ذŮ#$4IT@3ƚ V+};Ǖ KAi!2FLA4(!2IDJ̑AhPjdP' A" "GiĈ8bd,&GfAّAҠAӠ}A#:hЂȠ34t- U-3h4hydP& * M\AKhPYDв8͖6U唕DQ[YRwF (*]flOJUʢ2{JeV19]{ Wyeک  |b_TYYZUQ^^`T^tr+O+*+[eVWݤr0OR`2hhn_U,rBkK%UfZQYT*Y#3+@ i|eeN*rz f?}ZSZ^"ද_l٫BO 5P5 s`/선~v9߻p@2 ݽ3.H% nMAZ#7 4I4D IHG-SX*[ H64*==!`ܴj~[Pvv vv %wXXK.zOrzwʣѫY\Wǧ3mǗc#(Y(F82A=# _FK[͝'Z Œ%b^5X@bq0O-WTY\W; ÑhR |#|M4/kor-Xfg4O) =>&$>}.ʄԬqFa i4XTyAoX^'4Ra`.݆mt8%7C8u {L }֣L]LtɊ5R ץ-7e:;ęl@G ˆ-فU8 [Nca;ЋG pݹ j >Usͭ[؅聕+Wn;-6v47k̀E wg%Vn&: ynM'|j 3q }; Mw&",£$0u6U).[?O֭yp<5L oĉTIy Z1-ڜN11bͭq܋ =ⴹE$R2T˜tf}@hY5^NK ێḬgt=Y#9YSu;rMA^vB䭂E+i{]/"zVe8 p0+JR9'U Jm5!'0O=fBF+QSG]hsEzbU:ы w2!w **'J l( -} 6 XC@qmL+`PZE̵Yokd(k€@Ikqm[/+m(Ċwrh$I]MHŲ@>nL$8I%QL xT1X|sQԗ֞IE C}D|xMIM8TSgw{ wr~&jk+֪uoEwmӖ6թVmOS Amy>J_p>ѠjٴMR-Jc'ӟg~V8ɱ^55TR.._ B)u.ɉ >L-D]ahE~>i û6mݳ®!1+Q pSlԠ|s c\UH H~bP]00N|}=j|s*1 @6/" O8^m)e,]zc,~H˹e{umޭYɄO Vx$Iv|6 eha˗8'u Np 79Pϴ9v -h3`Hةl>q8/0a#I|<:n7 s#j 53ⓗk*shT9nTh!ǚ gryQ#YصQo2\htf^&LOKJh*[fNBT׵rG$=d=ttz4\C{rME`E:j܌#YMovOcN3$04S<䊫LEFq0;w{ G2¼i/- y;CyBOu2X}Nw# )>AюcjJ ʫA&P95O3rJS4AS+m.N T =U⳶;țiJ E̬٣.1(vUax*2gTZU}QuHѺϥ퇝h(-Y=>_!Xl-K~[˻,uu\XY`ؠ\І^q $_,UP^ Ξ2_WQ/w9+GpAIp? h-&1_e`#Q\>\R5\|_Bb>//./:[J Es^rQ0xvEuG{ (UhQ&d80bY*okg/ M}~ B"_$h\?]~-lh}p۰]>>˃_r eBڒ\4 Aloc;mD=bࢬpzܯ\D5T"[p"{f7Go ~A>2$x7aUh\?R8 ^pLqM?#E"N&yNe$mࢀQ6JD/?Az?#7 98^<6ŏς|ȿ2b@:d ~7_Bz$ 8QC'RC8.3GԻKQjhJNȏ|3!%S ܇!__ ~Пqyl/~/ӯB8Jbvxτz`co?^ _:NpQ{8?G1.@xE?xWA=`%CcA &;EcEi&/b?lZzHxB/|G~>?O gpQ }x@>z q]}NpQ~ܝNeڍM!Q& <C"g2H[.e"se:C:ܭb=?qq|d3NKH2p??r2!?bm_kpA8J/v%/Iϥ6eZ~8%`Evz ӃrWp\78E"ҳ""cNpQbt*Ƽa ?BhVS@C td{Y~B gb*|-B%Xx71l#'{l|}B -;hIB@JZzbK3 QT]8!&z7n_ΜVb/0BJ_'Oپ<"yҥLL/)ŷ`GyJ=@1fH էRw*ERYe( y;w9݋]Z2K-MJ-= f㮶Fh3Rcb5 F.Q6ѸqeiUa{A8"}ǫR͇)~ࢅwTşǃ?uş354>%ѱdU3JQ7.$l,8(y~XU-l|1,θҬd.v6"]`qC)2pYx-(d5MFhPL<a_8!NrYH 4MX0âGE-K/+? bWd35jP" O>-)B)wvD54K˥ۉ3j S{d\_n*6A20[ZbfɵjkECN=\K?CCUI$0X"+R؟q0B*!`H\Kp=ҭɸ>D^G#vc]6 n-sА5ņ,uc!ܵ8ߋ ldr=i:0ud Ie"Sꊐؐ]e# Ў(ly;ZLLeT(3Rs~[9A/쾎,W;FWVq{'6_ e}D"[ 隤mtkIR;PLW9A6S^وIyG#[X4 L1տ,B WwN[-ҮΌC乹 `h}@ty 7m.OXBU3ٴ'tqCQl܋?'-Lk9jNs76XinX֋Jxif0 MC# R‘P r$&80CuQԇ=_^.PJ3Z]վL&ŵ$t-W |͈@jaX Xq~:r!;7少_3Cu Pbc&lTDr7f=u`MY GU,`ZmWc:/05~mn*gCڌ/nj$˭ݭ*r42P%ji^hn$1[="_o~M}V-&1QriZWC&k\6 9 euaf mK?Hc^d~nqW#5D7aX]Uĉ6@$ eX̏ȲpC_4VY5 kOe$s_eYI'3-0b:X$>M''3j ʱwɊ7葐o@ NwvGC" W R8D?w>u)q2bR*n{^iߏЦWt4y)>#[gwHOY k !Հp*5rmb fY|bмtY?v+奲88=sS}!M ?B2TeȻ[џ$WwZ1ep\zslc偽ՙ.wi>ϛ]`9`p|wOq09np |T$=C8Hh$n2목]997" 2Svr?HXtD >,]m[m<+?Uxu XtY3f 8mrZ2©m{WU=5TƺcT.|bLI {n,ȃZlT 64T4CBN0>CdA= ?OYTKAprd99$ՓOr(z2F2.jLǐx)Uu^eGT׼A{bA'jȞ$Đ"ol6V|1ks(*Xhy}yj5{Z79>g/J^*/tKy<#7qmbq_f' ->M)$wГiƚH,`_&{X%"(NRYƸbGvGbBF^n#D %V"jh(9@B梵:Ѫ zl@Iބ44jZKƒ+ 18GmϮ%|㐦,84/ۋ-'Ef*Atd2zń ERZ4ZN^ />V`3-iFS9RƿTĭʼ+qC|oHgo2K\Y™N::ACബh:sR^ibdklivw[cu8 ӓˤ"+"foyB2%TD^o { {Oja8ݷWyc+.H׆ (pw3$^v]*U6\ ?|:wP!F(X(ţh (-өR =ń|SP!X˃aM "U,ig:|IVq_ ^1 #zjRiX {og4d =Z˝Cho+7sEk|j%[G/.F$f5qR-jB}6S^ $n<3L^'_'\?C8.!/!XCi-Ydf|޵Z,Bh>A-_U>$@HЄk,Oǚ @X.fc:nfQhs&d#4-2 'd|k(D޺%kDaw.ox<$pjcEVK})" SᴡIR46Pzs4Mp֗[7\E,Ao X ?Lz Drbȍ$!1('2s_+(h.XCtSo޾`!Ѣ A ؁Es-ɺ`S߇i&c]-#Mɺ1*$fOAϓWeh=%,%(ScHZi%XTqߢldL8ACRmȺ-HŘ.z–B߭'&dK$ jHʟb;z+PvgJQfU0N:M>z'촭~EKxOi} OߣUt)v Q(  Y$CPq^E_-BQ\oSg}嫪.4.VjbB@eiM>Bi_lLhM6ǻ &#޾4J !0:Z2|();}{bVbHWz"? G2HHn=g!J0م!:+!68mi %WK>Y#y1pɂAJf&D`4n>F'hH",a#z9ߚ yM_!vO8։ b8ֆcS0Gd-Ga"0ml$(D`TWBwV"8Ϝߧ_})8/*iəքSοwd|sRC}d|!\fZn}_n,aqJ w47~}ILH%X3DU[gb~o7x;N&W5T*uDF2V=ά1N?)t &+)HZBnT[$grf^r9Qq]$?(1 0̉=}F7֭9*WTqUrYU*2-Il[z~TUQR ۺu6DjU(峒8/B*Jj(= u4}EX̪஑\,в8e7+$ޜp mdԛU߻KO….C M!?~v~*L`t@1 2CQtgbXh@]z/ͺ4kf?z:o]JyM ⣐kFm#`r8K= ~pq+hdhiCYFnChLk9g <>DLxj 09+\sh.^s.#6ONmnV@RZF[Y4j**B;•k2u!^YO4oO/()do %{?KP ހiNeUH6VPrP>\w Bh>J|V^ͫgh6Bcμ(fQ1]V " ,_c0W/AG>H:^:A']IE|ѾC監2!K}.#mghY$^QHR]$6m =]$Mwr_Ʋ#hZ1B'oL?B2Q`xO? M![Zpm(ǾY犦ң7NXCXS_5aZKƱV{D$*t waZGՆync:ar8TRQ.VINR"k"+<#޵#|%KOU~DYz, !g +>|v؍a2ǗWH,10n>3CR8|\[j!ѻӽ]r*֒$"ۡMep4 ÀIk4>9Klo1~}BՃB/L_k /Hb)y(| PZJ ̈́xc7pvacA(c ڥOP; e쑂(w7k d5i-~Dǖ\ /9*zPړs'HNk-{*yPg&j>Mml*̄.Sd)4vE, b$tt~b*j;?JELEET 8ȇ2)_0@N¶!Zj& e03:k]3r 6JuSWɄKHB*EHsAѿ%HSg#Z^,گ50j<'0\}v %۟ 2]~4o!1-F,9zo$6OhmGAuA%ϣ.I%c웻Ap 4a#cR![ tu?⦤ݻ)kO*CiaWݮnz${Ъ1فxϟ$AS>huuz:2aer7uEu~, }:0̛B&gҠJk=f&_~#* ϋPV'O=i|Sчc pCcQLAґF7rl4z) WM){S.!, k: I`~0F\ :c`+yq:dM3Y \D%3VFy~jR-K(KisY"Q7_2*KC6eȟ~C~V< mqO7.r2gQc{ nJw .7YNw2΋RK:}mgsCtmeVziCNf/E ]fMc0r4>)G 2q X?FpJOJ}qYZ(d*~q=7Z_gx4hJURcpCA?^L&mzz6;_RMnώG \sm+S8 KEwΆׯOl&}6$TC3?e2|1f鹡'Ǚ3m.+ qLB&5b ~§[UWlτPT'\I0ZzhpW 8r I?d&0Ր 0J[D|Kh *3֡?&ohqjKk{uu.l;}2wI +*}~bhZPlI΁Qf QSp$•E~ 夻~KCC4x;m ؀yBNQĖ C%?I^>E_{Ѝ^wC7-9vs E-!B$e7[K˹YaƧzS1$yve1!1 dvݑ9(:=Ec5W0K?EH^ՍWin<~f\f-+†XztIO6 ћ9pBҡw$o, y"o˖F=pi`9wq&WԦbzVк3~ZVC[i@`=#@GfQhlJ8հυ ]sƇd Y ֠:57]Y;ld,kaNJHk#tpYEGj7)#j9BC|rrDHzm}UV&!zoK;\1s5~oCw36 Z1N=_?ÊuxjLр@6U!nxCǾAcQi"I( Ԝr"2X8ɕ^zxo4%gҌ\q[])!$_2!疏&|YVK͢\ ,MQj :n?`T;h Wh" F)Huqo t }vzQqʼnōp.\'ɗ /wPÎ0}Χە뙼K_{j[NVE"RAOmTczMϗ\t:d=cwBV-RfX^Nʗt#U/Bk#'16d /‘CڼKjY^ۗѓ~(,?I 5!8i@/ڵZeO)t)GҏB7mտЙ#)t Θ+5|E3y g }r#ϙ#s3)}Psm] [CReGfjT&gh|,C_~7ކ?1g Z+/T[ڑN27iI1y8=*Tڔ O~7Zj (-l:TƸ=AEWdcQg^mtD>Nymd 4eHڹ@P2>~W)x"ЮXCxQ8I漋S$+W7.]$L[K OcȨeLrYQ: az8QwI1F?Kö`9i9H/}3@7GM9z|P G{Eؗzvsհ2%pOeэXQovͥƨjQEͦ&oB!+T)䈓P,o;=MwbƌF_a7&SuBFYɀ20ABbs5Ap$חw HTZ0 &T[Thخ<2nF!OI2Ǿ/7ء+F[F4Z f# Rm#jehP:/__-XOt˝ 4*gvޢ*(ү}oo\EmG'  1͎\MCKgXM?D * ŀ"ӣ(=}0aV, Ą`N( 9IH0C$­ޗwwtTusN:]j TBa^Nm{ZQ_wLT ٱ<[,/u#A!Z)2Q~)hؑL){|S\'$=Y>Irȣ<]E $5u GQC)d}iI=6Fu:]2(xO @IrH+I&PIQ!{QPaB+VJAPQ=W5Si,īcDq0y ;Wf<}u:𿥍JDxWPw,CQr8Ԓ:GA" $fXdqMMT >ڃ}I<},^j* ՌR r:O(U&G3mO{59or˨w̘# έڈ ;:c ZZRGb@_dz]*7IiuCDJD&Bx}AFJ,uqKgIðF0cQҽoDnC]{wg O0$Tݞw|2\Ȭr0n *Rǟ!|YHq@ d̐

    VunU_|Ʉ6:^[y3ҨESmQð%T3KP2ZNb9.ZV{-t:#HQd%z[,"Yc%<ՎjB c7ǰZ tlգC5QhjʏTEf>NQ$규wf#,wF3)g$P[cgq݅:jeps")L;nƨ6~錜'"b{雟;I='t}J9"OD$0L Q,usǐ:":\8%4#\#LP(U?HŢ`~, @O)3)iSeRt$X~C-\CL1R;LuQ\JuQlwQ|vQtQ 8iKR32Kpc4T!B.RET8!4?G굗/3UJD1)1+nu TgDiW,YJ'E y^.)(^䥖$(^c0+L*pKn!`N(9>#r|>Pj][g}Fi9TY*-QiW~S,PSȤЎ7u>zI+ ~`%JoX-+F>|%|a[-橃rXD&1TR2ɝQT(哢|"8%N=Q'aN Vzu")i[̽{o]Q!Q^Na]x9]أ3( ( SQ⥈dKA 3V/U!͈<W\0jHi:_J 37HT3h>ϡ23Za)"REHEodG愖W@fAֆz*mfO<0D+OX_~4Q+DZG2r)E?d(}97h,*ip还}N [,d X)`!SB,)!=BB3gR+>SH}&EߤgR=B#ցЌ=vT~*TSEQQП{P~Y]~+ ^]5wϊw~o5 <]z5!L-SLfFu+ -X7z|<Zae++'Vg|2d2"c FQ̭[bA3[J4+F5Y#}xPG+U,Yw*n?Aݿ;`\:c ?Rl|)UJO?Y?$Flo(,JR;J$7"u U8&4QDl8捎T_ާBEDqBt#lD5N?{Mv2F5dаTi\76iT)[/+ 2UDY$Ov1I&l`AcO8,EI`=܂4M6jUywG-*nC3iF!(FOgͶyġHJmh .6b͈i`?0u͇6N,hmh>} O*HY#q><+ 6 C 5T( )ըAFlݰ.tGi% pPy7P , P"B6t Zt*-S$ Ēi LX-Ր|* Ōi։.w_/pMlhN馍(Ԩ! jlEIU`t% i!&KD·iSj@iCS@RRgW@h]3*^jGf<*jLA;{ējeD@b D-T;!O6AXՀ~Aq)5t 2Dd u^-T@@O DّUD-CmX*nH9̐MQ1r^P%r~vϬU( Rv6@%(¢XL)'ŃYPH U5Enj*|AN}AWrQw0ڱ+|=z(UE^_xF`fɠ991aH{3Qɲ)9 ]DiwQpx|26G")mu}E܋:"] g|אkS)эܿM:ӻ*3zl^4{r(dN"ŇLf 7fOط&]=p/4RN`9O ^پ1BЛFmk")Ҷ@/N,a=Q W+EV_JǡULy cc'KM-$0;^]!G'n[5GǗضhUANSfzeL K#UQ̎ppswoyl}nIƎSdȒxMjo{մp۲(7@NJ;?2m/D=|;[{L`ŏyog%i^q>-ly@0(׼ 5:vyΨlw_ݷq;ԙu(ɗAy;( _{ԾןdX+0N݁0fWŭ ,f'8[*{w@=_^+y^b4fD0gc,?=PvZ%MujO#B݁6zCl{Zt@`+ڶ̌ꗈ  K D@yR/1?y>=vG1f}jm*f/R)j{ uX?ف7W gXDTɘ3aa%H$m[MT]ե*>Ѥ\[ᏐjYvȜ!y~N,jϣ3٫?뇗Lګ,Z+.[PD`1 ax_ob`eֈ rt~Ā|9H %7 M 57r L>~VX=ܟ= *7[y%veTwOjF,HuunڷwAX/~;U,l\ӏ5"!O{,58D{lۖfe]X+MgXԾ8x~md]QRvi滻F+ߛV٫Ru}<FK ' GsyG< V,ۉٰ(3Oj[y$/>َK$ Rbov;ە!]ZFOFe~v"`0Ç^#$:'Š'T~N;RPuaA?ˊïH?nϻF$q^JH-ݓjMȾܻ1 ~mA HGʚ/^%d W;O_LNOlgʟ,.ntO?@O~{wؠEl??\)`r]&@˵҆Ⱦ>M, yco7jߗW¤a,#1RᇎJjˊT0^sї61S. &X!{j`C;LS42+A)t;";=5@QpmI'>Z([ԺLB[)t1GaO)Cm'D < }Zǯ_Vfc7?M$0݌KE0errxgiL2eYk~]VCw "BB$ZԠ`iSPng' $ CX}Rkz&H=*Bgg ۓ +~Q(+=X,Tf8wayzS&sڒ7ACsB}yӻ!?; H~ }/wEn*o"(9dƒtD)EE?=u=|P}E=˯xۊ,ser49Å~f T-t[ u<ֱNx5}VbP24/8+FƊ]VԏG}˚g^Xؙ5mz "| .(tF`ce;:Kh<0o ٳ:A`4=J!JaN'4>9RXcD МiiSOB.PnQ;{n8fĹA {d%Ɨo~}u^e_- G^1v,=LΔށů֌%twJ,lƦ5e wڊƷkc5ˡ{,||k9DFo2c+h_R9 0|| ۄּͲ&dLM CgaGxVU" nncyUߨs#UH(i*,){+aOy2{$GW#®\tCV ̆ԷV#Z^ g? ߸ۡo>W~Ψ$٪VՍ,L5'P5̲:'^#ˉcɹjރvϯjQ=/7# nNBhC X4Bg$jFւL)HNuw㣳JQ߼ӏ zPQŇ~5kP ϰ1b 9.{?e]p$`uӷ z OE!TqaYJOda޾YXW qE{vg6^ͫhb[ǖc(:]~|{H;{ɳ3RF8'-W ?핚xڏ1H_dhRǡzB ,Qͷw.&}ECz]}3}T~ OE_Z>rnTӱQ/Z`+dRTK`\.cbNa.9(?B/;޺ }곝 }&&8C}f-lyP:ji, [T\+W>o\lB& OM\r G\j2r/yPąux^"}wIP#UJ0j䦜^υfxUߜ;ѻ Mϫݮg.lm%\-\s>1 *ѐ;uyD=|,sQ?)y Oʅ͟b(BB.$n ]sA w\8rZ$].8n .3br7 k]5.io)5y9iCS.|}gl6JG+悤B)1OJt'q!6RÙ g<…wV-G 9Cmќ ˾ًԎyJ#qϊ GuBqLof.i*3£r_ps8{- QU\pLl[1&.{CH.VOA -Vi\nIM$ټpc .*$owvfI\hPQT*qaT¾E.x<3@(>M=Zow:M0fbӅM-=. +OȎY4zT+a1м|F8Oh L!`f#,dwT#k{ŧۿmU9/R4o Xj)\vhQs atpT큸f͓v<pjy^{N~uo{TT`69jU ;ϰ5Z .tG 7ˏP e54[/;NsþVíɁT/}UYS$A`*p`ߙcRov>*|g%}xf%H~Mͭ֒I.P81˵zB~yژSUVm)u!uzˀs%ҋezłieqvl©Ro+y}sMR '^g]ƌh3죁oKK>U4]cmQ&(jܫR2fQ@ގ{0;n}|,] j,39Gx- St?#/1Ǽ_n{~sꮂ0)  M .0=L=ܼA€ q-'ü@d "QT)Y ([MC}AFOiq"E  ="4vwE?lt} 5̦ZQ4 |l&jE=(g rsittJO}9ƋZCq/Q74JzSo2R ]T Jn֜(6{gUh>M|Q0 ,ZR@yPvb]%6p$\.U_=LIRnwBvP1SyE"N3d nE-FnrK)1}jBrE(quR.ʹjNɣ ]4}~ƏI GQq|@!O( Ca zpVOtD\9LЕ))jJvjR~~Hԇ#)B )xªSQa}QB(F(O|VPڅ}S)v ImZ-f(3a'\\ `3֢]H>J}ܶ4 P}LxyTT2$ *:Z0Zpx}yT7rP4 E.8gBi%ҶH,{"r?3NWFKM,a,Ii oyeެ K>,1'XN1Saspqfϳzk{)c38*,{uxXJk)< pMƒ/gxMʴ6n䢗Vo|mb5 {ͼ˚RP}b>hjs\Yi G-p5ʻT9Ȳ؇nf-Uoh,B{j-aܟ?X+w✧+_2Rj!F|[YI+0v #"՞S9\ ix)ˑg1'ڍ˓cnFVFSeɐr\n'%2TTK~UÉ_o.|)Mz y`=,BQ9sb7?ᜤq,s)[i ]𲒹d[\5,=nb&)}~- "PAKe.iVם߁k-#UT1=W[IuW׶^גk,+[<>Yـ{l"' I ]0&=~ 4%+5VO6!gwVo,HK`Q(C9V;Y5pN2^nCJIV"{HM #{eMꬃd5k!WoUWړv#ٔ%ͷl9Τ0Nsp+䯇ITHu4gbIS8wýn&mbz!q\7,%ZUxǴj gyc`bȔSU irr i^#Uq7H୷\" rMXngb wۋݵXC9ak1FNQ~F5Lar 6{E6/b:CLɅt7䝀cHޑZ4&g 7[5%7JKwrDCJm?Zr,io'ed]I*BN[-H# '^d1s>$zMeYӪ)LՆfR, * M:ףŤi[۶YXF^䬩 KcUdC!Kŭ:MEqln#9go3j=5$qd?;ȻLM'ң4x18MzզPμ_Li,7L/qQpbʴXS)uL PkcA,iU62u#3؟ţ#^ܑ47W5PۘVQc` 8ht]Q7^R!XV^cMqC`iP  G 3a< ׄ.3 l0A%S6ñ%:T8r DVvKaT*q<&GjeOL0CωgY 4U Luh?,|!0[J.nve<}gU0={A1#CLl!yVau|'1ŝ2]uo/'Lp _e>Y7v Mlv ^{}a\@# xr09}b|+|Lr~ٴ;g2hl1_wl0$j`2 Øaݑ07Y!~ {B'wP=w8pUVj7rl7~/w7ݠ\ Ԑv2W a {ʼ]Ww?%\AVg{t.gk\\x9Nt9bg :3qP>d T>;'5vNЮNܣ(\t9 KX<>JGgG8iڎ:쳇/!΋ìW!0G o!8jW`;^xtB胰p?!@e?ļgmA>9 =0Nw t29LQmO|}`k######################[5?S?)\p;*M_7 YipLOF;{$ (]Cq0ڌ m("_TRhTjHৰ "҄J, k)Z=ȂX\ž!+OE]-K C6v_ޗ ;/BCKjKd_ >׆ qsB;jM [-hƉ>S$v߂@n6r9f% ؕԯigMaEinbuN/5b4CPAsJ@eDBw@offr 1ԺO#!IдF>c|Q(K(_o%m˴fH㡒H܅vg 4߀{!9ֆfKv^$DUUˇ0˄/M^ %B4%7x_yه ޘ,mZtS tmo ZX'CTY1'3CPF+0K>Sėa7~CV<#}fmgd/YCB燰R\cmoQZ}3kY3:.2C+3xRYofx_; X;O^gxg,je7x߂ ͬ"fs Y`Mc}O3fyCvCNbݞR-ݲa7kY;77}#`!r 9{H >nwŝ]xoaX-N W{C<`7r_V@y2gYno5B}E%}UJxc2xiF3g ؍k:*mxa oƳo)}@U6 . xyC#.ldf;jG9nU70#`.s<ԟex;vCe1W:!x_Exy N=h w[̬!xop!xV̬@C$̺nql-/YnC]17z~}9xz̴~>&`f} .Ѓ`i&oMxhIކgL}ʚf/xr?0v!`jBm6޼qux> UtI]di,1?jRH]]l1Qi@5,^PR1(wC0Իw8z֍l-.Kfei@MoYķL?Ѷ AG}* QB౬bbx!MA|?"MM$|9BSLTWXlhGRR6Sm :5UUEP15hƲH:1FMIBXu m75GW6CYx:Tf?2}z)Hk=Mp;SL#U:v?yЌ(o5@EQ DY ^ hy^ S~t:b`5rT2<{p]3ab Io>u}H6L[L! ^6[MdmyΪV_|c5qD|NG-Cw)Kv} wx=x(*Z.ty /.e;?cKo%id9?kwITtsqzZ.>SKx0{l"3^ʑWuN"8w*`lLPȉ|r1a EWebAkM9x boZ Y5sB7KgUW YAkgko &[ReukmS|vYneb'Kg}FB氎G7/omT?l6#W33NYnnRfi}D^L1U7+|=%-!o׫눀EMb%,%$~Z69kuK'b[_JrpL ۆ078/Pxp,l˾3sxRA=~nй6.uO;px>< v۵آ9>f~K#vJJf ȥFjzj>,*~V*X1Uk~MҏKزNLNG}MٻYW-%Ӷ(^kžb~gl87]wwn=Io+b l*+2BYfw;%7e^a͛:b6K=WVH4FPⳍOsޜi#ϫ]Ggd™+"jv|&'%;^O2^Tw9D?tD>~d [{0d\ [3IYn`^m4{v~ iY_.v|'pa`7wC/@R5GٳN6Z 4zѓ.&c<eUbR^T-?ץ IeA^3bӛ}A$kR>K콓QqHOR^bKKnsyA[,|Q^X z1jc;K.guē-μ l?'O,ł끛!]#ZżL@ymXj^F_3-c[# /+Ũ<:B<:V1]ZЕzxѝ +oOјKTZ}uVaUpavߧ{?Nm/6 pa#d=À-<{ҢI ~n,7ՔA<0.xEx4ft}D3ޝsZ!P/T-SKuҮVx$q 71?[?5qvZ^VX+f.sfy.Nn(valsݻ]$ Զ}Z]C$X~vx`aHX L^[v9jE'#CU7_a(>ue7i+vSNeW˿NT|2PZLJilžkɉWnA#c;a8$m묮O]z'3\=aeNg=nMKw6sELp$Dku|wSSO]b˭]^FDSE.*g&b[F^v¾.gܽwVJN?y$arN0J-&hN4Z2abۮc:fo;W%<3x};nqvX+fNTeu&m07rkr:tO5ޜvDBoEgdTW7=R3s[S:F]^m/rCU&jrݗJbw_ٵ<5ܺ2ij 4:&^$ᏻ@)v_+W=!3.Ԭ)|UwO LlM_@+Mnudh.`kos'_z (MHe/Xy Fy~A0euCssN"wZNQ~wR_b7prG2kM&tK]>i '.)q!I5ޔ>Qڲn2E)?ҥ*p@tFk{J'W8 ARS!~{cm7|_1 琚 D.*nxme篸ݰn\p~}=9q!n23~iz.v_,uւ )+^U%\ط껙S+>YuÎ?$] qrpR8'AԩWog(^:1!ދWH O40]&,5_ ;mjv,T1Zb SXnF{8hP#P8Of EUER{PT1OŗPe21K4R0kѼ;'7"W>XiY"h :t5SHLJDz`WY%V$䢹i9 wHYW[`>1]Z_&&bHϣw#w=UDWOXP̟2! R~}PK |̩p̩9j '̉- sa$ MX?کσTE@rTh}> 9t ^ Gr!P9/fpf06Jj'i.rBrѽi7p#6UOXHw yS^O t*C)bh( U,8óÇwE=qJZ,Wa*ڈ(CO T/JmGtߧs`R bٳV`fFMH1>>7؉%V?Y0:o"Q=t gÆE_wT>+JԷhUv'"P뫔eUSKӋ9NKS]ϥ.lLAu-qT߫ɧj^/#dyWP%vPm!%,rSQ9ӯ205{.^ؑFHt{[_m뎦^ s,߅Q2ucݾ2=Л<~ܜd+uO_aY`\$di7gNC߾0Q{;+oG`Wyc+Wm{Cx%5> ?2?^\_^\&&͞gj{Û[s{lU!n_A]AA^8?Hx=h* $&^f7eW wM*qSxBWC*fwL)Ki<נ{S42r#ʏxxׯ7p}uT gV[.zyD>[VN,|J`ƶQw}I`?%6FKZcNgM 59Й(Y/Apx2Շ~FXAlI|*5nҷ|sxEMѮݹ/nF@J$5(ӄwŭҋω?_(/GTLXY'յU C#lק }Ɗd*?7Np_b{Ծ)f52TNoq/*W 'mmR3K.(<\B>F_w WZX3M·+կN@_pBrATֻ}ߺygn9oJF|ˎ?xraQ1t%[BO}#WwvmUL菚ԠfjvMb׋o0U<;+|!=91DfeeV-VM3$-KrPiWr/}.SV6X܊!4kR2Gm/ED,T-ՊiKT;Z Z6ur;_?~}{XI_}+҈Fͫ5E) m`+ M=X-ozn0ga-8]ګJ<>KZVAuz2zxԛR5@GkȾ 3.$ʂ6ە6BVs҉hc_z%JHolrv=|%?exv<18(ޫV/C\Α[6I(sFIu~)t⋈]yS|r"`̋<*{#g`WkՉc'Ho+fvk"Q&ۓd7>(X+X;?vB,x]+?vz[^n= %GL]ЈkX3ŶJ;%҉':ia:kծRJ7NӍ!">vvtnN"/if%NCK\T?~)6@PR QPPfEQD$ 2[PT@.%!HJ ‚s}>~?y{L9gd=k{^%zV*lf.m2c1}Qsw4zCFoÊ gw.y;tIbƵbRo0f-w^ܴPp;!/d$T U>y??d@QꤕWڮm\=f+E KÚ/d0Fd+N7>e8極~xq֋!RCf,pz78_!CtQ[7p-Z`7wi:#-6m}a gh ; SGٯ~Ff3MSd"FLn>a'5s֛vG9`PhTئW ^ih܈\F!{yVRh!CkSK:=`H.ӫO% mz@orDBZY0i{agp^t֭1°#T{p2 =`}>#"מz81ԣpbV']ٺyF`]xf/*q/MVٲ7Nz>q>[WvnqϞbF p?{BƵ)o# H6Cb8x: np 41an N"~(\ ؓ1>ߴ悠NY tbqAe3 3/y eW?cfX&3(1p悑?t*dl8qN.m͊<S`\NP.ئә1CB'p.Tb5Ṣ\``}zK1\d$'aO#傫NO3]n|}l_bWާmNc?O~{b_s|MNK0̂79Š 7woGG=r-ClrN9 䮪E>| k\-k.UЗ?<JNd:h-7zy9;+(m$dz e{BdȳjV_~o¢/*\6qdu`tx!|d\͋]#"LV8N=AX: =d.RY:<+n\}]/`鱚.H-xe^7rRc .on1 鎮Qѯ`P{u|§?`S$W̊ X߹};k;*G^d>y.uTƥ5(z%:Vr~Pu19d hu"sG  򚡧vэy?4-+ zq>t> y.}؛=ɎK}D뷳z{A lx-aKx{ȩtq&.[2l^)s?* ox'~N7:]r:!`P8`֭j&)Qشj)[;AJH!>{Vc. urdHL)/>彏ȵhWC7b! "a +g2o)r(݈_W,)"4$u7O+Mq1⛿H9ԉ)4T6)~SNoȶ|ez@ߴ{ /:h29COJl;Y%G&oL;1 q@ 闾P'P"qLXS|+^7nH=ҫGj(>{!>{px$N%}KI\~_OI~_ڏOI_K#q$/ex?_K/I3o'qV$?7_H~O[!qa/I?$?i$A_'^pL_p̿'X~S_OplC?Op쿂`\?Ǐ+8oKJM 8!o%CuK#ixE#ךgMn#$E[A&SIB򷚺-g3,$Da''n'E6.E]r]r2ޔJ tE1rNy#iIyq*i QIHr3FQQugm~#oʎFLo^w\~,!$Y2ǵˑPEG"VԹ_\WoEr)H)R|@I!_RI!ڏhti>]n:<]n:~ttO.]niwNN/:trƷ @x ?H? P@@ yzO0>>eOO!cܘHl{ !EY)}@mE!@Q8GFz%r:wG: +{GoB(<Sf=2D3C"{% i<77xC p]!mR;]1M`DKTA22kD{ b4P&u!'ڽ:AaeZ#Ra =SlP+ԠFDuވ@ӑx3SGu H ׷p!(SEG>${TuI0z.R[I*E4̤(jA9$;~㎔3E90T4S.d bZ(?8.X7ObWr匁`sT4D߀@i[*Q'_ީg}`ÿ Ed=ngBsҒH_Jy Ak[ǍwجeOȪgO3nq~L{[[3OB5ikGy_eحP,R"Xrr1o?k#D<KܗbH"ȥJ p嶏+ Z|:˸a !H֍ӷ3"M"Lܼ+k0^6 Hnm f4q0hOECJݍ2aɝ C*O' "B㖯(cPuC 1v߰Zo!"VG-gt_j5!.o{)1\q" o2ƚ*J(tv7E.uM^F+D7%$+ c0a(!vFuF bDTabN0OMtPonZ`F1ΰmb v=mňP8F販 :C!}XΘeCdeRWR 3LFgX\vՏqÜe3*G1&֋ݒ! c=feCSD1A{;YBoqm׮<&KHhݞ_>YKX[Y^+v-vx'&bPF9g?+sIn'}6>q脻n>^d[Fj/j tbG6E.%_97r=5_~{yo.𒚟o;+A05yn,u?j|8Jx޸Vj8x̡O_T~:xqY0 U;)!_Jpoh, ύVܑǏg)q$T9p}HDAӔ7Әwf: (2Ї\-kuz9`;gu$(|`RaN8ɦ3߫]e05.Rl9`wC|Htq] .C̞8`szڗbOTg{A?Ko j) ׶ q 3bbQCN<~ƒ vmMʰ^ջ73!kl⳺˱yrD5$? SJk;O-@O-.)t^&:s ]8 )MJ|q<".!v 0 84!Kَ\Y BHAܸo0SMCE2R!qDdy^J5H֢~#Qڥ&Si4 8ʳv/Tnл}HPzɃD`˨ϓ2Gr@Q G]@9;;g?>q]L BP )"/蒑Zg !X~//b'(ׯdM|2uWt|~QQ ߯h]0=eb+Mgoy{3s3(-k1鿯ra`gbc:g~O#x#?.xFmS?@[kǻ.=? l6~ @"%8Jc,-Pp`w3?Ey%&~,,+p* F~,*h#ZH?7ӏEozn%P~~88ejză 79VS!T`NO]z+ڬGnM&0sT']`d*x-`Zk+qn:x ̘fjE*^fwsB$1`x7LP+z8$3qqw$y K`v ꐶr2̟hY|bQ"x3MweϑB5*ͻ{FHmiE~yZ f^ '^fJol1=G)$.M[_-~kJk(GMam9ǗЛeKX3Tܢi! ]azL ̕IVRFI%(_yoEp ÿEpXajSes ;gx>5=^~8% M@t^-92!=ZT:<G:pv+3Ac` 0E^z0gUO[^᳢e'Ur3a{7ޮx~LiN1g 0-r WF0gm[reeUa{_mMgm1cEfi gX_/!A"\(KYS"*͖5g`&BpZ!m mMvHJP+"-&3G] vk֏zhX|zZ2^l$9P=y<7aEao~?a5-zMע\~ā#߁q)UQW}(VT1wo 9qk1,w@{i ;?q p10}z-{vwZAݻ+0_ZA:iKa򿑑Tyr]5x2GO*Qd帑iO˖0F<'=#EYp}saH]݋fX+\wY8 gqSlQ-J /Mǖ~dq[2lA#]r0MbGHQ9 f5}94]k prV(> P1xp)!H/Lɻp}inړ !Ώvc:@_qIKfi9P} d m63TR=~'GJkG~HCz P{(3 8k"M-ةL9f6 Ž%2^hQZ04_NjUkK>hm-䥲9@KsLk^` ÔzYx |o[;Lϻwoۡ'.` /IjːB"T\8V|~"kED+PN?Vo?_w\.-i{`XNtn8Fg_߂|ΚŀV\5Y`éΞ}p})bh دT{fX?-X%bJʉM?8` E[Ic01ȼXޛeE%u[$23:Fqݥ v];5[HR) &P~Y,Wz5n&#z_3Leq)P>`IȨ,\SaxHLy2<8i|G=?rŏlM~KC*~G[5|ظ ?q9~deUX2?U|l|ȏ5h51,~>ŏ1c"?%|Xɏ(ˏsǏg~lL*C6~Ǐw?1z$?V!4?ڹc~tk)C5~ʏx~dC-3.Hƛlj ~oRoрHxM bDI M>x݌^\G_69W9Br˳BWCq~@!hL$ B}#"V#T.O%c6I#,ge%nk;bQѫ#ȗf°YpBXPjhh*h6g|ezU+ `f7J"Pܞt#penC$G-k1;TySk{rXq2'D2; 0fzז Fɘ9IϷs Ba? wuyC&H9+lh Fw;s@J9:?r]i?I2޼dmQ[KچN#<#߮vJ0Y~.6H&N~UJɉ|=IdnfOHcBÛDB7< uG]zz,S9qlwU.'On>r%AAWmL#rj >:OVt%҇eo\ 5?=4zPTOz+Ir~(\XOfKbϏ,۷-+9FjWƞT>84TJpmm2P ۱ ,9oQ奕n+Ǵ2@eR0M1+7r͚U $.f( JqwJRr.Aq1%`Vp@{irCJ@bP־Odo1+n)^<4{^^s-+PODו{^nqEajY<@޵>-c+S?s&" B-fQ"/].'(W!nq/4׳ ф$ d n<Ӹ8ZL> &Ȟ \W+M>#OUOmh /<b5n= 8y맃lң]r2h}pa6(:m:kyN/_lwgs{x^nRhf% Ɲ;+=KɮǖQMp<޸lr0M=3bM8c|ވJpq3Q97*@*~]='O~sl2jcԂ Ƚ[%K(RrB7%䤇يe"g\i!_DVOs"k>'JR3{~G'- \N;0t5?E? ;4,r ;HbY@Ђ`*YwFw? mR֍rɳiCT݂ڀ CsiYT+m*`w`$;GZ2zf%*MKhd2 /ia (hfpQ$d;fp\g. ~z 534+7S{FIoÂ5}Q+B$"ϷmLK[=otHm-toF !*KpُyzUъZQ%GQoS:pMe|LsGjB0ˆ,iD@yT)TdfX!/U@ٟB҅̏@Mr?3P2pjGLc栋r*z 5Q?PaQvux95J_9]BBRYلj[{([bαs+s]ɀ{нb+tE~3'C:`UԨ: 9V@M.N9?7BzE!ZHfj,ݛ,@|eK=͂23n]8u/C VݶFYPnH6 K`&DF=C@Cz+(5>R D[ ΰ<[Q9<-u[#M .w^R}:`-<ުGO?*F>r!uHA͢ԣrG`7 J=ʳ/Oע(q} ƽv̈޷Rx VraC8wFRAYRs^6'v*AB$/ Da~}Vq*E= ˛*xDnj~ʜ~/5o*襠j-UVBa&+(HvYhH7Hd:)5Z tPbnDْ?s.?i(ѱ`D OtCW .Ak`jM2LJ)|4ś,f8oAv-s4cJ)f5oX:UTەRWX,m\?mQhW*?LFcFXLYm.TP^==񼤐G&X-.m* R|`ؠ|^s]/̩ (Ax= fg9HQ Vf6&k&ؽg<щnʳdaMN1J60n! m2`{FUm3yȊv۱;m9ӽln Yk026/ny#d{buf%+˘v_6鿲5=ݵ/2{n)PN̂#.+/fг~X蟵rEwdUA mƊZG9ι\bUCpoX<t"zYwt&:3ଷަ)L'b}ϖ d!I 93ԣ3w"]݆Y q_8G\ʂw^g&V@:5\mpp`1GsYvK/_9wӲ| űh(bZ\#ߚY&i*!]U;58M! d+д"lֲݍjXgl&Ul& +"Ѫ6km`4鳖in7~HX3I:rŋ~N$RG"֟0l-Q%jp2F7 |1jȐ#Zisl{˴<%f륗79_ljr59b楞q7W282c_Vӟ%K8T>"\>`C%y25|4\IO֘8.uW/e RAN54)"_Am7`lR PN:fP~U1*''hlyNpIoXm?iwsnɀq0|fm)9o]=/aq#/GTɟ%ݻ0HrCb01%V< XoKrvX uBrJwE?Ğ+4V$-FC:gKF͎`ϖ^\@jpgyel/.ZV[yR/sM2.Q2s,?h.q+k*lnf/H@5ofy2kLB?&_V:O^d+S e60ez3Iɶ='3IUv-0"d#\J%bkϼ+Γ!0=1έi錃"`cvE|J%g~R ƹWsceM?Q\v'e 6czH l΋$ 3>t%9sܑF&F#[121|LFH`da>F&F#[121"|LFcdb$0szW;xޱv5ݒD9>1^ /`1M)-zY5 p|P5b;_柱$}ڍ ] ro/]>)>́:W |ⓙp"dJ4ܛ>qt +>І+wi;X<1Z qԭ'~fɯ փ9s9"L6qu*zN"-dP%~=U'ՠjT (%{Q{,QUۼ dZ+n*Z^`=2(}c F?D1˭i;8o[}S=jۥ,mԋB4#=(D~u}iҢ(&4o?X GSv/ NCc H|C/0~p^-=ddz#]_2ơc!GPX;]uB?)$hZd2֗h%A`Èvȴ [+Y]c%N7Q%/; gAqį!`Jp6Ukr{ϓPשƭtAͨ h`XU .e~QHtӆyz00OnS;FavgbVVn; Pxr+.C8?~^'bKH$o4F'Kv]8o HϊXrodrU]? bJ+@dH>),o#_.9Z w) #XSD,G>㜶8OABC{7~DޗN -w=ɏ3'y7C4gH`<&3ϋU23qʟ!/G#tc"STgJ>vz#yNmxK!3voΚG%(@2& YQc+D/H x{߼k,7+=Ƀ%#X͌r%j۫%>tQC<ɭ ycA\x2Wg5_\OKY|-t^yd:ueZdB&HլG7GLFżS뿖}+3=ɖNmPs'Mb|"y~kȢ s.0P~boE^\E[^=u%o`#٫I" ZI>ZxjfWF7UJs?f9B&$ǧ)ZɔS >++A0y̺4$E)["s5PypdӬd751<Ĵ*j9Gz'z3yH!k:piiKisLazgÙ`ӆ8n,1pژi-L4p8uLpO SŴ20pr47Ĵ8`b81M`zPt/ .Yݘ.`+?ct;۰V͘np~zLp58\+1]p.+{|Laec:åc: ϰT.O1I8C.0}mLq똾+p1}簿8LI/;cUO~u~y /bFf߄127b 8'cdz`z_Yk;v\n1v\Wp1#1 12쎑K1 cdcw;쎑[ 1#sy#k.v0lqA"Nȳ6ydS,LZo.nKw!csW]0WQ"zhCla5Y{dO%Y׵[׈E~=TEU"@`m2-Bi#l%:G}3Z)AhNDa~^hC$;%J)YHO/6=!F_3RD u_Gŵ4U ڟDM֢?R:sy_Tzʊ~FQVU2sZm $$Tك֣o@#Bˌb!f py*Td ap$y_=zopc 6Q{VS韑g9;-zO;(~KSV%Ek&,z#zr(_< _6|\-ISkӍE?ĩalqrȇ'N`Iqk^dJ;3RϏ*G DMb&{(8>b}EM 2&>cALnە@QwwWSe'5XJhqnGen`RSsjE852;iGP`kU[jQs/-Ի%վehbX&?i7¨Mh1)MJehz?%mn7t*Jdk4Xݿu:/e|s4=$~Eh`tƨczFnϺ2r P+ʧng(]`1_Ue RV1`bx|i ?'SჀ6tM*H607S %ez5=@/7N4 `l:/cY 4D"M[QgܻPBŞm̬&| YNϊn:`l+P"Ί 5輆0nدD&)M]eؚJNMG5 g"B"i1psARa/3*GBu",7"~-ɦ}QujZIN{!3}VWWWWWT!m{.ɩ;mpԺXc&Ĩ} #]5ĮZ TaO0/W-?ٞx7P󸿮F3c'?iǸC h30? Mm8 }6X6dfyb`-6+qStz!bYpâ~~gLc.t ;L^`//lG8F漉ݴ$:7{hZ<~L¹axkvٽ[?)*^_';jDVLf啠A7۵=Guʨ|za6S9qۄE }RD*]=`^o@y;_Cϙb?+Sgn{`Drܮw2wPbVJRְRPt)۶#Le&j]geeDrɫN=vb*7W*3$Y* *K97 _Zi.W.[]g 0U\9lGpb˔W,s(UOPs6(ǼYlvh'AڮB_+O1 {cnE'<8;ƗKeli{b6Us{Mfu+w}5ʑ"qOocQ?0VͯEOgP¾x|ʇZN+cM^gsggfRY8>)w sFO|9[9>u{Ryc37L0>fxax|fUN^ OdCho-S/Ny{ O~<}IKB.g 3_GHNSZH 0hda~Š|Mdb`N0RW݀_{,$ 45ow ~1sa˼v)Tb˲۝[ ͩ;,9=t{ޮ7ͮ% o_8.%`O%[c694:Yt-&p_ ]xו=dfe&l>N(?:t{ v;sMS1c _]f&lM/Hn[ixR֭+\%%d\Yyn1hyrz'h |oO(xP V8FVq5=}Vt0E";6iY^ 2L)x:av)°P dw oVzSZ+wTe`9eû83eKl|; x=h\Au(x?x?`":32`&oۯqh@aů~z#UsYOzHdޯA_:k) UU{dPtqj=]gMR8Uv.ZH<^'Hp80,\7ȭ{86xJʕ#]0)v >1xIeׅr8FN8M9x.~VŠG_E[nJ\QAǭ8%<\o{tLO{g&+880]/;6MvO(ضJHǻ85l(gT«C:eUëgŷ)Tȷq=6[xS TEA~)pZE~w>0h ѩ5Q,sq`Z@Ր3t|q.4ݣ ^8J*<#,iS Z+9@9[uL s%lڋ/\rZvcAA{o), .LQgU-Fc {CWǶ/PUĶ'S\w;`5ᦛ 6)x%y._.gSQo\,ՀFoQg 8Sފ= 8'_c"bfԀ;So]yoGR$&E,^{w :>J>F_I3|7"338e|_}mRqޗbxF]bu\,Lc]U4کlo4 2Rxϸ2lT1K@A2nǿ7 x3[ػ_Q2cOУ:-{d:p; op""Ԭ;SK\efG7)8Jfn˱Р5’y%ӷKS߷{{X׌ubs 9w)h n2$60Q~}}`~Kk?a(l \@%GΗ0#E_/%-3!'C㳬/!' u~`D"SIJz_mзm;1[i"},ޟl$S4!؁n }z+"?F>Ĕ3O[Rʡ6}Cɖ 쁴+nib}PYܺ"+~`W¼XÐ}9Gm\!~\#ӵ.^(B"+,fݍ*aaGxoo)q>="FXGPNb@VE"Vp>'{m5A)v0o?G_PX/$>7t HS$o)s4# Ymz'E8% ZC:p/Cm&N5}{]P6|GߤSpބ,,!MƟ310tC[C'I-X$ :v.ɭw.@Q8. bˤ"0*?Oe5=g0XtHqCDPDNk׆kCo5 8˗0ѽdc#W9Wha 8dzohTkdk8RGH쉾3 c_ =aO, ɓMόw\[4j,^e?{E8w: 2>piBU+ b|?|27' Mu ᒗ=閦.dj_?qlqY4I0Xr2'~*N%K# {t#` eD#:xPg&lĥc 5}{&+0E_O a7 ۻ: x\݁0}Lg\QIޫ ƭ>W>%[E ourf f=&ۜʳ F79O= nj{;֐C$3zE3`?.ySo o;ɴ>iv*ȃm#J]fEݾD0B{8oӰ&k?7 W A@qxY5#USҏ+;W籑o~8˫N@Ե ayVv!V pEpO4y3Ds2P:-(i}).\ZqRPSoJ\BAD;v)ƹ=+~ ش%°_K@>%`}qҐ&'{z]`Su)}oKA ;M'Ջ|osE-9'%̽5 QF89#ip{1"x`XGP796^'j?T}|*gfǨȑc7^y?;3c'S=A}פy{W]x2{PGD?yo7f :oO-67/{4y]/ AMzPhkKzЕ q?N8xJE~6u7͑w@=f ށo{ ~G/|k<.NspIvʜ{:/<#R>442A's",PEVqDbu|j}OþbE (ڧgh,D,1#f-N{ n)y"F,YiNVP<03Q.Ң։hsI^Ex DW ɐ?<2EFGeұ+'~J#`>>Qd#P10Ên4#=Dm>va_ҴfJ¯Ҿ_d|4IhKnO69L ]%9|2̭W(=a%]KVݥ5>w_E[V-f)_۫,kֿ}q)pP.{]B:ޔ#oƕ\ŝ-ԗMrޏf`Bo%>S {< ^ x)ҝZCggw;EXh{)RK~H1=D'Gx+WWTl' ~5~`c?` jGPOؘ`~ #(6藠ؠZ?!l?Z%T}  ~['AOaKY柠mAџZ[?Aѿ!׏#gɷZ~o런QߚXoͿgzǚ/kz^?޿/6AG:J?d?0OFرndz @A>CD>FG>IJt9./   ' 7=z\ |ª>a>a?aa?a5>j~+V%OXa5~qqMO=nNvv~~i8hh8iqj׬U}`>XVVVVVVVX/ Θq]o)#pӋH?Yuǁn`d3{h\ lAp!fK1n8d[1t>G;wq@pGq-="0X]`B:xydNv2Uxwl?"{^Z& zp1k!?x%"BjTg.CAg@ʽ(S6[HKAAto]_lFCj2"PBxZCx;N8/e_#%($m3oX_R 'Q "p'"’a,k8~(%FVJ4ܱAӶ>?םVӭh*>n^^?t7aoe`%߅%{, /N{="ھ:qkfu}so,J\.W;x:kdiӀFo/ NS]gN}&5pjhΊ\rP+#;w%fPgm>ӱ4/N?D6ܻ"zUH@s=T`7v>576r{ KzO5*ϹbyR^Hƹ|xt|ZԻ_9mJ'[dm+:&(-<tqgnнj VZR]݂αSOyo4,,%}LYM}9{>4yz79T Ro|,7ϛZ}|qA9#o:k2"rƛ`[6rV_v]^|I 0+=s-;uoeú/yeI񻢵<8=/]lk_n/ӢEpb#럃Վ7lSwZصS㉟K ;?_|8}?|m}MxuȰ n5\IГo޽RKNŸNegQnNcX4qPQd$ne0owORE;~xt_Ngdd@$/'kQ}O5$ ۻAq&kHa$mh9A?W?U7+zcp':p e E׍9 ~/_f$S/q>"cՈ%׮^UjIhs䑀1ޜ<<0tH+YԠ[W=^J꾥62ݞ,gs:jq3c1ݔ=&~Ǵ [yZqÛ2TvoJ L=2B֩75_ts{]7_{,1yW>އk]=,7昮oW1qɦ_+wKP9L8't}?o/ɗ6,`=0Vy]68~p}ʋ3&,ظ[zsuѫʣQo[Z[o ;sED6xyk,v*Y0QFѬ^bɺ:yķkwD(S/?kh|'M6xE{ z6isXy#eCѱsݹ/B)hV" F? ;_»cd6x{.C cZtwBˍn?V j7!:>08^ F~ ࡬ۗMg,Y9~>h3+?xv6 ܀;@h9ˏ)_!`Kwt)`(GRKLm95`թѷ{F`sDllbޚko/~ g#w)WZc ,V;p m寗HڦT ~Yv[E?!ctνkSvFgt+ne?{sw Wܕߛ:H{~H3 y8Q7[xIU1_l!8i~[9y&ݭ sf`*b~&%Gpgˢlʹ_7; l7/ ~ߛ/E;@/A@/A_/wC @`?P6o @_`R@o@o@o{%? ! ! PJ>ߑ%Y%Y%䳛ߓ(WWِU!(WeC%/uP}|:_6*|q { F|FP7oA7:)w~wu>&l |L8q>&{cJ@|G@P† A?(;w;!lwJC~!({JF|GFP3†g A3ҟ)?w$l' J?IO~$({I^x`[zo g@>j#8>1@ І]{[}`Ԛi+{y(F{?m" /oQlӁ~"6?zgPF]l_hu{d釋#[q w96sUH/ _%sǑJ(7i@YI6~0kH? }t8ُ+r7 1ӛ4%"5 #"z?Q+OO*o!%(-"k|zwm5p[~Z4}=hsZݵpENZoNwZONoZ|kjG~{>skt;}ZoԢw=g;W9NtMܢ9ZKkvhiW<,zZz~Na^+wj?Z_J1~[lЍEIshrDi7r,_ȭ>"Rp4u"s>?z3FǨvrz&Hs*ϥrڙ1eZDi}H7NR/C h=X7k < `XCXXXX㇚/`5_j|X`E?~(zV X3gj}Z_z}QXw`ށzGQY5aV⇄?TYC|dş +LXgš?//,牯/j"/z|O Oij'wj'wZ.7+y7ky} O'U> J~F#%O5?hEgv'W+j]=dt*lNlаpI3A3CБk"U"QahypKy.?a Wwf'Ml7+]-R;Df 5*Fվ~Ӿ5diK&\;vb`VȔ[2fv^_Ҏ+֨jTYj4uԎCgm$얛,E`(baBb$g9b[ }phE$0,uq6ϭY`VWlj@/QRVKv`0`b9Xf;ch }0LʯfMːȄ$_%je+ IWpF i.(W/4˖˔8WC8Agy ~EC~|'Te Yƌaf)Idx̪Ǿ3l̤`}ӿm+ᯗ}E͓DR\G-WG{EI}`$c! I /HUFb ;#25tNcp~m %9tذꐥ<2S< xŰ\''#-y)O]?x>8^._3uڞu&TfJ'Q⎆ZUf[FfbIa0_/0?j\/{\551^p_pRlMp, ,~%A0pRrD"^x6IY$iBa^yL4HrڑD.#PM#E<Nd(Kh?Qt).!%;Wu#5%#!kZ A1 bxa1v Jj_&?2͇w<m.\5zdy.*ɠq2r &<$W"9@i#J<:ݴɡfm66ñNmF j%JѾ@55dNKeR<6J4^j`j^p71]:JW;$H+*t'7 Ȩ2:]Հ!@65C0f(vo ~}<'h>!ͷ¿bN1_&T`Z^LHfrXM[́w+Y1#}1P6$PHa'+W. GGYC 5>PV11-i0W>E^?K3u͍Ó&NUcD'f$veeo0^ O N6Z2yw$;lNJAbeUbʟU=zq̆M;$r{xI&V1?p F0ډ>#'Yj,$GTs 8ddQIV'F麏a#53I؆8(lL63 _P:,kI3akS%lIjz 1gG̑.%m عc G?wf ; OieXGcf%X042C .6\>\Cd:X($[!yMBhOq'͍GeײL;KZ=Ql@sa^j,*1rpɓH:%uWB\llA=e*vo$o\M " aO^ʂ03.$)V0ONL{&iLmupȊÊħ)<#/lHppp5O\fr%e [_a2rap ѡypka3i$#35a(4o iHi0_gHIIZE $Լ< |lvBtftEfQB֠\(' d'ÑNwQǿ4 sg尊<NEQ]=^=ͨ(ǀ@q$RJ 1~=ry\K9 `>|y1"dꜤNhRѫ&:'ה[K޽$FMjh5/q㨱VT>/Md&⿑/ Eq!m}Mba/eTW&NTةƄ$C/1h0_F s~n%L.Rl~%En2cGV2Oqm6<oQGݫP}Gb>CuBCƃBS#: g<ƕ=4!]{B=_@`N[FN.KuL}.( ȹGuϢ}qR e,{{IRO'Ќn^hleB9^2@Rå.^fӢu*脸غ൘t tTۡOAPf*Tsgk=ԡf<>.(\;$zqYOrA] % $߷RZyx' =~JM-S}oѯ725YyX7>UWS0xwLMd-:$xBs "0D1:b&Ҥ ំTi`9bJ[cIUW˟y*c :c=<2\(Ï_<UI~M3$M`lNʿk5xJdaq.,Z Ć8\}}p78:j5<ȁq&-G!S:*/352L-GfAhli2Nuq -dk9.ԞXn Rҩ򳴜~6,8E6~Sg6h8*~SSjm$WU3sR7UE5٠Hh9v P*F5M)U`.j^ς!&8n8< mb Ӟ Q-r^^FZ3BzHQFrO7V65,xVayюР^j1Y9{7,d/7 ˉQoji~9MehL}3Ӗ9@A9 hADŨ`?7jCuUn[H> )ÙhhcI 7ep?Ҍ4iA@OHK #i~`@3vO'c[9eBZ7<,Id{LXLƌ[ FK$Vg~([vCQ[tT{pb8FV1I!  mOb-i!(1(xi>y-k 3 n辐m by~k}~#7H 1Baa\%Rv:0$e_7Q4f#@>Y)8!ea\7_ gcD*V߈ğv6> Mv LzPخ O+ g[!z1MItTOXn( 0FO=bH!\0sWOݻ~",kYJ# Dt%n 91Ć,FiNALN'."+WIaאYIS[lJK 5z~< ĠG)9P.r'j>%C6'j.WwDaioԑjqއzԺ 5lI}K Me'́4Bв uq\O kH#`YMLh Ĺ噤YhdLiR-mR(; fƵ.F`ԃ7C1g"!EhJty(ЧT {:(! 2$ek3rF|?VfsC,_tt אM<<!YcHqQ~5z;Ew; ]QO X͊Z3q=Dɿj^}1`.W4~ y݃=td S{O2}h) %#ʠXe˹Vk9,Z.m¿zOҤ ,1-XrZiUg@ڞK|^ńw'?t54{YKMU^*~=Cpb$G DuOwfs?A.9I.$ UDg{>(sg$Ld.EI(K]![tRpF Zp~*it2,mZLq~wQO&p"Iw1:8 vFL '_Qtv,M[l!aaɃ]B pN骺ŝ_+\|KH)%f ǯ~`‚!Vd^rx?G;(*Hrd~T9)ug6䱫 ɟxEۿ%gHt%:?X ">sҏ |HK--9@:4Ϲ;r`'H%nBi|iBP"1򊔚ҽ1[*)̗/mV6hfrL6 q2Elf}p,d1Hc`՗r>ER"ċ?LR `2?A ͵;ٙ^b/ %~B|C@ځۛ؅! 16dJn Ld%:R I)ɬ-~4$U;D9֟;WOí}DHRUھ}JIgsYXԑ,s)m9$d;Sx9992.~8u?#S459I ')%q44$'kKd~E愈Y!?AyAUmRll':WsQckP\X,p-ŷ:/8el@߄ Bݏ -}`ZSŁ8s ]Jʿ4!?hSBoU*X'DyjXg!fu| IfX`"fpߢY*MI\ni[ᱷSLѝd?Lq*O7Nܴӱ+S106H3|gn<}qf.5Ф}\9gmMM&ZlD2`ogg,άrqytr`sX#rS֠[ &_rrE-"€XDbq,=G o?OY9X]ĕB̲H90}%s,iŁJ.+,䲀+\12\*J)!ejًS;ݾTi~ƾ~`0PuK1rn!nY>ɁҩDd<xS\ sEe[e,xLx?g :=$?Ny1㈀- 1ku#ϰQnk]Afh#lxGލƷ^I9,$KL~ر&7@t&χm icYO'<>5'D/1N%:`Id9I$5V]tjJ]VuYϱ/m.x~ϗ|ϣ~bbcb,XK|Wʷ&ڹߘ2*۶hKw: }sHy]~7]F;"$y1V*gq6;'yTmFyVU_%6佄(D*$4Wm@X;O^i{J`6&9 U^?sIB{-X1x;?Z ͏??}$jS7/"LYcfUy{h Q[` GTC^CZGs6c=6pC؉B #Wm,b;s_̰zc;\8R3+DZ񯚐 dyC\ dƽzfm=7VOEH61xFHƌ=] >]yMH5u=,vH_'+,Pr3"MB޺]vrd>LΎI|)%ϏlgyIL T]d1"bY76cP|#l' ȁQSI\kb윊=v1ٹuTK+hk8kvr/&9 ԲI5~_T7<91 B!k'n皐 (Ͻ*1֙Z-z1X+2 ?+%;> o+b>U 'A1VMirÙ\ĀL޲+])9*g,9a9{Xn f0N#wK;2{, zc чG (DfuMv@'8)X,bG9?Ʈ uwc;ge!ٔn2՚m&!%kT$H4]KK:FSxEq5ty+M=4܌ͱd\#+}ܐ=|^r0j5(yJPގA<4X`氀 ΝrI&L̦i!+|y\ȇXY rPqr4KdWB+ d@%vbȣ]lm>Ƚʺ蔽Lhv˭}3j}V]J."+Nf}COa $ְH>ʝ[GmH $cY_dbf"O^Y cGf;(< #_$ ++Ȋҡ3h#߆Y!N;#{[!dXLUpϻ{x[zc)Dlh=;zXJx+i"SV2]8<;i(^+1huS0sxfÏپY Ga?cK#F 99[G`, U8&vIٻ3pR.ӋR I[G }d^$vN@[ ' 7jv*; Ef6+%0pw:ClU˸I S0gBV_L;95CآV?J]љEV2-_ާj<'#XaF5J 0q?u!r=bÌx+1d}f+񕻐1@Y-;(? uZ`'QU}!^GF {Ƀ?)߳=JevIiXw( w%i>+ς>A_3|"fGY$#oƁ YJO=i3u `},E{=4gkeW'ТUEbh[вЃO/1O&~Iyq6 5{f,.rZ|[a$A+r  z>_cX6Bc*MDu] qdv7 .+3 Ay_f m; 7~<439Jj6i?VC.21JZq&>('2QsƲ36s? xNF˔&JT~9d}q8&c6LA7#gvظ_Saw73_;˼wics7KQWKx~ *~!0eQ\Vǖ.G?WU. s9~ I;OGT|>\>5:|^NpS`.+]:kVV0#[}OّѬPz?CȺRvS dJi]dP; mȮGy{Q!>AG}7k0S4\Z h̐gxAɕ[ȳӤ949(~ir\珫 Heg|S$9b0ձnǗM,/#9HNT&𔝿ǭ4F}8ך: ҅6>ZcLƴA^~7x`h7WZDlSOs^y_Yv'ɹ\F? _o6s;tsk)T>$fr+?~=$禕 tutQ_0igy:{75U+wVޚ ]@w扩`aVߡ򘝆j'~g^tIޣ~gw8Ir.j,)՜@@{| NHyd>+ζĔ"x0 RP[< ȂNJ)`H*y iZ/nv<ߍP{2TJ.S"in;T[ dAjZahlmnmg*DC|2avm> oJ ]'0%ne ;K,?үZIȬLp+1ċsZ`p: WN(Bc@%KVM*"7Wݱfi:&bʎD)ÎlIDVlL0\ȹʷzBWp;Bj?P^kU~$VlaNLF9ʬdthۡ?m7wA$jB l݋|aYSKW$%`pUP\bĤ4A˖&."!"|27zePq^;'(QoN`;2jhظMUlnvn4ȦͫevϞ8}8cϊ+!hf@ 1_aː;Fh;ɺiir&D"N*J43 L3ohur`~b0 Ў͎C;VvMѴ[ Qތ.~cr՟611Fq rpr? Љ&e\|mD_w+;C$MqۅQc- uc;UY=vEzaqR6,u+K,:x:uƧ,1x76'R&lL&_Z89R~SܯX h96[-`0p>e72RnwKHx`ԴkzX2o)Joem ǵ`بY=nm5ɾP }ET*8p_yR5v L`&Š9M3 eٞ;o %t2ߎKIz͌wi|N>Vwq.8 uǏRDt6 /V^ M~b2El6rӺzb\ٹ_dlٹ+휾y6Z,qqgZ|y>iړ=wk~hI2͏!0 V78P/U%rM՛f_+I(x{ %MNSwΓpq2].a;vw6a`pxrbh2WdqIM }ъhJ8y W74üt'welkg,)PydLr|L@M{{HF0eyp TXliLmx-d1TY*,$eS2k3fgURQ3Z>v{?!J /-;U&}%Q2HXȟx'(a؎*m0A?&TX>E9R%QuVJ3 _w`eL3ah%:` Ps|!zK#X h ]3X+Lї[oF]t{ ~ff!n -ȱ5?"Afz9J` B>$ (%Of;4Ze==F_iťX(9WB[EZOKu 97oJ^(8̱>&Z};r.-Jέ} ;9`zm>Ss־܂w;$lU^I{>}:@C7$TMO:lCgilMʚ["4O|K3?<0Ĕ7^ew\xËUtzbp<=Ruu]f2D]VԷEuV:qeyaeycOjO/Vj5[yT+Bȋ[˟\#+uč꼱H9ϔScʴ7΅(o$]P65O'E7s`ON[#g[?ie.<|R]ALXzCM:~GrXN}kS$Q:>|t|>+}Z ;NSm[$ b Tꚪt 飑7kS Ԉ ]Ӄ^9 }^z?*VNnAFDb&;L$<B^^#ש)(Va>Q^BSg ?>݊u)bjOٍPJPxBGE M+S2US`␀kƤ%)-oeWyN^QU)U,lȤu-0OXj~|C}ۗ>kLtQg?3^ꗋ\ίr9̤\Q&Ggg/Xҷ3?Ys^p+m]دQ݋'Bɏk l6BMFFִxctFr20o4Ն4 |6o}TNhL]®z_o vg˂dna. .OnǓؤd{×JW\hH7h@7GK>9%:YLu2jD=/៰_ѣ.I׷Ǜg-Se:E<QBncc~a0Xp'&/["` GJC0F JdJצ-ڡF}C!v-1K"rT.zR_8#wIՒ[RVi Jb{`:AvnHͯ*DpGc{LWfi.&ljB\Ś2unc'vv頋E|Gzˤ[DR^GyB_Jo<].7Q+uj/LR/vkh~*Mq| 8,̂1U53+8[=zn3_ԨIAՠyM}h(ढjZ-PZ[=M*%x u -uv2O暝rp2l< ]V3M =gBhbekE ZŴVA2S/慚^J+p+C{뽬uvvoP1pC ޿v1U >]Mk[@jK=“i=X/ךdW7Io_$>fpMMHSJ_}%eIfln1ˍ,*}}`wFuRO>FN: Pk\W/aos}k[ϫ@ZfMgko6!^X8va—C-w9F4d]mǻbW8슇/y -X5M~NWoAl&Si|=O@w?s?۹Ӭ Om{Aj}6L:'B 4 /%Î7܉fӦ%?'(yJ= f6[o-Ѫ|,{󎑔ǂoqJ^aa y!ĭC $Q?yX`k5@4#,޷~ꀂ:[Q q PQ1SͶY?QN3~`]V6ybM ӌѫP&x&ХͰ6~fwgwCg6c0l~M/0mBIzYìدteOcg3%wB&HՉtunYVJԆ(0 bg^ϩƛwI؂ez>=s1qҜT_j׳A'Mqѥ`Dint if|"{) צ~ ia64Β1(XE%<$wVq&de4ɮsCwD/'F5ѸaTek<[ K(AH>ߊ6؜imҰ@[i4kj;YvqsqB_UM+qȰa RjܒUr2'6>n~gMLV #C]rsD ChPr+ڶi5InNޏU5Lbtyp|kq5aaf(Asp&7$Q"I[}^ \dyuf%ʳt䬝 E9 S^C1U y8ևnF<4N~| qsx$y'Cr {s-v;77΍Mƃ˜hgٹss ܪܮwc~kbb\fKJRsҞQirv3+sG̨)M! F]<Qa'7]ItXh&k(5rp/.hlT;qf:Խ|渟g9pnY'8ȾVAMz,=0R2ʯ|_:;s={dg~..k"['!_~b}{(\PxQ( ?8=heOl\ϱLEzciRC)W JDu/j(Kcz`('p(nAy0צC#wx؆Gx{ x{{hßa3 ІU lYJMY3x/b>c4͟=M(&V#&ҩÈyr0eCXgW `/rLmuPOmWuGȗߨ #Np\/7=tmqa1mZBh^b5dytenPO?<#.v5 x~P ?<T֭8V;B8؂E$uĻV3ċLg;(z6iS6+B0"|\9|4ԩ_t 4шҌ4 @h%}7_jQجz}(!%;E9LG2&6|ٳ2SgwR}E5jBCg{ n} K7{5u|;\m6ZX[C zO =~2{5բm>ϜcGIӥםOt0bUM<ѿZQ=z`K̫zB=rFC܄ 'vMzg4rG "r[_*X ju癷0}󣪰  s؆5>ܳN;8Y\'#86'bScJ_%b=<`csEPCCoaWpsHwegilc}bCی4.:Pum`]T+csj}m1} (۰y7t[U_SGHK&(; +ـ隿*65אw3̤uQL_wqL6Ư+\mS(9s mVv /MueQcP܂FLg O[(^؅?^g?Ε7~o-45xU7܈'6|-S^׀Ћ#qZ\!m1Vt/GO@uysaϘ&Vm?O;9ɸv ܢ(gK[ xxhil<[xxתDart;+p8ȧ"ėяOaM>ǹtU'u*\}_ Am?X`1vAz@hfTˇ%1t I3c?2%sɭ=*H1ޚ羴T`qĝ@PRvqt*nn=}M|˥n+e6ǁk9p^62>J@Q@ms^qĹ=7=1ZbnLaq;C;Ń?OY:v ĵg5g:m< u}4ou~qQV͖jP&ᅹV")Mӡ6Aޤ {s6M}M_ Z~Yr/yM}\/;GKz "y[*<"8@[ѵGm'ےmTc[&mlV;Ÿ\`:K,8xz1@lm;QCvmɗfqw|:Rhmu4Ѹ 챭6ԽxwU{\ EI|ƶyq1>XgF>)

    (Q;0/~Txmk[b}L-w4:k)>Ó{8w=͏w{c17Kz?+x7 ~1p9OAs@[SBJo~>y=O CxO1W0{@w-XKE=".h=xm@sͽPO`^k6vüW(yGx^*QϹ\9W;ZݲlL\rl OšȱgeAV͔݊XUG}Bm€㼓>:g#qJkz) g-!O1!6֏Jykbٙ 9؄I޽{;8i? ESN4oאhM&1ILb$&1ILb$&1Vqxo.>~j_] ooTQ7X.""c&cʸ ILN.n=) XX JgJM}3-tɀ̀\>@)\G|FLK_>/_`Ǐg>0w'a?B3 A&ٽp's'`@N~@7]$@`,5pp? 5|ޙTآ>ĺ.L y.~mXl6l׎kЁ g*9oھfծOs+ZM GOwybA-6s%>C+V̯Vsߟ;k.<{i+ޘqKֵIWJ3صݍ >qG7~15%ofo޵Idf'N:1J\!uА~{xǢCZr|vM}?=ӪdhGŸX}Ѻ˫O.6]JwTdI*gqThy ixB2Eo yܒTxXWUbOR"KHP7VHTL,miI(kKnSn{\ű2oTf.'7.&q>-I&I^ Ҡt#%E#,A/5'a>_RՂ;ֳ2ߪkHVhh=ǯm(B)o.8\9e4.WKlzj k7~ ӂ>QcqQƷ~IdD=^|~Xh& 5T&%yZ"^JXݛ:gЃ49 6>?ku2uf CSPYyͬxY#Pktw^XK)NXTyj͸gdiBc,>`O^8 mIyǖ{g}wows Nt+l{]fr-+im08; 28@}qz,~q]-q~535vۓ1@7*Ym{pNbylϊM=C}eeB΍z][|N:92yX.WJP7펯*};|zt0WU9JWM׻.pߛ5$&1I6rNlxkPY|<<] ϒM7l7~?>_W[z ]INy/54D1ib&Ig"h&YLc\+931!4@$Bwe&`20$FHH"P$B(M@rHD %Ih2Jw,Q01aB,JFl4/\4G B-FKRP:Z2r)p&fNln']oIWvn$;Iwv"=v}ePl.DlS!l9{ caJdl!Q2rh`MdKT I) D$Þ!dٳd29~Oaϑ)yKBc/ًZX u_fKKd*'Mer5Ff2 m'נoɵhm$ףd6Dn@6whKB=(ڇ:Qh y#T!*"%Q1y#KЏf'qRTbv0;NN娔~"/ Y6; DߓW9:O^GedF?E*nB;nCl]""{fHgf Ȭ%'1H'f=l%1̯HnO,> 0ڏSU  97i~Os;rJHss}ˤ;'t& V@@ڊ(M>hŜ',M( }Eb!UJ xg]Χ֧!ES*+AG{UVzb2A/Ћzq\iݫ.V!SNֳ Uq;x_m"`.aP6M v 1KqGy0p4jޮ+"-۪[V뮑XKK&^8sZVӋGہTNmTLMՙ0# D?Q7l:o ۂHmT&翭f.3Ӧ3쬔UAW3#?6}X7}t~%V˜w޵]ǿ~Ɯ&UQ>) _=XJw)m VtkC?Wvp_.?Sa$,烊CDZ=VЃSߙq?߷zR~vk#!2y3\,3rnՆ5[ӎM!OsuaSF,P}ٿٻ8,M6AYT4lc}5Ut7]|4$mYFlZ; NaV։hfda\gNTcN5g :3Ye<Qc{ G;ׯ}w}wmR ٯOԗ ./:xF緵,Z6~o-5e޹ݿq~(/W fEiB͢Zx8w5xyўϽ_?䙅?ܡ\޵h?S|9ۜeO~4k]eK ˎoq>߽njHO>㹽[i D4խcc{Lz|"W1uPwMS jjpk5`H5}ܚLjSӣS7Tէ- y % 9Sk+ ~(IIuClgkٴґR7Vv]0"Q*ϒ Џ_xdCnZ;N ٔZ+bViL4tXaDZcZ5= Oԇ7V:c$m)7|.!_[ & F#|4-LH]ZN/du#rY3z:OhI\>12L[r3Շ<Ν>h~iL+}cc!줶qBAd-DF>"L_d,5$_?%%sԊ:-1@[q\cCٜ$nɒΛl=, 3 RBJ^LMV|3 )T%Nt&_kKq:=K%ӥKH*Zk4SAqYq+lVWkCA<2Z}}h1<䝴ƭy%u伡q챻Ika<,f~ӼzUU'dP m՞@v!\V"fh*mn $*D&=aSSrڴd_H^3-bp,~tP lB34ՓZ]0e9#Q,B${(uӼ޴2k.#WҟjUI~ytU~up=69rU*f$Ɏ$ xYiffwՐ>!욭IVϸ~}%k]OǸ>I'͈R/AS >52QQ[§:Ri-t{W3-z:`$kxd|,ei kwN< -56B IR# N $^<b!B28 IE2>_amhTOqJ>8j;+%)ի#6_x݄Z%bVfL:ߝhx\Z|ϐ2\]7g;S%|&դ% WdYr|~|zŒ>4x?hj%m53Rw$DϐYH@K8bi%aC6pÝhWRHhDY7 o Z@ Dh>ʨfA*1ԡu[YTW|ϵ>VHmV`dm#Ai(ncW:Uko'g~9o=I"mޤQvVX+*0h"̈́}]+PRg%Q;-7 ӿVx_UpNc0[ɸC^ ov}s1N&К 'ol Ȃi@f1] f+ˤM}bl,Ɩ[]9`]rlePΐər-/sdNdEv[.=rȵu_nu9,G F]7ɝfK"w=CV}>b'#ݑ(p^GCw]-nV6nGcc1uXELg3ۙt;tq:ugpv:{۝9v*:O%CLK!0wFQn dy+/__fV~>GQ~?+F^ b&HE"vfۀll<$$,T2EJd+˕S$EQJRxJ%8Ӷ/Lm!%f^7vp<W8oGvm|VNOP\C\ VU潜׼7ab/H\HŮ.!WZ61u[%}f7XEo"nw =PV^Z/TttIEhtr\l˲6]>4>=Z5zVkZ ~qhoL3\=h#),;Ku‡Y>]s׋X/tJCb mT۬gcxzv\{=`_'yXDDPS~ ŝ}zqC6A[Q~V/4~܈xE k:`Yl.NJLƘJYN&sg]?#QbNϷv=bc|JFͣ:BA-i1OJZEkhit@+.8LP3eY+\jdb5ne)l+: EbX(PA@?NeSZnQh= Rƀ}@8rf&ecq:)lLIu:ecoA.פDư6nn_EY=L\}+~uE h3x&~qԑN')!3gw% !vƮi|?—Gy-LR?+vq](2Sfq ~ \kKkV 瓥d% PA2BX+:H  *cOm3*Kp;|1tO񯸔ANn0eC_)$sMYCKݽ \N?|7hPLeʚ!$ !!CJBJ!D!TBC Ɩ`w[ZWfD# ~]kXs[r:.X{ѣ*R1T W ѱ:GS7 >4A=Wʆu`v;Xx!,.\q'GbxxE!uS&/ŊY+BIĨj[h5˕OAi+x1(5n .Ȯ/x1j1W[ WAj:;"#t,$[|^l@SEUSBPw%ytZz]P6hg94 z BAYGuܛbPEX(kS wP޸/h +Z<эD%fˈ~,7zpF070Kd5‚a?R} h;hZGD 'zOHc1PPMRTٙ@Rutz$= |"}.oџpb37ae~w)k6\m:mY`l{ ;[eq٠uA*qTӁS;kDs1Ih&[Ƞ/H.ش!Dv )!|Ly6YMRz" #3`I*, c`M\fBV<|R%kU߶uncU%z#wkZk?˛vR$1yszLդڪf@/.8\F"*22x5bMX$l w+_LJj<~ 2n 4}"A @|+%M2[z DѬڪƣQC~7FG!& ;R{;^L/OotՅ=z kw&&< J$ʡ{ 戶fr=:P9N= Ƙs oPbY @"3\Aą@d@MwEe?y<_. [?. Qㄉa0rtHX*'(qdfoekkJDZ3˕p@8fv-.5W~D0cp?X vCnFoht47hOvAHȏ^][Ry"  O g-% bPh&ZAvdǀۀƸHX_ÖeJ[r*wZ9՟"^H/{UrƼ@0-L# EY"''r^n !X)5 b kB+l9G1xO|#%$T5JvQ!T:N}fN}L)RkCl2N+堫zg/NX&T#-pAvx-tㅁs,aXs!;Maױ?İM[kwk)Bp0Iݠ7SҚ'eҏC t28xtʒj

    ӇI=^negSVl|?OW>V$_]5:}Av u)pvWf\GDMRأFit^*rGX*^ȑKAԑQ{jJ p1ظ|:{3}) X<_oFD &z~M9pJPuȦ$NHrG#/%R<5k8 UA⠵i/a8z>c>=_Ռ6Na!j@+/'eMFyv,z8 w.jB;BƇWHA7{S3*n/~z`WsDt\ G8$2TFlr 0YBޠ'3#` 90ȅKe/K(P (xtwGgJ@i m1iZ*NԨOUr0| X&ry|D!ÀQ+Oi`N9lds ԧ̩T7?d8J͖l3ޛ?zJKZdF=>Se6bq|@v}oOn~:C>rpMQK¥$? =g#vC.ұuoW@ X h9:x$`vZ2e ""Xb BmQL]V%ȧB˰( V zjYs`< {Oz*t;1ݙ~+>M$ BBnk^r!T0Dǂ{=]D$R]NUMt1xfWuYgۀWJ ,-`-S #8 /-&~L`~3 'u֠D*SFc,'u AnDK"H!!ۓSBcP9MmNRt$p=C2~3ۘ+[{}~atpt7[]0?h%`I]*G*g.c-ݦ.@3ja"^y}MuPl)i sL=B`=l9gϳQ|2EgGX9DM9WL3RۥC

    B$ti냵Y kB&{ȯj bpAp_hP9X=E|! 5?DǒUxhD=Uo@T2ekZ Aa:90^[Op#Q[ЏOז-䆠 5Z5k!IN,$*BkT=`\o#tRuy!n3<\ZȀ~GSDϘj4/̛ fB}unYp|a0UHd!M *'g?5ĔQ:J$Ybr{_׈JQk=h3 !jL$B?Wf`j]JW#rD_4]N/]eF@T+5Q7VbT/DQowh9J-J=BlIV} +WYLƸZyw u%^E,#UJ>`N 6I.t7f8g-yCݾ Vn;8`ܱE+6J=]p#v~U_Dm@EEֽM L<ӯi\S4g- ӿTـ?OP=~;8+5t'IOma?1d?<lB>;= u?q,he/=S`/c+Z= ҕJ(ў]L?ex ˱2qCHn"n'BrÛމ ّۨ(!@]K BBIesi) j 8]'iƈP5.`Gxo|D P uf= "J$nEVr'y|L>' )0IP:H3zسŰǁ_~w3"{}@~"8u6WǍ O4^,2G"r F,o UJUŭq?pHҎjJQ(3"ry&]衶h _拊\n`|?rDvŬa_vB3PP/(a0KX ,rkNl)Y`X1UU1h$cw^+K' R`QsWg/4Хh'l16#둶$9%m(sTzC3٫+0(f f2(kXo8caty+1ߔg hs=ՍM.X5ID թ0+ePAr8`zyhujm5WsD"<ȕېBDO !uH #|2\N'FsD_`՚Q՚;TsPl88;XWPYVpZ јp j@:qekb!DCz/ZQPĮb\+@f|{} S)=ɁƐQrK">jNRkPw{\N#JքkÝrwX7a0Oh Zq6hCE oI#&K[C7%^L]v4YyM}8 ~Bl(LoGz|[Su/[X0Og|]}|,/WOMSfW-ْcT) ౴iڕDq15` *1nLg@PffIXv!zsSl~+{>0X l։z@)  4+ڋ1E,  opE"P=ݚDkj&U(N{@c=C#>H_dT`+#b5](lKq—I*6x~_yuDžㄖavkT+Yj:G%: GкR,0 H[fZE ^Ĕ@lccGsR9 8A ӅB_(A0] !OMpZK/y=w%|e_ &K~Po zh6}Zam^7 V>l !H':`!DG$Kt"% k'maXODw~.3m 3"Pg=`zL}Ɖqg0L, ,sTt3l|(4h ( =CK:b04u! f`sLYxR"4Ҋ#Iq'hKF]a1'ٔ,vfﰕ, zc7LJO8 ʄ7Bh#كclXKCQXit p[Yh97y(Dq8NB':%ِlB"਺~rNN$逞 ڣP>`m9eK;SHn}>G>OR4cϴaRfr+cZ 6Ӻ vIUzv e(~ \=N'X ԮᠨQ"ԝɹ-5IS4j5ΧOҳ/wKuM}T~=?]8*R1_҆l T lxz;(ba {DX_ɓmAIFfoI:c[] C ;glȀfjX 4oCꅎC[cX1E󉍄qP!BOdjb.[mEG8N\$~7\+JR@ Ux],An:_ǃ"b (`?{f|~"/M4G Թl-d>\D`}afx/҉Hݧۜ?K [P'*GF#)G:ۢ _LhHp9dk*#SlSgϳWXO;\M>TM:xz,'ra; A=Xe@6D V4LmA;Kzpbvd+X{Xuߟ;K j^Oщ;?XI CU[bi" zg1 ƈy yysdcPJ_%wڿwD} _M:@" Qo?fJ_P>zW-*2`{}l0;/Bi:c"eT$`)>E8}?h˰5<[HG-J} /_x(1\L%m؁\R q]YtGH: hl׷hjJ0T dz=_d)}klvNxAFlbqdxR Gr#u7# g3Fj\ G΃(u[':nGϠOP- 2Xqx  +ˁ85 X!aDNK$T ;SJ'ɩ2#u~ kG+:}hG(~$\)( "8  nZ9|d \K#O7IW*JvS'oo4-]AsÖ^o!Tp%[^\)Ç递 BV0ׂ.i[:-ݑʜC''Ehn~Cj܆WG֘yx,v6 gAe"ۨ3gSWȟ8_D+U$"x"K| do'~4TKP{U!`fd+LN *ӳ=+چ0y$b9p-Ay56l?Wy;D\X-pZ NJk}s@jgky/W%F@d!0ZDGE˨#&b! -D%fs|]Ԩޢ.;M<]'ﰯ*֘s8's nRzn7w;]rwgN[-^|0?"g _`oJr_5PW BK@ӗ[)SaB-[iVd_8,WJ jT ςh,6LlF]bo1P .NTK灺_&s=A"xM (j񳨭Χ_G!E2d;)UQB#_+ph4MA׀{ ]S$` VcMp'< i2EM&'@ݥ! ȓ5/d%]ʘh S٣S9p70zI+Ƒd`bx !V-ܚh$Fm;ȒAz EbJh9EΔX%t7EmGo16?Ǜ*(3J);RWE#D;+ 4!i,@:ܕ@dMƐ Ƴa#dYL 導52(eՙB.' J+X4JK假/RAWІmnǙF\Uo@ѡjE4NHU}zE] \ptB]|`vAgaƕd|& U{,iʤ3L.abs)a4!k* 9(Wu4 bC6ah:h\6='P~pg9p)OΗ "hnMcesE\1w|L9`U y3ކwR:'A|(O?僄 u}ۄBhqlj`q y'XӕKRt^$]@z&u5 Xv.t &p$|9 rb.'r Y #7R1Vkm1 냵'#!*jvi}T&X͙@f#Aec-\w{΍u UHIQ{ƪF+h)M$Bs_ +Mx 2(T )IJJ8XyA"-Q=c!dl.hfV|zNHVlv.`'K^z$?}v']|upa,o?ub0(m{5wIHT#DԮ% CŠ)OJhy`1}oS y 5܃N!r.Bō]H>IƪD$ F}+_"6H{%K$XMާUoaېH! 9FK>NnqoXsMv*+I V(xTG1V=uqK7%wNej|Zk Qx@?,eV1uJcCl*F!cOs%p$oE}cuNLӟzLgƇɂ-.J P+7ϼ@XF;t kRvh [ @ejPM$ctHszD=ߟEq8C!*[Pm;PʴCL~+0Q'Na$J%kyz>/o~5HK1Tba jCW W4Bg{evH pH42>ByRڵ pbщDn#A:y|E.W#DE!}4= Ze6cxg8ZnODtcP9A5M{ X*c0_YvrCMfS aO6PU~_ȗ:b$'ťJ.| 1XG"Wt'*ȭSt|~26 PIsDksl6`u߉ U&a>%+2}1 V,>_ҒtJ bb:=p2o{/&oȏ!CTЦ`^R`ٍsLu?Gk3*(;WCe* X@ WŅpdnh*`-~(wsUFl@)>D94F5.is@AnB/Pef [-$J&ҩT zC= 1E!mvH{!K%U&1=8_&HטY?;|ۯj܏S9WG.OA>ŸU{<l?gs"_@yʽ~ sځgqᷨĸ,va|3x4hJOi1ٖηY!9# !N2< ;[^Ni(]PZl z9(ƶ?(uy_i j23<#@<s):7t,Pw@_|rwSr~AezO|R*Yz5Fg@2ߟv/T%1ɐgi?'yQx OA~-zkgwno~[K #*]ޠRR|?z߭Fh:Y n0OX(, +if,؉1bY4X~zSS7"[ݸ9QN-OQfSz{>ɝF5꼇Y4'ȆW @ndٗ@ ȱ42\@.&/2ہ})v * h%ofVPOn.ȇd "j)BR먍j;GRI^TQQ:t=ڒnB7oWӶ2JV00Au.$u#Ao!+6 Ú E=BDwqb7 4 \9лRcxw;}MalU' G.6E:Fdn0O,v:v{Ucq<o5) r3O S Vē+ 6L6Dh%dV(=r& EM#zK\h=>߫>'BKqd#HUIT&' r|R 2,5/2 E:rG.\(By-bj;\A"v5<WFHb*(ĹYfX@˩ P'Df٪> ttwLZG(}&8OŞszj ?]q*%+Q`?)Dc!j=2/Ld46aj31]y;hm>Q#Du~8 |n5Ws:y]TX՚!ޠ8G QT9EG k^ A}s!b esßE7?x)SfĘj As)wR}Q9k3O|VR[؇] } bC!NfSa'd尹*>Îހ=UٗMl 쮫]LAZc, sgՀ Adljj~gxV) v͆'n䉇 gVb2W gczO/5U—TeVw6PV_ ht?2 : TH1eYYXA7NB`/`uu!K!j8$@Biv '+A}ֳ=ge'[9ZZ bצ7nGkkK ~ybIԎ nΣV6hogѽZ8H $N'6]G[K[R{myU7y:?OLKNazF:t-{ҸOcGA͐ʛ= A;ƖVF >,ʡcxdDxkG:_Now6x[X hK؆'ܞ!Ey?+;͈kzSeq%!cw7q|0EK/D}[ֵkbxY5ᮃ={ª_ZaŦkjd̮Z5bn5wь~9~m=S7ʧ{ ^z520n~J~=&?VD:0'[6mOvEffjF9 v-$wCk J4 j좺*TUT/P%kPG+6+Z)ew'&_{EI#VbB.ͫܪѤEg6p̺mu`pVm+-9i5ٴJA>{ε\Z_?wɀYfLGrӵscͮFjn}Х"4ׂ&y]apK.n>zCTNwo;n\9e_kO4sc]<ށ=9&_Dz8HߚK 9{zPgwe+r1sSI3Y>[awRo;Os 5uXS?_]+;_fYp|Qoh ?f H?zZZt_/uvtu!g#Fߝz`i+GR\n9oك > h4KuM5~9qAR߲eYo-uA}ݣ#fY~<>VyhvB뽲¯٬Yq>L6|SqrbFE.k=6lmM k5hw>3ICzg8ٺwWiwro?ֶ+qؘY,^x)6fu.\q]GFC䷓t=XwyqrӤK,lwx+f]SFgMVG3-j/#YgZF:_\78j=]EO"i=w.םw^HuW.7x6˟ږ6&ֲ6| chOKW&LaL5A<qƧf[CRZL-spYK-;*mu*2i: 4v˷VZOzf Gf{Wy4V>أBg},}Wܝ+?Ӛs0r~K^Ëx>}˒ F^9$R,g[7oe+\7xoz(eylv'z}>8PN ?4>CN@6&E#o-K/'6ȟf6_k衁ׯ{Vwaڵas=zHz_mRfɃ[\ՊПh;h$Tۃ;z=<cY`"Lۯsvv^[$ǘ5VȰr7Ek:w|jsmb[l>o6[ ~()JǂUqG)͘{L冂_aw~-QCXh]WxO!tpI]eW7̱ߴ=m8&b7g~z.k k2hDѓ17\@[}{n2n|lFve=/hX[K t忮^MR5AM- S+E C]@['֍B^Rxڄmaۤl$bRncw{r!1DqZL?;jWc#;;Xv܂7^ O GO5rЦ3>+.-\mx^]8dc^^^fԤNoaD7b0|9 'dNyo~qϓ/d9f]VƤF ?y k꿯٦]uwpK@C%?qɜuC?f٢Wm^70YgJQm¥HҾ_F;>`0bMkECq-!qڍ~}4N2TnPx% 6F -̟?C)E2E(!ʟiu#i[*M7ZbO0L/;V#ܺ6dϷfȑvjuly rwryp)cm7efrgҖg._i~W Z]jNJb vn-Lp wX{$w9߽?ZڣCzi#qfS^ }5r~A+_mX3|cEg 'Fnle]ԦC->?[hR_bY1%.k.} ۜc{E>Ur2ȧB{lB̓fql"5NiS0hP]m2$#~#OpɹAb߇YhLj1\Rquİ_I'}"s5~@&pJ-1팴&!Y[JG/tzۗ\1@n{v|_w;y},lB'(^/ɳcxW:ϝzc .r>2i+vsj!Ø$)fuΚow\S+3Gzݬ}yUaⳊjrґb3=U/Ǣ5 r!^Ł{~l,癇^qW")W SWty=h{7?6:I{kak1_|!y;;|zfmhp},-еpUl^wc23_9P/Y]][>[LNG5ohIIiJ$}=}]jdds[ח\ɞ+GۗWuA=9S7}i#?uOg0@|GݤK*nc-!H-Wb3BJ}"8i#xk+ 9cYc7l3F֭QQngluQhjuIsl~n{U>vynI!s'5}Mg/iܶpMmM6~}y3AzφM(zht]83~Khٰ*.0úLHΘ2zCz..ytϠI뻴zZpO3kҭsܾ.ozq̛SvN覴#q@%'I_˻t;/a_ZOŎdBvL i6lU,HL1 眜lWK5nqӰMF>pzP.;zI=#7ש(ܿf"y̓AX:J/lFgͺOTv0rȧK :8X>g.x٭ qҗn|7wã)S^]{K6NdA;_X0BEmݏ>>+;Z~LMC@[AVJ[ ^9}tֈ^y=2ld_P?ӯ4َF:ShIү怉ҽfwo%!o!k!Y2 a* z"/dsG!kwЍMAb?E4"8m-kqkHqpe#‚#' <6Bcv| GX= ^D=T6k]}W^zQÛ2Yn`Ȓn˧]dtt RMadI̯r3|ǦuU#n)hJO04>iξn.z֫q6gqQ$V_c71},䴻=Y IQ3Tmݹyf6陮z1eYzk.C/uy#:/>DbNVݾ9%[]Ѥp&Ê._ k|ɭy*Gd;cGSͽÈԝ}熎 ߸/UOVkg)N6Ȯn,8jZp@ P)KoUTZgtzp~}JC:Է*eي&ŚV'vZ/whOv=5ɣY̻55y<|1>sz$ov5 d_<o^XZ:>lbduo1}fDct0!>5hFª>c{xv:vzՄ1LZ{PX=Y֙{:YU4q*f. T_ Mu.7Vx n56pId忭{~!3[tڝyn]%5x}[ YU޷Y"ۏ<{V&rU#C&x4z\ߑ#n%O=bbP%]Ѵz3XWq՛n9ϡoxp~Yzlk{]Vu|Ӎ;\<tyV%o{|#%,ϵ<:oeVeYG,\^-4βKCx bA qZɏ4M8%XG/ u~Pب,9wvaǃ{;Ti(,`Y]"PU?+v1Ǒ8Hn(iZ"IE/ %2r-gjwuڳgMvu'^~LyqƈQQfWkf}z55ԫM' kӿImҡ2 F #}w %w4-1vwiεqHq:)~#|A , sel,>*xA;..^r%cO~s4sNv͇[D:2w_&6+94ϭkziY>Mח1Wّ]91ZqGCa ]N ;=ӊC״x!(>mzĹ[|x:bބsV l-dj^Qo̊89On\bR=5ۙz ޵;=N]dM޼pEAZӗ^x!~p𠕷>{{aŰo#ϸ{ٗ zcXaںLiG&Eo gFrggZcMmfޞUM=-|_]0}H&}&dݬ?\ϮQcẻLYkT: *a\_CohJYKC=k=9=xTMg7_<{#nwyYZ1mN {>bݑNr|n9t{΍n/6W3\>ynżN9ngw!wK'z=qђ{ȑ/tT`@g2/蹼Kzc餽[˃݋JbSA:WzSϤEgQgQBysт-9\z@yU=z7␶FeY̤7er#g&v]θyrGa/vaAlTug1?= 7 'zUyQSV%6ڟ0y7M`9iN2e3|E[-W7nKQW ,;rU TS߲}l /痿,"Ϡtx vO EF'=OXwc~ZCnTIvOv?E*s?Wiz> z7to.?M(/h{LuOD)ڶS goyZ+ҡp 5,2]3$_ksod=f૽>5}px7~rW4M4۲sؚ](9ueV5ah"iimy}oy5:A\a=|K_WT5[eܔF6}rѷ+[{\l$kW0}&w2t& qUs(/'PV#CKXGw8PQѬ (vģHQģ4Ar¡(1J(["F"(PQDĆIovoe@bw13o޼6}]vI.bcvBkX^SPuO;$I;V I}G(bf7b?{8@)OThXUd.Q+T\J>UHCA ՞bXIHiD2.$^Svu7pƊIN}ºDz#l[oAL?Ҵ띬iC^FmPMx}Lʕ?>pdnmF >:/ymBfi/kkxao|{8)K=MZ|i#;\Mou=hZ[ƛe8oiku{YFOîMv'd<.gEžjѧ?r%ˢgt5fni}bbq d:ֳK˅޵{T0N2|̝1W&Y݀w^y I0e/ݹ۾h9_r'O 3Smݴ+=|'YZwZ"IA 2H;*I+Ir IKN$iٳA2kڸ)_tV A[fv}j mٖc ]O<*U)u;{}po:oqXpEO" fgʣvN٢.l{㺣&,jg^v Xmn8d83JQĉNNsY9kOko~>d̛ZV}ţxKG ޲kpo?0͌ O^LO|*h[⢜0([E#߲ٝb y4DzZ`C2.i)OҖ3Qnx 0Z(|cJBx82\TrqBRP]}q*ܼCvBGR629]c2*)]NyLnIgtG1w2".5.yF۳ضJ:!i+uB)?)0.JuA3)",E<1|XkZUg޷`0ȤUuᬋ*t7W˓s۶nyÈ*sY:?"^û"[h`Eh=tp8)1ӥe43OHL:-0FȌ'PD #+!Fp$?}z\%݆Y>PD=~صU9WïWsJ#/L*(D!J@q9  l@ Dp,>qpPnHҜЋ9r8DZp4,9J_h5P\ϒUp,Oe.3omK6w(ص[QXP |9tWrϕ~S6[[~xUsHOumo7~k BL=.ӔIt遬6ȺיQ4vwq飏B:Kk0nIӔ̫7w볚Di o:͙X#I ;$. rmYş#@}X >߷2w`%38VWzE4;ñ> oQ]h V?Pv2?1!gr6+)@5V[2oDA(il#rtET7(ҍxZ7V 5x Z?IM/濴zu|EFqh{~hsr6rxrc)C,ȳ7-7^Un[kWm[7|u|}\OvˍzK[_>?po/o6%;Yˇ/T ->sA 9K"4sC,RJG*e: j\8?!ů?EAGſf,ůc8~a,gOן鳬aE-UUbGy-hX;. )rg?n߭~Css돦NeOM͵7gӌ//svS+ԯ qܑo{B׌yp~iۭv /MUǃY; uvds]_w?%f lv}reobiiߜթGHvwEDǕwl3OUF,Z:"kW 1H|}mVRCK-_2xiᎰ9g-8>됶ٳ/ѵ핍;GƤM ƚ>k|.֛~ZyCV =??ʙY~{,TNiWx}COpcq?0I[V<._>szϽ"%7٬ *?zbu='P<ݓgۢږa_>:h򮶏/ts=dt~~#^c;;gg-S.zVnkΤvw/Zͳ[RZ;k:wqpeģy. 쫂6pP;?oi3# 2Mn{Lu:ufCmTw^HEЍiVcϜ;aw Sc2LOI˸iSIgmEzUgQ-3|ϣ~gnFӨ?fl1:#/y7Vs$yo6=M_hMAg6[Jcسʾ [؃S[P{"-3%@n$񭕻sMlX gJMI,}K=`>)119ŀ3#30KOz05PPuk2migu7W(%iiUXL|v`=bh *~+C|Wm?YO_Gpa6yUn\=i)*F-c-x6m>vjȝZNvg|vKBSJy"%)cJR+->g {ץd΂OX0FzZ*/#w-56|e0t `e0^<)-$>>̌e< jha`y#E(h("DŽV>,KgVGAF ݰVhq_ * ZfɷmT/^K7E_ s\x+Zk:*עi|,,&hmXk.7SsI3-S`?,Lece[ LDV=]<klf8Rʁ"?M6|x+?G!Z: 2m7dø!|'Y%kՐV mk 7UMmdf-}t#Q,!ZtW,)VL&$l!&;Z0$@zh3d sb;ЦoطBѳnV  Ę X38v8Au_VXfʱ1&|Nór6KDeilÄ@@r>7S^&R2w˧)kX:О>?x.Fi18 =FΉy䔈ocsʢ\}TDU;ힵMhf?TveBao J[e|YGzxAOH X5;ڇYl~_JYϛXՁ_qhyծrmƇQ0Ǹ:f?յpn *ΐ-̡|J~tA^.3NtlLՒW2&QzT<&h",xq+On]bVZ 2 Y OFI4ueW>ߝo7E,o0(~׿9G)w?N9@~8F^{1s/za 7 O'tiw5:ǐfy  GwY5Pnllp8c}<WVx} _'Ʒdz2aΌ&b0=υP!/a("?6`ǏܜP;dP0Q`A pX6w=kk4_6KϧXߙ1 ˝.jT||9E7_2]cwO"|RN]>&ۇ9M!.aݐ2yHx7_bʜ aZ|56"x83 #gsEC St022w?qTǣ4 |-OY. Rbڮ&& d^gZݴ$,X`a=nH,Ӛ$؉ ipklc^x Y` ^X*X TEպ*jʊD;3g޹gfjKh{{w=oW/ʸ1s*wqneˈA҇kFtm:G€!rTd2ouqCrޮH&&F&NV;{) Y#}f+F/etՃ\N?'RFoOu>Ve=GM!MQ=w/Q.ss?,^QXŕ„ivü|_]K*ǖ)3)4С_NLY1~ђ|]\u)J8CrLdDz ϬgY[~u0ZJ]P'$>L™yx=~'u@[B„a{8 *yk&i>-Pv_x֝/{agm| JwGQo"}3繽`ٮkv-㒥Aܫ>g19 /S9c:kDmֿ0FWΨs9p;B=cUVLB5MXgwpj_:d8yb|,p87T=a ݹ&Uh[Syz{,V__9f1KjqT*S[uz`o;G}Hx}3L80 \ǴWڷUg R8k:볭(41:v8idخ]>dz1x!t 0ecȫbj+>s="tK;lg@1 -K_+cul~#fsa<:pPYG_1jyC☯LcgLj1=1f=P}HV'|m\LnOg3zis%A?ytEg!8SeojelSmv?1v-73oμ+^x8Qx&&`?ьl &(ǵj;m&_-mݤCNH>ye: u^qv~{?9zk\?W &vyyʁH&}1yq6l }Iփ>;Yx'$?uDՙ2L>ǭ%_Q;ϑ?'?7y])Bo>5eRw.$nkoHנqw'uǨ89u2sB_W ;`N_dždj$Wi,u6H]<3_/uu\RJX e6컥×,rOhLl]?Ns҄)e3wvl%GLi}4CЀK8Ƙ$^mjY^!+t a'2gy%*mӧK~^&#&KV{UML*㢡Ӿ,V;/;Wq?ƅ{O@c7e.PI_t^QE!?t86̩O!?b>M+%Ϊv0} 操9rBp~P!ίF];RcLĜ 2 O:d'#L 5l!oH_n%XLUb ^'][Pr71q? jNYc]kRq8yͷE/~pvW밋x>Us1d)],?5w?jycbU&,A?WMȏڅr5@MZ鳑~o1P^M{m}7^6vm9zn7ݦk&_LAI[dG<~Tg=>EkN R2r MTs蹻A :tէqr ؓĹ9oTw@L^.|^+u//Gfs % %7ј_´4i]J/63Nw>*~Ep)ST_C!Hz3?Y~K|3m֫zD.ԇ<u5CYge30 )J6?8]F|q)ٮEci3ӊ9hBrM#;e9;6:CG!H4g)yb1_&ƶ{,; N(:J;ozlH4Kc xZv2rb}p{syՍh C,pG{`K'觳ܕF`r(6 69QKġ4o$̐3>Wk#Z͓\EcW_ >GK۠3K|7#S?wg8ż)ƊW"  Rb]}9>ô/T)>U-W#=g;t{}8ib$_߹ȦbhoS6y:ǪSF"[31Ʋ4O /\.cw?'aͶaܒ(1R#SѺW[+h?atEh=v"k;`Tyts[V| Oa1Г7V&0> b<Ѳt:5b|I[ml`Gm]tV{1vbF2\ @*t|ɼl;Ge}ҷwؽr>@> usdcy3 bβ ?[|6XNބ3xoҖf|62 /;ڑ:u{L1 3: eVomL6>gqw>O@;A~>f履phnFzr]\w79 _\ϵ>q~ǫ}mnGb]26 T0ó1qm"?&Egwdn %CCo/rډ ~phval[ m^3֣kCvۍ9cH:"lxϜ8y;7fҷ܈~Bw~kg.~gaDnɘŞ\w#XGpwĞ{{G]Ϗq͌ T@{Ag@!Эf1ЛvPff1G ~ztM33I lC Qwy:P#z[Ǡ.PbMUmth̬ TA/N53gA#_Z@78̌hhty @503k@z@ẅ́l@/>AfP +7 Z2MkuYDSIk^ vGkhJnn^,6ǐ:J-jm[ DI87W3/01*#wI<Lzkؔ#aȺl~ij4{rgi~u' X%.0 煋Y/U⌺.fϥӛNgP\V_G^\OK}sqeaSW2U{i377]m~ъfKVF̽7']<. M:̶V!%5hC4 BSzvD駨Oym|:.8778/[p|rwom|p\ؽC񢀣9zI1}$X8G r/q5멣H,S*Az[D_bS,QVnpl5 cʐx`7) E"$Y:MNé:ڤe_% ;+vHHV( m%EW}$mf Lq_*>:!Y~B^BH]KUC-Шk7 535֓RkI +tKF{RzA)ZOy);G1'I);KTeu>rR*2&?ͼE:^쾜}||y }s^ϖ {-ꍵki# lq#C/pxfP?KjmnoLt 0̹R9cPo\hodhNT {D%ZԚ- ~VOkԪU? *V=Y꜡Zte#5M("kit"y!J+* =]>@ޙUOa}@﯏I8"gh{(l/5?(ǹQ71 ;ɱpiFpv[gMoCߝ(h<~1ug[oj'NH/QpZZFW ݰJ2%M '1AGKihd&L?fBU[Ů[M\V" ^w褴dYLSڨu_̨hw93\Cpv*nqGx#8/\I0';Nη 8X-m"\c0 d9>_Kڸ ƾ:bNcUA㥲8S=Czb Wzl?]N]NVdxf +HDDթ;ɳ:q%O O#p첽Ba]9XyƁSA2bYx%YQ!; 9e!_Udb"}syiB٣d?Onr&?ܒ[J_L(?-Ow:ͼ\}[v-ŀtnIF #Iܒ,crI;Kg{VZMئٳ!=C%ޒL$ TY,%,cΆF6^ R?vAz,pO8֕'w(:R/KA"e"IKfe9&XbU.wpe02˪rAs*inK5q_l 2Y`"#i*=B%ŵ])CSo)yCjh>.)G|}Z՛GM5h{Tg+(9ҏ>&i-~}Iu|:q]RSiP.w S*HmoUfjxk}Ѥ[׭}pQ#U55]jWN=jjz*^5/Х_VGnU9P"ޭ5j}Y/w=j^{~wj֫r jz8XI.ZbMV3zԼoTfV[12B_5RS_k􍚺ԣ|Y'}TOR9AK/vix^[dR3oE髕CLϱنXzw 9[O+!ãdR((BX,GȎFp)}2„XzkrI&A#FlҞ&;uG>Ynpl:}++X .Cd Qh_q"KhOw !w Qr)§i2X&=ȿF|Y փ 1-d,Úu8G)Oje@,n:!²H MWV*2[E,cabl+'Ecrt?货XrH+hS[~a-Lw#sq#}J2x ֺӮHd*HBp[cO h95(#6`!tKFoW G_zp&"75(qf>_>"sZR?G*Ha,Ͽ0bd!~v-Պ RU\e( bkJߗ' k ѬJX־zqg YkG}֞xӚaJNyӡ𹟈OjAy(4{wΕ֛JA<گe{*Vtb/`#tN'N n~JSuƫ;>usk"?pr\d L?*mDHXDRDLR(,݊6PyJU) U`KJ @&הT*sdy~Ǘ{Ϝo=ν3^^-`p9;b)ӅAYM3FZq!:My5_BSWߕ26V|,8xη9sF'<9s/lj9O9(ql~Lٮ\"q͐ȵ"@p_v_?$h$GtK.!݃ORg2Ea48Cޡ=ؽX|\:<{b .n! kp Tx臇x71% Vұct'K : +ѠKM`Ё<9KI1jombYc;fJI؂nw}gDzulF؎Q52EaXmpŲp]=r쥚^Ku|ќ IJAsחc97DzU1RFD5"sT!Icl(͹kS9+:Ac)DcU j6+Y osx8pbJP/)%;6D4Ph s.C㫆mʮf\!6\ҠrQBS X"tk܏ R(wSAR(%9Ѣ.10|Mf_`W)vL-x) =3~mY(قF[6r30.2S)3,I ׹`A> K)r$Jb©%vo'p*DMl=)l4{жtv/=}Hnò6k2F%[G'< ,8Lɹ lp'pA]!4A4n:̹y^ s z&sT %_9G Lqn,uL%\@&PJsEu2Ɩ F.n[ BJnL;'w*T6mC,Rxf29Kn 6F`:6ڰPШ@cNX<H,x ~c]zc%V КL4y=~8>iJ1Zhfbج sW p) +Pl;_,a(Q62%83U>C+Jȋ3ۯA) әN Ljq&f:+hyߧyBKVֱB 'G> GeXUKƳQ|Z輮>N _6Q|3BLZ-~Yp|W?J': '_WAÞNt$gH * 9C!Rq.6O =%)jO3 p) f4S=N /gz9CTx*V.AJU&UC-jeAE}:}A9i!8C.shT)*PT*I[ h![g+xy@$Bscn{+H8 $3h=ͻ\uM {gKdkuP^9啐~Ryz4axr𛁿~T1.K1:8(]+`4vRxyNAA逸Q,Tl4c^=[9֑څDk2Zp̥TT ):\WDi+J V8W#(18ubu4X j<'e]9 @<ƁZ@ t)`iP/CtӠmX*gӐDTayZ<':>Ua4sՃ,7ǾI=PLjc:J`4/0&Db!mT⎢B93ZѵrNRnk3ARq4D_*x*Ĩoy;1h8F-+!/r^q4~l_,U<'v q 􎉊 Ką%bPc~ljmFh8*qXtx>Ǣ'Y j$W❒xZhp9d9q^@G8}Y[>c"tT~ya@̕h:4+ h!4G5:G8'2!~PAtR$)hVe"b0%#%4] h#P˃l h@~0sALA7Aa@?"J>k<uBp=:*B, 5Jۿ#l_oM"}n' &ml~P_5R$)hVe* >FAg€[;ZȜ?6̬KLmX .r0*Vꆸ ϙVkU㕫 $4^HuT۟8޼&_ؗRT:@:{=P4/"n *r@d Y5"Ȼé7 CE"yOHSI 4IGE\à @M* %"KA]P,*RAd *["@8 AG>[ D"oڰD6SUH DJE "%" ⛏ur(k'xy ( !+ZKGi&2m%!0hP{xC'JzDg~EK00QҀK:LEAi3D $Yd s'[qMPF+.p8ϯ@$H!!_꬀"L XMTԳ0ArץE)tf֟ZY@ܥ[g | CYGtyhr3^׀x5+oHCD%bAφȓCBDu *,Dbd ;m]B,5@9Ă@.!^ y@aoa!!y b@Bh!޻%ĆNA@L,, 9=bB`A xkwB xqsBJ!q%EL/#B<_lo/T3U-t;ՌYh w(t<T齘>ikWb,&4Y(}F=y} 6A'1)ǿ!G'(WbaQQfH |EL1=;Ud R YHl]f󿶖O?t]9PM`E03o᷒p~~|wW~-1ւRɯEYV'טKt^ tjEm.t2J%WNK` t Jj1ߋc@¦;tj09 pͶ9'h?c{>"Q"?^Dwhh(@t߆h4sF4mT@M# &*-૏lo?Yn1O S67d9 4bm6B$=!n.#h^By9=-WeЯ,_Ŀ$,.3KbD4h8Z8:8z8) b8hyfoEBlK P)h(M'C% _ dsU=|WF)Wc7d씑'{el\d@{&A|w22~ I+vey|AvG].wY -sϐ~Z~3g~cm]')/űeߧF{-O޹tF{G'Ѝ^l%ۃn]6t;m{ȍlhoPl޹mҍ)$MўflF{ mwaKg3!'Ǔ{1xꋯȒ.v;k=*vd{l[9ōw:팧iޠ-Ե6H\=iCHot \A\R.#륮#yZk^ړ^<rgpypܩc@5xqPMq<أ)W x?ĩ-T%&yIv<={I[b4p~750̖1ғ(JgxHqF#y#iŵxb\Hm^[Bj Йǘ\Ye.Rspfs099XԤ9(} H[vrRsȩ-f""K}rd,ޡ]4\W% CK/4<'4Gٻmؓ0Zm!7KRYj$Kƚff)ٸlRL"ԧYJ*odC0lZHRѲI,I[sRҾIRp&_31XI{$i/w@{gS[NDҞN5o(ڴ˧M ilFS5 P߂Orv(Mhޤ=sFnM? Il֤?5iMgs]N|GրNY'mn~PZmqԷpA-DWV[|B-RCjSR[eV[5K]$ ši8iYj4\Yr,ţ"=#CK]{\L2j`QYj˳Do뱱v~Rj֛bWhomi-+H¥W<{_sgss#g 2RA+^-!R]"5k@U}@ᕮ4GÝy|ȟ{,/ԀM/QD*OS(R2D2 T2sԖ0@YGj3(:=;2kbKegZ;" !k Vo%S\u \%XW>87ea` I['4_)XiُmfGf:lB+jm2MD[y}%mSBIcT >4[lm΁x_@3uɷvJSiE]kk/i^F[;%M x=15]FZ[7u=]/ڟ,F~|cYU_[`텭6hڳ{b@3z| /&sufބL7[Tk&lkW녬}A/-S$X␵](w0K 4;\[m1PщZE,'7sS:Fu jRȲUШ]<4gh(7d);~\`ȜSuO YȐi052 T uBYR !;u` Yoغ\pnۡ&3>e0xʻ=&V?;8 Ɛ%K dvғB,'d;$̯ k+Ͷ}hV 7(!+Ĺ8 #5S_@p4JMẶ1.#56w-+ʋdhN$g,ő\Ӧ>q$wVE27璈H|I$:˓"Id$1$֜sHvgGrNH[w&ErMpx _jc@$8+NrF  U#h$HK4F2ϩuMdDv$_$EZHI^G, YTAwY?ک dCt2_ʷ?Y t*jnN>턭m.h[a /a<z 7~ {k"WOC=bU[lY߀vaFSL C> UI(P^k e[%T]CX{Bk-w{N[;Sw7ok;t^k!HeAkChk? `kf`ʜ`ր[{CXtkoU;khF[ZE6`mOf)_4X{c7,n8ː22lK1jǚ!j@8ǀ/ YI?~XE@R<aa#X6D.\"$[`F4=Yg[_bl]bɂ>*SmK[n*+ \ϮM{lk6 _>?M4tN s'-p;p) hw|?s݈N~<V|4ccgN:3KUۣYqnÁ-Wtv賃{ ˖ojmI[[& nE7kRU{A4E2ҫƦ'gT-~e06e ̵,+c}\oBoboB6NnP)bیJ4LHo%IbRX!˹E@1q+bx2&_G"A$&Wdw屈e&(">MۈϦ _1dsHAo7&;a "nN%nOG}DQ539+ /ILT=Eܩq'D|9 v!^ROXSe\֢sBU-1{(qD|/ %B5"^J%gPA!H܁MwNq( " ''oCYz[$"=K1_K-yaf9؜;4|_?u>\@"oD, y3|$#ri$. ^ I8ӈ) ? 8сrSׂ$/Rpaw#ՕiTJ}LP]~,jJ%jI$*Hn$GǶ'mmvJF l>ضآ'nܗŶ4$[<& l1jd;!`\6&O]B^pp%^V!VkV+O\q@ܼK4G'q8<84/ŃcƃSEC8E;R8* Jk4N,@LI\qU8ypVXvpA>DQj >% 7UƶC_ zoX&NmUs(/R\]$ "Ukm,R}} @ :7(TW-q3 7էUbM*bݾCk~]ioɃӟ NL}©MYɃOl%qNܦqlq&8yp,ypqIgh4N!q4 s1~V%F4K_96mW%DhZؕA,Fq̭ޗ^ /}t!S&r)c)՟OŀL^d6mqܭ >*-S+_S7K46?^_vIjs+}af*11}'r-.?ã\U6e’('4=%+Pp+p*{G<\(p'RP|*P;\n`lQw L8qx5B+ L J(5S( `\r䦠*GWђ+ t}< d)xJErd_ )YƣF\(ЋVUKJï(WƑtkP i\Tޒ8x+G\gZ n\+Y+X)P< MKS j\>+0b0h _ z Gq?D6@%T< U`W ;"W+p*zOO%ڸ b@- |WFrhU`s,ƐU@ Yc *v@Z@ /V` T`y3@r څvdÓQɷmo uӈq1ql͘T⸀8V6ljwLIآt qKǾ~Y+f`s"eCs*76|QGW\7 |?_{N%]C(pbk 4at>Drgo-}]~C|,~R?VgMyW_ifJ5Vi0o):ˊ 櫑0D nAeӞG5TwyըʗN6qgP sNհ(j6C\EW})G$ڜKuY޹.(~j^SsA)LEWM*~AurE.jj8$S0W!R*F\P "Y_E\î#CڙXM$Kj@y%o^SujvB2g<9[*jqp**@T+P/aszy!؜9*krƦ;LGW2b |v"ja.%jAJ˪[KS,({Plj4'r2Y5 o$a1zgQj|հ?:ٔcd5,}5_W;r̦OVjX,?jxJ} Ȫ}h]O%f TiD s"P9!q;/# k@;@űIQ\3\?TZer-ꍬu2f&* m ]8eoԵh4r؛SpULm7sчڵpG钀޹p;aS-p P .|jEFފi}pcb'oyu5*tFհ9sTͨ FY9jXt w/Zâ,Ӱɷ5]K:lɦ&ꔁVvL1Ob *r6k=`lMBL߼g8ѵ=}Qt,b֫`8׳34Ryz1Uu(讕]L䀻$fzcYgKgHWsB[iUd}]fuSjU.:ĬpT7GsOb*ʸ[5J̓5C.*VIՇy5^Sy?#j*V{@zKT>Î_`͕v|mt~Ih68GV[fc:9ssݯ>@jqkI~R{ }>kG3+A~_ bFv04ڷߴJ }n~ Ur^Σy4۬z0hZuKAI/8l/ 6A͂MZ6{GtgcPl%z qCĝѳE (|*w^"C`L[kB.:Q`sf9#Ч4hDgփNuuk*NI7@mZ>{}<80x_NZV5v&} iNyd1f/t9 #G?qKѺbIX Z.:Z#k!3^ tN+-b=8rJ>o œIJM(R|y6|6jMD4T;BL9%U T"nX4^8ZCDM ^Vcpx Yhjv}%Uf5l8ORvg?}]=?7:YA]*PovvFW+&:anr5h#)9'ӊj2 驪_az0[V`s!Q6+˄F$J]5c4+<oD? !}?xzP؝ʾ}i=zv@;Ɍߖ?]Q0<0:/ +^ewDVTjtNQk v|1dN.`]cW&gsd莲Cw%]$|"՘je>ża)gQz]B2c b\}< +n.1rXt> KRA9.]vRv:{X X%ƊMb"6ax^<;O3E?yLD+/GNEknp"6^ w1cZrSNG=ƾպVNT_#9zEEe[Hk?ۥ(!w=HQH7 ȁ'UZ'4VV"_KݥOLBOI;y=kv%nޖRgK ]wc^)Ynؒ۹MKx,m<BF5 3~ooD ToŠ ?Lk_sCX+OHyBYw,9KXWYIBX.+ l~(]@~ IުI4u> {1#}D_t45ph@k uɧ|{=)ѥ(-a-`弋FA;>@]cl3Pm"mG#PI{ӚM-,#CHET~ypj>32P{ =DfE[ܳ62|Ь`y$;dޞb~O(MC|gtfK\5 Djͯ5S {(=H.ٳWz[gsZԵjl ͥWgYK?XQ{$ciFm54EAu-%6}<9_n!Y͐\? Ͽ|EnM?^`;ߞ:Fk4fNjQYgv4Fx'n23ҍ vV*Wiz+7 =&Oy qX1fQXfzxg,2OWm)FaRzXt^˲.? L5KҝKN{}K2IIv"jvWٙ܌RV7Tӈn~zmL E%q$'_>mxFX*d[; urUAz*(ژJ ND*x:@\*TH:~ vKɢNN/k ͥnC~}L!Y,0dx˲19&4E{ΌuZ]E15icKdtӐkE:ckϢfɼ|`WWS3*O]P"ck{O7-44h廛lhKVRʷb)vE ЧG܅#}J/ã݇jk׊D>'ug'.Uv/HTwpFܶ?LAu`!GεK7U5% ˘ /ճ=j+&9y$OPUKWTaf),-S"j*ȯc c鶀ɉMN"[,}fcit9YcK3~gR /ш]kOB(l-MQ]&5{%>w(3>aǤ@pCؽ{7wk}xnݕK n0JcdQnhUo @x':Dx!) œyW_DQF~64eflx*< sAŇ{ :GV<&;ubq Rm~U8^#Ђݏ/ixw9~hSw{8 Q| DR1.5Z đhNhlPqG-+`h2xHI36➧Ka50Yj؆ G8oB`>(tVyeY6UXkO?$iMe)qoKQ0n &z& m% fwV6P֩r]+X|L8ؚ{H1d:*Z*a }jqݲċД%U@se1m+R?dG즼;V~_D%EK]49_5X^6 TbWM*Ӱx+vNJ PtcTT+go>,%Щ2ѕUO3]LRI mE~ *~bD.@ħ Bä+ӣ)}N5& *8"wH[#6.u9u X=lmR5߰rvfq})j<`E4#Y va77 xE|!uhsT{g%8X s hH̚Y9G!1Z+uoTg)Gt/2K$o}a< >',D!([(6jAHyVmLaVΙ9(0хq#UYF ( 4Mf`s?7CR^t5R ר7 S4ok?8F.ZDkeW$+HYo}V.FV9l*f3C̰7a߁ c<;ߖߟ28k~_ڊ4D$X; 5S raVGNUsb%Lgw4 IS#n>9տš&ׅ ԡ|&Hɔ")ci9ʤLݻMT>vD! xc(X6z|flE,dU/(Y, vnKOMe(NVp+ӌɲʃVM~pwqVLƁ3L:Mcs )DJПƽ{.Ы0hO3yk3f6#1~(%@מa!"]jAmᄊ>TƑ?@\VQȍ\Vp;NwwJ '/(` Ѭ,?y>䟴_q9] z8V3\x-N`%㟴_SY v}?:Bџ?'p?i}D.jv7&lJ?i}si\c~%Mڟ89K?Swkpn$3IK?La/eS\y~ek?'p*OZ__ӿݬ?ctks+erqkA+?i}sZ/'OZ_⿿\(59v SG??'p'/Y^Zk˸hN`%㟴,?f-y=sY'/)P #Q7!bNct:\ Q(T6b| WPٛ bzXTnfNߨG#l-!'9[!\e^Hϣ$ 0JmH6JS#)#\q59¯!>CBI#!{6g0.\"#טao_;?$7H#|PF|aw|0d4)Q2{.'GA@X#RB8=9  1K|pI.!\s5%;|QBص>)©27@Ź@(W Br/=#2Km8CFuIvz$#nІ; F9ň}}3!">R?<{QjQ⺃9ʑrsz(G;i!.tW@0$܇MIL=.s+{ɞ3tOl}μÓ XtBsLlX U?ThʷvyGLV:|-3vyf]"s"}碝9g.Md.;sϜC?og Lzg9==lӰ=<߹p&|sh&dz^_߸Q9:J"s$agV@Nm"G;9ii("D|;,߈L"hݙ^.ŕ?Hvn.`zzk'~ǸӪWxr ?S+^`\@\Q%peQ`/PD? t9V/u ,~'٢f@>Wcn1.[%ܖ'l϶[.Oo?7R.1O1^kT`~] su?ibw9f÷Mr-~X䮕s觧~4_-%7WkRw̻^r~%T']I%on6WfTzYxV&/,sRuo9}9gUhH eR,n.n.-&-*l{:lnkh4HyHnh眙93Ϝ{† [ [5+&"2)2FӬAm@lPBbR>i~EY{sMaFHIӤ(Cg5")u3MڷUO{jCzz.kxW.a=Z29zJOGB1pA-ʩћZ΂K>㚼Cﭘ[( s}ˣB곏$^ɶ@HW``v?@5XX/C_,qɭH fϱĪ&-ZotCeDLT tp'S źI7|nuu :qFD[(L7VP lݳ$ͷO=\=+y[Qx^6ha~]a?:6w;>p >s%s} S22JK'dbm7T<_\2/XuPVO."@Sm%ΜLGhT."A?s߿!'q+aCTuU7& nZ$zVuW6׳Uh s[;dla/?^MOȔI{S [B 8v|E"m6o'ҦۚhTGfGtYTxn<<աOxjG8]`̶L߈Lq( $wƏ񬦒+mⳀdqͺ+\laQ)Ϙ ad̎f&%$a{"ǞG$7W(xNRF $iLrs =BT QOI%ꑣI^2LŰd46\*L(8F8wIs&xjĥQ Cu'~Hch̾;|dii,'6D $:5 %^gmİ\;w50ʨLXgj-|Y4 A/9E׼hYȲg[`lֺp 1|,Kċbg֓a7cAmw@ gݝAͤKU%e-,:K'6o8LJB2Пd‡vZ*I2,|T#4ӉY ESp ;mf6 -Y4}YJ[M:6.N|n>~Sb!,N ePPJ_y;Wme{JojÃZl<a$<".Oy‰޼_)2~5 x?ڋC,ػ`) B|h6=pU,Г/ >E E5$pAU:$\6K7+s'|n/c#{1y!92y\_vd!ZL-Kjs)U,5"Ʊ#[n@͢Ҵ(1%IrQ9Zv<9.;:$d04rh'0sP8.ź^o]zQ6!+cq[i#bӘM]lGƖ1?|slDԕtWTN8\9bZ7PbGS)wX$wn^I~T. PsVS<.BtţLe.I a%hqU|ftd()G3N0jqr<%wmՀ,@.2=h҄.xV0q=!.Kv[۬k~YgJ4`K#%=>6/:ӅH.v_Qȴ a5ijvS2Ӵ (;Kus2oŧ5d&&mqad #OA+H }lҤ- Qo cw#VWܓzM)lJ{QŲPґXehWK))TS;TעClMTC{T TC5X OE_FhZonͥ볋dG*=L_y8 KW$SfNϹX *Oj1sM~ʧ.֋׊Ic{6SYJ/1t';Tʺ'(p +<4%GM R=g?]& (qZ;C\үQ!O b1uQX*uyAvw+9%?鿆5Fn͉^Vѳ}z(N\FA կQ}LcsvRNC{CGsu- ػh \<8`#KҬ+w2%ܗ0NLoCJoQwXDߡZr-'7H'6J/T 8jLތ:YAScşQa&k1m`qƉMK9)s (M'<O*1K!?+Q! lF_|YY?d0(0 8 `1`(,{ܔ5 aiu>\iM > '[?lsY9s>Vmuћxlj~V*\72!2?]'ȼ1DCqV ~=SJO|$~m.ğ%'sq_uI%ANu̹upN[Sी&Qyp'|Pq:OrJUNVw佽X7TD\N=ANVJGjt&tƕs[|E~VtdBWTܕ}>w"_SMӮXkhx^')?`= 0`\71xR :% DZjcAAG~:'tbK-}<(F쭺8<(dh^ 7!uv(iw!֣8߅icVH}*y?^qΧcXkaQOD" %>JT܌tYhGy4>ѵ vQxDWsgr"E\{ᆊ{ʜODsL Fο($FԀ<8+xvVdYj<5?`1 p!ܔEjX%“;#Kރty}~NsɆxcR0@?cPbk5Գ++++2~<8z:Z>POTâ$ǙoȿEX!\!tr>&MF{1>uXk'Y,X,XqVyF_= *d<>' | t@oQ/ÀWNacJӧ%e#,馱6K.&xdYY!>5WkK>d;yĝ6wLd^^+X-pkKV :~I~K&*`d -%nV.v{=t$gT-% ©fw/Jw,|pV%E됽|7gG'k(*b]Vhí Shh 0{3p0 paQ'oҭ>?E̺/t݊9ѭnE˧tݪiUsΜ3YO f3͊`mJTxy"Tnܷz}Nr)Y7>?%qyV>%o@kJ@/@¾|ߔ q2p?PÚ>_aE}d8M5bʈޏ"\NBoqJcG,X %["Ưub5zL}TS6, f\{ Kp${:[JGF{XK5)d3*68x=р?v(w>VîZ?UGnF J?鈐*<}4}_ SUdo XJt;sZ?-O_-䟖nf?}b6~4><>ښ7\~R?|R_ցoՏ.nO>@k2@/@¾|ߔ q2p?PÚ_>dBuR)'t'O>'wViǿ5_2秶rߚ_\V/O/mM-&x˔Ne2_\Alx7;HWvpf㒤Rіt$_yh ~PUo5l.BJx R/u}쥣W tK")rS`(52YDF'ŵԔΧ儨xoWBtuz]]Jx60֛RP,M޽)$ׁ&ie{ͮI_A[#w=a)r7g='9 &RF0͢@Jo$VR[FŚ5%E!~gtH0ʏu$n~2[;d3)%ml3+k|3{R/N;wP&yUTHB;Kr3Gi7 ef~~Y?]ϟŦ 䗮nK#H&$55L$塟A'ۥ,YT&Kv$X $hI*SbA٤r,BP"v5l&bt[wdD#CPR7{g'fRc&%*elzU+P֨ux++(HE,ߣv^xzL2DmPmCi%{G0WlL{4ǟt &i;mKG4>vzsFn}#;˼LЭ5ֶ'64Ÿj)n_B(9Onޱ=cSczL7XJ DgP2k}s:N20QZ>-(XL5uc +>؇pNxFJxF7aZZHy3!Ů;\<"c SjkaWd>U+<:k j1ve1ןGM}?N3fzf6fN[‰5 =! D{[ ku}LBEJBQ6%գoE$n Ӽ9=xozJxf}5ћ7|05=s q|MT%eT}}ə=)th9e[msKj˦fSH :0ˊɗ͘/ع~gGؾyO(fz Y[AZf/w:;}a X?:nO3K Aw4Ͷ֮S@{.l~rO]!ֽ5`ؒ`'S'D0>ڮJ+ZQ74p9ԓSb Z̮ W1n*yy(1810"~$x1䐙Hcgó-ϭZ3?T=)6)$ !+96rYFHmRk ytTDBI#sr6 '֒:KFa 5C3nۨ K+ޛ?[NtBb&sp3L_ٗQqlPgvL먬OƂpRÉDŽY*rtj_ ԷD5Aj_181tYU rVEtݿF&]81_N)1a O]}k[`?#fŤJ o ?\R3 !:foX&خ}0)f=`摄a4O,*AH&IPX&GeC cM6w@-~XV[ĆmZFнdoF56%h+5V`8J1nCz|gLC< EZ<]28I6m5(|p%*>~ FHz,w#ǚ$#Am]o)/1C_Ϟɬ6R32zDC%{t۟ xuYפmCl"D{WxMVZŖl6e7{D<( N챇].p4{ ⥌j@*?quwzKc1񓽬XU `[t^4HeWc|UϺ`X?rTcI-:KBwD3*[f+-'SʨZ6H)RF4$s(&ݳFgT(e`)7v3Ufu>NHxZ(c@NPT)vH!{8uHwL}v* $jFrTH,k(H l?u󴝤+0T $X"}A*q|A5!؇ O0g-$u$48_AcT5A9rO9#,i#U׽# V;\&; ;Xof{]Q$D+XweWJqhjHoi+U`uq'V=I|uqϹ5]A//E,JeOgBLzfUnH萬,nM,on\a fXOQQhdA;;+O㏱8dn]V;DpʗhlaIeM_>y&߳򴣇:LD &b`QT+"gZ<DZXiu'Y Wҝ!o]N0ZiaU-e6u8J]jRzziQ/Oioubhqa*_ܣ(4wdm+-=Ҙ|L5z4A=(L[4XO e~޴#i2AoWZNXsNm8q m6HZzy }ImyrG[-,tG;T߷ީoKkOd&C1av_c^7ײ;=X>aݟuXJ[E"twm{zݎ\Kqv݌ U8|MŞўwW@3%NS桇'u#G_Ϻ ߔ/ OD h|@ClcEȻu-|O{[݂THjW5s)Ӆ/߃DoM7,5[ZT%QS{ထ5A< '~daEZ{gpNl>nx=Oc8̗HZ e%_D$^ G▍ZͤD;.^(fYgjJK5uz$&7CK} xEdL``eQ @ C0@^LJE2Q+M3.u}!ʕհ&!$jtv3Q L f9U56 2]u:U]uUSznw6Nc{/V /M8杧Q'q^\ugdLbDY3BWѣ )]X[d_ 2_,:L@G4L6Zֆ*u piѣL|ٗx.^"p]RĆ.pc Q %6gT -;?R3^ЯsNc; O yVDuCc}KN7 E' ÿB S)pBJ vxj0$pL*S0??)xR/y֞}&[AC־4f-e8ˆ]6F=fi+~aSϓ8J 8Yw8Ej>7:`+Uk׷G9r]Yn9\6XP`CMPM ' x#QRՉ ӐOãq׮8HI,Qj$@ެٴ@c`q*9A|LSIrB(<.a IzP)5P|#kTl=7z=lz ˪g̅zp4QCĝPvҵ֎3D5V^Ƨ4g;RȖ&X 6dvEɸ7#[i\gGe 43k iL5lNM{x%|6'p_,69L,G&4LؚэG: xh6ߨ 5m{na5HfwӐWXG UԎޑƒP܏Yx?ăѻ(y֑QݐRaZow820QGu8MO^A~DCc{ٔv?.X158#] %դbFL{M{ozw ؉-MѸ:=6E"iY}:pAGrt|q(xNzաhﱣ-da^"8A$>$+(0Å C^ ";vBR/ #9ѸeB (B)dTId85N)9zኛ2m!$Y1)6Arr &b&H4r|@xXL+ 1sAmm:ٍAؘ9U;m% [{ĭ2b4v$~/td+Τ$H3--T(nFLl[m$;4]"=eBPuCH.f $_˒%#`/%:|;3dIaw˖qX7o_qo]n7)B")? ֑XLj[pBz&`d(%uZȏ04?qT*v!O'G8ir~*y"L{E&{]mT#M4D|0\+tVTy5g^ϙ6n)UݫD6ȆYv-+j7KJ#'m@cb,aOq \%s_,fmcx6XC|DžNu9Kfxt zMّr^ѕgjēQC0Ok0;}(?zD3ԆS z-6y-#YuIѠٛjl1*N/uSdC)2>dYHkQ}/9}Fa\9LիWf#GSSGruٞo<6\~x$| 5?w80%kJ8)a2Z*LLXBs@|:GSY愩Vr|4hX =X LW:C^YS{]˄k'#Xx2.PԘK<n;B5^Éep; q=U*Q ("p~UCMBu/giLAqb4]^$n"| ObjvWPżBY$e PVsB.1VO$Jذ&ҟ#eqcxؑ ͤIě[gMb(F%z|RS)sJq䙪fNwSNVUW+he`Ch5e2g"=34-5a fTa- /DnTӾ 2t3AYV+{Ҡ ;y924Gj<-ExNb#"l.NE؏*zX`=A5_1d:w5ٿtb}K'^=sЦ؋Ehp~EM*춅@̓ef ">*bTc?G\ $ 8Pg?+ETuUo,+%η\/ .(F`u%T*TBxs&4an礰,<yrT S+9S3bdѾ׻XYz9EcVՙ2J_¿~CC{{ y_D<34kG2sW4B2b?ò暲w`VsM ,{dSٴ cr{ǗhQFkֻ㩹FzKh6.,\ ah9e tE#j\ajwee50/Z!kus x0KV 4l έ('ѽ1 sΉ 9j+X]3pn28v!|1B9~58P3'S =wҨgD-sKFE#_47v.'(A a6"8s ҜBIpxPDÀ$CdǕ8I+lh{lk5-6 b6YO#t a8&4$/k> r!o)qr9A7;KتR4\]upbkdM}hxedͱV k['7_‰_ų| P,s%XكlG (8WgkZ:q#RQ6"uǠVXk>4Uͧj>FB`D q#!o@p\JX|JS~9 `m /UAo0B:%|Q%(e~ LâD M _gEv@! r,TpSLP)Pfn~m/3!TP '$q¨3q"*cn~w."gˣ<# LNo>Bՠ:hL(.%߸࢟0R.A1uiq`jo*cap9J NBSgh3zp+B~>6~#N?}..mW"`BM rio LM:4NGC#8#h:V3:՘I܃i\L(BTpcmvp8*V'XMbT3kRpiN6B6F 8RDPƘ ڋ#|]G`>^kmׅ%P<2:4[vQ7Ag_` N)z>C'#dBqa1/a qe!ܮAAPjsPʣ7xk~l"4 -NN9IgX.|"toZ 2㔌-6)0M,~MfGn[e/:b:BM؏#t_{ rxf:jqdG> RD.L!J>jTR#ۧ6NP?VMO)I;C;[ o_U;gkAi~=\'Nf5,z1/'`x[4 XV͇t& Nk:poW_+ZW*51WȈ\CMBQPb:tA Pt@ÛDwHJa/qs}i)f:{blR2UΕGÓ/ '׽`8\_RgPSHO$wtrrxX!V&Ԅ=emǏqDGrA&)ܶY$?K 73-WTht]Z4 r  ʳ\ &;$bɐ} .Ѱh RPj7K&wSٮrzUHprƣ֡P ekQ@)-~ IOy ԚҝF6 v{3M]z Gʌȫg3 "gI@t )j~YgOҡblu`u~';4$! U=5dIٽPC WqgzQ&Rk9,q: ? K}> z 1*Uy̡BhDZ*3#̤c;scGf@0Sp ΒHӛ9A:Y8őU*6_B"ʦgW]`[iߵk5Z dhoN`zCdi1*LT7-ݨ6#+t/ Np GAHEiS^4`W֋xDs`<[t&ϲ ڽg('ӕăw l N|-,aF o 3pGXP0\Yݕ$o*X7 ~m N.C6˨\D.ceb\]8tؽ\&⤪z6|uDpc, .ܽ +n^K iCvW寨Q4lJ@Z^~~ k9=[6 lkv$m@Z).sO!Sr_sLg)=MRmsr^xGJ]P'dtygK^6{KnRgAy.jD1]~FxNx܇'4u$Gkbʢc~ XhP=7*,d9s-I\;H O:an?rXctDSr>&vR?!Zc0rVYDƺ2V`DSɌ5F3H9SȪ@ַkw e\BYE5Yz.c}*g@֨%::ZXWY?X>!5&1x'g}Y(X(X#k҃*Nj)QO9k,k.c;$c}\z+sTNZXs|ƚ,g} Y`{:X109:duaX/Qϊ("zHƚWuƺ>#g FhIuc0Ō5_z :,WR)u"cXGY; V3Bz~Y(cAj,U=6c;c}Mzax *tW/Q;V%.{mtHV@f̬WMJ zFE?#mY:W`!M]DY-,CCȺ3Kc9eii,e+%\DѶ3-(g,^ƲvJŋsQ g,Na")L"%fi6JzLB5R0~(k=&7 @h,DU_FU+yqn,b$m;Q0'ˣQQ1j~9DqDIeQƨ:!ڊQMyo0*vʣr0 Q%J(rzHu7Fi0*M¨6G_A5Q)n# K;{sx"U]XE\̪3R%|s|/xZF4>N]Ut엩G@ |C2ki9~:wd$Y )KRd$!t"]z*gDR/a-3˪pK o%$q?K;޺QLXR$Sh4-^'=O/ctx:oyȤWQNi Pf!R e!6BZ4"3 ie!YH4䲐FɝKC氐c,~R#g!Y a!,zrPsƽ{`Izu+siFe_I0G J.-see%d݉%kʺ+TVd+ ʡeȎ YBv!v&d&: G!I(d&B!;~[19XK` B&<;y@g'!,d7N"PiU%ub=Ɵ{?,@V YKHD7lڅ&ۏe܅,5IKf7uvͮbgU`W;c v]/Gkdqᣞ;2]΢KY4%zI7€LA](tMͿeUzPw e!K X5 :K6jq 웣Ĥ;h9Mb WeQmTԯEQϡZwf6R_ݤ(|SMpzCftص?&Lc,DGB*=UoĮv,xKa87.̤ Ӷj^&""3 tJFEXHeZ5Ⱦ _0Q33QȤM&Z>BF1 HbI4e3LJIְ9sqG=)ڵSY3PA~ _UszQ*Pdm "m._;LOx ‡ e dl҄Pz$&Tk<&'3,`HcrE ZL++j)UV@G듯 8^ߐfk!n +\ܭD!3ցgQc(+CG%^nBR}#^_ZS+,OAx&H$k4TQ?"%w:ٗ>)v8+wǨo.ʢaN_~)?Z-]6d:~"-ceE5 I&ui QIC5E5_kƝ#҉MkZ-Ḑo$ ޿B~o%8 W=)3ghz?3vi =uDž+)8*A]CJ߭s8*gxܴ]ŷ'(uI ߓ-{ 6';pB 1s>O/&f`FG/MRz񟅷uR:x>(uUojOXexz*ߓFqqeOO\qȧ'N=@\сu+}-+зy۳U:'2 i9؞Ͽ8+yېCz.oC~L/f4Ss칃ٳ6I`[} ]fc!=N\n Οe8up gO)Ù+ñ1Ο Ĺ@a~8y''q,2gw⼹αpO;c o ϸۗH3ŋ5~́8/ pv2ge8od8=?GR Ϊ( 9)4g3^;Q%y h|δqpJpb8cpqTpQ-p0^>7N-p>dxtpJp" )N|8 8l`8/} 'Gd8ꢁq\ G1@z"qTDqVg-y|l=éf8y)1DSqw 8MRoe,-KHo@`׺wL{hj*χp#k: wM`p =~pcXz 2F;gܽ2\wjwf" OM %P Y>ܜXGF|~ܝ2ܛ>f?X#S[m&/|%}>ppw By̞ÙΊ@p'QqY}"ZY}>@}U)ýp}9Mfυ%ý<߇o1\LFkY< &ΟL.~?n >\2ʗoܧd_d,_>m H? P& ]1n WJD}\~}}Зyqv2? g 9?,Wڙtmqw%15P-EB 5h͜6T $"j9)sAi*:*bhg;Zk}=^cJ-'R$"Nr8<08?"έq&Ww*NȀǏ}cqLd"΁qTbqx |8:9瞫g[8)%L*guY3iSX8㽮=Q*Nx=8a8g{) 8^7{nΏ圢\{ۛץ,|OhV1Ig(_85K;+z^Me|IhMѺD[(E}_ZohpZ7qh >uI<)cvZEAo^M+u VyT|`՞6 B,|Ow$_EoX"3DaObjB1[xo!u Vk$umhUb.6gIs*uQŎ:Cc{ȧb1[yحC]XCU-O9.~Z|! 1iXwC1j#zK CMp ߋCQ#T=GX$r5JAٰc RٞvRcp9l# RH!3H|y2V ssýY|"99k^ܪj+ich^N<^q}@׍lXB]d^EleOe0>džc9~U QlfΓwpMLYޫvPNcmSK]H2s>"_m1ڇfЈ!Ѥ 07\g^VҮTq_۩]x\羜롫GoөͶTo iF{iG>ec筚{ dxl>dsa-ЮѬ-v{4LgYil>h.1?67й]E6}>z^'0ryD{kDN]9!ȉL,^*u.` {8{riJvcy1slцL38m(H%1k9Y\+ߖS3MvTz!wgXCe_:#I~DIÉ+K搃!i4{,!9I3>NƑ1{ #|!C, HgE (q G9A=EC{26WCk2de$ wH$<$%Mj,&IEڐX%nyl#''hrY¹$= sGUEhxM/ZZe6hvx=|vDP#:u7x ]6nx>DD/FE?| D11`CGF #Q1q'100S0ɘ阁٘<,",'XT,2, DVa5 kuX ؈Lda9݊m؎؉]n^ap3|#(Q88/Nk|gp?g/B\\5o\p7q Q;}лyfM:w,i CK] pUUpmNDV8#!I|M\qfILftw! I Z`Z źjy繖Z.*Z+z^O^A֪yxAYLHҏ|C%`\TV$S>_tc#\%Zr5;$&Hq?dLJĤ(R tR>_:UEUK$KkjgJU^`X)Z aJ,$:%&+R*_uO(Iq9mH2"Jx$TjV.Si 1WSy0'2.-JYlP,MvCkBs4DL["@ š\nE]J(^*gGШn7$1J^hKW\I+MHЩ]~uSOyW,&R(MwR^JuƐ}ujB;CJR ͸wtԮ(I'%/R{2>  :*4v2HS0K(_>MUZe:$Q)ZX2'bZD FPFX[YҋtIVL&=eiֈp]@Kd]b$Uy1J&Z:OFULJ+D5N"jMs{#+FwUXO /ݚg)%*P%ݲR -tB3.BƙlO N@wfgQXa >p#ONc^^jr /(]mF/$m,4neveZg5"d .)`r^Ŕ\8SJ)>wK ꤳ"U|4< CTG9. \#y$?W: _ݤ5τ QAOӲάwJ/MљՄ#d\H땤󄐯%NnRN`9'd1L[А'wot" ٹ: ީwAanN Cyg]Io<ܭ sܱwqjxl/{h1DʟA!'Ҽ|qԳI=+ԳJC,cCҜ)E&֌x5=C b$"7z&s%Xfq|=~. Ls{45Y|(j4yT\> ."5DS,d.gLρir<4bu7r!CgL\1nY7s [-g<|x]璮쯰"Xa> ߆^db3JdA!lau8q_1~tǃv=fk}1z},И`iW<[)~]7?ƙ_c`mm;ػ;AG42%~hXĊC-.n%@:̳9k1e pzg.24lAV^~o>7>q7/g|jFbOE/C~hm^7ՖI^[|h-{!/,gzt;֮&Z8XslMLtCoXohN fo6#ЋSq'i.n8=E+ʞ܂YE[ݯ'ue˥2hSlrlu r\Əʵr"/q"(W"B>n=2ѧ˞Ԁ|R!_‹l®~ C,m̍k5~5=f{5y{ 0{Ze!*򄯲ÿ{+'lx'_ixj^J|3 䀎ZԵvO)3oX;Ģm ة償*a,tL%tx~h) tCy/}e/t"tyJ}K/ڌXf#=w׽$~'@Os#do2l?q4aog6r¼khn?7N'2-C~8ͧ$6Po ^>H!G_Ikge[K_l?uA"燷:?mί2~Mϼq66֒p׃ Ϭ(t3wĜx<01;44P0jU|C~I\ګ^E?Hx=A*q@oiZ[OsP&s!jr4+ZE9AP'.{2+4_\F^؇\,v UǐabŖU~%'\5 +9\kk~;=DO,?{wpWY79!bu ͇Яqڅ*8u.Bإvc]{|fC.l1 5^A􏡻inyzb =.w9h:7y^H{;{=[wpBJϾqZrv3f4&CơU$$ajUD?lk;qk͵z*ZzTJ=JvH)%7rTw6y; K} )zCOi73v R;_wQYv@~"O{T!{SfϹ~1C|o;12W_]VC߸^sƵgf!S }o%x4ԋh X o'^ =[ .䔾Abr=[=/Di8n: Nz+R~[o2F"V^KkfL43I>0\Zռ3 ctkq{Z18_}>Z%<3A?SxgޯGOAOA TƼ P!(h¹/E>G|.VX,ۍnG=nZCsɡA @' ˪YͰ]v= hcyHf$Wrܗ:;? |Tŗ{ͲLA7yj3̙3NS9C&rN]ywz^jzb"-u0 } 9aLc*>y:)M砦ce"-wU!Z__U ?a3̉Osq~Z@O)*HO>Sh>ލymQnҠ7Ϭ_WS?_?k] U"~2rΝ~b˜;mOC䜻w~3OMA>gW=4~;+yq\4ܷ^:ݟ#r<]lCm-0O!k\؎\9~\2a1}p`n$OE3Dϭ||X̟ ߭y_Azi,F\ K KN+$]oVENX&1nf gV~)O+,Xa@k3#':ch(jlzj 3K)rr~ #ᥜ]\3عs|0xXMwKexX |U.+]A+ya@wc_fa~yz\m[oAR} %} ^.IK #wuފ:?OAyu#9a!`}0'k*Xn'<} (Ws~Cri}u>`sԋua˹=Ajo"~.139_o0Dc z'tJǝRO\ -an7OoX'e|1LvA~tcw9_c h>v9G*0|} 4M64Gx8v=k0l:Li`<Һ ؓ*db>]8 rsX]k׳;|T=99>; 5j8}9d'YAwHw:|\jǗ~e}Ӗ h[=[POA1Z-dp]QX!)<Ɩ;88Ffo: : }AߛtA fw=ku;)KC pث?ք޽IX?'ԭgBa>UZӑ#C֖K$~ tW8M/i1åV:QoD"vYg3}ܤn"$]ov?ǣco^[RrϽ,>E?p~؊J:?II0K86iLGWJϕ Щ8 u, \]V:t*Ƨ}t BpÔ#_,sO /pK!@%q5ܴp+ ku|lq#w ,5:0FEy/` Kޤ9ä޳ٞg7(Dه!3)mNI[;|)R+[ A&׷$W[#)׹-]GN +[s5Vg^K+jʱVhm^`hq=R)Vߑa(eƯUˁj/5sx >wa:0IKv  z[$f1tΕX?5=KAR3]5NvΖ#}ɡ׼>?0]K2S Ew/;"46!]uobO~rrXEN.93{IPg9M_7~/kSDEŔhEF'Y-+mfY9u 'iR w#aQtmF3tYgFn{;bM'`hRq$Tz{lY@_vi1DY~AGC.9_%)vʭRϾZzrB 列hUZvƒN,?B?Abf!YwO M'kyC-M{G֔"5b_XF;FjtMC󒀭27GE#4LZ ;`Bd5ljϳSIzz7z;,LQZ+l1:yzPqX7a2}2B{z:T^3"lEuBvʓKK^rQRqJJJFhga8CK]l}aOՔMDy$-ّVdf75-Dɐ-%J$Jdj&d$B *jBmB!B `j!tjjmZϻ;IqX4>w}~SaSd9bxWR uRߟ^ RK;yKܣ5ȗ~t_J{Jϗ_Tgzb!*nV?޻vi=WN%^: ǜW 6v~K|8?Tگt}3uƽPhQ޻f ԗ鹥 _,NODzUڟV; >k!=*i~DY8inPiwvZ~QKgUt{gn=RPy))TƝU}}B-NͽR TI*ewkHXA9PPGWULϰMtw(Tڿ_ʕhثv2ww&[\K*s=Q_oUwBGsΡ9x{;t?pKcxs_CoxTzu|K۳͹ϫ:[}h75o17 Ͻ~쓮wru g_n1o/vu$N^G:-b:)7al鈠09o/y˜aeݏ´̢~~?ٻ7ˬ8?2q}"qzK:Q, `XC=D?1_i <Ý-C]쥅Ow2Pzu?|V?j }bm)w zu h~_;nuyFOW/^˦oS߯J2prn?]-n+?~ }e'?w~[?M:}a>I͟v wmk1>tp?D!0Sa~34 )]C30SLeLqT(T693ʜf*sf/L1 Vi04igjaa4Qb*`3y8 3cy杦)S3 OLkߥ5u`w=<Oχo=]/,YQ<Hg}?dz~?0p Qcb.ՃCUٟk!ְ2H =0/!}mW?r#nOi䭲otR vd2 cO^U1|Vnpm7o~<nߋJrOk/j u@>Zgnj )׼&?(@NϫG%ta+_q۪/nyRYLOiJBv`{X0j;Oͯґ:z|nQuDȱnґ 1'v\Gc2=حΟcW{v-'#nTp xXԑrFfe`G+h|@Z@?0xNZCFFG2 |a/Pn) < 7E*i9<<CgnDyg0oCI3Bw2d$I`?&Vner-y xfV -? `jJ`<;;\-RU\BW4ε\/)ڝ\xݑda΅I1Dg!'40 L/) ^I1m_II"i4$+׾AܶB K%Rzg[PZv9|)ѝb+#v:$L9L% ":\䉜|cF,I"_jv(( $&ɦqB0OwGӑy=Q1:q!@~%r$Q'{oh<%+mt!-gNzMchVHt'Eg^N]I:)Hyzi|p 劣W4ލxk}7h3&񎎔tIcfAWS퉫"KbJ0z= t`$LvO}%L{ FO8|R:?I/%ϝoaYF@ɹu˿CㆲuZne&9 v)NО^1tDhhOB!xL쉤CbJQi=>Ғ= t:3Y> )S(IHF4ms@$k@H` _"-'ca);;dMŷK26 0 Ir8T#4X`[at D(;8 3A~uӛ1nW0! jˉz/ytG \?.4jY ImGE{TuփzpQqSJnAi˯+x6mMHmقȲWv':WqHVˋ@M-iWDf.&tǏQh=irgNH.JMw+=rb]PH h.Z-"pM1=RW 5wvğElTGUQ'$Jm'EjH$GQ\ Iu'[ > q9?>CG(pSN]R׳.w F)$J׫gz])ee^V@Bi09*ߞUD+eWR/ur9bR/Kݺ\`%n{?RxTTޓǟmOY)ēOTޭ[L^ԘVRt;:[C{Py%tS*8f+") ;䘦!"*{F.&t4#CJθ1&t}wfw~w~w~O#-U*s\{߅g#=; p!9ߓ&r{~䝝Cl=݊ϓ@KC#i$#!Q"Brt:C8&=/|/Ӆ>%W DIiHj8fqJjw l"0蜚<Y[q7))l~w||8䂔⃹]C) ۋR|OGO=y i;qw 9<b[ W'$?-(/=tk4G+.9erdǐc>&T_ D5I„v6o"\CR))j2Cψ-]BN֎8wr)F-Y-nF/drUw^5->I1ȌVΎI _LS bj:e,SeY8KⷴY–ǒd-g6\^wrG}A{=uϹWMxA1 L#Ƅ0e2gbFIfgf)cY[ֲulȶ 6;NnlXk䍂ccq8h3'SyqHLzSTm1q&$<Sf1eMӠi4f7MfM%ӲiŴi"888\z q׸1nfEn[3g͍f6{s9k6Yyżj^37Rf :lZ~ˀe2dXF-,Si˂eѲn[ˬ`X6kF kcf}֬:`Y#Q5u:cm]Y׭V_ |}|c8?OS4?g9~_%~_W5~Mo+*lu65|-lmۨm6mݶlۢmɶl[l ۦ2{`Wګ!{؞Y{}>bOڧ9}پb'Q`G;=^G:#qDŽcֱXr9P- F+4 >/ !- Y_ œ0/ qV:kuN9y8Ns6gvF gufYs9tN93Ys޹\u9\*Wqy\ . +w&\)׼kٵZu(6]ĭwJww7)ºy{ѽ^Vkn4.<=L3H 4,2K W5f\dlxȰ<+^~ a6*e3leٱ<+U:#6}Ɛ1l>co5^3NrZa4UILm6L~SԔ0eL}GIӜi޴ ~sjfp3nFC3`07ffenPYk3{6sLG̃!sʬ:Z2k`Y`,j r޺`]7)3rJᦗofNY2 yϖm(rF9Vk v~E}A0}/Wk*`WQ 5:# ~eFS9 eB`*JN`f^!pk@aaDb٘0.L6#fea;+5e2>sTbբ)һ*ZJ%^%\׀k5\Ӯ"xTs3nl\O1gssBSS5Z5Lssiij25}GSZaFnFSjJFKSsLVuyF}pz>Nh)ٝ#Dzcy>E1-U!؟{¹#ʨ˻<^/`.P,byz5JJ%\Gy¦pC/^P2\nT-4h]xj2t4^"ʕH}i2- @ߡ#~N*^ep5֯YozNC'*,N6j+5k)\9\p5•i\kLPZtX2ϷEM2 Q"N Zcߤj8^%ؗKbj\W`5Y~&6RXs5T+%+\-Aw~y69V2ye;'՚Fm-#*4К^|z3YGg,R9y" h$"W΂Iu(&'+x @abH@n[gSM%7y]³^6(e3|#ALP'j,yK亳Pi`@Rf'J$qS-G{!!jgK~*\K@eS55ֹXgq.y Q dgMu$]ZM{i.Lɫh/[Ge=cJr&rfgM ,vS'NW?r;yi~L9q=+'DIk5!p_'3ݗsbOc 2y|_~Bb#| qv"?7ż{u?3Bf'Rg6^kyT}Ef\YuZ?Gh@APqYT.:.;9.5J;wUWө`Կȷ~3`8shg hf LI{v/1xrٽ)a0r/>l & }0O0o O AMx =qxDNvQ$/T#oŃ) =9EwKvʭxxF_I5KCI묩 g~8H>F [_F 6qfM}x໌VI̛5Yq9 םCS,`Zpy$K[_$Y~\nOdqzޢ<,t}U֞Uk֧G15NczOy9̜iin2í7V/5~{<9HBhCWuh/ڛCa:>J'(d:Π/t1&G/C9QP端TSW{'/@Ǎߍ;̥OVe;=g[:{t=O >g{KJ]hkZLFwN!y]A}%ߑ_HkڞJER*Cg{"5S]nSGi_i>VۨFε6?4ůdQdL/kڋd)w!;~өvpZ~~I-6­)\/!G&K/J/[vO𾫠iF[.T\J7sTRU&iiVQߧ?O#3W{coF?kn~&g=ɞcbw^w:[ϝcN Wrǹe)Xa0 f|KN\)6CZ}TZi;&kQ Җ= n^HߥoYF <@yB ' 2@Ah5suǀS/9Uc=OZ[slf@ka%ٓuwu+g ҽI.4 DžlxzyqA)OR?,Ƚ0t4y< 5%A9DJ[(W+L=L+]uA|xbo;/hiiz `o](s 5ۺ=Ip+x-FdugzFh2UٯP0aЖB535v¼ƚJzt\Ifo 皌xTFFƑH3x<ph9ih۴[iajt}d1[߭(-88s/l'1F+y< 퓮 p5 i\ _V(ת6Z6X;M ?557eZ>Ň0V;=(6[uv?{h1{= p1T 3{3Ι" Y}||r<ImGx=&w=z}bPG8D|kS腬Bخ9"DIŞb?xL<F;'ZK!M-RW0}҃ ٓ8i?. e~,C_Ki~~]o|>419yyFV%[0UEdj4Ra Ms|oRaz+MQdVAcPXkU)U(Ǖ6J[*QM<>OS 焖bk1D$bo/Xy83Vn١Zu\f4WZ J;RtH:'[t]n4D~,2W^ w%!ܒ&!qIoI>5l%;nRB!'Z4v./hk.JwreTZ+!J'dopM,Ȇh.~VexH9T[!j'$Mo/9u.yUݩVKC9Z :i=Rs`nr4;͇Q39mڶ >hb?LzpN$T me-R*C[GeDOd߀ʈf$FhyZ<#~ü9N2:i@ۃaT;^dgڛv>1@h}YjgsDSu@- 1 L\%7}m}^;„[> 9^-'U'ȱX]w<mL$4\O'(jZv=mR/ѷWטיѭn1o5阽=f?Aasؼ^|z y7|i Kk;}ʾɉr<`8e8:(a03U!yHX*"&B[['l-Et}F+wM p=>0x۷h'Sitϳh&jT5[CK j!0m$a6^{KFwMn}O߯GA @ f{f4*Ѥn}̾` o9|hͳZKerk%:ZkfXrY?XXX-{3֙,A~ rq>)=Z8tw/̇ŃՒ [*m@-d]NBB+FZѶq"OOh)l/yN Wu5 lZvמіh:mvN먫 J0hfbbz- w|/qO;xN4j%H7t94>?Ť"z")^$QRCbz511t=@ס߇o1Ay^ٮPW;:&#g^g`>I h{/j@3L1"[묿 #]&Z$ZEkjsj9m[;2zq{%{;MtǺ),w r-.dIApG ]x)qEi1~ץϥdS-/߀~WB5TVJ0Tt 3LHcgl1ZuV r<;=<*_6 Ѫ:wIl^ig3+#"5 U6(S Z74Y{Yۡnח#9>Z|~\}ָʑ+f`%p+vj9h`U޴޶[ǭJoǦ'1HYpltCΎs"\ }.r3Hw-`"$Wa_yWn{Gh!\-E Ac+HUv\J IgowH#9x>qgu$t&=]$ 'Od*I!I:YD2Iq/ ]Jߡ8~a޸NaE_moDۼiº:C ~t}ߞ<l`8 tmf0J]3yE'fvW+J75mHVHRʅfā+Оn43Ǚ W͕jV4bo0D [N+i*{גI6{) wbL h-3VIuW} P)JFe$JPjfFZkw,-^ bn bʴ wщ}k &o3JFoyYF-G[)1Ulӊ1~Ud&p`~:9rY~ogِl=/mϾ @]]4PA}S"g&``[{Xݢ]ߺk|!eh.l>pE'6) k+2Żw Z`LhMcŽw'FjQ~;m ޺kMmt}o7Vu^n x`X xxi& *_mݹl30fp_Qݽ5V~Sz˹7'go<)n4El7r ]Ӣ>C{sJûGm7] #]'Jw I`;ڎ]M2R}Z <[!'7/^ZE䒿7sӿF:?aOCU ily+]ߨe3W%l񳕇J/يį(>fR=}*5C켙*?򼿬\0n&ujq*'e ~<_\e>LC ": | z^d?@p3:Y1Vn?78ecɮTVGONߊ'Hq7wIkWIK= .ȅ-ǩCPȱq8enai59lhp !iph;o;.鞋M_qe,piq";x\det҄t3">-]Sǖc \?̺A5kU.k[@DXk/H{ʧw5n>vx٣xF3}o1驡 ͞//><گMZ ;Vs&bd$:ѡ ۺ>J.ҳ!۸sRd5S#]uDIY08;ksD Ҍ+Eǂ2|nWhp.茰 t.Ŗ8;ȑhV$1:QX?>YV/z|mR2:H0ePB&_OÝJ^SE =kv]26@YsnB76 _JQ5W7ѫOms ܪ M*xAj8e<h#qp 6@D۷o-ܩwWadxBZ."&x➸ 3>ܻ#.ʼng5Fbxo lvkP;^z7&MԹvfN9VF#箩ܾo/(+@?W1% lR}md(VҰpdl V~~GqIa8U] %0*SLyBXXSué|"VRi9)e"%8~ks!)Z&iqOvnuj!8'E-zi|*~ =x[@+[:&^M}MPlDT_I,iܩ % I Q]Y )6$pK'1Nvu!ʎ%s/8F=?z񬓋ݽZ5B*].RYR稕;~'6_˸ [*d2Z]ǯ (eVq ޻;:^VPh\R̟d'5Nw ?z.smi\xJszӓO8MG65h:Xk)ʩI\t\ u6}uD{ty[7؄F+a5InrmEk-k[1,/q3tJEtFsU f9z;ZC+?{ ŲZ `3C-Yb0/Qkf1ӓy40 "0,cּ{ Ʋ/T/vV5o}|6Vz孱UCXh']- *n=}I'S5ݴ:mbm:յd\Jk?t /56 ȩħ9/Vq)9?yISԲҮfKjS˄Ui?ͽӔDC߼?o2و5\W$/l]ztu4j&<=y}-MmqkRt ׵ܜ!c\gEgQOC˟4p_i ldR*Hh.p 7TᔁL/V  hdW@wIm^*90dR 2qZjxRM{<0R*7${Tcq %&$\YahbӣbOn]v?Ѕ <:$r`jׄF*$02mj>iXPNV}$1y pigMBaNz'"kh.啗Iҡu!D9li h5-\(1.Z{Oɺm kݳ[b6!rC`VM$[+ElNȻqF= >B$4= "FA ,l pzzP:ԇ`e6tW6>#}B@F (Nqv5lfnEͫlXn+XC]/Zi 6J`6c@瀍W~+pa^ʪ-ܪ~&ýNV(7(昼R'j.HG\nmsʑ*Wza cWmo)?7s޿+Y`:~io^~۬8H޳I0I]$>y3̍Jk8wJvvNJ&\nH3lfkq,m)GI/h]B"WmΊ 4e~3vG;g}* gL8p`C ξ+yݣҼt"rl!0N6XN \FȐ6ASAmH~ /ԁaUa )1cQZVk,$я7<"ʣy^-;l>X8Xpt9r4T/@ ZuR#Rn:URGn!u;CZJNgχ0Uvh(uU+X^^32&6;hS sFz^ E;^Z|͗pǒr(ԬW޿}pAߛF&uxGߵׁ \ ɱ,J;shK Lhh)}Z76{ 8F8F AoF5SH&=I(M0 %d,QQ22dD`D@ $ d(9(YA".vξw̜Uuݯni+U)i7h X`%H òSYZ'#qkA\<09 _b!^p@em#)0w'n1h* |4±wKS]4%]oϽ5Tnd%TB_]y"gr+~#P[Bw@SIVgN44@!Wy,Ogϒ戣1B#xSU֣daY0|ZO0 ?W$sB #PuPb:PLI"%&enwJ/7 ?\ bJ]X-"}I_ >.$v?ZP@bաt1wkEWnp|.G7phqڱ2@Ԓjӛoi͊'͋d,Yx&+ͼIz=;5 lY yPsN$XZĤqHp*8^})9'S[ud)+b]$*J`W%# oRάqw'abiBk.49A:ݙ\jV'8v/vzSvP"wq b6{J$<`}L1ySv*f޺yR// &xQ*,cv/ݻFhXܙts0wIM_)ݓ*_"MI:Η%+{698>t!% $Yaw/caaف5A0:O RDž&̸a48_+{a2"CK亯>Sgj–p#8ƖWk[̛Rm*cDfs783Vtq;!7vfuF}:li4 [1e}Di7MF>9jJ7 j0Ob)>fk5w~vl]W`_9WXzͲ;.FS Co|q]aAd(6{wj1sE)]ß9HR^Im11!HRTw). "0(: Ű >TbtP*LiH3[Ӂz?QZGL:nӼR[R.+MD2;V(Yaab0$E-5& &p@wt 4D}DߞqR܂2$j!8㿖<>쀖ÎE?ӳJ<ݟ)*$" {qۻ~6vZYhV|ZL+ŭ8. R41]xw|L@n%sjnA@,2Sgi[pk" s5i*龫ԚmkJN1|++'ԌE!f%bk:nuҪzW1ce}W{;JlxsCF԰#+qao6W䃥盝y&ྦvN9x۟!;in .yJ}Ew>{)l$v#+㇧j#lU%9ϺT>r$fX]ʓ׶Byi0ɞp~צ=k3;4WD`xJ[g0M6zzF[3"0o>t8+;G{='| a )> Y9fN4 v,Q8Un1'Zoo*ġ89!fYܐS !_.)O>Ioeohӆqݨ܈ Bh|j怞vC}5 xeM~IWc3OQHm&lpiʶ<1e/NͪJQVJ gFl~n#-n7DhۧɤA62)l'ۦSC#6R%[po߃_C=W= 7w/QR)2TV+a7j&1+٘-bȓ|IZmuף,)ݽx2R yэ.Dg@isNmG:1$>a 1VԽw.o@2pS2kxȹ,VG+m{F}kjL&,FxR+r#nZ)z:w^hA߳N+v Ȥ2gSHLwatbϦ,1I䃡I.X[F}#u@4GgjZG) @e䅸!BBNhLߏᢓܒAuXh/_LoQ.UV" tE1.4 (RʲM8v-ƁtM8 X܃0gMҿ3SC%-+؅[1/g< ޕA?B3OwWYٗ4g}jiz< Ǎxu]zgMJ)o>r]7]s#FQ[ vo;neV N{_N,4x3>KNq|0D zoƒN^.0~T?bJXW?_un=G-()Yzcv\혉sJAoKgSأ !Y O`jĘEYG6s\B+?HT}5qk)Jvt[5Z_>1g8A<@<ɢhPȺ'^,k穲oKa${<~W^ޫ>G_dtKMKq9ag%/JNʖa>$8J_ٍ^HF8+Ӂ´>_xYƴʝq}P+2y9Z^=`bQN޳Hɥ¹3-SOꋿ<ёvd>y{݋Iyu$q hEOٓQ_\*$^ n/av+W^VTn.ⰿ!%D7ŭ {. ) ۫Oh+'0x< L | Installation DatabaseVisual C++ 11.0 CRT (x86)Microsoft Corporation Installer:Copyright (C) Microsoft Corporation, All rights reserved.Intel;0'{D371D00B-69EC-3F8E-A622-74710A89ADC1}@`Y.@`Y.)Windows Installer XML - SOC (3.6.3408.0) """)))***++++++11199999IIOOOOOOOO]]]^^^_____fffffggggghhhkkknnnnnoooooss  #%'#%'#%'%+-0361EG#<?BJM'3MORUWY#%'#%'#%'bd#%'bd#%'bd+YjWYj#%'bd#%'bds                    171K++O_fg+kkno%%%%.G=@SWY%%%%%W%%! $&($&($&(5,/248DFH;:>ACLN\[QPTVXZ$&($&(`ace`ace`aceimlrqp`ace`aceutvz}w{~xxxy|33xxy|vz}[ ) vz} ")*+19IO]^_fghknos""")))***++++++11199999IIOOOOOOOO]]]^^^_____fffffggggghhhkkknnnnnoooooss  #%'#%'#%'+-03%61EG#<?BJMOMRUWY3'#%'#%'#'bd%#'bd%#'bd%+jYjYW#'bd%#'bd%s  HHHH&HHHHHH&HHHHHH@@@@@@HHH @@@@H %    /6$ B !o ; >   ' S^ . : W ) !s9c%A?vJ  )   " =  #>0;&8;;&;>&><9;     <  :t are permittedDescription of co\މ$ 1jt,d0enceActionName of action to invoke, either in the engine or the handler DLL.ConditionOptional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.SequenceNumber that determines the sort order in which the actions are to be executed. Leave blank to suppress action.AdminUISequenceAdvtExecuteSequenceComponentPrimary key used to identify a particular component record.ComponentIdGuidA string GUID unique to this component, version, and language.Directory_DirectoryRequired key of a Directory table record. This is actually a property name whose value contains the actual path, set either by the AppSearch action or with the default setting obtained from the Directory table.AttributesRemote execution option, one of irsEnumA conditional statement that will disable this component if the specified condition evaluates to the 'True' state. If a component is disabled, it will not be installed, regardless of the 'Action' state associated with the component.KeyPathFile;Registry;ODBCDataSourceEither the primary key into the File table, Registry table, or ODBCDataSource table. This extract path is stored when the component is installed, and is used to detect the presence of the component and to return the path to it.CustomActionPrimary key, name of action, normally appears in sequence table unless private use.The numeric custom action type, consisting of source location, code type, entry, option flags.SourceCustomSourceThe table reference of the source of the code.TargetFormattedExcecution parameter, depends on the type of custom actionExtendedTypeA numeric custom action type that extends code type or option flags of the Type column.Unique identifier for directory entry, primary key. If a property by this name is defined, it contains the full path to the directory.Directory_ParentReference to the entry in this table specifying the default parent directory. A record parented to itself or with a Null parent represents a root of the install tree.DefaultDirThe default sub-path under parent's path.FeatureComponentsFeature_FeatureForeign key into Feature table.Component_Foreign key into Component table.FilePrimary key, non-localized token, must match identifier in cabinet. For uncompressed files, this field is ignored.Foreign key referencing Component that controls the file.FileNameFilenameFile namTableTypeColumnIdentifier_ValidationValueNPropertyId_SummaryInformationDescriptionSetCategoryKeyTableMaxValueNullableKeyColumnMinValueName of tableName of columnY;NWhether the column is nullableYMinimum value allowedMaximum value allowedFor foreign key, Name of table to which data must linkColumn to which foreign key connectsText;Formatted;Template;Condition;Guid;Path;Version;Language;Identifier;Binary;UpperCase;LowerCase;Filename;Paths;AnyPath;WildCardFilename;RegPath;CustomSource;Property;Cabinet;Shortcut;FormattedSDDLText;Integer;DoubleInteger;TimeDate;DefaultDirString categoryTextSet of values that are permittedDescription of columnAdminExecuteSequenceActionName of action to invoke, either in the engine or the handler DLL.ConditionOptional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.SequenceNumber that determines the sort order in which the actions are to be executed. Leave blank to suppress action.AdminUISequenceAdvtExecuteSequenceComponentPrimary key used to identify a particular component record.ComponentIdGuidA string GUID unique to this component, version, and language.Directory_DirectoryRequired key of a Directory table record. This is actually a property name whose value contains the actual path, set either by the AppSearch action or with the default setting obtained from the Directory table.AttributesRemote execution option, one of irsEnumA conditional statement that will disable this component if the specified condition evaluates to the 'True' state. If a component is disabled, it will not be installed, regardless of the 'Action' state associated with the component.KeyPathFile;Registry;ODBCDataSourceEither the primary key into the File table, Registry table, or ODBCDataSource table. This extract path is stored when the component is installed, and is used to detect the presence of the component and to return the path to it.CustomActionPrimary key, name of action, normally appears in sequence table unless private use.The numeric custom action type, consisting of source location, code type, entry, option flags.SourceCustomSourceThe table reference of the source of the code.TargetFormattedExcecution parameter, depends on the type of custom actionExtendedTypeA numeric custom action type that extends code type or option flags of the Type column.Unique identifier for directory entry, primary key. If a property by this name is defined, it contains the full path to the directory.Directory_ParentReference to the entry in this table specifying the default parent directory. A record parented to itself or with a Null parent represents a root of the install tree.DefaultDirThe default sub-path under parent's path.FeatureComponentsFeature_FeatureForeign key into Feature table.Component_Foreign key into Component table.FilePrimary key, non-localized token, must match identifier in cabinet. For uncompressed files, this field is ignored.Foreign key referencing Component that controls the file.FileNameFilenameFile name used for installation, may be localized. This may contain a "short name|long name" pair.FileSizeSize of file in bytes (long integer).VersionVersion string for versioned files; Blank for unversioned files.LanguageList of decimal language Ids, comma-separated if more than one.Integer containing bit flags representing file attributes (with the decimal value of each bit position in parentheses)Sequence with respect to the media images; order must track cabinet order.InstallExecuteSequenceInstallUISequenceModuleAdminExecuteSequenceAction to insertStandard Sequence numberBaseActionBase action to determine insert location.AfterBefore (0) or After (1)ModuleAdminUISequenceModuleAdvtExecuteSequenceModuleComponentsComponent contained in the module.ModuleIDModuleSignatureModule containing the component.Default language ID for module (may be changed by transform).ModuleInstallExecuteSequenceModuleInstallUISequenceModule identifier (String.GUID).Default decimal language of module.Version of the module.PropertyName of property, uppercase if settable by launcher or loader.String value for property. Never null or empty.C_CENTRAL_msvcr110_x86.D371D00B_69EC_3F8E_A622_74710A89ADC1{F5CBD6DC-5C9C-430E-83A7-179BA49988CD}SystemFolder_x86_VC.D371D00B_69EC_3F8E_A622_74710A89ADC1F_CENTRAL_msvcr110_x86.D371D00B_69EC_3F8E_A622_74710A89ADC1C_CENTRAL_msvcp110_x86.D371D00B_69EC_3F8E_A622_74710A89ADC1{0E7F74F7-0943-4AFE-AA5D-5DAE3B49A19F}F_CENTRAL_msvcp110_x86.D371D00B_69EC_3F8E_A622_74710A89ADC1C_CENTRAL_vccorlib110_x86.D371D00B_69EC_3F8E_A622_74710A89ADC1{1981D1A7-C996-4E04-957B-58FB178962C6}VersionNT >= 601F_CENTRAL_vccorlib110_x86.D371D00B_69EC_3F8E_A622_74710A89ADC1CA_WindowsFolder_x86_VC.D371D00B_69EC_3F8E_A622_74710A89ADC1WindowsFolder_x86_VC.D371D00B_69EC_3F8E_A622_74710A89ADC1[WindowsFolder]CA_SystemFolder_x86_VC.D371D00B_69EC_3F8E_A622_74710A89ADC1[SystemFolder]TARGETDIRSourceDirSystemWinmsvcr110.dll11.0.51106.11033msvcp110.dlltc_0zgyg.dll|vccorlib110.dllCostInitializeMicrosoft_VC110_CRT_x86.D371D00B_69EC_3F8E_A622_74710A89ADC1InstallFilesRemoveFiles11.0ALLUSERS1DirectoryTable100_x86.D371D00B_69EC_3F8E_A622_74710A89ADC1DirectoryTable0h *H Y0U1 0 +0g +7Y0W02 +70$ F0!0 +ܠP*Gjv }__`/003'80  *H 0y1 0 UUS10U Washington10URedmond10U Microsoft Corporation1#0!UMicrosoft Code Signing PCA0 120904214209Z 130304214209Z01 0 UUS10U Washington10URedmond10U Microsoft Corporation1 0 U MOPR10UMicrosoft Corporation0"0  *H 0 Il"e;abt)qX^W ibn6N"ya%X,12>tW6SAiimVn&Msdqa!hX[I50Szk+!gtxa|*gٺc}~H=uc )9AT8Td@7 "0# kYୟ`L bZxvlL8G 0 0U% 0 +0UQJ?óe,0U#0ҴX7.3L 0VUO0M0KIGEhttp://crl.microsoft.com/pki/crl/products/MicCodSigPCA_08-31-2010.crl0Z+N0L0J+0>http://www.microsoft.com/pki/certs/MicCodSigPCA_08-31-2010.crt0  *H *&zbx[ħxS( B?8d5HzOGڇLږdρ3x|mqaNds?{'4R?GCpSK*w{nF(1Ji]3,Հ_89]d7\;Q[]_4_(UpT|UF[((VL H*03 lióN07ԘRԩ#E\AIObh 00U3S?`CƯ+X0U#0#4RFp @v+50TUM0K0IGEChttp://crl.microsoft.com/pki/crl/products/MicrosoftTimeStampPCA.crl0X+L0J0H+0ok:t/2BN#r5W ʮ IhMKyKqG%ߝuϪsDׁ6\Eܯ=(hrsV5rv_wE8s[gRi/ t)v/T0Yҍb_F1P'@0r)("7N=2=͡8\NV(*2KOc-bE=F[&SzJF7<8w\V< _^0Z0U00UҴX7.3L 0 U0 +70# +71N&`;1o<-0 +7  SubCA0U#0`@V'%* SY0PUI0G0ECA?http://crl.microsoft.com/pki/crl/products/microsoftrootcert.crl0T+H0F0D+08http://www.microsoft.com/pki/certs/MicrosoftRootCert.crt0  *H Y9>&Fo@2j/nI_uL;-C -1#|P!]=/LVpyIr>A i˥ - PV-JҼp VชKWB4HXa:?wSږP1,p 1¨U/p36RpQEX>(cXbZK|_w_ Iig.i"1= $ !a[퇇CdKZPIofjv'٦>!?%۽T ugK)ȗ`չ90(0$ *H  1000w1 0 UUS10U Washington10URedmond10U Microsoft Corporation1!0UMicrosoft Time-Stamp PCA3+92HH+0 +]0 *H  1  *H 0 *H  1 121106145520Z0# *H  1PH# +I ~R0  *H \uG>EfPD q3PB`E yA_aVnc1 {/]]kӫȂeR^T:Gw`ӌU\M۝SÌ$i#֤s!锉'](x<*EpF9XWeZ-CEQ ? G/[hFݿ1 _;byoI雏\af㧲bQwo펟ߺϙ}D'P7„uH #,*GXXab2eH(_gUVE`% K_K_K_K_K_K_k_k_k_k_k_k_k.{kMqIkK%IkIkIkIkIkIkIkIkIkIkI`Q\QxJ+V(QXC*uɺ*ӴqopSwY1OD *kER.*S i`'Lr1c C cxaC;[ۀ}?mŭcK0=tˬшhrRxn5~B9Uo%YdeƸ%O&ĩ31 ET"gISY94D_~#{zBN|kg}nl[W?>r'[tpB"uw?.r'[s""u?.r'[sp#"uW?>r'[sC"uW?>r'[sp#"uW/.r'[spC"u7>r'[spC"uw7>r'[spC"uw7>n'[ aܹ|N7D,KCN2'ov7C_Dcp~|N¹!=_\ȝln\ȝln 3ȝln ȝln \ȝln]ȝl-sB"uG.r'[s"O{B]^2'[x /όhL%vȝl.\N;xsEcۧ9.\N;8s:^5W=ֵsj&j⪾*4bfG+ =f\nsu433L"vڣvnEۋkl5K=\||c8c` 7h7=jf`G Ӏ0^#'yf1UL,|1ܳLy_3g㊄[]IQ.:(a-R,f%[(^axH܆&R* Ik&qjxXFBEtkm;I,Ly\"ڟ5S(R(ѧU([qS+c̲[V 8'mIx]-rjUnT_F2jT$ ʵ5@=Y`R;i^+ܵE >d:ۂ[ʁC{%Eu]'`5ISZ4zdS\Cʕ5Ricr*2KvrH$F5s趣b4RT;:H{CAYL`fSC1DBC#d<!U)*?pwQ0lk: Q]vBok" 6OG ]RW5g4SM:9T)І2Mx%&},WQ*$=b7<܊4}oV{‡q25}*<ѠIvɶW6Y{L= ׭2b)Cp_fƧkSk5ND-CݫRߡ+Fiq+e7N١'f?7k湪SJV_emq2i .1*rḦ́LE v][J *4BBHq$ͣ)kYRM9K$ vhM}52@IP-~ߦTYKHXX Ls5s=9]0hH|aϯO,.ϯO,.>}hS}_?,_X:/{1[{؎z3t{Tunb9-нG=Sźc8BLg^# s1_{؎z3tO{tunb9-нG=Sźc:BK^# s1[{َzs/{Tqnb-źc8BLx~BL^#s3[{؎{3/{tu~b9ίнG=9պc:@LgWv#s1_{؎{3t/{tq~b9-нG=źc:@kb|[{9-=G=!{؎{3yd^?XV#)s1[{؎|t{ϔunb9έ=G>Rպ,8-"ËH,8-"ËH,8-"ËH,8-"ËH,8-"ËH,8-"ËH,8-"ËH,8-"ËH,8-"ËH,8-"ËH,8-"ËH,8-"ËH,8-"ËH,8-"ËH,8-"ËH,8/0J""qEd J{*5vN6cq7 n/mfl^&C"e)J"?AQ#j&t/9LC|%0"a4ZB~e(13HD */VPs^QS jg+YH›WzR%`H)|&H~%I%fLWl`:hyTS?\fKH꡷ؕ aMR%f;ge)n4A\#gk2:{*BE"&6Zd,dt&|+*-)NܢR쩒ငn(2wUww`9SJ2hS.t13wE0)T6M]Hj %sw;hؗe)]%R2u^R7-<].=rvbQ!prqSDL[]Pjwu*#q'%lh6:" }J Sɛ•}95ӳBL%ÄDPYDVI C*xМVމњG)(jثTsHrab*!b?=Ӊћ]pɢ&p;jm(mc?B 5!1"2AQTa#$%34PqCDSUdv?}90:_uLWxguLYcx}90:gwLYG_+VONJ䩣>ze9dO.;r(f"j;r(f"j;r(f"j;r(f"j;r(f"j;r(f"j;r(f"j;r(f"j;r(f"j;r(f¯F]yGQGy'FnEoݧO54oϻ7Y1ȣz99Gͪlȣu7Y1cu7Y1ȣu7Yqȣu7Y1ȣu7Y1ȣu7Y1ȣutQ抟lu 7yxo'jj>il__Tqf"j;r8f"j;r8f#j;*5X|τH#Ld:(k65&6W 0HiQ=csU5UT8 ]nHdr;}hKc6H>+d-ĐR3 m3nΟ =(!1AQaqP 0@?!Y<lH,xˏ؆^vBcK|zwx= ][ǀs`/̼{l}%6 ~dXz>6!?=Dɘ֡*lC{7X4 ( hc7lo)yK^R򗔼/)yK^R򗔼/)yK^R򗔼/)yK^R򗔼/)yK^R򗔼/)yK^R򗔼/)yK^R򗔼/)yK^R/|qaVdn00PuZZ®GKG.Qrm8E06@d,XXb`@Gv̰ zs("(hHSѐ&lGqoF>EͱhJ&*GD yݱ pKO&`q0 r Pin ` d@ D6hDG֔ Re{Y9F4L%щ`'@_$v 7L$Wj.f8$g!0'[%^LR/Aαd ~0F>dRr_Psc\ћ7 0iĥSk8@ߐbXJXB ).q#AV4 r*_ {12se4N- 6mmmmmmm`ĩ$O@qTǐ'!1AQaq P?[+ނ辅˅ye=ջXCv]Bx_&`-Hʙ`t[C mu fkBtK訦hjmQjn҃8kQ9*kj>*?= G7`2~j%6V{|1 jKyQ-w |:Kn˵I5I>Ǡpƹ=[$dUYA t+ '`3$`AC( ~DK"1'2lD7k[&-ygI*'rP^B`M)Q]Bh*r{= BA38`ȕb.JͧGjKD(H&N?%&vz+P)qՏ m(s@L(Fa$au˞;)x [Ф!HR#*s;Q;H.W$4^&i#`=lP6jv\2K*uR{f{U kJ$d"E ¤d$VD!S.f%WaR4p愕 D]8r o~hԔG(a!1qQA Pᐠ? @_6^{<'M@!ܞ;;*v /b s^"`j9vY_<w%'߅jVbt?b5 T8"o7\A^W.ώ+JD{l_T*Wv%zh˥XIi2>>:pU\cQM?t*,`&Y@d])IU ǶC]P$wSbS@dj:?{V|ݟm8yʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟʟ'狀@uA%BK{OEA hF l =q,$XbHs ǵL.`Ab j1VeYJЃO^@LTA ?T'`0δ9j5.(1FIr Kh`Sǥu" f;CHPz$r#6(,j.# cp8I;>t6eZU (j /LKQ! A[&9j!(hknmU`"Mc䑕n\Ř~`)#[܎(׌$QH)!a1AQqP?!? }G*wd} gWWI{ۊ}4KoZw-EK"6L@b{Дisx.gzE&*G(=zd((Sdz-(_/B5#t:*no"<\S@4cab0@B( w*޻ 5 A P%q8XA T B@+@ = ynTx1{q8]ڂq0wQ q f@2 E HK%3r(5&$!X(]A 2!".Pz@@8rj9BAo^ &=qBnZ\(eWljM]Q5v&D(eWljM]Q5v&D(eWljM]Q5v&D(eWljM]Q5v&D(eWljM]Q5v&D(eWljM]Q5v&D(eWljM]Q5v&D(eWljM][{:Ȁ|x}G!%1 :l (!D QH`(D#]%F)F?)?ZGB#L&nq@ܩ+A~#J9a80q̀*`b2$Xc8 H!H!,*r'p=Pnynh(*BPP }Ghé~"b_ ɪzyzrO5)tEx椅15b6L"}6G6 PȘ@.+β(1BU'B~Ӎ&{8 E@Aʳ_AP W~Fxޛx Q?If"W_SCKjR88/ ^lt !&S8AqBnkL_= 6ב \!)2modsecurity-2.9.5/iis/wix/README.TXT0000664000175000017500000000122314147005233020146 0ustar mhsvierulamhsvierulaPlease note that installing ModSecurity for IIS requires IIS to be installed and enabled. After installing ModSecurity for IIS, the module will be running in all websites by default. To remove from a website add to web.config: To configure module in a website add to web.config: where configFile is standard ModSecurity config file. Events from the module will show up in "Application" Windows log. modsecurity-2.9.5/iis/moduleconfig.cpp0000664000175000017500000003761214147005233021173 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #define WIN32_LEAN_AND_MEAN #undef inline #define inline inline // IIS7 Server API header file #include "httpserv.h" // Project header files #include "mymodule.h" #include "mymodulefactory.h" #include "moduleconfig.h" HRESULT MODSECURITY_STORED_CONTEXT::Initialize( IHttpContext * pW3Context, IAppHostConfigException ** ppException ) { HRESULT hr = S_OK; IAppHostAdminManager *pAdminManager = NULL; IAppHostElement *pSessionTrackingElement = NULL; IAppHostPropertyException *pPropertyException = NULL; PCWSTR pszConfigPath = pW3Context->GetMetadata()->GetMetaPath(); BSTR bstrUrlPath = SysAllocString( pszConfigPath ); pAdminManager = g_pHttpServer->GetAdminManager(); if ( ( FAILED( hr ) ) || ( pAdminManager == NULL ) ) { hr = E_UNEXPECTED; goto Failure; } // Get a handle to the section: hr = pAdminManager->GetAdminSection( MODSECURITY_SECTION, bstrUrlPath, &pSessionTrackingElement ); if ( FAILED( hr ) ) { goto Failure; } if ( pSessionTrackingElement == NULL ) { hr = E_UNEXPECTED; goto Failure; } // Get the property object for the 'enabled' attribute: hr = GetBooleanPropertyValue( pSessionTrackingElement, MODSECURITY_SECTION_ENABLED, &pPropertyException, &m_bIsEnabled); if ( FAILED( hr ) ) { goto Failure; } // If there is a config failure, we cannot continue execution: if ( pPropertyException != NULL ) { ppException = ( IAppHostConfigException** ) &pPropertyException; goto Failure; } if ( m_bIsEnabled == FALSE ) { // There is no point in reading any more of the config associated with the session // tracking section, since this feature is not enabled for the current URL goto Failure; } // Get the property object for the 'configfile' attribute: hr = GetStringPropertyValue( pSessionTrackingElement, MODSECURITY_SECTION_CONFIGFILE, &pPropertyException, &m_pszPath); if ( FAILED( hr ) ) { goto Failure; } // If there is a config failure, we cannot continue execution: if ( pPropertyException != NULL ) { ppException = ( IAppHostConfigException** ) &pPropertyException; goto Failure; } Failure: SysFreeString( bstrUrlPath ); return hr; } HRESULT MODSECURITY_STORED_CONTEXT::GetBooleanPropertyValue( IAppHostElement* pElement, WCHAR* pszPropertyName, IAppHostPropertyException** pException, BOOL* pBoolValue ) { HRESULT hr = S_OK; IAppHostProperty *pProperty = NULL; VARIANT vPropertyValue; if ( ( pElement == NULL ) || ( pszPropertyName == NULL ) || ( pException == NULL ) || ( pBoolValue == NULL ) ) { hr = E_INVALIDARG; goto Failure; } // Get the property object for the BOOLEAN attribute: hr = pElement->GetPropertyByName( pszPropertyName, &pProperty ); if ( FAILED( hr ) ) { goto Failure; } if ( pProperty == NULL ) { hr = E_UNEXPECTED; goto Failure; } // Get the attribute value: VariantInit( &vPropertyValue ); hr = pProperty->get_Value( &vPropertyValue ); if ( FAILED( hr ) ) { goto Failure; } // See it there is an exception that might be due to the actual value in the // config not meeting validation criteria *pException = NULL; hr = pProperty->get_Exception( pException ); if ( FAILED( hr ) ) { goto Failure; } // No need to continue if we got an exception... if ( ( *pException ) != NULL ) { goto Failure; } // Finally, get the value: *pBoolValue = ( vPropertyValue.boolVal == VARIANT_TRUE ) ? TRUE : FALSE; Failure: VariantClear( &vPropertyValue ); if ( pProperty != NULL ) { pProperty->Release(); pProperty = NULL; } return hr; } HRESULT MODSECURITY_STORED_CONTEXT::GetDWORDPropertyValue( IAppHostElement* pElement, WCHAR* pszPropertyName, IAppHostPropertyException** pException, DWORD* pnValue ) { HRESULT hr = S_OK; IAppHostProperty *pProperty = NULL; VARIANT vPropertyValue; if ( ( pElement == NULL ) || ( pszPropertyName == NULL ) || ( pException == NULL ) || ( pnValue == NULL ) ) { hr = E_INVALIDARG; goto Failure; } // Get the property object for the INT attribute: hr = pElement->GetPropertyByName( pszPropertyName, &pProperty ); if ( FAILED( hr ) ) { goto Failure; } if ( pProperty == NULL ) { hr = E_UNEXPECTED; goto Failure; } // Get the attribute value: VariantInit( &vPropertyValue ); hr = pProperty->get_Value( &vPropertyValue ); if ( FAILED( hr ) ) { goto Failure; } // See it there is an exception that might be due to the actual value in the // config not meeting validation criteria *pException = NULL; hr = pProperty->get_Exception( pException ); if ( FAILED( hr ) ) { goto Failure; } // No need to continue if we got an exception... if ( ( *pException ) != NULL ) { goto Failure; } // Finally, get the value: *pnValue = vPropertyValue.ulVal; Failure: VariantClear( &vPropertyValue ); if ( pProperty != NULL ) { pProperty->Release(); pProperty = NULL; } return hr; } HRESULT MODSECURITY_STORED_CONTEXT::GetTimeSpanPropertyValue( IAppHostElement* pElement, WCHAR* pszPropertyName, IAppHostPropertyException** pException, ULONGLONG* pnValue ) { HRESULT hr = S_OK; IAppHostProperty *pProperty = NULL; VARIANT vPropertyValue; if ( ( pElement == NULL ) || ( pszPropertyName == NULL ) || ( pException == NULL ) || ( pnValue == NULL ) ) { hr = E_INVALIDARG; goto Failure; } // Get the property object for the INT attribute: hr = pElement->GetPropertyByName( pszPropertyName, &pProperty ); if ( FAILED( hr ) ) { goto Failure; } if ( pProperty == NULL ) { hr = E_UNEXPECTED; goto Failure; } // Get the attribute value: VariantInit( &vPropertyValue ); hr = pProperty->get_Value( &vPropertyValue ); if ( FAILED( hr ) ) { goto Failure; } // See it there is an exception that might be due to the actual value in the // config not meeting validation criteria *pException = NULL; hr = pProperty->get_Exception( pException ); if ( FAILED( hr ) ) { goto Failure; } // No need to continue if we got an exception... if ( ( *pException ) != NULL ) { goto Failure; } // Finally, get the value: *pnValue = vPropertyValue.ullVal; Failure: VariantClear( &vPropertyValue ); if ( pProperty != NULL ) { pProperty->Release(); pProperty = NULL; } return hr; } HRESULT MODSECURITY_STORED_CONTEXT::GetStringPropertyValue( IAppHostElement* pElement, WCHAR* pszPropertyName, IAppHostPropertyException** pException, WCHAR** ppszValue ) { HRESULT hr = S_OK; IAppHostProperty *pProperty = NULL; DWORD dwLength; VARIANT vPropertyValue; if ( ( pElement == NULL ) || ( pszPropertyName == NULL ) || ( pException == NULL ) || ( ppszValue == NULL ) ) { hr = E_INVALIDARG; goto Failure; } *ppszValue = NULL; // Get the property object for the string attribute: hr = pElement->GetPropertyByName( pszPropertyName, &pProperty ); if ( FAILED( hr ) ) { goto Failure; } if ( pProperty == NULL ) { hr = E_UNEXPECTED; goto Failure; } // Get the attribute value: VariantInit( &vPropertyValue ); hr = pProperty->get_Value( &vPropertyValue ); if ( FAILED( hr ) ) { goto Failure; } // See it there is an exception that might be due to the actual value in the // config not meeting validation criteria *pException = NULL; hr = pProperty->get_Exception( pException ); if ( FAILED( hr ) ) { goto Failure; } // No need to continue if we got an exception... if ( ( *pException ) != NULL ) { goto Failure; } // Finally, get the value: dwLength = SysStringLen( vPropertyValue.bstrVal ); *ppszValue = new WCHAR[ dwLength + 1 ]; if ( (*ppszValue) == NULL ) { hr = E_OUTOFMEMORY; goto Failure; } wcsncpy( *ppszValue, vPropertyValue.bstrVal, dwLength ); (*ppszValue)[ dwLength ] = L'\0'; Failure: VariantClear( &vPropertyValue ); if ( pProperty != NULL ) { pProperty->Release(); pProperty = NULL; } return hr; } MODSECURITY_STORED_CONTEXT::~MODSECURITY_STORED_CONTEXT() { if ( m_pszPath != NULL ) { delete [] m_pszPath; m_pszPath = NULL; } } MODSECURITY_STORED_CONTEXT::MODSECURITY_STORED_CONTEXT(): m_bIsEnabled ( FALSE ), m_pszPath( NULL ), m_Config( NULL ) { } DWORD MODSECURITY_STORED_CONTEXT::GlobalWideCharToMultiByte( WCHAR* pSource, DWORD dwLengthSource, CHAR** ppszDestination, USHORT* pdwLengthDestination ) { DWORD dwResult = NULL; DWORD dwCount = 0; if ( ( pSource == NULL ) || ( ppszDestination == NULL ) || ( pdwLengthDestination == NULL ) ) { dwResult = ERROR_INVALID_PARAMETER; goto Exit; } // Initialize result length *pdwLengthDestination = 0; *ppszDestination = NULL; dwCount = WideCharToMultiByte( CP_ACP, 0, pSource, dwLengthSource + 1, *ppszDestination, 0, NULL, NULL ); if ( 0 == dwCount ) { dwResult = GetLastError (); if ( dwResult == 0 ) { dwResult = ERROR_INVALID_DATA; } goto Exit; } *ppszDestination = new CHAR[ dwCount + 1 ]; if ( NULL == ( *ppszDestination ) ) { dwResult = ERROR_OUTOFMEMORY; goto Exit; } // Make sure the memory is 'clean': SecureZeroMemory( ( *ppszDestination ), ( dwCount + 1 ) * sizeof ( CHAR ) ); if ( 0 == WideCharToMultiByte( CP_ACP, 0, pSource, dwLengthSource + 1, *ppszDestination, dwCount, NULL, NULL ) ) { dwResult = GetLastError(); goto Exit; } *pdwLengthDestination = ( USHORT )dwCount; Exit: if ( dwResult != 0 ) { // Make sure we do the proper cleanup in the error case: if ( pdwLengthDestination != NULL ) { *pdwLengthDestination = 0; } if ( ppszDestination != NULL ) { if ( ( *ppszDestination ) != NULL ) { delete [] ( *ppszDestination ); ( *ppszDestination ) = NULL; } } } return dwResult; } HRESULT MODSECURITY_STORED_CONTEXT::GetConfig( IHttpContext * pContext, MODSECURITY_STORED_CONTEXT ** ppModuleConfig ) { HRESULT hr = S_OK; MODSECURITY_STORED_CONTEXT * pModuleConfig = NULL; IHttpModuleContextContainer * pMetadataContainer = NULL; IAppHostConfigException * pException = NULL; pMetadataContainer = pContext->GetMetadata()->GetModuleContextContainer(); if ( pMetadataContainer == NULL ) { hr = E_UNEXPECTED; return hr; } pModuleConfig = (MODSECURITY_STORED_CONTEXT *)pMetadataContainer->GetModuleContext( g_pModuleContext ); if ( pModuleConfig != NULL ) { // // We found stored data for this module for the metadata // object which is different for unique configuration path // *ppModuleConfig = pModuleConfig; return S_OK; } // // If we reach here, that means this is first request or first // request after a configuration change IIS core will throw stored context away // if a change notification arrives for this metadata path // pModuleConfig = new MODSECURITY_STORED_CONTEXT(); if ( pModuleConfig == NULL ) { return E_OUTOFMEMORY; } // // Read module configuration data and store in MODSECURITY_STORED_CONTEXT // hr = pModuleConfig->Initialize( pContext, &pException ); if ( FAILED( hr ) || pException != NULL ) { pModuleConfig->CleanupStoredContext(); pModuleConfig = NULL; hr = E_UNEXPECTED; return hr; } // // Store MODSECURITY_STORED_CONTEXT data as metadata stored context // hr = pMetadataContainer->SetModuleContext( pModuleConfig, g_pModuleContext ); if ( FAILED( hr ) ) { pModuleConfig->CleanupStoredContext(); pModuleConfig = NULL; // // It is possible that some other thread stored context before this thread // could do. Check returned hr and return context stored by other thread // if ( hr == HRESULT_FROM_WIN32( ERROR_ALREADY_ASSIGNED ) ) { *ppModuleConfig = (MODSECURITY_STORED_CONTEXT *)pMetadataContainer->GetModuleContext( g_pModuleContext ); return S_OK; } } *ppModuleConfig = pModuleConfig; return hr; } modsecurity-2.9.5/iis/mlogc.vcxproj0000664000175000017500000002062214147005233020523 0ustar mhsvierulamhsvierula Custom Debug Win32 Custom Debug x64 Debug Win32 Debug x64 Release Win32 Release x64 {DD595511-33F2-475A-B36F-2A6B27E03FA0} Win32Proj mlogc Application true v120 Unicode Application true v120 Unicode Application false v120 true Unicode v120 v120 v120 _MBCS;%(PreprocessorDefinitions);WIN32;WINNT;inline=APR_INLINE;AP_DECLARE_STATIC NotUsing dependencies\build_dir\pcre\include;dependencies\build_dir\pcre;dependencies\build_dir\libxml2\include;..\apache2;..\standalone;dependencies\build_dir\apache24\include;dependencies\build_dir\lloyd-yajl-f4b2b1a\build\yajl-2.0.1\include;dependencies\build_dir\curl\include; Console kernel32.lib;IPHLPAPI.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies);dependencies\build_dir\apache24\lib\libapr-1.lib;dependencies\build_dir\apache24\lib\libaprutil-1.lib;dependencies\build_dir\pcre\pcre.lib;dependencies\build_dir\libxml2\win32\bin.msvc\libxml2.lib;dependencies\build_dir\yajl\build\yajl-2.0.1\lib\yajl.lib;dependencies\build_dir\curl\builds\libcurl-vc-x64-release-dll-zlib-dll-ipv6-sspi-winssl-obj-lib\libcurl.lib; false _MBCS;%(PreprocessorDefinitions);WIN32;WINNT;inline=APR_INLINE;AP_DECLARE_STATIC NotUsing dependencies\build_dir\pcre\include;dependencies\build_dir\pcre;dependencies\build_dir\libxml2\include;..\apache2;..\standalone;dependencies\build_dir\apache24\include;dependencies\build_dir\lloyd-yajl-f4b2b1a\build\yajl-2.0.1\include;dependencies\build_dir\curl\include; Console kernel32.lib;IPHLPAPI.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies);dependencies\build_dir\apache24\lib\libapr-1.lib;dependencies\build_dir\apache24\lib\libaprutil-1.lib;dependencies\build_dir\pcre\pcre.lib;dependencies\build_dir\libxml2\win32\bin.msvc\libxml2.lib;dependencies\build_dir\yajl\build\yajl-2.0.1\lib\yajl.lib;dependencies\build_dir\curl\builds\libcurl-vc-x64-release-dll-zlib-dll-ipv6-sspi-winssl-obj-lib\libcurl.lib; false _MBCS;%(PreprocessorDefinitions);WIN32;WINNT;inline=APR_INLINE;AP_DECLARE_STATIC NotUsing dependencies\build_dir\pcre\include;dependencies\build_dir\pcre;dependencies\build_dir\libxml2\include;..\apache2;..\standalone;dependencies\build_dir\apache24\include;dependencies\build_dir\lloyd-yajl-f4b2b1a\build\yajl-2.0.1\include;dependencies\build_dir\curl\include; Console kernel32.lib;IPHLPAPI.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ws2_32.lib;%(AdditionalDependencies);dependencies\build_dir\apache24\lib\libapr-1.lib;dependencies\build_dir\apache24\lib\libaprutil-1.lib;dependencies\build_dir\pcre\pcre.lib;dependencies\build_dir\libxml2\win32\bin.msvc\libxml2.lib;dependencies\build_dir\yajl\build\yajl-2.0.1\lib\yajl.lib;dependencies\build_dir\curl\builds\libcurl-vc-x64-release-dll-zlib-dll-ipv6-sspi-winssl-obj-lib\libcurl.lib; false modsecurity-2.9.5/iis/mymodule.def0000664000175000017500000000007114147005233020314 0ustar mhsvierulamhsvierulaLIBRARY "ModSecurityIIS" EXPORTS RegisterModule modsecurity-2.9.5/iis/Makefile.win0000664000175000017500000000736114147005233020246 0ustar mhsvierulamhsvierula########################################################################### # # Usage: NMAKE -f Makefile.win APACHE={httpd installion dir} PCRE={pcre dir} LIBXML2={LibXML2 dir} [ LUA={Lua dir} ] # !IF "$(APACHE)" == "" || "$(PCRE)" == "" || "$(LIBXML2)" == "" || "$(CURL)" == "" !ERROR NMAKE arguments: APACHE=dir PCRE=dir LIBXML2=dir CURL=dir are required to build mod_security2 for Windows !ENDIF # Linking libraries LIBS = $(APACHE)\lib\libapr-1.lib \ $(APACHE)\lib\libaprutil-1.lib \ $(PCRE)\pcre.lib \ $(CURL)\libcurl.lib \ $(LIBXML2)\win32\bin.msvc\libxml2.lib \ "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" \ "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" "ws2_32.lib" \ "iphlpapi.lib" # $(SSDEEP)\fuzzy.lib \ ########################################################################### ########################################################################### CC = CL LINK = link.exe MT = mt DEFS = /nologo /O2 /LD /W3 /wd4244 /wd4018 -DWITH_YAJL -DWIN32 -DWINNT -Dinline=APR_INLINE -DAP_DECLARE_STATIC -D_MBCS -D$(VERSION) DLL = ModSecurityIIS.dll INCLUDES = -I. -I.. \ -I$(YAJL)\.. \ -I$(PCRE)\include -I$(PCRE) \ -I$(LIBXML2)\include \ -I$(CURL)\include -I$(CURL) \ -I$(APACHE)\include \ -I..\apache2 \ -I..\standalone # Enables support for SecRemoteRules, external resources and enable optimization for large stream input by default on IIS. DEFS=$(DEFS) -DWITH_CURL -DWITH_REMOTE_RULES -DMSC_LARGE_STREAM_INPUT # -I$(SSDEEP) \ # Lua is optional !IF "$(LUA)" != "" LIBS = $(LIBS) $(LUA)\lua5.1.lib DEFS=$(DEFS) -DWITH_LUA INCLUDES = $(INCLUDES) -I$(LUA)\include -I$(LUA) \ !ENDIF # Yajl/Json is optional !IF "$(YAJL)" != "" LIBS = $(LIBS) $(YAJL)\lib\yajl.lib DEFS=$(DEFS) -DWITH_YAJL INCLUDES = $(INCLUDES) -I$(YAJL)\include -I$(YAJL) \ !ENDIF # ssdeep is optional # !IF "$(SSDEEP)" != "" # LIBS = $(LIBS) $(SSDEEP)\fuzzy.lib # DEFS=$(DEFS) -DWITH_SSDEEP # INCLUDES = $(INCLUDES) -I$(SSDEEP)\include -I$(SSDEEP) \ # !ENDIF CFLAGS= -MD /Zi $(INCLUDES) $(DEFS) LDFLAGS = /DEF:"mymodule.def" /DEBUG /OPT:REF /OPT:ICF /MANIFEST /ManifestFile:"ModSecurityIIS.dll.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /TLBID:1 /DYNAMICBASE /NXCOMPAT OBJS1 = mod_security2.obj apache2_config.obj apache2_io.obj apache2_util.obj \ re.obj re_operators.obj re_actions.obj re_tfns.obj re_variables.obj \ msc_logging.obj msc_xml.obj msc_multipart.obj modsecurity.obj \ msc_parsers.obj msc_util.obj msc_pcre.obj persist_dbm.obj \ msc_reqbody.obj msc_geo.obj msc_gsb.obj msc_unicode.obj acmp.obj msc_lua.obj \ msc_release.obj msc_crypt.obj msc_tree.obj \ msc_status_engine.obj \ msc_json.obj \ msc_remote_rules.obj OBJS2 = api.obj buckets.obj config.obj filters.obj hooks.obj regex.obj server.obj OBJS3 = main.obj moduleconfig.obj mymodule.obj OBJS4 = libinjection_html5.obj \ libinjection_sqli.obj \ libinjection_xss.obj all: $(DLL) dll: $(DLL) $(OBJS1): ..\apache2\$*.c $(CC) $(CFLAGS) -c ..\apache2\$*.c -Fo$@ $(OBJS4): ..\apache2\libinjection\$*.c $(CC) $(CFLAGS) -c ..\apache2\libinjection\$*.c -Fo$@ $(OBJS2): ..\standalone\$*.c $(CC) $(CFLAGS) -c ..\standalone\$*.c -Fo$@ .cpp.obj: $(CC) $(CFLAGS) -c $< -Fo$@ $(DLL): $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(LINK) $(LDFLAGS) $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4) $(LIBS) IF EXIST $(DLL).manifest $(MT) -manifest $(DLL).manifest -outputresource:$(DLL);#1 clean: del /f *.obj del /f *.dll del /f *.exp del /f *.lib modsecurity-2.9.5/iis/dependencies/0000775000175000017500000000000014147005233020431 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/iis/dependencies/build_yajl.bat0000664000175000017500000000245514147005233023245 0ustar mhsvierulamhsvierulacd "%WORK_DIR%" @if NOT EXIST "%SOURCE_DIR%\%YAJL%" goto file_not_found_bin 7z.exe x "%SOURCE_DIR%\%YAJL%" set YAJL_DIR=%YAJL:~0,-4% echo "%SOURCE_DIR%\%YAJL%" echo "%YAJL_DIR%" pwd move "%YAJL_DIR%" "%WORK_DIR%\yajl" pwd cd "yajl" pwd mkdir build @if NOT (%ERRORLEVEL%) == (0) goto build_failed cd build @if NOT (%ERRORLEVEL%) == (0) goto build_failed cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release .. @if NOT (%ERRORLEVEL%) == (0) goto build_failed nmake @if NOT (%ERRORLEVEL%) == (0) goto build_failed cd "%WORK%" copy /y "%WORK_DIR%\yajl\build\%YAJL_DIR%\lib\yajl.dll" "%OUTPUT_DIR%" :: copy /y "%WORK_DIR%\yajl\build\%YAJL_DIR%\lib\yajl.pdb" "%OUTPUT_DIR%" copy /y "%WORK_DIR%\yajl\build\%YAJL_DIR%\lib\yajl.lib" "%OUTPUT_DIR%" copy /y "%WORK_DIR%\yajl\build\%YAJL_DIR%\lib\yajl_s.lib" "%OUTPUT_DIR%" copy /y "%WORK_DIR%\yajl\build\%YAJL_DIR%\lib\yajl.dll" "%WORK_DIR%\yajl\build\%YAJL_DIR%\include\yajl.dll" copy /y "%WORK_DIR%\yajl\build\%YAJL_DIR%\lib\yajl.lib" "%WORK_DIR%\yajl\build\%YAJL_DIR%\include\yajl.lib" copy /y "%WORK_DIR%\yajl\build\%YAJL_DIR%\lib\yajl_s.lib" "%WORK_DIR%\yajl\build\%YAJL_DIR%\include\yajl_s.lib" @exit /B 0 :file_not_found_bin @echo File not found: "%SOURCE_DIR%\%YAJL%" @goto failed :build_failed @echo Problems during the building phase @goto failed :failed @exit /B 1 modsecurity-2.9.5/iis/dependencies/howto.txt0000664000175000017500000000575214147005233022343 0ustar mhsvierulamhsvierulaThe build process for ModSecurityIIS for Windows was a relatively complicated process. Understanding it required advanced knowledge of Windows and Unix environments. So the build process was refactored to make it easier for users to create their own builds with the automated batch scripts. * build_release.bat -> The main build script that calls all the others to have a working release * build_msi.bat -> Creates the MSI self-installer for easy deploy / removal / distribution * build_dependencies.bat -> Sets (and downloads if needed) all required dependencies * build_modsecurity.bat -> Builds ModSecurity (requires all depenedencies being set) * download_files.bat -> Downloads all required dependencies to the default Downloads folder ** This script is disabled by default. If you want to enable it, uncomment the "@call download_files.bat" line on build_dependencies.bat The dependencies folder also includes a set o batch scripts which sets each dependency on its own. These scripts are called by the build_dependencies.bat script. Using the same versions of libraries as listed below is recommended. -------------------------------------- Compilation Prerequisites: * Windows 7 x86_x64 (Should work on newer versions of Windows too) * Vistual Studio 2013 Express (Other versions should work, but you need to set the correct path for vcvars.bat scripts) * IIS enabled/installed * 7-Zip -------------------------------------- The latest versions of ModSecurity dependencies known to work well are the following: cmake-3.8.2-win32-x86 pcre-8.40 (patch required and included on file "patch-pcre-8.40.vbs") zlib-1.2.11 libxml2-2.9.4 lua-5.3.4 curl-7.54.1 httpd-2.4.27 (bin-VC11) yajl-2.1.0 ssdeep-2.13 -------------------------------------- 1. Create working directory (e.g. c:\work) and drop the latest clone from ModSecurity's 2.x Github (https://github.com/SpiderLabs/ModSecurity/archive/v2/master.zip) 2. Make sure the prerequisites mentioned above are all set 3. If you haven't download the dependency files before, uncomment the "@call download_files.bat" line on build_dependencies.bat to have them downloaded prior 4. Open a command prompt (cmd.exe) and head to the "iis" folder inside ModSecurity tree working directory (e.g. cd c:\work\ModSecurity\iis) 5. If you need to modify anything (e.g. paths, versions etc), carefully edit the batch files. 6. Run build_release.bat 7. When done, the binaries, lib and pdb files should appear under c:\work\ModSecurity\iis\release\x86 (32-bit) and c:\work\ModSecurity\iis\release\amd64 (64-bit) * At this point, if you had a previous installation of ModSecurity and would like to test you can place the x86 files to "C:\Windows\SysWOW64\inetsrv" and x64 files to "C:\Windows\System32\inetsrv" 8. If all went well, you can build the MSI installer by running the build_msi.bat script. * The built installable package places the files to the correct folders, automatically configures the ModSecurity IIS native module and configures web.config to enable ModSecurity for all IIS sites. modsecurity-2.9.5/iis/dependencies/build_curl.bat0000664000175000017500000000205614147005233023250 0ustar mhsvierulamhsvierulacd "%WORK_DIR%" @if NOT EXIST "%SOURCE_DIR%\%CURL%" goto file_not_found_bin echo "7z..." 7z.exe x "%SOURCE_DIR%\%CURL%" echo "Timeout..." timeout 5 echo "Curl..." set CURL_DIR=%CURL:~0,-4% echo "Move..." move "%CURL_DIR%" "curl" echo "Cd..." CD "curl\winbuild" @set ARCH=x86 @call cl 2>&1 | findstr /C:"x64" @if (%ERRORLEVEL%) == (0) set ARCH=x64 nmake /f Makefile.vc mode=dll ENABLE_WINSSL=yes MACHINE=%ARCH% WITH_ZLIB=dll @if NOT (%ERRORLEVEL%) == (0) goto build_failed cd "%WORK_DIR%" copy /y "%WORK_DIR%\curl\builds\libcurl-vc-%ARCH%-release-dll-zlib-dll-ipv6-sspi-schannel-obj-lib\libcurl.dll" "%OUTPUT_DIR%" copy /y "%WORK_DIR%\curl\builds\libcurl-vc-%ARCH%-release-dll-zlib-dll-ipv6-sspi-schannel-obj-lib\libcurl.lib" "%OUTPUT_DIR%" copy /y "%WORK_DIR%\curl\builds\libcurl-vc-%ARCH%-release-dll-zlib-dll-ipv6-sspi-schannel-obj-lib\libcurl.lib" "%WORK_DIR%\curl\libcurl.lib" exit /B 0 :file_not_found_bin @echo File not found: "%SOURCE_DIR%\%CURL%" @goto failed :build_failed @echo Problems during the building phase @goto failed :failed @exit /B 1 -> modsecurity-2.9.5/iis/dependencies/build_pcre.bat0000664000175000017500000000244114147005233023232 0ustar mhsvierulamhsvierula::@if NOT (%ERRORLEVEL%) == (1) Echo "Patch successfull... For more info on patch see: https://vcs.pcre.org/pcre/code/trunk/CMakeLists.txt?r1=1659&r2=1677&view=patch" cd "%WORK_DIR%" @if NOT EXIST "%SOURCE_DIR%\%APACHE_BIN%" goto file_not_found_bin 7z.exe x "%SOURCE_DIR%\%PCRE%" set PCRE_DIR=%PCRE:~0,-4% move "%PCRE_DIR%" "pcre" @if "%PCRE_DIR%" == "pcre-8.40" ( Echo. && Echo "PCRE 8.40 found... trying to patch it to compile cleanly" ::cscript /B /Nologo ../patch-pcre-8.40.vbs cd "pcre" cat CMakeLists.txt | sed "s/PCRE_STATIC_RUNTIME OFF CACHE BOOL/PCRE_STATIC_RUNTIME/g" > CMakeLists.txt.ops move CMakeLists.txt CMakeLists.txt.old move CMakeLists.txt.ops CMakeLists.txt cd .. ) cd "pcre" CMAKE -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_SHARED_LIBS=True @if NOT (%ERRORLEVEL%) == (0) goto build_failed NMAKE @if NOT (%ERRORLEVEL%) == (0) goto build_failed cd "%WORK%" copy /y "%WORK_DIR%\pcre\pcre.dll" "%OUTPUT_DIR%" copy /y "%WORK_DIR%\pcre\pcre.pdb" "%OUTPUT_DIR%" copy /y "%WORK_DIR%\pcre\pcre.lib" "%OUTPUT_DIR%" copy /y "%WORK_DIR%\pcre\pcre.h.generic" "%WORK_DIR%\pcre\pcre.h" echo "a" @exit /B 0 :file_not_found_bin @echo File not found: "%SOURCE_DIR%\%PCRE%" @goto failed :build_failed @echo Problems during the building phase @goto failed :failed @exit /B 1 modsecurity-2.9.5/iis/dependencies/build_apache.bat0000664000175000017500000000255014147005233023523 0ustar mhsvierulamhsvierula@cd "%WORK_DIR%" @set APACHE=%WORK_DIR%\Apache24 @if NOT EXIST "%SOURCE_DIR%\%APACHE_BIN%" goto file_not_found_bin @if NOT EXIST "%SOURCE_DIR%\%APACHE_SRC%" goto file_not_found_src @7z.exe x "%SOURCE_DIR%\%APACHE_BIN%" @if NOT (%ERRORLEVEL%) == (0) goto something_went_wrong @7z.exe x "%SOURCE_DIR%\%APACHE_SRC%" -so | 7z.exe x -aoa -si -ttar @if NOT (%ERRORLEVEL%) == (0) goto something_went_wrong :: Missing: %APACHE%\bin\libapr-1.pdb %APACHE%\bin\libapr-1.lib ? copy /y "%APACHE%\bin\libapr-1.dll" "%OUTPUT_DIR%" @if NOT (%ERRORLEVEL%) == (0) goto something_went_wrong_copy :: Missing: %APACHE%\bin\libapriconv-1.pdb %APACHE%\lib\libapriconv-1.lib ? copy /y "%APACHE%\bin\libapriconv-1.dll" "%OUTPUT_DIR%" @if NOT (%ERRORLEVEL%) == (0) goto something_went_wrong_copy :: Missing: %APACHE%\bin\libaprutil-1.pdb %APACHE%\lib\libaprutil-1.lib ? copy /y "%APACHE%\bin\libaprutil-1.dll" "%OUTPUT_DIR%" @if NOT (%ERRORLEVEL%) == (0) goto something_went_wrong_copy @cd "%WORK_DIR%" @exit /B 0 :something_went_wrong_copy @echo Something went wrong while trying to copy Apache binaries files. @goto failed :file_not_found_bin @echo File not found: %SOURCE_DIR%\%APACHE_BIN% @goto failed :file_not_found_src @echo File not found: %SOURCE_DIR%\%APACHE_SRC% @goto failed :something_went_wrong @echo Something went wrong while unzip Apache files. @goto failed :failed @exit /B 1 modsecurity-2.9.5/iis/dependencies/build_ssdeep.bat0000664000175000017500000000214314147005233023563 0ustar mhsvierulamhsvierulacd "%WORK_DIR%" echo "%SOURCE_DIR%\%SSDEEP%" echo "%SOURCE_DIR%\%SSDEEP_BIN%" @if NOT EXIST "%SOURCE_DIR%\%SSDEEP%" goto build_failed @7z.exe x "%SOURCE_DIR%\%SSDEEP_BIN%" @if NOT (%ERRORLEVEL%) == (0) goto build_failed @7z.exe x "%SOURCE_DIR%\%SSDEEP%" -so | 7z.exe x -aoa -si -ttar @if NOT (%ERRORLEVEL%) == (0) goto build_failed set SSDEEP_DIR=%SSDEEP_BIN:~0,-4% move "%SSDEEP_DIR%" "ssdeep" @if NOT (%ERRORLEVEL%) == (0) goto build_failed cd "%WORK_DIR%\ssdeep\" @if NOT (%ERRORLEVEL%) == (0) goto build_failed @set SSDEEP_ARCH="x86" @call cl 2>&1 | findstr /C:"x64" @if (%ERRORLEVEL%) == (0) set SSDEEP_ARCH="x64" lib /machine:%SSDEEP_ARCH% /def:fuzzy.def @if NOT (%ERRORLEVEL%) == (0) goto build_failed copy /y "%WORK_DIR%\ssdeep\fuzzy.dll" "%OUTPUT_DIR%" @if NOT (%ERRORLEVEL%) == (0) goto build_failed copy /y "%WORK_DIR%\ssdeep\fuzzy.def" "%OUTPUT_DIR%" @if NOT (%ERRORLEVEL%) == (0) goto build_failed copy /y "%WORK_DIR%\ssdeep\fuzzy.lib" "%OUTPUT_DIR%" @if NOT (%ERRORLEVEL%) == (0) goto build_failed @exit /B 0 :build_failed @echo Problems during the building phase @goto failed :failed @exit /B 1 modsecurity-2.9.5/iis/dependencies/build_cmake.bat0000664000175000017500000000054614147005233023365 0ustar mhsvierulamhsvierula@cd "%WORK_DIR%" @if NOT EXIST "%SOURCE_DIR%\%CMAKE%" goto file_not_found @7z.exe x "%SOURCE_DIR%\%CMAKE%" @if NOT (%ERRORLEVEL%) == (0) goto something_went_wrong @exit /B 0 :file_not_found @echo File not found: %SOURCE_DIR%\%CMAKE% @goto failed :something_went_wrong @echo Something went wrong while unzip CMake files. @goto failed :failed @exit /B 1modsecurity-2.9.5/iis/dependencies/build_lua.bat0000664000175000017500000000212314147005233023057 0ustar mhsvierulamhsvierulacd "%WORK_DIR%" @if NOT EXIST "%SOURCE_DIR%\%LUA%" goto file_not_found_bin @7z.exe x "%SOURCE_DIR%\%LUA%" -so | 7z.exe x -aoa -si -ttar set LUA_DIR=%LUA:~0,-7% move "%LUA_DIR%" "lua" cd "lua\src" CL /Ox /arch:SSE2 /GF /GL /Gy /FD /EHsc /MD /Zi /TC /wd4005 /D "_MBCS" /D "LUA_CORE" /D "LUA_BUILD_AS_DLL" /D "_CRT_SECURE_NO_WARNINGS" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_WIN32" /D "_WINDLL" /c *.c @if NOT (%ERRORLEVEL%) == (0) goto build_failed DEL lua.obj luac.obj LINK /DLL /LTCG /DEBUG /OUT:lua5.1.dll *.obj @if NOT (%ERRORLEVEL%) == (0) goto build_failed IF EXIST lua5.1.dll.manifest MT -manifest lua5.1.dll.manifest -outputresource:lua5.1.dll;2 @if NOT (%ERRORLEVEL%) == (0) goto build_failed cd "%WORK_DIR%" copy /y "%WORK_DIR%\lua\src\lua5.1.dll" "%OUTPUT_DIR%" copy /y "%WORK_DIR%\lua\src\lua5.1.pdb" "%OUTPUT_DIR%" copy /y "%WORK_DIR%\lua\src\lua5.1.lib" "%OUTPUT_DIR%" @exit /B 0 :file_not_found_bin @echo File not found: "%SOURCE_DIR%\%LUA%" @goto failed :build_failed @echo Problems during the building phase @goto failed :failed @exit /B 1 modsecurity-2.9.5/iis/dependencies/build_zlib.bat0000664000175000017500000000132514147005233023241 0ustar mhsvierulamhsvierulacd "%WORK_DIR%" @if NOT EXIST "%SOURCE_DIR%\%ZLIB%" goto file_not_found_bin @7z.exe x "%SOURCE_DIR%\%ZLIB%" -so | 7z.exe x -aoa -si -ttar set ZLIB_DIR=%ZLIB:~0,-7% move "%ZLIB_DIR%" "zlib" cd "zlib" nmake -f win32\Makefile.msc @if NOT (%ERRORLEVEL%) == (0) goto build_failed SET INCLUDE=%INCLUDE%;%WORK_DIR%\zlib SET LIB=%LIB%;%WORK_DIR%\zlib cd "%WORK_DIR%" copy /y "%WORK_DIR%\zlib\zlib1.dll" "%OUTPUT_DIR%" copy /y "%WORK_DIR%\zlib\zlib1.pdb" "%OUTPUT_DIR%" copy /y "%WORK_DIR%\zlib\zdll.lib" "%OUTPUT_DIR%" @exit /B 0 :file_not_found_bin @echo File not found: "%SOURCE_DIR%\%ZLIB%" @goto failed :build_failed @echo Problems during the building phase @goto failed :failed @exit /B 1 modsecurity-2.9.5/iis/dependencies/build_libxml2.bat0000664000175000017500000000152514147005233023654 0ustar mhsvierulamhsvierulacd "%WORK_DIR%" @if NOT EXIST "%SOURCE_DIR%\%LIBXML2%" goto file_not_found_bin @7z.exe x "%SOURCE_DIR%\%LIBXML2%" -so | 7z.exe x -aoa -si -ttar set LIBXML2_DIR=%LIBXML2:~0,-7% move "%LIBXML2_DIR%" "libxml2" :: fart.exe -r -i -C "%WORK_DIR%\%LIBXML2_DIR%\win32\*.*" \x2Fopt:nowin98 " " cd "libxml2\win32" CSCRIPT configure.js iconv=no vcmanifest=yes zlib=yes @if NOT (%ERRORLEVEL%) == (0) goto build_failed NMAKE -f Makefile.msvc @if NOT (%ERRORLEVEL%) == (0) goto build_failed cd "%WORK%" copy /y "%WORK_DIR%\libxml2\win32\bin.msvc\libxml2.dll" "%OUTPUT_DIR%" copy /y "%WORK_DIR%\libxml2\win32\bin.msvc\libxml2.lib" "%OUTPUT_DIR%" @exit /B 0 :file_not_found_bin @echo File not found: "%SOURCE_DIR%\%LIBXML2%" @goto failed :build_failed @echo Problems during the building phase @goto failed :failed @exit /B 1 modsecurity-2.9.5/iis/download_files.bat0000664000175000017500000000363614147005233021474 0ustar mhsvierulamhsvierula@set CMAKE=cmake-3.12.4-win32-x86.zip @set PCRE=pcre-8.41.zip @set ZLIB=zlib-1.2.11.tar.gz @set LIBXML2=libxml2-2.9.8.tar.gz @set LUA=lua-5.3.5.tar.gz @set CURL=curl-7.62.0.zip @set APACHE_SRC=httpd-2.4.37.tar.gz @set APACHE_BIN32=httpd-2.4.37-win32-VC11.zip @set APACHE_BIN64=httpd-2.4.37-win64-VC11.zip @set YAJL=yajl-2.1.0.zip @set SSDEEP=ssdeep-2.13.tar.gz @set SSDEEP_BIN=ssdeep-2.13.zip :: BITSAdmin refuses to download YAJL from GitHub URL :: @set YAJL_URL=https://github.com/lloyd/yajl/archive/%YAJL:~-9% @set YAJL_URL=http://http.debian.net/debian/pool/main/y/yajl/yajl_2.1.0.orig.tar.gz @set CMAKE_URL=https://cmake.org/files/v3.12/%CMAKE% @set PCRE_URL=https://ftp.pcre.org/pub/pcre/%PCRE% @set ZLIB_URL=https://zlib.net/%ZLIB% @set LIBXML2_URL=http://xmlsoft.org/sources/%LIBXML2% @set LUA_URL=https://www.lua.org/ftp/%LUA% @set CURL_URL=http://curl.askapache.com/download/%CURL% @set APACHE_SRC_URL=https://www.apache.org/dist/httpd/%APACHE_SRC% @set APACHE_BIN_URL=https://home.apache.org/~steffenal/VC11/binaries @set SSDEEP_URL=https://downloads.sourceforge.net/project/ssdeep/ssdeep-2.13 bitsadmin.exe /transfer "Downloading dependencies..." %CMAKE_URL% %SOURCE_DIR%\%CMAKE% %PCRE_URL% %SOURCE_DIR%\%PCRE% %ZLIB_URL% %SOURCE_DIR%\%ZLIB% %LIBXML2_URL% %SOURCE_DIR%\%LIBXML2% %LUA_URL% %SOURCE_DIR%\%LUA% %CURL_URL% %SOURCE_DIR%\%CURL% %APACHE_SRC_URL% %SOURCE_DIR%\%APACHE_SRC% %APACHE_BIN_URL%/%APACHE_BIN32% %SOURCE_DIR%\%APACHE_BIN32% %APACHE_BIN_URL%/%APACHE_BIN64% %SOURCE_DIR%\%APACHE_BIN64% %YAJL_URL% %SOURCE_DIR%\%YAJL% %SSDEEP_URL%/%SSDEEP% %SOURCE_DIR%\%SSDEEP% %SSDEEP_URL%/%SSDEEP_BIN% %SOURCE_DIR%\%SSDEEP_BIN% @if NOT (%ERRORLEVEL%) == (0) goto :failed_to_download @exit /B 0 :failed_to_download @echo. && echo Failed to download dependency files... Try again or manually download the files to %SOURCE_DIR% and comment "@call download_files.bat" from build_dependencies.bat @goto failed :failed @exit /B 1 modsecurity-2.9.5/modsecurity.conf-recommended0000664000175000017500000002107014147005233022715 0ustar mhsvierulamhsvierula# -- Rule engine initialization ---------------------------------------------- # Enable ModSecurity, attaching it to every transaction. Use detection # only to start with, because that minimises the chances of post-installation # disruption. # SecRuleEngine DetectionOnly # -- Request body handling --------------------------------------------------- # Allow ModSecurity to access request bodies. If you don't, ModSecurity # won't be able to see any POST parameters, which opens a large security # hole for attackers to exploit. # SecRequestBodyAccess On # Enable XML request body parser. # Initiate XML Processor in case of xml content-type # SecRule REQUEST_HEADERS:Content-Type "(?:application(?:/soap\+|/)|text/)xml" \ "id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML" # Enable JSON request body parser. # Initiate JSON Processor in case of JSON content-type; change accordingly # if your application does not use 'application/json' # SecRule REQUEST_HEADERS:Content-Type "application/json" \ "id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON" # Sample rule to enable JSON request body parser for more subtypes. # Uncomment or adapt this rule if you want to engage the JSON # Processor for "+json" subtypes # #SecRule REQUEST_HEADERS:Content-Type "^application/.+[+]json$" \ # "id:'200006',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON" # Maximum request body size we will accept for buffering. If you support # file uploads then the value given on the first line has to be as large # as the largest file you are willing to accept. The second value refers # to the size of data, with files excluded. You want to keep that value as # low as practical. # SecRequestBodyLimit 13107200 SecRequestBodyNoFilesLimit 131072 # Store up to 128 KB of request body data in memory. When the multipart # parser reaches this limit, it will start using your hard disk for # storage. That is slow, but unavoidable. # SecRequestBodyInMemoryLimit 131072 # What do do if the request body size is above our configured limit. # Keep in mind that this setting will automatically be set to ProcessPartial # when SecRuleEngine is set to DetectionOnly mode in order to minimize # disruptions when initially deploying ModSecurity. # SecRequestBodyLimitAction Reject # Verify that we've correctly processed the request body. # As a rule of thumb, when failing to process a request body # you should reject the request (when deployed in blocking mode) # or log a high-severity alert (when deployed in detection-only mode). # SecRule REQBODY_ERROR "!@eq 0" \ "id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2" # By default be strict with what we accept in the multipart/form-data # request body. If the rule below proves to be too strict for your # environment consider changing it to detection-only. You are encouraged # _not_ to remove it altogether. # SecRule MULTIPART_STRICT_ERROR "!@eq 0" \ "id:'200003',phase:2,t:none,log,deny,status:400, \ msg:'Multipart request body failed strict validation: \ PE %{REQBODY_PROCESSOR_ERROR}, \ BQ %{MULTIPART_BOUNDARY_QUOTED}, \ BW %{MULTIPART_BOUNDARY_WHITESPACE}, \ DB %{MULTIPART_DATA_BEFORE}, \ DA %{MULTIPART_DATA_AFTER}, \ HF %{MULTIPART_HEADER_FOLDING}, \ LF %{MULTIPART_LF_LINE}, \ SM %{MULTIPART_MISSING_SEMICOLON}, \ IQ %{MULTIPART_INVALID_QUOTING}, \ IP %{MULTIPART_INVALID_PART}, \ IH %{MULTIPART_INVALID_HEADER_FOLDING}, \ FL %{MULTIPART_FILE_LIMIT_EXCEEDED}'" # Did we see anything that might be a boundary? # SecRule MULTIPART_UNMATCHED_BOUNDARY "!@eq 0" \ "id:'200004',phase:2,t:none,log,deny,msg:'Multipart parser detected a possible unmatched boundary.'" # PCRE Tuning # We want to avoid a potential RegEx DoS condition # SecPcreMatchLimit 1000 SecPcreMatchLimitRecursion 1000 # Some internal errors will set flags in TX and we will need to look for these. # All of these are prefixed with "MSC_". The following flags currently exist: # # MSC_PCRE_LIMITS_EXCEEDED: PCRE match limits were exceeded. # SecRule TX:/^MSC_/ "!@streq 0" \ "id:'200005',phase:2,t:none,deny,msg:'ModSecurity internal error flagged: %{MATCHED_VAR_NAME}'" # -- Response body handling -------------------------------------------------- # Allow ModSecurity to access response bodies. # You should have this directive enabled in order to identify errors # and data leakage issues. # # Do keep in mind that enabling this directive does increases both # memory consumption and response latency. # SecResponseBodyAccess On # Which response MIME types do you want to inspect? You should adjust the # configuration below to catch documents but avoid static files # (e.g., images and archives). # SecResponseBodyMimeType text/plain text/html text/xml # Buffer response bodies of up to 512 KB in length. SecResponseBodyLimit 524288 # What happens when we encounter a response body larger than the configured # limit? By default, we process what we have and let the rest through. # That's somewhat less secure, but does not break any legitimate pages. # SecResponseBodyLimitAction ProcessPartial # -- Filesystem configuration ------------------------------------------------ # The location where ModSecurity stores temporary files (for example, when # it needs to handle a file upload that is larger than the configured limit). # # This default setting is chosen due to all systems have /tmp available however, # this is less than ideal. It is recommended that you specify a location that's private. # SecTmpDir /tmp/ # The location where ModSecurity will keep its persistent data. This default setting # is chosen due to all systems have /tmp available however, it # too should be updated to a place that other users can't access. # SecDataDir /tmp/ # -- File uploads handling configuration ------------------------------------- # The location where ModSecurity stores intercepted uploaded files. This # location must be private to ModSecurity. You don't want other users on # the server to access the files, do you? # #SecUploadDir /opt/modsecurity/var/upload/ # By default, only keep the files that were determined to be unusual # in some way (by an external inspection script). For this to work you # will also need at least one file inspection rule. # #SecUploadKeepFiles RelevantOnly # Uploaded files are by default created with permissions that do not allow # any other user to access them. You may need to relax that if you want to # interface ModSecurity to an external program (e.g., an anti-virus). # #SecUploadFileMode 0600 # -- Debug log configuration ------------------------------------------------- # The default debug log configuration is to duplicate the error, warning # and notice messages from the error log. # #SecDebugLog /opt/modsecurity/var/log/debug.log #SecDebugLogLevel 3 # -- Audit log configuration ------------------------------------------------- # Log the transactions that are marked by a rule, as well as those that # trigger a server error (determined by a 5xx or 4xx, excluding 404, # level response status codes). # SecAuditEngine RelevantOnly SecAuditLogRelevantStatus "^(?:5|4(?!04))" # Log everything we know about a transaction. SecAuditLogParts ABIJDEFHZ # Use a single file for logging. This is much easier to look at, but # assumes that you will use the audit log only ocassionally. # SecAuditLogType Serial SecAuditLog /var/log/modsec_audit.log # Specify the path for concurrent audit logging. #SecAuditLogStorageDir /opt/modsecurity/var/audit/ # -- Miscellaneous ----------------------------------------------------------- # Use the most commonly used application/x-www-form-urlencoded parameter # separator. There's probably only one application somewhere that uses # something else so don't expect to change this value. # SecArgumentSeparator & # Settle on version 0 (zero) cookies, as that is what most applications # use. Using an incorrect cookie version may open your installation to # evasion attacks (against the rules that examine named cookies). # SecCookieFormat 0 # Specify your Unicode Code Point. # This mapping is used by the t:urlDecodeUni transformation function # to properly map encoded data to your language. Properly setting # these directives helps to reduce false positives and negatives. # SecUnicodeMapFile unicode.mapping 20127 # Improve the quality of ModSecurity by sharing information about your # current ModSecurity version and dependencies versions. # The following information will be shared: ModSecurity version, # Web Server version, APR version, PCRE version, Lua version, Libxml2 # version, Anonymous unique id for host. SecStatusEngine On modsecurity-2.9.5/README.md0000664000175000017500000000167414147005233016506 0ustar mhsvierulamhsvierulaModSecurity for Apache 2.x ====== http://www.modsecurity.org/ Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) You may not use this file except in compliance with the License. You may obtain a copy of the License at: https://www.apache.org/licenses/LICENSE-2.0 If any of the files related to licensing are missing or if you have any other questions related to licensing please contact Trustwave Holdings, Inc. directly using the email address: security@modsecurity.org. ## Documentation Please refer to: [the documentation folder](https://github.com/SpiderLabs/ModSecurity/tree/v2/master/doc) for the reference manual. ## Sponsor Note Development of ModSecurity is sponsored by Trustwave. Sponsorship will end July 1, 2024. Additional information can be found here https://www.trustwave.com/en-us/resources/security-resources/software-updates/end-of-sale-and-trustwave-support-for-modsecurity-web-application-firewall/ modsecurity-2.9.5/autogen.sh0000775000175000017500000000056314147005233017224 0ustar mhsvierulamhsvierula#!/bin/sh #rm -rf autom4te.cache #automake --add-missing --copy --foreign #autoreconf --install #autoheader rm -rf autom4te.cache rm -f aclocal.m4 case `uname` in Darwin*) glibtoolize --force --copy ;; *) libtoolize --force --copy ;; esac autoreconf --install autoheader automake --add-missing --foreign --copy --force-missing autoconf --force rm -rf autom4te.cache modsecurity-2.9.5/alp2/0000775000175000017500000000000014147005250016054 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/alp2/Makefile.am0000664000175000017500000000034514147005233020113 0ustar mhsvierulamhsvierulalib_LTLIBRARIES = libalp2.la include_HEADERS = alp2.h \ alp2_pp.h libalp2_la_SOURCES = alp2.c \ alp2_pp.c libalp2_la_CFLAGS = @APR_CFLAGS@ \ @APU_CFLAGS@ libalp2_la_LDFLAGS = @APR_LDFLAGS@ \ @APU_LDFLAGS@ modsecurity-2.9.5/alp2/alp2.c0000775000175000017500000011521314147005233017065 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #include #include #include #include #include #include "alp2.h" #ifdef DEBUG #define alp_debug(...) fprintf(stderr, __VA_ARGS__) #else #define alp_debug(...) #endif /* DEBUG */ /** * Add one error to the audit log entry. */ static void add_error(alp2_t *alp, int is_fatal, const char *text, ...) { char *str = NULL; va_list ap; if (is_fatal) { alp->parse_error = 1; } va_start(ap, text); str = apr_pvsprintf(alp->auditlog->mp, text, ap); va_end(ap); *(char **)apr_array_push(alp->errors) = str; } /** * Parse the Response-Body-Transformed trailer header. */ static int handle_part_H_parse_ResponseTFN(alp2_t *alp, const char *s) { char *capture = NULL; int ovector[33]; int rc; // TODO This header is optional, but is not allowed to appear more than once. return 1; } /** * Parse the Action trailer header. */ static int handle_part_H_parse_Action(alp2_t *alp, const char *s) { char *capture = NULL; int ovector[33]; int rc; // TODO This header is optional, but is not allowed to appear more than once. alp->auditlog->was_intercepted = 1; rc = pcre_exec(alp->trailer_action_pattern, NULL, s, strlen(s), 0, 0, ovector, 30); if (rc < 0) { add_error(alp, 1, "Part H: Failed to parse Action header"); return -1; } capture = apr_pstrmemdup(alp->auditlog->mp, s + ovector[2 * 1], ovector[2 * 1 + 1] - ovector[2 * 1]); alp->auditlog->intercept_phase = atoi(capture); return 1; } /** * Convert two hexadecimal characters into a character. */ static uint8_t x2c(uint8_t *what) { register uint8_t digit; digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A') + 10 : (what[0] - '0')); digit *= 16; digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A') + 10 : (what[1] - '0')); return digit; } /** * Remove a layer of encoding from a string. This function needs to be used * for every piece of data ModSecurity encoded for a message. */ static int remove_slashes(uint8_t *s) { uint8_t *d = s; while(*s != '\0') { if ((*s == '\\')&&(*(s + 1) != '\0')) { s++; switch(*s) { case 'b' : *d = '\b'; break; case 'n' : *d = '\n'; break; case 'r' : *d = '\r'; break; case 't' : *d = '\t'; break; case 'v' : *d = '\v'; break; case '\\' : *d = '\\'; break; case '"' : *d = '"'; break; case 'x' : if ( (*(s + 1) != '\0') &&(*(s + 2) != '\0') &&(isxdigit(*(s + 1))) &&(isxdigit(*(s + 2))) ) { *d = x2c(s + 1); s += 2; } else { /* Invalid encoding. */ return -1; } break; default : /* Invalid encoding. */ return -1; break; } } else { *d = *s; } s++; d++; } *d = '\0'; return 1; } /** * Process one (ModSecurity message) meta-data fragment. */ static int handle_part_H_parse_Message_meta(alp2_t *alp, alp2_msg_t *message, const char *l, const char *string_start, const char *string_end) { const char *value; // XXX if ((*string_start != '"')||(*string_end != '"')||(string_end <= string_start)) { if (string_end <= string_start) { add_error(alp, 1, "Part H: Invalid handle_part_H_parse_Message_meta invocation"); return -1; } if ((*string_start != '"')||(*string_end != '"')) { value = apr_pstrndup(alp->auditlog->mp, string_start, (string_end - string_start) + 1); } else { value = apr_pstrndup(alp->auditlog->mp, string_start + 1, (string_end - string_start - 1)); } if (value == NULL) { return -1; } if (remove_slashes((uint8_t *)value) < 0) { add_error(alp, 1, "Part H: Invalid encoding in meta-data fragment"); return -1; } /* Target ( at THE_TARGET) */ if (strncmp(l, "at ", 3) == 0) { if (message->target != NULL) { add_error(alp, 1, "Part H: Already seen target"); return -1; } message->target = value; return 1; } /* id */ if (strncmp(l, "id ", 3) == 0) { if (message->id != NULL) { add_error(alp, 1, "Part H: Already seen meta-data: id"); return -1; } message->id = value; return 1; } /* rev */ if (strncmp(l, "rev ", 4) == 0) { if (message->rev != NULL) { add_error(alp, 1, "Part H: Already seen meta-data: rev"); return -1; } message->rev = value; return 1; } /* msg */ if (strncmp(l, "msg ", 4) == 0) { if (message->msg != NULL) { add_error(alp, 1, "Part H: Already seen meta-data: msg"); return -1; } message->msg = value; return 1; } /* data */ if (strncmp(l, "data ", 4) == 0) { if (message->data != NULL) { add_error(alp, 1, "Part H: Already seen meta-data: data"); return -1; } message->data = value; return 1; } /* file */ if (strncmp(l, "file ", 5) == 0) { if (message->file != NULL) { add_error(alp, 1, "Part H: Already seen meta-data: file"); return -1; } message->file = value; return 1; } /* line */ if (strncmp(l, "line ", 5) == 0) { if (message->file_line != (unsigned long)-1) { add_error(alp, 1, "Part H: Already seen meta-data: line"); return -1; } // TODO Validate. message->file_line = atoi(value); return 1; } /* tag */ if (strncmp(l, "tag ", 4) == 0) { *(char **)apr_array_push(message->tags) = (char *)value; return 1; } /* severity */ if (strncmp(l, "severity ", 9) == 0) { if ( (strcmp(value, "0") == 0) ||(strcasecmp(value, "EMERGENCY") == 0)) { message->severity = 0; return 1; } if ( (strcmp(value, "1") == 0) ||(strcasecmp(value, "ALERT") == 0)) { message->severity = 1; return 1; } if ( (strcmp(value, "2") == 0) ||(strcasecmp(value, "CRITICAL") == 0)) { message->severity = 2; return 1; } if ( (strcmp(value, "3") == 0) ||(strcasecmp(value, "ERROR") == 0)) { message->severity = 3; return 1; } if ( (strcmp(value, "4") == 0) ||(strcasecmp(value, "WARNING") == 0)) { message->severity = 4; return 1; } if ( (strcmp(value, "5") == 0) ||(strcasecmp(value, "NOTICE") == 0)) { message->severity = 5; return 1; } if ( (strcmp(value, "6") == 0) ||(strcasecmp(value, "INFO") == 0)) { message->severity = 6; return 1; } if ( (strcmp(value, "7") == 0) ||(strcasecmp(value, "DEBUG") == 0)) { message->severity = 7; return 1; } add_error(alp, 1, "Part H: Invalid severity value: %s", value); return -1; } /* offset */ if (strncmp(l, "offset ", 7) == 0) { if (message->offset != (size_t)-1) { /* Already seen "offset". */ add_error(alp, 1, "Part H: Already seen fragment offset"); return -1; } // TODO Validate. message->offset = atoi(value); return 1; } /* Ignore unknown meta-data information. */ return 0; } /** * Parse the Message trailer header. More than one such header * can exist in an audit log, and each represents one ModSecurity * message. */ static int handle_part_H_parse_Message(alp2_t *alp, const char *s) { alp2_msg_t *message = NULL; char *l = (char *)(s + strlen(s) - 1); char *engine_message_start = (char *)s; char *engine_message_end = NULL; char *string_start = NULL, *string_end = NULL; char *fragment_end = NULL; char *tptr; int in_string; int done; /* Create one new message structure. */ message = apr_pcalloc(alp->auditlog->mp, sizeof(alp2_msg_t)); if (message == NULL) { return -1; } message->file_line = (unsigned long)-1; message->offset = (size_t)-1; message->severity = -1; message->warning = 0; if (strncasecmp("warning. ", s, 9) == 0) { message->warning = 1; engine_message_start += 9; } message->tags = apr_array_make(alp->auditlog->mp, 4, sizeof(const char *)); /* Start at the end of the message and go back identifying * the meta-data fragments as we go. Stop when we find the * end of the engine message. */ done = in_string = 0; while ((l >= s)&&(!done)) { if (in_string == 0) { /* Outside string. */ // TODO Make sure this is not an escaped char switch(*l) { case ' ' : /* Do nothing. */ break; case ']' : fragment_end = l; break; case '[' : if (fragment_end) { /* Found one meta-data fragment. */ // TODO This parser implementation allows for invalid // meta-data fragments to be accepted. It would be // nice to check the format of the fragment (e.g. // by matching it against a regular expression // pattern) before we accept any data. At this point // l points to the first byte of the fragment, and // fragment_end to the last. handle_part_H_parse_Message_meta(alp, message, l + 1, string_start, string_end); fragment_end = NULL; string_start = NULL; string_end = NULL; } break; case '"' : /* Found the end of a string. */ in_string = 1; string_end = l; break; default : if (!fragment_end) { /* There are no more meta-data fragments. */ engine_message_end = l; done = 1; } break; } } else { /* In string. We are only interested * in where the string ends. */ if ((*l == '"')&&((l - 1) >= s)&&(*(l - 1) != '\\')) { in_string = 0; string_start = l; } } l--; } /* Target is between " at " and "." */ tptr = engine_message_start; while ((tptr = strstr(tptr, " at ")) && (tptr < engine_message_end)) { char *tend = strchr(tptr, '.'); if ((tend <= engine_message_end) && (tend - tptr > 5)) { int rc = handle_part_H_parse_Message_meta(alp, message, tptr + 1, tptr + 4, tend - 1); if (rc == 1) { /* Remove the target data from the message */ engine_message_end = tptr; } } break; } if (engine_message_end == NULL) { add_error(alp, 1, "Part H: Failed parsing ModSecurity message: %s", s); return -1; } message->engine_message = apr_pstrndup(alp->auditlog->mp, engine_message_start, (engine_message_end - engine_message_start + 1)); /* Add this message to the audit log. */ *(alp2_msg_t **)apr_array_push(alp->auditlog->messages) = message; return 1; } /** * Parse the Stopwatch trailer header. */ static int handle_part_H_parse_Stopwatch(alp2_t *alp, const char *s) { int ovector[33]; int i, rc; // TODO This header is required (a check for its appearance is made when // handling the end of an H part), and is not allowed to appear // more than once. rc = pcre_exec(alp->trailer_stopwatch_pattern, NULL, s, strlen(s), 0, 0, ovector, 30); if (rc < 0) { add_error(alp, 1, "Part H: Failed to parse Stopwatch header"); return -1; } /* Loop through the captures. */ for (i = 0; i < rc; i++) { char *capture = apr_pstrmemdup(alp->auditlog->mp, s + ovector[2 * i], ovector[2 * i + 1] - ovector[2 * i]); switch (i) { case 1 : /* timestamp */ // TODO Validate alp->auditlog->timestamp = apr_atoi64(capture); break; case 2 : /* duration */ // TODO Validate alp->auditlog->duration = apr_atoi64(capture); break; case 3 : /* ignore (group of three further time elements)*/ break; case 4 : /* t1 */ break; case 5 : /* t2 */ break; case 6 : /* t3 */ break; } } return 1; } /** * Parse the WebApp-Info trailer header. */ static int handle_part_H_parse_WebAppInfo(alp2_t *alp, const char *s) { int ovector[33]; int i, rc; // TODO This header is optional, but it is not allowed to appear more than once. rc = pcre_exec(alp->trailer_webappinfo_pattern, NULL, s, strlen(s), 0, 0, ovector, 30); if (rc < 0) { add_error(alp, 1, "Part H: Failed to parse WebApp-Info header"); return -1; } /* Loop through the captures. */ for (i = 0; i < rc; i++) { char *capture = apr_pstrmemdup(alp->auditlog->mp, s + ovector[2 * i], ovector[2 * i + 1] - ovector[2 * i]); switch (i) { case 1 : /* application ID */ // TODO Validate alp->auditlog->application_id = capture; break; case 2 : /* session ID */ // TODO Validate if (strcmp(capture, "-") != 0) { alp->auditlog->session_id = capture; } break; case 3 : /* user ID */ // TODO Validate if (strcmp(capture, "-") != 0) { alp->auditlog->user_id = capture; } break; } } return 1; } /** * Handle part H events. */ static void handle_part_H(alp2_t *alp, int event_type) { /* Part data. */ if (event_type == ALP2_EVENT_PART_DATA) { char *line = alp2_pp_line_chomp(alp->pp); /* This part ends with an empty line. */ if (strlen(line) == 0) { alp->part_data_done = 1; return; } /* Extract the header information. */ { char *name = NULL, *value = NULL; int ovector[33]; int i, rc; /* Header line. */ /* Extract the fields. */ rc = pcre_exec(alp->header_pattern, NULL, line, strlen(line), 0, 0, ovector, 30); if (rc < 0) { add_error(alp, 1, "Part H: Failed to parse header: %i", rc); return; } /* Loop through the captures. */ for (i = 0; i < rc; i++) { char *capture = apr_pstrmemdup(alp->auditlog->mp, line + ovector[2 * i], ovector[2 * i + 1] - ovector[2 * i]); switch(i) { case 1 : name = capture; break; case 2 : value = capture; break; } } /* Add header to the table. */ apr_table_addn(alp->auditlog->trailer_headers, name, value); } return; } /* Part end. */ if (event_type == ALP2_EVENT_PART_END) { const apr_array_header_t *tarr = apr_table_elts(alp->auditlog->trailer_headers); apr_table_entry_t *te = NULL; const char *s = NULL; int stopwatch = 0; int rc = 0; int i; if ((tarr == NULL) || (tarr->nelts == 0)) { return; } /* Here we are going to extract certain headers and * parse them to populate the corresponding fields in * the auditlog structure. */ te = (apr_table_entry_t *)tarr->elts; for (i = 0; i < tarr->nelts; i++) { const char *key = te[i].key; const char *val = te[i].val; if ((key == NULL) || (val == NULL)) { continue; } /* Action: optional */ else if (strcmp("Action", key) == 0) { rc = handle_part_H_parse_Action(alp, val); } /* Message: optional */ else if (strcmp("Message", key) == 0) { rc = handle_part_H_parse_Message(alp, val); } /* Apache-Handler: optional */ else if (strcmp("Apache-Handler", key) == 0) { rc = 0; // TODO Only one allowed alp->auditlog->handler = apr_pstrdup(alp->auditlog->mp, val); } /* Producer: optional */ else if (strcmp("Producer", key) == 0) { rc = 0; // TODO Only one allowed alp->auditlog->producer = apr_pstrdup(alp->auditlog->mp, val); } /* Server: optional */ else if (strcmp("Server", key) == 0) { rc = 0; // TODO Only one allowed alp->auditlog->server = apr_pstrdup(alp->auditlog->mp, val); } /* Response-Body-Transformed: optional */ else if (strcmp("Response-Body-Transformed", key) == 0) { rc = 0; // TODO Only one allowed alp->auditlog->response_tfn = apr_pstrdup(alp->auditlog->mp, val); } /* Stopwatch: required */ else if (strcmp("Stopwatch", key) == 0) { stopwatch = 1; rc = handle_part_H_parse_Stopwatch(alp, val); } /* WebApp-Info: optional */ else if (strcmp("WebApp-Info", key) == 0) { rc = handle_part_H_parse_WebAppInfo(alp, val); } if (rc < 0) { /* No need to report anything, it's already been reported. */ } } if (stopwatch == 0) { add_error(alp, 1, "Part H: Stopwatch header missing"); } return; } } /** * Handle part F events. */ static void handle_part_F(alp2_t *alp, int event_type) { /* Part data. */ if (event_type == ALP2_EVENT_PART_DATA) { char *line = alp2_pp_line_chomp(alp->pp); /* This part ends with an empty line. */ if (strlen(line) == 0) { alp->part_data_done = 1; return; } /* The first line should be the response line. */ if (alp->part_line_counter == 1) { int ovector[33]; int i, rc; /* Response line. */ /* Extract the fields. */ rc = pcre_exec(alp->response_line_pattern, NULL, line, strlen(line), 0, 0, ovector, 30); if (rc < 0) { add_error(alp, 1, "Part F: Failed to parse response line: %i", rc); return; } /* Loop through the captures. */ for (i = 0; i < rc; i++) { char *capture = apr_pstrmemdup(alp->auditlog->mp, line + ovector[2 * i], ovector[2 * i + 1] - ovector[2 * i]); switch(i) { case 1 : alp->auditlog->response_protocol = capture; break; case 2 : alp->auditlog->response_status = atoi(capture); break; case 4 : alp->auditlog->response_message = capture; break; break; } } } else { char *name = NULL, *value = NULL; int ovector[33]; int i, rc; /* Response header line. */ /* Extract the fields. */ rc = pcre_exec(alp->header_pattern, NULL, line, strlen(line), 0, 0, ovector, 30); if (rc < 0) { add_error(alp, 1, "Part F: Failed to parse response header: %i", rc); return; } /* Loop through the captures. */ for (i = 0; i < rc; i++) { char *capture = apr_pstrmemdup(alp->auditlog->mp, line + ovector[2 * i], ovector[2 * i + 1] - ovector[2 * i]); switch(i) { case 1 : name = capture; break; case 2 : value = capture; break; } } /* Add header to the table. */ apr_table_addn(alp->auditlog->response_headers, name, value); } return; } /* Part end. */ if (event_type == ALP2_EVENT_PART_END) { /* If any of the response headers need * special handling, place the code here. */ return; } } /** * Parse the URI. APR-Util does most of the work here. */ static int handle_part_B_parse_uri(alp2_t *alp) { char *u = (char *)alp->auditlog->request_uri; apr_uri_t *uri = NULL; if (( alp->auditlog->request_method == NULL) ||(alp->auditlog->request_uri == NULL)) { return 0; } /* Since this is not a proper URI but a path, handle * the leading double slash. */ while ((u[0] == '/') && (u[1] == '/')) { u++; } uri = apr_pcalloc(alp->auditlog->mp, sizeof(apr_uri_t)); if (strcasecmp(alp->auditlog->request_method, "CONNECT") == 0) { if (apr_uri_parse_hostinfo(alp->auditlog->mp, u, uri) != APR_SUCCESS) { add_error(alp, 0, "Info: Failed to parse request URI (hostinfo)"); return -1; } } else { if (apr_uri_parse(alp->auditlog->mp, u, uri) != APR_SUCCESS) { add_error(alp, 0, "Info: Failed to parse request URI"); return -1; } } alp->auditlog->parsed_uri = uri; return 1; } /** * Handle part B events. */ static void handle_part_B(alp2_t *alp, int event_type) { /* Part data. */ if (event_type == ALP2_EVENT_PART_DATA) { char *line = alp2_pp_line_chomp(alp->pp); /* This part ends with an empty line. */ if (strlen(line) == 0) { alp->part_data_done = 1; return; } /* The first line should be the request line. */ if (alp->part_line_counter == 1) { int ovector[33]; int i, rc; /* Request line. */ /* Extract the fields. */ rc = pcre_exec(alp->request_line_pattern, NULL, line, strlen(line), 0, 0, ovector, 30); if (rc < 0) { add_error(alp, 1, "Part B: Failed to parse request line: %i", rc); return; } alp->auditlog->request_line_valid = 1; /* Loop through the captures. */ for (i = 0; i < rc; i++) { char *capture = apr_pstrmemdup(alp->auditlog->mp, line + ovector[2 * i], ovector[2 * i + 1] - ovector[2 * i]); switch(i) { case 0 : alp->auditlog->request_line = capture; break; case 1 : alp->auditlog->request_method = capture; break; case 2 : alp->auditlog->request_uri = capture; if (handle_part_B_parse_uri(alp) != 1) { // TODO Do we want to do anything on error? } break; case 3 : alp->auditlog->request_protocol = capture; break; } } } else { char *name = NULL, *value = NULL; int ovector[33]; int i, rc; /* Header line. */ /* Extract the fields. */ rc = pcre_exec(alp->header_pattern, NULL, line, strlen(line), 0, 0, ovector, 30); if (rc < 0) { add_error(alp, 1, "Part B: Failed to parse request header: %i", rc); return; } /* Loop through the captures. */ for (i = 0; i < rc; i++) { char *capture = apr_pstrmemdup(alp->auditlog->mp, line + ovector[2 * i], ovector[2 * i + 1] - ovector[2 * i]); switch(i) { case 1 : name = capture; break; case 2 : value = capture; break; } } /* ModSecurity 1.9.x adds some requests headers of * its own, and we don't want them. */ if (strncmp(name, "mod_security-", 13) != 0) { /* Add header to the table. */ apr_table_addn(alp->auditlog->request_headers, name, value); } } return; } /* Part end. */ if (event_type == ALP2_EVENT_PART_END) { /* Determine hostname. */ // TODO I think the right thing to do is use the port numbers // only when the host itself is a numerical IP. /* Try the URI first. */ if ( (alp->auditlog->parsed_uri != NULL) &&(alp->auditlog->parsed_uri->hostname != NULL)) { if ( (alp->auditlog->parsed_uri->port != 0) && (alp->auditlog->parsed_uri->port != 80) && (alp->auditlog->parsed_uri->port != 443) ) { // TODO Do not use the port number if the hostname // is not numeric. alp->auditlog->hostname = apr_psprintf(alp->auditlog->mp, "%s:%i", alp->auditlog->parsed_uri->hostname, alp->auditlog->parsed_uri->port); } else { // TODO Always use the port number if the hostname // is numeric. alp->auditlog->hostname = alp->auditlog->parsed_uri->hostname; } } else { /* Try the Host header. */ char *s = (char *)apr_table_get(alp->auditlog->request_headers, "Host"); if (s != NULL) { // TODO If the hostname is not numeric, remove the port // numbers if present. alp->auditlog->hostname = s; } else { /* Use the destination IP and port. */ alp->auditlog->hostname = apr_psprintf(alp->auditlog->mp, "%s:%i", alp->auditlog->dst_ip, alp->auditlog->dst_port); } } return; } } /** * Handle part A events. */ static void handle_part_A(alp2_t *alp, int event_type) { /* Part data. */ if (event_type == ALP2_EVENT_PART_DATA) { char *line = alp2_pp_line_chomp(alp->pp); int ovector[33]; int i, rc; /* This part can have only one line, * so we don't expect to be here again. */ alp->part_data_done = 1; /* Extract the fields. */ rc = pcre_exec(alp->part_a_pattern, NULL, line, strlen(line), 0, 0, ovector, 30); if (rc < 0) { add_error(alp, 1, "Part A: Parsing failed: %i", rc); return; } /* Loop through the captures. */ for (i = 0; i < rc; i++) { char *capture = apr_pstrmemdup(alp->auditlog->mp, line + ovector[2 * i], ovector[2 * i + 1] - ovector[2 * i]); switch(i) { case 1 : /* timestamp in Apache format */ /* We don't need it as we use the one from the H part. */ break; case 2 : /* transaction ID */ alp->auditlog->id = capture; break; case 3 : /* source address */ // TODO Validate alp->auditlog->src_ip = capture; break; case 4 : /* source port */ // TODO Validate alp->auditlog->src_port = atoi(capture); break; case 5 : /* destination address */ // TODO Validate alp->auditlog->dst_ip = capture; break; case 6 : /* destinatio port */ // TODO Validate alp->auditlog->dst_port = atoi(capture); break; } } return; } /* Part end. */ if (event_type == ALP2_EVENT_PART_END) { /* Place part post-validation here. */ return; } } /** * Create a new audit log data structure, allocating * memory from the provided memory pool. */ auditlog2_t *alp2_auditlog_create(apr_pool_t *mp) { auditlog2_t *al; /* Create a new memory pool and the * auditlog structure in it. We will use the * parent pool of the parser pool, in order to * ensure the auditlog memory structures survive * the death of the parser. */ al = apr_pcalloc(mp, sizeof(auditlog2_t)); al->mp = mp; al->request_headers = apr_table_make(al->mp, 20); al->response_headers = apr_table_make(al->mp, 20); al->trailer_headers = apr_table_make(al->mp, 20); al->messages = apr_array_make(al->mp, 10, sizeof(const alp2_msg_t *)); al->intercept_phase = -1; return al; } /** * Destroy the provided audit log entry. */ void alp2_auditlog_destroy(auditlog2_t *al) { apr_pool_destroy(al->mp); } /** * Handle ALP2_EVENT_ENTRY_START. */ static void handle_entry_start(alp2_t *alp) { /* Create a new data structure to hold the entry. */ alp->auditlog = alp2_auditlog_create(alp->pp->current_entry->mp); alp->auditlog->pp_entry = alp->pp->current_entry; /* Reset entry flags. */ alp->previous_part_id = 0; alp->seen_part_h = 0; alp->parse_error = 0; alp->errors = apr_array_make(alp->auditlog->mp, 4, sizeof(const char *)); } /** * Handle ALP2_EVENT_ENTRY_END. */ static void handle_entry_end(alp2_t *alp) { if (alp->parse_error) { /* No need to validate the entry since we've * previously encountered a problem with it. */ } else { /* Final entry validation. */ /* Have we seen the H part? (We must have seen the A * part, otherwise the entry would have begain in * the first place. */ if (alp->seen_part_h == 0) { add_error(alp, 1, "Entry does not have part H."); } } /* Invoke the upstream callback to handle the entry. */ if (alp->user_callback(alp) == 0) { alp->done = 1; } /* Upstream owns the audit log entry now. */ alp->auditlog = NULL; } /** * Handle ALP2_EVENT_PART_START. */ static void handle_part_start(alp2_t *alp) { if (alp->parse_error) { return; } /* Reset part flags. */ alp->part_line_counter = 0; alp->part_data_done = 0; /* Is this part allowed/expected? */ if (alp->previous_part_id == 0) { if (alp->pp->current_part->id != 'A') { add_error(alp, 1, "Expected part A but got %c.", alp->pp->current_part->id); return; } } /* Invoke the appropriate part handler. */ switch(alp->pp->current_part->id) { case 'A' : handle_part_A(alp, ALP2_EVENT_PART_START); break; case 'B' : handle_part_B(alp, ALP2_EVENT_PART_START); break; case 'F' : handle_part_F(alp, ALP2_EVENT_PART_START); break; case 'H' : alp->seen_part_h = 1; handle_part_H(alp, ALP2_EVENT_PART_START); break; default : /* Ignore unknown part. */ break; } } /* * Handle ALP2_EVENT_PART_END. */ static void handle_part_end(alp2_t *alp) { if (alp->parse_error) { return; } /* Invoke the appropriate part handler. */ switch(alp->pp->current_part->id) { case 'A' : handle_part_A(alp, ALP2_EVENT_PART_END); break; case 'B' : handle_part_B(alp, ALP2_EVENT_PART_END); case 'F' : handle_part_F(alp, ALP2_EVENT_PART_END); break; case 'H' : handle_part_H(alp, ALP2_EVENT_PART_END); break; default : /* Ignore unknown part. */ break; } /* Remember the last part processed. */ alp->previous_part_id = alp->pp->current_part->id; } /* * Handle ALP2_EVENT_PART_DATA. */ static void handle_part_data(alp2_t *alp) { if (alp->parse_error) { return; } alp->part_line_counter++; if (alp->part_data_done) { add_error(alp, 1, "Unexpected data for part %c.", alp->pp->current_part->id); return; } /* Invoke the appropriate part handler. */ switch(alp->pp->current_part->id) { case 'A' : handle_part_A(alp, ALP2_EVENT_PART_DATA); break; case 'B' : handle_part_B(alp, ALP2_EVENT_PART_DATA); break; case 'F' : handle_part_F(alp, ALP2_EVENT_PART_DATA); break; case 'H' : handle_part_H(alp, ALP2_EVENT_PART_DATA); break; default : /* Ignore unknown part. */ break; } } /** * This function handles callbacks from * the lower-level (part) parser. */ static int alp2_callback(alp2_pp_t *pp, int event_type) { alp2_t *alp = (alp2_t *)pp->user_data; /* Choose where to dispatch the event based * on the event type. */ switch(event_type) { case ALP2_EVENT_ENTRY_START : handle_entry_start(alp); break; case ALP2_EVENT_ENTRY_END : handle_entry_end(alp); break; case ALP2_EVENT_PART_START : handle_part_start(alp); break; case ALP2_EVENT_PART_END : handle_part_end(alp); break; case ALP2_EVENT_PART_DATA : handle_part_data(alp); break; default : /* Unexpected event type. */ break; } if (alp->done) { /* Stop parsing. */ return 0; } else { /* Go on. */ return 1; } } /** * Initialise parser. */ // XXX Make callback a typedef int alp2_create(alp2_t **_alp, apr_pool_t *mp, void *user_data, int (*user_callback)(alp2_t *alp)) { alp2_t *alp; apr_pool_t *new_pool; const char *errptr = NULL; int erroffset; /* We require a callback. */ if (user_callback == NULL) { return -1; } /* We will use our own memory pool. */ apr_pool_create(&new_pool, mp); alp = apr_pcalloc(mp, sizeof(alp2_t)); *_alp = alp; alp->mp = new_pool; alp->user_data = user_data; alp->user_callback = user_callback; /* Initialise the part parser. */ alp->pp = apr_pcalloc(mp, sizeof(alp2_pp_t)); if (alp->pp == NULL) return -1; if (alp2_pp_init(alp->pp, alp, alp2_callback, mp) < 0) { return -2; } /* Compile the patterns we use for parsing. */ /* part A pattern */ if ((alp->part_a_pattern = pcre_compile( "^\\[(.+)\\] (\\S+) ([.:0-9a-f]+) (\\d+) ([.:0-9a-f]+) (\\d+)$", PCRE_DOTALL, &errptr, &erroffset, NULL)) == NULL) { return -3; } /* request line pattern */ if ((alp->request_line_pattern = pcre_compile( // TODO Needs improving (e.g. to support simplified HTTP/0.9 requests "^(\\S+) (.*?) (HTTP/\\d\\.\\d)$", PCRE_DOTALL, &errptr, &erroffset, NULL)) == NULL) { return -4; } /* header pattern */ if ((alp->header_pattern = pcre_compile( "^([^:]+):\\s*(.+)$", PCRE_DOTALL, &errptr, &erroffset, NULL)) == NULL) { return -5; } /* response line pattern */ if ((alp->response_line_pattern = pcre_compile( "^(HTTP/\\d\\.\\d) (\\d{3})( (.+))?$", PCRE_DOTALL, &errptr, &erroffset, NULL)) == NULL) { return -6; } /* Action trailer header pattern */ if ((alp->trailer_action_pattern = pcre_compile( "^Intercepted \\(phase (\\d)\\)$", PCRE_DOTALL, &errptr, &erroffset, NULL)) == NULL) { return -7; } /* Stopwatch trailer header pattern */ if ((alp->trailer_stopwatch_pattern = pcre_compile( "^(\\d+) (\\d+)( \\((-|\\d+)\\*? (-|\\d+) (-|\\d+)\\))?$", PCRE_DOTALL, &errptr, &erroffset, NULL)) == NULL) { return -8; } /* WebApp-Info trailer header pattern */ if ((alp->trailer_webappinfo_pattern = pcre_compile( "^\"(.*)\" \"(.*)\" \"(.*)\"$", PCRE_DOTALL, &errptr, &erroffset, NULL)) == NULL) { return -9; } return 1; } /** * Process a piece of a stream of audit log entries. */ int alp2_process(alp2_t *alp, const char *data, size_t len) { alp2_pp_process(alp->pp, data, len); if (alp->done) { return 0; } else { return 1; } } /** * Destroy the parser. */ void alp2_destroy(alp2_t *alp) { apr_pool_destroy(alp->mp); } modsecurity-2.9.5/alp2/Makefile.in0000664000175000017500000006341014147005250020125 0ustar mhsvierulamhsvierula# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = alp2 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/find_apr.m4 \ $(top_srcdir)/build/find_apu.m4 \ $(top_srcdir)/build/find_curl.m4 \ $(top_srcdir)/build/find_lua.m4 \ $(top_srcdir)/build/find_pcre.m4 \ $(top_srcdir)/build/find_ssdeep.m4 \ $(top_srcdir)/build/find_xml.m4 \ $(top_srcdir)/build/find_yajl.m4 \ $(top_srcdir)/build/libtool.m4 \ $(top_srcdir)/build/ltoptions.m4 \ $(top_srcdir)/build/ltsugar.m4 \ $(top_srcdir)/build/ltversion.m4 \ $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/apache2/modsecurity_config_auto.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" LTLIBRARIES = $(lib_LTLIBRARIES) libalp2_la_LIBADD = am_libalp2_la_OBJECTS = libalp2_la-alp2.lo libalp2_la-alp2_pp.lo libalp2_la_OBJECTS = $(am_libalp2_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libalp2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libalp2_la_CFLAGS) \ $(CFLAGS) $(libalp2_la_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/apache2 depcomp = $(SHELL) $(top_srcdir)/build/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libalp2_la_SOURCES) DIST_SOURCES = $(libalp2_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(include_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/build/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APR_CFLAGS = @APR_CFLAGS@ APR_CONFIG = @APR_CONFIG@ APR_CPPFLAGS = @APR_CPPFLAGS@ APR_INCLUDEDIR = @APR_INCLUDEDIR@ APR_LDADD = @APR_LDADD@ APR_LDFLAGS = @APR_LDFLAGS@ APR_LINKLD = @APR_LINKLD@ APR_VERSION = @APR_VERSION@ APU_CFLAGS = @APU_CFLAGS@ APU_CONFIG = @APU_CONFIG@ APU_INCLUDEDIR = @APU_INCLUDEDIR@ APU_LDADD = @APU_LDADD@ APU_LDFLAGS = @APU_LDFLAGS@ APU_LINKLD = @APU_LINKLD@ APU_VERSION = @APU_VERSION@ APXS = @APXS@ APXS_BINDIR = @APXS_BINDIR@ APXS_CC = @APXS_CC@ APXS_CFLAGS = @APXS_CFLAGS@ APXS_EXTRA_CFLAGS = @APXS_EXTRA_CFLAGS@ APXS_HTTPD = @APXS_HTTPD@ APXS_INCLUDEDIR = @APXS_INCLUDEDIR@ APXS_INCLUDES = @APXS_INCLUDES@ APXS_LDFLAGS = @APXS_LDFLAGS@ APXS_LIBDIR = @APXS_LIBDIR@ APXS_LIBEXECDIR = @APXS_LIBEXECDIR@ APXS_LIBS = @APXS_LIBS@ APXS_LIBTOOL = @APXS_LIBTOOL@ APXS_MODULES = @APXS_MODULES@ APXS_PROGNAME = @APXS_PROGNAME@ APXS_SBINDIR = @APXS_SBINDIR@ APXS_WRAPPER = @APXS_WRAPPER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_CPPFLAGS = @CURL_CPPFLAGS@ CURL_LDADD = @CURL_LDADD@ CURL_LDFLAGS = @CURL_LDFLAGS@ CURL_USES_GNUTLS = @CURL_USES_GNUTLS@ CURL_VERSION = @CURL_VERSION@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENV_CMD = @ENV_CMD@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ LIBXML2_CONFIG = @LIBXML2_CONFIG@ LIBXML2_CPPFLAGS = @LIBXML2_CPPFLAGS@ LIBXML2_LDADD = @LIBXML2_LDADD@ LIBXML2_LDFLAGS = @LIBXML2_LDFLAGS@ LIBXML2_VERSION = @LIBXML2_VERSION@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LDADD = @LUA_LDADD@ LUA_LDFLAGS = @LUA_LDFLAGS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MODSEC_APXS_EXTRA_CFLAGS = @MODSEC_APXS_EXTRA_CFLAGS@ MODSEC_EXTRA_CFLAGS = @MODSEC_EXTRA_CFLAGS@ MSC_BASE_DIR = @MSC_BASE_DIR@ MSC_PKGBASE_DIR = @MSC_PKGBASE_DIR@ MSC_REGRESSION_CONF_DIR = @MSC_REGRESSION_CONF_DIR@ MSC_REGRESSION_DIR = @MSC_REGRESSION_DIR@ MSC_REGRESSION_DOCROOT_DIR = @MSC_REGRESSION_DOCROOT_DIR@ MSC_REGRESSION_LOGS_DIR = @MSC_REGRESSION_LOGS_DIR@ MSC_REGRESSION_SERVERROOT_DIR = @MSC_REGRESSION_SERVERROOT_DIR@ MSC_TEST_DIR = @MSC_TEST_DIR@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCRE_CFLAGS = @PCRE_CFLAGS@ PCRE_CONFIG = @PCRE_CONFIG@ PCRE_CPPFLAGS = @PCRE_CPPFLAGS@ PCRE_LDADD = @PCRE_LDADD@ PCRE_LDFLAGS = @PCRE_LDFLAGS@ PCRE_LD_PATH = @PCRE_LD_PATH@ PCRE_VERSION = @PCRE_VERSION@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSDEEP_CFLAGS = @SSDEEP_CFLAGS@ SSDEEP_LDADD = @SSDEEP_LDADD@ SSDEEP_LDFLAGS = @SSDEEP_LDFLAGS@ STRIP = @STRIP@ TOPLEVEL_SUBDIRS = @TOPLEVEL_SUBDIRS@ VERSION = @VERSION@ YAJL_CFLAGS = @YAJL_CFLAGS@ YAJL_LDADD = @YAJL_LDADD@ YAJL_LDFLAGS = @YAJL_LDFLAGS@ YAJL_LIBS = @YAJL_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = libalp2.la include_HEADERS = alp2.h \ alp2_pp.h libalp2_la_SOURCES = alp2.c \ alp2_pp.c libalp2_la_CFLAGS = @APR_CFLAGS@ \ @APU_CFLAGS@ libalp2_la_LDFLAGS = @APR_LDFLAGS@ \ @APU_LDFLAGS@ all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign alp2/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign alp2/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libalp2.la: $(libalp2_la_OBJECTS) $(libalp2_la_DEPENDENCIES) $(EXTRA_libalp2_la_DEPENDENCIES) $(AM_V_CCLD)$(libalp2_la_LINK) -rpath $(libdir) $(libalp2_la_OBJECTS) $(libalp2_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libalp2_la-alp2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libalp2_la-alp2_pp.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libalp2_la-alp2.lo: alp2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalp2_la_CFLAGS) $(CFLAGS) -MT libalp2_la-alp2.lo -MD -MP -MF $(DEPDIR)/libalp2_la-alp2.Tpo -c -o libalp2_la-alp2.lo `test -f 'alp2.c' || echo '$(srcdir)/'`alp2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libalp2_la-alp2.Tpo $(DEPDIR)/libalp2_la-alp2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alp2.c' object='libalp2_la-alp2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalp2_la_CFLAGS) $(CFLAGS) -c -o libalp2_la-alp2.lo `test -f 'alp2.c' || echo '$(srcdir)/'`alp2.c libalp2_la-alp2_pp.lo: alp2_pp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalp2_la_CFLAGS) $(CFLAGS) -MT libalp2_la-alp2_pp.lo -MD -MP -MF $(DEPDIR)/libalp2_la-alp2_pp.Tpo -c -o libalp2_la-alp2_pp.lo `test -f 'alp2_pp.c' || echo '$(srcdir)/'`alp2_pp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libalp2_la-alp2_pp.Tpo $(DEPDIR)/libalp2_la-alp2_pp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alp2_pp.c' object='libalp2_la-alp2_pp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalp2_la_CFLAGS) $(CFLAGS) -c -o libalp2_la-alp2_pp.lo `test -f 'alp2_pp.c' || echo '$(srcdir)/'`alp2_pp.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-includeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am \ install-includeHEADERS install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-includeHEADERS \ uninstall-libLTLIBRARIES .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: modsecurity-2.9.5/alp2/alp2.h0000664000175000017500000000737714147005233017102 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #ifndef _ALP2_H_ #define _ALP2_H_ #include #include #include "alp2_pp.h" #include "pcre.h" /* -- Data structures -- */ typedef struct alp2_msg_t alp2_msg_t; struct alp2_msg_t { const char *engine_message; const char *target; const char *id; const char *rev; const char *msg; const char *data; const char *file; unsigned long file_line; size_t offset; int severity; int warning; apr_array_header_t *tags; }; typedef struct auditlog2_t auditlog2_t; struct auditlog2_t { apr_pool_t *mp; /* Transaction data */ const char *id; apr_time_t timestamp; unsigned int duration; const char *src_ip; unsigned int src_port; const char *dst_ip; unsigned int dst_port; /* Request */ unsigned int request_line_valid; const char *request_line; const char *request_method; const char *request_uri; apr_uri_t *parsed_uri; const char *request_protocol; apr_table_t *request_headers; /* Determine the hostname: The hostname from the URI is * used where present, otherwise the value of the Host * request header is used. * * If neither of these two is available we will use the * combination of the destination IP and port as hostname. * * The resulting hostname may have the port attached. */ const char *hostname; /* Response */ const char *response_protocol; unsigned int response_status; const char *response_message; apr_table_t *response_headers; const char *response_tfn; /* Other */ apr_table_t *trailer_headers; unsigned int was_intercepted; unsigned int intercept_phase; /* -1 if interception did not happen */ const char *producer; const char *server; const char *handler; const char *application_id; const char *session_id; const char *user_id; apr_array_header_t *messages; alp2_pp_entry_t *pp_entry; }; typedef struct alp2_t alp2_t; struct alp2_t { apr_pool_t *mp; void *user_data; int (*user_callback)(alp2_t *alp); alp2_pp_t *pp; unsigned int previous_part_id; unsigned int part_line_counter; unsigned int part_data_done; unsigned int seen_part_h; unsigned int done; unsigned int parse_error; apr_array_header_t *errors; /* Regular expression patterns. */ // TODO All these need reviewing pcre *part_a_pattern; pcre *request_line_pattern; pcre *header_pattern; pcre *response_line_pattern; pcre *trailer_action_pattern; pcre *trailer_stopwatch_pattern; pcre *trailer_webappinfo_pattern; auditlog2_t *auditlog; }; /* Higher-level (user) parser. */ /* NOTE Parser will create a subpool for its own use, but each * entry will be created in a separate subpool directly * under the main pool. This allows the created audit log * entries to survive the death of the parser. */ /* -- Functions -- */ int alp2_create(alp2_t **_alp, apr_pool_t *mp, void *user_data, int (*user_callback)(alp2_t *alp)); int alp2_process(alp2_t *alp, const char *data, size_t len); void alp2_destroy(alp2_t *alp); auditlog2_t *alp2_auditlog_create(apr_pool_t *mp); void alp2_auditlog_destroy(auditlog2_t *al); #endif modsecurity-2.9.5/alp2/alp2_pp.c0000775000175000017500000002764314147005233017575 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #include #include #include #include "alp2_pp.h" /** * Take the line in the buffer and replace the new line * at the end with a NUL byte. */ char *alp2_pp_line_chomp(alp2_pp_t *pp) { if (pp->line_pos == 0) { pp->line_buf[0] = '\0'; } else { pp->line_buf[pp->line_pos - 1] = '\0'; } return &(pp->line_buf[0]); } /** * Look into the line buffer to determine if it * contains a boundary line. */ static int alp2_pp_is_boundary_line(alp2_pp_t *alp_pp) { char *new_boundary = NULL; unsigned int id; size_t i; /* A boundary line cannot be less than 14 characters long. */ if (alp_pp->line_pos < 15) { return 0; } /* The first two characters must both be dashes. */ if ((alp_pp->line_buf[0] != '-')||(alp_pp->line_buf[1] != '-')) { return 0; } /* Extract the boundary. */ i = 2; /* Start after the second dash. */ while((isxdigit(alp_pp->line_buf[i]))&&(i < alp_pp->line_pos)) { i++; } /* The boundary cannot be shorter than 8 characters. */ if (i - 2 < 8) { return 0; } // TODO Memory leak; use a single parser buffer to avoid per-entry // allocation from the parser pool. new_boundary = apr_pstrndup(alp_pp->mp, &(alp_pp->line_buf[2]), i - 2); /* Check if the rest of the line is valid. */ if ( (i + 5 < alp_pp->line_pos) /* Need at lest 5 more bytes. */ ||(alp_pp->line_buf[i + 0] != '-') ||(alp_pp->line_buf[i + 1] < 'A') ||(alp_pp->line_buf[i + 1] > 'Z') ||(alp_pp->line_buf[i + 2] != '-') ||(alp_pp->line_buf[i + 3] != '-') ||(alp_pp->line_buf[i + 4] != '\n') ) { return 0; } id = alp_pp->line_buf[i + 1]; /* Are we in a middle of an entry right now? */ if (alp_pp->current_entry == NULL) { /* We will accept a new boundary. */ alp_pp->boundary = new_boundary; return id; } else { /* The boundary must match the boundary of * the entry we are currently working on. */ if (strcmp(alp_pp->current_entry->boundary, new_boundary) != 0) { return 0; } else { return id; } } return 0; } /** * Process data belonging to a single part. */ static void alp2_pp_process_part_data(alp2_pp_t *alp_pp) { if (alp_pp->current_part == NULL) { return; } /* Invoke part processor. */ if (alp_pp->callback != NULL) { if (alp_pp->callback(alp_pp, ALP2_EVENT_PART_DATA) == 0) { alp_pp->done = 1; } } /* Keep track of part size. */ alp_pp->current_part->size += alp_pp->line_pos; /* Update the MD5 hash calculation. */ if ((alp_pp->current_entry != NULL)&&(alp_pp->line_pos > 0)) { apr_md5_update(alp_pp->current_entry->md5_context, &alp_pp->line_buf[0], alp_pp->line_pos - 1); } } /** * Initialise parser. */ int alp2_pp_init(alp2_pp_t *alp_pp, void *user_data, int (*callback)(alp2_pp_t *alp_pp, int event_type), apr_pool_t *mp) { memset(alp_pp, 0, sizeof(alp2_pp_t)); alp_pp->user_data = user_data; alp_pp->callback = callback; alp_pp->mp = mp; /* Use the parent pool directly. */ /* Set-up the line buffer. */ alp_pp->line_buf = apr_pcalloc(mp, ALP2_MAX_LINE_SIZE); alp_pp->line_size = ALP2_MAX_LINE_SIZE; alp_pp->line_has_start = 1; alp_pp->line_offset = 0; return 1; } /** * Process data the parser has stored in the input buffer. */ static apr_status_t alp2_pp_process_internal(alp2_pp_t *alp_pp) { /* Do not proceed if we've previously * encountered a fatal error. */ if (alp_pp->errored != 0) { return ALP2_ERROR_FATAL; } if (alp_pp->done) { return ALP2_DONE; } /* Go back straight away if we don't have anything to work with. */ if (alp_pp->input_len == 0) { return ALP2_NEED_DATA; } while (alp_pp->input_pos < alp_pp->input_len) { int c; if (alp_pp->done) { return ALP2_DONE; } if (alp_pp->line_pos >= alp_pp->line_size) { /* Our line buffer is full with the * line incomplete. */ alp2_pp_process_part_data(alp_pp); /* Reset line buffer . */ alp_pp->line_pos = 0; alp_pp->line_has_start = 0; alp_pp->line_offset = alp_pp->current_offset; } /* Consume one byte. */ c = alp_pp->input_buf[alp_pp->input_pos]; alp_pp->input_pos++; alp_pp->current_offset++; /* Copy the byte to the line buffer. */ alp_pp->line_buf[alp_pp->line_pos] = c; alp_pp->line_pos++; /* Are we at the end of a line? */ if (c == '\n') { if (alp_pp->line_has_start) { /* We have one complete line. */ int id = alp2_pp_is_boundary_line(alp_pp); if (id != 0) { /* The line is a boundary. */ /* Finish with the previous part, if any. */ if (alp_pp->current_part != NULL) { /* Update the MD5 context. */ apr_md5_update(alp_pp->current_entry->md5_context, &alp_pp->line_buf[0], alp_pp->line_pos - 1); /* Event PART_END. */ if (alp_pp->callback != NULL) { if (alp_pp->callback(alp_pp, ALP2_EVENT_PART_END) == 0) { alp_pp->done = 1; } } /* Add part to the current entry. */ *(alp2_pp_part_t **)apr_array_push(alp_pp->current_entry->parts) = alp_pp->current_part; /* Delete part. */ alp_pp->current_part = NULL; /* If the new part is part Z, then finish * with the current entry. */ if (id == 'Z') { alp_pp->current_entry->size = alp_pp->current_offset - alp_pp->current_entry->offset; /* Create the MD5 digest. */ apr_md5_final(alp_pp->current_entry->md5_digest, alp_pp->current_entry->md5_context); /* Event ENTRY_END. */ if (alp_pp->callback != NULL) { if (alp_pp->callback(alp_pp, ALP2_EVENT_ENTRY_END) == 0) { alp_pp->done = 1; } } /* We are about to destroy our only reference to the per-entry * memory pool, but that is all right since we've passed all * responsibility for the entry to the higher-level handler. */ alp_pp->current_entry = NULL; } } if (id != 'Z') { /* Create new entry if necessary. */ if (alp_pp->current_entry == NULL) { apr_pool_t *new_pool = NULL; /* Create a per-entry pool directly from the main memory pool. */ apr_pool_create(&new_pool, apr_pool_parent_get(alp_pp->mp)); alp_pp->current_entry = apr_pcalloc(new_pool, sizeof(alp2_pp_entry_t)); alp_pp->current_entry->mp = new_pool; alp_pp->current_entry->offset = alp_pp->line_offset; alp_pp->current_entry->boundary = apr_pstrdup(new_pool, alp_pp->boundary); alp_pp->boundary = NULL; alp_pp->current_entry->parts = apr_array_make(alp_pp->current_entry->mp, 16, sizeof(alp2_pp_part_t *)); /* Initialise the MD5 context. */ alp_pp->current_entry->md5_context = apr_pcalloc(alp_pp->current_entry->mp, sizeof(apr_md5_ctx_t)); apr_md5_init(alp_pp->current_entry->md5_context); /* Start calculating the has with the first line. */ apr_md5_update(alp_pp->current_entry->md5_context, &alp_pp->line_buf[0], alp_pp->line_pos - 1); /* Event ENTRY_START. */ if (alp_pp->callback != NULL) { if (alp_pp->callback(alp_pp, ALP2_EVENT_ENTRY_START) == 0) { alp_pp->done = 1; } } } /* Create new part, but only if we are not * dealing with an entry terminator. */ alp_pp->current_part = apr_pcalloc(alp_pp->current_entry->mp, sizeof(alp2_pp_part_t)); alp_pp->current_part->id = id; alp_pp->current_part->offset = alp_pp->current_offset; /* Event PART_START. */ if (alp_pp->callback != NULL) { if (alp_pp->callback(alp_pp, ALP2_EVENT_PART_START) == 0) { alp_pp->done = 1; } } } } else { /* The line does not contain a boundary, * so process it as part data. */ alp2_pp_process_part_data(alp_pp); } } else { /* We have a chunk of data that is not a line, which * probably means that our buffer was not big enough, either * because the line (is a line and it) was too big, or because * we are processing binary data. Ideally the latter. */ alp2_pp_process_part_data(alp_pp); } /* Reset the line buffer. */ alp_pp->line_pos = 0; alp_pp->line_has_start = 1; alp_pp->line_offset = alp_pp->current_offset; } } if (alp_pp->done) { return ALP2_DONE; } else { return ALP2_NEED_DATA; } } /** * Process the provided data. */ int alp2_pp_process(alp2_pp_t *alp_pp, const char *data, size_t len) { /* Do not proceed if we've previously * encountered a fatal error. */ if (alp_pp->errored != 0) { return ALP2_ERROR_FATAL; } /* Check that we've used up the existing buffer. */ if (alp_pp->input_pos < alp_pp->input_len) { return ALP2_ERROR_INCORRECT_STATE; } alp_pp->input_buf = data; alp_pp->input_len = len; alp_pp->input_pos = 0; return alp2_pp_process_internal(alp_pp); } /** * Clean-up the parser structures. */ void alp2_pp_terminate(alp2_pp_t *alp_pp) { /* Nothing to do, but we may need * to do something in the future. */ } modsecurity-2.9.5/alp2/alp2_pp.h0000664000175000017500000000551314147005233017567 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #ifndef _ALP2_LL_H_ #define _ALP2_LL_H_ #include #include #include #include #include /* -- Constants -- */ #define ALP2_MAX_LINE_SIZE 16384 #define ALP2_ERROR_INCORRECT_STATE -1001 #define ALP2_ERROR_FATAL -1002 #define ALP2_DONE 0 #define ALP2_NEED_DATA 1 #define ALP2_EVENT_ENTRY_START 1 #define ALP2_EVENT_ENTRY_END 2 #define ALP2_EVENT_PART_START 3 #define ALP2_EVENT_PART_END 4 #define ALP2_EVENT_PART_DATA 5 /* -- Data structures -- */ typedef struct alp2_pp_part_t alp2_pp_part_t; struct alp2_pp_part_t { int id; // XXX int here but unsigned int other places??? /* Relative to the beginning of the entry, not * including the boundary lines. Just content. */ size_t offset; size_t size; }; typedef struct alp2_pp_entry_t alp2_pp_entry_t; struct alp2_pp_entry_t { apr_pool_t *mp; apr_array_header_t *parts; /* Entry offset and size include * the delimiting boundaries. */ size_t offset; size_t size; const char *boundary; apr_md5_ctx_t *md5_context; uint8_t md5_digest[APR_MD5_DIGESTSIZE]; }; typedef struct alp2_pp_t alp2_pp_t; struct alp2_pp_t { void *user_data; int (*callback)(alp2_pp_t *alp, int event_type); /* The memory pool used during the parsing of * individual audit log entries. Cleared between * entries. */ apr_pool_t *mp; unsigned int errored; unsigned int done; const char *boundary; char *last_processed_part; char *current_line; /* The number of bytes processed since * the beginning or the last reset. */ size_t current_offset; const char *input_buf; size_t input_len; size_t input_pos; char *line_buf; size_t line_pos; size_t line_size; unsigned int line_has_start; size_t line_offset; alp2_pp_part_t *current_part; alp2_pp_entry_t *current_entry; }; /* Functions. */ int alp2_pp_init(alp2_pp_t *alp_pp, void *user_data, int (*callback)(alp2_pp_t *alp, int event_type), apr_pool_t *mp); int alp2_pp_process(alp2_pp_t *alp_pp, const char *data, size_t len); void alp2_pp_terminate(alp2_pp_t *alp_pp); char *alp2_pp_line_chomp(alp2_pp_t *alp_pp); #endif modsecurity-2.9.5/authors.txt0000664000175000017500000000057514147005233017454 0ustar mhsvierulamhsvierulab1v1r = Brian Rectanus brectanu = Brian Rectanus brectanus = Brian Rectanus ivanr = Ivan Ristić rbarnett = Ryan C. Barnett [anonymous] = Brian Rectanus (no author) = Brian Rectanus brenosilva = Breno Silva modsecurity-2.9.5/tools/0000775000175000017500000000000014147005251016357 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/tools/Makefile.am0000664000175000017500000000003714147005233020413 0ustar mhsvierulamhsvierulabin_SCRIPTS = rules-updater.pl modsecurity-2.9.5/tools/Makefile.in0000664000175000017500000004267114147005251020436 0ustar mhsvierulamhsvierula# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = tools ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/build/find_apr.m4 \ $(top_srcdir)/build/find_apu.m4 \ $(top_srcdir)/build/find_curl.m4 \ $(top_srcdir)/build/find_lua.m4 \ $(top_srcdir)/build/find_pcre.m4 \ $(top_srcdir)/build/find_ssdeep.m4 \ $(top_srcdir)/build/find_xml.m4 \ $(top_srcdir)/build/find_yajl.m4 \ $(top_srcdir)/build/libtool.m4 \ $(top_srcdir)/build/ltoptions.m4 \ $(top_srcdir)/build/ltsugar.m4 \ $(top_srcdir)/build/ltversion.m4 \ $(top_srcdir)/build/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/apache2/modsecurity_config_auto.h CONFIG_CLEAN_FILES = rules-updater.pl CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(bindir)" SCRIPTS = $(bin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/rules-updater.pl.in \ README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APR_CFLAGS = @APR_CFLAGS@ APR_CONFIG = @APR_CONFIG@ APR_CPPFLAGS = @APR_CPPFLAGS@ APR_INCLUDEDIR = @APR_INCLUDEDIR@ APR_LDADD = @APR_LDADD@ APR_LDFLAGS = @APR_LDFLAGS@ APR_LINKLD = @APR_LINKLD@ APR_VERSION = @APR_VERSION@ APU_CFLAGS = @APU_CFLAGS@ APU_CONFIG = @APU_CONFIG@ APU_INCLUDEDIR = @APU_INCLUDEDIR@ APU_LDADD = @APU_LDADD@ APU_LDFLAGS = @APU_LDFLAGS@ APU_LINKLD = @APU_LINKLD@ APU_VERSION = @APU_VERSION@ APXS = @APXS@ APXS_BINDIR = @APXS_BINDIR@ APXS_CC = @APXS_CC@ APXS_CFLAGS = @APXS_CFLAGS@ APXS_EXTRA_CFLAGS = @APXS_EXTRA_CFLAGS@ APXS_HTTPD = @APXS_HTTPD@ APXS_INCLUDEDIR = @APXS_INCLUDEDIR@ APXS_INCLUDES = @APXS_INCLUDES@ APXS_LDFLAGS = @APXS_LDFLAGS@ APXS_LIBDIR = @APXS_LIBDIR@ APXS_LIBEXECDIR = @APXS_LIBEXECDIR@ APXS_LIBS = @APXS_LIBS@ APXS_LIBTOOL = @APXS_LIBTOOL@ APXS_MODULES = @APXS_MODULES@ APXS_PROGNAME = @APXS_PROGNAME@ APXS_SBINDIR = @APXS_SBINDIR@ APXS_WRAPPER = @APXS_WRAPPER@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CURL_CFLAGS = @CURL_CFLAGS@ CURL_CONFIG = @CURL_CONFIG@ CURL_CPPFLAGS = @CURL_CPPFLAGS@ CURL_LDADD = @CURL_LDADD@ CURL_LDFLAGS = @CURL_LDFLAGS@ CURL_USES_GNUTLS = @CURL_USES_GNUTLS@ CURL_VERSION = @CURL_VERSION@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENV_CMD = @ENV_CMD@ EXEEXT = @EXEEXT@ EXTRA_CFLAGS = @EXTRA_CFLAGS@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ LIBXML2_CONFIG = @LIBXML2_CONFIG@ LIBXML2_CPPFLAGS = @LIBXML2_CPPFLAGS@ LIBXML2_LDADD = @LIBXML2_LDADD@ LIBXML2_LDFLAGS = @LIBXML2_LDFLAGS@ LIBXML2_VERSION = @LIBXML2_VERSION@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ LUA_CFLAGS = @LUA_CFLAGS@ LUA_LDADD = @LUA_LDADD@ LUA_LDFLAGS = @LUA_LDFLAGS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MODSEC_APXS_EXTRA_CFLAGS = @MODSEC_APXS_EXTRA_CFLAGS@ MODSEC_EXTRA_CFLAGS = @MODSEC_EXTRA_CFLAGS@ MSC_BASE_DIR = @MSC_BASE_DIR@ MSC_PKGBASE_DIR = @MSC_PKGBASE_DIR@ MSC_REGRESSION_CONF_DIR = @MSC_REGRESSION_CONF_DIR@ MSC_REGRESSION_DIR = @MSC_REGRESSION_DIR@ MSC_REGRESSION_DOCROOT_DIR = @MSC_REGRESSION_DOCROOT_DIR@ MSC_REGRESSION_LOGS_DIR = @MSC_REGRESSION_LOGS_DIR@ MSC_REGRESSION_SERVERROOT_DIR = @MSC_REGRESSION_SERVERROOT_DIR@ MSC_TEST_DIR = @MSC_TEST_DIR@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCRE_CFLAGS = @PCRE_CFLAGS@ PCRE_CONFIG = @PCRE_CONFIG@ PCRE_CPPFLAGS = @PCRE_CPPFLAGS@ PCRE_LDADD = @PCRE_LDADD@ PCRE_LDFLAGS = @PCRE_LDFLAGS@ PCRE_LD_PATH = @PCRE_LD_PATH@ PCRE_VERSION = @PCRE_VERSION@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSDEEP_CFLAGS = @SSDEEP_CFLAGS@ SSDEEP_LDADD = @SSDEEP_LDADD@ SSDEEP_LDFLAGS = @SSDEEP_LDFLAGS@ STRIP = @STRIP@ TOPLEVEL_SUBDIRS = @TOPLEVEL_SUBDIRS@ VERSION = @VERSION@ YAJL_CFLAGS = @YAJL_CFLAGS@ YAJL_LDADD = @YAJL_LDADD@ YAJL_LDFLAGS = @YAJL_LDFLAGS@ YAJL_LIBS = @YAJL_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ bin_SCRIPTS = rules-updater.pl all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tools/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): rules-updater.pl: $(top_builddir)/config.status $(srcdir)/rules-updater.pl.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-binSCRIPTS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-binSCRIPTS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: modsecurity-2.9.5/tools/README0000664000175000017500000000031314147005233017234 0ustar mhsvierulamhsvierulaThese tools are built during the ModSecurity configure process run under the apache2 directory. To use them you will first need to run configure under the apache2 directory: ./configure [any options] modsecurity-2.9.5/tools/parse_modsec.pl0000775000175000017500000004160114147005233021365 0ustar mhsvierulamhsvierula#!/usr/bin/perl use strict; use warnings; use DateTime::Format::Strptime; use Getopt::Long qw(:config no_ignore_case bundling); use JSON; use List::MoreUtils qw(any); use NetAddr::IP; use Try::Tiny; =pod =head1 NAME parse_modsec.pl =head1 SYNOPSIS Parse ModSecurity logs generated as JSON =head1 USAGE Usage: $0 [h] [Htsrfdbalspjv] -H|--host Search rules based on the Host request header -t|--transaction-id Search rules based on the unique transaction ID -s|--source-ip Search rules based on the client IP address (can be presented as an address or CIDR block) -r|--rule-id Search rules based on the rule ID -f|--filter Define advanced filters to walk through JSON tree -d|--delim Define a delimiter for advanced filters. Default is '.' -b|--before Search rules before this timeframe -a|--after Search rules after this timeframe -l|--logpath Define a path to read JSON logs from. Default is '/var/log/modsec_audit.log' -S|--stdin Read rules from stdin instead of an on-disk file -p|--partial-chains Do not prune partial chain matches -j|--json Print rule entries as a JSON blob, rather than nice formatting -v|--verbose Be verbose about various details such as JSON parse failures and log data =head2 FILTERS ModSecurity JSON audit logs are written as a series of atomic JSON documents, as opposed to a single, monolithic structure. This program will read through all JSON documents provided, making certain assumptions about the structure of each document, and will print out relevent entries based on the parameters provided. Log entries can be filtered by key-value pairs; given a key at an arbitrary level in the document, test the value of the key against an expected expression. The best way to understand this is with examples (see EXAMPLES for further details). Filter values are treated as regular expressions. Each match is anchored by '^' and'$', meaning that values that do not contain PCRE metacharacters will essentially match by string equality. Filters can be used to search a specific key-pair value, or an array of values. Arrays containing sub-elements can also be traversed. Arrays are identified in a filter key expression through the use of the '%' metacharacter. See EXAMPLES for further discussion of filter key expression syntax. Multiple filters can be provided, and are used in a logical AND manner (that is, an entry must match all given filters). =head2 FILTER EXAMPLES Examine the following entry: { "foo": "bar", "foo2": "bar2", "qux": { "quux": "corge", "grault": "garply", "wal.do": "fred" }, "baz": [ "bat", "bam", "bif" ], "bal": [ { "hello": "world" }, { "how": "are" }, { "you": "doing" } ] } A search for the top level key "foo" containing the value "bar" would look like: -f foo=bar However, the following will not result in the entry being matched: -f foo=bar2 This is because the value of "foo" in the JSON document does not match the regex "^bar2$" Searching sub-keys is possible by providing the traversal path as the filter key, separated by a delimiter. By default the delimiter is '.'. For example, to search the value of the "grault" subkey within the "qux" key: -f qux.grault= Search arrays is also possible with the use of the '%' metacharacter, which should be used in place of a key name in the filter expression. For example, to search through all the values in the "baz" top-level key: -f baz.%= Searching for specific keys that are live in an array is also possible. For example, to search for the value of the "hello" key within the top-level key "bal" array: -f bal.%.hello= If any key contains a period character (.), you can specify an alternative delimiter using the '-d' option. To search the "wal.do" key within "qux": -d @ quz@wal.do= =head2 SHORTCUTS Quick searches of on-disk log files likely will be performed using simple queries. Rather than forcing users to write a filter for common parameters, we provide a few shortcuts as options. These shortcuts can be combined with additional filters for complex searches. Provided shortcuts (and the matching filter key expression) are listed below: Host: request.headers.Host Transaction ID: transaction.transaction_id Rule ID: matched_rules.%.rules.%.actionset.id Additionally, the '--source-ip' argument allows for searching rule entries based on the remote IP address. This option searches based on CIDR blocks, instead of the filter searching described above. =head2 TIMEFRAME Log entries can further be narrowed by time range. The --before and --after flags can be used to return only entries that returned before or after (or both) a given date and time. Values for these options can be provided by the following syntax: ^\d+[dDhHmM]?$ For example, to limit the search of entries to between one and 4 days ago: -a 4d -b 1d You may provide one, both, or neither of these flags. =head2 USAGE EXAMPLES Print all log entries from the default log location: parse_modsec.pl Print all log entries and show more detailed information, such as response data and matched rule details parse_modsec.pl -v Print entries matching a specific source IP: parse_modsec.pl -s 1.2.3.4 Print entries matching a source IP in a given subnet: parse_modsec.pl -s 1.2.3.0/24 Print entries matching a given host and all its sub domains: parse_modsec.pl -H .*example.com Print entries matching a specific rule ID, that occurred within the last 12 hours: parse_modsec.pl -r 123456 -a 12h Print entries matching a given rule ID, even if that ID was present in a partial chain: parse_modsec.pl -r 123456 -p Print entries that contain an HTTP status code 403 parse_modsec.pl -f response.status=403 Print entries that contain an HTTP GET request with a 'Content-Length' header parse_modsec.pl -f request.headers.Content-Length=.* -f request.request_line=GET.* =cut sub usage { print <<"_EOF"; Usage: $0 [h] [Htsrfdbalspjv] -h|--help Print this help -H|--host Search rules based on the Host request header -t|--transaction-id Search rules based on the unique transaction ID -s|--source-ip Search rules based on the client IP address (can be presented as an address or CIDR block) -r|--rule-id Search rules based on the rule ID -f|--filter Define advanced filters to walk through JSON tree -d|--delim Define a delimiter for advanced filters. Default is '.' -b|--before Search rules before this timeframe -a|--after Search rules after this timeframe -l|--logpath Define a path to read JSON logs from. Default is '/var/log/modsec_audit.log' -S|--stdin Read rules from stdin instead of an on-disk file -p|--partial-chains Do not prune partial chain matches -j|--json Print rule entries as a JSON blob, rather than nice formatting -v|--verbose Be verbose about various details such as JSON parse failures and log data For detailed explanations of various options and example usages, see 'perldoc $0' _EOF exit 1; } # figure the number of seconds based on the command-line option sub parse_duration { my ($duration) = @_; if ($duration =~ /^(\d+)[dD]$/) { return $1 * 60 * 60 * 24; } elsif ($duration =~ /^(\d+)[hH]$/) { return $1 * 60 * 60; } elsif ($duration =~ /^(\d+)[mM]$/) { return $1 * 60; } elsif ($duration =~ /^(\d+)[sS]?$/) { return $1; } else { die "Couldn't parse duration $duration!\n"; } } # build a DateTime representative of the past sub build_datetime { my ($duration) = @_; return if !$duration; return DateTime->now()->subtract(seconds => parse_duration($duration)); } # determine if the log entry occurred within the given timeframe sub within_timeframe { my ($args) = @_; my $entry = $args->{entry}; my $before = $args->{before}; my $after = $args->{after}; my $timestamp = parse_modsec_timestamp($entry->{transaction}->{time}); return (defined $before ? $timestamp < $before : 1) && (defined $after ? $timestamp > $after : 1); } # sigh... sub parse_modsec_timestamp { my ($input) = @_; my $format = '%d/%b/%Y:%H:%M:%S -%z'; my $locale = 'en_US'; my $strp = DateTime::Format::Strptime->new( pattern => $format, locale => $locale, ); return $strp->parse_datetime($input); } # figure out if we're reading from a file or stdin # return a file handle representation of our data sub get_input { my ($args) = @_; my $logpath = $args->{logpath}; my $stdin = $args->{stdin}; my $fh; $stdin ? $fh = *STDIN : open $fh, '<', $logpath or die $!; return $fh; } # figure if the target address/cidr contains the entry's remote address sub cidr_match { my ($args) = @_; my $entry = $args->{entry}; my $target = $args->{target}; my $client_ip = $entry->{transaction}->{remote_address}; return $target ? $target->contains(NetAddr::IP->new($client_ip)) : 1; } # given a file handle, return an arrayref representing pertinent rule entries sub grok_input { my ($args) = @_; my $fh = $args->{fh}; my $filters = $args->{filters}; my $delim = $args->{delim}; my $source_ip = $args->{source_ip}; my $before = $args->{before}; my $after = $args->{after}; my $partial = $args->{partial}; my $verbose = $args->{verbose}; my @ref; while (my $line = <$fh>) { my $entry; try { $entry = decode_json($line); } catch { warn "Could not decode as JSON:\n$line\n" if $verbose; }; next if !$entry; skim_entry({ entry => $entry, partial => $partial, }); next if !filter({ filters => $filters, data => $entry, delim => $delim, }); next if !cidr_match({ entry => $entry, target => $source_ip, }); next if !within_timeframe({ entry => $entry, before => $before, after => $after, }); push @ref, $entry; } return \@ref; } # get rid of partial chains and other noise sub skim_entry { my ($args) = @_; my $entry = $args->{entry}; my $partial = $args->{partial}; my $ctr = 0; for my $matched_rule (@{$entry->{matched_rules}}) { splice @{$entry->{matched_rules}}, $ctr++, 1 if $matched_rule->{chain} && !$matched_rule->{full_chain_match} && !$partial; } } # print entries after filtering and skimming sub print_matches { my ($args) = @_; my $ref = $args->{ref}; my $json = $args->{json}; my $verbose = $args->{verbose}; for my $entry (@{$ref}) { if ($json) { print encode_json($entry) . "\n"; } else { printf "\n%s\n", '=' x 80; my $transaction = $entry->{transaction}; my $request = $entry->{request}; my $response = $entry->{response}; my $audit_data = $entry->{audit_data}; my $matched_rules = $entry->{matched_rules}; if ($transaction) { printf "%s\nTransaction ID: %s\nIP: %s\n\n", parse_modsec_timestamp($transaction->{time}), $transaction->{transaction_id}, $transaction->{remote_address}; } printf "%s\n", $request->{request_line} if $request->{request_line}; if ($request->{headers}) { for my $header (sort keys %{$request->{headers}}) { printf "%s: %s\n", $header, $request->{headers}->{$header}; } } if ($verbose) { print join ("\n", @{$request->{body}}) . "\n" if $request->{body}; printf "\n%s %s\n", $response->{protocol}, $response->{status} if $response->{protocol} && $response->{status}; for my $header (sort keys %{$response->{headers}}) { printf "%s: %s\n", $header, $response->{headers}->{$header}; } printf "\n%s\n", $response->{body} if $response->{body}; } for my $chain (@{$matched_rules}) { print "\n"; my @extra_data; my $ctr = 0; for my $rule (@{$chain->{rules}}) { printf $rule->{is_matched} ? "%s%s\n" : "%s#%s\n", ' ' x $ctr++, $rule->{unparsed}; push @extra_data, $rule->{actionset}->{msg} if $rule->{actionset}->{msg}; push @extra_data, $rule->{actionset}->{logdata} if $rule->{actionset}->{logdata}; } printf "\n-- %s\n", join "\n-- ", @extra_data if @extra_data && $verbose; } printf "\n-- %s\n\n", $audit_data->{action}->{message} if $audit_data->{action}->{message} && $verbose; printf "%s\n", '=' x 80; } } } # filter out rule entries based on given filter definitions sub filter { my ($args) = @_; my $filters = $args->{filters}; my $data = $args->{data}; my $delim = $args->{delim}; my $valid_match = 1; for my $field (keys %{$filters}) { my $args = { field => $field, match => $filters->{$field}, delim => $delim, hash => $data, }; if (!match($args)) { $valid_match = 0; last; } } return $valid_match; } # match a hash element (may be an array of elements) against a given pattern sub match { my ($args) = @_; my $delim = $args->{delim}; my $hash = $args->{hash}; my $match = $args->{match}; my $field = $args->{field}; my @matches = traverse($args); return any { $_ =~ m/^$match$/ } @matches; } # walk a JSON structure in search of a given key # borrowed and butchered from view_signatures.pl sub traverse { my ($args) = @_; my $delim = $args->{delim}; my $hash = $args->{hash}; my $match = $args->{match}; my $field = $args->{field}; my @traverse = split /\Q$delim\E/, $field; my @values; while (my $level = shift @traverse) { if ($level eq '%') { # match() is called in a list context # so if we have a bad filter expression # we need to bail in a sensible way return () if ref $hash ne 'ARRAY'; for my $subhash (@{$hash}) { my @match = traverse({ hash => $subhash, delim => $delim, match => $match, field => join $delim, @traverse, }); push(@values, @match) if @match; } } elsif (ref $hash eq 'HASH' && defined $hash->{$level}) { $hash = $hash->{$level}; } else { $hash = undef; last; } } push @values, $hash if defined $hash; return ref $hash eq 'ARRAY' ? @{$hash} : @values; } # merge any custom-defined filters with shortcut options sub merge_filters { my ($args) = @_; my $filters = $args->{filters}; my $delim = $args->{delim}; my $lookup = { host => [qw(request headers Host)], transaction_id => [qw(transaction transaction_id)], rule_id => [qw(matched_rules % rules % actionset id)] }; for my $field (keys %{$lookup}) { if (defined $args->{$field}) { my $key = build_filter_key({ elements => $lookup->{$field}, delim => $delim, }); $filters->{$key} = $args->{$field}; } } } # stub sub to build a filter key sub build_filter_key { my ($args) = @_; my $elements = $args->{elements}; my $delim = $args->{delim}; return join $delim, @{$elements}; } sub main { my ( $host, $transaction_id, # shortcuts $source_ip, $rule_id, # shortcuts %filters, $delim, # used by filters/match/traverse to grok the input $before, $after, # timeframe $logpath, $stdin, # input $partial_chains, $json, # output $verbose, # output $fh, $parsed_ref, # data structures ); GetOptions( 'h|help' => sub { usage(); }, 'H|host=s' => \$host, 't|transaction-id=s' => \$transaction_id, 's|source-ip=s' => \$source_ip, 'r|rule-id=i' => \$rule_id, 'f|filter=s' => \%filters, 'd|delim=s' => \$delim, 'b|before=s' => \$before, 'a|after=s' => \$after, 'l|logpath=s' => \$logpath, 'S|stdin' => \$stdin, 'p|partial-chains' => \$partial_chains, 'j|json' => \$json, 'v|verbose' => \$verbose, ) or usage(); # sanity checks die "Cannot parse both a file and stdin\n" if defined $logpath && defined $stdin; if (defined $source_ip) { $source_ip = NetAddr::IP->new($source_ip); die "Invalid IP/CIDR provided for source IP argument\n" unless $source_ip; } # build_datetime will bail out if an invalid format was given $before = build_datetime($before); $after = build_datetime($after); # figure where we're reading from $logpath ||= '/var/log/mod_sec/modsec_audit.log'; $fh = get_input({ logpath => $logpath, stdin => $stdin, }); die "Could not get a handle on your data\n" unless $fh; # build the filters by merging shortcut options with custom filter directives $delim ||= '.'; merge_filters({ filters => \%filters, host => $host, transaction_id => $transaction_id, source_ip => $source_ip, rule_id => $rule_id, delim => $delim, }); # walk through our input, getting an arrayref of valid entries based on filters and timeframe $parsed_ref = grok_input({ fh => $fh, filters => \%filters, delim => $delim, source_ip => $source_ip, before => $before, after => $after, partial => $partial_chains, verbose => $verbose, }); close $fh || warn $!; # show me the money! print_matches({ ref => $parsed_ref, json => $json, verbose => $verbose, }); } main(); modsecurity-2.9.5/tools/rules-updater.pl.in0000664000175000017500000003076514147005233022130 0ustar mhsvierulamhsvierula#!@PERL@ # # Fetches the latest ModSecurity Ruleset # use strict; use Sys::Hostname; use LWP::UserAgent (); use LWP::Debug qw(-); use URI (); use HTTP::Date (); use Cwd qw(getcwd); use Getopt::Std; my $VERSION = "0.0.1"; my($SCRIPT) = ($0 =~ m/([^\/\\]+)$/); my $CRLFRE = qr/\015?\012/; my $HOST = Sys::Hostname::hostname(); my $UNZIP = [qw(unzip -a)]; my $SENDMAIL = [qw(/usr/lib/sendmail -oi -t)]; my $HAVE_GNUPG = 0; my %PREFIX_MAP = ( -dev => 0, -rc => 1, "" => 9, ); my %GPG_TRUST = (); my $REQUIRED_SIG_TRUST; eval "use GnuPG qw(:trust)"; if ($@) { warn "Could not load GnuPG module - cannot verify ruleset signatures\n"; } else { $HAVE_GNUPG = 1; %GPG_TRUST = ( &TRUST_UNDEFINED => "not", &TRUST_NEVER => "not", &TRUST_MARGINAL => "marginally", &TRUST_FULLY => "fully", &TRUST_ULTIMATE => "ultimatly", ); $REQUIRED_SIG_TRUST = &TRUST_FULLY; } ################################################################################ ################################################################################ my @fetched = (); my %opt = (); getopts('c:r:p:s:v:t:e:f:EuS:D:R:U:F:L:ldh', \%opt); usage(1) if(defined $opt{h}); usage(1) if(@ARGV > 1); # Make sure we have an action if (! grep { defined } @opt{qw(S D R U F L l)}) { usage(1, "Action required."); } # Merge config with commandline opts if ($opt{c}) { %opt = parse_config($opt{c}, \%opt); } LWP::Debug::level("+") if ($opt{d}); # Make the version into a regex if (defined $opt{v}) { my($a,$b,$c,$d) = ($opt{v} =~ m/^(\d+)\.?(\d+)?\.?(\d+)?(?:-(\D+\d+$)|($))/); if (defined $d) { (my $key = $d) =~ s/^(\D+)\d+$/-$1/; unless (exists $PREFIX_MAP{$key}) { usage(1, "Invalid version (bad suffix \"$d\"): $opt{v}"); } $opt{v} = qr/^$a\.$b\.$c-$d$/; } elsif (defined $c) { $opt{v} = qr/^$a\.$b\.$c(?:-|$)/; } elsif (defined $b) { $opt{v} = qr/^$a\.$b\./; } elsif (defined $a) { $opt{v} = qr/^$a\./; } else { usage(1, "Invalid version: $opt{v}"); } if ($opt{d}) { print STDERR "Using version regex: $opt{v}\n"; } } else { $opt{v} = qr/^/; } # Remove trailing slashes from uri and path $opt{r} =~ s/\/+$//; $opt{p} =~ s/\/+$//; # Required opts usage(1, "Repository (-r) required.") unless(defined $opt{r}); usage(1, "Local path (-p) required.") unless(defined $opt{p} or defined $opt{l}); my $ua = LWP::UserAgent->new( agent => "ModSecurity Updator/$VERSION", keep_alive => 1, env_proxy => 1, max_redirect => 5, requests_redirectable => [qw(GET HEAD)], timeout => ($opt{t} || 600), ); sub usage { my $rc = defined($$_[0]) ? $_[0] : 0; my $msg = defined($_[1]) ? "\n$_[1]\n\n" : ""; print STDERR << "EOT"; ${msg}Usage: $SCRIPT [-c config_file] [[options] [action] Options (commandline will override config file): -r uri RepositoryURI Repository URI. -p path LocalRepository Local repository path to use as base for downloads. -s path LocalRules Local rules base path to use for unpacking. -v text Version Full/partial version (EX: 1, 1.5, 1.5.2, 1.5.2-dev3) -t secs Timeout Timeout for fetching data in seconds (default 600). -e addr NotifyEmail Notify via email on update (comma separated list). -f addr NotifyEmailFrom From address for notification email. -u Unpack Unpack into LocalRules/version path. -d Debug Print out lots of debugging. Actions: -S name Fetch the latest stable ruleset, "name" -D name Fetch the latest development ruleset, "name" -R name Fetch the latest release candidate ruleset, "name" -U name Fetch the latest unstable (non-stable) ruleset, "name" -F name Fetch the latest ruleset, "name" -l Print listing of what is available Misc: -c Specify a config file for options. -h This help Examples: # Get a list of what the repository contains: $SCRIPT -rhttp://host/repo/ -l # Get a partial list of versions 1.5.x: $SCRIPT -rhttp://host/repo/ -v1.5 -l # Get the latest stable version of "breach_ModSecurityCoreRules": $SCRIPT -rhttp://host/repo/ -p/my/repo -Sbreach_ModSecurityCoreRules # Get the latest stable 1.5 release of "breach_ModSecurityCoreRules": $SCRIPT -rhttp://host/repo/ -p/my/repo -v1.5 -Sbreach_ModSecurityCoreRules EOT exit $rc; } sub sort_versions { (my $A = $a) =~ s/^(\d+)\.(\d+)\.(\d+)(-[^-\d]+|)(\d*)$/sprintf("%03d%03d%03d%03d%03d", $1, $2, $3, $PREFIX_MAP{$4}, $5)/e; (my $B = $b) =~ s/^(\d+)\.(\d+)\.(\d+)(-[^-\d]+|)(\d*)$/sprintf("%03d%03d%03d%03d%03d", $1, $2, $3, $PREFIX_MAP{$4}, $5)/e; return $A cmp $B; } sub parse_config { my($file,$clo) = @_; my %cfg = (); print STDERR "Parsing config: $file\n" if ($opt{d}); open(CFG, "<$file") or die "Failed to open config \"$file\": $!\n"; while() { # Skip comments and empty lines next if (/^\s*(?:#|$)/); # Parse chomp; my($var,$q1,$val,$q2) = (m/^\s*(\S+)\s+(['"]?)(.*)(\2)\s*$/); # Fixup values $var = lc($var); if ($val =~ m/^(?:true|on)$/i) { $val = 1 }; if ($val =~ m/^(?:false|off)$/i) { $val = 0 }; # Set opts if ($var eq "repositoryuri") { $cfg{r} = $val } elsif ($var eq "localrepository") { $cfg{p} = $val } elsif ($var eq "localrules") { $cfg{s} = $val } elsif ($var eq "version") { $cfg{v} = $val } elsif ($var eq "timeout") { $cfg{t} = $val } elsif ($var eq "notifyemail") { $cfg{e} = $val } elsif ($var eq "notifyemailfrom") { $cfg{f} = $val } elsif ($var eq "notifyemaildiff") { $cfg{E} = $val } elsif ($var eq "unpack") { $cfg{u} = $val } elsif ($var eq "debug") { $cfg{d} = $val } else { die "Invalid config directive: $var\n" } } close CFG; my($k, $v); while (($k, $v) = each %{$clo || {}}) { $cfg{$k} = $v if (defined $v); } return %cfg; } sub repository_dump { my @replist = repository_listing(); print STDERR "\nRepository: $opt{r}\n\n"; unless (@replist) { print STDERR "No matching entries.\n"; return; } for my $repo (@replist) { print "$repo {\n"; my @versions = ruleset_available_versions($repo); for my $version (@versions) { if ($version =~ m/$opt{v}/) { printf "%15s: %s_%s.zip\n", $version, $repo, $version; } elsif ($opt{d}) { print STDERR "Skipping version: $version\n"; } } print "}\n"; } } sub repository_listing { my $res = $ua->get("$opt{r}/.listing"); unless ($res->is_success()) { die "Failed to get repository listing \"$opt{r}/.listing\": ".$res->status_line()."\n"; } return grep(/\S/, split(/$CRLFRE/, $res->content)) ; } sub ruleset_listing { my $res = $ua->get("$opt{r}/$_[0]/.listing"); unless ($res->is_success()) { die "Failed to get ruleset listing \"$opt{r}/$_[0]/.listing\": ".$res->status_line()."\n"; } return grep(/\S/, split(/$CRLFRE/, $res->content)) ; } sub ruleset_available_versions { return sort sort_versions map { m/_([^_]+)\.zip.*$/; $1 } ruleset_listing($_[0]); } sub ruleset_fetch { my($repo, $version) = @_; # Create paths if (! -e "$opt{p}" ) { mkdir "$opt{p}" or die "Failed to create \"$opt{p}\": $!\n"; } if (! -e "$opt{p}/$repo" ) { mkdir "$opt{p}/$repo" or die "Failed to create \"$opt{p}/$repo\": $!\n"; } my $fn = "${repo}_$version.zip"; my $ruleset = "$repo/$fn"; my $ruleset_sig = "$repo/$fn.sig"; if (-e "$opt{p}/$ruleset") { die "Refused to overwrite ruleset \"$opt{p}/$ruleset\".\n"; } # Fetch the ruleset print STDERR "Fetching: $ruleset ...\n"; my $res = $ua->get( "$opt{r}/$ruleset", ":content_file" => "$opt{p}/$ruleset", ); die "Failed to retrieve ruleset $ruleset: ".$res->status_line()."\n" unless ($res->is_success()); # Fetch the ruleset signature if (-e "$opt{p}/$ruleset_sig") { die "Refused to overwrite ruleset signature \"$opt{p}/$ruleset_sig\".\n"; } $res = $ua->get( "$opt{r}/$ruleset_sig", ":content_file" => "$opt{p}/$ruleset_sig", ); # Verify the signature if we can if ($HAVE_GNUPG) { die "Failed to retrieve ruleset signature $ruleset_sig: ".$res->status_line()."\n" unless ($res->is_success()); ruleset_verifysig("$opt{p}/$ruleset", "$opt{p}/$ruleset_sig"); } push @fetched, [$repo, $version, $ruleset, undef]; } sub ruleset_unpack { my($repo, $version, $ruleset) = @{ $_[0] || [] }; my $fn = "$opt{p}/$ruleset"; if (! -e "$fn" ) { die "Internal Error: No ruleset to unpack - \"$fn\"\n"; } # Create paths if (! -e "$opt{s}" ) { mkdir "$opt{s}" or die "Failed to create \"$opt{p}\": $!\n"; } if (! -e "$opt{s}/$repo" ) { mkdir "$opt{s}/$repo" or die "Failed to create \"$opt{p}/$repo\": $!\n"; } if (! -e "$opt{s}/$repo/$version" ) { mkdir "$opt{s}/$repo/$version" or die "Failed to create \"$opt{p}/$repo/$version\": $!\n"; } else { die "Refused to overwrite previously unpacked \"$opt{s}/$repo/$version\".\n"; } # TODO: Verify sig my $pwd = getcwd(); my $unpackdir = "$opt{s}/$repo/$version"; chdir "$unpackdir"; if ($@) { my $err = $!; chdir $pwd; die "Failed to chdir to \"$unpackdir\": $err\n"; } undef $!; system(@$UNZIP, $fn); if ($? != 0) { my $err = $!; chdir $pwd; die "Failed to unpack \"$unpackdir\"".($err?": $err":".")."\n"; } chdir $pwd; # Add where we unpacked it $_->[3] = $unpackdir; return 0; } sub ruleset_fetch_latest { my($repo, @type) = @_; my @versions = ruleset_available_versions($repo); my $verre = defined($opt{v}) ? qr/^$opt{v}/ : qr/^/; my $typere = undef; # Figure out what to look for if (@type == 1 and $type[0] ne "") { my $type = $type[0]; if ($type eq "UNSTABLE") { $typere = qr/\d-\D+\d+$/; } else { $typere = qr/\d-$type\d+$/; } } elsif (@type > 1) { my $type; for (@type) { if ($_ eq "") { $type .= ($type?"|":"").qr/\.\d+$/; } elsif ($_ eq "UNSTABLE") { $type .= ($type?"|":"").qr/\d-\D+\d+$/; } else { $type .= ($type?"|":"").qr/\d-$_\d+$/; } } $typere = qr/$type/; } else { $typere = qr/\.\d+$/; } if ($opt{d}) { print STDERR "REPO: $repo\n"; print STDERR "TYPES: ".join(", ", @type)."\n"; print STDERR "VERSIONS: ".join(", ", @versions)."\n"; print STDERR "REGEX: version=$opt{v} type=$typere\n"; } while (@versions) { my $last = pop(@versions); # Check REs on version if ($last =~ m/$opt{v}/ and (!defined($typere) || $last =~ m/$typere/)) { return ruleset_fetch($repo, $last); } if ($opt{d}) { print STDERR "Skipping version: $last\n"; } } die "No '".join("' or '", @type)."' ruleset found.\n"; } sub notify_email { my $version_text = join("\n", map { "$_->[0] v$_->[1]".(defined($_->[3])?": $_->[3]":"") } @_); my $from = $opt{f} ? "From: $opt{f}\n" : ""; my $body = << "EOT"; ModSecurity rulesets updated and ready to install on host $HOST: $version_text ModSecurity - http://www.modsecurity.org/ EOT # TODO: Diffs open(SM, "|-", @$SENDMAIL) or die "Failed to send mail: $!\n"; print STDERR "Sending notification email to: $opt{e}\n"; print SM << "EOT"; ${from}To: $opt{e} Subject: [$HOST] ModSecurity Ruleset Update Notification $body EOT close SM; } sub ruleset_verifysig { my($fn, $sigfn) = @_; print STDERR "Verifying \"$fn\" with signature \"$sigfn\"\n"; my $gpg = new GnuPG(); my $sig = eval { $gpg->verify( signature => $sigfn, file => $fn ) }; if (defined $sig) { print STDERR sig2str($sig)."\n"; } if (!defined($sig)) { die "Signature validation failed.\n"; } if ( $sig->{trust} < $REQUIRED_SIG_TRUST ) { die "Signature is not trusted ".$GPG_TRUST{$REQUIRED_SIG_TRUST}.".\n"; } return; } sub sig2str { my %sig = %{ $_[0] || {} }; "Signature made ".localtime($sig{timestamp})." by $sig{user} (ID: $sig{keyid}) and is $GPG_TRUST{$sig{trust}} trusted."; } ################################################################################ ################################################################################ # List what is there if ($opt{l}) { repository_dump(); exit 0 } # Latest stable elsif (defined($opt{S})) { ruleset_fetch_latest($opt{S}, "") } # Latest development elsif (defined($opt{D})) { ruleset_fetch_latest($opt{D}, "dev") } # Latest release candidate elsif (defined($opt{R})) { ruleset_fetch_latest($opt{R}, "rc") } # Latest unstable elsif (defined($opt{U})) { ruleset_fetch_latest($opt{U}, "UNSTABLE") } # Latest release candidate or stable elsif (defined($opt{L})) { ruleset_fetch_latest($opt{R}, "rc", "") } # Latest (any type) elsif (defined($opt{F})) { ruleset_fetch_latest($opt{F}, undef) } # Unpack if ($opt{u}) { if (! defined $opt{s} ) { usage(1, "LocalRules is required for unpacking.") } for (@fetched) { ruleset_unpack($_); } } # Unpack if ($opt{e}) { notify_email(@fetched); } modsecurity-2.9.5/tools/rules-updater-example.conf0000664000175000017500000000127014147005233023453 0ustar mhsvierulamhsvierula# This is an example configuration to be used with ruleset-updator.pl -c # The repository URI. RepositoryURI http://username:password@www.example.tld/repository/ # Where to download the rulesets to LocalRepository /path/to/repository # Where to unpack the rulesets (if Unpack is true) LocalRules /path/to/repository # What version (or version prefix) to use #Version 1.5 # Should we unpack the ruleset to LocalRules? Unpack True # Email update notifications #NotifyEmail "modsec-admin@example.tld, someone@example.tld" #NotifyEmailFrom "ModSec Rules Updater " # Output lots of debugging info? Debug False modsecurity-2.9.5/NOTICE0000664000175000017500000000031014147005233016115 0ustar mhsvierulamhsvierula ModSecurity (www.modsecurity.org)     Copyright [2004-2013] Trustwave Holdings, Inc     This product includes software developed at     Trustwave Holdings, Inc (http://www.trustwave.com/). modsecurity-2.9.5/apache2/0000775000175000017500000000000014147005250016521 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/apache2/msc_json.c0000664000175000017500000002556614147005233020517 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2011 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #include "msc_json.h" #ifdef WITH_YAJL const char *base_offset=NULL; int json_add_argument(modsec_rec *msr, const char *value, unsigned length) { msc_arg *arg = (msc_arg *) NULL; /** * If we do not have a prefix, we cannot create a variable name * to reference this argument; for now we simply ignore these */ if (!msr->json->current_key) { msr_log(msr, 3, "Cannot add scalar value without an associated key"); return 1; } arg = (msc_arg *) apr_pcalloc(msr->mp, sizeof(msc_arg)); /** * Argument name is 'prefix + current_key' */ if (msr->json->prefix) { arg->name = apr_psprintf(msr->mp, "%s.%s", msr->json->prefix, msr->json->current_key); } else { arg->name = apr_psprintf(msr->mp, "%s", msr->json->current_key); } arg->name_len = strlen(arg->name); /** * Argument value is copied from the provided string */ arg->value = apr_pstrmemdup(msr->mp, value, length); arg->value_len = length; arg->value_origin_len = length; arg->value_origin_offset = value-base_offset; arg->origin = "JSON"; if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "Adding JSON argument '%s' with value '%s'", arg->name, arg->value); } apr_table_addn(msr->arguments, log_escape_nq_ex(msr->mp, arg->name, arg->name_len), (void *) arg); return 1; } /** * yajl callback functions * For more information on the function signatures and order, check * http://lloyd.github.com/yajl/yajl-1.0.12/structyajl__callbacks.html */ /** * Callback for hash key values; we use those to define the variable names * under ARGS. Whenever we reach a new key, we update the current key value. */ static int yajl_map_key(void *ctx, const unsigned char *key, size_t length) { modsec_rec *msr = (modsec_rec *) ctx; unsigned char *safe_key = (unsigned char *) NULL; /** * yajl does not provide us with null-terminated strings, but * rather expects us to copy the data from the key up to the * length informed; we create a standalone null-termined copy * in safe_key */ safe_key = apr_pstrndup(msr->mp, key, length); if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "New JSON hash key '%s'", safe_key); } /** * TODO: How do we free the previously string value stored here? */ msr->json->current_key = safe_key; return 1; } /** * Callback for null values * * TODO: Is there a way to define true null parameter values instead of * empty values? */ static int yajl_null(void *ctx) { modsec_rec *msr = (modsec_rec *) ctx; return json_add_argument(msr, "", 0); } /** * Callback for boolean values */ static int yajl_boolean(void *ctx, int value) { modsec_rec *msr = (modsec_rec *) ctx; if (value) { return json_add_argument(msr, "true", strlen("true")); } else { return json_add_argument(msr, "false", strlen("false")); } } /** * Callback for string values */ static int yajl_string(void *ctx, const unsigned char *value, size_t length) { modsec_rec *msr = (modsec_rec *) ctx; return json_add_argument(msr, value, length); } /** * Callback for numbers; YAJL can use separate callbacks for integers/longs and * float/double values, but since we are not interested in using the numeric * values here, we use a generic handler which uses numeric strings */ static int yajl_number(void *ctx, const char *value, size_t length) { modsec_rec *msr = (modsec_rec *) ctx; return json_add_argument(msr, value, length); } static int yajl_start_array(void *ctx) { modsec_rec *msr = (modsec_rec *) ctx; if (!msr->json->current_key && !msr->json->prefix) { msr->json->prefix = apr_pstrdup(msr->mp, "array"); msr->json->current_key = apr_pstrdup(msr->mp, "array"); } else if (msr->json->prefix) { msr->json->prefix = apr_psprintf(msr->mp, "%s.%s", msr->json->prefix, msr->json->current_key); } else { msr->json->prefix = apr_pstrdup(msr->mp, msr->json->current_key); } msr->json->current_depth++; if (msr->json->current_depth > msr->txcfg->reqbody_json_depth_limit) { msr->json->depth_limit_exceeded = 1; return 0; } if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "New JSON hash context (prefix '%s')", msr->json->prefix); } return 1; } static int yajl_end_array(void *ctx) { modsec_rec *msr = (modsec_rec *) ctx; unsigned char *separator = (unsigned char *) NULL; /** * If we have no prefix, then this is the end of a top-level hash and * we don't do anything */ if (msr->json->prefix == NULL) return 1; /** * Current prefix might or not include a separator character; top-level * hash keys do not have separators in the variable name */ separator = strrchr(msr->json->prefix, '.'); if (separator) { msr->json->prefix = apr_pstrmemdup(msr->mp, msr->json->prefix, separator - msr->json->prefix); } else { /** * TODO: Check if it is safe to do this kind of pointer tricks */ msr->json->prefix = (unsigned char *) NULL; } msr->json->current_depth--; return 1; } /** * Callback for a new hash, which indicates a new subtree, labeled as the current * argument name, is being created */ static int yajl_start_map(void *ctx) { modsec_rec *msr = (modsec_rec *) ctx; /** * If we do not have a current_key, this is a top-level hash, so we do not * need to do anything */ if (!msr->json->current_key) return 1; /** * Check if we are already inside a hash context, and append or create the * current key name accordingly */ if (msr->json->prefix) { msr->json->prefix = apr_psprintf(msr->mp, "%s.%s", msr->json->prefix, msr->json->current_key); } else { msr->json->prefix = apr_pstrdup(msr->mp, msr->json->current_key); } msr->json->current_depth++; if (msr->json->current_depth > msr->txcfg->reqbody_json_depth_limit) { msr->json->depth_limit_exceeded = 1; return 0; } if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "New JSON hash context (prefix '%s')", msr->json->prefix); } return 1; } /** * Callback for end hash, meaning the current subtree is being closed, and that * we should go back to the parent variable label */ static int yajl_end_map(void *ctx) { modsec_rec *msr = (modsec_rec *) ctx; unsigned char *separator = (unsigned char *) NULL; /** * If we have no prefix, then this is the end of a top-level hash and * we don't do anything */ if (msr->json->prefix == NULL) return 1; /** * Current prefix might or not include a separator character; top-level * hash keys do not have separators in the variable name */ separator = strrchr(msr->json->prefix, '.'); if (separator) { msr->json->prefix = apr_pstrmemdup(msr->mp, msr->json->prefix, separator - msr->json->prefix); msr->json->current_key = apr_psprintf(msr->mp, "%s", separator + 1); } else { /** * TODO: Check if it is safe to do this kind of pointer tricks */ msr->json->current_key = msr->json->prefix; msr->json->prefix = (unsigned char *) NULL; } msr->json->current_depth--; return 1; } /** * Initialise JSON parser. */ int json_init(modsec_rec *msr, char **error_msg) { /** * yajl configuration and callbacks */ static yajl_callbacks callbacks = { yajl_null, yajl_boolean, NULL /* yajl_integer */, NULL /* yajl_double */, yajl_number, yajl_string, yajl_start_map, yajl_map_key, yajl_end_map, yajl_start_array, yajl_end_array }; if (error_msg == NULL) return -1; *error_msg = NULL; msr_log(msr, 4, "JSON parser initialization"); msr->json = apr_pcalloc(msr->mp, sizeof(json_data)); if (msr->json == NULL) return -1; /** * Prefix and current key are initially empty */ msr->json->prefix = (unsigned char *) NULL; msr->json->current_key = (unsigned char *) NULL; msr->json->current_depth = 0; msr->json->depth_limit_exceeded = 0; /** * yajl initialization * * yajl_parser_config definition: * http://lloyd.github.io/yajl/yajl-2.0.1/yajl__parse_8h.html#aec816c5518264d2ac41c05469a0f986c * * TODO: make UTF8 validation optional, as it depends on Content-Encoding */ if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "yajl JSON parsing callback initialization"); } msr->json->handle = yajl_alloc(&callbacks, NULL, msr); yajl_config(msr->json->handle, yajl_allow_partial_values, 0); return 1; } /** * Feed one chunk of data to the JSON parser. */ int json_process_chunk(modsec_rec *msr, const char *buf, unsigned int size, char **error_msg) { if (error_msg == NULL) return -1; *error_msg = NULL; base_offset=buf; /* Feed our parser and catch any errors */ msr->json->status = yajl_parse(msr->json->handle, buf, size); if (msr->json->status != yajl_status_ok) { /* We need to free the yajl error message later, how to do this? */ if (msr->json->depth_limit_exceeded) { *error_msg = "JSON depth limit exceeded"; } else { *error_msg = yajl_get_error(msr->json->handle, 0, NULL, 0); } return -1; } return 1; } /** * Finalise JSON parsing. */ int json_complete(modsec_rec *msr, char **error_msg) { char *json_data = (char *) NULL; if (error_msg == NULL) return -1; *error_msg = NULL; /* Wrap up the parsing process */ msr->json->status = yajl_complete_parse(msr->json->handle); if (msr->json->status != yajl_status_ok) { /* We need to free the yajl error message later, how to do this? */ if (msr->json->depth_limit_exceeded) { *error_msg = "JSON depth limit exceeded"; } else { *error_msg = yajl_get_error(msr->json->handle, 0, NULL, 0); } return -1; } return 1; } /** * Frees the resources used for JSON parsing. */ apr_status_t json_cleanup(modsec_rec *msr) { msr_log(msr, 4, "JSON: Cleaning up JSON results"); if (msr->json->handle != NULL) { yajl_free(msr->json->handle); msr->json->handle = NULL; } return 1; } #endif modsecurity-2.9.5/apache2/Makefile.am0000664000175000017500000001021214147005233020552 0ustar mhsvierulamhsvierulapkglibdir = $(prefix)/lib pkglib_LTLIBRARIES = mod_security2.la mod_security2_la_SOURCES = acmp.c \ apache2_config.c \ apache2_io.c \ apache2_util.c \ libinjection/libinjection_html5.c \ libinjection/libinjection_sqli.c \ libinjection/libinjection_xss.c \ mod_security2.c \ modsecurity.c \ msc_status_engine.c \ msc_crypt.c \ msc_geo.c \ msc_gsb.c \ msc_json.c \ msc_logging.c \ msc_lua.c \ msc_multipart.c \ msc_parsers.c \ msc_pcre.c \ msc_release.c \ msc_remote_rules.c \ msc_reqbody.c \ msc_tree.c \ msc_unicode.c \ msc_util.c \ msc_xml.c \ persist_dbm.c \ re_actions.c \ re.c \ re_operators.c \ re_tfns.c \ re_variables.c mod_security2_la_CFLAGS = @APR_CFLAGS@ \ @APU_CFLAGS@ \ @APXS_CFLAGS@ \ @CURL_CFLAGS@ \ @LIBXML2_CFLAGS@ \ @LUA_CFLAGS@ \ @MODSEC_EXTRA_CFLAGS@ \ @PCRE_CFLAGS@ \ @YAJL_CFLAGS@ \ @SSDEEP_CFLAGS@ mod_security2_la_CPPFLAGS = @APR_CPPFLAGS@ \ @CURL_CPPFLAGS@ \ @LIBXML2_CFLAGS@ \ @LIBXML2_CPPFLAGS@ \ @PCRE_CPPFLAGS@ mod_security2_la_LIBADD = @APR_LDADD@ \ @APU_LDADD@ \ @CURL_LDADD@ \ @LIBXML2_CFLAGS@ \ @LIBXML2_LDADD@ \ @LUA_LDADD@ \ @PCRE_LDADD@ \ @YAJL_LDADD@ if AIX mod_security2_la_LDFLAGS = -module -avoid-version \ @APR_LDFLAGS@ \ @APU_LDFLAGS@ \ @APXS_LDFLAGS@ \ @CURL_LDFLAGS@ \ @LIBXML2_CFLAGS@ \ @LIBXML2_LDFLAGS@ \ @LUA_LDFLAGS@ \ @PCRE_LDFLAGS@ \ @YAJL_LDFLAGS@ \ @SSDEEP_LDFLAGS@ endif if HPUX mod_security2_la_LDFLAGS = -module -avoid-version \ @APR_LDFLAGS@ \ @APU_LDFLAGS@ \ @APXS_LDFLAGS@ \ @CURL_LDFLAGS@ \ @LIBXML2_CFLAGS@ \ @LIBXML2_LDFLAGS@ \ @LUA_LDFLAGS@ \ @PCRE_LDFLAGS@ \ @YAJL_LDFLAGS@ \ @SSDEEP_LDFLAGS@ endif if MACOSX mod_security2_la_LDFLAGS = -module -avoid-version \ @APR_LDFLAGS@ \ @APU_LDFLAGS@ \ @APXS_LDFLAGS@ \ @CURL_LDFLAGS@ \ @LIBXML2_CFLAGS@ \ @LIBXML2_LDFLAGS@ \ @LUA_LDFLAGS@ \ @PCRE_LDFLAGS@ \ @YAJL_LDFLAGS@ \ @SSDEEP_LDFLAGS@ endif if SOLARIS mod_security2_la_LDFLAGS = -module -avoid-version \ @APR_LDFLAGS@ \ @APU_LDFLAGS@ \ @APXS_LDFLAGS@ \ @CURL_LDFLAGS@ \ @LIBXML2_CFLAGS@ \ @LIBXML2_LDFLAGS@ \ @LUA_LDFLAGS@ \ @PCRE_LDFLAGS@ \ @YAJL_LDFLAGS@ \ @SSDEEP_LDFLAGS@ endif if LINUX mod_security2_la_LDFLAGS = -no-undefined -module -avoid-version -R @PCRE_LD_PATH@ \ @APR_LDFLAGS@ \ @APU_LDFLAGS@ \ @APXS_LDFLAGS@ \ @CURL_LDFLAGS@ \ @LIBXML2_CFLAGS@ \ @LIBXML2_LDFLAGS@ \ @LUA_LDFLAGS@ \ @PCRE_LDFLAGS@ \ @YAJL_LDFLAGS@ \ @SSDEEP_LDFLAGS@ endif if FREEBSD mod_security2_la_LDFLAGS = -no-undefined -module -avoid-version \ @APR_LDFLAGS@ \ @APU_LDFLAGS@ \ @APXS_LDFLAGS@ \ @CURL_LDFLAGS@ \ @LIBXML2_CFLAGS@ \ @LIBXML2_LDFLAGS@ \ @LUA_LDFLAGS@ \ @PCRE_LDFLAGS@ \ @YAJL_LDFLAGS@ \ @SSDEEP_LDFLAGS@ endif if OPENBSD mod_security2_la_LDFLAGS = -no-undefined -module -avoid-version \ @APR_LDFLAGS@ \ @APU_LDFLAGS@ \ @APXS_LDFLAGS@ \ @CURL_LDFLAGS@ \ @LIBXML2_CFLAGS@ \ @LIBXML2_LDFLAGS@ \ @LUA_LDFLAGS@ \ @PCRE_LDFLAGS@ \ @YAJL_LDFLAGS@ \ @SSDEEP_LDFLAGS@ endif if NETBSD mod_security2_la_LDFLAGS = -no-undefined -module -avoid-version \ @APR_LDFLAGS@ \ @APU_LDFLAGS@ \ @APXS_LDFLAGS@ \ @CURL_LDFLAGS@ \ @LIBXML2_CFLAGS@ \ @LIBXML2_LDFLAGS@ \ @LUA_LDFLAGS@ \ @PCRE_LDFLAGS@ \ @YAJL_LDFLAGS@ \ @SSDEEP_LDFLAGS@ endif if LINUX install-exec-hook: $(pkglib_LTLIBRARIES) @echo "Removing unused static libraries..."; \ for m in $(pkglib_LTLIBRARIES); do \ base=`echo $$m | sed 's/\..*//'`; \ rm -f $(DESTDIR)$(pkglibdir)/$$base.*a; \ install -D -m444 $(DESTDIR)$(pkglibdir)/$$base.so $(DESTDIR)$(APXS_MODULES)/$$base.so; \ done else install-exec-hook: $(pkglib_LTLIBRARIES) @echo "Removing unused static libraries..."; \ for m in $(pkglib_LTLIBRARIES); do \ base=`echo $$m | sed 's/\..*//'`; \ rm -f $(DESTDIR)$(pkglibdir)/$$base.*a; \ cp -p $(DESTDIR)$(pkglibdir)/$$base.so $(DESTDIR)$(APXS_MODULES); \ done endif modsecurity-2.9.5/apache2/msc_crypt.h0000664000175000017500000000303514147005233020677 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #ifndef _MSC_CRYPT_H_ #define _MSC_CRYPT_H_ #include "modsecurity.h" #include #include #define HMAC_PAD_SIZE 65 #define HASH_ONLY 0 #define FULL_LINK 1 #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifdef __NetBSD__ char DSOLOCAL *mschmac(modsec_rec *msr, const char *key, int key_len, unsigned char *msg, int msglen); #else char DSOLOCAL *hmac(modsec_rec *msr, const char *key, int key_len, unsigned char *msg, int msglen); #endif char DSOLOCAL *do_hash_link(modsec_rec *msr, char *link, int type); char DSOLOCAL *getkey(apr_pool_t *mp); int DSOLOCAL init_response_body_html_parser(modsec_rec *msr); int DSOLOCAL hash_response_body_links(modsec_rec *msr); int DSOLOCAL inject_hashed_response_body(modsec_rec *msr, int elts); int DSOLOCAL do_hash_method(modsec_rec *msr, char *link, int type); int DSOLOCAL modify_response_header(modsec_rec *msr); char DSOLOCAL *normalize_path(modsec_rec *msr, char *input); #endif modsecurity-2.9.5/apache2/re_operators.c0000664000175000017500000045060514147005233021404 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #include "modsecurity.h" #include "re.h" #include "msc_pcre.h" #include "msc_geo.h" #include "msc_gsb.h" #include "apr_lib.h" #include "apr_strmatch.h" #include "acmp.h" #include "msc_util.h" #include "msc_tree.h" #include "msc_crypt.h" #include "msc_remote_rules.h" #include "msc_status_engine.h" #include #if APR_HAVE_ARPA_INET_H #include #endif #ifdef WITH_SSDEEP #include "fuzzy.h" #endif #include "libinjection/libinjection.h" /** * */ void msre_engine_op_register(msre_engine *engine, const char *name, fn_op_param_init_t fn1, fn_op_execute_t fn2) { msre_op_metadata *metadata = (msre_op_metadata *)apr_pcalloc(engine->mp, sizeof(msre_op_metadata)); if (metadata == NULL) return; metadata->name = name; metadata->param_init = fn1; metadata->execute = fn2; apr_table_setn(engine->operators, name, (void *)metadata); } /** * */ msre_op_metadata *msre_engine_op_resolve(msre_engine *engine, const char *name) { return (msre_op_metadata *)apr_table_get(engine->operators, name); } /* -- Operators -- */ /* unconditionalMatch */ static int msre_op_unconditionalmatch_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { *error_msg = "Unconditional match in SecAction."; /* Always match. */ return 1; } /* noMatch */ static int msre_op_nomatch_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { *error_msg = "No match."; /* Never match. */ return 0; } /* ipmatch */ /** * \brief Init function to ipmatch operator * * \param rule ModSecurity rule struct * \param error_msg Error message * * \retval 1 On Success * \retval 0 On Fail */ static int msre_op_ipmatch_param_init(msre_rule *rule, char **error_msg) { char *param = NULL; int res = 0; if (error_msg == NULL) return -1; else *error_msg = NULL; param = apr_pstrdup(rule->ruleset->mp, rule->op_param); res = ip_tree_from_param(rule->ruleset->mp, param, &rule->ip_op, error_msg); if (res) return 0; return 1; } /** * \brief Execution function to ipmatch operator * * \param msr Pointer internal modsec request structure * \param rule Pointer to the rule * \param var Pointer to variable structure * \param error_msg Pointer to error msg * * \retval -1 On Failure * \retval 1 On Match * \retval 0 On No Match */ static int msre_op_ipmatch_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { TreeRoot *rtree = NULL; int res = 0; if (error_msg == NULL) return -1; else *error_msg = NULL; if (rule == NULL || rule->ip_op == NULL) { msr_log(msr, 1, "ipMatch Internal Error: ipmatch value is null."); return 0; } rtree = rule->ip_op; res = tree_contains_ip(msr->mp, rtree, var->value, NULL, error_msg); if (res < 0) { msr_log(msr, 1, "%s", *error_msg); *error_msg = NULL; } if (res > 0) { *error_msg = apr_psprintf(msr->mp, "IPmatch: \"%s\" matched at %s.", var->value, var->name); } return res; } /** * \brief Init function to ipmatchFromFile operator * * \param rule Pointer to the rule * \param error_msg Pointer to error msg * * \retval 1 On Success * \retval 0 On Fail */ static int msre_op_ipmatchFromFile_param_init(msre_rule *rule, char **error_msg) { const char *rootpath = NULL; const char *filepath = NULL; const char *ipfile_path = NULL; char *fn = NULL; int res = 0; TreeRoot *rtree = NULL; if ((rule->op_param == NULL) || (strlen(rule->op_param) == 0)) { *error_msg = apr_psprintf(rule->ruleset->mp, "Missing parameter for " \ "operator 'ipmatchFromFile'."); return 0; } fn = apr_pstrdup(rule->ruleset->mp, rule->op_param); while ((apr_isspace(*fn) != 0) && (*fn != '\0')) { fn++; } if (*fn == '\0') { *error_msg = apr_psprintf(rule->ruleset->mp, "Empty file specification " \ "for operator ipmatchFromFile \"%s\"", fn); return 0; } filepath = fn; if (strlen(fn) > strlen("http://") && strncmp(fn, "http://", strlen("http://")) == 0) { *error_msg = apr_psprintf(rule->ruleset->mp, "HTTPS address or file " \ "path are expected for operator ipmatchFromFile \"%s\"", fn); return 0; } else if (strlen(fn) > strlen("https://") && strncmp(fn, "https://", strlen("https://")) == 0) { #ifdef WITH_CURL res = ip_tree_from_uri(&rtree, fn, rule->ruleset->mp, error_msg); if (res == -2) { /* Failed to download but we won't stop the webserver to start. */ return 1; } else if (res) { return 0; } #else *error_msg = apr_psprintf(rule->ruleset->mp, "ModSecurity was not " \ "compiled with Curl support, it cannot load: \"%s\"", fn); return 0; #endif } else { ipfile_path = apr_pstrndup(rule->ruleset->mp, rule->filename, strlen(rule->filename) - strlen(apr_filepath_name_get(rule->filename))); if (apr_filepath_root(&rootpath, &filepath, APR_FILEPATH_TRUENAME, rule->ruleset->mp) != APR_SUCCESS) { apr_filepath_merge(&fn, ipfile_path, fn, APR_FILEPATH_TRUENAME, rule->ruleset->mp); } res = ip_tree_from_file(&rtree, fn, rule->ruleset->mp, error_msg); if (res) { return 0; } } rule->op_param_data = rtree; return 1; } /** * \brief Execution function to ipmatchFromFile operator * * \param msr Pointer internal modsec request structure * \param rule Pointer to the rule * \param var Pointer to variable structure * \param error_msg Pointer to error msg * * \retval -1 On Failure * \retval 1 On Match * \retval 0 On No Match */ static int msre_op_ipmatchFromFile_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { TreeRoot *rtree = (TreeRoot *)rule->op_param_data; int res = 0; if (error_msg == NULL) return -1; else *error_msg = NULL; if (rtree == NULL) { if (msr->txcfg->debuglog_level >= 6) { msr_log(msr, 1, "ipMatchFromFile: tree value is null."); } return 0; } if (msr->txcfg->debuglog_level >= 4) { msr_log(msr, 4, "IPmatchFromFile: Total tree entries: %d, ipv4 %d " \ "ipv6 %d", rtree->ipv4_tree->count+rtree->ipv6_tree->count, rtree->ipv4_tree->count, rtree->ipv6_tree->count); } res = tree_contains_ip(msr->mp, rtree, var->value, msr, error_msg); if (res < 0) msr_log(msr, 9, "%s", *error_msg); if (res > 0) *error_msg = apr_psprintf(msr->mp, "IPmatchFromFile: \"%s\" matched at " \ "%s.", var->value, var->name); return res; } /* rsub */ static char *param_remove_escape(msre_rule *rule, char *str, int len) { char *parm = apr_pcalloc(rule->ruleset->mp, len); char *ret = parm; for(;*str!='\0';str++) { if(*str != '\\') { *parm++ = *str; } else { str++; if(*str != '/') { str--; *parm++ = *str; } else { *parm++ = *str; } } } *parm = '\0'; return ret; } /** * \brief Init function to rsub operator * * \param rule Pointer to the rule * \param error_msg Pointer to error msg * * \retval 1 On Success * \retval 0 On Fail */ #if !defined(MSC_TEST) static int msre_op_rsub_param_init(msre_rule *rule, char **error_msg) { #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER > 0 ap_regex_t *regex; #else regex_t *regex; #endif const char *pattern = NULL; const char *line = NULL; char *reg_pattern = NULL; char *replace = NULL; char *e_pattern = NULL; char *parsed_replace = NULL; char *flags = NULL; char *data = NULL; char delim; int ignore_case = 0; unsigned short int op_len = 0; if (error_msg == NULL) return -1; *error_msg = NULL; line = rule->op_param; if (apr_tolower(*line) != 's') { *error_msg = apr_psprintf(rule->ruleset->mp, "Error rsub operator format, must be s/ pattern"); return -1; } data = apr_pstrdup(rule->ruleset->mp, line); delim = *++data; if (delim) reg_pattern = ++data; if (reg_pattern) { if (*data != delim) { for(;*data != '\0' ;data++) { if(*data == delim) { data--; if(*data == '\\') { data++; continue; } break; } } } if (*data) { *++data = '\0'; ++data; replace = data; } } if (replace) { if (*data != delim) { for(;*data != '\0' ;data++) { if(*data == delim) { data--; if(*data == '\\') { data++; continue; } break; } } } if (*data) { *++data = '\0'; flags = ++data; } } if (!delim || !reg_pattern || !replace) { *error_msg = apr_psprintf(rule->ruleset->mp, "Error rsub operator format - must be s/regex/str/[flags]"); return -1; } op_len = strlen(replace); parsed_replace = apr_pstrdup(rule->ruleset->mp, parse_pm_content(param_remove_escape(rule, replace, strlen(replace)), op_len, rule, error_msg)); if(!parsed_replace) { *error_msg = apr_psprintf(rule->ruleset->mp, "Error rsub operator parsing input data"); return -1; } rule->sub_str = apr_pstrmemdup(rule->ruleset->mp, parsed_replace, strlen(parsed_replace)); if (flags) { while (*flags) { delim = apr_tolower(*flags); if (delim == 'i') ignore_case = 1; else if (delim == 'd') rule->escape_re = 1; else *error_msg = apr_psprintf(rule->ruleset->mp, "Regex flag not supported"); flags++; } } e_pattern = param_remove_escape(rule, reg_pattern, strlen(reg_pattern)); pattern = apr_pstrndup(rule->ruleset->mp, e_pattern, strlen(e_pattern)); if(strstr(pattern,"%{") == NULL) { #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER > 0 regex = ap_pregcomp(rule->ruleset->mp, pattern, AP_REG_EXTENDED | (ignore_case ? AP_REG_ICASE : 0)); #else regex = ap_pregcomp(rule->ruleset->mp, pattern, REG_EXTENDED | (ignore_case ? REG_ICASE : 0)); #endif rule->sub_regex = regex; } else { rule->re_precomp = 1; rule->re_str = apr_pstrndup(rule->ruleset->mp, pattern, strlen(pattern)); rule->sub_regex = NULL; } return 1; /* OK */ } /** * \brief Execution function to rsub operator * * \param msr Pointer internal modsec request structure * \param rule Pointer to the rule * \param var Pointer to variable structure * \param error_msg Pointer to error msg * * \retval -1 On Failure * \retval 1 On Match * \retval 0 On No Match */ static int msre_op_rsub_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { msc_string *str = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); msc_string *re_pattern = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); char *offset = NULL; char *data = NULL, *pattern = NULL; char *data_out = NULL; unsigned int size = 0; unsigned int maxsize=0; int output_body = 0, input_body = 0, sl; #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER > 0 ap_regmatch_t pmatch[AP_MAX_REG_MATCH]; #else regmatch_t pmatch[AP_MAX_REG_MATCH]; #endif if (error_msg == NULL) return -1; *error_msg = NULL; if(strcmp(var->name,"STREAM_OUTPUT_BODY") == 0 ) { output_body = 1; } else if(strcmp(var->name,"STREAM_INPUT_BODY") == 0 ) { input_body = 1; } else { msr_log(msr,9,"Operator rsub only works with STREAM_* variables"); return -1; } if(rule->re_precomp == 1) { re_pattern->value = apr_pstrndup(msr->mp, rule->re_str, strlen(rule->re_str)); re_pattern->value_len = strlen(re_pattern->value); expand_macros(msr, re_pattern, rule, msr->mp); if(strlen(re_pattern->value) > 0) { if(rule->escape_re == 1) { pattern = log_escape_re(msr->mp, re_pattern->value); if (msr->txcfg->debuglog_level >= 6) { msr_log(msr, 6, "Escaping pattern [%s]",pattern); } #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER > 0 rule->sub_regex = ap_pregcomp(msr->mp, pattern, AP_REG_EXTENDED); #else rule->sub_regex = ap_pregcomp(msr->mp, pattern, REG_EXTENDED); #endif } else { #if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER > 0 rule->sub_regex = ap_pregcomp(msr->mp, re_pattern->value, AP_REG_EXTENDED); #else rule->sub_regex = ap_pregcomp(msr->mp, re_pattern->value, REG_EXTENDED); #endif } } else { rule->sub_regex = NULL; } } if(rule->sub_regex == NULL) { *error_msg = "Internal Error: regex data is null."; return -1; } str->value = apr_pstrndup(msr->mp, rule->sub_str, strlen(rule->sub_str)); str->value_len = strlen(str->value); if(strstr(rule->sub_str,"%{") != NULL) expand_macros(msr, str, rule, msr->mp); maxsize=var->value_len+(AP_MAX_REG_MATCH*1024)+1; nextround: data = apr_pcalloc(msr->mp, maxsize+1); if(data == NULL) { *error_msg = "Internal Error: cannot allocate memory"; return -1; } data_out=data; size=0; for (offset = (char*)var->value; !ap_regexec(rule->sub_regex, offset, AP_MAX_REG_MATCH, pmatch, 0); ) { //Copy of data before the regex match int i; int s = pmatch [0].rm_so; int p_len=pmatch [0].rm_eo - pmatch [0].rm_so; if (size+s>maxsize) { maxsize*=2; goto nextround; } memcpy(data_out,offset,s); data_out+=s; size+=s; //Copy of regex match with replacing data \1..\9 for(i=0;ivalue_len;) { char *x = str->value+i; if (*x == '\\' && *(x + 1) > '0' && *(x + 1) <= '9') { int capture=*(x + 1) - 48; int capture_len=pmatch[capture].rm_eo-pmatch[capture].rm_so; if (size+capture_len>maxsize) { maxsize*=2; goto nextround; } memcpy(data_out,offset+pmatch[capture].rm_so,capture_len); data_out+= capture_len; size+=capture_len; i+=2; } else { if (size+1>maxsize) { maxsize*=2; goto nextround; } *data_out=*(str->value+i); data_out++; size++; i++; } } offset+=s; offset+=p_len; } //Copy of data after the last regex match sl = strlen(offset); if (size+sl>maxsize) { maxsize*=2; goto nextround; } memcpy(data_out,offset,sl); data_out+=sl; size+=sl; *data_out=0; if(msr->stream_output_data != NULL && output_body == 1) { memset(msr->stream_output_data, 0x0, msr->stream_output_length); free(msr->stream_output_data); msr->stream_output_data = NULL; msr->stream_output_length = 0; msr->stream_output_data = (char *)malloc(size+1); if(msr->stream_output_data == NULL) { return -1; } msr->stream_output_length = size; memset(msr->stream_output_data, 0x0, size+1); msr->of_stream_changed = 1; memcpy(msr->stream_output_data, data, size); msr->stream_output_data[size] = '\0'; var->value_len = size; var->value = msr->stream_output_data; } if(msr->stream_input_data != NULL && input_body == 1) { memset(msr->stream_input_data, 0x0, msr->stream_input_length); free(msr->stream_input_data); msr->stream_input_data = NULL; msr->stream_input_length = 0; #ifdef MSC_LARGE_STREAM_INPUT msr->stream_input_allocated_length = 0; msr->stream_input_data = (char *)malloc(size); #else msr->stream_input_data = (char *)malloc(size+1); #endif if(msr->stream_input_data == NULL) { return -1; } msr->stream_input_length = size; #ifdef MSC_LARGE_STREAM_INPUT msr->stream_input_allocated_length = size; memset(msr->stream_input_data, 0x0, size); #else memset(msr->stream_input_data, 0x0, size+1); #endif msr->if_stream_changed = 1; memcpy(msr->stream_input_data, data, size); msr->stream_input_data[size] = '\0'; var->value_len = size; var->value = msr->stream_input_data; } if (! *error_msg) { *error_msg = apr_psprintf(msr->mp, "Operator rsub succeeded."); } return 1; } #endif /* MSC_TEST */ /** * \brief Init function to validateHash * * \param rule ModSecurity rule struct * \param error_msg Error message * * \retval 1 On success * \retval 0 On fail */ static int msre_op_validateHash_param_init(msre_rule *rule, char **error_msg) { const char *errptr = NULL; int erroffset; msc_regex_t *regex; const char *pattern = rule->op_param; #ifdef WITH_PCRE_STUDY #ifdef WITH_PCRE_JIT int rc, jit; #endif #endif if (error_msg == NULL) return -1; *error_msg = NULL; /* Compile pattern */ if(strstr(pattern,"%{") == NULL) { regex = msc_pregcomp_ex(rule->ruleset->mp, pattern, PCRE_DOTALL | PCRE_DOLLAR_ENDONLY, &errptr, &erroffset, msc_pcre_match_limit, msc_pcre_match_limit_recursion); if (regex == NULL) { *error_msg = apr_psprintf(rule->ruleset->mp, "Error compiling pattern (offset %d): %s", erroffset, errptr); return 0; } #ifdef WITH_PCRE_STUDY #ifdef WITH_PCRE_JIT rc = msc_fullinfo(regex, PCRE_INFO_JIT, &jit); if ((rc != 0) || (jit != 1)) { *error_msg = apr_psprintf(rule->ruleset->mp, "Rule %pp [id \"%s\"][file \"%s\"][line \"%d\"] - " "Execution error - " "Does not support JIT (%d)", rule,((rule->actionset != NULL)&&((rule->actionset->id != NULL)&& (rule->actionset->id != NOT_SET_P))) ? rule->actionset->id : "-", rule->filename != NULL ? rule->filename : "-", rule->line_num,rc); } #endif #endif rule->op_param_data = regex; } else { rule->re_precomp = 1; rule->re_str = apr_pstrndup(rule->ruleset->mp, pattern, strlen(pattern)); rule->op_param_data = NULL; } return 1; /* OK */ } /** * \brief Execute function to validateHash * * \param msr ModSecurity transaction resource * \param rule ModSecurity rule struct * \param var ModSecurity variable struct * \param error_msg Error message * * \retval 1 On success * \retval 0 On fail */ static int msre_op_validateHash_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { msc_regex_t *regex = (msc_regex_t *)rule->op_param_data; msc_string *re_pattern = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); const char *target; const char *errptr = NULL; int erroffset; unsigned int target_length; char *my_error_msg = NULL; int ovector[33]; int rc; const char *pattern = NULL; #ifdef WITH_PCRE_STUDY #ifdef WITH_PCRE_JIT int jit; #endif #endif if (error_msg == NULL) return -1; *error_msg = NULL; if (msr->txcfg->hash_enforcement == HASH_DISABLED || msr->txcfg->hash_is_enabled == HASH_DISABLED) return 0; if (regex == NULL) { if(rule->re_precomp == 0) { *error_msg = "Internal Error: regex data is null."; return -1; } else { if(re_pattern == NULL) { *error_msg = "Internal Error: regex variable data is null."; return -1; } re_pattern->value = apr_pstrndup(msr->mp, rule->re_str, strlen(rule->re_str)); re_pattern->value_len = strlen(re_pattern->value); expand_macros(msr, re_pattern, rule, msr->mp); pattern = log_escape_re(msr->mp, re_pattern->value); if (msr->txcfg->debuglog_level >= 6) { msr_log(msr, 6, "Escaping pattern [%s]",pattern); } regex = msc_pregcomp_ex(msr->mp, pattern, PCRE_DOTALL | PCRE_DOLLAR_ENDONLY, &errptr, &erroffset, msc_pcre_match_limit, msc_pcre_match_limit_recursion); if (regex == NULL) { *error_msg = apr_psprintf(msr->mp, "Error compiling pattern (offset %d): %s", erroffset, errptr); return 0; } #ifdef WITH_PCRE_STUDY #ifdef WITH_PCRE_JIT if (msr->txcfg->debuglog_level >= 4) { rc = msc_fullinfo(regex, PCRE_INFO_JIT, &jit); if ((rc != 0) || (jit != 1)) { *error_msg = apr_psprintf(msr->mp, "Rule %pp [id \"%s\"][file \"%s\"][line \"%d\"] - " "Execution error - " "Does not support JIT (%d)", rule,((rule->actionset != NULL)&&((rule->actionset->id != NULL)&& (rule->actionset->id != NOT_SET_P))) ? rule->actionset->id : "-", rule->filename != NULL ? rule->filename : "-", rule->line_num,rc); msr_log(msr, 4, "%s.", *error_msg); } } #endif #endif } } /* If the given target is null run against an empty * string. This is a behaviour consistent with previous * releases. */ if (var->value == NULL) { target = ""; target_length = 0; } else { target = var->value; target_length = var->value_len; } /* We always use capture so that ovector can be used as working space * and no memory has to be allocated for any backreferences. */ rc = msc_regexec_capture(regex, target, target_length, ovector, 30, &my_error_msg); if ((rc == PCRE_ERROR_MATCHLIMIT) || (rc == PCRE_ERROR_RECURSIONLIMIT)) { msc_string *s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); if (s == NULL) return -1; s->name = apr_pstrdup(msr->mp, "MSC_PCRE_LIMITS_EXCEEDED"); if (s->name == NULL) return -1; s->name_len = strlen(s->name); s->value = apr_pstrdup(msr->mp, "1"); if (s->value == NULL) return -1; s->value_len = 1; apr_table_setn(msr->tx_vars, s->name, (void *)s); *error_msg = apr_psprintf(msr->mp, "Rule %pp [id \"%s\"][file \"%s\"][line \"%d\"] - " "Execution error - " "PCRE limits exceeded (%d): %s", rule,((rule->actionset != NULL)&&(rule->actionset->id != NULL)) ? rule->actionset->id : "-", rule->filename != NULL ? rule->filename : "-", rule->line_num,rc, my_error_msg); msr_log(msr, 3, "%s.", *error_msg); return 0; /* No match. */ } else if (rc < -1) { *error_msg = apr_psprintf(msr->mp, "Regex execution failed (%d): %s", rc, my_error_msg); return -1; } if (rc != PCRE_ERROR_NOMATCH) { /* Match. */ /* We no longer escape the pattern here as it is done when logging */ char *pattern = apr_pstrdup(msr->mp, log_escape(msr->mp, regex->pattern ? regex->pattern : "")); char *hmac = NULL, *valid = NULL; char *hash_link = NULL, *nlink = NULL; if (strlen(pattern) > 252) { *error_msg = apr_psprintf(msr->mp, "Request URI matched \"%.252s ...\" at %s.", pattern, var->name); } else { *error_msg = apr_psprintf(msr->mp, "Request URI matched \"%s\" at %s.", pattern, var->name); } valid = strstr(target, msr->txcfg->crypto_param_name); if(valid == NULL) { if (msr->txcfg->debuglog_level >= 9) msr_log(msr, 9, "Request URI without hash parameter [%s]", target); if (strlen(pattern) > 252) { *error_msg = apr_psprintf(msr->mp, "Request URI matched \"%.252s ...\" at %s. No Hash parameter", pattern, var->name); } else { *error_msg = apr_psprintf(msr->mp, "Request URI matched \"%s\" at %s. No Hash parameter", pattern, var->name); } return 1; } else { if(strlen(valid) < strlen(msr->txcfg->crypto_param_name)+1) return 1; hmac = valid+strlen(msr->txcfg->crypto_param_name)+1; nlink = apr_pstrmemdup(msr->mp, target, strlen(target) - strlen(valid) - 1); msr_log(msr, 9, "Validating URI %s size %zu",nlink,strlen(nlink)); hash_link = do_hash_link(msr, (char *)nlink, HASH_ONLY); if(strcmp(hmac, hash_link) != 0) { if (strlen(pattern) > 252) { *error_msg = apr_psprintf(msr->mp, "Request URI matched \"%.252s ...\" at %s. Hash parameter hash value = [%s] Requested URI hash value = [%s]", pattern, var->name, hmac, hash_link); } else { *error_msg = apr_psprintf(msr->mp, "Request URI matched \"%s\" at %s. Hash parameter hash value = [%s] Requested URI hash value = [%s]", pattern, var->name, hmac, hash_link); } return 1; } } return 0; } return 0; } /* rx */ static int msre_op_rx_param_init(msre_rule *rule, char **error_msg) { const char *errptr = NULL; int erroffset; msc_regex_t *regex; const char *pattern = rule->op_param; #ifdef WITH_PCRE_STUDY #ifdef WITH_PCRE_JIT int rc, jit; #endif #endif if (error_msg == NULL) return -1; *error_msg = NULL; /* Compile pattern */ if(strstr(pattern,"%{") == NULL) { regex = msc_pregcomp_ex(rule->ruleset->mp, pattern, PCRE_DOTALL | PCRE_DOLLAR_ENDONLY, &errptr, &erroffset, msc_pcre_match_limit, msc_pcre_match_limit_recursion); if (regex == NULL) { *error_msg = apr_psprintf(rule->ruleset->mp, "Error compiling pattern (offset %d): %s", erroffset, errptr); return 0; } #ifdef WITH_PCRE_STUDY #ifdef WITH_PCRE_JIT rc = msc_fullinfo(regex, PCRE_INFO_JIT, &jit); if ((rc != 0) || (jit != 1)) { *error_msg = apr_psprintf(rule->ruleset->mp, "Rule %pp [id \"%s\"][file \"%s\"][line \"%d\"] - " "Execution error - " "Does not support JIT (%d)", rule,((rule->actionset != NULL)&&((rule->actionset->id != NULL)&& (rule->actionset->id != NOT_SET_P))) ? rule->actionset->id : "-", rule->filename != NULL ? rule->filename : "-", rule->line_num,rc); } #endif #endif rule->op_param_data = regex; } else { rule->re_precomp = 1; rule->re_str = apr_pstrndup(rule->ruleset->mp, pattern, strlen(pattern)); rule->op_param_data = NULL; } return 1; /* OK */ } static int msre_op_rx_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { msc_regex_t *regex = (msc_regex_t *)rule->op_param_data; msc_string *re_pattern = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); const char *target; const char *errptr = NULL; int erroffset; unsigned int target_length; char *my_error_msg = NULL; int ovector[33]; int capture = 0; int matched_bytes = 0; int matched = 0; int rc; char *qspos = NULL; const char *parm = NULL, *pattern = NULL; msc_parm *mparm = NULL; #ifdef WITH_PCRE_STUDY #ifdef WITH_PCRE_JIT int jit; #endif #endif if (error_msg == NULL) return -1; *error_msg = NULL; if (regex == NULL) { if(rule->re_precomp == 0) { *error_msg = "Internal Error: regex data is null."; return -1; } else { if(re_pattern == NULL) { *error_msg = "Internal Error: regex variable data is null."; return -1; } re_pattern->value = apr_pstrndup(msr->mp, rule->re_str, strlen(rule->re_str)); re_pattern->value_len = strlen(re_pattern->value); expand_macros(msr, re_pattern, rule, msr->mp); pattern = log_escape_re(msr->mp, re_pattern->value); if (msr->txcfg->debuglog_level >= 6) { msr_log(msr, 6, "Escaping pattern [%s]",pattern); } regex = msc_pregcomp_ex(msr->mp, pattern, PCRE_DOTALL | PCRE_DOLLAR_ENDONLY, &errptr, &erroffset, msc_pcre_match_limit, msc_pcre_match_limit_recursion); if (regex == NULL) { *error_msg = apr_psprintf(msr->mp, "Error compiling pattern (offset %d): %s", erroffset, errptr); return 0; } #ifdef WITH_PCRE_STUDY #ifdef WITH_PCRE_JIT if (msr->txcfg->debuglog_level >= 4) { rc = msc_fullinfo(regex, PCRE_INFO_JIT, &jit); if ((rc != 0) || (jit != 1)) { *error_msg = apr_psprintf(msr->mp, "Rule %pp [id \"%s\"][file \"%s\"][line \"%d\"] - " "Execution error - " "Does not support JIT (%d)", rule,((rule->actionset != NULL)&&((rule->actionset->id != NULL)&& (rule->actionset->id != NOT_SET_P))) ? rule->actionset->id : "-", rule->filename != NULL ? rule->filename : "-", rule->line_num,rc); msr_log(msr, 4, "%s.", *error_msg); } } #endif #endif } } /* If the given target is null run against an empty * string. This is a behaviour consistent with previous * releases. */ if (var->value == NULL) { target = ""; target_length = 0; } else { target = var->value; target_length = var->value_len; } /* Are we supposed to capture subexpressions? */ capture = apr_table_get(rule->actionset->actions, "capture") ? 1 : 0; matched_bytes = apr_table_get(rule->actionset->actions, "sanitizeMatchedBytes") ? 1 : 0; if(!matched_bytes) matched_bytes = apr_table_get(rule->actionset->actions, "sanitiseMatchedBytes") ? 1 : 0; matched = apr_table_get(rule->actionset->actions, "sanitizeMatched") ? 1 : 0; if(!matched) matched = apr_table_get(rule->actionset->actions, "sanitiseMatched") ? 1 : 0; /* Show when the regex captures but "capture" is not set */ if (msr->txcfg->debuglog_level >= 6) { int capcount = 0; rc = msc_fullinfo(regex, PCRE_INFO_CAPTURECOUNT, &capcount); if (msr->txcfg->debuglog_level >= 6) { if ((capture == 0) && (capcount > 0)) { msr_log(msr, 6, "Ignoring regex captures since \"capture\" action is not enabled."); } } } /* We always use capture so that ovector can be used as working space * and no memory has to be allocated for any backreferences. */ rc = msc_regexec_capture(regex, target, target_length, ovector, 30, &my_error_msg); if ((rc == PCRE_ERROR_MATCHLIMIT) || (rc == PCRE_ERROR_RECURSIONLIMIT)) { msc_string *s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); if (s == NULL) return -1; s->name = apr_pstrdup(msr->mp, "MSC_PCRE_LIMITS_EXCEEDED"); if (s->name == NULL) return -1; s->name_len = strlen(s->name); s->value = apr_pstrdup(msr->mp, "1"); if (s->value == NULL) return -1; s->value_len = 1; apr_table_setn(msr->tx_vars, s->name, (void *)s); *error_msg = apr_psprintf(msr->mp, "Rule %pp [id \"%s\"][file \"%s\"][line \"%d\"] - " "Execution error - " "PCRE limits exceeded (%d): %s", rule,((rule->actionset != NULL)&&(rule->actionset->id != NULL)) ? rule->actionset->id : "-", rule->filename != NULL ? rule->filename : "-", rule->line_num,rc, my_error_msg); msr_log(msr, 3, "%s.", *error_msg); return 0; /* No match. */ } else if (rc < -1) { *error_msg = apr_psprintf(msr->mp, "Regex execution failed (%d): %s", rc, my_error_msg); return -1; } /* Handle captured subexpressions. */ if (capture && rc > 0) { int i; /* Unset any of the previously set capture variables. */ apr_table_unset(msr->tx_vars, "0"); apr_table_unset(msr->tx_vars, "1"); apr_table_unset(msr->tx_vars, "2"); apr_table_unset(msr->tx_vars, "3"); apr_table_unset(msr->tx_vars, "4"); apr_table_unset(msr->tx_vars, "5"); apr_table_unset(msr->tx_vars, "6"); apr_table_unset(msr->tx_vars, "7"); apr_table_unset(msr->tx_vars, "8"); apr_table_unset(msr->tx_vars, "9"); /* Use the available captures. */ for(i = 0; i < rc; i++) { msc_string *s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); if (s == NULL) return -1; s->name = apr_psprintf(msr->mp, "%d", i); if (s->name == NULL) return -1; s->name_len = strlen(s->name); s->value = apr_pstrmemdup(msr->mp, target + ovector[2 * i], ovector[2 * i + 1] - ovector[2 * i]); if (s->value == NULL) return -1; s->value_len = (ovector[2 * i + 1] - ovector[2 * i]); apr_table_addn(msr->tx_vars, s->name, (void *)s); if(((matched == 1) || (matched_bytes == 1)) && (var != NULL) && (var->name != NULL)) { qspos = apr_psprintf(msr->mp, "%s", var->name); parm = strstr(qspos, ":"); if (parm != NULL) { parm++; mparm = apr_palloc(msr->mp, sizeof(msc_parm)); if (mparm == NULL) continue; mparm->value = apr_pstrmemdup(msr->mp,s->value,s->value_len); mparm->pad_1 = rule->actionset->arg_min; mparm->pad_2 = rule->actionset->arg_max; apr_table_addn(msr->pattern_to_sanitize, parm, (void *)mparm); } else { mparm = apr_palloc(msr->mp, sizeof(msc_parm)); if (mparm == NULL) continue; mparm->value = apr_pstrmemdup(msr->mp,s->value,s->value_len); apr_table_addn(msr->pattern_to_sanitize, qspos, (void *)mparm); } } if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "Added regex subexpression to TX.%d: %s", i, log_escape_nq_ex(msr->mp, s->value, s->value_len)); } } } if (rc != PCRE_ERROR_NOMATCH) { /* Match. */ /* We no longer escape the pattern here as it is done when logging */ char *pattern = apr_pstrdup(msr->mp, log_escape(msr->mp, regex->pattern ? regex->pattern : "")); /* This message will be logged. */ if (strlen(pattern) > 252) { *error_msg = apr_psprintf(msr->mp, "Pattern match \"%.252s ...\" at %s.", pattern, var->name); } else { *error_msg = apr_psprintf(msr->mp, "Pattern match \"%s\" at %s.", pattern, var->name); } return 1; } /* No match. */ return 0; } /* pm */ static int msre_op_pm_param_init(msre_rule *rule, char **error_msg) { ACMP *p; const char *phrase; const char *next; unsigned short int op_len; if ((rule->op_param == NULL)||(strlen(rule->op_param) == 0)) { *error_msg = apr_psprintf(rule->ruleset->mp, "Missing parameter for operator 'pm'."); return 0; /* ERROR */ } op_len = strlen(rule->op_param); p = acmp_create(0, rule->ruleset->mp); if (p == NULL) return 0; phrase = apr_pstrdup(rule->ruleset->mp, parse_pm_content(rule->op_param, op_len, rule, error_msg)); if(phrase == NULL) phrase = apr_pstrdup(rule->ruleset->mp, rule->op_param); /* Loop through phrases */ /* ENH: Need to allow quoted phrases w/space */ for (;;) { while((apr_isspace(*phrase) != 0) && (*phrase != '\0')) phrase++; if (*phrase == '\0') break; next = phrase; while((apr_isspace(*next) == 0) && (*next != 0)) next++; acmp_add_pattern(p, phrase, NULL, NULL, next - phrase); phrase = next; } acmp_prepare(p); rule->op_param_data = p; return 1; } /* pmFromFile */ static int msre_op_pmFromFile_param_init(msre_rule *rule, char **error_msg) { char errstr[1024]; char buf[HUGE_STRING_LEN + 1]; char *fn = NULL; char *next = NULL; char *start = NULL; char *end = NULL; const char *rulefile_path; char *processed = NULL; unsigned short int op_len; apr_status_t rc; apr_file_t *fd = NULL; ACMP *p; if ((rule->op_param == NULL)||(strlen(rule->op_param) == 0)) { *error_msg = apr_psprintf(rule->ruleset->mp, "Missing parameter for operator 'pmFromFile'."); return 0; /* ERROR */ } p = acmp_create(0, rule->ruleset->mp); if (p == NULL) return 0; fn = apr_pstrdup(rule->ruleset->mp, rule->op_param); /* Get the path of the rule filename to use as a base */ rulefile_path = apr_pstrndup(rule->ruleset->mp, rule->filename, strlen(rule->filename) - strlen(apr_filepath_name_get(rule->filename))); #ifdef DEBUG_CONF fprintf(stderr, "Rulefile path: \"%s\"\n", rulefile_path); #endif /* Loop through filenames */ /* ENH: Need to allow quoted filenames w/space */ for (;;) { const char *rootpath = NULL; const char *filepath = NULL; int line = 0; /* Trim whitespace */ while((apr_isspace(*fn) != 0) && (*fn != '\0')) fn++; if (*fn == '\0') break; next = fn; while((apr_isspace(*next) == 0) && (*next != '\0')) next++; while((apr_isspace(*next) != 0) && (*next != '\0')) *(next++) = '\0'; /* Add path of the rule filename for a relative phrase filename */ filepath = fn; if (strlen(fn) > strlen("http://") && strncmp(fn, "http://", strlen("http://")) == 0) { *error_msg = apr_psprintf(rule->ruleset->mp, "HTTPS address or " \ "file path are expected for operator pmFromFile \"%s\"", fn); return 0; } else if (strlen(fn) > strlen("https://") && strncmp(fn, "https://", strlen("https://")) == 0) { #ifdef WITH_CURL int res = 0; char *word = NULL; char *brkt = NULL; char *sep = "\n"; struct msc_curl_memory_buffer_t chunk; res = msc_remote_download_content(rule->ruleset->mp, fn, NULL, &chunk, error_msg); if (res == -2) { /* If download failed but SecRemoteRulesFailAction is set to Warn. */ return 1; } else if (res < 0) { return 0; } for (word = strtok_r(chunk.memory, sep, &brkt); word; word = strtok_r(NULL, sep, &brkt)) { /* Ignore empty lines and comments */ if (*word == '#') continue; acmp_add_pattern(p, word, NULL, NULL, strlen(word)); } msc_remote_clean_chunk(&chunk); #else *error_msg = apr_psprintf(rule->ruleset->mp, "ModSecurity was not " \ "compiled with Curl support, it cannot load: \"%s\"", fn); return 0; #endif } else { if (apr_filepath_root(&rootpath, &filepath, APR_FILEPATH_TRUENAME, rule->ruleset->mp) != APR_SUCCESS) { /* We are not an absolute path. It could mean an error, but * let that pass through to the open call for a better error */ apr_filepath_merge(&fn, rulefile_path, fn, APR_FILEPATH_TRUENAME, rule->ruleset->mp); } /* Open file and read */ rc = apr_file_open(&fd, fn, APR_READ | APR_BUFFERED | APR_FILE_NOCLEANUP, 0, rule->ruleset->mp); if (rc != APR_SUCCESS) { *error_msg = apr_psprintf(rule->ruleset->mp, "Could not open phrase file \"%s\": %s", fn, apr_strerror(rc, errstr, 1024)); return 0; } #ifdef DEBUG_CONF fprintf(stderr, "Loading phrase file: \"%s\"\n", fn); #endif /* Read one pattern per line skipping empty/commented */ for(;;) { line++; rc = apr_file_gets(buf, HUGE_STRING_LEN, fd); if (rc == APR_EOF) break; if (rc != APR_SUCCESS) { *error_msg = apr_psprintf(rule->ruleset->mp, "Could not read \"%s\" line %d: %s", fn, line, apr_strerror(rc, errstr, 1024)); return 0; } op_len = strlen(buf); processed = apr_pstrdup(rule->ruleset->mp, parse_pm_content(buf, op_len, rule, error_msg)); /* Trim Whitespace */ if(processed != NULL) start = processed; else start = buf; while ((apr_isspace(*start) != 0) && (*start != '\0')) start++; if(processed != NULL) end = processed + strlen(processed); else end = buf + strlen(buf); if (end > start) end--; while ((end > start) && (apr_isspace(*end) != 0)) end--; if (end > start) { *(++end) = '\0'; } /* Ignore empty lines and comments */ if ((start == end) || (*start == '#')) continue; acmp_add_pattern(p, start, NULL, NULL, (end - start)); } } fn = next; if (fd != NULL) apr_file_close(fd); } acmp_prepare(p); rule->op_param_data = p; return 1; } static int msre_op_pm_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { const char *match = NULL; apr_status_t rc = 0; int capture; ACMPT pt; /* Nothing to read */ if ((var->value == NULL) || (var->value_len == 0)) return 0; /* Are we supposed to capture subexpressions? */ capture = apr_table_get(rule->actionset->actions, "capture") ? 1 : 0; if (rule->op_param_data == NULL) { if (msr->txcfg->debuglog_level >= 6) { msr_log(msr, 1, "ACMPTree is null."); } return 0; } pt.parser = (ACMP *)rule->op_param_data; pt.ptr = NULL; rc = acmp_process_quick(&pt, &match, var->value, var->value_len); if (rc) { char *match_escaped = log_escape(msr->mp, match ? match : ""); /* This message will be logged. */ if (strlen(match_escaped) > 252) { *error_msg = apr_psprintf(msr->mp, "Matched phrase \"%.252s ...\" at %s.", match_escaped, var->name); } else { *error_msg = apr_psprintf(msr->mp, "Matched phrase \"%s\" at %s.", match_escaped, var->name); } /* Handle capture as tx.0=match */ if (capture) { int i; msc_string *s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); if (s == NULL) return -1; s->name = "0"; s->name_len = strlen(s->name); s->value = apr_pstrdup(msr->mp, match); if (s->value == NULL) return -1; s->value_len = strlen(s->value); apr_table_setn(msr->tx_vars, s->name, (void *)s); if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "Added phrase match to TX.0: %s", log_escape_nq_ex(msr->mp, s->value, s->value_len)); } /* Unset the remaining ones (from previous invocations). */ for(i = rc; i <= 9; i++) { char buf[2]; apr_snprintf(buf, sizeof(buf), "%d", i); apr_table_unset(msr->tx_vars, buf); } } return 1; } return rc; } /* gsbLookup */ /** * \brief Reduce /./ to / * * \param pool Pointer to the memory pool * \param domain Input data * * \retval domain On Failure * \retval url On Success */ static const char *gsb_replace_tpath(apr_pool_t *pool, const char *domain, int len) { char *pos = NULL, *data = NULL; char *url = NULL; int match = 0; url = apr_palloc(pool, len + 1); data = apr_palloc(pool, len + 1); memset(data, 0, len+1); memset(url, 0, len+1); memcpy(url, domain, len); while(( pos = strstr(url , "/./" )) != NULL) { match = 1; data[0] = '\0'; strncat(data, url, pos - url); strcat(data , "/"); strcat(data ,pos + strlen("/./")); strncpy(url , data, len); } if(match == 0) return domain; return url; } /** * \brief Reduce double dot to single dot * * \param msr ModSecurity transation resource * \param domain Input data * * \retval domain On Failure * \retval reduced On Success */ static const char *gsb_reduce_char(apr_pool_t *pool, const char *domain) { char *ptr = apr_pstrdup(pool, domain); char *data = NULL; char *reduced = NULL; int skip = 0; if(ptr == NULL) return domain; data = apr_pcalloc(pool, strlen(ptr)); if(data == NULL) return domain; reduced = data; while(*ptr != '\0') { switch(*ptr) { case '.': ptr++; if(*ptr == '.') skip = 1; ptr--; break; case '/': ptr++; if(*ptr == '/') skip = 1; ptr--; break; } if(skip == 0) { *data = *ptr; data++; } ptr++; skip = 0; } *data = '\0'; --data; if(*data == '.') *data = '\0'; else ++data; return reduced; } /** * \brief Verify function to gsbLookup operator * * \param msr ModSecurity transaction resource * \param match Pointer to input data * \param match_length Input size * * \retval -1 On Failure * \retval 1 On Match * \retval 0 On No Match */ static int verify_gsb(gsb_db *gsb, modsec_rec *msr, const char *match, unsigned int match_length) { apr_md5_ctx_t ctx; apr_status_t rc; unsigned char digest[APR_MD5_DIGESTSIZE]; const char *hash = NULL; const char *search = NULL; memset(digest, 0, sizeof(digest)); apr_md5_init(&ctx); if ((rc = apr_md5_update(&ctx, match, match_length)) != APR_SUCCESS) return -1; apr_md5_final(digest, &ctx); hash = apr_psprintf(msr->mp, "%s", bytes2hex(msr->mp, digest, 16)); if ((hash != NULL) && (gsb->gsb_table != NULL)) { search = apr_hash_get(gsb->gsb_table, hash, APR_HASH_KEY_STRING); if (search != NULL) return 1; } return 0; } /** * \brief Init function to gsbLookup operator * * \param rule ModSecurity rule struct * \param error_msg Error message * * \retval 1 On Success * \retval 0 On Fail */ static int msre_op_gsbLookup_param_init(msre_rule *rule, char **error_msg) { const char *errptr = NULL; int erroffset; msc_regex_t *regex; if (error_msg == NULL) return -1; *error_msg = NULL; /* Compile rule->op_param */ regex = msc_pregcomp_ex(rule->ruleset->mp, rule->op_param, PCRE_DOTALL | PCRE_MULTILINE, &errptr, &erroffset, msc_pcre_match_limit, msc_pcre_match_limit_recursion); if (regex == NULL) { *error_msg = apr_psprintf(rule->ruleset->mp, "Error compiling pattern (offset %d): %s", erroffset, errptr); return 0; } rule->op_param_data = regex; return 1; /* OK */ } /** * \brief Execution function to gsbLookup operator * * \param msr ModSecurity transaction resource * \param rule ModSecurity rule struct * \param var ModSecurity variable struct * \param error_msg Error message * * \retval -1 On Failure * \retval 1 On Match * \retval 0 On No Match */ static int msre_op_gsbLookup_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { msc_regex_t *regex = (msc_regex_t *)rule->op_param_data; char *my_error_msg = NULL; int ovector[33]; unsigned int offset = 0; gsb_db *gsb = msr->txcfg->gsb; const char *match = NULL; unsigned int match_length; unsigned int canon_length; int rv, i, ret, count_slash; unsigned int j = 0; unsigned int size = var->value_len; char *base = NULL, *domain = NULL, *savedptr = NULL; char *str = NULL, *canon = NULL, *dot = NULL; char *data = NULL, *ptr = NULL, *url = NULL; int capture, domain_len; int d_pos = -1; int s_pos = -1; if (error_msg == NULL) return -1; *error_msg = NULL; if(regex == NULL) { *error_msg = "Internal Error: regex is null."; return 0; } if(gsb == NULL) { msr_log(msr, 1, "GSB lookup failed without a database. Set SecGsbLookupDB."); return 0; } data = apr_pcalloc(msr->mp, var->value_len+1); if(data == NULL) { *error_msg = "Internal Error: cannot allocate memory for data."; return -1; } capture = apr_table_get(rule->actionset->actions, "capture") ? 1 : 0; memcpy(data,var->value,var->value_len); while (offset < size && (rv = msc_regexec_ex(regex, data, size, offset, PCRE_NOTEMPTY, ovector, 30, &my_error_msg)) >= 0) { for(i = 0; i < rv; ++i) { match = apr_psprintf(msr->mp, "%.*s", ovector[2*i+1] - ovector[2*i], data + ovector[2*i]); if (match == NULL) { *error_msg = "Internal Error: cannot allocate memory for match."; return -1; } match = remove_escape(msr->mp, match, strlen(match)); match = gsb_replace_tpath(msr->mp, match, strlen(match)); match = gsb_reduce_char(msr->mp, match); match_length = strlen(match); strtolower_inplace((unsigned char *)match); if((strstr(match,"http") == NULL) && (match_length > 0) && (strchr(match,'.'))) { /* full url */ if (msr->txcfg->debuglog_level >= 4) { msr_log(msr, 4, "GSB: Successfully extracted url: %s", match); } ret = verify_gsb(gsb, msr, match, match_length); if(ret > 0) { set_match_to_tx(msr, capture, match, 0); if (! *error_msg) { *error_msg = apr_psprintf(msr->mp, "Gsb lookup for \"%s\" succeeded.", log_escape_nq(msr->mp, match)); } str = apr_pstrdup(msr->mp,match); base = apr_strtok(str,"/",&savedptr); if(base != NULL) set_match_to_tx(msr, capture, base, 1); return 1; } /* append / in the end of full url */ if ((match[match_length -1] != '/') && (strchr(match,'?') == NULL)) { canon = apr_psprintf(msr->mp, "%s/", match); if (canon != NULL) { canon_length = strlen(canon); ret = verify_gsb(gsb, msr, canon, canon_length); if(ret > 0) { set_match_to_tx(msr, capture, match, 0); if (! *error_msg) { *error_msg = apr_psprintf(msr->mp, "Gsb lookup for \"%s\" succeeded.", log_escape_nq(msr->mp, canon)); } str = apr_pstrdup(msr->mp,match); base = apr_strtok(str,"/",&savedptr); if(base != NULL) set_match_to_tx(msr, capture, base, 1); return 1; } } } /* Parsing full url */ domain = apr_pstrdup(msr->mp, match); domain_len = strlen(domain); if(*domain != '/') { if(domain[domain_len-1] == '.') domain[domain_len-1] = '\0'; if(domain[domain_len-1] == '/' && domain[domain_len-2] == '.') { domain[domain_len-2] = '/'; domain[domain_len-1] = '\0'; } dot = strchr(domain,'.'); if(dot != NULL) { canon = apr_pstrdup(msr->mp, domain); ret = verify_gsb(gsb, msr, canon, strlen(canon)); if(ret > 0) { set_match_to_tx(msr, capture, canon, 0); if (! *error_msg) { *error_msg = apr_psprintf(msr->mp, "Gsb lookup for \"%s\" succeeded.", log_escape_nq(msr->mp, canon)); } str = apr_pstrdup(msr->mp,match); base = apr_strtok(str,"/",&savedptr); if(base != NULL) set_match_to_tx(msr, capture, base, 1); return 1; } base = apr_strtok(canon,"?",&savedptr); if(base != NULL) { ret = verify_gsb(gsb, msr, base, strlen(base)); if(ret > 0) { set_match_to_tx(msr, capture, base, 0); if (! *error_msg) { *error_msg = apr_psprintf(msr->mp, "Gsb lookup for \"%s\" succeeded.", log_escape_nq(msr->mp, base)); } str = apr_pstrdup(msr->mp,match); base = apr_strtok(str,"/",&savedptr); if(base != NULL) set_match_to_tx(msr, capture, base, 1); return 1; } } url = apr_palloc(msr->mp, strlen(canon)); count_slash = 0; while(*canon != '\0') { switch (*canon) { case '/': ptr = apr_psprintf(msr->mp,"%s/",url); ret = verify_gsb(gsb, msr, ptr, strlen(ptr)); if(ret > 0) { set_match_to_tx(msr, capture, ptr, 0); if (! *error_msg) { *error_msg = apr_psprintf(msr->mp, "Gsb lookup for \"%s\" succeeded.", log_escape_nq(msr->mp, ptr)); } str = apr_pstrdup(msr->mp,match); base = apr_strtok(str,"/",&savedptr); if(base != NULL) set_match_to_tx(msr, capture, base, 1); return 1; } break; } url[count_slash] = *canon; count_slash++; canon++; } } } /* Do the same for subdomains */ for(j=0; jmp, match); while (*str != '\0') { switch(*str) { case '.': domain++; domain_len = strlen(domain); d_pos = strchr(domain,'.') - domain; if(s_pos >= 0 && d_pos >= 0 && d_pos > s_pos) break; if(*domain != '/') { if(domain[domain_len-1] == '.') domain[domain_len-1] = '\0'; if(domain[domain_len-1] == '/' && domain[domain_len-2] == '.') { domain[domain_len-2] = '/'; domain[domain_len-1] = '\0'; } dot = strchr(domain,'.'); if(dot != NULL) { canon = apr_pstrdup(msr->mp, domain); ret = verify_gsb(gsb, msr, canon, strlen(canon)); if(ret > 0) { set_match_to_tx(msr, capture, canon, 0); if (! *error_msg) { *error_msg = apr_psprintf(msr->mp, "Gsb lookup for \"%s\" succeeded.", log_escape_nq(msr->mp, canon)); } str = apr_pstrdup(msr->mp,match); base = apr_strtok(str,"/",&savedptr); if(base != NULL) set_match_to_tx(msr, capture, base, 1); return 1; } base = apr_strtok(canon,"?",&savedptr); if(base != NULL) { ret = verify_gsb(gsb, msr, base, strlen(base)); if(ret > 0) { set_match_to_tx(msr, capture, base, 0); if (! *error_msg) { *error_msg = apr_psprintf(msr->mp, "Gsb lookup for \"%s\" succeeded.", log_escape_nq(msr->mp, base)); } str = apr_pstrdup(msr->mp,match); base = apr_strtok(str,"/",&savedptr); if(base != NULL) set_match_to_tx(msr, capture, base, 1); return 1; } } url = apr_palloc(msr->mp, strlen(canon)); count_slash = 0; while(*canon != '\0') { switch (*canon) { case '/': ptr = apr_psprintf(msr->mp,"%s/",url); ret = verify_gsb(gsb, msr, ptr, strlen(ptr)); if(ret > 0) { set_match_to_tx(msr, capture, ptr, 0); if (! *error_msg) { *error_msg = apr_psprintf(msr->mp, "Gsb lookup for \"%s\" succeeded.", log_escape_nq(msr->mp, ptr)); } str = apr_pstrdup(msr->mp,match); base = apr_strtok(str,"/",&savedptr); if(base != NULL) set_match_to_tx(msr, capture, base, 1); return 1; } break; } url[count_slash] = *canon; count_slash++; canon++; } } } break; } domain = str; domain++; str++; } } } offset = ovector[1]; } return 0; } /* within */ static int msre_op_within_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { msc_string *str = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); const char *match = NULL; const char *target; unsigned int match_length; unsigned int target_length = 0; unsigned int i, i_max; if (error_msg == NULL) return -1; *error_msg = NULL; str->value = (char *)rule->op_param; if (str->value == NULL) { *error_msg = "Internal Error: match string is null."; return -1; } str->value_len = strlen(str->value); expand_macros(msr, str, rule, msr->mp); match = (const char *)str->value; match_length = str->value_len; /* If the given target is null we give up without a match */ if (var->value == NULL) { /* No match. */ return 0; } target = var->value; target_length = var->value_len; /* The empty string always matches */ if (target_length == 0) { /* Match. */ *error_msg = apr_psprintf(msr->mp, "String match within \"\" at %s.", var->name); return 1; } /* This is impossible to match */ if (target_length > match_length) { /* No match. */ return 0; } /* scan for first character, then compare from there until we * have a match or there is no room left in the target */ i_max = match_length - target_length; for (i = 0; i <= i_max; i++) { if (match[i] == target[0]) { if (memcmp((target + 1), (match + i + 1), (target_length - 1)) == 0) { /* match. */ *error_msg = apr_psprintf(msr->mp, "String match within \"%s\" at %s.", log_escape_ex(msr->mp, match, match_length), var->name); return 1; } } } /* No match. */ return 0; } /* contains */ static int msre_op_contains_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { msc_string *str = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); const char *match = NULL; const char *target; unsigned int match_length; unsigned int target_length = 0; unsigned int i, i_max; str->value = (char *)rule->op_param; if (str->value == NULL) { *error_msg = "Internal Error: match string is null."; return -1; } str->value_len = strlen(str->value); if (error_msg == NULL) return -1; *error_msg = NULL; expand_macros(msr, str, rule, msr->mp); match = (const char *)str->value; match_length = str->value_len; /* If the given target is null run against an empty * string. This is a behaviour consistent with previous * releases. */ if (var->value == NULL) { target = ""; target_length = 0; } else { target = var->value; target_length = var->value_len; } /* The empty string always matches */ if (match_length == 0) { /* Match. */ *error_msg = apr_psprintf(msr->mp, "String match \"\" at %s.", var->name); return 1; } /* This is impossible to match */ if (match_length > target_length) { /* No match. */ return 0; } /* scan for first character, then compare from there until we * have a match or there is no room left in the target */ i_max = target_length - match_length; for (i = 0; i <= i_max; i++) { /* First character matched - avoid func call */ if (target[i] == match[0]) { /* See if remaining matches */ if ( (match_length == 1) || (memcmp((match + 1), (target + i + 1), (match_length - 1)) == 0)) { /* Match. */ *error_msg = apr_psprintf(msr->mp, "String match \"%s\" at %s.", log_escape_ex(msr->mp, match, match_length), var->name); return 1; } } } /* No match. */ return 0; } /** libinjection detectSQLi * links against files in libinjection directory * See www.client9.com/libinjection for details */ static int msre_op_detectSQLi_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { char fingerprint[8]; int issqli; int capture; issqli = libinjection_sqli(var->value, var->value_len, fingerprint); capture = apr_table_get(rule->actionset->actions, "capture") ? 1 : 0; if (issqli) { set_match_to_tx(msr, capture, fingerprint, 0); *error_msg = apr_psprintf(msr->mp, "detected SQLi using libinjection with fingerprint '%s'", fingerprint); if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "ISSQL: libinjection fingerprint '%s' matched input '%s'", fingerprint, log_escape_ex(msr->mp, var->value, var->value_len)); } } else { if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "ISSQL: not sqli, no libinjection sqli fingerprint matched input '%s'", log_escape_ex(msr->mp, var->value, var->value_len)); } } return issqli; } /** libinjection detectXSS */ static int msre_op_detectXSS_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { int capture; int is_xss; is_xss = libinjection_xss(var->value, var->value_len); capture = apr_table_get(rule->actionset->actions, "capture") ? 1 : 0; if (is_xss) { set_match_to_tx(msr, capture, var->value, 0); *error_msg = apr_psprintf(msr->mp, "detected XSS using libinjection."); if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "IS_XSS: libinjection detected XSS."); } } else { if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "IS_XSS: not XSS, libinjection was not able to find any XSS."); } } return is_xss; } /* containsWord */ static int msre_op_containsWord_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { msc_string *str = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); const char *match = NULL; const char *target; unsigned int match_length; unsigned int target_length = 0; unsigned int i, i_max; int rc = 0; str->value = (char *)rule->op_param; if (str->value == NULL) { *error_msg = "Internal Error: match string is null."; return -1; } str->value_len = strlen(str->value); if (error_msg == NULL) return -1; *error_msg = NULL; expand_macros(msr, str, rule, msr->mp); match = (const char *)str->value; match_length = str->value_len; /* If the given target is null run against an empty * string. This is a behaviour consistent with previous * releases. */ if (var->value == NULL) { target = ""; target_length = 0; } else { target = var->value; target_length = var->value_len; } /* The empty string always matches */ if (match_length == 0) { /* Match. */ *error_msg = apr_psprintf(msr->mp, "String match \"\" at %s.", var->name); return 1; } /* This is impossible to match */ if (match_length > target_length) { /* No match. */ return 0; } /* scan for first character, then compare from there until we * have a match or there is no room left in the target */ i_max = target_length - match_length; for (i = 0; i <= i_max; i++) { /* Previous char must have been a start or non-word */ if ((i > 0) && (apr_isalnum(target[i-1])||(target[i-1] == '_'))) continue; /* First character matched - avoid func call */ if (target[i] == match[0]) { /* See if remaining matches */ if ( (match_length == 1) || (memcmp((match + 1), (target + i + 1), (match_length - 1)) == 0)) { /* check boundaries */ if (i == i_max) { /* exact/end word match */ rc = 1; } else if (!(apr_isalnum(target[i + match_length])||(target[i + match_length] == '_'))) { /* start/mid word match */ rc = 1; } } } } if (rc == 1) { /* Maybe a match. */ *error_msg = apr_psprintf(msr->mp, "String match \"%s\" at %s.", log_escape_ex(msr->mp, match, match_length), var->name); return 1; } /* No match. */ *error_msg = NULL; return 0; } /* streq */ static int msre_op_streq_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { msc_string *str = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); const char *match = NULL; const char *target; unsigned int match_length; unsigned int target_length; str->value = (char *)rule->op_param; if (str->value == NULL) { *error_msg = "Internal Error: match string is null."; return -1; } str->value_len = strlen(str->value); if (error_msg == NULL) return -1; *error_msg = NULL; expand_macros(msr, str, rule, msr->mp); match = (const char *)str->value; match_length = str->value_len; /* If the given target is null run against an empty * string. This is a behaviour consistent with previous * releases. */ if (var->value == NULL) { target = ""; target_length = 0; } else { target = var->value; target_length = var->value_len; } /* These are impossible to match */ if (match_length != target_length) { /* No match. */ return 0; } if (memcmp(match, target, target_length) == 0) { /* Match. */ *error_msg = apr_psprintf(msr->mp, "String match \"%s\" at %s.", log_escape_ex(msr->mp, match, match_length), var->name); return 1; } /* No match. */ return 0; } /* beginsWith */ static int msre_op_beginsWith_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { msc_string *str = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); const char *match = NULL; const char *target; unsigned int match_length; unsigned int target_length; str->value = (char *)rule->op_param; if (str->value == NULL) { *error_msg = "Internal Error: match string is null."; return -1; } str->value_len = strlen(str->value); if (error_msg == NULL) return -1; *error_msg = NULL; expand_macros(msr, str, rule, msr->mp); match = (const char *)str->value; match_length = str->value_len; /* If the given target is null run against an empty * string. This is a behaviour consistent with previous * releases. */ if (var->value == NULL) { target = ""; target_length = 0; } else { target = var->value; target_length = var->value_len; } /* The empty string always matches */ if (match_length == 0) { /* Match. */ *error_msg = apr_psprintf(msr->mp, "String match \"\" at %s.", var->name); return 1; } /* This is impossible to match */ if (match_length > target_length) { /* No match. */ return 0; } if (memcmp(match, target, match_length) == 0) { /* Match. */ *error_msg = apr_psprintf(msr->mp, "String match \"%s\" at %s.", log_escape_ex(msr->mp, match, match_length), var->name); return 1; } /* No match. */ return 0; } /* endsWith */ static int msre_op_endsWith_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { msc_string *str = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); const char *match = NULL; const char *target; unsigned int match_length; unsigned int target_length; str->value = (char *)rule->op_param; if (str->value == NULL) { *error_msg = "Internal Error: match string is null."; return -1; } str->value_len = strlen(str->value); if (error_msg == NULL) return -1; *error_msg = NULL; expand_macros(msr, str, rule, msr->mp); match = (const char *)str->value; match_length = str->value_len; /* If the given target is null run against an empty * string. This is a behaviour consistent with previous * releases. */ if (var->value == NULL) { target = ""; target_length = 0; } else { target = var->value; target_length = var->value_len; } /* The empty string always matches */ if (match_length == 0) { /* Match. */ *error_msg = apr_psprintf(msr->mp, "String match \"\" at %s.", var->name); return 1; } /* This is impossible to match */ if (match_length > target_length) { /* No match. */ return 0; } if (memcmp(match, (target + (target_length - match_length)), match_length) == 0) { /* Match. */ *error_msg = apr_psprintf(msr->mp, "String match \"%s\" at %s.", log_escape_ex(msr->mp, match, match_length), var->name); return 1; } /* No match. */ return 0; } /* strmatch */ static int msre_op_strmatch_param_init(msre_rule *rule, char **error_msg) { const apr_strmatch_pattern *compiled_pattern; char *processed = NULL; const char *pattern = rule->op_param; unsigned short int op_len; if (error_msg == NULL) return -1; *error_msg = NULL; op_len = strlen(pattern); /* Process pattern */ processed = parse_pm_content(pattern, op_len, rule, error_msg); if (processed == NULL) { return 0; } /* Compile pattern */ compiled_pattern = apr_strmatch_precompile(rule->ruleset->mp, processed, 1); if (compiled_pattern == NULL) { *error_msg = apr_psprintf(rule->ruleset->mp, "Error compiling pattern: %s", pattern); return 0; } rule->op_param_data = (void *)compiled_pattern; return 1; /* OK */ } static int msre_op_strmatch_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { apr_strmatch_pattern *compiled_pattern = (apr_strmatch_pattern *)rule->op_param_data; const char *target; unsigned int target_length; const char *rc; if (error_msg == NULL) return -1; *error_msg = NULL; if (compiled_pattern == NULL) { *error_msg = "Internal Error: strnmatch data is null."; return -1; } /* If the given target is null run against an empty * string. This is a behaviour consistent with previous * releases. */ if (var->value == NULL) { target = ""; target_length = 0; } else { target = var->value; target_length = var->value_len; } rc = apr_strmatch(compiled_pattern, target, target_length); if (rc == NULL) { /* No match. */ return 0; } *error_msg = apr_psprintf(msr->mp, "Pattern match \"%s\" at %s.", log_escape(msr->mp, rule->op_param), var->name); /* Match. */ return 1; } /* validateDTD */ static int msre_op_validateDTD_init(msre_rule *rule, char **error_msg) { /* ENH Verify here the file actually exists. */ return 1; } static int msre_op_validateDTD_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { xmlValidCtxtPtr cvp; xmlDtdPtr dtd; if ((msr->xml == NULL)||(msr->xml->doc == NULL)) { *error_msg = apr_psprintf(msr->mp, "XML document tree could not be found for DTD validation."); return -1; } if (msr->xml->well_formed != 1) { *error_msg = apr_psprintf(msr->mp, "XML: DTD validation failed because content is not well formed."); return 1; } /* Make sure there were no other generic processing errors */ if (msr->msc_reqbody_error) { *error_msg = apr_psprintf(msr->mp, "XML: DTD validation could not proceed due to previous" " processing errors."); return 1; } dtd = xmlParseDTD(NULL, (const xmlChar *)rule->op_param); /* EHN support relative filenames */ if (dtd == NULL) { *error_msg = apr_psprintf(msr->mp, "XML: Failed to load DTD: %s", rule->op_param); return -1; } cvp = xmlNewValidCtxt(); if (cvp == NULL) { *error_msg = "XML: Failed to create a validation context."; xmlFreeDtd(dtd); return -1; } /* Send validator errors/warnings to msr_log */ /* NOTE: No xmlDtdSetValidErrors()? */ cvp->error = (xmlSchemaValidityErrorFunc)msr_log_error; cvp->warning = (xmlSchemaValidityErrorFunc)msr_log_warn; cvp->userData = msr; if (!xmlValidateDtd(cvp, msr->xml->doc, dtd)) { *error_msg = "XML: DTD validation failed."; xmlFreeValidCtxt(cvp); xmlFreeDtd(dtd); return 1; /* No match. */ } if (msr->txcfg->debuglog_level >= 4) { msr_log(msr, 4, "XML: Successfully validated payload against DTD: %s", rule->op_param); } xmlFreeValidCtxt(cvp); xmlFreeDtd(dtd); /* Match. */ return 0; } /* validateSchema */ static int msre_op_validateSchema_init(msre_rule *rule, char **error_msg) { /* ENH Verify here the file actually exists. */ return 1; } static int msre_op_validateSchema_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { xmlSchemaParserCtxtPtr parserCtx; xmlSchemaValidCtxtPtr validCtx; xmlSchemaPtr schema; int rc; if ((msr->xml == NULL)||(msr->xml->doc == NULL)) { *error_msg = apr_psprintf(msr->mp, "XML document tree could not be found for schema validation."); return -1; } if (msr->xml->well_formed != 1) { *error_msg = apr_psprintf(msr->mp, "XML: Schema validation failed because content is not well formed."); return 1; } /* Make sure there were no other generic processing errors */ if (msr->msc_reqbody_error) { *error_msg = apr_psprintf(msr->mp, "XML: Schema validation could not proceed due to previous" " processing errors."); return 1; } parserCtx = xmlSchemaNewParserCtxt(rule->op_param); /* ENH support relative filenames */ if (parserCtx == NULL) { *error_msg = apr_psprintf(msr->mp, "XML: Failed to load Schema from file: %s", rule->op_param); return -1; } /* Send parser errors/warnings to msr_log */ xmlSchemaSetParserErrors(parserCtx, (xmlSchemaValidityErrorFunc)msr_log_error, (xmlSchemaValidityWarningFunc)msr_log_warn, msr); schema = xmlSchemaParse(parserCtx); if (schema == NULL) { *error_msg = apr_psprintf(msr->mp, "XML: Failed to load Schema: %s", rule->op_param); xmlSchemaFreeParserCtxt(parserCtx); return -1; } validCtx = xmlSchemaNewValidCtxt(schema); if (validCtx == NULL) { *error_msg = "XML: Failed to create validation context."; xmlSchemaFree(schema); xmlSchemaFreeParserCtxt(parserCtx); return -1; } /* Send validator errors/warnings to msr_log */ xmlSchemaSetValidErrors(validCtx, (xmlSchemaValidityErrorFunc)msr_log_error, (xmlSchemaValidityWarningFunc)msr_log_warn, msr); rc = xmlSchemaValidateDoc(validCtx, msr->xml->doc); if (rc != 0) { *error_msg = "XML: Schema validation failed."; xmlSchemaFree(schema); xmlSchemaFreeParserCtxt(parserCtx); return 1; /* No match. */ } if (msr->txcfg->debuglog_level >= 4) { msr_log(msr, 4, "XML: Successfully validated payload against Schema: %s", rule->op_param); } xmlSchemaFree(schema); xmlSchemaFreeValidCtxt(validCtx); return 0; } /* verifyCC */ /** * Luhn Mod-10 Method (ISO 2894/ANSI 4.13) */ static int luhn_verify(const char *ccnumber, int len) { int sum[2] = { 0, 0 }; int odd = 0; int digits = 0; int i; /* Weighted lookup table which is just a precalculated (i = index): * i*2 + (( (i*2) > 9 ) ? -9 : 0) */ static const int wtable[10] = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9}; /* weight lookup table */ /* Add up only digits (weighted digits via lookup table) * for both odd and even CC numbers to avoid 2 passes. */ for (i = 0; i < len; i++) { if (apr_isdigit(ccnumber[i])) { sum[0] += (!odd ? wtable[ccnumber[i] - '0'] : (ccnumber[i] - '0')); sum[1] += (odd ? wtable[ccnumber[i] - '0'] : (ccnumber[i] - '0')); odd = 1 - odd; /* alternate weights */ digits++; } } /* No digits extracted */ if (digits == 0) return 0; /* Do a mod 10 on the sum */ sum[odd] %= 10; /* If the result is a zero the card is valid. */ return sum[odd] ? 0 : 1; } static int msre_op_verifyCC_init(msre_rule *rule, char **error_msg) { const char *errptr = NULL; int erroffset; msc_regex_t *regex; if (error_msg == NULL) return -1; *error_msg = NULL; /* Compile rule->op_param */ regex = msc_pregcomp_ex(rule->ruleset->mp, rule->op_param, PCRE_DOTALL | PCRE_MULTILINE, &errptr, &erroffset, msc_pcre_match_limit, msc_pcre_match_limit_recursion); if (regex == NULL) { *error_msg = apr_psprintf(rule->ruleset->mp, "Error compiling pattern (offset %d): %s", erroffset, errptr); return 0; } rule->op_param_data = regex; return 1; /* OK */ } static int msre_op_verifyCC_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { msc_regex_t *regex = (msc_regex_t *)rule->op_param_data; const char *target; unsigned int target_length; char *my_error_msg = NULL; int ovector[33]; int rc; int is_cc = 0; int offset; int matched_bytes = 0; char *qspos = NULL; const char *parm = NULL; msc_parm *mparm = NULL; #ifdef WITH_PCRE_STUDY #ifdef WITH_PCRE_JIT int jit; #endif #endif if (error_msg == NULL) return -1; *error_msg = NULL; if (regex == NULL) { *error_msg = "Internal Error: regex data is null."; return -1; } memset(ovector, 0, sizeof(ovector)); #ifdef WITH_PCRE_STUDY #ifdef WITH_PCRE_JIT if (msr->txcfg->debuglog_level >= 4) { rc = msc_fullinfo(regex, PCRE_INFO_JIT, &jit); if ((rc != 0) || (jit != 1)) { *error_msg = apr_psprintf(msr->mp, "Rule %pp [id \"%s\"][file \"%s\"][line \"%d\"] - " "Execution error - " "Does not support JIT (%d)", rule,((rule->actionset != NULL)&&((rule->actionset->id != NULL)&& (rule->actionset->id != NOT_SET_P))) ? rule->actionset->id : "-", rule->filename != NULL ? rule->filename : "-", rule->line_num,rc); msr_log(msr, 4, "%s.", *error_msg); } } #endif #endif /* If the given target is null run against an empty * string. This is a behaviour consistent with previous * releases. */ if (var->value == NULL) { target = ""; target_length = 0; } else { target = var->value; target_length = var->value_len; } for (offset = 0; ((unsigned int)offset < target_length) && (is_cc == 0); offset++) { if (msr->txcfg->debuglog_level >= 9) { if (offset > 0) { msr_log(msr, 9, "Continuing CC# search at target offset %d.", offset); } } rc = msc_regexec_ex(regex, target, target_length, offset, PCRE_NOTEMPTY, ovector, 30, &my_error_msg); /* If there was no match, then we are done. */ if (rc == PCRE_ERROR_NOMATCH) { break; } if (rc < -1) { *error_msg = apr_psprintf(msr->mp, "CC# regex execution failed: %s", my_error_msg); return -1; } /* Verify a match. */ if (rc > 0) { const char *match = target + ovector[0]; int length = ovector[1] - ovector[0]; int i = 0; offset = ovector[2*i]; /* Check the Luhn using the match string */ is_cc = luhn_verify(match, length); /* Not a CC number, then try another match where we left off. */ if (!is_cc) { if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "CC# Luhn check failed at target offset %d: \"%.*s\"", offset, length, match); } continue; } /* We have a potential CC number and need to set any captures * and we are done. */ if (rule->actionset) { matched_bytes = apr_table_get(rule->actionset->actions, "sanitizeMatchedBytes") ? 1 : 0; } if(!matched_bytes) matched_bytes = apr_table_get(rule->actionset->actions, "sanitiseMatchedBytes") ? 1 : 0; if (apr_table_get(rule->actionset->actions, "capture")) { for(; i < rc; i++) { msc_string *s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); if (s == NULL) return -1; s->name = apr_psprintf(msr->mp, "%d", i); if (s->name == NULL) return -1; s->name_len = strlen(s->name); s->value = apr_pstrmemdup(msr->mp, match, length); if (s->value == NULL) return -1; s->value_len = length; apr_table_setn(msr->tx_vars, s->name, (void *)s); if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "Added regex subexpression to TX.%d: %s", i, log_escape_nq_ex(msr->mp, s->value, s->value_len)); } if((matched_bytes == 1) && (var != NULL) && (var->name != NULL)) { qspos = apr_psprintf(msr->mp, "%s", var->name); parm = strstr(qspos, ":"); if (parm != NULL) { parm++; mparm = apr_palloc(msr->mp, sizeof(msc_parm)); if (mparm == NULL) continue; mparm->value = apr_pstrmemdup(msr->mp,s->value,s->value_len); mparm->pad_1 = rule->actionset->arg_min; mparm->pad_2 = rule->actionset->arg_max; apr_table_addn(msr->pattern_to_sanitize, parm, (void *)mparm); } else { mparm = apr_palloc(msr->mp, sizeof(msc_parm)); if (mparm == NULL) continue; mparm->value = apr_pstrmemdup(msr->mp,s->value,s->value_len); apr_table_addn(msr->pattern_to_sanitize, qspos, (void *)mparm); } } } } /* Unset the remaining TX vars (from previous invocations). */ for(; i <= 9; i++) { char buf[24]; apr_snprintf(buf, sizeof(buf), "%i", i); apr_table_unset(msr->tx_vars, buf); } break; } } if (is_cc) { /* Match. */ /* This message will be logged. */ *error_msg = apr_psprintf(msr->mp, "CC# match \"%s\" at %s. [offset \"%d\"]", regex->pattern, var->name, offset); return 1; } /* No match. */ return 0; } /** * \brief Check for a valid CPF * * \param cpfnumber Pointer to cpf * \param len cpf length * * \retval 0 On Invalid CPF * \retval 1 On Valid CPF */ static int cpf_verify(const char *cpfnumber, int len) { int factor, part_1, part_2, var_len = len; unsigned int sum = 0, i = 0, cpf_len = 11, c; int cpf[11]; char s_cpf[11]; char bad_cpf[11][11] = { "00000000000", "01234567890", "11111111111", "22222222222", "33333333333", "44444444444", "55555555555", "66666666666", "77777777777", "88888888888", "99999999999"}; while((*cpfnumber != '\0') && ( var_len > 0)) { if(*cpfnumber != '-' || *cpfnumber != '.') { if(i < cpf_len && isdigit(*cpfnumber)) { s_cpf[i] = *cpfnumber; cpf[i] = convert_to_int(*cpfnumber); i++; } } cpfnumber++; var_len--; } if (i != cpf_len) return 0; else { for(i = 0; i< cpf_len; i++) { if(strncmp(s_cpf,bad_cpf[i],cpf_len) == 0) { return 0; } } } part_1 = convert_to_int(s_cpf[cpf_len-2]); part_2 = convert_to_int(s_cpf[cpf_len-1]); c = cpf_len; for(i = 0; i < 9; i++) { sum += (cpf[i] * --c); } factor = (sum % cpf_len); if(factor < 2) { cpf[9] = 0; } else { cpf[9] = cpf_len-factor; } sum = 0; c = cpf_len; for(i = 0;i < 10; i++) sum += (cpf[i] * c--); factor = (sum % cpf_len); if(factor < 2) { cpf[10] = 0; } else { cpf[10] = cpf_len-factor; } if(part_1 == cpf[9] && part_2 == cpf[10]) return 1; return 0; } /** * \brief Init function to CPF operator * * \param rule ModSecurity rule struct * \param error_msg Error message * * \retval 0 On Failure * \retval 1 On Success */ static int msre_op_verifyCPF_init(msre_rule *rule, char **error_msg) { const char *errptr = NULL; int erroffset; msc_regex_t *regex; if (error_msg == NULL) return -1; *error_msg = NULL; /* Compile rule->op_param */ regex = msc_pregcomp_ex(rule->ruleset->mp, rule->op_param, PCRE_DOTALL | PCRE_MULTILINE, &errptr, &erroffset, msc_pcre_match_limit, msc_pcre_match_limit_recursion); if (regex == NULL) { *error_msg = apr_psprintf(rule->ruleset->mp, "Error compiling pattern (offset %d): %s", erroffset, errptr); return 0; } rule->op_param_data = regex; return 1; /* OK */ } /** * \brief Execution function to CPF operator * * \param msr ModSecurity transaction resource * \param rule ModSecurity rule struct * \param var ModSecurity variable struct * \param error_msg Error message * * \retval -1 On Failure * \retval 1 On Match * \retval 0 On No Match */ static int msre_op_verifyCPF_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { msc_regex_t *regex = (msc_regex_t *)rule->op_param_data; const char *target; unsigned int target_length; char *my_error_msg = NULL; int ovector[33]; int rc; int is_cpf = 0; int offset; int matched_bytes = 0; char *qspos = NULL; const char *parm = NULL; msc_parm *mparm = NULL; #ifdef WITH_PCRE_STUDY #ifdef WITH_PCRE_JIT int jit; #endif #endif if (error_msg == NULL) return -1; *error_msg = NULL; if (regex == NULL) { *error_msg = "Internal Error: regex data is null."; return -1; } memset(ovector, 0, sizeof(ovector)); #ifdef WITH_PCRE_STUDY #ifdef WITH_PCRE_JIT if (msr->txcfg->debuglog_level >= 4) { rc = msc_fullinfo(regex, PCRE_INFO_JIT, &jit); if ((rc != 0) || (jit != 1)) { *error_msg = apr_psprintf(msr->mp, "Rule %pp [id \"%s\"][file \"%s\"][line \"%d\"] - " "Execution error - " "Does not support JIT (%d)", rule,((rule->actionset != NULL)&&((rule->actionset->id != NULL)&& (rule->actionset->id != NOT_SET_P))) ? rule->actionset->id : "-", rule->filename != NULL ? rule->filename : "-", rule->line_num,rc); msr_log(msr, 4, "%s.", *error_msg); } } #endif #endif /* If the given target is null run against an empty * string. This is a behaviour consistent with previous * releases. */ if (var->value == NULL) { target = ""; target_length = 0; } else { target = var->value; target_length = var->value_len; } for (offset = 0; ((unsigned int)offset < target_length) && (is_cpf == 0); offset++) { if (msr->txcfg->debuglog_level >= 9) { if (offset > 0) { msr_log(msr, 9, "Continuing CPF# search at target offset %d.", offset); } } rc = msc_regexec_ex(regex, target, target_length, offset, PCRE_NOTEMPTY, ovector, 30, &my_error_msg); /* If there was no match, then we are done. */ if (rc == PCRE_ERROR_NOMATCH) { break; } if (rc < -1) { *error_msg = apr_psprintf(msr->mp, "CPF# regex execution failed: %s", my_error_msg); return -1; } /* Verify a match. */ if (rc > 0) { const char *match = target + ovector[0]; int length = ovector[1] - ovector[0]; int i = 0; offset = ovector[2*i]; /* Check CPF using the match string */ is_cpf = cpf_verify(match, length); /* Not a CPF number, then try another match where we left off. */ if (!is_cpf) { if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "CPF# check failed at target offset %d: \"%.*s\"", offset, length, match); } continue; } /* We have a potential CPF number and need to set any captures * and we are done. */ if (rule->actionset) { matched_bytes = apr_table_get(rule->actionset->actions, "sanitizeMatchedBytes") ? 1 : 0; } if(!matched_bytes) matched_bytes = apr_table_get(rule->actionset->actions, "sanitiseMatchedBytes") ? 1 : 0; if (apr_table_get(rule->actionset->actions, "capture")) { for(; i < rc; i++) { msc_string *s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); if (s == NULL) return -1; s->name = apr_psprintf(msr->mp, "%d", i); if (s->name == NULL) return -1; s->name_len = strlen(s->name); s->value = apr_pstrmemdup(msr->mp, match, length); if (s->value == NULL) return -1; s->value_len = length; apr_table_setn(msr->tx_vars, s->name, (void *)s); if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "Added regex subexpression to TX.%d: %s", i, log_escape_nq_ex(msr->mp, s->value, s->value_len)); } if((matched_bytes == 1) && (var != NULL) && (var->name != NULL)) { qspos = apr_psprintf(msr->mp, "%s", var->name); parm = strstr(qspos, ":"); if (parm != NULL) { parm++; mparm = apr_palloc(msr->mp, sizeof(msc_parm)); if (mparm == NULL) continue; mparm->value = apr_pstrmemdup(msr->mp,s->value,s->value_len); mparm->pad_1 = rule->actionset->arg_min; mparm->pad_2 = rule->actionset->arg_max; apr_table_addn(msr->pattern_to_sanitize, parm, (void *)mparm); } else { mparm = apr_palloc(msr->mp, sizeof(msc_parm)); if (mparm == NULL) continue; mparm->value = apr_pstrmemdup(msr->mp,s->value,s->value_len); apr_table_addn(msr->pattern_to_sanitize, qspos, (void *)mparm); } } } } /* Unset the remaining TX vars (from previous invocations). */ for(; i <= 9; i++) { char buf[24]; apr_snprintf(buf, sizeof(buf), "%i", i); apr_table_unset(msr->tx_vars, buf); } break; } } if (is_cpf) { /* Match. */ /* This message will be logged. */ *error_msg = apr_psprintf(msr->mp, "CPF# match \"%s\" at %s. [offset \"%d\"]", regex->pattern, var->name, offset); return 1; } /* No match. */ return 0; } /** * \brief Check for a valid SSN * * \param msr ModSecurity transaction source * \param ssnumber Pointer to ssn * \param len ssn length * * \retval 0 On Invalid SSN * \retval 1 On Valid SSN */ static int ssn_verify(modsec_rec *msr, const char *ssnumber, int len) { int i; int num[9]; int digits = 0; int area, serial, grp; int sequencial = 0; int repetitions = 0; char *str_area; char *str_grp; char *str_serial; for (i = 0; i < len; i++) { if (apr_isdigit(ssnumber[i])) { if (digits < 9) num[digits] = convert_to_int(ssnumber[i]); digits++; } } /* Not a valid number */ if (digits != 9) goto invalid; for (i=0; i < 8; i++) { if (num[i] == (num[i+1]-1)) sequencial++; if (num[i] == num[i+1]) repetitions++; } /* We are blocking when all numbers were sequencial or repeated */ if (sequencial == 8) goto invalid; if (repetitions == 8) goto invalid; str_area = apr_psprintf(msr->mp,"%d%d%d",num[0],num[1],num[2]); str_grp = apr_psprintf(msr->mp,"%d%d",num[3],num[4]); str_serial = apr_psprintf(msr->mp,"%d%d%d%d",num[5],num[6],num[7],num[8]); if(str_area == NULL || str_grp == NULL || str_serial == NULL) goto invalid; area = atoi(str_area); grp = atoi(str_grp); serial = atoi(str_serial); /* Cannot has seroed fields */ if (area == 0 || serial == 0 || grp == 0) goto invalid; /* More tests */ if (area >= 740 || area == 666) goto invalid; return 1; invalid: return 0; } /** * \brief Init function to SSN operator * * \param rule ModSecurity rule struct * \param error_msg Error message * * \retval 0 On Failure * \retval 1 On Success */ static int msre_op_verifySSN_init(msre_rule *rule, char **error_msg) { const char *errptr = NULL; int erroffset; msc_regex_t *regex; if (error_msg == NULL) return -1; *error_msg = NULL; /* Compile rule->op_param */ regex = msc_pregcomp_ex(rule->ruleset->mp, rule->op_param, PCRE_DOTALL | PCRE_MULTILINE, &errptr, &erroffset, msc_pcre_match_limit, msc_pcre_match_limit_recursion); if (regex == NULL) { *error_msg = apr_psprintf(rule->ruleset->mp, "Error compiling pattern (offset %d): %s", erroffset, errptr); return 0; } rule->op_param_data = regex; return 1; /* OK */ } /** * \brief Execution function to SSN operator * * \param msr ModSecurity transaction resource * \param rule ModSecurity rule struct * \param var ModSecurity variable struct * \param error_msg Error message * * \retval -1 On Failure * \retval 1 On Match * \retval 0 On No Match */ static int msre_op_verifySSN_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { msc_regex_t *regex = (msc_regex_t *)rule->op_param_data; const char *target; unsigned int target_length; char *my_error_msg = NULL; int ovector[33]; int rc; int is_ssn = 0; int offset; int matched_bytes = 0; char *qspos = NULL; const char *parm = NULL; msc_parm *mparm = NULL; #ifdef WITH_PCRE_STUDY #ifdef WITH_PCRE_JIT int jit; #endif #endif if (error_msg == NULL) return -1; *error_msg = NULL; if (regex == NULL) { *error_msg = "Internal Error: regex data is null."; return -1; } memset(ovector, 0, sizeof(ovector)); #ifdef WITH_PCRE_STUDY #ifdef WITH_PCRE_JIT if (msr->txcfg->debuglog_level >= 4) { rc = msc_fullinfo(regex, PCRE_INFO_JIT, &jit); if ((rc != 0) || (jit != 1)) { *error_msg = apr_psprintf(msr->mp, "Rule %pp [id \"%s\"][file \"%s\"][line \"%d\"] - " "Execution error - " "Does not support JIT (%d)", rule,((rule->actionset != NULL)&&((rule->actionset->id != NULL)&& (rule->actionset->id != NOT_SET_P))) ? rule->actionset->id : "-", rule->filename != NULL ? rule->filename : "-", rule->line_num,rc); msr_log(msr, 4, "%s.", *error_msg); } } #endif #endif /* If the given target is null run against an empty * string. This is a behaviour consistent with previous * releases. */ if (var->value == NULL) { target = ""; target_length = 0; } else { target = var->value; target_length = var->value_len; } for (offset = 0; ((unsigned int)offset < target_length) && (is_ssn == 0); offset++) { if (msr->txcfg->debuglog_level >= 9) { if (offset > 0) { msr_log(msr, 9, "Continuing SSN# search at target offset %d.", offset); } } rc = msc_regexec_ex(regex, target, target_length, offset, PCRE_NOTEMPTY, ovector, 30, &my_error_msg); /* If there was no match, then we are done. */ if (rc == PCRE_ERROR_NOMATCH) { break; } if (rc < -1) { *error_msg = apr_psprintf(msr->mp, "SSN# regex execution failed: %s", my_error_msg); return -1; } /* Verify a match. */ if (rc > 0) { const char *match = target + ovector[0]; int length = ovector[1] - ovector[0]; int i = 0; offset = ovector[2*i]; /* Check SSN using the match string */ is_ssn = ssn_verify(msr, match, length); /* Not a SSN number, then try another match where we left off. */ if (!is_ssn) { if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "SSN# check failed at target offset %d: \"%.*s\"", offset, length, match); } continue; } /* We have a potential SSN number and need to set any captures * and we are done. */ if (rule->actionset) { matched_bytes = apr_table_get(rule->actionset->actions, "sanitizeMatchedBytes") ? 1 : 0; } if(!matched_bytes) matched_bytes = apr_table_get(rule->actionset->actions, "sanitiseMatchedBytes") ? 1 : 0; if (apr_table_get(rule->actionset->actions, "capture")) { for(; i < rc; i++) { msc_string *s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); if (s == NULL) return -1; s->name = apr_psprintf(msr->mp, "%d", i); if (s->name == NULL) return -1; s->name_len = strlen(s->name); s->value = apr_pstrmemdup(msr->mp, match, length); if (s->value == NULL) return -1; s->value_len = length; apr_table_setn(msr->tx_vars, s->name, (void *)s); if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "Added regex subexpression to TX.%d: %s", i, log_escape_nq_ex(msr->mp, s->value, s->value_len)); } if((matched_bytes == 1) && (var != NULL) && (var->name != NULL)) { qspos = apr_psprintf(msr->mp, "%s", var->name); parm = strstr(qspos, ":"); if (parm != NULL) { parm++; mparm = apr_palloc(msr->mp, sizeof(msc_parm)); if (mparm == NULL) continue; mparm->value = apr_pstrmemdup(msr->mp,s->value,s->value_len); mparm->pad_1 = rule->actionset->arg_min; mparm->pad_2 = rule->actionset->arg_max; apr_table_addn(msr->pattern_to_sanitize, parm, (void *)mparm); } else { mparm = apr_palloc(msr->mp, sizeof(msc_parm)); if (mparm == NULL) continue; mparm->value = apr_pstrmemdup(msr->mp,s->value,s->value_len); apr_table_addn(msr->pattern_to_sanitize, qspos, (void *)mparm); } } } } /* Unset the remaining TX vars (from previous invocations). */ for(; i <= 9; i++) { char buf[24]; apr_snprintf(buf, sizeof(buf), "%i", i); apr_table_unset(msr->tx_vars, buf); } break; } } if (is_ssn) { /* Match. */ /* This message will be logged. */ *error_msg = apr_psprintf(msr->mp, "SSN# match \"%s\" at %s. [offset \"%d\"]", regex->pattern, var->name, offset); return 1; } /* No match. */ return 0; } /** * Perform geograpical lookups on an IP/Host. */ static int msre_op_geoLookup_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { geo_rec rec; geo_db *geo = msr->txcfg->geo; const char *geo_host = var->value; msc_string *s = NULL; int rc; *error_msg = NULL; if (geo == NULL) { msr_log(msr, 1, "Geo lookup for \"%s\" attempted without a database. Set SecGeoLookupDB.", log_escape(msr->mp, geo_host)); return 0; } rc = geo_lookup(msr, &rec, geo_host, error_msg); if (rc <= 0) { if (! *error_msg) { *error_msg = apr_psprintf(msr->mp, "Geo lookup for \"%s\" failed at %s.", log_escape_nq(msr->mp, geo_host), var->name); } apr_table_clear(msr->geo_vars); return rc; } if (! *error_msg) { *error_msg = apr_psprintf(msr->mp, "Geo lookup for \"%s\" succeeded at %s.", log_escape_nq(msr->mp, geo_host), var->name); } if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "GEO: %s={country_code=%s, country_code3=%s, country_name=%s, country_continent=%s, region=%s, city=%s, postal_code=%s, latitude=%f, longitude=%f, dma_code=%d, area_code=%d}", geo_host, rec.country_code, rec.country_code3, rec.country_name, rec.country_continent, rec.region, rec.city, rec.postal_code, rec.latitude, rec.longitude, rec.dma_code, rec.area_code); } s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); s->name = apr_pstrdup(msr->mp, "COUNTRY_CODE"); s->name_len = strlen(s->name); s->value = apr_pstrdup(msr->mp, rec.country_code ? rec.country_code : ""); s->value_len = strlen(s->value); apr_table_setn(msr->geo_vars, s->name, (void *)s); s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); s->name = apr_pstrdup(msr->mp, "COUNTRY_CODE3"); s->name_len = strlen(s->name); s->value = apr_pstrdup(msr->mp, rec.country_code3 ? rec.country_code3 : ""); s->value_len = strlen(s->value); apr_table_setn(msr->geo_vars, s->name, (void *)s); s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); s->name = apr_pstrdup(msr->mp, "COUNTRY_NAME"); s->name_len = strlen(s->name); s->value = apr_pstrdup(msr->mp, rec.country_name ? rec.country_name : ""); s->value_len = strlen(s->value); apr_table_setn(msr->geo_vars, s->name, (void *)s); s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); s->name = apr_pstrdup(msr->mp, "COUNTRY_CONTINENT"); s->name_len = strlen(s->name); s->value = apr_pstrdup(msr->mp, rec.country_continent ? rec.country_continent : ""); s->value_len = strlen(s->value); apr_table_setn(msr->geo_vars, s->name, (void *)s); s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); s->name = apr_pstrdup(msr->mp, "REGION"); s->name_len = strlen(s->name); s->value = apr_pstrdup(msr->mp, rec.region ? rec.region : ""); s->value_len = strlen(s->value); apr_table_setn(msr->geo_vars, s->name, (void *)s); s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); s->name = apr_pstrdup(msr->mp, "CITY"); s->name_len = strlen(s->name); s->value = apr_pstrdup(msr->mp, rec.city ? rec.city : ""); s->value_len = strlen(s->value); apr_table_setn(msr->geo_vars, s->name, (void *)s); s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); s->name = apr_pstrdup(msr->mp, "POSTAL_CODE"); s->name_len = strlen(s->name); s->value = apr_pstrdup(msr->mp, rec.postal_code ? rec.postal_code : ""); s->value_len = strlen(s->value); apr_table_setn(msr->geo_vars, s->name, (void *)s); s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); s->name = apr_pstrdup(msr->mp, "LATITUDE"); s->name_len = strlen(s->name); s->value = apr_psprintf(msr->mp, "%f", rec.latitude); s->value_len = strlen(s->value); apr_table_setn(msr->geo_vars, s->name, (void *)s); s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); s->name = apr_pstrdup(msr->mp, "LONGITUDE"); s->name_len = strlen(s->name); s->value = apr_psprintf(msr->mp, "%f", rec.longitude); s->value_len = strlen(s->value); apr_table_setn(msr->geo_vars, s->name, (void *)s); s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); s->name = apr_pstrdup(msr->mp, "DMA_CODE"); s->name_len = strlen(s->name); s->value = apr_psprintf(msr->mp, "%d", rec.dma_code); s->value_len = strlen(s->value); apr_table_setn(msr->geo_vars, s->name, (void *)s); s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string)); s->name = apr_pstrdup(msr->mp, "AREA_CODE"); s->name_len = strlen(s->name); s->value = apr_psprintf(msr->mp, "%d", rec.area_code); s->value_len = strlen(s->value); apr_table_setn(msr->geo_vars, s->name, (void *)s); return 1; } /* rbl */ static int msre_op_rbl_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { unsigned int h0, h1, h2, h3; unsigned int high8bits = 0; char *name_to_check = NULL; char *target = NULL; apr_sockaddr_t *sa = NULL; apr_status_t rc; int capture = 0; if (error_msg == NULL) return -1; *error_msg = NULL; capture = apr_table_get(rule->actionset->actions, "capture") ? 1 : 0; /* ENH Add IPv6 support. */ target = apr_pstrmemdup(msr->mp, var->value, var->value_len); if (target == NULL) return -1; /* Construct the host name we want to resolve. */ if (sscanf(target, "%d.%d.%d.%d", &h0, &h1, &h2, &h3) == 4) { /* IPv4 address */ /* If we're using the httpBl blocklist, we need to add the key */ if(strstr(rule->op_param,"httpbl.org")) { if (msr->txcfg->httpBlkey == NULL) { if (msr->txcfg->debuglog_level >= 4) { msr_log(msr, 4, "RBL httpBl called but no key defined: set SecHttpBlKey"); } *error_msg = "RBL httpBl called but no key defined: set SecHttpBlKey"; } else { name_to_check = apr_psprintf(msr->mp, "%s.%d.%d.%d.%d.%s", msr->txcfg->httpBlkey, h3, h2, h1, h0, rule->op_param); } } else { /* regular IPv4 RBLs */ name_to_check = apr_psprintf(msr->mp, "%d.%d.%d.%d.%s", h3, h2, h1, h0, rule->op_param); } } else { /* Assume the input is a domain name. */ name_to_check = apr_psprintf(msr->mp, "%s.%s", target, rule->op_param); } if (name_to_check == NULL) return -1; rc = apr_sockaddr_info_get(&sa, name_to_check, APR_UNSPEC/*msr->r->connection->remote_addr->family*/, 0, 0, msr->mp); if (rc == APR_SUCCESS) { high8bits = sa->sa.sin.sin_addr.s_addr >> 24; /* multi.uribl.com */ if(strstr(rule->op_param,"uribl.com")) { switch(high8bits) { case 2: *error_msg = apr_psprintf(msr->r->pool, "RBL lookup of %s succeeded at %s (BLACK).", log_escape_nq(msr->mp, name_to_check), var->name); break; case 4: *error_msg = apr_psprintf(msr->r->pool, "RBL lookup of %s succeeded at %s (GREY).", log_escape_nq(msr->mp, name_to_check), var->name); break; case 8: *error_msg = apr_psprintf(msr->r->pool, "RBL lookup of %s succeeded at %s (RED).", log_escape_nq(msr->mp, name_to_check), var->name); break; case 14: *error_msg = apr_psprintf(msr->r->pool, "RBL lookup of %s succeeded at %s (BLACK,GREY,RED).", log_escape_nq(msr->mp, name_to_check), var->name); break; case 255: *error_msg = apr_psprintf(msr->r->pool, "RBL lookup of %s succeeded at %s (DNS IS BLOCKED).", log_escape_nq(msr->mp, name_to_check), var->name); break; default: *error_msg = apr_psprintf(msr->r->pool, "RBL lookup of %s succeeded at %s (WHITE).", log_escape_nq(msr->mp, name_to_check), var->name); break; } set_match_to_tx(msr, capture, *error_msg, 0); } else if(strstr(rule->op_param,"spamhaus.org")) { switch(high8bits) { case 2: case 3: *error_msg = apr_psprintf(msr->r->pool, "RBL lookup of %s succeeded at %s (Static UBE sources).", log_escape_nq(msr->mp, name_to_check), var->name); break; case 4: case 5: case 6: case 7: *error_msg = apr_psprintf(msr->r->pool, "RBL lookup of %s succeeded at %s (Illegal 3rd party exploits).", log_escape_nq(msr->mp, name_to_check), var->name); break; case 10: case 11: *error_msg = apr_psprintf(msr->r->pool, "RBL lookup of %s succeeded at %s (Delivering unauthenticated SMTP email).", log_escape_nq(msr->mp, name_to_check), var->name); break; default: *error_msg = apr_psprintf(msr->r->pool, "RBL lookup of %s succeeded at %s.", log_escape_nq(msr->mp, name_to_check), var->name); break; } set_match_to_tx(msr, capture, *error_msg, 0); } else if(strstr(rule->op_param,"httpbl.org")) { char *respBl; int first, days, score, type; respBl = inet_ntoa(sa->sa.sin.sin_addr); if (sscanf(respBl, "%d.%d.%d.%d", &first, &days, &score, &type) != 4) { *error_msg = apr_psprintf(msr->r->pool, "RBL lookup of %s failed: bad response", log_escape_nq(msr->mp, name_to_check)); } else { if (first != 127) { *error_msg = apr_psprintf(msr->r->pool, "RBL lookup of %s failed: bad response", log_escape_nq(msr->mp, name_to_check)); } else { char *ptype; switch(type) { case 0: ptype = "Search Engine"; break; case 1: ptype = "Suspicious IP"; break; case 2: ptype = "Harvester IP"; break; case 3: ptype = "Suspicious harvester IP"; break; case 4: ptype = "Comment spammer IP"; break; case 5: ptype = "Suspicious comment spammer IP"; break; case 6: ptype = "Harvester and comment spammer IP"; break; case 7: ptype = "Suspicious harvester comment spammer IP"; break; default: ptype = " "; } *error_msg = apr_psprintf(msr->r->pool, "RBL lookup of %s succeeded at %s. %s: %d days since last activity, threat score %d", log_escape_nq(msr->mp, name_to_check), var->name, ptype, days, score); } } set_match_to_tx(msr, capture, *error_msg, 0); /* end of httpBl code */ } else { *error_msg = apr_psprintf(msr->r->pool, "RBL lookup of %s succeeded at %s.", log_escape_nq(msr->mp, name_to_check), var->name); set_match_to_tx(msr, capture, *error_msg, 0); } return 1; /* Match. */ } if (msr->txcfg->debuglog_level >= 5) { msr_log(msr, 5, "RBL lookup of %s failed at %s.", log_escape_nq(msr->mp, name_to_check), var->name); } /* No match. */ return 0; } /* fuzzyHash */ static int msre_op_fuzzy_hash_init(msre_rule *rule, char **error_msg) { #ifdef WITH_SSDEEP struct fuzzy_hash_param_data *param_data; struct fuzzy_hash_chunk *chunk, *t; FILE *fp; char *file; int param_len,threshold; char line[1024]; char *data = NULL; char *threshold_str = NULL; param_data = apr_palloc(rule->ruleset->mp, sizeof(struct fuzzy_hash_param_data)); param_data->head = NULL; data = apr_pstrdup(rule->ruleset->mp, rule->op_param); threshold_str = data; #endif if (error_msg == NULL) { return -1; } *error_msg = NULL; #ifdef WITH_SSDEEP /* Sanity check */ param_len = strlen(threshold_str); threshold_str = threshold_str + param_len; if (param_len < 3) { goto invalid_parameters; } while (param_len - 1 > 0 && *threshold_str != ' ') { param_len--; threshold_str--; } *threshold_str = '\0'; threshold_str++; file = data; threshold = atoi(threshold_str); if ((file == NULL) || (is_empty_string(file)) || (threshold > 100) || (threshold < 1)) { goto invalid_parameters; } file = resolve_relative_path(rule->ruleset->mp, rule->filename, file); fp = fopen(file, "r"); if (!fp) { *error_msg = apr_psprintf(rule->ruleset->mp, "Not able to open file:" \ " %s.", file); return -1; } while (read_line(line, sizeof(line), fp)) { chunk = apr_palloc(rule->ruleset->mp, sizeof(struct fuzzy_hash_chunk)); chunk->data = apr_pstrdup(rule->ruleset->mp, line); chunk->next = NULL; if (param_data->head == NULL) { param_data->head = chunk; } else { t = param_data->head; while (t->next) { t = t->next; } t->next = chunk; } } fclose(fp); param_data->file = file; param_data->threshold = threshold; rule->op_param_data = param_data; #else rule->op_param_data = NULL; return 1; #endif return 1; invalid_parameters: *error_msg = apr_psprintf(rule->ruleset->mp, "Operator @fuzzyHash " \ "requires valid parameters. File and threshold."); return -1; } static int msre_op_fuzzy_hash_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { #ifdef WITH_SSDEEP char result[FUZZY_MAX_RESULT]; struct fuzzy_hash_param_data *param = rule->op_param_data; struct fuzzy_hash_chunk *chunk = param->head; #endif if (error_msg == NULL) { return -1; } *error_msg = NULL; #ifdef WITH_SSDEEP if (fuzzy_hash_buf(var->value, var->value_len, result)) { *error_msg = apr_psprintf(msr->mp, "Problems generating " \ "fuzzy hash."); return -1; } while (chunk != NULL) { int i = fuzzy_compare(chunk->data, result); msr_log(msr, 9, "%d (%s)", i, chunk->data); if (i >= param->threshold) { *error_msg = apr_psprintf(msr->mp, "Fuzzy hash of %s matched " \ "with %s (from: %s). Score: %d.", var->name, chunk->data, param->file, i); return 1; } chunk = chunk->next; } #else *error_msg = apr_psprintf(msr->mp, "ModSecurity was not " \ "compiled with ssdeep support."); return -1; #endif /* No match. */ return 0; } /* inspectFile */ static int msre_op_inspectFile_init(msre_rule *rule, char **error_msg) { char *filename = (char *)rule->op_param; if (error_msg == NULL) return -1; *error_msg = NULL; if ((filename == NULL)||(is_empty_string(filename))) { *error_msg = apr_psprintf(rule->ruleset->mp, "Operator @inspectFile requires parameter."); return -1; } filename = resolve_relative_path(rule->ruleset->mp, rule->filename, filename); #if defined(WITH_LUA) /* ENH Write & use string_ends(s, e). */ if (strlen(rule->op_param) > 4) { char *p = filename + strlen(filename) - 4; if ((p[0] == '.')&&(p[1] == 'l')&&(p[2] == 'u')&&(p[3] == 'a')) { msc_script *script = NULL; /* Compile script. */ *error_msg = lua_compile(&script, filename, rule->ruleset->mp); if (*error_msg != NULL) return -1; rule->op_param_data = script; } } #endif if (rule->op_param_data == NULL) { /* ENH Verify the script exists and that we have * the rights to execute it. */ } return 1; } static int msre_op_inspectFile_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { if (error_msg == NULL) return -1; *error_msg = NULL; if (rule->op_param_data == NULL) { /* Execute externally, as native binary/shell script. */ char *script_output = NULL; char const *argv[5]; const char *approver_script = rule->op_param; const char *target_file = apr_pstrmemdup(msr->mp, var->value, var->value_len); if (msr->txcfg->debuglog_level >= 4) { msr_log(msr, 4, "Executing %s to inspect %s.", approver_script, target_file); } argv[0] = approver_script; argv[1] = target_file; argv[2] = NULL; if (apache2_exec(msr, approver_script, (const char **)argv, &script_output) <= 0) { *error_msg = apr_psprintf(msr->mp, "Execution of the approver script \"%s\" failed (invocation failed).", log_escape(msr->mp, approver_script)); return -1; } if (script_output == NULL) { *error_msg = apr_psprintf(msr->mp, "Execution of the approver script \"%s\" failed (no output).", log_escape(msr->mp, approver_script)); return -1; } if (script_output[0] != '1') { *error_msg = apr_psprintf(msr->mp, "File \"%s\" rejected by the approver script \"%s\": %s", log_escape(msr->mp, target_file), log_escape(msr->mp, approver_script), log_escape_nq(msr->mp, script_output)); return 1; /* Match. */ } } #if defined(WITH_LUA) else { /* Execute internally, as Lua script. */ char *target = apr_pstrmemdup(msr->mp, var->value, var->value_len); msc_script *script = (msc_script *)rule->op_param_data; int rc; rc = lua_execute(script, target, msr, rule, error_msg); if (rc < 0) { /* Error. */ return -1; } return rc; } #endif /* No match. */ return 0; } /* validateByteRange */ static int msre_op_validateByteRange_init(msre_rule *rule, char **error_msg) { char *p = NULL, *saveptr = NULL; char *table = NULL, *data = NULL; if (error_msg == NULL) return -1; *error_msg = NULL; if (rule->op_param == NULL) { *error_msg = apr_psprintf(rule->ruleset->mp, "Missing parameter for validateByteRange."); return -1; } /* Initialise. */ data = apr_pstrdup(rule->ruleset->mp, rule->op_param); rule->op_param_data = apr_pcalloc(rule->ruleset->mp, 32); if ((data == NULL)||(rule->op_param_data == NULL)) return -1; table = rule->op_param_data; /* Extract parameters and update table. */ p = apr_strtok(data, ",", &saveptr); while(p != NULL) { char *s = strstr(p, "-"); if (s == NULL) { /* Single value. */ int x = atoi(p); if ((x < 0)||(x > 255)) { *error_msg = apr_psprintf(rule->ruleset->mp, "Invalid range value: %d", x); return 0; } table[x>>3] = (table[x>>3] | (1 << (x & 0x7))); } else { /* Range. */ int start = atoi(p); int end = atoi(s + 1); if ((start < 0)||(start > 255)) { *error_msg = apr_psprintf(rule->ruleset->mp, "Invalid range start value: %d", start); return 0; } if ((end < 0)||(end > 255)) { *error_msg = apr_psprintf(rule->ruleset->mp, "Invalid range end value: %d", end); return 0; } if (start > end) { *error_msg = apr_psprintf(rule->ruleset->mp, "Invalid range: %d-%d", start, end); return 0; } while(start <= end) { table[start >> 3] = (table[start >> 3] | (1 << (start & 0x7))); start++; } } p = apr_strtok(NULL, ",", &saveptr); } return 1; } static int msre_op_validateByteRange_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { char *table = rule->op_param_data; unsigned int i, count; if (error_msg == NULL) return -1; *error_msg = NULL; if (table == NULL) { *error_msg = apr_psprintf(msr->mp, "Internal Error: validateByteRange table not " "initialised."); return -1; } /* Check every byte of the target to detect characters that are not allowed. */ count = 0; for(i = 0; i < var->value_len; i++) { int x = ((unsigned char *)var->value)[i]; if (!(table[x >> 3] & (1 << (x & 0x7)))) { if (msr->txcfg->debuglog_level >= 9) { msr_log(msr, 9, "Value %d in %s outside range: %s", x, var->name, rule->op_param); } count++; } } if (count == 0) return 0; /* Valid - no match. */ *error_msg = apr_psprintf(msr->mp, "Found %d byte(s) in %s outside range: %s.", count, var->name, rule->op_param); return 1; /* Invalid - match.*/ } /* validateUrlEncoding */ static int validate_url_encoding(const char *input, long int input_length) { int i; if ((input == NULL)||(input_length < 0)) return -1; i = 0; while (i < input_length) { if (input[i] == '%') { if (i + 2 >= input_length) { /* Not enough bytes. */ return -3; } else { /* Here we only decode a %xx combination if it is valid, * leaving it as is otherwise. */ char c1 = input[i + 1]; char c2 = input[i + 2]; if ( (((c1 >= '0')&&(c1 <= '9')) || ((c1 >= 'a')&&(c1 <= 'f')) || ((c1 >= 'A')&&(c1 <= 'F'))) && (((c2 >= '0')&&(c2 <= '9')) || ((c2 >= 'a')&&(c2 <= 'f')) || ((c2 >= 'A')&&(c2 <= 'F'))) ) { i += 3; } else { /* Non-hexadecimal characters used in encoding. */ return -2; } } } else { i++; } } return 1; } static int msre_op_validateUrlEncoding_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { int rc = validate_url_encoding(var->value, var->value_len); switch(rc) { case 1 : /* Encoding is valid */ *error_msg = apr_psprintf(msr->mp, "Valid URL Encoding at %s.", var->name); break; case -2 : *error_msg = apr_psprintf(msr->mp, "Invalid URL Encoding: Non-hexadecimal " "digits used at %s.", var->name); return 1; /* Invalid match. */ break; case -3 : *error_msg = apr_psprintf(msr->mp, "Invalid URL Encoding: Not enough characters " "at the end of input at %s.", var->name); return 1; /* Invalid match. */ break; case -1 : default : *error_msg = apr_psprintf(msr->mp, "Invalid URL Encoding: Internal Error (rc = %d) at %s", rc, var->name); return -1; break; } /* No match. */ return 0; } /* validateUtf8Encoding */ /* NOTE: This is over-commented for ease of verification */ static int detect_utf8_character(const unsigned char *p_read, unsigned int length) { int unicode_len = 0; unsigned int d = 0; unsigned char c; if (p_read == NULL) return UNICODE_ERROR_DECODING_ERROR; c = *p_read; /* If first byte begins with binary 0 it is single byte encoding */ if ((c & 0x80) == 0) { /* single byte unicode (7 bit ASCII equivilent) has no validation */ return 1; } /* If first byte begins with binary 110 it is two byte encoding*/ else if ((c & 0xE0) == 0xC0) { /* check we have at least two bytes */ if (length < 2) unicode_len = UNICODE_ERROR_CHARACTERS_MISSING; /* check second byte starts with binary 10 */ else if (((*(p_read + 1)) & 0xC0) != 0x80) unicode_len = UNICODE_ERROR_INVALID_ENCODING; else { unicode_len = 2; /* compute character number */ d = ((c & 0x1F) << 6) | (*(p_read + 1) & 0x3F); } } /* If first byte begins with binary 1110 it is three byte encoding */ else if ((c & 0xF0) == 0xE0) { /* check we have at least three bytes */ if (length < 3) unicode_len = UNICODE_ERROR_CHARACTERS_MISSING; /* check second byte starts with binary 10 */ else if (((*(p_read + 1)) & 0xC0) != 0x80) unicode_len = UNICODE_ERROR_INVALID_ENCODING; /* check third byte starts with binary 10 */ else if (((*(p_read + 2)) & 0xC0) != 0x80) unicode_len = UNICODE_ERROR_INVALID_ENCODING; else { unicode_len = 3; /* compute character number */ d = ((c & 0x0F) << 12) | ((*(p_read + 1) & 0x3F) << 6) | (*(p_read + 2) & 0x3F); } } /* If first byte begins with binary 11110 it is four byte encoding */ else if ((c & 0xF8) == 0xF0) { /* restrict characters to UTF-8 range (U+0000 - U+10FFFF)*/ if (c >= 0xF5) { return UNICODE_ERROR_RESTRICTED_CHARACTER; } /* check we have at least four bytes */ if (length < 4) unicode_len = UNICODE_ERROR_CHARACTERS_MISSING; /* check second byte starts with binary 10 */ else if (((*(p_read + 1)) & 0xC0) != 0x80) unicode_len = UNICODE_ERROR_INVALID_ENCODING; /* check third byte starts with binary 10 */ else if (((*(p_read + 2)) & 0xC0) != 0x80) unicode_len = UNICODE_ERROR_INVALID_ENCODING; /* check forth byte starts with binary 10 */ else if (((*(p_read + 3)) & 0xC0) != 0x80) unicode_len = UNICODE_ERROR_INVALID_ENCODING; else { unicode_len = 4; /* compute character number */ d = ((c & 0x07) << 18) | ((*(p_read + 1) & 0x3F) << 12) | ((*(p_read + 2) & 0x3F) << 6) | (*(p_read + 3) & 0x3F); } } /* any other first byte is invalid (RFC 3629) */ else { return UNICODE_ERROR_INVALID_ENCODING; } /* invalid UTF-8 character number range (RFC 3629) */ if ((d >= 0xD800) && (d <= 0xDFFF)) { return UNICODE_ERROR_RESTRICTED_CHARACTER; } /* check for overlong */ if ((unicode_len == 4) && (d < 0x010000)) { /* four byte could be represented with less bytes */ return UNICODE_ERROR_OVERLONG_CHARACTER; } else if ((unicode_len == 3) && (d < 0x0800)) { /* three byte could be represented with less bytes */ return UNICODE_ERROR_OVERLONG_CHARACTER; } else if ((unicode_len == 2) && (d < 0x80)) { /* two byte could be represented with less bytes */ return UNICODE_ERROR_OVERLONG_CHARACTER; } return unicode_len; } static int msre_op_validateUtf8Encoding_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { unsigned int i, bytes_left; bytes_left = var->value_len; for(i = 0; i < var->value_len;) { int rc = detect_utf8_character((unsigned char *)&var->value[i], bytes_left); switch(rc) { case UNICODE_ERROR_CHARACTERS_MISSING : *error_msg = apr_psprintf(msr->mp, "Invalid UTF-8 encoding: " "not enough bytes in character " "at %s. [offset \"%d\"]", var->name, i); return 1; break; case UNICODE_ERROR_INVALID_ENCODING : *error_msg = apr_psprintf(msr->mp, "Invalid UTF-8 encoding: " "invalid byte value in character " "at %s. [offset \"%d\"]", var->name, i); return 1; break; case UNICODE_ERROR_OVERLONG_CHARACTER : *error_msg = apr_psprintf(msr->mp, "Invalid UTF-8 encoding: " "overlong character detected " "at %s. [offset \"%d\"]", var->name, i); return 1; break; case UNICODE_ERROR_RESTRICTED_CHARACTER : *error_msg = apr_psprintf(msr->mp, "Invalid UTF-8 encoding: " "use of restricted character " "at %s. [offset \"%d\"]", var->name, i); return 1; break; case UNICODE_ERROR_DECODING_ERROR : *error_msg = apr_psprintf(msr->mp, "Error validating UTF-8 decoding " "at %s. [offset \"%d\"]", var->name, i); return 1; break; } if (rc <= 0) { *error_msg = apr_psprintf(msr->mp, "Internal error during UTF-8 validation " "at %s.", var->name); return 1; } i += rc; bytes_left -= rc; } return 0; } /* eq */ static int msre_op_eq_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { msc_string str; int left, right; char *target = NULL; if (error_msg == NULL) return -1; *error_msg = NULL; if ((var->value == NULL)||(rule->op_param == NULL)) { /* NULL values do not match anything. */ return 0; } str.value = (char *)rule->op_param; str.value_len = strlen(str.value); expand_macros(msr, &str, rule, msr->mp); target = apr_pstrmemdup(msr->mp, var->value, var->value_len); if (target == NULL) return -1; left = atoi(target); right = atoi(str.value); if (left != right) { /* No match. */ return 0; } else { *error_msg = apr_psprintf(msr->mp, "Operator EQ matched %d at %s.", right, var->name); /* Match. */ return 1; } } /* gt */ static int msre_op_gt_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { msc_string str; int left, right; char *target = NULL; if ((var->value == NULL)||(rule->op_param == NULL)) { /* NULL values do not match anything. */ return 0; } if (error_msg == NULL) return -1; *error_msg = NULL; if ((var->value == NULL)||(rule->op_param == NULL)) { /* NULL values do not match anything. */ return 0; } str.value = (char *)rule->op_param; str.value_len = strlen(str.value); expand_macros(msr, &str, rule, msr->mp); target = apr_pstrmemdup(msr->mp, var->value, var->value_len); if (target == NULL) return -1; left = atoi(target); right = atoi(str.value); if (left <= right) { /* No match. */ return 0; } else { *error_msg = apr_psprintf(msr->mp, "Operator GT matched %d at %s.", right, var->name); /* Match. */ return 1; } } /* lt */ static int msre_op_lt_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { msc_string str; int left, right; char *target = NULL; if ((var->value == NULL)||(rule->op_param == NULL)) { /* NULL values do not match anything. */ return 0; } if (error_msg == NULL) return -1; *error_msg = NULL; if ((var->value == NULL)||(rule->op_param == NULL)) { /* NULL values do not match anything. */ return 0; } str.value = (char *)rule->op_param; str.value_len = strlen(str.value); expand_macros(msr, &str, rule, msr->mp); target = apr_pstrmemdup(msr->mp, var->value, var->value_len); if (target == NULL) return -1; left = atoi(target); right = atoi(str.value); if (left >= right) { /* No match. */ return 0; } else { *error_msg = apr_psprintf(msr->mp, "Operator LT matched %d at %s.", right, var->name); /* Match. */ return 1; } } /* ge */ static int msre_op_ge_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { msc_string str; int left, right; char *target = NULL; if ((var->value == NULL)||(rule->op_param == NULL)) { /* NULL values do not match anything. */ return 0; } if (error_msg == NULL) return -1; *error_msg = NULL; if ((var->value == NULL)||(rule->op_param == NULL)) { /* NULL values do not match anything. */ return 0; } str.value = (char *)rule->op_param; str.value_len = strlen(str.value); expand_macros(msr, &str, rule, msr->mp); target = apr_pstrmemdup(msr->mp, var->value, var->value_len); if (target == NULL) return -1; left = atoi(target); right = atoi(str.value); if (left < right) { /* No match. */ return 0; } else { *error_msg = apr_psprintf(msr->mp, "Operator GE matched %d at %s.", right, var->name); /* Match. */ return 1; } } /* le */ static int msre_op_le_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { msc_string str; int left, right; char *target = NULL; if ((var->value == NULL)||(rule->op_param == NULL)) { /* NULL values do not match anything. */ return 0; } if (error_msg == NULL) return -1; *error_msg = NULL; if ((var->value == NULL)||(rule->op_param == NULL)) { /* NULL values do not match anything. */ return 0; } str.value = (char *)rule->op_param; str.value_len = strlen(str.value); expand_macros(msr, &str, rule, msr->mp); target = apr_pstrmemdup(msr->mp, var->value, var->value_len); if (target == NULL) return -1; left = atoi(target); right = atoi(str.value); if (left > right) { /* No match. */ return 0; } else { *error_msg = apr_psprintf(msr->mp, "Operator LE matched %d at %s.", right, var->name); /* Match. */ return 1; } } /* -------------------------------------------------------------------------- */ /** * */ void msre_engine_register_default_operators(msre_engine *engine) { /* unconditionalMatch */ msre_engine_op_register(engine, "unconditionalMatch", NULL, msre_op_unconditionalmatch_execute ); /* noMatch */ msre_engine_op_register(engine, "noMatch", NULL, msre_op_nomatch_execute ); /* ipmatch */ msre_engine_op_register(engine, "ipmatch", msre_op_ipmatch_param_init, msre_op_ipmatch_execute ); /* ipmatchFromFile */ msre_engine_op_register(engine, "ipmatchFromFile", msre_op_ipmatchFromFile_param_init, msre_op_ipmatchFromFile_execute ); /* ipmatchf */ msre_engine_op_register(engine, "ipmatchf", msre_op_ipmatchFromFile_param_init, msre_op_ipmatchFromFile_execute ); /* rsub */ #if !defined(MSC_TEST) msre_engine_op_register(engine, "rsub", msre_op_rsub_param_init, msre_op_rsub_execute ); #endif /* MSC_TEST */ /* rx */ msre_engine_op_register(engine, "rx", msre_op_rx_param_init, msre_op_rx_execute ); /* validateEncyption */ msre_engine_op_register(engine, "validateHash", msre_op_validateHash_param_init, msre_op_validateHash_execute ); /* pm */ msre_engine_op_register(engine, "pm", msre_op_pm_param_init, msre_op_pm_execute ); /* pmFromFile */ msre_engine_op_register(engine, "pmFromFile", msre_op_pmFromFile_param_init, msre_op_pm_execute ); /* pmf */ msre_engine_op_register(engine, "pmf", msre_op_pmFromFile_param_init, msre_op_pm_execute ); /* within */ msre_engine_op_register(engine, "within", NULL, /* ENH init function to flag var substitution */ msre_op_within_execute ); /* contains */ msre_engine_op_register(engine, "contains", NULL, /* ENH init function to flag var substitution */ msre_op_contains_execute ); /* containsWord */ msre_engine_op_register(engine, "containsWord", NULL, /* ENH init function to flag var substitution */ msre_op_containsWord_execute ); /* detectSQLi */ msre_engine_op_register(engine, "detectSQLi", NULL, msre_op_detectSQLi_execute ); /* detectXSS */ msre_engine_op_register(engine, "detectXSS", NULL, msre_op_detectXSS_execute ); /* streq */ msre_engine_op_register(engine, "streq", NULL, /* ENH init function to flag var substitution */ msre_op_streq_execute ); /* beginsWith */ msre_engine_op_register(engine, "beginsWith", NULL, /* ENH init function to flag var substitution */ msre_op_beginsWith_execute ); /* endsWith */ msre_engine_op_register(engine, "endsWith", NULL, /* ENH init function to flag var substitution */ msre_op_endsWith_execute ); /* strmatch */ msre_engine_op_register(engine, "strmatch", msre_op_strmatch_param_init, msre_op_strmatch_execute ); /* validateDTD */ msre_engine_op_register(engine, "validateDTD", msre_op_validateDTD_init, msre_op_validateDTD_execute ); /* validateSchema */ msre_engine_op_register(engine, "validateSchema", msre_op_validateSchema_init, msre_op_validateSchema_execute ); /* verifyCC */ msre_engine_op_register(engine, "verifyCC", msre_op_verifyCC_init, msre_op_verifyCC_execute ); /* verifyCPF */ msre_engine_op_register(engine, "verifyCPF", msre_op_verifyCPF_init, msre_op_verifyCPF_execute ); /* verifySSN */ msre_engine_op_register(engine, "verifySSN", msre_op_verifySSN_init, msre_op_verifySSN_execute ); /* geoLookup */ msre_engine_op_register(engine, "geoLookup", NULL, msre_op_geoLookup_execute ); /* gsbLookup */ msre_engine_op_register(engine, "gsbLookup", msre_op_gsbLookup_param_init, msre_op_gsbLookup_execute ); /* rbl */ msre_engine_op_register(engine, "rbl", NULL, /* ENH init function to validate DNS server */ msre_op_rbl_execute ); /* inspectFile */ msre_engine_op_register(engine, "inspectFile", msre_op_inspectFile_init, msre_op_inspectFile_execute ); /* fuzzy_hash */ msre_engine_op_register(engine, "fuzzyHash", msre_op_fuzzy_hash_init, msre_op_fuzzy_hash_execute ); /* validateByteRange */ msre_engine_op_register(engine, "validateByteRange", msre_op_validateByteRange_init, msre_op_validateByteRange_execute ); /* validateUrlEncoding */ msre_engine_op_register(engine, "validateUrlEncoding", NULL, msre_op_validateUrlEncoding_execute ); /* validateUtf8Encoding */ msre_engine_op_register(engine, "validateUtf8Encoding", NULL, msre_op_validateUtf8Encoding_execute ); /* eq */ msre_engine_op_register(engine, "eq", NULL, msre_op_eq_execute ); /* gt */ msre_engine_op_register(engine, "gt", NULL, msre_op_gt_execute ); /* lt */ msre_engine_op_register(engine, "lt", NULL, msre_op_lt_execute ); /* le */ msre_engine_op_register(engine, "le", NULL, msre_op_le_execute ); /* ge */ msre_engine_op_register(engine, "ge", NULL, msre_op_ge_execute ); } modsecurity-2.9.5/apache2/msc_xml.c0000664000175000017500000001044414147005233020333 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #include "msc_xml.h" static xmlParserInputBufferPtr xml_unload_external_entity(const char *URI, xmlCharEncoding enc) { return NULL; } /** * Initialise XML parser. */ int xml_init(modsec_rec *msr, char **error_msg) { xmlParserInputBufferCreateFilenameFunc entity; if (error_msg == NULL) return -1; *error_msg = NULL; msr->xml = apr_pcalloc(msr->mp, sizeof(xml_data)); if (msr->xml == NULL) return -1; if(msr->txcfg->xml_external_entity == 0) { entity = xmlParserInputBufferCreateFilenameDefault(xml_unload_external_entity); } return 1; } #if 0 static void xml_receive_sax_error(void *data, const char *msg, ...) { modsec_rec *msr = (modsec_rec *)data; char message[256]; if (msr == NULL) return; apr_snprintf(message, sizeof(message), "%s (line %d offset %d)", log_escape_nq(msr->mp, msr->xml->parsing_ctx->lastError.message), msr->xml->parsing_ctx->lastError.line, msr->xml->parsing_ctx->lastError.int2); msr_log(msr, 5, "XML: Parsing error: %s", message); } #endif /** * Feed one chunk of data to the XML parser. */ int xml_process_chunk(modsec_rec *msr, const char *buf, unsigned int size, char **error_msg) { if (error_msg == NULL) return -1; *error_msg = NULL; /* We want to initialise our parsing context here, to * enable us to pass it the first chunk of data so that * it can attempt to auto-detect the encoding. */ if (msr->xml->parsing_ctx == NULL) { /* First invocation. */ msr_log(msr, 4, "XML: Initialising parser."); /* NOTE When Sax interface is used libxml will not * create the document object, but we need it. msr->xml->sax_handler = (xmlSAXHandler *)apr_pcalloc(msr->mp, sizeof(xmlSAXHandler)); if (msr->xml->sax_handler == NULL) return -1; msr->xml->sax_handler->error = xml_receive_sax_error; msr->xml->sax_handler->warning = xml_receive_sax_error; msr->xml->parsing_ctx = xmlCreatePushParserCtxt(msr->xml->sax_handler, msr, buf, size, "body.xml"); */ msr->xml->parsing_ctx = xmlCreatePushParserCtxt(NULL, NULL, buf, size, "body.xml"); if (msr->xml->parsing_ctx == NULL) { *error_msg = apr_psprintf(msr->mp, "XML: Failed to create parsing context."); return -1; } } else { /* Not a first invocation. */ xmlParseChunk(msr->xml->parsing_ctx, buf, size, 0); if (msr->xml->parsing_ctx->wellFormed != 1) { *error_msg = apr_psprintf(msr->mp, "XML: Failed parsing document."); return -1; } } return 1; } /** * Finalise XML parsing. */ int xml_complete(modsec_rec *msr, char **error_msg) { if (error_msg == NULL) return -1; *error_msg = NULL; /* Only if we have a context, meaning we've done some work. */ if (msr->xml->parsing_ctx != NULL) { /* This is how we signalise the end of parsing to libxml. */ xmlParseChunk(msr->xml->parsing_ctx, NULL, 0, 1); /* Preserve the results for our reference. */ msr->xml->well_formed = msr->xml->parsing_ctx->wellFormed; msr->xml->doc = msr->xml->parsing_ctx->myDoc; /* Clean up everything else. */ xmlFreeParserCtxt(msr->xml->parsing_ctx); msr->xml->parsing_ctx = NULL; msr_log(msr, 4, "XML: Parsing complete (well_formed %u).", msr->xml->well_formed); if (msr->xml->well_formed != 1) { *error_msg = apr_psprintf(msr->mp, "XML: Failed parsing document."); return -1; } } return 1; } /** * Frees the resources used for XML parsing. */ apr_status_t xml_cleanup(modsec_rec *msr) { if (msr->xml->doc != NULL) { xmlFreeDoc(msr->xml->doc); msr->xml->doc = NULL; } return 1; } modsecurity-2.9.5/apache2/msc_multipart.h0000664000175000017500000001043114147005233021555 0ustar mhsvierulamhsvierula/* * ModSecurity for Apache 2.x, http://www.modsecurity.org/ * Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/) * * You may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * If any of the files related to licensing are missing or if you have any * other questions related to licensing please contact Trustwave Holdings, Inc. * directly using the email address security@modsecurity.org. */ #ifndef _MSC_MULTIPART_H_ #define _MSC_MULTIPART_H_ #define MULTIPART_BUF_SIZE 4096 #define MULTIPART_FORMDATA 1 #define MULTIPART_FILE 2 typedef struct multipart_part multipart_part; typedef struct multipart_data multipart_data; #include "apr_general.h" #include "apr_tables.h" #include "modsecurity.h" typedef struct value_part_t value_part_t; struct value_part_t { char *data; long int length; }; struct multipart_part { /* part type, can be MULTIPART_FORMDATA or MULTIPART_FILE */ int type; /* the name */ char *name; /* variables only, variable value */ char *value; apr_array_header_t *value_parts; /* files only, the content type (where available) */ char *content_type; /* files only, the name of the temporary file holding data */ char *tmp_file_name; int tmp_file_fd; unsigned int tmp_file_size; /* files only, filename as supplied by the browser */ char *filename; char *last_header_name; apr_table_t *headers; unsigned int offset; unsigned int length; }; struct multipart_data { /* this array keeps parts */ apr_array_header_t *parts; /* Number of parts that are files */ int nfiles; /* mime boundary used to detect when * parts end and begin */ char *boundary; int boundary_count; /* internal buffer and other variables * used while parsing */ char buf[MULTIPART_BUF_SIZE + 2]; int buf_contains_line; char *bufptr; int bufleft; unsigned int buf_offset; /* pointer that keeps track of a part while * it is being built */ multipart_part *mpp; /* part parsing state; 0 means we are reading * headers, 1 means we are collecting data */ int mpp_state; /* because of the way this parsing algorithm * works we hold back the last two bytes of * each data chunk so that we can discard it * later if the next data chunk proves to be * a boundary; the first byte is an indicator * 0 - no content, 1 - two data bytes available */ char reserve[4]; int seen_data; int is_complete; int flag_error; int flag_data_before; int flag_data_after; int flag_header_folding; int flag_boundary_quoted; int flag_lf_line; int flag_crlf_line; int flag_unmatched_boundary; int flag_boundary_whitespace; int flag_missing_semicolon; int flag_invalid_quoting; int flag_invalid_part; int flag_invalid_header_folding; int flag_file_limit_exceeded; }; /* Functions */ int DSOLOCAL multipart_init(modsec_rec *msr, char **error_msg); int DSOLOCAL multipart_complete(modsec_rec *msr, char **error_msg); int DSOLOCAL multipart_process_chunk(modsec_rec *msr, const char *buf, unsigned int size, char **error_msg); apr_status_t DSOLOCAL multipart_cleanup(modsec_rec *msr); int DSOLOCAL multipart_get_arguments(modsec_rec *msr, char *origin, apr_table_t *arguments); char DSOLOCAL *multipart_reconstruct_urlencoded_body_sanitize(modsec_rec *msr); #endif modsecurity-2.9.5/apache2/libinjection/0000775000175000017500000000000014147005233021173 5ustar mhsvierulamhsvierulamodsecurity-2.9.5/apache2/libinjection/libinjection_html5.c0000664000175000017500000005227614147005233025135 0ustar mhsvierulamhsvierula#include "libinjection_html5.h" #include #include #ifdef DEBUG #include #define TRACE() printf("%s:%d\n", __FUNCTION__, __LINE__) #else #define TRACE() #endif #define CHAR_EOF -1 #define CHAR_NULL 0 #define CHAR_BANG 33 #define CHAR_DOUBLE 34 #define CHAR_PERCENT 37 #define CHAR_SINGLE 39 #define CHAR_DASH 45 #define CHAR_SLASH 47 #define CHAR_LT 60 #define CHAR_EQUALS 61 #define CHAR_GT 62 #define CHAR_QUESTION 63 #define CHAR_RIGHTB 93 #define CHAR_TICK 96 /* prototypes */ static int h5_skip_white(h5_state_t* hs); static int h5_is_white(char c); static int h5_state_eof(h5_state_t* hs); static int h5_state_data(h5_state_t* hs); static int h5_state_tag_open(h5_state_t* hs); static int h5_state_tag_name(h5_state_t* hs); static int h5_state_tag_name_close(h5_state_t* hs); static int h5_state_end_tag_open(h5_state_t* hs); static int h5_state_self_closing_start_tag(h5_state_t* hs); static int h5_state_attribute_name(h5_state_t* hs); static int h5_state_after_attribute_name(h5_state_t* hs); static int h5_state_before_attribute_name(h5_state_t* hs); static int h5_state_before_attribute_value(h5_state_t* hs); static int h5_state_attribute_value_double_quote(h5_state_t* hs); static int h5_state_attribute_value_single_quote(h5_state_t* hs); static int h5_state_attribute_value_back_quote(h5_state_t* hs); static int h5_state_attribute_value_no_quote(h5_state_t* hs); static int h5_state_after_attribute_value_quoted_state(h5_state_t* hs); static int h5_state_comment(h5_state_t* hs); static int h5_state_cdata(h5_state_t* hs); /* 12.2.4.44 */ static int h5_state_bogus_comment(h5_state_t* hs); static int h5_state_bogus_comment2(h5_state_t* hs); /* 12.2.4.45 */ static int h5_state_markup_declaration_open(h5_state_t* hs); /* 8.2.4.52 */ static int h5_state_doctype(h5_state_t* hs); /** * public function */ void libinjection_h5_init(h5_state_t* hs, const char* s, size_t len, enum html5_flags flags) { memset(hs, 0, sizeof(h5_state_t)); hs->s = s; hs->len = len; switch (flags) { case DATA_STATE: hs->state = h5_state_data; break; case VALUE_NO_QUOTE: hs->state = h5_state_before_attribute_name; break; case VALUE_SINGLE_QUOTE: hs->state = h5_state_attribute_value_single_quote; break; case VALUE_DOUBLE_QUOTE: hs->state = h5_state_attribute_value_double_quote; break; case VALUE_BACK_QUOTE: hs->state = h5_state_attribute_value_back_quote; break; } } /** * public function */ int libinjection_h5_next(h5_state_t* hs) { assert(hs->state != NULL); return (*hs->state)(hs); } /** * Everything below here is private * */ static int h5_is_white(char ch) { /* * \t = horizontal tab = 0x09 * \n = newline = 0x0A * \v = vertical tab = 0x0B * \f = form feed = 0x0C * \r = cr = 0x0D */ return strchr(" \t\n\v\f\r", ch) != NULL; } static int h5_skip_white(h5_state_t* hs) { char ch; while (hs->pos < hs->len) { ch = hs->s[hs->pos]; switch (ch) { case 0x00: /* IE only */ case 0x20: case 0x09: case 0x0A: case 0x0B: /* IE only */ case 0x0C: case 0x0D: /* IE only */ hs->pos += 1; break; default: return ch; } } return CHAR_EOF; } static int h5_state_eof(h5_state_t* hs) { /* eliminate unused function argument warning */ (void)hs; return 0; } static int h5_state_data(h5_state_t* hs) { const char* idx; TRACE(); assert(hs->len >= hs->pos); idx = (const char*) memchr(hs->s + hs->pos, CHAR_LT, hs->len - hs->pos); if (idx == NULL) { hs->token_start = hs->s + hs->pos; hs->token_len = hs->len - hs->pos; hs->token_type = DATA_TEXT; hs->state = h5_state_eof; if (hs->token_len == 0) { return 0; } } else { hs->token_start = hs->s + hs->pos; hs->token_type = DATA_TEXT; hs->token_len = (size_t)(idx - hs->s) - hs->pos; hs->pos = (size_t)(idx - hs->s) + 1; hs->state = h5_state_tag_open; if (hs->token_len == 0) { return h5_state_tag_open(hs); } } return 1; } /** * 12 2.4.8 */ static int h5_state_tag_open(h5_state_t* hs) { char ch; TRACE(); if (hs->pos >= hs->len) { return 0; } ch = hs->s[hs->pos]; if (ch == CHAR_BANG) { hs->pos += 1; return h5_state_markup_declaration_open(hs); } else if (ch == CHAR_SLASH) { hs->pos += 1; hs->is_close = 1; return h5_state_end_tag_open(hs); } else if (ch == CHAR_QUESTION) { hs->pos += 1; return h5_state_bogus_comment(hs); } else if (ch == CHAR_PERCENT) { /* this is not in spec.. alternative comment format used by IE <= 9 and Safari < 4.0.3 */ hs->pos += 1; return h5_state_bogus_comment2(hs); } else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { return h5_state_tag_name(hs); } else if (ch == CHAR_NULL) { /* IE-ism NULL characters are ignored */ return h5_state_tag_name(hs); } else { /* user input mistake in configuring state */ if (hs->pos == 0) { return h5_state_data(hs); } hs->token_start = hs->s + hs->pos - 1; hs->token_len = 1; hs->token_type = DATA_TEXT; hs->state = h5_state_data; return 1; } } /** * 12.2.4.9 */ static int h5_state_end_tag_open(h5_state_t* hs) { char ch; TRACE(); if (hs->pos >= hs->len) { return 0; } ch = hs->s[hs->pos]; if (ch == CHAR_GT) { return h5_state_data(hs); } else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { return h5_state_tag_name(hs); } hs->is_close = 0; return h5_state_bogus_comment(hs); } /* * */ static int h5_state_tag_name_close(h5_state_t* hs) { TRACE(); hs->is_close = 0; hs->token_start = hs->s + hs->pos; hs->token_len = 1; hs->token_type = TAG_NAME_CLOSE; hs->pos += 1; if (hs->pos < hs->len) { hs->state = h5_state_data; } else { hs->state = h5_state_eof; } return 1; } /** * 12.2.4.10 */ static int h5_state_tag_name(h5_state_t* hs) { char ch; size_t pos; TRACE(); pos = hs->pos; while (pos < hs->len) { ch = hs->s[pos]; if (ch == 0) { /* special non-standard case */ /* allow nulls in tag name */ /* some old browsers apparently allow and ignore them */ pos += 1; } else if (h5_is_white(ch)) { hs->token_start = hs->s + hs->pos; hs->token_len = pos - hs->pos; hs->token_type = TAG_NAME_OPEN; hs->pos = pos + 1; hs->state = h5_state_before_attribute_name; return 1; } else if (ch == CHAR_SLASH) { hs->token_start = hs->s + hs->pos; hs->token_len = pos - hs->pos; hs->token_type = TAG_NAME_OPEN; hs->pos = pos + 1; hs->state = h5_state_self_closing_start_tag; return 1; } else if (ch == CHAR_GT) { hs->token_start = hs->s + hs->pos; hs->token_len = pos - hs->pos; if (hs->is_close) { hs->pos = pos + 1; hs->is_close = 0; hs->token_type = TAG_CLOSE; hs->state = h5_state_data; } else { hs->pos = pos; hs->token_type = TAG_NAME_OPEN; hs->state = h5_state_tag_name_close; } return 1; } else { pos += 1; } } hs->token_start = hs->s + hs->pos; hs->token_len = hs->len - hs->pos; hs->token_type = TAG_NAME_OPEN; hs->state = h5_state_eof; return 1; } /** * 12.2.4.34 */ static int h5_state_before_attribute_name(h5_state_t* hs) { int ch; TRACE(); ch = h5_skip_white(hs); switch (ch) { case CHAR_EOF: { return 0; } case CHAR_SLASH: { hs->pos += 1; return h5_state_self_closing_start_tag(hs); } case CHAR_GT: { hs->state = h5_state_data; hs->token_start = hs->s + hs->pos; hs->token_len = 1; hs->token_type = TAG_NAME_CLOSE; hs->pos += 1; return 1; } default: { return h5_state_attribute_name(hs); } } } static int h5_state_attribute_name(h5_state_t* hs) { char ch; size_t pos; TRACE(); pos = hs->pos + 1; while (pos < hs->len) { ch = hs->s[pos]; if (h5_is_white(ch)) { hs->token_start = hs->s + hs->pos; hs->token_len = pos - hs->pos; hs->token_type = ATTR_NAME; hs->state = h5_state_after_attribute_name; hs->pos = pos + 1; return 1; } else if (ch == CHAR_SLASH) { hs->token_start = hs->s + hs->pos; hs->token_len = pos - hs->pos; hs->token_type = ATTR_NAME; hs->state = h5_state_self_closing_start_tag; hs->pos = pos + 1; return 1; } else if (ch == CHAR_EQUALS) { hs->token_start = hs->s + hs->pos; hs->token_len = pos - hs->pos; hs->token_type = ATTR_NAME; hs->state = h5_state_before_attribute_value; hs->pos = pos + 1; return 1; } else if (ch == CHAR_GT) { hs->token_start = hs->s + hs->pos; hs->token_len = pos - hs->pos; hs->token_type = ATTR_NAME; hs->state = h5_state_tag_name_close; hs->pos = pos; return 1; } else { pos += 1; } } /* EOF */ hs->token_start = hs->s + hs->pos; hs->token_len = hs->len - hs->pos; hs->token_type = ATTR_NAME; hs->state = h5_state_eof; hs->pos = hs->len; return 1; } /** * 12.2.4.36 */ static int h5_state_after_attribute_name(h5_state_t* hs) { int c; TRACE(); c = h5_skip_white(hs); switch (c) { case CHAR_EOF: { return 0; } case CHAR_SLASH: { hs->pos += 1; return h5_state_self_closing_start_tag(hs); } case CHAR_EQUALS: { hs->pos += 1; return h5_state_before_attribute_value(hs); } case CHAR_GT: { return h5_state_tag_name_close(hs); } default: { return h5_state_attribute_name(hs); } } } /** * 12.2.4.37 */ static int h5_state_before_attribute_value(h5_state_t* hs) { int c; TRACE(); c = h5_skip_white(hs); if (c == CHAR_EOF) { hs->state = h5_state_eof; return 0; } if (c == CHAR_DOUBLE) { return h5_state_attribute_value_double_quote(hs); } else if (c == CHAR_SINGLE) { return h5_state_attribute_value_single_quote(hs); } else if (c == CHAR_TICK) { /* NON STANDARD IE */ return h5_state_attribute_value_back_quote(hs); } else { return h5_state_attribute_value_no_quote(hs); } } static int h5_state_attribute_value_quote(h5_state_t* hs, char qchar) { const char* idx; TRACE(); /* skip initial quote in normal case. * don't do this "if (pos == 0)" since it means we have started * in a non-data state. given an input of '>pos > 0) { hs->pos += 1; } idx = (const char*) memchr(hs->s + hs->pos, qchar, hs->len - hs->pos); if (idx == NULL) { hs->token_start = hs->s + hs->pos; hs->token_len = hs->len - hs->pos; hs->token_type = ATTR_VALUE; hs->state = h5_state_eof; } else { hs->token_start = hs->s + hs->pos; hs->token_len = (size_t)(idx - hs->s) - hs->pos; hs->token_type = ATTR_VALUE; hs->state = h5_state_after_attribute_value_quoted_state; hs->pos += hs->token_len + 1; } return 1; } static int h5_state_attribute_value_double_quote(h5_state_t* hs) { TRACE(); return h5_state_attribute_value_quote(hs, CHAR_DOUBLE); } static int h5_state_attribute_value_single_quote(h5_state_t* hs) { TRACE(); return h5_state_attribute_value_quote(hs, CHAR_SINGLE); } static int h5_state_attribute_value_back_quote(h5_state_t* hs) { TRACE(); return h5_state_attribute_value_quote(hs, CHAR_TICK); } static int h5_state_attribute_value_no_quote(h5_state_t* hs) { char ch; size_t pos; TRACE(); pos = hs->pos; while (pos < hs->len) { ch = hs->s[pos]; if (h5_is_white(ch)) { hs->token_type = ATTR_VALUE; hs->token_start = hs->s + hs->pos; hs->token_len = pos - hs->pos; hs->pos = pos + 1; hs->state = h5_state_before_attribute_name; return 1; } else if (ch == CHAR_GT) { hs->token_type = ATTR_VALUE; hs->token_start = hs->s + hs->pos; hs->token_len = pos - hs->pos; hs->pos = pos; hs->state = h5_state_tag_name_close; return 1; } pos += 1; } TRACE(); /* EOF */ hs->state = h5_state_eof; hs->token_start = hs->s + hs->pos; hs->token_len = hs->len - hs->pos; hs->token_type = ATTR_VALUE; return 1; } /** * 12.2.4.41 */ static int h5_state_after_attribute_value_quoted_state(h5_state_t* hs) { char ch; TRACE(); if (hs->pos >= hs->len) { return 0; } ch = hs->s[hs->pos]; if (h5_is_white(ch)) { hs->pos += 1; return h5_state_before_attribute_name(hs); } else if (ch == CHAR_SLASH) { hs->pos += 1; return h5_state_self_closing_start_tag(hs); } else if (ch == CHAR_GT) { hs->token_start = hs->s + hs->pos; hs->token_len = 1; hs->token_type = TAG_NAME_CLOSE; hs->pos += 1; hs->state = h5_state_data; return 1; } else { return h5_state_before_attribute_name(hs); } } /** * 12.2.4.43 */ static int h5_state_self_closing_start_tag(h5_state_t* hs) { char ch; TRACE(); if (hs->pos >= hs->len) { return 0; } ch = hs->s[hs->pos]; if (ch == CHAR_GT) { assert(hs->pos > 0); hs->token_start = hs->s + hs->pos -1; hs->token_len = 2; hs->token_type = TAG_NAME_SELFCLOSE; hs->state = h5_state_data; hs->pos += 1; return 1; } else { return h5_state_before_attribute_name(hs); } } /** * 12.2.4.44 */ static int h5_state_bogus_comment(h5_state_t* hs) { const char* idx; TRACE(); idx = (const char*) memchr(hs->s + hs->pos, CHAR_GT, hs->len - hs->pos); if (idx == NULL) { hs->token_start = hs->s + hs->pos; hs->token_len = hs->len - hs->pos; hs->pos = hs->len; hs->state = h5_state_eof; } else { hs->token_start = hs->s + hs->pos; hs->token_len = (size_t)(idx - hs->s) - hs->pos; hs->pos = (size_t)(idx - hs->s) + 1; hs->state = h5_state_data; } hs->token_type = TAG_COMMENT; return 1; } /** * 12.2.4.44 ALT */ static int h5_state_bogus_comment2(h5_state_t* hs) { const char* idx; size_t pos; TRACE(); pos = hs->pos; while (1) { idx = (const char*) memchr(hs->s + pos, CHAR_PERCENT, hs->len - pos); if (idx == NULL || (idx + 1 >= hs->s + hs->len)) { hs->token_start = hs->s + hs->pos; hs->token_len = hs->len - hs->pos; hs->pos = hs->len; hs->token_type = TAG_COMMENT; hs->state = h5_state_eof; return 1; } if (*(idx +1) != CHAR_GT) { pos = (size_t)(idx - hs->s) + 1; continue; } /* ends in %> */ hs->token_start = hs->s + hs->pos; hs->token_len = (size_t)(idx - hs->s) - hs->pos; hs->pos = (size_t)(idx - hs->s) + 2; hs->state = h5_state_data; hs->token_type = TAG_COMMENT; return 1; } } /** * 8.2.4.45 */ static int h5_state_markup_declaration_open(h5_state_t* hs) { size_t remaining; TRACE(); remaining = hs->len - hs->pos; if (remaining >= 7 && /* case insensitive */ (hs->s[hs->pos + 0] == 'D' || hs->s[hs->pos + 0] == 'd') && (hs->s[hs->pos + 1] == 'O' || hs->s[hs->pos + 1] == 'o') && (hs->s[hs->pos + 2] == 'C' || hs->s[hs->pos + 2] == 'c') && (hs->s[hs->pos + 3] == 'T' || hs->s[hs->pos + 3] == 't') && (hs->s[hs->pos + 4] == 'Y' || hs->s[hs->pos + 4] == 'y') && (hs->s[hs->pos + 5] == 'P' || hs->s[hs->pos + 5] == 'p') && (hs->s[hs->pos + 6] == 'E' || hs->s[hs->pos + 6] == 'e') ) { return h5_state_doctype(hs); } else if (remaining >= 7 && /* upper case required */ hs->s[hs->pos + 0] == '[' && hs->s[hs->pos + 1] == 'C' && hs->s[hs->pos + 2] == 'D' && hs->s[hs->pos + 3] == 'A' && hs->s[hs->pos + 4] == 'T' && hs->s[hs->pos + 5] == 'A' && hs->s[hs->pos + 6] == '[' ) { hs->pos += 7; return h5_state_cdata(hs); } else if (remaining >= 2 && hs->s[hs->pos + 0] == '-' && hs->s[hs->pos + 1] == '-') { hs->pos += 2; return h5_state_comment(hs); } return h5_state_bogus_comment(hs); } /** * 12.2.4.48 * 12.2.4.49 * 12.2.4.50 * 12.2.4.51 * state machine spec is confusing since it can only look * at one character at a time but simply it's comments end by: * 1) EOF * 2) ending in --> * 3) ending in -!> */ static int h5_state_comment(h5_state_t* hs) { char ch; const char* idx; size_t pos; size_t offset; const char* end = hs->s + hs->len; TRACE(); pos = hs->pos; while (1) { idx = (const char*) memchr(hs->s + pos, CHAR_DASH, hs->len - pos); /* did not find anything or has less than 3 chars left */ if (idx == NULL || idx > hs->s + hs->len - 3) { hs->state = h5_state_eof; hs->token_start = hs->s + hs->pos; hs->token_len = hs->len - hs->pos; hs->token_type = TAG_COMMENT; return 1; } offset = 1; /* skip all nulls */ while (idx + offset < end && *(idx + offset) == 0) { offset += 1; } if (idx + offset == end) { hs->state = h5_state_eof; hs->token_start = hs->s + hs->pos; hs->token_len = hs->len - hs->pos; hs->token_type = TAG_COMMENT; return 1; } ch = *(idx + offset); if (ch != CHAR_DASH && ch != CHAR_BANG) { pos = (size_t)(idx - hs->s) + 1; continue; } /* need to test */ #if 0 /* skip all nulls */ while (idx + offset < end && *(idx + offset) == 0) { offset += 1; } if (idx + offset == end) { hs->state = h5_state_eof; hs->token_start = hs->s + hs->pos; hs->token_len = hs->len - hs->pos; hs->token_type = TAG_COMMENT; return 1; } #endif offset += 1; if (idx + offset == end) { hs->state = h5_state_eof; hs->token_start = hs->s + hs->pos; hs->token_len = hs->len - hs->pos; hs->token_type = TAG_COMMENT; return 1; } ch = *(idx + offset); if (ch != CHAR_GT) { pos = (size_t)(idx - hs->s) + 1; continue; } offset += 1; /* ends in --> or -!> */ hs->token_start = hs->s + hs->pos; hs->token_len = (size_t)(idx - hs->s) - hs->pos; hs->pos = (size_t)(idx + offset - hs->s); hs->state = h5_state_data; hs->token_type = TAG_COMMENT; return 1; } } static int h5_state_cdata(h5_state_t* hs) { const char* idx; size_t pos; TRACE(); pos = hs->pos; while (1) { idx = (const char*) memchr(hs->s + pos, CHAR_RIGHTB, hs->len - pos); /* did not find anything or has less than 3 chars left */ if (idx == NULL || idx > hs->s + hs->len - 3) { hs->state = h5_state_eof; hs->token_start = hs->s + hs->pos; hs->token_len = hs->len - hs->pos; hs->token_type = DATA_TEXT; return 1; } else if ( *(idx+1) == CHAR_RIGHTB && *(idx+2) == CHAR_GT) { hs->state = h5_state_data; hs->token_start = hs->s + hs->pos; hs->token_len = (size_t)(idx - hs->s) - hs->pos; hs->pos = (size_t)(idx - hs->s) + 3; hs->token_type = DATA_TEXT; return 1; } else { pos = (size_t)(idx - hs->s) + 1; } } } /** * 8.2.4.52 * http://www.w3.org/html/wg/drafts/html/master/syntax.html#doctype-state */ static int h5_state_doctype(h5_state_t* hs) { const char* idx; TRACE(); hs->token_start = hs->s + hs->pos; hs->token_type = DOCTYPE; idx = (const char*) memchr(hs->s + hs->pos, CHAR_GT, hs->len - hs->pos); if (idx == NULL) { hs->state = h5_state_eof; hs->token_len = hs->len - hs->pos; } else { hs->state = h5_state_data; hs->token_len = (size_t)(idx - hs->s) - hs->pos; hs->pos = (size_t)(idx - hs->s) + 1; } return 1; } modsecurity-2.9.5/apache2/libinjection/libinjection_sqli.h0000664000175000017500000001575114147005233025056 0ustar mhsvierulamhsvierula/** * Copyright 2012-2016 Nick Galbreath * nickg@client9.com * BSD License -- see `COPYING.txt` for details * * https://libinjection.client9.com/ * */ #ifndef LIBINJECTION_SQLI_H #define LIBINJECTION_SQLI_H #ifdef __cplusplus extern "C" { #endif /* * Pull in size_t */ #include enum sqli_flags { FLAG_NONE = 0 , FLAG_QUOTE_NONE = 1 /* 1 << 0 */ , FLAG_QUOTE_SINGLE = 2 /* 1 << 1 */ , FLAG_QUOTE_DOUBLE = 4 /* 1 << 2 */ , FLAG_SQL_ANSI = 8 /* 1 << 3 */ , FLAG_SQL_MYSQL = 16 /* 1 << 4 */ }; enum lookup_type { LOOKUP_WORD = 1 , LOOKUP_TYPE = 2 , LOOKUP_OPERATOR = 3 , LOOKUP_FINGERPRINT = 4 }; struct libinjection_sqli_token { #ifdef SWIG %immutable; #endif /* * position and length of token * in original string */ size_t pos; size_t len; /* count: * in type 'v', used for number of opening '@' * but maybe used in other contexts */ int count; char type; char str_open; char str_close; char val[32]; }; typedef struct libinjection_sqli_token stoken_t; /** * Pointer to function, takes c-string input, * returns '\0' for no match, else a char */ struct libinjection_sqli_state; typedef char (*ptr_lookup_fn)(struct libinjection_sqli_state*, int lookuptype, const char* word, size_t len); struct libinjection_sqli_state { #ifdef SWIG %immutable; #endif /* * input, does not need to be null terminated. * it is also not modified. */ const char *s; /* * input length */ size_t slen; /* * How to lookup a word or fingerprint */ ptr_lookup_fn lookup; void* userdata; /* * */ int flags; /* * pos is the index in the string during tokenization */ size_t pos; #ifndef SWIG /* for SWIG.. don't use this.. use functional API instead */ /* MAX TOKENS + 1 since we use one extra token * to determine the type of the previous token */ struct libinjection_sqli_token tokenvec[8]; #endif /* * Pointer to token position in tokenvec, above */ struct libinjection_sqli_token *current; /* * fingerprint pattern c-string * +1 for ending null * Minimum of 8 bytes to add gcc's -fstack-protector to work */ char fingerprint[8]; /* * Line number of code that said decided if the input was SQLi or * not. Most of the time it's line that said "it's not a matching * fingerprint" but there is other logic that sometimes approves * an input. This is only useful for debugging. * */ int reason; /* Number of ddw (dash-dash-white) comments * These comments are in the form of * '--[whitespace]' or '--[EOF]' * * All databases treat this as a comment. */ int stats_comment_ddw; /* Number of ddx (dash-dash-[notwhite]) comments * * ANSI SQL treats these are comments, MySQL treats this as * two unary operators '-' '-' * * If you are parsing result returns FALSE and * stats_comment_dd > 0, you should reparse with * COMMENT_MYSQL * */ int stats_comment_ddx; /* * c-style comments found /x .. x/ */ int stats_comment_c; /* '#' operators or MySQL EOL comments found * */ int stats_comment_hash; /* * number of tokens folded away */ int stats_folds; /* * total tokens processed */ int stats_tokens; }; typedef struct libinjection_sqli_state sfilter; struct libinjection_sqli_token* libinjection_sqli_get_token( struct libinjection_sqli_state* sqlistate, int i); /* * Version info. * * This is moved into a function to allow SWIG and other auto-generated * binding to not be modified during minor release changes. We change * change the version number in the c source file, and not regenerated * the binding * * See python's normalized version * http://www.python.org/dev/peps/pep-0386/#normalizedversion */ const char* libinjection_version(void); /** * */ void libinjection_sqli_init(struct libinjection_sqli_state* sql_state, const char* s, size_t slen, int flags); /** * Main API: tests for SQLi in three possible contexts, no quotes, * single quote and double quote * * \param sql_state core data structure * * \return 1 (true) if SQLi, 0 (false) if benign */ int libinjection_is_sqli(struct libinjection_sqli_state* sql_state); /* FOR HACKERS ONLY * provides deep hooks into the decision making process */ void libinjection_sqli_callback(struct libinjection_sqli_state* sql_state, ptr_lookup_fn fn, void* userdata); /* * Resets state, but keeps initial string and callbacks */ void libinjection_sqli_reset(struct libinjection_sqli_state* sql_state, int flags); /** * */ /** * This detects SQLi in a single context, mostly useful for custom * logic and debugging. * * \param sql_state Main data structure * \param flags flags to adjust parsing * * \returns a pointer to sfilter.fingerprint as convenience * do not free! * */ const char* libinjection_sqli_fingerprint(struct libinjection_sqli_state* sql_state, int flags); /** * The default "word" to token-type or fingerprint function. This * uses a ASCII case-insensitive binary tree. */ char libinjection_sqli_lookup_word(struct libinjection_sqli_state* sql_state, int lookup_type, const char* s, size_t slen); /* Streaming tokenization interface. * * sql_state->current is updated with the current token. * * \returns 1, has a token, keep going, or 0 no tokens * */ int libinjection_sqli_tokenize(struct libinjection_sqli_state * sql_state); /** * parses and folds input, up to 5 tokens * */ int libinjection_sqli_fold(struct libinjection_sqli_state * sql_state); /** The built-in default function to match fingerprints * and do false negative/positive analysis. This calls the following * two functions. With this, you over-ride one part or the other. * * return libinjection_sqli_blacklist(sql_state) && * libinjection_sqli_not_whitelist(sql_state); * * \param sql_state should be filled out after libinjection_sqli_fingerprint is called */ int libinjection_sqli_check_fingerprint(struct libinjection_sqli_state * sql_state); /* Given a pattern determine if it's a SQLi pattern. * * \return TRUE if sqli, false otherwise */ int libinjection_sqli_blacklist(struct libinjection_sqli_state* sql_state); /* Given a positive match for a pattern (i.e. pattern is SQLi), this function * does additional analysis to reduce false positives. * * \return TRUE if SQLi, false otherwise */ int libinjection_sqli_not_whitelist(struct libinjection_sqli_state * sql_state); #ifdef __cplusplus } #endif #endif /* LIBINJECTION_SQLI_H */ modsecurity-2.9.5/apache2/libinjection/libinjection_sqli.c0000664000175000017500000021470614147005233025052 0ustar mhsvierulamhsvierula/** * Copyright 2012,2016 Nick Galbreath * nickg@client9.com * BSD License -- see COPYING.txt for details * * https://libinjection.client9.com/ * */ #include #include #include #include #include #include #include "libinjection.h" #include "libinjection_sqli.h" #include "libinjection_sqli_data.h" #define LIBINJECTION_VERSION "3.9.2" #define LIBINJECTION_SQLI_TOKEN_SIZE sizeof(((stoken_t*)(0))->val) #define LIBINJECTION_SQLI_MAX_TOKENS 5 #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #define CHAR_NULL '\0' #define CHAR_SINGLE '\'' #define CHAR_DOUBLE '"' #define CHAR_TICK '`' /* faster than calling out to libc isdigit */ #define ISDIGIT(a) ((unsigned)((a) - '0') <= 9) #if 0 #define FOLD_DEBUG printf("%d \t more=%d pos=%d left=%d\n", __LINE__, more, (int)pos, (int)left); #else #define FOLD_DEBUG #endif /* * not making public just yet */ typedef enum { TYPE_NONE = 0 , TYPE_KEYWORD = (int)'k' , TYPE_UNION = (int)'U' , TYPE_GROUP = (int)'B' , TYPE_EXPRESSION = (int)'E' , TYPE_SQLTYPE = (int)'t' , TYPE_FUNCTION = (int)'f' , TYPE_BAREWORD = (int)'n' , TYPE_NUMBER = (int)'1' , TYPE_VARIABLE = (int)'v' , TYPE_STRING = (int)'s' , TYPE_OPERATOR = (int)'o' , TYPE_LOGIC_OPERATOR = (int)'&' , TYPE_COMMENT = (int)'c' , TYPE_COLLATE = (int)'A' , TYPE_LEFTPARENS = (int)'(' , TYPE_RIGHTPARENS = (int)')' /* not used? */ , TYPE_LEFTBRACE = (int)'{' , TYPE_RIGHTBRACE = (int)'}' , TYPE_DOT = (int)'.' , TYPE_COMMA = (int)',' , TYPE_COLON = (int)':' , TYPE_SEMICOLON = (int)';' , TYPE_TSQL = (int)'T' /* TSQL start */ , TYPE_UNKNOWN = (int)'?' , TYPE_EVIL = (int)'X' /* unparsable, abort */ , TYPE_FINGERPRINT = (int)'F' /* not really a token */ , TYPE_BACKSLASH = (int)'\\' } sqli_token_types; /** * Initializes parsing state * */ static char flag2delim(int flag) { if (flag & FLAG_QUOTE_SINGLE) { return CHAR_SINGLE; } else if (flag & FLAG_QUOTE_DOUBLE) { return CHAR_DOUBLE; } else { return CHAR_NULL; } } /* memchr2 finds a string of 2 characters inside another string * This a specialized version of "memmem" or "memchr". * 'memmem' doesn't exist on all platforms * * Porting notes: this is just a special version of * astring.find("AB") * */ static const char * memchr2(const char *haystack, size_t haystack_len, char c0, char c1) { const char *cur = haystack; const char *last = haystack + haystack_len - 1; if (haystack_len < 2) { return NULL; } while (cur < last) { /* safe since cur < len - 1 always */ if (cur[0] == c0 && cur[1] == c1) { return cur; } cur += 1; } return NULL; } /** * memmem might not exist on some systems */ static const char * my_memmem(const char* haystack, size_t hlen, const char* needle, size_t nlen) { const char* cur; const char* last; assert(haystack); assert(needle); assert(nlen > 1); last = haystack + hlen - nlen; for (cur = haystack; cur <= last; ++cur) { if (cur[0] == needle[0] && memcmp(cur, needle, nlen) == 0) { return cur; } } return NULL; } /** Find largest string containing certain characters. * * C Standard library 'strspn' only works for 'c-strings' (null terminated) * This works on arbitrary length. * * Performance notes: * not critical * * Porting notes: * if accept is 'ABC', then this function would be similar to * a_regexp.match(a_str, '[ABC]*'), */ static size_t strlenspn(const char *s, size_t len, const char *accept) { size_t i; for (i = 0; i < len; ++i) { /* likely we can do better by inlining this function * but this works for now */ if (strchr(accept, s[i]) == NULL) { return i; } } return len; } static size_t strlencspn(const char *s, size_t len, const char *accept) { size_t i; for (i = 0; i < len; ++i) { /* likely we can do better by inlining this function * but this works for now */ if (strchr(accept, s[i]) != NULL) { return i; } } return len; } static int char_is_white(char ch) { /* ' ' space is 0x32 '\t 0x09 \011 horizontal tab '\n' 0x0a \012 new line '\v' 0x0b \013 vertical tab '\f' 0x0c \014 new page '\r' 0x0d \015 carriage return 0x00 \000 null (oracle) 0xa0 \240 is Latin-1 */ return strchr(" \t\n\v\f\r\240\000", ch) != NULL; } /* DANGER DANGER * This is -very specialized function- * * this compares a ALL_UPPER CASE C STRING * with a *arbitrary memory* + length * * Sane people would just make a copy, up-case * and use a hash table. * * Required since libc version uses the current locale * and is much slower. */ static int cstrcasecmp(const char *a, const char *b, size_t n) { char cb; for (; n > 0; a++, b++, n--) { cb = *b; if (cb >= 'a' && cb <= 'z') { cb -= 0x20; } if (*a != cb) { return *a - cb; } else if (*a == '\0') { return -1; } } return (*a == 0) ? 0 : 1; } /** * Case sensitive string compare. * Here only to make code more readable */ static int streq(const char *a, const char *b) { return strcmp(a, b) == 0; } /** * * * * Porting Notes: * given a mapping/hash of string to char * this is just * typecode = mapping[key.upper()] */ static char bsearch_keyword_type(const char *key, size_t len, const keyword_t * keywords, size_t numb) { size_t pos; size_t left = 0; size_t right = numb - 1; while (left < right) { pos = (left + right) >> 1; /* arg0 = upper case only, arg1 = mixed case */ if (cstrcasecmp(keywords[pos].word, key, len) < 0) { left = pos + 1; } else { right = pos; } } if ((left == right) && cstrcasecmp(keywords[left].word, key, len) == 0) { return keywords[left].type; } else { return CHAR_NULL; } } static char is_keyword(const char* key, size_t len) { return bsearch_keyword_type(key, len, sql_keywords, sql_keywords_sz); } /* st_token methods * * The following functions manipulates the stoken_t type * * */ static void st_clear(stoken_t * st) { memset(st, 0, sizeof(stoken_t)); } static void st_assign_char(stoken_t * st, const char stype, size_t pos, size_t len, const char value) { /* done to eliminate unused warning */ (void)len; st->type = (char) stype; st->pos = pos; st->len = 1; st->val[0] = value; st->val[1] = CHAR_NULL; } static void st_assign(stoken_t * st, const char stype, size_t pos, size_t len, const char* value) { const size_t MSIZE = LIBINJECTION_SQLI_TOKEN_SIZE; size_t last = len < MSIZE ? len : (MSIZE - 1); st->type = (char) stype; st->pos = pos; st->len = last; memcpy(st->val, value, last); st->val[last] = CHAR_NULL; } static void st_copy(stoken_t * dest, const stoken_t * src) { memcpy(dest, src, sizeof(stoken_t)); } static int st_is_arithmetic_op(const stoken_t* st) { const char ch = st->val[0]; return (st->type == TYPE_OPERATOR && st->len == 1 && (ch == '*' || ch == '/' || ch == '-' || ch == '+' || ch == '%')); } static int st_is_unary_op(const stoken_t * st) { const char* str = st->val; const size_t len = st->len; if (st->type != TYPE_OPERATOR) { return FALSE; } switch (len) { case 1: return *str == '+' || *str == '-' || *str == '!' || *str == '~'; case 2: return str[0] == '!' && str[1] == '!'; case 3: return cstrcasecmp("NOT", str, 3) == 0; default: return FALSE; } } /* Parsers * * */ static size_t parse_white(struct libinjection_sqli_state * sf) { return sf->pos + 1; } static size_t parse_operator1(struct libinjection_sqli_state * sf) { const char *cs = sf->s; size_t pos = sf->pos; st_assign_char(sf->current, TYPE_OPERATOR, pos, 1, cs[pos]); return pos + 1; } static size_t parse_other(struct libinjection_sqli_state * sf) { const char *cs = sf->s; size_t pos = sf->pos; st_assign_char(sf->current, TYPE_UNKNOWN, pos, 1, cs[pos]); return pos + 1; } static size_t parse_char(struct libinjection_sqli_state * sf) { const char *cs = sf->s; size_t pos = sf->pos; st_assign_char(sf->current, cs[pos], pos, 1, cs[pos]); return pos + 1; } static size_t parse_eol_comment(struct libinjection_sqli_state * sf) { const char *cs = sf->s; const size_t slen = sf->slen; size_t pos = sf->pos; const char *endpos = (const char *) memchr((const void *) (cs + pos), '\n', slen - pos); if (endpos == NULL) { st_assign(sf->current, TYPE_COMMENT, pos, slen - pos, cs + pos); return slen; } else { st_assign(sf->current, TYPE_COMMENT, pos, (size_t)(endpos - cs) - pos, cs + pos); return (size_t)((endpos - cs) + 1); } } /** In ANSI mode, hash is an operator * In MYSQL mode, it's a EOL comment like '--' */ static size_t parse_hash(struct libinjection_sqli_state * sf) { sf->stats_comment_hash += 1; if (sf->flags & FLAG_SQL_MYSQL) { sf->stats_comment_hash += 1; return parse_eol_comment(sf); } else { st_assign_char(sf->current, TYPE_OPERATOR, sf->pos, 1, '#'); return sf->pos + 1; } } static size_t parse_dash(struct libinjection_sqli_state * sf) { const char *cs = sf->s; const size_t slen = sf->slen; size_t pos = sf->pos; /* * five cases * 1) --[white] this is always a SQL comment * 2) --[EOF] this is a comment * 3) --[notwhite] in MySQL this is NOT a comment but two unary operators * 4) --[notwhite] everyone else thinks this is a comment * 5) -[not dash] '-' is a unary operator */ if (pos + 2 < slen && cs[pos + 1] == '-' && char_is_white(cs[pos+2]) ) { return parse_eol_comment(sf); } else if (pos +2 == slen && cs[pos + 1] == '-') { return parse_eol_comment(sf); } else if (pos + 1 < slen && cs[pos + 1] == '-' && (sf->flags & FLAG_SQL_ANSI)) { /* --[not-white] not-white case: * */ sf->stats_comment_ddx += 1; return parse_eol_comment(sf); } else { st_assign_char(sf->current, TYPE_OPERATOR, pos, 1, '-'); return pos + 1; } } /** This detects MySQL comments, comments that * start with /x! We just ban these now but * previously we attempted to parse the inside * * For reference: * the form of /x![anything]x/ or /x!12345[anything] x/ * * Mysql 3 (maybe 4), allowed this: * /x!0selectx/ 1; * where 0 could be any number. * * The last version of MySQL 3 was in 2003. * It is unclear if the MySQL 3 syntax was allowed * in MySQL 4. The last version of MySQL 4 was in 2008 * */ static size_t is_mysql_comment(const char *cs, const size_t len, size_t pos) { /* so far... * cs[pos] == '/' && cs[pos+1] == '*' */ if (pos + 2 >= len) { /* not a mysql comment */ return 0; } if (cs[pos + 2] != '!') { /* not a mysql comment */ return 0; } /* * this is a mysql comment * got "/x!" */ return 1; } static size_t parse_slash(struct libinjection_sqli_state * sf) { const char* ptr; size_t clen; const char *cs = sf->s; const size_t slen = sf->slen; size_t pos = sf->pos; const char* cur = cs + pos; char ctype = TYPE_COMMENT; size_t pos1 = pos + 1; if (pos1 == slen || cs[pos1] != '*') { return parse_operator1(sf); } /* * skip over initial '/x' */ ptr = memchr2(cur + 2, slen - (pos + 2), '*', '/'); /* * (ptr == NULL) causes false positive in cppcheck 1.61 * casting to type seems to fix it */ if (ptr == (const char*) NULL) { /* till end of line */ clen = slen - pos; } else { clen = (size_t)(ptr + 2 - cur); } /* * postgresql allows nested comments which makes * this is incompatible with parsing so * if we find a '/x' inside the coment, then * make a new token. * * Also, Mysql's "conditional" comments for version * are an automatic black ban! */ if (memchr2(cur + 2, (size_t)(ptr - (cur + 1)), '/', '*') != NULL) { ctype = TYPE_EVIL; } else if (is_mysql_comment(cs, slen, pos)) { ctype = TYPE_EVIL; } st_assign(sf->current, ctype, pos, clen, cs + pos); return pos + clen; } static size_t parse_backslash(struct libinjection_sqli_state * sf) { const char *cs = sf->s; const size_t slen = sf->slen; size_t pos = sf->pos; /* * Weird MySQL alias for NULL, "\N" (capital N only) */ if (pos + 1 < slen && cs[pos +1] == 'N') { st_assign(sf->current, TYPE_NUMBER, pos, 2, cs + pos); return pos + 2; } else { st_assign_char(sf->current, TYPE_BACKSLASH, pos, 1, cs[pos]); return pos + 1; } } static size_t parse_operator2(struct libinjection_sqli_state * sf) { char ch; const char *cs = sf->s; const size_t slen = sf->slen; size_t pos = sf->pos; if (pos + 1 >= slen) { return parse_operator1(sf); } if (pos + 2 < slen && cs[pos] == '<' && cs[pos + 1] == '=' && cs[pos + 2] == '>') { /* * special 3-char operator */ st_assign(sf->current, TYPE_OPERATOR, pos, 3, cs + pos); return pos + 3; } ch = sf->lookup(sf, LOOKUP_OPERATOR, cs + pos, 2); if (ch != CHAR_NULL) { st_assign(sf->current, ch, pos, 2, cs+pos); return pos + 2; } /* * not an operator.. what to do with the two * characters we got? */ if (cs[pos] == ':') { /* ':' is not an operator */ st_assign(sf->current, TYPE_COLON, pos, 1, cs+pos); return pos + 1; } else { /* * must be a single char operator */ return parse_operator1(sf); } } /* * Ok! " \" " one backslash = escaped! * " \\" " two backslash = not escaped! * "\\\" " three backslash = escaped! */ static int is_backslash_escaped(const char* end, const char* start) { const char* ptr; for (ptr = end; ptr >= start; ptr--) { if (*ptr != '\\') { break; } } /* if number of backslashes is odd, it is escaped */ return (end - ptr) & 1; } static size_t is_double_delim_escaped(const char* cur, const char* end) { return ((cur + 1) < end) && *(cur+1) == *cur; } /* Look forward for doubling of delimiter * * case 'foo''bar' --> foo''bar * * ending quote isn't duplicated (i.e. escaped) * since it's the wrong char or EOL * */ static size_t parse_string_core(const char *cs, const size_t len, size_t pos, stoken_t * st, char delim, size_t offset) { /* * offset is to skip the perhaps first quote char */ const char *qpos = (const char *) memchr((const void *) (cs + pos + offset), delim, len - pos - offset); /* * then keep string open/close info */ if (offset > 0) { /* * this is real quote */ st->str_open = delim; } else { /* * this was a simulated quote */ st->str_open = CHAR_NULL; } while (TRUE) { if (qpos == NULL) { /* * string ended with no trailing quote * assign what we have */ st_assign(st, TYPE_STRING, pos + offset, len - pos - offset, cs + pos + offset); st->str_close = CHAR_NULL; return len; } else if ( is_backslash_escaped(qpos - 1, cs + pos + offset)) { /* keep going, move ahead one character */ qpos = (const char *) memchr((const void *) (qpos + 1), delim, (size_t)((cs + len) - (qpos + 1))); continue; } else if (is_double_delim_escaped(qpos, cs + len)) { /* keep going, move ahead two characters */ qpos = (const char *) memchr((const void *) (qpos + 2), delim, (size_t)((cs + len) - (qpos + 2))); continue; } else { /* hey it's a normal string */ st_assign(st, TYPE_STRING, pos + offset, (size_t)(qpos - (cs + pos + offset)), cs + pos + offset); st->str_close = delim; return (size_t)(qpos - cs + 1); } } } /** * Used when first char is a ' or " */ static size_t parse_string(struct libinjection_sqli_state * sf) { const char *cs = sf->s; const size_t slen = sf->slen; size_t pos = sf->pos; /* * assert cs[pos] == single or double quote */ return parse_string_core(cs, slen, pos, sf->current, cs[pos], 1); } /** * Used when first char is: * N or n: mysql "National Character set" * E : psql "Escaped String" */ static size_t parse_estring(struct libinjection_sqli_state * sf) { const char *cs = sf->s; const size_t slen = sf->slen; size_t pos = sf->pos; if (pos + 2 >= slen || cs[pos+1] != CHAR_SINGLE) { return parse_word(sf); } return parse_string_core(cs, slen, pos, sf->current, CHAR_SINGLE, 2); } static size_t parse_ustring(struct libinjection_sqli_state * sf) { const char *cs = sf->s; size_t slen = sf->slen; size_t pos = sf->pos; if (pos + 2 < slen && cs[pos+1] == '&' && cs[pos+2] == '\'') { sf->pos += 2; pos = parse_string(sf); sf->current->str_open = 'u'; if (sf->current->str_close == '\'') { sf->current->str_close = 'u'; } return pos; } else { return parse_word(sf); } } static size_t parse_qstring_core(struct libinjection_sqli_state * sf, size_t offset) { char ch; const char *strend; const char *cs = sf->s; size_t slen = sf->slen; size_t pos = sf->pos + offset; /* if we are already at end of string.. if current char is not q or Q if we don't have 2 more chars if char2 != a single quote then, just treat as word */ if (pos >= slen || (cs[pos] != 'q' && cs[pos] != 'Q') || pos + 2 >= slen || cs[pos + 1] != '\'') { return parse_word(sf); } ch = cs[pos + 2]; /* the ch > 127 is un-needed since * we assume char is signed */ if (ch < 33 /* || ch > 127 */) { return parse_word(sf); } switch (ch) { case '(' : ch = ')'; break; case '[' : ch = ']'; break; case '{' : ch = '}'; break; case '<' : ch = '>'; break; } strend = memchr2(cs + pos + 3, slen - pos - 3, ch, '\''); if (strend == NULL) { st_assign(sf->current, TYPE_STRING, pos + 3, slen - pos - 3, cs + pos + 3); sf->current->str_open = 'q'; sf->current->str_close = CHAR_NULL; return slen; } else { st_assign(sf->current, TYPE_STRING, pos + 3, (size_t)(strend - cs) - pos - 3, cs + pos + 3); sf->current->str_open = 'q'; sf->current->str_close = 'q'; return (size_t)(strend - cs + 2); } } /* * Oracle's q string */ static size_t parse_qstring(struct libinjection_sqli_state * sf) { return parse_qstring_core(sf, 0); } /* * mysql's N'STRING' or * ... Oracle's nq string */ static size_t parse_nqstring(struct libinjection_sqli_state * sf) { size_t slen = sf->slen; size_t pos = sf->pos; if (pos + 2 < slen && sf->s[pos+1] == CHAR_SINGLE) { return parse_estring(sf); } return parse_qstring_core(sf, 1); } /* * binary literal string * re: [bB]'[01]*' */ static size_t parse_bstring(struct libinjection_sqli_state *sf) { size_t wlen; const char *cs = sf->s; size_t pos = sf->pos; size_t slen = sf->slen; /* need at least 2 more characters * if next char isn't a single quote, then * continue as normal word */ if (pos + 2 >= slen || cs[pos+1] != '\'') { return parse_word(sf); } wlen = strlenspn(cs + pos + 2, sf->slen - pos - 2, "01"); if (pos + 2 + wlen >= slen || cs[pos + 2 + wlen] != '\'') { return parse_word(sf); } st_assign(sf->current, TYPE_NUMBER, pos, wlen + 3, cs + pos); return pos + 2 + wlen + 1; } /* * hex literal string * re: [xX]'[0123456789abcdefABCDEF]*' * mysql has requirement of having EVEN number of chars, * but pgsql does not */ static size_t parse_xstring(struct libinjection_sqli_state *sf) { size_t wlen; const char *cs = sf->s; size_t pos = sf->pos; size_t slen = sf->slen; /* need at least 2 more characters * if next char isn't a single quote, then * continue as normal word */ if (pos + 2 >= slen || cs[pos+1] != '\'') { return parse_word(sf); } wlen = strlenspn(cs + pos + 2, sf->slen - pos - 2, "0123456789ABCDEFabcdef"); if (pos + 2 + wlen >= slen || cs[pos + 2 + wlen] != '\'') { return parse_word(sf); } st_assign(sf->current, TYPE_NUMBER, pos, wlen + 3, cs + pos); return pos + 2 + wlen + 1; } /** * This handles MS SQLSERVER bracket words * http://stackoverflow.com/questions/3551284/sql-serverwhat-do-brackets-mean-around-column-name * */ static size_t parse_bword(struct libinjection_sqli_state * sf) { const char *cs = sf->s; size_t pos = sf->pos; const char* endptr = (const char*) memchr(cs + pos, ']', sf->slen - pos); if (endptr == NULL) { st_assign(sf->current, TYPE_BAREWORD, pos, sf->slen - pos, cs + pos); return sf->slen; } else { st_assign(sf->current, TYPE_BAREWORD, pos, (size_t)(endptr - cs) - pos + 1, cs + pos); return (size_t)((endptr - cs) + 1); } } static size_t parse_word(struct libinjection_sqli_state * sf) { char ch; char delim; size_t i; const char *cs = sf->s; size_t pos = sf->pos; size_t wlen = strlencspn(cs + pos, sf->slen - pos, " []{}<>:\\?=@!#~+-*/&|^%(),';\t\n\v\f\r\"\240\000"); st_assign(sf->current, TYPE_BAREWORD, pos, wlen, cs + pos); /* now we need to look inside what we good for "." and "`" * and see if what is before is a keyword or not */ for (i =0; i < sf->current->len; ++i) { delim = sf->current->val[i]; if (delim == '.' || delim == '`') { ch = sf->lookup(sf, LOOKUP_WORD, sf->current->val, i); if (ch != TYPE_NONE && ch != TYPE_BAREWORD) { /* needed for swig */ st_clear(sf->current); /* * we got something like "SELECT.1" * or SELECT`column` */ st_assign(sf->current, ch, pos, i, cs + pos); return pos + i; } } } /* * do normal lookup with word including '.' */ if (wlen < LIBINJECTION_SQLI_TOKEN_SIZE) { ch = sf->lookup(sf, LOOKUP_WORD, sf->current->val, wlen); if (ch == CHAR_NULL) { ch = TYPE_BAREWORD; } sf->current->type = ch; } return pos + wlen; } /* MySQL backticks are a cross between string and * and a bare word. * */ static size_t parse_tick(struct libinjection_sqli_state* sf) { size_t pos = parse_string_core(sf->s, sf->slen, sf->pos, sf->current, CHAR_TICK, 1); /* we could check to see if start and end of * of string are both "`", i.e. make sure we have * matching set. `foo` vs. `foo * but I don't think it matters much */ /* check value of string to see if it's a keyword, * function, operator, etc */ char ch = sf->lookup(sf, LOOKUP_WORD, sf->current->val, sf->current->len); if (ch == TYPE_FUNCTION) { /* if it's a function, then convert token */ sf->current->type = TYPE_FUNCTION; } else { /* otherwise it's a 'n' type -- mysql treats * everything as a bare word */ sf->current->type = TYPE_BAREWORD; } return pos; } static size_t parse_var(struct libinjection_sqli_state * sf) { size_t xlen; const char *cs = sf->s; const size_t slen = sf->slen; size_t pos = sf->pos + 1; /* * var_count is only used to reconstruct * the input. It counts the number of '@' * seen 0 in the case of NULL, 1 or 2 */ /* * move past optional other '@' */ if (pos < slen && cs[pos] == '@') { pos += 1; sf->current->count = 2; } else { sf->current->count = 1; } /* * MySQL allows @@`version` */ if (pos < slen) { if (cs[pos] == '`') { sf->pos = pos; pos = parse_tick(sf); sf->current->type = TYPE_VARIABLE; return pos; } else if (cs[pos] == CHAR_SINGLE || cs[pos] == CHAR_DOUBLE) { sf->pos = pos; pos = parse_string(sf); sf->current->type = TYPE_VARIABLE; return pos; } } xlen = strlencspn(cs + pos, slen - pos, " <>:\\?=@!#~+-*/&|^%(),';\t\n\v\f\r'`\""); if (xlen == 0) { st_assign(sf->current, TYPE_VARIABLE, pos, 0, cs + pos); return pos; } else { st_assign(sf->current, TYPE_VARIABLE, pos, xlen, cs + pos); return pos + xlen; } } static size_t parse_money(struct libinjection_sqli_state *sf) { size_t xlen; const char* strend; const char *cs = sf->s; const size_t slen = sf->slen; size_t pos = sf->pos; if (pos + 1 == slen) { /* end of line */ st_assign_char(sf->current, TYPE_BAREWORD, pos, 1, '$'); return slen; } /* * $1,000.00 or $1.000,00 ok! * This also parses $....,,,111 but that's ok */ xlen = strlenspn(cs + pos + 1, slen - pos - 1, "0123456789.,"); if (xlen == 0) { if (cs[pos + 1] == '$') { /* we have $$ .. find ending $$ and make string */ strend = memchr2(cs + pos + 2, slen - pos -2, '$', '$'); if (strend == NULL) { /* fell off edge */ st_assign(sf->current, TYPE_STRING, pos + 2, slen - (pos + 2), cs + pos + 2); sf->current->str_open = '$'; sf->current->str_close = CHAR_NULL; return slen; } else { st_assign(sf->current, TYPE_STRING, pos + 2, (size_t)(strend - (cs + pos + 2)), cs + pos + 2); sf->current->str_open = '$'; sf->current->str_close = '$'; return (size_t)(strend - cs + 2); } } else { /* ok it's not a number or '$$', but maybe it's pgsql "$ quoted strings" */ xlen = strlenspn(cs + pos + 1, slen - pos - 1, "abcdefghjiklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); if (xlen == 0) { /* hmm it's "$" _something_ .. just add $ and keep going*/ st_assign_char(sf->current, TYPE_BAREWORD, pos, 1, '$'); return pos + 1; } /* we have $foobar????? */ /* is it $foobar$ */ if (pos + xlen + 1 == slen || cs[pos+xlen+1] != '$') { /* not $foobar$, or fell off edge */ st_assign_char(sf->current, TYPE_BAREWORD, pos, 1, '$'); return pos + 1; } /* we have $foobar$ ... find it again */ strend = my_memmem(cs+xlen+2, slen - (pos+xlen+2), cs + pos, xlen+2); if (strend == NULL || ((size_t)(strend - cs) < (pos+xlen+2))) { /* fell off edge */ st_assign(sf->current, TYPE_STRING, pos+xlen+2, slen - pos - xlen - 2, cs+pos+xlen+2); sf->current->str_open = '$'; sf->current->str_close = CHAR_NULL; return slen; } else { /* got one */ st_assign(sf->current, TYPE_STRING, pos+xlen+2, (size_t)(strend - (cs + pos + xlen + 2)), cs+pos+xlen+2); sf->current->str_open = '$'; sf->current->str_close = '$'; return (size_t)((strend + xlen + 2) - cs); } } } else if (xlen == 1 && cs[pos + 1] == '.') { /* $. should parsed as a word */ return parse_word(sf); } else { st_assign(sf->current, TYPE_NUMBER, pos, 1 + xlen, cs + pos); return pos + 1 + xlen; } } static size_t parse_number(struct libinjection_sqli_state * sf) { size_t xlen; size_t start; const char* digits = NULL; const char *cs = sf->s; const size_t slen = sf->slen; size_t pos = sf->pos; int have_e = 0; int have_exp = 0; /* cs[pos] == '0' has 1/10 chance of being true, * while pos+1< slen is almost always true */ if (cs[pos] == '0' && pos + 1 < slen) { if (cs[pos + 1] == 'X' || cs[pos + 1] == 'x') { digits = "0123456789ABCDEFabcdef"; } else if (cs[pos + 1] == 'B' || cs[pos + 1] == 'b') { digits = "01"; } if (digits) { xlen = strlenspn(cs + pos + 2, slen - pos - 2, digits); if (xlen == 0) { st_assign(sf->current, TYPE_BAREWORD, pos, 2, cs + pos); return pos + 2; } else { st_assign(sf->current, TYPE_NUMBER, pos, 2 + xlen, cs + pos); return pos + 2 + xlen; } } } start = pos; while (pos < slen && ISDIGIT(cs[pos])) { pos += 1; } if (pos < slen && cs[pos] == '.') { pos += 1; while (pos < slen && ISDIGIT(cs[pos])) { pos += 1; } if (pos - start == 1) { /* only one character read so far */ st_assign_char(sf->current, TYPE_DOT, start, 1, '.'); return pos; } } if (pos < slen) { if (cs[pos] == 'E' || cs[pos] == 'e') { have_e = 1; pos += 1; if (pos < slen && (cs[pos] == '+' || cs[pos] == '-')) { pos += 1; } while (pos < slen && ISDIGIT(cs[pos])) { have_exp = 1; pos += 1; } } } /* oracle's ending float or double suffix * http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements003.htm#i139891 */ if (pos < slen && (cs[pos] == 'd' || cs[pos] == 'D' || cs[pos] == 'f' || cs[pos] == 'F')) { if (pos + 1 == slen) { /* line ends evaluate "... 1.2f$" as '1.2f' */ pos += 1; } else if ((char_is_white(cs[pos+1]) || cs[pos+1] == ';')) { /* * easy case, evaluate "... 1.2f ... as '1.2f' */ pos += 1; } else if (cs[pos+1] == 'u' || cs[pos+1] == 'U') { /* * a bit of a hack but makes '1fUNION' parse as '1f UNION' */ pos += 1; } else { /* it's like "123FROM" */ /* parse as "123" only */ } } if (have_e == 1 && have_exp == 0) { /* very special form of * "1234.e" * "10.10E" * ".E" * this is a WORD not a number!! */ st_assign(sf->current, TYPE_BAREWORD, start, pos - start, cs + start); } else { st_assign(sf->current, TYPE_NUMBER, start, pos - start, cs + start); } return pos; } /* * API to return version. This allows us to increment the version * without having to regenerated the SWIG (or other binding) in minor * releases. */ const char* libinjection_version() { return LIBINJECTION_VERSION; } int libinjection_sqli_tokenize(struct libinjection_sqli_state * sf) { pt2Function fnptr; size_t *pos = &sf->pos; stoken_t *current = sf->current; const char *s = sf->s; const size_t slen = sf->slen; if (slen == 0) { return FALSE; } st_clear(current); sf->current = current; /* * if we are at beginning of string * and in single-quote or double quote mode * then pretend the input starts with a quote */ if (*pos == 0 && (sf->flags & (FLAG_QUOTE_SINGLE | FLAG_QUOTE_DOUBLE))) { *pos = parse_string_core(s, slen, 0, current, flag2delim(sf->flags), 0); sf->stats_tokens += 1; return TRUE; } while (*pos < slen) { /* * get current character */ const unsigned char ch = (unsigned char) (s[*pos]); /* * look up the parser, and call it * * Porting Note: this is mapping of char to function * charparsers[ch]() */ fnptr = char_parse_map[ch]; *pos = (*fnptr) (sf); /* * */ if (current->type != CHAR_NULL) { sf->stats_tokens += 1; return TRUE; } } return FALSE; } void libinjection_sqli_init(struct libinjection_sqli_state * sf, const char *s, size_t len, int flags) { if (flags == 0) { flags = FLAG_QUOTE_NONE | FLAG_SQL_ANSI; } memset(sf, 0, sizeof(struct libinjection_sqli_state)); sf->s = s; sf->slen = len; sf->lookup = libinjection_sqli_lookup_word; sf->userdata = 0; sf->flags = flags; sf->current = &(sf->tokenvec[0]); } void libinjection_sqli_reset(struct libinjection_sqli_state * sf, int flags) { void *userdata = sf->userdata; ptr_lookup_fn lookup = sf->lookup;; if (flags == 0) { flags = FLAG_QUOTE_NONE | FLAG_SQL_ANSI; } libinjection_sqli_init(sf, sf->s, sf->slen, flags); sf->lookup = lookup; sf->userdata = userdata; } void libinjection_sqli_callback(struct libinjection_sqli_state * sf, ptr_lookup_fn fn, void* userdata) { if (fn == NULL) { sf->lookup = libinjection_sqli_lookup_word; sf->userdata = (void*)(NULL); } else { sf->lookup = fn; sf->userdata = userdata; } } /** See if two tokens can be merged since they are compound SQL phrases. * * This takes two tokens, and, if they are the right type, * merges their values together. Then checks to see if the * new value is special using the PHRASES mapping. * * Example: "UNION" + "ALL" ==> "UNION ALL" * * C Security Notes: this is safe to use C-strings (null-terminated) * since the types involved by definition do not have embedded nulls * (e.g. there is no keyword with embedded null) * * Porting Notes: since this is C, it's oddly complicated. * This is just: multikeywords[token.value + ' ' + token2.value] * */ static int syntax_merge_words(struct libinjection_sqli_state * sf,stoken_t * a, stoken_t * b) { size_t sz1; size_t sz2; size_t sz3; char tmp[LIBINJECTION_SQLI_TOKEN_SIZE]; char ch; /* first token is of right type? */ if (! (a->type == TYPE_KEYWORD || a->type == TYPE_BAREWORD || a->type == TYPE_OPERATOR || a->type == TYPE_UNION || a->type == TYPE_FUNCTION || a->type == TYPE_EXPRESSION || a->type == TYPE_TSQL || a->type == TYPE_SQLTYPE)) { return FALSE; } if (! (b->type == TYPE_KEYWORD || b->type == TYPE_BAREWORD || b->type == TYPE_OPERATOR || b->type == TYPE_UNION || b->type == TYPE_FUNCTION || b->type == TYPE_EXPRESSION || b->type == TYPE_TSQL || b->type == TYPE_SQLTYPE || b->type == TYPE_LOGIC_OPERATOR)) { return FALSE; } sz1 = a->len; sz2 = b->len; sz3 = sz1 + sz2 + 1; /* +1 for space in the middle */ if (sz3 >= LIBINJECTION_SQLI_TOKEN_SIZE) { /* make sure there is room for ending null */ return FALSE; } /* * oddly annoying last.val + ' ' + current.val */ memcpy(tmp, a->val, sz1); tmp[sz1] = ' '; memcpy(tmp + sz1 + 1, b->val, sz2); tmp[sz3] = CHAR_NULL; ch = sf->lookup(sf, LOOKUP_WORD, tmp, sz3); if (ch != CHAR_NULL) { st_assign(a, ch, a->pos, sz3, tmp); return TRUE; } else { return FALSE; } } int libinjection_sqli_fold(struct libinjection_sqli_state * sf) { stoken_t last_comment; /* POS is the position of where the NEXT token goes */ size_t pos = 0; /* LEFT is a count of how many tokens that are already folded or processed (i.e. part of the fingerprint) */ size_t left = 0; int more = 1; st_clear(&last_comment); /* Skip all initial comments, right-parens ( and unary operators * */ sf->current = &(sf->tokenvec[0]); while (more) { more = libinjection_sqli_tokenize(sf); if ( ! (sf->current->type == TYPE_COMMENT || sf->current->type == TYPE_LEFTPARENS || sf->current->type == TYPE_SQLTYPE || st_is_unary_op(sf->current))) { break; } } if (! more) { /* If input was only comments, unary or (, then exit */ return 0; } else { /* it's some other token */ pos += 1; } while (1) { FOLD_DEBUG; /* do we have all the max number of tokens? if so do * some special cases for 5 tokens */ if (pos >= LIBINJECTION_SQLI_MAX_TOKENS) { if ( ( sf->tokenvec[0].type == TYPE_NUMBER && (sf->tokenvec[1].type == TYPE_OPERATOR || sf->tokenvec[1].type == TYPE_COMMA) && sf->tokenvec[2].type == TYPE_LEFTPARENS && sf->tokenvec[3].type == TYPE_NUMBER && sf->tokenvec[4].type == TYPE_RIGHTPARENS ) || ( sf->tokenvec[0].type == TYPE_BAREWORD && sf->tokenvec[1].type == TYPE_OPERATOR && sf->tokenvec[2].type == TYPE_LEFTPARENS && (sf->tokenvec[3].type == TYPE_BAREWORD || sf->tokenvec[3].type == TYPE_NUMBER) && sf->tokenvec[4].type == TYPE_RIGHTPARENS ) || ( sf->tokenvec[0].type == TYPE_NUMBER && sf->tokenvec[1].type == TYPE_RIGHTPARENS && sf->tokenvec[2].type == TYPE_COMMA && sf->tokenvec[3].type == TYPE_LEFTPARENS && sf->tokenvec[4].type == TYPE_NUMBER ) || ( sf->tokenvec[0].type == TYPE_BAREWORD && sf->tokenvec[1].type == TYPE_RIGHTPARENS && sf->tokenvec[2].type == TYPE_OPERATOR && sf->tokenvec[3].type == TYPE_LEFTPARENS && sf->tokenvec[4].type == TYPE_BAREWORD ) ) { if (pos > LIBINJECTION_SQLI_MAX_TOKENS) { st_copy(&(sf->tokenvec[1]), &(sf->tokenvec[LIBINJECTION_SQLI_MAX_TOKENS])); pos = 2; left = 0; } else { pos = 1; left = 0; } } } if (! more || left >= LIBINJECTION_SQLI_MAX_TOKENS) { left = pos; break; } /* get up to two tokens */ while (more && pos <= LIBINJECTION_SQLI_MAX_TOKENS && (pos - left) < 2) { sf->current = &(sf->tokenvec[pos]); more = libinjection_sqli_tokenize(sf); if (more) { if (sf->current->type == TYPE_COMMENT) { st_copy(&last_comment, sf->current); } else { last_comment.type = CHAR_NULL; pos += 1; } } } FOLD_DEBUG; /* did we get 2 tokens? if not then we are done */ if (pos - left < 2) { left = pos; continue; } /* FOLD: "ss" -> "s" * "foo" "bar" is valid SQL * just ignore second string */ if (sf->tokenvec[left].type == TYPE_STRING && sf->tokenvec[left+1].type == TYPE_STRING) { pos -= 1; sf->stats_folds += 1; continue; } else if (sf->tokenvec[left].type == TYPE_SEMICOLON && sf->tokenvec[left+1].type == TYPE_SEMICOLON) { /* not sure how various engines handle * 'select 1;;drop table foo' or * 'select 1; /x foo x/; drop table foo' * to prevent surprises, just fold away repeated semicolons */ pos -= 1; sf->stats_folds += 1; continue; } else if ((sf->tokenvec[left].type == TYPE_OPERATOR || sf->tokenvec[left].type == TYPE_LOGIC_OPERATOR) && (st_is_unary_op(&sf->tokenvec[left+1]) || sf->tokenvec[left+1].type == TYPE_SQLTYPE)) { pos -= 1; sf->stats_folds += 1; left = 0; continue; } else if (sf->tokenvec[left].type == TYPE_LEFTPARENS && st_is_unary_op(&sf->tokenvec[left+1])) { pos -= 1; sf->stats_folds += 1; if (left > 0) { left -= 1; } continue; } else if (syntax_merge_words(sf, &sf->tokenvec[left], &sf->tokenvec[left+1])) { pos -= 1; sf->stats_folds += 1; if (left > 0) { left -= 1; } continue; } else if (sf->tokenvec[left].type == TYPE_SEMICOLON && sf->tokenvec[left+1].type == TYPE_FUNCTION && (sf->tokenvec[left+1].val[0] == 'I' || sf->tokenvec[left+1].val[0] == 'i' ) && (sf->tokenvec[left+1].val[1] == 'F' || sf->tokenvec[left+1].val[1] == 'f' )) { /* IF is normally a function, except in Transact-SQL where it can be used as a * standalone control flow operator, e.g. ; IF 1=1 ... * if found after a semicolon, convert from 'f' type to 'T' type */ sf->tokenvec[left+1].type = TYPE_TSQL; /* left += 2; */ continue; /* reparse everything, but we probably can advance left, and pos */ } else if ((sf->tokenvec[left].type == TYPE_BAREWORD || sf->tokenvec[left].type == TYPE_VARIABLE) && sf->tokenvec[left+1].type == TYPE_LEFTPARENS && ( /* TSQL functions but common enough to be column names */ cstrcasecmp("USER_ID", sf->tokenvec[left].val, sf->tokenvec[left].len) == 0 || cstrcasecmp("USER_NAME", sf->tokenvec[left].val, sf->tokenvec[left].len) == 0 || /* Function in MYSQL */ cstrcasecmp("DATABASE", sf->tokenvec[left].val, sf->tokenvec[left].len) == 0 || cstrcasecmp("PASSWORD", sf->tokenvec[left].val, sf->tokenvec[left].len) == 0 || cstrcasecmp("USER", sf->tokenvec[left].val, sf->tokenvec[left].len) == 0 || /* Mysql words that act as a variable and are a function */ /* TSQL current_users is fake-variable */ /* http://msdn.microsoft.com/en-us/library/ms176050.aspx */ cstrcasecmp("CURRENT_USER", sf->tokenvec[left].val, sf->tokenvec[left].len) == 0 || cstrcasecmp("CURRENT_DATE", sf->tokenvec[left].val, sf->tokenvec[left].len) == 0 || cstrcasecmp("CURRENT_TIME", sf->tokenvec[left].val, sf->tokenvec[left].len) == 0 || cstrcasecmp("CURRENT_TIMESTAMP", sf->tokenvec[left].val, sf->tokenvec[left].len) == 0 || cstrcasecmp("LOCALTIME", sf->tokenvec[left].val, sf->tokenvec[left].len) == 0 || cstrcasecmp("LOCALTIMESTAMP", sf->tokenvec[left].val, sf->tokenvec[left].len) == 0 )) { /* pos is the same * other conversions need to go here... for instance * password CAN be a function, coalesce CAN be a function */ sf->tokenvec[left].type = TYPE_FUNCTION; continue; } else if (sf->tokenvec[left].type == TYPE_KEYWORD && ( cstrcasecmp("IN", sf->tokenvec[left].val, sf->tokenvec[left].len) == 0 || cstrcasecmp("NOT IN", sf->tokenvec[left].val, sf->tokenvec[left].len) == 0 )) { if (sf->tokenvec[left+1].type == TYPE_LEFTPARENS) { /* got .... IN ( ... (or 'NOT IN') * it's an operator */ sf->tokenvec[left].type = TYPE_OPERATOR; } else { /* * it's a nothing */ sf->tokenvec[left].type = TYPE_BAREWORD; } /* "IN" can be used as "IN BOOLEAN MODE" for mysql * in which case merging of words can be done later * other wise it acts as an equality operator __ IN (values..) * * here we got "IN" "(" so it's an operator. * also back track to handle "NOT IN" * might need to do the same with like * two use cases "foo" LIKE "BAR" (normal operator) * "foo" = LIKE(1,2) */ continue; } else if ((sf->tokenvec[left].type == TYPE_OPERATOR) && ( cstrcasecmp("LIKE", sf->tokenvec[left].val, sf->tokenvec[left].len) == 0 || cstrcasecmp("NOT LIKE", sf->tokenvec[left].val, sf->tokenvec[left].len) == 0)) { if (sf->tokenvec[left+1].type == TYPE_LEFTPARENS) { /* SELECT LIKE(... * it's a function */ sf->tokenvec[left].type = TYPE_FUNCTION; } } else if (sf->tokenvec[left].type == TYPE_SQLTYPE && (sf->tokenvec[left+1].type == TYPE_BAREWORD || sf->tokenvec[left+1].type == TYPE_NUMBER || sf->tokenvec[left+1].type == TYPE_SQLTYPE || sf->tokenvec[left+1].type == TYPE_LEFTPARENS || sf->tokenvec[left+1].type == TYPE_FUNCTION || sf->tokenvec[left+1].type == TYPE_VARIABLE || sf->tokenvec[left+1].type == TYPE_STRING)) { st_copy(&sf->tokenvec[left], &sf->tokenvec[left+1]); pos -= 1; sf->stats_folds += 1; left = 0; continue; } else if (sf->tokenvec[left].type == TYPE_COLLATE && sf->tokenvec[left+1].type == TYPE_BAREWORD) { /* * there are too many collation types.. so if the bareword has a "_" * then it's TYPE_SQLTYPE */ if (strchr(sf->tokenvec[left+1].val, '_') != NULL) { sf->tokenvec[left+1].type = TYPE_SQLTYPE; left = 0; } } else if (sf->tokenvec[left].type == TYPE_BACKSLASH) { if (st_is_arithmetic_op(&(sf->tokenvec[left+1]))) { /* very weird case in TSQL where '\%1' is parsed as '0 % 1', etc */ sf->tokenvec[left].type = TYPE_NUMBER; } else { /* just ignore it.. Again T-SQL seems to parse \1 as "1" */ st_copy(&sf->tokenvec[left], &sf->tokenvec[left+1]); pos -= 1; sf->stats_folds += 1; } left = 0; continue; } else if (sf->tokenvec[left].type == TYPE_LEFTPARENS && sf->tokenvec[left+1].type == TYPE_LEFTPARENS) { pos -= 1; left = 0; sf->stats_folds += 1; continue; } else if (sf->tokenvec[left].type == TYPE_RIGHTPARENS && sf->tokenvec[left+1].type == TYPE_RIGHTPARENS) { pos -= 1; left = 0; sf->stats_folds += 1; continue; } else if (sf->tokenvec[left].type == TYPE_LEFTBRACE && sf->tokenvec[left+1].type == TYPE_BAREWORD) { /* * MySQL Degenerate case -- * * select { ``.``.id }; -- valid !!! * select { ``.``.``.id }; -- invalid * select ``.``.id; -- invalid * select { ``.id }; -- invalid * * so it appears {``.``.id} is a magic case * I suspect this is "current database, current table, field id" * * The folding code can't look at more than 3 tokens, and * I don't want to make two passes. * * Since "{ ``" so rare, we are just going to blacklist it. * * Highly likely this will need revisiting! * * CREDIT @rsalgado 2013-11-25 */ if (sf->tokenvec[left+1].len == 0) { sf->tokenvec[left+1].type = TYPE_EVIL; return (int)(left+2); } /* weird ODBC / MYSQL {foo expr} --> expr * but for this rule we just strip away the "{ foo" part */ left = 0; pos -= 2; sf->stats_folds += 2; continue; } else if (sf->tokenvec[left+1].type == TYPE_RIGHTBRACE) { pos -= 1; left = 0; sf->stats_folds += 1; continue; } /* all cases of handing 2 tokens is done and nothing matched. Get one more token */ FOLD_DEBUG; while (more && pos <= LIBINJECTION_SQLI_MAX_TOKENS && pos - left < 3) { sf->current = &(sf->tokenvec[pos]); more = libinjection_sqli_tokenize(sf); if (more) { if (sf->current->type == TYPE_COMMENT) { st_copy(&last_comment, sf->current); } else { last_comment.type = CHAR_NULL; pos += 1; } } } /* do we have three tokens? If not then we are done */ if (pos -left < 3) { left = pos; continue; } /* * now look for three token folding */ if (sf->tokenvec[left].type == TYPE_NUMBER && sf->tokenvec[left+1].type == TYPE_OPERATOR && sf->tokenvec[left+2].type == TYPE_NUMBER) { pos -= 2; left = 0; continue; } else if (sf->tokenvec[left].type == TYPE_OPERATOR && sf->tokenvec[left+1].type != TYPE_LEFTPARENS && sf->tokenvec[left+2].type == TYPE_OPERATOR) { left = 0; pos -= 2; continue; } else if (sf->tokenvec[left].type == TYPE_LOGIC_OPERATOR && sf->tokenvec[left+2].type == TYPE_LOGIC_OPERATOR) { pos -= 2; left = 0; continue; } else if (sf->tokenvec[left].type == TYPE_VARIABLE && sf->tokenvec[left+1].type == TYPE_OPERATOR && (sf->tokenvec[left+2].type == TYPE_VARIABLE || sf->tokenvec[left+2].type == TYPE_NUMBER || sf->tokenvec[left+2].type == TYPE_BAREWORD)) { pos -= 2; left = 0; continue; } else if ((sf->tokenvec[left].type == TYPE_BAREWORD || sf->tokenvec[left].type == TYPE_NUMBER ) && sf->tokenvec[left+1].type == TYPE_OPERATOR && (sf->tokenvec[left+2].type == TYPE_NUMBER || sf->tokenvec[left+2].type == TYPE_BAREWORD)) { pos -= 2; left = 0; continue; } else if ((sf->tokenvec[left].type == TYPE_BAREWORD || sf->tokenvec[left].type == TYPE_NUMBER || sf->tokenvec[left].type == TYPE_VARIABLE || sf->tokenvec[left].type == TYPE_STRING) && sf->tokenvec[left+1].type == TYPE_OPERATOR && streq(sf->tokenvec[left+1].val, "::") && sf->tokenvec[left+2].type == TYPE_SQLTYPE) { pos -= 2; left = 0; sf->stats_folds += 2; continue; } else if ((sf->tokenvec[left].type == TYPE_BAREWORD || sf->tokenvec[left].type == TYPE_NUMBER || sf->tokenvec[left].type == TYPE_STRING || sf->tokenvec[left].type == TYPE_VARIABLE) && sf->tokenvec[left+1].type == TYPE_COMMA && (sf->tokenvec[left+2].type == TYPE_NUMBER || sf->tokenvec[left+2].type == TYPE_BAREWORD || sf->tokenvec[left+2].type == TYPE_STRING || sf->tokenvec[left+2].type == TYPE_VARIABLE)) { pos -= 2; left = 0; continue; } else if ((sf->tokenvec[left].type == TYPE_EXPRESSION || sf->tokenvec[left].type == TYPE_GROUP || sf->tokenvec[left].type == TYPE_COMMA) && st_is_unary_op(&sf->tokenvec[left+1]) && sf->tokenvec[left+2].type == TYPE_LEFTPARENS) { /* got something like SELECT + (, LIMIT + ( * remove unary operator */ st_copy(&sf->tokenvec[left+1], &sf->tokenvec[left+2]); pos -= 1; left = 0; continue; } else if ((sf->tokenvec[left].type == TYPE_KEYWORD || sf->tokenvec[left].type == TYPE_EXPRESSION || sf->tokenvec[left].type == TYPE_GROUP ) && st_is_unary_op(&sf->tokenvec[left+1]) && (sf->tokenvec[left+2].type == TYPE_NUMBER || sf->tokenvec[left+2].type == TYPE_BAREWORD || sf->tokenvec[left+2].type == TYPE_VARIABLE || sf->tokenvec[left+2].type == TYPE_STRING || sf->tokenvec[left+2].type == TYPE_FUNCTION )) { /* remove unary operators * select - 1 */ st_copy(&sf->tokenvec[left+1], &sf->tokenvec[left+2]); pos -= 1; left = 0; continue; } else if (sf->tokenvec[left].type == TYPE_COMMA && st_is_unary_op(&sf->tokenvec[left+1]) && (sf->tokenvec[left+2].type == TYPE_NUMBER || sf->tokenvec[left+2].type == TYPE_BAREWORD || sf->tokenvec[left+2].type == TYPE_VARIABLE || sf->tokenvec[left+2].type == TYPE_STRING)) { /* * interesting case turn ", -1" ->> ",1" PLUS we need to back up * one token if possible to see if more folding can be done * "1,-1" --> "1" */ st_copy(&sf->tokenvec[left+1], &sf->tokenvec[left+2]); left = 0; /* pos is >= 3 so this is safe */ assert(pos >= 3); pos -= 3; continue; } else if (sf->tokenvec[left].type == TYPE_COMMA && st_is_unary_op(&sf->tokenvec[left+1]) && sf->tokenvec[left+2].type == TYPE_FUNCTION) { /* Separate case from above since you end up with * 1,-sin(1) --> 1 (1) * Here, just do * 1,-sin(1) --> 1,sin(1) * just remove unary operator */ st_copy(&sf->tokenvec[left+1], &sf->tokenvec[left+2]); pos -= 1; left = 0; continue; } else if ((sf->tokenvec[left].type == TYPE_BAREWORD) && (sf->tokenvec[left+1].type == TYPE_DOT) && (sf->tokenvec[left+2].type == TYPE_BAREWORD)) { /* ignore the '.n' * typically is this databasename.table */ assert(pos >= 3); pos -= 2; left = 0; continue; } else if ((sf->tokenvec[left].type == TYPE_EXPRESSION) && (sf->tokenvec[left+1].type == TYPE_DOT) && (sf->tokenvec[left+2].type == TYPE_BAREWORD)) { /* select . `foo` --> select `foo` */ st_copy(&sf->tokenvec[left+1], &sf->tokenvec[left+2]); pos -= 1; left = 0; continue; } else if ((sf->tokenvec[left].type == TYPE_FUNCTION) && (sf->tokenvec[left+1].type == TYPE_LEFTPARENS) && (sf->tokenvec[left+2].type != TYPE_RIGHTPARENS)) { /* * whats going on here * Some SQL functions like USER() have 0 args * if we get User(foo), then User is not a function * This should be expanded since it eliminated a lot of false * positives. */ if (cstrcasecmp("USER", sf->tokenvec[left].val, sf->tokenvec[left].len) == 0) { sf->tokenvec[left].type = TYPE_BAREWORD; } } /* no folding -- assume left-most token is is good, now use the existing 2 tokens -- do not get another */ left += 1; } /* while(1) */ /* if we have 4 or less tokens, and we had a comment token * at the end, add it back */ if (left < LIBINJECTION_SQLI_MAX_TOKENS && last_comment.type == TYPE_COMMENT) { st_copy(&sf->tokenvec[left], &last_comment); left += 1; } /* sometimes we grab a 6th token to help determine the type of token 5. */ if (left > LIBINJECTION_SQLI_MAX_TOKENS) { left = LIBINJECTION_SQLI_MAX_TOKENS; } return (int)left; } /* secondary api: detects SQLi in a string, GIVEN a context. * * A context can be: * * CHAR_NULL (\0), process as is * * CHAR_SINGLE ('), process pretending input started with a * single quote. * * CHAR_DOUBLE ("), process pretending input started with a * double quote. * */ const char* libinjection_sqli_fingerprint(struct libinjection_sqli_state * sql_state, int flags) { int i; int tlen = 0; libinjection_sqli_reset(sql_state, flags); tlen = libinjection_sqli_fold(sql_state); /* Check for magic PHP backquote comment * If: * * last token is of type "bareword" * * And is quoted in a backtick * * And isn't closed * * And it's empty? * Then convert it to comment */ if (tlen > 2 && sql_state->tokenvec[tlen-1].type == TYPE_BAREWORD && sql_state->tokenvec[tlen-1].str_open == CHAR_TICK && sql_state->tokenvec[tlen-1].len == 0 && sql_state->tokenvec[tlen-1].str_close == CHAR_NULL) { sql_state->tokenvec[tlen-1].type = TYPE_COMMENT; } for (i = 0; i < tlen; ++i) { sql_state->fingerprint[i] = sql_state->tokenvec[i].type; } /* * make the fingerprint pattern a c-string (null delimited) */ sql_state->fingerprint[tlen] = CHAR_NULL; /* * check for 'X' in pattern, and then * clear out all tokens * * this means parsing could not be done * accurately due to pgsql's double comments * or other syntax that isn't consistent. * Should be very rare false positive */ if (strchr(sql_state->fingerprint, TYPE_EVIL)) { /* needed for SWIG */ memset((void*)sql_state->fingerprint, 0, LIBINJECTION_SQLI_MAX_TOKENS + 1); memset((void*)sql_state->tokenvec[0].val, 0, LIBINJECTION_SQLI_TOKEN_SIZE); sql_state->fingerprint[0] = TYPE_EVIL; sql_state->tokenvec[0].type = TYPE_EVIL; sql_state->tokenvec[0].val[0] = TYPE_EVIL; sql_state->tokenvec[1].type = CHAR_NULL; } return sql_state->fingerprint; } int libinjection_sqli_check_fingerprint(struct libinjection_sqli_state* sql_state) { return libinjection_sqli_blacklist(sql_state) && libinjection_sqli_not_whitelist(sql_state); } char libinjection_sqli_lookup_word(struct libinjection_sqli_state *sql_state, int lookup_type, const char* str, size_t len) { if (lookup_type == LOOKUP_FINGERPRINT) { return libinjection_sqli_check_fingerprint(sql_state) ? 'X' : '\0'; } else { return bsearch_keyword_type(str, len, sql_keywords, sql_keywords_sz); } } int libinjection_sqli_blacklist(struct libinjection_sqli_state* sql_state) { /* * use minimum of 8 bytes to make sure gcc -fstack-protector * works correctly */ char fp2[8]; char ch; size_t i; size_t len = strlen(sql_state->fingerprint); int patmatch; if (len < 1) { sql_state->reason = __LINE__; return FALSE; } /* to keep everything compatible, convert the v0 fingerprint pattern to v1 v0: up to 5 chars, mixed case v1: 1 char is '0', up to 5 more chars, upper case */ fp2[0] = '0'; for (i = 0; i < len; ++i) { ch = sql_state->fingerprint[i]; if (ch >= 'a' && ch <= 'z') { ch -= 0x20; } fp2[i+1] = ch; } fp2[i+1] = '\0'; patmatch = is_keyword(fp2, len + 1) == TYPE_FINGERPRINT; /* * No match. * * Set sql_state->reason to current line number * only for debugging purposes. */ if (!patmatch) { sql_state->reason = __LINE__; return FALSE; } return TRUE; } /* * return TRUE if SQLi, false is benign */ int libinjection_sqli_not_whitelist(struct libinjection_sqli_state* sql_state) { /* * We assume we got a SQLi match * This next part just helps reduce false positives. * */ char ch; size_t tlen = strlen(sql_state->fingerprint); if (tlen > 1 && sql_state->fingerprint[tlen-1] == TYPE_COMMENT) { /* * if ending comment is contains 'sp_password' then it's SQLi! * MS Audit log apparently ignores anything with * 'sp_password' in it. Unable to find primary reference to * this "feature" of SQL Server but seems to be known SQLi * technique */ if (my_memmem(sql_state->s, sql_state->slen, "sp_password", strlen("sp_password"))) { sql_state->reason = __LINE__; return TRUE; } } switch (tlen) { case 2:{ /* * case 2 are "very small SQLi" which make them * hard to tell from normal input... */ if (sql_state->fingerprint[1] == TYPE_UNION) { if (sql_state->stats_tokens == 2) { /* not sure why but 1U comes up in SQLi attack * likely part of parameter splitting/etc. * lots of reasons why "1 union" might be normal * input, so beep only if other SQLi things are present */ /* it really is a number and 'union' * other wise it has folding or comments */ sql_state->reason = __LINE__; return FALSE; } else { sql_state->reason = __LINE__; return TRUE; } } /* * if 'comment' is '#' ignore.. too many FP */ if (sql_state->tokenvec[1].val[0] == '#') { sql_state->reason = __LINE__; return FALSE; } /* * for fingerprint like 'nc', only comments of /x are treated * as SQL... ending comments of "--" and "#" are not SQLi */ if (sql_state->tokenvec[0].type == TYPE_BAREWORD && sql_state->tokenvec[1].type == TYPE_COMMENT && sql_state->tokenvec[1].val[0] != '/') { sql_state->reason = __LINE__; return FALSE; } /* * if '1c' ends with '/x' then it's SQLi */ if (sql_state->tokenvec[0].type == TYPE_NUMBER && sql_state->tokenvec[1].type == TYPE_COMMENT && sql_state->tokenvec[1].val[0] == '/') { return TRUE; } /** * there are some odd base64-looking query string values * 1234-ABCDEFEhfhihwuefi-- * which evaluate to "1c"... these are not SQLi * but 1234-- probably is. * Make sure the "1" in "1c" is actually a true decimal number * * Need to check -original- string since the folding step * may have merged tokens, e.g. "1+FOO" is folded into "1" * * Note: evasion: 1*1-- */ if (sql_state->tokenvec[0].type == TYPE_NUMBER && sql_state->tokenvec[1].type == TYPE_COMMENT) { if (sql_state->stats_tokens > 2) { /* we have some folding going on, highly likely SQLi */ sql_state->reason = __LINE__; return TRUE; } /* * we check that next character after the number is either whitespace, * or '/' or a '-' ==> SQLi. */ ch = sql_state->s[sql_state->tokenvec[0].len]; if ( ch <= 32 ) { /* next char was whitespace,e.g. "1234 --" * this isn't exactly correct.. ideally we should skip over all whitespace * but this seems to be ok for now */ return TRUE; } if (ch == '/' && sql_state->s[sql_state->tokenvec[0].len + 1] == '*') { return TRUE; } if (ch == '-' && sql_state->s[sql_state->tokenvec[0].len + 1] == '-') { return TRUE; } sql_state->reason = __LINE__; return FALSE; } /* * detect obvious SQLi scans.. many people put '--' in plain text * so only detect if input ends with '--', e.g. 1-- but not 1-- foo */ if ((sql_state->tokenvec[1].len > 2) && sql_state->tokenvec[1].val[0] == '-') { sql_state->reason = __LINE__; return FALSE; } break; } /* case 2 */ case 3:{ /* * ...foo' + 'bar... * no opening quote, no closing quote * and each string has data */ if (streq(sql_state->fingerprint, "sos") || streq(sql_state->fingerprint, "s&s")) { if ((sql_state->tokenvec[0].str_open == CHAR_NULL) && (sql_state->tokenvec[2].str_close == CHAR_NULL) && (sql_state->tokenvec[0].str_close == sql_state->tokenvec[2].str_open)) { /* * if ....foo" + "bar.... */ sql_state->reason = __LINE__; return TRUE; } if (sql_state->stats_tokens == 3) { sql_state->reason = __LINE__; return FALSE; } /* * not SQLi */ sql_state->reason = __LINE__; return FALSE; } else if (streq(sql_state->fingerprint, "s&n") || streq(sql_state->fingerprint, "n&1") || streq(sql_state->fingerprint, "1&1") || streq(sql_state->fingerprint, "1&v") || streq(sql_state->fingerprint, "1&s")) { /* 'sexy and 17' not SQLi * 'sexy and 17<18' SQLi */ if (sql_state->stats_tokens == 3) { sql_state->reason = __LINE__; return FALSE; } } else if (sql_state->tokenvec[1].type == TYPE_KEYWORD) { if ((sql_state->tokenvec[1].len < 5) || cstrcasecmp("INTO", sql_state->tokenvec[1].val, 4)) { /* if it's not "INTO OUTFILE", or "INTO DUMPFILE" (MySQL) * then treat as safe */ sql_state->reason = __LINE__; return FALSE; } } break; } /* case 3 */ case 4: case 5: { /* nothing right now */ break; } /* case 5 */ } /* end switch */ return TRUE; } /** Main API, detects SQLi in an input. * * */ static int reparse_as_mysql(struct libinjection_sqli_state * sql_state) { return sql_state->stats_comment_ddx || sql_state->stats_comment_hash; } /* * This function is mostly use with SWIG */ struct libinjection_sqli_token* libinjection_sqli_get_token(struct libinjection_sqli_state * sql_state, int i) { if (i < 0 || i > (int)LIBINJECTION_SQLI_MAX_TOKENS) { return NULL; } return &(sql_state->tokenvec[i]); } int libinjection_is_sqli(struct libinjection_sqli_state * sql_state) { const char *s = sql_state->s; size_t slen = sql_state->slen; /* * no input? not SQLi */ if (slen == 0) { return FALSE; } /* * test input "as-is" */ libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_NONE | FLAG_SQL_ANSI); if (sql_state->lookup(sql_state, LOOKUP_FINGERPRINT, sql_state->fingerprint, strlen(sql_state->fingerprint))) { return TRUE; } else if (reparse_as_mysql(sql_state)) { libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_NONE | FLAG_SQL_MYSQL); if (sql_state->lookup(sql_state, LOOKUP_FINGERPRINT, sql_state->fingerprint, strlen(sql_state->fingerprint))) { return TRUE; } } /* * if input has a single_quote, then * test as if input was actually ' * example: if input if "1' = 1", then pretend it's * "'1' = 1" * Porting Notes: example the same as doing * is_string_sqli(sql_state, "'" + s, slen+1, NULL, fn, arg) * */ if (memchr(s, CHAR_SINGLE, slen)) { libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_SINGLE | FLAG_SQL_ANSI); if (sql_state->lookup(sql_state, LOOKUP_FINGERPRINT, sql_state->fingerprint, strlen(sql_state->fingerprint))) { return TRUE; } else if (reparse_as_mysql(sql_state)) { libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_SINGLE | FLAG_SQL_MYSQL); if (sql_state->lookup(sql_state, LOOKUP_FINGERPRINT, sql_state->fingerprint, strlen(sql_state->fingerprint))) { return TRUE; } } } /* * same as above but with a double-quote " */ if (memchr(s, CHAR_DOUBLE, slen)) { libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_DOUBLE | FLAG_SQL_MYSQL); if (sql_state->lookup(sql_state, LOOKUP_FINGERPRINT, sql_state->fingerprint, strlen(sql_state->fingerprint))) { return TRUE; } } /* * Hurray, input is not SQLi */ return FALSE; } int libinjection_sqli(const char* input, size_t slen, char fingerprint[]) { int issqli; struct libinjection_sqli_state state; libinjection_sqli_init(&state, input, slen, 0); issqli = libinjection_is_sqli(&state); if (issqli) { strcpy(fingerprint, state.fingerprint); } else { fingerprint[0] = '\0'; } return issqli; } modsecurity-2.9.5/apache2/libinjection/libinjection_sqli_data.h0000664000175000017500000062406414147005233026052 0ustar mhsvierulamhsvierula #ifndef LIBINJECTION_SQLI_DATA_H #define LIBINJECTION_SQLI_DATA_H #include "libinjection.h" #include "libinjection_sqli.h" typedef struct { const char *word; char type; } keyword_t; static size_t parse_money(sfilter * sf); static size_t parse_other(sfilter * sf); static size_t parse_white(sfilter * sf); static size_t parse_operator1(sfilter *sf); static size_t parse_char(sfilter *sf); static size_t parse_hash(sfilter *sf); static size_t parse_dash(sfilter *sf); static size_t parse_slash(sfilter *sf); static size_t parse_backslash(sfilter * sf); static size_t parse_operator2(sfilter *sf); static size_t parse_string(sfilter *sf); static size_t parse_word(sfilter * sf); static size_t parse_var(sfilter * sf); static size_t parse_number(sfilter * sf); static size_t parse_tick(sfilter * sf); static size_t parse_ustring(sfilter * sf); static size_t parse_qstring(sfilter * sf); static size_t parse_nqstring(sfilter * sf); static size_t parse_xstring(sfilter * sf); static size_t parse_bstring(sfilter * sf); static size_t parse_estring(sfilter * sf); static size_t parse_bword(sfilter * sf); typedef size_t (*pt2Function)(sfilter *sf); static const pt2Function char_parse_map[] = { &parse_white, /* 0 */ &parse_white, /* 1 */ &parse_white, /* 2 */ &parse_white, /* 3 */ &parse_white, /* 4 */ &parse_white, /* 5 */ &parse_white, /* 6 */ &parse_white, /* 7 */ &parse_white, /* 8 */ &parse_white, /* 9 */ &parse_white, /* 10 */ &parse_white, /* 11 */ &parse_white, /* 12 */ &parse_white, /* 13 */ &parse_white, /* 14 */ &parse_white, /* 15 */ &parse_white, /* 16 */ &parse_white, /* 17 */ &parse_white, /* 18 */ &parse_white, /* 19 */ &parse_white, /* 20 */ &parse_white, /* 21 */ &parse_white, /* 22 */ &parse_white, /* 23 */ &parse_white, /* 24 */ &parse_white, /* 25 */ &parse_white, /* 26 */ &parse_white, /* 27 */ &parse_white, /* 28 */ &parse_white, /* 29 */ &parse_white, /* 30 */ &parse_white, /* 31 */ &parse_white, /* 32 */ &parse_operator2, /* 33 */ &parse_string, /* 34 */ &parse_hash, /* 35 */ &parse_money, /* 36 */ &parse_operator1, /* 37 */ &parse_operator2, /* 38 */ &parse_string, /* 39 */ &parse_char, /* 40 */ &parse_char, /* 41 */ &parse_operator2, /* 42 */ &parse_operator1, /* 43 */ &parse_char, /* 44 */ &parse_dash, /* 45 */ &parse_number, /* 46 */ &parse_slash, /* 47 */ &parse_number, /* 48 */ &parse_number, /* 49 */ &parse_number, /* 50 */ &parse_number, /* 51 */ &parse_number, /* 52 */ &parse_number, /* 53 */ &parse_number, /* 54 */ &parse_number, /* 55 */ &parse_number, /* 56 */ &parse_number, /* 57 */ &parse_operator2, /* 58 */ &parse_char, /* 59 */ &parse_operator2, /* 60 */ &parse_operator2, /* 61 */ &parse_operator2, /* 62 */ &parse_other, /* 63 */ &parse_var, /* 64 */ &parse_word, /* 65 */ &parse_bstring, /* 66 */ &parse_word, /* 67 */ &parse_word, /* 68 */ &parse_estring, /* 69 */ &parse_word, /* 70 */ &parse_word, /* 71 */ &parse_word, /* 72 */ &parse_word, /* 73 */ &parse_word, /* 74 */ &parse_word, /* 75 */ &parse_word, /* 76 */ &parse_word, /* 77 */ &parse_nqstring, /* 78 */ &parse_word, /* 79 */ &parse_word, /* 80 */ &parse_qstring, /* 81 */ &parse_word, /* 82 */ &parse_word, /* 83 */ &parse_word, /* 84 */ &parse_ustring, /* 85 */ &parse_word, /* 86 */ &parse_word, /* 87 */ &parse_xstring, /* 88 */ &parse_word, /* 89 */ &parse_word, /* 90 */ &parse_bword, /* 91 */ &parse_backslash, /* 92 */ &parse_other, /* 93 */ &parse_operator1, /* 94 */ &parse_word, /* 95 */ &parse_tick, /* 96 */ &parse_word, /* 97 */ &parse_bstring, /* 98 */ &parse_word, /* 99 */ &parse_word, /* 100 */ &parse_estring, /* 101 */ &parse_word, /* 102 */ &parse_word, /* 103 */ &parse_word, /* 104 */ &parse_word, /* 105 */ &parse_word, /* 106 */ &parse_word, /* 107 */ &parse_word, /* 108 */ &parse_word, /* 109 */ &parse_nqstring, /* 110 */ &parse_word, /* 111 */ &parse_word, /* 112 */ &parse_qstring, /* 113 */ &parse_word, /* 114 */ &parse_word, /* 115 */ &parse_word, /* 116 */ &parse_ustring, /* 117 */ &parse_word, /* 118 */ &parse_word, /* 119 */ &parse_xstring, /* 120 */ &parse_word, /* 121 */ &parse_word, /* 122 */ &parse_char, /* 123 */ &parse_operator2, /* 124 */ &parse_char, /* 125 */ &parse_operator1, /* 126 */ &parse_white, /* 127 */ &parse_word, /* 128 */ &parse_word, /* 129 */ &parse_word, /* 130 */ &parse_word, /* 131 */ &parse_word, /* 132 */ &parse_word, /* 133 */ &parse_word, /* 134 */ &parse_word, /* 135 */ &parse_word, /* 136 */ &parse_word, /* 137 */ &parse_word, /* 138 */ &parse_word, /* 139 */ &parse_word, /* 140 */ &parse_word, /* 141 */ &parse_word, /* 142 */ &parse_word, /* 143 */ &parse_word, /* 144 */ &parse_word, /* 145 */ &parse_word, /* 146 */ &parse_word, /* 147 */ &parse_word, /* 148 */ &parse_word, /* 149 */ &parse_word, /* 150 */ &parse_word, /* 151 */ &parse_word, /* 152 */ &parse_word, /* 153 */ &parse_word, /* 154 */ &parse_word, /* 155 */ &parse_word, /* 156 */ &parse_word, /* 157 */ &parse_word, /* 158 */ &parse_word, /* 159 */ &parse_white, /* 160 */ &parse_word, /* 161 */ &parse_word, /* 162 */ &parse_word, /* 163 */ &parse_word, /* 164 */ &parse_word, /* 165 */ &parse_word, /* 166 */ &parse_word, /* 167 */ &parse_word, /* 168 */ &parse_word, /* 169 */ &parse_word, /* 170 */ &parse_word, /* 171 */ &parse_word, /* 172 */ &parse_word, /* 173 */ &parse_word, /* 174 */ &parse_word, /* 175 */ &parse_word, /* 176 */ &parse_word, /* 177 */ &parse_word, /* 178 */ &parse_word, /* 179 */ &parse_word, /* 180 */ &parse_word, /* 181 */ &parse_word, /* 182 */ &parse_word, /* 183 */ &parse_word, /* 184 */ &parse_word, /* 185 */ &parse_word, /* 186 */ &parse_word, /* 187 */ &parse_word, /* 188 */ &parse_word, /* 189 */ &parse_word, /* 190 */ &parse_word, /* 191 */ &parse_word, /* 192 */ &parse_word, /* 193 */ &parse_word, /* 194 */ &parse_word, /* 195 */ &parse_word, /* 196 */ &parse_word, /* 197 */ &parse_word, /* 198 */ &parse_word, /* 199 */ &parse_word, /* 200 */ &parse_word, /* 201 */ &parse_word, /* 202 */ &parse_word, /* 203 */ &parse_word, /* 204 */ &parse_word, /* 205 */ &parse_word, /* 206 */ &parse_word, /* 207 */ &parse_word, /* 208 */ &parse_word, /* 209 */ &parse_word, /* 210 */ &parse_word, /* 211 */ &parse_word, /* 212 */ &parse_word, /* 213 */ &parse_word, /* 214 */ &parse_word, /* 215 */ &parse_word, /* 216 */ &parse_word, /* 217 */ &parse_word, /* 218 */ &parse_word, /* 219 */ &parse_word, /* 220 */ &parse_word, /* 221 */ &parse_word, /* 222 */ &parse_word, /* 223 */ &parse_word, /* 224 */ &parse_word, /* 225 */ &parse_word, /* 226 */ &parse_word, /* 227 */ &parse_word, /* 228 */ &parse_word, /* 229 */ &parse_word, /* 230 */ &parse_word, /* 231 */ &parse_word, /* 232 */ &parse_word, /* 233 */ &parse_word, /* 234 */ &parse_word, /* 235 */ &parse_word, /* 236 */ &parse_word, /* 237 */ &parse_word, /* 238 */ &parse_word, /* 239 */ &parse_word, /* 240 */ &parse_word, /* 241 */ &parse_word, /* 242 */ &parse_word, /* 243 */ &parse_word, /* 244 */ &parse_word, /* 245 */ &parse_word, /* 246 */ &parse_word, /* 247 */ &parse_word, /* 248 */ &parse_word, /* 249 */ &parse_word, /* 250 */ &parse_word, /* 251 */ &parse_word, /* 252 */ &parse_word, /* 253 */ &parse_word, /* 254 */ &parse_word, /* 255 */ }; static const keyword_t sql_keywords[] = { {"!!", 'o'}, {"!<", 'o'}, {"!=", 'o'}, {"!>", 'o'}, {"%=", 'o'}, {"&&", '&'}, {"&=", 'o'}, {"*=", 'o'}, {"+=", 'o'}, {"-=", 'o'}, {"/=", 'o'}, {"0&(1)O", 'F'}, {"0&(1)U", 'F'}, {"0&(1O(", 'F'}, {"0&(1OF", 'F'}, {"0&(1OS", 'F'}, {"0&(1OV", 'F'}, {"0&(F()", 'F'}, {"0&(F(1", 'F'}, {"0&(F(F", 'F'}, {"0&(F(N", 'F'}, {"0&(F(S", 'F'}, {"0&(F(V", 'F'}, {"0&(N)O", 'F'}, {"0&(N)U", 'F'}, {"0&(NO(", 'F'}, {"0&(NOF", 'F'}, {"0&(NOS", 'F'}, {"0&(NOV", 'F'}, {"0&(S)O", 'F'}, {"0&(S)U", 'F'}, {"0&(SO(", 'F'}, {"0&(SO1", 'F'}, {"0&(SOF", 'F'}, {"0&(SON", 'F'}, {"0&(SOS", 'F'}, {"0&(SOV", 'F'}, {"0&(V)O", 'F'}, {"0&(V)U", 'F'}, {"0&(VO(", 'F'}, {"0&(VOF", 'F'}, {"0&(VOS", 'F'}, {"0&1O(1", 'F'}, {"0&1O(F", 'F'}, {"0&1O(N", 'F'}, {"0&1O(S", 'F'}, {"0&1O(V", 'F'}, {"0&1OF(", 'F'}, {"0&1OS(", 'F'}, {"0&1OS1", 'F'}, {"0&1OSF", 'F'}, {"0&1OSU", 'F'}, {"0&1OSV", 'F'}, {"0&1OV(", 'F'}, {"0&1OVF", 'F'}, {"0&1OVO", 'F'}, {"0&1OVS", 'F'}, {"0&1OVU", 'F'}, {"0&1UE(", 'F'}, {"0&1UE1", 'F'}, {"0&1UEF", 'F'}, {"0&1UEK", 'F'}, {"0&1UEN", 'F'}, {"0&1UES", 'F'}, {"0&1UEV", 'F'}, {"0&F()O", 'F'}, {"0&F()U", 'F'}, {"0&F(1)", 'F'}, {"0&F(1O", 'F'}, {"0&F(F(", 'F'}, {"0&F(N)", 'F'}, {"0&F(NO", 'F'}, {"0&F(S)", 'F'}, {"0&F(SO", 'F'}, {"0&F(V)", 'F'}, {"0&F(VO", 'F'}, {"0&NO(1", 'F'}, {"0&NO(F", 'F'}, {"0&NO(N", 'F'}, {"0&NO(S", 'F'}, {"0&NO(V", 'F'}, {"0&NOF(", 'F'}, {"0&NOS(", 'F'}, {"0&NOS1", 'F'}, {"0&NOSF", 'F'}, {"0&NOSU", 'F'}, {"0&NOSV", 'F'}, {"0&NOV(", 'F'}, {"0&NOVF", 'F'}, {"0&NOVO", 'F'}, {"0&NOVS", 'F'}, {"0&NOVU", 'F'}, {"0&NUE(", 'F'}, {"0&NUE1", 'F'}, {"0&NUEF", 'F'}, {"0&NUEK", 'F'}, {"0&NUEN", 'F'}, {"0&NUES", 'F'}, {"0&NUEV", 'F'}, {"0&SO(1", 'F'}, {"0&SO(F", 'F'}, {"0&SO(N", 'F'}, {"0&SO(S", 'F'}, {"0&SO(V", 'F'}, {"0&SO1(", 'F'}, {"0&SO1F", 'F'}, {"0&SO1N", 'F'}, {"0&SO1S", 'F'}, {"0&SO1U", 'F'}, {"0&SO1V", 'F'}, {"0&SOF(", 'F'}, {"0&SON(", 'F'}, {"0&SON1", 'F'}, {"0&SONF", 'F'}, {"0&SONU", 'F'}, {"0&SOS(", 'F'}, {"0&SOS1", 'F'}, {"0&SOSF", 'F'}, {"0&SOSU", 'F'}, {"0&SOSV", 'F'}, {"0&SOV(", 'F'}, {"0&SOVF", 'F'}, {"0&SOVO", 'F'}, {"0&SOVS", 'F'}, {"0&SOVU", 'F'}, {"0&SUE(", 'F'}, {"0&SUE1", 'F'}, {"0&SUEF", 'F'}, {"0&SUEK", 'F'}, {"0&SUEN", 'F'}, {"0&SUES", 'F'}, {"0&SUEV", 'F'}, {"0&VO(1", 'F'}, {"0&VO(F", 'F'}, {"0&VO(N", 'F'}, {"0&VO(S", 'F'}, {"0&VO(V", 'F'}, {"0&VOF(", 'F'}, {"0&VOS(", 'F'}, {"0&VOS1", 'F'}, {"0&VOSF", 'F'}, {"0&VOSU", 'F'}, {"0&VOSV", 'F'}, {"0&VUE(", 'F'}, {"0&VUE1", 'F'}, {"0&VUEF", 'F'}, {"0&VUEK", 'F'}, {"0&VUEN", 'F'}, {"0&VUES", 'F'}, {"0&VUEV", 'F'}, {"0)&(EK", 'F'}, {"0)&(EN", 'F'}, {"0)UE(1", 'F'}, {"0)UE(F", 'F'}, {"0)UE(N", 'F'}, {"0)UE(S", 'F'}, {"0)UE(V", 'F'}, {"0)UE1K", 'F'}, {"0)UE1O", 'F'}, {"0)UEF(", 'F'}, {"0)UEK(", 'F'}, {"0)UEK1", 'F'}, {"0)UEKF", 'F'}, {"0)UEKN", 'F'}, {"0)UEKS", 'F'}, {"0)UEKV", 'F'}, {"0)UENK", 'F'}, {"0)UENO", 'F'}, {"0)UESK", 'F'}, {"0)UESO", 'F'}, {"0)UEVK", 'F'}, {"0)UEVO", 'F'}, {"01&(1&", 'F'}, {"01&(1)", 'F'}, {"01&(1,", 'F'}, {"01&(1O", 'F'}, {"01&(E(", 'F'}, {"01&(E1", 'F'}, {"01&(EF", 'F'}, {"01&(EK", 'F'}, {"01&(EN", 'F'}, {"01&(EO", 'F'}, {"01&(ES", 'F'}, {"01&(EV", 'F'}, {"01&(F(", 'F'}, {"01&(N&", 'F'}, {"01&(N)", 'F'}, {"01&(N,", 'F'}, {"01&(NO", 'F'}, {"01&(S&", 'F'}, {"01&(S)", 'F'}, {"01&(S,", 'F'}, {"01&(SO", 'F'}, {"01&(V&", 'F'}, {"01&(V)", 'F'}, {"01&(V,", 'F'}, {"01&(VO", 'F'}, {"01&1", 'F'}, {"01&1&(", 'F'}, {"01&1&1", 'F'}, {"01&1&F", 'F'}, {"01&1&N", 'F'}, {"01&1&S", 'F'}, {"01&1&V", 'F'}, {"01&1)&", 'F'}, {"01&1)C", 'F'}, {"01&1)O", 'F'}, {"01&1)U", 'F'}, {"01&1;", 'F'}, {"01&1;C", 'F'}, {"01&1;E", 'F'}, {"01&1;T", 'F'}, {"01&1B(", 'F'}, {"01&1B1", 'F'}, {"01&1BF", 'F'}, {"01&1BN", 'F'}, {"01&1BS", 'F'}, {"01&1BV", 'F'}, {"01&1C", 'F'}, {"01&1EK", 'F'}, {"01&1EN", 'F'}, {"01&1F(", 'F'}, {"01&1K(", 'F'}, {"01&1K1", 'F'}, {"01&1KF", 'F'}, {"01&1KN", 'F'}, {"01&1KS", 'F'}, {"01&1KV", 'F'}, {"01&1O(", 'F'}, {"01&1OF", 'F'}, {"01&1OS", 'F'}, {"01&1OV", 'F'}, {"01&1TN", 'F'}, {"01&1U", 'F'}, {"01&1U(", 'F'}, {"01&1U;", 'F'}, {"01&1UC", 'F'}, {"01&1UE", 'F'}, {"01&E(1", 'F'}, {"01&E(F", 'F'}, {"01&E(N", 'F'}, {"01&E(O", 'F'}, {"01&E(S", 'F'}, {"01&E(V", 'F'}, {"01&E1", 'F'}, {"01&E1;", 'F'}, {"01&E1C", 'F'}, {"01&E1K", 'F'}, {"01&E1O", 'F'}, {"01&EF(", 'F'}, {"01&EK(", 'F'}, {"01&EK1", 'F'}, {"01&EKF", 'F'}, {"01&EKN", 'F'}, {"01&EKS", 'F'}, {"01&EKU", 'F'}, {"01&EKV", 'F'}, {"01&EN", 'F'}, {"01&EN;", 'F'}, {"01&ENC", 'F'}, {"01&ENK", 'F'}, {"01&ENO", 'F'}, {"01&ES", 'F'}, {"01&ES;", 'F'}, {"01&ESC", 'F'}, {"01&ESK", 'F'}, {"01&ESO", 'F'}, {"01&EUE", 'F'}, {"01&EV", 'F'}, {"01&EV;", 'F'}, {"01&EVC", 'F'}, {"01&EVK", 'F'}, {"01&EVO", 'F'}, {"01&F()", 'F'}, {"01&F(1", 'F'}, {"01&F(E", 'F'}, {"01&F(F", 'F'}, {"01&F(N", 'F'}, {"01&F(S", 'F'}, {"01&F(V", 'F'}, {"01&K&(", 'F'}, {"01&K&1", 'F'}, {"01&K&F", 'F'}, {"01&K&N", 'F'}, {"01&K&S", 'F'}, {"01&K&V", 'F'}, {"01&K(1", 'F'}, {"01&K(F", 'F'}, {"01&K(N", 'F'}, {"01&K(S", 'F'}, {"01&K(V", 'F'}, {"01&K1O", 'F'}, {"01&KC", 'F'}, {"01&KF(", 'F'}, {"01&KNK", 'F'}, {"01&KO(", 'F'}, {"01&KO1", 'F'}, {"01&KOF", 'F'}, {"01&KOK", 'F'}, {"01&KON", 'F'}, {"01&KOS", 'F'}, {"01&KOV", 'F'}, {"01&KSO", 'F'}, {"01&KVO", 'F'}, {"01&N&(", 'F'}, {"01&N&1", 'F'}, {"01&N&F", 'F'}, {"01&N&N", 'F'}, {"01&N&S", 'F'}, {"01&N&V", 'F'}, {"01&N)&", 'F'}, {"01&N)C", 'F'}, {"01&N)O", 'F'}, {"01&N)U", 'F'}, {"01&N;", 'F'}, {"01&N;C", 'F'}, {"01&N;E", 'F'}, {"01&N;T", 'F'}, {"01&NB(", 'F'}, {"01&NB1", 'F'}, {"01&NBF", 'F'}, {"01&NBN", 'F'}, {"01&NBS", 'F'}, {"01&NBV", 'F'}, {"01&NC", 'F'}, {"01&NEN", 'F'}, {"01&NF(", 'F'}, {"01&NK(", 'F'}, {"01&NK1", 'F'}, {"01&NKF", 'F'}, {"01&NKN", 'F'}, {"01&NKS", 'F'}, {"01&NKV", 'F'}, {"01&NO(", 'F'}, {"01&NOF", 'F'}, {"01&NOS", 'F'}, {"01&NOV", 'F'}, {"01&NTN", 'F'}, {"01&NU", 'F'}, {"01&NU(", 'F'}, {"01&NU;", 'F'}, {"01&NUC", 'F'}, {"01&NUE", 'F'}, {"01&S", 'F'}, {"01&S&(", 'F'}, {"01&S&1", 'F'}, {"01&S&F", 'F'}, {"01&S&N", 'F'}, {"01&S&S", 'F'}, {"01&S&V", 'F'}, {"01&S)&", 'F'}, {"01&S)C", 'F'}, {"01&S)O", 'F'}, {"01&S)U", 'F'}, {"01&S1", 'F'}, {"01&S1;", 'F'}, {"01&S1C", 'F'}, {"01&S;", 'F'}, {"01&S;C", 'F'}, {"01&S;E", 'F'}, {"01&S;T", 'F'}, {"01&SB(", 'F'}, {"01&SB1", 'F'}, {"01&SBF", 'F'}, {"01&SBN", 'F'}, {"01&SBS", 'F'}, {"01&SBV", 'F'}, {"01&SC", 'F'}, {"01&SEK", 'F'}, {"01&SEN", 'F'}, {"01&SF(", 'F'}, {"01&SK(", 'F'}, {"01&SK1", 'F'}, {"01&SKF", 'F'}, {"01&SKN", 'F'}, {"01&SKS", 'F'}, {"01&SKV", 'F'}, {"01&SO(", 'F'}, {"01&SO1", 'F'}, {"01&SOF", 'F'}, {"01&SON", 'F'}, {"01&SOS", 'F'}, {"01&SOV", 'F'}, {"01&STN", 'F'}, {"01&SU", 'F'}, {"01&SU(", 'F'}, {"01&SU;", 'F'}, {"01&SUC", 'F'}, {"01&SUE", 'F'}, {"01&SV", 'F'}, {"01&SV;", 'F'}, {"01&SVC", 'F'}, {"01&SVO", 'F'}, {"01&V", 'F'}, {"01&V&(", 'F'}, {"01&V&1", 'F'}, {"01&V&F", 'F'}, {"01&V&N", 'F'}, {"01&V&S", 'F'}, {"01&V&V", 'F'}, {"01&V)&", 'F'}, {"01&V)C", 'F'}, {"01&V)O", 'F'}, {"01&V)U", 'F'}, {"01&V;", 'F'}, {"01&V;C", 'F'}, {"01&V;E", 'F'}, {"01&V;T", 'F'}, {"01&VB(", 'F'}, {"01&VB1", 'F'}, {"01&VBF", 'F'}, {"01&VBN", 'F'}, {"01&VBS", 'F'}, {"01&VBV", 'F'}, {"01&VC", 'F'}, {"01&VEK", 'F'}, {"01&VEN", 'F'}, {"01&VF(", 'F'}, {"01&VK(", 'F'}, {"01&VK1", 'F'}, {"01&VKF", 'F'}, {"01&VKN", 'F'}, {"01&VKS", 'F'}, {"01&VKV", 'F'}, {"01&VO(", 'F'}, {"01&VOF", 'F'}, {"01&VOS", 'F'}, {"01&VS", 'F'}, {"01&VS;", 'F'}, {"01&VSC", 'F'}, {"01&VSO", 'F'}, {"01&VTN", 'F'}, {"01&VU", 'F'}, {"01&VU(", 'F'}, {"01&VU;", 'F'}, {"01&VUC", 'F'}, {"01&VUE", 'F'}, {"01(EF(", 'F'}, {"01(EKF", 'F'}, {"01(EKN", 'F'}, {"01(ENK", 'F'}, {"01(U(E", 'F'}, {"01)&(1", 'F'}, {"01)&(E", 'F'}, {"01)&(F", 'F'}, {"01)&(N", 'F'}, {"01)&(S", 'F'}, {"01)&(V", 'F'}, {"01)&1", 'F'}, {"01)&1&", 'F'}, {"01)&1)", 'F'}, {"01)&1;", 'F'}, {"01)&1B", 'F'}, {"01)&1C", 'F'}, {"01)&1F", 'F'}, {"01)&1O", 'F'}, {"01)&1U", 'F'}, {"01)&F(", 'F'}, {"01)&N", 'F'}, {"01)&N&", 'F'}, {"01)&N)", 'F'}, {"01)&N;", 'F'}, {"01)&NB", 'F'}, {"01)&NC", 'F'}, {"01)&NF", 'F'}, {"01)&NO", 'F'}, {"01)&NU", 'F'}, {"01)&S", 'F'}, {"01)&S&", 'F'}, {"01)&S)", 'F'}, {"01)&S;", 'F'}, {"01)&SB", 'F'}, {"01)&SC", 'F'}, {"01)&SF", 'F'}, {"01)&SO", 'F'}, {"01)&SU", 'F'}, {"01)&V", 'F'}, {"01)&V&", 'F'}, {"01)&V)", 'F'}, {"01)&V;", 'F'}, {"01)&VB", 'F'}, {"01)&VC", 'F'}, {"01)&VF", 'F'}, {"01)&VO", 'F'}, {"01)&VU", 'F'}, {"01),(1", 'F'}, {"01),(F", 'F'}, {"01),(N", 'F'}, {"01),(S", 'F'}, {"01),(V", 'F'}, {"01);E(", 'F'}, {"01);E1", 'F'}, {"01);EF", 'F'}, {"01);EK", 'F'}, {"01);EN", 'F'}, {"01);EO", 'F'}, {"01);ES", 'F'}, {"01);EV", 'F'}, {"01);T(", 'F'}, {"01);T1", 'F'}, {"01);TF", 'F'}, {"01);TK", 'F'}, {"01);TN", 'F'}, {"01);TO", 'F'}, {"01);TS", 'F'}, {"01);TV", 'F'}, {"01)B(1", 'F'}, {"01)B(F", 'F'}, {"01)B(N", 'F'}, {"01)B(S", 'F'}, {"01)B(V", 'F'}, {"01)B1", 'F'}, {"01)B1&", 'F'}, {"01)B1;", 'F'}, {"01)B1C", 'F'}, {"01)B1K", 'F'}, {"01)B1N", 'F'}, {"01)B1O", 'F'}, {"01)B1U", 'F'}, {"01)BF(", 'F'}, {"01)BN", 'F'}, {"01)BN&", 'F'}, {"01)BN;", 'F'}, {"01)BNC", 'F'}, {"01)BNK", 'F'}, {"01)BNO", 'F'}, {"01)BNU", 'F'}, {"01)BS", 'F'}, {"01)BS&", 'F'}, {"01)BS;", 'F'}, {"01)BSC", 'F'}, {"01)BSK", 'F'}, {"01)BSO", 'F'}, {"01)BSU", 'F'}, {"01)BV", 'F'}, {"01)BV&", 'F'}, {"01)BV;", 'F'}, {"01)BVC", 'F'}, {"01)BVK", 'F'}, {"01)BVO", 'F'}, {"01)BVU", 'F'}, {"01)C", 'F'}, {"01)E(1", 'F'}, {"01)E(F", 'F'}, {"01)E(N", 'F'}, {"01)E(S", 'F'}, {"01)E(V", 'F'}, {"01)E1C", 'F'}, {"01)E1O", 'F'}, {"01)EF(", 'F'}, {"01)EK(", 'F'}, {"01)EK1", 'F'}, {"01)EKF", 'F'}, {"01)EKN", 'F'}, {"01)EKS", 'F'}, {"01)EKV", 'F'}, {"01)ENC", 'F'}, {"01)ENO", 'F'}, {"01)ESC", 'F'}, {"01)ESO", 'F'}, {"01)EVC", 'F'}, {"01)EVO", 'F'}, {"01)F(F", 'F'}, {"01)K(1", 'F'}, {"01)K(F", 'F'}, {"01)K(N", 'F'}, {"01)K(S", 'F'}, {"01)K(V", 'F'}, {"01)K1&", 'F'}, {"01)K1;", 'F'}, {"01)K1B", 'F'}, {"01)K1E", 'F'}, {"01)K1O", 'F'}, {"01)K1U", 'F'}, {"01)KB(", 'F'}, {"01)KB1", 'F'}, {"01)KBF", 'F'}, {"01)KBN", 'F'}, {"01)KBS", 'F'}, {"01)KBV", 'F'}, {"01)KF(", 'F'}, {"01)KN&", 'F'}, {"01)KN;", 'F'}, {"01)KNB", 'F'}, {"01)KNC", 'F'}, {"01)KNE", 'F'}, {"01)KNK", 'F'}, {"01)KNU", 'F'}, {"01)KS&", 'F'}, {"01)KS;", 'F'}, {"01)KSB", 'F'}, {"01)KSE", 'F'}, {"01)KSO", 'F'}, {"01)KSU", 'F'}, {"01)KUE", 'F'}, {"01)KV&", 'F'}, {"01)KV;", 'F'}, {"01)KVB", 'F'}, {"01)KVE", 'F'}, {"01)KVO", 'F'}, {"01)KVU", 'F'}, {"01)O(1", 'F'}, {"01)O(E", 'F'}, {"01)O(F", 'F'}, {"01)O(N", 'F'}, {"01)O(S", 'F'}, {"01)O(V", 'F'}, {"01)O1", 'F'}, {"01)O1&", 'F'}, {"01)O1)", 'F'}, {"01)O1;", 'F'}, {"01)O1B", 'F'}, {"01)O1C", 'F'}, {"01)O1K", 'F'}, {"01)O1U", 'F'}, {"01)OF(", 'F'}, {"01)ON&", 'F'}, {"01)ON)", 'F'}, {"01)ON;", 'F'}, {"01)ONB", 'F'}, {"01)ONC", 'F'}, {"01)ONK", 'F'}, {"01)ONU", 'F'}, {"01)OS", 'F'}, {"01)OS&", 'F'}, {"01)OS)", 'F'}, {"01)OS;", 'F'}, {"01)OSB", 'F'}, {"01)OSC", 'F'}, {"01)OSK", 'F'}, {"01)OSU", 'F'}, {"01)OV", 'F'}, {"01)OV&", 'F'}, {"01)OV)", 'F'}, {"01)OV;", 'F'}, {"01)OVB", 'F'}, {"01)OVC", 'F'}, {"01)OVK", 'F'}, {"01)OVO", 'F'}, {"01)OVU", 'F'}, {"01)U(E", 'F'}, {"01)UE(", 'F'}, {"01)UE1", 'F'}, {"01)UEF", 'F'}, {"01)UEK", 'F'}, {"01)UEN", 'F'}, {"01)UES", 'F'}, {"01)UEV", 'F'}, {"01,(1)", 'F'}, {"01,(1O", 'F'}, {"01,(E(", 'F'}, {"01,(E1", 'F'}, {"01,(EF", 'F'}, {"01,(EK", 'F'}, {"01,(EN", 'F'}, {"01,(ES", 'F'}, {"01,(EV", 'F'}, {"01,(F(", 'F'}, {"01,(N)", 'F'}, {"01,(NO", 'F'}, {"01,(S)", 'F'}, {"01,(SO", 'F'}, {"01,(V)", 'F'}, {"01,(VO", 'F'}, {"01,F()", 'F'}, {"01,F(1", 'F'}, {"01,F(F", 'F'}, {"01,F(N", 'F'}, {"01,F(S", 'F'}, {"01,F(V", 'F'}, {"01;E(1", 'F'}, {"01;E(E", 'F'}, {"01;E(F", 'F'}, {"01;E(N", 'F'}, {"01;E(S", 'F'}, {"01;E(V", 'F'}, {"01;E1,", 'F'}, {"01;E1;", 'F'}, {"01;E1C", 'F'}, {"01;E1K", 'F'}, {"01;E1O", 'F'}, {"01;E1T", 'F'}, {"01;EF(", 'F'}, {"01;EK(", 'F'}, {"01;EK1", 'F'}, {"01;EKF", 'F'}, {"01;EKN", 'F'}, {"01;EKO", 'F'}, {"01;EKS", 'F'}, {"01;EKV", 'F'}, {"01;EN,", 'F'}, {"01;EN;", 'F'}, {"01;ENC", 'F'}, {"01;ENE", 'F'}, {"01;ENK", 'F'}, {"01;ENO", 'F'}, {"01;ENT", 'F'}, {"01;ES,", 'F'}, {"01;ES;", 'F'}, {"01;ESC", 'F'}, {"01;ESK", 'F'}, {"01;ESO", 'F'}, {"01;EST", 'F'}, {"01;EV,", 'F'}, {"01;EV;", 'F'}, {"01;EVC", 'F'}, {"01;EVK", 'F'}, {"01;EVO", 'F'}, {"01;EVT", 'F'}, {"01;N:T", 'F'}, {"01;T(1", 'F'}, {"01;T(C", 'F'}, {"01;T(E", 'F'}, {"01;T(F", 'F'}, {"01;T(N", 'F'}, {"01;T(S", 'F'}, {"01;T(V", 'F'}, {"01;T1(", 'F'}, {"01;T1,", 'F'}, {"01;T1;", 'F'}, {"01;T1C", 'F'}, {"01;T1F", 'F'}, {"01;T1K", 'F'}, {"01;T1O", 'F'}, {"01;T1T", 'F'}, {"01;T;", 'F'}, {"01;T;C", 'F'}, {"01;TF(", 'F'}, {"01;TK(", 'F'}, {"01;TK1", 'F'}, {"01;TKF", 'F'}, {"01;TKK", 'F'}, {"01;TKN", 'F'}, {"01;TKO", 'F'}, {"01;TKS", 'F'}, {"01;TKV", 'F'}, {"01;TN(", 'F'}, {"01;TN,", 'F'}, {"01;TN1", 'F'}, {"01;TN;", 'F'}, {"01;TNC", 'F'}, {"01;TNF", 'F'}, {"01;TNK", 'F'}, {"01;TNN", 'F'}, {"01;TNO", 'F'}, {"01;TNS", 'F'}, {"01;TNT", 'F'}, {"01;TNV", 'F'}, {"01;TO(", 'F'}, {"01;TS(", 'F'}, {"01;TS,", 'F'}, {"01;TS;", 'F'}, {"01;TSC", 'F'}, {"01;TSF", 'F'}, {"01;TSK", 'F'}, {"01;TSO", 'F'}, {"01;TST", 'F'}, {"01;TTN", 'F'}, {"01;TV(", 'F'}, {"01;TV,", 'F'}, {"01;TV;", 'F'}, {"01;TVC", 'F'}, {"01;TVF", 'F'}, {"01;TVK", 'F'}, {"01;TVO", 'F'}, {"01;TVT", 'F'}, {"01A(F(", 'F'}, {"01A(N)", 'F'}, {"01A(NO", 'F'}, {"01A(S)", 'F'}, {"01A(SO", 'F'}, {"01A(V)", 'F'}, {"01A(VO", 'F'}, {"01AF()", 'F'}, {"01AF(1", 'F'}, {"01AF(F", 'F'}, {"01AF(N", 'F'}, {"01AF(S", 'F'}, {"01AF(V", 'F'}, {"01ASO(", 'F'}, {"01ASO1", 'F'}, {"01ASOF", 'F'}, {"01ASON", 'F'}, {"01ASOS", 'F'}, {"01ASOV", 'F'}, {"01ASUE", 'F'}, {"01ATO(", 'F'}, {"01ATO1", 'F'}, {"01ATOF", 'F'}, {"01ATON", 'F'}, {"01ATOS", 'F'}, {"01ATOV", 'F'}, {"01ATUE", 'F'}, {"01AVO(", 'F'}, {"01AVOF", 'F'}, {"01AVOS", 'F'}, {"01AVUE", 'F'}, {"01B(1)", 'F'}, {"01B(1O", 'F'}, {"01B(F(", 'F'}, {"01B(NO", 'F'}, {"01B(S)", 'F'}, {"01B(SO", 'F'}, {"01B(V)", 'F'}, {"01B(VO", 'F'}, {"01B1", 'F'}, {"01B1&(", 'F'}, {"01B1&1", 'F'}, {"01B1&F", 'F'}, {"01B1&N", 'F'}, {"01B1&S", 'F'}, {"01B1&V", 'F'}, {"01B1,(", 'F'}, {"01B1,F", 'F'}, {"01B1;", 'F'}, {"01B1;C", 'F'}, {"01B1B(", 'F'}, {"01B1B1", 'F'}, {"01B1BF", 'F'}, {"01B1BN", 'F'}, {"01B1BS", 'F'}, {"01B1BV", 'F'}, {"01B1C", 'F'}, {"01B1K(", 'F'}, {"01B1K1", 'F'}, {"01B1KF", 'F'}, {"01B1KN", 'F'}, {"01B1KS", 'F'}, {"01B1KV", 'F'}, {"01B1O(", 'F'}, {"01B1OF", 'F'}, {"01B1OS", 'F'}, {"01B1OV", 'F'}, {"01B1U(", 'F'}, {"01B1UE", 'F'}, {"01BE(1", 'F'}, {"01BE(F", 'F'}, {"01BE(N", 'F'}, {"01BE(S", 'F'}, {"01BE(V", 'F'}, {"01BEK(", 'F'}, {"01BF()", 'F'}, {"01BF(1", 'F'}, {"01BF(F", 'F'}, {"01BF(N", 'F'}, {"01BF(S", 'F'}, {"01BF(V", 'F'}, {"01BN", 'F'}, {"01BN&(", 'F'}, {"01BN&1", 'F'}, {"01BN&F", 'F'}, {"01BN&N", 'F'}, {"01BN&S", 'F'}, {"01BN&V", 'F'}, {"01BN,(", 'F'}, {"01BN,F", 'F'}, {"01BN;", 'F'}, {"01BN;C", 'F'}, {"01BNB(", 'F'}, {"01BNB1", 'F'}, {"01BNBF", 'F'}, {"01BNBN", 'F'}, {"01BNBS", 'F'}, {"01BNBV", 'F'}, {"01BNC", 'F'}, {"01BNK(", 'F'}, {"01BNK1", 'F'}, {"01BNKF", 'F'}, {"01BNKN", 'F'}, {"01BNKS", 'F'}, {"01BNKV", 'F'}, {"01BNO(", 'F'}, {"01BNOF", 'F'}, {"01BNOS", 'F'}, {"01BNOV", 'F'}, {"01BNU(", 'F'}, {"01BNUE", 'F'}, {"01BS", 'F'}, {"01BS&(", 'F'}, {"01BS&1", 'F'}, {"01BS&F", 'F'}, {"01BS&N", 'F'}, {"01BS&S", 'F'}, {"01BS&V", 'F'}, {"01BS,(", 'F'}, {"01BS,F", 'F'}, {"01BS;", 'F'}, {"01BS;C", 'F'}, {"01BSB(", 'F'}, {"01BSB1", 'F'}, {"01BSBF", 'F'}, {"01BSBN", 'F'}, {"01BSBS", 'F'}, {"01BSBV", 'F'}, {"01BSC", 'F'}, {"01BSK(", 'F'}, {"01BSK1", 'F'}, {"01BSKF", 'F'}, {"01BSKN", 'F'}, {"01BSKS", 'F'}, {"01BSKV", 'F'}, {"01BSO(", 'F'}, {"01BSO1", 'F'}, {"01BSOF", 'F'}, {"01BSON", 'F'}, {"01BSOS", 'F'}, {"01BSOV", 'F'}, {"01BSU(", 'F'}, {"01BSUE", 'F'}, {"01BV", 'F'}, {"01BV&(", 'F'}, {"01BV&1", 'F'}, {"01BV&F", 'F'}, {"01BV&N", 'F'}, {"01BV&S", 'F'}, {"01BV&V", 'F'}, {"01BV,(", 'F'}, {"01BV,F", 'F'}, {"01BV;", 'F'}, {"01BV;C", 'F'}, {"01BVB(", 'F'}, {"01BVB1", 'F'}, {"01BVBF", 'F'}, {"01BVBN", 'F'}, {"01BVBS", 'F'}, {"01BVBV", 'F'}, {"01BVC", 'F'}, {"01BVK(", 'F'}, {"01BVK1", 'F'}, {"01BVKF", 'F'}, {"01BVKN", 'F'}, {"01BVKS", 'F'}, {"01BVKV", 'F'}, {"01BVO(", 'F'}, {"01BVOF", 'F'}, {"01BVOS", 'F'}, {"01BVU(", 'F'}, {"01BVUE", 'F'}, {"01C", 'F'}, {"01E(1)", 'F'}, {"01E(1O", 'F'}, {"01E(F(", 'F'}, {"01E(N)", 'F'}, {"01E(NO", 'F'}, {"01E(S)", 'F'}, {"01E(SO", 'F'}, {"01E(V)", 'F'}, {"01E(VO", 'F'}, {"01E1;T", 'F'}, {"01E1C", 'F'}, {"01E1O(", 'F'}, {"01E1OF", 'F'}, {"01E1OS", 'F'}, {"01E1OV", 'F'}, {"01E1T(", 'F'}, {"01E1T1", 'F'}, {"01E1TF", 'F'}, {"01E1TN", 'F'}, {"01E1TS", 'F'}, {"01E1TV", 'F'}, {"01E1UE", 'F'}, {"01EF()", 'F'}, {"01EF(1", 'F'}, {"01EF(F", 'F'}, {"01EF(N", 'F'}, {"01EF(S", 'F'}, {"01EF(V", 'F'}, {"01EK(1", 'F'}, {"01EK(E", 'F'}, {"01EK(F", 'F'}, {"01EK(N", 'F'}, {"01EK(S", 'F'}, {"01EK(V", 'F'}, {"01EK1;", 'F'}, {"01EK1C", 'F'}, {"01EK1O", 'F'}, {"01EK1T", 'F'}, {"01EK1U", 'F'}, {"01EKF(", 'F'}, {"01EKN;", 'F'}, {"01EKNC", 'F'}, {"01EKNE", 'F'}, {"01EKNT", 'F'}, {"01EKNU", 'F'}, {"01EKOK", 'F'}, {"01EKS;", 'F'}, {"01EKSC", 'F'}, {"01EKSO", 'F'}, {"01EKST", 'F'}, {"01EKSU", 'F'}, {"01EKU(", 'F'}, {"01EKU1", 'F'}, {"01EKUE", 'F'}, {"01EKUF", 'F'}, {"01EKUS", 'F'}, {"01EKUV", 'F'}, {"01EKV;", 'F'}, {"01EKVC", 'F'}, {"01EKVO", 'F'}, {"01EKVT", 'F'}, {"01EKVU", 'F'}, {"01EN;T", 'F'}, {"01ENC", 'F'}, {"01ENEN", 'F'}, {"01ENO(", 'F'}, {"01ENOF", 'F'}, {"01ENOS", 'F'}, {"01ENOV", 'F'}, {"01ENT(", 'F'}, {"01ENT1", 'F'}, {"01ENTF", 'F'}, {"01ENTN", 'F'}, {"01ENTS", 'F'}, {"01ENTV", 'F'}, {"01ENUE", 'F'}, {"01EOKN", 'F'}, {"01ES;T", 'F'}, {"01ESC", 'F'}, {"01ESO(", 'F'}, {"01ESO1", 'F'}, {"01ESOF", 'F'}, {"01ESON", 'F'}, {"01ESOS", 'F'}, {"01ESOV", 'F'}, {"01EST(", 'F'}, {"01EST1", 'F'}, {"01ESTF", 'F'}, {"01ESTN", 'F'}, {"01ESTS", 'F'}, {"01ESTV", 'F'}, {"01ESUE", 'F'}, {"01EU(1", 'F'}, {"01EU(F", 'F'}, {"01EU(N", 'F'}, {"01EU(S", 'F'}, {"01EU(V", 'F'}, {"01EU1,", 'F'}, {"01EU1C", 'F'}, {"01EU1O", 'F'}, {"01EUEF", 'F'}, {"01EUEK", 'F'}, {"01EUF(", 'F'}, {"01EUS,", 'F'}, {"01EUSC", 'F'}, {"01EUSO", 'F'}, {"01EUV,", 'F'}, {"01EUVC", 'F'}, {"01EUVO", 'F'}, {"01EV;T", 'F'}, {"01EVC", 'F'}, {"01EVO(", 'F'}, {"01EVOF", 'F'}, {"01EVOS", 'F'}, {"01EVT(", 'F'}, {"01EVT1", 'F'}, {"01EVTF", 'F'}, {"01EVTN", 'F'}, {"01EVTS", 'F'}, {"01EVTV", 'F'}, {"01EVUE", 'F'}, {"01F()1", 'F'}, {"01F()F", 'F'}, {"01F()K", 'F'}, {"01F()N", 'F'}, {"01F()O", 'F'}, {"01F()S", 'F'}, {"01F()U", 'F'}, {"01F()V", 'F'}, {"01F(1)", 'F'}, {"01F(1N", 'F'}, {"01F(1O", 'F'}, {"01F(E(", 'F'}, {"01F(E1", 'F'}, {"01F(EF", 'F'}, {"01F(EK", 'F'}, {"01F(EN", 'F'}, {"01F(ES", 'F'}, {"01F(EV", 'F'}, {"01F(F(", 'F'}, {"01F(N)", 'F'}, {"01F(N,", 'F'}, {"01F(NO", 'F'}, {"01F(S)", 'F'}, {"01F(SO", 'F'}, {"01F(V)", 'F'}, {"01F(VO", 'F'}, {"01K(1O", 'F'}, {"01K(F(", 'F'}, {"01K(N)", 'F'}, {"01K(NO", 'F'}, {"01K(S)", 'F'}, {"01K(SO", 'F'}, {"01K(V)", 'F'}, {"01K(VO", 'F'}, {"01K)&(", 'F'}, {"01K)&1", 'F'}, {"01K)&F", 'F'}, {"01K)&N", 'F'}, {"01K)&S", 'F'}, {"01K)&V", 'F'}, {"01K);E", 'F'}, {"01K);T", 'F'}, {"01K)B(", 'F'}, {"01K)B1", 'F'}, {"01K)BF", 'F'}, {"01K)BN", 'F'}, {"01K)BS", 'F'}, {"01K)BV", 'F'}, {"01K)E(", 'F'}, {"01K)E1", 'F'}, {"01K)EF", 'F'}, {"01K)EK", 'F'}, {"01K)EN", 'F'}, {"01K)ES", 'F'}, {"01K)EV", 'F'}, {"01K)F(", 'F'}, {"01K)O(", 'F'}, {"01K)OF", 'F'}, {"01K)UE", 'F'}, {"01K1", 'F'}, {"01K1&(", 'F'}, {"01K1&1", 'F'}, {"01K1&F", 'F'}, {"01K1&N", 'F'}, {"01K1&S", 'F'}, {"01K1&V", 'F'}, {"01K1;", 'F'}, {"01K1;C", 'F'}, {"01K1;E", 'F'}, {"01K1;T", 'F'}, {"01K1B(", 'F'}, {"01K1B1", 'F'}, {"01K1BF", 'F'}, {"01K1BN", 'F'}, {"01K1BS", 'F'}, {"01K1BV", 'F'}, {"01K1C", 'F'}, {"01K1E(", 'F'}, {"01K1E1", 'F'}, {"01K1EF", 'F'}, {"01K1EK", 'F'}, {"01K1EN", 'F'}, {"01K1ES", 'F'}, {"01K1EV", 'F'}, {"01K1O(", 'F'}, {"01K1OF", 'F'}, {"01K1OS", 'F'}, {"01K1OV", 'F'}, {"01K1U(", 'F'}, {"01K1UE", 'F'}, {"01KF()", 'F'}, {"01KF(1", 'F'}, {"01KF(F", 'F'}, {"01KF(N", 'F'}, {"01KF(S", 'F'}, {"01KF(V", 'F'}, {"01KN", 'F'}, {"01KN&(", 'F'}, {"01KN&1", 'F'}, {"01KN&F", 'F'}, {"01KN&N", 'F'}, {"01KN&S", 'F'}, {"01KN&V", 'F'}, {"01KN;", 'F'}, {"01KN;C", 'F'}, {"01KN;E", 'F'}, {"01KN;T", 'F'}, {"01KNB(", 'F'}, {"01KNB1", 'F'}, {"01KNBF", 'F'}, {"01KNBN", 'F'}, {"01KNBS", 'F'}, {"01KNBV", 'F'}, {"01KNC", 'F'}, {"01KNE(", 'F'}, {"01KNE1", 'F'}, {"01KNEF", 'F'}, {"01KNEN", 'F'}, {"01KNES", 'F'}, {"01KNEV", 'F'}, {"01KNU(", 'F'}, {"01KNUE", 'F'}, {"01KS", 'F'}, {"01KS&(", 'F'}, {"01KS&1", 'F'}, {"01KS&F", 'F'}, {"01KS&N", 'F'}, {"01KS&S", 'F'}, {"01KS&V", 'F'}, {"01KS;", 'F'}, {"01KS;C", 'F'}, {"01KS;E", 'F'}, {"01KS;T", 'F'}, {"01KSB(", 'F'}, {"01KSB1", 'F'}, {"01KSBF", 'F'}, {"01KSBN", 'F'}, {"01KSBS", 'F'}, {"01KSBV", 'F'}, {"01KSC", 'F'}, {"01KSE(", 'F'}, {"01KSE1", 'F'}, {"01KSEF", 'F'}, {"01KSEK", 'F'}, {"01KSEN", 'F'}, {"01KSES", 'F'}, {"01KSEV", 'F'}, {"01KSO(", 'F'}, {"01KSO1", 'F'}, {"01KSOF", 'F'}, {"01KSON", 'F'}, {"01KSOS", 'F'}, {"01KSOV", 'F'}, {"01KSU(", 'F'}, {"01KSUE", 'F'}, {"01KUE(", 'F'}, {"01KUE1", 'F'}, {"01KUEF", 'F'}, {"01KUEK", 'F'}, {"01KUEN", 'F'}, {"01KUES", 'F'}, {"01KUEV", 'F'}, {"01KV", 'F'}, {"01KV&(", 'F'}, {"01KV&1", 'F'}, {"01KV&F", 'F'}, {"01KV&N", 'F'}, {"01KV&S", 'F'}, {"01KV&V", 'F'}, {"01KV;", 'F'}, {"01KV;C", 'F'}, {"01KV;E", 'F'}, {"01KV;T", 'F'}, {"01KVB(", 'F'}, {"01KVB1", 'F'}, {"01KVBF", 'F'}, {"01KVBN", 'F'}, {"01KVBS", 'F'}, {"01KVBV", 'F'}, {"01KVC", 'F'}, {"01KVE(", 'F'}, {"01KVE1", 'F'}, {"01KVEF", 'F'}, {"01KVEK", 'F'}, {"01KVEN", 'F'}, {"01KVES", 'F'}, {"01KVEV", 'F'}, {"01KVO(", 'F'}, {"01KVOF", 'F'}, {"01KVOS", 'F'}, {"01KVU(", 'F'}, {"01KVUE", 'F'}, {"01N&F(", 'F'}, {"01N(1O", 'F'}, {"01N(F(", 'F'}, {"01N(S)", 'F'}, {"01N(SO", 'F'}, {"01N(V)", 'F'}, {"01N(VO", 'F'}, {"01N)UE", 'F'}, {"01N,F(", 'F'}, {"01NE(1", 'F'}, {"01NE(F", 'F'}, {"01NE(N", 'F'}, {"01NE(S", 'F'}, {"01NE(V", 'F'}, {"01NE1C", 'F'}, {"01NE1O", 'F'}, {"01NEF(", 'F'}, {"01NENC", 'F'}, {"01NENO", 'F'}, {"01NESC", 'F'}, {"01NESO", 'F'}, {"01NEVC", 'F'}, {"01NEVO", 'F'}, {"01NU(E", 'F'}, {"01NUE", 'F'}, {"01NUE(", 'F'}, {"01NUE1", 'F'}, {"01NUE;", 'F'}, {"01NUEC", 'F'}, {"01NUEF", 'F'}, {"01NUEK", 'F'}, {"01NUEN", 'F'}, {"01NUES", 'F'}, {"01NUEV", 'F'}, {"01O(1&", 'F'}, {"01O(1)", 'F'}, {"01O(1,", 'F'}, {"01O(1O", 'F'}, {"01O(E(", 'F'}, {"01O(E1", 'F'}, {"01O(EE", 'F'}, {"01O(EF", 'F'}, {"01O(EK", 'F'}, {"01O(EN", 'F'}, {"01O(EO", 'F'}, {"01O(ES", 'F'}, {"01O(EV", 'F'}, {"01O(F(", 'F'}, {"01O(N&", 'F'}, {"01O(N)", 'F'}, {"01O(N,", 'F'}, {"01O(NO", 'F'}, {"01O(S&", 'F'}, {"01O(S)", 'F'}, {"01O(S,", 'F'}, {"01O(SO", 'F'}, {"01O(V&", 'F'}, {"01O(V)", 'F'}, {"01O(V,", 'F'}, {"01O(VO", 'F'}, {"01OF()", 'F'}, {"01OF(1", 'F'}, {"01OF(E", 'F'}, {"01OF(F", 'F'}, {"01OF(N", 'F'}, {"01OF(S", 'F'}, {"01OF(V", 'F'}, {"01OK&(", 'F'}, {"01OK&1", 'F'}, {"01OK&F", 'F'}, {"01OK&N", 'F'}, {"01OK&S", 'F'}, {"01OK&V", 'F'}, {"01OK(1", 'F'}, {"01OK(F", 'F'}, {"01OK(N", 'F'}, {"01OK(S", 'F'}, {"01OK(V", 'F'}, {"01OK1C", 'F'}, {"01OK1O", 'F'}, {"01OKF(", 'F'}, {"01OKNC", 'F'}, {"01OKO(", 'F'}, {"01OKO1", 'F'}, {"01OKOF", 'F'}, {"01OKON", 'F'}, {"01OKOS", 'F'}, {"01OKOV", 'F'}, {"01OKSC", 'F'}, {"01OKSO", 'F'}, {"01OKVC", 'F'}, {"01OKVO", 'F'}, {"01ONSU", 'F'}, {"01OS&(", 'F'}, {"01OS&1", 'F'}, {"01OS&E", 'F'}, {"01OS&F", 'F'}, {"01OS&K", 'F'}, {"01OS&N", 'F'}, {"01OS&S", 'F'}, {"01OS&U", 'F'}, {"01OS&V", 'F'}, {"01OS(E", 'F'}, {"01OS(U", 'F'}, {"01OS)&", 'F'}, {"01OS),", 'F'}, {"01OS);", 'F'}, {"01OS)B", 'F'}, {"01OS)C", 'F'}, {"01OS)E", 'F'}, {"01OS)F", 'F'}, {"01OS)K", 'F'}, {"01OS)O", 'F'}, {"01OS)U", 'F'}, {"01OS,(", 'F'}, {"01OS,F", 'F'}, {"01OS1(", 'F'}, {"01OS1F", 'F'}, {"01OS1N", 'F'}, {"01OS1S", 'F'}, {"01OS1U", 'F'}, {"01OS1V", 'F'}, {"01OS;", 'F'}, {"01OS;C", 'F'}, {"01OS;E", 'F'}, {"01OS;N", 'F'}, {"01OS;T", 'F'}, {"01OSA(", 'F'}, {"01OSAF", 'F'}, {"01OSAS", 'F'}, {"01OSAT", 'F'}, {"01OSAV", 'F'}, {"01OSB(", 'F'}, {"01OSB1", 'F'}, {"01OSBE", 'F'}, {"01OSBF", 'F'}, {"01OSBN", 'F'}, {"01OSBS", 'F'}, {"01OSBV", 'F'}, {"01OSC", 'F'}, {"01OSE(", 'F'}, {"01OSE1", 'F'}, {"01OSEF", 'F'}, {"01OSEK", 'F'}, {"01OSEN", 'F'}, {"01OSEO", 'F'}, {"01OSES", 'F'}, {"01OSEU", 'F'}, {"01OSEV", 'F'}, {"01OSF(", 'F'}, {"01OSK(", 'F'}, {"01OSK)", 'F'}, {"01OSK1", 'F'}, {"01OSKB", 'F'}, {"01OSKF", 'F'}, {"01OSKN", 'F'}, {"01OSKS", 'F'}, {"01OSKU", 'F'}, {"01OSKV", 'F'}, {"01OST(", 'F'}, {"01OST1", 'F'}, {"01OSTE", 'F'}, {"01OSTF", 'F'}, {"01OSTN", 'F'}, {"01OSTS", 'F'}, {"01OSTT", 'F'}, {"01OSTV", 'F'}, {"01OSU", 'F'}, {"01OSU(", 'F'}, {"01OSU1", 'F'}, {"01OSU;", 'F'}, {"01OSUC", 'F'}, {"01OSUE", 'F'}, {"01OSUF", 'F'}, {"01OSUK", 'F'}, {"01OSUO", 'F'}, {"01OSUS", 'F'}, {"01OSUT", 'F'}, {"01OSUV", 'F'}, {"01OSV(", 'F'}, {"01OSVF", 'F'}, {"01OSVO", 'F'}, {"01OSVS", 'F'}, {"01OSVU", 'F'}, {"01OU(E", 'F'}, {"01OUEK", 'F'}, {"01OUEN", 'F'}, {"01OV", 'F'}, {"01OV&(", 'F'}, {"01OV&1", 'F'}, {"01OV&E", 'F'}, {"01OV&F", 'F'}, {"01OV&K", 'F'}, {"01OV&N", 'F'}, {"01OV&S", 'F'}, {"01OV&U", 'F'}, {"01OV&V", 'F'}, {"01OV(E", 'F'}, {"01OV(U", 'F'}, {"01OV)&", 'F'}, {"01OV),", 'F'}, {"01OV);", 'F'}, {"01OV)B", 'F'}, {"01OV)C", 'F'}, {"01OV)E", 'F'}, {"01OV)F", 'F'}, {"01OV)K", 'F'}, {"01OV)O", 'F'}, {"01OV)U", 'F'}, {"01OV,(", 'F'}, {"01OV,F", 'F'}, {"01OV;", 'F'}, {"01OV;C", 'F'}, {"01OV;E", 'F'}, {"01OV;N", 'F'}, {"01OV;T", 'F'}, {"01OVA(", 'F'}, {"01OVAF", 'F'}, {"01OVAS", 'F'}, {"01OVAT", 'F'}, {"01OVAV", 'F'}, {"01OVB(", 'F'}, {"01OVB1", 'F'}, {"01OVBE", 'F'}, {"01OVBF", 'F'}, {"01OVBN", 'F'}, {"01OVBS", 'F'}, {"01OVBV", 'F'}, {"01OVC", 'F'}, {"01OVE(", 'F'}, {"01OVE1", 'F'}, {"01OVEF", 'F'}, {"01OVEK", 'F'}, {"01OVEN", 'F'}, {"01OVEO", 'F'}, {"01OVES", 'F'}, {"01OVEU", 'F'}, {"01OVEV", 'F'}, {"01OVF(", 'F'}, {"01OVK(", 'F'}, {"01OVK)", 'F'}, {"01OVK1", 'F'}, {"01OVKB", 'F'}, {"01OVKF", 'F'}, {"01OVKN", 'F'}, {"01OVKS", 'F'}, {"01OVKU", 'F'}, {"01OVKV", 'F'}, {"01OVO(", 'F'}, {"01OVOF", 'F'}, {"01OVOK", 'F'}, {"01OVOS", 'F'}, {"01OVOU", 'F'}, {"01OVS(", 'F'}, {"01OVS1", 'F'}, {"01OVSF", 'F'}, {"01OVSO", 'F'}, {"01OVSU", 'F'}, {"01OVSV", 'F'}, {"01OVT(", 'F'}, {"01OVT1", 'F'}, {"01OVTE", 'F'}, {"01OVTF", 'F'}, {"01OVTN", 'F'}, {"01OVTS", 'F'}, {"01OVTT", 'F'}, {"01OVTV", 'F'}, {"01OVU", 'F'}, {"01OVU(", 'F'}, {"01OVU1", 'F'}, {"01OVU;", 'F'}, {"01OVUC", 'F'}, {"01OVUE", 'F'}, {"01OVUF", 'F'}, {"01OVUK", 'F'}, {"01OVUO", 'F'}, {"01OVUS", 'F'}, {"01OVUT", 'F'}, {"01OVUV", 'F'}, {"01SF()", 'F'}, {"01SF(1", 'F'}, {"01SF(F", 'F'}, {"01SF(N", 'F'}, {"01SF(S", 'F'}, {"01SF(V", 'F'}, {"01SUE", 'F'}, {"01SUE;", 'F'}, {"01SUEC", 'F'}, {"01SUEK", 'F'}, {"01SV", 'F'}, {"01SV;", 'F'}, {"01SV;C", 'F'}, {"01SVC", 'F'}, {"01SVO(", 'F'}, {"01SVOF", 'F'}, {"01SVOS", 'F'}, {"01T(1)", 'F'}, {"01T(1O", 'F'}, {"01T(F(", 'F'}, {"01T(N)", 'F'}, {"01T(NO", 'F'}, {"01T(S)", 'F'}, {"01T(SO", 'F'}, {"01T(V)", 'F'}, {"01T(VO", 'F'}, {"01T1(F", 'F'}, {"01T1O(", 'F'}, {"01T1OF", 'F'}, {"01T1OS", 'F'}, {"01T1OV", 'F'}, {"01TE(1", 'F'}, {"01TE(F", 'F'}, {"01TE(N", 'F'}, {"01TE(S", 'F'}, {"01TE(V", 'F'}, {"01TE1N", 'F'}, {"01TE1O", 'F'}, {"01TEF(", 'F'}, {"01TEK(", 'F'}, {"01TEK1", 'F'}, {"01TEKF", 'F'}, {"01TEKN", 'F'}, {"01TEKS", 'F'}, {"01TEKV", 'F'}, {"01TENN", 'F'}, {"01TENO", 'F'}, {"01TESN", 'F'}, {"01TESO", 'F'}, {"01TEVN", 'F'}, {"01TEVO", 'F'}, {"01TF()", 'F'}, {"01TF(1", 'F'}, {"01TF(F", 'F'}, {"01TF(N", 'F'}, {"01TF(S", 'F'}, {"01TF(V", 'F'}, {"01TN(1", 'F'}, {"01TN(F", 'F'}, {"01TN(S", 'F'}, {"01TN(V", 'F'}, {"01TN1C", 'F'}, {"01TN1O", 'F'}, {"01TN;E", 'F'}, {"01TN;N", 'F'}, {"01TN;T", 'F'}, {"01TNE(", 'F'}, {"01TNE1", 'F'}, {"01TNEF", 'F'}, {"01TNEN", 'F'}, {"01TNES", 'F'}, {"01TNEV", 'F'}, {"01TNF(", 'F'}, {"01TNKN", 'F'}, {"01TNN:", 'F'}, {"01TNNC", 'F'}, {"01TNNO", 'F'}, {"01TNO(", 'F'}, {"01TNOF", 'F'}, {"01TNOS", 'F'}, {"01TNOV", 'F'}, {"01TNSC", 'F'}, {"01TNSO", 'F'}, {"01TNT(", 'F'}, {"01TNT1", 'F'}, {"01TNTF", 'F'}, {"01TNTN", 'F'}, {"01TNTS", 'F'}, {"01TNTV", 'F'}, {"01TNVC", 'F'}, {"01TNVO", 'F'}, {"01TS(F", 'F'}, {"01TSO(", 'F'}, {"01TSO1", 'F'}, {"01TSOF", 'F'}, {"01TSON", 'F'}, {"01TSOS", 'F'}, {"01TSOV", 'F'}, {"01TTNE", 'F'}, {"01TTNK", 'F'}, {"01TTNN", 'F'}, {"01TTNT", 'F'}, {"01TV(1", 'F'}, {"01TV(F", 'F'}, {"01TVO(", 'F'}, {"01TVOF", 'F'}, {"01TVOS", 'F'}, {"01U", 'F'}, {"01U(1)", 'F'}, {"01U(1O", 'F'}, {"01U(E(", 'F'}, {"01U(E1", 'F'}, {"01U(EF", 'F'}, {"01U(EK", 'F'}, {"01U(EN", 'F'}, {"01U(ES", 'F'}, {"01U(EV", 'F'}, {"01U(F(", 'F'}, {"01U(N)", 'F'}, {"01U(NO", 'F'}, {"01U(S)", 'F'}, {"01U(SO", 'F'}, {"01U(V)", 'F'}, {"01U(VO", 'F'}, {"01U1,(", 'F'}, {"01U1,F", 'F'}, {"01U1C", 'F'}, {"01U1O(", 'F'}, {"01U1OF", 'F'}, {"01U1OS", 'F'}, {"01U1OV", 'F'}, {"01U;", 'F'}, {"01U;C", 'F'}, {"01UC", 'F'}, {"01UE", 'F'}, {"01UE(1", 'F'}, {"01UE(E", 'F'}, {"01UE(F", 'F'}, {"01UE(N", 'F'}, {"01UE(O", 'F'}, {"01UE(S", 'F'}, {"01UE(V", 'F'}, {"01UE1", 'F'}, {"01UE1&", 'F'}, {"01UE1(", 'F'}, {"01UE1)", 'F'}, {"01UE1,", 'F'}, {"01UE1;", 'F'}, {"01UE1B", 'F'}, {"01UE1C", 'F'}, {"01UE1F", 'F'}, {"01UE1K", 'F'}, {"01UE1N", 'F'}, {"01UE1O", 'F'}, {"01UE1S", 'F'}, {"01UE1U", 'F'}, {"01UE1V", 'F'}, {"01UE;", 'F'}, {"01UE;C", 'F'}, {"01UEC", 'F'}, {"01UEF", 'F'}, {"01UEF(", 'F'}, {"01UEF,", 'F'}, {"01UEF;", 'F'}, {"01UEFC", 'F'}, {"01UEK", 'F'}, {"01UEK(", 'F'}, {"01UEK1", 'F'}, {"01UEK;", 'F'}, {"01UEKC", 'F'}, {"01UEKF", 'F'}, {"01UEKN", 'F'}, {"01UEKO", 'F'}, {"01UEKS", 'F'}, {"01UEKV", 'F'}, {"01UEN", 'F'}, {"01UEN&", 'F'}, {"01UEN(", 'F'}, {"01UEN)", 'F'}, {"01UEN,", 'F'}, {"01UEN1", 'F'}, {"01UEN;", 'F'}, {"01UENB", 'F'}, {"01UENC", 'F'}, {"01UENF", 'F'}, {"01UENK", 'F'}, {"01UENN", 'F'}, {"01UENO", 'F'}, {"01UENS", 'F'}, {"01UENU", 'F'}, {"01UEOK", 'F'}, {"01UEON", 'F'}, {"01UES", 'F'}, {"01UES&", 'F'}, {"01UES(", 'F'}, {"01UES)", 'F'}, {"01UES,", 'F'}, {"01UES1", 'F'}, {"01UES;", 'F'}, {"01UESB", 'F'}, {"01UESC", 'F'}, {"01UESF", 'F'}, {"01UESK", 'F'}, {"01UESO", 'F'}, {"01UESU", 'F'}, {"01UESV", 'F'}, {"01UEV", 'F'}, {"01UEV&", 'F'}, {"01UEV(", 'F'}, {"01UEV)", 'F'}, {"01UEV,", 'F'}, {"01UEV;", 'F'}, {"01UEVB", 'F'}, {"01UEVC", 'F'}, {"01UEVF", 'F'}, {"01UEVK", 'F'}, {"01UEVN", 'F'}, {"01UEVO", 'F'}, {"01UEVS", 'F'}, {"01UEVU", 'F'}, {"01UF()", 'F'}, {"01UF(1", 'F'}, {"01UF(F", 'F'}, {"01UF(N", 'F'}, {"01UF(S", 'F'}, {"01UF(V", 'F'}, {"01UK(E", 'F'}, {"01UO(E", 'F'}, {"01UON(", 'F'}, {"01UON1", 'F'}, {"01UONF", 'F'}, {"01UONS", 'F'}, {"01US,(", 'F'}, {"01US,F", 'F'}, {"01USC", 'F'}, {"01USO(", 'F'}, {"01USO1", 'F'}, {"01USOF", 'F'}, {"01USON", 'F'}, {"01USOS", 'F'}, {"01USOV", 'F'}, {"01UTN(", 'F'}, {"01UTN1", 'F'}, {"01UTNF", 'F'}, {"01UTNN", 'F'}, {"01UTNS", 'F'}, {"01UTNV", 'F'}, {"01UV,(", 'F'}, {"01UV,F", 'F'}, {"01UVC", 'F'}, {"01UVO(", 'F'}, {"01UVOF", 'F'}, {"01UVOS", 'F'}, {"01VF()", 'F'}, {"01VF(1", 'F'}, {"01VF(F", 'F'}, {"01VF(N", 'F'}, {"01VF(S", 'F'}, {"01VF(V", 'F'}, {"01VO(1", 'F'}, {"01VO(F", 'F'}, {"01VO(N", 'F'}, {"01VO(S", 'F'}, {"01VO(V", 'F'}, {"01VOF(", 'F'}, {"01VOS(", 'F'}, {"01VOS1", 'F'}, {"01VOSF", 'F'}, {"01VOSU", 'F'}, {"01VOSV", 'F'}, {"01VS", 'F'}, {"01VS;", 'F'}, {"01VS;C", 'F'}, {"01VSC", 'F'}, {"01VSO(", 'F'}, {"01VSO1", 'F'}, {"01VSOF", 'F'}, {"01VSON", 'F'}, {"01VSOS", 'F'}, {"01VSOV", 'F'}, {"01VUE", 'F'}, {"01VUE;", 'F'}, {"01VUEC", 'F'}, {"01VUEK", 'F'}, {"0;T(EF", 'F'}, {"0;T(EK", 'F'}, {"0;TKNC", 'F'}, {"0E(1&(", 'F'}, {"0E(1&1", 'F'}, {"0E(1&F", 'F'}, {"0E(1&N", 'F'}, {"0E(1&S", 'F'}, {"0E(1&V", 'F'}, {"0E(1)&", 'F'}, {"0E(1),", 'F'}, {"0E(1)1", 'F'}, {"0E(1);", 'F'}, {"0E(1)B", 'F'}, {"0E(1)C", 'F'}, {"0E(1)F", 'F'}, {"0E(1)K", 'F'}, {"0E(1)N", 'F'}, {"0E(1)O", 'F'}, {"0E(1)S", 'F'}, {"0E(1)U", 'F'}, {"0E(1)V", 'F'}, {"0E(1,F", 'F'}, {"0E(1F(", 'F'}, {"0E(1N)", 'F'}, {"0E(1O(", 'F'}, {"0E(1OF", 'F'}, {"0E(1OS", 'F'}, {"0E(1OV", 'F'}, {"0E(1S)", 'F'}, {"0E(1V)", 'F'}, {"0E(1VO", 'F'}, {"0E(E(1", 'F'}, {"0E(E(E", 'F'}, {"0E(E(F", 'F'}, {"0E(E(N", 'F'}, {"0E(E(S", 'F'}, {"0E(E(V", 'F'}, {"0E(E1&", 'F'}, {"0E(E1)", 'F'}, {"0E(E1O", 'F'}, {"0E(EF(", 'F'}, {"0E(EK(", 'F'}, {"0E(EK1", 'F'}, {"0E(EKF", 'F'}, {"0E(EKN", 'F'}, {"0E(EKS", 'F'}, {"0E(EKV", 'F'}, {"0E(EN&", 'F'}, {"0E(EN)", 'F'}, {"0E(ENO", 'F'}, {"0E(ES&", 'F'}, {"0E(ES)", 'F'}, {"0E(ESO", 'F'}, {"0E(EV&", 'F'}, {"0E(EV)", 'F'}, {"0E(EVO", 'F'}, {"0E(F()", 'F'}, {"0E(F(1", 'F'}, {"0E(F(E", 'F'}, {"0E(F(F", 'F'}, {"0E(F(N", 'F'}, {"0E(F(S", 'F'}, {"0E(F(V", 'F'}, {"0E(N&(", 'F'}, {"0E(N&1", 'F'}, {"0E(N&F", 'F'}, {"0E(N&N", 'F'}, {"0E(N&S", 'F'}, {"0E(N&V", 'F'}, {"0E(N(1", 'F'}, {"0E(N(F", 'F'}, {"0E(N(S", 'F'}, {"0E(N(V", 'F'}, {"0E(N)&", 'F'}, {"0E(N),", 'F'}, {"0E(N)1", 'F'}, {"0E(N);", 'F'}, {"0E(N)B", 'F'}, {"0E(N)C", 'F'}, {"0E(N)F", 'F'}, {"0E(N)K", 'F'}, {"0E(N)N", 'F'}, {"0E(N)O", 'F'}, {"0E(N)S", 'F'}, {"0E(N)U", 'F'}, {"0E(N)V", 'F'}, {"0E(N,F", 'F'}, {"0E(N1)", 'F'}, {"0E(N1O", 'F'}, {"0E(NF(", 'F'}, {"0E(NO(", 'F'}, {"0E(NOF", 'F'}, {"0E(NOS", 'F'}, {"0E(NOV", 'F'}, {"0E(S&(", 'F'}, {"0E(S&1", 'F'}, {"0E(S&F", 'F'}, {"0E(S&N", 'F'}, {"0E(S&S", 'F'}, {"0E(S&V", 'F'}, {"0E(S)&", 'F'}, {"0E(S),", 'F'}, {"0E(S)1", 'F'}, {"0E(S);", 'F'}, {"0E(S)B", 'F'}, {"0E(S)C", 'F'}, {"0E(S)F", 'F'}, {"0E(S)K", 'F'}, {"0E(S)N", 'F'}, {"0E(S)O", 'F'}, {"0E(S)S", 'F'}, {"0E(S)U", 'F'}, {"0E(S)V", 'F'}, {"0E(S,F", 'F'}, {"0E(S1)", 'F'}, {"0E(SF(", 'F'}, {"0E(SO(", 'F'}, {"0E(SO1", 'F'}, {"0E(SOF", 'F'}, {"0E(SON", 'F'}, {"0E(SOS", 'F'}, {"0E(SOV", 'F'}, {"0E(SV)", 'F'}, {"0E(SVO", 'F'}, {"0E(V&(", 'F'}, {"0E(V&1", 'F'}, {"0E(V&F", 'F'}, {"0E(V&N", 'F'}, {"0E(V&S", 'F'}, {"0E(V&V", 'F'}, {"0E(V)&", 'F'}, {"0E(V),", 'F'}, {"0E(V)1", 'F'}, {"0E(V);", 'F'}, {"0E(V)B", 'F'}, {"0E(V)C", 'F'}, {"0E(V)F", 'F'}, {"0E(V)K", 'F'}, {"0E(V)N", 'F'}, {"0E(V)O", 'F'}, {"0E(V)S", 'F'}, {"0E(V)U", 'F'}, {"0E(V)V", 'F'}, {"0E(V,F", 'F'}, {"0E(VF(", 'F'}, {"0E(VO(", 'F'}, {"0E(VOF", 'F'}, {"0E(VOS", 'F'}, {"0E(VS)", 'F'}, {"0E(VSO", 'F'}, {"0E1&(1", 'F'}, {"0E1&(E", 'F'}, {"0E1&(F", 'F'}, {"0E1&(N", 'F'}, {"0E1&(S", 'F'}, {"0E1&(V", 'F'}, {"0E1&1)", 'F'}, {"0E1&1O", 'F'}, {"0E1&F(", 'F'}, {"0E1&N)", 'F'}, {"0E1&NO", 'F'}, {"0E1&S)", 'F'}, {"0E1&SO", 'F'}, {"0E1&V)", 'F'}, {"0E1&VO", 'F'}, {"0E1)", 'F'}, {"0E1)&(", 'F'}, {"0E1)&1", 'F'}, {"0E1)&F", 'F'}, {"0E1)&N", 'F'}, {"0E1)&S", 'F'}, {"0E1)&V", 'F'}, {"0E1);", 'F'}, {"0E1);(", 'F'}, {"0E1);C", 'F'}, {"0E1);E", 'F'}, {"0E1);T", 'F'}, {"0E1)C", 'F'}, {"0E1)KN", 'F'}, {"0E1)O(", 'F'}, {"0E1)O1", 'F'}, {"0E1)OF", 'F'}, {"0E1)ON", 'F'}, {"0E1)OS", 'F'}, {"0E1)OV", 'F'}, {"0E1)UE", 'F'}, {"0E1,(1", 'F'}, {"0E1,(F", 'F'}, {"0E1,(N", 'F'}, {"0E1,(S", 'F'}, {"0E1,(V", 'F'}, {"0E1,F(", 'F'}, {"0E1;(E", 'F'}, {"0E1B(1", 'F'}, {"0E1B(F", 'F'}, {"0E1B(N", 'F'}, {"0E1B(S", 'F'}, {"0E1B(V", 'F'}, {"0E1B1)", 'F'}, {"0E1B1O", 'F'}, {"0E1BF(", 'F'}, {"0E1BN)", 'F'}, {"0E1BNO", 'F'}, {"0E1BS)", 'F'}, {"0E1BSO", 'F'}, {"0E1BV)", 'F'}, {"0E1BVO", 'F'}, {"0E1F()", 'F'}, {"0E1F(1", 'F'}, {"0E1F(F", 'F'}, {"0E1F(N", 'F'}, {"0E1F(S", 'F'}, {"0E1F(V", 'F'}, {"0E1K(1", 'F'}, {"0E1K(E", 'F'}, {"0E1K(F", 'F'}, {"0E1K(N", 'F'}, {"0E1K(S", 'F'}, {"0E1K(V", 'F'}, {"0E1K1)", 'F'}, {"0E1K1K", 'F'}, {"0E1K1O", 'F'}, {"0E1KF(", 'F'}, {"0E1KN", 'F'}, {"0E1KN)", 'F'}, {"0E1KN;", 'F'}, {"0E1KNC", 'F'}, {"0E1KNK", 'F'}, {"0E1KNU", 'F'}, {"0E1KS)", 'F'}, {"0E1KSK", 'F'}, {"0E1KSO", 'F'}, {"0E1KV)", 'F'}, {"0E1KVK", 'F'}, {"0E1KVO", 'F'}, {"0E1N)U", 'F'}, {"0E1N;", 'F'}, {"0E1N;C", 'F'}, {"0E1NC", 'F'}, {"0E1NKN", 'F'}, {"0E1O(1", 'F'}, {"0E1O(E", 'F'}, {"0E1O(F", 'F'}, {"0E1O(N", 'F'}, {"0E1O(S", 'F'}, {"0E1O(V", 'F'}, {"0E1OF(", 'F'}, {"0E1OS&", 'F'}, {"0E1OS(", 'F'}, {"0E1OS)", 'F'}, {"0E1OS,", 'F'}, {"0E1OS1", 'F'}, {"0E1OS;", 'F'}, {"0E1OSB", 'F'}, {"0E1OSF", 'F'}, {"0E1OSK", 'F'}, {"0E1OSU", 'F'}, {"0E1OSV", 'F'}, {"0E1OV&", 'F'}, {"0E1OV(", 'F'}, {"0E1OV)", 'F'}, {"0E1OV,", 'F'}, {"0E1OV;", 'F'}, {"0E1OVB", 'F'}, {"0E1OVF", 'F'}, {"0E1OVK", 'F'}, {"0E1OVO", 'F'}, {"0E1OVS", 'F'}, {"0E1OVU", 'F'}, {"0E1S;", 'F'}, {"0E1S;C", 'F'}, {"0E1SC", 'F'}, {"0E1U(E", 'F'}, {"0E1UE(", 'F'}, {"0E1UE1", 'F'}, {"0E1UEF", 'F'}, {"0E1UEK", 'F'}, {"0E1UEN", 'F'}, {"0E1UES", 'F'}, {"0E1UEV", 'F'}, {"0E1V", 'F'}, {"0E1V;", 'F'}, {"0E1V;C", 'F'}, {"0E1VC", 'F'}, {"0E1VO(", 'F'}, {"0E1VOF", 'F'}, {"0E1VOS", 'F'}, {"0EE(F(", 'F'}, {"0EEK(F", 'F'}, {"0EF()&", 'F'}, {"0EF(),", 'F'}, {"0EF()1", 'F'}, {"0EF();", 'F'}, {"0EF()B", 'F'}, {"0EF()F", 'F'}, {"0EF()K", 'F'}, {"0EF()N", 'F'}, {"0EF()O", 'F'}, {"0EF()S", 'F'}, {"0EF()U", 'F'}, {"0EF()V", 'F'}, {"0EF(1&", 'F'}, {"0EF(1)", 'F'}, {"0EF(1,", 'F'}, {"0EF(1O", 'F'}, {"0EF(E(", 'F'}, {"0EF(E1", 'F'}, {"0EF(EF", 'F'}, {"0EF(EK", 'F'}, {"0EF(EN", 'F'}, {"0EF(ES", 'F'}, {"0EF(EV", 'F'}, {"0EF(F(", 'F'}, {"0EF(N&", 'F'}, {"0EF(N)", 'F'}, {"0EF(N,", 'F'}, {"0EF(NO", 'F'}, {"0EF(O)", 'F'}, {"0EF(S&", 'F'}, {"0EF(S)", 'F'}, {"0EF(S,", 'F'}, {"0EF(SO", 'F'}, {"0EF(V&", 'F'}, {"0EF(V)", 'F'}, {"0EF(V,", 'F'}, {"0EF(VO", 'F'}, {"0EK(1&", 'F'}, {"0EK(1(", 'F'}, {"0EK(1)", 'F'}, {"0EK(1,", 'F'}, {"0EK(1F", 'F'}, {"0EK(1N", 'F'}, {"0EK(1O", 'F'}, {"0EK(1S", 'F'}, {"0EK(1V", 'F'}, {"0EK(E(", 'F'}, {"0EK(E1", 'F'}, {"0EK(EF", 'F'}, {"0EK(EK", 'F'}, {"0EK(EN", 'F'}, {"0EK(ES", 'F'}, {"0EK(EV", 'F'}, {"0EK(F(", 'F'}, {"0EK(N&", 'F'}, {"0EK(N(", 'F'}, {"0EK(N)", 'F'}, {"0EK(N,", 'F'}, {"0EK(N1", 'F'}, {"0EK(NF", 'F'}, {"0EK(NO", 'F'}, {"0EK(S&", 'F'}, {"0EK(S(", 'F'}, {"0EK(S)", 'F'}, {"0EK(S,", 'F'}, {"0EK(S1", 'F'}, {"0EK(SF", 'F'}, {"0EK(SO", 'F'}, {"0EK(SV", 'F'}, {"0EK(V&", 'F'}, {"0EK(V(", 'F'}, {"0EK(V)", 'F'}, {"0EK(V,", 'F'}, {"0EK(VF", 'F'}, {"0EK(VO", 'F'}, {"0EK(VS", 'F'}, {"0EK1&(", 'F'}, {"0EK1&1", 'F'}, {"0EK1&F", 'F'}, {"0EK1&N", 'F'}, {"0EK1&S", 'F'}, {"0EK1&V", 'F'}, {"0EK1)", 'F'}, {"0EK1)&", 'F'}, {"0EK1);", 'F'}, {"0EK1)C", 'F'}, {"0EK1)K", 'F'}, {"0EK1)O", 'F'}, {"0EK1)U", 'F'}, {"0EK1,(", 'F'}, {"0EK1,F", 'F'}, {"0EK1;(", 'F'}, {"0EK1B(", 'F'}, {"0EK1B1", 'F'}, {"0EK1BF", 'F'}, {"0EK1BN", 'F'}, {"0EK1BS", 'F'}, {"0EK1BV", 'F'}, {"0EK1F(", 'F'}, {"0EK1K(", 'F'}, {"0EK1K1", 'F'}, {"0EK1KF", 'F'}, {"0EK1KN", 'F'}, {"0EK1KS", 'F'}, {"0EK1KV", 'F'}, {"0EK1N", 'F'}, {"0EK1N)", 'F'}, {"0EK1N;", 'F'}, {"0EK1NC", 'F'}, {"0EK1NK", 'F'}, {"0EK1O(", 'F'}, {"0EK1OF", 'F'}, {"0EK1OS", 'F'}, {"0EK1OV", 'F'}, {"0EK1S", 'F'}, {"0EK1S;", 'F'}, {"0EK1SC", 'F'}, {"0EK1SF", 'F'}, {"0EK1SK", 'F'}, {"0EK1U(", 'F'}, {"0EK1UE", 'F'}, {"0EK1V", 'F'}, {"0EK1V;", 'F'}, {"0EK1VC", 'F'}, {"0EK1VF", 'F'}, {"0EK1VK", 'F'}, {"0EK1VO", 'F'}, {"0EKE(F", 'F'}, {"0EKEK(", 'F'}, {"0EKF()", 'F'}, {"0EKF(1", 'F'}, {"0EKF(E", 'F'}, {"0EKF(F", 'F'}, {"0EKF(N", 'F'}, {"0EKF(O", 'F'}, {"0EKF(S", 'F'}, {"0EKF(V", 'F'}, {"0EKN&(", 'F'}, {"0EKN&1", 'F'}, {"0EKN&F", 'F'}, {"0EKN&N", 'F'}, {"0EKN&S", 'F'}, {"0EKN&V", 'F'}, {"0EKN(1", 'F'}, {"0EKN(F", 'F'}, {"0EKN(S", 'F'}, {"0EKN(V", 'F'}, {"0EKN)", 'F'}, {"0EKN)&", 'F'}, {"0EKN);", 'F'}, {"0EKN)C", 'F'}, {"0EKN)K", 'F'}, {"0EKN)O", 'F'}, {"0EKN)U", 'F'}, {"0EKN,(", 'F'}, {"0EKN,F", 'F'}, {"0EKN1", 'F'}, {"0EKN1;", 'F'}, {"0EKN1C", 'F'}, {"0EKN1K", 'F'}, {"0EKN1O", 'F'}, {"0EKN;(", 'F'}, {"0EKNB(", 'F'}, {"0EKNB1", 'F'}, {"0EKNBF", 'F'}, {"0EKNBN", 'F'}, {"0EKNBS", 'F'}, {"0EKNBV", 'F'}, {"0EKNF(", 'F'}, {"0EKNK(", 'F'}, {"0EKNK1", 'F'}, {"0EKNKF", 'F'}, {"0EKNKN", 'F'}, {"0EKNKS", 'F'}, {"0EKNKV", 'F'}, {"0EKNU(", 'F'}, {"0EKNUE", 'F'}, {"0EKO(1", 'F'}, {"0EKO(F", 'F'}, {"0EKO(N", 'F'}, {"0EKO(S", 'F'}, {"0EKO(V", 'F'}, {"0EKOK(", 'F'}, {"0EKOKN", 'F'}, {"0EKS&(", 'F'}, {"0EKS&1", 'F'}, {"0EKS&F", 'F'}, {"0EKS&N", 'F'}, {"0EKS&S", 'F'}, {"0EKS&V", 'F'}, {"0EKS)", 'F'}, {"0EKS)&", 'F'}, {"0EKS);", 'F'}, {"0EKS)C", 'F'}, {"0EKS)K", 'F'}, {"0EKS)O", 'F'}, {"0EKS)U", 'F'}, {"0EKS,(", 'F'}, {"0EKS,F", 'F'}, {"0EKS1", 'F'}, {"0EKS1;", 'F'}, {"0EKS1C", 'F'}, {"0EKS1F", 'F'}, {"0EKS1K", 'F'}, {"0EKS;(", 'F'}, {"0EKSB(", 'F'}, {"0EKSB1", 'F'}, {"0EKSBF", 'F'}, {"0EKSBN", 'F'}, {"0EKSBS", 'F'}, {"0EKSBV", 'F'}, {"0EKSF(", 'F'}, {"0EKSK(", 'F'}, {"0EKSK1", 'F'}, {"0EKSKF", 'F'}, {"0EKSKN", 'F'}, {"0EKSKS", 'F'}, {"0EKSKV", 'F'}, {"0EKSO(", 'F'}, {"0EKSO1", 'F'}, {"0EKSOF", 'F'}, {"0EKSON", 'F'}, {"0EKSOS", 'F'}, {"0EKSOV", 'F'}, {"0EKSU(", 'F'}, {"0EKSUE", 'F'}, {"0EKSV", 'F'}, {"0EKSV;", 'F'}, {"0EKSVC", 'F'}, {"0EKSVF", 'F'}, {"0EKSVK", 'F'}, {"0EKSVO", 'F'}, {"0EKV&(", 'F'}, {"0EKV&1", 'F'}, {"0EKV&F", 'F'}, {"0EKV&N", 'F'}, {"0EKV&S", 'F'}, {"0EKV&V", 'F'}, {"0EKV)", 'F'}, {"0EKV)&", 'F'}, {"0EKV);", 'F'}, {"0EKV)C", 'F'}, {"0EKV)K", 'F'}, {"0EKV)O", 'F'}, {"0EKV)U", 'F'}, {"0EKV,(", 'F'}, {"0EKV,F", 'F'}, {"0EKV;(", 'F'}, {"0EKVB(", 'F'}, {"0EKVB1", 'F'}, {"0EKVBF", 'F'}, {"0EKVBN", 'F'}, {"0EKVBS", 'F'}, {"0EKVBV", 'F'}, {"0EKVF(", 'F'}, {"0EKVK(", 'F'}, {"0EKVK1", 'F'}, {"0EKVKF", 'F'}, {"0EKVKN", 'F'}, {"0EKVKS", 'F'}, {"0EKVKV", 'F'}, {"0EKVO(", 'F'}, {"0EKVOF", 'F'}, {"0EKVOS", 'F'}, {"0EKVS", 'F'}, {"0EKVS;", 'F'}, {"0EKVSC", 'F'}, {"0EKVSF", 'F'}, {"0EKVSK", 'F'}, {"0EKVSO", 'F'}, {"0EKVU(", 'F'}, {"0EKVUE", 'F'}, {"0EN&(1", 'F'}, {"0EN&(E", 'F'}, {"0EN&(F", 'F'}, {"0EN&(N", 'F'}, {"0EN&(S", 'F'}, {"0EN&(V", 'F'}, {"0EN&1)", 'F'}, {"0EN&1O", 'F'}, {"0EN&F(", 'F'}, {"0EN&N)", 'F'}, {"0EN&NO", 'F'}, {"0EN&S)", 'F'}, {"0EN&SO", 'F'}, {"0EN&V)", 'F'}, {"0EN&VO", 'F'}, {"0EN(1O", 'F'}, {"0EN(F(", 'F'}, {"0EN(S)", 'F'}, {"0EN(SO", 'F'}, {"0EN(V)", 'F'}, {"0EN(VO", 'F'}, {"0EN)", 'F'}, {"0EN)&(", 'F'}, {"0EN)&1", 'F'}, {"0EN)&F", 'F'}, {"0EN)&N", 'F'}, {"0EN)&S", 'F'}, {"0EN)&V", 'F'}, {"0EN);", 'F'}, {"0EN);(", 'F'}, {"0EN);C", 'F'}, {"0EN);E", 'F'}, {"0EN);T", 'F'}, {"0EN)C", 'F'}, {"0EN)KN", 'F'}, {"0EN)O(", 'F'}, {"0EN)O1", 'F'}, {"0EN)OF", 'F'}, {"0EN)ON", 'F'}, {"0EN)OS", 'F'}, {"0EN)OV", 'F'}, {"0EN)UE", 'F'}, {"0EN,(1", 'F'}, {"0EN,(F", 'F'}, {"0EN,(N", 'F'}, {"0EN,(S", 'F'}, {"0EN,(V", 'F'}, {"0EN,F(", 'F'}, {"0EN1;", 'F'}, {"0EN1;C", 'F'}, {"0EN1O(", 'F'}, {"0EN1OF", 'F'}, {"0EN1OS", 'F'}, {"0EN1OV", 'F'}, {"0EN;(E", 'F'}, {"0ENB(1", 'F'}, {"0ENB(F", 'F'}, {"0ENB(N", 'F'}, {"0ENB(S", 'F'}, {"0ENB(V", 'F'}, {"0ENB1)", 'F'}, {"0ENB1O", 'F'}, {"0ENBF(", 'F'}, {"0ENBN)", 'F'}, {"0ENBNO", 'F'}, {"0ENBS)", 'F'}, {"0ENBSO", 'F'}, {"0ENBV)", 'F'}, {"0ENBVO", 'F'}, {"0ENF()", 'F'}, {"0ENF(1", 'F'}, {"0ENF(F", 'F'}, {"0ENF(N", 'F'}, {"0ENF(S", 'F'}, {"0ENF(V", 'F'}, {"0ENK(1", 'F'}, {"0ENK(E", 'F'}, {"0ENK(F", 'F'}, {"0ENK(N", 'F'}, {"0ENK(S", 'F'}, {"0ENK(V", 'F'}, {"0ENK1)", 'F'}, {"0ENK1K", 'F'}, {"0ENK1O", 'F'}, {"0ENKF(", 'F'}, {"0ENKN)", 'F'}, {"0ENKN,", 'F'}, {"0ENKN;", 'F'}, {"0ENKNB", 'F'}, {"0ENKNC", 'F'}, {"0ENKNK", 'F'}, {"0ENKNU", 'F'}, {"0ENKS)", 'F'}, {"0ENKSK", 'F'}, {"0ENKSO", 'F'}, {"0ENKV)", 'F'}, {"0ENKVK", 'F'}, {"0ENKVO", 'F'}, {"0ENO(1", 'F'}, {"0ENO(E", 'F'}, {"0ENO(F", 'F'}, {"0ENO(N", 'F'}, {"0ENO(S", 'F'}, {"0ENO(V", 'F'}, {"0ENOF(", 'F'}, {"0ENOS&", 'F'}, {"0ENOS(", 'F'}, {"0ENOS)", 'F'}, {"0ENOS,", 'F'}, {"0ENOS1", 'F'}, {"0ENOS;", 'F'}, {"0ENOSB", 'F'}, {"0ENOSF", 'F'}, {"0ENOSK", 'F'}, {"0ENOSU", 'F'}, {"0ENOSV", 'F'}, {"0ENOV&", 'F'}, {"0ENOV(", 'F'}, {"0ENOV)", 'F'}, {"0ENOV,", 'F'}, {"0ENOV;", 'F'}, {"0ENOVB", 'F'}, {"0ENOVF", 'F'}, {"0ENOVK", 'F'}, {"0ENOVO", 'F'}, {"0ENOVS", 'F'}, {"0ENOVU", 'F'}, {"0ENU(E", 'F'}, {"0ENUE(", 'F'}, {"0ENUE1", 'F'}, {"0ENUEF", 'F'}, {"0ENUEK", 'F'}, {"0ENUEN", 'F'}, {"0ENUES", 'F'}, {"0ENUEV", 'F'}, {"0EOK(E", 'F'}, {"0EOKNK", 'F'}, {"0ES&(1", 'F'}, {"0ES&(E", 'F'}, {"0ES&(F", 'F'}, {"0ES&(N", 'F'}, {"0ES&(S", 'F'}, {"0ES&(V", 'F'}, {"0ES&1)", 'F'}, {"0ES&1O", 'F'}, {"0ES&F(", 'F'}, {"0ES&N)", 'F'}, {"0ES&NO", 'F'}, {"0ES&S)", 'F'}, {"0ES&SO", 'F'}, {"0ES&V)", 'F'}, {"0ES&VO", 'F'}, {"0ES)", 'F'}, {"0ES)&(", 'F'}, {"0ES)&1", 'F'}, {"0ES)&F", 'F'}, {"0ES)&N", 'F'}, {"0ES)&S", 'F'}, {"0ES)&V", 'F'}, {"0ES);", 'F'}, {"0ES);(", 'F'}, {"0ES);C", 'F'}, {"0ES);E", 'F'}, {"0ES);T", 'F'}, {"0ES)C", 'F'}, {"0ES)KN", 'F'}, {"0ES)O(", 'F'}, {"0ES)O1", 'F'}, {"0ES)OF", 'F'}, {"0ES)ON", 'F'}, {"0ES)OS", 'F'}, {"0ES)OV", 'F'}, {"0ES)UE", 'F'}, {"0ES,(1", 'F'}, {"0ES,(F", 'F'}, {"0ES,(N", 'F'}, {"0ES,(S", 'F'}, {"0ES,(V", 'F'}, {"0ES,F(", 'F'}, {"0ES1", 'F'}, {"0ES1;", 'F'}, {"0ES1;C", 'F'}, {"0ES1C", 'F'}, {"0ES;(E", 'F'}, {"0ESB(1", 'F'}, {"0ESB(F", 'F'}, {"0ESB(N", 'F'}, {"0ESB(S", 'F'}, {"0ESB(V", 'F'}, {"0ESB1)", 'F'}, {"0ESB1O", 'F'}, {"0ESBF(", 'F'}, {"0ESBN)", 'F'}, {"0ESBNO", 'F'}, {"0ESBS)", 'F'}, {"0ESBSO", 'F'}, {"0ESBV)", 'F'}, {"0ESBVO", 'F'}, {"0ESF()", 'F'}, {"0ESF(1", 'F'}, {"0ESF(F", 'F'}, {"0ESF(N", 'F'}, {"0ESF(S", 'F'}, {"0ESF(V", 'F'}, {"0ESK(1", 'F'}, {"0ESK(E", 'F'}, {"0ESK(F", 'F'}, {"0ESK(N", 'F'}, {"0ESK(S", 'F'}, {"0ESK(V", 'F'}, {"0ESK1)", 'F'}, {"0ESK1K", 'F'}, {"0ESK1O", 'F'}, {"0ESKF(", 'F'}, {"0ESKN", 'F'}, {"0ESKN)", 'F'}, {"0ESKN;", 'F'}, {"0ESKNC", 'F'}, {"0ESKNK", 'F'}, {"0ESKNU", 'F'}, {"0ESKS)", 'F'}, {"0ESKSK", 'F'}, {"0ESKSO", 'F'}, {"0ESKV)", 'F'}, {"0ESKVK", 'F'}, {"0ESKVO", 'F'}, {"0ESO(1", 'F'}, {"0ESO(E", 'F'}, {"0ESO(F", 'F'}, {"0ESO(N", 'F'}, {"0ESO(S", 'F'}, {"0ESO(V", 'F'}, {"0ESO1&", 'F'}, {"0ESO1(", 'F'}, {"0ESO1)", 'F'}, {"0ESO1,", 'F'}, {"0ESO1;", 'F'}, {"0ESO1B", 'F'}, {"0ESO1F", 'F'}, {"0ESO1K", 'F'}, {"0ESO1N", 'F'}, {"0ESO1S", 'F'}, {"0ESO1U", 'F'}, {"0ESO1V", 'F'}, {"0ESOF(", 'F'}, {"0ESON&", 'F'}, {"0ESON(", 'F'}, {"0ESON)", 'F'}, {"0ESON,", 'F'}, {"0ESON1", 'F'}, {"0ESON;", 'F'}, {"0ESONB", 'F'}, {"0ESONF", 'F'}, {"0ESONK", 'F'}, {"0ESONU", 'F'}, {"0ESOS&", 'F'}, {"0ESOS(", 'F'}, {"0ESOS)", 'F'}, {"0ESOS,", 'F'}, {"0ESOS1", 'F'}, {"0ESOS;", 'F'}, {"0ESOSB", 'F'}, {"0ESOSF", 'F'}, {"0ESOSK", 'F'}, {"0ESOSU", 'F'}, {"0ESOSV", 'F'}, {"0ESOV&", 'F'}, {"0ESOV(", 'F'}, {"0ESOV)", 'F'}, {"0ESOV,", 'F'}, {"0ESOV;", 'F'}, {"0ESOVB", 'F'}, {"0ESOVF", 'F'}, {"0ESOVK", 'F'}, {"0ESOVO", 'F'}, {"0ESOVS", 'F'}, {"0ESOVU", 'F'}, {"0ESU(E", 'F'}, {"0ESUE(", 'F'}, {"0ESUE1", 'F'}, {"0ESUEF", 'F'}, {"0ESUEK", 'F'}, {"0ESUEN", 'F'}, {"0ESUES", 'F'}, {"0ESUEV", 'F'}, {"0ESV", 'F'}, {"0ESV;", 'F'}, {"0ESV;C", 'F'}, {"0ESVC", 'F'}, {"0ESVO(", 'F'}, {"0ESVOF", 'F'}, {"0ESVOS", 'F'}, {"0EV&(1", 'F'}, {"0EV&(E", 'F'}, {"0EV&(F", 'F'}, {"0EV&(N", 'F'}, {"0EV&(S", 'F'}, {"0EV&(V", 'F'}, {"0EV&1)", 'F'}, {"0EV&1O", 'F'}, {"0EV&F(", 'F'}, {"0EV&N)", 'F'}, {"0EV&NO", 'F'}, {"0EV&S)", 'F'}, {"0EV&SO", 'F'}, {"0EV&V)", 'F'}, {"0EV&VO", 'F'}, {"0EV)", 'F'}, {"0EV)&(", 'F'}, {"0EV)&1", 'F'}, {"0EV)&F", 'F'}, {"0EV)&N", 'F'}, {"0EV)&S", 'F'}, {"0EV)&V", 'F'}, {"0EV);", 'F'}, {"0EV);(", 'F'}, {"0EV);C", 'F'}, {"0EV);E", 'F'}, {"0EV);T", 'F'}, {"0EV)C", 'F'}, {"0EV)KN", 'F'}, {"0EV)O(", 'F'}, {"0EV)O1", 'F'}, {"0EV)OF", 'F'}, {"0EV)ON", 'F'}, {"0EV)OS", 'F'}, {"0EV)OV", 'F'}, {"0EV)UE", 'F'}, {"0EV,(1", 'F'}, {"0EV,(F", 'F'}, {"0EV,(N", 'F'}, {"0EV,(S", 'F'}, {"0EV,(V", 'F'}, {"0EV,F(", 'F'}, {"0EV;(E", 'F'}, {"0EVB(1", 'F'}, {"0EVB(F", 'F'}, {"0EVB(N", 'F'}, {"0EVB(S", 'F'}, {"0EVB(V", 'F'}, {"0EVB1)", 'F'}, {"0EVB1O", 'F'}, {"0EVBF(", 'F'}, {"0EVBN)", 'F'}, {"0EVBNO", 'F'}, {"0EVBS)", 'F'}, {"0EVBSO", 'F'}, {"0EVBV)", 'F'}, {"0EVBVO", 'F'}, {"0EVF()", 'F'}, {"0EVF(1", 'F'}, {"0EVF(F", 'F'}, {"0EVF(N", 'F'}, {"0EVF(S", 'F'}, {"0EVF(V", 'F'}, {"0EVK(1", 'F'}, {"0EVK(E", 'F'}, {"0EVK(F", 'F'}, {"0EVK(N", 'F'}, {"0EVK(S", 'F'}, {"0EVK(V", 'F'}, {"0EVK1)", 'F'}, {"0EVK1K", 'F'}, {"0EVK1O", 'F'}, {"0EVKF(", 'F'}, {"0EVKN", 'F'}, {"0EVKN)", 'F'}, {"0EVKN;", 'F'}, {"0EVKNC", 'F'}, {"0EVKNK", 'F'}, {"0EVKNU", 'F'}, {"0EVKS)", 'F'}, {"0EVKSK", 'F'}, {"0EVKSO", 'F'}, {"0EVKV)", 'F'}, {"0EVKVK", 'F'}, {"0EVKVO", 'F'}, {"0EVN", 'F'}, {"0EVN)U", 'F'}, {"0EVN;", 'F'}, {"0EVN;C", 'F'}, {"0EVNC", 'F'}, {"0EVNKN", 'F'}, {"0EVNO(", 'F'}, {"0EVNOF", 'F'}, {"0EVNOS", 'F'}, {"0EVNOV", 'F'}, {"0EVO(1", 'F'}, {"0EVO(E", 'F'}, {"0EVO(F", 'F'}, {"0EVO(N", 'F'}, {"0EVO(S", 'F'}, {"0EVO(V", 'F'}, {"0EVOF(", 'F'}, {"0EVOS&", 'F'}, {"0EVOS(", 'F'}, {"0EVOS)", 'F'}, {"0EVOS,", 'F'}, {"0EVOS1", 'F'}, {"0EVOS;", 'F'}, {"0EVOSB", 'F'}, {"0EVOSF", 'F'}, {"0EVOSK", 'F'}, {"0EVOSU", 'F'}, {"0EVOSV", 'F'}, {"0EVS", 'F'}, {"0EVS;", 'F'}, {"0EVS;C", 'F'}, {"0EVSC", 'F'}, {"0EVSO(", 'F'}, {"0EVSO1", 'F'}, {"0EVSOF", 'F'}, {"0EVSON", 'F'}, {"0EVSOS", 'F'}, {"0EVSOV", 'F'}, {"0EVU(E", 'F'}, {"0EVUE(", 'F'}, {"0EVUE1", 'F'}, {"0EVUEF", 'F'}, {"0EVUEK", 'F'}, {"0EVUEN", 'F'}, {"0EVUES", 'F'}, {"0EVUEV", 'F'}, {"0F()&(", 'F'}, {"0F()&1", 'F'}, {"0F()&E", 'F'}, {"0F()&F", 'F'}, {"0F()&K", 'F'}, {"0F()&N", 'F'}, {"0F()&S", 'F'}, {"0F()&V", 'F'}, {"0F(),(", 'F'}, {"0F(),1", 'F'}, {"0F(),F", 'F'}, {"0F(),N", 'F'}, {"0F(),S", 'F'}, {"0F(),V", 'F'}, {"0F()1(", 'F'}, {"0F()1F", 'F'}, {"0F()1N", 'F'}, {"0F()1O", 'F'}, {"0F()1S", 'F'}, {"0F()1U", 'F'}, {"0F()1V", 'F'}, {"0F();E", 'F'}, {"0F();N", 'F'}, {"0F();T", 'F'}, {"0F()A(", 'F'}, {"0F()AF", 'F'}, {"0F()AS", 'F'}, {"0F()AT", 'F'}, {"0F()AV", 'F'}, {"0F()B(", 'F'}, {"0F()B1", 'F'}, {"0F()BE", 'F'}, {"0F()BF", 'F'}, {"0F()BN", 'F'}, {"0F()BS", 'F'}, {"0F()BV", 'F'}, {"0F()C", 'F'}, {"0F()E(", 'F'}, {"0F()E1", 'F'}, {"0F()EF", 'F'}, {"0F()EK", 'F'}, {"0F()EN", 'F'}, {"0F()EO", 'F'}, {"0F()ES", 'F'}, {"0F()EU", 'F'}, {"0F()EV", 'F'}, {"0F()F(", 'F'}, {"0F()K(", 'F'}, {"0F()K)", 'F'}, {"0F()K1", 'F'}, {"0F()KF", 'F'}, {"0F()KN", 'F'}, {"0F()KS", 'F'}, {"0F()KU", 'F'}, {"0F()KV", 'F'}, {"0F()N&", 'F'}, {"0F()N(", 'F'}, {"0F()N)", 'F'}, {"0F()N,", 'F'}, {"0F()N1", 'F'}, {"0F()NE", 'F'}, {"0F()NF", 'F'}, {"0F()NO", 'F'}, {"0F()NU", 'F'}, {"0F()O(", 'F'}, {"0F()O1", 'F'}, {"0F()OF", 'F'}, {"0F()OK", 'F'}, {"0F()ON", 'F'}, {"0F()OS", 'F'}, {"0F()OU", 'F'}, {"0F()OV", 'F'}, {"0F()S(", 'F'}, {"0F()S1", 'F'}, {"0F()SF", 'F'}, {"0F()SO", 'F'}, {"0F()SU", 'F'}, {"0F()SV", 'F'}, {"0F()T(", 'F'}, {"0F()T1", 'F'}, {"0F()TE", 'F'}, {"0F()TF", 'F'}, {"0F()TN", 'F'}, {"0F()TS", 'F'}, {"0F()TT", 'F'}, {"0F()TV", 'F'}, {"0F()U", 'F'}, {"0F()U(", 'F'}, {"0F()U1", 'F'}, {"0F()U;", 'F'}, {"0F()UC", 'F'}, {"0F()UE", 'F'}, {"0F()UF", 'F'}, {"0F()UK", 'F'}, {"0F()UO", 'F'}, {"0F()US", 'F'}, {"0F()UT", 'F'}, {"0F()UV", 'F'}, {"0F()V(", 'F'}, {"0F()VF", 'F'}, {"0F()VO", 'F'}, {"0F()VS", 'F'}, {"0F()VU", 'F'}, {"0F(1&(", 'F'}, {"0F(1&1", 'F'}, {"0F(1&F", 'F'}, {"0F(1&N", 'F'}, {"0F(1&S", 'F'}, {"0F(1&V", 'F'}, {"0F(1)", 'F'}, {"0F(1)&", 'F'}, {"0F(1),", 'F'}, {"0F(1)1", 'F'}, {"0F(1);", 'F'}, {"0F(1)A", 'F'}, {"0F(1)B", 'F'}, {"0F(1)C", 'F'}, {"0F(1)E", 'F'}, {"0F(1)F", 'F'}, {"0F(1)K", 'F'}, {"0F(1)N", 'F'}, {"0F(1)O", 'F'}, {"0F(1)S", 'F'}, {"0F(1)T", 'F'}, {"0F(1)U", 'F'}, {"0F(1)V", 'F'}, {"0F(1,(", 'F'}, {"0F(1,F", 'F'}, {"0F(1O(", 'F'}, {"0F(1OF", 'F'}, {"0F(1OS", 'F'}, {"0F(1OV", 'F'}, {"0F(E(1", 'F'}, {"0F(E(E", 'F'}, {"0F(E(F", 'F'}, {"0F(E(N", 'F'}, {"0F(E(S", 'F'}, {"0F(E(V", 'F'}, {"0F(E1&", 'F'}, {"0F(E1)", 'F'}, {"0F(E1K", 'F'}, {"0F(E1O", 'F'}, {"0F(EF(", 'F'}, {"0F(EK(", 'F'}, {"0F(EK1", 'F'}, {"0F(EKF", 'F'}, {"0F(EKN", 'F'}, {"0F(EKO", 'F'}, {"0F(EKS", 'F'}, {"0F(EKV", 'F'}, {"0F(EN&", 'F'}, {"0F(EN)", 'F'}, {"0F(ENK", 'F'}, {"0F(ENO", 'F'}, {"0F(EOK", 'F'}, {"0F(ES&", 'F'}, {"0F(ES)", 'F'}, {"0F(ESK", 'F'}, {"0F(ESO", 'F'}, {"0F(EV&", 'F'}, {"0F(EV)", 'F'}, {"0F(EVK", 'F'}, {"0F(EVO", 'F'}, {"0F(F()", 'F'}, {"0F(F(1", 'F'}, {"0F(F(E", 'F'}, {"0F(F(F", 'F'}, {"0F(F(N", 'F'}, {"0F(F(S", 'F'}, {"0F(F(V", 'F'}, {"0F(K()", 'F'}, {"0F(K,(", 'F'}, {"0F(K,F", 'F'}, {"0F(N&(", 'F'}, {"0F(N&1", 'F'}, {"0F(N&F", 'F'}, {"0F(N&N", 'F'}, {"0F(N&S", 'F'}, {"0F(N&V", 'F'}, {"0F(N)", 'F'}, {"0F(N)&", 'F'}, {"0F(N),", 'F'}, {"0F(N)1", 'F'}, {"0F(N);", 'F'}, {"0F(N)A", 'F'}, {"0F(N)B", 'F'}, {"0F(N)C", 'F'}, {"0F(N)E", 'F'}, {"0F(N)F", 'F'}, {"0F(N)K", 'F'}, {"0F(N)N", 'F'}, {"0F(N)O", 'F'}, {"0F(N)S", 'F'}, {"0F(N)T", 'F'}, {"0F(N)U", 'F'}, {"0F(N)V", 'F'}, {"0F(N,(", 'F'}, {"0F(N,F", 'F'}, {"0F(NO(", 'F'}, {"0F(NOF", 'F'}, {"0F(NOS", 'F'}, {"0F(NOV", 'F'}, {"0F(S&(", 'F'}, {"0F(S&1", 'F'}, {"0F(S&F", 'F'}, {"0F(S&N", 'F'}, {"0F(S&S", 'F'}, {"0F(S&V", 'F'}, {"0F(S)", 'F'}, {"0F(S)&", 'F'}, {"0F(S),", 'F'}, {"0F(S)1", 'F'}, {"0F(S);", 'F'}, {"0F(S)A", 'F'}, {"0F(S)B", 'F'}, {"0F(S)C", 'F'}, {"0F(S)E", 'F'}, {"0F(S)F", 'F'}, {"0F(S)K", 'F'}, {"0F(S)N", 'F'}, {"0F(S)O", 'F'}, {"0F(S)S", 'F'}, {"0F(S)T", 'F'}, {"0F(S)U", 'F'}, {"0F(S)V", 'F'}, {"0F(S,(", 'F'}, {"0F(S,F", 'F'}, {"0F(SO(", 'F'}, {"0F(SO1", 'F'}, {"0F(SOF", 'F'}, {"0F(SON", 'F'}, {"0F(SOS", 'F'}, {"0F(SOV", 'F'}, {"0F(T,(", 'F'}, {"0F(T,F", 'F'}, {"0F(V&(", 'F'}, {"0F(V&1", 'F'}, {"0F(V&F", 'F'}, {"0F(V&N", 'F'}, {"0F(V&S", 'F'}, {"0F(V&V", 'F'}, {"0F(V)", 'F'}, {"0F(V)&", 'F'}, {"0F(V),", 'F'}, {"0F(V)1", 'F'}, {"0F(V);", 'F'}, {"0F(V)A", 'F'}, {"0F(V)B", 'F'}, {"0F(V)C", 'F'}, {"0F(V)E", 'F'}, {"0F(V)F", 'F'}, {"0F(V)K", 'F'}, {"0F(V)N", 'F'}, {"0F(V)O", 'F'}, {"0F(V)S", 'F'}, {"0F(V)T", 'F'}, {"0F(V)U", 'F'}, {"0F(V)V", 'F'}, {"0F(V,(", 'F'}, {"0F(V,F", 'F'}, {"0F(VO(", 'F'}, {"0F(VOF", 'F'}, {"0F(VOS", 'F'}, {"0K(1),", 'F'}, {"0K(1)A", 'F'}, {"0K(1)K", 'F'}, {"0K(1)O", 'F'}, {"0K(1O(", 'F'}, {"0K(1OF", 'F'}, {"0K(1OS", 'F'}, {"0K(1OV", 'F'}, {"0K(F()", 'F'}, {"0K(F(1", 'F'}, {"0K(F(F", 'F'}, {"0K(F(N", 'F'}, {"0K(F(S", 'F'}, {"0K(F(V", 'F'}, {"0K(N),", 'F'}, {"0K(N)A", 'F'}, {"0K(N)K", 'F'}, {"0K(N)O", 'F'}, {"0K(NO(", 'F'}, {"0K(NOF", 'F'}, {"0K(NOS", 'F'}, {"0K(NOV", 'F'}, {"0K(S),", 'F'}, {"0K(S)A", 'F'}, {"0K(S)K", 'F'}, {"0K(S)O", 'F'}, {"0K(SO(", 'F'}, {"0K(SO1", 'F'}, {"0K(SOF", 'F'}, {"0K(SON", 'F'}, {"0K(SOS", 'F'}, {"0K(SOV", 'F'}, {"0K(V),", 'F'}, {"0K(V)A", 'F'}, {"0K(V)K", 'F'}, {"0K(V)O", 'F'}, {"0K(VO(", 'F'}, {"0K(VOF", 'F'}, {"0K(VOS", 'F'}, {"0K1,(1", 'F'}, {"0K1,(F", 'F'}, {"0K1,(N", 'F'}, {"0K1,(S", 'F'}, {"0K1,(V", 'F'}, {"0K1,F(", 'F'}, {"0K1A(F", 'F'}, {"0K1A(N", 'F'}, {"0K1A(S", 'F'}, {"0K1A(V", 'F'}, {"0K1AF(", 'F'}, {"0K1ASO", 'F'}, {"0K1AVO", 'F'}, {"0K1K(1", 'F'}, {"0K1K(F", 'F'}, {"0K1K(N", 'F'}, {"0K1K(S", 'F'}, {"0K1K(V", 'F'}, {"0K1K1O", 'F'}, {"0K1K1U", 'F'}, {"0K1KF(", 'F'}, {"0K1KNU", 'F'}, {"0K1KSO", 'F'}, {"0K1KSU", 'F'}, {"0K1KVO", 'F'}, {"0K1KVU", 'F'}, {"0K1O(1", 'F'}, {"0K1O(F", 'F'}, {"0K1O(N", 'F'}, {"0K1O(S", 'F'}, {"0K1O(V", 'F'}, {"0K1OF(", 'F'}, {"0K1OS(", 'F'}, {"0K1OS,", 'F'}, {"0K1OS1", 'F'}, {"0K1OSA", 'F'}, {"0K1OSF", 'F'}, {"0K1OSK", 'F'}, {"0K1OSV", 'F'}, {"0K1OV(", 'F'}, {"0K1OV,", 'F'}, {"0K1OVA", 'F'}, {"0K1OVF", 'F'}, {"0K1OVK", 'F'}, {"0K1OVO", 'F'}, {"0K1OVS", 'F'}, {"0KF(),", 'F'}, {"0KF()A", 'F'}, {"0KF()K", 'F'}, {"0KF()O", 'F'}, {"0KF(1)", 'F'}, {"0KF(1O", 'F'}, {"0KF(F(", 'F'}, {"0KF(N)", 'F'}, {"0KF(NO", 'F'}, {"0KF(S)", 'F'}, {"0KF(SO", 'F'}, {"0KF(V)", 'F'}, {"0KF(VO", 'F'}, {"0KN,(1", 'F'}, {"0KN,(F", 'F'}, {"0KN,(N", 'F'}, {"0KN,(S", 'F'}, {"0KN,(V", 'F'}, {"0KN,F(", 'F'}, {"0KNA(F", 'F'}, {"0KNA(N", 'F'}, {"0KNA(S", 'F'}, {"0KNA(V", 'F'}, {"0KNAF(", 'F'}, {"0KNASO", 'F'}, {"0KNAVO", 'F'}, {"0KNK(1", 'F'}, {"0KNK(F", 'F'}, {"0KNK(N", 'F'}, {"0KNK(S", 'F'}, {"0KNK(V", 'F'}, {"0KNK1O", 'F'}, {"0KNK1U", 'F'}, {"0KNKF(", 'F'}, {"0KNKNU", 'F'}, {"0KNKSO", 'F'}, {"0KNKSU", 'F'}, {"0KNKVO", 'F'}, {"0KNKVU", 'F'}, {"0KS,(1", 'F'}, {"0KS,(F", 'F'}, {"0KS,(N", 'F'}, {"0KS,(S", 'F'}, {"0KS,(V", 'F'}, {"0KS,F(", 'F'}, {"0KSA(F", 'F'}, {"0KSA(N", 'F'}, {"0KSA(S", 'F'}, {"0KSA(V", 'F'}, {"0KSAF(", 'F'}, {"0KSASO", 'F'}, {"0KSAVO", 'F'}, {"0KSK(1", 'F'}, {"0KSK(F", 'F'}, {"0KSK(N", 'F'}, {"0KSK(S", 'F'}, {"0KSK(V", 'F'}, {"0KSK1O", 'F'}, {"0KSK1U", 'F'}, {"0KSKF(", 'F'}, {"0KSKNU", 'F'}, {"0KSKSO", 'F'}, {"0KSKSU", 'F'}, {"0KSKVO", 'F'}, {"0KSKVU", 'F'}, {"0KSO(1", 'F'}, {"0KSO(F", 'F'}, {"0KSO(N", 'F'}, {"0KSO(S", 'F'}, {"0KSO(V", 'F'}, {"0KSO1(", 'F'}, {"0KSO1,", 'F'}, {"0KSO1A", 'F'}, {"0KSO1F", 'F'}, {"0KSO1K", 'F'}, {"0KSO1N", 'F'}, {"0KSO1S", 'F'}, {"0KSO1V", 'F'}, {"0KSOF(", 'F'}, {"0KSON(", 'F'}, {"0KSON,", 'F'}, {"0KSON1", 'F'}, {"0KSONA", 'F'}, {"0KSONF", 'F'}, {"0KSONK", 'F'}, {"0KSOS(", 'F'}, {"0KSOS,", 'F'}, {"0KSOS1", 'F'}, {"0KSOSA", 'F'}, {"0KSOSF", 'F'}, {"0KSOSK", 'F'}, {"0KSOSV", 'F'}, {"0KSOV(", 'F'}, {"0KSOV,", 'F'}, {"0KSOVA", 'F'}, {"0KSOVF", 'F'}, {"0KSOVK", 'F'}, {"0KSOVO", 'F'}, {"0KSOVS", 'F'}, {"0KV,(1", 'F'}, {"0KV,(F", 'F'}, {"0KV,(N", 'F'}, {"0KV,(S", 'F'}, {"0KV,(V", 'F'}, {"0KV,F(", 'F'}, {"0KVA(F", 'F'}, {"0KVA(N", 'F'}, {"0KVA(S", 'F'}, {"0KVA(V", 'F'}, {"0KVAF(", 'F'}, {"0KVASO", 'F'}, {"0KVAVO", 'F'}, {"0KVK(1", 'F'}, {"0KVK(F", 'F'}, {"0KVK(N", 'F'}, {"0KVK(S", 'F'}, {"0KVK(V", 'F'}, {"0KVK1O", 'F'}, {"0KVK1U", 'F'}, {"0KVKF(", 'F'}, {"0KVKNU", 'F'}, {"0KVKSO", 'F'}, {"0KVKSU", 'F'}, {"0KVKVO", 'F'}, {"0KVKVU", 'F'}, {"0KVO(1", 'F'}, {"0KVO(F", 'F'}, {"0KVO(N", 'F'}, {"0KVO(S", 'F'}, {"0KVO(V", 'F'}, {"0KVOF(", 'F'}, {"0KVOS(", 'F'}, {"0KVOS,", 'F'}, {"0KVOS1", 'F'}, {"0KVOSA", 'F'}, {"0KVOSF", 'F'}, {"0KVOSK", 'F'}, {"0KVOSV", 'F'}, {"0N&(1&", 'F'}, {"0N&(1)", 'F'}, {"0N&(1,", 'F'}, {"0N&(1O", 'F'}, {"0N&(E(", 'F'}, {"0N&(E1", 'F'}, {"0N&(EF", 'F'}, {"0N&(EK", 'F'}, {"0N&(EN", 'F'}, {"0N&(EO", 'F'}, {"0N&(ES", 'F'}, {"0N&(EV", 'F'}, {"0N&(F(", 'F'}, {"0N&(N&", 'F'}, {"0N&(N)", 'F'}, {"0N&(N,", 'F'}, {"0N&(NO", 'F'}, {"0N&(S&", 'F'}, {"0N&(S)", 'F'}, {"0N&(S,", 'F'}, {"0N&(SO", 'F'}, {"0N&(V&", 'F'}, {"0N&(V)", 'F'}, {"0N&(V,", 'F'}, {"0N&(VO", 'F'}, {"0N&1", 'F'}, {"0N&1&(", 'F'}, {"0N&1&1", 'F'}, {"0N&1&F", 'F'}, {"0N&1&N", 'F'}, {"0N&1&S", 'F'}, {"0N&1&V", 'F'}, {"0N&1)&", 'F'}, {"0N&1)C", 'F'}, {"0N&1)O", 'F'}, {"0N&1)U", 'F'}, {"0N&1;", 'F'}, {"0N&1;C", 'F'}, {"0N&1;E", 'F'}, {"0N&1;T", 'F'}, {"0N&1B(", 'F'}, {"0N&1B1", 'F'}, {"0N&1BF", 'F'}, {"0N&1BN", 'F'}, {"0N&1BS", 'F'}, {"0N&1BV", 'F'}, {"0N&1C", 'F'}, {"0N&1EK", 'F'}, {"0N&1EN", 'F'}, {"0N&1F(", 'F'}, {"0N&1K(", 'F'}, {"0N&1K1", 'F'}, {"0N&1KF", 'F'}, {"0N&1KN", 'F'}, {"0N&1KS", 'F'}, {"0N&1KV", 'F'}, {"0N&1O(", 'F'}, {"0N&1OF", 'F'}, {"0N&1OS", 'F'}, {"0N&1OV", 'F'}, {"0N&1TN", 'F'}, {"0N&1U", 'F'}, {"0N&1U(", 'F'}, {"0N&1U;", 'F'}, {"0N&1UC", 'F'}, {"0N&1UE", 'F'}, {"0N&E(1", 'F'}, {"0N&E(F", 'F'}, {"0N&E(N", 'F'}, {"0N&E(O", 'F'}, {"0N&E(S", 'F'}, {"0N&E(V", 'F'}, {"0N&E1", 'F'}, {"0N&E1;", 'F'}, {"0N&E1C", 'F'}, {"0N&E1K", 'F'}, {"0N&E1O", 'F'}, {"0N&EF(", 'F'}, {"0N&EK(", 'F'}, {"0N&EK1", 'F'}, {"0N&EKF", 'F'}, {"0N&EKN", 'F'}, {"0N&EKS", 'F'}, {"0N&EKV", 'F'}, {"0N&EN;", 'F'}, {"0N&ENC", 'F'}, {"0N&ENK", 'F'}, {"0N&ENO", 'F'}, {"0N&ES", 'F'}, {"0N&ES;", 'F'}, {"0N&ESC", 'F'}, {"0N&ESK", 'F'}, {"0N&ESO", 'F'}, {"0N&EV", 'F'}, {"0N&EV;", 'F'}, {"0N&EVC", 'F'}, {"0N&EVK", 'F'}, {"0N&EVO", 'F'}, {"0N&F()", 'F'}, {"0N&F(1", 'F'}, {"0N&F(E", 'F'}, {"0N&F(F", 'F'}, {"0N&F(N", 'F'}, {"0N&F(S", 'F'}, {"0N&F(V", 'F'}, {"0N&K&(", 'F'}, {"0N&K&1", 'F'}, {"0N&K&F", 'F'}, {"0N&K&N", 'F'}, {"0N&K&S", 'F'}, {"0N&K&V", 'F'}, {"0N&K(1", 'F'}, {"0N&K(F", 'F'}, {"0N&K(N", 'F'}, {"0N&K(S", 'F'}, {"0N&K(V", 'F'}, {"0N&K1O", 'F'}, {"0N&KC", 'F'}, {"0N&KF(", 'F'}, {"0N&KNK", 'F'}, {"0N&KO(", 'F'}, {"0N&KO1", 'F'}, {"0N&KOF", 'F'}, {"0N&KOK", 'F'}, {"0N&KON", 'F'}, {"0N&KOS", 'F'}, {"0N&KOV", 'F'}, {"0N&KSO", 'F'}, {"0N&KVO", 'F'}, {"0N&N&(", 'F'}, {"0N&N&1", 'F'}, {"0N&N&F", 'F'}, {"0N&N&S", 'F'}, {"0N&N&V", 'F'}, {"0N&N)&", 'F'}, {"0N&N)C", 'F'}, {"0N&N)O", 'F'}, {"0N&N)U", 'F'}, {"0N&N;C", 'F'}, {"0N&N;E", 'F'}, {"0N&N;T", 'F'}, {"0N&NB(", 'F'}, {"0N&NB1", 'F'}, {"0N&NBF", 'F'}, {"0N&NBS", 'F'}, {"0N&NBV", 'F'}, {"0N&NF(", 'F'}, {"0N&NK(", 'F'}, {"0N&NK1", 'F'}, {"0N&NKF", 'F'}, {"0N&NKS", 'F'}, {"0N&NKV", 'F'}, {"0N&NO(", 'F'}, {"0N&NOF", 'F'}, {"0N&NOS", 'F'}, {"0N&NOV", 'F'}, {"0N&NU", 'F'}, {"0N&NU(", 'F'}, {"0N&NU;", 'F'}, {"0N&NUC", 'F'}, {"0N&NUE", 'F'}, {"0N&S&(", 'F'}, {"0N&S&1", 'F'}, {"0N&S&F", 'F'}, {"0N&S&N", 'F'}, {"0N&S&S", 'F'}, {"0N&S&V", 'F'}, {"0N&S)&", 'F'}, {"0N&S)C", 'F'}, {"0N&S)O", 'F'}, {"0N&S)U", 'F'}, {"0N&S1", 'F'}, {"0N&S1;", 'F'}, {"0N&S1C", 'F'}, {"0N&S;", 'F'}, {"0N&S;C", 'F'}, {"0N&S;E", 'F'}, {"0N&S;T", 'F'}, {"0N&SB(", 'F'}, {"0N&SB1", 'F'}, {"0N&SBF", 'F'}, {"0N&SBN", 'F'}, {"0N&SBS", 'F'}, {"0N&SBV", 'F'}, {"0N&SC", 'F'}, {"0N&SEK", 'F'}, {"0N&SEN", 'F'}, {"0N&SF(", 'F'}, {"0N&SK(", 'F'}, {"0N&SK1", 'F'}, {"0N&SKF", 'F'}, {"0N&SKN", 'F'}, {"0N&SKS", 'F'}, {"0N&SKV", 'F'}, {"0N&SO(", 'F'}, {"0N&SO1", 'F'}, {"0N&SOF", 'F'}, {"0N&SON", 'F'}, {"0N&SOS", 'F'}, {"0N&SOV", 'F'}, {"0N&STN", 'F'}, {"0N&SU", 'F'}, {"0N&SU(", 'F'}, {"0N&SU;", 'F'}, {"0N&SUC", 'F'}, {"0N&SUE", 'F'}, {"0N&SV", 'F'}, {"0N&SV;", 'F'}, {"0N&SVC", 'F'}, {"0N&SVO", 'F'}, {"0N&V", 'F'}, {"0N&V&(", 'F'}, {"0N&V&1", 'F'}, {"0N&V&F", 'F'}, {"0N&V&N", 'F'}, {"0N&V&S", 'F'}, {"0N&V&V", 'F'}, {"0N&V)&", 'F'}, {"0N&V)C", 'F'}, {"0N&V)O", 'F'}, {"0N&V)U", 'F'}, {"0N&V;", 'F'}, {"0N&V;C", 'F'}, {"0N&V;E", 'F'}, {"0N&V;T", 'F'}, {"0N&VB(", 'F'}, {"0N&VB1", 'F'}, {"0N&VBF", 'F'}, {"0N&VBN", 'F'}, {"0N&VBS", 'F'}, {"0N&VBV", 'F'}, {"0N&VC", 'F'}, {"0N&VEK", 'F'}, {"0N&VEN", 'F'}, {"0N&VF(", 'F'}, {"0N&VK(", 'F'}, {"0N&VK1", 'F'}, {"0N&VKF", 'F'}, {"0N&VKN", 'F'}, {"0N&VKS", 'F'}, {"0N&VKV", 'F'}, {"0N&VO(", 'F'}, {"0N&VOF", 'F'}, {"0N&VOS", 'F'}, {"0N&VS", 'F'}, {"0N&VS;", 'F'}, {"0N&VSC", 'F'}, {"0N&VSO", 'F'}, {"0N&VTN", 'F'}, {"0N&VU", 'F'}, {"0N&VU(", 'F'}, {"0N&VU;", 'F'}, {"0N&VUC", 'F'}, {"0N&VUE", 'F'}, {"0N)&(1", 'F'}, {"0N)&(E", 'F'}, {"0N)&(F", 'F'}, {"0N)&(N", 'F'}, {"0N)&(S", 'F'}, {"0N)&(V", 'F'}, {"0N)&1", 'F'}, {"0N)&1&", 'F'}, {"0N)&1)", 'F'}, {"0N)&1;", 'F'}, {"0N)&1B", 'F'}, {"0N)&1C", 'F'}, {"0N)&1F", 'F'}, {"0N)&1O", 'F'}, {"0N)&1U", 'F'}, {"0N)&F(", 'F'}, {"0N)&N", 'F'}, {"0N)&N&", 'F'}, {"0N)&N)", 'F'}, {"0N)&N;", 'F'}, {"0N)&NB", 'F'}, {"0N)&NC", 'F'}, {"0N)&NF", 'F'}, {"0N)&NO", 'F'}, {"0N)&NU", 'F'}, {"0N)&S", 'F'}, {"0N)&S&", 'F'}, {"0N)&S)", 'F'}, {"0N)&S;", 'F'}, {"0N)&SB", 'F'}, {"0N)&SC", 'F'}, {"0N)&SF", 'F'}, {"0N)&SO", 'F'}, {"0N)&SU", 'F'}, {"0N)&V", 'F'}, {"0N)&V&", 'F'}, {"0N)&V)", 'F'}, {"0N)&V;", 'F'}, {"0N)&VB", 'F'}, {"0N)&VC", 'F'}, {"0N)&VF", 'F'}, {"0N)&VO", 'F'}, {"0N)&VU", 'F'}, {"0N),(1", 'F'}, {"0N),(F", 'F'}, {"0N),(N", 'F'}, {"0N),(S", 'F'}, {"0N),(V", 'F'}, {"0N);E(", 'F'}, {"0N);E1", 'F'}, {"0N);EF", 'F'}, {"0N);EK", 'F'}, {"0N);EN", 'F'}, {"0N);EO", 'F'}, {"0N);ES", 'F'}, {"0N);EV", 'F'}, {"0N);T(", 'F'}, {"0N);T1", 'F'}, {"0N);TF", 'F'}, {"0N);TK", 'F'}, {"0N);TN", 'F'}, {"0N);TO", 'F'}, {"0N);TS", 'F'}, {"0N);TV", 'F'}, {"0N)B(1", 'F'}, {"0N)B(F", 'F'}, {"0N)B(N", 'F'}, {"0N)B(S", 'F'}, {"0N)B(V", 'F'}, {"0N)B1", 'F'}, {"0N)B1&", 'F'}, {"0N)B1;", 'F'}, {"0N)B1C", 'F'}, {"0N)B1K", 'F'}, {"0N)B1N", 'F'}, {"0N)B1O", 'F'}, {"0N)B1U", 'F'}, {"0N)BF(", 'F'}, {"0N)BN", 'F'}, {"0N)BN&", 'F'}, {"0N)BN;", 'F'}, {"0N)BNC", 'F'}, {"0N)BNK", 'F'}, {"0N)BNO", 'F'}, {"0N)BNU", 'F'}, {"0N)BS", 'F'}, {"0N)BS&", 'F'}, {"0N)BS;", 'F'}, {"0N)BSC", 'F'}, {"0N)BSK", 'F'}, {"0N)BSO", 'F'}, {"0N)BSU", 'F'}, {"0N)BV", 'F'}, {"0N)BV&", 'F'}, {"0N)BV;", 'F'}, {"0N)BVC", 'F'}, {"0N)BVK", 'F'}, {"0N)BVO", 'F'}, {"0N)BVU", 'F'}, {"0N)E(1", 'F'}, {"0N)E(F", 'F'}, {"0N)E(N", 'F'}, {"0N)E(S", 'F'}, {"0N)E(V", 'F'}, {"0N)E1C", 'F'}, {"0N)E1O", 'F'}, {"0N)EF(", 'F'}, {"0N)EK(", 'F'}, {"0N)EK1", 'F'}, {"0N)EKF", 'F'}, {"0N)EKN", 'F'}, {"0N)EKS", 'F'}, {"0N)EKV", 'F'}, {"0N)ENC", 'F'}, {"0N)ENO", 'F'}, {"0N)ESC", 'F'}, {"0N)ESO", 'F'}, {"0N)EVC", 'F'}, {"0N)EVO", 'F'}, {"0N)F(F", 'F'}, {"0N)K(1", 'F'}, {"0N)K(F", 'F'}, {"0N)K(N", 'F'}, {"0N)K(S", 'F'}, {"0N)K(V", 'F'}, {"0N)K1&", 'F'}, {"0N)K1;", 'F'}, {"0N)K1B", 'F'}, {"0N)K1E", 'F'}, {"0N)K1O", 'F'}, {"0N)K1U", 'F'}, {"0N)KB(", 'F'}, {"0N)KB1", 'F'}, {"0N)KBF", 'F'}, {"0N)KBN", 'F'}, {"0N)KBS", 'F'}, {"0N)KBV", 'F'}, {"0N)KF(", 'F'}, {"0N)KN&", 'F'}, {"0N)KN;", 'F'}, {"0N)KNB", 'F'}, {"0N)KNC", 'F'}, {"0N)KNE", 'F'}, {"0N)KNK", 'F'}, {"0N)KNU", 'F'}, {"0N)KS&", 'F'}, {"0N)KS;", 'F'}, {"0N)KSB", 'F'}, {"0N)KSE", 'F'}, {"0N)KSO", 'F'}, {"0N)KSU", 'F'}, {"0N)KUE", 'F'}, {"0N)KV&", 'F'}, {"0N)KV;", 'F'}, {"0N)KVB", 'F'}, {"0N)KVE", 'F'}, {"0N)KVO", 'F'}, {"0N)KVU", 'F'}, {"0N)O(1", 'F'}, {"0N)O(E", 'F'}, {"0N)O(F", 'F'}, {"0N)O(N", 'F'}, {"0N)O(S", 'F'}, {"0N)O(V", 'F'}, {"0N)O1&", 'F'}, {"0N)O1)", 'F'}, {"0N)O1;", 'F'}, {"0N)O1B", 'F'}, {"0N)O1C", 'F'}, {"0N)O1K", 'F'}, {"0N)O1U", 'F'}, {"0N)OF(", 'F'}, {"0N)ON&", 'F'}, {"0N)ON)", 'F'}, {"0N)ON;", 'F'}, {"0N)ONB", 'F'}, {"0N)ONC", 'F'}, {"0N)ONK", 'F'}, {"0N)ONU", 'F'}, {"0N)OS", 'F'}, {"0N)OS&", 'F'}, {"0N)OS)", 'F'}, {"0N)OS;", 'F'}, {"0N)OSB", 'F'}, {"0N)OSC", 'F'}, {"0N)OSK", 'F'}, {"0N)OSU", 'F'}, {"0N)OV", 'F'}, {"0N)OV&", 'F'}, {"0N)OV)", 'F'}, {"0N)OV;", 'F'}, {"0N)OVB", 'F'}, {"0N)OVC", 'F'}, {"0N)OVK", 'F'}, {"0N)OVO", 'F'}, {"0N)OVU", 'F'}, {"0N)U(E", 'F'}, {"0N)UE(", 'F'}, {"0N)UE1", 'F'}, {"0N)UEF", 'F'}, {"0N)UEK", 'F'}, {"0N)UEN", 'F'}, {"0N)UES", 'F'}, {"0N)UEV", 'F'}, {"0N,(1)", 'F'}, {"0N,(1O", 'F'}, {"0N,(E(", 'F'}, {"0N,(E1", 'F'}, {"0N,(EF", 'F'}, {"0N,(EK", 'F'}, {"0N,(EN", 'F'}, {"0N,(ES", 'F'}, {"0N,(EV", 'F'}, {"0N,(F(", 'F'}, {"0N,(NO", 'F'}, {"0N,(S)", 'F'}, {"0N,(SO", 'F'}, {"0N,(V)", 'F'}, {"0N,(VO", 'F'}, {"0N,F()", 'F'}, {"0N,F(1", 'F'}, {"0N,F(F", 'F'}, {"0N,F(N", 'F'}, {"0N,F(S", 'F'}, {"0N,F(V", 'F'}, {"0N1O(1", 'F'}, {"0N1O(F", 'F'}, {"0N1O(N", 'F'}, {"0N1O(S", 'F'}, {"0N1O(V", 'F'}, {"0N1OF(", 'F'}, {"0N1OS(", 'F'}, {"0N1OS1", 'F'}, {"0N1OSF", 'F'}, {"0N1OSU", 'F'}, {"0N1OSV", 'F'}, {"0N1OV(", 'F'}, {"0N1OVF", 'F'}, {"0N1OVO", 'F'}, {"0N1OVS", 'F'}, {"0N1OVU", 'F'}, {"0N1S;", 'F'}, {"0N1S;C", 'F'}, {"0N1SC", 'F'}, {"0N1UE", 'F'}, {"0N1UE;", 'F'}, {"0N1UEC", 'F'}, {"0N1UEK", 'F'}, {"0N1V;", 'F'}, {"0N1V;C", 'F'}, {"0N1VC", 'F'}, {"0N1VO(", 'F'}, {"0N1VOF", 'F'}, {"0N1VOS", 'F'}, {"0N;E(1", 'F'}, {"0N;E(E", 'F'}, {"0N;E(F", 'F'}, {"0N;E(N", 'F'}, {"0N;E(S", 'F'}, {"0N;E(V", 'F'}, {"0N;E1,", 'F'}, {"0N;E1;", 'F'}, {"0N;E1C", 'F'}, {"0N;E1K", 'F'}, {"0N;E1O", 'F'}, {"0N;E1T", 'F'}, {"0N;EF(", 'F'}, {"0N;EK(", 'F'}, {"0N;EK1", 'F'}, {"0N;EKF", 'F'}, {"0N;EKN", 'F'}, {"0N;EKO", 'F'}, {"0N;EKS", 'F'}, {"0N;EKV", 'F'}, {"0N;EN,", 'F'}, {"0N;EN;", 'F'}, {"0N;ENC", 'F'}, {"0N;ENE", 'F'}, {"0N;ENK", 'F'}, {"0N;ENO", 'F'}, {"0N;ENT", 'F'}, {"0N;ES,", 'F'}, {"0N;ES;", 'F'}, {"0N;ESC", 'F'}, {"0N;ESK", 'F'}, {"0N;ESO", 'F'}, {"0N;EST", 'F'}, {"0N;EV,", 'F'}, {"0N;EV;", 'F'}, {"0N;EVC", 'F'}, {"0N;EVK", 'F'}, {"0N;EVO", 'F'}, {"0N;EVT", 'F'}, {"0N;N:T", 'F'}, {"0N;T(1", 'F'}, {"0N;T(C", 'F'}, {"0N;T(E", 'F'}, {"0N;T(F", 'F'}, {"0N;T(N", 'F'}, {"0N;T(S", 'F'}, {"0N;T(V", 'F'}, {"0N;T1(", 'F'}, {"0N;T1,", 'F'}, {"0N;T1;", 'F'}, {"0N;T1C", 'F'}, {"0N;T1F", 'F'}, {"0N;T1K", 'F'}, {"0N;T1O", 'F'}, {"0N;T1T", 'F'}, {"0N;T;", 'F'}, {"0N;T;C", 'F'}, {"0N;TF(", 'F'}, {"0N;TK(", 'F'}, {"0N;TK1", 'F'}, {"0N;TKF", 'F'}, {"0N;TKK", 'F'}, {"0N;TKO", 'F'}, {"0N;TKS", 'F'}, {"0N;TKV", 'F'}, {"0N;TN(", 'F'}, {"0N;TN,", 'F'}, {"0N;TN1", 'F'}, {"0N;TN;", 'F'}, {"0N;TNC", 'F'}, {"0N;TNE", 'F'}, {"0N;TNF", 'F'}, {"0N;TNK", 'F'}, {"0N;TNN", 'F'}, {"0N;TNO", 'F'}, {"0N;TNS", 'F'}, {"0N;TNT", 'F'}, {"0N;TNV", 'F'}, {"0N;TO(", 'F'}, {"0N;TS(", 'F'}, {"0N;TS,", 'F'}, {"0N;TS;", 'F'}, {"0N;TSC", 'F'}, {"0N;TSF", 'F'}, {"0N;TSK", 'F'}, {"0N;TSO", 'F'}, {"0N;TST", 'F'}, {"0N;TTN", 'F'}, {"0N;TV(", 'F'}, {"0N;TV,", 'F'}, {"0N;TV;", 'F'}, {"0N;TVC", 'F'}, {"0N;TVF", 'F'}, {"0N;TVK", 'F'}, {"0N;TVO", 'F'}, {"0N;TVT", 'F'}, {"0NA(F(", 'F'}, {"0NA(N)", 'F'}, {"0NA(NO", 'F'}, {"0NA(S)", 'F'}, {"0NA(SO", 'F'}, {"0NA(V)", 'F'}, {"0NA(VO", 'F'}, {"0NAF()", 'F'}, {"0NAF(1", 'F'}, {"0NAF(F", 'F'}, {"0NAF(N", 'F'}, {"0NAF(S", 'F'}, {"0NAF(V", 'F'}, {"0NASO(", 'F'}, {"0NASO1", 'F'}, {"0NASOF", 'F'}, {"0NASON", 'F'}, {"0NASOS", 'F'}, {"0NASOV", 'F'}, {"0NASUE", 'F'}, {"0NATO(", 'F'}, {"0NATO1", 'F'}, {"0NATOF", 'F'}, {"0NATON", 'F'}, {"0NATOS", 'F'}, {"0NATOV", 'F'}, {"0NATUE", 'F'}, {"0NAVO(", 'F'}, {"0NAVOF", 'F'}, {"0NAVOS", 'F'}, {"0NAVUE", 'F'}, {"0NB(1&", 'F'}, {"0NB(1)", 'F'}, {"0NB(1O", 'F'}, {"0NB(F(", 'F'}, {"0NB(N&", 'F'}, {"0NB(NO", 'F'}, {"0NB(S&", 'F'}, {"0NB(S)", 'F'}, {"0NB(SO", 'F'}, {"0NB(V&", 'F'}, {"0NB(V)", 'F'}, {"0NB(VO", 'F'}, {"0NB1", 'F'}, {"0NB1&(", 'F'}, {"0NB1&1", 'F'}, {"0NB1&F", 'F'}, {"0NB1&N", 'F'}, {"0NB1&S", 'F'}, {"0NB1&V", 'F'}, {"0NB1,(", 'F'}, {"0NB1,F", 'F'}, {"0NB1;", 'F'}, {"0NB1;C", 'F'}, {"0NB1B(", 'F'}, {"0NB1B1", 'F'}, {"0NB1BF", 'F'}, {"0NB1BN", 'F'}, {"0NB1BS", 'F'}, {"0NB1BV", 'F'}, {"0NB1C", 'F'}, {"0NB1K(", 'F'}, {"0NB1K1", 'F'}, {"0NB1KF", 'F'}, {"0NB1KN", 'F'}, {"0NB1KS", 'F'}, {"0NB1KV", 'F'}, {"0NB1O(", 'F'}, {"0NB1OF", 'F'}, {"0NB1OS", 'F'}, {"0NB1OV", 'F'}, {"0NB1U(", 'F'}, {"0NB1UE", 'F'}, {"0NBE(1", 'F'}, {"0NBE(F", 'F'}, {"0NBE(N", 'F'}, {"0NBE(S", 'F'}, {"0NBE(V", 'F'}, {"0NBEK(", 'F'}, {"0NBF()", 'F'}, {"0NBF(1", 'F'}, {"0NBF(F", 'F'}, {"0NBF(N", 'F'}, {"0NBF(S", 'F'}, {"0NBF(V", 'F'}, {"0NBN&(", 'F'}, {"0NBN&1", 'F'}, {"0NBN&F", 'F'}, {"0NBN&N", 'F'}, {"0NBN&S", 'F'}, {"0NBN&V", 'F'}, {"0NBN,(", 'F'}, {"0NBN,F", 'F'}, {"0NBN;", 'F'}, {"0NBN;C", 'F'}, {"0NBNB(", 'F'}, {"0NBNB1", 'F'}, {"0NBNBF", 'F'}, {"0NBNBN", 'F'}, {"0NBNBS", 'F'}, {"0NBNBV", 'F'}, {"0NBNC", 'F'}, {"0NBNK(", 'F'}, {"0NBNK1", 'F'}, {"0NBNKF", 'F'}, {"0NBNKN", 'F'}, {"0NBNKS", 'F'}, {"0NBNKV", 'F'}, {"0NBNO(", 'F'}, {"0NBNOF", 'F'}, {"0NBNOS", 'F'}, {"0NBNOV", 'F'}, {"0NBNU(", 'F'}, {"0NBNUE", 'F'}, {"0NBS", 'F'}, {"0NBS&(", 'F'}, {"0NBS&1", 'F'}, {"0NBS&F", 'F'}, {"0NBS&N", 'F'}, {"0NBS&S", 'F'}, {"0NBS&V", 'F'}, {"0NBS,(", 'F'}, {"0NBS,F", 'F'}, {"0NBS;", 'F'}, {"0NBS;C", 'F'}, {"0NBSB(", 'F'}, {"0NBSB1", 'F'}, {"0NBSBF", 'F'}, {"0NBSBN", 'F'}, {"0NBSBS", 'F'}, {"0NBSBV", 'F'}, {"0NBSC", 'F'}, {"0NBSK(", 'F'}, {"0NBSK1", 'F'}, {"0NBSKF", 'F'}, {"0NBSKN", 'F'}, {"0NBSKS", 'F'}, {"0NBSKV", 'F'}, {"0NBSO(", 'F'}, {"0NBSO1", 'F'}, {"0NBSOF", 'F'}, {"0NBSON", 'F'}, {"0NBSOS", 'F'}, {"0NBSOV", 'F'}, {"0NBSU(", 'F'}, {"0NBSUE", 'F'}, {"0NBV", 'F'}, {"0NBV&(", 'F'}, {"0NBV&1", 'F'}, {"0NBV&F", 'F'}, {"0NBV&N", 'F'}, {"0NBV&S", 'F'}, {"0NBV&V", 'F'}, {"0NBV,(", 'F'}, {"0NBV,F", 'F'}, {"0NBV;", 'F'}, {"0NBV;C", 'F'}, {"0NBVB(", 'F'}, {"0NBVB1", 'F'}, {"0NBVBF", 'F'}, {"0NBVBN", 'F'}, {"0NBVBS", 'F'}, {"0NBVBV", 'F'}, {"0NBVC", 'F'}, {"0NBVK(", 'F'}, {"0NBVK1", 'F'}, {"0NBVKF", 'F'}, {"0NBVKN", 'F'}, {"0NBVKS", 'F'}, {"0NBVKV", 'F'}, {"0NBVO(", 'F'}, {"0NBVOF", 'F'}, {"0NBVOS", 'F'}, {"0NBVU(", 'F'}, {"0NBVUE", 'F'}, {"0NC", 'F'}, {"0NE(1)", 'F'}, {"0NE(1O", 'F'}, {"0NE(F(", 'F'}, {"0NE(N)", 'F'}, {"0NE(NO", 'F'}, {"0NE(S)", 'F'}, {"0NE(SO", 'F'}, {"0NE(V)", 'F'}, {"0NE(VO", 'F'}, {"0NE1;T", 'F'}, {"0NE1C", 'F'}, {"0NE1O(", 'F'}, {"0NE1OF", 'F'}, {"0NE1OS", 'F'}, {"0NE1OV", 'F'}, {"0NE1T(", 'F'}, {"0NE1T1", 'F'}, {"0NE1TF", 'F'}, {"0NE1TN", 'F'}, {"0NE1TS", 'F'}, {"0NE1TV", 'F'}, {"0NE1UE", 'F'}, {"0NEF()", 'F'}, {"0NEF(1", 'F'}, {"0NEF(F", 'F'}, {"0NEF(N", 'F'}, {"0NEF(S", 'F'}, {"0NEF(V", 'F'}, {"0NEN;T", 'F'}, {"0NENO(", 'F'}, {"0NENOF", 'F'}, {"0NENOS", 'F'}, {"0NENOV", 'F'}, {"0NENT(", 'F'}, {"0NENT1", 'F'}, {"0NENTF", 'F'}, {"0NENTN", 'F'}, {"0NENTS", 'F'}, {"0NENTV", 'F'}, {"0NENUE", 'F'}, {"0NEOKN", 'F'}, {"0NES;T", 'F'}, {"0NESC", 'F'}, {"0NESO(", 'F'}, {"0NESO1", 'F'}, {"0NESOF", 'F'}, {"0NESON", 'F'}, {"0NESOS", 'F'}, {"0NESOV", 'F'}, {"0NEST(", 'F'}, {"0NEST1", 'F'}, {"0NESTF", 'F'}, {"0NESTN", 'F'}, {"0NESTS", 'F'}, {"0NESTV", 'F'}, {"0NESUE", 'F'}, {"0NEU(1", 'F'}, {"0NEU(F", 'F'}, {"0NEU(N", 'F'}, {"0NEU(S", 'F'}, {"0NEU(V", 'F'}, {"0NEU1,", 'F'}, {"0NEU1C", 'F'}, {"0NEU1O", 'F'}, {"0NEUEF", 'F'}, {"0NEUEK", 'F'}, {"0NEUF(", 'F'}, {"0NEUS,", 'F'}, {"0NEUSC", 'F'}, {"0NEUSO", 'F'}, {"0NEUV,", 'F'}, {"0NEUVC", 'F'}, {"0NEUVO", 'F'}, {"0NEV;T", 'F'}, {"0NEVC", 'F'}, {"0NEVO(", 'F'}, {"0NEVOF", 'F'}, {"0NEVOS", 'F'}, {"0NEVT(", 'F'}, {"0NEVT1", 'F'}, {"0NEVTF", 'F'}, {"0NEVTN", 'F'}, {"0NEVTS", 'F'}, {"0NEVTV", 'F'}, {"0NEVUE", 'F'}, {"0NF()1", 'F'}, {"0NF()F", 'F'}, {"0NF()K", 'F'}, {"0NF()N", 'F'}, {"0NF()O", 'F'}, {"0NF()S", 'F'}, {"0NF()U", 'F'}, {"0NF()V", 'F'}, {"0NF(1)", 'F'}, {"0NF(1O", 'F'}, {"0NF(E(", 'F'}, {"0NF(E1", 'F'}, {"0NF(EF", 'F'}, {"0NF(EK", 'F'}, {"0NF(EN", 'F'}, {"0NF(ES", 'F'}, {"0NF(EV", 'F'}, {"0NF(F(", 'F'}, {"0NF(N,", 'F'}, {"0NF(NO", 'F'}, {"0NF(S)", 'F'}, {"0NF(SO", 'F'}, {"0NF(V)", 'F'}, {"0NF(VO", 'F'}, {"0NK(1)", 'F'}, {"0NK(1O", 'F'}, {"0NK(F(", 'F'}, {"0NK(NO", 'F'}, {"0NK(S)", 'F'}, {"0NK(SO", 'F'}, {"0NK(V)", 'F'}, {"0NK(VO", 'F'}, {"0NK)&(", 'F'}, {"0NK)&1", 'F'}, {"0NK)&F", 'F'}, {"0NK)&N", 'F'}, {"0NK)&S", 'F'}, {"0NK)&V", 'F'}, {"0NK);E", 'F'}, {"0NK);T", 'F'}, {"0NK)B(", 'F'}, {"0NK)B1", 'F'}, {"0NK)BF", 'F'}, {"0NK)BN", 'F'}, {"0NK)BS", 'F'}, {"0NK)BV", 'F'}, {"0NK)E(", 'F'}, {"0NK)E1", 'F'}, {"0NK)EF", 'F'}, {"0NK)EK", 'F'}, {"0NK)EN", 'F'}, {"0NK)ES", 'F'}, {"0NK)EV", 'F'}, {"0NK)F(", 'F'}, {"0NK)O(", 'F'}, {"0NK)OF", 'F'}, {"0NK)UE", 'F'}, {"0NK1", 'F'}, {"0NK1&(", 'F'}, {"0NK1&1", 'F'}, {"0NK1&F", 'F'}, {"0NK1&N", 'F'}, {"0NK1&S", 'F'}, {"0NK1&V", 'F'}, {"0NK1;C", 'F'}, {"0NK1;E", 'F'}, {"0NK1;T", 'F'}, {"0NK1B(", 'F'}, {"0NK1B1", 'F'}, {"0NK1BF", 'F'}, {"0NK1BN", 'F'}, {"0NK1BS", 'F'}, {"0NK1BV", 'F'}, {"0NK1C", 'F'}, {"0NK1E(", 'F'}, {"0NK1E1", 'F'}, {"0NK1EF", 'F'}, {"0NK1EK", 'F'}, {"0NK1EN", 'F'}, {"0NK1ES", 'F'}, {"0NK1EV", 'F'}, {"0NK1O(", 'F'}, {"0NK1OF", 'F'}, {"0NK1OS", 'F'}, {"0NK1OV", 'F'}, {"0NK1U(", 'F'}, {"0NK1UE", 'F'}, {"0NKF()", 'F'}, {"0NKF(1", 'F'}, {"0NKF(F", 'F'}, {"0NKF(N", 'F'}, {"0NKF(S", 'F'}, {"0NKF(V", 'F'}, {"0NKN", 'F'}, {"0NKN&(", 'F'}, {"0NKN&1", 'F'}, {"0NKN&F", 'F'}, {"0NKN&S", 'F'}, {"0NKN&V", 'F'}, {"0NKN;C", 'F'}, {"0NKN;E", 'F'}, {"0NKN;T", 'F'}, {"0NKNB(", 'F'}, {"0NKNB1", 'F'}, {"0NKNBF", 'F'}, {"0NKNBN", 'F'}, {"0NKNBS", 'F'}, {"0NKNBV", 'F'}, {"0NKNE(", 'F'}, {"0NKNE1", 'F'}, {"0NKNEF", 'F'}, {"0NKNES", 'F'}, {"0NKNEV", 'F'}, {"0NKNU(", 'F'}, {"0NKNUE", 'F'}, {"0NKS", 'F'}, {"0NKS&(", 'F'}, {"0NKS&1", 'F'}, {"0NKS&F", 'F'}, {"0NKS&N", 'F'}, {"0NKS&S", 'F'}, {"0NKS&V", 'F'}, {"0NKS;", 'F'}, {"0NKS;C", 'F'}, {"0NKS;E", 'F'}, {"0NKS;T", 'F'}, {"0NKSB(", 'F'}, {"0NKSB1", 'F'}, {"0NKSBF", 'F'}, {"0NKSBN", 'F'}, {"0NKSBS", 'F'}, {"0NKSBV", 'F'}, {"0NKSC", 'F'}, {"0NKSE(", 'F'}, {"0NKSE1", 'F'}, {"0NKSEF", 'F'}, {"0NKSEK", 'F'}, {"0NKSEN", 'F'}, {"0NKSES", 'F'}, {"0NKSEV", 'F'}, {"0NKSO(", 'F'}, {"0NKSO1", 'F'}, {"0NKSOF", 'F'}, {"0NKSON", 'F'}, {"0NKSOS", 'F'}, {"0NKSOV", 'F'}, {"0NKSU(", 'F'}, {"0NKSUE", 'F'}, {"0NKUE(", 'F'}, {"0NKUE1", 'F'}, {"0NKUEF", 'F'}, {"0NKUEK", 'F'}, {"0NKUEN", 'F'}, {"0NKUES", 'F'}, {"0NKUEV", 'F'}, {"0NKV", 'F'}, {"0NKV&(", 'F'}, {"0NKV&1", 'F'}, {"0NKV&F", 'F'}, {"0NKV&N", 'F'}, {"0NKV&S", 'F'}, {"0NKV&V", 'F'}, {"0NKV;", 'F'}, {"0NKV;C", 'F'}, {"0NKV;E", 'F'}, {"0NKV;T", 'F'}, {"0NKVB(", 'F'}, {"0NKVB1", 'F'}, {"0NKVBF", 'F'}, {"0NKVBN", 'F'}, {"0NKVBS", 'F'}, {"0NKVBV", 'F'}, {"0NKVC", 'F'}, {"0NKVE(", 'F'}, {"0NKVE1", 'F'}, {"0NKVEF", 'F'}, {"0NKVEK", 'F'}, {"0NKVEN", 'F'}, {"0NKVES", 'F'}, {"0NKVEV", 'F'}, {"0NKVO(", 'F'}, {"0NKVOF", 'F'}, {"0NKVOS", 'F'}, {"0NKVU(", 'F'}, {"0NKVUE", 'F'}, {"0NO(1&", 'F'}, {"0NO(1)", 'F'}, {"0NO(1,", 'F'}, {"0NO(1O", 'F'}, {"0NO(E(", 'F'}, {"0NO(E1", 'F'}, {"0NO(EE", 'F'}, {"0NO(EF", 'F'}, {"0NO(EK", 'F'}, {"0NO(EN", 'F'}, {"0NO(EO", 'F'}, {"0NO(ES", 'F'}, {"0NO(EV", 'F'}, {"0NO(F(", 'F'}, {"0NO(N&", 'F'}, {"0NO(N)", 'F'}, {"0NO(N,", 'F'}, {"0NO(NO", 'F'}, {"0NO(S&", 'F'}, {"0NO(S)", 'F'}, {"0NO(S,", 'F'}, {"0NO(SO", 'F'}, {"0NO(V&", 'F'}, {"0NO(V)", 'F'}, {"0NO(V,", 'F'}, {"0NO(VO", 'F'}, {"0NOF()", 'F'}, {"0NOF(1", 'F'}, {"0NOF(E", 'F'}, {"0NOF(F", 'F'}, {"0NOF(N", 'F'}, {"0NOF(S", 'F'}, {"0NOF(V", 'F'}, {"0NOK&(", 'F'}, {"0NOK(1", 'F'}, {"0NOK(F", 'F'}, {"0NOK(N", 'F'}, {"0NOK(S", 'F'}, {"0NOK(V", 'F'}, {"0NOK1C", 'F'}, {"0NOK1O", 'F'}, {"0NOKF(", 'F'}, {"0NOKNC", 'F'}, {"0NOKO(", 'F'}, {"0NOKO1", 'F'}, {"0NOKOF", 'F'}, {"0NOKON", 'F'}, {"0NOKOS", 'F'}, {"0NOKOV", 'F'}, {"0NOKSC", 'F'}, {"0NOKSO", 'F'}, {"0NOKVC", 'F'}, {"0NOKVO", 'F'}, {"0NONSU", 'F'}, {"0NOS&(", 'F'}, {"0NOS&1", 'F'}, {"0NOS&E", 'F'}, {"0NOS&F", 'F'}, {"0NOS&K", 'F'}, {"0NOS&N", 'F'}, {"0NOS&S", 'F'}, {"0NOS&U", 'F'}, {"0NOS&V", 'F'}, {"0NOS(E", 'F'}, {"0NOS(U", 'F'}, {"0NOS)&", 'F'}, {"0NOS),", 'F'}, {"0NOS);", 'F'}, {"0NOS)B", 'F'}, {"0NOS)C", 'F'}, {"0NOS)E", 'F'}, {"0NOS)F", 'F'}, {"0NOS)K", 'F'}, {"0NOS)O", 'F'}, {"0NOS)U", 'F'}, {"0NOS,(", 'F'}, {"0NOS,F", 'F'}, {"0NOS1(", 'F'}, {"0NOS1F", 'F'}, {"0NOS1N", 'F'}, {"0NOS1S", 'F'}, {"0NOS1U", 'F'}, {"0NOS1V", 'F'}, {"0NOS;", 'F'}, {"0NOS;C", 'F'}, {"0NOS;E", 'F'}, {"0NOS;T", 'F'}, {"0NOSA(", 'F'}, {"0NOSAF", 'F'}, {"0NOSAS", 'F'}, {"0NOSAT", 'F'}, {"0NOSAV", 'F'}, {"0NOSB(", 'F'}, {"0NOSB1", 'F'}, {"0NOSBE", 'F'}, {"0NOSBF", 'F'}, {"0NOSBN", 'F'}, {"0NOSBS", 'F'}, {"0NOSBV", 'F'}, {"0NOSC", 'F'}, {"0NOSE(", 'F'}, {"0NOSE1", 'F'}, {"0NOSEF", 'F'}, {"0NOSEK", 'F'}, {"0NOSEN", 'F'}, {"0NOSEO", 'F'}, {"0NOSES", 'F'}, {"0NOSEU", 'F'}, {"0NOSEV", 'F'}, {"0NOSF(", 'F'}, {"0NOSK(", 'F'}, {"0NOSK)", 'F'}, {"0NOSK1", 'F'}, {"0NOSKB", 'F'}, {"0NOSKF", 'F'}, {"0NOSKN", 'F'}, {"0NOSKS", 'F'}, {"0NOSKU", 'F'}, {"0NOSKV", 'F'}, {"0NOST(", 'F'}, {"0NOST1", 'F'}, {"0NOSTE", 'F'}, {"0NOSTF", 'F'}, {"0NOSTN", 'F'}, {"0NOSTS", 'F'}, {"0NOSTT", 'F'}, {"0NOSTV", 'F'}, {"0NOSU", 'F'}, {"0NOSU(", 'F'}, {"0NOSU1", 'F'}, {"0NOSU;", 'F'}, {"0NOSUC", 'F'}, {"0NOSUE", 'F'}, {"0NOSUF", 'F'}, {"0NOSUK", 'F'}, {"0NOSUO", 'F'}, {"0NOSUS", 'F'}, {"0NOSUT", 'F'}, {"0NOSUV", 'F'}, {"0NOSV(", 'F'}, {"0NOSVF", 'F'}, {"0NOSVO", 'F'}, {"0NOSVS", 'F'}, {"0NOSVU", 'F'}, {"0NOU(E", 'F'}, {"0NOUEK", 'F'}, {"0NOUEN", 'F'}, {"0NOV&(", 'F'}, {"0NOV&1", 'F'}, {"0NOV&E", 'F'}, {"0NOV&F", 'F'}, {"0NOV&K", 'F'}, {"0NOV&N", 'F'}, {"0NOV&S", 'F'}, {"0NOV&U", 'F'}, {"0NOV&V", 'F'}, {"0NOV(E", 'F'}, {"0NOV(U", 'F'}, {"0NOV)&", 'F'}, {"0NOV),", 'F'}, {"0NOV);", 'F'}, {"0NOV)B", 'F'}, {"0NOV)C", 'F'}, {"0NOV)E", 'F'}, {"0NOV)F", 'F'}, {"0NOV)K", 'F'}, {"0NOV)O", 'F'}, {"0NOV)U", 'F'}, {"0NOV,(", 'F'}, {"0NOV,F", 'F'}, {"0NOV;", 'F'}, {"0NOV;C", 'F'}, {"0NOV;E", 'F'}, {"0NOV;N", 'F'}, {"0NOV;T", 'F'}, {"0NOVA(", 'F'}, {"0NOVAF", 'F'}, {"0NOVAS", 'F'}, {"0NOVAT", 'F'}, {"0NOVAV", 'F'}, {"0NOVB(", 'F'}, {"0NOVB1", 'F'}, {"0NOVBE", 'F'}, {"0NOVBF", 'F'}, {"0NOVBN", 'F'}, {"0NOVBS", 'F'}, {"0NOVBV", 'F'}, {"0NOVC", 'F'}, {"0NOVE(", 'F'}, {"0NOVE1", 'F'}, {"0NOVEF", 'F'}, {"0NOVEK", 'F'}, {"0NOVEN", 'F'}, {"0NOVEO", 'F'}, {"0NOVES", 'F'}, {"0NOVEU", 'F'}, {"0NOVEV", 'F'}, {"0NOVF(", 'F'}, {"0NOVK(", 'F'}, {"0NOVK)", 'F'}, {"0NOVK1", 'F'}, {"0NOVKB", 'F'}, {"0NOVKF", 'F'}, {"0NOVKN", 'F'}, {"0NOVKS", 'F'}, {"0NOVKU", 'F'}, {"0NOVKV", 'F'}, {"0NOVO(", 'F'}, {"0NOVOF", 'F'}, {"0NOVOK", 'F'}, {"0NOVOS", 'F'}, {"0NOVOU", 'F'}, {"0NOVS(", 'F'}, {"0NOVS1", 'F'}, {"0NOVSF", 'F'}, {"0NOVSO", 'F'}, {"0NOVSU", 'F'}, {"0NOVSV", 'F'}, {"0NOVT(", 'F'}, {"0NOVT1", 'F'}, {"0NOVTE", 'F'}, {"0NOVTF", 'F'}, {"0NOVTN", 'F'}, {"0NOVTS", 'F'}, {"0NOVTT", 'F'}, {"0NOVTV", 'F'}, {"0NOVU", 'F'}, {"0NOVU(", 'F'}, {"0NOVU1", 'F'}, {"0NOVU;", 'F'}, {"0NOVUC", 'F'}, {"0NOVUE", 'F'}, {"0NOVUF", 'F'}, {"0NOVUK", 'F'}, {"0NOVUO", 'F'}, {"0NOVUS", 'F'}, {"0NOVUT", 'F'}, {"0NOVUV", 'F'}, {"0NSO1U", 'F'}, {"0NSONU", 'F'}, {"0NSOSU", 'F'}, {"0NSOVU", 'F'}, {"0NSUE", 'F'}, {"0NSUE;", 'F'}, {"0NSUEC", 'F'}, {"0NSUEK", 'F'}, {"0NT(1)", 'F'}, {"0NT(1O", 'F'}, {"0NT(F(", 'F'}, {"0NT(N)", 'F'}, {"0NT(NO", 'F'}, {"0NT(S)", 'F'}, {"0NT(SO", 'F'}, {"0NT(V)", 'F'}, {"0NT(VO", 'F'}, {"0NT1(F", 'F'}, {"0NT1O(", 'F'}, {"0NT1OF", 'F'}, {"0NT1OS", 'F'}, {"0NT1OV", 'F'}, {"0NTE(1", 'F'}, {"0NTE(F", 'F'}, {"0NTE(N", 'F'}, {"0NTE(S", 'F'}, {"0NTE(V", 'F'}, {"0NTE1N", 'F'}, {"0NTE1O", 'F'}, {"0NTEF(", 'F'}, {"0NTEK(", 'F'}, {"0NTEK1", 'F'}, {"0NTEKF", 'F'}, {"0NTEKN", 'F'}, {"0NTEKS", 'F'}, {"0NTEKV", 'F'}, {"0NTENN", 'F'}, {"0NTENO", 'F'}, {"0NTESN", 'F'}, {"0NTESO", 'F'}, {"0NTEVN", 'F'}, {"0NTEVO", 'F'}, {"0NTF()", 'F'}, {"0NTF(1", 'F'}, {"0NTF(F", 'F'}, {"0NTF(N", 'F'}, {"0NTF(S", 'F'}, {"0NTF(V", 'F'}, {"0NTN(1", 'F'}, {"0NTN(F", 'F'}, {"0NTN(S", 'F'}, {"0NTN(V", 'F'}, {"0NTN1C", 'F'}, {"0NTN1O", 'F'}, {"0NTN;E", 'F'}, {"0NTN;N", 'F'}, {"0NTN;T", 'F'}, {"0NTNE(", 'F'}, {"0NTNE1", 'F'}, {"0NTNEF", 'F'}, {"0NTNEN", 'F'}, {"0NTNES", 'F'}, {"0NTNEV", 'F'}, {"0NTNF(", 'F'}, {"0NTNKN", 'F'}, {"0NTNN:", 'F'}, {"0NTNNC", 'F'}, {"0NTNNO", 'F'}, {"0NTNO(", 'F'}, {"0NTNOF", 'F'}, {"0NTNOS", 'F'}, {"0NTNOV", 'F'}, {"0NTNSC", 'F'}, {"0NTNSO", 'F'}, {"0NTNT(", 'F'}, {"0NTNT1", 'F'}, {"0NTNTF", 'F'}, {"0NTNTN", 'F'}, {"0NTNTS", 'F'}, {"0NTNTV", 'F'}, {"0NTNVC", 'F'}, {"0NTNVO", 'F'}, {"0NTS(F", 'F'}, {"0NTSO(", 'F'}, {"0NTSO1", 'F'}, {"0NTSOF", 'F'}, {"0NTSON", 'F'}, {"0NTSOS", 'F'}, {"0NTSOV", 'F'}, {"0NTTNE", 'F'}, {"0NTTNK", 'F'}, {"0NTTNN", 'F'}, {"0NTTNT", 'F'}, {"0NTV(1", 'F'}, {"0NTV(F", 'F'}, {"0NTVO(", 'F'}, {"0NTVOF", 'F'}, {"0NTVOS", 'F'}, {"0NU(1)", 'F'}, {"0NU(1O", 'F'}, {"0NU(E(", 'F'}, {"0NU(E1", 'F'}, {"0NU(EF", 'F'}, {"0NU(EK", 'F'}, {"0NU(EN", 'F'}, {"0NU(ES", 'F'}, {"0NU(EV", 'F'}, {"0NU(F(", 'F'}, {"0NU(N)", 'F'}, {"0NU(NO", 'F'}, {"0NU(S)", 'F'}, {"0NU(SO", 'F'}, {"0NU(V)", 'F'}, {"0NU(VO", 'F'}, {"0NU1,(", 'F'}, {"0NU1,F", 'F'}, {"0NU1C", 'F'}, {"0NU1O(", 'F'}, {"0NU1OF", 'F'}, {"0NU1OS", 'F'}, {"0NU1OV", 'F'}, {"0NU;", 'F'}, {"0NU;C", 'F'}, {"0NUC", 'F'}, {"0NUE", 'F'}, {"0NUE(1", 'F'}, {"0NUE(E", 'F'}, {"0NUE(F", 'F'}, {"0NUE(N", 'F'}, {"0NUE(O", 'F'}, {"0NUE(S", 'F'}, {"0NUE(V", 'F'}, {"0NUE1", 'F'}, {"0NUE1&", 'F'}, {"0NUE1(", 'F'}, {"0NUE1)", 'F'}, {"0NUE1,", 'F'}, {"0NUE1;", 'F'}, {"0NUE1B", 'F'}, {"0NUE1C", 'F'}, {"0NUE1F", 'F'}, {"0NUE1K", 'F'}, {"0NUE1N", 'F'}, {"0NUE1O", 'F'}, {"0NUE1S", 'F'}, {"0NUE1U", 'F'}, {"0NUE1V", 'F'}, {"0NUE;", 'F'}, {"0NUE;C", 'F'}, {"0NUEC", 'F'}, {"0NUEF", 'F'}, {"0NUEF(", 'F'}, {"0NUEF,", 'F'}, {"0NUEF;", 'F'}, {"0NUEFC", 'F'}, {"0NUEK", 'F'}, {"0NUEK(", 'F'}, {"0NUEK1", 'F'}, {"0NUEK;", 'F'}, {"0NUEKC", 'F'}, {"0NUEKF", 'F'}, {"0NUEKN", 'F'}, {"0NUEKO", 'F'}, {"0NUEKS", 'F'}, {"0NUEKV", 'F'}, {"0NUEN", 'F'}, {"0NUEN&", 'F'}, {"0NUEN(", 'F'}, {"0NUEN)", 'F'}, {"0NUEN,", 'F'}, {"0NUEN1", 'F'}, {"0NUEN;", 'F'}, {"0NUENB", 'F'}, {"0NUENC", 'F'}, {"0NUENF", 'F'}, {"0NUENK", 'F'}, {"0NUENO", 'F'}, {"0NUENS", 'F'}, {"0NUENU", 'F'}, {"0NUEOK", 'F'}, {"0NUEON", 'F'}, {"0NUES", 'F'}, {"0NUES&", 'F'}, {"0NUES(", 'F'}, {"0NUES)", 'F'}, {"0NUES,", 'F'}, {"0NUES1", 'F'}, {"0NUES;", 'F'}, {"0NUESB", 'F'}, {"0NUESC", 'F'}, {"0NUESF", 'F'}, {"0NUESK", 'F'}, {"0NUESO", 'F'}, {"0NUESU", 'F'}, {"0NUESV", 'F'}, {"0NUEV", 'F'}, {"0NUEV&", 'F'}, {"0NUEV(", 'F'}, {"0NUEV)", 'F'}, {"0NUEV,", 'F'}, {"0NUEV;", 'F'}, {"0NUEVB", 'F'}, {"0NUEVC", 'F'}, {"0NUEVF", 'F'}, {"0NUEVK", 'F'}, {"0NUEVN", 'F'}, {"0NUEVO", 'F'}, {"0NUEVS", 'F'}, {"0NUEVU", 'F'}, {"0NUF()", 'F'}, {"0NUF(1", 'F'}, {"0NUF(F", 'F'}, {"0NUF(N", 'F'}, {"0NUF(S", 'F'}, {"0NUF(V", 'F'}, {"0NUK(E", 'F'}, {"0NUO(E", 'F'}, {"0NUON(", 'F'}, {"0NUON1", 'F'}, {"0NUONF", 'F'}, {"0NUONS", 'F'}, {"0NUS,(", 'F'}, {"0NUS,F", 'F'}, {"0NUSC", 'F'}, {"0NUSO(", 'F'}, {"0NUSO1", 'F'}, {"0NUSOF", 'F'}, {"0NUSON", 'F'}, {"0NUSOS", 'F'}, {"0NUSOV", 'F'}, {"0NUTN(", 'F'}, {"0NUTN1", 'F'}, {"0NUTNF", 'F'}, {"0NUTNN", 'F'}, {"0NUTNS", 'F'}, {"0NUTNV", 'F'}, {"0NUV,(", 'F'}, {"0NUV,F", 'F'}, {"0NUVC", 'F'}, {"0NUVO(", 'F'}, {"0NUVOF", 'F'}, {"0NUVOS", 'F'}, {"0S&(1&", 'F'}, {"0S&(1)", 'F'}, {"0S&(1,", 'F'}, {"0S&(1O", 'F'}, {"0S&(E(", 'F'}, {"0S&(E1", 'F'}, {"0S&(EF", 'F'}, {"0S&(EK", 'F'}, {"0S&(EN", 'F'}, {"0S&(EO", 'F'}, {"0S&(ES", 'F'}, {"0S&(EV", 'F'}, {"0S&(F(", 'F'}, {"0S&(N&", 'F'}, {"0S&(N)", 'F'}, {"0S&(N,", 'F'}, {"0S&(NO", 'F'}, {"0S&(S&", 'F'}, {"0S&(S)", 'F'}, {"0S&(S,", 'F'}, {"0S&(SO", 'F'}, {"0S&(V&", 'F'}, {"0S&(V)", 'F'}, {"0S&(V,", 'F'}, {"0S&(VO", 'F'}, {"0S&1", 'F'}, {"0S&1&(", 'F'}, {"0S&1&1", 'F'}, {"0S&1&F", 'F'}, {"0S&1&N", 'F'}, {"0S&1&S", 'F'}, {"0S&1&V", 'F'}, {"0S&1)&", 'F'}, {"0S&1)C", 'F'}, {"0S&1)O", 'F'}, {"0S&1)U", 'F'}, {"0S&1;", 'F'}, {"0S&1;C", 'F'}, {"0S&1;E", 'F'}, {"0S&1;T", 'F'}, {"0S&1B(", 'F'}, {"0S&1B1", 'F'}, {"0S&1BF", 'F'}, {"0S&1BN", 'F'}, {"0S&1BS", 'F'}, {"0S&1BV", 'F'}, {"0S&1C", 'F'}, {"0S&1EK", 'F'}, {"0S&1EN", 'F'}, {"0S&1F(", 'F'}, {"0S&1K(", 'F'}, {"0S&1K1", 'F'}, {"0S&1KF", 'F'}, {"0S&1KN", 'F'}, {"0S&1KS", 'F'}, {"0S&1KV", 'F'}, {"0S&1O(", 'F'}, {"0S&1OF", 'F'}, {"0S&1OS", 'F'}, {"0S&1OV", 'F'}, {"0S&1TN", 'F'}, {"0S&1U", 'F'}, {"0S&1U(", 'F'}, {"0S&1U;", 'F'}, {"0S&1UC", 'F'}, {"0S&1UE", 'F'}, {"0S&E(1", 'F'}, {"0S&E(F", 'F'}, {"0S&E(N", 'F'}, {"0S&E(O", 'F'}, {"0S&E(S", 'F'}, {"0S&E(V", 'F'}, {"0S&E1", 'F'}, {"0S&E1;", 'F'}, {"0S&E1C", 'F'}, {"0S&E1K", 'F'}, {"0S&E1O", 'F'}, {"0S&EF(", 'F'}, {"0S&EK(", 'F'}, {"0S&EK1", 'F'}, {"0S&EKF", 'F'}, {"0S&EKN", 'F'}, {"0S&EKS", 'F'}, {"0S&EKV", 'F'}, {"0S&EN", 'F'}, {"0S&EN;", 'F'}, {"0S&ENC", 'F'}, {"0S&ENK", 'F'}, {"0S&ENO", 'F'}, {"0S&ES", 'F'}, {"0S&ES;", 'F'}, {"0S&ESC", 'F'}, {"0S&ESK", 'F'}, {"0S&ESO", 'F'}, {"0S&EV", 'F'}, {"0S&EV;", 'F'}, {"0S&EVC", 'F'}, {"0S&EVK", 'F'}, {"0S&EVO", 'F'}, {"0S&F()", 'F'}, {"0S&F(1", 'F'}, {"0S&F(E", 'F'}, {"0S&F(F", 'F'}, {"0S&F(N", 'F'}, {"0S&F(S", 'F'}, {"0S&F(V", 'F'}, {"0S&K&(", 'F'}, {"0S&K&1", 'F'}, {"0S&K&F", 'F'}, {"0S&K&N", 'F'}, {"0S&K&S", 'F'}, {"0S&K&V", 'F'}, {"0S&K(1", 'F'}, {"0S&K(F", 'F'}, {"0S&K(N", 'F'}, {"0S&K(S", 'F'}, {"0S&K(V", 'F'}, {"0S&K1O", 'F'}, {"0S&KC", 'F'}, {"0S&KF(", 'F'}, {"0S&KNK", 'F'}, {"0S&KO(", 'F'}, {"0S&KO1", 'F'}, {"0S&KOF", 'F'}, {"0S&KOK", 'F'}, {"0S&KON", 'F'}, {"0S&KOS", 'F'}, {"0S&KOV", 'F'}, {"0S&KSO", 'F'}, {"0S&KVO", 'F'}, {"0S&N", 'F'}, {"0S&N&(", 'F'}, {"0S&N&1", 'F'}, {"0S&N&F", 'F'}, {"0S&N&N", 'F'}, {"0S&N&S", 'F'}, {"0S&N&V", 'F'}, {"0S&N)&", 'F'}, {"0S&N)C", 'F'}, {"0S&N)O", 'F'}, {"0S&N)U", 'F'}, {"0S&N;", 'F'}, {"0S&N;C", 'F'}, {"0S&N;E", 'F'}, {"0S&N;T", 'F'}, {"0S&NB(", 'F'}, {"0S&NB1", 'F'}, {"0S&NBF", 'F'}, {"0S&NBN", 'F'}, {"0S&NBS", 'F'}, {"0S&NBV", 'F'}, {"0S&NC", 'F'}, {"0S&NEN", 'F'}, {"0S&NF(", 'F'}, {"0S&NK(", 'F'}, {"0S&NK1", 'F'}, {"0S&NKF", 'F'}, {"0S&NKN", 'F'}, {"0S&NKS", 'F'}, {"0S&NKV", 'F'}, {"0S&NO(", 'F'}, {"0S&NOF", 'F'}, {"0S&NOS", 'F'}, {"0S&NOV", 'F'}, {"0S&NTN", 'F'}, {"0S&NU", 'F'}, {"0S&NU(", 'F'}, {"0S&NU;", 'F'}, {"0S&NUC", 'F'}, {"0S&NUE", 'F'}, {"0S&S", 'F'}, {"0S&S&(", 'F'}, {"0S&S&1", 'F'}, {"0S&S&F", 'F'}, {"0S&S&N", 'F'}, {"0S&S&S", 'F'}, {"0S&S&V", 'F'}, {"0S&S)&", 'F'}, {"0S&S)C", 'F'}, {"0S&S)O", 'F'}, {"0S&S)U", 'F'}, {"0S&S1", 'F'}, {"0S&S1;", 'F'}, {"0S&S1C", 'F'}, {"0S&S;", 'F'}, {"0S&S;C", 'F'}, {"0S&S;E", 'F'}, {"0S&S;T", 'F'}, {"0S&SB(", 'F'}, {"0S&SB1", 'F'}, {"0S&SBF", 'F'}, {"0S&SBN", 'F'}, {"0S&SBS", 'F'}, {"0S&SBV", 'F'}, {"0S&SC", 'F'}, {"0S&SEK", 'F'}, {"0S&SEN", 'F'}, {"0S&SF(", 'F'}, {"0S&SK(", 'F'}, {"0S&SK1", 'F'}, {"0S&SKF", 'F'}, {"0S&SKN", 'F'}, {"0S&SKS", 'F'}, {"0S&SKV", 'F'}, {"0S&SO(", 'F'}, {"0S&SO1", 'F'}, {"0S&SOF", 'F'}, {"0S&SON", 'F'}, {"0S&SOS", 'F'}, {"0S&SOV", 'F'}, {"0S&STN", 'F'}, {"0S&SU", 'F'}, {"0S&SU(", 'F'}, {"0S&SU;", 'F'}, {"0S&SUC", 'F'}, {"0S&SUE", 'F'}, {"0S&SV", 'F'}, {"0S&SV;", 'F'}, {"0S&SVC", 'F'}, {"0S&SVO", 'F'}, {"0S&V", 'F'}, {"0S&V&(", 'F'}, {"0S&V&1", 'F'}, {"0S&V&F", 'F'}, {"0S&V&N", 'F'}, {"0S&V&S", 'F'}, {"0S&V&V", 'F'}, {"0S&V)&", 'F'}, {"0S&V)C", 'F'}, {"0S&V)O", 'F'}, {"0S&V)U", 'F'}, {"0S&V;", 'F'}, {"0S&V;C", 'F'}, {"0S&V;E", 'F'}, {"0S&V;T", 'F'}, {"0S&VB(", 'F'}, {"0S&VB1", 'F'}, {"0S&VBF", 'F'}, {"0S&VBN", 'F'}, {"0S&VBS", 'F'}, {"0S&VBV", 'F'}, {"0S&VC", 'F'}, {"0S&VEK", 'F'}, {"0S&VEN", 'F'}, {"0S&VF(", 'F'}, {"0S&VK(", 'F'}, {"0S&VK1", 'F'}, {"0S&VKF", 'F'}, {"0S&VKN", 'F'}, {"0S&VKS", 'F'}, {"0S&VKV", 'F'}, {"0S&VO(", 'F'}, {"0S&VOF", 'F'}, {"0S&VOS", 'F'}, {"0S&VS", 'F'}, {"0S&VS;", 'F'}, {"0S&VSC", 'F'}, {"0S&VSO", 'F'}, {"0S&VTN", 'F'}, {"0S&VU", 'F'}, {"0S&VU(", 'F'}, {"0S&VU;", 'F'}, {"0S&VUC", 'F'}, {"0S&VUE", 'F'}, {"0S(EF(", 'F'}, {"0S(EKF", 'F'}, {"0S(EKN", 'F'}, {"0S(ENK", 'F'}, {"0S(U(E", 'F'}, {"0S)&(1", 'F'}, {"0S)&(E", 'F'}, {"0S)&(F", 'F'}, {"0S)&(N", 'F'}, {"0S)&(S", 'F'}, {"0S)&(V", 'F'}, {"0S)&1", 'F'}, {"0S)&1&", 'F'}, {"0S)&1)", 'F'}, {"0S)&1;", 'F'}, {"0S)&1B", 'F'}, {"0S)&1C", 'F'}, {"0S)&1F", 'F'}, {"0S)&1O", 'F'}, {"0S)&1U", 'F'}, {"0S)&F(", 'F'}, {"0S)&N", 'F'}, {"0S)&N&", 'F'}, {"0S)&N)", 'F'}, {"0S)&N;", 'F'}, {"0S)&NB", 'F'}, {"0S)&NC", 'F'}, {"0S)&NF", 'F'}, {"0S)&NO", 'F'}, {"0S)&NU", 'F'}, {"0S)&S", 'F'}, {"0S)&S&", 'F'}, {"0S)&S)", 'F'}, {"0S)&S;", 'F'}, {"0S)&SB", 'F'}, {"0S)&SC", 'F'}, {"0S)&SF", 'F'}, {"0S)&SO", 'F'}, {"0S)&SU", 'F'}, {"0S)&V", 'F'}, {"0S)&V&", 'F'}, {"0S)&V)", 'F'}, {"0S)&V;", 'F'}, {"0S)&VB", 'F'}, {"0S)&VC", 'F'}, {"0S)&VF", 'F'}, {"0S)&VO", 'F'}, {"0S)&VU", 'F'}, {"0S),(1", 'F'}, {"0S),(F", 'F'}, {"0S),(N", 'F'}, {"0S),(S", 'F'}, {"0S),(V", 'F'}, {"0S);E(", 'F'}, {"0S);E1", 'F'}, {"0S);EF", 'F'}, {"0S);EK", 'F'}, {"0S);EN", 'F'}, {"0S);EO", 'F'}, {"0S);ES", 'F'}, {"0S);EV", 'F'}, {"0S);T(", 'F'}, {"0S);T1", 'F'}, {"0S);TF", 'F'}, {"0S);TK", 'F'}, {"0S);TN", 'F'}, {"0S);TO", 'F'}, {"0S);TS", 'F'}, {"0S);TV", 'F'}, {"0S)B(1", 'F'}, {"0S)B(F", 'F'}, {"0S)B(N", 'F'}, {"0S)B(S", 'F'}, {"0S)B(V", 'F'}, {"0S)B1", 'F'}, {"0S)B1&", 'F'}, {"0S)B1;", 'F'}, {"0S)B1C", 'F'}, {"0S)B1K", 'F'}, {"0S)B1N", 'F'}, {"0S)B1O", 'F'}, {"0S)B1U", 'F'}, {"0S)BF(", 'F'}, {"0S)BN", 'F'}, {"0S)BN&", 'F'}, {"0S)BN;", 'F'}, {"0S)BNC", 'F'}, {"0S)BNK", 'F'}, {"0S)BNO", 'F'}, {"0S)BNU", 'F'}, {"0S)BS", 'F'}, {"0S)BS&", 'F'}, {"0S)BS;", 'F'}, {"0S)BSC", 'F'}, {"0S)BSK", 'F'}, {"0S)BSO", 'F'}, {"0S)BSU", 'F'}, {"0S)BV", 'F'}, {"0S)BV&", 'F'}, {"0S)BV;", 'F'}, {"0S)BVC", 'F'}, {"0S)BVK", 'F'}, {"0S)BVO", 'F'}, {"0S)BVU", 'F'}, {"0S)C", 'F'}, {"0S)E(1", 'F'}, {"0S)E(F", 'F'}, {"0S)E(N", 'F'}, {"0S)E(S", 'F'}, {"0S)E(V", 'F'}, {"0S)E1C", 'F'}, {"0S)E1O", 'F'}, {"0S)EF(", 'F'}, {"0S)EK(", 'F'}, {"0S)EK1", 'F'}, {"0S)EKF", 'F'}, {"0S)EKN", 'F'}, {"0S)EKS", 'F'}, {"0S)EKV", 'F'}, {"0S)ENC", 'F'}, {"0S)ENO", 'F'}, {"0S)ESC", 'F'}, {"0S)ESO", 'F'}, {"0S)EVC", 'F'}, {"0S)EVO", 'F'}, {"0S)F(F", 'F'}, {"0S)K(1", 'F'}, {"0S)K(F", 'F'}, {"0S)K(N", 'F'}, {"0S)K(S", 'F'}, {"0S)K(V", 'F'}, {"0S)K1&", 'F'}, {"0S)K1;", 'F'}, {"0S)K1B", 'F'}, {"0S)K1E", 'F'}, {"0S)K1O", 'F'}, {"0S)K1U", 'F'}, {"0S)KB(", 'F'}, {"0S)KB1", 'F'}, {"0S)KBF", 'F'}, {"0S)KBN", 'F'}, {"0S)KBS", 'F'}, {"0S)KBV", 'F'}, {"0S)KF(", 'F'}, {"0S)KN&", 'F'}, {"0S)KN;", 'F'}, {"0S)KNB", 'F'}, {"0S)KNC", 'F'}, {"0S)KNE", 'F'}, {"0S)KNK", 'F'}, {"0S)KNU", 'F'}, {"0S)KS&", 'F'}, {"0S)KS;", 'F'}, {"0S)KSB", 'F'}, {"0S)KSE", 'F'}, {"0S)KSO", 'F'}, {"0S)KSU", 'F'}, {"0S)KUE", 'F'}, {"0S)KV&", 'F'}, {"0S)KV;", 'F'}, {"0S)KVB", 'F'}, {"0S)KVE", 'F'}, {"0S)KVO", 'F'}, {"0S)KVU", 'F'}, {"0S)O(1", 'F'}, {"0S)O(E", 'F'}, {"0S)O(F", 'F'}, {"0S)O(N", 'F'}, {"0S)O(S", 'F'}, {"0S)O(V", 'F'}, {"0S)O1", 'F'}, {"0S)O1&", 'F'}, {"0S)O1)", 'F'}, {"0S)O1;", 'F'}, {"0S)O1B", 'F'}, {"0S)O1C", 'F'}, {"0S)O1K", 'F'}, {"0S)O1U", 'F'}, {"0S)OF(", 'F'}, {"0S)ON&", 'F'}, {"0S)ON)", 'F'}, {"0S)ON;", 'F'}, {"0S)ONB", 'F'}, {"0S)ONC", 'F'}, {"0S)ONK", 'F'}, {"0S)ONU", 'F'}, {"0S)OS", 'F'}, {"0S)OS&", 'F'}, {"0S)OS)", 'F'}, {"0S)OS;", 'F'}, {"0S)OSB", 'F'}, {"0S)OSC", 'F'}, {"0S)OSK", 'F'}, {"0S)OSU", 'F'}, {"0S)OV", 'F'}, {"0S)OV&", 'F'}, {"0S)OV)", 'F'}, {"0S)OV;", 'F'}, {"0S)OVB", 'F'}, {"0S)OVC", 'F'}, {"0S)OVK", 'F'}, {"0S)OVO", 'F'}, {"0S)OVU", 'F'}, {"0S)U(E", 'F'}, {"0S)UE(", 'F'}, {"0S)UE1", 'F'}, {"0S)UEF", 'F'}, {"0S)UEK", 'F'}, {"0S)UEN", 'F'}, {"0S)UES", 'F'}, {"0S)UEV", 'F'}, {"0S,(1)", 'F'}, {"0S,(1O", 'F'}, {"0S,(E(", 'F'}, {"0S,(E1", 'F'}, {"0S,(EF", 'F'}, {"0S,(EK", 'F'}, {"0S,(EN", 'F'}, {"0S,(ES", 'F'}, {"0S,(EV", 'F'}, {"0S,(F(", 'F'}, {"0S,(N)", 'F'}, {"0S,(NO", 'F'}, {"0S,(S)", 'F'}, {"0S,(SO", 'F'}, {"0S,(V)", 'F'}, {"0S,(VO", 'F'}, {"0S,F()", 'F'}, {"0S,F(1", 'F'}, {"0S,F(F", 'F'}, {"0S,F(N", 'F'}, {"0S,F(S", 'F'}, {"0S,F(V", 'F'}, {"0S1F()", 'F'}, {"0S1F(1", 'F'}, {"0S1F(F", 'F'}, {"0S1F(N", 'F'}, {"0S1F(S", 'F'}, {"0S1F(V", 'F'}, {"0S1NC", 'F'}, {"0S1S;", 'F'}, {"0S1S;C", 'F'}, {"0S1SC", 'F'}, {"0S1UE", 'F'}, {"0S1UE;", 'F'}, {"0S1UEC", 'F'}, {"0S1UEK", 'F'}, {"0S1V", 'F'}, {"0S1V;", 'F'}, {"0S1V;C", 'F'}, {"0S1VC", 'F'}, {"0S1VO(", 'F'}, {"0S1VOF", 'F'}, {"0S1VOS", 'F'}, {"0S;E(1", 'F'}, {"0S;E(E", 'F'}, {"0S;E(F", 'F'}, {"0S;E(N", 'F'}, {"0S;E(S", 'F'}, {"0S;E(V", 'F'}, {"0S;E1,", 'F'}, {"0S;E1;", 'F'}, {"0S;E1C", 'F'}, {"0S;E1K", 'F'}, {"0S;E1O", 'F'}, {"0S;E1T", 'F'}, {"0S;EF(", 'F'}, {"0S;EK(", 'F'}, {"0S;EK1", 'F'}, {"0S;EKF", 'F'}, {"0S;EKN", 'F'}, {"0S;EKO", 'F'}, {"0S;EKS", 'F'}, {"0S;EKV", 'F'}, {"0S;EN,", 'F'}, {"0S;EN;", 'F'}, {"0S;ENC", 'F'}, {"0S;ENE", 'F'}, {"0S;ENK", 'F'}, {"0S;ENO", 'F'}, {"0S;ENT", 'F'}, {"0S;ES,", 'F'}, {"0S;ES;", 'F'}, {"0S;ESC", 'F'}, {"0S;ESK", 'F'}, {"0S;ESO", 'F'}, {"0S;EST", 'F'}, {"0S;EV,", 'F'}, {"0S;EV;", 'F'}, {"0S;EVC", 'F'}, {"0S;EVK", 'F'}, {"0S;EVO", 'F'}, {"0S;EVT", 'F'}, {"0S;N:T", 'F'}, {"0S;T(1", 'F'}, {"0S;T(C", 'F'}, {"0S;T(E", 'F'}, {"0S;T(F", 'F'}, {"0S;T(N", 'F'}, {"0S;T(S", 'F'}, {"0S;T(V", 'F'}, {"0S;T1(", 'F'}, {"0S;T1,", 'F'}, {"0S;T1;", 'F'}, {"0S;T1C", 'F'}, {"0S;T1F", 'F'}, {"0S;T1K", 'F'}, {"0S;T1O", 'F'}, {"0S;T1T", 'F'}, {"0S;T;", 'F'}, {"0S;T;C", 'F'}, {"0S;TF(", 'F'}, {"0S;TK(", 'F'}, {"0S;TK1", 'F'}, {"0S;TKF", 'F'}, {"0S;TKK", 'F'}, {"0S;TKN", 'F'}, {"0S;TKO", 'F'}, {"0S;TKS", 'F'}, {"0S;TKV", 'F'}, {"0S;TN(", 'F'}, {"0S;TN,", 'F'}, {"0S;TN1", 'F'}, {"0S;TN;", 'F'}, {"0S;TNC", 'F'}, {"0S;TNE", 'F'}, {"0S;TNF", 'F'}, {"0S;TNK", 'F'}, {"0S;TNN", 'F'}, {"0S;TNO", 'F'}, {"0S;TNS", 'F'}, {"0S;TNT", 'F'}, {"0S;TNV", 'F'}, {"0S;TO(", 'F'}, {"0S;TS(", 'F'}, {"0S;TS,", 'F'}, {"0S;TS;", 'F'}, {"0S;TSC", 'F'}, {"0S;TSF", 'F'}, {"0S;TSK", 'F'}, {"0S;TSO", 'F'}, {"0S;TST", 'F'}, {"0S;TTN", 'F'}, {"0S;TV(", 'F'}, {"0S;TV,", 'F'}, {"0S;TV;", 'F'}, {"0S;TVC", 'F'}, {"0S;TVF", 'F'}, {"0S;TVK", 'F'}, {"0S;TVO", 'F'}, {"0S;TVT", 'F'}, {"0SA(F(", 'F'}, {"0SA(N)", 'F'}, {"0SA(NO", 'F'}, {"0SA(S)", 'F'}, {"0SA(SO", 'F'}, {"0SA(V)", 'F'}, {"0SA(VO", 'F'}, {"0SAF()", 'F'}, {"0SAF(1", 'F'}, {"0SAF(F", 'F'}, {"0SAF(N", 'F'}, {"0SAF(S", 'F'}, {"0SAF(V", 'F'}, {"0SASO(", 'F'}, {"0SASO1", 'F'}, {"0SASOF", 'F'}, {"0SASON", 'F'}, {"0SASOS", 'F'}, {"0SASOV", 'F'}, {"0SASUE", 'F'}, {"0SATO(", 'F'}, {"0SATO1", 'F'}, {"0SATOF", 'F'}, {"0SATON", 'F'}, {"0SATOS", 'F'}, {"0SATOV", 'F'}, {"0SATUE", 'F'}, {"0SAVO(", 'F'}, {"0SAVOF", 'F'}, {"0SAVOS", 'F'}, {"0SAVUE", 'F'}, {"0SB(1)", 'F'}, {"0SB(1O", 'F'}, {"0SB(F(", 'F'}, {"0SB(NO", 'F'}, {"0SB(S)", 'F'}, {"0SB(SO", 'F'}, {"0SB(V)", 'F'}, {"0SB(VO", 'F'}, {"0SB1", 'F'}, {"0SB1&(", 'F'}, {"0SB1&1", 'F'}, {"0SB1&F", 'F'}, {"0SB1&N", 'F'}, {"0SB1&S", 'F'}, {"0SB1&V", 'F'}, {"0SB1,(", 'F'}, {"0SB1,F", 'F'}, {"0SB1;", 'F'}, {"0SB1;C", 'F'}, {"0SB1B(", 'F'}, {"0SB1B1", 'F'}, {"0SB1BF", 'F'}, {"0SB1BN", 'F'}, {"0SB1BS", 'F'}, {"0SB1BV", 'F'}, {"0SB1C", 'F'}, {"0SB1K(", 'F'}, {"0SB1K1", 'F'}, {"0SB1KF", 'F'}, {"0SB1KN", 'F'}, {"0SB1KS", 'F'}, {"0SB1KV", 'F'}, {"0SB1O(", 'F'}, {"0SB1OF", 'F'}, {"0SB1OS", 'F'}, {"0SB1OV", 'F'}, {"0SB1U(", 'F'}, {"0SB1UE", 'F'}, {"0SBE(1", 'F'}, {"0SBE(F", 'F'}, {"0SBE(N", 'F'}, {"0SBE(S", 'F'}, {"0SBE(V", 'F'}, {"0SBEK(", 'F'}, {"0SBF()", 'F'}, {"0SBF(1", 'F'}, {"0SBF(F", 'F'}, {"0SBF(N", 'F'}, {"0SBF(S", 'F'}, {"0SBF(V", 'F'}, {"0SBN", 'F'}, {"0SBN&(", 'F'}, {"0SBN&1", 'F'}, {"0SBN&F", 'F'}, {"0SBN&N", 'F'}, {"0SBN&S", 'F'}, {"0SBN&V", 'F'}, {"0SBN,(", 'F'}, {"0SBN,F", 'F'}, {"0SBN;", 'F'}, {"0SBN;C", 'F'}, {"0SBNB(", 'F'}, {"0SBNB1", 'F'}, {"0SBNBF", 'F'}, {"0SBNBN", 'F'}, {"0SBNBS", 'F'}, {"0SBNBV", 'F'}, {"0SBNC", 'F'}, {"0SBNK(", 'F'}, {"0SBNK1", 'F'}, {"0SBNKF", 'F'}, {"0SBNKN", 'F'}, {"0SBNKS", 'F'}, {"0SBNKV", 'F'}, {"0SBNO(", 'F'}, {"0SBNOF", 'F'}, {"0SBNOS", 'F'}, {"0SBNOV", 'F'}, {"0SBNU(", 'F'}, {"0SBNUE", 'F'}, {"0SBS", 'F'}, {"0SBS&(", 'F'}, {"0SBS&1", 'F'}, {"0SBS&F", 'F'}, {"0SBS&N", 'F'}, {"0SBS&S", 'F'}, {"0SBS&V", 'F'}, {"0SBS,(", 'F'}, {"0SBS,F", 'F'}, {"0SBS;", 'F'}, {"0SBS;C", 'F'}, {"0SBSB(", 'F'}, {"0SBSB1", 'F'}, {"0SBSBF", 'F'}, {"0SBSBN", 'F'}, {"0SBSBS", 'F'}, {"0SBSBV", 'F'}, {"0SBSC", 'F'}, {"0SBSK(", 'F'}, {"0SBSK1", 'F'}, {"0SBSKF", 'F'}, {"0SBSKN", 'F'}, {"0SBSKS", 'F'}, {"0SBSKV", 'F'}, {"0SBSO(", 'F'}, {"0SBSO1", 'F'}, {"0SBSOF", 'F'}, {"0SBSON", 'F'}, {"0SBSOS", 'F'}, {"0SBSOV", 'F'}, {"0SBSU(", 'F'}, {"0SBSUE", 'F'}, {"0SBV", 'F'}, {"0SBV&(", 'F'}, {"0SBV&1", 'F'}, {"0SBV&F", 'F'}, {"0SBV&N", 'F'}, {"0SBV&S", 'F'}, {"0SBV&V", 'F'}, {"0SBV,(", 'F'}, {"0SBV,F", 'F'}, {"0SBV;", 'F'}, {"0SBV;C", 'F'}, {"0SBVB(", 'F'}, {"0SBVB1", 'F'}, {"0SBVBF", 'F'}, {"0SBVBN", 'F'}, {"0SBVBS", 'F'}, {"0SBVBV", 'F'}, {"0SBVC", 'F'}, {"0SBVK(", 'F'}, {"0SBVK1", 'F'}, {"0SBVKF", 'F'}, {"0SBVKN", 'F'}, {"0SBVKS", 'F'}, {"0SBVKV", 'F'}, {"0SBVO(", 'F'}, {"0SBVOF", 'F'}, {"0SBVOS", 'F'}, {"0SBVU(", 'F'}, {"0SBVUE", 'F'}, {"0SC", 'F'}, {"0SE(1)", 'F'}, {"0SE(1O", 'F'}, {"0SE(F(", 'F'}, {"0SE(N)", 'F'}, {"0SE(NO", 'F'}, {"0SE(S)", 'F'}, {"0SE(SO", 'F'}, {"0SE(V)", 'F'}, {"0SE(VO", 'F'}, {"0SE1;T", 'F'}, {"0SE1C", 'F'}, {"0SE1O(", 'F'}, {"0SE1OF", 'F'}, {"0SE1OS", 'F'}, {"0SE1OV", 'F'}, {"0SE1T(", 'F'}, {"0SE1T1", 'F'}, {"0SE1TF", 'F'}, {"0SE1TN", 'F'}, {"0SE1TS", 'F'}, {"0SE1TV", 'F'}, {"0SE1UE", 'F'}, {"0SEF()", 'F'}, {"0SEF(1", 'F'}, {"0SEF(F", 'F'}, {"0SEF(N", 'F'}, {"0SEF(S", 'F'}, {"0SEF(V", 'F'}, {"0SEK(1", 'F'}, {"0SEK(E", 'F'}, {"0SEK(F", 'F'}, {"0SEK(N", 'F'}, {"0SEK(S", 'F'}, {"0SEK(V", 'F'}, {"0SEK1;", 'F'}, {"0SEK1C", 'F'}, {"0SEK1O", 'F'}, {"0SEK1T", 'F'}, {"0SEK1U", 'F'}, {"0SEKF(", 'F'}, {"0SEKN;", 'F'}, {"0SEKNC", 'F'}, {"0SEKNE", 'F'}, {"0SEKNT", 'F'}, {"0SEKNU", 'F'}, {"0SEKOK", 'F'}, {"0SEKS;", 'F'}, {"0SEKSC", 'F'}, {"0SEKSO", 'F'}, {"0SEKST", 'F'}, {"0SEKSU", 'F'}, {"0SEKU(", 'F'}, {"0SEKU1", 'F'}, {"0SEKUE", 'F'}, {"0SEKUF", 'F'}, {"0SEKUS", 'F'}, {"0SEKUV", 'F'}, {"0SEKV;", 'F'}, {"0SEKVC", 'F'}, {"0SEKVO", 'F'}, {"0SEKVT", 'F'}, {"0SEKVU", 'F'}, {"0SEN;T", 'F'}, {"0SENC", 'F'}, {"0SENEN", 'F'}, {"0SENO(", 'F'}, {"0SENOF", 'F'}, {"0SENOS", 'F'}, {"0SENOV", 'F'}, {"0SENT(", 'F'}, {"0SENT1", 'F'}, {"0SENTF", 'F'}, {"0SENTN", 'F'}, {"0SENTS", 'F'}, {"0SENTV", 'F'}, {"0SENUE", 'F'}, {"0SEOKN", 'F'}, {"0SES;T", 'F'}, {"0SESC", 'F'}, {"0SESO(", 'F'}, {"0SESO1", 'F'}, {"0SESOF", 'F'}, {"0SESON", 'F'}, {"0SESOS", 'F'}, {"0SESOV", 'F'}, {"0SEST(", 'F'}, {"0SEST1", 'F'}, {"0SESTF", 'F'}, {"0SESTN", 'F'}, {"0SESTS", 'F'}, {"0SESTV", 'F'}, {"0SESUE", 'F'}, {"0SEU(1", 'F'}, {"0SEU(F", 'F'}, {"0SEU(N", 'F'}, {"0SEU(S", 'F'}, {"0SEU(V", 'F'}, {"0SEU1,", 'F'}, {"0SEU1C", 'F'}, {"0SEU1O", 'F'}, {"0SEUEF", 'F'}, {"0SEUEK", 'F'}, {"0SEUF(", 'F'}, {"0SEUS,", 'F'}, {"0SEUSC", 'F'}, {"0SEUSO", 'F'}, {"0SEUV,", 'F'}, {"0SEUVC", 'F'}, {"0SEUVO", 'F'}, {"0SEV;T", 'F'}, {"0SEVC", 'F'}, {"0SEVO(", 'F'}, {"0SEVOF", 'F'}, {"0SEVOS", 'F'}, {"0SEVT(", 'F'}, {"0SEVT1", 'F'}, {"0SEVTF", 'F'}, {"0SEVTN", 'F'}, {"0SEVTS", 'F'}, {"0SEVTV", 'F'}, {"0SEVUE", 'F'}, {"0SF()1", 'F'}, {"0SF()F", 'F'}, {"0SF()K", 'F'}, {"0SF()N", 'F'}, {"0SF()O", 'F'}, {"0SF()S", 'F'}, {"0SF()U", 'F'}, {"0SF()V", 'F'}, {"0SF(1)", 'F'}, {"0SF(1N", 'F'}, {"0SF(1O", 'F'}, {"0SF(E(", 'F'}, {"0SF(E1", 'F'}, {"0SF(EF", 'F'}, {"0SF(EK", 'F'}, {"0SF(EN", 'F'}, {"0SF(ES", 'F'}, {"0SF(EV", 'F'}, {"0SF(F(", 'F'}, {"0SF(N)", 'F'}, {"0SF(N,", 'F'}, {"0SF(NO", 'F'}, {"0SF(S)", 'F'}, {"0SF(SO", 'F'}, {"0SF(V)", 'F'}, {"0SF(VO", 'F'}, {"0SK(1)", 'F'}, {"0SK(1O", 'F'}, {"0SK(F(", 'F'}, {"0SK(N)", 'F'}, {"0SK(NO", 'F'}, {"0SK(S)", 'F'}, {"0SK(SO", 'F'}, {"0SK(V)", 'F'}, {"0SK(VO", 'F'}, {"0SK)&(", 'F'}, {"0SK)&1", 'F'}, {"0SK)&F", 'F'}, {"0SK)&N", 'F'}, {"0SK)&S", 'F'}, {"0SK)&V", 'F'}, {"0SK);E", 'F'}, {"0SK);T", 'F'}, {"0SK)B(", 'F'}, {"0SK)B1", 'F'}, {"0SK)BF", 'F'}, {"0SK)BN", 'F'}, {"0SK)BS", 'F'}, {"0SK)BV", 'F'}, {"0SK)E(", 'F'}, {"0SK)E1", 'F'}, {"0SK)EF", 'F'}, {"0SK)EK", 'F'}, {"0SK)EN", 'F'}, {"0SK)ES", 'F'}, {"0SK)EV", 'F'}, {"0SK)F(", 'F'}, {"0SK)O(", 'F'}, {"0SK)OF", 'F'}, {"0SK)UE", 'F'}, {"0SK1", 'F'}, {"0SK1&(", 'F'}, {"0SK1&1", 'F'}, {"0SK1&F", 'F'}, {"0SK1&N", 'F'}, {"0SK1&S", 'F'}, {"0SK1&V", 'F'}, {"0SK1;", 'F'}, {"0SK1;C", 'F'}, {"0SK1;E", 'F'}, {"0SK1;T", 'F'}, {"0SK1B(", 'F'}, {"0SK1B1", 'F'}, {"0SK1BF", 'F'}, {"0SK1BN", 'F'}, {"0SK1BS", 'F'}, {"0SK1BV", 'F'}, {"0SK1C", 'F'}, {"0SK1E(", 'F'}, {"0SK1E1", 'F'}, {"0SK1EF", 'F'}, {"0SK1EK", 'F'}, {"0SK1EN", 'F'}, {"0SK1ES", 'F'}, {"0SK1EV", 'F'}, {"0SK1O(", 'F'}, {"0SK1OF", 'F'}, {"0SK1OS", 'F'}, {"0SK1OV", 'F'}, {"0SK1U(", 'F'}, {"0SK1UE", 'F'}, {"0SKF()", 'F'}, {"0SKF(1", 'F'}, {"0SKF(F", 'F'}, {"0SKF(N", 'F'}, {"0SKF(S", 'F'}, {"0SKF(V", 'F'}, {"0SKN", 'F'}, {"0SKN&(", 'F'}, {"0SKN&1", 'F'}, {"0SKN&F", 'F'}, {"0SKN&N", 'F'}, {"0SKN&S", 'F'}, {"0SKN&V", 'F'}, {"0SKN;", 'F'}, {"0SKN;C", 'F'}, {"0SKN;E", 'F'}, {"0SKN;T", 'F'}, {"0SKNB(", 'F'}, {"0SKNB1", 'F'}, {"0SKNBF", 'F'}, {"0SKNBN", 'F'}, {"0SKNBS", 'F'}, {"0SKNBV", 'F'}, {"0SKNC", 'F'}, {"0SKNE(", 'F'}, {"0SKNE1", 'F'}, {"0SKNEF", 'F'}, {"0SKNEN", 'F'}, {"0SKNES", 'F'}, {"0SKNEV", 'F'}, {"0SKNU(", 'F'}, {"0SKNUE", 'F'}, {"0SKS", 'F'}, {"0SKS&(", 'F'}, {"0SKS&1", 'F'}, {"0SKS&F", 'F'}, {"0SKS&N", 'F'}, {"0SKS&S", 'F'}, {"0SKS&V", 'F'}, {"0SKS;", 'F'}, {"0SKS;C", 'F'}, {"0SKS;E", 'F'}, {"0SKS;T", 'F'}, {"0SKSB(", 'F'}, {"0SKSB1", 'F'}, {"0SKSBF", 'F'}, {"0SKSBN", 'F'}, {"0SKSBS", 'F'}, {"0SKSBV", 'F'}, {"0SKSC", 'F'}, {"0SKSE(", 'F'}, {"0SKSE1", 'F'}, {"0SKSEF", 'F'}, {"0SKSEK", 'F'}, {"0SKSEN", 'F'}, {"0SKSES", 'F'}, {"0SKSEV", 'F'}, {"0SKSO(", 'F'}, {"0SKSO1", 'F'}, {"0SKSOF", 'F'}, {"0SKSON", 'F'}, {"0SKSOS", 'F'}, {"0SKSOV", 'F'}, {"0SKSU(", 'F'}, {"0SKSUE", 'F'}, {"0SKUE(", 'F'}, {"0SKUE1", 'F'}, {"0SKUEF", 'F'}, {"0SKUEK", 'F'}, {"0SKUEN", 'F'}, {"0SKUES", 'F'}, {"0SKUEV", 'F'}, {"0SKV", 'F'}, {"0SKV&(", 'F'}, {"0SKV&1", 'F'}, {"0SKV&F", 'F'}, {"0SKV&N", 'F'}, {"0SKV&S", 'F'}, {"0SKV&V", 'F'}, {"0SKV;", 'F'}, {"0SKV;C", 'F'}, {"0SKV;E", 'F'}, {"0SKV;T", 'F'}, {"0SKVB(", 'F'}, {"0SKVB1", 'F'}, {"0SKVBF", 'F'}, {"0SKVBN", 'F'}, {"0SKVBS", 'F'}, {"0SKVBV", 'F'}, {"0SKVC", 'F'}, {"0SKVE(", 'F'}, {"0SKVE1", 'F'}, {"0SKVEF", 'F'}, {"0SKVEK", 'F'}, {"0SKVEN", 'F'}, {"0SKVES", 'F'}, {"0SKVEV", 'F'}, {"0SKVO(", 'F'}, {"0SKVOF", 'F'}, {"0SKVOS", 'F'}, {"0SKVU(", 'F'}, {"0SKVUE", 'F'}, {"0SO(1&", 'F'}, {"0SO(1)", 'F'}, {"0SO(1,", 'F'}, {"0SO(1O", 'F'}, {"0SO(E(", 'F'}, {"0SO(E1", 'F'}, {"0SO(EE", 'F'}, {"0SO(EF", 'F'}, {"0SO(EK", 'F'}, {"0SO(EN", 'F'}, {"0SO(EO", 'F'}, {"0SO(ES", 'F'}, {"0SO(EV", 'F'}, {"0SO(F(", 'F'}, {"0SO(N&", 'F'}, {"0SO(N)", 'F'}, {"0SO(N,", 'F'}, {"0SO(NO", 'F'}, {"0SO(S&", 'F'}, {"0SO(S)", 'F'}, {"0SO(S,", 'F'}, {"0SO(SO", 'F'}, {"0SO(V&", 'F'}, {"0SO(V)", 'F'}, {"0SO(V,", 'F'}, {"0SO(VO", 'F'}, {"0SO1&(", 'F'}, {"0SO1&1", 'F'}, {"0SO1&E", 'F'}, {"0SO1&F", 'F'}, {"0SO1&K", 'F'}, {"0SO1&N", 'F'}, {"0SO1&S", 'F'}, {"0SO1&U", 'F'}, {"0SO1&V", 'F'}, {"0SO1(E", 'F'}, {"0SO1(U", 'F'}, {"0SO1)&", 'F'}, {"0SO1),", 'F'}, {"0SO1);", 'F'}, {"0SO1)B", 'F'}, {"0SO1)C", 'F'}, {"0SO1)E", 'F'}, {"0SO1)F", 'F'}, {"0SO1)K", 'F'}, {"0SO1)O", 'F'}, {"0SO1)U", 'F'}, {"0SO1,(", 'F'}, {"0SO1,F", 'F'}, {"0SO1;", 'F'}, {"0SO1;C", 'F'}, {"0SO1;E", 'F'}, {"0SO1;N", 'F'}, {"0SO1;T", 'F'}, {"0SO1A(", 'F'}, {"0SO1AF", 'F'}, {"0SO1AS", 'F'}, {"0SO1AT", 'F'}, {"0SO1AV", 'F'}, {"0SO1B(", 'F'}, {"0SO1B1", 'F'}, {"0SO1BE", 'F'}, {"0SO1BF", 'F'}, {"0SO1BN", 'F'}, {"0SO1BS", 'F'}, {"0SO1BV", 'F'}, {"0SO1C", 'F'}, {"0SO1E(", 'F'}, {"0SO1E1", 'F'}, {"0SO1EF", 'F'}, {"0SO1EK", 'F'}, {"0SO1EN", 'F'}, {"0SO1EO", 'F'}, {"0SO1ES", 'F'}, {"0SO1EU", 'F'}, {"0SO1EV", 'F'}, {"0SO1F(", 'F'}, {"0SO1K(", 'F'}, {"0SO1K)", 'F'}, {"0SO1K1", 'F'}, {"0SO1KB", 'F'}, {"0SO1KF", 'F'}, {"0SO1KN", 'F'}, {"0SO1KS", 'F'}, {"0SO1KU", 'F'}, {"0SO1KV", 'F'}, {"0SO1N&", 'F'}, {"0SO1N(", 'F'}, {"0SO1N,", 'F'}, {"0SO1NE", 'F'}, {"0SO1NU", 'F'}, {"0SO1SU", 'F'}, {"0SO1SV", 'F'}, {"0SO1T(", 'F'}, {"0SO1T1", 'F'}, {"0SO1TE", 'F'}, {"0SO1TF", 'F'}, {"0SO1TN", 'F'}, {"0SO1TS", 'F'}, {"0SO1TT", 'F'}, {"0SO1TV", 'F'}, {"0SO1U", 'F'}, {"0SO1U(", 'F'}, {"0SO1U1", 'F'}, {"0SO1U;", 'F'}, {"0SO1UC", 'F'}, {"0SO1UE", 'F'}, {"0SO1UF", 'F'}, {"0SO1UK", 'F'}, {"0SO1UO", 'F'}, {"0SO1US", 'F'}, {"0SO1UT", 'F'}, {"0SO1UV", 'F'}, {"0SO1V(", 'F'}, {"0SO1VF", 'F'}, {"0SO1VO", 'F'}, {"0SO1VS", 'F'}, {"0SO1VU", 'F'}, {"0SOF()", 'F'}, {"0SOF(1", 'F'}, {"0SOF(E", 'F'}, {"0SOF(F", 'F'}, {"0SOF(N", 'F'}, {"0SOF(S", 'F'}, {"0SOF(V", 'F'}, {"0SOK&(", 'F'}, {"0SOK&1", 'F'}, {"0SOK&F", 'F'}, {"0SOK&N", 'F'}, {"0SOK&S", 'F'}, {"0SOK&V", 'F'}, {"0SOK(1", 'F'}, {"0SOK(F", 'F'}, {"0SOK(N", 'F'}, {"0SOK(S", 'F'}, {"0SOK(V", 'F'}, {"0SOK1C", 'F'}, {"0SOK1O", 'F'}, {"0SOKF(", 'F'}, {"0SOKNC", 'F'}, {"0SOKO(", 'F'}, {"0SOKO1", 'F'}, {"0SOKOF", 'F'}, {"0SOKON", 'F'}, {"0SOKOS", 'F'}, {"0SOKOV", 'F'}, {"0SOKSC", 'F'}, {"0SOKSO", 'F'}, {"0SOKVC", 'F'}, {"0SOKVO", 'F'}, {"0SON&(", 'F'}, {"0SON&1", 'F'}, {"0SON&E", 'F'}, {"0SON&F", 'F'}, {"0SON&K", 'F'}, {"0SON&N", 'F'}, {"0SON&S", 'F'}, {"0SON&U", 'F'}, {"0SON&V", 'F'}, {"0SON(1", 'F'}, {"0SON(E", 'F'}, {"0SON(F", 'F'}, {"0SON(S", 'F'}, {"0SON(U", 'F'}, {"0SON(V", 'F'}, {"0SON)&", 'F'}, {"0SON),", 'F'}, {"0SON);", 'F'}, {"0SON)B", 'F'}, {"0SON)C", 'F'}, {"0SON)E", 'F'}, {"0SON)F", 'F'}, {"0SON)K", 'F'}, {"0SON)O", 'F'}, {"0SON)U", 'F'}, {"0SON,(", 'F'}, {"0SON,F", 'F'}, {"0SON1(", 'F'}, {"0SON1O", 'F'}, {"0SON1U", 'F'}, {"0SON1V", 'F'}, {"0SON;", 'F'}, {"0SON;C", 'F'}, {"0SON;E", 'F'}, {"0SON;N", 'F'}, {"0SON;T", 'F'}, {"0SONA(", 'F'}, {"0SONAF", 'F'}, {"0SONAS", 'F'}, {"0SONAT", 'F'}, {"0SONAV", 'F'}, {"0SONB(", 'F'}, {"0SONB1", 'F'}, {"0SONBE", 'F'}, {"0SONBF", 'F'}, {"0SONBN", 'F'}, {"0SONBS", 'F'}, {"0SONBV", 'F'}, {"0SONE(", 'F'}, {"0SONE1", 'F'}, {"0SONEF", 'F'}, {"0SONEN", 'F'}, {"0SONEO", 'F'}, {"0SONES", 'F'}, {"0SONEU", 'F'}, {"0SONEV", 'F'}, {"0SONF(", 'F'}, {"0SONK(", 'F'}, {"0SONK)", 'F'}, {"0SONK1", 'F'}, {"0SONKB", 'F'}, {"0SONKF", 'F'}, {"0SONKS", 'F'}, {"0SONKU", 'F'}, {"0SONKV", 'F'}, {"0SONSU", 'F'}, {"0SONT(", 'F'}, {"0SONT1", 'F'}, {"0SONTE", 'F'}, {"0SONTF", 'F'}, {"0SONTN", 'F'}, {"0SONTS", 'F'}, {"0SONTT", 'F'}, {"0SONTV", 'F'}, {"0SONU", 'F'}, {"0SONU(", 'F'}, {"0SONU1", 'F'}, {"0SONU;", 'F'}, {"0SONUC", 'F'}, {"0SONUE", 'F'}, {"0SONUF", 'F'}, {"0SONUK", 'F'}, {"0SONUO", 'F'}, {"0SONUS", 'F'}, {"0SONUT", 'F'}, {"0SONUV", 'F'}, {"0SOS", 'F'}, {"0SOS&(", 'F'}, {"0SOS&1", 'F'}, {"0SOS&E", 'F'}, {"0SOS&F", 'F'}, {"0SOS&K", 'F'}, {"0SOS&N", 'F'}, {"0SOS&S", 'F'}, {"0SOS&U", 'F'}, {"0SOS&V", 'F'}, {"0SOS(E", 'F'}, {"0SOS(U", 'F'}, {"0SOS)&", 'F'}, {"0SOS),", 'F'}, {"0SOS);", 'F'}, {"0SOS)B", 'F'}, {"0SOS)C", 'F'}, {"0SOS)E", 'F'}, {"0SOS)F", 'F'}, {"0SOS)K", 'F'}, {"0SOS)O", 'F'}, {"0SOS)U", 'F'}, {"0SOS,(", 'F'}, {"0SOS,F", 'F'}, {"0SOS1(", 'F'}, {"0SOS1F", 'F'}, {"0SOS1N", 'F'}, {"0SOS1S", 'F'}, {"0SOS1U", 'F'}, {"0SOS1V", 'F'}, {"0SOS;", 'F'}, {"0SOS;C", 'F'}, {"0SOS;E", 'F'}, {"0SOS;N", 'F'}, {"0SOS;T", 'F'}, {"0SOSA(", 'F'}, {"0SOSAF", 'F'}, {"0SOSAS", 'F'}, {"0SOSAT", 'F'}, {"0SOSAV", 'F'}, {"0SOSB(", 'F'}, {"0SOSB1", 'F'}, {"0SOSBE", 'F'}, {"0SOSBF", 'F'}, {"0SOSBN", 'F'}, {"0SOSBS", 'F'}, {"0SOSBV", 'F'}, {"0SOSC", 'F'}, {"0SOSE(", 'F'}, {"0SOSE1", 'F'}, {"0SOSEF", 'F'}, {"0SOSEK", 'F'}, {"0SOSEN", 'F'}, {"0SOSEO", 'F'}, {"0SOSES", 'F'}, {"0SOSEU", 'F'}, {"0SOSEV", 'F'}, {"0SOSF(", 'F'}, {"0SOSK(", 'F'}, {"0SOSK)", 'F'}, {"0SOSK1", 'F'}, {"0SOSKB", 'F'}, {"0SOSKF", 'F'}, {"0SOSKN", 'F'}, {"0SOSKS", 'F'}, {"0SOSKU", 'F'}, {"0SOSKV", 'F'}, {"0SOST(", 'F'}, {"0SOST1", 'F'}, {"0SOSTE", 'F'}, {"0SOSTF", 'F'}, {"0SOSTN", 'F'}, {"0SOSTS", 'F'}, {"0SOSTT", 'F'}, {"0SOSTV", 'F'}, {"0SOSU", 'F'}, {"0SOSU(", 'F'}, {"0SOSU1", 'F'}, {"0SOSU;", 'F'}, {"0SOSUC", 'F'}, {"0SOSUE", 'F'}, {"0SOSUF", 'F'}, {"0SOSUK", 'F'}, {"0SOSUO", 'F'}, {"0SOSUS", 'F'}, {"0SOSUT", 'F'}, {"0SOSUV", 'F'}, {"0SOSV(", 'F'}, {"0SOSVF", 'F'}, {"0SOSVO", 'F'}, {"0SOSVS", 'F'}, {"0SOSVU", 'F'}, {"0SOU(E", 'F'}, {"0SOUEK", 'F'}, {"0SOUEN", 'F'}, {"0SOV", 'F'}, {"0SOV&(", 'F'}, {"0SOV&1", 'F'}, {"0SOV&E", 'F'}, {"0SOV&F", 'F'}, {"0SOV&K", 'F'}, {"0SOV&N", 'F'}, {"0SOV&S", 'F'}, {"0SOV&U", 'F'}, {"0SOV&V", 'F'}, {"0SOV(E", 'F'}, {"0SOV(U", 'F'}, {"0SOV)&", 'F'}, {"0SOV),", 'F'}, {"0SOV);", 'F'}, {"0SOV)B", 'F'}, {"0SOV)C", 'F'}, {"0SOV)E", 'F'}, {"0SOV)F", 'F'}, {"0SOV)K", 'F'}, {"0SOV)O", 'F'}, {"0SOV)U", 'F'}, {"0SOV,(", 'F'}, {"0SOV,F", 'F'}, {"0SOV;", 'F'}, {"0SOV;C", 'F'}, {"0SOV;E", 'F'}, {"0SOV;N", 'F'}, {"0SOV;T", 'F'}, {"0SOVA(", 'F'}, {"0SOVAF", 'F'}, {"0SOVAS", 'F'}, {"0SOVAT", 'F'}, {"0SOVAV", 'F'}, {"0SOVB(", 'F'}, {"0SOVB1", 'F'}, {"0SOVBE", 'F'}, {"0SOVBF", 'F'}, {"0SOVBN", 'F'}, {"0SOVBS", 'F'}, {"0SOVBV", 'F'}, {"0SOVC", 'F'}, {"0SOVE(", 'F'}, {"0SOVE1", 'F'}, {"0SOVEF", 'F'}, {"0SOVEK", 'F'}, {"0SOVEN", 'F'}, {"0SOVEO", 'F'}, {"0SOVES", 'F'}, {"0SOVEU", 'F'}, {"0SOVEV", 'F'}, {"0SOVF(", 'F'}, {"0SOVK(", 'F'}, {"0SOVK)", 'F'}, {"0SOVK1", 'F'}, {"0SOVKB", 'F'}, {"0SOVKF", 'F'}, {"0SOVKN", 'F'}, {"0SOVKS", 'F'}, {"0SOVKU", 'F'}, {"0SOVKV", 'F'}, {"0SOVO(", 'F'}, {"0SOVOF", 'F'}, {"0SOVOK", 'F'}, {"0SOVOS", 'F'}, {"0SOVOU", 'F'}, {"0SOVS(", 'F'}, {"0SOVS1", 'F'}, {"0SOVSF", 'F'}, {"0SOVSO", 'F'}, {"0SOVSU", 'F'}, {"0SOVSV", 'F'}, {"0SOVT(", 'F'}, {"0SOVT1", 'F'}, {"0SOVTE", 'F'}, {"0SOVTF", 'F'}, {"0SOVTN", 'F'}, {"0SOVTS", 'F'}, {"0SOVTT", 'F'}, {"0SOVTV", 'F'}, {"0SOVU", 'F'}, {"0SOVU(", 'F'}, {"0SOVU1", 'F'}, {"0SOVU;", 'F'}, {"0SOVUC", 'F'}, {"0SOVUE", 'F'}, {"0SOVUF", 'F'}, {"0SOVUK", 'F'}, {"0SOVUO", 'F'}, {"0SOVUS", 'F'}, {"0SOVUT", 'F'}, {"0SOVUV", 'F'}, {"0ST(1)", 'F'}, {"0ST(1O", 'F'}, {"0ST(F(", 'F'}, {"0ST(N)", 'F'}, {"0ST(NO", 'F'}, {"0ST(S)", 'F'}, {"0ST(SO", 'F'}, {"0ST(V)", 'F'}, {"0ST(VO", 'F'}, {"0ST1(F", 'F'}, {"0ST1O(", 'F'}, {"0ST1OF", 'F'}, {"0ST1OS", 'F'}, {"0ST1OV", 'F'}, {"0STE(1", 'F'}, {"0STE(F", 'F'}, {"0STE(N", 'F'}, {"0STE(S", 'F'}, {"0STE(V", 'F'}, {"0STE1N", 'F'}, {"0STE1O", 'F'}, {"0STEF(", 'F'}, {"0STEK(", 'F'}, {"0STEK1", 'F'}, {"0STEKF", 'F'}, {"0STEKN", 'F'}, {"0STEKS", 'F'}, {"0STEKV", 'F'}, {"0STENN", 'F'}, {"0STENO", 'F'}, {"0STESN", 'F'}, {"0STESO", 'F'}, {"0STEVN", 'F'}, {"0STEVO", 'F'}, {"0STF()", 'F'}, {"0STF(1", 'F'}, {"0STF(F", 'F'}, {"0STF(N", 'F'}, {"0STF(S", 'F'}, {"0STF(V", 'F'}, {"0STN(1", 'F'}, {"0STN(F", 'F'}, {"0STN(S", 'F'}, {"0STN(V", 'F'}, {"0STN1C", 'F'}, {"0STN1O", 'F'}, {"0STN;E", 'F'}, {"0STN;N", 'F'}, {"0STN;T", 'F'}, {"0STNE(", 'F'}, {"0STNE1", 'F'}, {"0STNEF", 'F'}, {"0STNEN", 'F'}, {"0STNES", 'F'}, {"0STNEV", 'F'}, {"0STNF(", 'F'}, {"0STNKN", 'F'}, {"0STNN:", 'F'}, {"0STNNC", 'F'}, {"0STNNO", 'F'}, {"0STNO(", 'F'}, {"0STNOF", 'F'}, {"0STNOS", 'F'}, {"0STNOV", 'F'}, {"0STNSC", 'F'}, {"0STNSO", 'F'}, {"0STNT(", 'F'}, {"0STNT1", 'F'}, {"0STNTF", 'F'}, {"0STNTN", 'F'}, {"0STNTS", 'F'}, {"0STNTV", 'F'}, {"0STNVC", 'F'}, {"0STNVO", 'F'}, {"0STS(F", 'F'}, {"0STSO(", 'F'}, {"0STSO1", 'F'}, {"0STSOF", 'F'}, {"0STSON", 'F'}, {"0STSOS", 'F'}, {"0STSOV", 'F'}, {"0STTNE", 'F'}, {"0STTNK", 'F'}, {"0STTNN", 'F'}, {"0STTNT", 'F'}, {"0STV(1", 'F'}, {"0STV(F", 'F'}, {"0STVO(", 'F'}, {"0STVOF", 'F'}, {"0STVOS", 'F'}, {"0SU(1)", 'F'}, {"0SU(1O", 'F'}, {"0SU(E(", 'F'}, {"0SU(E1", 'F'}, {"0SU(EF", 'F'}, {"0SU(EK", 'F'}, {"0SU(EN", 'F'}, {"0SU(ES", 'F'}, {"0SU(EV", 'F'}, {"0SU(F(", 'F'}, {"0SU(N)", 'F'}, {"0SU(NO", 'F'}, {"0SU(S)", 'F'}, {"0SU(SO", 'F'}, {"0SU(V)", 'F'}, {"0SU(VO", 'F'}, {"0SU1,(", 'F'}, {"0SU1,F", 'F'}, {"0SU1C", 'F'}, {"0SU1O(", 'F'}, {"0SU1OF", 'F'}, {"0SU1OS", 'F'}, {"0SU1OV", 'F'}, {"0SU;", 'F'}, {"0SU;C", 'F'}, {"0SUC", 'F'}, {"0SUE", 'F'}, {"0SUE(1", 'F'}, {"0SUE(E", 'F'}, {"0SUE(F", 'F'}, {"0SUE(N", 'F'}, {"0SUE(O", 'F'}, {"0SUE(S", 'F'}, {"0SUE(V", 'F'}, {"0SUE1", 'F'}, {"0SUE1&", 'F'}, {"0SUE1(", 'F'}, {"0SUE1)", 'F'}, {"0SUE1,", 'F'}, {"0SUE1;", 'F'}, {"0SUE1B", 'F'}, {"0SUE1C", 'F'}, {"0SUE1F", 'F'}, {"0SUE1K", 'F'}, {"0SUE1N", 'F'}, {"0SUE1O", 'F'}, {"0SUE1S", 'F'}, {"0SUE1U", 'F'}, {"0SUE1V", 'F'}, {"0SUE;", 'F'}, {"0SUE;C", 'F'}, {"0SUEC", 'F'}, {"0SUEF", 'F'}, {"0SUEF(", 'F'}, {"0SUEF,", 'F'}, {"0SUEF;", 'F'}, {"0SUEFC", 'F'}, {"0SUEK", 'F'}, {"0SUEK(", 'F'}, {"0SUEK1", 'F'}, {"0SUEK;", 'F'}, {"0SUEKC", 'F'}, {"0SUEKF", 'F'}, {"0SUEKN", 'F'}, {"0SUEKO", 'F'}, {"0SUEKS", 'F'}, {"0SUEKV", 'F'}, {"0SUEN", 'F'}, {"0SUEN&", 'F'}, {"0SUEN(", 'F'}, {"0SUEN)", 'F'}, {"0SUEN,", 'F'}, {"0SUEN1", 'F'}, {"0SUEN;", 'F'}, {"0SUENB", 'F'}, {"0SUENC", 'F'}, {"0SUENF", 'F'}, {"0SUENK", 'F'}, {"0SUENO", 'F'}, {"0SUENS", 'F'}, {"0SUENU", 'F'}, {"0SUEOK", 'F'}, {"0SUEON", 'F'}, {"0SUES", 'F'}, {"0SUES&", 'F'}, {"0SUES(", 'F'}, {"0SUES)", 'F'}, {"0SUES,", 'F'}, {"0SUES1", 'F'}, {"0SUES;", 'F'}, {"0SUESB", 'F'}, {"0SUESC", 'F'}, {"0SUESF", 'F'}, {"0SUESK", 'F'}, {"0SUESO", 'F'}, {"0SUESU", 'F'}, {"0SUESV", 'F'}, {"0SUEV", 'F'}, {"0SUEV&", 'F'}, {"0SUEV(", 'F'}, {"0SUEV)", 'F'}, {"0SUEV,", 'F'}, {"0SUEV;", 'F'}, {"0SUEVB", 'F'}, {"0SUEVC", 'F'}, {"0SUEVF", 'F'}, {"0SUEVK", 'F'}, {"0SUEVN", 'F'}, {"0SUEVO", 'F'}, {"0SUEVS", 'F'}, {"0SUEVU", 'F'}, {"0SUF()", 'F'}, {"0SUF(1", 'F'}, {"0SUF(F", 'F'}, {"0SUF(N", 'F'}, {"0SUF(S", 'F'}, {"0SUF(V", 'F'}, {"0SUK(E", 'F'}, {"0SUO(E", 'F'}, {"0SUON(", 'F'}, {"0SUON1", 'F'}, {"0SUONF", 'F'}, {"0SUONS", 'F'}, {"0SUS,(", 'F'}, {"0SUS,F", 'F'}, {"0SUSC", 'F'}, {"0SUSO(", 'F'}, {"0SUSO1", 'F'}, {"0SUSOF", 'F'}, {"0SUSON", 'F'}, {"0SUSOS", 'F'}, {"0SUSOV", 'F'}, {"0SUTN(", 'F'}, {"0SUTN1", 'F'}, {"0SUTNF", 'F'}, {"0SUTNN", 'F'}, {"0SUTNS", 'F'}, {"0SUTNV", 'F'}, {"0SUV,(", 'F'}, {"0SUV,F", 'F'}, {"0SUVC", 'F'}, {"0SUVO(", 'F'}, {"0SUVOF", 'F'}, {"0SUVOS", 'F'}, {"0SVF()", 'F'}, {"0SVF(1", 'F'}, {"0SVF(F", 'F'}, {"0SVF(N", 'F'}, {"0SVF(S", 'F'}, {"0SVF(V", 'F'}, {"0SVO(1", 'F'}, {"0SVO(F", 'F'}, {"0SVO(N", 'F'}, {"0SVO(S", 'F'}, {"0SVO(V", 'F'}, {"0SVOF(", 'F'}, {"0SVOS(", 'F'}, {"0SVOS1", 'F'}, {"0SVOSF", 'F'}, {"0SVOSU", 'F'}, {"0SVOSV", 'F'}, {"0SVS;", 'F'}, {"0SVS;C", 'F'}, {"0SVSC", 'F'}, {"0SVSO(", 'F'}, {"0SVSO1", 'F'}, {"0SVSOF", 'F'}, {"0SVSON", 'F'}, {"0SVSOS", 'F'}, {"0SVSOV", 'F'}, {"0SVUE", 'F'}, {"0SVUE;", 'F'}, {"0SVUEC", 'F'}, {"0SVUEK", 'F'}, {"0T(1)F", 'F'}, {"0T(1)O", 'F'}, {"0T(1F(", 'F'}, {"0T(1N)", 'F'}, {"0T(1O(", 'F'}, {"0T(1OF", 'F'}, {"0T(1OS", 'F'}, {"0T(1OV", 'F'}, {"0T(1S)", 'F'}, {"0T(1V)", 'F'}, {"0T(1VO", 'F'}, {"0T(F()", 'F'}, {"0T(F(1", 'F'}, {"0T(F(F", 'F'}, {"0T(F(N", 'F'}, {"0T(F(S", 'F'}, {"0T(F(V", 'F'}, {"0T(N(1", 'F'}, {"0T(N(F", 'F'}, {"0T(N(S", 'F'}, {"0T(N(V", 'F'}, {"0T(N)F", 'F'}, {"0T(N)O", 'F'}, {"0T(N1)", 'F'}, {"0T(N1O", 'F'}, {"0T(NF(", 'F'}, {"0T(NN)", 'F'}, {"0T(NNO", 'F'}, {"0T(NO(", 'F'}, {"0T(NOF", 'F'}, {"0T(NOS", 'F'}, {"0T(NOV", 'F'}, {"0T(NS)", 'F'}, {"0T(NSO", 'F'}, {"0T(NV)", 'F'}, {"0T(NVO", 'F'}, {"0T(S)F", 'F'}, {"0T(S)O", 'F'}, {"0T(S1)", 'F'}, {"0T(SF(", 'F'}, {"0T(SN)", 'F'}, {"0T(SNO", 'F'}, {"0T(SO(", 'F'}, {"0T(SO1", 'F'}, {"0T(SOF", 'F'}, {"0T(SON", 'F'}, {"0T(SOS", 'F'}, {"0T(SOV", 'F'}, {"0T(SV)", 'F'}, {"0T(SVO", 'F'}, {"0T(V)F", 'F'}, {"0T(V)O", 'F'}, {"0T(VF(", 'F'}, {"0T(VO(", 'F'}, {"0T(VOF", 'F'}, {"0T(VOS", 'F'}, {"0T(VS)", 'F'}, {"0T(VSO", 'F'}, {"0T(VV)", 'F'}, {"0T1F(1", 'F'}, {"0T1F(F", 'F'}, {"0T1F(N", 'F'}, {"0T1F(S", 'F'}, {"0T1F(V", 'F'}, {"0T1O(1", 'F'}, {"0T1O(F", 'F'}, {"0T1O(N", 'F'}, {"0T1O(S", 'F'}, {"0T1O(V", 'F'}, {"0T1OF(", 'F'}, {"0T1OSF", 'F'}, {"0T1OVF", 'F'}, {"0T1OVO", 'F'}, {"0TF()F", 'F'}, {"0TF()O", 'F'}, {"0TF(1)", 'F'}, {"0TF(1O", 'F'}, {"0TF(F(", 'F'}, {"0TF(N)", 'F'}, {"0TF(NO", 'F'}, {"0TF(S)", 'F'}, {"0TF(SO", 'F'}, {"0TF(V)", 'F'}, {"0TF(VO", 'F'}, {"0TN(1)", 'F'}, {"0TN(1O", 'F'}, {"0TN(F(", 'F'}, {"0TN(S)", 'F'}, {"0TN(SO", 'F'}, {"0TN(V)", 'F'}, {"0TN(VO", 'F'}, {"0TN1;", 'F'}, {"0TN1;C", 'F'}, {"0TN1O(", 'F'}, {"0TN1OF", 'F'}, {"0TN1OS", 'F'}, {"0TN1OV", 'F'}, {"0TNF()", 'F'}, {"0TNF(1", 'F'}, {"0TNF(F", 'F'}, {"0TNF(N", 'F'}, {"0TNF(S", 'F'}, {"0TNF(V", 'F'}, {"0TNN;", 'F'}, {"0TNN;C", 'F'}, {"0TNNO(", 'F'}, {"0TNNOF", 'F'}, {"0TNNOS", 'F'}, {"0TNNOV", 'F'}, {"0TNO(1", 'F'}, {"0TNO(F", 'F'}, {"0TNO(N", 'F'}, {"0TNO(S", 'F'}, {"0TNO(V", 'F'}, {"0TNOF(", 'F'}, {"0TNOSF", 'F'}, {"0TNOVF", 'F'}, {"0TNOVO", 'F'}, {"0TNS;", 'F'}, {"0TNS;C", 'F'}, {"0TNSO(", 'F'}, {"0TNSO1", 'F'}, {"0TNSOF", 'F'}, {"0TNSON", 'F'}, {"0TNSOS", 'F'}, {"0TNSOV", 'F'}, {"0TNV;", 'F'}, {"0TNV;C", 'F'}, {"0TNVO(", 'F'}, {"0TNVOF", 'F'}, {"0TNVOS", 'F'}, {"0TSF(1", 'F'}, {"0TSF(F", 'F'}, {"0TSF(N", 'F'}, {"0TSF(S", 'F'}, {"0TSF(V", 'F'}, {"0TSO(1", 'F'}, {"0TSO(F", 'F'}, {"0TSO(N", 'F'}, {"0TSO(S", 'F'}, {"0TSO(V", 'F'}, {"0TSO1F", 'F'}, {"0TSOF(", 'F'}, {"0TSONF", 'F'}, {"0TSOSF", 'F'}, {"0TSOVF", 'F'}, {"0TSOVO", 'F'}, {"0TVF(1", 'F'}, {"0TVF(F", 'F'}, {"0TVF(N", 'F'}, {"0TVF(S", 'F'}, {"0TVF(V", 'F'}, {"0TVO(1", 'F'}, {"0TVO(F", 'F'}, {"0TVO(N", 'F'}, {"0TVO(S", 'F'}, {"0TVO(V", 'F'}, {"0TVOF(", 'F'}, {"0TVOSF", 'F'}, {"0U(E(1", 'F'}, {"0U(E(F", 'F'}, {"0U(E(K", 'F'}, {"0U(E(N", 'F'}, {"0U(E(S", 'F'}, {"0U(E(V", 'F'}, {"0U(E1)", 'F'}, {"0U(E1O", 'F'}, {"0U(EF(", 'F'}, {"0U(EK(", 'F'}, {"0U(EK1", 'F'}, {"0U(EKF", 'F'}, {"0U(EKN", 'F'}, {"0U(EKO", 'F'}, {"0U(EKS", 'F'}, {"0U(EKV", 'F'}, {"0U(EN)", 'F'}, {"0U(ENK", 'F'}, {"0U(ENO", 'F'}, {"0U(EOK", 'F'}, {"0U(ES)", 'F'}, {"0U(ESO", 'F'}, {"0U(EV)", 'F'}, {"0U(EVO", 'F'}, {"0UE(1)", 'F'}, {"0UE(1,", 'F'}, {"0UE(1O", 'F'}, {"0UE(F(", 'F'}, {"0UE(N)", 'F'}, {"0UE(N,", 'F'}, {"0UE(NO", 'F'}, {"0UE(S)", 'F'}, {"0UE(S,", 'F'}, {"0UE(SO", 'F'}, {"0UE(V)", 'F'}, {"0UE(V,", 'F'}, {"0UE(VO", 'F'}, {"0UE1", 'F'}, {"0UE1,(", 'F'}, {"0UE1,F", 'F'}, {"0UE1;", 'F'}, {"0UE1;C", 'F'}, {"0UE1C", 'F'}, {"0UE1K(", 'F'}, {"0UE1K1", 'F'}, {"0UE1KF", 'F'}, {"0UE1KN", 'F'}, {"0UE1KS", 'F'}, {"0UE1KV", 'F'}, {"0UE1O(", 'F'}, {"0UE1OF", 'F'}, {"0UE1OS", 'F'}, {"0UE1OV", 'F'}, {"0UEF()", 'F'}, {"0UEF(1", 'F'}, {"0UEF(F", 'F'}, {"0UEF(N", 'F'}, {"0UEF(S", 'F'}, {"0UEF(V", 'F'}, {"0UEK(1", 'F'}, {"0UEK(F", 'F'}, {"0UEK(N", 'F'}, {"0UEK(S", 'F'}, {"0UEK(V", 'F'}, {"0UEK1", 'F'}, {"0UEK1,", 'F'}, {"0UEK1;", 'F'}, {"0UEK1C", 'F'}, {"0UEK1K", 'F'}, {"0UEK1O", 'F'}, {"0UEKF(", 'F'}, {"0UEKN", 'F'}, {"0UEKN(", 'F'}, {"0UEKN,", 'F'}, {"0UEKN;", 'F'}, {"0UEKNC", 'F'}, {"0UEKNK", 'F'}, {"0UEKS", 'F'}, {"0UEKS,", 'F'}, {"0UEKS;", 'F'}, {"0UEKSC", 'F'}, {"0UEKSK", 'F'}, {"0UEKSO", 'F'}, {"0UEKV", 'F'}, {"0UEKV,", 'F'}, {"0UEKV;", 'F'}, {"0UEKVC", 'F'}, {"0UEKVK", 'F'}, {"0UEKVO", 'F'}, {"0UEN()", 'F'}, {"0UEN,(", 'F'}, {"0UEN,F", 'F'}, {"0UEN;", 'F'}, {"0UEN;C", 'F'}, {"0UENC", 'F'}, {"0UENK(", 'F'}, {"0UENK1", 'F'}, {"0UENKF", 'F'}, {"0UENKN", 'F'}, {"0UENKS", 'F'}, {"0UENKV", 'F'}, {"0UENO(", 'F'}, {"0UENOF", 'F'}, {"0UENOS", 'F'}, {"0UENOV", 'F'}, {"0UES", 'F'}, {"0UES,(", 'F'}, {"0UES,F", 'F'}, {"0UES;", 'F'}, {"0UES;C", 'F'}, {"0UESC", 'F'}, {"0UESK(", 'F'}, {"0UESK1", 'F'}, {"0UESKF", 'F'}, {"0UESKN", 'F'}, {"0UESKS", 'F'}, {"0UESKV", 'F'}, {"0UESO(", 'F'}, {"0UESO1", 'F'}, {"0UESOF", 'F'}, {"0UESON", 'F'}, {"0UESOS", 'F'}, {"0UESOV", 'F'}, {"0UEV", 'F'}, {"0UEV,(", 'F'}, {"0UEV,F", 'F'}, {"0UEV;", 'F'}, {"0UEV;C", 'F'}, {"0UEVC", 'F'}, {"0UEVK(", 'F'}, {"0UEVK1", 'F'}, {"0UEVKF", 'F'}, {"0UEVKN", 'F'}, {"0UEVKS", 'F'}, {"0UEVKV", 'F'}, {"0UEVO(", 'F'}, {"0UEVOF", 'F'}, {"0UEVOS", 'F'}, {"0UF(1O", 'F'}, {"0UF(F(", 'F'}, {"0UF(NO", 'F'}, {"0UF(SO", 'F'}, {"0UF(VO", 'F'}, {"0V&(1&", 'F'}, {"0V&(1)", 'F'}, {"0V&(1,", 'F'}, {"0V&(1O", 'F'}, {"0V&(E(", 'F'}, {"0V&(E1", 'F'}, {"0V&(EF", 'F'}, {"0V&(EK", 'F'}, {"0V&(EN", 'F'}, {"0V&(EO", 'F'}, {"0V&(ES", 'F'}, {"0V&(EV", 'F'}, {"0V&(F(", 'F'}, {"0V&(N&", 'F'}, {"0V&(N)", 'F'}, {"0V&(N,", 'F'}, {"0V&(NO", 'F'}, {"0V&(S&", 'F'}, {"0V&(S)", 'F'}, {"0V&(S,", 'F'}, {"0V&(SO", 'F'}, {"0V&(V&", 'F'}, {"0V&(V)", 'F'}, {"0V&(V,", 'F'}, {"0V&(VO", 'F'}, {"0V&1", 'F'}, {"0V&1&(", 'F'}, {"0V&1&1", 'F'}, {"0V&1&F", 'F'}, {"0V&1&N", 'F'}, {"0V&1&S", 'F'}, {"0V&1&V", 'F'}, {"0V&1)&", 'F'}, {"0V&1)C", 'F'}, {"0V&1)O", 'F'}, {"0V&1)U", 'F'}, {"0V&1;", 'F'}, {"0V&1;C", 'F'}, {"0V&1;E", 'F'}, {"0V&1;T", 'F'}, {"0V&1B(", 'F'}, {"0V&1B1", 'F'}, {"0V&1BF", 'F'}, {"0V&1BN", 'F'}, {"0V&1BS", 'F'}, {"0V&1BV", 'F'}, {"0V&1C", 'F'}, {"0V&1EK", 'F'}, {"0V&1EN", 'F'}, {"0V&1F(", 'F'}, {"0V&1K(", 'F'}, {"0V&1K1", 'F'}, {"0V&1KF", 'F'}, {"0V&1KN", 'F'}, {"0V&1KS", 'F'}, {"0V&1KV", 'F'}, {"0V&1O(", 'F'}, {"0V&1OF", 'F'}, {"0V&1OS", 'F'}, {"0V&1OV", 'F'}, {"0V&1TN", 'F'}, {"0V&1U", 'F'}, {"0V&1U(", 'F'}, {"0V&1U;", 'F'}, {"0V&1UC", 'F'}, {"0V&1UE", 'F'}, {"0V&E(1", 'F'}, {"0V&E(F", 'F'}, {"0V&E(N", 'F'}, {"0V&E(O", 'F'}, {"0V&E(S", 'F'}, {"0V&E(V", 'F'}, {"0V&E1", 'F'}, {"0V&E1;", 'F'}, {"0V&E1C", 'F'}, {"0V&E1K", 'F'}, {"0V&E1O", 'F'}, {"0V&EF(", 'F'}, {"0V&EK(", 'F'}, {"0V&EK1", 'F'}, {"0V&EKF", 'F'}, {"0V&EKN", 'F'}, {"0V&EKS", 'F'}, {"0V&EKV", 'F'}, {"0V&EN", 'F'}, {"0V&EN;", 'F'}, {"0V&ENC", 'F'}, {"0V&ENK", 'F'}, {"0V&ENO", 'F'}, {"0V&ES", 'F'}, {"0V&ES;", 'F'}, {"0V&ESC", 'F'}, {"0V&ESK", 'F'}, {"0V&ESO", 'F'}, {"0V&EV", 'F'}, {"0V&EV;", 'F'}, {"0V&EVC", 'F'}, {"0V&EVK", 'F'}, {"0V&EVO", 'F'}, {"0V&F()", 'F'}, {"0V&F(1", 'F'}, {"0V&F(E", 'F'}, {"0V&F(F", 'F'}, {"0V&F(N", 'F'}, {"0V&F(S", 'F'}, {"0V&F(V", 'F'}, {"0V&K&(", 'F'}, {"0V&K&1", 'F'}, {"0V&K&F", 'F'}, {"0V&K&N", 'F'}, {"0V&K&S", 'F'}, {"0V&K&V", 'F'}, {"0V&K(1", 'F'}, {"0V&K(F", 'F'}, {"0V&K(N", 'F'}, {"0V&K(S", 'F'}, {"0V&K(V", 'F'}, {"0V&K1O", 'F'}, {"0V&KC", 'F'}, {"0V&KF(", 'F'}, {"0V&KNK", 'F'}, {"0V&KO(", 'F'}, {"0V&KO1", 'F'}, {"0V&KOF", 'F'}, {"0V&KOK", 'F'}, {"0V&KON", 'F'}, {"0V&KOS", 'F'}, {"0V&KOV", 'F'}, {"0V&KSO", 'F'}, {"0V&KVO", 'F'}, {"0V&N", 'F'}, {"0V&N&(", 'F'}, {"0V&N&1", 'F'}, {"0V&N&F", 'F'}, {"0V&N&N", 'F'}, {"0V&N&S", 'F'}, {"0V&N&V", 'F'}, {"0V&N)&", 'F'}, {"0V&N)C", 'F'}, {"0V&N)O", 'F'}, {"0V&N)U", 'F'}, {"0V&N;", 'F'}, {"0V&N;C", 'F'}, {"0V&N;E", 'F'}, {"0V&N;T", 'F'}, {"0V&NB(", 'F'}, {"0V&NB1", 'F'}, {"0V&NBF", 'F'}, {"0V&NBN", 'F'}, {"0V&NBS", 'F'}, {"0V&NBV", 'F'}, {"0V&NC", 'F'}, {"0V&NEN", 'F'}, {"0V&NF(", 'F'}, {"0V&NK(", 'F'}, {"0V&NK1", 'F'}, {"0V&NKF", 'F'}, {"0V&NKN", 'F'}, {"0V&NKS", 'F'}, {"0V&NKV", 'F'}, {"0V&NO(", 'F'}, {"0V&NOF", 'F'}, {"0V&NOS", 'F'}, {"0V&NOV", 'F'}, {"0V&NTN", 'F'}, {"0V&NU", 'F'}, {"0V&NU(", 'F'}, {"0V&NU;", 'F'}, {"0V&NUC", 'F'}, {"0V&NUE", 'F'}, {"0V&S", 'F'}, {"0V&S&(", 'F'}, {"0V&S&1", 'F'}, {"0V&S&F", 'F'}, {"0V&S&N", 'F'}, {"0V&S&S", 'F'}, {"0V&S&V", 'F'}, {"0V&S)&", 'F'}, {"0V&S)C", 'F'}, {"0V&S)O", 'F'}, {"0V&S)U", 'F'}, {"0V&S1", 'F'}, {"0V&S1;", 'F'}, {"0V&S1C", 'F'}, {"0V&S;", 'F'}, {"0V&S;C", 'F'}, {"0V&S;E", 'F'}, {"0V&S;T", 'F'}, {"0V&SB(", 'F'}, {"0V&SB1", 'F'}, {"0V&SBF", 'F'}, {"0V&SBN", 'F'}, {"0V&SBS", 'F'}, {"0V&SBV", 'F'}, {"0V&SC", 'F'}, {"0V&SEK", 'F'}, {"0V&SEN", 'F'}, {"0V&SF(", 'F'}, {"0V&SK(", 'F'}, {"0V&SK1", 'F'}, {"0V&SKF", 'F'}, {"0V&SKN", 'F'}, {"0V&SKS", 'F'}, {"0V&SKV", 'F'}, {"0V&SO(", 'F'}, {"0V&SO1", 'F'}, {"0V&SOF", 'F'}, {"0V&SON", 'F'}, {"0V&SOS", 'F'}, {"0V&SOV", 'F'}, {"0V&STN", 'F'}, {"0V&SU", 'F'}, {"0V&SU(", 'F'}, {"0V&SU;", 'F'}, {"0V&SUC", 'F'}, {"0V&SUE", 'F'}, {"0V&SV", 'F'}, {"0V&SV;", 'F'}, {"0V&SVC", 'F'}, {"0V&SVO", 'F'}, {"0V&V", 'F'}, {"0V&V&(", 'F'}, {"0V&V&1", 'F'}, {"0V&V&F", 'F'}, {"0V&V&N", 'F'}, {"0V&V&S", 'F'}, {"0V&V&V", 'F'}, {"0V&V)&", 'F'}, {"0V&V)C", 'F'}, {"0V&V)O", 'F'}, {"0V&V)U", 'F'}, {"0V&V;", 'F'}, {"0V&V;C", 'F'}, {"0V&V;E", 'F'}, {"0V&V;T", 'F'}, {"0V&VB(", 'F'}, {"0V&VB1", 'F'}, {"0V&VBF", 'F'}, {"0V&VBN", 'F'}, {"0V&VBS", 'F'}, {"0V&VBV", 'F'}, {"0V&VC", 'F'}, {"0V&VEK", 'F'}, {"0V&VEN", 'F'}, {"0V&VF(", 'F'}, {"0V&VK(", 'F'}, {"0V&VK1", 'F'}, {"0V&VKF", 'F'}, {"0V&VKN", 'F'}, {"0V&VKS", 'F'}, {"0V&VKV", 'F'}, {"0V&VO(", 'F'}, {"0V&VOF", 'F'}, {"0V&VOS", 'F'}, {"0V&VS", 'F'}, {"0V&VS;", 'F'}, {"0V&VSC", 'F'}, {"0V&VSO", 'F'}, {"0V&VTN", 'F'}, {"0V&VU", 'F'}, {"0V&VU(", 'F'}, {"0V&VU;", 'F'}, {"0V&VUC", 'F'}, {"0V&VUE", 'F'}, {"0V(EF(", 'F'}, {"0V(EKF", 'F'}, {"0V(EKN", 'F'}, {"0V(ENK", 'F'}, {"0V(U(E", 'F'}, {"0V)&(1", 'F'}, {"0V)&(E", 'F'}, {"0V)&(F", 'F'}, {"0V)&(N", 'F'}, {"0V)&(S", 'F'}, {"0V)&(V", 'F'}, {"0V)&1", 'F'}, {"0V)&1&", 'F'}, {"0V)&1)", 'F'}, {"0V)&1;", 'F'}, {"0V)&1B", 'F'}, {"0V)&1C", 'F'}, {"0V)&1F", 'F'}, {"0V)&1O", 'F'}, {"0V)&1U", 'F'}, {"0V)&F(", 'F'}, {"0V)&N", 'F'}, {"0V)&N&", 'F'}, {"0V)&N)", 'F'}, {"0V)&N;", 'F'}, {"0V)&NB", 'F'}, {"0V)&NC", 'F'}, {"0V)&NF", 'F'}, {"0V)&NO", 'F'}, {"0V)&NU", 'F'}, {"0V)&S", 'F'}, {"0V)&S&", 'F'}, {"0V)&S)", 'F'}, {"0V)&S;", 'F'}, {"0V)&SB", 'F'}, {"0V)&SC", 'F'}, {"0V)&SF", 'F'}, {"0V)&SO", 'F'}, {"0V)&SU", 'F'}, {"0V)&V", 'F'}, {"0V)&V&", 'F'}, {"0V)&V)", 'F'}, {"0V)&V;", 'F'}, {"0V)&VB", 'F'}, {"0V)&VC", 'F'}, {"0V)&VF", 'F'}, {"0V)&VO", 'F'}, {"0V)&VU", 'F'}, {"0V),(1", 'F'}, {"0V),(F", 'F'}, {"0V),(N", 'F'}, {"0V),(S", 'F'}, {"0V),(V", 'F'}, {"0V);E(", 'F'}, {"0V);E1", 'F'}, {"0V);EF", 'F'}, {"0V);EK", 'F'}, {"0V);EN", 'F'}, {"0V);EO", 'F'}, {"0V);ES", 'F'}, {"0V);EV", 'F'}, {"0V);T(", 'F'}, {"0V);T1", 'F'}, {"0V);TF", 'F'}, {"0V);TK", 'F'}, {"0V);TN", 'F'}, {"0V);TO", 'F'}, {"0V);TS", 'F'}, {"0V);TV", 'F'}, {"0V)B(1", 'F'}, {"0V)B(F", 'F'}, {"0V)B(N", 'F'}, {"0V)B(S", 'F'}, {"0V)B(V", 'F'}, {"0V)B1", 'F'}, {"0V)B1&", 'F'}, {"0V)B1;", 'F'}, {"0V)B1C", 'F'}, {"0V)B1K", 'F'}, {"0V)B1N", 'F'}, {"0V)B1O", 'F'}, {"0V)B1U", 'F'}, {"0V)BF(", 'F'}, {"0V)BN", 'F'}, {"0V)BN&", 'F'}, {"0V)BN;", 'F'}, {"0V)BNC", 'F'}, {"0V)BNK", 'F'}, {"0V)BNO", 'F'}, {"0V)BNU", 'F'}, {"0V)BS", 'F'}, {"0V)BS&", 'F'}, {"0V)BS;", 'F'}, {"0V)BSC", 'F'}, {"0V)BSK", 'F'}, {"0V)BSO", 'F'}, {"0V)BSU", 'F'}, {"0V)BV", 'F'}, {"0V)BV&", 'F'}, {"0V)BV;", 'F'}, {"0V)BVC", 'F'}, {"0V)BVK", 'F'}, {"0V)BVO", 'F'}, {"0V)BVU", 'F'}, {"0V)C", 'F'}, {"0V)E(1", 'F'}, {"0V)E(F", 'F'}, {"0V)E(N", 'F'}, {"0V)E(S", 'F'}, {"0V)E(V", 'F'}, {"0V)E1C", 'F'}, {"0V)E1O", 'F'}, {"0V)EF(", 'F'}, {"0V)EK(", 'F'}, {"0V)EK1", 'F'}, {"0V)EKF", 'F'}, {"0V)EKN", 'F'}, {"0V)EKS", 'F'}, {"0V)EKV", 'F'}, {"0V)ENC", 'F'}, {"0V)ENO", 'F'}, {"0V)ESC", 'F'}, {"0V)ESO", 'F'}, {"0V)EVC", 'F'}, {"0V)EVO", 'F'}, {"0V)F(F", 'F'}, {"0V)K(1", 'F'}, {"0V)K(F", 'F'}, {"0V)K(N", 'F'}, {"0V)K(S", 'F'}, {"0V)K(V", 'F'}, {"0V)K1&", 'F'}, {"0V)K1;", 'F'}, {"0V)K1B", 'F'}, {"0V)K1E", 'F'}, {"0V)K1O", 'F'}, {"0V)K1U", 'F'}, {"0V)KB(", 'F'}, {"0V)KB1", 'F'}, {"0V)KBF", 'F'}, {"0V)KBN", 'F'}, {"0V)KBS", 'F'}, {"0V)KBV", 'F'}, {"0V)KF(", 'F'}, {"0V)KN&", 'F'}, {"0V)KN;", 'F'}, {"0V)KNB", 'F'}, {"0V)KNC", 'F'}, {"0V)KNE", 'F'}, {"0V)KNK", 'F'}, {"0V)KNU", 'F'}, {"0V)KS&", 'F'}, {"0V)KS;", 'F'}, {"0V)KSB", 'F'}, {"0V)KSE", 'F'}, {"0V)KSO", 'F'}, {"0V)KSU", 'F'}, {"0V)KUE", 'F'}, {"0V)KV&", 'F'}, {"0V)KV;", 'F'}, {"0V)KVB", 'F'}, {"0V)KVE", 'F'}, {"0V)KVO", 'F'}, {"0V)KVU", 'F'}, {"0V)O(1", 'F'}, {"0V)O(E", 'F'}, {"0V)O(F", 'F'}, {"0V)O(N", 'F'}, {"0V)O(S", 'F'}, {"0V)O(V", 'F'}, {"0V)O1", 'F'}, {"0V)O1&", 'F'}, {"0V)O1)", 'F'}, {"0V)O1;", 'F'}, {"0V)O1B", 'F'}, {"0V)O1C", 'F'}, {"0V)O1K", 'F'}, {"0V)O1U", 'F'}, {"0V)OF(", 'F'}, {"0V)ON", 'F'}, {"0V)ON&", 'F'}, {"0V)ON)", 'F'}, {"0V)ON;", 'F'}, {"0V)ONB", 'F'}, {"0V)ONC", 'F'}, {"0V)ONK", 'F'}, {"0V)ONU", 'F'}, {"0V)OS", 'F'}, {"0V)OS&", 'F'}, {"0V)OS)", 'F'}, {"0V)OS;", 'F'}, {"0V)OSB", 'F'}, {"0V)OSC", 'F'}, {"0V)OSK", 'F'}, {"0V)OSU", 'F'}, {"0V)OV", 'F'}, {"0V)OV&", 'F'}, {"0V)OV)", 'F'}, {"0V)OV;", 'F'}, {"0V)OVB", 'F'}, {"0V)OVC", 'F'}, {"0V)OVK", 'F'}, {"0V)OVO", 'F'}, {"0V)OVU", 'F'}, {"0V)U(E", 'F'}, {"0V)UE(", 'F'}, {"0V)UE1", 'F'}, {"0V)UEF", 'F'}, {"0V)UEK", 'F'}, {"0V)UEN", 'F'}, {"0V)UES", 'F'}, {"0V)UEV", 'F'}, {"0V,(1)", 'F'}, {"0V,(1O", 'F'}, {"0V,(E(", 'F'}, {"0V,(E1", 'F'}, {"0V,(EF", 'F'}, {"0V,(EK", 'F'}, {"0V,(EN", 'F'}, {"0V,(ES", 'F'}, {"0V,(EV", 'F'}, {"0V,(F(", 'F'}, {"0V,(N)", 'F'}, {"0V,(NO", 'F'}, {"0V,(S)", 'F'}, {"0V,(SO", 'F'}, {"0V,(V)", 'F'}, {"0V,(VO", 'F'}, {"0V,F()", 'F'}, {"0V,F(1", 'F'}, {"0V,F(F", 'F'}, {"0V,F(N", 'F'}, {"0V,F(S", 'F'}, {"0V,F(V", 'F'}, {"0V;E(1", 'F'}, {"0V;E(E", 'F'}, {"0V;E(F", 'F'}, {"0V;E(N", 'F'}, {"0V;E(S", 'F'}, {"0V;E(V", 'F'}, {"0V;E1,", 'F'}, {"0V;E1;", 'F'}, {"0V;E1C", 'F'}, {"0V;E1K", 'F'}, {"0V;E1O", 'F'}, {"0V;E1T", 'F'}, {"0V;EF(", 'F'}, {"0V;EK(", 'F'}, {"0V;EK1", 'F'}, {"0V;EKF", 'F'}, {"0V;EKN", 'F'}, {"0V;EKO", 'F'}, {"0V;EKS", 'F'}, {"0V;EKV", 'F'}, {"0V;EN,", 'F'}, {"0V;EN;", 'F'}, {"0V;ENC", 'F'}, {"0V;ENE", 'F'}, {"0V;ENK", 'F'}, {"0V;ENO", 'F'}, {"0V;ENT", 'F'}, {"0V;ES,", 'F'}, {"0V;ES;", 'F'}, {"0V;ESC", 'F'}, {"0V;ESK", 'F'}, {"0V;ESO", 'F'}, {"0V;EST", 'F'}, {"0V;EV,", 'F'}, {"0V;EV;", 'F'}, {"0V;EVC", 'F'}, {"0V;EVK", 'F'}, {"0V;EVO", 'F'}, {"0V;EVT", 'F'}, {"0V;N:T", 'F'}, {"0V;T(1", 'F'}, {"0V;T(C", 'F'}, {"0V;T(E", 'F'}, {"0V;T(F", 'F'}, {"0V;T(N", 'F'}, {"0V;T(S", 'F'}, {"0V;T(V", 'F'}, {"0V;T1(", 'F'}, {"0V;T1,", 'F'}, {"0V;T1;", 'F'}, {"0V;T1C", 'F'}, {"0V;T1F", 'F'}, {"0V;T1K", 'F'}, {"0V;T1O", 'F'}, {"0V;T1T", 'F'}, {"0V;T;", 'F'}, {"0V;T;C", 'F'}, {"0V;TF(", 'F'}, {"0V;TK(", 'F'}, {"0V;TK1", 'F'}, {"0V;TKF", 'F'}, {"0V;TKK", 'F'}, {"0V;TKN", 'F'}, {"0V;TKO", 'F'}, {"0V;TKS", 'F'}, {"0V;TKV", 'F'}, {"0V;TN(", 'F'}, {"0V;TN,", 'F'}, {"0V;TN1", 'F'}, {"0V;TN;", 'F'}, {"0V;TNC", 'F'}, {"0V;TNE", 'F'}, {"0V;TNF", 'F'}, {"0V;TNK", 'F'}, {"0V;TNN", 'F'}, {"0V;TNO", 'F'}, {"0V;TNS", 'F'}, {"0V;TNT", 'F'}, {"0V;TNV", 'F'}, {"0V;TO(", 'F'}, {"0V;TS(", 'F'}, {"0V;TS,", 'F'}, {"0V;TS;", 'F'}, {"0V;TSC", 'F'}, {"0V;TSF", 'F'}, {"0V;TSK", 'F'}, {"0V;TSO", 'F'}, {"0V;TST", 'F'}, {"0V;TTN", 'F'}, {"0V;TV(", 'F'}, {"0V;TV,", 'F'}, {"0V;TV;", 'F'}, {"0V;TVC", 'F'}, {"0V;TVF", 'F'}, {"0V;TVK", 'F'}, {"0V;TVO", 'F'}, {"0V;TVT", 'F'}, {"0VA(F(", 'F'}, {"0VA(N)", 'F'}, {"0VA(NO", 'F'}, {"0VA(S)", 'F'}, {"0VA(SO", 'F'}, {"0VA(V)", 'F'}, {"0VA(VO", 'F'}, {"0VAF()", 'F'}, {"0VAF(1", 'F'}, {"0VAF(F", 'F'}, {"0VAF(N", 'F'}, {"0VAF(S", 'F'}, {"0VAF(V", 'F'}, {"0VASO(", 'F'}, {"0VASO1", 'F'}, {"0VASOF", 'F'}, {"0VASON", 'F'}, {"0VASOS", 'F'}, {"0VASOV", 'F'}, {"0VASUE", 'F'}, {"0VATO(", 'F'}, {"0VATO1", 'F'}, {"0VATOF", 'F'}, {"0VATON", 'F'}, {"0VATOS", 'F'}, {"0VATOV", 'F'}, {"0VATUE", 'F'}, {"0VAVO(", 'F'}, {"0VAVOF", 'F'}, {"0VAVOS", 'F'}, {"0VAVUE", 'F'}, {"0VB(1)", 'F'}, {"0VB(1O", 'F'}, {"0VB(F(", 'F'}, {"0VB(NO", 'F'}, {"0VB(S)", 'F'}, {"0VB(SO", 'F'}, {"0VB(V)", 'F'}, {"0VB(VO", 'F'}, {"0VB1", 'F'}, {"0VB1&(", 'F'}, {"0VB1&1", 'F'}, {"0VB1&F", 'F'}, {"0VB1&N", 'F'}, {"0VB1&S", 'F'}, {"0VB1&V", 'F'}, {"0VB1,(", 'F'}, {"0VB1,F", 'F'}, {"0VB1;", 'F'}, {"0VB1;C", 'F'}, {"0VB1B(", 'F'}, {"0VB1B1", 'F'}, {"0VB1BF", 'F'}, {"0VB1BN", 'F'}, {"0VB1BS", 'F'}, {"0VB1BV", 'F'}, {"0VB1C", 'F'}, {"0VB1K(", 'F'}, {"0VB1K1", 'F'}, {"0VB1KF", 'F'}, {"0VB1KN", 'F'}, {"0VB1KS", 'F'}, {"0VB1KV", 'F'}, {"0VB1O(", 'F'}, {"0VB1OF", 'F'}, {"0VB1OS", 'F'}, {"0VB1OV", 'F'}, {"0VB1U(", 'F'}, {"0VB1UE", 'F'}, {"0VBE(1", 'F'}, {"0VBE(F", 'F'}, {"0VBE(N", 'F'}, {"0VBE(S", 'F'}, {"0VBE(V", 'F'}, {"0VBEK(", 'F'}, {"0VBF()", 'F'}, {"0VBF(1", 'F'}, {"0VBF(F", 'F'}, {"0VBF(N", 'F'}, {"0VBF(S", 'F'}, {"0VBF(V", 'F'}, {"0VBN", 'F'}, {"0VBN&(", 'F'}, {"0VBN&1", 'F'}, {"0VBN&F", 'F'}, {"0VBN&N", 'F'}, {"0VBN&S", 'F'}, {"0VBN&V", 'F'}, {"0VBN,(", 'F'}, {"0VBN,F", 'F'}, {"0VBN;", 'F'}, {"0VBN;C", 'F'}, {"0VBNB(", 'F'}, {"0VBNB1", 'F'}, {"0VBNBF", 'F'}, {"0VBNBN", 'F'}, {"0VBNBS", 'F'}, {"0VBNBV", 'F'}, {"0VBNC", 'F'}, {"0VBNK(", 'F'}, {"0VBNK1", 'F'}, {"0VBNKF", 'F'}, {"0VBNKN", 'F'}, {"0VBNKS", 'F'}, {"0VBNKV", 'F'}, {"0VBNO(", 'F'}, {"0VBNOF", 'F'}, {"0VBNOS", 'F'}, {"0VBNOV", 'F'}, {"0VBNU(", 'F'}, {"0VBNUE", 'F'}, {"0VBS", 'F'}, {"0VBS&(", 'F'}, {"0VBS&1", 'F'}, {"0VBS&F", 'F'}, {"0VBS&N", 'F'}, {"0VBS&S", 'F'}, {"0VBS&V", 'F'}, {"0VBS,(", 'F'}, {"0VBS,F", 'F'}, {"0VBS;", 'F'}, {"0VBS;C", 'F'}, {"0VBSB(", 'F'}, {"0VBSB1", 'F'}, {"0VBSBF", 'F'}, {"0VBSBN", 'F'}, {"0VBSBS", 'F'}, {"0VBSBV", 'F'}, {"0VBSC", 'F'}, {"0VBSK(", 'F'}, {"0VBSK1", 'F'}, {"0VBSKF", 'F'}, {"0VBSKN", 'F'}, {"0VBSKS", 'F'}, {"0VBSKV", 'F'}, {"0VBSO(", 'F'}, {"0VBSO1", 'F'}, {"0VBSOF", 'F'}, {"0VBSON", 'F'}, {"0VBSOS", 'F'}, {"0VBSOV", 'F'}, {"0VBSU(", 'F'}, {"0VBSUE", 'F'}, {"0VBV", 'F'}, {"0VBV&(", 'F'}, {"0VBV&1", 'F'}, {"0VBV&F", 'F'}, {"0VBV&N", 'F'}, {"0VBV&S", 'F'}, {"0VBV&V", 'F'}, {"0VBV,(", 'F'}, {"0VBV,F", 'F'}, {"0VBV;", 'F'}, {"0VBV;C", 'F'}, {"0VBVB(", 'F'}, {"0VBVB1", 'F'}, {"0VBVBF", 'F'}, {"0VBVBN", 'F'}, {"0VBVBS", 'F'}, {"0VBVBV", 'F'}, {"0VBVC", 'F'}, {"0VBVK(", 'F'}, {"0VBVK1", 'F'}, {"0VBVKF", 'F'}, {"0VBVKN", 'F'}, {"0VBVKS", 'F'}, {"0VBVKV", 'F'}, {"0VBVO(", 'F'}, {"0VBVOF", 'F'}, {"0VBVOS", 'F'}, {"0VBVU(", 'F'}, {"0VBVUE", 'F'}, {"0VC", 'F'}, {"0VE(1)", 'F'}, {"0VE(1O", 'F'}, {"0VE(F(", 'F'}, {"0VE(N)", 'F'}, {"0VE(NO", 'F'}, {"0VE(S)", 'F'}, {"0VE(SO", 'F'}, {"0VE(V)", 'F'}, {"0VE(VO", 'F'}, {"0VE1;T", 'F'}, {"0VE1C", 'F'}, {"0VE1O(", 'F'}, {"0VE1OF", 'F'}, {"0VE1OS", 'F'}, {"0VE1OV", 'F'}, {"0VE1T(", 'F'}, {"0VE1T1", 'F'}, {"0VE1TF", 'F'}, {"0VE1TN", 'F'}, {"0VE1TS", 'F'}, {"0VE1TV", 'F'}, {"0VE1UE", 'F'}, {"0VEF()", 'F'}, {"0VEF(1", 'F'}, {"0VEF(F", 'F'}, {"0VEF(N", 'F'}, {"0VEF(S", 'F'}, {"0VEF(V", 'F'}, {"0VEK(1", 'F'}, {"0VEK(E", 'F'}, {"0VEK(F", 'F'}, {"0VEK(N", 'F'}, {"0VEK(S", 'F'}, {"0VEK(V", 'F'}, {"0VEK1;", 'F'}, {"0VEK1C", 'F'}, {"0VEK1O", 'F'}, {"0VEK1T", 'F'}, {"0VEK1U", 'F'}, {"0VEKF(", 'F'}, {"0VEKN;", 'F'}, {"0VEKNC", 'F'}, {"0VEKNE", 'F'}, {"0VEKNT", 'F'}, {"0VEKNU", 'F'}, {"0VEKOK", 'F'}, {"0VEKS;", 'F'}, {"0VEKSC", 'F'}, {"0VEKSO", 'F'}, {"0VEKST", 'F'}, {"0VEKSU", 'F'}, {"0VEKU(", 'F'}, {"0VEKU1", 'F'}, {"0VEKUE", 'F'}, {"0VEKUF", 'F'}, {"0VEKUS", 'F'}, {"0VEKUV", 'F'}, {"0VEKV;", 'F'}, {"0VEKVC", 'F'}, {"0VEKVO", 'F'}, {"0VEKVT", 'F'}, {"0VEKVU", 'F'}, {"0VEN;T", 'F'}, {"0VENC", 'F'}, {"0VENEN", 'F'}, {"0VENO(", 'F'}, {"0VENOF", 'F'}, {"0VENOS", 'F'}, {"0VENOV", 'F'}, {"0VENT(", 'F'}, {"0VENT1", 'F'}, {"0VENTF", 'F'}, {"0VENTN", 'F'}, {"0VENTS", 'F'}, {"0VENTV", 'F'}, {"0VENUE", 'F'}, {"0VEOKN", 'F'}, {"0VES;T", 'F'}, {"0VESC", 'F'}, {"0VESO(", 'F'}, {"0VESO1", 'F'}, {"0VESOF", 'F'}, {"0VESON", 'F'}, {"0VESOS", 'F'}, {"0VESOV", 'F'}, {"0VEST(", 'F'}, {"0VEST1", 'F'}, {"0VESTF", 'F'}, {"0VESTN", 'F'}, {"0VESTS", 'F'}, {"0VESTV", 'F'}, {"0VESUE", 'F'}, {"0VEU(1", 'F'}, {"0VEU(F", 'F'}, {"0VEU(N", 'F'}, {"0VEU(S", 'F'}, {"0VEU(V", 'F'}, {"0VEU1,", 'F'}, {"0VEU1C", 'F'}, {"0VEU1O", 'F'}, {"0VEUEF", 'F'}, {"0VEUEK", 'F'}, {"0VEUF(", 'F'}, {"0VEUS,", 'F'}, {"0VEUSC", 'F'}, {"0VEUSO", 'F'}, {"0VEUV,", 'F'}, {"0VEUVC", 'F'}, {"0VEUVO", 'F'}, {"0VEV;T", 'F'}, {"0VEVC", 'F'}, {"0VEVO(", 'F'}, {"0VEVOF", 'F'}, {"0VEVOS", 'F'}, {"0VEVT(", 'F'}, {"0VEVT1", 'F'}, {"0VEVTF", 'F'}, {"0VEVTN", 'F'}, {"0VEVTS", 'F'}, {"0VEVTV", 'F'}, {"0VEVUE", 'F'}, {"0VF()1", 'F'}, {"0VF()F", 'F'}, {"0VF()K", 'F'}, {"0VF()N", 'F'}, {"0VF()O", 'F'}, {"0VF()S", 'F'}, {"0VF()U", 'F'}, {"0VF()V", 'F'}, {"0VF(1)", 'F'}, {"0VF(1N", 'F'}, {"0VF(1O", 'F'}, {"0VF(E(", 'F'}, {"0VF(E1", 'F'}, {"0VF(EF", 'F'}, {"0VF(EK", 'F'}, {"0VF(EN", 'F'}, {"0VF(ES", 'F'}, {"0VF(EV", 'F'}, {"0VF(F(", 'F'}, {"0VF(N)", 'F'}, {"0VF(N,", 'F'}, {"0VF(NO", 'F'}, {"0VF(S)", 'F'}, {"0VF(SO", 'F'}, {"0VF(V)", 'F'}, {"0VF(VO", 'F'}, {"0VK(1)", 'F'}, {"0VK(1O", 'F'}, {"0VK(F(", 'F'}, {"0VK(N)", 'F'}, {"0VK(NO", 'F'}, {"0VK(S)", 'F'}, {"0VK(SO", 'F'}, {"0VK(V)", 'F'}, {"0VK(VO", 'F'}, {"0VK)&(", 'F'}, {"0VK)&1", 'F'}, {"0VK)&F", 'F'}, {"0VK)&N", 'F'}, {"0VK)&S", 'F'}, {"0VK)&V", 'F'}, {"0VK);E", 'F'}, {"0VK);T", 'F'}, {"0VK)B(", 'F'}, {"0VK)B1", 'F'}, {"0VK)BF", 'F'}, {"0VK)BN", 'F'}, {"0VK)BS", 'F'}, {"0VK)BV", 'F'}, {"0VK)E(", 'F'}, {"0VK)E1", 'F'}, {"0VK)EF", 'F'}, {"0VK)EK", 'F'}, {"0VK)EN", 'F'}, {"0VK)ES", 'F'}, {"0VK)EV", 'F'}, {"0VK)F(", 'F'}, {"0VK)O(", 'F'}, {"0VK)OF", 'F'}, {"0VK)UE", 'F'}, {"0VK1", 'F'}, {"0VK1&(", 'F'}, {"0VK1&1", 'F'}, {"0VK1&F", 'F'}, {"0VK1&N", 'F'}, {"0VK1&S", 'F'}, {"0VK1&V", 'F'}, {"0VK1;", 'F'}, {"0VK1;C", 'F'}, {"0VK1;E", 'F'}, {"0VK1;T", 'F'}, {"0VK1B(", 'F'}, {"0VK1B1", 'F'}, {"0VK1BF", 'F'}, {"0VK1BN", 'F'}, {"0VK1BS", 'F'}, {"0VK1BV", 'F'}, {"0VK1C", 'F'}, {"0VK1E(", 'F'}, {"0VK1E1", 'F'}, {"0VK1EF", 'F'}, {"0VK1EK", 'F'}, {"0VK1EN", 'F'}, {"0VK1ES", 'F'}, {"0VK1EV", 'F'}, {"0VK1O(", 'F'}, {"0VK1OF", 'F'}, {"0VK1OS", 'F'}, {"0VK1OV", 'F'}, {"0VK1U(", 'F'}, {"0VK1UE", 'F'}, {"0VKF()", 'F'}, {"0VKF(1", 'F'}, {"0VKF(F", 'F'}, {"0VKF(N", 'F'}, {"0VKF(S", 'F'}, {"0VKF(V", 'F'}, {"0VKN", 'F'}, {"0VKN&(", 'F'}, {"0VKN&1", 'F'}, {"0VKN&F", 'F'}, {"0VKN&N", 'F'}, {"0VKN&S", 'F'}, {"0VKN&V", 'F'}, {"0VKN;", 'F'}, {"0VKN;C", 'F'}, {"0VKN;E", 'F'}, {"0VKN;T", 'F'}, {"0VKNB(", 'F'}, {"0VKNB1", 'F'}, {"0VKNBF", 'F'}, {"0VKNBN", 'F'}, {"0VKNBS", 'F'}, {"0VKNBV", 'F'}, {"0VKNC", 'F'}, {"0VKNE(", 'F'}, {"0VKNE1", 'F'}, {"0VKNEF", 'F'}, {"0VKNEN", 'F'}, {"0VKNES", 'F'}, {"0VKNEV", 'F'}, {"0VKNU(", 'F'}, {"0VKNUE", 'F'}, {"0VKS", 'F'}, {"0VKS&(", 'F'}, {"0VKS&1", 'F'}, {"0VKS&F", 'F'}, {"0VKS&N", 'F'}, {"0VKS&S", 'F'}, {"0VKS&V", 'F'}, {"0VKS;", 'F'}, {"0VKS;C", 'F'}, {"0VKS;E", 'F'}, {"0VKS;T", 'F'}, {"0VKSB(", 'F'}, {"0VKSB1", 'F'}, {"0VKSBF", 'F'}, {"0VKSBN", 'F'}, {"0VKSBS", 'F'}, {"0VKSBV", 'F'}, {"0VKSC", 'F'}, {"0VKSE(", 'F'}, {"0VKSE1", 'F'}, {"0VKSEF", 'F'}, {"0VKSEK", 'F'}, {"0VKSEN", 'F'}, {"0VKSES", 'F'}, {"0VKSEV", 'F'}, {"0VKSO(", 'F'}, {"0VKSO1", 'F'}, {"0VKSOF", 'F'}, {"0VKSON", 'F'}, {"0VKSOS", 'F'}, {"0VKSOV", 'F'}, {"0VKSU(", 'F'}, {"0VKSUE", 'F'}, {"0VKUE(", 'F'}, {"0VKUE1", 'F'}, {"0VKUEF", 'F'}, {"0VKUEK", 'F'}, {"0VKUEN", 'F'}, {"0VKUES", 'F'}, {"0VKUEV", 'F'}, {"0VKV", 'F'}, {"0VKV&(", 'F'}, {"0VKV&1", 'F'}, {"0VKV&F", 'F'}, {"0VKV&N", 'F'}, {"0VKV&S", 'F'}, {"0VKV&V", 'F'}, {"0VKV;", 'F'}, {"0VKV;C", 'F'}, {"0VKV;E", 'F'}, {"0VKV;T", 'F'}, {"0VKVB(", 'F'}, {"0VKVB1", 'F'}, {"0VKVBF", 'F'}, {"0VKVBN", 'F'}, {"0VKVBS", 'F'}, {"0VKVBV", 'F'}, {"0VKVC", 'F'}, {"0VKVE(", 'F'}, {"0VKVE1", 'F'}, {"0VKVEF", 'F'}, {"0VKVEK", 'F'}, {"0VKVEN", 'F'}, {"0VKVES", 'F'}, {"0VKVEV", 'F'}, {"0VKVO(", 'F'}, {"0VKVOF", 'F'}, {"0VKVOS", 'F'}, {"0VKVU(", 'F'}, {"0VKVUE", 'F'}, {"0VO(1&", 'F'}, {"0VO(1)", 'F'}, {"0VO(1,", 'F'}, {"0VO(1O", 'F'}, {"0VO(E(", 'F'}, {"0VO(E1", 'F'}, {"0VO(EE", 'F'}, {"0VO(EF", 'F'}, {"0VO(EK", 'F'}, {"0VO(EN", 'F'}, {"0VO(EO", 'F'}, {"0VO(ES", 'F'}, {"0VO(EV", 'F'}, {"0VO(F(", 'F'}, {"0VO(N&", 'F'}, {"0VO(N)", 'F'}, {"0VO(N,", 'F'}, {"0VO(NO", 'F'}, {"0VO(S&", 'F'}, {"0VO(S)", 'F'}, {"0VO(S,", 'F'}, {"0VO(SO", 'F'}, {"0VO(V&", 'F'}, {"0VO(V)", 'F'}, {"0VO(V,", 'F'}, {"0VO(VO", 'F'}, {"0VOF()", 'F'}, {"0VOF(1", 'F'}, {"0VOF(E", 'F'}, {"0VOF(F", 'F'}, {"0VOF(N", 'F'}, {"0VOF(S", 'F'}, {"0VOF(V", 'F'}, {"0VOK&(", 'F'}, {"0VOK&1", 'F'}, {"0VOK&F", 'F'}, {"0VOK&N", 'F'}, {"0VOK&S", 'F'}, {"0VOK&V", 'F'}, {"0VOK(1", 'F'}, {"0VOK(F", 'F'}, {"0VOK(N", 'F'}, {"0VOK(S", 'F'}, {"0VOK(V", 'F'}, {"0VOK1C", 'F'}, {"0VOK1O", 'F'}, {"0VOKF(", 'F'}, {"0VOKNC", 'F'}, {"0VOKO(", 'F'}, {"0VOKO1", 'F'}, {"0VOKOF", 'F'}, {"0VOKON", 'F'}, {"0VOKOS", 'F'}, {"0VOKOV", 'F'}, {"0VOKSC", 'F'}, {"0VOKSO", 'F'}, {"0VOKVC", 'F'}, {"0VOKVO", 'F'}, {"0VOS", 'F'}, {"0VOS&(", 'F'}, {"0VOS&1", 'F'}, {"0VOS&E", 'F'}, {"0VOS&F", 'F'}, {"0VOS&K", 'F'}, {"0VOS&N", 'F'}, {"0VOS&S", 'F'}, {"0VOS&U", 'F'}, {"0VOS&V", 'F'}, {"0VOS(E", 'F'}, {"0VOS(U", 'F'}, {"0VOS)&", 'F'}, {"0VOS),", 'F'}, {"0VOS);", 'F'}, {"0VOS)B", 'F'}, {"0VOS)C", 'F'}, {"0VOS)E", 'F'}, {"0VOS)F", 'F'}, {"0VOS)K", 'F'}, {"0VOS)O", 'F'}, {"0VOS)U", 'F'}, {"0VOS,(", 'F'}, {"0VOS,F", 'F'}, {"0VOS1(", 'F'}, {"0VOS1F", 'F'}, {"0VOS1N", 'F'}, {"0VOS1S", 'F'}, {"0VOS1U", 'F'}, {"0VOS1V", 'F'}, {"0VOS;", 'F'}, {"0VOS;C", 'F'}, {"0VOS;E", 'F'}, {"0VOS;N", 'F'}, {"0VOS;T", 'F'}, {"0VOSA(", 'F'}, {"0VOSAF", 'F'}, {"0VOSAS", 'F'}, {"0VOSAT", 'F'}, {"0VOSAV", 'F'}, {"0VOSB(", 'F'}, {"0VOSB1", 'F'}, {"0VOSBE", 'F'}, {"0VOSBF", 'F'}, {"0VOSBN", 'F'}, {"0VOSBS", 'F'}, {"0VOSBV", 'F'}, {"0VOSC", 'F'}, {"0VOSE(", 'F'}, {"0VOSE1", 'F'}, {"0VOSEF", 'F'}, {"0VOSEK", 'F'}, {"0VOSEN", 'F'}, {"0VOSEO", 'F'}, {"0VOSES", 'F'}, {"0VOSEU", 'F'}, {"0VOSEV", 'F'}, {"0VOSF(", 'F'}, {"0VOSK(", 'F'}, {"0VOSK)", 'F'}, {"0VOSK1", 'F'}, {"0VOSKB", 'F'}, {"0VOSKF", 'F'}, {"0VOSKN", 'F'}, {"0VOSKS", 'F'}, {"0VOSKU", 'F'}, {"0VOSKV", 'F'}, {"0VOST(", 'F'}, {"0VOST1", 'F'}, {"0VOSTE", 'F'}, {"0VOSTF", 'F'}, {"0VOSTN", 'F'}, {"0VOSTS", 'F'}, {"0VOSTT", 'F'}, {"0VOSTV", 'F'}, {"0VOSU", 'F'}, {"0VOSU(", 'F'}, {"0VOSU1", 'F'}, {"0VOSU;", 'F'}, {"0VOSUC", 'F'}, {"0VOSUE", 'F'}, {"0VOSUF", 'F'}, {"0VOSUK", 'F'}, {"0VOSUO", 'F'}, {"0VOSUS", 'F'}, {"0VOSUT", 'F'}, {"0VOSUV", 'F'}, {"0VOSV(", 'F'}, {"0VOSVF", 'F'}, {"0VOSVO", 'F'}, {"0VOSVS", 'F'}, {"0VOSVU", 'F'}, {"0VOU(E", 'F'}, {"0VOUEK", 'F'}, {"0VOUEN", 'F'}, {"0VT(1)", 'F'}, {"0VT(1O", 'F'}, {"0VT(F(", 'F'}, {"0VT(N)", 'F'}, {"0VT(NO", 'F'}, {"0VT(S)", 'F'}, {"0VT(SO", 'F'}, {"0VT(V)", 'F'}, {"0VT(VO", 'F'}, {"0VT1(F", 'F'}, {"0VT1O(", 'F'}, {"0VT1OF", 'F'}, {"0VT1OS", 'F'}, {"0VT1OV", 'F'}, {"0VTE(1", 'F'}, {"0VTE(F", 'F'}, {"0VTE(N", 'F'}, {"0VTE(S", 'F'}, {"0VTE(V", 'F'}, {"0VTE1N", 'F'}, {"0VTE1O", 'F'}, {"0VTEF(", 'F'}, {"0VTEK(", 'F'}, {"0VTEK1", 'F'}, {"0VTEKF", 'F'}, {"0VTEKN", 'F'}, {"0VTEKS", 'F'}, {"0VTEKV", 'F'}, {"0VTENN", 'F'}, {"0VTENO", 'F'}, {"0VTESN", 'F'}, {"0VTESO", 'F'}, {"0VTEVN", 'F'}, {"0VTEVO", 'F'}, {"0VTF()", 'F'}, {"0VTF(1", 'F'}, {"0VTF(F", 'F'}, {"0VTF(N", 'F'}, {"0VTF(S", 'F'}, {"0VTF(V", 'F'}, {"0VTN(1", 'F'}, {"0VTN(F", 'F'}, {"0VTN(S", 'F'}, {"0VTN(V", 'F'}, {"0VTN1C", 'F'}, {"0VTN1O", 'F'}, {"0VTN;E", 'F'}, {"0VTN;N", 'F'}, {"0VTN;T", 'F'}, {"0VTNE(", 'F'}, {"0VTNE1", 'F'}, {"0VTNEF", 'F'}, {"0VTNEN", 'F'}, {"0VTNES", 'F'}, {"0VTNEV", 'F'}, {"0VTNF(", 'F'}, {"0VTNKN", 'F'}, {"0VTNN:", 'F'}, {"0VTNNC", 'F'}, {"0VTNNO", 'F'}, {"0VTNO(", 'F'}, {"0VTNOF", 'F'}, {"0VTNOS", 'F'}, {"0VTNOV", 'F'}, {"0VTNSC", 'F'}, {"0VTNSO", 'F'}, {"0VTNT(", 'F'}, {"0VTNT1", 'F'}, {"0VTNTF", 'F'}, {"0VTNTN", 'F'}, {"0VTNTS", 'F'}, {"0VTNTV", 'F'}, {"0VTNVC", 'F'}, {"0VTNVO", 'F'}, {"0VTS(F", 'F'}, {"0VTSO(", 'F'}, {"0VTSO1", 'F'}, {"0VTSOF", 'F'}, {"0VTSON", 'F'}, {"0VTSOS", 'F'}, {"0VTSOV", 'F'}, {"0VTTNE", 'F'}, {"0VTTNK", 'F'}, {"0VTTNN", 'F'}, {"0VTTNT", 'F'}, {"0VTV(1", 'F'}, {"0VTV(F", 'F'}, {"0VTVO(", 'F'}, {"0VTVOF", 'F'}, {"0VTVOS", 'F'}, {"0VU", 'F'}, {"0VU(1)", 'F'}, {"0VU(1O", 'F'}, {"0VU(E(", 'F'}, {"0VU(E1", 'F'}, {"0VU(EF", 'F'}, {"0VU(EK", 'F'}, {"0VU(EN", 'F'}, {"0VU(ES", 'F'}, {"0VU(EV", 'F'}, {"0VU(F(", 'F'}, {"0VU(N)", 'F'}, {"0VU(NO", 'F'}, {"0VU(S)", 'F'}, {"0VU(SO", 'F'}, {"0VU(V)", 'F'}, {"0VU(VO", 'F'}, {"0VU1,(", 'F'}, {"0VU1,F", 'F'}, {"0VU1C", 'F'}, {"0VU1O(", 'F'}, {"0VU1OF", 'F'}, {"0VU1OS", 'F'}, {"0VU1OV", 'F'}, {"0VU;", 'F'}, {"0VU;C", 'F'}, {"0VUC", 'F'}, {"0VUE", 'F'}, {"0VUE(1", 'F'}, {"0VUE(E", 'F'}, {"0VUE(F", 'F'}, {"0VUE(N", 'F'}, {"0VUE(O", 'F'}, {"0VUE(S", 'F'}, {"0VUE(V", 'F'}, {"0VUE1", 'F'}, {"0VUE1&", 'F'}, {"0VUE1(", 'F'}, {"0VUE1)", 'F'}, {"0VUE1,", 'F'}, {"0VUE1;", 'F'}, {"0VUE1B", 'F'}, {"0VUE1C", 'F'}, {"0VUE1F", 'F'}, {"0VUE1K", 'F'}, {"0VUE1N", 'F'}, {"0VUE1O", 'F'}, {"0VUE1S", 'F'}, {"0VUE1U", 'F'}, {"0VUE1V", 'F'}, {"0VUE;", 'F'}, {"0VUE;C", 'F'}, {"0VUEC", 'F'}, {"0VUEF", 'F'}, {"0VUEF(", 'F'}, {"0VUEF,", 'F'}, {"0VUEF;", 'F'}, {"0VUEFC", 'F'}, {"0VUEK", 'F'}, {"0VUEK(", 'F'}, {"0VUEK1", 'F'}, {"0VUEK;", 'F'}, {"0VUEKC", 'F'}, {"0VUEKF", 'F'}, {"0VUEKN", 'F'}, {"0VUEKO", 'F'}, {"0VUEKS", 'F'}, {"0VUEKV", 'F'}, {"0VUEN", 'F'}, {"0VUEN&", 'F'}, {"0VUEN(", 'F'}, {"0VUEN)", 'F'}, {"0VUEN,", 'F'}, {"0VUEN1", 'F'}, {"0VUEN;", 'F'}, {"0VUENB", 'F'}, {"0VUENC", 'F'}, {"0VUENF", 'F'}, {"0VUENK", 'F'}, {"0VUENO", 'F'}, {"0VUENS", 'F'}, {"0VUENU", 'F'}, {"0VUEOK", 'F'}, {"0VUEON", 'F'}, {"0VUES", 'F'}, {"0VUES&", 'F'}, {"0VUES(", 'F'}, {"0VUES)", 'F'}, {"0VUES,", 'F'}, {"0VUES1", 'F'}, {"0VUES;", 'F'}, {"0VUESB", 'F'}, {"0VUESC", 'F'}, {"0VUESF", 'F'}, {"0VUESK", 'F'}, {"0VUESO", 'F'}, {"0VUESU", 'F'}, {"0VUESV", 'F'}, {"0VUEV", 'F'}, {"0VUEV&", 'F'}, {"0VUEV(", 'F'}, {"0VUEV)", 'F'}, {"0VUEV,", 'F'}, {"0VUEV;", 'F'}, {"0VUEVB", 'F'}, {"0VUEVC", 'F'}, {"0VUEVF", 'F'}, {"0VUEVK", 'F'}, {"0VUEVN", 'F'}, {"0VUEVO", 'F'}, {"0VUEVS", 'F'}, {"0VUEVU", 'F'}, {"0VUF()", 'F'}, {"0VUF(1", 'F'}, {"0VUF(F", 'F'}, {"0VUF(N", 'F'}, {"0VUF(S", 'F'}, {"0VUF(V", 'F'}, {"0VUK(E", 'F'}, {"0VUO(E", 'F'}, {"0VUON(", 'F'}, {"0VUON1", 'F'}, {"0VUONF", 'F'}, {"0VUONS", 'F'}, {"0VUS,(", 'F'}, {"0VUS,F", 'F'}, {"0VUSC", 'F'}, {"0VUSO(", 'F'}, {"0VUSO1", 'F'}, {"0VUSOF", 'F'}, {"0VUSON", 'F'}, {"0VUSOS", 'F'}, {"0VUSOV", 'F'}, {"0VUTN(", 'F'}, {"0VUTN1", 'F'}, {"0VUTNF", 'F'}, {"0VUTNN", 'F'}, {"0VUTNS", 'F'}, {"0VUTNV", 'F'}, {"0VUV,(", 'F'}, {"0VUV,F", 'F'}, {"0VUVC", 'F'}, {"0VUVO(", 'F'}, {"0VUVOF", 'F'}, {"0VUVOS", 'F'}, {"0X", 'F'}, {"::", 'o'}, {":=", 'o'}, {"<<", 'o'}, {"<=", 'o'}, {"<>", 'o'}, {"<@", 'o'}, {">=", 'o'}, {">>", 'o'}, {"@>", 'o'}, {"ABORT", 'k'}, {"ABS", 'f'}, {"ACCESSIBLE", 'k'}, {"ACOS", 'f'}, {"ADDDATE", 'f'}, {"ADDTIME", 'f'}, {"AES_DECRYPT", 'f'}, {"AES_ENCRYPT", 'f'}, {"AGAINST", 'k'}, {"AGE", 'f'}, {"ALL_USERS", 'k'}, {"ALTER", 'k'}, {"ALTER DOMAIN", 'k'}, {"ALTER TABLE", 'k'}, {"ANALYZE", 'k'}, {"AND", '&'}, {"ANY", 'f'}, {"ANYARRAY", 't'}, {"ANYELEMENT", 't'}, {"ANYNONARRY", 't'}, {"APPLOCK_MODE", 'f'}, {"APPLOCK_TEST", 'f'}, {"APP_NAME", 'f'}, {"ARRAY_AGG", 'f'}, {"ARRAY_CAT", 'f'}, {"ARRAY_DIM", 'f'}, {"ARRAY_FILL", 'f'}, {"ARRAY_LENGTH", 'f'}, {"ARRAY_LOWER", 'f'}, {"ARRAY_NDIMS", 'f'}, {"ARRAY_PREPEND", 'f'}, {"ARRAY_TO_JSON", 'f'}, {"ARRAY_TO_STRING", 'f'}, {"ARRAY_UPPER", 'f'}, {"AS", 'k'}, {"ASC", 'k'}, {"ASCII", 'f'}, {"ASENSITIVE", 'k'}, {"ASIN", 'f'}, {"ASSEMBLYPROPERTY", 'f'}, {"ASYMKEY_ID", 'f'}, {"AT TIME", 'n'}, {"AT TIME ZONE", 'k'}, {"ATAN", 'f'}, {"ATAN2", 'f'}, {"AUTOINCREMENT", 'k'}, {"AVG", 'f'}, {"BEFORE", 'k'}, {"BEGIN", 'T'}, {"BEGIN DECLARE", 'T'}, {"BEGIN GOTO", 'T'}, {"BEGIN TRY", 'T'}, {"BEGIN TRY DECLARE", 'T'}, {"BENCHMARK", 'f'}, {"BETWEEN", 'o'}, {"BIGINT", 't'}, {"BIGSERIAL", 't'}, {"BIN", 'f'}, {"BINARY", 't'}, {"BINARY_DOUBLE_INFINITY", '1'}, {"BINARY_DOUBLE_NAN", '1'}, {"BINARY_FLOAT_INFINITY", '1'}, {"BINARY_FLOAT_NAN", '1'}, {"BINBINARY", 'f'}, {"BIT_AND", 'f'}, {"BIT_COUNT", 'f'}, {"BIT_LENGTH", 'f'}, {"BIT_OR", 'f'}, {"BIT_XOR", 'f'}, {"BLOB", 'k'}, {"BOOLEAN", 't'}, {"BOOL_AND", 'f'}, {"BOOL_OR", 'f'}, {"BOTH", 'k'}, {"BTRIM", 'f'}, {"BY", 'n'}, {"BYTEA", 't'}, {"CALL", 'T'}, {"CASCADE", 'k'}, {"CASE", 'E'}, {"CAST", 'f'}, {"CBOOL", 'f'}, {"CBRT", 'f'}, {"CBYTE", 'f'}, {"CCUR", 'f'}, {"CDATE", 'f'}, {"CDBL", 'f'}, {"CEIL", 'f'}, {"CEILING", 'f'}, {"CERTENCODED", 'f'}, {"CERTPRIVATEKEY", 'f'}, {"CERT_ID", 'f'}, {"CERT_PROPERTY", 'f'}, {"CHANGE", 'k'}, {"CHANGES", 'f'}, {"CHAR", 'f'}, {"CHARACTER", 't'}, {"CHARACTER VARYING", 't'}, {"CHARACTER_LENGTH", 'f'}, {"CHARINDEX", 'f'}, {"CHARSET", 'f'}, {"CHAR_LENGTH", 'f'}, {"CHDIR", 'f'}, {"CHDRIVE", 'f'}, {"CHECK", 'n'}, {"CHECKSUM_AGG", 'f'}, {"CHOOSE", 'f'}, {"CHR", 'f'}, {"CINT", 'f'}, {"CLNG", 'f'}, {"CLOCK_TIMESTAMP", 'f'}, {"COALESCE", 'f'}, {"COERCIBILITY", 'f'}, {"COLLATE", 'A'}, {"COLLATION", 'f'}, {"COLLATIONPROPERTY", 'f'}, {"COLUMN", 'k'}, {"COLUMNPROPERTY", 'f'}, {"COLUMNS_UPDATED", 'f'}, {"COL_LENGTH", 'f'}, {"COL_NAME", 'f'}, {"COMPRESS", 'f'}, {"CONCAT", 'f'}, {"CONCAT_WS", 'f'}, {"CONDITION", 'k'}, {"CONNECTION_ID", 'f'}, {"CONSTRAINT", 'k'}, {"CONTINUE", 'k'}, {"CONV", 'f'}, {"CONVERT", 'f'}, {"CONVERT_FROM", 'f'}, {"CONVERT_TO", 'f'}, {"CONVERT_TZ", 'f'}, {"COS", 'f'}, {"COT", 'f'}, {"COUNT", 'f'}, {"COUNT_BIG", 'k'}, {"CRC32", 'f'}, {"CREATE", 'E'}, {"CREATE OR", 'n'}, {"CREATE OR REPLACE", 'T'}, {"CROSS", 'n'}, {"CROSS JOIN", 'k'}, {"CSNG", 'f'}, {"CSTRING", 't'}, {"CTXSYS.DRITHSX.SN", 'f'}, {"CUME_DIST", 'f'}, {"CURDATE", 'f'}, {"CURDIR", 'f'}, {"CURRENT DATE", 'v'}, {"CURRENT DEGREE", 'v'}, {"CURRENT FUNCTION", 'v'}, {"CURRENT FUNCTION PATH", 'v'}, {"CURRENT PATH", 'v'}, {"CURRENT SCHEMA", 'v'}, {"CURRENT SERVER", 'v'}, {"CURRENT TIME", 'v'}, {"CURRENT TIMEZONE", 'v'}, {"CURRENTUSER", 'f'}, {"CURRENT_DATABASE", 'f'}, {"CURRENT_DATE", 'v'}, {"CURRENT_PATH", 'v'}, {"CURRENT_QUERY", 'f'}, {"CURRENT_SCHEMA", 'f'}, {"CURRENT_SCHEMAS", 'f'}, {"CURRENT_SERVER", 'v'}, {"CURRENT_SETTING", 'f'}, {"CURRENT_TIME", 'v'}, {"CURRENT_TIMESTAMP", 'v'}, {"CURRENT_TIMEZONE", 'v'}, {"CURRENT_USER", 'v'}, {"CURRVAL", 'f'}, {"CURSOR", 'k'}, {"CURSOR_STATUS", 'f'}, {"CURTIME", 'f'}, {"CVAR", 'f'}, {"DATABASE", 'n'}, {"DATABASEPROPERTYEX", 'f'}, {"DATABASES", 'k'}, {"DATABASE_PRINCIPAL_ID", 'f'}, {"DATALENGTH", 'f'}, {"DATE", 'f'}, {"DATEADD", 'f'}, {"DATEDIFF", 'f'}, {"DATEFROMPARTS", 'f'}, {"DATENAME", 'f'}, {"DATEPART", 'f'}, {"DATESERIAL", 'f'}, {"DATETIME2FROMPARTS", 'f'}, {"DATETIMEFROMPARTS", 'f'}, {"DATETIMEOFFSETFROMPARTS", 'f'}, {"DATEVALUE", 'f'}, {"DATE_ADD", 'f'}, {"DATE_FORMAT", 'f'}, {"DATE_PART", 'f'}, {"DATE_SUB", 'f'}, {"DATE_TRUNC", 'f'}, {"DAVG", 'f'}, {"DAY", 'f'}, {"DAYNAME", 'f'}, {"DAYOFMONTH", 'f'}, {"DAYOFWEEK", 'f'}, {"DAYOFYEAR", 'f'}, {"DAY_HOUR", 'k'}, {"DAY_MICROSECOND", 'k'}, {"DAY_MINUTE", 'k'}, {"DAY_SECOND", 'k'}, {"DBMS_LOCK.SLEEP", 'f'}, {"DBMS_PIPE.RECEIVE_MESSAGE", 'f'}, {"DBMS_UTILITY.SQLID_TO_SQLHASH", 'f'}, {"DB_ID", 'f'}, {"DB_NAME", 'f'}, {"DCOUNT", 'f'}, {"DEC", 'k'}, {"DECIMAL", 't'}, {"DECLARE", 'T'}, {"DECODE", 'f'}, {"DECRYPTBYASMKEY", 'f'}, {"DECRYPTBYCERT", 'f'}, {"DECRYPTBYKEY", 'f'}, {"DECRYPTBYKEYAUTOCERT", 'f'}, {"DECRYPTBYPASSPHRASE", 'f'}, {"DEFAULT", 'k'}, {"DEGREES", 'f'}, {"DELAY", 'k'}, {"DELAYED", 'k'}, {"DELETE", 'T'}, {"DENSE_RANK", 'f'}, {"DESC", 'k'}, {"DESCRIBE", 'k'}, {"DES_DECRYPT", 'f'}, {"DES_ENCRYPT", 'f'}, {"DETERMINISTIC", 'k'}, {"DFIRST", 'f'}, {"DIFFERENCE", 'f'}, {"DISTINCT", 'k'}, {"DISTINCTROW", 'k'}, {"DIV", 'o'}, {"DLAST", 'f'}, {"DLOOKUP", 'f'}, {"DMAX", 'f'}, {"DMIN", 'f'}, {"DO", 'n'}, {"DOUBLE", 't'}, {"DOUBLE PRECISION", 't'}, {"DROP", 'T'}, {"DSUM", 'f'}, {"DUAL", 'n'}, {"EACH", 'k'}, {"ELSE", 'k'}, {"ELSEIF", 'k'}, {"ELT", 'f'}, {"ENCLOSED", 'k'}, {"ENCODE", 'f'}, {"ENCRYPT", 'f'}, {"ENCRYPTBYASMKEY", 'f'}, {"ENCRYPTBYCERT", 'f'}, {"ENCRYPTBYKEY", 'f'}, {"ENCRYPTBYPASSPHRASE", 'f'}, {"ENUM_FIRST", 'f'}, {"ENUM_LAST", 'f'}, {"ENUM_RANGE", 'f'}, {"EOMONTH", 'f'}, {"EQV", 'o'}, {"ESCAPED", 'k'}, {"EVENTDATA", 'f'}, {"EXCEPT", 'U'}, {"EXEC", 'T'}, {"EXECUTE", 'T'}, {"EXECUTE AS", 'E'}, {"EXECUTE AS LOGIN", 'E'}, {"EXISTS", 'f'}, {"EXIT", 'k'}, {"EXP", 'f'}, {"EXPLAIN", 'k'}, {"EXPORT_SET", 'f'}, {"EXTRACT", 'f'}, {"EXTRACTVALUE", 'f'}, {"EXTRACT_VALUE", 'f'}, {"FALSE", '1'}, {"FETCH", 'k'}, {"FIELD", 'f'}, {"FILEDATETIME", 'f'}, {"FILEGROUPPROPERTY", 'f'}, {"FILEGROUP_ID", 'f'}, {"FILEGROUP_NAME", 'f'}, {"FILELEN", 'f'}, {"FILEPROPERTY", 'f'}, {"FILETOBLOB", 'f'}, {"FILETOCLOB", 'f'}, {"FILE_ID", 'f'}, {"FILE_IDEX", 'f'}, {"FILE_NAME", 'f'}, {"FIND_IN_SET", 'f'}, {"FIRST_VALUE", 'f'}, {"FLOAT", 't'}, {"FLOAT4", 't'}, {"FLOAT8", 't'}, {"FLOOR", 'f'}, {"FN_VIRTUALFILESTATS", 'f'}, {"FOR", 'n'}, {"FOR UPDATE", 'k'}, {"FOR UPDATE NOWAIT", 'k'}, {"FOR UPDATE OF", 'k'}, {"FOR UPDATE SKIP", 'k'}, {"FOR UPDATE SKIP LOCKED", 'k'}, {"FOR UPDATE WAIT", 'k'}, {"FORCE", 'k'}, {"FOREIGN", 'k'}, {"FORMAT", 'f'}, {"FOUND_ROWS", 'f'}, {"FROM", 'k'}, {"FROM_BASE64", 'f'}, {"FROM_DAYS", 'f'}, {"FROM_UNIXTIME", 'f'}, {"FULL JOIN", 'k'}, {"FULL OUTER", 'k'}, {"FULL OUTER JOIN", 'k'}, {"FULLTEXT", 'k'}, {"FULLTEXTCATALOGPROPERTY", 'f'}, {"FULLTEXTSERVICEPROPERTY", 'f'}, {"FUNCTION", 'k'}, {"GENERATE_SERIES", 'f'}, {"GENERATE_SUBSCRIPTS", 'f'}, {"GETATTR", 'f'}, {"GETDATE", 'f'}, {"GETUTCDATE", 'f'}, {"GET_BIT", 'f'}, {"GET_BYTE", 'f'}, {"GET_FORMAT", 'f'}, {"GET_LOCK", 'f'}, {"GO", 'T'}, {"GOTO", 'T'}, {"GRANT", 'k'}, {"GREATEST", 'f'}, {"GROUP", 'n'}, {"GROUP BY", 'B'}, {"GROUPING", 'f'}, {"GROUPING_ID", 'f'}, {"GROUP_CONCAT", 'f'}, {"HANDLER", 'T'}, {"HASHBYTES", 'f'}, {"HAS_PERMS_BY_NAME", 'f'}, {"HAVING", 'B'}, {"HEX", 'f'}, {"HIGH_PRIORITY", 'k'}, {"HOST_NAME", 'f'}, {"HOUR", 'f'}, {"HOUR_MICROSECOND", 'k'}, {"HOUR_MINUTE", 'k'}, {"HOUR_SECOND", 'k'}, {"IDENTIFY", 'f'}, {"IDENT_CURRENT", 'f'}, {"IDENT_INCR", 'f'}, {"IDENT_SEED", 'f'}, {"IF", 'f'}, {"IF EXISTS", 'f'}, {"IF NOT", 'f'}, {"IF NOT EXISTS", 'f'}, {"IFF", 'f'}, {"IFNULL", 'f'}, {"IGNORE", 'k'}, {"IIF", 'f'}, {"IN", 'k'}, {"IN BOOLEAN", 'n'}, {"IN BOOLEAN MODE", 'k'}, {"INDEX", 'k'}, {"INDEXKEY_PROPERTY", 'f'}, {"INDEXPROPERTY", 'f'}, {"INDEX_COL", 'f'}, {"INET_ATON", 'f'}, {"INET_NTOA", 'f'}, {"INFILE", 'k'}, {"INITCAP", 'f'}, {"INNER", 'k'}, {"INNER JOIN", 'k'}, {"INOUT", 'k'}, {"INSENSITIVE", 'k'}, {"INSERT", 'E'}, {"INSERT DELAYED", 'E'}, {"INSERT DELAYED INTO", 'T'}, {"INSERT HIGH_PRIORITY", 'E'}, {"INSERT HIGH_PRIORITY INTO", 'T'}, {"INSERT IGNORE", 'E'}, {"INSERT IGNORE INTO", 'T'}, {"INSERT INTO", 'T'}, {"INSERT LOW_PRIORITY", 'E'}, {"INSERT LOW_PRIORITY INTO", 'T'}, {"INSTR", 'f'}, {"INSTRREV", 'f'}, {"INT", 't'}, {"INT1", 't'}, {"INT2", 't'}, {"INT3", 't'}, {"INT4", 't'}, {"INT8", 't'}, {"INTEGER", 't'}, {"INTERSECT", 'U'}, {"INTERSECT ALL", 'U'}, {"INTERVAL", 'k'}, {"INTO", 'k'}, {"INTO DUMPFILE", 'k'}, {"INTO OUTFILE", 'k'}, {"IS", 'o'}, {"IS DISTINCT", 'n'}, {"IS DISTINCT FROM", 'o'}, {"IS NOT", 'o'}, {"IS NOT DISTINCT", 'n'}, {"IS NOT DISTINCT FROM", 'o'}, {"ISDATE", 'f'}, {"ISEMPTY", 'f'}, {"ISFINITE", 'f'}, {"ISNULL", 'f'}, {"ISNUMERIC", 'f'}, {"IS_FREE_LOCK", 'f'}, {"IS_MEMBER", 'f'}, {"IS_OBJECTSIGNED", 'f'}, {"IS_ROLEMEMBER", 'f'}, {"IS_SRVROLEMEMBER", 'f'}, {"IS_USED_LOCK", 'f'}, {"ITERATE", 'k'}, {"JOIN", 'k'}, {"JSON_KEYS", 'f'}, {"JULIANDAY", 'f'}, {"JUSTIFY_DAYS", 'f'}, {"JUSTIFY_HOURS", 'f'}, {"JUSTIFY_INTERVAL", 'f'}, {"KEYS", 'k'}, {"KEY_GUID", 'f'}, {"KEY_ID", 'f'}, {"KILL", 'k'}, {"LAG", 'f'}, {"LASTVAL", 'f'}, {"LAST_INSERT_ID", 'f'}, {"LAST_INSERT_ROWID", 'f'}, {"LAST_VALUE", 'f'}, {"LCASE", 'f'}, {"LEAD", 'f'}, {"LEADING", 'k'}, {"LEAST", 'f'}, {"LEAVE", 'k'}, {"LEFT", 'f'}, {"LEFT JOIN", 'k'}, {"LEFT OUTER", 'k'}, {"LEFT OUTER JOIN", 'k'}, {"LENGTH", 'f'}, {"LIKE", 'o'}, {"LIMIT", 'B'}, {"LINEAR", 'k'}, {"LINES", 'k'}, {"LN", 'f'}, {"LOAD", 'k'}, {"LOAD DATA", 'T'}, {"LOAD XML", 'T'}, {"LOAD_EXTENSION", 'f'}, {"LOAD_FILE", 'f'}, {"LOCALTIME", 'v'}, {"LOCALTIMESTAMP", 'v'}, {"LOCATE", 'f'}, {"LOCK", 'n'}, {"LOCK IN", 'n'}, {"LOCK IN SHARE", 'n'}, {"LOCK IN SHARE MODE", 'k'}, {"LOCK TABLE", 'k'}, {"LOCK TABLES", 'k'}, {"LOG", 'f'}, {"LOG10", 'f'}, {"LOG2", 'f'}, {"LONGBLOB", 'k'}, {"LONGTEXT", 'k'}, {"LOOP", 'k'}, {"LOWER", 'f'}, {"LOWER_INC", 'f'}, {"LOWER_INF", 'f'}, {"LOW_PRIORITY", 'k'}, {"LPAD", 'f'}, {"LTRIM", 'f'}, {"MAKEDATE", 'f'}, {"MAKE_SET", 'f'}, {"MASKLEN", 'f'}, {"MASTER_BIND", 'k'}, {"MASTER_POS_WAIT", 'f'}, {"MASTER_SSL_VERIFY_SERVER_CERT", 'k'}, {"MATCH", 'k'}, {"MAX", 'f'}, {"MAXVALUE", 'k'}, {"MD5", 'f'}, {"MEDIUMBLOB", 'k'}, {"MEDIUMINT", 'k'}, {"MEDIUMTEXT", 'k'}, {"MERGE", 'k'}, {"MICROSECOND", 'f'}, {"MID", 'f'}, {"MIDDLEINT", 'k'}, {"MIN", 'f'}, {"MINUTE", 'f'}, {"MINUTE_MICROSECOND", 'k'}, {"MINUTE_SECOND", 'k'}, {"MKDIR", 'f'}, {"MOD", 'o'}, {"MODE", 'n'}, {"MODIFIES", 'k'}, {"MONEY", 't'}, {"MONTH", 'f'}, {"MONTHNAME", 'f'}, {"NAME_CONST", 'f'}, {"NATURAL", 'n'}, {"NATURAL FULL", 'k'}, {"NATURAL FULL OUTER JOIN", 'k'}, {"NATURAL INNER", 'k'}, {"NATURAL JOIN", 'k'}, {"NATURAL LEFT", 'k'}, {"NATURAL LEFT OUTER", 'k'}, {"NATURAL LEFT OUTER JOIN", 'k'}, {"NATURAL OUTER", 'k'}, {"NATURAL RIGHT", 'k'}, {"NATURAL RIGHT OUTER JOIN", 'k'}, {"NETMASK", 'f'}, {"NEXT VALUE", 'n'}, {"NEXT VALUE FOR", 'k'}, {"NEXTVAL", 'f'}, {"NOT", 'o'}, {"NOT BETWEEN", 'o'}, {"NOT IN", 'k'}, {"NOT LIKE", 'o'}, {"NOT REGEXP", 'o'}, {"NOT RLIKE", 'o'}, {"NOT SIMILAR", 'o'}, {"NOT SIMILAR TO", 'o'}, {"NOTNULL", 'k'}, {"NOW", 'f'}, {"NOWAIT", 'k'}, {"NO_WRITE_TO_BINLOG", 'k'}, {"NTH_VALUE", 'f'}, {"NTILE", 'f'}, {"NULL", 'v'}, {"NULLIF", 'f'}, {"NUMERIC", 't'}, {"NZ", 'f'}, {"OBJECTPROPERTY", 'f'}, {"OBJECTPROPERTYEX", 'f'}, {"OBJECT_DEFINITION", 'f'}, {"OBJECT_ID", 'f'}, {"OBJECT_NAME", 'f'}, {"OBJECT_SCHEMA_NAME", 'f'}, {"OCT", 'f'}, {"OCTET_LENGTH", 'f'}, {"OFFSET", 'k'}, {"OID", 't'}, {"OLD_PASSWORD", 'f'}, {"ONE_SHOT", 'k'}, {"OPEN", 'k'}, {"OPENDATASOURCE", 'f'}, {"OPENQUERY", 'f'}, {"OPENROWSET", 'f'}, {"OPENXML", 'f'}, {"OPTIMIZE", 'k'}, {"OPTION", 'k'}, {"OPTIONALLY", 'k'}, {"OR", '&'}, {"ORD", 'f'}, {"ORDER", 'n'}, {"ORDER BY", 'B'}, {"ORIGINAL_DB_NAME", 'f'}, {"ORIGINAL_LOGIN", 'f'}, {"OUT", 'n'}, {"OUTER", 'n'}, {"OUTFILE", 'k'}, {"OVERLAPS", 'f'}, {"OVERLAY", 'f'}, {"OWN3D", 'k'}, {"OWN3D BY", 'B'}, {"PARSENAME", 'f'}, {"PARTITION", 'k'}, {"PARTITION BY", 'B'}, {"PASSWORD", 'n'}, {"PATHINDEX", 'f'}, {"PATINDEX", 'f'}, {"PERCENTILE_COUNT", 'f'}, {"PERCENTILE_DISC", 'f'}, {"PERCENTILE_RANK", 'f'}, {"PERCENT_RANK", 'f'}, {"PERIOD_ADD", 'f'}, {"PERIOD_DIFF", 'f'}, {"PERMISSIONS", 'f'}, {"PG_ADVISORY_LOCK", 'f'}, {"PG_BACKEND_PID", 'f'}, {"PG_CANCEL_BACKEND", 'f'}, {"PG_CLIENT_ENCODING", 'f'}, {"PG_CONF_LOAD_TIME", 'f'}, {"PG_CREATE_RESTORE_POINT", 'f'}, {"PG_HAS_ROLE", 'f'}, {"PG_IS_IN_RECOVERY", 'f'}, {"PG_IS_OTHER_TEMP_SCHEMA", 'f'}, {"PG_LISTENING_CHANNELS", 'f'}, {"PG_LS_DIR", 'f'}, {"PG_MY_TEMP_SCHEMA", 'f'}, {"PG_POSTMASTER_START_TIME", 'f'}, {"PG_READ_BINARY_FILE", 'f'}, {"PG_READ_FILE", 'f'}, {"PG_RELOAD_CONF", 'f'}, {"PG_ROTATE_LOGFILE", 'f'}, {"PG_SLEEP", 'f'}, {"PG_START_BACKUP", 'f'}, {"PG_STAT_FILE", 'f'}, {"PG_STOP_BACKUP", 'f'}, {"PG_SWITCH_XLOG", 'f'}, {"PG_TERMINATE_BACKEND", 'f'}, {"PG_TRIGGER_DEPTH", 'f'}, {"PI", 'f'}, {"POSITION", 'f'}, {"POW", 'f'}, {"POWER", 'f'}, {"PRECISION", 'k'}, {"PREVIOUS VALUE", 'n'}, {"PREVIOUS VALUE FOR", 'k'}, {"PRIMARY", 'k'}, {"PRINT", 'T'}, {"PROCEDURE", 'k'}, {"PROCEDURE ANALYSE", 'f'}, {"PUBLISHINGSERVERNAME", 'f'}, {"PURGE", 'k'}, {"PWDCOMPARE", 'f'}, {"PWDENCRYPT", 'f'}, {"QUARTER", 'f'}, {"QUOTE", 'f'}, {"QUOTENAME", 'f'}, {"QUOTE_IDENT", 'f'}, {"QUOTE_LITERAL", 'f'}, {"QUOTE_NULLABLE", 'f'}, {"RADIANS", 'f'}, {"RAISEERROR", 'E'}, {"RAND", 'f'}, {"RANDOM", 'f'}, {"RANDOMBLOB", 'f'}, {"RANGE", 'k'}, {"RANK", 'f'}, {"READ", 'k'}, {"READ WRITE", 'k'}, {"READS", 'k'}, {"READ_WRITE", 'k'}, {"REAL", 't'}, {"REFERENCES", 'k'}, {"REGCLASS", 't'}, {"REGCONFIG", 't'}, {"REGDICTIONARY", 't'}, {"REGEXP", 'o'}, {"REGEXP_INSTR", 'f'}, {"REGEXP_MATCHES", 'f'}, {"REGEXP_REPLACE", 'f'}, {"REGEXP_SPLIT_TO_ARRAY", 'f'}, {"REGEXP_SPLIT_TO_TABLE", 'f'}, {"REGEXP_SUBSTR", 'f'}, {"REGOPER", 't'}, {"REGOPERATOR", 't'}, {"REGPROC", 't'}, {"REGPROCEDURE", 't'}, {"REGTYPE", 't'}, {"RELEASE", 'k'}, {"RELEASE_LOCK", 'f'}, {"RENAME", 'k'}, {"REPEAT", 'k'}, {"REPLACE", 'k'}, {"REPLICATE", 'f'}, {"REQUIRE", 'k'}, {"RESIGNAL", 'k'}, {"RESTRICT", 'k'}, {"RETURN", 'k'}, {"REVERSE", 'f'}, {"REVOKE", 'k'}, {"RIGHT", 'n'}, {"RIGHT JOIN", 'k'}, {"RIGHT OUTER", 'k'}, {"RIGHT OUTER JOIN", 'k'}, {"RLIKE", 'o'}, {"ROUND", 'f'}, {"ROW", 'f'}, {"ROW_COUNT", 'f'}, {"ROW_NUMBER", 'f'}, {"ROW_TO_JSON", 'f'}, {"RPAD", 'f'}, {"RTRIM", 'f'}, {"SCHAMA_NAME", 'f'}, {"SCHEMA", 'k'}, {"SCHEMAS", 'k'}, {"SCHEMA_ID", 'f'}, {"SCOPE_IDENTITY", 'f'}, {"SECOND_MICROSECOND", 'k'}, {"SEC_TO_TIME", 'f'}, {"SELECT", 'E'}, {"SELECT ALL", 'E'}, {"SELECT DISTINCT", 'E'}, {"SENSITIVE", 'k'}, {"SEPARATOR", 'k'}, {"SERIAL", 't'}, {"SERIAL2", 't'}, {"SERIAL4", 't'}, {"SERIAL8", 't'}, {"SERVERPROPERTY", 'f'}, {"SESSION_USER", 'f'}, {"SET", 'E'}, {"SETATTR", 'f'}, {"SETSEED", 'f'}, {"SETVAL", 'f'}, {"SET_BIT", 'f'}, {"SET_BYTE", 'f'}, {"SET_CONFIG", 'f'}, {"SET_MASKLEN", 'f'}, {"SHA", 'f'}, {"SHA1", 'f'}, {"SHA2", 'f'}, {"SHOW", 'n'}, {"SHUTDOWN", 'T'}, {"SIGN", 'f'}, {"SIGNAL", 'k'}, {"SIGNBYASMKEY", 'f'}, {"SIGNBYCERT", 'f'}, {"SIMILAR", 'k'}, {"SIMILAR TO", 'o'}, {"SIN", 'f'}, {"SLEEP", 'f'}, {"SMALLDATETIMEFROMPARTS", 'f'}, {"SMALLINT", 't'}, {"SMALLSERIAL", 't'}, {"SOME", 'f'}, {"SOUNDEX", 'f'}, {"SOUNDS", 'o'}, {"SOUNDS LIKE", 'o'}, {"SPACE", 'f'}, {"SPATIAL", 'k'}, {"SPECIFIC", 'k'}, {"SPLIT_PART", 'f'}, {"SQL", 'k'}, {"SQLEXCEPTION", 'k'}, {"SQLITE_VERSION", 'f'}, {"SQLSTATE", 'k'}, {"SQLWARNING", 'k'}, {"SQL_BIG_RESULT", 'k'}, {"SQL_BUFFER_RESULT", 'k'}, {"SQL_CACHE", 'k'}, {"SQL_CALC_FOUND_ROWS", 'k'}, {"SQL_NO_CACHE", 'k'}, {"SQL_SMALL_RESULT", 'k'}, {"SQL_VARIANT_PROPERTY", 'f'}, {"SQRT", 'f'}, {"SSL", 'k'}, {"STARTING", 'k'}, {"STATEMENT_TIMESTAMP", 'f'}, {"STATS_DATE", 'f'}, {"STDDEV", 'f'}, {"STDDEV_POP", 'f'}, {"STDDEV_SAMP", 'f'}, {"STRAIGHT_JOIN", 'k'}, {"STRCMP", 'f'}, {"STRCOMP", 'f'}, {"STRCONV", 'f'}, {"STRING_AGG", 'f'}, {"STRING_TO_ARRAY", 'f'}, {"STRPOS", 'f'}, {"STR_TO_DATE", 'f'}, {"STUFF", 'f'}, {"SUBDATE", 'f'}, {"SUBSTR", 'f'}, {"SUBSTRING", 'f'}, {"SUBSTRING_INDEX", 'f'}, {"SUBTIME", 'f'}, {"SUM", 'f'}, {"SUSER_ID", 'f'}, {"SUSER_NAME", 'f'}, {"SUSER_SID", 'f'}, {"SUSER_SNAME", 'f'}, {"SWITCHOFFET", 'f'}, {"SYS.DATABASE_NAME", 'n'}, {"SYS.FN_BUILTIN_PERMISSIONS", 'f'}, {"SYS.FN_GET_AUDIT_FILE", 'f'}, {"SYS.FN_MY_PERMISSIONS", 'f'}, {"SYS.STRAGG", 'f'}, {"SYSCOLUMNS", 'k'}, {"SYSDATE", 'f'}, {"SYSDATETIME", 'f'}, {"SYSDATETIMEOFFSET", 'f'}, {"SYSOBJECTS", 'k'}, {"SYSTEM_USER", 'f'}, {"SYSUSERS", 'k'}, {"SYSUTCDATETME", 'f'}, {"TABLE", 'n'}, {"TAN", 'f'}, {"TERMINATED", 'k'}, {"TERTIARY_WEIGHTS", 'f'}, {"TEXT", 't'}, {"TEXTPOS", 'f'}, {"TEXTPTR", 'f'}, {"TEXTVALID", 'f'}, {"THEN", 'k'}, {"TIME", 'k'}, {"TIMEDIFF", 'f'}, {"TIMEFROMPARTS", 'f'}, {"TIMEOFDAY", 'f'}, {"TIMESERIAL", 'f'}, {"TIMESTAMP", 't'}, {"TIMESTAMPADD", 'f'}, {"TIMEVALUE", 'f'}, {"TIME_FORMAT", 'f'}, {"TIME_TO_SEC", 'f'}, {"TINYBLOB", 'k'}, {"TINYINT", 'k'}, {"TINYTEXT", 'k'}, {"TODATETIMEOFFSET", 'f'}, {"TOP", 'k'}, {"TOTAL", 'f'}, {"TOTAL_CHANGES", 'f'}, {"TO_ASCII", 'f'}, {"TO_BASE64", 'f'}, {"TO_CHAR", 'f'}, {"TO_DATE", 'f'}, {"TO_DAYS", 'f'}, {"TO_HEX", 'f'}, {"TO_NUMBER", 'f'}, {"TO_SECONDS", 'f'}, {"TO_TIMESTAMP", 'f'}, {"TRAILING", 'n'}, {"TRANSACTION_TIMESTAMP", 'f'}, {"TRANSLATE", 'f'}, {"TRIGGER", 'k'}, {"TRIGGER_NESTLEVEL", 'f'}, {"TRIM", 'f'}, {"TRUE", '1'}, {"TRUNC", 'f'}, {"TRUNCATE", 'f'}, {"TRY", 'T'}, {"TRY_CAST", 'f'}, {"TRY_CONVERT", 'f'}, {"TRY_PARSE", 'f'}, {"TYPEOF", 'f'}, {"TYPEPROPERTY", 'f'}, {"TYPE_ID", 'f'}, {"TYPE_NAME", 'f'}, {"UCASE", 'f'}, {"UESCAPE", 'o'}, {"UNCOMPRESS", 'f'}, {"UNCOMPRESS_LENGTH", 'f'}, {"UNDO", 'k'}, {"UNHEX", 'f'}, {"UNICODE", 'f'}, {"UNION", 'U'}, {"UNION ALL", 'U'}, {"UNION ALL DISTINCT", 'U'}, {"UNION DISTINCT", 'U'}, {"UNION DISTINCT ALL", 'U'}, {"UNIQUE", 'n'}, {"UNIX_TIMESTAMP", 'f'}, {"UNI_ON", 'U'}, {"UNKNOWN", 'v'}, {"UNLOCK", 'k'}, {"UNNEST", 'f'}, {"UNSIGNED", 'k'}, {"UPDATE", 'E'}, {"UPDATEXML", 'f'}, {"UPPER", 'f'}, {"UPPER_INC", 'f'}, {"UPPER_INF", 'f'}, {"USAGE", 'k'}, {"USE", 'T'}, {"USER", 'n'}, {"USER_ID", 'n'}, {"USER_LOCK.SLEEP", 'f'}, {"USER_NAME", 'n'}, {"USING", 'f'}, {"UTC_DATE", 'k'}, {"UTC_TIME", 'k'}, {"UTC_TIMESTAMP", 'k'}, {"UTL_HTTP.REQUEST", 'f'}, {"UTL_INADDR.GET_HOST_ADDRESS", 'f'}, {"UTL_INADDR.GET_HOST_NAME", 'f'}, {"UUID", 'f'}, {"UUID_SHORT", 'f'}, {"VALUES", 'k'}, {"VAR", 'f'}, {"VARBINARY", 'k'}, {"VARCHAR", 't'}, {"VARCHARACTER", 'k'}, {"VARIANCE", 'f'}, {"VARP", 'f'}, {"VARYING", 'k'}, {"VAR_POP", 'f'}, {"VAR_SAMP", 'f'}, {"VERIFYSIGNEDBYASMKEY", 'f'}, {"VERIFYSIGNEDBYCERT", 'f'}, {"VERSION", 'f'}, {"VOID", 't'}, {"WAIT", 'k'}, {"WAITFOR", 'n'}, {"WAITFOR DELAY", 'E'}, {"WAITFOR RECEIVE", 'E'}, {"WAITFOR TIME", 'E'}, {"WEEK", 'f'}, {"WEEKDAY", 'f'}, {"WEEKDAYNAME", 'f'}, {"WEEKOFYEAR", 'f'}, {"WHEN", 'k'}, {"WHERE", 'k'}, {"WHILE", 'T'}, {"WIDTH_BUCKET", 'f'}, {"WITH", 'n'}, {"WITH ROLLUP", 'k'}, {"XMLAGG", 'f'}, {"XMLCOMMENT", 'f'}, {"XMLCONCAT", 'f'}, {"XMLELEMENT", 'f'}, {"XMLEXISTS", 'f'}, {"XMLFOREST", 'f'}, {"XMLFORMAT", 'f'}, {"XMLPI", 'f'}, {"XMLROOT", 'f'}, {"XMLTYPE", 'f'}, {"XML_IS_WELL_FORMED", 'f'}, {"XOR", '&'}, {"XPATH", 'f'}, {"XPATH_EXISTS", 'f'}, {"XP_EXECRESULTSET", 'k'}, {"YEAR", 'f'}, {"YEARWEEK", 'f'}, {"YEAR_MONTH", 'k'}, {"ZEROBLOB", 'f'}, {"ZEROFILL", 'k'}, {"^=", 'o'}, {"_ARMSCII8", 't'}, {"_ASCII", 't'}, {"_BIG5", 't'}, {"_BINARY", 't'}, {"_CP1250", 't'}, {"_CP1251", 't'}, {"_CP1257", 't'}, {"_CP850", 't'}, {"_CP852", 't'}, {"_CP866", 't'}, {"_CP932", 't'}, {"_DEC8", 't'}, {"_EUCJPMS", 't'}, {"_EUCKR", 't'}, {"_GB2312", 't'}, {"_GBK", 't'}, {"_GEOSTD8", 't'}, {"_GREEK", 't'}, {"_HEBREW", 't'}, {"_HP8", 't'}, {"_KEYBCS2", 't'}, {"_KOI8R", 't'}, {"_KOI8U", 't'}, {"_LATIN1", 't'}, {"_LATIN2", 't'}, {"_LATIN5", 't'}, {"_LATIN7", 't'}, {"_MACCE", 't'}, {"_MACROMAN", 't'}, {"_SJIS", 't'}, {"_SWE7", 't'}, {"_TIS620", 't'}, {"_UJIS", 't'}, {"_USC2", 't'}, {"_UTF8", 't'}, {"|/", 'o'}, {"|=", 'o'}, {"||", '&'}, {"~*", 'o'}, }; static const size_t sql_keywords_sz = 9352; #endif modsecurity-2.9.5/apache2/libinjection/libinjection.h0000664000175000017500000000314114147005233024014 0ustar mhsvierulamhsvierula/** * Copyright 2012-2016 Nick Galbreath * nickg@client9.com * BSD License -- see COPYING.txt for details * * https://libinjection.client9.com/ * */ #ifndef LIBINJECTION_H #define LIBINJECTION_H #ifdef __cplusplus # define LIBINJECTION_BEGIN_DECLS extern "C" { # define LIBINJECTION_END_DECLS } #else # define LIBINJECTION_BEGIN_DECLS # define LIBINJECTION_END_DECLS #endif LIBINJECTION_BEGIN_DECLS /* * Pull in size_t */ #include /* * Version info. * * This is moved into a function to allow SWIG and other auto-generated * binding to not be modified during minor release changes. We change * change the version number in the c source file, and not regenerated * the binding * * See python's normalized version * http://www.python.org/dev/peps/pep-0386/#normalizedversion */ const char* libinjection_version(void); /** * Simple API for SQLi detection - returns a SQLi fingerprint or NULL * is benign input * * \param[in] s input string, may contain nulls, does not need to be null-terminated * \param[in] slen input string length * \param[out] fingerprint buffer of 8+ characters. c-string, * \return 1 if SQLi, 0 if benign. fingerprint will be set or set to empty string. */ int libinjection_sqli(const char* s, size_t slen, char fingerprint[]); /** ALPHA version of xss detector. * * NOT DONE. * * \param[in] s input string, may contain nulls, does not need to be null-terminated * \param[in] slen input string length * \return 1 if XSS found, 0 if benign * */ int libinjection_xss(const char* s, size_t slen); LIBINJECTION_END_DECLS #endif /* LIBINJECTION_H */ modsecurity-2.9.5/apache2/libinjection/libinjection_html5.h0000664000175000017500000000162114147005233025126 0ustar mhsvierulamhsvierula#ifndef LIBINJECTION_HTML5 #define LIBINJECTION_HTML5 #ifdef __cplusplus extern "C" { #endif /* pull in size_t */ #include enum html5_type { DATA_TEXT , TAG_NAME_OPEN , TAG_NAME_CLOSE , TAG_NAME_SELFCLOSE , TAG_DATA , TAG_CLOSE , ATTR_NAME , ATTR_VALUE , TAG_COMMENT , DOCTYPE }; enum html5_flags { DATA_STATE , VALUE_NO_QUOTE , VALUE_SINGLE_QUOTE , VALUE_DOUBLE_QUOTE , VALUE_BACK_QUOTE }; struct h5_state; typedef int (*ptr_html5_state)(struct h5_state*); typedef struct h5_state { const char* s; size_t len; size_t pos; int is_close; ptr_html5_state state; const char* token_start; size_t token_len; enum html5_type token_type; } h5_state_t; void libinjection_h5_init(h5_state_t* hs, const char* s, size_t len, enum html5_flags); int libinjection_h5_next(h5_state_t* hs); #ifdef __cplusplus } #endif #endif modsecurity-2.9.5/apache2/libinjection/libinjection_xss.h0000664000175000017500000000041314147005233024710 0ustar mhsvierulamhsvierula#ifndef LIBINJECTION_XSS #define LIBINJECTION_XSS #ifdef __cplusplus extern "C" { #endif /** * HEY THIS ISN'T DONE */ /* pull in size_t */ #include int libinjection_is_xss(const char* s, size_t len, int flags); #ifdef __cplusplus } #endif #endif modsecurity-2.9.5/apache2/libinjection/COPYING.txt0000664000175000017500000000334014147005233023044 0ustar mhsvierulamhsvierula/* * Copyright 2012, 2013 * Nick Galbreath -- nickg [at] client9 [dot] com * http://www.client9.com/projects/libinjection/ * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 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. * * Neither the name of libinjection nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "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 COPYRIGHT * OWNER OR CONTRIBUTORS 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. * * This is the standard "new" BSD license: * http://www.opensource.org/licenses/bsd-license.php */ modsecurity-2.9.5/apache2/libinjection/libinjection_xss.c0000664000175000017500000003430314147005233024710 0ustar mhsvierulamhsvierula #include "libinjection.h" #include "libinjection_xss.h" #include "libinjection_html5.h" #include #include typedef enum attribute { TYPE_NONE , TYPE_BLACK /* ban always */ , TYPE_ATTR_URL /* attribute value takes a URL-like object */ , TYPE_STYLE , TYPE_ATTR_INDIRECT /* attribute *name* is given in *value* */ } attribute_t; static attribute_t is_black_attr(const char* s, size_t len); static int is_black_tag(const char* s, size_t len); static int is_black_url(const char* s, size_t len); static int cstrcasecmp_with_null(const char *a, const char *b, size_t n); static int html_decode_char_at(const char* src, size_t len, size_t* consumed); static int htmlencode_startswith(const char* prefix, const char *src, size_t n); typedef struct stringtype { const char* name; attribute_t atype; } stringtype_t; static const int gsHexDecodeMap[256] = { 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 256, 256, 256, 256, 256, 256, 256, 10, 11, 12, 13, 14, 15, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 10, 11, 12, 13, 14, 15, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256 }; static int html_decode_char_at(const char* src, size_t len, size_t* consumed) { int val = 0; size_t i; int ch; if (len == 0 || src == NULL) { *consumed = 0; return -1; } *consumed = 1; if (*src != '&' || len < 2) { return (unsigned char)(*src); } if (*(src+1) != '#') { /* normally this would be for named entities * but for this case we don't actually care */ return '&'; } if (*(src+2) == 'x' || *(src+2) == 'X') { ch = (unsigned char) (*(src+3)); ch = gsHexDecodeMap[ch]; if (ch == 256) { /* degenerate case '&#[?]' */ return '&'; } val = ch; i = 4; while (i < len) { ch = (unsigned char) src[i]; if (ch == ';') { *consumed = i + 1; return val; } ch = gsHexDecodeMap[ch]; if (ch == 256) { *consumed = i; return val; } val = (val * 16) + ch; if (val > 0x1000FF) { return '&'; } ++i; } *consumed = i; return val; } else { i = 2; ch = (unsigned char) src[i]; if (ch < '0' || ch > '9') { return '&'; } val = ch - '0'; i += 1; while (i < len) { ch = (unsigned char) src[i]; if (ch == ';') { *consumed = i + 1; return val; } if (ch < '0' || ch > '9') { *consumed = i; return val; } val = (val * 10) + (ch - '0'); if (val > 0x1000FF) { return '&'; } ++i; } *consumed = i; return val; } } /* * view-source: * data: * javascript: */ static stringtype_t BLACKATTR[] = { { "ACTION", TYPE_ATTR_URL } /* form */ , { "ATTRIBUTENAME", TYPE_ATTR_INDIRECT } /* SVG allow indirection of attribute names */ , { "BY", TYPE_ATTR_URL } /* SVG */ , { "BACKGROUND", TYPE_ATTR_URL } /* IE6, O11 */ , { "DATAFORMATAS", TYPE_BLACK } /* IE */ , { "DATASRC", TYPE_BLACK } /* IE */ , { "DYNSRC", TYPE_ATTR_URL } /* Obsolete img attribute */ , { "FILTER", TYPE_STYLE } /* Opera, SVG inline style */ , { "FORMACTION", TYPE_ATTR_URL } /* HTML 5 */ , { "FOLDER", TYPE_ATTR_URL } /* Only on A tags, IE-only */ , { "FROM", TYPE_ATTR_URL } /* SVG */ , { "HANDLER", TYPE_ATTR_URL } /* SVG Tiny, Opera */ , { "HREF", TYPE_ATTR_URL } , { "LOWSRC", TYPE_ATTR_URL } /* Obsolete img attribute */ , { "POSTER", TYPE_ATTR_URL } /* Opera 10,11 */ , { "SRC", TYPE_ATTR_URL } , { "STYLE", TYPE_STYLE } , { "TO", TYPE_ATTR_URL } /* SVG */ , { "VALUES", TYPE_ATTR_URL } /* SVG */ , { "XLINK:HREF", TYPE_ATTR_URL } , { NULL, TYPE_NONE } }; /* xmlns */ /* `xml-stylesheet` > , */ /* static const char* BLACKATTR[] = { "ATTRIBUTENAME", "BACKGROUND", "DATAFORMATAS", "HREF", "SCROLL", "SRC", "STYLE", "SRCDOC", NULL }; */ static const char* BLACKTAG[] = { "APPLET" /* , "AUDIO" */ , "BASE" , "COMMENT" /* IE http://html5sec.org/#38 */ , "EMBED" /* , "FORM" */ , "FRAME" , "FRAMESET" , "HANDLER" /* Opera SVG, effectively a script tag */ , "IFRAME" , "IMPORT" , "ISINDEX" , "LINK" , "LISTENER" /* , "MARQUEE" */ , "META" , "NOSCRIPT" , "OBJECT" , "SCRIPT" , "STYLE" /* , "VIDEO" */ , "VMLFRAME" , "XML" , "XSS" , NULL }; static int cstrcasecmp_with_null(const char *a, const char *b, size_t n) { char ca; char cb; /* printf("Comparing to %s %.*s\n", a, (int)n, b); */ while (n-- > 0) { cb = *b++; if (cb == '\0') continue; ca = *a++; if (cb >= 'a' && cb <= 'z') { cb -= 0x20; } /* printf("Comparing %c vs %c with %d left\n", ca, cb, (int)n); */ if (ca != cb) { return 1; } } if (*a == 0) { /* printf(" MATCH \n"); */ return 0; } else { return 1; } } /* * Does an HTML encoded binary string (const char*, length) start with * a all uppercase c-string (null terminated), case insensitive! * * also ignore any embedded nulls in the HTML string! * * return 1 if match / starts with * return 0 if not */ static int htmlencode_startswith(const char *a, const char *b, size_t n) { size_t consumed; int cb; int first = 1; /* printf("Comparing %s with %.*s\n", a,(int)n,b); */ while (n > 0) { if (*a == 0) { /* printf("Match EOL!\n"); */ return 1; } cb = html_decode_char_at(b, n, &consumed); b += consumed; n -= consumed; if (first && cb <= 32) { /* ignore all leading whitespace and control characters */ continue; } first = 0; if (cb == 0) { /* always ignore null characters in user input */ continue; } if (cb == 10) { /* always ignore vertical tab characters in user input */ /* who allows this?? */ continue; } if (cb >= 'a' && cb <= 'z') { /* upcase */ cb -= 0x20; } if (*a != (char) cb) { /* printf(" %c != %c\n", *a, cb); */ /* mismatch */ return 0; } a++; } return (*a == 0) ? 1 : 0; } static int is_black_tag(const char* s, size_t len) { const char** black; if (len < 3) { return 0; } black = BLACKTAG; while (*black != NULL) { if (cstrcasecmp_with_null(*black, s, len) == 0) { /* printf("Got black tag %s\n", *black); */ return 1; } black += 1; } /* anything SVG related */ if ((s[0] == 's' || s[0] == 'S') && (s[1] == 'v' || s[1] == 'V') && (s[2] == 'g' || s[2] == 'G')) { /* printf("Got SVG tag \n"); */ return 1; } /* Anything XSL(t) related */ if ((s[0] == 'x' || s[0] == 'X') && (s[1] == 's' || s[1] == 'S') && (s[2] == 'l' || s[2] == 'L')) { /* printf("Got XSL tag\n"); */ return 1; } return 0; } static attribute_t is_black_attr(const char* s, size_t len) { stringtype_t* black; if (len < 2) { return TYPE_NONE; } if (len >= 5) { /* JavaScript on.* */ if ((s[0] == 'o' || s[0] == 'O') && (s[1] == 'n' || s[1] == 'N')) { /* printf("Got JavaScript on- attribute name\n"); */ return TYPE_BLACK; } /* XMLNS can be used to create arbitrary tags */ if (cstrcasecmp_with_null("XMLNS", s, 5) == 0 || cstrcasecmp_with_null("XLINK", s, 5) == 0) { /* printf("Got XMLNS and XLINK tags\n"); */ return TYPE_BLACK; } } black = BLACKATTR; while (black->name != NULL) { if (cstrcasecmp_with_null(black->name, s, len) == 0) { /* printf("Got banned attribute name %s\n", black->name); */ return black->atype; } black += 1; } return TYPE_NONE; } static int is_black_url(const char* s, size_t len) { static const char* data_url = "DATA"; static const char* viewsource_url = "VIEW-SOURCE"; /* obsolete but interesting signal */ static const char* vbscript_url = "VBSCRIPT"; /* covers JAVA, JAVASCRIPT, + colon */ static const char* javascript_url = "JAVA"; /* skip whitespace */ while (len > 0 && (*s <= 32 || *s >= 127)) { /* * HEY: this is a signed character. * We are intentionally skipping high-bit characters too * since they are not ASCII, and Opera sometimes uses UTF-8 whitespace. * * Also in EUC-JP some of the high bytes are just ignored. */ ++s; --len; } if (htmlencode_startswith(data_url, s, len)) { return 1; } if (htmlencode_startswith(viewsource_url, s, len)) { return 1; } if (htmlencode_startswith(javascript_url, s, len)) { return 1; } if (htmlencode_startswith(vbscript_url, s, len)) { return 1; } return 0; } int libinjection_is_xss(const char* s, size_t len, int flags) { h5_state_t h5; attribute_t attr = TYPE_NONE; libinjection_h5_init(&h5, s, len, (enum html5_flags) flags); while (libinjection_h5_next(&h5)) { if (h5.token_type != ATTR_VALUE) { attr = TYPE_NONE; } if (h5.token_type == DOCTYPE) { return 1; } else if (h5.token_type == TAG_NAME_OPEN) { if (is_black_tag(h5.token_start, h5.token_len)) { return 1; } } else if (h5.token_type == ATTR_NAME) { attr = is_black_attr(h5.token_start, h5.token_len); } else if (h5.token_type == ATTR_VALUE) { /* * IE6,7,8 parsing works a bit differently so * a whole

    hH7iOOΦL?~M˯zPÎba؇w) / VVUpwR=[گ>Ă|D3&knnl |0Ev72zWܫ!͹&Ik. BO=a@BQ6e9I+w( 鞒|SL+΀4pjrxq5+Էվz9ثfNruDʧv'W~xMëZ\5рԩWST-AŋݿLٽ֎@5JpCU`KoZ:d &$Yܥ2ݕ)GQj/Y _ 5n\w)vB5H`A{?DqtR&R0PXMꖗqzaYU/ (9^lAf۴~[{4-|x32p{O/sU_6TndR*M>:SG!GEOW~m -q_!V{4xcqadnj"k}Q_ՙEBCeG NX6~_|)H<:% @>/NxQM>EcƷH3ޗҫ_NU?r~Qiμ,=~w" Q &&W@=F"G'F?gO\PvFnYOePD􍬅bpQ˾{%"PdAc}r&)WI'gW=F@j!?LLYC骇 f:j/\倝b$`4Kx<"y tTkR7)bAl!~lcA '}N|Qmn@M:YA+ 4gt=]Ux#BWk ^qkΦZ6Th1W#ΫGWOekLU|P4\7\>hbौAu߷Y$ݝ)y͗:Q~#4+"^]cѶGwC_߮?ABNQ2}\S$V']8Hym љ%v#ǥDy(s#ƃؓK+|xk:^WBGt\nXQvѵ8E &gG/VuE{f؂~]Z\pYo5c(VoF*V1hVo'ҢBhj'0=>)C/%*8 8Djְq4Q.Va6lxDG`[[%ET>)U+lRo^q; m->7tp%9IT%)CNt4VNJVVPZ˂i݅Ǻ|vX]TR " bu}RڳuIF4Q$7hot,{'*fz_ZzV=3,VsbbgF 6WGk{mpKCˉ7kŨo^l}5z}EPV+kR7DT_~t݄$:ug+0վuQe}»^@kFĜKڽ,ߨ,ȗUE{*>k(}T$zl5Yb`a/1ط׮ ^3cT`u=2S7z}wM8y|9n+0 OFl`߀4 ix?ssjl#ekX k HUw__ΆV|} _vj{̒ElXEJMQtBnGcl%MI[E^8D1ABh&ADP * *У/ ]ĠgO Zàa@t9͠Gt9A2h n5tΠoЅAg3C z+| :ŀ"/:A/1ià0hIU z>2d=`@$I dwǠ[ zCz5]AP7^ˠK =S Rt*^n@%~{AdtZD:u5b.@Gtcmt A`о #h>cG hsT24A zH|J{9aϪH`v}"VϺ{tix}3A/T%ύaʪלT, ?Nu'O5(˾N =FO;‚)Ǽ |Utnd8ڍk4Cs>w%ǿP"Q LAzz|j3F]F\+M# 1x)[زNnSevVdF$,4=b_qF/۸=rM _ט+S~7TWTHhzYUe+:ewOF~,t֝_U^&*)YP|uzoJ: 埡$Cn'W1~LI0,̔=e~&g\9Z-@5t멤?{A{)K|xM \ytWOQy,.8'xR 8^>.Dx {`s5gƽ43ym՜F&){Xq1ݮ<rŶAy`kvttS[56ѽ~Q8GIObt;f'g?mrEx_g'x. $~2~eA󝌔(&Xb #`?|JXVKq<(YtϚ m9Qn7K6]]=cYgB44jVvG-4xn?y@>j&Gm҅8Y^;ݾȡ'9ʒO^xww3ߦqC~4|#X;B )Z/JX}ȆwN%vf=x#O, )Kr3\hʏ^@#Mj^_o׶VhUdt-g J.2>៤RKOt@Vzz:׎E狅E+,eъ&m=*[:܅3I82' e =p>zRB39,/I^Hd"n PC^vLj맢% ;UBLB'c4ȮH mxl9МoCxcUT+8IM|Р A.lV';)7xk2~kmEy1rTTB\dr(:_ݕtV@vt\.0A1|=FR_'źQ^Q`}R"Sa@܇ܤ3aeIݾ"OdמKł&neJ{1 ^>eWD?klP3 VIm;Synћ iU(Y]*cKx`#*vJ#}q^q4HJ!kv{S<٤^UIksqLEa~9Ϻ׶kJoqn0hS[=O#Lu^/P蓵=v1Om Ŝg:8rN;?]+]s:&ZNw9>xկT^ۃYHsqܚa@ġzu>)I!C=Co ȩH9>;& z#}pIJPI1@hP%bf7W,F=ٵKKuRy5ه-A=3NM $tv)Q=QeT_y1~oQsvu?Aj`MOQȜg#+A NA2Q$Ǭ;bLPNﱫH}$`&1l4n6G֍`FĨZ1)jTQR(B$T'5Axƍ´,XL`>PNLUݣّtu[:2Q'>^cOC~ $1 <[-f^PPxɊ"rB5lS ԇzExMp:; 7o(73 ![+EBNnfo6C'l143Bp96Mt4cEcɌ)D\f:=pWPjf%?3қޒNNI5z>ۯ+xBKQN%CF-w1l}RYs@57a9S,x ?CK} xUoIa" F!LIGUd%މ)jq:qfFE,-aApm(wιUI3I{w9tec<ԕE]srr+?ox+BCѝ@/p%Jn#=%pe򽨞t]dD3v?V&nK"V9p&˟E+k24g D1DpdxEah/4sEFy2" Э+r5Yk P9bXkOP/Bqd BI`2ׂ"Q닗ki1L-O/D%n={cyXw*[=$4(z-һ(8HƝ5ڝ& &؏-'͵ܐ rJG0e叢IkPG#$?f [SgTin*ne!\>L`w$=Hh nYv@9C|)~n咵 QQ æ:WO$! ya kr~Dw{̽T17yP1MZ@ rPurxvi@Bs]8Ga|K_ty Y*-R!M&0j+CrTҋޏB1z(76|ww rs J/{/=1Ψ/KpIcVYKʽwZ MӘ[M @L4< Xn8uZ5#D X,* y4ڨinO\s\.O_9z>5 >$47bw7sqSwݡ[HbcҨ=SPtXRH4ztxdL4Z떷2O1wvpntKOTߧ;oS\P y[`{ OR\[IRJhuWp*81jH6tŤ{ 'UKUآTwnaT>$j&hQR 9A~~G@,y9k?&3Neʒse d/y\)?KJW%Pe(H r0QX7?LQG_(AmdeB !?{ ue:RTgxv,ϓ >K-"D//m*GDTHB?>"JB#7B21$Br1$B`ǐ|)t[+$. ?%@I}+;&F\? Q[74Dx珫`'Ɛ֞T>/A}[DD '-M3h*B'WbQWA*XYy+m},Ԕ2m' C3  .u#*?c <9K(ZsF`}Q %0 e+e? Z䌴2܊*Bp&z@O7x'k .ySpI20=x _m%S)T'0w0ݓe/b7GXK$x,_!L0{Yг㔏e.`,Um|i%jO>[=5$109nsOw7(eP,`:NWX;|fNIOgc\GVIS!$Cx]#dԳ0tow:M0%o'.cN(/ZIHJ{_hr/_U't񗼮_~{Q ;PZՒyf_LN:{|,=_ăZ7RѧwΘq3!Ҋ84۳xë*hPDI<#=~VhX%yt:|Byr)lP4w8m6KeGAR<7#h(EϣS[ƥ(n$x| '$̪ K9,>W0q.4OkӬt7[7f`6R8 PgBJ0ϬQ(J~u[(. Jo 4uv_~ЫX&e]vtv%HD# ݱ,v f@>OnI\ZHTD Y=Z6!Nfe#H^v4&Pmݤ! E\,2,tAK>.s} ";ƪv\TQnvqW qV3|xѾh} ]vqFDp["=)\> p^!lWTƮDƗ-tC] pa+ 1㾠̲A8B@ .d_٨r= 10ڠ^1'wO[Pw J矉#۽K=АlJPyإy v;qc赍+ QI2% Kq;ґOXv( Ŏ}Ě<gMw^1 QVH(+|%g?}d|)@$rBQC=nkOP+N!i2qj`_w-w{1<̔ =ې[+gn2{&oXo#c~Bԡf$=z2Fs(5WqDŽNk| qad7i i-2 w؛V#Dn-`2D|q$#e 9p9hY-FU9m6 F,`4V`*=:'!57;jRJwN*zTkU$b|d|>.xwۭ?[S`" ,=!Y$.$tb$o֨ukx:$cR@ \[رM{JI^q$| <Ԉ>֥Pқl\^)=xEaXو2١(>[7s¥莠Qύern2H.1>F:rˤm2Ѽ?=cMB6r^!g;: vn$Ny?">l QkȉpLJRd,&Xm.-rm1qbʅE/ybS[4%iXRK쒋sakVpdnYFBml$<h`vGa0zD='Ybחj{7%cC…U+_H./m_!+)RDԁ/hr?zû;{ٻC\vk| ԒN } '~?-j i[AZq/ǜ|oEk=j[E Ici-BZ CЀMi!oZ&lZVDCJ;-5RM!UD&ZS_ЖI?%rѝm;G1a5z'~ tܝi쨙[>f?;Qܽ 3p~DSCKГﳪ pPx0jҨp@F.m㵵'E^ޢM{Evfok b\u_A v N?Nі$Ý.8ˉB `TH=kWޞ0ݰEd:>~Ȫw8HLdp(8+~ wC)VQ܀)6[n[_̨ )Uݞ۩tˢ8"!j\9*תUWR?o1) VA,]rlJ*MK!2rQvV'\xaskYg&r.=(s=B6kEuwL 9ktI53; ǩؘ7v nXA]e"0Mkz³ rþ|fDX>֭jVLI1G(1Gߡwn&uAPE\W\^Uu_ h\w-M656&@R=&Rjћ3v[4agvM2hŜvsg1.C'Z^A}POWS.Zwn7?L6ffmPG6npJTm'@Wѕ/.Sy@niw㡦nw#_mZO? YFj{cFM@.j3;I41n*>.JФms9bcߣ,Pba+,CuY'9򹛡!nMR\_'QNgU8@ ; ';Hܰ8DQŒ.o?e3d$V,Ӎ J/lŠ|Ց8®A~m6InT7p=RF;FS_AӍ5H\J;P"rA7z# \O ,8=V/wCo/f/,Z7N0";ͺgmJY]0efS`Š*՟nnQ/FPn-LFy##-nU+u/ܣ(6FZAwH֝k/QwFV9C+v4uÞY0-%V!npGs\:)Ɩ@A1 rgԲ:L 88+%) 4WSd7|sSZ\:w_dB-<)K_wWQz] L&U(yʌ?l q)k4rL6 v3_ 6,݇`*kK 5i% lq1fhX =񮇀*}ޙ6Q]#[CR<-3ܮӲ]IJҼq߆uo[%kkc?}9)6K66/߾LO? G+)g.v?ŝFYt< !7jt-Wx}y>j7">OuFNt{JɿU2fWmiVBI 7/׈L%ޮه$۝l.3W[oT.(.1y$C#I,B巚|߹-L.m<{-O\Pu*$"y/Jƺi1W)V@ & KK^m))ͳQ],VǙu]UVT:mN _!Ƹ7^kϯo|Q]Cp8DxpSE5ll+i&eLW:Ja 2D%ľ7é"{ek?!cےJm6fT*z/-k ;"3~QH*8RCxm1* _QK. >܎&JU2P&ɰ?e %5,kޓrO,-N=.72 [P+ S)\*|3$IUSתjsBI[ɤ/SGߦ" MR ½k'*HJyDٲFj 2B#jz5fm2L. Ȯh"ɓUP)V48p<<H iQ˝$&jGv,}̬ݬ͝d D,7;T{Z (1^ws#YCN˞' ]_u(Ƴ-9(f 4^TB qJ [2BBd6]1<"{cy $k6.X<28nd2CrWXg6 d (]zד[0D1f%zVze?iWLF:|[C'tE7j27s'gf-L)Z\hqY/}>/Jټl]<0J(fdmϨ2QmnZ˦}l(@1 xCg=ѿY/*3}_.ື6`mJPE %u&,g֪)\.|.]$K {*$^ߪ {{KN2vI}BFavcq}n7d sG*aۙߋz: teo{0v|ѐ7P ˇy$M]`CPGAXHFBKoKdBoRo+^LH)Ugbpׅ!L҃Iuj*q|Ӱwu'|ކRA*v^e<4xo6dW/?}wF;;p[d;?n2V}@Xq~_ /!#w=Kh)㈔2 E%y:v PR_qR/+(*uv5d3N>aj,?Ib(3m**qOw؀r A9H=Θ$Y$3p4S9IEKލBF)rRdۺ"p5uFQjoA*ęӌ*a k5j+2aW)6ֱ eF*3:n\iْB4(t MVGPhߥ0h@7_)gEzH٦ugYCeWǓa[;L z6G3ݷ% r6@x:!{1 ^YDA}Id(KGoQ-<&8wizd+38NM 4fQ^G]@Y? geeZT#LjS"1=[E#.0bଗg˭Q1\?#H~0>PJ8oF@>6vVv$WKZ$ x׶p&}8b⪥ ljy% i~<,ljZ)[Ur-ḩZSN|SF$N5XXTo-)#F(oG\QZ$ZXg$mfcLzo}iĈf_IdZ#<ߌ㸲DdzgQ6"B㶊_G !B+pjo@vfuC%=hPďx) } r_zR<ahMuhٿ~̈́:狺 7\/ x1`U ؔR8yepɗ9!'_/DdmGФ9}5-ȷ6ָΤn_k s2<.vݫ];kG^.Sg|`cf3<f'o70Fpn\q2^`$Vu`=n _,^+ Lh;Saq9s٭(o-uc ĜZvmuf‚P[SEM맒5Aϵ#ԙ݋LCyxfOƑ~ZzcjBASuh$KflMuhI(ÿ\ݲf&6#>pݳ%x(ͬ61$G7DNtNXUxڨjp3vQoXBс)(!3h}ϋgUq;&3?gAU.E4wWU{Y\(KѧʝakoI؈\YͰcGbbm%S'.Q}SXo?14L~v=C zIZqI5l"Y=lo-en^ÖoƖ_="|-ձeK[cl97 [ZÖ7"\pG`p!~2{ {$eP3t1e H>ufJ"E^6zSQbu=21f*k*h3Vafe2|m g990 Tȡg*Y68ARyqpqE,\P޲h1g|~ ֽfGc:ġ (ӢHz0Ԩb0W;847aKD ܫ%Nt5 u zY$nfh?옾V38狀^"q8MPҮJ}(EqrK),zo]nlnf P먙Oj]Ģq=_uZ.XDw5)~79{'(8%ހXYvro6h֥,T@n\w/HV>49}~ + 0U[ t;JrXP'?INzsfI# y=ﶞ (^^+C ŏT_%şV( }p3{%A(ߺd3Ŝ<ԻGzWty<]jw5O׻]m^TI{hɴ ݽ ٍl'IJ ȊWɿ[J$/+Z ]]0d ORI"Snԥ !$ !]C&]( BqEtMdamo.|.҅χ7-]G7f)^r ٥$_Dxc\"$|H_+W2 |M?ME*VZ4D֣[xz!/d^}r+ctWt'X`3D;Q'RGɟHiO./ב-nޞy;N" %^%)b*l>~ ]<[&ǃʮו2g]t̼WKJq-&YGړQm,\$EGe\M<AKo\:#(7ѷNࣸYXE hED IMqhKL gQCQՈ+ZA?d\㛠 W8.J 3NY"RG)I9eIFi2t'z\FMTqIA&~:X%%\涪echRƯ.ǹ{)!'q^L?[EuԈX#[GT>Ӧwr~WI[c:i)Ngf45%4cQw+cs/޽pr_'P+$)#TvvXolG ۰yC=_pWs^_?y sXW7t8{'coo~?K zd{ rAzCKz2}Hx_WְP01g5CSt ^ZehRQ[assQ;3 E3*|CG#-P2n_5?FP௣?Hq+mc@6*ݔ  Dj2`sFG>fB\\\Гqиo pKT\ }"ߔig5yᄄR9[.VTT) u&8F f&u7(yfݳe0YDۮ8S!:ēN?)*w5<ӤGfleoM݄Mj(θY6 2="@ 7%C xw.a.f kPGibO>x(&+3) i:-+l11RF).8'@'%RO `*JLnM5h VdVE@=%T\)(~>udBC$To+_}n^5h{bLćDhBl9˅ClS@(M1lF Q 1l|aF>#?8͗/-zǐ_fFOmziF!|k5}Z?Gs1TTBCK tT8< ! MT4&\W*6ږŒNFr9^j_>D@B-w 5 r3 [Zd=gs9{7{oi+F6՞/:^ǽًVUF!e( JI-2[ Aʳ[[?9h66_mhn˖7JU0ywa|ɮ"7wMޱ&ۈf_'؈lD ت,4mUn#[}GX%:"CwskЊi4 gy=4{XjJdf0%qC|V6j[2)Nvk"$ռPQDb6!<|LB<Տacŕq/E?Ed)b.1Gx$1BcyL18xk<bNb^1 t1#ydF&2x??@\.s+Kb}@ýJ{i#(g&nPN{z cKLC5GalW_c-B;w3g x+)FwͥtMAQ4ov 篺L抛e3ҿ@8 خgrI"{DMvȚ"=Bĸv ƫE9_GQقe%Fe@KM%EGJm4ϷuDGӖVWqhy(ܚb]$pUDѲwDHNot IZaMԊnKQT$M>|H7o 7K$kxA Č:=JVG?9  s"\$6:𥊍\腗=n:>]`;xЧ% Q7vye]si=ZmPr:\mزbɄ}<7" `ǥW -c|)Yl)j-_J6i$<kyM/ݸQO㋐GsRp@mοDBB bQ Do'`tȇvH?fM#s޿;Ax%a1>z'څLG̃@d)|$.^` Ғ "CFY!$w;@gփxstk.u`N}!NArx W/IG@>VXWRy0.L0èW>G=]qC?(<40~'#/xBa^(0^sy-Y7a8nŰÕ|1y<܋<7<_yKhӺ MVE]_2G~;yɔiHHK2C2eؕYR!7V:S㩓S⩅mzubWBK)Oib:k䩗KUSS ˸gR[y$!OO]:^O?1*ze<81u4OO]JST9x\N9!t(栭{7rwJn0x5 lLh8@( 8@S&<I7q8@geH#\Jo%q$F0#`x|'LrIp8@N, r.38@a@|(N27PJfo>?Q0>`ء=Kʒ*=YAbGżB^`P"AI @8UqI9.z]uSuO'h9NK///aC .TE{ݫIGr=ׅ^;kJX7w0_\@$mMړ#GRJ($'p$ޕ%&6a $L-I<=3 `-I<=' `-I<=7 oNOs$QVM`Ӝ$^Tssxzi9I<]I\(K6'/HȚ%(K'%I%IO#Yi38<\ӫJ\<@&%FpĈ$l8$l}~5 䏳dESTo OpNs:cy*vmYX~B:g?3}w5hIV,)lyuXvφ״bi{uv_;a\Iw'5$eT>PTw|G̓XӞ ;Ʒ=7PX K_!Ek6+Ez#> lFbW96C<|ݺ[C5#ß {ˁN8Ћ(&6SE63 - fi?AZɦfvAcfY2uPO3 8;! +>{OGC7B4'lD^oHrS2wnV6b¬Fnѭ ?Q6r1Qq pg ō%e BG0[HAN;%޴vwk轼1E!H.Z;Vz:Y6W]x!<4+$˱ 6ݻ\UQ?0^Q}MN(>@WDR/o1l>c36bkZj2L8ײwިe=)Ch[?4--)'CcN)yک7ȯ\H띥62qϟo/{i3 'MPgd Z2a!nhW SG 0;fQ}7آ6}ֹx";=]|ga66Be ]t"/pM;JC}.ߠ<[ѯHtr9 Tz-QX:zn(j^FPcUE=ʽ(RisKbMz-J2u6X[/P͠>>R$f7-ר+Q6*ъ%:&&* /%7e:LNt+.5rCaldɃYROxFR2mX"!̑t1G|lx]P|?}ӊd\yaWX:0 &\\SOԟ/_LQS`fZɃ9}]˸B~ʉX2,|,ު:+46B=1e}kV߇j0ξ&3B(|k:{xxESc9!,`/E['Nj\y?+-|\_ d 6ƂM vס rFfwLr Q_򽻾wtNֺ"P;*ג_OE|X^ /bq#U2N՛r%?X~,NQ)+p/$EɃrB@eG`&7fXaVl ZLs29⻵*Ex͢_i ߟ`eqE)llqMX`̈3t$ڤ&䝵L%x? i#1tt i^vMiQ Mi^2p6LJ-vE.WܘFW ֭btfAl=;mټ냢/e< #;l[.B=׹9cz=kwXźn pCKn.*DHV^ճzK0l n+SId^|/{)}j"yãuJjyf^6,\XV!__cPp?(N3{ #o<ތtY_듾r UE=ߛq#aNZǿ̴>sV5ʭriSO ⛹܀?y o%!g9%hbHSJATE"ŴU, J#ҳ]z 7"[L <+fTMC[ScY28#kjLW5瓵8;#ugG D'JȰ"icY2ilZ.\5rycʔI1wu۬DSjzo|kb]2+u$i:QeRPA)eLͱY*\Wr`'ˠR?×|2Rh@WՈ9RXUxw[48FD{qoqIPA} ʻ.LG#Q0=@Y' E6;5o\bI":cY5os^!ʹćc~ϑm+ `Sl}o4d̶ś&v:j?Hs&p<WI BPyX>k{ !z }ovrqzYu ^WH}8ePUrD˻Sm|=gA7i! 6.TԯE &tKd폲rD#eB#G۬Yj3ίr#^@M}?}o*Mkt"O+8yf]"ԗ:eлi.mZ2-{tIIrJS= SJ_/”7qhnSgO S~GQ\㟢Y ,`666/ ] ePc<x&5d,u>Z8K)˜OwU w:"dV*P|sQN?d>nߝpoE/`=#;i$=WA@=#)$ioܓgK{;^_EQ`esu`- =h9V%F?z\..ɵ2W7MaO%o#B]wM‡{:xkL>LSE)i3G(W/8my(Ոx9b ^#8"-yj qe|,6eB[3H2SKSaDFW:V= "BNlvo'wSβ2Dj@KAhh*n;J?R,܄Qf/c"VM.i3DUC*WL}S%Etbe#YHPOUY6W}F8ɓ=m~2~פI&Hx`D8sW\ 4y).!U~' z*|ZyhRkZpv]=l} {}}$1#q+!oEe}35+jʑzc9&q {帮g a9Jzօ +B8v}iE" ̨>[8l|,mkA;IS8UR9tiKta Rճ;?C7] +l  uua(E~Md]f0ВN}aQW&EU=/oXN Hz :cIn! nY~OgO̠ÔiԖᱶDbrHCfٽ)Â&oyL&\sHjZpm_jؗRALs]޺  )iVZ"8 J+IlǼ]{:H.VUxASPh#~Zw1ێU,c# wU90| :)5cQo5s f]^G3+n9j3jݿ,-ì f5K0,L6 fz7|80֏ypJ)ұCN٧ 2zpwsIk &1`M{Hسsbo\t;i砞Ȕ5Q~hyig{`[\V>'PX^< !޼xS{Mv4j=nɕx7xC(Db)2@.cZ>Qb{${#T^{`Ef!,\G&V< 2++QrCW*_?D Wp]P~طpEQJ!AJ@o?!PmQg7oT^rqg"]=$=mJ~=s5__˙ȯ]_YB%;uْD~=s'_̯;^z0~Β 6УEnVYi!] ʬځ9+#6g|DNQ[nU`ۊĞ:4+ʬ"krG @@+YHBt@xԬg+>\xoBD,+I ɵSs 5V*$h]y1#t9X\nz 2U[2mCP1_h^sF0{-6Ԏ3 "C5/+~?vćO*k?k?-)dUTaGB]0IO]Nba`'X3V]?MȆT.V.6[Z_ⵇ8"<5܆6|!X̀j߫2; \';4(Y,8_;Xydboґ}b9^n-u'^9˯<5Kx#*#^[XW07+tq^R= D}<%a Lp?YfLw.M^xPW)sSJ&Z9U(D-+^"ADm94n2F@|Fb-8  O=J9 m!|aYbUV_'B^{[Dپ pd"`|loLwoPסG5qM#W|zb}=BM+RWZ߀^n;%vNwG'JR6hX.ȫA˦FA Uހ͏:y,y/r_)=hVݓJ/36_7ՅAȷI]&dhڿpN]td M78L<`0-_a+4=סy*Ybǀ<[ƇS,UnSYFf U4[EHy#E$wT ok0SZ:O*6Q]k,.Ftq/YDnczz]yf1HgyY'\aN!vS\hWQ{K޾dyoD0=GFiw͟NxPwQ'jVԉ k,ةvpkL @wyKE> r0ntpY6aAR @B!F|9k7Ӊ " }tP|ކ//EZMXS`z3] GEՆ,P}pDvPH+ޤ9D\۶#jGY!;t U w{X!>7{:R5ݛ*je`1/ iś B(.>/tD?QQe*dCW!T=>oC-@a*X h1wA2057z#nH$66Fȗjq08ޒs[l(5g㊦ll'w'9M`((' yJ:JIq_6VW1Bndsl"_1p6O S Ngd.Ǔ?IBMG_ ]nCsvн3PSUM&n֐:Y3C^r>n[נIoϠ!V(Z\ E+vZڔ8jpJ$WEf{o41xO;W*@dOXi]k:GAqeN{;)y*=CMWAZf)[>.wՂ7x@f %رz2[~;/E+D{]Ea{: _wzEKEJr@"Em^~+02].ŗ:ğZYwmhF}Ѕ>$ mN\,h\(ӱZFB3@r ,T;;R 2Ƈ[ ړ: "ecK\'O~bo(?hˁ:3۷]aJ=+P63wCaIyl{!9*?^\ݱ\m{ Uφ]>`ˢxfP< rJ/Iۤ̃OW24,.s&)'H?/  Pյ\/d}t *!FP_ǡEU³r`(Kjӆ]yR f}|o9ן}^=~LkcQЄ)-s jHS X3|P~q{3I7`gVnbO{,d1{'sD{e 28`a@rt8,V_VeI_P9Vny=}FQvef?f>`q 8{3E%PdXd=׼ z u5ZןN$]MRGqER=³!EI I@4ZSȧDo_-AJ% 1z_|^u/`o^*dx^rNn1edw?WNŭ@/ [l]ef {cEZh(U˚\dr38g g4N7FSr١{e@ehˬ'~N3z@[vA=Kìë {Nq72rJE>=ߜ41¸cJY>f߯1eȦЃ%D2u$d}1-ôL§LS{mP"Q{f]Etդ8F4DNܼd{Û啜~7?!LEʯ*P_c}$LTdt#Dc {M(T\|p Z^$cfdžYфB8{zުkF+F}US=?FWRxV0,{C{gO6N&Ruh lyxO3֧\hX7vm/ ں>jlߌh+xqghtz㹝v-ռT#Wq^x zGgHayxgF>~$(%;zوzZ[ B Ias^r)'@3unAǴ(mAl:uzج/Y{1s{L<TL`͇ShwUa:?7ct;,tIb8w8tt?٢6r/I_AV[ m3; <;;wA<Ӆ}ڕxxu4K cV_WŠeu@}BvMY“/TU^=B_u;/n7`:%M2zySldoJ=֨]wūM,UPW\i/iCx. ز~@u/;<-ml WxX:D>#\SDstm#h-!xtnThT'=TOs U7pbM7UCĄ.ˈAY{H&}cbstNz^^{IzA/qc\/!I/qQ\/@C%K'%*I1!ԤBȸ^zm:Pyu2g@N+&1k nB!IJoM?Mld݄Tj.ڍP9.oNTNC 1Pډv֘v&0Y!I=1 1x$+(EqNdV}K ٭1B F>a[Lkq""o=%77=x(cǎ*T6kͺ(7LeOg maQ. RFօ@BєHYM!kf~D/vS RQ=x &GKij%o3c\,N#  X,!532-S_Ad~v -E%ڈ^=7ނL)0>Lf"kd$@/‘"a2|^EN?ezaRDz|.BktdQ8#y%ޚ'3Em! [vŞ4+FA+nFGXzMv((çД gB;qn=U7V-G"ɮOy 4#Mjn-RSi`EQ;|E:$mX/`rS&)&-ҢXH"5@UcAs:qYOJV;)Rw|YA{Evx;7շyU0H=Zc?)uur䋤Y  yK0.=jCE}C.mGk`oz Al?4Vf1n6in.?_Vu5ƬCx24Zޫʰ9}ZWG5ƨxR½>;  [b;'>:uX]ՁE [D@c ;@z/ l;9}톫'09 jd(U i,UA2r؂ 2"ʒ (*t/_P*ar*GLA8Ut\L~Ld{e֨?a?~sh/jzޏOBco>ۛ9 5( c8eHE(iy" dNۅJ1@uR<}Y:)5`BF#:Nt` 2JV;"{:dvZ)t-DbG/wc /V5J^ʬi^lC쯗Q2UMA^bQZQՃ/k580@9M}o')`AA[ d.$07'9 wL D{L:|Nj*N_7@CO_2_t5|;q'0$"ӕ 17ZJ/~ab>G'`:%B5{Nw5Y%ƸdR8"=10I.I+;! DX ĵ~|;XlE`Oya\?vFP?E' oFbӰ(L ̉\ge*ߓHB݄E&BmP)uU*b(;vm*FI<TQDl}yVj-&"t]D׀!,uroЦxHv,Hɾ < p lL-H@ 0a=:(Hիm^$@' fd ݴ#V>+-lq]%I\@xe8=bQ[\'UϵK+s"]J\xtrS_$/;͢?+ ,}P@h[CjaD??E`?fߦ_?Ne7):CcڃV7"G8{vYZx BpNkހ5q[DKTϑeuCVo+ĔMP6d{3ڤF)/s]ڄBՎ%7K݁eN-к il}c7Bt 4u[v1ř:1&kŇȜh: DzyMy'wy%dߌnJv؝a' _c>鮯~11D 0NW 4p:l܏sl4}y3̠Yk[bra@)IρRr#ڜccjڝ _w.l_DAkONY w:U]XfTan3JT ΢;H"aVh[sL$6Id;'I"aDb\Ѭ_ON."3tMUu@S 4ۗ?I`=xs&O o=T='(f( ':MՀ5fmTp^8Ɖ(a&}N?]'5;be2eV %ovZv#T v%|:W0ѱ9`HA}<DS͂:R䕼R֚O0м[E猪1$THjTqBÚ3sS_whr %!/b0b]M~0)AZbaw|:n@c7OzQǽ , !nD+ -&bK+ ɺW,9 ]PJE_!\4pG`Po| A4[y:0Lq#Gj I I'&ZHC|K6}yԋraSc[tBB#{P}8q?F= Lfҵ €E8D‹ؼE|iP8 {^@ ?ovO 'ͦعؔj/@lgYp1ۗau?4>Bk ֽo6S)<4" ԆA(>TrgagR”ӑ]MbL$C3!9FL x'"&[aaRVNzֹY׬ܱ녪D*J. {F3V1 %98r2ii7` hI'6D*m&LeF*NeճHοi爍 t*dONSR+h35Z.zp\9s9 AjKb2r -tė$Ek Z{,0CƢ {3}V *ʛH~cKh<9鞲SˉMĉ(q}NÑqKI9]eyu ;$O|MDd AS .(RʂxTԒR|*yiz.mv-pٚ Ҏ\@m{ Xl^'{NrۊnG.p"7^rUA ɬnF©(EYj!Kw(će`Ne;;͎H A.DJWЦ=ѷ^ʮ_YӀO9DZmvl?* U_rX<{}! %%zJ'8nf9o hp[C;0wj5kQQDBtGCHB\9A> ӈŔ!lǠ0 ȧ4G@N{hgnWN0PyZ“CqQL6<-zLJ=aRC¿aϹxZ VioA .}t`My>V@f%ݏ#] ma ;[U/Hit NU*Ǡ/cAzdHX zc`d4J|БrH`Ur%CD9|c,TC9|nr)SL@+g)q|cUJqJE5NVZɠ?hb6]tr_Q3ypHonJcCks$J).CcEjsY1$OR)&A1_~ F@šf ilfY~ul:!C-1|(C TKٻib!^r]~=v g1qRI.ﵭQV7d[ܣ/Ÿh@} aG}ܿz>؛; @Pvz>zzW݋ʇSl=?in! z cL#VHs0~hW B!2p|D8 8N ~cb{]OSxEzdW&^KSi4(,l})<2jutJCEC5vVcp@=^[88ω _Ɉ 83$' 3}ȫ߇I y1Po0!}p]"]Z,:3p7CJp3=% wpOQ8Wa\ƕ`l ME0@~2)UQrw }+Y =uŭ'6H ^6jM2)n KMԦh k+۲C@fΉѤ{/5Iz =9A] sspp} 9F- l0b<E~_rJ)%$t4ӥ;!%L8YStU/)N*]-jg#>"wps,ߣٙ=BM . ar-.)e/OÔ ~X7A HPwlnYl *n0Ypp5X (W6Q(uW:;E'[gPP33\C-wz~'โϥ337Dq_Nz‡ >Ћiǯ %a8^OSMQ g[iN(Q PuZ@&rw(nzr܀S "b唆pcBŝ`[}3;3^T޳qz;< 2 ti0J?J]Ki{=]^F(`L bzAg}  *k ];V:9 'RRꥑGQu i).l]544sӠoFX, 瞞 u b/VK8x[1ø~ ˊZ#\"= D- BbՄx@ hSĉ?]͈z:W3##,)]5KH*c狘vY*#Q0|:I&@bT#ܞ[EͨA< 2'k)!׶ qZƩ[k85' MP,m3H@JygFFDd [ 08KsҜ(w0"8"5XEwh!H1!9A \c]ʻSmC^?1Tr !ATƄS-@  ":TFW6.kmnd 3{D1}}x ɰ5F~'(|پR ޜL轂HJLHV‡5 ׈.C]te}Ay v\~T1T1&u olW`fN([aq_yA fmK+l>\į Y`chKv۸#ԅS_׆R9(ϖP7WQ4Vkz-_kTn#O.6!KkBku+C# o&l^=c=Ĵi#*$̤ "ۄr 4DDf%yPYeЙ^l{*z*7,Q{tY &V4I|ޥ+& ##&rP3k ;sӞx>dw_'/aek7=vAx{>3%kM=ӆ5 f$RHʛ_`3M yW9m2ZWpZ|c,,nn#tqM #vmNbНɍ'gfKw o>.`ܷXv&[wK,`hX?AqP|GːA*j'ddjwes{(ZJE[|C+bھԳje0YѦUyțASqi漅ӨWi\ ]y.pH(` :n`sj7LDS$ ӽcb܁y G_~v]vR):Q&| WWXƬݨӧ6ٹvnoc%a۾AwcCg䀁6sEz1VbrށF0|9%Q);5MOFA8̎фoK /tm9ak.V!s #-xȭ>c1 X}(ޣxp!,%/ IFznYG揭ǞC1X#Sq3@±l@o /ONܹMU=:`irݢ?[޹F` l[Š9@='p3B-޸cZ`aO>:Q/_W%R>(cP)"=ʉ;iќboHNS_~ǃ]|FE7!F΄nyFDu8qOb9-J)uC$>Hs!Kr אrn%qCa1ɷc4:`E E )`%f+nFlc #E/'v**;³ fUxWxE|6i?_ ~D TV򋪕<W]Xw;>bz iܱE_뷊%2M,Wjkq㸇NHZONzZUs*9=!{ί( ןpQJQ8fF>'\j\ռGy0:@ckc$ `,T¢h  ,,r碙 (pzIx -"TD<|^,l5Qݟڇ!| )Do ceIv|4 eS 潁7+,Z PP(mc4\ޭ@b:x;LɈVc첟ū(BkDvnC¯:Tx}b?ʶ#軞*C >MR3(/w&}II1GG(U иrU7~eĜP|oPǍKPjtMJEJDmE=(?܎6K,TRP;q}@P߫X]o(YkGjwNKRTT} w SU,QYZ+Z[_iQدZ~k&{>_:ܰͭs7:}wͬ{B$4OaW3Z9'tQbfj^YݺB">8+ Lj?4D/|o$2T@јa'fu:S*Y/ݺ7DY7 l!~dnf1oZ[Q@pI0m(n ~sŊWK˫pO>ը!/Tfk$f9KGC%9}q8M5l<`6K853,/nï1tb릑*?l$􅝁M3 GS6wmyt-`6s .ۍtrk^4!ۙH;K)9؆yxG)]!U 70Ff= (r8 < 3p;Yv- 72Ebۦl|9"%Ƌ.ߎa(GgGa,PP#K]QʒO86^킝ղk'kN?β0[u13=7%9BmHmn:h$1O=V1MC'ЫLp//r'F|)=u6oK!R(XFLq$֒KDbyyЏE61#e UHr_yv|35I@7(}**=B{V</Ć.SJmep er>z£f=[)Iqs4Fn^h m]96 ,\7-֓|OBScR1D_yzI6NMD~S=Ȏl$uŠ}g:U7cc4AT-}jĈn_s&؊Tt HXm\96耀M;jP8R% *J"l%BXtl)rq|& xtPO-  AWW亁|Aؤ4Znn$a=tY,#xx!]*ԩFuVJ` =K#'-1!~vD!)WPb)FRK~A72bc" )# 6~^ .K2nqU5)$"dzF'pp%z81((РʹOU@[PBLӺ?4KP)OGŧRT|*~fYLƾ*IJ 5FQմ'1R'Ynw;ّH:Y\)}/Ji07[&yxeȽK&=k2dÛ-P&4WX@ީ]a\CSs3ҷT}]) TV[ Zĉ-pڜG[RQ .Wj$ s8s̆+N|W\E$g_]X؂6s`}?_o%y{KnTӴΏo jgփ1l'pa_1XN6{!LRmr&|sǀ}U4|Eթ"[َ}w'Z:]193L^R Avut@nӠwnQvq?2˝@8u6RAMλz 'efP /e-^b!דkl ~ϾHo[3&=oW%-Q$W wj=:x3_~sxG_[ ,ֽ6spLfȐvKx~X%7g7gsʩP'L$$/feԿτ9ذ5qk"m&\xg|}LLuXX# [0mysyU4ЪRi- իyQHCKq/(XKVlr= {^%:'B5QꓖX/.X V**z*b`\w浰s5oCkh-uU4Jȃ\hϒY6;wC'\u0>)`gw4կt >욇B2辌hxahD] cTBV >O bx 6GM}Dy41N4m|&2>fq$}@"#DN9 ! e #J\"P~zy1v"b͊G aS̺|V&<aqX9*V?3𘷾9<1SZ!I)ãc=K@R:wMszgl-% w ׇx= ضABLr?E\c1|օaLMR86.8`mľX ƭc{A,YKʙƱ1 ONaVU㩙}"K~[qW Sݐ8Y[y(.m)ZPOU)=ѣV@ccBX=%˟rKͱo^j,ېg&YS˩6˟YlI3r(rG8 >lY<3-[HY ^v 3{' p9_g%VI݄u}6n H>U8 x $r .qZ ?݆>0Tpo[\dM%lܶ*to`*?9-2ġ]7ã{+#6,ߑ?֏vn$20+֋"e4>M,ѲF*pK98JPO8Qѧq ' J0XUVVhê6,ȴiCQЇЇw-L@m{ "yH⣒5 (A~ylqimgqQ=)Q*2\$\$x"Uk$`TD6 rJ,{2elޔOyXvC8OHN~k|-`m ZO?C!3p??ONC;߳C|$q`姕0/\HR"{xaL4&bHOqki'XFh}Bo_cՙ(8(-~Ҧ>Ý.}Qž񏷌ǥ-Al\w-KNp 7L|2ڏD nu6|k:Rf_ύ+@!'Vfc&tW 22+B+OPr:@V c|1w?O;Wx1 ~ VH`1:T^ 3tp"b8+uQ4lG j_&:ۻ.B,/Ϩ̀qÁ>d u˽,wT aȬ.+wjEe ȧ.WDծS%(ߘa[|j:LWY!\}*yQN { K:DBFԹINdk歒!n*_[=_RYURa;gRҒGлRYM~T0C#qN';؛ m(JЋQn䘠Tvo  _IjY1p2 g5bWK#g毤>ۤLbxͽ hN^ȶc XOA`VG5)gm&`zq,J? ? Սy)V*싃d y>_W ,)T8K/eQ?֦b>=d&ތz4nhxU×t=m|L'סֻ&tYA~rm,@jRSc.GŸrܘ˕P=UC# 2 +ťfE8Li46q0 c~z$^'2]H4^y2#ѪnT֋QCBLF6=Vw: elÐ|GJ3vHD .=]Mՙ]WXc}x/A] _*Rpmʬfc1R)/a=:bg$ C7dJ_Icx_9Ѯ&MuF?f"&?bIt"/0<$7nͫ?mJ{|r;) lbWЯ}tI~wQ־ ڝkZ:" ;wrTZ%$ob3bZnIôހNnXaz,+ǣqpέTxLVuP--`*&$lߧw*7R0/WXZAz3lJ C`-;Px0݃YLx?QnX; p|>XPDfroԐ>kh:IRbAX 518)! u]76DbPB6nTf*fitOz`^x=F\zMoPmҔ78g)blhl~Ʀ`l!R^2=?[p*%1L!$GF9B3n}[r{h\^ۙ܉}zՍ4U25"=Y7[b >~—xVoWYX"G.k2eΕeN?k=_-%$믴Ϲ=D@D#?Di︒zDnUiCFV7r:F>OnT 0=RQ9 GеFnoWIZm~Ҙ1O(ڐe}#h0TLp#vZ-w ueBrl3{|oѽCtW%ӴodۦU[&lw\>sLqL6:vӻlOB9Flʶ2{U.],KX4l][zc]* XnavB.Zn%>jb6BReEP Wx㣖wMY ٺt? B"¿B_!hhio_aW]KSEn\uĿx.G=uh[0xkؿGwv>?M[WeTH?6Ї?_:[.V[.X+'<[p[@o-}.d61;[hPBIJ6&~펉2m 8 Gh#4MFտ[H n%(taOCD$UÈ~KTDaH\٢B$׷!U!t:oi@~gkF?:57 ҫh $ 2D-"[Lkzvk ~zKx9qތQYݺ${7D,۬ԝrz?a1 r&m[puowP+wr0{{%)ONښXsvQs֢!ΟBL?M)',қ,?級)#Ubn^lɱB=VEdύfsN~Lw:7"f5"=H+;+*|R{qCa=[HcF϶NÖ.j)Ћa$VSC2Ui2"\zxw {-7'/iߺ=1w=`$ACK}{|Tյ< d` `@8 VEL@+B83ZR 5@Hx&$ !ZdCw~9~^k}Z'_;.듯-_' 'xIy{J% K)'hKڱ#PYd?/A)!UyU 2s@.4I4@С &!7dp3H.B4bjk#Mg܊b%!4|\;sa= nLk{ 8.v ,7F,5шUtdp/:8yC`:bݽ#k BL {S¾”w1~W鈓h?D,%EJpݽn7|m:YK 4DSM)ϝT):_wXi߰7\vUw]h?]j˩>-^ӟ)cJkW7ACs*P@*W_ PK ؑzqj,Ɠ@;@HQ6 PIPxg;IY* Eݵ80Dp?qѶfѤ"mR 0!TKUv0~vpV)T) I i\fԻSvKVѻ{5-q•{F ]ᛇz= 5oiJ-ܰ2.zL_i` /{Y_/.4&edx uizEt\]5mL7l,od<5V UĈ1Ey˛3F`a7coMS#V==O+M5Py>5kƞǷPݴ]B1?9ajƐV&Y=#TU{6Z޲o/dE{ %f^T5Onj]$;ZT[ %uXӢS>° 0L^굇g Kh"|&@<k?1?lb;.`r~-~ ~7@(< &]rg}_⊓'>膺S ڀ.6:[>#u=wWMCZT`221_tw僯'Ю|Iy.='nUD;(7hR Ұ^tdw}<'4SsJ U@(߁Q}?cYOGׇ.Qmđ=E8]@ty`Z='n7dZ=GD&KiF/b5$!Uʰϔe'klG_Dw8@{GMbrӖO-߻ {oӺv:$FD/Yn iBewEfYlA}O~߉/+ͳXYID94J=^@9`o/3!xQc{dS׬6|vhRtv3MvkhPxva|0P+mZ1 s79$@>sEٖ =)cҶ<{τY@duؚ\rbe_$*CTj4ȝ&C=M'[J-,N80޴ ;zcN8D7N_}}Y( HzytP*ڞ{h8sd|^ht>;0u>K6+A/~hG%wDwD',7cbo>D][+aȎa;x`D~7%<ذD.Vis<w ^K<X~OۤIݶ(hy,ؠ}i@Z%_QTMk#\'f!jkԾvfJ᳐IC Ĺ쯯%M@=ہzKzUaF_mI%xlلO"l4{0&d'}="%z=:32sy>@ Wo]~o{х߁_¼5+qb~t+tfk>855nu}הI߾*6_rucw4wTc!w-Yػ׺/%Y!~8~!q.mB_p4F~kW%IzsDne76rOI ^`CfHTغ h4X=fÐz䶝6s#/㐩iKxߤKXnH)-^!LpU7N{>5WJ/3&eR|IJZ ?7詗󸩯ڷ#F^%i[d&aMܩ Eh>?ڜz2x,ZIRN:w8~dY48Ng' L<4ˡ Nejf F[/M }Ů-h vU@pŸ-nl*&!2AoMbtUA,)3CDc+L aaD;fDF7 Nfݏy[0}x/A=:ȵD;pgLrNq1W ;ag؁tc0RuUp6Fkڍ*_qoEOWsHcJ7Ӻ: ; 厀uxa?<)5ѯS:f _TKn#R(0\)n]ntBT<}i.ZۀJ,H)~,ia{fSX^;5:tumm"Я0J8,)Hg"jba{ZGS+ރ>qz´囬0|h|W?wQlq9@m9FJơa0-2O•d*J">%ShcCrlLġ%V4i[ƣ|wR:ۥeMJ\c!'n\Nnh~gԡ T Vԣ[VBM{ƊLS<;`\!Q֣ ͢ ôũdnu= qr rRNH4R$<Ow0Z8rxi#Pp{7TׄȺaC0 9N$A9k65ͿQW0ﻐzTmJ{'d<`0BRb{iM2yPi`\)BC lX09 h˥}}.G}Z5( h e6x>ąBAq6nyn=7[ബ0 'SGL2y՜k灩Mm0Ƀ`/&q"j`aV 0y^RȾ8gEf#&rfwlaffW!sqM0Vz%=%ldxxL"2(>mHx~g.R =ӷ\r*|1Bp ^Ù'AK @GC-!C!t'ИQMXG%kf'ա,bhIr5ū ٱ2/~(w) 1%_ӯ923GJ H86[Sg(aeE|ɪۤbzW6le\G6m"',:,~!1?WO|GF BMY O# %O(~{q+>d|\ !Hf pmag \/0Y&p\kHYH/K`8FNJ`FN`F:.s2 "sy8Œ3O9@M͘i'emP/]_:_n|a6_{r)WfD&Vn6 ̸FN/7a{M iDv)U?z}a.`roT ?'(+mG<|:WgAx1<{:_eD?M|[^UX^ZUWzCb>MGbi]`˪`+UڕVXZ뷋<.à%ދ_hrRYITA3uaz #VEoj@ ])ZshYX. J+!/j/Yꯌ-b9/ x⡪#F;9EekGҾz +Gq/csXl~1RF= 綉mŝ e%-gWwѳSޮJqu.acg!#m (m0{% v*:SBS2F#4\ͮC ?ʼn"QSTo`rWSP6LBa)a n%骶f/ͯB^/Մn\$n,׋L;+^W{Ng66$H9J,6lD.䊕xDK|~}hu"mHȜPz6ߟ)?p:,qr 5J?3gr|T qK'D)|:J(;3Rzf eAgCG=O0'>\fEd\t ~wAx&)*Dj{[U3!/5'|Ns79DL"3So0~_-3~ڼ >|fAvր t݄p# &v; 06%94өl8Vzz20cH,9t*ҫ [cdX:"#lfNQbCOcUk㊁ڵa2,1f mas)6u!'rP!lP!32_PijW_s+6D w|?"4HOfBz&!9SmR)b @V\fpKוv0!3Zp؍:UWxHv?oU:Cp~, ?}WY+דD~|%+ѯ@dxFU ÿ^'&VMl0гt$el >1EܴscYAwqiもy&F`wS;FɴQ>*Ap.n: }lka}iQMMeb`3}#_O]ݰQ\"<]M;%ao>ITP O-B.=~aHfA !Y#x_qDk=&m@*,X'i ,m&ƦJc7Ir eP~W[,b|1CMmk w.EF#0ܢXmoH0!%_*uS_IH S*^ WI >2k(H0QSc6ŶŰB[ %0_BuSe2I٤ "4QcϦz1s 'I# tn$L%I= VH>hr@ kOLab -n?w@-j"jjlb!Hss@}Sb{Q-F+V$C8" a9R5$,oVf7NA R+Gʤ5@9¯jWGDL,vDjLetTIEVzHvMHHe+1DQuTS_%_ Pt5 ?嚒 Ӝ]Mf!2OF̛j,YԢ#5tDÜ)!f/F;֯B )2 UE cQP z Ъ@1ĊR:&shO=  }55|KV\}r B_@3a.BR&̽dL!v $Ase t|u}=(r ]Hˡ \5gG#~n/Cd #i6Kv2;13Ej{>tCv*騠5<Sk"W_.@!GmDEJ@*+UPub9Ph!TMG3fNjZ 2JTViԟr2*=)h(~jG;}#+}N5^>P2(p5mBxDw#n1^+ vcIB.Ñ: !N T 91Qb%Wa?'b<;v;gv~mQ#6o"<uhJj0.ѩVשڍbMǣ"Us+nu$وVCPulv~JfjdX@DZꢭ8 lZ-]D=ݕ3dY7)p SXwpjzUճTegʋ5R} "@w570DK)ϋ@7N[_Zjk^ѷoAᕳQ)PÒ̤mԨ^{KSͭ O&Fgj Um < h=ɡUF€x$;^8`T#/DdLO7cB0h\o1fԧ%K*FPPt zs1@ >4` %pH(%PPLP{A^!%\dkoD#01Rq&F4Dv-fpi *][cźȧ>*< W:IJFgԥd {L1k{(TGՆ_-ɲX6jbg1\x:]ZƱxwer$H@GtGaxI3HD /c_ʍ)3 ''93E iS߈ 2⵶RDl(r$7ZZKgxC(}a݉C$2Nj#ƥLMH  )a,&IJla6Jw>?Sj2' CTOR$~7F4mjKt݆oу̯6ҡsYu bb Z 5ZAt!Eqoݙ~f nA;IJq7XYhȅ7"F-3%MaO _ O: ( {ω9}1qPfG _Fw 5J++`DuJpz_$ŸC A[:^c` ڛIߘ,4#&9&n/;'ѫ뽗R/89Ęӓc^c vgki{+ ( y`񆼰2+`;-}ƿR(X(0tH>;{9~*wä0X7`>:@ ߬?y:Wt-ڔPӚv- $>'5#SP_`xn }lVS%:M*&`DTe2 + uVzVަ' ~e$W_QG7!ewb 먍iўim62mEC7pKȾ'W?Og'b4WeQ^zPݽl<: u!?KѠzTϗZUXt $8a ͌uO`b~!H'5/x,F7ޛcCC]#{7r==gq@if?K^NNJ^ 4(IkLjyԩX -BW|LU0P6õ[ aE*?*Wo7iSB); @3絁_RK.l#}ABB5!e|q_9IS2\rHv,y}g*wl3&SDmfV{ ޢx DQ6QO(D9gx[ңMŢCmuN V蓐m > Yֈox”mD!RۍMfBU_XR"NE`Pl[g3bu%_̚$7r8GPDV},\=ݢS<vPO~jϠd/QeY]1)Sӆ30"ƧMvUwTy%!\G}(^~];He^ZS|M4M=,˵Q4_l_<Èsée8̀3!h,y0a3\ e߅ ,cB}c:B#4X.p՗Aė|2!іtr94/en{.R0*XoߠOōD[5"}@5Vtch:`xcTߩ AeAD. F_ :$p{5'5ԱNbXښig%J8:I9"SWD5w.qGwchQ e6*%"˃[1khͨo$UZ1Wu7$3aR1t[ҵgI/Z"Mh@ctؔoGrDOD- zj?!_돳J|Q$M$m2*޳4)s7%@8MeYMhd˽K,I'aݰ^->Np\DK&2^5F|F>}@D0CDvP>pPvG0aZwF[3$̞I}L6 WQKk"/{|j$}(z,e;h4Y+cѲ|+lݵ˗4s7ꤡìZRk͆l;[EU!K0e$Ud'&݁_bWT,_،ʌ~OvY%VSȝ](DFn6FmVs;5]87~Zq8E'v5Y nsƦQMwӈM')-s$@9nyzɢㅵ= c;u$[wdWseMdEoZ0~=n?Wd߇UBMl0԰Jo^!Wl uf[8spS]fiR_}n:U%_~ s6^|߃tmzaaيQް!-pܚb:J#R]ך.!}|dOlZ`+qJ&`iY@Ҿ뷌wƓ$ mASRi#o{PiUwQU !(yKvAa7h]T.Ȓ j2%|&d!1S8_hXtսyxe`f!&p z?gR!J:. X2{."K6 u~&@B}dxDr7WJv7옄 <ִb%w7Ya* +~ wB+ٴ˓h u{CG4A+1l/V|/c3]o)2z'HmDyj눉fb(sծ lR0UPeaD`jq``N \#/j$a/x!l6'x2{xd/6xc{+@,ls̻x?$!_WiBwp :$w \'^ uoӧ5amۛX?R[2RBGKu$(YFI, ]#)E?uED몪Qhr@rm/aWXTIAQ6 b־P&@ڱe@'U'gO@mvȋW(-a42$B} Jè<[T8Uxc`D4$ؒ>o?"Z+m AҴ\JO#>Iwwb62߹6ڡJdlPs*?{ʩ>o+ݫ8ҽ~m:ӝBpf 9xd8tM xRP[#A1.mP _oJ[*χaki+ [4բjQ"ZWm~tאZ B}ɪ*yUR+˽\hг!DjȪ]ZxN W xb4GBo=Gގa_V~2DEVE7"0Qop"EX (UϚDG{RI#ᒝP5=vBN;3*F: P Im&ᒟxHm`3cxEX޹x3!5-!>{rU(Vc*'/@l`lr2>Śy?[^pQ26NdŬ=Rϛ{k,X;v +Y]NȘ.?j!ՏÌIٖYs9aP xY `%k[ڗ9x'$ rKb˶O1&y,o3ŋlH2 ^ 6^f#2!r(Qa}@c/C}]GY q DҊD:2.͊; ق. .Hp n*XkV deޘ|;wǘivّ`&$ɽ]TBe(l@BcE֨1t%6tpVrxBAsoZV7Z& j1p|6s'"u'VĖ9YEGM msRk9x2%%M"LPKc`5(ѣ.OqIKqruC_\0j O;(P/rD> ^2VGxFZ;k0B8x{$~~-͡)yLvjTk;Fc'ѣ/),>zrQpާ FUHKAoGU":9]\͚*]vhv!(U@Ǡ2Lw֮SkԮ4 ҡ~蝵wwNC9^o@j372 Mɩg^s{urm(=\-܃&Att:1W(.=lA lFa8vW'͗6XG4q5M\g%" 13]<1^pT-m&H>yWЈlRq;},ǵ)Ud4x5 e6ȶݽrYSq9kkľ~J5?ԧu6~A ~ϜxA㔝ssh-H=b7;݄uH\Q)Q g967RE]eYMlGYց9cbؗ;;p|k1w%)<CW*mTҠ.@+w0\߯i ~Ygևjٟ.O*,x@B$*s'͘d %ƣh,/Vt4h^݆_ ew\d|]iabp? adp2jZKx{??MF[~ *von9ݒK呇7 kdo9t;l\y^CS t)vg&=+o*Mh tW'{z[ T۬3}.g|bfStP F3;%(T6fbA=K>aO(\XIMtwa%8N~"~I}eZV)h!]󗏁炪yЋQA(S; (=cT!Xlqi}Zn7vo{^.bxK4:34A\˷ma gLԂ-=jY [lq@\|H-nC[/jAۑë:Og|^(=(,'+{j9z?lr-|,ڝoh6O@pImj ->Dy?䕸Tj6W,t̚G rDem;ޗT+}oa?FWJJ~4;ob˸\98HD~HG _~rQi91f<imDw=B`.m@9sEuA刭8$b` =5060h@5i@0$e&ŔH޳{ a >4fe<D8 8ׂ\cr|~'9'zOɘ'0qq~KyoȽ(:ŏ{ZL}3ע弽f_6?n7[:[W Md}.v\y^.e6ִ%1dq&k%%9)yMS bIr+˓/Uh/CK] tTE~?` ȟKH!N1&LxÎ #: ` #:o؄stzun@?%?uU{`Cʑvk,1mAGt~IZ7[Q]v$.a>C J&UUsm'aWX|.BQ"eNm[߶Ηeθޭ[4 a8yV-nenl0¸lSnc%fy'|!?q':^3]!pT3I &)}8c%em(1'CܬTSY@D; #=?Zãˍn%pg.o2F;>l|6]pF}e 5k*$}ܙ> RҞ73xTVXiknK'C9,mDx)ZU*Μb8tVH&:%WğFQ\R"sf/<8 ,dȗ~:ź89tkF YŖ)[9oV}7+uRt|)K0㐩wFXSJcuظc8Q_kk30 &׵6%IКyk?25f ΋Rbƶ+ӆHl'``)еp+$x b>?衁baqv 2&4z5bq= X{*s;gFv+e-2vҫM!y.]rE:2ֿz\Bd̓Vy@|Wb*?y9u]3PY3`ylаdVjx֘C[z/Df C"vK_aBgWᕧuc't6 :<ɫ,fqkֳҸƍc ʹj1>[vh5o K]3BܻSc~jS@?j1~1m,ůu$Ӱ Vؤ*Ⱥ-x;r]ߢS‘3s9i8yNߑn T_#OcnH".gPKѹ3%K$~rxVk^]~RM+qg.fSIpі+26uʉ7`^M:%=nKu gN V  G0}xy9cMDj$"Gi^NЋO5υ-gmmg%0ӈ/ێ'Vyb~~Xap@Gv@/h^VJpmi1$,q>;ɦ#YKg^ǃx!d&ΜYN[RW}jt7yYC+1Oߠ$5& 4\4?񓱔z.bi`yOI}!q D5dP24Nv` Nc[ ֠pmЬno5c&W WCj(R Eh5W%4U/Wt .~'6GI@}Q -`oaO֟_~9~~5>53*&O |imX1t4琙u\Wp#1! o>8_귤Ehw,Dpi `3K N3:oM3L&w:@?[Yjȑl't@ꖓ?e%yRIdt$  ֮#yƼoXtG}.J!џI#9KWԤߔ3tS8%~R7A%ެOZg{~von_iceG ʱ ~d!Mxn լj=aK./?4GM3gX'Wf~5vSx!PrԦiE~< ?$BJcՠe։b$W‘J y& ,yN\7Yqr(f37PuM13!y=$;6CAZc?o4(N.snhyPĥ84EL'>1MA] 㔯gb/0>ǿ_n1/! t%t;!"D g/BR,dB2%6PH~Γrs}dP664C  T25D<;YmT~+~}J`y|*,T^)XpNٯ|p 睩oL =w)-/V+xUVpZbD ?-Ul NkUbʓ^]6 Uɑ\2^:@$xZ g}Ż m1q?%*Ec< ^)nGNԔE±@[3Y, L9x&6SvP?2yҤ\y6O&҂t9qf# J`t-w&;a pt\Ql66x0eKu3SpJ,gv~q3Hg~" ĺm¨hj!:QcXl֎XoP 5q~ {5jD_yR~˷ |\јe&agRayӭ `lθ-8ZX+%h}, G uԥLҏ\LM 5ᇉgjfYqKr>"_(Uxԍ& Gw7[!Ofk 3f\$zD%ܭca"jV }`fcst;~f^nИ`F4ַ7XY,Kj/9i#z8JA@~'0 'NZ  ydgPwD/^{L7&8n`%7zb^pXT n^/Eˠ8{@Ӽ&fiJd`g].7kOGJmk6/s}bT_={ 3UgEzV j)jlR߆./l_JEc,%lByZq1R{l}9 ]!gW׌VD{:Hإ*B ͘pORW: +]h~zـ?z Zu8TR~mءST/On5.Zm\W3Y[}yq|Qlú㕿`}bG{*6Y?gֆ $e`|ҧT.T׀cKpz0 >wtHSӘ\Ly3U8]59uڣ 7c6 cPr.>isԗ+)_^OOJt.S~:օv7sU1g1(GizK ܜ!ʐv"ο_iQtGW):EP1(>y:RQ(}aG-8\G?C&)OGUsADhݴأ٣ɰF^(Mg1wz3e7`3;|m~,T-0+i&Ү.~K3şҴn&/σoW_]ɿDr 2C|2dVnUjNMӬ6N /l@Iz+ڻ+iy Yzk6!Fyͩ5[𙇒J|^zr6"D{kBINkh?c=To~W= cWF$7iwqh:_dk6n<^(N·}owN bHPQj,0'6UP?wJ_j`^2gssCw) IQ!Cgxfy#G5A]/i W0օ=s#5/cd6nۡ$!PyE,TG2{6J/gԜ%_NJ`9/?F_`$ ޅ+3R.>q;5V2\*Jo3/fG[gK-QFXGXxfyӆ [*u |p/ҙa\&6F=Ǚygj WA&Ft߲Zhtw6vIy`% 3Ax_9&f#\L3n'|0ᧄ8pa1aZ w't^ fr0^>Mp^ÄW#gQ%p#˄^"1p:a} _&|a;}pJ8p1 J  h" ,$|p WʄwSf$,$\NE7 O'B(< y + B$a5B!ca2$l<¥k&H" /^' GAJxHp-3E$l'H a\.QلEeV̈́?'А1p6B2J ["l# K . aaD.%4 +=VE ^xn<}/7 t0\8 p/逿Iˇs8DtW%,RТ[]aGy"pf|Ã[z,g1] GDZ`2y{5+%('OE!Vo ~?T:.@[Xz(@P oUr~ )-WV~b-񫺕??0_ 1߫'-,:}KIn  5XzsO5g⮖ow߄iF؄xKB.~b Ey-<}#8";&k{#_ *uq+ sO V?W_g|Z]G6v4kےBTt8!Yjm;`s$ˢ`+-Wg|0_k$Ze/xI9&KXƼ 6K" 6 S]M+<(o)vfk7U2XW:NuNK~o4ES*!w>E1:ul DZ3 esm) ;5L~" /v~1J$%( edD>勆X[ܢOHQ4R^ 썊PƬjI,IebLHz&SFc}h:mӪY%\1vUN=S ڹ8KW+6sdͦ~9˵ \d&?(JDzO)3Mm7ʫ zd'kH^M<Okt>Xx9 yڇ gU 8(^Ȓ]hW lմߦYz elŏͰ_HcV"Zx)b6gʷfYqϋ/jm6Vkmzd+6 FKnVU|97)cB3㨁': n)^ qU^ͭsܼ'(7XQ)o¿*0y}I8Wj_g;>1o{If5 ʠQ3#]/GV0efŢ{Ye֌)]ի5]aW'i+q'>#kVR" xӱqO<) i7%3=NpG/0(K)n |HG~\c?)D?O'>%i_\U_uM @Qm/Q`7 <,.pIIO\wg>+mL^,p>$qHN \[x>N''Ъ%[WkVAat0!hz[y-\ < ^엿ip9LZ[?XDϏhQlt ~ٌ+]6|_N>d~ oLdN;ֆd?t~'l)JzLR S#0kV jL"siyZ*vxCRn̄ ZkLլ3v" :^'lSiH[7VpQiqEY;Xv|5?dn9xKIUqi4ƴ4NUI-H`yah܋MVMJxڱ GzБ"Z5.ԀMXZda "knxn7eC|0y7"pvAKOF,YcuKRHm>YPc0>l X7֋A9kvda=u!j9s";Pq|5pO7Nl:lgկE8L U![ Eg]lo@ 5[x;]~f;N_\u5F#ASp Ma~#6;QQC5<7,ܴbJL&`TCUUwDчwoD&*"B1FivbRu\;eL|[߶廖O,}9{Q>'tG/,Vttb+)/gA= Cx;׫NF\pY]PI';ȬACF,8jN-7QlW X ˅4)HȊ,U] SmV}iE۝HۣVz=c<-W/g?M+L?3ʼ2C %*\5 -N6V U%rCP. gԃj_!X[/BQǽS_rܣ˘9W)I{'r;5a5okR6BTG&R%Qʑ]}+2ة;V5n\ʶ=suWjPuu\KJ#{t]Wθ<~MZ.jrǝww{=|C#xc?C>c?OO>? __yWןo|o}K;+G'_?_o~_߾9m{^p^^_WկyK.aMRغ}vrUWo45kfnsQ<ؼ7896-oή޾bidtxr#)M?arB OOX5c3@V3@t|N BBIy=kLi(t& ؁x>V#A%P7]_hD;46]OӑWG"0-&y,Ყ$ˢҶZm[3&(ˠ/ͦ:zOaqRrh4UoԌjGgyrOK?7WRK˔\7̨P^}%=$Dqs| pO'c}H 2%&«PO׳|:o ɴW|^}Tκ%eJZN(YRFlCѧ&>ç.C4x«ЙDX|>VE(#K@d[w!ޖ݂YyS-81'79[ ?Ss?%7uM'[_T号ֿU?Rt*/B7LǓi7J,YoG,YR%Ej' l׉|,) ^b.i p \-WNjv CmDAKbѱ7@5R_eFS {L3u~ 𫋜9(xyA2ԋr1vӢg9|F~%Kj_[ޓv >')z,~7A9?'hhN`q&׮EYY3].@'`[+tn:yA_+)]cP  TsAm?#Ƒ.;c#; 9q]?`Z~)&~ N͟b{HcO%<3>Q Sz4}#,簼AmwX"xxEdy>C(s1QMnBsWl4XWt?.)~3OqcY|aiYAwY ni\48Jڎsﰎ94v ~j3N >NH-tZ -ܾ*# t.Q哔+qGda%2]bi~v6E|ҭNjGYù|ҥC^凔2l~xqz7W5<l'gWq֥흍ln2PvgNS;eԏN~?gW27RzQzJbF7'W՟?A_uggǔ?J~I3?ƛ%bf"JrLԸߝrZӣTuw(|!Dj$_;fڻ+ڗu]-~JgW2r3(M\ e-)w)~hO~ŏ]lC9| !G` { Sn{Z7%LC[ ({&8_.Tv?ߥxX'w suu$Y5*y ΣOu`_u&J<8@Q7 Da'.i?*V '~;MOQXWdC3^xK?~3K?`¿^H? W\F?Н̡7ZBw3uNz?8߅/НA\| /y^_x.oo,'J&GtGĎW|]7SG_4mw|?3\ +"a]^.~{ֹɦB{<}몮WW>SՂy>aK==dgJnsqq}8H7'¯F8Ǚ(_&?Zj`u]zy1uݦ&/[{jO0q> ~_u_ʈF~{?ߺV-Ÿ~@~X׭*@{eq}!<#w>+?t">_0{΍G~\cGqu/ y鷮V>7 x ۳?مp/8>\m\W>pkT)3~餽{Gh~=!ͮL՚A6ivvnح=ҞkOh6Οoq+q6.'khomM}qjm\jvش~>Pi5{`m\M!]pfG df 4;~fWܬ{ܢa~f5iYݔqb6.MԞ4;=$pr0ri 8{g{\\>\_\_ૹ~~6 5\?\~p <_si:f(~-N o3Y[_c!8  ׀s{'p{'r{'q{1p{'s{oOq{q{ӹwq{p{\~^wxadwnpx67`' \ ׀ǀvpx\ N>`P.,pWp>8\ǀ+* ]p-\7q~-pB 'ǀSae;s]]p" 냫0k8}pn͜> >8e*+8!NrN\j>f |>E8Na`s|ps|L$p|pプs|(Vp|z0Pk8\8ipp3yDp3 R3>3c";d>3^ }cb5JCʎ$.T.5@V^xz_&.Uw>>\nai8 H+U._,W 5ۛL~V'?BUwU#B`Nz&UO2k|+I~.UNb`)&"?fȟD̓wyO\K\ځ%{Uv&hT1Uċ,V;Mv ZH}wbí维pp)=wj?␩|n[8mcZBSzQc?W]OU~oXO1p)c(#?$Wwh5G]e=TIji*?/gث#:_f/,UG6 uGKUϲT[S'U?h܏gWC'#Z8oVG~~/CF! `0G,A5`W?PqHx`;HwsX4b<U~򏎨 |C#W)Gf}8zYm>#xnڌO}BPE\n Z}G1,QuFIvEXqҞ?S<ڇzGa>n.//T#?n#?w&ƓQ ,=*?~տ#j|XXdS c7X?<ZC/{24:ꁖAWB+U]Zh#Ë΋tP Z]hkNڀz@ 6Xmp86ZW`7uDHc+kXu †CbpL\;lFsXtD09˽[$tFڢbe"a)X?X٥y>gWRcn3bB,4Gˋ׎;xlr;>/j,u^˔sI:ȫ.X1.7GVDqZ%7bx}/؜ᒘX5;3^~gO< k*blJh?gH(k厘&ˋ>[{'!*~e7[ԗ.d-p"nw)ӕ +_^zgp47DM0>wzj*VG5@kgWB`Q)S%-6YxZ{P#oXrQԲJ/S.#%%N\,%^sdg />fǻjX^8~}凃%a_-ruF((4:,$d-r6kyG㒶 +81kD>inSZ-h o݋R**5d摍x?y}+׌c 'ǃ=h-oˏ5^x嵩ںҪ;u y7-rFk}:Ke^u/ڊ:nG߭biZ_1`².gNBөWΗ9gÃrG^So+^D֭r\2-Sx$5bҺbX?-r<Y=wtݺ$ܹ[BZN%%%G5yuKOnF7\3#/;Ohn!?8+-\a 1Oy(f{+R-|_5y҃v$M>룁7.EYt+CmY|qI8k{z8d㓙΢'n|;W|ɱQ-owaǦC]Ҁ5:?}3;ڶ=5vI?taĬ=ޕ3KF+|h؆2O̊Rq҈u1wwiq=uo7=_2M&m:3wj^K(=bвa3/鯀>Ⱥyyͽs黧{Q};zL<4{/̭~ܑ9){768ἸdgoDK#:X:s^BTVoR9],uLj3;]R?|WJ7߸[H}^=#"uI$i`~{H> Qg%:oK].Jd鞱H]KoT8XFҥߓzjUI[闉u"uJzdR#9C'ORGrt1>Wt>GIoz΋>:k,-e緑V49c I&=|P'R7L&=ΓnN?"K<*uTҧ&?oR\CZpno.Ѥ Hwmw.$B:W|&uK8!5g?_!@zϥ~E-Lz#;5Ju5Q)SII<@zOm!yΑ$]/L҇gTJ:Aҗ%mJk-饍ϓ6u?EL` UIC:dԫN'->AzR6ҏHמ'IhZz1z%M &\:`5ґI$};;{9>0xƞu_βWpW~ՋOc 9:ՖvOڽZU͟augR)8>K߳~s2ϟikcgO{xFk3mrג~fχ,B'ݐbm^=]`aU,;}&ٟ޳.<*{N}?Пkg+?yT={_n[dw=nҼ؏]2O_lḳzHȐ QBep14QR*HHDC"!$"h"C4$~}꩞ppSAN ,Jl;C/[6p^u[hPUuv+k&&yAoHL74 -}1\Ͱc;-72V=y=K K17OAU#m`ކ}{IRXQԷ 8S;^LvnstŜ>=X:ҷ rO{x]R B7'O] $$V,pyWQZ2`7Z}ѽqq pfhu OԆµ O> ᬨ8Q%J재uh:[ll"[Gnk?Z & ]Aze:|.-f֍~=pG9kf o[m=QL6oo3 n;aJւptKe]s^^JsnŃẰFpqʻ|$hve֦qmȝGA|m-{n |^"`cհkQ8=]xpnp}(mjS!cv~%~Pl07/ %XVMܫOjLWA0pDb\q.hH+0ؒpv-o8krŦ< ~H:G%CM֤0KMy2Yv7;Nj. .nQ942 :{ŕfs{A[θ1PT"2^}f/x$Ml"| {FsSkG * U<|'? +Ym!XEHvxV8(ͩJQ5#u 6U6w=<4v:rgD$Po( t[-UʄI)>[0w<^PPi0Y0Ev5lw`y<܌!LJ`؏yM86uG bzyxȍfǷ->~Wi徒+.V_| e^nY&kďSMs+ 3엍 u?jjO_Oˠ6*ϋT,crt*^GڼB/| ]9CnnjiޡY5q~leN[=Fv 1HpĪluu6ݳvc+(Wb6HaM:MkEXRXzc1[UT.@TR/s;Id$X-֒#83f*STPXe+-Ijof0V>,+'z"֙x( mXX3*,\˞]hY]0Xh29r2@o1iIc^i0q.> <D3ޟih~4>S>z‚>oAzQXu^\%L*ɓ,ְڦ~Ĺ g[u{3g~8>j2Wx\?קܙq:wf^#ת σ^;|E>V@۱3F W|u?!=o㍫8ěwox3t+7ep.+%fi>^x@&/w| 9^We+R%Cx ;?^/%|D1bxg4 *)o?-?Zy4]'On[~G_YvyDZ?^NS&]F~絃'?/|7ߍCϟ;UVO὞ѐ K8uЯ^I~3r>o6}ޅ[kHO-#?%#7ED`5$xϽAINN&향EH|.MpC&n,0Mj䐲@Y.lWp~Uj+,Y$;O;B#sIF9__=Ǔ<{NQ;^H%g$H]}β#)!J/k$ʛuy$okB~cQ eD'+(W#C.DDͳ)'ʛJIf_ߦL h0#k^wo QLI7JN6@Ծ]'҅tJǚ !hD}FMotܮvD+u׳ %phg|0T42ࢇ5L61cSTL>-~5a`S6}M#$ j|F$!ِP]PU^G qn7.KTo /IxaT{ɐ=9/ nT-9 .;,`:. גNOOSy'#kRyKR欍zйhXNFd[cчyLY``Ex7u[]h RY .]0 :?Nic/t2wHh@〴=xŊl Y9Ԋx\ÊuoOV{E5 mpPЂ:Yg1t3`E:P&{D<\ū!鯗UVo1T/Ksp6V`>{mݵ`^E9obcMs2ȵf(cl+I<Yo07c )< a K,7-W52Sߪ}mvɠ"੨+f`p^\Hƣ-:pe]e;E]-e7nȚ1ZkLT wg'u1LP^ܴzeh?֪LMc , 9)|;2hDԜR*An!{w;Vl0cBۘQF@UK4zd9|u\2걷_ypMD"m4X6H1;22׋鵜3 ց.MxZuZ;YQUxG fz\bo j soΆn {Ӓп]fj~4\R^|{b6?.02#҅뭠ݎS3RlbˁQ5Bʐ2zZ4߳]7暭|`#˪bgUxﱘOLW98&fw0u37Oxt{9xHf28|a6?եdQQurpF,k{ LW]˸%ͥzDx&0pne% v @sH;tq(+ 71z, [&V[ρLM-d Rܿͅ=.wX@ؾ0|AL)ooOߍk,w͜94y\'?Yì_~F1djS/~63L5-z1(sil޽ݾVz6Ouxwu{ktH,5ZhiiyHϛxwr,oG-SH!u`*e/dȶ!Fꓑ>h0*iT -W"Q TʭH;P3T-叨~-ӀAsr8x{#T(rH*!jH': TuP;h-eL>fBll砲2T7G#[]qRP{*4dQ{:wbsk*;2 nUƢgAIݷ1/TSGv0VKS~e)4qߖЌbIMb$-dFR- rsegԔ)&B<5jx#.yLik=0Lm,v'R[)nFUJnJ/U`j[QGTOQ'>Q0d3Sndn8OD3ue6J1=5DeYH90èo#-qyAfd#L"N&\$L*0EܙwZ2jNʒg&;o(u3[y0j&Oדi'Jc0[CbP[voT^f0^G*H5{7:` uY>yB‚1OٝZ)Q,i|}%Ô(dҴf1o[L}M1:_|A>|$^ԞGoh;GжS,mmYՠ>u*n=jkDc6[.>Z:uq~//{!}~APoMMdӒiBlZp6MUM㈢ Ʀ@^MDRlWMɠQMMkΑ41VqwZF9尙;$Dxۥ;ѿ).=n ΢]ow܊۱{Idx// }|H# 01y\L6& S؎Lccr04L!%Lccr0٘tL諘yɘ&dc11iB`&c1yL6&ޡ5v00S11&3dc20阊q0E}vʣ n`ch]H`]G BXAF+ .= BA\H52W0|7B-~j著Ò5 9[^6fgx[fn2e8 \(ⅰ} !g7̳Wnf2toy,P ̀ͅ PYqܖ7 d^M(3G";Sl f@lϑOdb+ݟn8$3]9J[:'Sj'_e,ͳC{FǗ;3^^3|Hip^A8 JO -7>}:Ldm0pVQ(-eb|`7z.ҵ8E,WN*^^[o 2ZS˓Rm=q㲂M6Pcg x(=G-`T#B (j}!@}0EoyX?ҟeF;1-r*7 r`9߇ܜ1}`EKRb5Y 7O> 8\S0i爱0( F5 ̓rk `-3랭#y+z:NN|'9w*Tu \Lςns!vц'\p=KGo3L6}S p|&핲=ܥfT`=o?%UW=|޿wl{q7vsδPtB7C(pȗ }6Ru+N\Y6pͼ ½WVLg€=E>5Nyb:жKsf97| = 1bj//3yK''ͻK-: HlT1a޽ikB|x%_^nº`3.:QtIؓn ;7D\-+kJgMl+j  n:RfBZm~D"_c@;gl90/!۲0Ͷ('=q0~&YV6ߢ_u8\V=礢S.vlWw΃M?/w-4wnX??:8`Ca4|MYi4.$j 7c#۞c sPgs4Shs@'idkp90,yZ2>/>_+Go\](dQ /zo@d›a[`q}lpƷ0`p‹;лHQ:]p}2f%Ξz|2K=Ik-Ƒ76?W&gyxFy .=]z4olz-y7o8Bf; Z9<~js}R͚/Zb_@aۄ/@.JC!8{n[cTY6kʷ} 9_=o Z/UUGsSl}\W -+|+pU+^4Ơ?ZhZwqOx +55L<{ >oS>JOcIbm1#Tߨ6nxe[ | <NokŻ{ unL~'' ;9"!蘹MKZCEׄQeBj|w dٹ{|^Wpsz JeT pjg,?:u <.xYQR{éÍ !a> 尯r<\gwPțrX{Bs9mtG<ǟ`!_ox UREѩ!\>˭66Qc.-m#_XچNjm)}|q>+~QMx_8VȻ3t+l6}e&k|̈Ԋu0ؚ~q$cR Zx',o~EU5I7AlhEY}›Aˋ`P7 -j9MTUi Vt \ROcx /kE f3p/eYFH;1#5B[xw74NM˷:܀7 CjpZks| $zԃ{ R*39TʩR7ր~L'w‡Ϋ5.{ck`YNE(uSw5DfjsL'`#J5Yux5$›??WCTm\j觿Sˣ,s{:WÀ{fLs+܇UavEQD1gkXʞԫpQc`zo)&Yit!' &z@vla)"*yڙ"|*x.) ='ϓN="׫>or#!s]iPi]ۋoEss)aAMwuW'Muc>eBPth#O>j>B!?=:w?zv(qG_=*痠1|"!*[].~D=T^73sw5NڥúN/[!ڹٰpVZApbGώW Ki/CY'>K.y!/~r=OcR%>BK%Yw~T] '-liiVum! e+o=H7mg7#@?4?Q.g+ ųBro둿cd\| r9J(O1%3)l$`2g Yx)sg}sXfgMmaɽg-bU40Mc95$O3K9yP%3.ݬ U:7s2nhma֡,tN4$ҢBw>yg7}mkar|c ;m(`hT i1R>Jɒ,%BO?l_l_pv%Y$0 _bG^oYH_AlO@: γp rWBH}QKOK3y]/o(+22 !a#W9_dKY#zTO4j?_% "9*Hߋ|ؘ0S1?bNeL>1߽&^܈)o'.0???o73=O/c:F:zywxoDFP1&Co8+"5̇U4e𰥴0@󵁡47N#A &o|+r|&ߡґE(E(WX/|\|kW_#b ο/vnT,SӅ/Ir0Svr/ yިD;gO"-%w`Æ.#OT8߶kðOG^lhٳ?xeCpVc Oe՘T>.-CFyպN?<#]\G\J?)˿YJXEk,FZo;g'浥]~`?PfTe.0ΤIkVu]׷Oz[ԌC]b*vLk=fRG2NXӟl2Nt5 N{l-]~f/br@m^znɨ Qw6Em^?TQwOEm?7;7{"nvnnvnnv>n>nv>np  fofw`fft#%x]O5}CBt)W b)*n=HcS *c\3YiXK3o0\u9~~gZc̺Eis2V֭$czN; @`ҳ.{ΰ:3fvEqNװ}Mܱl' 64N{|FGT^_d-䳡7Qt%%ff؞i{N B[C "WGZotig)R괷s\]w_q*iqK|mN{L |q#.Z5~a~ː,/ >n]7No+~])wR#"OAD*J"]c;,B"7t%TJoT^!QQHHG:4tf)Ґ _X_G8+E.ҧQQ!IQ@Dj˙EHwHk/(Ґ m2OFz6}YP#]Z?Г"P=sSd#Zx?wC/mׇoItpx%|WKTCE\F8iE/(r^>Z!ZGbϡ7P Y!(D:>"0l_>"#+|Cx?G:cZItzh})v&2Se^D1P=!=j&dCRTD>T^$SS#âE?TNyHJHHEAKFz@T.b2ϵ "A|^6ێ#=ocuAhӀ'z.(zڨF?E72~tk7=Sx:^knG%Z-I =6eBډ۵Oժ#""Z^>pQza)TWz>lm@pk*u+/јxPm1Q춋&DQŹ O#zpY;,|8U(5M<$7I?C PKK;ڲ's"Oc%0#~vo4q{Oedc;*Әڬӏ?j$1 h郮7XX)a:ko A)fG_s|K#fisH|38Lmuic^)Z5Ug>2 sz6ZB Γ)2 AbZy5Ѯ\mM*^:[} ؀ B&w{fe+B}šK̉-W[Ϗa` =:%$=kSM,bz;Ӝ,ct `RO?Ԫ!qnYD609vĴG kL9MW7'bo@TdKڧJHi;lw%?9D,V*RnVgBp\,dz:;fYxn8^-x- zDaA?G47rmI,"!2/O& h0{bXNzh Ĉ%;LT퉴fe ?{;EPI46q|nӐEV +8"mH齱*f;.za ]'b֕Q.mW;WaQnl GK F iD'2́I\n?y^h­EE'v.p1f!MQ6.J8T*JV̨102Jb[0mrJ7\b]/6wΙI:}>yO՘{>`ulnVg)WHp||@q$coA Ŭ=@|܁ז \ț Q}ASk˹#A1kpKK::E3k B@=k1Auʉu^Adء_N~cG;(8<$f7Ys޹ I #pJg)Fv)kA nPlFttu{n q Psݐ 3B@S;Ҵ|^C|6Ht`A/I-O[ɰc[]|~6[^ 7j] +B@z#j @pSqHd|}^i2p:|#w8h i0[wwiuz-1bͳ,2vv׌YplXR3X}j_ثǯw_GdL7:9*Lުr{W0*5ѯYU~i9gݩ߇Ҿa aaGjFsLR7:J{2?[{?] jutEGygd}pcy3"CAjط+sӛLƂ~ZsM'|Pj.Gnf㦂]w=&oԿ ҵ_23j.$7)[ s_vrfN^ 4$\e<( $(pv #<n~  xwg}+`w籝 3_sV?WyM^³*q#;< n) y+P75 tJh8C g 8Ai&܁8Δ?yvCp}Rj y!O`ܴn.w}+xp6r ƥ10 y\ sQ) u_kɂo0~. (v/G=aY3lbW?\ ܾ~C0~"LHqNJSQN~D6zrnl0z~H)-@duA4  jʇXyr"r/ xLygGx!}kOʑ%g'qeʕs;b%|jܪ)gΪ]A)ML`ݻhN(ؖ])bfx1Cqn)G| gʥ:)f _Nҡ ;ǭzNyekQnE퀚RʯJpI93\Iy=^QEa|=SEcYB)ȓGL)"S*6_L!{ғO8Cz(qF_ekwS>N`{1۩{ľPfz)n(JK`Ӹैr50ώ5| )lN6̛,OQW P>-q)DZ}RQ.&|8{ɔa9|ewHyyVQn@8Q~]NrZ]C^CЭAxos]}5sU{\8j7s`^D  nlImplTBpVg YީʂǻfA&0c#pc4VECMZ#*&zde^kma 4#Z &y:\ Ϗ]x\7 ?S`øo%s vWqw= -4ܨKeo\ @9pV.N!״q~pTslpKjWg驥;U@>V[UކաTu#jJԊ@|6}\7:yH<-+Ʊ8_Ma/.Zojegmݹ,?KZٵ°>܊&DHyԴpkYUNvұ wOU^mwv mۮ۶]>uUmPrs4sGv (4䓱m{*_WCW<%ˢ…݇Igxr |٧dUM\2:#b5gQաFM+ȥǸwIAD.D{ >Ak_i~ '?i05J"%"ygx 'BO4G;RInZX}غO?'[xXOk)?ҮަYzf XV, k(nSRܢL:s0V(o~~UM& uO'LD$ryG)q[½cg$16@x )w V݂g'J9ʟ ~'2]ܪs0VQFe_qa_B!l!$D}Q+4+8ˆ6Nb>ч$_l~2Ru r}vOӂxV/`#~<ӄnDҖǟYQGq6j+L 8ԟs Z!D]_gg:NݮG~+!U瓖\G__w:ަda}a헊pVtR_!lP~vm}#+??죤%Idhٞ' c˕׼<ƪr%3eqi6;gWR>tpm'M~Ry~^\$)-^^y=ڔJ?j#l<*~Ho~'C?$>"}^D |б2}|47%_*bDR &G Uq䖻_w$`8U*#dRAs*U?oL Q fjozPȨʽ%ge#F;|&"?5mhT1f|Yh9צ-'/]ߙ<Ê@#>іjX,Ї9z[lQ"->XC|%_HC̟ԏ4#_l}'Wޚoފs>cک~9JE/3骑2vWk[h7RR 0GJ߫Zuy3Wϟg cFi/nz/ʿo sکOz}2uo/_]V]:n (CK\{l\Uz?=cv箨^ *&߮?$xzT O(ws^G%Ɲ ./u@ܩB\̟ <]hG1kt/5}p?s:ă {2W#J^>_&_O y<[< Z!g#Mr|ɉv2뷜 x|c)6]zy)y|/6_xhzϮg[ [:Xz_pRNZ^~Z&r_f=c|}ή[ Ujy66W? n>SkL_qڜMw3>{ۮ9yխrp;SO\q ڵ~a|QXWŵr:91}>;SQw׶y~ws[ߦGhuץ?]s:xj!1l?>yGSLT"__`ȝMYtJ~L`wIh?\ _ȟf,> 9!T뙵<ŏʋgSb=A3)E[@@D>YOgEQ-oqphrVˡ:S9r<أ5 !:m|^Q;yl׷F,hV)옶\Di)?\~7GQ=}( vGSقjYfϏQ}9d>+~)/J7ϡSeu?n> AЁ }2 vy u}Ǎ!2z0@JK݄8 }ofm|7 >3g#߯~>ڔ4ѧ=2"ǼzX`mMf:v- 4_v`)h/`xT,ӒyQno8NulRҸ'wTR";fd 1 }c3jޣ[u8S|f|>2~D^>ȟ="A~}淧l15+$qi˯Aݘ?$9`g7)oGz ȿ"ɗFS:4fi|NM|;#Y^)Q\ K<|G=&//c=crM[v7b񂠮iLWOcOy yzmCx]>%N\ eeɾyO[ҵ ]nj蚄?98M n8r2' G-{3?/_k^dQ}3b9T7GNmԖs=R:\;N2;%9w=ş2Ώn.uΏI~@F}y[ `xiЍQqwi˜|n[ 3|~C?jn'.& F ,Ϗߐ|.E9]rwEe Ӷ(9vj?ǯ8gNǽFS|3Dw}{\Xt_iy >g܎iSެ zwug 6|8x 鲏6e!C?U䕏2 |ض%3Ѓ161՝>=-/4&9rz:_I®v>}ѣE{,ƟJ>O|(ppsq9+m}Ygo1t(NܼRyJ㽺5j1忋;Wf{o'* tz3-&/SZH>7 _8m ީ~L|Tlαylj2ldشٰy'%ܩ xSGGZ3M;qly=j{+5WIpw!WRD͐y}J|$EH}W&6ߗZ {V 6w%#~ĺ"$6Q[ d Hr>.R~&?{nDj8HZt u]Kd딝O 7d7޳XZdvՒH1 eiGyFnaS!{cW8vSJK"A H_0>5YoFi a/i&UCK񼒄$W_Y/^R"U\9Z!ͰyWP/Znqr\7tTf"&ռD!޵PѢ׭s-b=[:b5M1z͢'N3X#pǘ`L[X0bFgC: i=ԟ!M]w&e;1"ԗړat+$Xz2?t~*V@G4yDI, 5yGڨT" Viix]_M[)4،ݴPl$c$_+L7[G*?YD,HAئ$Aw YBkZ7l0Ľ[Im. ei%%ZWsG0kLj >_[yj|*9a8|Tx)a/b8@bMΛHB닔  #6+1jϫd?nX$0(I`rMsmX[0I%\`|\2ˌhg5o4*AF߅0>AV*ǬUJ"|}Ajj__hKʘ=\M& x>]wNJT%t55'[ߨ{ c`͒/5[X=f0g3M*9h ߪ[O[P_OkyJ%O~UKn :?wEv%VY5_m+ȊNc?2jY r0y(xJu6V|}NV z>\k֍u*S_^BZ5Kwc\ A{B0Ac?oɹ?!m ߯J:})0<`F7vgx-!zyHrkCS/TmVc-yPu:CtPH#ֻJBj;uYyY #/C~%~o]!UR SX7%'"HkV!TN#S%CVdZ!7ek4 c ymy I_0?v/ӽT-ղ+Yl,rzl'bǑXI=?(~9;CVnHCI979W# *sny\뻛RG*gluF-F |%Zz͗ NDj)Xi3}]FΜCl%g=As&/bjkT#15}Umy_EF[ѦTzX1tq{S)]k7ML+T?Dyi9x>rٔg{l o7H?&NkR(\u*m?B=$2x>~*{%}x1^St:c[z9K:: #ߎ sc<.X :!1ROj.8 L[c!<1Gnju0,u5E_1kl6I1W?KIf`@IgⱔZc-dȄ3wӽ(KC;M,x;nff˽Q8~Iyڍcӆޒ8at2(c@q'h2>$:9ڐ3T%UcrQ !Sw\ؒ"f*03Ü/; 0WG̕wiœ 3a6RP8 %FFQyXʐi{0}~W%be"9}kt`*0c&̏0ks:Í6 Ԡˊl35[ٰ ;Lk'#C 8 n y?*۟1`Lc'''o4?HUWL_B6&Sz=c +ë ar68븼IB$ o┳4x^NSsl`7ֹ6X{ma0܄-[ QdD 24m)* 7?롟wl ].l1.K%qɑ=t&Æ C^҆fvW=,ʱɾOxCe^8Qf:2u+ ({Ў=C+H]u)Ԩi/ |E1uO,։?KC>7+o甇>;̫OeX&(ЭogO.n㶥!ڣ=un< =ϸmk7{PJ?J۪"ltYlP,#~)(GY,6G bfL lF!Say_D>"ϷC96a#P..vz%+~ѻw!q{1Lb-`Oُ9}Gxkx Գ' ֺE={*BxTؐab,>UiZZ)H_NPn0p>ax3,waӍD3&)?% )lE|P+n(B)x|/ ':C Wٙ:KCG'c'L=g)N=J?Yָͳ^———5k_<aԳ0-U^BsC՜c#HgNU}Xas|vʏ(?+?'Ja%z)C%zcLȌ ؙWS  Y6|L&ߘ=Kn!mAO1h.u>x=աޥ w0f)b TIrJ鬥tvIcxwլo}E ZOV jb|K_6CLbwz ̴O%\VXrVL9Kagb]Ej_v*/N͈{Ƙ Q>5w|c#~iw5*anߵ*]Cz2BOe8WLinTQK)wG^Td}.ΰqY} hp?*9ٱCsTiM4-X>߾UZмNަlb8݀i|p@NP22?s7K=# *} 5w͟WM9GX8mP9_noݣҭ(q9xN4(SX{_vt}~o՛1 Ռ_bXKAQT鳿ܟ=y`*-6Rynjm76ûT`m>2+R3NRm??GUW',Is]c6^qUn{1!Ny\A3JG?a3}9a緀{װ>YL2}=:2sczZ㚧O6yMO61Ϩ n+Ykl˸d\M^M0l`쾒lEӹ/*u9E% ތg{]U2Vs&_U^Q:u2%2 Le_1ǷTZe{a{|KG('7UJg<=c6^,@329(om| Wn)Xea߳o?CV yU|9tkx*o_-oAs6(>|Y6* *KW:+m/6Γ3ӨB)ǫ)g ;2F~2jE-Qxiw_/A7`<_׼<ʇ踗nCi{p D3UE1hT_1ߒ¦=>E'Ԓ,a=u۸"cafg̿Kfsu{\pjqi<\dV߰k`Ÿ  0B~bjL2jDz5Gnlk}RyS1 NaC3(ڸR^ +M<n=2ʱ8^quLZA1טyi^:'lPL/L\I֙g] OYcckɨ7PX@8uoz*p%ejW=M|bkH#i w1w>y J>-."@+n _Ccz2"+ %0 /uSX' 17I,[Ҫ^G9aө.ygE2r%9w^ WQ,?ab>G|je˓lv;.3d?CovRJ4?Iƽeؿ%JSTZs jElCXrq潔2JSbܝ_1Sbe>R37ށ9kOy|Ay蚤l?2ϩ:USD^HvQy=q <GtF(89D>)9] {v<lj>FPQ6ҌStvYnRiGQfIĈ!ʎts<\6o1vz'Gx0GB qT._5٣RzuZ1Oa"̹_ (89]PclV5'aWc.AZ>G;9N6JkP(5Sn7w(>Jf6x|4 j7Z%<Ե ZlV@JZ̛YUK F#yY~a7yT(qFS;B]K/r: [bϷ8 };x/0~cO&Qw]92M!a;7v5ax>htCXoh:Fg]"m",xr# $+5ZeUT>V˞(>"87󏸽b<_qZ*#mx4|GsF_>yPHF#maQpߚ:k` ]i() ;R\JȂHoOiߧzw"rO}X7khWH~~ϖ(x7@#:u?6]s|R7Y}!~RVA3=CK] xTE:BNȋ!B@&$-aHK' ]yL8;bv%CT ,aqP3,ߞۑ=ԩSUVխKvSy~%J}З^Jfwލ).˨\'Xu{#DZAa؟=P<ϧ4ia,N<`<^g||GW69lm9@w_?]JL%2D>2AHœYwYpk1RyJEʯ {S[XVHeIyL@A?hviY?*V.hڹ!Wl/Vb}Xlo~Y 4wPI_µ|õ,4u}Pʼ@[hnK8Bq(Yi{Kw8'ʔN㸕r{Tu4Q!NbI;F/3_˳<*e'\Md>MW`mmvLckE0Γ; XƲ9NZ:Y!_0ݾBV.J8#Ip)|)>Tlu\Y5J ejofȴ%Ӹ$IPyW$~FX^z^ݷ˵G32VK}H5?3 k4ޤ&3hٟZ3~t1^:$`껲1Ex]Zul_2zO:mIav.uƼʲgo1;ɱ-F1κ ^Zַt¶1!W Go)jmB{ޟySsvb$tn"<#:t 341~Xמּ :Scs~Oy}~BW.s9C={{kq9{:A+%13U DEr+gTYT*>cS5'ed"Mv3 s4H9m~NCJˠ45y4f J[jW4zp-Wp" z0nѽC ')x[q||KIp1Hq ,;-&oq^A8ɺNb*Po%j\+"OѸ`B8U$KW{=e9Mc}f.[e2ԩbmdz&3A?ռu~yve5>nؒ Vf݇Yϗx#Z :cE7]lݕζ!<}-̞ζNgztytǡ{@"_n/ihU6Ӹ\+KK-9[5_}iii޵7s|9i܏>7@(59-%?p]][o+yWy{1D-WdKm\=C^B:xq*T.?Q,OXZv.d6 G Or^,rT~x;l :V/tGi-~IlK;'AZmЗKuwe"@O/P1q{7ɮ#YVIָ w^#},;|ig|^N=mә؟:>On4g3UN{F72}tn/?Le>_}|?MC"SOL|Б.}lb]6^9xoIl+'hle ;Xק;XwvkZ[;R~۶2+[Y.g"E[i:ƿBH`;}r9~sNQ=|Ƽ>vջg=,ezIod[Fv^ˋy;ck_nT,Q+\?cм>HPѧ/H-٪+{w醺C/!g}͆:貨ux9v ?/7ѝP?:Xj=|^g/oK$u~'7B45z1)Bxy>̲s|'u1g'^F K,3s';?ſ&bӝ/'B3tg"Ao{T>95C381o1"3XÍ1\<ĸNNK#?ɝ|բSy&{sCO<㑳ϲ=ȿ农g,ýr=<÷.\N:>cßlY}Qڰv&CA/&O',4Ǣy]̓51ܖ'f~>L]'sveR?Gwզsn.6ɻoH6]@bC &yKQ', "Oig}G=j]x'|; 'Ps(|`OXtk&;!Kxmr$pﬣ̿#hl:ǦQj87oə u27cLe2]iH[hiy-Y9ˆbSF]_M,!)}߇\1GL}~&6'W.ٶss[VoSPܥ9z@6^ʂwɻ,[qMdc9S!s/)ջW_ @fb?s [ _KZYs1.n")_c^}^o# l(K!_{muv7tu|K=]7,XldGExu^9 j#JvR|wN c-)o UuG|ǀD-6{3KoB/]hl+"EC)Y-ZlyWrޥU/l溞J&k)N>(+=Ʊ>zt~gԼ4a"̛6 B;OD~Jh|&bFɭW!ƿ}~(ӿ?A^oUN|E"gh.mbW]0s?hYF;رD~X>gg8MY .oľ&e|ׄO7bRѽ 'P B{RF;N8k*dYgx|o0g7//[/뭸py\nOȥ4\W-l^n]~=M5y&z8EAk~pO\-2a?d1?`1)۹,M-FMN1O .%ۦbs}&~wܢxx^.6f," 5_Qu_mSW)=XoxZ}WuzA޶1~`$;`dc 8h | ,x 0z<`5 O/33]v^`40l&.[{=>WYyJR,5i7 6`#l><<<_`l`!fr`"078x3v`3 k'灗 =N^K^ e Lˀ@'p#p }c +yh<`)p!pxp'y`/4 w 4`> XZ+s@20Ɨ[7r5ګ]f#R,v=}$^es-p8 VV_ewf5Foi|sߘZGFV5x}=ʽjk[2 Rbд)GJ)* \i᝻&m1ons9k<ₔ52y)IqB*\MML됔:Q$+Z<{϶CNZ4yE5 v k,DBTP;S^ըWjޖGC\ T2PFzX8UW~*m}J+:P>Oԉu5%8ZT˴Jw^nXEٛl*˶m_XXU"A(6YF~*KJEM&1nwSuVq57Qi6x +?!<:4232}AY[>S.a&dG(IdX{w#N'jܒ^ ]jkjMMD9y_ՉF<_.ONg+"J!l =o 7,I݊#(Av [U--n'4k&+FR>!V=MOE6;XLI75vy[TZ0#89J ]=Em "_a.62^lG$UQ-}(Z9]]n] Ubgw ?PIQ)ZQf RjHSs6{w |u]>KFa1,-9 aX)8,T+KUFhX&b8ZL +uF~x>}_ulvqZEd)uϱl;_ݬs|!s'ǏDb݆L8}llW#Vu2h'N?8#;o-v0a2zU{uV9[A@N3mGmi4~ 9ؽ1Ϝ<̗n]3}kۅ&35=J:6f쬘!1M1:KT=ݼ_y"o])˕WLY73?cf_oLzm,_S>qCb͞85}"{?w,R=%猁~\T S;bK{mTHoJc'H=;\d}>o]3p{6cq}gOwմOGN;N0xxdk(w{EF>S{|kkFls6\])_ y=[S𘘩>쩵#A]W1}֌ؘڑy+VEרΰV99[ P^'L[<Ư[ゝ noH@M}'xײc?v=-J}.siwOV)kKܙy䙾e]&HeIvzCNEQ6!LyɇlɈY\*Ir[aVmkj% q|,xwhߺK+3ik%q&/tiE?^K6VߥTӧm" Q¶{%ߗ=iO(徕MD Ͷr9}7wY?Sdnw%ؿ#=׭M"W+<&IleSRٗDY"il⼼^.唍 .)\wq}(F׳k\o$33e'R O!H6x=A,g_+Ǜ{H:C"OKQ3DO񢽧42 R ҞO5z1∢(o?kLjyckr<+}<$1"odN~"eI;}(-u!Hi#Q2@MBq e Нc=uQ2 ej$]N?z~.ArϦ6+C霷9s˵1SDxVٽyG*L.5g@L`urn*f}:gNK Rj~k)cZ Ov %`?خQd 0F^҂rT"!2r6 hz 2iEA5R8g%(ɟg! b+,I uB\cL񐐿$ OI{$,+Q8`6|Š"(*-3*rqSï1"H̳I| N%vd=.l=]*~rv)} UnsOxE$F7Q?o21tv(231/OD=O)}9` 42n:;k\mnl!9+EbS# QD(@%:wZ{H5Uq">/gGwF_ƀXBNb"=yޝ'-<8KlXј1O3b汝26!=8HYH4=0"@;fEFHM/}Z<#G?s-$PVI ,X0Nu0 $g?Jc7xGA7فyKyB%ż9+?"dqk"E.sд%m$MW, ͺ:(ґJxGhEdi/,C|=wO,bCX2b׽Tr*Ln$%5o)VЖRc,ѓ<nߟrEaJgLn߉C{ F eEu! W?cdif>\`>Xc]FQDnM[dt,QrLAޱ9b^x! _ϣ,Q\J3^I5y D".SNl_#<$x~Mq,MF]7="k؏k?([Gb~4E3%{=,Cʾ nRl7G>a>)aQ֑Wy$nU$bN9)c g FeǂĢi3OOLf1W5/{"Jbk2#z=2@|b0 &-YS_Ù{HuGR+H'1o+b8cX!Bd4sŅ}/"B ^c#H^ʹ)Zr>ej'nms! cc۱chOYo.IcY=CCJ-Q!Nd<=:HC9$C:(މ[I4y8 ?ˢZpC\H}vtHxݕ%Dܽy2wTޑʏNpyO79蓤CyID$5D}r)xټ"CxIB26Ä{%*iү0U3l39w,w~<曾G9Fۃާj箓?)\gOpr uHbl u\t"/y<#"(ByޭW_-Жe, |`+Kj!bݒ2 qa+D,54q;rLtHTCJg8Df;q31SC9׫9eqe;{~mn#3<CS9^Hr~%yg጑Sۗy&fB"~TNyOhS ?u?P7) qN9Aܶ}x97G(miNyHC!jj)ib|KxxSb~D2؆3p,0 8W$a/.N ,؋38e$ pt c2>i.H,{؁:+)K<qwGB06J() ka,{qW;e"p'=X,54tT|BTOSF Qƻb}o%f`0f` 3>~dqb6>&v>_Lt@_ 4<Vc#[Q{=1#<Ұ{p?<1aEԠWA<؇(F)N(>w(y\Ɵ(&~-n0D"3R؀\Aq;/Z:` I`f9$!`-;5C~#S4@sC/ LXxk 8'n;{p 00 s/a)F>I78FDS<1X7)PC5܎ӏX,lg+Cz%DgPE"tz|=8>{h @ hL B`96 jQB- 1x 6a9\)tE_D 4؄(J\4Z=#a&a"XmGN<{ 1Q9xb ;PbհJiEkt@7F?<шTYX؋()9\D5܍Fh6x]11x OcR\|bA%`hv0 8LG5,G&6SA!q?j8K/ aD`&װ؄O8s1.M]!B,FR؂]؏#(E~HC}4^C$a:c1^x{p'p OE "!'0S,F*ґmC! 30/Dc:a^2D&bQ8p+g>G:"!ɘDtA.va;/qx=0|$cVa3v$qAa$~E@AEa2fi,JC>8S(%|6x=!X76C|88 s:DD 7`(d³x ob%6`vq7\ۯ34膾(LAc!^c r Q< 4@3܏8Fb*",J|؅/Q 9 HL,D*Vbr% *ph6芾8ijx+[QsKNڢ b(aëX5؂ {Gj`]&?D'@ 8L\Wa>n|-Q Xb>e@6c7(BNQ^G[tB/ TXVc#>ŗ(IP++#јx:ZlNaF9pUShx` ` /5,2#k[{P'PQ7|~hP x#),«xoca|/q=~D.*5uhh h`⑀7+ vc?qUu6zhDD`4&`a!^A*:|m؁(@P?k賨FGC7@D`8```72 8#88K ']C EgtGoC8# Xxo!a/; Wo07m0/!c00 !K.`cN 2@}4EtDb0"10u,Jd!؃p'PJ\ _=9苁(L,<$tY-F,.:rоv+w)w=#JiȳIci"~r4fϓ[HKi%~i#򀴕ICNA:J'EJ7 C!=CZP'eA2X1y\H %OH 2RFhyRƐ2NK(dL!2M d&92G<-{dO/_R("F˷R,9*东R"|/rF~R&?O/rNK\_7rI.K.rMK)7/_)rWʡ۔SyU]uRwݪQ>^@5Tj(?uj)\P-U+ZݯڨjT!N=ګ:.ꦂTwC=UOKV!U05P RUzL=5T SOH5\P#(5Z=ƨ(5VSUQD5IMVSTjSOjW5WSUϩ*Q=TZUzI^Q)Uz]7JSK2ZV;*]VTZVUZ֪u*K}֫ *[mTԇ*GmV-jXmSUD}>S;NK}nGU O} ~Z:7VuTS uRyuJV߫RuFΪ2I/:*MU꒺uEUꚺjԟίF[Mkumک=C{;]n tCƺ馺u RҭAú;Nn:Hw=#:XԽtoQz =XzC0=Rңzc8=^G=AOԓd=EOձzg8gx=[s<=_? Y^z~A'Ez~Q'_կu~C/o4T/oz~[z~OgUz~_g5z^zޠFIsfޢ6]O3CԻ:O{^@_u>CHouNG1}\'u>Ou>guQ}NU+E}I_UwU}M_5O}CEWFc,f܍q:64vSa̝.s6L}s15LcLS榅iiZ~L[ 4vat0M't1]M7dlz^ 1}L_ 5L3flcq3DfyDfiFI3DfoM`&IfbX3L73Ly4Lm昹fo6Ϙy,0yм`"ؼhKeI1&ռa7MYjr¼m1]Ҽg2*ڼo2֬3Yl0fd>49fl1[fnr'Sav]sgv=f7_}KS`צ0!Sd1ͷ|g9nNĜ2Ԝ1?h~2?r9gΛ sj~3梹d.*\1檹fabWeYna9:mnZwX^֝]ݖUϪocXZ jl5V3jnZZV+zjk=hZYVluZݬ z zZVk=jZ+h [c+j "k5m=i8kmXQ!CK=e`Jҽ=ffzǔjM8iɲE$91333333333΂(GݙٙIr:".i$ gD$&-M83Ylr9G' Ebr <<<<<<<<<<<<<<<<<<<<<<<<<<<<||||||||||||||||||||||||||||||||}+•p*\ ׀kµp.\7p) n[­p-p'3 w=`&a7쁽pO')p* `? S0 30 `,aX%X` kpa1?<j`B,.48B lCC΄l8΅|.b.Capx<cqxx<OSitx<φsy|x^/Kerx^kuzxo[mvx{}~|>Gcq|>gsy|_Wku|߆w{}~?Ogs~ow{_owpr P^^^^^^^^^^^^^^^ހސވޘބޔތޜނޒފޚކޖDoGoO@HDLBJFNA'$Mнt=BOi3tstVAz.t.ez]UJN7Qzޟ>>>2`j5iZԦ Iz:ݢ.mR4gАF4-M83Ylz=Gϧ Ebz ^0T`KkkؚI}'CRrqt\*V57-<&\]CBgLLoc H6o8e߲jlVi 92{O_J'@5tLa)^mJ⺽C/C $'vJfxZfVV:<{J:ߝli}]Ů*>Px7u# h1z9,ga{'3[=n-+|FؑF-KxJkv*YzԵiaQUC0uY:(('8"ӧJ7d)킦=`dccI 6%^f2M-DQQȨN^jh=GdGwW$7[ct=TwXf GURn ΈhdӚRUݖ޴r(u ho4HWJ#re}u-<" F-[MB& ꦁ+?@idER']]d*Qy7"up\T鋬r> -" ~c6u)o5ж7 *f+moV4ZR+Vt p{3@#Hmot"}NB#,8M'F)_Q+ ~{h՝:Gh A}= Rk$~gMVoJ.;FaQCƺ\QӅ *V)$6\f2(= /;%V:YdgYNpa0K[(@xHrfbQ=,.BFB^ljM/-N gYeRd V2]eQ3h̵}"!Mb_xHvR"z>6Q1ۭx\J#zY>j6+26nf{~+r;SRҨ)Y4 ;21TJ#U=e6pwBjgWVCG{~o%S:}IMET5-+; [)/g72z+6q ;D[A /Z7S3 y軝I}ɏ5Xuoul0>+h808.n8A`nF}a S we-F6h=󶾷,*OyDKeZeG{U%U:'S8K20& x^00zrp,šq;| ]`5\sA^ rvJ]%@֕ӺI>G:%h9Q4UVR#[D~0Ag$z-Y>m_\z +ṾͶkQmABOW)w!q7Z8!Gs<" rr##P.|Ü($Obo 2,ٍ"[^,ήTUla6z  o, UyVmu 7zk$ݸE;zig)uEueCi] lڡd^iٝC >l[Vf"> ~iH,.]@AOOVv=G[ U fA%NQPD(B%*DlȢq\AVgU>OAPC{a6@١A1c5Vo9Pp%Q_oCjۛF\28QugVVjT>γA; ǏxEǫH#)#9/H$ܡݔOίb(ifI|/KyV}Ec!!-d֪ TƟ⁀;zz,fhmA|qrǰ\?˾Xy~i#67eo[n `di AkO w"Xy(,RdwoYts Ūs%nwJT-eƽ55)|qa8Q#[yg[9.FąEvg1T嗯L~j57g;~Ŵ~iũ X4n$>>Nrh *뤠+3hiĚ"/mV7:L}KGRL="+TIZ$bm]lN+K_^WeW/.;ݤAn2%\H\W+\󤹩Z}\rVjFܛm)vuxI>oIpD#z((9ҵCmIM m7dW8m>5UNdD㈔uIvRօ.Sݕt X*) ΀s٬L~)(ȍlEN+$;Eὗf+"$6Dfl䋣J3gSt;o;H;&(sH*8,oX#C.aRLq2ruuKġgz8dQ;* dԉ0\u`ΓRԓX]2Zqhy3NNlQՙ$dFTZo/R哉.noT皆I>ހ Pr2ҌL C|Jǟ_dO7OU∎.QOjrW7)e:x)6p##qL Ow]*oʔoig1R)J6N(s۽I{|)O}0WFE6d_SXB=$)(褠ńJ!RNd<$eyK Q@aWgcF!O&SQ{v' QIDe#@F#tMjlZh)vԴ4rOnJ,H2c_伺$iV\3OU:(|b72ȒY.DmŢ]ǍO]:)<}k26smU㸵-ky\ia0}F1q&U+h`t|ZcqȮIrD"ځhUa⮑rv DBK K;+6$5bSYY# I*291IY 3zJ'H7_2䐩TJIBreBAt&!6\7ǜVL);n٩[QVJ3&Θ;gVHj ho{ג$7nDoS8;[b !XH+DIWVD!_ oW 0ԜcA׽E|2?Aŏvɵ N4<39z.2k%6cJ5^1#0< Л m)?_*$㶠|6bly>&uRx?|lRF׏qLU Ni&x{2N%8z^]g%m6)'7dR]K2^Bymy>>3$<|])AߦsJ x91 8Jhod%iUaU紪sۧy8Jw6d>V⍷[z{-:U%4444W Bp|> im! ԾN69\Ľ{vzl@v,U <5!FP ϵ{2Vvچm1 UDp|v{ >V wJt)|.WAda8ݨq[z @ylT9 Q:U|0#V!gڊD( \N1fZƠkuMQ\"5HK0:gӳGM9qc9j¶KRm1՗,XZ^qs>#cFc1D>bwFs>nF3r.{aj0piF]oQسxeav.܂)qz^K|_ QVYH{Je[f+Qaug;[fnb[TcPz"rHaNCęl6d|\=.yI)RZ?RT]ڒ%Ok\--;6[lѵ)CZ.rJ %?q-/WwD8Hvض=폼ވF#|(9K[( )Ъvd[kE,%EVxR9o/\!wc@O.:&\OP7݁QghxS}:{`^{=`z ! /c*=i}P#%YQ,zw}w= >H>"z5|َmP܇Y rjl4qc6lHr;n79&{& W)EXR.1]k]S4RjKR+Y6R3>sۧ5fi&48:fM_RtK{ (mEH;"@ EB}>Xt, B: AtxCKr ^"pM˱Op1= bF7 O(dW( fCXĠ A΁OQ!T8_̱"e"bXHV f9;l\S5{pBS{pBà)琴s0~CRSH *4LU38GNz *)'^!C)LW\5_\4?$;DZ9s&p(eG vdd+os?{~:%e8 F;"FyarR^xNKCErCruNw—䶎mN)6&qE B~UT\y*|S 1r]sK#!Dr'ՔO(FoW 5_(vMI?IB[Z.......+++++cV-W,V,V,V,V,V,V,V,Vun/^PR?L9顄w79xهcgO,wr?PǫRK}G 7]*[/Y$ӊA(!^գ^cሢ>{85CΪ8u.X?BL#+'uޮ ;Nd|棝+hג.BM$$)fg Q}WzUpL\:\rS"TCQB ս_ PTЩ0&WNw6^be2.c7[b}Ӻ\h,a=K K7^p冥SYRw<4H4 L*%Nk|Akei|IBLƦO76->4-v8)׷k]3bk]#`c5rlz[_+Z % [i @ N] vSAYB(3DBx$Y]/6 %A(Y/u!iÏy`@`e`xAituA&k{QFރssswZǘa nvcv `7;Y7Vv1vOxI>MD #~qtv[hWvǯyjeLߊ'D+ϸD̖WjY "a /Ww$n߉Zq곉xXmp/^ʟDBʿ{y"hWgy}O>}?@8S2+4,|64h;{1_7~D'gI]ݦL7?A3D1k#g3953ae& G49!g&ь2 31"O䅼 _h: % D3 `fPGgf%L`&22A(}Eh1-AK2@+QZV5(EP Z6dG0LnR¦VҚa6r4c~ҁ=@aRc4j<{rdSN/ NMfPnQj*A}fR߲YJzٔCc/Kt9#Iҟ=e6gLBٳ&s<Ϟ'# $^$dKd$3{\$Wl!=[D.aKbr{\ΖP+uDᲯbl)_O4{\"ױE)dCƣ܊hh?P?vFQ0BE~t:RP ʤ,*Y(F91t:rB"fH+& aYVR$.kJ~wh(k̫}F_uSiSoEj Wd˘Zù5<88Hm@F7c[)]}4`:0x ,+4?l {m@G0 (#ASiL`X ln@0.Fc)4`\C%CE@{08  =w͟gyNsM}?ӞNwyAA{YsPs縱Tc>'KpAos(/oKR q@yYq'y<hg[_5<%D'#TD0!'D!"|)>W`_ob8-pj޷G}[]d 'Wn]CDz~ß| ط&>9۩=_s_ 60Un,AFƦ9-ϻ?m-G[V8f4_1;=yrS~$ qńYzµ,~k;z%#/'{%,"<^nIkR$͘cZ({&Zݚu#q>̧6=[Vc/l'_z^{VbU󤝱n$n&k4Y2875F J,sXyԷӒ*D.ˆHϿ^:uiŴ_ݶIicO#ZB9y.L|x)iiVW%= cZ9{:\wkw#qAnvv;rrEj#CL}rtƕׯJ#[oo^{x1!6g>:Cp0۟?}.ZܽG.-N5ֿ Yڼw'ނvU{]P:iל\BٷU/wea/sȮߟb҈ׅ#J52}$#m>8!dȵ/Bk:DMhkq"JߞVN[ll¡'8<;bӭe^9ۋ~~W2ԆZU|Q<ҤZ+=QV~Fa7nB]B_/g=QieĪ?hxxx- m`A*urcwC@}$9()'B䝠/U <\(/ȥ7 PXsBCs /| /@ a;ķQg@v 7[o@= ~37UAxA`r9Y}?^O* C5?1YBR(C_ rț!oj@ p ('ރ|RɚAۀl}J&S;K<3ݺ}bfN?7³ƕ~˃ZёWLa=jVg6%t6Y2],< G̃3IlTg8?%ךސI^c/:Tp{[R[FכB+sBIt^Bau |C9{L ˼kpryz|]r@2PE,yk$2aEkEj}oǷ{H R7Ty߇J Gڛz|z뫦 `} 3CYDaqi ,J#RɌ59S:`ڤkЦz՟*>d,CV&wu˂8Lhwo#ۉ[]-]HJws*Wu YjYj_G_u%Sxy2w#HAH%$["ԇaɌ7mx[﻾,WH`dIrR*[TjÙ2VzԪV^i+CWEo8Կ-jiyO޷ Ia_8)L!z8iTJpdmPyX$A:mfq\g?k~kq3 'v*eH"ԛY˭G*=S]PmHNە\Q]P#c:Im/hr9k24`~'ZBUx 74/nZPZ#t?i1okD}cx=.;7VB[a@~^JUxu(2tfn̐Ӧ>6#:Li`NڠǬN]r\!Gi"ߺrK }klB?C 1vs\{\Th3k2 GyU,mm#*pU8zGQJx:1J~zQ2N>ڟGɹ6a0dh\bɸw0Fs\-q {}óceN*X=%kGixb]Ǿ2f8}nTف]"# g[?MKO>nT*z6EqS^cƇHvS9f2O*-z FG1j/ͽ!&kWNqR1Եz!@asL\70SALهtSM=Wz*~nyx񾩫٬cfK=z"n15+򧮽Bj+e ,7c]&}5良i}CD4bU8q k5%?֐_M9^vy>8m9(|2u7\ONxs,~=k5 dʳn0hȳ>q}6y,B Um ZlRM&uYfg˜2y&ƭfc6ދ8.!!ZC}$c⚏!W_x+׬9;2N!} OxDqOdrtT{M.@g\{M]&Um?>^seZ9C-9"c.Ds,xd\h)ϲ\Z=(acqXK!ko˚IVEJNwzCrj>$-Z)}a6#{f;JRo#E6;Zڜhd8㓵KOpdww!r#k49 GQ*{ ,s3}ϞUw` E|R)98/3-u',cǢ0IOOI}ΨEO,UiSr,34Ug-ʍ>xgEybA -jɩ86آBy G!;YmR^!~sUN,nQ>*}\0>T0;?ij}(?LÉ8^GQ2x~BKd;>:ڢMrr]i>x7eߊ0xy-B^E2N.~^t\x{2>)caIKi9Y!D1ό^SODd;:ޞn1??2 M{cEпbdY]-ζe6GS;v.}_\_/}*Nr>^o}|Vq==q<SL&d",j{\|e>kTv^ uL\`+׆6= Т|;w!弄Njss9G^l|V >!ަ5ɬD\9՟V0K1uVuESwTIgUU؇L| YCӸ'6O?c5wor0AhO+M~5-F;rq;N:p_O!ː1KZLW7Ⱥ]Z=5ImrbFVs|dX帴ݭח-ڃgaMO {qp!|V"~'VyU|
    W)P΅7QgȘ8i ڱóV;7>6Ha*q5xzUЧ\dmfxO5zq!&k mKpMuqCaA礮79 k//`⩑r-c\US׾?Z=WqUX3'1p'DiU&&ȱxDYA/pͿ`y\gr&6}Y-uDJL&G<p$Xh|E?\U&k1[O6铭߫h1;EzpCqq\or&~8E\,*gN:[ F|z\cp Ir*V̔YRwf8YX5[hǎϿ$H\9WxeY:lϚ5Ƽ"uyRkϗZ_GDD9LAJVBXh+ھ'i2rsU'1ayqj5j\mf^z AgQƬ[O}zxxVIm3Y!cg|Q!82OXr\W?eu )Y{*Lgm5Ǻkx scc>2YΑOW3'PFDugY;[ Hr]$ր9I˜sNȜhZX"9'ۏ/c~S*^'0L]aʚsy=&>qKv`oZ죮-ec~} ǽ"8k&9ogi[!shn''97i3q~K=3ޤe}7Y4qy#1A-=xKx-nOil7aߧ;ҧ/\\OarSqɅKǮ Wݕ4EnĄO6qIzsK+h{4gr!ޤcKïil[T XpM0 l*c3Ywiz~TKrGsԽqqئM3'j%6UC_ncS?'xr,l֦b9-UجdwN&zb|K$@K!gĎRW;J= ?(󟇗h>jlI^8/a=1+𶷌ـmqm oxpYg3?,ǘG;_{JlU;*g(fr v&⋓T_pqwsr,K 0:l+u+|л6vz9\ar*>ZGO)xS4`^pz/9hr6 ǟ|^rxҦܳd_?=>'c-5Y[\}b,  dfZiVM{O88cr,ir:uťg峒=)qQnCS;gKA2m󂥞[MϚ\s=0f1^,jjs\2TѸ,|8&179ٜkW>8\鏫Bmp_ l;i.69oϿ ls0bMm4-k~>yHb==a61rd׭Irb~/J='L%?N,}m3S/8>JGjkBm4gt 5hK] Γ9[p+wg3-7̜6 DeñedlMewu%kJ)-FKҿ@r>_Y\uS19uMLjS68kl$wlb'!ZlX"=%k|bk.פO\fSUwe.9Ӽ ף벭vxVxi+mʍo>Ʌ蓄n-I3z5LN1NUp}bZ$kׯ%kgJvL\ dvt^].2%*?*"8Kfm*aM%; }.j`}Yq\zMMH==L wp}^x1yk568w֟:Xyn{vM6KL.ítݿ^3HXhOٻ6Ђ1ԵLM.&sx7s㰰{\kS<\~_ryIN#T]kh)fWԽ1nw{$?lw$U5k]dLmG%PC%q]53ڝeަҧ62x]yqK<@g kaWAl}LMҮz؝ heWvF7zI_ ѻԵ;1dNv"&*M[bzg9v3]ο¡ops`k?ɞؼ3U~'ysѽd[&g`|\CiǶ4_xD{L`g]kc$1g͹Ƶ%;0~7$I8.؜ er#6Į\} %7D?Cavk\]mV .GH1vJ*<5Jc(ٶ7z.~[qcqL_`LPs&s gX;gXZp% ɎK?%V ~sۃ~x r4p~ĝ\%%$L+Z$ÿt,h'2@BT>$DQY=p8 :+~;8X+!>$0w(Q'eJ gi%kW&vGJmu0zb)IH*'uL4kp\IB ugeQ%:nHzAb++C٩\Z*j xgl7FwH=s8mk+ 򤁵'rI"?G,b%M kW+jU >_*-{Dp8r6EVׁ jc햀7m[`;]<;kW z$>UzLaž1v2dpu5!zwK?csv%;xsv |0D²P mfcU ~) u6>)-Gٱ8#!{$D ֝Lb C'Q%Y=J"/$#Xׂ1GTg7OP%4rؗ3.;;9l.Jhʉ~58  V>I(ka*)ԀaZwؒK2O𒸎7D] ~tI_}MQ]آ|& } d 懶|/D LyrU Y]rhgaujk,kN< j78亄d͂,Zo o }d'x)on8;Mw_#]7< #_#_̀sC>_ V t".%rO~\(IOM +LO}Q\ӂKiK='1RQk)^Jy@;)OyTx u$6MJNSv zJL<ד84G={KI .~DJ&C1<+ /%.U0;vZ0;G?Xc)"%8]T0Z.>.M񨇲p4 Wǰv}I7$ࣩl7F?4^ <voߡ-0E-8G`wbuRv.LJ>e|ZYi܆s.R`lD^21pX*r_1dq?_ )2lN?oc`܅FywJp<5)׾>C{`ДQm_nyt*2,2r/xFR> _Jr/#ߗ ˋ5n]1gʽ]#taP&,킦c  E] pt q:F[]^07{_:?a}ӂUvø"R'E#RIDT*FayL {X ge(5Yl-`觼+ϰ`Kч'd ~c)@I?0,E-(;bOV=sh?xsv,b.L+^v #c퀽OK7DNXh 3]` cx0:)w~pF_sϊY|{E/e ceh+x5{Y  qCk#?Д OO\˜u]!mW c M9TxMMy* 6d[:u3K@Y ?>Ca{?ߐGM_n{!Hft4K`GX!}m&Cwرu`˻b^rZxDF@\BG:\!j=D.N kXwf} Ʉ58 E agg#eDj(,HMq,[ǛH4t2XE3rFphSCf2w ߱Cپ|}5MmQ~="N&>\{)#/v ]  ;> ҙ["*u 45w\ՍF+jqeEˀ[+Y`k[pRCl ^l.(dz>cc2;|LOowHRU,aWeڧ|ܛvØC'ˈ* L Дn}]F9aL.&5x}A2: LƊrV&!2v'.'Ҁk'-f1Gr=,3C l<-SyQ%b.[&(?b&ևFFj)w\.P##hوyhrXlc ))ss7hʹZ˂,͓|hʝ0=Д/ihe0/thӲ1iY-?$.`c䳹w/~ iL3}EF"u,D=^F_sQ( הBBVlL 8o#: k Znf!jkh؆CG.R*K0SkՂi;p^2ɀyGʀJ#Ӆ2A]"#EФTF-'8 9~5x*#pM&\O3#e. X3= S\j1X* x@&/g'}2lԃk>W0?spt -kE?USMX(;˙\$j7mX®v=ٞbOv]k Ebn[FH_f(9j\e2OW/ H9W./-W+rʳ^VQP t}b> VeX}ր E_\VQ((0`<]KƑ` d]ƭcfxVhQxbT1"N#(1<> gY㌝vcvR%RTUUiUUڪ*CUUCP8xG#͑: p9<# jE5_\VQ..6T;]՞j_uD^, r i P`(6 N1 1ʍ #oL63Zch0:.3$7)L)ٔf0iMb4L0ܬ0ds9ì52{>sL,r[-i R`),N, )*JҴҌRmiAi1V+S#er>,+"L[VPVHq"F`PSr]yQkƋ,VX)X"Jf V+NJUƊ#8Dh`uaeX*X~+AUA!A;W[RUT4U*}]W8GCP9Rjơs9vx~GUV+U)jMZ_mvW{jRAoVb JʐbP4Ƞ7X 5kkTUڨ1EFj1^4rXҤ2&Ig*2MVSm3ǚf9Ŭ6k:sYokn7͜%֢,)EcY,zRcq[%h)@ϋwzD]80`*1IV"UDAtEp=b܊(A^>gQѿ/E?>E~=#"ɃX!'R!"(]T/)0j yF\cEAq#xs:A'GBIAR#itCEDz"+Q ɋGV "/qLMJd'S 29J,yN!هh CfEnS"Rqd9\2ΊlW|F"{2_,rO F  ȅVdC729яD^cȎ*dH5rYRO>",Mxq-O6N1,ݝk]_;loVƯ¯[n my5W*~FX]X"(lBy|SklMܙys|c5Κ77+=G=[>3}~ނyy3spDg#yX6<+[3s.jU ʷo(/?O원>~{/_ҷF|yTNwx?)ίtHH؊&!!}\N%٦3Qy֯MyQδ cowZkwMo27v^+rm_tf^2 Wrjrϙ ;=Xּ]NeW4Ϗ^gO>H쭅83Ow3_o\oZ/%}.>/_鿾.僵q6]p[=v :t]Wɚsnw6NyT| B~c&3oKmmZ?ؼgseUImhjT(b4ļ"F$ol5v0C{LHLLwfg3JϞ(gzof#_73σ6g-[xZb-߲//Mﴽ1woH;Wӝ/.:I^3㳾˸8f)sBފ>;d3.??{ :dun[K'Ld\y17t}ꀴ4dԉEɷ'l-v-POp|{v_}k1lƂoVfwiK'LtyDz=Ny2rъҟ|A2XFDr_:ڞƙ~޸pҙ4d91xzK7|sYB⑪ #W 1EaBRߗRUKU9A{Pz& lXrkW_:G%k?ɨx 1k3-C[_?ج%ޞ歧I㉽&kɱ ǭn?d}[H_W.rcE a!ۺ7/K{C.'89 눋ڜ:f _~_' s*"o/}q\kzz^/Ves fPX.UQ.hVrN?5򖫬@z`~ܛ2[6dW S .FtrA!]uVU6gǵg( ȍF*^zP/KLBF2gLyBuΞ=ҽ~y)O'^JBt6ƅyVxnK\<޹pD2j)nrb864e5sW36h8.τϨ43kGʽXU! )tj R"k ZzGXן\=˘[ǩѴ׸#:+oIzڲ8yVܝ"R㸨^7hpB@$rfYK+K "mL,z .-aVZIIf#]ޑ?CЛ(z{@@` 9f&yHsf)n`ø-kP/QY^$G` )VWWr9J:\=eoZySKЩ/׽A3N -ZZ/O<|0I6r$~j&ڶ/]O\I&R '(U3$戤[q͛HD2HL`S#8\;!>\[XPoธ״p_r 2^ea;N3t8z ~ Gǘmɩ'#){Fƚ%h~ \Ϧ ioc.h@Q`MZ۬e:Ca*E4zV8JɄӈYR6Oο:C^ņ3me¯ voKLJ_@ ,?Ej<[u.J@K̦Wަ93vT\,#GL&qM9k&e4>$GN*e]@ y۪Hu9Oq&^]/x=ŪC!!gsk aW- 6-NfIZDԩF ( B(v ʣ~F &@$A@w5pGT35 ">`DN͓vѧۊd Ϋ0m"5dm'iIưIHSY.9=YG3]^X:Pp#WE9h58x_lPȅTj1dl&n fqe~&$CSG9C2kafHn')ƿN%;6[1;a(ye؆ߍ0&GlsOsƾDʰѽNT6 ʲfbOp3V؍uT|Aps/'pD|ơ ` (eţ#2 k U/o!^{.t*`4܇(L$Qچ1 p&w O$Ŧ/6Mk$e&EBpCe5K*J5E<  [DԲQۋE_;q KmNzs=bUR}1ǔLLbeL}t4V/_Weo5B%."ά{Uۏy6-h氭C&cCm^S|3-{ܵe;dGTk 1,"M'x0-_(_'X;=+KɊ=]dx3`tpKTΫAc@7y[,9G_q؀+DMԁ&ΕqGhTB-sMٌ[`> uBH}q;$ׂO !=Z9=\ |pM0&~ P^np5߹!EeVklzIҢ2¶pU&$Ze2DlDA1O&Tϰ*ף{x%[b&/ W>RL/"td0oӦ!`xKrO扦Aoud:߽q!n)Ty_*?zJNlIlF|{c*K~؇] 4^k&k)_rO1U~=qZD5҉N0?ߨ2ZhJ%۽l§RD M\trфvM1(l+F%qwu$Nbv1O:#=A CFJ3"9s̊ rS-.>o]fN5!S[W E/(E%F*,'///)(.] xaeT_\Б8o%~Z~DF/ax$ij`'? :X<40Lm7_Ul5w4sE2{o3'Wnk7{@[Fi]:<reqx _ ?Vk)o_ Y1'ŧJ']&m0nq@b]If޺ͰY@AEpHAx*%3ґ]vܧ! zz&L̙"|aW c݂7@"Hob-YZs'fK*8\HI xjXq8u{ukd<-9EOK9թyGQ ޣ'e^ :RWnnr2ؤT[;8ոHbbQ0K*14dW<%-Z 5LC[hCdžַsnw$w-IMc_ƪt?'cROؖG-x?$ szJ $]ӭirtOzrs||vK>3lfn7(%O,{Q- zS*}fvW0o#V,Aۛ!3U50x2HUJ|,~o؜㬭 P-C/@n;޶MFG({~?~I [ (`k0ep#v ,tKb )/*[oS*-z4 eٹ%QșԂ+ݧg)Ly+Oe=M%h!SƉt)/*Vy$i+1=Q~'f#W#>.$> y0ɛìJPGWd z Hsw9r9G+<4 ])炛RԚu|}wmWhy\<@}-Fˣ[—=B58"z_U$+isMJ `߶ G}? 0t0(7, F'hЃ >߆DoLy-}"e5u UYӣHóz!Xj՞g)ahc. p/h`@فa q rIHV61rPP7!o 9&BOOP@ |i4߿e,/+euJKIKI!ʰKIs"+B>.Z+qL<_%d饨i;qa|MJ@qX J0N~W@'G5)tҘW+LfbgUr|BnЀ1=d3+Ic.TJjUiInt,q+MˇI~+]J7+|CXqpfh*R;m1o73^kx&kx<yI+}ޑ?}fu˾HV> !3t\SnDB@ wzp\|wz16fЃ@`L4@a_ΦA~4CK} xLWdDNb ƚ!TRLd!ELZE3Ğ +v训}D Rb&bؒR9wNƖZ<{w;rνt 2tXq P]yhC=Nsyޢc\/[ f?hQ=飯v\F+msFhzɾ]!e|ZYr.5d`֋] wBdY잾zQ:(zb?Ty01q6yI]UrvF;7z)nE. K> Ѡgzؼ9O>~~_r7|j1M3*co3}Oů祥%5ο[Z^gM K7տ6 Ljw7cwOa̕Ǭ=8| r˹3Txϋ Jcl%-<|-];-f %Zc8p[gk%(x˞sڶ#LL}M\tƬסDRk567uBX; oوUڭ\^|^OsʗgLiv.}iVnc}qyv۴J%\|jIo`%n~S~8tGs+?2iZ>_>ȝxaGc׃ǷytTuvrZ\biWϛץZ}푱#:U3ϓ'O. ^{`**~SqVҒI8Vƴu?=Afo+SW}R{Ť՟(vbY{FfMVgv_qrEi{t^|تSݥN6I@|xO;Zga61 ?)d޿^41y7#UAEnlթ!F툀$s=)'kZ!s(ַsu^-#N޺jx @^"ON[al6mCU+wIܩJ?e޽&U6:)YРMT(uKs)58vPyqq#NRg>Uˠ *}a*nTX,̸DI|J( mks+&'dK%n.D=VɟBXW=8/Q/xê+ Wo{g#;6r-6t8hhuL:ʭF\82t[I78/0w.lZ.1XN.b 1poAt-tN UϜ?gugc6!<ƜC#_lӉ>Ϸy+`yNg3ϲf9>)♇SkKX)j//ѦfQDY7UH[$P%W%f׻Vz@fC2ھ6ߞHk_<|lO9G|d6]4.޵7NLč~rYt>|ĚyC~Yƭ55dhm>H3 ^rj衿m67=~NMlg6hrW0wpߵ[}zN)O]zݛwp4̾Qo{lji~=:&7Ɔ~ik2վ{~t%72k4^y߯]#w}?*_{{Zv<fq/<6~|T^3ʓ'Âje .Dko//yVq:c|1c>tAPXC{=dhs/cn;7E~6FE{c#N||rO!}6FwER>,OMc3/:H4dH`VV(+/')'  W;]F -#IC;:ǹ6 NU-uݞӤhU;U 7QnD_&V>IQѼ#QcAD_<ywO @FtCb 1"ݣbSOJ!usL3 }WvihC#* ϴSw8C"ʍWg7v0t,Dk7¶H46)2'z]9ʙlHouSfMguM,O`"io6tEH%bho8DwM,qqTAXlUثؕry^ئ-kګ̰ʶLix6mfg^4')?0ȵ["^/kYpFٙ ,'dk?F"VZ?Z,w;4U-. e~<94㭂niB-b09@ O U2.SU΃jʱC)-!M2 $i@F6/gSݮtprmCA]-hHFr>%P 7roiQ 5:+bm?b,f({Fsi4,`;,f]X85慑;bkr1)!5SBd hEzۄ,AĦVl0ħi`hǦ"~<p HD̈Q;&LfEq2@H!vA{P/ )Zp ;Ok`ZAs,Ͳִa!Gh*.';`= =˲4P2JHt5Tr~_BfbLȑtկ'BKcS+u,hl \ YS7]#uec*7RGRSD궯-z 1J=;;0-? Ðұ<"N,7X;1f/w*IHGDx;eQ #0_e88G qiw9C4dAAI0UDCțH@yR+5+{ +7\G&u·M%AmC?xp@'}S0WŲ  4ĿNm$!,AJ{.E43+ěR-~08xfTYk fQkKd}R*GM P{ks `9&i>g ) U~`}cHk}b΍6 4ІADlQ֟:Xm tf R'0='0*چV_ mgM} dG͇ˏ})і$gy< i]W1HcyN{ewEI{4@\9C@6Q%&X*B**@t|g`=ii0Tg|93MhW2O|6 *s^ч}>\oI)tl>hӶk3{w쑷fzK6{ w wOPK}9M o&'sg \+т`0&Կ|w[8`?hQ'?̫Y58n;PC(QEq`ס Z8ڱd07I y_tqMc?L=rapC1Շ'[c=ƶpl_0M V47ﶓ 리R_ï;C)˺+ P& ΠPT~U_@U3r3:@\PWo ÇН$/^f98{K_CJP-nɅ.^t yk08ހ^c(GZ.;??siXfG2e 3ǧRϕaҢqkzln  F ;e_"}!Y|6/@0+mֳl8hb͛jPƳϡτ"qC,!JD1s mOy,[{2AI5oO*< Tg$(IÚ$>GvVB2.$- 5'I5$$5n<$"I)>Hmvk9#ZAIz*1v݂i"̄0\$@ 6`v~(cz6 mf;MzaW;I0F p*>pg};\~ ȭmKn cwP(_] :K^8wEP^;0{_h`Ghc\g4D,p/Pp~W8%Z#|=D#7+m~}΅+lKÊO܋w"wĵq%q,k5;.^kB)\WS;'\ 8Q\JڂplXבv\?|XWZQQpB5X@vB_q>ӎڠ4GW_=K. Zp/pqX'\+ee\=:-z+UYpݩ)|~ cRKFe;NHw3֑8 ;B`ae'K!tct`B#Ֆ(>Iϓۓ 'mc,Uì֙'dg D|"Oz'=T́Y'(Ozd 邜Q7 YmͧEѧ 90ێu|}ƍчJpQ";L_q1+ƕ7A.M%Å1,Lv &x7FyQ^ފP*:L@VbepƸbI ʭOa` |E2W; Ncȩ 9*%LĆr)IiāP*'UP% Gh7qC"epQef\d.cTp$ z1 qҷP Yt1%E h:]l1Q( `*r"DL,+2r1W\e"f{4L>b}4r#a撆Q hXL8/,Qz"0 ~JexcEOB ?=3΂HrEB)NJhD9Cx`"o`qPMCb"qQ0$0l |h6H/P/b/$ڛBa]BA_[,t*O!0 ~^ C 3D"|l]40 4?b#]CߌR||)WʤQ#+9L7,o hBT:OB>r"0ւ#zj4J:Wёȓ8ĹU(NpZ2ɹZF1 .]¥z_0ىJ,eL!'1F @بČdjc&& &y,!bkl-ōv"x %CטxbqJbU0.`0e(Kx)`zi+cܧ㚎(M7JF% rTB+mN"kI@HGTƄ6 b1ÞĐ41-O*D5ڇR'AE"C] ༃EiPtvFR4aA4) k݁>펒Rs~En)c= h$r)+? ¢"֤To3bEbKRk|$ىAzFB2F2ӉASFC=o_D'68Bu qO9o&*_Cm'DH s0Y K̉0DJC>PJcR.BG \F] d8ۍ9izdR{6*_6haP cR~>qs(5pJbWűӸp?ٹa$tdcA"+gFDrZް(_ŲP9S+ySŜK{],p|?]~*_O)(+1TG=?R @E$M!Pe_ LZpbέuSͥ$p?0InM 8?̘bd"=dx'Xc'sNZ4jX<ޫғ.>/ HK}~>0P"GEK t.8[p'z6~nC~.n6fm͢f(*~kn]/ߚoͭfߚ+o]g҂J wΗomh߄[Ӿ }.ӥƗ7 p$ {q59nCLĮg: 7rT{ho~2\mH^o$5KVC:Zꐖ9r2;S;;؊g7l[J"2GExѯ"J)wְ5 CDOpjΝ 3飉нŸn%,w s06Vqhu7nι@n>KoSK\Kn׵[EXK|gS!s'Cnʺ&CfhbbL8Qx[+$YFAlwUb6=$hmeF@Y`g`abi+2HI_-R ʚHZuHe랤@tG6A>Mȷ B~C퐟'!3vCfٞH>352|F qɄLK>? 2 dLx6dHWqV%FXiff&j@~^vz)4EC[|[ڣ0zez/-43-F#_=l4??4ЉpƭK>{ӖBlK]V-zּ 8:SNBOF^Vm%|^i{36=[Imʷ"7Z@BOYϢ_Vz_߰mn^ۡ{.Dj+J}JtOt)痽 M ݵ߄@wFBwWѽҷBS4P)~wBȥ/ c#tGcCtSkRa5*zWPJ?_6v>]77 \ܨ(v{q 4Cj"C_gXߡ^gXϮ̿>ϰސ7:z/wy |3_t.!fjOMiI^F?ݿk'=r<I+ǿ){_z`=kDz2X7g9,Yuf5fw 6yP8k+h4(ߟv[NwԂחe:K~ ^㚳y3 5]5k_5׫ȟ|d8yH=)/dyͭc|O|F5k66k+u^p^EknZ_tvrתgfj.xڙLmu#&Ss>_SeL;,ڜlb me=!.',|Ӹҋ˭i\^qƂ7˦|\^O>.G,xq'|ҸվbSCK{\ )amE骔6 E$e E*VȭKH( u[ ºl~ߧ9ә}j}<}V;Os9\. y.՝m-p!6j6{Enhc" ͚5;ЬEȬl6 Ĭ,nJVDfiGGUΆYV`2\eV/Yמ X.HΪf)8%t8{IYZ0=gU8nA2yf~*Jj6,fSFfn%6&2z Y lҬd4m_ς{AC/fiER*x-y[kIo֒kɳg8[KZt.wDrq| ] 55FI\\ e.o&p9-vf[.oj]޾Aג\SpyaOp9ٜw\>w=\n`. NQ\Kw9^Keg I(˕.WT'eoC\=5~.],.?zyã_ǿ\ZU Cb^Z2H]$\O\OhVWyADC8??!n#??bBױa:̲hK3Pגf#,e,a`V| fkMUSL}w\澯awEE\E7+nekoOU$ ?# tm~?yA"&sz'fi*6 z9%eUq?#fB+k%m%/A1$k\K&s||u-~o~k ]\6]ˆŊgkH\\]Í˅uak\.eS{}ry{첃%߸nMW7zٺR2K{جl16+p.[fyW` ʸYcYGl7Y̺ʗ8OYYkGnJlrF?bCjV#dY՞d? xr62S&oYe)Yqˇ-^T't>٠jCzazz AhV=d6RAbdYܘW92k,"ʱY?bì{جkl]lJw7ko+sv'3 '6;f5Z/SG |KrWe8$ff]cby-6Ks&Rdf0;e:{)2tNϿ@fOIΎEeQ+'^8K^t>fM-fhּ*lτf}FhV-dq76=ft#1˧ݍF]CfFdVv 6k46r*fƖY7YʸYv̪;֛ f-U%9z/0΋yé=Az0M~*f[H7h4%LZ5ەԬȬfE@fcdV YY.\]*"fy ^ۯ=cy/ͥ0|YWf%D !$BQ_o^J=]{)W, l/qI`M&/AW;gǏ]AOp5uND?Ć=NNEǿ|:;zTʄ<7 }Nw/.t_1sYO6exy$g`wO u||>r|R{"';r<ӑ<G.wC(m;B z~uɛ˚qpnT/7~-Tu#Je4]yI%'1<'1{l^D]73/vlˏ]BȆHl/E{]˗.׮eRrф.."ty9(6\V)."q2 `$7.+F.$rvx$.w.?glr_aj*_i \^5zw\{sY1Գp\~$1so2a.3eiL\` un:r罙p;b_A.#r9,-.?;\I- μjhDϭ^.˾Nt_&J1we6u8Y*DZY*I/f rm026k YӑY6ܘ5) U`MdTlkV>ff,tlV07Zn2uo=jlva?-GNY7q٥T{<8//2xccj ul]~ CJyaEw 5Ak71*aX^>u.݄9b#]i?=F"*_'1F;$HjRձH Pħ"z,_P Q}^)͵hMujVGmuEHSǽout:qw,!CKԝ}\Ue!FPT@@@TTTwDECܒ&S6iul.aZQi\5i19QjjRs7-tt}Zg}9z8~y؁qq爹qFq4X ߼0AqaFqY#0ǥ]pxYkxsLcarz=*["ۭͤ}"ddiw N1^dK>KAP.I+[څ7=n^PW59Zq+qk?)q;D[gq-Zh7ǵSvw\G%nSnMJVnJvn+(q˺;nײ+qvsT%o+ S ś7V7`WNA5rW$\'--+XVZG7TN ^oZ/~Bw8G6$obfh/POgԕQm-9$ oY,2(oT>/ u0bsvdesP9Oҥ&*u 0?Llu[̸ J1,LQA4/Y_&>--㼄 P~o쟒OhSRJisb-b5s )w:k '$IYĎV,RILOH=s튞Λ$=[zn{p3V19O |GE<}뙽t7v+znyJ3bCԳH=}=Hz<.i zlAn1_wEKaյd=v籫^OU~OΟF迻Ҙn,}3-0Rwꊞ!RX6w^Ե=}z+zIz#跽^]Y=Z#x+z.5#u-gy|uٔm~=?ªkz z{3{rH=_=Hc\suoz+{POF$)LsUg׽^=gJ#=Hcڽ=ͽ^ύz5^Ok1ޟ>WVc͍_wx'0Z}7BP[ۤ_`?Mo,v>ٿ⏾g3!7WrI6TTžl"fYK蕲)Mfs̲dt̃LM6C6I,clJGseH2Z,i峊Xms-5M_>N{qw65=ҽ98Ml3ul'8emM&gIll#G!oq-$u61۠c;r8G(g;2ir9ۜdTRjlۚ۟=8 c9+lKqi~{6gق:g{ c^^lު8_.g{s!g۰Nlk9S:eacFs6tv!1Bުޒr~ac;ٶlq6u-2p_滘]V/omN-)F?l9'gllP>Mmn->] l8!GBO8ۀ8qo;gCؾYc5F{]ya*g۷]slQ텤N>+ul% t!Li-sK)~I`c{}:g /lϠ/4gqGrVr19[^gKmfخll'p1-)Ux!o-؅m[)6oKr8 48[S0CrFw6б]߃Oqm7g4 ټ9[|gL͟y[ Mm,g< 12W1/:$) |ul/cuH8g;MW!o0/ o1/l+lcc$ta̒dMMX d?B6$51j9NU ei'|QxGk6ox^?Qc''%nUS{['k"'?l=ǫu&-A&~/km IS^2QIq07.0:^ xSHR}>+WH]f||͛J|+_߳S(z@'q=8ߙ4wk84˟>\=z3=O|,\Й\SeAmc}e909o 09se98_ySyf|JBFjg=_-|1d"{33 =Me=tۖtPAT0AD2Enz:򕓎̝q/Pc({}[jOu7SyX-AwcBs ~|_~yH|Dp|`Gw:0 @\.!^}E&?bV8G\5#^o@&#Λ[v}cRA%WS 鬧?NW}HߞmL{[>EBEgE祲**3T Ol+|Tkʘ(IK7"şqI:av*-?B8,?Ie,4RWrDuHwlq Z~7^~𣵩Iž ,}ũE1D"0վ'[^|[*>cE"^V҂#?GD<4~cu r !cB-%^$~<_Mc<)H"4~_<Nx?O_KYK2{/2kgB:3Sr^-d<ےu Hߗy~] w\kU̵}Vp>n# \{ʺOߛV*i_6%MAd,_<_><_yNf _NߕMmibu|o$p>'eS8 {NdߐhWgnw_sr18?߼^!񝝥{ۏpE{-ZLcV؎mq-]25)Ά]6Yg{j_֚:;PZVuP.&_ͳ7 qCդv-%(u (:l}ɬG5vv/Ž>vIٚXܛ2-g [4mE번{m#ukpoJiZ25 ?* vD(n:83BMaYO]:0<80ĕn*ݐ-yȃRl_ze.I"ʷLG%^>0deWvCiqxe_$y`sx*1 +{]qH[ ΛP/(? aFncY 3 JlJ(2Q(c q I;O@.ACdMjOZ%8By0$C9ȕ?dΪX)d6I[}m97> c@Ƣ"2䡎-=OT0 Fyw?\6R|ċê 9L)½ND-A,m*ʒqݔ"qoY4ru3k\;Id9LR4PҖF!n۾>-75C.22T/.G)dEMuD'}P>w9_6K\GI&JYd/O|~k /8Geɾ훫aCܚ=[,d;gy"ۢi>ޕHQ_ad]1=ub0gT\O!kru?PvݹKsY0&dX'aOܛH/v$;9O.ꛕ u&9ߓcȞ݅a$ϐuĵ݄Րu ;tsPrrqnGUv9?&W,u4,6~yM29L>>љy$Țttt"뱛5rZ@lP0}}YjKd>r'}M5nd/6cɹe;iq= B\}mq7]GdO:ɘ{mp|(/^:ܼim⇲/i"{Puɴc?'gߋzxƛZs]̸#Skc9TRٿRq3׶NzY,K_9%oOd'2n@ʣXt!~hg%waɂA"[` "#WvQW|_sn\\U!0W`8E4r .$hmRFU(_ԪRJ@z GiQGKZH$V+y]vJ̾7oyS1* (w4lO0BSo_;ߌK >9Ikx9l_yjiGSJծu-gRYcVXߧr ѧ|?K r&P3-^^lW]Y+㗝2c.6e7u3]x.3?$K^KN?VV:W (J,5Wtn kmir O S/R..Qx}Pu|kM'd o"]dBjM:KǏ}s2%/Nq|1!0{}pGd /_*01fc3M"?"1A,5B%e氦GVaJ{sX%tWAs:GQ0+?A}ީMMCIvfdF%r D3nSV6#%5SCT$ΥEދzXEZ@&jHyAZIEAoN kl<7H|˧x[KmoKɋ>" AٽkV:mL?yNLӯkwbR&Ȇȅ8?}RJAYPk85sb%aXC \CaYp2O I<ˠzra G!xFGQ@ :ы*6> PX4CaP m8U_%x,Qْ1|c7ܪ" w[<#M5(؅ˊB\@8 .zL=j2MU' }9`2b'y->x<T%ʣC>?-6v :00XX&TGw.0V| @0C0# YۇTa:ԓ87ԘS7fv:&NɾkwN;oV$'2DJq{}%On%\1A>(`Vqh}@9ZY/fE&h\@)1YO`4l,7uKlW_oH+Ι\*hGjVCj=l~[ډL£vsΜ}Zk𶟇qjglZTX6mVE.SpmTSHCBݒ u6k5_]>(X. xʊUC9:C:}?zb_ V;: vlJb7p1pVԠܷJz2ݝ<06z ⅱ-^ג3gɕɒoGWW\ S 'b} &TF⽚h} *܀$TnbdՑF%{F^Șn1=dh-# l(ZݨZjBLo޲vy:4Nqz>#_IN %ۣWjm(LFX=bϠ"ޗϱ% f_Qgq1sK^epǃDn@ϼD5mQvutQOy S7B9{6 ܹ|5pTYuS#gS1k^V\:6*4It  ArFUV&Lʥɺ9;GS(oO0/z4;9*.2ՉB]0n-xZc?۲N~?aDF[# hnTaYkC Yko:6%zרvICѡMg~#o~w];7}7} }uV|2CzqA*CK]{XUն߼Bܨ+jάe7K7 JK=*=|dG@]tV_3M)RRrf%D(c5dcl7s1{޳!B67a7g(>S:P_(m.ⱇ)ˉ^}Sc nθ m)V$Кޥ{懖^ZWtۚ`PϞ$`ݶ>maDַ:WZ?s4(@]Aӎcnξ5Ed&L<)xI/w)ъNa$:)תXe(W 5f)_¢6Y:z Ki&&SD %#[-JUMD*X5`Xo4W_%T}URLZ}4{ܧ-UճB-  t7-D;m mUnZ̹\oK=si[qKídܯq:zIv0:qNF28p(bs!CwcR G;"v(H[2f_q=BAb.>X$2Vm:F`X~`5qg Gmh%ŝ>N QX$un˺kh C頣v ϭ%k$lέ5^6eap,Յr>y'Sss ,K@|a&s s#0Hzl¡O?̡i9Fu'p(Q 6p61H5':G@-%0gCQ o/<eltqBn:_@?EZFfϬs{vr!9x6p61 z!!O {~F%lcmL z% (lh<0y$&Ɂ7 &t >58`=I@h(1&' ۘ&t>Na^.E;'.Z,qC^|N?5 s-Bfዿ[u4&1vaZX)x\l=Զ|Cim5eޫ.sλ[["0'.޿ȼ_kw{S&m}3[=y7y<0+n2˭^[wyއ϶;3yio9;U[ݣy4y,[vG};|K߼YlN֟iwos}_# ޿tywmo4PxxVЌxi+x\90>EڸTkw[f|w2v}nm]tFk{Kk?oџLx;g7 V#P.m^"NriтLgma˙Jgd5sG>?رyDUSmLt7}e3垇JIA=,6RC+fY,֒$_t7%]#]dt)]Fq`b+TtLxNfVSf{""Ig%_"H, ]"*YI<'Dfr_$G" ZQ"}I84:~ƅ6s-_>~f]݂;O#(MdbrpB-.K[_(ݏ*Mae| Q/l*,*m֝)@&?OR2lI&A2*_&gᵿ;9Z5qurO˥ڭ k7Jʥz&a$EJHyVH׏mKIrP)/]J¼Tϕ%07-8Se=K|פOO>GNI]b%I+J8R[xs t 8 sWOۥ|?db7 }-a xg,K2JgIeyNkU%|& %RI-2w=G7pA]K qz뢫ˑ5Ep˅I[*Neq}KVe%bbwZ7I yx|!bpPE蠥^Qþ `K0n7YKn‹&^v<î.Fy6EWŒ•dA[m[ih E^EQÈObÆA~X:f_| N|}w.rw=HĖkw:/vݪ*W]puTDel0̯ ƗDs)d-YA\vDK .xx**WX]5Qy VԦk"NU6$*\qreWMWۉ OL݊OSwL_*q Wu|y˫B{˖Yxjbk1vy7hiӚ(5Y65& CM!IvXp3&h~] 5 {sP9LlĺcGE/ Cxt^+σYIRfG>e(K>QbaƐUʛ?yYv=#z#]Ul,w/J(ǿ_zlG.ux7V-Q~Gj'q $ YmL3~AO x p 7ĩNÅk'zDL007+.fDy${2 Q\Ɛ{:I/Xn n2 '; A!٬@5UG1jM3%1sb.QchլɇU ZcVDWIPJrTVRٗ+qu &AcbUqV߱ 4/TU{5Dd!W,/68 u3*U˳PBN4Ɗ."J =e:1;)NsBUgjbxYIEtaL/{,(yd!2K5s"EӞ/paӇ}N(Z(JY߽3A p6(|ˊt|Ƚ֒b,i.[džYAu/X;+ցa`Mx[LCl+v1 ."E\]]d:t6w|w&ܽkޥL_`ď2;YCT+3֒L P#wu/ԈP-5r(;nd.yM|v`Gw;nè/Λܤ;NI$n1&=^w$,;q%0!XT4g:A{_7S-`jJRRJ%Ht: 5)wIm^]+m@N據)ym1[=UWFsly9nH&WݤL|Q!-(cz/ ig w!-\rA~ry ׻9á܉`4The}X7nfQ2A&vW[6̍GU\%?6. HLd ?^hIԶ[!}$X V_ʓȃQDDTJ*DOu@}sݝ{fǼܝ;gfwί{}1 ߽4|&n%?2{Fvv5~9`3ݞ#ӯ܊>mЉX=lXctflo o c4:? nz oIѦXӗC>lM6ϭX ,j9ЊP_ne}oLXq_g]e+V9qFYKoj7' K6vT{@fw, pc'^ݫl'k{_d!0|2rD:&)טȪicLuWI?`@"`#?lJS`拃z5VR$ujbeUw 41K;Dp(֞Cͧ=)qM2'(bD9' +rNwdeB-$vi=b/ȤvKf,@x`>/aDUvG/v!D|KOsYIvuL4P2+92 {1;ajVOlC S봈0#GmLXEK+!:Ii5|Ijl+͐e* .P %} lie>f^_nŚy{_œ\(K,twN3͡GBkeͭ4 KŃz( -0gt3[f.`Z`v̷`nhef/!`MIVgtIUC{ Lq0p0bv37zkV0} rz܈ T:A}T>  s2ʛMkt)' C]t높2E3<=PbWJ*B'!8. /Rg}!?mpfXE)zGEszFu݊5a͢&jT0ٹ%ɤo?)D!95v5,1ÑKD*oB.CLPW.%NK61TRVpI2 X+4[9C 4ǘE9wact4` XHa9|!x3yT ߢR'P9s̾Ge =?v{>ۍ=|>{|9Ov4yrϻ2Ouu 9sޝcn_-o͹<<q^p,zg=6rOCb:jտapX@ ` 3 R C?ӳJ=חP7 ktu043c=E0Iֿ[6p<es eE,.zi C kEHǁFV;"qA2珩C[VxtJ!Sh:ei3Ү.:sEW:?sgz8').A"? "EgSO%oD~QII͝0T(CVc3x `jM{5562+.PġLw J)XGG:`dtWYGQ:!XGfQăMfL1L-8"Gf ԂqX# ՂFġByD-͋N,sX ]b墳7觍:>OmN%H3K8CMשk9d&*20A#:P*u`ͨ Ձ 24S :MP^6SѐY$Y{-&Ac2#[ 1̉2FQچ Ŭy53ïS]˟Cfv{&'7?N=]R]Ugmia#VP1T,&ʗw=R@OFqs)yO^`E~0xb7v ^mYϟ90>lTks4*@ Ӧ?~ (W&r zy+(g9P*?u_=@=ĝ@鸥E0O!%.tCZKdW"o_p{YϹKR3މPgPӮ FNA EKf K(3(hJ9vXo7j 0!C`CN OY>T-D)H\ODy>.,1P01>dATLȞ _pfcqfŤ fhz% ɘ=*q,NuHRxnV~~^1Usi #ta|~*ޭ,zx~p$ՕUG7a 0D @HHWݬOֹY)0%}ܛ`d~}rLZ dw@`(=2!Pm~=ZfcKݓV6W}FkSH5;Rޡ;  ( ~HjK-*Ws Hw K}<; L p cp(>922C4/u1/x]ڰ^9a {C ӑNRQwB;d@Z4cn$#La~$ˍ|[vҖ;Id0[6|a[#%.7T2P簹y'_`aևsbN^X ,j1Gnն{=H>BsG7wݢ&O?t[rQmiv `h/Q-cpxt 1nXhG=⽎s`)XpN-͕ZQi഍&r7dB~:Ҕ-O$7!_= 8ժSp$%[>Ȭ ܒ~f,1]\wrOD.$fB5Lg|od2Ch@y|F>رd|<  JyAEub}~ 30Jܝc۝ޕ;q^\ɐRLjMx++RsX2d.b͂>۞MrhNLnUiSk򢦕U@nWplna!NM=uOMz?@L2aeT4շ >G9~Z˫Sdt OŢ-Dυh|Ħ@2fy+KD2pQxGMPL-w[nSױn$MX,$HsuE<͵ʗQ!3 o;U6R5gX_w qw5Q qH&L[.hKz̈́^m9Ts:b.2;]_: <-D)Ce Tu 9#**Kɂ٣^7)cj 5(e}k~NVXY> ƔrpE=*b$'[A%ϫFJBBZ§nAcy{?lSWp ڷrBQjV9q+܃tݣZj^IvX`88oVtIEȐhg,#F{"fںOt\RQH" X0nIMS;ſPYg/hЎghz{ݭ,L.}ZC.S+n9WcOqNjFKd3qK&6
    IR>p*=w1n(o93eAmx<Az;5Z?DGs[\xgJJlTKfz|6/!ݾ\y{+_|̘ KW^M/d &`=O}Ԙ(r2y${<A@gp}yxzK.p5.‰Ba[_k";e]BQƲݞ%U E#ߝ:imuiM]PZ`KKN| 'B%'2ߓsD$_}]V%9r/w+\@6G"ǵ)j $~24B+cO_D]Jhv'GŷgYQ .V3 V=.fx{r z7=!y -oX;SGͭ띴F)\2|๒,tNf63'+Kqcr~Pn,o&.G 2> Lajv`DFd4 DRRPҦw~,BX;,rWZd`6~B?mGQ>4m uLDF.㑊ȕNMJx5VVo]؟oiʳhk88QMYd՝1z%வiu>sc|7 6픔i1憋2>#A1K3<Scs75d9a8xN*[{4 dt1R N#H/ 7.`yOK#{$Dd}`bznX h^$+w L{9}(FxI4Iɨ_GCG}<20Rbhx‹@F:^'8^'e1/kr!"`Ҭà.NHsv]SH@c~_ TZ)X`DJH`R!|CD .ίky>!cW%ȧٻ-0CG%,EC4lKw_R!-f_ڪTEG zG ̳7,9/h*M}qP H읪G/^)Fli3ޔWۭ̌_Ȅ#V{ΝQ ?@'גiCڷbЎaBY}\ ,X|uQ{eX;jKHqWjGj@HXRo"_6HțH#e6H}Ji5nxtF8!zԀ=l!n'sZx;('ECP*%ZL%O!뽿χ҃'XzEGUgRݾdDGֺP#yñrg&5)u4TдFzGe= zn`Fc53FbΌFjfnc5njj35sRT͜dc53ꊚ`O$Ka 6%CA(nOτLAa;}7}1Q{J$2]b̞ʉ}vheYt&{`mn2ޝ.b[s=hN3"g_.K x85Zvd[#~sWJ߅sȭ޿^/sk(CMCf.2YfM\a`H6KmNƥ{֑N6}:3*D¼dKA?C"HN {<[>fѿg[08Ϝ`*JN-z‰rpv- qC,Y>9:_l|kK$o V>=XGnOIϐάE7숻uQR^ƫݎo9[tW}kx6L6yt@X ;EЃ^Tvi\ ʢ-(0)*P|l@YZiXPhej 0\@Р=Papg!mWH6WT<s;DM$*G&t(c[o' 1 0i+`q_pbu:yoCWUhAPR|C սƗVUGO {9Zh0&\ys9KnCvrj-{YcE6hv>5@X쵯G ()ݏa,+D>Xi2|63&p$tr. %vqX{N jޫ,Of34},b SqVrlQN'a`ݯqfr4*x-cgܴ2{<[1>6W{4Y PI 4LiU^`ֲs+* )Lo^Yhyܗh0?qd>-C $͛џQй.&6]ܓNb QEQAZN[` y@[W>O^K{^Xz:["BC*;*e=s E-ͣ"GWJkR<*OެQs?)0XӷzL^jYw -Un gu %@r!ZɈۏb<@S {`Y-nh@{/UUԽ>5߃;@*ZA/ z(A:Uw@}@p'놶,o8 T^B} )b\tG0HMKÁf0;k:Q9"r)^E-Sҫs?ɥAj1xc&ݶ9q22,!qy2''8\׸ljjs8>@PZ.fC+ANvV 6n\<hy/݆@rmm{dW̴"( ZQy@,.8ոq)s{eg}, OΩXM'b&nEjYf Q\"?'G6aINY|l>|mni뤭։Uqzw+w:r鷦p(2HGH/y]AC"s90/dˁ3-@%COS|-PNOpMCZB:6_tqkȾPf%1HcnBgGe@Fil>>@N W؃$ Ǎu:=K |V< N_QO`J/D|wY2TJL ~| ON. zl$R<n)ӯo ~,N頕u(Y<@8YJb{M%>J'}G]BPW`L:%2's)We^ɸ+kgt>)jRMF` wC/@_fwAS iQ : ]Fk" =5:5 Ke/Z|Ƭ-wPDXP&8 _Dgwd950]έMt>2A$g;vܴW;k;5 u$qٮg W)9\Ǐ9`R/?8zaX&AnQvYӥ"W4ayxr6CZnjXg?U!jɠ [VG]J~ ǻP(=mb %=KAmyfXRFw*2Jp i/OB?+YC C.YɊ/0R1!В,JU$6`'A = Jv}fx5,rդ}f,D{H$d & @\wFӕ}LJ] ٝ [I1ܸѭ&z \68wP۹#tZen\D%cj7RWBV5;Ty<߷x,IYBO˦JG豬\й}ױg#UOơ?dI|cz1E2_kxƦmK 7!|yD~U2JAsQ*sk ?F-5CD=W ?c ##>QM/^ԏ{) g6j |q(V& ~nwl;8}qBOzxbML?!kIJL:`WK*2*:uV{ pܸs=JOԲQj'hq6u.xTq@UUl//wbnT'8"NC^9q98ZxŲ\C's9qVt{Z$D{ RCNm :x@JW{Oعv|c'Zo%V]&zTȫzf{z`#2AAQE9{NJ ;וt'$x^P"<-x,s쇎&VSux V6 *Uw$,W*TF s0 qFe1ar@KYB3FZU¿4'z,dR4D.uSifMh+'\wQBȈ8Z&~3.!^~YssDA{3Ѝp"(YfoMEZr墮5!Ţ)R.( 5linKV|v洌hQ-oEvC-/Z.hQU\nQS[.hQ_U_nQ}Y?r; |<$Zc$}"t M,#˶d~#fdfYf t Y%= d,b[r׉fY,u7ϲ[1 Y)dB_#)d,#fon%︘޾Mc喦1,,mSY 1,LU=3L f0`05,,5kTw`ĞMe $6l2xoQ ?.6DfH* q5B] ْ֐P %%%HVbTxU$ l~i݄ l'u ֐x{s3$6o4X@˅ T^$Vx&  H(T/7/|bCkH|] 5 $` PcxrHP $R$: HX .7ZNo ͐x{K $Zo *#3xkw6CDg &?aQkHj@ $?2+T#Xim!, ( ! HYgT W\-ֵıfHs $3PT(xXH<$b$ή5iQQ'imkHL Zk $* 1] KD*' Q $hTW ֐h|]l$*##xDfH_c k $\cTC?5!OD$#*z*> FD`1LDw!o!ydԯ63fFުՆXjxk?!B _`z~!d!XKrn5Y 5^-3j0mS߯2bqL¥ ÷5 y#735 ƫj y`d^!MB>4W4'18!>008|` ExF! i^cp1_ɬ yyYf: y]B Kkc23;yB84?3ajx[f C`|/E!oP1xZ >dl^φ H#F":5\QԣEʅ.>uEmbQkErzEmrrQ]EqEbQWEdEGjAѢ<]ٮ-kr-꽖z#ZŻ/=,~f\:+;<SlnZ?T*نݸ 'xqJ "ݹ[bާh3h^(a Dzzt*S ^dS >[HC4Xܻ M!X]DDV-EZdHfK!E2n;Ƣc^,yPK ,>_B|HS\7Qxߙlm_ YœeOW?!>œMmA2 3h~\jAJ!~0櫅3h0担  3h+{4 3h"wf" 3h^rABC 4MC0ceB79RשK{ǿi7MT>TdNz%^b0xW\Fs Vԉ0j{kgX< 1FӣB#BBB7ZGYc~_s[cHIx ƯZٷru̖ hFPK &F_7!~Oq҆(p8xމ+9zAt!C(+⻮4OE(M])8Ȁf,~{j3'WFN}y =kiIfDӏS(kB pkƸt8_O B5cW4WDŽ-}X7}4 ^5 ףLVVqYcjkr^6uA#~) :qIW:ҠKbWCVsFi?4/032꽯XFW$Pz[O0幢Ā[7\dxY۷G]MdNkyx 5)A]xԤgLMDgc}xD/Ww^*!3!Y/-hwggu{,wnni\HTy-gw8Zw\_UP4oO' d|IQdڄȡ{ J"2P~Db*ƤȬ'!?4?G 舘yE V:zZ0y n wИ v [v@lF柗JpR/+GꖲC^YraK0G;0O@Ob1R;菿o-e.ϝc ?bo~K/&< <ܖ70yy7p'ƶcaG y [Y<<+X=Ky82yپqÉw-xB{0x(p+w7x$Gy8x\^^/'ӭ;xᇑ~W48 <|R|X WZ<\B[<<<ÿ3<4\>:|>x/p  xx/p/guiX4K9D_ȥ={7c8 {y-1 eSxsqoY s{B)_T =xW!KJ>~hn4ҎfmZ9^V|b_4 ~? ? lH1Of@I5 ;۟_ !'R[f^!tjT8SvDOV}-~&Bq¶<(l -!EAOA9-C4Ö()-`k'$ &@*s4ER-]^?UZ?xwDz/xlj MG%ܑG=~o'+'w*;Ă[6mjڼ5O.4j"Ed7[J~Cn H},hl'( bهCKԝ\Gf)V_boK3I Ϸ>AĴ\ aL,홉*@DB%&"]a4;ؙ3𣻳s=sϽ3#:Q'jzߝ7C^LSg_^.DWRQ\Lfb{p&SbyK>ax{^|=1y^F->}k&'ÂswSx$jyo._չv`ǽ[y ?`^!{>^1rL]أMc;l[Z%3/TD5/Y~''u@wێ9|O5Z^sFw} Cy;^ۼzktެO S0*l؊6U5i]<njv?:WCޔД]mT/0xȒuv?ve_MgcVtkկ=0gc%Fz{9>=K[R'$Efط{o2l~opF^,OJVIb0aO&2zG%6hiʸ`F}42>:ŊΥ~ޫi{FScS$SSSSU)ic'z:Ҧ#*1ݱIqtb:kJZbzb IcSRCt))d=(k0)1-ݗ~wE,mE9 1 p\ PJ3l"kqGp,>S8u/<|lTGA&+%Eb5s]jrgVo\K{gR.8LȥXŠ,؟ͅ_U=ҏlc?WJMW Z,U\X__v6O8J%\<؞|9||2 vsj8yv2yIvX^?;+I(/d,oV^V^2ydiBb+Y˫]_D&o"Xc+d+M(Ϙ ʛ&Z -f+WS"svrv\%dKa gv B.A%rل\!WKi?#" ïz3S/% \! 92֫ɛFr5\r2.K'J9!]A.0rVBAȕrBN9g ,\&!WDȹ9j%'̄\!KȕruwttW  "}_6n](U% (+jpiO8x ]):=/mG1U^qTK8iz7TzmׂoO8S+ox0@Na1g1)vD oq,Fkدvȁt3x8~4~0l(Uc[B?-W?k{ 93*PwP>^#Tc(%9>i%K_O*_],N|BОF◙@{ [rN0Y(+ԣq_b9*Q߬|B[-LWAr5 RJy~g*T\h+J2 _j|9y3 >ti%c z cZI@CqRK-tXnΫ@:22(Y0} X-Gˏ4y-_a!ħ"K0^u?q(39jnuخ賄-q: Z:Z'3k2WXWXu|BOʷӎ9/Ӳu&Gh пD^Ωpw\B0MTW_O/@ԀֿAh{B9~t=G֫k&.?5]E /ƹ*ܟg׿|][Sєaai^ŭ> p%)Z?<(σ4v+7[?=? 'm=1ˇ$/υ?#ͽinN{b8exCB?4Q ך4x}xД >a6li[ y[*Z@eR=%o7(^^}G"eCZW7yT<^C*D}EWHS% zĂXhzĝ牐NlϏ봟qmW!g|<hJL=ŷEA~^pFy<WTT.G2ӝ`_2mlSgx'ޮzoE!P,&'MvweK5ˈX׼'PrG9`o>-J9k!,r]~ 7ME9P-<'x]98Ѣ><;urCw(/>8_u* mz& s"Wh|*#eg}CʌZ LJURXe-g~JY 6`o\]T^5-斘u|o+M )70\+|VQ z2_R֛k3H|vY~=$?7Ў3 Cu3 P!2P$в ^'3K:Pg҅ъE>^u~U/8OPe\=e3֕nlO ||\4[ Gr|YL45`-zX&&Py=c {l:I]l%OcXtj0\WK`_Q+Su'ʯ+\H׿7׿Lg},nqB+}?q<7cG@܏#2{8;Ѡ0T/JMXTw`ҲOӲyoԠ\[綞Oݪ![)I\7׏|#H=-e;9!2:}iԳBOPNC#psLZ-LP2hBUPUd@A-@$9D &+1$5CD"QP$ ,m޾WA@Lr{w?_i^r!~qq=z)fN;b<Vz2Ҟl8s _,?-Vwx1tJj~;?z>!5 FySu@+&,pzX>u68c|-ޏy8|U؏Jrg(?hn(ʳ3p_0ϥwS;<|f3Ϧߜ%QުR-2yj5I~<%3gN'W0O~Ot>k'\ye":繨wNht¼4ԇ@\}EY2]=}M zJxI^J0ϤE9MC/m3qc@m4>z:?}. Ϻ w {e% Ge]Q8/gG\ǘ3 5| %?x⺋[CM=pc̓Y>?5UhNuU7yu?*W]G4f \7CK=m[uw%ye3lc|XvG,>mX6زDj$Mi#n4ӤUڨB5dBgLDM 64=WzG~:u*E3;;s=ܫV} C-/Ge5xh=)C^k/lzٷo?(oT?PXN:$]Z8]M%"Qr&4\ W{$Ov5?@Siz0NZ?͗h.W}7=$>Ag´ߚ<'1L'|>jvP yVK($\i׏e݌:k^e&q;rf-|>{~jJg<j+EgzDbcw-W4_oCkDk\!u}rq;qPzQaH/_Cj~8\Bą:Gj]RuydG wnM?v?8' k~kG6>+R^m荨+ׄtPz)9‚e+:߇1 ~n:CcGcT|} t?v+_|w4?yB+T7Je%.X/w9}4ه+1]xa\nir:?S;X7kIK${_(ϛ=VG4=v$p 8N+jSB*) 5>IG!c|+UE?#~)[^M?Ne?C/URZx#Iz4G?GfqK|(Cc4oD|7„fZ`~(Zgj¼bz:B'#nyyi u&67Y7*wky ^)?% o),Pñyw0!.HGHe,Kgaih>*D8Pϯe'rv2Ӑ_W灒r7Kh=k$DYQ~ΏfhStN?)oPgʚx68>VydNTaQ ֋@'\Qᷠ^Jt|Y20PqW^v y_@ÿ1}~E3b|'Jj=~k}R7`ͺ+&q7-B_MWtIK iPD7Vymq_6\ĿI`*{ӝwq@GW<)_rbMsD%{xVC|vujݡ~>!-aQݡ֓0C}P&]!aNuu3墟-/o˗bWm!#Ͽz[ ?wiźxw$ <=yS$~ڒ5ρoP8v(зK '7vX% 1=D~s@Ƹ@48X*u#p=/?V ܭ_I|G7ݪ)9oy~?t.o&g:6o;#^.  ܟ,5v_Jnyt U~ۛx<~WﳦqO U1mW=DNݠcz4U \N^/wb8ZpAQ}U"}>!l*k;{ۄs¿k>H.A;x-"^]=Wb+9+ s=0=_ϺKn ދ(})yIm{I,a[n'lX">6H--ؔjw8\m;=?'!>WK4MO5!8-o[߇qNeT`ԣCzz sh/faHμ+vF횩k]gr4 : /# F}ehUh-G?Nڤ\|U.H#rfp@bj _S7B|X޿$0JV9&SO}aZhoe׈{D~* zϏyyOн\֦ ow!?0 ?V9κn~Of?7 $[i;ڻQkÁ_϶N05|u|O '*t,j߲^HX %B?p_M.n\6n~a]>`snK2Agrt๋s9^:R$]OJh |vwQƹ;;y{%u'.k~Can՝V_qqb>ţ6{"\haM*ld6{{cٙװ0nY7=9C> 8{z)t4O>rEzEg7Mp::YENaKߣA5#+r{L\9;yMx= pa p= k65Y?1_KqKpXߧ9י՜'՜Syp*; 'G 8:dc4>ȿy e>/E:|^128}^cy>q!ݦ=שdmT!`˹TڻA!\꠺vnW2_iM[v!~:Fk|7yoίmy'z3{]_D9f"aMǁԃ#M߼oGz cFr^4^#2f:?5dm_1Ub~  k!}q]+hyC>eG5|U%>Gi|пOkA+T-(_. %{y#4C11 x5t@n[uGW{ Q_zEbX'x%՘;/yNjަ"MI;qX>'ug?~;=Y>I'> ;b1)}o'd$_>fk'4=Rodžh>9_M{ /ԜCSK_){< ΁]9 鏦ǧqNӮN u|=mufv7SZS~z Ư\uU7'=::M*fs_g ?eqJesr}U!xߣ|_3>Ab}k$uWqZ:Wn}O'c}^*c_iEk>9d3m/hdts8Z?$r%^5|p,msUЫ6vp )G[ۖ_ޡd 1Ge|4}mv߆vd\'r=Qz.9AW[BO| e/s7V.KD|/\[qy}@5ϫ8?!~b@u\t"/\Py%]t+vI;xOҿ5ߥ ~+\J_t~Ѿ(ĽdG()_>V O}^s/iNh&xssz^=Kj~ |uEE_2/y_܅TkQI xY7^'w9&UD%ZdOuY^w} ="I9.<#?rIΗAzg4_X|_ai_vعu`O8}l'++Q6>g}ذ w޳Wc5ko\/y.0{k |nM8x!u*76R3<\)WJo5wo{5w4p7ċ0to̯wTpt'Nt{ႃSʹL7q;ӝ8qܼ/%1ʇ+CK|] XUU=y\ pAT@Q@ "oI,iIJ NX>h|dJQM:b9ɔNTV|k5ùw>[^{_{}A18) .JAJYJxbnq,np籋CN$#b$ İ91$Piq[DZPN3WNmjm3$cd5}у1G# ٘H1JDZMƿG]0w8O%j Ǹ6b*͘2YSHƸCX/r$ 15H̯5ZkqJ0:y/90NOKCǾcw Ix5W)~႟-awfw#!~<ϳBCg^vjqVax/nEzAD/˴<](13mPE|b.tvRhRwQ'qd4/%I; oҳ^T:(厊wF)Z핡-Jz; Q ~bxOyUw-eJEZodx/%hCIB χkgrh1r_ į'?dW26PfÃICU68ƪ<&dڹAl`L]$9YY[尟p~٨#CMs??w2X˜Rp*+sإϝEmwM8ƭDޗbÐhg:Bƴmj\sHw uo"D0D*rc~x?k&sڶW/k_)eGQܳ}-7\˦;O"wwʾOf-\0*yM Y6*%m԰ (s',6[L|(.ޖ{ܶ8%;\53q3ΖAnˊ-%6`O3cb֩>X쨘$>J92^0#to&w7 Q~}4{Ag?g>?^  ({$2 l0 ,Ŕ,ŸQ&kV8v#m܋1(֟Ym#cnꆡL|8S:o(~}qWl0|,?IO_y?1b1Cub } ' c|1w'k([}m_L5y;%:3?\ I࿙3y;`ˋhsț+e ^S^2["5^K>EIxo3yāw1Ζg: J>G$ ^-y}[^ѿM^O$o,x9zss㏼睚{~)PnMaۯºND1U[ T>hTcX[3JJ=dzG'79PG ׬$=Z t=N|]E#v38" Eu!ws'~y SG2:o<6Mϊim4v]Z]?]M15%^ `z~0t7!u0qNt-%~" 'QϦAi躙:q,n^36C u}uVׇ kfu Beě!ﷃA ]CqfX33uJ3tBی5CsfG̈CS_]gYG@꼗oy<5Oߦud~G{?$> .-=fBׇ| tJ|(%azqnp~)_B]{S+]SlY@;hW:fVuyе֟:e[3ATt+5A &g=4AWL.+-(Ʊ?ٿyu[-:z]}W}hC9Md~Vu&_苚n~Q~C#C~еt;e`ڛ8a9KWU?ԵX麄>uzWI{V~Ǹ2PGL'%^6] ]Bh/t]>FMpdkuECZ}B3г hru9y ً:zf)* ^{t؋/ l}ӽ ]/_F1oG/d(ѵvqVRsm!%K:u!O聚[@ޟy@;\{B Oquq'OyB ȹe[}|'Įߗ_Yp]YO<q]ye{rnEhr'p=c{,W tE[L6pOɹ|eqp7ܝw9Ipo6r{pw۲a9dno-o#Zq7>[Fn7Kp]síhrL 5-p~goŲbXc!Z~wm?j;mEZnnxX~c6#+m?Rct6ڸfKZK_ f0'_ĥ`W$^'qݑ><Ʊq%8>s^cŒXwnm|gKU?ߢ2Nih9 a ͥKUeXӞV}> X|W6nũ#i'DX5%OӮg+;UNAc"7ŽTǣ7E1j&e8|ah>Jkmg}bo_-w~?#V}8fg5r5y<}ėd] ΜN º ,(M%na=X~:C|sI>7x~m鶜xغ ʂg)pp)U_ I"-:۵@UYmac"ݨad]kP={QFyXqPý"ct|gk*,|u<1q{!_67oϹZs AG2;AՏ{MR=`^&]6 5IG(MI/ j_i.Yw;Ap"}`.7JAwҾHOzd!Z$ϺIoe1=ik2[S..B.mEƫkAcB1AHOԯ?Dzr1C)ƹIaE!^#=DhmGU%H_]דvpbۼcσ*φ>}V=_x~с%I/yλ|ƳH,w &+.gݫEIʿBl.ox)Rс|gS@~3;%x+Cȧ|>g_.%MAȗ| qDR{R~d'D~*gA>˻r?Q>"Ӝxg=]>]>Ov ?EucXyV%.ܓdH̓%~SOA%v&{CH}30+ =m$wa dx>u#ҧ!T̽F^3Az\MZZբ//O}…-OY"B?w!YP"ї \~ A=6 G u۽( iA'fAF[3󺂺M 1?,}`>Ni yJCu_u>G b۳0XUU@R}0TF|%Ywבw[AV$9):H>CƩ3 ;7}Rm$˔2Mt VOt;fXx-̀/e$=n9c\U{rCsQޑ)5N;P?O5o3k5σ2F$u5HkUе18K~413YbfneڜqSIXxYI%kH%r/is/O61"iUe㶉yIx9iyMC'm7"^Yxy7#j/_xo?_xY\x"o"^ΩE"yoW![5dWÖa;a1LϮfޗvk䢳vFs<'@9٭鑕ҳjY2{g#Ϛйi6t?{p~uDg\0yυΑss\W)xg)k߷<'Cr\b9R2XXleQ#gAY,,|stΞgy֙":h::qo<=<3!Ld&t }TLb9oR2??VžNtTAKUK5ʳ:љAH}:++s~%?^J̥6̓m.,/R>K9>yNїzӗҗӗ)TO|U9u^w}FEb b2>lg8x=yƓP>LgzK̯Ӌ?-'1<:ufW@g~tV@\/N#cD* {(>kf7L57{+ҫi&{H~N;l?WC˫yj;׬v[Kʏ}+?ճĦXtIoNĊ|X c@{ŭ@ ]A{(Zc yඥ|u AW2 EO*[U& W10e;b^ɷ ?#?{/~3o*[䷈|H_?zoy78@Q>ƪB8Kq< fǪxG +c/Iz"|vD7! "ާrYܧg? !Ye͔k64p,kK"UGϰEyv u TrE-¯-VJ'gؗ;\"{Ҝ_@v-]'g~(mwo.&򑇑~Gh xwlj[1d9<<% 'zW;?D/,b%[ {ŷ^.me7F86Cn{y-^GWKpE#xg>AI|_jhLsq$9C|hA_^vv^!=_OZH{/_\v?E}7 _{߻<)vF;keC67#o!E~s/e,Hiɟ^#eKglˈYlズMuSވk.$.Ol}7o︓؄~g4~G-*<#XK_)|tHCӖe SA,8/X{(")!> ʲMŕf_[k2#}.ڼsB;**` Nh^( a*vwX1y uQdȿE/8*}*lUؾJ ;B&^pߔcRͰ2=$,¹+|e0bEc&Y-L^@"2tv0606'xX}N{2}E:,jO/&}x- k)X[(] N 3.k!nߛKa4DWp2sW>icxq,@Bfv,F[Uhz2~I Y[cf4dK ݇IOAE1 1}zg:uZ7ɤ'-[՞) 'Fq~>1Es1^ao9o6YEZc~8ᐽ5iOD@?9}V.үø^8Enq-e,H5$ t mV"%:a)ҖݶI+=2 V=G4E5D0B-9"}mSx{^{6{w#m\iwnRW%ό^l|>ewZTcpr`\=+1سb|jo2-w]𽶏[|[V}\;A< ŨS^1TEbĬ6-Iߓa~SjM\_5um]k,z\d~ uyW[PMPW&WQ?m2;+Jǎs"UdĢn \NO SA3u}lÒxgV!MA \xUkWKYVӶo7$?[0/lF_՗s~{lr?|bKG gq~s@wKk@?H%e~CƤwV/Z9o.yDu%)# B:+ԇ ӆW!+˽[ڿYb}QҶ^Wwc/N¶0hMo>Ta[[d>.m=khh/L ȷҟ%@ߢhEo`#mc 1MK / OOŏnOr?'ܷʽH?KEϤM7 y FHOY%agg l\_ wɆ02SzDZlOϳ:)8}NvBI}zzyW9}@zi»$Nߥ7xuy2\ot$gwףNߴ{g1eǍۡ]]lOrzQ_>ZeٟvΟ\RktWƴ ߤ1azazc{5X_%cϬ+S7f.]g6?|޹oٌC^+oc~/>1i.o/ߘ=\]|4ہkīDKqηtuvkmGɸvkx߅X%SzU5NQKZyW&z7^bUm^[ޢp ӸM^tv¼o##fE5Ľ#sD0O( b>ep9[3]{UիꪞnyMחm\7 7?7OP<⦳mm{snM?'4㦗. nAvi7nM7n䦧l[P,=ܣ&kL-bz{8RNΑjZ;,W%9FZ:i*l2;n6a{t3fS2TJOVAE.ؖCk6qMT%^Ȣ>%T/K8FuiΔ2"rS,Hih3ʨ 5V]}BOn]|ߜ^fLpC9j;e>lf$ >Y06_" x Mo )DQI`!L-?~e>~h z!/`!/zMƒ c>@y<@¼>̇{>/l>Q9Oܶٲ6"{|"i QM͈ AZx4OAG~>[~,z45y}!zs߇S߁ })Hn EMO#zax_.B ;'Cg9~a센< y@iǀv<t;a!d5H^رLrߞE-m`%^Iض7$6@-^%!.C??'},;^Îm?Eqr! rL<;7o^3N:vwot魯Xo"sa ?<)?U3?7n|?}r|ў#fgh |Ovo^\_H 3XMh# S 6;O-p+(Ga x9:L@,"h4p"0 n%a*ps#K\0 x80.n=>Lp0 |:p ` 8T ] ap=0k`iK hw`a:>;#Lem`J f X}V,0>R.MaZ \$pH3t>jZ¤[/Xli S'pp;Xځ:xNƁǁū \[ }x8eہ ;\  ߉z6¤[$z."}sl/1 ~ ;QBZDС#H:E:ЗX:D:NL5ꨞ)NsNgJ:΢F(c.jjEL8NI]Mkzii:qWIHaJP0ǧQD*yҤ!dhѦ ZG4EEb/%NeA7 i]C_u-6} t#mfm[VkJߧovѝtMнtmǴ!AO?#(=F;q ҿ3z~NOo~A/YwzW"D{e5Bo5zޠh/'ޤmzޥ}>cH`"RtW"v&;KŇRwJxʗ4DĴPLhq7McM$Cfkb'ZIdyض,%XeEldʝBjX "Osc|U k9mUWM)٩[YV5_U B(_m]~59+UWjo޴7ڪ)|QIӳ 5,ICJ:%%wu圦scջ"0R7Ut` ̴cN;ՙ}>ʗg&jV!/"f‡OgRk_v٩TnըjY( R9ث:0+LccɢfZwM5 xbzlRӾ+ g-W]R3P\5ҤZҬZX 1,S33-ݢBI/3<-B"HUNIʲeb51eB )i <^I,STn֮7۳NC/w*ggRϔ.ͼ6*Z*$vd#!Ӡ(h$+V}]InGA%=ښ*+2*+P^k(ɊKX[>LZT^T6F#59o"ᙜHxS%\~P7mPZ͢grjĺHT(mͶ+0 !V-CG%38iWpHycjo@jƼFMe ɷ*Bb ؂SH >*sl{f4HQ5F31]"WߙmCb3) :G5Qunw6܁?!xc ߢYƔ{![O- 8L"ؽg%u3JLƊ k(L@*DYb$.QgyY%k<׍*1CB|q|QM`҈!Gm&jz5gh=CZgWk5׫FEIώC%lq0 wF>:RmSQfE C!X\VvŢ+;@/x6.(`odrk=x9l枔+4)q[FY^<\=iX v]Pn#޾xg,g?^^'i;:҆"f= I M?yb.OL1Ǣz4bC%v *śIgx#YVfD]EVcJ/˦oB}ZuOV_umS1o[]jܞ>+eh7T@k^8_N!g+ UWryxu < U3ǞAL,7ɫ7vsو O8Ȕ܃.f(ʰ*ya>l1g B&g@44}c0Ukle<3,)"jCcZTyz>3D6JHTɒ[rܮ`k_cۼ:\\UHu5ڋ*zjq" ";Z$#k&!BKxI9^BOTǝsK_S!9aT^i ιmA"loM`QFIX^,!J J\Sf" SFA2o1-L]<+ ѻN>swV;Oѷ:[sL1t&ϘT3{;o7H. "P Py= F /_"`1UkVV"@0U!C*߅P{ ^)x%қN"zόQ+#cpÎ15 ـ֟<!1yW9sZN+$v?:8?zMN=:0{}v~ݟ|Ygː!mfCOoo|;b#{v\lúQd5OlO3?Ng ~N}?q>|ބlmG9}u+h^;#e".[쐒}մe~I.þ9H@~#/QU2·u7-^RƵ븢㾎koy>!!~(?^lOn N0]~z<7ٟ7 8z.̻uq|7<Ұ氟7?ω+&xB @HIJyg鷴a z^rUi;|>} |5ќFFD?Z9@8,0qVOj$?FB<4DϗvK3pˣиyU6onXH|6s /.rB4>}'wØ#󨝭gN@<8fhF->}/Ѿ!^aY;[cx}=9iϖi} #*F' yW nwۭ-gkYzˋ|4)N>C?..ǏG|-N0 8bxV7x\kAhNu]z@ S_5#Fg񽴯A |y.}nWPpdnjRĒQ[VbxZ>s"^m:?6@%SpÅslФ3%|P<ޮ ;jF5sKz|7Rcu84έ]xˊ~ ~x'ԏt"o*gn Ϸkzm՘bD=挪qgUo%Q?&z蘚OOXc|tÀ?={' v>{6D_~ xW<3oϦǛpo*;볂>0">Mk|ˈ\#V7Q_4!6 /O^}ӳ/4CK]p\y b(ԀTzD3FNGϖl֝t?,ҁX!* JֲduЃ ,a*FTPQ{~O;$S׿ݷoo}W]}.o|溂oYaoPޔ L]#X^MyYb)EC~L~;8V>' 5(, od<]@?Z;Ҕ[8S|~zNbEx́7@55\n,n{&;,o>`lmxSkߡ+E~, LU~ջIM&'j͞/EQP%>c0}Q'Y1\TP+S|FY#w-7Ji| Nr˧S f>Oh~X{_JIq eDC MI/&`_Ո89AB[/zKb= ǩq?EibQIN;rE14ZnJ㾖6w,zy1m3D enOr}3 /=t^Lv\E'|}+oQ*,7͒O#Kmz59>64)V%l徕 ywsľյivB ,6=ʟW:5'0BVrkb|ugP>[?um Ǖ)ʡq/dG=6(F'؛ו+U٠f?/ka&I}=-mzm`'ڤTI4\Oܞ6I^\Arž|Siu7(q^I⼒ȏ<Z+lG6,:IYԧeZ YB>_C>iWGnWoCv- 21Gͩ&?|B^)먆G8y_8__6φFE?כ-#;Cr~Ϡ*wPߘb;a*/6hz }(W54 렝~9g-X.X ݠ\\/X'(_;GqN;'>8ڥ?7Aqs0idor_,z7zYr'lol[v$ίQRlWzv7]t@<]sb?V7 |}rE}v9|E# 1]G|uo__;YHC0X-+ccoQq$̇ռL-xUJyʠXtd)GCN~e2'ywf}br8]L>LOax0&ZyJa77R9W󿖠p\O7;1zHM=i_{%ZG Vu ^X VBGf_J [SOiLg,䋩O%:o\ߞiq:9syr}Ex M)~|b|ʥ<5O r=V.?ٽOן/!ߝлD=$Q-&?l2Aԃn8y;iO$$Ďv+oW%BΟ'u礥PqK#8~FWE'@_qxbxޱD+ȉԫ_W\{=ę}Ou+MV*r g&?mWܫVvaXV+ozHL#i"1?kӞ3Щ#W+joF{ש)^_K} )z(vTm򥰾.):sv;~pn^ ]?go^;UV9xSm}XC<`uAWs6p'9rtqGŽ5U+C+eMĪy 3Ll!Mlx۬V9Y3rg5[`SSaA OTqQ/&[-IHӭj?}0yyZX_W-nGzlmSe}]]R>)1X$X.os*~~g}2>B Vc*׶iE}8ȯWZ]MU(~+o6__SVr[9cojӪȟ 7׀C-ۈiRUQ.Hap\j0OCETVD >#lSK`XV㯫և`2㯣QAG038I?)&9YkGCgxEKstb )_4^PBJZ{xN=U3VZԇZX Ry2 'x?KQ+M߀bgE}`JThVS<V ݨV]NlE_;i7h*L㖒_+jW̸˪ST H{㴫#uV}j~MԝO8IqiTtCsKǦ}'&_\rAG1b+qؑ+jõP Xg!)(667W[ 5 ]f/P4~%_|4v~w}%s!ǕK[UOU)?a~^y-qy+{ve|N;^Nҙ*_nk+F8ظrei+k6'b%FMMZr?B8:&t&A6|aK=07OhȧE( ܌І|ʀ^6 y{[u|qbs,*_ 𾎏#ߏ_f!Й 4mQ~/pb?|kK^]ri9l~VFH;\~za>| |!(\yK@ǥeoz!\,50p_nqqt>dxCO\. \Z.A7vgiUn<ӥ_C8zx"= @}tpOQfQkD{P zg1ԥuD zxU>(. WC]F@ZW,ѿE0 !Z״_ -x*B!οDz )N?@2Ej5BlsK@ch?^]qiנ~@ǀc<t&u?Y VgסA,Ӵ>^(u.VAVkVCp1Q,9v-tYE= `~X"`z])*u<٤#hHߊw `xU0Z7hQ~:F(c3ؿ8pa?Ҁq ZP1W\q TluEcYqa1hACÃ8BA8ca5h23ٴ]qd<; >/!NۄV4 y 6"$gDN[}"1zw>ϋ֞~^\KP']B#-Iy'G~}Ͽ^2 ^O!@ < 3sa%]m6x0nsh#shz|C;ghA;A~ z-_HSQ᦭Zda!˨l2+if,$P 2ł$-WLYQ2Çd" >KC v×˙;wx B _JVx\ w)xX, ?1|6*gaC+7ā'Uq>$i \Zwo¼¹ƛ漂C=Ӭm[J}2~NrY&s nѪ:}Yθ8`V“yuHZe&XpsԪl=WQQ t `]ss0?G}y6lg\'1\8F0OзS% n0J¸0Gpau-apaVeJŭ$ 2.t1pȞz=ƅ  ƅ)ۅ l6V6.]?b\vaqFŒž&Bu̸0NcLfGų0x6ϒKx6ݸ~j1m0xB,\۪<^ '}<;O? ֵ1w~&GMXWx)״³R 'iO>H3 ;Xc<7U:)D,U}ăGZ?{ O~S}?fz(xmK΀cdzx'=ĴnU6E3Lv)q+s%^ Vp#LkU+Ep6Gm,8QFE7):^zpwP>|>/SB~|'^fv=SN |]^f L2w=߂u 9OVEX )vbQ'唧p-C0S?2)$Xaɻ`f< ڊx\$"E%1v>؁Myqŵ|F^,I`3,Epck_i)o#BF $2_M΂Fnşc+佘/?F_4cp\?؇:[^@> \- [[h5+S.p0B\g~B\h?w0~KǽBׂ =|kA7h'p Mn@@2ȃuЇ(c?17~\S_+A )`;nεc+8^,lYP9[9Vx#eعR?vnܟi EM+~<ܟ -} ^r 9#E(s9.~0G| ??p'y;GǑ0g_کkg׭\xGF}pl:48/b?ΑZV0Px@=FpdHdԑz.Eׂ6mBv.-X/.dXT|h+31] ޮjg{R?}Bӗw0##s5a,WrDĜNy2tl#{XU .U4QX=*9yGRG013L`cM9rVFѵ`Hh>GeĮ; < N^`kk(Jsda 2@qEU&Ĭ -Q[yM 6!^fZєeiɰP.Vrp+,:)㊦s=lS4 /eR4]qД)r/eAB[&)id' \O~ 'wE0Op/}L>xc[1;y2~+g#\uSѭňgy |V̓%K0fPҿ7a=?ib<'GìqV`~DєTc\)){yMȋMy6e(Gdr&LDʕkM2S#l)41ES]se@єw,/2+Ul|1qv!P~6cce>+2x:9 E7qs(囊ԮGb~\G`V L-#f땼 ޸AGμμμA_q8YY*B׏˄d!7Psd>>9է'طrr;SQ)ߋ:3zԐ:ՐZ5בUd ʼ!4}dB,CMh2|Z)=5@kz*\C'^}@ڳaskPTu&`Q,aYBJZ]._oZHR2õ֡SרŸII*Y j*ԴlϪ&r x\fe.N"FBz:\C܃vV';G򙴿lĊZ 㪽ILT e2m=xFIꇴ7+%kU]r11-F5 65AN 8d\ u-TRב<8l9>Q񄌓eܓulJuaM)ٗe|Y_W~wsGH*d#H1B.JҜ]B~QE4@Ehb^,EM$Gztl>s ~~|n)??/~]0,kgpĀH@[@ꃆ1h +A) 6L0Bl : iCPeHBJCP& BVI %dL]JI& •a!¶NJ30*KFFbt*BuEQ1*ESh:fh>ZmQĴ1]2&1C3,1)5ұL,Bk:kxe\ㆸ1n㖸5n㎸3b\t<& Sœ$ [žp$ uR&uʤ' IcҔ4'-IkҖ'Igҕt'ŤL%d&Md!YL%D":ψjxMĔ,Ō-sWo?R4>ONzΑѫ4~/~C\IDD]2"D jWč#!4#tzx1j5jڣS^;&{|>x1' uB&tʄ' %LDs" >r|(&}d`SsxЈZQ'V" EhF."JCt.e<풩7w2*Wzg,.X{υA'VM$Uwª!yzKԭ_SWΥ `ekꪫF 葳\pVfYg[~_}%s~Ȏ?^[XLf ,LLކW W(lm0|ռM ڋ).4VgX1C\q6XQA~S96vJ0?lWZX2fyn_e}uwޥ2iĪɣ>@|—ۍmO:܆+t㟙vx"EՆ=MdaYESu _Fnd$Zzr2Dm6ӥnUb+g- 'x͉l&k{}dlg1y ]YL>tEsGoV컼)MU} Np>'mcԤ<g864?c`ŭf| 0 :A$oE "'EZG[g+aeBR I#m+՟"Xm5bMI2*WyAj8عZD2>+bޢt:.y1vwJ,+d=ݝl{Y%ÔEiy Hè:w1w<+%VC=ivj[(j!s! _P5.ô#jg̢ h3,O~.? U[+ P}2ZbK{k$d,B{N( 'WB)}'fQo"LŠb`ĿFK,WY*P蜀Teʅ[`urh'aP @(*ѿUlW+r=s;2eE5̇2Omw c>/t/2w_iɝM$aРjs(I0CFィrU1"Dzgڭ{u7T1*pJ4{6E{  7BC8ܯByGg290V,KX:%1#nwTA?>ݏ ;[kۣw]K8lݼQ P(D@)oEQt50# &Ŕ^Uq!I"%q |ě ]:hVgzCu+mD5x*`0Ou*:pS#)6$ʂ**C"t2*qÈp~ KxtBSh07@KgQqhHHHH2HR?^1TR5ixc`0 hedJHupv0#T:6SM#9i d ,"_IZmױPi냉y2%_^,rCr|5xUk ufjl{W+KwNپK|=N0a#rl)=Ib1dt|zr0ˁ:B73>7@Pb|Iۄ3 j9Pk]bc]aDXNz3iǡv ޔYH~ =5x2dICBCb߫_Ԇ |y/r\<~y?F 3VL*rPL7̶ݹY3N~_ 'J'D)J:4`Awa)  5y-ٛw7Ps_[y̤+׋w\5{'jܕlc!}lvz `Mn]47sP ٩螔bt5g\u2U;K׫gs j\Xˣ7= p5Ʋg=*hu" 9cך[T\x_͔5Y^u1< 7ȯ;ȋ^gtb'%-HJ*W vaK&S Q9e$qOV69%cvauYpVL}&!pdDc *qoG GR!h `;svpY,-} RpO`|d"£11J4Di3NSlO9[tuvJBᔐxЎUD ?p\VUT%yc+d]1A_!14P) _0}pQ8]] ~(n;zRjY4xb{koor_Ygz_ = C iq/(D\п4",{Bu-̛b:؆n.}gZ!zΤ+g )QuD(PP^tbsQH^,ufwE(3>6 2+9Ԓ.. ~zV4rbtPa'* #>_vQt/jO׋""[xWuj8T "oS0>Hq1Pc@"$>䩩(!8oH֥8'Et7R=\0,tNpf}Q3[JΊ1_`X ͞` #*Ufoi-ƀܐӨW eHU1Aȷfl^Ϻ<ʆ&  cCa;r˶Nή4 Бckv^ xܟ^wL"MC\3dh+-߶9E" nnmevs*Cibjv~\1s7]Xϸ2ۣt5[r:/rArF]z2(C4|bĠXe_,̃ȧd(s!AR-Cશ<#o#GsC[G?RNox֐]]=w&Fdv̶\_j,_a&)$X՘nO-n0=Th!B~HV`5FJ$Cxw!WyM"9C~5/ReQe\$HBdThWx-kĺ+”Yc }qUT?Ɠq~994%t05z'.1]p)Yf, 4҉C>VFޕM]9Eu=a22rlPOc󫯑I| J%}ZzCŅ? 'KvpL?kݒbU|_]Q\m 1| nU8mq;0oE(!_I?C8BP@@D"9w\G<Go_ۅP ;ރ׮?gȐ_4ԼW.DTߊC;.hN4&r+`MxӳWҕm.LjWZq`N44D[xb!][%x)}O/>enN Y;Z xgZsJmN`2Sb_m$l[ݛ4$SeMOܘMv 1' +-f*(^2fSk:l<Ƞ"ZO,Z%WL=닑&OH^^TY_dR'knLN6i[m \RS ߞ\Q?^n=ӜxmyhYeA-^&7^5y}\vhe⊒h {2O-aqۋ^4!E\Hy(DFby|䁩ЈoJ2"x-B~D; tq CeAS~_ 9D$422UBI"" g˧ vMG7O1CYltpE mcH~k৅ӜztQrEr;~{lCO{e=$/yJǛgp c*v"E8V&<\ۭ~/r>َZ41 %[݈~K^0N 'Q[Z}g%# e7|JRQ$@ׇV'!I+>ø@wO)`3}Jw/ʥwUlߖ|>z{r"FFSc!gU \!Wؕkܜ碫(D#8@;C˕G'yI:pav*- 8&֡xO c3+Kb}Q0 t>d,{J098qـWFMar]X+^kog2tSe֩)m"ٯdgxGKn$Vex-} 69Qsx8˾YA'08Ru{Jh؄qZ <ťZgY(g l;gy81AFAAT:DbLD"P~/:Ab_'HP48,V~k աP|]Bu!kLX]en3a׻iijJN0"{G;(87?%"#HKq C▬L8SQ r@cwD?Kˁv 9#Z.pR?*˝gO̓3Eޓ0\~i8is6MU ke:oHܚ6+*N2`P4 #ZFJz*n*+*?Zڑs&QnJDQ :A"}>>!GΠiIu5 vq|0 !Q3նWĕ69ǟ= T"zG֨(̥;ak" 2߶17 O)Jc|i>u=Lʅ5JyUnΉ9LgHDor>U5bQ=[Kv_aJM :,%řY3w}ѕ"õ}S".X=aÆ3 (KMjQL j2;(QJ4 SH TkS>0}kccPU_!f mvvfu|5VQ;)->NZO 3Iv 6##OxXTr;<) dbMyZ |}ނ$A=^, ACLN\[QPTVXZ$&($&(`ace`ace`aceimlrqp`ace`aceutvz}w{~xxxy|33xxy|vz}  g vz} ")*+19IO]^_fghknos""")))***++++++11199999IIOOOOOOOO]]]^^^_____fffffggggghhhkkknnnnnoooooss  #%'#%'#%'+-03%61EG#<?BJMOMRUWY3'#%'#%'#'bd%#'bd%#'bd%+jYjYW#'bd%#'bd%s  HHHH&HHHHHH&HHHHHH@@@@@@HHH @@@@H %    /6$ B !o ; >   ' S^ . : W ) !s9c%A?vJ  )   " =  #>0;&<;;&;>&>>;?     <  <t are permittedDescription of coaaJkU:n#enceActionName of action to invoke, either in the engine or the handler DLL.ConditionOptional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.SequenceNumber that determines the sort order in which the actions are to be executed. Leave blank to suppress action.AdminUISequenceAdvtExecuteSequenceComponentPrimary key used to identify a particular component record.ComponentIdGuidA string GUID unique to this component, version, and language.Directory_DirectoryRequired key of a Directory table record. This is actually a property name whose value contains the actual path, set either by the AppSearch action or with the default setting obtained from the Directory table.AttributesRemote execution option, one of irsEnumA conditional statement that will disable this component if the specified condition evaluates to the 'True' state. If a component is disabled, it will not be installed, regardless of the 'Action' state associated with the component.KeyPathFile;Registry;ODBCDataSourceEither the primary key into the File table, Registry table, or ODBCDataSource table. This extract path is stored when the component is installed, and is used to detect the presence of the component and to return the path to it.CustomActionPrimary key, name of action, normally appears in sequence table unless private use.The numeric custom action type, consisting of source location, code type, entry, option flags.SourceCustomSourceThe table reference of the source of the code.TargetFormattedExcecution parameter, depends on the type of custom actionExtendedTypeA numeric custom action type that extends code type or option flags of the Type column.Unique identifier for directory entry, primary key. If a property by this name is defined, it contains the full path to the directory.Directory_ParentReference to the entry in this table specifying the default parent directory. A record parented to itself or with a Null parent represents a root of the install tree.DefaultDirThe default sub-path under parent's path.FeatureComponentsFeature_FeatureForeign key into Feature table.Component_Foreign key into Component table.FilePrimary key, non-localized token, must match identifier in cabinet. For uncompressed files, this field is ignored.Foreign key referencing Component that controls the file.FileNameFilenameFile namTableTypeColumnIdentifier_ValidationValueNPropertyId_SummaryInformationDescriptionSetCategoryKeyTableMaxValueNullableKeyColumnMinValueName of tableName of columnY;NWhether the column is nullableYMinimum value allowedMaximum value allowedFor foreign key, Name of table to which data must linkColumn to which foreign key connectsText;Formatted;Template;Condition;Guid;Path;Version;Language;Identifier;Binary;UpperCase;LowerCase;Filename;Paths;AnyPath;WildCardFilename;RegPath;CustomSource;Property;Cabinet;Shortcut;FormattedSDDLText;Integer;DoubleInteger;TimeDate;DefaultDirString categoryTextSet of values that are permittedDescription of columnAdminExecuteSequenceActionName of action to invoke, either in the engine or the handler DLL.ConditionOptional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.SequenceNumber that determines the sort order in which the actions are to be executed. Leave blank to suppress action.AdminUISequenceAdvtExecuteSequenceComponentPrimary key used to identify a particular component record.ComponentIdGuidA string GUID unique to this component, version, and language.Directory_DirectoryRequired key of a Directory table record. This is actually a property name whose value contains the actual path, set either by the AppSearch action or with the default setting obtained from the Directory table.AttributesRemote execution option, one of irsEnumA conditional statement that will disable this component if the specified condition evaluates to the 'True' state. If a component is disabled, it will not be installed, regardless of the 'Action' state associated with the component.KeyPathFile;Registry;ODBCDataSourceEither the primary key into the File table, Registry table, or ODBCDataSource table. This extract path is stored when the component is installed, and is used to detect the presence of the component and to return the path to it.CustomActionPrimary key, name of action, normally appears in sequence table unless private use.The numeric custom action type, consisting of source location, code type, entry, option flags.SourceCustomSourceThe table reference of the source of the code.TargetFormattedExcecution parameter, depends on the type of custom actionExtendedTypeA numeric custom action type that extends code type or option flags of the Type column.Unique identifier for directory entry, primary key. If a property by this name is defined, it contains the full path to the directory.Directory_ParentReference to the entry in this table specifying the default parent directory. A record parented to itself or with a Null parent represents a root of the install tree.DefaultDirThe default sub-path under parent's path.FeatureComponentsFeature_FeatureForeign key into Feature table.Component_Foreign key into Component table.FilePrimary key, non-localized token, must match identifier in cabinet. For uncompressed files, this field is ignored.Foreign key referencing Component that controls the file.FileNameFilenameFile name used for installation, may be localized. This may contain a "short name|long name" pair.FileSizeSize of file in bytes (long integer).VersionVersion string for versioned files; Blank for unversioned files.LanguageList of decimal language Ids, comma-separated if more than one.Integer containing bit flags representing file attributes (with the decimal value of each bit position in parentheses)Sequence with respect to the media images; order must track cabinet order.InstallExecuteSequenceInstallUISequenceModuleAdminExecuteSequenceAction to insertStandard Sequence numberBaseActionBase action to determine insert location.AfterBefore (0) or After (1)ModuleAdminUISequenceModuleAdvtExecuteSequenceModuleComponentsComponent contained in the module.ModuleIDModuleSignatureModule containing the component.Default language ID for module (may be changed by transform).ModuleInstallExecuteSequenceModuleInstallUISequenceModule identifier (String.GUID).Default decimal language of module.Version of the module.PropertyName of property, uppercase if settable by launcher or loader.String value for property. Never null or empty.C_CENTRAL_msvcr110_x64.C7F737EB_3325_3BEE_8D0D_DEF2DE62486A{A20D4A14-36B7-4515-A41E-675EC97165E3}System64Folder_amd64_VC.C7F737EB_3325_3BEE_8D0D_DEF2DE62486AF_CENTRAL_msvcr110_x64.C7F737EB_3325_3BEE_8D0D_DEF2DE62486AC_CENTRAL_msvcp110_x64.C7F737EB_3325_3BEE_8D0D_DEF2DE62486A{06968015-2B78-456C-9B32-E8EC0B93697A}F_CENTRAL_msvcp110_x64.C7F737EB_3325_3BEE_8D0D_DEF2DE62486AC_CENTRAL_vccorlib110_x64.C7F737EB_3325_3BEE_8D0D_DEF2DE62486A{E9D693A9-295B-4AEC-8CC5-25FF383D4629}VersionNT64 >= 601F_CENTRAL_vccorlib110_x64.C7F737EB_3325_3BEE_8D0D_DEF2DE62486ACA_WindowsFolder_amd64_VC.C7F737EB_3325_3BEE_8D0D_DEF2DE62486AWindowsFolder_amd64_VC.C7F737EB_3325_3BEE_8D0D_DEF2DE62486A[WindowsFolder]CA_System64Folder_amd64_VC.C7F737EB_3325_3BEE_8D0D_DEF2DE62486A[System64Folder]TARGETDIRSourceDirSystem64Winmsvcr110.dll11.0.51106.11033msvcp110.dllmhkegslt.dll|vccorlib110.dllCostInitializeMicrosoft_VC110_CRT_x64.C7F737EB_3325_3BEE_8D0D_DEF2DE62486AInstallFilesRemoveFiles11.0ALLUSERS1DirectoryTable100_amd64.C7F737EB_3325_3BEE_8D0D_DEF2DE62486ADirectoryTable0V *H G0C1 0 +0g +7Y0W02 +70$ F0!0 +-&agK0Z#Х&003'80  *H 0y1 0 UUS10U Washington10URedmond10U Microsoft Corporation1#0!UMicrosoft Code Signing PCA0 120904214209Z 130304214209Z01 0 UUS10U Washington10URedmond10U Microsoft Corporation1 0 U MOPR10UMicrosoft Corporation0"0  *H 0 Il"e;abt)qX^W ibn6N"ya%X,12>tW6SAiimVn&Msdqa!hX[I50Szk+!gtxa|*gٺc}~H=uc )9AT8Td@7 "0# kYୟ`L bZxvlL8G 0 0U% 0 +0UQJ?óe,0U#0ҴX7.3L 0VUO0M0KIGEhttp://crl.microsoft.com/pki/crl/products/MicCodSigPCA_08-31-2010.crl0Z+N0L0J+0>http://www.microsoft.com/pki/certs/MicCodSigPCA_08-31-2010.crt0  *H *&zbx[ħxS( B?8d5HzOGڇLږdρ3x|mqaNds?{'4R?GCpSK*w{nF(1Ji]3vw%GmIJKF!5u6L߷+پ*j5? N$c .$_CDz\7ۤE:W}GfϜFVL <~UkQe00 a3&10  *H 0_10 &,dcom10 &,d microsoft1-0+U$Microsoft Root Certificate Authority0 100831221932Z 200831222932Z0y1 0 UUS10U Washington10URedmond10U Microsoft Corporation1#0!UMicrosoft Code Signing PCA0"0  *H 0 rY\0d` BvSl>ok:t/2BN#r5W ʮ IhMKyKqG%ߝuϪsDׁ6\Eܯ=(hrsV5rv_wE8s[gRi/ t)v/T0Yҍb_F1P'@0r)("7N=2=͡8\NV(*2KOc-bE=F[&SzJF7<8w\V< _^0Z0U00UҴX7.3L 0 U0 +70# +71N&`;1o<-0 +7  SubCA0U#0`@V'%* SY0PUI0G0ECA?http://crl.microsoft.com/pki/crl/products/microsoftrootcert.crl0T+H0F0D+08http://www.microsoft.com/pki/certs/MicrosoftRootCert.crt0  *H Y9>&Fo@2j/nI_uL;-C -1#|P!]=/LVpyIr>A i˥ - PV-JҼp VชKWB4J#RvLƹ4VERB̎S`=yACU˽HH^Ƈ X?d] U5IeWHZTd?&1\\g&2ݶ]*4 VK S]^_-U0 *H  1 000w1 0 UUS10U Washington10URedmond10U Microsoft Corporation1!0UMicrosoft Time-Stamp PCA aB0 +]0 *H  1  *H 0 *H  1 121106151410Z0# *H  1I ROkQpeofb:(B0  *H "?zQA<botc׼'Nf30z8 E?նw +-IM rfjG-&vwPUqi-- HDs VkGVYI3 }8)(S{ꍶZr!U3T$)b+(q\ XEqظ"ZU.}dW_&t6$S+Dx3PDJXO}N9i\modsecurity-2.9.5/iis/wix/EULA.rtf0000664000175000017500000002314514147005233020062 0ustar mhsvierulamhsvierula{\rtf1\ansi\ansicpg1252\deff0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\fswiss\fprq2\fcharset0 Calibri;}} {\colortbl ;\red0\green0\blue255;} {\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\sb100\sa100\lang9\f0\fs24 Apache License\line\line Version 2.0, January 2004\line\line\pard{\field{\*\fldinst{HYPERLINK "http://www.apache.org/licenses/"}}{\fldrslt{\ul\cf1 http://www.apache.org/licenses/}}}\f0\fs24 \par TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\par \b 1. Definitions\b0 .\par "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\par "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\par "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\par "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.\par "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\par "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\par "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\par "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\par "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."\par "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\par \b 2. Grant of Copyright License\b0 . Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\par \b 3. Grant of Patent License\b0 . Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\par \b 4. Redistribution\b0 . You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\par \pard\fi-360\li720\sb100\sa100\tx720 1.\tab You must give any other recipients of the Work or Derivative Works a copy of this License; and\par \pard\fi-360\li720\sb100\sa100 2.\tab You must cause any modified files to carry prominent notices stating that You changed the files; and\par 3.\tab You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\par 4.\tab If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\par \pard\sb100\sa100\b 5. Submission of Contributions\b0 . Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\par \b 6. Trademarks\b0 . This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\par \b 7. Disclaimer of Warranty\b0 . Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\par \b 8. Limitation of Liability\b0 . In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\par \b 9. Accepting Warranty or Additional Liability\b0 . While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.\par END OF TERMS AND CONDITIONS\par \pard\sa200\sl276\slmult1\lang1033\f1\fs22\par } modsecurity-2.9.5/iis/wix/modsecurity.conf0000664000175000017500000002065414147005233022037 0ustar mhsvierulamhsvierula# based on modsecurity.conf-recommended # -- Rule engine initialization ---------------------------------------------- # Enable ModSecurity, attaching it to every transaction. Use detection # only to start with, because that minimises the chances of post-installation # disruption. # SecRuleEngine DetectionOnly # -- Request body handling --------------------------------------------------- # Allow ModSecurity to access request bodies. If you don't, ModSecurity # won't be able to see any POST parameters, which opens a large security # hole for attackers to exploit. # SecRequestBodyAccess On # SecStreamInBodyInspection is required by IIS for proper body inspection # See issue #1299 for more information SecStreamInBodyInspection On # Enable XML request body parser. # Initiate XML Processor in case of xml content-type # SecRule REQUEST_HEADERS:Content-Type "(?:application(?:/soap\+|/)|text/)xml" \ "id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML" # Enable JSON request body parser. # Initiate JSON Processor in case of JSON content-type; change accordingly # if your application does not use 'application/json' # SecRule REQUEST_HEADERS:Content-Type "application/json" \ "id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON" # Maximum request body size we will accept for buffering. If you support # file uploads then the value given on the first line has to be as large # as the largest file you are willing to accept. The second value refers # to the size of data, with files excluded. You want to keep that value as # low as practical. # SecRequestBodyLimit 13107200 SecRequestBodyNoFilesLimit 131072 # Store up to 128 KB of request body data in memory. When the multipart # parser reaches this limit, it will start using your hard disk for # storage. That is slow, but unavoidable. # SecRequestBodyInMemoryLimit 131072 # What do do if the request body size is above our configured limit. # Keep in mind that this setting will automatically be set to ProcessPartial # when SecRuleEngine is set to DetectionOnly mode in order to minimize # disruptions when initially deploying ModSecurity. # SecRequestBodyLimitAction Reject # Verify that we've correctly processed the request body. # As a rule of thumb, when failing to process a request body # you should reject the request (when deployed in blocking mode) # or log a high-severity alert (when deployed in detection-only mode). # SecRule REQBODY_ERROR "!@eq 0" \ "id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2" # By default be strict with what we accept in the multipart/form-data # request body. If the rule below proves to be too strict for your # environment consider changing it to detection-only. You are encouraged # _not_ to remove it altogether. # SecRule MULTIPART_STRICT_ERROR "!@eq 0" \ "id:'200003',phase:2,t:none,log,deny,status:400, \ msg:'Multipart request body failed strict validation: \ PE %{REQBODY_PROCESSOR_ERROR}, \ BQ %{MULTIPART_BOUNDARY_QUOTED}, \ BW %{MULTIPART_BOUNDARY_WHITESPACE}, \ DB %{MULTIPART_DATA_BEFORE}, \ DA %{MULTIPART_DATA_AFTER}, \ HF %{MULTIPART_HEADER_FOLDING}, \ LF %{MULTIPART_LF_LINE}, \ SM %{MULTIPART_MISSING_SEMICOLON}, \ IQ %{MULTIPART_INVALID_QUOTING}, \ IP %{MULTIPART_INVALID_PART}, \ IH %{MULTIPART_INVALID_HEADER_FOLDING}, \ FL %{MULTIPART_FILE_LIMIT_EXCEEDED}'" # Did we see anything that might be a boundary? # SecRule MULTIPART_UNMATCHED_BOUNDARY "!@eq 0" \ "id:'200004',phase:2,t:none,log,deny,msg:'Multipart parser detected a possible unmatched boundary.'" # PCRE Tuning # We want to avoid a potential RegEx DoS condition # SecPcreMatchLimit 1000 SecPcreMatchLimitRecursion 1000 # Some internal errors will set flags in TX and we will need to look for these. # All of these are prefixed with "MSC_". The following flags currently exist: # # MSC_PCRE_LIMITS_EXCEEDED: PCRE match limits were exceeded. # SecRule TX:/^MSC_/ "!@streq 0" \ "id:'200005',phase:2,t:none,deny,msg:'ModSecurity internal error flagged: %{MATCHED_VAR_NAME}'" # -- Response body handling -------------------------------------------------- # Allow ModSecurity to access response bodies. # You should have this directive enabled in order to identify errors # and data leakage issues. # # Do keep in mind that enabling this directive does increases both # memory consumption and response latency. # SecResponseBodyAccess On # Which response MIME types do you want to inspect? You should adjust the # configuration below to catch documents but avoid static files # (e.g., images and archives). # SecResponseBodyMimeType text/plain text/html text/xml # Buffer response bodies of up to 512 KB in length. SecResponseBodyLimit 524288 # What happens when we encounter a response body larger than the configured # limit? By default, we process what we have and let the rest through. # That's somewhat less secure, but does not break any legitimate pages. # SecResponseBodyLimitAction ProcessPartial # -- Filesystem configuration ------------------------------------------------ # The location where ModSecurity stores temporary files (for example, when # it needs to handle a file upload that is larger than the configured limit). # # This default setting is chosen due to all systems have /tmp available however, # this is less than ideal. It is recommended that you specify a location that's private. # SecTmpDir c:\inetpub\temp\ # The location where ModSecurity will keep its persistent data. This default setting # is chosen due to all systems have /tmp available however, it # too should be updated to a place that other users can't access. # SecDataDir c:\inetpub\temp\ # -- File uploads handling configuration ------------------------------------- # The location where ModSecurity stores intercepted uploaded files. This # location must be private to ModSecurity. You don't want other users on # the server to access the files, do you? # #SecUploadDir c:\inetpub\temp\ # By default, only keep the files that were determined to be unusual # in some way (by an external inspection script). For this to work you # will also need at least one file inspection rule. # #SecUploadKeepFiles RelevantOnly # Uploaded files are by default created with permissions that do not allow # any other user to access them. You may need to relax that if you want to # interface ModSecurity to an external program (e.g., an anti-virus). # #SecUploadFileMode 0600 # -- Debug log configuration ------------------------------------------------- # The default debug log configuration is to duplicate the error, warning # and notice messages from the error log. # #SecDebugLog c:\inetpub\temp\debug.log #SecDebugLogLevel 3 # -- Audit log configuration ------------------------------------------------- # Log the transactions that are marked by a rule, as well as those that # trigger a server error (determined by a 5xx or 4xx, excluding 404, # level response status codes). # SecAuditEngine RelevantOnly SecAuditLogRelevantStatus "^(?:5|4(?!04))" # Log everything we know about a transaction. SecAuditLogParts ABIJDEFHZ # Use a single file for logging. This is much easier to look at, but # assumes that you will use the audit log only ocassionally. # SecAuditLogType Serial #SecAuditLog c:\inetpub\logs\modsec_audit.log # Specify the path for concurrent audit logging. #SecAuditLogStorageDir c:\inetpub\logs\ # -- Miscellaneous ----------------------------------------------------------- # Use the most commonly used application/x-www-form-urlencoded parameter # separator. There's probably only one application somewhere that uses # something else so don't expect to change this value. # SecArgumentSeparator & # Settle on version 0 (zero) cookies, as that is what most applications # use. Using an incorrect cookie version may open your installation to # evasion attacks (against the rules that examine named cookies). # SecCookieFormat 0 # Specify your Unicode Code Point. # This mapping is used by the t:urlDecodeUni transformation function # to properly map encoded data to your language. Properly setting # these directives helps to reduce false positives and negatives. # SecUnicodeMapFile unicode.mapping 20127 # Improve the quality of ModSecurity by sharing information about your # current ModSecurity version and dependencies versions. # The following information will be shared: ModSecurity version, # Web Server version, APR version, PCRE version, Lua version, Libxml2 # version, Anonymous unique id for host. SecStatusEngine On modsecurity-2.9.5/iis/wix/list_dependencies.bat0000664000175000017500000000377214147005233022774 0ustar mhsvierulamhsvierula @echo off echo * echo * echo * ModSecurityIIS - list dependencies echo * echo * echo * This script is likely to be used as part as a debugging process. echo * echo * echo * The main function of this script is to list all ModSecurityIIS runtime echo * dependencies, including system dependencies, to check if there is a echo * missing library or a version mismatch. This can be very usefull in case echo * ModSecurityIIS refuses to register as IIS module or if IIS refuses to echo * start. echo * echo * echo * pause :LOOP_FILE SET /a log_file=%RANDOM%+100000 SET log_file=%TEMP%\ModSecurityIIS-depedencies-%log_file:~-5%.TXT IF EXIST %log_file% GOTO LOOP_FILE echo Saving logs at: %log_file% set POSSIBLE_PATHS_X86="C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\dumpbin.exe" "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\dumpbin.exe" set POSSIBLE_PATHS_X64="C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64\dumpbin.exe" for %%i in (%POSSIBLE_PATHS_X86%) do ( echo Checking for dumpbin x86... %%i echo Checking for dumpbin x86... %%i >> %log_file% if exist %%i ( SET DUMPBIN_X86=%%i goto found_x86 ) ) :found_x86 for %%i in (%POSSIBLE_PATHS_X64%) do ( echo Checking for dumpbin x64... %%i echo Checking for dumpbin x64... %%i >> %log_file% if exist %%i ( SET DUMPBIN_X64=%%i goto found_x64 ) ) :found_x64 if "%DUMPBIN_X86:~1,-1%" == "" ( echo Dumpbin x86 not found. echo Dumpbin x86 not found. >> %log_file% ) else ( echo Using dumpbin x86: %DUMPBIN_X86% echo Using dumpbin x86: %DUMPBIN_X86% >> %log_file% %DUMPBIN_X86% /imports /dependents %* >> %log_file% ) ) if "%DUMPBIN_X64:~1,-1%" == "" ( echo Dumpbin x64 not found. echo Dumpbin x64 not found. >> %log_file% ) else ( echo Using dumpbin x64: %DUMPBIN_X64% echo Using dumpbin x64: %DUMPBIN_X64% >> %log_file% %DUMPBIN_X64% /imports /dependents %* >> %log_file% ) goto exit :exit echo Logs were saved at: %log_file%. echo Trying to open it with explorer... explorer %log_file% echo Done. pause modsecurity-2.9.5/iis/wix/Microsoft_VC120_CRT_x86.msm0000664000175000017500000305000014147005233023323 0ustar mhsvierulamhsvierulaࡱ>   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry FkBB=ACG: C1B7H | SummaryInformation(@H?CAED1H @HDDrDhD7H !$@H C5BErED/H1<@H??wElDj;E$H=MsiDigitalSignatureEx.:DigitalSignature$  *+,-./023456789҃zi@¯s7~RcO$h@ߔ_eQC~=nk<=33WD^n |ω%cJ րi5SHuC, _u"9sw53{r'> sr"W}'>,w dMj0nV7"l_Bw1d";nm]DZ8)a9LEy%cFwa =,''%FSUW 7>vrߕ;tߖmߖ-pLGi&D]U. SkC6-$ )^PAkv>wXi w\mQTXrb gNʒ;L;(E.]~yfi؉-K]'W g=4 3Q$6"69-NENed^z ӕ7#=E}]L_K] Ho)W&5oJoޓvn$(ޖ+?׾׽F[q,LU:ytt.35f9} ]@^o:"~]^'6#r^xF )5AT1bu.=_mo/Kv]Wݼ:[ ӊ7465 |@Y}݋KI_9CtyeS??~WJP\tp1,;q]X\ŵt'R%k5Vň)bTT$ $م%,fw<-H"4!Rcb IhB6b-m|yw/\~_̙3g9s̽w Qh!%سGU\z)yvw})ˏ3vX}W.Q~ϔf`7SƪRtLx)g3z xG}|s&:sv% e3u~\{#da})/AĢ*`oxSײWp)0%|UɘWTX BkAuu>5k(Ɣ- jAȹ1 bȷם@K%S.|:JEhި>.8Q{v }c֓odu訊7wYUg~7Sn8Gկ44j.^gc`]v1Q[gt0G4c?k?aaӰ0 q#3M!V G1}`WZ4k㟘&Noa.=S (rgM/ƮA)~_خq9071!\/L/5i =1[}ǥ?znuy~Ȓ[$t럞3 /r9/j7^TMjGW8Z9 `a@_j/ ."7 2G1,,*JwxrA,0wTpIvx~GeÛU'TU5!QB+-rѣV;wmY5sO]գUkիVkcꛪ_}l j5G|fꟺRE(`SWeQv-'X^˙+^o. iF:B\S`jV6uT]29#fAԵj~1L]=q--+ijW/C&Q2`%^/JkRSC '#, >O z.g} J+͂?-N7{v!ʹj s/1e{9= 3t҆]}ڡݗ i/`K9Jtܛ"^mB&)mwFt24%-l]5̈́/}@(kEhYϔj[ F_ u:jg>8 -kh|]Z@ւȩwmul&ߵXPn"x`^h-9xc2!Gs& C9 hheicCAW(ܔ>f]_o=(Q}=;^)q@CeeZy~($BJvƄ7>H#TGGI!)ĿSiKIt9ҧt%QnQvZͯFA׿AGKx=̯QnnMJR~3G}mkX۷徥Ce% ڧ tHW9*(g%:}}tl޾(;Cu.GoH=w7ʻl^D+77m&ftŢh /doPN[#:i[.OQn A7 B9 +47 kr _ ?c_P^ FL nTzWt9-it91(LFc_-юr]NmϔH[AAF-kiAƨ\>2Lqe ʮ\߸ƾMSCF| ,4EC F_CENTRAL_msvcp120_x86.194841A2_D0F2_3B96_9F71_05BA91BEA0FAEC F_CENTRAL_msvcr120_x86.194841A2_D0F2_3B96_9F71_05BA91BEA0FA@EC F_CENTRAL_vccorlib120_x86.194841A2_D0F2_3B96_9F71_05BA91BEA0FAXOD0CKZ{xU  Rh@`@:]#TwW:a?pqVQpEע˷ >pDYv߹U]&w{˶0c92.<^f_Pr %"hT*EUR П|o.j)/TFT*G V^#pE`5WUX`@<-XO|7Ꙍg\¾XW5/Qv]=OFc9b+q$ 3)EZbr=1hj_.6prqV^5M]ǥL:ؖ^u.0;v-9Km̴Ho#3 X {!Udܶnxb-]IA;_aAXw92oP6`7o`򁶃a^P@AA! }g݄FP40񅠉AAq!j-4r;+3u{=ɲrfhmb-,qZ,rfv3xһ}lo}{dr;}7KWpl~L<^uߥ߄D|eW=Uzl61s2k0j@ѯ~jO{Nz9me=W?Tҥ<7[41ۻuaoWb_v=gdC^n3;=lkd/A<|ZA k!P!= ZPQWY#Z1 O{(&&҇"uvWõta9~ͧI?WJHGGq=:&:'g0PFƯ=ʟ\^/mel6|^Gt8?e< ]o9]fS~ʯ0Eը *1jw'jA@A/f*s]%Sj˜;S)?vP5oٮ|si vkYc}/@CKMv G2~Qt0#9jW C7F+:D^PjSPMSx-dۭhՈQ :k5Ǻ̵^1r0ós}U3t%`"[(D(ՆZEAZFsPÄb\!yEAg)E>#!}.Y+QV.CaìS) Rx[t^e3S^WVԈnZ2HaɌ%cr#:kQ3^[5rэfIհd+]1-:Eբʦ%G`=t= 5*dVEUYGz 7qP afuÊ[9:[ߑXXmҬfLj)FbM9ͷ0҉$PG!MՒj.8|X gHE`&^Q aNTpBWjbԠVlx5d#ϣo3idz cq .|35zZm9|7fIࡧ$J=ҥ$ DۖT4K0/oF]J|f$(OPvWH|TÐlċ2F{z±Ox}ig̜!6߻ {u.;Su;=X8cr`Jՙ/Էr/y2V Hǐ'/ 9rWAyK<"kNCIYE)(y7{ŘÅg6H&!w8cMk;IUvGk2h%#fm:wvp4S~ wwzAf XȥnuNyçÇaue'S~cu|x9LQf8}3Piqi~'/;u/sʇb a-2`)ppVY\bU%!x`0>|X <"9i$85l`!\HSf$r^`}<XV>|狯,8ߞ|@LvXG\ <μ9o!Hr ' p<:~>//))<o hwg"ou-IO` ٲ0N -1-F~ g5g}{=lc]k.` ] 8E{Nk^&i;( L1b4~\Whm@NyH>d]$xp^ӹzp plbVHZ-LfZ8CRlm_|utk@Nz˹7fTQ E źމ.NWL9R`. l ^E&EtâADIjYiP7] z'qA?WOFv@7.:rJ=35.]J~(Vg 7I׆roԄ_O P\ہdľyXy2 G%u>ڃDht,:|D 8y~V ~&}uF*:=T'p~.>B—x8od")+b$x%rl5l"G Ak+uڅr_?t&1~Γ(G ! <'@1U< }nT~(w NƯYUƩ1~u^f/6NRV:0͝˳vc&ryKnTFW:=D'/tl- #?hO5 /ʝMdlunH@yBioH7 "^I(gp{^#.M"^&Q%z\Fk Q7?&;?a94ά!#MŴD_\ _krp^+c~qOo|.Mm~nnZ5dGc<.Zĉ{+q-]XC~ߟ#G!k_Ix:1*|7CkDR(ngp6 #&6?/ה!&O>8C1刏~EG2\wT? ؛lIv'ze}?y1jhי칣n~ }I&*;/<MiN~K/e{85^yU*΁&(> 1P2LƈC[]LaBr_̏7.m%䉳󶦜ǘ[v&iCIweB[NezM (vK_k6+d|'; ~\wԥc˂P,9~=Wloo|N=Fh& ?-ZG'9Sb> ~vrd{m|JӤtyiK%ci{$W@\Ah?ϗ*~ ;Fa-۽\| "g)z>!4xFTZ>ɓ&.7CW i3LV{g3>ڇd䔜FQCܮWs\Q6sR3ZS,B80pFhOp1^F h\Ԑ';A^',sw!f r#ʃLeZżhT+>=o4S;P^)ǝݯȯsRr<΋t6LZ&^^>pM >PIIgn~=2sР#6JY5Ey,3Mi8,= "UPn1Mn&˱ <Ҁ/zMxte<[P}e WMѠ8&mz y1~S3u&rH\Bs{=Cm=($=fxme tW,~] zk6(pƫVtǀ6XlR__u{,< V frq 7 @ F`;p|Ҁ*` &u+ 7,x8X[7\ T'oYX2x(pm >x ʐca6`po!/ ,l>P [@ pA ꐅm0ð P t pρYX x8|눅AG-,hvGF,l<fD`p,0X hvG~F`/!p{`+8 \=k `y2M @9f~;'w3tS̏`/ x LWOKc@I X<W} _[ׁSO>`0 D 7 L3'?c $0/Y`'7OnI { SYEߛk­=*v.ɆRedtf!ntCX)v22pKt>XAdhvA2| /<)wﶮd{8ܬVZ3EuvIՈp{;gha:P/=Td &O$'DkꪰhjO@筂etܗo DH`3ɾhaqv$l{mSaX}3L6EƼ]BZV^UX^e7XfDJ }ٌ(h1c$ &,GheYe7,GlsX'Zi ,hA,>%F#D; ډCǑOXT] x_DYoyY꾎snk߁>*GV1@~?Qg9VO>ɔ V$ՐڴyG{/4g{> o\jIgˉee9|8༒\KPr!Qn  e~5U¯~iW Ą_!(<#|5/y"? k4=v9o~8oD+ ^l>C>ۀ7x[|%V*hqgbE;yhq(aJ _p,<5oM?w-nC# ? osG,cÀ?M^"z|>,5vPYL;XJOW '7DG"z X!'fY:ݬS~*:? aXgYBKlՋ̮X@V{N=֯gmKWEKPy7X!GVjm$A}<= t~;"ձ  #](S|[ yΐ6"Ջ~>YWnէXRb}{RvMi#cߞ#Hn'ΐK*+]i"o,u/u*۵F=#]7t%hWwR]g_y9IsnMbQi'9gy ̹m7s]`jhpW;,A'@ʐ֢A]}X#JZ(SO2=UV<ҍCN\;t+fbO:Cj V<튏`MGM;pH# M(1##>ذ,wmYt)6`t=y1QpkVTW-gxt?=I6gKmO{gR*]"Goz5Nw[} Y 3 :/Ҧ=(HٽQHʡ8\nuQJđWJVSl`N 7xQ%uH{"[W,-1+4Km:CK}|TՕcx`!j*Ԧ[3N2$LB&tk)M*V[q?mw˶]M[ " ^Tj9MHX?$o޻s=^4e4 udG,*U.m ^0ZS ˆUXZt>?z&IKrƫ G4R-Nzql@H.2F@L#hhP;@i o|wf{}w]o=!2u@ꜘA焇s`2q%LBTJ+Dz!VSJ{rq67b`Xn *$rmgr{MGvr;0N}aRpբu/(H,]`oEz~<ó8rK0v^̩vWˆа Q[undϝ>m"^KIJH; MgH/е9o4k_X$16 ,N²9 봿hN6vˬﰙIЍw96L 6llĻ0煓~q0sq N/ "PՋLT"G]qrp)6C-섖 u^x?4 / C~MP\覙GDž:"LK`Z[PKԐDma7ړ#wR9 mn"b0]o7,( 6mT=ig_>Zr+"|܃bϼ夭CIJǀjyMQ{vc_ĺeb3DpETӌm9fG5_,ƥE;8? ƾ-LՐR[7 s@)eI9-M m/"gQpN GހΧ,`~126@zlB7-s3*ІHcX$[Lg@\ɱ"ZXsMGS摱V"6AHgA%2곢u`|MII\kR (BkK&a*~>8>8$F}l"1;'S6 )`XcyD=7;R@L!c^2Knqo_b7 M iЃE UXw+ 3PT˥JF!^6M5OKE&0ʼ%h" |5*k4:}!?e? *ްM XLwk $F5AT~B++?wĦVTMZ E\%GKZݫ{;8mjI(  ra;(qE+bԫk Nob㵕* + .;01GeHOy heo̓y-5仒_|%&te"H|Wbqer߶ͻV@pN`otRv}q(|Rيf*gLWKA߾bB 1Q [-)iy q*_yxR)?s(ץQ<cȈ n6weMv A_bAZH*}0J3fXҌ[)V0IP}S.? dD4y·o0lAl~OWMA RV&$`‰vDuLJГMѯQ@2"+ z۝ :ZMPfzv% ju6zݗ[yDžM7 0{2ٓ a^7Cl'󉳀sodg Q z.Jt.jAToFA gك|`tb o HUE5 '!T ϴqrhy>乿tg @X&H gH=~ۜݸ4fo5E҃d8C2 ^+>XmDp-gb tn9%WV= i Q2Y`Mv ddWjKsN҆*j0&+fcF:^Y-lx0t>ԹP~ 3Wǟi AE5 c\wK0 =u'>Zk VMa@ҙxh T4 G0]7dw,ʠ˜5j+ f8EqP1ìDCddIE(Ȳf@* iZv': 'нN<:V^eI5NH Ӿ5Rrja\FsrA[CY`n"W΅WЬ dNlKreƏW†Ĝ2lrpؖ$#Z̈́UI?yffbN']0x%ИJG'[b]aA[nY_$]ɤJ4I $$;_Hb+y);PVGWp &?L3#c=6 DUEoqe:;]ܡ0c8|0Wb VPT8Am~W_Cd52b9T+=|_Y^H2xihWV-yOּwy#yt^NV:M1wd`3_ed҇x3cOD|lKF5,ھuwu B14b/ۡaHwo]3~{ 7:)CJH9>ԓ y00Kd"@2sf'vcY ֳlcaHR۠z v"?DcicT݃ipR[Sv}hb+뢙QeS>Èo9=}H"*;(iۂܕH(\`tљb%Q\E495"#P3N"2zU+xߨ @uwQQTv niDp4s fN;gzq=F@(OF"Ti"]xho$%\ˠ-h4L~ǟV/:``'b\ KA%:)VNGq- ̨؁%s곽I1y`^<.E3Fly] .GӾÁ7RWQHAPJ0uCϓQj26de~1ۣ?~#J!:diɄF*]1 %o߃5œ n)Ԋ%Ķ7BNyأnAjn!YE}Šak@n#չK_via?(KX"<׳!-13L [lϕ”aBrlUQ!UK:86 E2~)3RV'lgeNܯVP%޴qÀ")e2\ VDći' ܱ\`%_֐Ѕ;x UnF뢼4CM+A(a6_"6Q3Pv+lzQe? D;5r]|nBw E2PSC3C?}v_?7>d4 MBe2'_{H+DE}!4 j|y? j$"du-f [HH6]- m~wk(d 0Ғ"?uky*Ջ EZmHB7V:2Wi\BFՒnB5oק2Saz BLkY8(l._ wm$/DZw`0ɮna,`lS0"4J~ki0Jau|Z!tx܆A].قQJ]cxUugیd;?Ӛ?h!iN>5Z7,Mg >@$V;9ߞr&i fڳB| ǹzh6b,I¹[[12`**JT03s(ŰuWyXGm_b%cԉ.-Y*cԹ:RUQfJ-ۋRURye#db`־`ht Y9D]}_EKEji.R|OjtB,|eỮ8i.?Keٛ W$|t4|эc0(i5F S~_?7 |waN 4N䷲J[cD A 3sٸʣZwb i]z*A-`ki"[{s:ʂ N+s[: 0ɟ5s@a5It"%$7}cI2ig`K|}wZ㙾fl)Ll-G{n^prYojNhZl 9t0f>%[݁ˇ. SMdƎx2^eא7*x4@ORXN h,W;<@(2{M؁ ܣX: 0u z{&Imd9ka1 [I4"1l.=h0]  XE-RüK&}"8S/<ђ%o쨱botm`+ xPVJCGyCЕ%3=5sәEz5sc2yޮU 0hE҂k }u%l,kjH*[N&cetepҕ9FF4Lp2'7N*sr>_eNH7U|ʜ>:?x9T9WR3tMH59OI+`\."C챳 s(S2Ò0Bk3363auQ8re7[^" j㎿ ng~vܜ;ca3ʋeI7XfәAj ꪋeU,_y(X beBHXf˴2SF屔k =pt9풤C=WSt”b^r%Frn+:[3SX[_i~^4sSu1Ϗ !I_;;>oQߢJ8K$?FUjSBЙ5l1q/e,VfeW}:WTv $zq.V-ЏosʪeU(Y\eUjj mTǭY<"a{r"ڵVgz1minL7e08 AAdcY.z=KM2:< t^ ;, y57#T#vaoy1 &EZ1Rk uH&">D#3SBӔP(Ԓ,tQBEJD )90ѸY1n, n%~Bw*qZa67s__yk"9M rԉTRPV* VEyJ)?v*A Mm'Y{9ȯ"78<]`!\Ę fzx aԡxPBc|h%,#$[9p RQaʸqX2QV[RZ(Od;/pT7025oC_jAjXTkC#t.nt _PESC)={7\qXH苲VuwX(ذart- Lic,&&Kel_0(:070_iX@ZiXl`uk) 蔝m){Љ`Nٗ#C}efgIsgHkt=4ރcVònL劊*OZShf4!`7 | >$zUc/ ۩.˙jm?Sx(:bU\0_x@C1Ex1)/d*Cdl0+0'5b)6.{8*,e֣aN[U%;)S,]=hc, TpO3o^=8jr`>1 > H+Mi(0x0O,f[{L" PI5(ZYϛ,O52/~#%*`8ΤI;ƒOHřnZ_Zv~Ͽ46!!sOXthy[µs6PfI## =hڭemӷMž]LpoI44=DczdafsV~A < '?ްcP!0s"ϡ=f+XJ1$'d!6Q  !hZ#`uƾkSaNܳ(r|8Њj}+J4"Y%5)ͳ-|~*zG%}X#W.¬?Ho]iǡY+>iZM~âVg^d]r\yĺads^Ў,{$~f[YMg~ z[3w>њZWJr}o;aSD^~_"v P]c"ݑ#/x &!b Kx xy^b^1(3WcW]ʫŎyK%*0'ZIoV\}祇hTo) ̒d@w$N^rjR&6o&3h&h&dkf܏Mͯ!t#6'N19  XM̙Q+jltKJBb[o\O;%a&_] M]f}=z |]e/# =_8d1M }$p/yd@\cduK jh>Zv'"܉{#8FX׀O5A}CJ&*9TJ(uփcblr&4bD~DK*N~N9fO8Cs q^ίNǒX`~ǥ0P+\c2Z #%}~cb-?qXה!hrth kIHã~"Z;V8jcmm8vՎKQ<.V VBrېk٨%G +a*򰙌h_2΢d b0vԔ 9.>@ٻfZ}y7t'4i:Pgf9T1Z^T>T=4vkae\CϿA_bcV~|)egLq梈ժ[5Iu20L4^Ѽ쥗^ױUbŝW 9XyvT5]^ 5@<pe@Qu 2vYCZN#[^`瘕2. In~*|n fgvXH~Hq%$N!N4m)L=?||{-!I+V5l,m0uwmznr;nOd\]IZٕwb2;}UIĆbUc<#174*6E%%*7Eq ^Qj: OE/jNR41 3IX _bάLtOSGlQB{lt{촆=1$0RنCvc'aBHgwo*M]eU]]u|6Sc70jٯD+|7ݑ9|OYIkvxFW/]se74Krue>vU5@*^0G Mq_U///R綢+2߷Uk/;>).P<(H hF\VaalcmG; }Vx! ,D$%"+WSȭm>s㗨J+}&R*+!R7"pJ1!;rMQuqw(B0VWN딌`T D.2&]{I Tư,q&!/ZI1';y>-qَ.;IB8D?Yƅxx$ ?0Y}hˉ?iφu O ^!xȭ=g~j "˷řd|vwt%hF?ϘқcH ʠ&w#5 eX2A ]I)V=^_М(T#p-V#^T??xH\֙zq'Z ӵX4RC~+ h~#U+prn:I$ z 5_Is`xU2R zs{kW z7b AHr#}MS`[{܉ c% ZNb!,{aжV oY($v_ )#g]2^n ɩC .2⏻WFk]J}R}a@45 O#8|V!zA7҂u!جxw ihH75y Jp8LܛD 1QBႮf  ?z6LRT8zlW_zRnxR[XQ\n+s4uRvuMy]ӷ' Er.ڀ 1q$1DHZOJNPJ<JɮxΘR_J&Rp/)[1::wiCS4;_ߢSԄy]>@’J_лEG7IZ'MhPck+3 P)l?qe߆GM&>nA\r ^'S¯g>o(sՌ%: :NvԜתmUIE 0Eqa‘RmUq<O^.=o?;Ω81 S #{W q?hpn% jaIڬX|Y-|w;Дjh{E=򥉶7؎Q>g%Kٺt?RNGm87XQBWɚՉ!& a/F^ QI['୑MIX ym=$:gO$!L96]+5;x# µ)A+ߧq}t`JÀpҧVkuef.,V.?@Eh*_Bjo . vPIi 2O(5nh֓䧗ر .\SeacoGg'&7' Ai? 蔽+-/s94b{{HT&5ђvW >^nz]/vF5X&ƂD;ȸNo/'2P1UBˌoUql#I4 GRRwZwb_LjK4 Y[ %I--n+'"VZZ`Pr } cMSAUqER1>/+x;i$9K܍5J(k ipO>EB7k.-& $T~X RR[[KIC-ýJe@C ܴX,02Pg d0AmM9vZ#.;3nm F5=,.F  VrN[O!Ҏ&1^wHbQuNN ѝ_}RvɞRZYA3IhA${Ӌ"iCTA*X,i2 )зڅ<2q2uw!HRוT&DiCsCS/\3wgRnsq;:C|nHL Ȉ+@یе2W&Tb:qxR輀~i%fnå#Xi_ zƶ6ϋdsWj5.,TH+s 𤦩,icW?J07^|z"IVEWBKEf ozLo$am^pIJ=Ls?T )|[±z~ 5(IS̱d=ڼ NYdmԑ5xTw{ZT[djM;tşD}[,4%ȑ'Xc 6 f}=: ;&X&%WIV",;3g2d_r}?mW{O"σ撑U6ч %W9[=,N_ng XKJzzNjk>b ~9]=ӞS>tBHHE&oJ l^eaw#Tgv}7AC \Q)yE_֬%}^g"aM;mÌ6 -=m Ԍr )`Bm{, \]s :>z.;ܑ%$)!C*pΪ(hֈtΞѱ˚.d?Kep.|U ,ّoD~=$LC7!g5a~ (F̻HNNJЕ ;3LQ;FhC .EXE@kص`nun-]^ؾ0LobUYm Qjm94=\V#[ Nju K0|Mjd[2l9UBwAJBj B{^}C:ީ[8C!} ip]<q>bgm\; aWH#ϚpJR-4B?yV4AUbu4Kpe}NcS) P,D2tՇ05LL Fk`NLNB-!`vz:͉.˛pmOlv@AfZ{m1Kz:}>t> < j^%aT$w!#( 7uEJȍ^M]umz2mpmnZYXCMAY˚ !59ּrxP݁I? p f6-s 6ŠTuIzirVXv63:j"g `">Ԅ9=xb25 ~eo'bY'v(T3]5JsZK\qH\ǧl`>`p݅%_r]%AClXGVɤͳY7m@F^3jܘ:]XB7:-c5! %9bz敞΍EJr\l!F _;CK}y`TL%``0(Ҋ50Q4 p`H'VU1#I0گ[['.U@HbԾt2s}o0 od&={ru_ ˛{ahnTm=#0|jPW7SIh#j Z:/siCPl[c撴y;IBVehc`e͵)1Y|5]Wm4W9;^*)̅՚'>@W_e}R¨.u{pGC#bC?t}M;..vE]8.Ny6> y?Xap4\~l۪bEbL'!42I׿ոaU"Wd7'I%R@L]@j(PN7_JH˴RujDKIZ>7XAuD5D9gI>'ҽPg}qj>x'[L2TF~pt7j쇛puS`ҋG8Nt&]߁MDƭ^/u'ylz&}x+yi%ĺoK%Ưeʪ(eʔiʪE/Kٌ e)k8+Sה2M(eݤP,i˔M/.KbV(;BFrg&$|22'˃Ѷo[tft;;T:9YlMs;-U#fP fGv.T5HB^rza.6_3 [; j;f8xkhˇa\B3H29uULEta?l-OJߌ(; :Q*wShx'o>R+Zu\b)ay㈡^@q'詈qLYsΠw=fWIuHyL'x++~ Z"#|TL> *S`֢sՌ.3udv&D_JcwF4ܚ-ahi="qaIנTChZGU݃<[0pux܄?RgU ݚ^% ]$U=%xY@FX.8!Oa5Y؇9HA(A-{vGP4b .Dr29HJs -zǙ3S ^;uׅ`bXA0&RʙDݩ8P W@l01 `w>)(x-9`xNQpBȝ7S?/8 !3I^>ؠZܑeq]8l;] @P9fT 3T *axC Мd=Wf+uo1xW-nVio #mGs!k618 M[nPqfN9k.~g.t:3ξYK@ YGDL/7ڒpXƸsD-̃ xuaxt+!B~%N:TE$.u_/v}>9Ui}gIzGjoA@Id:WyRKpT6FȘ#_.bnbRd%jK!Z16B/ $C THh2^NZV*25kW-F`ʉow%z]Me7 nQ1He,L0fGp4Թ. ySmV {HuiE7β=u_ΰAd|WMjTGLjybDk9f9M]}@ҙ-o!]6< PjBN麨)= OFhFglhP|̀1s8BrTSo9F F4_y&`:Lҏ|" of$lgtp/ҢAiuw Kt%jWD, Ntx~1sA]P\U0Vrȗ_wRzvvS?\6i/7,JV*䠴7%vh B)\zwe !o2Dq+/=2@3)ive bQ{ bI7R?#FRB˯Yf׼@w&t2/}5:`>. O6A_>:4O"| PH3^X`O'M+ 絒LOE(4Q@1y@5\` .;R4 {oü1o5s"tS e' yW8@Qqݡ* tO۾m0xlV c 1wfFA& ,HQ of  {ŗP/u&]MHo Ę&a-x6JI" . |˓TюE#>s|C?e ;3o~rАPD;Z \\o9tƂYb&X$v: UL,0{A7.ĉZ7"slRˈͿD=jud&, uZ>ydd >}`!8'$տQ Fυ~VsZ~TAE.v u ʳXfJf|ttK\LŢcs:|ҧ};jw~J5_U֎cmts\%1w WO4N}E:m!Rt^@r9FKNaB)Pymhut!9EZq~D͖9 >HC4֙kKɡ0,}8 G`,f=i$2lPR#]Q }~#M15CSIDjR]u1K~9r:#B4Rn@zo,10I@9:DDiOlܿvԊtiWUT{^5LCR 6)h- ~NWM(Aq5,t9d@2 xqނ}6%Yē ^Lż{XP=5Drwy+CZt;z! `o1#aNHEQ\d"#db#@K r?zc^gJY''ww!OlO]a;,|ܞ>z}vnO趮|muRb yßOč;fDlaC ,6LZQVH>Nh+^"Ys-z)LxFAWqհ9($m  ((*zSS0rDJ[ p` CPEgO@i6^S1U i O?PxMt&?!-&胍b4#z&DɴD, Қκ*B+B6E+Dڦ(09`N_K$GW{ZY J@5\1Gue* *l:$L&a?A2kN1;k!:ཕI+;V %2}9MUaÐDVPw:YP~@O;t$ ؑX:c0:7+sPjQ|@i'R;GKݫx9`u; _RBtbk+ @V~=v6w?(cfuhkorĮ699>hb2ZobGtuI|G #I@Z@B?>GA}䁽G#xdS 2.)FutPWnw;OH^2bS![?rw"G1WЊX`|I 1W|ڥ@'~bQ!yQ[`N^nK0QLj+ R>9(.Ǚ>0\ ZF? 赐='pXwD1+=byhƻMD=&s~ F`,(ᬫV- &6rBipA±gntN4{^?`-&ۍ{+ɹʵέX6͝FRWbhAe&y,VMXgˑ旣N@X1gD;էȣ֬dyyA; >GL5~gǻ^=>⑌PX,l >b\:PD 6F8gp7h~0:${S#`fi&K7pKc^/r`^'ojN8P/\RLSOT \5ϼoӋaL');]t7;5L Ktc EIj\ڴ1Іgiȃ&3`?JkTcnv=ԫuySB0fo'= ǝ&hTZlps'n:ڤ>v9e9wzɆcB\p!XۦJ懱`AXnf%:7N=!ji '47`t?Psgeg91}g9Uh1/+^QbJt:pDA?\2z"#Kz4(nxm/hs~awEbfj9dF۴/_b5OǨQQh;*MT'/yGSY 3&lZF6uu~F']kڤZצrpm̮}Hon(dS'ŀuugPN<'1#@2mAzw(M(àoL{tַB>H<%~5t6ZV| j6x^0cij{B,aՉtB*[4 w=xdp"^&IA=N]xr@,6Ν<2Ij$o+f#E-I<˝SElB>a@w[z(V::6LsrHHPLAntQxnXxM;6),J%;sW aM'SSmgrE_Jt(Rsk8}<z.U=/) ]>~m!ȒTtI,3mxeg;W=-jȴ0'?5X~49[\?|>eYnʓ6F${ 'F{7jZukz0GYY)S Vi),Wd?Y1;6 Dz88-D o-dލlKڨ;fO&/CG ;vAU*U%ffA>`ġߴx4*f6uZ">IAlN>T%DB+$t)U$'D|xu;f%Q.]@b N,ӓIlҨyd/IK8વXcO [B/K&HsѻyҋiT/N%\k2V%+CC.ߺP*DYyK/KKmS.`, ̦sIOcOɢ',&V5dA s,l*ROf|qiv nshD5c-EMБ;]Asjt)ƫf ` –HӟlTq/ŽbZpAL^ŐtUUN~z =ؽ'P( n׺ xO Iܴv4)'sK@દn<`+b:QQ#&6-NHU`_|J!!j,tC9t[çBXk!}-"%FCwG?J,> 9ׁ"QsZ%uGV.ůT~ԧ `pFku +<^oLѮwj$֯~-Աt7Eg KrmNU ׀v[TؤJ!{ɂsL5 Z{+P<@f.sg.HuԂV4&yWu\ԔP'PmiS/`&a0Hnu[t6y:GӁ/P)75ZJ p ƊxX,i]I,`aҳ, zQ};fWsV3z( R84 7L?б4V{?ɔ>1$U5-ǪlWge?rqæDTxgh5tƺOޗao2MԂ@a$tяïVZlyL!չ6BB]z-Jj#6㊖'TK LQ YIH6&7{M=dܠLh^ Uۼ.lxޯP`hDvV$hy.h)] _]\/GӋ#>h9Z GMW=4EGCw+7] /+Uԭ$LF:>cqatއQ}~Su*o%UѤz+kNȐ]x MKfߖ18ٵx҉G5Q) `V& gF7L7a6Yއq3tt3SVznVMq?  ̣oRzHzHnø}rm%Z)Ylqƫ=׀ y3p^ %QH {-ڰ[-۰ɦ7%w^CmX#ڰ& +MX,3d?>GSjjȒ4YF;Xd;Obǟ@_;pfl[; vڱ,ʤނ%#).t='$.^d/F_gS3(Viu{ o]w>glvmE %|# q{u:WM~UaᛄC>QyOX\rN1+R=fi&r&Au }%LpKӶG%5>mLi=e)aɪM2Z6i͏qڲ3CMuj3B<mǫ'0U5S9u@VPCzb:NN^}C?`M QZ#此-`:L ?H*(H*34BV]*:8*PD *9lȚpkIƬLpzdݠ׻As1k˰rOo&mQ+ &NM[]e? k'n֨W©!`lw$F JUoÃ\8 WW(MIꖀbxW(fjzxWeG3uOq=lQ!Xe`y1-EV4C7㶓]%fЇ$sSHgFx7δۙ$U**`( _.ah-}*Ud0Ԟ4ڊ`0#GE<:1C+C,'Z#7ʗ0d1dφcC ҷUZE,@!5wG`GQH3v B% Ƿtwd-KcX<Е'2@T Ty3b muڤ'QW6j|  2egCk4HF7*ŪY9)0OJ \QK\J"p\C8L`RYՊѝA:CW-Yl[UܶC{ۖǷۖO>5Զeۖg l[b ޔ-K^ۖa(e( =q?R6_P^Aʞ Rv2eB)Kǔ*KLYސHY2eϼL)B)!@͔H65):$eba ߫ `M~/vjhFSQ[ZZeO"@.#!e֠7BJw$w_ \]H?r#@?q8`-#YŞ.0']5 l&Үa$<ͱcD%1 9:L.2tqb6hnϖL=(]KtNDkAF K6di 4HLBodJrt%0uǠߒ+,mRXRaC,ֿL%`(MO.eisXzvhT#!K1һ Jv,WdKeq;JrZfH\gS%[+KBX-K ^ 0bbi\ZФAVW(&ZְB;NPh +Ker"+tK UM /a t$V GX`B0f0?L8t̊hiB~ |yQ,여cL{suXw KKraƆS^g,c,cHvc$ ņsВ`Mc?}vh;)8FA2=ӇdG~(^iaaH-?Pvٙ5;4#<,SP(x?-r>cWiURd}F:M`Z5T@ÑY t}\hw)0"M ΊTN |JpFB$0M!wWH cdGjF.e@r]?iLHR$F {uVjV[w)RHf]J+Tm'U/[ LzXK]Ke yK]3mRw ]jХ9MZe9໕))aRE!3*G`TwOSIs 'JUX-:WVSI főd#xg:MB?J0M\+C=jm0=u[CWꥇ1= 1 (^(;F=҉L3g*%{J({G׏J+9 (#eSpP,J( wWTVecZs$DI(V#;(Nj(SXQ;ʉ"cl Qt!ʠUbPaXsfxIJM(%_sX ko͔] QXP)aJz+ʶ#(kϐů Q=e:%Hɬ(s$&y.{ABۡ2DYFLm^E^^o4P=q ϔQ ǵBps⸵⫦K{۹ߊ#_MǡTAMhşȆQAoRVu֩u }^"RGe[Pʶf/3a<+[Q)}=֊2K0Y}׋e_'pHED9!u|/ܙRVkOZkR{!lADy̧(dk A&5  as^@Hΐ!Mb!#x )>}20LcWf2Bi yi0fyYOyS $\S$ %I?Hd^!¤c!)3iDq t'<"<*WRS:&=1CFtvW$?L $Li7KNٿE%kĤNAzh+i/$mW @dr #fS&!2\A ݸ?CC`<*~T8<l{-`G`j\3{Mſ^2ÿ~ÊΨf%Ò`B/HI6:JRF_5D*q2ҋ$lB?!kbH5pAަSh*LMg2Rԧޘyۙ,qΨQ,xN \9^28?/r9 &Mrl%7hl!+2]v\!;z9Wq,d`ͩ]d\emKfqgh,(@a 'ArjN(.8Am}R"w"E2*q8 Tp't==[&ig:UcyN2V \(.?@$WX|i%@#Y/<*#PϪciS3L g!h¹J@Mi^˂~O{L$ߵ\|A{b +.R?/vʢGP3 p' g |fE!Jx^ 2a+9~ {B‰ _Nn'׋+d5f(aIcf20cpŬy1!悇Θ[1K6+ZՙH1.`\q̅3%⸃u+&` 1W?p,5cb|LZk"\cDd`bNg,CtrgD:Cqx~}^z[h@G$` V! Let/]%h}9H}g³a۟7 y\ UPdŜN,^(!w_˘:>zg[)9;yȪ'BW#1dy | ȪÐ {ΐX< @uDcu^<&wݕ_s%4U1>p*'7]"ĝ)5KD4 E6P~WE9/ԂKx'Uc1OޡG%(r-gA?u[/#Yަ 1a3=1oNL$3.I0w KxmOlg_Ä];2p%~\Cp&|~xQQ0%ExDv(ƌ0`N*uD :ΏJHhL)VsN : Av.#;v<;!ΐGCb!!_nZ@ .QW;ߝ!?ՓOs! @a!Zں̕$4g;hXV7QC= IxqKƛNc71`Z?ehP ehͯNCt>Qjn r&VoL)hJ__~-^Ce+J+sm<*~jH*jrmG(GX ZOcWSn#_&X KL5F-Un>ɨo˴h=22+<͵5 s/ycڠ+̄s2acsӦUłoV=+NPh2O/IuYq(%"Oԩ1pᳳteA,|mmY|B*Y[l=G8V(ȴ`0#u,ʣDغC:Mnѫ{~W1rU,yIg)-aa}ƪ^k@S]oG`o#GQlQ`K$ GHEZ5i !ua66jn-pٷeSV(:EÂKБ>j+ "Nx /K jVP,?yH>^1gmbs16nU*_ I kw۵u?}6Ʀ-k'xQyp]e3>MPoYSAh=HZFZ AQ\#TodisTxvxUw~2mޮ R]vm!z p-Whë#PZ/&kKT|)\}?j^C˵[X}]e9F"RA[{z&S'vS{ {ЖrvyhVI[##0.?RCZK^k ߘŖgHSQA%esh?7)Txp?ȋ a4_AZʦ-\ro0ErnX=n5mw.ߋ ,e0iRٵ^[B$/?UVش2NizzffOIn 氝h{{"LȨ:Gf0. AcT6.r=gK FAezR[]O6ص7ih_EZ߄U paStiS `} 3VfɁ3ϰHa9e /jdNLM gӬ+Ӭof:LKɴ3MqQkSbs퇃sm<Ύ/rMd-k3F sMd]ӱ\+qΝdM'L6dkСnzT mftYdsHIr~9ls?&G%ɶd3O~%xMKLIN6E{ɶ0$ۈw-/Al;szJ`/ns$hUZB`fVQ+y6(ۓ:5C.%MsJ΅ٺ \^r 5TgG"~~6x!?pE:???ϊY+' +7g:q?XX?'EqʼB?Nď3 !:f|O~le4,q*Vr?B}O' Kѓ&2녌ח+E]/s=*'AB[hK M+Q(rJR@! "%& MzZNB\E:jeX"Eޢ8cĎw %w>9iSgskk5CQJB1N =KzmB<HÆȼ ,OX" } ~T~3q$"SgK1H% -p%~M/ƊZJLX,VVXo]o+.^ ǚXIzCPb>f*k=<Ep*!3ZBoHUc}#}pwm㗴IZv:9>|̏Nٛ,/RbLQb8yTؘw6%1c17?#ḣ}܊13` [l%R~Y\4:+%-YX50Z_MQ 3~ݟ,m`o}#٧}-ɲZ{|)ָEQt5HUY-Π;+/}@y;Hr_ɭ"$y|õT;;Rf BI_JHM(:|)Ր@-myfZfOR,Yޏs9 > N[!L[:Pw¿ Rð&H7zqoNYmh.a \ZoUƗ@D䴒O+i7v?~B,6$r;Q\Fa,ٮt++|M>MQʟlo;*#`ltYnS1Gd,pN.nۮɂ`̳`z`ޞNlHU+e`Qz$@9I9l6esjN yI?Z,z\̹` I1t[z8'\?o] G c !QF\PDW6QѶF[o>i:vm~TZ 6b4Eg!lhq|qz*VwL:+Q4߉ ?{^c]FJ4e/|2TFSްqm:l3>NMZ.GVCcXw>uϲ 󩯝[s|?x1r dY9V&kr=K)7wT1jO親OuLLW^&Z"Q,6q4]2G~)|zS2z 1vMojDB A"d-ڦhlׁUcMuDNzq#nYSQpI!nD}>@RNk7tVr:$U,S8 ; [ qZFi]кZ6Y^h!K|~|y2kvPnG?ݧ2Y [ޗdžhy5v5-QGD fih3h['b.c8YٲE.WqmqR&de@ پq;rEJhK 4/"k]_axqRL4n_pn n۬b|ňNw;nϛxnTy5V5UHf `/nVK5 |/XςOke"j}{}4꼶vKɱ h'X 7u+:D=!s] _0׾;D9KE>JfS"Tγ6acydVrcПX6JʿHfTnlSj0\jX4uYC]ʾ]Rw-R_.0.UTLl{*RuRɝxTT>R%C]1Kg3ևԿu)[z;z!ǥR>ƥ]íTRХ20*L wƥnڹԓr{ݚK% o٥1B ).Y.5֥\ۛ]i.5qV]*XҰ.diG:֥ХzsP=ֹKuRza]OZKR>@ܮUOsڻTrK>{ \7W-j4\ nH6|]}Ѕ m30pY_e:Dʑ g@E7n+d2l/WY-qwb~H X 0E* q0"oIe\}YΏYXh/<\?7zg#l=uS'sFÃ.E!R<7.ŒP)s(xjP^c.H1 Jl#f/zE!LS@׼2bbR}?45p!Ө(Pj=dfʟ :|韏X{n[6irm I%z7U?үACv^xNK%:ޒ$@+(T.8\e>E=`⤄8 BZ= u)ѯ6Iy̽rl} /5$9EW@rHaoTN[CrZJ~a9v';VJj,n*u Y9RjG-Oz+֕2ǁ|*CK]}|źޤ hrRHPjKR@J N*4 jK<īGX%W#RDlm虚Er$mZw$y}hKuB- Up:00 d n)K[ʍhPqx(|5Fs\^L)P1gڙh8gF,H`271IIlFQA5Ub+&܌^Hf.']n@5o=g$%fL^LYc/Xdwj|)&Ԗ7c0&K I_ILH~܊@y>'?zP4%Hut&:m gsTZ~+0 ^rFԺg[4g[C]1&PjFf-> fMZ>g{.gs:Lb}.ooh/$֟ a35D|•i')lt,ĺssw/dj׳'ӵ&{ 0-00t#K*RLz1;qd0BO=% DibOspO`b@Ow =]bOd[9N8E_UT2jG<ϗQ"`3֝I\uQk"YU«dtM\( Te>^ 5&yHo{pe .;o%i*[ٌk]Ds_Tjp.H.s+͘6q[cu#TwXhCȋ3>H^,Nx&M?l/6cAvcԻ=U/zlRx=bthqRϚ4! ]ޛŤ5I=\ϐhJ 'uzt#}7Iv'P$G1IQcZI=ۤNRA. (0&2 =*n<}Sz(1^ZQddU7`aj-Ђضor<O9NH1Jwft>5劙lɛ92&N*=9 j&^E$ISIrt,8Â^":vfAnA?5g j?NDGqqs|<4Sfv akb͢3]M@ԄtJ)^z$1KqKoA۫z㢗~*{|^ҫm/OyEt"T\ ^BϞ{ixg\jnv#+lS. Aѧ`R4]9P/B3Gu4FO͠A݀/HXd:/F$٬H6.GSAZ$S9ҙdb0hFk 6ֵ0M0*s@Ѥ^A;~hrPMsXX=e, ^Įr=c')\1c8P1 9\ACt>D_dj 7(fMnXcЦxV4d磻\V |^Gg)egi'VjOwql2%]xфv=rX\h-XHrQvU|m3?wfjuUVA\{7OTZDXE1ynaDnKa@-؏j0@v40%,N]u/NNk #mtD=a&  M/, eB0R50[!C8ǔK匃 :#9T[_fbw-^Osy7R"qd_e&T}pl b8ngE~8o??K|%Xh24=ؚ3-)08)N_hm6~5Zx2D8esةiLVZt +< 䯑NM%'שrZKp2Eg!j>Ҿx wam8,r6>,Z_f% +=ۅTp%[#V9tD:tx9;K7a"^3colk{*ZŽؔN'ItTw0|Xgϐ51!N OPC꾑2[/1bH+o#?-1"%przxE0T\,L -rauy9TNN I0YRO;$$29={x_?E=qC8'8rQ,(x[9n{"ݤkg%l1_D3|7@Tz7FЪe l-AVK;ed_Y~7MaV+y [1~oM%pT͢ 'C-26l|WfC\{mx}mg%~.9^/լ]p|pj}PXg pR\iH%oau!x+|q  El|t׏&0C1*!a GX_G[dLRA~f˹% U_t: Ã~.kޠ ANI%80{[OBz Sѥmժ-9l 7 Ȇt]9Dħ_ x.bteHpvQ10"݅q+v!Y۠ 6e}EDd4>xhW 9 Xz d8VT8SZ&T9IݼO<+Ȭlut+tеA0a:QdL$?% @R|Rz\x=3hGo=V:AKV^:A':h8z Cs9ˡ||=JhgL ѝDr>%T)kʔ0Y/L۠K *!QB;Ȕ3ڶ+%rв"Uu;? & ?&?T@ ߧX.1Ļ UzG~fnbJ˵㲕Z.i-r{=2=e !wh;ƒ[I>DZtp+)-,^#.ljO${_3'-ۄҀC#qL.etv| rx~xAL옎?ã1Xg5Gv< u \IuRn6XF6 ? `)&7I ióLCC2XtW Q^,h/>ж2Oty-~>DGPw[AiX1nI0(s"j>b Ȏkkn(­{qsCALqvnʎ;6$d9,}LwsG?MIA&9I+wkwqM\>"F"moZhB-@H/VKm)AtHMilo-[%VT (uB;G`̞{g& ~>̽ss'wsD( <% e ϋ(ABPdAHEQB U 48O2$22(rhdF9,R9<x;_w VY+roJ6~{oG36܄q|xXrOC%ʱhoOhQ+Gde"5(;\ WPC9e\ˇrJ!]PҠl*G{ioG{T-8 hel6oGTwV^w;퉺[h_Ѷ.Gu?G+{JpQr;Pd:p(wA1Arq(PP@V(,(kPPʠ\ Vf܌8 GȄ](>C=va|m8]fD %)G5-1h{mq9]Y|&)ԚCU r*=\= ^ rGqYNƲ$C6T6/Vt63 ECiq +ul9 u=Gb܎x!?) }J-랑}=-dzi_>RĤIȉYw5Kj''r+Ċ?OMvQ=r2te$GA> F 2O.XZ4vkK|=MRX",KI7A& IƋ7 &qb%5Sҥ "[A +4JA#Ӿ=@к;8UBs3TfN- L}4^!YD 1qnFyZv8~JOqh@J`,pf*(L؜]%g/33y')`?cJ& &>L<5#qœ=J%Hn9K $v-`q/!?0oc$4~=%h/F{h#{> )Fi!xijDU6ɦzɱG540I}ڧl1(ŸTD)EK%V.;܀RC)n?\R*nRmrWzL{&uľ?̾7V%QbaߌA)^JCJ)FH  rawy $z?J:z{)ʾ@)(% ee_PCu.[_ƨC3ףJŏ;yf{}?ݯ&c)Orݓ.=MϦ8'=@*Ui/?(S ~$@.hLP0]^?Si77F|C@`ԗ!?xy/K@޷ myX. PK@/|#l`(sB`h_6PBv(?^~~4014puA}H9D рWt~P'2# !- ˁtWAŤFאW<0 ܓ> .DJwZ&>eu:Sԯ3UЯp1^l_2;CEo=x%Gg%ځZJ\ʥO+욈'ȴ%OE6LzիJ"RT.q L"uH]eK?5QI;I;Y ҜҦ{Ki@fDΝ>ΏFڍ솨cj,gkT.gl Ӹ%6"6N*HF(#[D4&zL|㬳| }l{ɳΖGRH埃Z.qP.uShcKrt5p,֫TuX&t߶5ۍEKr] Y mzVhc1}$Hc^Fbk1Y.@lkAF[KqYs KxeN&xW zV z{^m,Y)-Z+m>]) SZe][kXA\uICW4DyT3fΈ43 u"쭢tP~(ZIDs+cVR]GG\f&}{x3a  { Д(Gvy:ecf(FT7'mmAճhс^AL2WRx' )ijfƠPS/3Pƙ AhP3UzJ`r!NuabI(ſfK֞#W҄Q4M:~DlLLUJ-?I=M:LZPJi[8C 0!mݧ(^ڰh !MH-[KHgˌ ~ i/uUR)n]H-o>&b!^k{NҦBH# i+fy{QM/i<1DisǴ$ P0_Q-Lb5վ-D5%zЯjo3G5^46?Q-y(-EQSv>yj$4ۼ_?3}ߔ )eJ%ݾn췊=%UQC.|"ڦjwOA批jo)Kv=(jKޒVN QMufVG5릢Zm@Z\ Lլe8IQ4q94 # aQQ+2;QG-8`+kiD;7=!+!!(+I Fw ?]Τ]fN0CЖK&N-/'|U1 `` HTw᪺tU~T#|JgQNݑ3ͱQ3ih4&mChW` Zъ;Wڍu;k '놝y;Ga<00[ƥ8O[*ia\ L5KZ04v-= =.kXW@i*>3?yb5V2NQ2tZSibp}W1!sȵH`egJ + M n(=" w铹y*\KmxKΥ/BmO 'V]I֯ KIP}b>qs*}(Q$2y4 y;MyJr ҋKÂtTI4f9olrOAf BEp#oa5{+SP0B\XLwl>|B7cHb$Czֵ^ `4jPX=k[/J4ѵjYIZxei`HtA/bZ-v!H>Rn$6fM FGc9UfѪ<ʏgھ\:r߬zoYl>}r.\k ݾ_&YNg-uf lnD6a?Dƥk8;**(tSAtI n5w:T <ۑV zeFl󢂰 Iiٌ1^K _m(/wo^HstA>oA}1>_c36糦o GS)?>i| 'M #u?bH,1n%na`P35Pb_p/1OB9!ajİ71E )1<43Z24%c$k XƜ_#G5m`bXɁUX6ӻdT 곇h~72̯'.^7{&ciKLG$XA V2hxo4{ҩxg7YX$j&l+MWZMowpqn}ų6zwBmVHN;eBwڹCwJ ْf1]#̚kÊeC%Ǡ_(mX؅;QS' mD+,SJsNc8AYR1oU(7^k;`K8ɠ8>)<^I~ D?]x."9ծύ>|C3% ^k(wꂏe⽮u@Dz݋),{^Xw+}63=$ӣ7Ǜ_M ,<=<jo9 Q%R;]^Skhq(tlXI)5D I"GͪL"i,y7 Bphɵi4ɹ 5zz5xLx8 #6R@v~Ms`6ȴx/ ɉ"_(g)i~l͇S46<CK]|Ui:S2 )ZmBnk҂IM[ה_iZ+$.4e?>>T쪵 mAqyݕ;biv9wf$M~hf3=3{sT-n􃶶_ۂ,~+7qZ`y@ڝޡ,SŇ/u+b^ ZΩ# --y(ȋ -qnE6|hM>wBƉs'KJ,FY8S[QFvxRkuHgAWdu(koІĵ:gS!G Dlsé 7E/i8/Wv}1=?i^ȼa&Sb#kPP^{gMxS%]dMujmQ Fxs*m67 e#fM`C>zR6l34H#{}8Ƣ40|a3!ίW ;+#n+#nAƍq="T^&ē_xߝI'ڍ}ڍL_Ed9VpU0SnkDpFF%9ց$/&}PerPcjvQc}Z(*leC_rqEWzKH oGN5ffffoy !-y e H@v-R%|ȴf.F =`أ߯H|xtQyv"!g' aI>`d6N-'a=g&K'9Y\]\tJEPLGj 5N\'{>5mch<'J^ rhR2dd eH|e*C+q6G&鿘8A ;Ԡ.PBp'0kk1{,tBMd:5PnL]璫c8Ej#U)-J{x_:Ԅ=xlYwdm*d2Zt_7"녣1dj6(}2CƱ#y0}eY^] tCŹ纖&_8Z,ؐҩ/URfo!iI>sڡBHg-;%#!`z0\"8 EG"\# D\/g$qaص|X"ZȈ[о)MӭWe .~VLlsݨ+|vf8ՙ=YS^/$T u5r35,dGF=Xk%kl3[8WwFUG-8iKSGc*:M0n '{\BNZ~!Z"GɐF n9@76r|U,Bf?EȶXx;6z[[ d>*˭ΐGצ+󆘵qFO,)1EÏS| @TfHvFGş `